On Mon, Jul 6, 2015 at 4:55 PM, Kieran Kunhya <kier...@ob-encoder.com> wrote: > --- > libavcodec/h264.c | 9 +++++++++ > libavcodec/h264.h | 2 ++ > libavcodec/h264_sei.c | 39 +++++++++++++++++++++++++++++++++++++-- > 3 files changed, 48 insertions(+), 2 deletions(-) > > diff --git a/libavcodec/h264.c b/libavcodec/h264.c > index baedcf4..f62ad6a 100644 > --- a/libavcodec/h264.c > +++ b/libavcodec/h264.c > @@ -879,6 +879,15 @@ static void decode_postinit(H264Context *h, int > setup_finished) > } > } > > + if (h->a53_caption) { > + AVFrameSideData *sd = > + av_frame_new_side_data(cur->f, AV_FRAME_DATA_A53_CC, > h->a53_caption_size); > + if (sd) > + memcpy(sd->data, h->a53_caption, h->a53_caption_size); > + av_freep(&h->a53_caption); > + h->a53_caption_size = 0; > + } > + > cur->mmco_reset = h->mmco_reset; > h->mmco_reset = 0; > > diff --git a/libavcodec/h264.h b/libavcodec/h264.h > index edecc4b..11a9125 100644 > --- a/libavcodec/h264.h > +++ b/libavcodec/h264.h > @@ -805,6 +805,8 @@ typedef struct H264Context { > > int missing_fields; > > + int a53_caption_size; > + uint8_t *a53_caption; > > /* for frame threading, this is set to 1 > * after finish_setup() has been called, so we cannot modify > diff --git a/libavcodec/h264_sei.c b/libavcodec/h264_sei.c > index 569db4e..fa0f4bf 100644 > --- a/libavcodec/h264_sei.c > +++ b/libavcodec/h264_sei.c > @@ -43,6 +43,9 @@ void ff_h264_reset_sei(H264Context *h) > h->sei_frame_packing_present = 0; > h->sei_display_orientation_present = 0; > h->sei_reguserdata_afd_present = 0; > + if (h->a53_caption) > + av_freep(&h->a53_caption);
isn't av_freep protected in this case? > + h->a53_caption_size = 0; > } > > static int decode_picture_timing(H264Context *h) besides that, imo patch looks good, let's wait for Luca's other proposal before merging. -- Vittorio On Mon, Jul 6, 2015 at 4:55 PM, Kieran Kunhya <kier...@ob-encoder.com> wrote: > --- > libavcodec/h264.c | 9 +++++++++ > libavcodec/h264.h | 2 ++ > libavcodec/h264_sei.c | 39 +++++++++++++++++++++++++++++++++++++-- > 3 files changed, 48 insertions(+), 2 deletions(-) > > diff --git a/libavcodec/h264.c b/libavcodec/h264.c > index baedcf4..f62ad6a 100644 > --- a/libavcodec/h264.c > +++ b/libavcodec/h264.c > @@ -879,6 +879,15 @@ static void decode_postinit(H264Context *h, int > setup_finished) > } > } > > + if (h->a53_caption) { > + AVFrameSideData *sd = > + av_frame_new_side_data(cur->f, AV_FRAME_DATA_A53_CC, > h->a53_caption_size); > + if (sd) > + memcpy(sd->data, h->a53_caption, h->a53_caption_size); > + av_freep(&h->a53_caption); > + h->a53_caption_size = 0; > + } > + > cur->mmco_reset = h->mmco_reset; > h->mmco_reset = 0; > > diff --git a/libavcodec/h264.h b/libavcodec/h264.h > index edecc4b..11a9125 100644 > --- a/libavcodec/h264.h > +++ b/libavcodec/h264.h > @@ -805,6 +805,8 @@ typedef struct H264Context { > > int missing_fields; > > + int a53_caption_size; > + uint8_t *a53_caption; > > /* for frame threading, this is set to 1 > * after finish_setup() has been called, so we cannot modify > diff --git a/libavcodec/h264_sei.c b/libavcodec/h264_sei.c > index 569db4e..fa0f4bf 100644 > --- a/libavcodec/h264_sei.c > +++ b/libavcodec/h264_sei.c > @@ -43,6 +43,9 @@ void ff_h264_reset_sei(H264Context *h) > h->sei_frame_packing_present = 0; > h->sei_display_orientation_present = 0; > h->sei_reguserdata_afd_present = 0; > + if (h->a53_caption) > + av_freep(&h->a53_caption); > + h->a53_caption_size = 0; > } > > static int decode_picture_timing(H264Context *h) > @@ -113,8 +116,7 @@ static int decode_registered_user_data(H264Context *h, > int size) > { > uint32_t country_code; > uint32_t user_identifier; > - int dtg_active_format; > - int flag; > + int flag, cc_count, user_data_type_code; > > if (size < 7) > return AVERROR_INVALIDDATA; > @@ -152,6 +154,39 @@ FF_ENABLE_DEPRECATION_WARNINGS > #endif /* FF_API_AFD */ > } > break; > + case MKBETAG('G', 'A', '9', '4'): // "GA94" closed captions > + if (size < 3) > + return AVERROR(EINVAL); > + user_data_type_code = get_bits(&h->gb, 8); > + if (user_data_type_code == 0x3) { > + skip_bits(&h->gb, 1); > + if (get_bits(&h->gb, 1)) { > + skip_bits(&h->gb, 1); > + cc_count = get_bits(&h->gb, 5); > + skip_bits(&h->gb, 8); > + size -= 2; > + if (cc_count && size >= cc_count*3) { > + int i; > + uint8_t *tmp; > + if ((int64_t)h->a53_caption_size + > (int64_t)cc_count*3 > INT_MAX) > + return AVERROR(EINVAL); > + > + // Allow merging of the cc data from two fields > + tmp = av_realloc(h->a53_caption, h->a53_caption_size > + cc_count*3); > + if (!tmp) > + return AVERROR(ENOMEM); > + h->a53_caption = tmp; > + for (i = 0; i < cc_count; i++) { > + h->a53_caption[h->a53_caption_size++] = > get_bits(&h->gb, 8); > + h->a53_caption[h->a53_caption_size++] = > get_bits(&h->gb, 8); > + h->a53_caption[h->a53_caption_size++] = > get_bits(&h->gb, 8); > + } > + > + skip_bits(&h->gb, 8); > + } > + } > + } > + break; > default: > skip_bits(&h->gb, size * 8); > break; > -- > 1.9.1 > > _______________________________________________ > libav-devel mailing list > libav-devel@libav.org > https://lists.libav.org/mailman/listinfo/libav-devel -- Vittorio _______________________________________________ libav-devel mailing list libav-devel@libav.org https://lists.libav.org/mailman/listinfo/libav-devel