aboutsummaryrefslogtreecommitdiffstats
path: root/libavcodec
diff options
context:
space:
mode:
authorMichael Niedermayer <michaelni@gmx.at>2013-12-15 03:27:06 +0100
committerMichael Niedermayer <michaelni@gmx.at>2013-12-15 03:27:11 +0100
commitec13849ce2dc24d0c951acc01cb247df526c2eed (patch)
tree208229defce2fbf555cd78c745de97e55c93dd48 /libavcodec
parent6f9be9106382083b2268ddb3599fbf49abb36f6b (diff)
parent97f880e7a9526465a966565598741f4cc25ecc47 (diff)
downloadffmpeg-ec13849ce2dc24d0c951acc01cb247df526c2eed.tar.gz
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>
Diffstat (limited to 'libavcodec')
-rw-r--r--libavcodec/libzvbi-teletextdec.c55
1 files changed, 24 insertions, 31 deletions
diff --git a/libavcodec/libzvbi-teletextdec.c b/libavcodec/libzvbi-teletextdec.c
index bf2dc063ab..abc24c37ea 100644
--- a/libavcodec/libzvbi-teletextdec.c
+++ b/libavcodec/libzvbi-teletextdec.c
@@ -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;