From patchwork Wed Jul 4 18:35:05 2018 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Baptiste Coudurier X-Patchwork-Id: 9611 Delivered-To: ffmpegpatchwork@gmail.com Received: by 2002:a02:104:0:0:0:0:0 with SMTP id c4-v6csp1078638jad; Wed, 4 Jul 2018 11:35:43 -0700 (PDT) X-Google-Smtp-Source: AAOMgpcMXKk5z0dU4xT0EcdGLKp+nUCjpzZaqQRZ8V/4MZaTMSGALa7V/DLCyfI/fS337CtJ3Gj5 X-Received: by 2002:a1c:2905:: with SMTP id p5-v6mr2253544wmp.78.1530729343256; Wed, 04 Jul 2018 11:35:43 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1530729343; cv=none; d=google.com; s=arc-20160816; b=WEnwEM+Zsc6M07hRo1yqErdcFk2W7j3i6kfCmD1dIKOGH9xOkDc4Td3LXwTpTpxwnW bThr/7xP8Sd3SIMw1AQq86jIPkxCKLTZMACWxREaLEKftglgTnJcaTJJKcvRGPAlAEVS cqXpX+WcrochrHKxzysutgYwvmZjUO5r+HSK+W6X8biF6dr/vQazRfOyyePGv32V7P1H c/nTOkcl0ZFn94k2oaf9NTgncFPdNu0bdkhVfp9hfUK1qVHcOKYqUeizkB1r6GHCXQEj z69wwRZwJ0K0r6x4Kjm2Oq3W4dlJBbEDs5Ufh70/G5ZjDFttUacwCVG2ROUJnYI/L9dj Aa2g== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=sender:errors-to:content-transfer-encoding:mime-version:reply-to :list-subscribe:list-help:list-post:list-archive:list-unsubscribe :list-id:precedence:subject:message-id:date:to:from:dkim-signature :delivered-to:arc-authentication-results; bh=qREyphFI6PQjZqknQlc+dunYcbsYNDo42b9IPN/ojeo=; b=Zi4RTlCATKsJft5GuouPNvu4tA7vvmvUnZA0dy8rA60Th0w9lNxNPl3mNmJ7ax65fZ LoDP4nM6AwUmOhZAeehtZh+Wq1FInBOw44KjzM7KvDCMgqIxTP1K5GQsg2N0VWJee1Yp z3r/diCPzaWJOighGU3eDgVOcWHS6yakauEFDPq0YObHYr85490YFjEHnpaNUdKBvYTu yGrnyNIuIfxLEhZxVGMArmM4/FbB6PJRf7M6VzxeD6eb/mj7ZgoyVtLKHhhAliooX8Ve OEK/c/LUe9kyZ3x8LNXOpQ9/xomXkttQh6sZnK/GbH7HUeTjfF0SCx0n+j9mZWyOvWnN dzdg== ARC-Authentication-Results: i=1; mx.google.com; dkim=neutral (body hash did not verify) header.i=@gmail.com header.s=20161025 header.b=b5z9kCOq; spf=pass (google.com: domain of ffmpeg-devel-bounces@ffmpeg.org designates 79.124.17.100 as permitted sender) smtp.mailfrom=ffmpeg-devel-bounces@ffmpeg.org; dmarc=fail (p=NONE sp=QUARANTINE dis=NONE) header.from=gmail.com Return-Path: Received: from ffbox0-bg.mplayerhq.hu (ffbox0-bg.ffmpeg.org. [79.124.17.100]) by mx.google.com with ESMTP id 5-v6si3246631wrk.432.2018.07.04.11.35.42; Wed, 04 Jul 2018 11:35:43 -0700 (PDT) Received-SPF: pass (google.com: domain of ffmpeg-devel-bounces@ffmpeg.org designates 79.124.17.100 as permitted sender) client-ip=79.124.17.100; Authentication-Results: mx.google.com; dkim=neutral (body hash did not verify) header.i=@gmail.com header.s=20161025 header.b=b5z9kCOq; spf=pass (google.com: domain of ffmpeg-devel-bounces@ffmpeg.org designates 79.124.17.100 as permitted sender) smtp.mailfrom=ffmpeg-devel-bounces@ffmpeg.org; dmarc=fail (p=NONE sp=QUARANTINE dis=NONE) header.from=gmail.com Received: from [127.0.1.1] (localhost [127.0.0.1]) by ffbox0-bg.mplayerhq.hu (Postfix) with ESMTP id 5E74168AB0A; Wed, 4 Jul 2018 21:35:18 +0300 (EEST) X-Original-To: ffmpeg-devel@ffmpeg.org Delivered-To: ffmpeg-devel@ffmpeg.org Received: from mail-pf0-f171.google.com (mail-pf0-f171.google.com [209.85.192.171]) by ffbox0-bg.mplayerhq.hu (Postfix) with ESMTPS id 7F42968A279 for ; Wed, 4 Jul 2018 21:35:15 +0300 (EEST) Received: by mail-pf0-f171.google.com with SMTP id j17-v6so3257760pfn.5 for ; Wed, 04 Jul 2018 11:35:20 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20161025; h=from:to:subject:date:message-id; bh=kclZF7rwmadv8nLMkA06OoEo6ioxXu3jcs45ADoGu1Y=; b=b5z9kCOqwfgKGw9jhLDmK4Wc5sQcmxlo2fvDXrTps6ZzIxPJhiN9L9bgD3IqJtlWi+ EZuyy+KCNYRvPFye340b1C37rjqRadDCy1XSdmkLOIaDOpMB2glFO1eq+fF/9VlvlxHC SCJk08KZtYjBEyR0eJNE7P7IcYKTDnzR7Sryoqe4m7sH3A3pzcdg7v/jvjnmxEU3+4ev 1R5xG0FTykGGZqfv311/THmRl8FPEcWTDtgSZu9SCj9BAkJyMCqEgPboMTxxK4YvHlD6 7RE+cZv4i5SPlTU7HWrnB+PN+P9bhzkFy7auIc9kcj7gflpgFo3OJCN+ePn3T3luciG6 DFQw== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:from:to:subject:date:message-id; bh=kclZF7rwmadv8nLMkA06OoEo6ioxXu3jcs45ADoGu1Y=; b=WD2S//Ry1LOjwYQT/5irJ7Bsw6xC2Q5UisTqs1P9qUsHJg26/9IDx8dM7ZMI3MZlxl kignbB9oVa0oWfPnupTJKYFpeWCk+KUdJMyAJMIhn/tGfXvWPlIFvoM0BR8mwWhuQ6B9 uABpCDEftDLcNvc0VrN1q6Wmn2C/c5D9z+UU5qKDEupvsC1yGeEekOIRX/QctSeMjijm lzoPoucc0lb9IcoWCZjCg/OKj7ZyUijxz19hLaKwhObv4mFh8ScPDFoX9UzwGms5VpqF yMyvO7SM6jtEuATqNoKubGJxctC63J1FhV3vuOP8JEtQ5n/dMGCK+NL0WPTlTDWY82MI u4Wg== X-Gm-Message-State: APt69E3biYID7EhX6NqARJUPuYzv7aREl4k3d1aw/rkQX3rY+q7zOIGp kB+PuX0bHwXRgo/TGoaQwZOxow== X-Received: by 2002:a63:4703:: with SMTP id u3-v6mr2758194pga.405.1530729318389; Wed, 04 Jul 2018 11:35:18 -0700 (PDT) Received: from localhost.localdomain (cpe-104-173-251-254.socal.res.rr.com. [104.173.251.254]) by smtp.gmail.com with ESMTPSA id v126-v6sm8591239pgv.39.2018.07.04.11.35.17 for (version=TLS1_2 cipher=ECDHE-RSA-AES128-SHA bits=128/128); Wed, 04 Jul 2018 11:35:17 -0700 (PDT) From: Baptiste Coudurier To: ffmpeg-devel@ffmpeg.org Date: Wed, 4 Jul 2018 11:35:05 -0700 Message-Id: <20180704183514.71654-3-baptiste.coudurier@gmail.com> X-Mailer: git-send-email 2.17.0 (Apple Git-106) Subject: [FFmpeg-devel] [PATCH 03/12] avformat/mxfenc: add mpeg-2 specific metadata, fix compatibility with sony content browser 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 MIME-Version: 1.0 Errors-To: ffmpeg-devel-bounces@ffmpeg.org Sender: "ffmpeg-devel" --- libavformat/mxfenc.c | 46 ++++++++++++++++++++++++++++++--- tests/ref/lavf/mxf | 6 ++--- tests/ref/lavf/mxf_d10 | 2 +- tests/ref/lavf/mxf_dv25 | 2 +- tests/ref/lavf/mxf_dvcpro50 | 2 +- tests/ref/lavf/mxf_opatom | 2 +- tests/ref/lavf/mxf_opatom_audio | 2 +- 7 files changed, 50 insertions(+), 12 deletions(-) diff --git a/libavformat/mxfenc.c b/libavformat/mxfenc.c index 8c1e38353c..b54a94b62e 100644 --- a/libavformat/mxfenc.c +++ b/libavformat/mxfenc.c @@ -95,6 +95,10 @@ typedef struct MXFStreamContext { int video_bit_rate; int slice_offset; int frame_size; ///< frame size in bytes + int seq_closed_gop; ///< all gops in sequence are closed, used in mpeg-2 descriptor + int max_gop; ///< maximum gop size, used by mpeg-2 descriptor + int b_picture_count; ///< maximum number of consecutive b pictures, used in mpeg-2 descriptor + int low_delay; ///< low delay, used in mpeg-2 descriptor } MXFStreamContext; typedef struct MXFContainerEssenceEntry { @@ -528,7 +532,11 @@ static const MXFLocalTagPair mxf_local_tag_batch[] = { { 0x3F0A, {0x06,0x0E,0x2B,0x34,0x01,0x01,0x01,0x05,0x04,0x04,0x04,0x02,0x05,0x00,0x00,0x00}}, /* Index Entry Array */ // MPEG video Descriptor { 0x8000, {0x06,0x0E,0x2B,0x34,0x01,0x01,0x01,0x05,0x04,0x01,0x06,0x02,0x01,0x0B,0x00,0x00}}, /* BitRate */ + { 0x8003, {0x06,0x0E,0x2B,0x34,0x01,0x01,0x01,0x05,0x04,0x01,0x06,0x02,0x01,0x05,0x00,0x00}}, /* LowDelay */ + { 0x8004, {0x06,0x0E,0x2B,0x34,0x01,0x01,0x01,0x05,0x04,0x01,0x06,0x02,0x01,0x06,0x00,0x00}}, /* ClosedGOP */ + { 0x8006, {0x06,0x0E,0x2B,0x34,0x01,0x01,0x01,0x05,0x04,0x01,0x06,0x02,0x01,0x08,0x00,0x00}}, /* MaxGOP */ { 0x8007, {0x06,0x0E,0x2B,0x34,0x01,0x01,0x01,0x05,0x04,0x01,0x06,0x02,0x01,0x0A,0x00,0x00}}, /* ProfileAndLevel */ + { 0x8008, {0x06,0x0E,0x2B,0x34,0x01,0x01,0x01,0x05,0x04,0x01,0x06,0x02,0x01,0x09,0x00,0x00}}, /* BPictureCount */ // Wave Audio Essence Descriptor { 0x3D09, {0x06,0x0E,0x2B,0x34,0x01,0x01,0x01,0x05,0x04,0x02,0x03,0x03,0x05,0x00,0x00,0x00}}, /* Average Bytes Per Second */ { 0x3D0A, {0x06,0x0E,0x2B,0x34,0x01,0x01,0x01,0x05,0x04,0x02,0x03,0x02,0x01,0x00,0x00,0x00}}, /* Block Align */ @@ -1264,10 +1272,8 @@ static int64_t mxf_write_cdci_common(AVFormatContext *s, AVStream *st, const UID avio_wb32(pb, sc->h_chroma_sub_sample); // vertical subsampling - if (sc->v_chroma_sub_sample) { - mxf_write_local_tag(pb, 4, 0x3308); - avio_wb32(pb, sc->v_chroma_sub_sample); - } + mxf_write_local_tag(pb, 4, 0x3308); + avio_wb32(pb, sc->v_chroma_sub_sample); // color siting mxf_write_local_tag(pb, 1, 0x3303); @@ -1379,6 +1385,22 @@ static void mxf_write_mpegvideo_desc(AVFormatContext *s, AVStream *st) if (!st->codecpar->profile) profile_and_level |= 0x80; // escape bit avio_w8(pb, profile_and_level); + + // low delay + mxf_write_local_tag(pb, 1, 0x8003); + avio_w8(pb, sc->low_delay); + + // closed gop + mxf_write_local_tag(pb, 1, 0x8004); + avio_w8(pb, sc->seq_closed_gop); + + // max gop + mxf_write_local_tag(pb, 2, 0x8006); + avio_wb16(pb, sc->max_gop); + + // b picture count + mxf_write_local_tag(pb, 2, 0x8008); + avio_wb16(pb, sc->b_picture_count); } mxf_update_klv_size(pb, pos); @@ -1699,6 +1721,7 @@ static void mxf_write_index_table_segment(AVFormatContext *s) AVIOContext *pb = s->pb; int i, j, temporal_reordering = 0; int key_index = mxf->last_key_index; + int prev_non_b_picture = 0; int64_t pos; av_log(s, AV_LOG_DEBUG, "edit units count %d\n", mxf->edit_units_count); @@ -1777,6 +1800,7 @@ static void mxf_write_index_table_segment(AVFormatContext *s) } if (!mxf->edit_unit_byte_count) { + MXFStreamContext *sc = s->streams[0]->priv_data; mxf_write_local_tag(pb, 8 + mxf->edit_units_count*15, 0x3F0A); avio_wb32(pb, mxf->edit_units_count); // num of entries avio_wb32(pb, 15); // size of one entry @@ -1785,6 +1809,7 @@ static void mxf_write_index_table_segment(AVFormatContext *s) int temporal_offset = 0; if (!(mxf->index_entries[i].flags & 0x33)) { // I-frame + sc->max_gop = FFMAX(sc->max_gop, i - mxf->last_key_index); mxf->last_key_index = key_index; key_index = i; } @@ -1804,11 +1829,13 @@ static void mxf_write_index_table_segment(AVFormatContext *s) avio_w8(pb, temporal_offset); if ((mxf->index_entries[i].flags & 0x30) == 0x30) { // back and forward prediction + sc->b_picture_count = FFMAX(sc->b_picture_count, i - prev_non_b_picture); avio_w8(pb, mxf->last_key_index - i); } else { avio_w8(pb, key_index - i); // key frame offset if ((mxf->index_entries[i].flags & 0x20) == 0x20) // only forward mxf->last_key_index = key_index; + prev_non_b_picture = i; } if (!(mxf->index_entries[i].flags & 0x33) && // I-frame @@ -2234,6 +2261,7 @@ static int mxf_parse_mpeg2_frame(AVFormatContext *s, AVStream *st, if ((pkt->data[i+1] & 0xf0) == 0x10) { // seq ext st->codecpar->profile = pkt->data[i+1] & 0x07; st->codecpar->level = pkt->data[i+2] >> 4; + sc->low_delay = pkt->data[i+6] >> 7; } else if (i + 5 < pkt->size && (pkt->data[i+1] & 0xf0) == 0x80) { // pict coding ext sc->interlaced = !(pkt->data[i+5] & 0x80); // progressive frame if (sc->interlaced) @@ -2242,9 +2270,14 @@ static int mxf_parse_mpeg2_frame(AVFormatContext *s, AVStream *st, } } else if (c == 0x1b8) { // gop if (pkt->data[i+4]>>6 & 0x01) { // closed + if (sc->seq_closed_gop == -1) + sc->seq_closed_gop = 1; sc->closed_gop = 1; if (e->flags & 0x40) // sequence header present e->flags |= 0x80; // random access + } else { + sc->seq_closed_gop = 0; + sc->closed_gop = 0; } } else if (c == 0x1b3) { // seq e->flags |= 0x40; @@ -2356,6 +2389,7 @@ static int mxf_write_header(AVFormatContext *s) // Default component depth to 8 sc->component_depth = 8; sc->h_chroma_sub_sample = 2; + sc->v_chroma_sub_sample = 2; sc->color_siting = 0xFF; if (pix_desc) { @@ -2383,6 +2417,10 @@ static int mxf_write_header(AVFormatContext *s) if((ret = mxf_init_timecode(s, st, rate)) < 0) return ret; + if (st->codecpar->codec_id == AV_CODEC_ID_MPEG2VIDEO) { + sc->seq_closed_gop = -1; // unknown yet + } + sc->video_bit_rate = st->codecpar->bit_rate; if (s->oformat == &ff_mxf_d10_muxer || diff --git a/tests/ref/lavf/mxf b/tests/ref/lavf/mxf index e99f737ed8..7f6d698855 100644 --- a/tests/ref/lavf/mxf +++ b/tests/ref/lavf/mxf @@ -1,9 +1,9 @@ -96c0f82082eb420ecbddf7810f3b3943 *./tests/data/lavf/lavf.mxf +eea31259441d909fedb9a0e0eb9bbdb2 *./tests/data/lavf/lavf.mxf 526393 ./tests/data/lavf/lavf.mxf ./tests/data/lavf/lavf.mxf CRC=0x8dddfaab -4b73c93955f4ae2fcddb2fc99e5e7017 *./tests/data/lavf/lavf.mxf +2c4a6634f646f7ab76bf2b7e71c8c893 *./tests/data/lavf/lavf.mxf 561721 ./tests/data/lavf/lavf.mxf ./tests/data/lavf/lavf.mxf CRC=0xf21b1b48 -8376d69f7eccfc268041dffd82db1a61 *./tests/data/lavf/lavf.mxf +e547b44d71cd5871582522a31511ae9c *./tests/data/lavf/lavf.mxf 526393 ./tests/data/lavf/lavf.mxf ./tests/data/lavf/lavf.mxf CRC=0x8dddfaab diff --git a/tests/ref/lavf/mxf_d10 b/tests/ref/lavf/mxf_d10 index a40a42a2e2..0b9f49bb09 100644 --- a/tests/ref/lavf/mxf_d10 +++ b/tests/ref/lavf/mxf_d10 @@ -1,3 +1,3 @@ -ad3f0da2f77e5269e896b367f2a5b0b0 *./tests/data/lavf/lavf.mxf_d10 +9f299fd4da6a20ef93adad7fe6a9f481 *./tests/data/lavf/lavf.mxf_d10 5332013 ./tests/data/lavf/lavf.mxf_d10 ./tests/data/lavf/lavf.mxf_d10 CRC=0x6c74d488 diff --git a/tests/ref/lavf/mxf_dv25 b/tests/ref/lavf/mxf_dv25 index efec757218..200511e164 100644 --- a/tests/ref/lavf/mxf_dv25 +++ b/tests/ref/lavf/mxf_dv25 @@ -1,3 +1,3 @@ -cd1ea9497444b0b43d930b0dc56aecf7 *./tests/data/lavf/lavf.mxf_dv25 +358791c5468c39673239e038fb64a734 *./tests/data/lavf/lavf.mxf_dv25 3834413 ./tests/data/lavf/lavf.mxf_dv25 ./tests/data/lavf/lavf.mxf_dv25 CRC=0xbdaf7f52 diff --git a/tests/ref/lavf/mxf_dvcpro50 b/tests/ref/lavf/mxf_dvcpro50 index bbe4562ec4..f212c0321d 100644 --- a/tests/ref/lavf/mxf_dvcpro50 +++ b/tests/ref/lavf/mxf_dvcpro50 @@ -1,3 +1,3 @@ -ce601c92f0e2d7f07cbf6263a8a18ea5 *./tests/data/lavf/lavf.mxf_dvcpro50 +fac7c59ea81c752d769335ddaa818f90 *./tests/data/lavf/lavf.mxf_dvcpro50 7431213 ./tests/data/lavf/lavf.mxf_dvcpro50 ./tests/data/lavf/lavf.mxf_dvcpro50 CRC=0xe3bbe4b4 diff --git a/tests/ref/lavf/mxf_opatom b/tests/ref/lavf/mxf_opatom index bca8f65154..5ea47f4df6 100644 --- a/tests/ref/lavf/mxf_opatom +++ b/tests/ref/lavf/mxf_opatom @@ -1,3 +1,3 @@ -76093fef1ac42587cc374012dc1945db *./tests/data/lavf/lavf.mxf_opatom +49b0b3dfeb6a9ec024b047fc627b66fd *./tests/data/lavf/lavf.mxf_opatom 4717625 ./tests/data/lavf/lavf.mxf_opatom ./tests/data/lavf/lavf.mxf_opatom CRC=0xf55aa22a diff --git a/tests/ref/lavf/mxf_opatom_audio b/tests/ref/lavf/mxf_opatom_audio index 380ce4f0a3..540f430cda 100644 --- a/tests/ref/lavf/mxf_opatom_audio +++ b/tests/ref/lavf/mxf_opatom_audio @@ -1,3 +1,3 @@ -8524f908a6fa8750a4755ab79cc1516c *./tests/data/lavf/lavf.mxf_opatom_audio +862dc5c9f2c94bd2c545ca64f923d1a1 *./tests/data/lavf/lavf.mxf_opatom_audio 102969 ./tests/data/lavf/lavf.mxf_opatom_audio ./tests/data/lavf/lavf.mxf_opatom_audio CRC=0xd155c6ff