[FFmpeg-devel] [PATCHv3] avcodec: Add support for Closed Caption export in h264

2015-07-02 Thread Kieran Kunhya
---
 libavcodec/h264.c | 11 +++
 libavcodec/h264.h |  2 ++
 libavcodec/h264_sei.c | 35 ++-
 3 files changed, 47 insertions(+), 1 deletion(-)

diff --git a/libavcodec/h264.c b/libavcodec/h264.c
index 1cbd4cb..1569ec8 100644
--- a/libavcodec/h264.c
+++ b/libavcodec/h264.c
@@ -609,6 +609,8 @@ static int h264_init_context(AVCodecContext *avctx, 
H264Context *h)
 h->prev_frame_num= -1;
 h->sei_fpa.frame_packing_arrangement_cancel_flag = -1;
 h->has_afd   = 0;
+h->a53_caption_size  = 0;
+h->a53_caption   = NULL;
 
 h->next_outputed_poc = INT_MIN;
 for (i = 0; i < MAX_DELAYED_PIC_COUNT; i++)
@@ -879,6 +881,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 7565e03..3aef49f 100644
--- a/libavcodec/h264.h
+++ b/libavcodec/h264.h
@@ -784,6 +784,8 @@ typedef struct H264Context {
 uint8_t afd;
 int has_afd;
 
+int a53_caption_size;
+uint8_t *a53_caption;
 
 // Timestamp stuff
 int sei_buffering_period_present;   ///< Buffering period SEI flag
diff --git a/libavcodec/h264_sei.c b/libavcodec/h264_sei.c
index b6ec5c7..5c6fcc0 100644
--- a/libavcodec/h264_sei.c
+++ b/libavcodec/h264_sei.c
@@ -111,7 +111,7 @@ static int decode_picture_timing(H264Context *h)
 static int decode_user_data_itu_t_t35(H264Context *h, int size)
 {
 uint32_t user_identifier;
-int dtg_active_format;
+int dtg_active_format, cc_count, user_data_type_code;
 
 if (size < 7)
 return -1;
@@ -143,6 +143,39 @@ FF_ENABLE_DEPRECATION_WARNINGS
 skip_bits(&h->gb, 6);
 }
 break;
+case 0x47413934: // "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

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


Re: [FFmpeg-devel] [PATCHv3] avcodec: Add support for Closed Caption export in h264

2015-07-02 Thread Pavel Koshevoy
On Thu, Jul 2, 2015 at 12:18 PM, Kieran Kunhya 
wrote:

> ---
>  libavcodec/h264.c | 11 +++
>  libavcodec/h264.h |  2 ++
>  libavcodec/h264_sei.c | 35 ++-
>  3 files changed, 47 insertions(+), 1 deletion(-)
>
> diff --git a/libavcodec/h264.c b/libavcodec/h264.c
> index 1cbd4cb..1569ec8 100644
> --- a/libavcodec/h264.c
> +++ b/libavcodec/h264.c
> @@ -609,6 +609,8 @@ static int h264_init_context(AVCodecContext *avctx,
> H264Context *h)
>  h->prev_frame_num= -1;
>  h->sei_fpa.frame_packing_arrangement_cancel_flag = -1;
>  h->has_afd   = 0;
> +h->a53_caption_size  = 0;
> +h->a53_caption   = NULL;
>
>  h->next_outputed_poc = INT_MIN;
>  for (i = 0; i < MAX_DELAYED_PIC_COUNT; i++)
> @@ -879,6 +881,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 7565e03..3aef49f 100644
> --- a/libavcodec/h264.h
> +++ b/libavcodec/h264.h
> @@ -784,6 +784,8 @@ typedef struct H264Context {
>  uint8_t afd;
>  int has_afd;
>
> +int a53_caption_size;
> +uint8_t *a53_caption;
>
>  // Timestamp stuff
>  int sei_buffering_period_present;   ///< Buffering period SEI flag
> diff --git a/libavcodec/h264_sei.c b/libavcodec/h264_sei.c
> index b6ec5c7..5c6fcc0 100644
> --- a/libavcodec/h264_sei.c
> +++ b/libavcodec/h264_sei.c
> @@ -111,7 +111,7 @@ static int decode_picture_timing(H264Context *h)
>  static int decode_user_data_itu_t_t35(H264Context *h, int size)
>  {
>  uint32_t user_identifier;
> -int dtg_active_format;
> +int dtg_active_format, cc_count, user_data_type_code;
>
>  if (size < 7)
>  return -1;
> @@ -143,6 +143,39 @@ FF_ENABLE_DEPRECATION_WARNINGS
>  skip_bits(&h->gb, 6);
>  }
>  break;
> +case 0x47413934: // "GA94" closed captions
>


Pardon my ignorance, but is this endian safe?  0x47413934 is "GA94" on
big-endian architectures, won't it be 0x34394147 on little-endian?




> +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
>
> ___
> ffmpeg-devel mailing list
> ffmpeg-devel@ffmpeg.org
> http://ffmpeg.org/mailman/listinfo/ffmpeg-devel
>
___
ffmpeg-devel mailing list
ffmpeg-devel@ffmpeg.org
http://ffmpeg.org/mailman/listinfo/ffmpeg-devel


Re: [FFmpeg-devel] [PATCHv3] avcodec: Add support for Closed Caption export in h264

2015-07-02 Thread Hendrik Leppkes
On Thu, Jul 2, 2015 at 11:17 PM, Pavel Koshevoy  wrote:
> On Thu, Jul 2, 2015 at 12:18 PM, Kieran Kunhya 
> wrote:
>
>> ---
>>  libavcodec/h264.c | 11 +++
>>  libavcodec/h264.h |  2 ++
>>  libavcodec/h264_sei.c | 35 ++-
>>  3 files changed, 47 insertions(+), 1 deletion(-)
>>
>> diff --git a/libavcodec/h264.c b/libavcodec/h264.c
>> index 1cbd4cb..1569ec8 100644
>> --- a/libavcodec/h264.c
>> +++ b/libavcodec/h264.c
>> @@ -609,6 +609,8 @@ static int h264_init_context(AVCodecContext *avctx,
>> H264Context *h)
>>  h->prev_frame_num= -1;
>>  h->sei_fpa.frame_packing_arrangement_cancel_flag = -1;
>>  h->has_afd   = 0;
>> +h->a53_caption_size  = 0;
>> +h->a53_caption   = NULL;
>>
>>  h->next_outputed_poc = INT_MIN;
>>  for (i = 0; i < MAX_DELAYED_PIC_COUNT; i++)
>> @@ -879,6 +881,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 7565e03..3aef49f 100644
>> --- a/libavcodec/h264.h
>> +++ b/libavcodec/h264.h
>> @@ -784,6 +784,8 @@ typedef struct H264Context {
>>  uint8_t afd;
>>  int has_afd;
>>
>> +int a53_caption_size;
>> +uint8_t *a53_caption;
>>
>>  // Timestamp stuff
>>  int sei_buffering_period_present;   ///< Buffering period SEI flag
>> diff --git a/libavcodec/h264_sei.c b/libavcodec/h264_sei.c
>> index b6ec5c7..5c6fcc0 100644
>> --- a/libavcodec/h264_sei.c
>> +++ b/libavcodec/h264_sei.c
>> @@ -111,7 +111,7 @@ static int decode_picture_timing(H264Context *h)
>>  static int decode_user_data_itu_t_t35(H264Context *h, int size)
>>  {
>>  uint32_t user_identifier;
>> -int dtg_active_format;
>> +int dtg_active_format, cc_count, user_data_type_code;
>>
>>  if (size < 7)
>>  return -1;
>> @@ -143,6 +143,39 @@ FF_ENABLE_DEPRECATION_WARNINGS
>>  skip_bits(&h->gb, 6);
>>  }
>>  break;
>> +case 0x47413934: // "GA94" closed captions
>>
>
>
> Pardon my ignorance, but is this endian safe?  0x47413934 is "GA94" on
> big-endian architectures, won't it be 0x34394147 on little-endian?
>

The way the value is read will always fill the variable with this
exact value, no matter what the endianness of the underlying memory
actually is.

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


Re: [FFmpeg-devel] [PATCHv3] avcodec: Add support for Closed Caption export in h264

2015-07-03 Thread Michael Niedermayer
On Thu, Jul 02, 2015 at 08:18:13PM +0100, Kieran Kunhya wrote:
> ---
>  libavcodec/h264.c | 11 +++
>  libavcodec/h264.h |  2 ++
>  libavcodec/h264_sei.c | 35 ++-
>  3 files changed, 47 insertions(+), 1 deletion(-)
> 
> diff --git a/libavcodec/h264.c b/libavcodec/h264.c
> index 1cbd4cb..1569ec8 100644
> --- a/libavcodec/h264.c
> +++ b/libavcodec/h264.c
> @@ -609,6 +609,8 @@ static int h264_init_context(AVCodecContext *avctx, 
> H264Context *h)
>  h->prev_frame_num= -1;
>  h->sei_fpa.frame_packing_arrangement_cancel_flag = -1;
>  h->has_afd   = 0;
> +h->a53_caption_size  = 0;
> +h->a53_caption   = NULL;
>  
>  h->next_outputed_poc = INT_MIN;
>  for (i = 0; i < MAX_DELAYED_PIC_COUNT; i++)
> @@ -879,6 +881,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;
>  

i think this could in case of seeking return old a53_captions
the stuff should be reset/freed in some place thats called from
avcodec_flush()->flush_dpb()
maybe ff_h264_reset_sei()

[...]

-- 
Michael GnuPG fingerprint: 9FF2128B147EF6730BADF133611EC787040B0FAB

Frequently ignored answer#1 FFmpeg bugs should be sent to our bugtracker. User
questions about the command line tools should be sent to the ffmpeg-user ML.
And questions about how to use libav* should be sent to the libav-user ML.


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