Re: [FFmpeg-devel] [PATCH] hevc: extract SEI caption data

2015-11-09 Thread Will Kelleher
On 11/7/15, 12:07 PM, "ffmpeg-devel on behalf of Michael Niedermayer" 
 wrote:



>On Sat, Nov 07, 2015 at 02:17:12PM +, Will Kelleher wrote:
>> On 11/7/15, 5:10 AM, "ffmpeg-devel on behalf of Michael Niedermayer" 
>>  wrote:
>> 
>> 
>> 
>> >On Fri, Nov 06, 2015 at 02:48:46PM -0600, Will Kelleher wrote:
>> >> Signed-off-by: Will Kelleher 
>> >> ---
>> >>  libavcodec/hevc.c | 10 +++
>> >>  libavcodec/hevc.h |  4 +++
>> >>  libavcodec/hevc_sei.c | 80 
>> >> +++
>> >>  3 files changed, 94 insertions(+)
>> >
>> >Applied
>> 
>> Thanks!
>> 
>> >
>> >do you have a sample that you can share ?
>> 
>> I do have a sample HEVC+AAC TS file.  It’s about 7MB.  Can I upload this to 
>> the FTP server?
>
>yes, please also tell us the filename afer uploading

Just uploaded /incoming/HEVC-CC.ts

>
>thx
>
>[...]
>-- 
>Michael GnuPG fingerprint: 9FF2128B147EF6730BADF133611EC787040B0FAB
>
>Opposition brings concord. Out of discord comes the fairest harmony.
>-- Heraclitus
___
ffmpeg-devel mailing list
ffmpeg-devel@ffmpeg.org
http://ffmpeg.org/mailman/listinfo/ffmpeg-devel


Re: [FFmpeg-devel] [PATCH] hevc: extract SEI caption data

2015-11-07 Thread Will Kelleher
On 11/7/15, 5:10 AM, "ffmpeg-devel on behalf of Michael Niedermayer" 
 wrote:



>On Fri, Nov 06, 2015 at 02:48:46PM -0600, Will Kelleher wrote:
>> Signed-off-by: Will Kelleher 
>> ---
>>  libavcodec/hevc.c | 10 +++
>>  libavcodec/hevc.h |  4 +++
>>  libavcodec/hevc_sei.c | 80 
>> +++
>>  3 files changed, 94 insertions(+)
>
>Applied

Thanks!

>
>do you have a sample that you can share ?

I do have a sample HEVC+AAC TS file.  It’s about 7MB.  Can I upload this to the 
FTP server?

>
>thanks
>
>[...]
>-- 
>Michael GnuPG fingerprint: 9FF2128B147EF6730BADF133611EC787040B0FAB
>
>Why not whip the teacher when the pupil misbehaves? -- Diogenes of Sinope
___
ffmpeg-devel mailing list
ffmpeg-devel@ffmpeg.org
http://ffmpeg.org/mailman/listinfo/ffmpeg-devel


Re: [FFmpeg-devel] [PATCH] hevc: extract SEI caption data

2015-11-07 Thread Michael Niedermayer
On Fri, Nov 06, 2015 at 02:48:46PM -0600, Will Kelleher wrote:
> Signed-off-by: Will Kelleher 
> ---
>  libavcodec/hevc.c | 10 +++
>  libavcodec/hevc.h |  4 +++
>  libavcodec/hevc_sei.c | 80 
> +++
>  3 files changed, 94 insertions(+)

applied

do you have a sample that you can share ?

thanks

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

Why not whip the teacher when the pupil misbehaves? -- Diogenes of Sinope


signature.asc
Description: Digital signature
___
ffmpeg-devel mailing list
ffmpeg-devel@ffmpeg.org
http://ffmpeg.org/mailman/listinfo/ffmpeg-devel


Re: [FFmpeg-devel] [PATCH] hevc: extract SEI caption data

