[FFmpeg-devel] [PATCH v6] mpeg12enc: Use Closed Captions if available
Aman Gupta
ffmpeg at tmm1.net
Fri Feb 8 23:11:03 EET 2019
On Fri, Feb 8, 2019 at 7:26 AM Mathieu Duponchelle <mathieu at centricular.com>
wrote:
> ---
> doc/encoders.texi | 3 +++
> libavcodec/mpeg12enc.c | 32 ++++++++++++++++++++++++++++++++
> libavcodec/mpegvideo.h | 2 ++
> 3 files changed, 37 insertions(+)
>
> diff --git a/doc/encoders.texi b/doc/encoders.texi
> index e86ae69cc5..a283b9fddf 100644
> --- a/doc/encoders.texi
> +++ b/doc/encoders.texi
> @@ -2574,6 +2574,9 @@ Specifies the video_format written into the sequence
> display extension
> indicating the source of the video pictures. The default is
> @samp{unspecified},
> can be @samp{component}, @samp{pal}, @samp{ntsc}, @samp{secam} or
> @samp{mac}.
> For maximum compatibility, use @samp{component}.
> + at item a53cc @var{boolean}
> +Import closed captions (which must be ATSC compatible format) into output.
> +Default is 1 (on).
> @end table
>
> @section png
> diff --git a/libavcodec/mpeg12enc.c b/libavcodec/mpeg12enc.c
> index d0b458e34b..2bc5289d63 100644
> --- a/libavcodec/mpeg12enc.c
> +++ b/libavcodec/mpeg12enc.c
> @@ -61,6 +61,8 @@ static uint32_t mpeg1_chr_dc_uni[512];
> static uint8_t mpeg1_index_run[2][64];
> static int8_t mpeg1_max_level[2][64];
>
> +#define A53_MAX_CC_COUNT 0x1f
> +
> static av_cold void init_uni_ac_vlc(RLTable *rl, uint8_t *uni_ac_vlc_len)
> {
> int i;
> @@ -544,6 +546,36 @@ void ff_mpeg1_encode_picture_header(MpegEncContext
> *s, int picture_number)
> }
> }
>
> + if (s->codec_id == AV_CODEC_ID_MPEG2VIDEO && s->a53_cc) {
> + side_data = av_frame_get_side_data(s->current_picture_ptr->f,
> + AV_FRAME_DATA_A53_CC);
> + if (side_data) {
> + if (side_data->size <= A53_MAX_CC_COUNT * 3 &&
> side_data->size % 3 == 0) {
> + int i = 0;
> +
> + put_header (s, USER_START_CODE);
> +
> + put_bits(&s->pb, 8, 'G'); //
> user_identifier
> + put_bits(&s->pb, 8, 'A');
> + put_bits(&s->pb, 8, '9');
> + put_bits(&s->pb, 8, '4');
> + put_bits(&s->pb, 8, 3); //
> user_data_type_code
> + put_bits(&s->pb, 8,
> + (side_data->size / 3 & A53_MAX_CC_COUNT) | 0x40); //
> flags, cc_count
> + put_bits(&s->pb, 8, 0xff); // em_data
> +
> + for (i = 0; i < side_data->size; i++)
> + put_bits(&s->pb, 8, side_data->data[i]);
> +
> + put_bits(&s->pb, 8, 0xff); // marker_bits
> + } else {
> + av_log(s->avctx, AV_LOG_WARNING,
> + "Warning Closed Caption size (%d) can not exceed 93
> bytes "
> + "and must be a multiple of 3\n", side_data->size);
> + }
> + }
> + }
> +
> s->mb_y = 0;
> ff_mpeg1_encode_slice_header(s);
> }
> diff --git a/libavcodec/mpegvideo.h b/libavcodec/mpegvideo.h
> index bbc6b5646a..3e52f98390 100644
> --- a/libavcodec/mpegvideo.h
> +++ b/libavcodec/mpegvideo.h
> @@ -455,6 +455,7 @@ typedef struct MpegEncContext {
> /* MPEG-2-specific - I wished not to have to support this mess. */
> int progressive_sequence;
> int mpeg_f_code[2][2];
> + int a53_cc;
>
> // picture structure defines are loaded from mpegutils.h
> int picture_structure;
> @@ -663,6 +664,7 @@ FF_MPV_OPT_CMP_FUNC, \
> {"ps", "RTP payload size in bytes",
> FF_MPV_OFFSET(rtp_payload_size), AV_OPT_TYPE_INT, {.i64 = 0 }, INT_MIN,
> INT_MAX, FF_MPV_OPT_FLAGS }, \
> {"mepc", "Motion estimation bitrate penalty compensation (1.0 = 256)",
> FF_MPV_OFFSET(me_penalty_compensation), AV_OPT_TYPE_INT, {.i64 = 256 },
> INT_MIN, INT_MAX, FF_MPV_OPT_FLAGS }, \
> {"mepre", "pre motion estimation", FF_MPV_OFFSET(me_pre),
> AV_OPT_TYPE_INT, {.i64 = 0 }, INT_MIN, INT_MAX, FF_MPV_OPT_FLAGS }, \
> +{ "a53cc", "Use A53 Closed Captions (if available)",
> FF_MPV_OFFSET(a53_cc), AV_OPT_TYPE_BOOL, {.i64 = 1}, 0, 1, FF_MPV_OPT_FLAGS
> }, \
>
Could you remove the space after the { to match the other definitions above.
>
> extern const AVOption ff_mpv_generic_options[];
>
> --
> 2.20.1
>
> _______________________________________________
> ffmpeg-devel mailing list
> ffmpeg-devel at ffmpeg.org
> http://ffmpeg.org/mailman/listinfo/ffmpeg-devel
>
More information about the ffmpeg-devel
mailing list