]> git.sesse.net Git - ffmpeg/blobdiff - libavcodec/libzvbi-teletextdec.c
Merge commit 'a4d0c6e0503562d4cc8f9f6d02d84d7b32583b15'
[ffmpeg] / libavcodec / libzvbi-teletextdec.c
index bf2dc063ab515ea3712698daf11078885d144fd8..abc24c37ea456627313c2753425f74012ea4085a 100644 (file)
@@ -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;