2015-11-07 Thread Michael Niedermayer
On Sat, Nov 07, 2015 at 02:17:12PM +, Will Kelleher wrote:
> On 11/7/15, 5:10 AM, "ffmpeg-devel on behalf of Michael Niedermayer" 
>  wrote:
> 
> 
> 
> >On Fri, Nov 06, 2015 at 02:48:46PM -0600, Will Kelleher wrote:
> >> Signed-off-by: Will Kelleher 
> >> ---
> >>  libavcodec/hevc.c | 10 +++
> >>  libavcodec/hevc.h |  4 +++
> >>  libavcodec/hevc_sei.c | 80 
> >> +++
> >>  3 files changed, 94 insertions(+)
> >
> >Applied
> 
> Thanks!
> 
> >
> >do you have a sample that you can share ?
> 
> I do have a sample HEVC+AAC TS file.  It’s about 7MB.  Can I upload this to 
> the FTP server?

yes, please also tell us the filename afer uploading

thx

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

Opposition brings concord. Out of discord comes the fairest harmony.
-- Heraclitus


signature.asc
Description: Digital signature
___
ffmpeg-devel mailing list
ffmpeg-devel@ffmpeg.org
http://ffmpeg.org/mailman/listinfo/ffmpeg-devel


Re: [FFmpeg-devel] [PATCH] hevc: extract SEI caption data

2015-11-06 Thread Michael Niedermayer
On Thu, Nov 05, 2015 at 08:15:33AM -0600, Will Kelleher wrote:
> Signed-off-by: Will Kelleher 
> ---
>  libavcodec/hevc.c | 10 +++
>  libavcodec/hevc.h |  4 +++
>  libavcodec/hevc_sei.c | 79 
> +++
>  3 files changed, 93 insertions(+)
> 
> diff --git a/libavcodec/hevc.c b/libavcodec/hevc.c
> index 4b3f199..1fa5283 100644
> --- a/libavcodec/hevc.c
> +++ b/libavcodec/hevc.c
> @@ -2566,6 +2566,16 @@ static int set_side_data(HEVCContext *s)
> s->sei_hflip, s->sei_vflip);
>  }
>  
> +if (s->a53_caption) {
> +AVFrameSideData* sd = av_frame_new_side_data(out,
> + AV_FRAME_DATA_A53_CC,
> + s->a53_caption_size);
> +if (sd)
> +memcpy(sd->data, s->a53_caption, s->a53_caption_size);
> +av_freep(>a53_caption);
> +s->avctx->properties |= FF_CODEC_PROPERTY_CLOSED_CAPTIONS;
> +}
> +
>  return 0;
>  }
>  
> diff --git a/libavcodec/hevc.h b/libavcodec/hevc.h
> index 66b9a2f..6d8f703 100644
> --- a/libavcodec/hevc.h
> +++ b/libavcodec/hevc.h
> @@ -937,6 +937,10 @@ typedef struct HEVCContext {
>  int sei_hflip, sei_vflip;
>  
>  int picture_struct;
> +
> +uint8_t* a53_caption;
> +int a53_caption_size;
> +
>  } HEVCContext;
>  
>  int ff_hevc_decode_short_term_rps(GetBitContext *gb, AVCodecContext *avctx,
> diff --git a/libavcodec/hevc_sei.c b/libavcodec/hevc_sei.c
> index 179b045..0e56859 100644
> --- a/libavcodec/hevc_sei.c
> +++ b/libavcodec/hevc_sei.c
> @@ -146,6 +146,83 @@ static int decode_pic_timing(HEVCContext *s)
>  return 1;
>  }
>  
> +static int decode_registered_user_data_closed_caption(HEVCContext *s, int 
> size)
> +{
> +   int flag;
> +   int user_data_type_code;
> +   int cc_count;
> +
> +   GetBitContext *gb = >HEVClc->gb;
> +
> +   if (size < 3)
> +   return AVERROR(EINVAL);
> +
> +   user_data_type_code = get_bits(gb, 8);
> +   if (user_data_type_code == 0x3) {
> +   skip_bits(gb, 1); // reserved
> +
> +   flag = get_bits(gb, 1); // process_cc_data_flag
> +   if (flag) {
> +   skip_bits(gb, 1);
> +   cc_count = get_bits(gb, 5);
> +   skip_bits(gb, 8); // reserved
> +   size -= 2;
> +
> +   if (cc_count && size >= cc_count * 3) {

> +   if (s->a53_caption)
> +   av_freep(>a53_caption);

unneeded null pointer check


> +   s->a53_caption_size = cc_count * 3;
> +

> +   s->a53_caption = av_malloc(s->a53_caption_size);
> +
> +   int i;
> +   for (i = 0; i < s->a53_caption_size; i++) {
> +   s->a53_caption[i++] = get_bits(gb, 8);

missing malloc failure check


> +   }
> +   skip_bits(gb, 8); // marker_bits
> +   }
> +   }
> +   } else {
> +   int i;

> +   for (i = 0; i < size - 1; i++)
> +   skip_bits(gb, 8);

skip_bits_long()

[...]

-- 
Michael GnuPG fingerprint: 9FF2128B147EF6730BADF133611EC787040B0FAB

Avoid a single point of failure, be that a person or equipment.


signature.asc
Description: Digital signature
___
ffmpeg-devel mailing list
ffmpeg-devel@ffmpeg.org
http://ffmpeg.org/mailman/listinfo/ffmpeg-devel


[FFmpeg-devel] [PATCH] hevc: extract SEI caption data

2015-11-06 Thread Will Kelleher
Signed-off-by: Will Kelleher 
---
 libavcodec/hevc.c | 10 +++
 libavcodec/hevc.h |  4 +++
 libavcodec/hevc_sei.c | 79 +++
 3 files changed, 93 insertions(+)

diff --git a/libavcodec/hevc.c b/libavcodec/hevc.c
index 4b3f199..1fa5283 100644
--- a/libavcodec/hevc.c
+++ b/libavcodec/hevc.c
@@ -2566,6 +2566,16 @@ static int set_side_data(HEVCContext *s)
s->sei_hflip, s->sei_vflip);
 }
 
