From patchwork Fri Mar 22 23:22:05 2019 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Mathieu Duponchelle X-Patchwork-Id: 12396 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 5933144863C for ; Sat, 23 Mar 2019 01:22:23 +0200 (EET) Received: from [127.0.1.1] (localhost [127.0.0.1]) by ffbox0-bg.mplayerhq.hu (Postfix) with ESMTP id 30B0E68A66B; Sat, 23 Mar 2019 01:22:23 +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 DA1BE68A664 for ; Sat, 23 Mar 2019 01:22:15 +0200 (EET) Received: from localhost (localhost [127.0.0.1]) by mail.centricular.com (Postfix) with ESMTP id 36C1158C58; Sat, 23 Mar 2019 10:22:13 +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 df2jgxceG3ki; Sat, 23 Mar 2019 10:22:12 +1100 (AEDT) Received: from linux.home (alyon-650-1-21-203.w92-137.abo.wanadoo.fr [92.137.56.203]) by mail.centricular.com (Postfix) with ESMTPSA id 3C2DB58BC0; Sat, 23 Mar 2019 10:22:12 +1100 (AEDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=centricular.com; s=201701; t=1553296932; bh=kBmCD9v7slTCH0ZJV/aeR/KVJq0WOrS8QkZq3ZIeYAU=; h=From:To:Cc:Subject:Date:From; b=Q+t8xJ8qxvat5kVJAyT8HClag7XdbrVZA9QdCmBcMpsj2E4u5IZRXVawIeP/m2PgH Dj8DxkoctUR16Ryuv4pAsjN7tLA2bc06yqDBSFYeE45dJhVAo7ll0SmhD9fwSmAPhl rhVLCgChaFX8DphNnPb1bM4UOoXxfwtOcxUG2zi2eQzLXoIenPcfqG09KwWoURtBQV 06+zgOJwWD9rsiVfCjDm8v6cLwCjucGmTSf/Nac0RywjOpHBc96YoeX/DD5Lb0WXpx I/8HWrw4mnx0bNmgZ3JJaIH4s1g4gwk5dY/ftu1npeiXgUkmUpSRyVoYyr84mNC33e ESlWyKclZLMvw== From: Mathieu Duponchelle To: ffmpeg-devel@ffmpeg.org Date: Sat, 23 Mar 2019 00:22:05 +0100 Message-Id: <20190322232205.30420-1-mathieu@centricular.com> X-Mailer: git-send-email 2.20.1 MIME-Version: 1.0 Subject: [FFmpeg-devel] [PATCH] mpeg12enc: Use all Closed Captions side data 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" It is perfectly valid to have multiple CC Picture User Data for the same frame. Instead of using the first side_data potentially present with the A53_CC type, iterate over all side_data. --- libavcodec/mpeg12enc.c | 56 +++++++++++++++++++++++------------------- 1 file changed, 31 insertions(+), 25 deletions(-) diff --git a/libavcodec/mpeg12enc.c b/libavcodec/mpeg12enc.c index 2bc5289d63..0162939399 100644 --- a/libavcodec/mpeg12enc.c +++ b/libavcodec/mpeg12enc.c @@ -547,31 +547,37 @@ 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); + int i; + + for (i = 0; i < s->current_picture_ptr->f->nb_side_data; i++) { + side_data = s->current_picture_ptr->f->side_data[i]; + if (side_data->type != AV_FRAME_DATA_A53_CC) + continue; + + 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); + } } } }