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

Reply via email to