+if (s->a53_caption) {
+AVFrameSideData* sd = av_frame_new_side_data(out,
+ AV_FRAME_DATA_A53_CC,
+ s->a53_caption_size);
+if (sd)
+memcpy(sd->data, s->a53_caption, s->a53_caption_size);
+av_freep(>a53_caption);
+s->avctx->properties |= FF_CODEC_PROPERTY_CLOSED_CAPTIONS;
+}
+
 return 0;
 }
 
diff --git a/libavcodec/hevc.h b/libavcodec/hevc.h
index 66b9a2f..6d8f703 100644
--- a/libavcodec/hevc.h
+++ b/libavcodec/hevc.h
@@ -937,6 +937,10 @@ typedef struct HEVCContext {
 int sei_hflip, sei_vflip;
 
 int picture_struct;
+
+uint8_t* a53_caption;
+int a53_caption_size;
+
 } HEVCContext;
 
 int ff_hevc_decode_short_term_rps(GetBitContext *gb, AVCodecContext *avctx,
diff --git a/libavcodec/hevc_sei.c b/libavcodec/hevc_sei.c
index 179b045..0e56859 100644
--- a/libavcodec/hevc_sei.c
+++ b/libavcodec/hevc_sei.c
@@ -146,6 +146,83 @@ static int decode_pic_timing(HEVCContext *s)
 return 1;
 }
 
