From patchwork Wed Jul 4 18:35:11 2018 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Baptiste Coudurier X-Patchwork-Id: 9618 Delivered-To: ffmpegpatchwork@gmail.com Received: by 2002:a02:104:0:0:0:0:0 with SMTP id c4-v6csp1082472jad; Wed, 4 Jul 2018 11:41:10 -0700 (PDT) X-Google-Smtp-Source: AAOMgpcUxU623uTJ4hVWgfObyuIr5Lf3Y5vQo2fle8GHclV/hULE8IOhK9o+Kd16ihWQvgCMXNvj X-Received: by 2002:adf:c546:: with SMTP id s6-v6mr2526902wrf.46.1530729670591; Wed, 04 Jul 2018 11:41:10 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1530729670; cv=none; d=google.com; s=arc-20160816; b=dG84ogIC7wBrb71KrKKHOKMuSvuE7g86ZNLJ7tu5P2QvFgpkguhQAVrqhooB/xd6rb vqvjpBO+wz3Tg5jE+YlTg8U04hSqr7rrvGGupMZZ6QcNak4YQs140FCjkuB9OdHJd2Ne Uai8+GuxsuZ0fqkf1XMN+wvCLHs9SadUAzycjaI7py28eUvtz9IXHBqvmviK7TK9euqB JdE/c0pjvv9gRrrvTUOX02xEUTy03j09Qo7/TAfw6pppPcj6rerbKVApF9OwAysEWAUm uCCrQ38JDC/mPZqmDB0xv6WOunL6KhowHg5NqXYcnQXVtB1noDT0Tobp5WDv6OCGTn+O uvIQ== 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=Ygf1jYaaP6svtTlkIul7LSPPgLEx+5Qx6xHiAwh5i90=; b=gpdhKCeaINO+fJD3sf58as3HEvM8EfadRrhyWfibtazgCb+QgNLIrdPueYldQr1cpl tA81VdFJ2hPKRZHfb4C3rFLkLqTN9eI9hUK2nNwWuKwTM1AgZuBZ93cYLAD+h+dD6XaU 6JrYyVMyO3ww3uwcM+Pw8n9UKvQQKgFRnJVB5MPKnnIh+D8JcagfyqqM7EtMR5MFAEfZ tSKBAUqWsMyzvAP9L6TRxb4XeFJXdZkmflq05zEMRW1dmFZ/V9cIMwqStgGT0V8Hy++q u+dh8gKDTQuU6B1atnHQJuwPlxzIV/waeifsUSuBX+dtvDMfqR0sg4MSiTRRciH6Y0q1 GSuw== ARC-Authentication-Results: i=1; mx.google.com; dkim=neutral (body hash did not verify) header.i=@gmail.com header.s=20161025 header.b=Z3mG38Sa; 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 a185-v6si3239872wma.180.2018.07.04.11.41.10; Wed, 04 Jul 2018 11:41:10 -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=Z3mG38Sa; 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 91DDB68AA9A; Wed, 4 Jul 2018 21:41:04 +0300 (EEST) X-Original-To: ffmpeg-devel@ffmpeg.org Delivered-To: ffmpeg-devel@ffmpeg.org Received: from mail-pf0-f194.google.com (mail-pf0-f194.google.com [209.85.192.194]) by ffbox0-bg.mplayerhq.hu (Postfix) with ESMTPS id E6BBE68A8E5 for ; Wed, 4 Jul 2018 21:40:56 +0300 (EEST) Received: by mail-pf0-f194.google.com with SMTP id s21-v6so3264589pfm.6 for ; Wed, 04 Jul 2018 11:41:01 -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=covDVtOWRIY57CPvrU10fWCcd9Q8DsODJB5cNTm92Mw=; b=Z3mG38SaJ3mguAYvxrBKkG1yZh89ZdweGSE6gQZrSUkDeHcdb9NwEL+wJNfXYdI0f4 VfJ9qKhAEhaVjKnkmeeVVL9oE0uuGZzxx0fEKHzUX+kW9d9AnpU5DN0T5tN+uQ9G5EFG 0gxfB2tmAtbGlTqh7WxWDMkB8LggZuwDZFGF848rHBKicLPDWW6IHTwd6AEjDtZ9E2DU OS/ZTluMpQMx1SW+X2h8hkfEzrAi67Yoiw59C1OhYLTSRRNtiO0AsayU5KYnb66VZOHF 4Ya8jdYWkJWBdeYz3GRvyQjUOyD8Cf9xfVzdIVdMJyPv89dLecplIaBE8tpyPTZP1tl6 EEsw== 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=covDVtOWRIY57CPvrU10fWCcd9Q8DsODJB5cNTm92Mw=; b=Fd42fNhIDC3SLWubwZXmq2SKIpORMNkIuXbHOc47fzUnZRjzxjCGfgfB+26VgNWmJy ACVicdL6J8cpiveacqsce0gbQmSnihqGkLNDJf8/dqNi4Oelf53273PHzuGs7bgTmIHe cMV4YvuWfB+NmS0E4g8x85P0AbkJ96/AHo/adGYN1d1c+85skZRAvztzgp5meYw6N7lb QTK1hUVDiFNhhwcqd3dOCOBorDx8JIx8USBVWaD5GU33Z23TaWSw6PPCUGeiquYw8IV5 EvDDM7VRM1zH0C1KkHixGmUCm8idg7DQeItyh97fpgu/UlMAnrWcadY/MlOykCVZyJG2 YADw== X-Gm-Message-State: APt69E1+EXHsCMN+z4rmivvQ8n7TXF4yPkcig+U0XRKqIRzQYHSVgT5h bcJ/gWgCCyAtkkun1T07H/NpBA== X-Received: by 2002:a63:1a20:: with SMTP id a32-v6mr2857170pga.446.1530729323768; Wed, 04 Jul 2018 11:35:23 -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.22 for (version=TLS1_2 cipher=ECDHE-RSA-AES128-SHA bits=128/128); Wed, 04 Jul 2018 11:35:23 -0700 (PDT) From: Baptiste Coudurier To: ffmpeg-devel@ffmpeg.org Date: Wed, 4 Jul 2018 11:35:11 -0700 Message-Id: <20180704183514.71654-9-baptiste.coudurier@gmail.com> X-Mailer: git-send-email 2.17.0 (Apple Git-106) Subject: [FFmpeg-devel] [PATCH 09/12] lavf/mxfenc: support creating s436m data tracks 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/mxf.c | 1 + libavformat/mxfdec.c | 3 +++ libavformat/mxfenc.c | 41 +++++++++++++++++++++++++++++++++++++---- libavformat/utils.c | 6 +++++- 4 files changed, 46 insertions(+), 5 deletions(-) diff --git a/libavformat/mxf.c b/libavformat/mxf.c index 8376a2b9bf..451cbcfb2c 100644 --- a/libavformat/mxf.c +++ b/libavformat/mxf.c @@ -28,6 +28,7 @@ const MXFCodecUL ff_mxf_data_definition_uls[] = { { { 0x06,0x0E,0x2B,0x34,0x04,0x01,0x01,0x01,0x01,0x03,0x02,0x02,0x01,0x00,0x00,0x00 }, 13, AVMEDIA_TYPE_VIDEO }, { { 0x06,0x0E,0x2B,0x34,0x04,0x01,0x01,0x01,0x01,0x03,0x02,0x02,0x02,0x00,0x00,0x00 }, 13, AVMEDIA_TYPE_AUDIO }, + { { 0x06,0x0E,0x2B,0x34,0x04,0x01,0x01,0x01,0x01,0x03,0x02,0x02,0x03,0x00,0x00,0x00 }, 13, AVMEDIA_TYPE_DATA }, { { 0x80,0x7D,0x00,0x60,0x08,0x14,0x3E,0x6F,0x6F,0x3C,0x8C,0xE1,0x6C,0xEF,0x11,0xD2 }, 16, AVMEDIA_TYPE_VIDEO }, /* LegacyPicture Avid Media Composer MXF */ { { 0x80,0x7D,0x00,0x60,0x08,0x14,0x3E,0x6F,0x78,0xE1,0xEB,0xE1,0x6C,0xEF,0x11,0xD2 }, 16, AVMEDIA_TYPE_AUDIO }, /* LegacySound Avid Media Composer MXF */ { { 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00 }, 0, AVMEDIA_TYPE_DATA }, diff --git a/libavformat/mxfdec.c b/libavformat/mxfdec.c index 8c417aea26..3f443bbbc9 100644 --- a/libavformat/mxfdec.c +++ b/libavformat/mxfdec.c @@ -3291,6 +3291,9 @@ static int mxf_set_pts(MXFContext *mxf, AVStream *st, AVPacket *pkt, int64_t nex int ret = mxf_set_audio_pts(mxf, par, pkt); if (ret < 0) return ret; + } else { + pkt->dts = pkt->pts = mxf->current_edit_unit; + pkt->duration = 1; } return 0; } diff --git a/libavformat/mxfenc.c b/libavformat/mxfenc.c index 036adce011..6da27bf4f5 100644 --- a/libavformat/mxfenc.c +++ b/libavformat/mxfenc.c @@ -175,6 +175,7 @@ static void mxf_write_aes3_desc(AVFormatContext *s, AVStream *st); static void mxf_write_mpegvideo_desc(AVFormatContext *s, AVStream *st); static void mxf_write_cdci_desc(AVFormatContext *s, AVStream *st); static void mxf_write_generic_sound_desc(AVFormatContext *s, AVStream *st); +static void mxf_write_s436m_anc_desc(AVFormatContext *s, AVStream *st); static const MXFContainerEssenceEntry mxf_essence_container_uls[] = { { { 0x06,0x0E,0x2B,0x34,0x04,0x01,0x01,0x02,0x0D,0x01,0x03,0x01,0x02,0x04,0x60,0x01 }, @@ -361,6 +362,11 @@ static const MXFContainerEssenceEntry mxf_essence_container_uls[] = { { 0x06,0x0E,0x2B,0x34,0x01,0x02,0x01,0x01,0x0D,0x01,0x03,0x01,0x15,0x01,0x05,0x00 }, { 0x06,0x0E,0x2B,0x34,0x04,0x01,0x01,0x0a,0x04,0x01,0x02,0x02,0x01,0x00,0x00,0x00 }, mxf_write_mpegvideo_desc }, + // S436M ANC + { { 0x06,0x0E,0x2B,0x34,0x04,0x01,0x01,0x0a,0x0D,0x01,0x03,0x01,0x02,0x0e,0x00,0x00 }, + { 0x06,0x0E,0x2B,0x34,0x01,0x02,0x01,0x01,0x0D,0x01,0x03,0x01,0x17,0x01,0x02,0x00 }, + { 0x06,0x0E,0x2B,0x34,0x04,0x01,0x01,0x0a,0x04,0x01,0x02,0x02,0x01,0x01,0x5C,0x00 }, + mxf_write_s436m_anc_desc }, { { 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00 }, { 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00 }, { 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00 }, @@ -695,9 +701,14 @@ static void mxf_write_essence_container_refs(AVFormatContext *s) mxf_write_refs_count(pb, DESCRIPTOR_COUNT(c->essence_container_count)); av_log(s,AV_LOG_DEBUG, "essence container count:%d\n", c->essence_container_count); - for (i = 0; i < c->essence_container_count; i++) { + for (i = 0; i < s->nb_streams; i++) { MXFStreamContext *sc = s->streams[i]->priv_data; + // check first track of essence container type and only write it once + if (sc->track_essence_element_key[15] != 0) + continue; avio_write(pb, mxf_essence_container_uls[sc->index].container_ul, 16); + if (c->essence_container_count == 1) + break; } if (c->essence_container_count > 1) @@ -1154,6 +1165,7 @@ static int64_t mxf_write_generic_desc(AVFormatContext *s, AVStream *st, const UI return pos; } +static const UID mxf_s436m_anc_descriptor_key = { 0x06,0x0e,0x2b,0x34,0x02,0x53,0x01,0x01,0x0d,0x01,0x01,0x01,0x01,0x01,0x5c,0x00 }; static const UID mxf_mpegvideo_descriptor_key = { 0x06,0x0E,0x2B,0x34,0x02,0x53,0x01,0x01,0x0d,0x01,0x01,0x01,0x01,0x01,0x51,0x00 }; static const UID mxf_wav_descriptor_key = { 0x06,0x0E,0x2B,0x34,0x02,0x53,0x01,0x01,0x0d,0x01,0x01,0x01,0x01,0x01,0x48,0x00 }; static const UID mxf_aes3_descriptor_key = { 0x06,0x0E,0x2B,0x34,0x02,0x53,0x01,0x01,0x0d,0x01,0x01,0x01,0x01,0x01,0x47,0x00 }; @@ -1369,6 +1381,12 @@ static void mxf_write_cdci_desc(AVFormatContext *s, AVStream *st) mxf_update_klv_size(s->pb, pos); } +static void mxf_write_s436m_anc_desc(AVFormatContext *s, AVStream *st) +{ + int64_t pos = mxf_write_generic_desc(s, st, mxf_s436m_anc_descriptor_key); + mxf_update_klv_size(s->pb, pos); +} + static void mxf_write_mpegvideo_desc(AVFormatContext *s, AVStream *st) { AVIOContext *pb = s->pb; @@ -1723,6 +1741,7 @@ static void mxf_write_index_table_segment(AVFormatContext *s) int i, j, temporal_reordering = 0; int key_index = mxf->last_key_index; int prev_non_b_picture = 0; + int audio_frame_size = 0; int64_t pos; av_log(s, AV_LOG_DEBUG, "edit units count %d\n", mxf->edit_units_count); @@ -1792,9 +1811,11 @@ static void mxf_write_index_table_segment(AVFormatContext *s) } else if (i == 0) { // video track avio_w8(pb, 0); // slice number avio_wb32(pb, KAG_SIZE); // system item size including klv fill - } else { // audio track - unsigned audio_frame_size = sc->aic.samples[0]*sc->aic.sample_size; - audio_frame_size += klv_fill_size(audio_frame_size); + } else { // audio or data track + if (!audio_frame_size) { + audio_frame_size = sc->aic.samples[0]*sc->aic.sample_size; + audio_frame_size += klv_fill_size(audio_frame_size); + } avio_w8(pb, 1); avio_wb32(pb, (i-1)*audio_frame_size); // element delta } @@ -2505,6 +2526,18 @@ static int mxf_write_header(AVFormatContext *s) sc->frame_size = (st->codecpar->channels * spf[0].samples_per_frame[0] * av_get_bits_per_sample(st->codecpar->codec_id)) / 8; } + } else if (st->codecpar->codec_type == AVMEDIA_TYPE_DATA) { + AVDictionaryEntry *e = av_dict_get(st->metadata, "data_type", NULL, 0); + if (e && !strcmp(e->value, "vbi_vanc_smpte_436M")) { + sc->index = 38; + } else { + av_log(s, AV_LOG_ERROR, "track %d: unsupported data type\n", i); + return -1; + } + if (st->index != s->nb_streams - 1) { + av_log(s, AV_LOG_ERROR, "data track must be placed last\n"); + return -1; + } } if (!sc->index) { diff --git a/libavformat/utils.c b/libavformat/utils.c index c9cdd2b470..36a32ad9c2 100644 --- a/libavformat/utils.c +++ b/libavformat/utils.c @@ -1003,6 +1003,10 @@ FF_ENABLE_DEPRECATION_WARNINGS *pnum = frame_size; *pden = sample_rate; break; + case AVMEDIA_TYPE_DATA: + *pnum = st->time_base.num; + *pden = st->time_base.den; + break; default: break; } @@ -1405,7 +1409,7 @@ static void compute_pkt_fields(AVFormatContext *s, AVStream *st, presentation_delayed, delay, av_ts2str(pkt->pts), av_ts2str(pkt->dts), av_ts2str(st->cur_dts)); /* update flags */ - if (is_intra_only(st->codecpar->codec_id)) + if (st->codecpar->codec_type == AVMEDIA_TYPE_DATA || is_intra_only(st->codecpar->codec_id)) pkt->flags |= AV_PKT_FLAG_KEY; #if FF_API_CONVERGENCE_DURATION FF_DISABLE_DEPRECATION_WARNINGS