[FFmpeg-devel] [PATCH] Add support for parsing the Display Definition Segment in dvbsubdec.c

Michael Niedermayer michaelni
Mon May 24 22:44:01 CEST 2010


On Fri, May 21, 2010 at 01:50:15AM +0200, Janne Grunau wrote:
> On Thu, May 20, 2010 at 10:20:22PM +0200, Michael Niedermayer wrote:
> > 
> > i see no case in which a hierachical system with an additional rectangle
> > that contanins the other rectangles would make sense.
> > thats besides that whatever is done the API must be unambigously and clearly
> > be described. that is the interaction/relation of all the values and their
> > scale must be documented.
> > anyway, please elaborate on what problem you see
> 
> The only (minor) problem I see is that recalculating the subtitle rect's
> x/y position makes scaling them up to the full display size harder.
> As far as I understand the only purpose of this part of the DVB subtitle
> standard is to center SD subtitles reused for HD streams.
> So it's valid concern but probably not important enough to clutter the
> API.
> 
> Attached patch doesn't change API and changes only x/y values.
> 
> Janne

[...]

> @@ -334,6 +346,9 @@ static void delete_state(DVBSubContext *ctx)
>          av_free(clut);
>      }
>  
> +    if (ctx->display_definition)
> +        av_free(ctx->display_definition);

the if() is superflous and av_freep is maybe safer


> +
>      /* Should already be null */
>      if (ctx->object_list)
>          av_log(0, AV_LOG_ERROR, "Memory deallocation error!\n");

> @@ -1254,10 +1269,49 @@ static void save_display_set(DVBSubContext *ctx)
>  }
>  #endif
>  
> +static void dvbsub_parse_display_definition_segment(AVCodecContext *avctx,
> +                                                    const uint8_t *buf,
> +                                                    int buf_size)
> +{
> +    DVBSubContext *ctx = (DVBSubContext*) avctx->priv_data;

unneeded cast


> +    DVBSubDisplayDefinition *display_def = ctx->display_definition;
> +    int dds_version, info_byte;
> +
> +    if (buf_size < 5)
> +        return;
> +
> +    info_byte   = bytestream_get_byte(&buf);
> +    dds_version = (info_byte >> 4) & 0xF;

have you ever seen a byte that had its upper 4 bits > 0xf ?
;)


> +    if (display_def && (display_def->version == dds_version))
> +        return; // already have this display definition version
> +
> +    if (!display_def) {
> +        ctx->display_definition = av_mallocz(sizeof(DVBSubDisplayDefinition));
> +        display_def = ctx->display_definition;
> +    }
> +
> +    display_def->version = dds_version;
> +    display_def->x       = 0;
> +    display_def->y       = 0;
> +    display_def->width   = bytestream_get_be16(&buf) + 1;
> +    display_def->height  = bytestream_get_be16(&buf) + 1;
> +
> +    if (buf_size < 13)
> +        return;
> +
> +    if ((info_byte >> 3) & 1) { // display_window_flag

i would write & (1<<3) but i guess gcc can optimize that itself


[...]
-- 
Michael     GnuPG fingerprint: 9FF2128B147EF6730BADF133611EC787040B0FAB

Those who are too smart to engage in politics are punished by being
governed by those who are dumber. -- Plato 
-------------- next part --------------
A non-text attachment was scrubbed...
Name: not available
Type: application/pgp-signature
Size: 189 bytes
Desc: Digital signature
URL: <http://lists.mplayerhq.hu/pipermail/ffmpeg-devel/attachments/20100524/acec49d8/attachment.pgp>



More information about the ffmpeg-devel mailing list