mirror of
https://github.com/FFmpeg/FFmpeg.git
synced 2025-01-03 05:10:03 +02:00
Merge remote-tracking branch 'cus/stable'
* cus/stable: libzvbi-teletextdec: set bitmap teletext canvas dimensions libzvbi-teletextdec: add chopped top row size to y offset libzvbi-teletextdec: use defined constants for bitmap char width and height libzvbi-teletextdec: cosmetics Merged-by: Michael Niedermayer <michaelni@gmx.at>
This commit is contained in:
commit
ec13849ce2
@ -34,6 +34,8 @@
|
||||
#define VBI_B(rgba) (((rgba) >> 16) & 0xFF)
|
||||
#define VBI_A(rgba) (((rgba) >> 24) & 0xFF)
|
||||
#define MAX_BUFFERED_PAGES 25
|
||||
#define BITMAP_CHAR_WIDTH 12
|
||||
#define BITMAP_CHAR_HEIGHT 10
|
||||
|
||||
typedef struct TeletextPage
|
||||
{
|
||||
@ -43,7 +45,6 @@ typedef struct TeletextPage
|
||||
int64_t pts;
|
||||
} TeletextPage;
|
||||
|
||||
/* main data structure */
|
||||
typedef struct TeletextContext
|
||||
{
|
||||
AVClass *class;
|
||||
@ -67,14 +68,10 @@ typedef struct TeletextContext
|
||||
#ifdef DEBUG
|
||||
vbi_export * ex;
|
||||
#endif
|
||||
/* Don't even _think_ about making sliced stack-local! */
|
||||
vbi_sliced sliced[64];
|
||||
} TeletextContext;
|
||||
|
||||
/************************************************************************/
|
||||
|
||||
static int
|
||||
chop_spaces_utf8(const unsigned char* t, int len)
|
||||
static int chop_spaces_utf8(const unsigned char* t, int len)
|
||||
{
|
||||
t += len;
|
||||
while (len > 0) {
|
||||
@ -85,8 +82,7 @@ chop_spaces_utf8(const unsigned char* t, int len)
|
||||
return len;
|
||||
}
|
||||
|
||||
static void
|
||||
subtitle_rect_free(AVSubtitleRect **sub_rect)
|
||||
static void subtitle_rect_free(AVSubtitleRect **sub_rect)
|
||||
{
|
||||
av_freep(&(*sub_rect)->pict.data[0]);
|
||||
av_freep(&(*sub_rect)->pict.data[1]);
|
||||
@ -94,8 +90,7 @@ subtitle_rect_free(AVSubtitleRect **sub_rect)
|
||||
av_freep(sub_rect);
|
||||
}
|
||||
|
||||
static int
|
||||
create_ass_text(TeletextContext *ctx, const char *text, char **ass)
|
||||
static int create_ass_text(TeletextContext *ctx, const char *text, char **ass)
|
||||
{
|
||||
int ret;
|
||||
AVBPrint buf, buf2;
|
||||
@ -127,9 +122,8 @@ create_ass_text(TeletextContext *ctx, const char *text, char **ass)
|
||||
return 0;
|
||||
}
|
||||
|
||||
// draw a page as text
|
||||
static int
|
||||
gen_sub_text(TeletextContext *ctx, AVSubtitleRect *sub_rect, vbi_page *page, int chop_top)
|
||||
/* Draw a page as text */
|
||||
static int gen_sub_text(TeletextContext *ctx, AVSubtitleRect *sub_rect, vbi_page *page, int chop_top)
|
||||
{
|
||||
const char *in;
|
||||
AVBPrint buf;
|
||||
@ -195,21 +189,21 @@ gen_sub_text(TeletextContext *ctx, AVSubtitleRect *sub_rect, vbi_page *page, int
|
||||
return 0;
|
||||
}
|
||||
|
||||
static void
|
||||
fix_transparency(TeletextContext *ctx, AVSubtitleRect *sub_rect, vbi_page *page, int chop_top, uint8_t transparent_color, int resx, int resy)
|
||||
static void fix_transparency(TeletextContext *ctx, AVSubtitleRect *sub_rect, vbi_page *page,
|
||||
int chop_top, uint8_t transparent_color, int resx, int resy)
|
||||
{
|
||||
int iy;
|
||||
|
||||
// Hack for transparency, inspired by VLC code...
|
||||
for (iy = 0; iy < resy; iy++) {
|
||||
uint8_t *pixel = sub_rect->pict.data[0] + iy * sub_rect->pict.linesize[0];
|
||||
vbi_char *vc = page->text + (iy / 10 + chop_top) * page->columns;
|
||||
vbi_char *vc = page->text + (iy / BITMAP_CHAR_HEIGHT + chop_top) * page->columns;
|
||||
vbi_char *vcnext = vc + page->columns;
|
||||
for (; vc < vcnext; vc++) {
|
||||
uint8_t *pixelnext = pixel + 12;
|
||||
uint8_t *pixelnext = pixel + BITMAP_CHAR_WIDTH;
|
||||
switch (vc->opacity) {
|
||||
case VBI_TRANSPARENT_SPACE:
|
||||
memset(pixel, transparent_color, 12);
|
||||
memset(pixel, transparent_color, BITMAP_CHAR_WIDTH);
|
||||
break;
|
||||
case VBI_OPAQUE:
|
||||
case VBI_SEMI_TRANSPARENT:
|
||||
@ -226,12 +220,11 @@ fix_transparency(TeletextContext *ctx, AVSubtitleRect *sub_rect, vbi_page *page,
|
||||
}
|
||||
}
|
||||
|
||||
// draw a page as bitmap
|
||||
static int
|
||||
gen_sub_bitmap(TeletextContext *ctx, AVSubtitleRect *sub_rect, vbi_page *page, int chop_top)
|
||||
/* Draw a page as bitmap */
|
||||
static int gen_sub_bitmap(TeletextContext *ctx, AVSubtitleRect *sub_rect, vbi_page *page, int chop_top)
|
||||
{
|
||||
int resx = page->columns * 12;
|
||||
int resy = (page->rows - chop_top) * 10;
|
||||
int resx = page->columns * BITMAP_CHAR_WIDTH;
|
||||
int resy = (page->rows - chop_top) * BITMAP_CHAR_HEIGHT;
|
||||
uint8_t ci, cmax = 0;
|
||||
int ret;
|
||||
vbi_char *vc = page->text + (chop_top * page->columns);
|
||||
@ -262,7 +255,7 @@ gen_sub_bitmap(TeletextContext *ctx, AVSubtitleRect *sub_rect, vbi_page *page, i
|
||||
|
||||
fix_transparency(ctx, sub_rect, page, chop_top, cmax, resx, resy);
|
||||
sub_rect->x = ctx->x_offset;
|
||||
sub_rect->y = ctx->y_offset;
|
||||
sub_rect->y = ctx->y_offset + chop_top * BITMAP_CHAR_HEIGHT;
|
||||
sub_rect->w = resx;
|
||||
sub_rect->h = resy;
|
||||
sub_rect->nb_colors = (int)cmax + 1;
|
||||
@ -289,8 +282,7 @@ gen_sub_bitmap(TeletextContext *ctx, AVSubtitleRect *sub_rect, vbi_page *page, i
|
||||
return 0;
|
||||
}
|
||||
|
||||
static void
|
||||
handler(vbi_event *ev, void *user_data)
|
||||
static void handler(vbi_event *ev, void *user_data)
|
||||
{
|
||||
TeletextContext *ctx = user_data;
|
||||
TeletextPage *new_pages;
|
||||
@ -311,7 +303,6 @@ handler(vbi_event *ev, void *user_data)
|
||||
if (ctx->handler_ret < 0)
|
||||
return;
|
||||
|
||||
/* Fetch the page. */
|
||||
res = vbi_fetch_vt_page(ctx->vbi, &page,
|
||||
ev->ev.ttx_page.pgno,
|
||||
ev->ev.ttx_page.subno,
|
||||
@ -369,10 +360,7 @@ handler(vbi_event *ev, void *user_data)
|
||||
vbi_unref_page(&page);
|
||||
}
|
||||
|
||||
static int
|
||||
teletext_decode_frame(AVCodecContext *avctx,
|
||||
void *data, int *data_size,
|
||||
AVPacket *pkt)
|
||||
static int teletext_decode_frame(AVCodecContext *avctx, void *data, int *data_size, AVPacket *pkt)
|
||||
{
|
||||
TeletextContext *ctx = avctx->priv_data;
|
||||
AVSubtitle *sub = data;
|
||||
@ -486,6 +474,11 @@ static int teletext_init_decoder(AVCodecContext *avctx)
|
||||
return AVERROR_EXTERNAL;
|
||||
}
|
||||
|
||||
if (ctx->format_id == 0) {
|
||||
avctx->width = 41 * BITMAP_CHAR_WIDTH;
|
||||
avctx->height = 25 * BITMAP_CHAR_HEIGHT;
|
||||
}
|
||||
|
||||
ctx->dx = NULL;
|
||||
ctx->vbi = NULL;
|
||||
ctx->pts = AV_NOPTS_VALUE;
|
||||
|
Loading…
Reference in New Issue
Block a user