From patchwork Fri Feb 8 15:26:29 2019 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Mathieu Duponchelle X-Patchwork-Id: 11998 Return-Path: X-Original-To: patchwork@ffaux-bg.ffmpeg.org Delivered-To: patchwork@ffaux-bg.ffmpeg.org Received: from ffbox0-bg.mplayerhq.hu (ffbox0-bg.ffmpeg.org [79.124.17.100]) by ffaux.localdomain (Postfix) with ESMTP id 365B9446F8A for ; Fri, 8 Feb 2019 17:26:41 +0200 (EET) Received: from [127.0.1.1] (localhost [127.0.0.1]) by ffbox0-bg.mplayerhq.hu (Postfix) with ESMTP id 0B1E868AA19; Fri, 8 Feb 2019 17:26:41 +0200 (EET) X-Original-To: ffmpeg-devel@ffmpeg.org Delivered-To: ffmpeg-devel@ffmpeg.org Received: from mail.centricular.com (mail.centricular.com [50.116.37.142]) by ffbox0-bg.mplayerhq.hu (Postfix) with ESMTPS id E4CB868A5EB for ; Fri, 8 Feb 2019 17:26:34 +0200 (EET) Received: from localhost (localhost [127.0.0.1]) by mail.centricular.com (Postfix) with ESMTP id A8CD458B9F; Sat, 9 Feb 2019 02:26:33 +1100 (AEDT) X-Virus-Scanned: Debian amavisd-new at centricular.com Authentication-Results: worm-farm.widgetgrove.com.au (amavisd-new); dkim=neutral reason="invalid (public key: not available)" header.d=centricular.com Received: from mail.centricular.com ([127.0.0.1]) by localhost (worm-farm.widgetgrove.com.au [127.0.0.1]) (amavisd-new, port 10024) with ESMTP id z921y44xGryA; Sat, 9 Feb 2019 02:26:33 +1100 (AEDT) Received: from linux-1.home (alyon-650-1-21-203.w92-137.abo.wanadoo.fr [92.137.56.203]) by mail.centricular.com (Postfix) with ESMTPSA id 8B0C458B8E; Sat, 9 Feb 2019 02:26:32 +1100 (AEDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=centricular.com; s=201701; t=1549639593; bh=Yw6aVtXcvnmTDjrkyHY0hcl+2m/hRu74q7CF4qeJnWg=; h=From:To:Cc:Subject:Date:In-Reply-To:References:From; b=Aa04WYY3GIAcWR73e6UXpDN0q+ydKaYRMKo8vVlz5uy4pmSx0ToptXxFDGuS1wvWs BLBaZ00uy9yMP1hYMl4qoGp/tqCDWPYN+Idszjom1SW1ALbRLolzxYAQ6qD5H+1BOM C47Kc7H3L2XwsehkJX2bbkznmXODPBz+P6sRVcMv+OuLd32zvnqZdZ958bibpacPgv pnvzmWf1ZS35al8Q7XU7NEvsA5crvIcZ5augjfhML1VAiRUl2NhbYH9bb3C8ME32HH 6hbZbyRke6+DM1vBa+Orfy7kQOCY1zhHJcdwUtKzjoVbR6bH3c94L/aGrO+dKDOsH4 88JPtcQjxXZsA== From: Mathieu Duponchelle To: ffmpeg-devel@ffmpeg.org Date: Fri, 8 Feb 2019 16:26:29 +0100 Message-Id: <20190208152629.6070-1-mathieu@centricular.com> X-Mailer: git-send-email 2.20.1 In-Reply-To: <20190207160854.8419-1-mathieu@centricular.com> References: <20190207160854.8419-1-mathieu@centricular.com> MIME-Version: 1.0 Subject: [FFmpeg-devel] [PATCH v6] mpeg12enc: Use Closed Captions if available X-BeenThere: ffmpeg-devel@ffmpeg.org X-Mailman-Version: 2.1.20 Precedence: list List-Id: FFmpeg development discussions and patches List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Reply-To: FFmpeg development discussions and patches Cc: Mathieu Duponchelle Errors-To: ffmpeg-devel-bounces@ffmpeg.org Sender: "ffmpeg-devel" --- 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}. +@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 }, \ extern const AVOption ff_mpv_generic_options[];