+static int decode_registered_user_data_closed_caption(HEVCContext *s, int size)
+{
+   int flag;
+   int user_data_type_code;
+   int cc_count;
+
+   GetBitContext *gb = >HEVClc->gb;
+
+   if (size < 3)
+   return AVERROR(EINVAL);
+
+   user_data_type_code = get_bits(gb, 8);
+   if (user_data_type_code == 0x3) {
+   skip_bits(gb, 1); // reserved
+
+   flag = get_bits(gb, 1); // process_cc_data_flag
+   if (flag) {
+   skip_bits(gb, 1);
+   cc_count = get_bits(gb, 5);
+   skip_bits(gb, 8); // reserved
+   size -= 2;
+
+   if (cc_count && size >= cc_count * 3) {
+   if (s->a53_caption)
+   av_freep(>a53_caption);
+   s->a53_caption_size = cc_count * 3;
+
+   s->a53_caption = av_malloc(s->a53_caption_size);
+
+   int i;
+   for (i = 0; i < s->a53_caption_size; i++) {
+   s->a53_caption[i++] = get_bits(gb, 8);
+   }
+   skip_bits(gb, 8); // marker_bits
+   }
+   }
+   } else {
+   int i;
+   for (i = 0; i < size - 1; i++)
+   skip_bits(gb, 8);
+   }
+
+   return 0;
+}
+
+static int decode_nal_sei_user_data_registered_itu_t_t35(HEVCContext *s, int 
size)
+{
+uint32_t country_code;
+uint32_t user_identifier;
+
+GetBitContext *gb = >HEVClc->gb;
+
+if (size < 7)
+return AVERROR(EINVAL);
+size -= 7;
+
+country_code = get_bits(gb, 8);
+if (country_code == 0xFF) {
+skip_bits(gb, 8);
+size--;
+}
+
+skip_bits(gb, 8);
+skip_bits(gb, 8);
+
+user_identifier = get_bits_long(gb, 32);
+
+switch (user_identifier) {
+case MKBETAG('G', 'A', '9', '4'):
+return decode_registered_user_data_closed_caption(s, size);
+default:
+skip_bits(gb, size * 8);
+break;
+}
+return 0;
+}
+
 static int active_parameter_sets(HEVCContext *s)
 {
 GetBitContext *gb = >HEVClc->gb;
@@ -198,6 +275,8 @@ static int decode_nal_sei_prefix(HEVCContext *s, int type, 
int size)
 active_parameter_sets(s);
 av_log(s->avctx, AV_LOG_DEBUG, "Skipped PREFIX SEI %d\n", type);
 return 0;
+case SEI_TYPE_USER_DATA_REGISTERED_ITU_T_T35:
+return decode_nal_sei_user_data_registered_itu_t_t35(s, size);
 default:
 av_log(s->avctx, AV_LOG_DEBUG, "Skipped PREFIX SEI %d\n", type);
 skip_bits_long(gb, 8 * size);
-- 
2.6.2

___
ffmpeg-devel mailing list
ffmpeg-devel@ffmpeg.org
http://ffmpeg.org/mailman/listinfo/ffmpeg-devel


[FFmpeg-devel] [PATCH] hevc: extract SEI caption data

2015-11-06 Thread Will Kelleher
Signed-off-by: Will Kelleher 
---
 libavcodec/hevc.c | 10 +++
 libavcodec/hevc.h |  4 +++
 libavcodec/hevc_sei.c | 80 +++
 3 files changed, 94 insertions(+)

diff --git a/libavcodec/hevc.c b/libavcodec/hevc.c
index 4b3f199..1fa5283 100644
--- a/libavcodec/hevc.c
+++ b/libavcodec/hevc.c
@@ -2566,6 +2566,16 @@ static int set_side_data(HEVCContext *s)
s->sei_hflip, s->sei_vflip);
 }
 
+if (s->a53_caption) {
+AVFrameSideData* sd = av_frame_new_side_data(out,
+ AV_FRAME_DATA_A53_CC,
+ s->a53_caption_size);
+if (sd)
+memcpy(sd->data, s->a53_caption, s->a53_caption_size);
+av_freep(>a53_caption);
+s->avctx->properties |= FF_CODEC_PROPERTY_CLOSED_CAPTIONS;
+}
+
 return 0;
 }
 
diff --git a/libavcodec/hevc.h b/libavcodec/hevc.h
index 66b9a2f..6d8f703 100644
--- a/libavcodec/hevc.h
+++ b/libavcodec/hevc.h
@@ -937,6 +937,10 @@ typedef struct HEVCContext {
 int sei_hflip, sei_vflip;
 
 int picture_struct;
+
+uint8_t* a53_caption;
+int a53_caption_size;
+
 } HEVCContext;
 
 int ff_hevc_decode_short_term_rps(GetBitContext *gb, AVCodecContext *avctx,
diff --git a/libavcodec/hevc_sei.c b/libavcodec/hevc_sei.c
index 179b045..47ba70d 100644
--- a/libavcodec/hevc_sei.c
+++ b/libavcodec/hevc_sei.c
@@ -146,6 +146,84 @@ static int decode_pic_timing(HEVCContext *s)
 return 1;
 }
 
