[FFmpeg-devel] [PATCH] movtextdec: Use default style information from movtext header
Philip Langdale
philipl at overt.org
Sun Aug 9 19:26:37 CEST 2015
On Sun, 9 Aug 2015 14:50:16 +0530
Niklesh Lalwani <niklesh.lalwani at iitb.ac.in> wrote:
> From: Niklesh <niklesh.lalwani at iitb.ac.in>
>
> Sets the default style in ASS from the default style information
> present in movtext header
>
> Signed-off-by: Niklesh <niklesh.lalwani at iitb.ac.in>
> ---
> libavcodec/movtextdec.c | 82
> ++++++++++++++++++++++++++++++++++++++++++++++--- 1 file changed, 78
> insertions(+), 4 deletions(-)
>
> diff --git a/libavcodec/movtextdec.c b/libavcodec/movtextdec.c
> index fc6993e..d5d6567 100644
> --- a/libavcodec/movtextdec.c
> +++ b/libavcodec/movtextdec.c
> @@ -37,6 +37,27 @@
> #define HLIT_BOX (1<<1)
> #define HCLR_BOX (1<<2)
>
> +#define BOTTOM_LEFT 1
> +#define BOTTOM_CENTER 2
> +#define BOTTOM_RIGHT 3
> +#define MIDDLE_LEFT 4
> +#define MIDDLE_CENTER 5
> +#define MIDDLE_RIGHT 6
> +#define TOP_LEFT 7
> +#define TOP_CENTER 8
> +#define TOP_RIGHT 9
> +
> +typedef struct {
> + char *font;
> + int fontsize;
> + int color;
> + int back_color;
> + int bold;
> + int italic;
> + int underline;
> + int alignment;
> +} Movtext_default;
> +
This name is inconsistent. Use MovTextDefault.
> typedef struct {
> uint16_t fontID;
> char *font;
> @@ -66,6 +87,7 @@ typedef struct {
> HilightcolorBox c;
> FontRecord **ftab;
> FontRecord *ftab_temp;
> + Movtext_default d;
> uint8_t box_flags;
> uint16_t style_entries, ftab_entries;
> uint64_t tracksize;
> @@ -106,6 +128,9 @@ static int mov_text_tx3g(AVCodecContext *avctx,
> MovTextContext *m) {
> char *tx3g_ptr = avctx->extradata;
> int i, box_size, font_length;
> + int8_t v_align, h_align;
> + int style_fontID;
> + StyleBox s_default;
>
> m->count_f = 0;
> m->ftab_entries = 0;
> @@ -116,13 +141,52 @@ static int mov_text_tx3g(AVCodecContext *avctx,
> MovTextContext *m) // Display Flags
> tx3g_ptr += 4;
> // Alignment
> - tx3g_ptr += 2;
> + h_align = *tx3g_ptr++;
> + v_align = *tx3g_ptr++;
> + if (h_align == 0) {
> + if (v_align == 0)
> + m->d.alignment = TOP_LEFT;
> + if (v_align == 1)
> + m->d.alignment = MIDDLE_LEFT;
> + if (v_align == -1)
> + m->d.alignment = BOTTOM_LEFT;
> + }
> + if (h_align == 1) {
> + if (v_align == 0)
> + m->d.alignment = TOP_CENTER;
> + if (v_align == 1)
> + m->d.alignment = MIDDLE_CENTER;
> + if (v_align == -1)
> + m->d.alignment = BOTTOM_CENTER;
> + }
> + if (h_align == -1) {
> + if (v_align == 0)
> + m->d.alignment = TOP_RIGHT;
> + if (v_align == 1)
> + m->d.alignment = MIDDLE_RIGHT;
> + if (v_align == -1)
> + m->d.alignment = BOTTOM_RIGHT;
> + }
> // Background Color
> + memcpy(&m->d.back_color, tx3g_ptr, 3);
> tx3g_ptr += 4;
> // BoxRecord
> tx3g_ptr += 8;
> // StyleRecord
> - tx3g_ptr += 12;
> + tx3g_ptr += 4;
> + // fontID
> + style_fontID = AV_RB16(tx3g_ptr);
> + tx3g_ptr += 2;
> + // face-style-flags
> + s_default.style_flag = *tx3g_ptr++;
> + m->d.bold = s_default.style_flag & STYLE_FLAG_BOLD;
> + m->d.italic = s_default.style_flag & STYLE_FLAG_ITALIC;
> + m->d.underline = s_default.style_flag & STYLE_FLAG_UNDERLINE;
> + // fontsize
> + m->d.fontsize = *tx3g_ptr++;
> + // Primary color
> + memcpy(&m->d.color, tx3g_ptr, 3);
> + tx3g_ptr += 4;
> // FontRecord
> // FontRecord Size
> tx3g_ptr += 4;
> @@ -169,6 +233,10 @@ static int mov_text_tx3g(AVCodecContext *avctx,
> MovTextContext *m) }
> tx3g_ptr = tx3g_ptr + font_length;
> }
> + for (i = 0; i < m->ftab_entries; i++) {
> + if (style_fontID == m->ftab[i]->fontID)
> + m->d.font = m->ftab[i]->font;
> + }
> return 0;
> }
>
> @@ -312,9 +380,15 @@ static int mov_text_init(AVCodecContext *avctx) {
> * it's very common to find files where the default style is
> broken
> * and respecting it results in a worse experience than ignoring
> it. */
> + int ret;
> MovTextContext *m = avctx->priv_data;
> - mov_text_tx3g(avctx, m);
> - return ff_ass_subtitle_header_default(avctx);
> + ret = mov_text_tx3g(avctx, m);
> + if (ret == 0) {
> + return ff_ass_subtitle_header(avctx, m->d.font,
> m->d.fontsize, m->d.color,
> + m->d.back_color, m->d.bold,
> m->d.italic,
> + m->d.underline, m->d.alignment);
> + } else
> + return ff_ass_subtitle_header_default(avctx);
> }
>
> static int mov_text_decode_frame(AVCodecContext *avctx,
--phil
More information about the ffmpeg-devel
mailing list