On 09/07/15 00:17, Vittorio Giovara wrote:
> From: Kieran Kunhya <[email protected]>
> 
> Signed-off-by: Vittorio Giovara <[email protected]>
> ---
> Here's the minor changes I propose to Kieran's patch (field names in comments,
> minor cosmetics, removal of reduntant av_freep, use of av_reallocp).
> Vittorio
> 
>  libavcodec/h264.c     | 12 ++++++++++++
>  libavcodec/h264.h     |  2 ++
>  libavcodec/h264_sei.c | 45 ++++++++++++++++++++++++++++++++++++++++++++-
>  3 files changed, 58 insertions(+), 1 deletion(-)
> 
> diff --git a/libavcodec/h264.c b/libavcodec/h264.c
> index 6925a8a..a225f5b 100644
> --- a/libavcodec/h264.c
> +++ b/libavcodec/h264.c
> @@ -832,6 +832,18 @@ static void decode_postinit(H264Context *h, int 
> setup_finished)
>          h->sei_reguserdata_afd_present = 0;
>      }
>  
> +    if (h->a53_caption) {
> +        AVFrameSideData *sd = av_frame_new_side_data(cur->f,
> +                                                     AV_FRAME_DATA_A53_CC,
> +                                                     h->a53_caption_size);
> +        if (!sd)
> +            return;
> +
> +        memcpy(sd->data, h->a53_caption, h->a53_caption_size);
> +        av_freep(&h->a53_caption);
> +        h->a53_caption_size = 0;
> +    }
> +
>      // FIXME do something with unavailable reference frames
>  
>      /* Sort B-frames into display order */
> diff --git a/libavcodec/h264.h b/libavcodec/h264.h
> index 49bd464..bf8b07e 100644
> --- a/libavcodec/h264.h
> +++ b/libavcodec/h264.h
> @@ -680,6 +680,8 @@ typedef struct H264Context {
>       */
>      int sei_reguserdata_afd_present;
>      uint8_t active_format_description;
> +    int a53_caption_size;
> +    uint8_t *a53_caption;
>  
>      /**
>       * Bit set of clock types for fields/frames in picture timing SEI 
> message.
> diff --git a/libavcodec/h264_sei.c b/libavcodec/h264_sei.c
> index fe85ef1..7e509f4 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;
> +
> +    h->a53_caption_size = 0;
> +    av_freep(&h->a53_caption);
>  }
>  
>  static int decode_picture_timing(H264Context *h)
> @@ -107,7 +110,7 @@ static int decode_registered_user_data(H264Context *h, 
> int size)
>  {
>      uint32_t country_code;
>      uint32_t user_identifier;
> -    int flag;
> +    int flag, user_data_type_code, cc_count;
>  
>      if (size < 7)
>          return AVERROR_INVALIDDATA;
> @@ -140,6 +143,46 @@ static int decode_registered_user_data(H264Context *h, 
> int size)
>                  h->sei_reguserdata_afd_present = 1;
>              }
>              break;
> +        case MKBETAG('G', 'A', '9', '4'):       // 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);           // reserved
> +
> +                flag = get_bits(&h->gb, 1);     // process_cc_data_flag
> +                if (flag) {
> +                    skip_bits(&h->gb, 1);       // zero bit
> +                    cc_count = get_bits(&h->gb, 5);
> +                    skip_bits(&h->gb, 8);       // reserved
> +                    size -= 2;
> +
> +                    if (cc_count && size >= cc_count * 3) {
> +                        int i, ret;
> +                        int new_size = (int64_t) h->a53_caption_size +
> +                                       (int64_t) cc_count * 3;
> +
> +                        if (new_size > INT_MAX)
> +                            return AVERROR(EINVAL);
> +
> +                        // Allow merging of the cc data from two fields
> +                        ret = av_reallocp(&h->a53_caption,
> +                                          h->a53_caption_size + cc_count * 
> 3);
> +                        if (ret < 0)
> +                            return ret;
> +
> +                        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);   // marker_bits
> +                    }
> +                }
> +            }
> +            break;
>          default:
>              skip_bits(&h->gb, size * 8);
>              break;
> 

Should not hurt. Kieran do you have a test-sample handy?

lu
_______________________________________________
libav-devel mailing list
[email protected]
https://lists.libav.org/mailman/listinfo/libav-devel

Reply via email to