+static int decode_registered_user_data_closed_caption(HEVCContext *s, int size)
+{
+int flag;
+int user_data_type_code;
+int cc_count;
+
+GetBitContext *gb = >HEVClc->gb;
+
+if (size < 3)
+   return AVERROR(EINVAL);
+
+user_data_type_code = get_bits(gb, 8);
+if (user_data_type_code == 0x3) {
+skip_bits(gb, 1); // reserved
+
+flag = get_bits(gb, 1); // process_cc_data_flag
+if (flag) {
+skip_bits(gb, 1);
+cc_count = get_bits(gb, 5);
+skip_bits(gb, 8); // reserved
+size -= 2;
+
+if (cc_count && size >= cc_count * 3) {
+av_freep(>a53_caption);
+s->a53_caption_size = cc_count * 3;
+
+s->a53_caption = av_malloc(s->a53_caption_size);
+if (!s->a53_caption)
+return(AVERROR(ENOMEM));
+
+int i;
+for (i = 0; i < s->a53_caption_size; i++) {
+s->a53_caption[i++] = get_bits(gb, 8);
+}
+skip_bits(gb, 8); // marker_bits
+}
+}
+} else {
+int i;
+for (i = 0; i < size - 1; i++)
+skip_bits(gb, 8);
+}
+
+return 0;
+}
+
+static int decode_nal_sei_user_data_registered_itu_t_t35(HEVCContext *s, int 
size)
+{
+uint32_t country_code;
+uint32_t user_identifier;
+
+GetBitContext *gb = >HEVClc->gb;
+
+if (size < 7)
+return AVERROR(EINVAL);
+size -= 7;
+
+country_code = get_bits(gb, 8);
+if (country_code == 0xFF) {
+skip_bits(gb, 8);
+size--;
+}
+
+skip_bits(gb, 8);
+skip_bits(gb, 8);
+
+user_identifier = get_bits_long(gb, 32);
+
+switch (user_identifier) {
+case MKBETAG('G', 'A', '9', '4'):
+return decode_registered_user_data_closed_caption(s, size);
+default:
+skip_bits_long(gb, size * 8);
+break;
+}
+return 0;
+}
+
 static int active_parameter_sets(HEVCContext *s)
 {
 GetBitContext *gb = >HEVClc->gb;
@@ -198,6 +276,8 @@ static int decode_nal_sei_prefix(HEVCContext *s, int type, 
int size)
 active_parameter_sets(s);
 av_log(s->avctx, AV_LOG_DEBUG, "Skipped PREFIX SEI %d\n", type);
 return 0;
+case SEI_TYPE_USER_DATA_REGISTERED_ITU_T_T35:
+return decode_nal_sei_user_data_registered_itu_t_t35(s, size);
 default:
 av_log(s->avctx, AV_LOG_DEBUG, "Skipped PREFIX SEI %d\n", type);
 skip_bits_long(gb, 8 * size);
-- 
2.6.2

___
ffmpeg-devel mailing list
ffmpeg-devel@ffmpeg.org
http://ffmpeg.org/mailman/listinfo/ffmpeg-devel


[FFmpeg-devel] [PATCH] hevc: extract SEI caption data

2015-11-06 Thread Will Kelleher
Signed-off-by: Will Kelleher 
---
 libavcodec/hevc.c | 10 +++
 libavcodec/hevc.h |  4 +++
 libavcodec/hevc_sei.c | 80 +++
 3 files changed, 94 insertions(+)

diff --git a/libavcodec/hevc.c b/libavcodec/hevc.c
index 4b3f199..1fa5283 100644
--- a/libavcodec/hevc.c
+++ b/libavcodec/hevc.c
@@ -2566,6 +2566,16 @@ static int set_side_data(HEVCContext *s)
s->sei_hflip, s->sei_vflip);
 }
 
+if (s->a53_caption) {
+AVFrameSideData* sd = av_frame_new_side_data(out,
+ AV_FRAME_DATA_A53_CC,
+ s->a53_caption_size);
+if (sd)
+memcpy(sd->data, s->a53_caption, s->a53_caption_size);
+av_freep(>a53_caption);
+s->avctx->properties |= FF_CODEC_PROPERTY_CLOSED_CAPTIONS;
+}
+
 return 0;
 }
 
diff --git a/libavcodec/hevc.h b/libavcodec/hevc.h
index 66b9a2f..6d8f703 100644
--- a/libavcodec/hevc.h
+++ b/libavcodec/hevc.h
@@ -937,6 +937,10 @@ typedef struct HEVCContext {
 int sei_hflip, sei_vflip;
 
 int picture_struct;
+
+uint8_t* a53_caption;
+int a53_caption_size;
+
 } HEVCContext;
 
 int ff_hevc_decode_short_term_rps(GetBitContext *gb, AVCodecContext *avctx,
diff --git a/libavcodec/hevc_sei.c b/libavcodec/hevc_sei.c
index 179b045..4132634 100644
--- a/libavcodec/hevc_sei.c
+++ b/libavcodec/hevc_sei.c
@@ -146,6 +146,84 @@ static int decode_pic_timing(HEVCContext *s)
 return 1;
 }
 
+static int decode_registered_user_data_closed_caption(HEVCContext *s, int size)
+{
+int flag;
+int user_data_type_code;
+int cc_count;
+
+GetBitContext *gb = >HEVClc->gb;
+
+if (size < 3)
+   return AVERROR(EINVAL);
+
+user_data_type_code = get_bits(gb, 8);
+if (user_data_type_code == 0x3) {
+skip_bits(gb, 1); // reserved
+
+flag = get_bits(gb, 1); // process_cc_data_flag
+if (flag) {
+skip_bits(gb, 1);
+cc_count = get_bits(gb, 5);
+skip_bits(gb, 8); // reserved
+size -= 2;
+
+if (cc_count && size >= cc_count * 3) {
+av_freep(>a53_caption);
+s->a53_caption_size = cc_count * 3;
+
+s->a53_caption = av_malloc(s->a53_caption_size);
+if (!s->a53_caption)
+return(AVERROR(ENOMEM));
+
+int i;
+for (i = 0; i < s->a53_caption_size; i++) {
+s->a53_caption[i++] = get_bits(gb, 8);
+}
+skip_bits(gb, 8); // marker_bits
+}
+}
+} else {
+int i;
+for (i = 0; i < size - 1; i++)
+skip_bits_long(gb, 8);
+}
+
+return 0;
+}
+
+static int decode_nal_sei_user_data_registered_itu_t_t35(HEVCContext *s, int 
size)
+{
+uint32_t country_code;
+uint32_t user_identifier;
+
+GetBitContext *gb = >HEVClc->gb;
+
+if (size < 7)
+return AVERROR(EINVAL);
+size -= 7;
+
+country_code = get_bits(gb, 8);
+if (country_code == 0xFF) {
+skip_bits(gb, 8);
+size--;
+}
+
+skip_bits(gb, 8);
+skip_bits(gb, 8);
+
+user_identifier = get_bits_long(gb, 32);
+
+switch (user_identifier) {
+case MKBETAG('G', 'A', '9', '4'):
+return decode_registered_user_data_closed_caption(s, size);
+default:
+skip_bits(gb, size * 8);
+break;
+}
+return 0;
+}
+
 static int active_parameter_sets(HEVCContext *s)
 {
 GetBitContext *gb = >HEVClc->gb;
@@ -198,6 +276,8 @@ static int decode_nal_sei_prefix(HEVCContext *s, int type, 
int size)
 active_parameter_sets(s);
 av_log(s->avctx, AV_LOG_DEBUG, "Skipped PREFIX SEI %d\n", type);
 return 0;
+case SEI_TYPE_USER_DATA_REGISTERED_ITU_T_T35:
+return decode_nal_sei_user_data_registered_itu_t_t35(s, size);
 default:
 av_log(s->avctx, AV_LOG_DEBUG, "Skipped PREFIX SEI %d\n", type);
 skip_bits_long(gb, 8 * size);
-- 
2.6.2

___
ffmpeg-devel mailing list
ffmpeg-devel@ffmpeg.org
http://ffmpeg.org/mailman/listinfo/ffmpeg-devel


[FFmpeg-devel] [PATCH] hevc: extract SEI caption data

2015-11-05 Thread Will Kelleher
Signed-off-by: Will Kelleher 
---
 libavcodec/hevc.c | 10 +++
 libavcodec/hevc.h |  4 +++
 libavcodec/hevc_sei.c | 79 +++
 3 files changed, 93 insertions(+)

diff --git a/libavcodec/hevc.c b/libavcodec/hevc.c
index 4b3f199..1fa5283 100644
--- a/libavcodec/hevc.c
+++ b/libavcodec/hevc.c
@@ -2566,6 +2566,16 @@ static int set_side_data(HEVCContext *s)
s->sei_hflip, s->sei_vflip);
 }
 
+if (s->a53_caption) {
+AVFrameSideData* sd = av_frame_new_side_data(out,
+ AV_FRAME_DATA_A53_CC,
+ s->a53_caption_size);
+if (sd)
+memcpy(sd->data, s->a53_caption, s->a53_caption_size);
+av_freep(>a53_caption);
+s->avctx->properties |= FF_CODEC_PROPERTY_CLOSED_CAPTIONS;
+}
+
 return 0;
 }
 
diff --git a/libavcodec/hevc.h b/libavcodec/hevc.h
index 66b9a2f..6d8f703 100644
--- a/libavcodec/hevc.h
+++ b/libavcodec/hevc.h
@@ -937,6 +937,10 @@ typedef struct HEVCContext {
 int sei_hflip, sei_vflip;
 
 int picture_struct;
+
+uint8_t* a53_caption;
+int a53_caption_size;
+
 } HEVCContext;
 
 int ff_hevc_decode_short_term_rps(GetBitContext *gb, AVCodecContext *avctx,
diff --git a/libavcodec/hevc_sei.c b/libavcodec/hevc_sei.c
index 179b045..0e56859 100644
--- a/libavcodec/hevc_sei.c
+++ b/libavcodec/hevc_sei.c
@@ -146,6 +146,83 @@ static int decode_pic_timing(HEVCContext *s)
 return 1;
 }
 
+static int decode_registered_user_data_closed_caption(HEVCContext *s, int size)
+{
+   int flag;
+   int user_data_type_code;
+   int cc_count;
+
+   GetBitContext *gb = >HEVClc->gb;
+
+   if (size < 3)
+   return AVERROR(EINVAL);
+
+   user_data_type_code = get_bits(gb, 8);
+   if (user_data_type_code == 0x3) {
+   skip_bits(gb, 1); // reserved
+
+   flag = get_bits(gb, 1); // process_cc_data_flag
+   if (flag) {
+   skip_bits(gb, 1);
+   cc_count = get_bits(gb, 5);
+   skip_bits(gb, 8); // reserved
+   size -= 2;
+
+   if (cc_count && size >= cc_count * 3) {
+   if (s->a53_caption)
+   av_freep(>a53_caption);
+   s->a53_caption_size = cc_count * 3;
+
+   s->a53_caption = av_malloc(s->a53_caption_size);
+
+   int i;
+   for (i = 0; i < s->a53_caption_size; i++) {
+   s->a53_caption[i++] = get_bits(gb, 8);
+   }
+   skip_bits(gb, 8); // marker_bits
+   }
+   }
+   } else {
+   int i;
+   for (i = 0; i < size - 1; i++)
+   skip_bits(gb, 8);
+   }
+
+   return 0;
+}
+
+static int decode_nal_sei_user_data_registered_itu_t_t35(HEVCContext *s, int 
size)
+{
+uint32_t country_code;
+uint32_t user_identifier;
+
+GetBitContext *gb = >HEVClc->gb;
+
+if (size < 7)
+return AVERROR(EINVAL);
+size -= 7;
+
+country_code = get_bits(gb, 8);
+if (country_code == 0xFF) {
+skip_bits(gb, 8);
+size--;
+}
+
+skip_bits(gb, 8);
+skip_bits(gb, 8);
+
+user_identifier = get_bits_long(gb, 32);
+
+switch (user_identifier) {
+case MKBETAG('G', 'A', '9', '4'):
+return decode_registered_user_data_closed_caption(s, size);
+default:
+skip_bits(gb, size * 8);
+break;
+}
+return 0;
+}
+
 static int active_parameter_sets(HEVCContext *s)
 {
 GetBitContext *gb = >HEVClc->gb;
@@ -198,6 +275,8 @@ static int decode_nal_sei_prefix(HEVCContext *s, int type, 
int size)
 active_parameter_sets(s);
 av_log(s->avctx, AV_LOG_DEBUG, "Skipped PREFIX SEI %d\n", type);
 return 0;
+case SEI_TYPE_USER_DATA_REGISTERED_ITU_T_T35:
+return decode_nal_sei_user_data_registered_itu_t_t35(s, size);
 default:
 av_log(s->avctx, AV_LOG_DEBUG, "Skipped PREFIX SEI %d\n", type);
 skip_bits_long(gb, 8 * size);
-- 
2.6.2

___
ffmpeg-devel mailing list
ffmpeg-devel@ffmpeg.org
http://ffmpeg.org/mailman/listinfo/ffmpeg-devel