From patchwork Wed Jul 4 22:06:54 2018 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Baptiste Coudurier X-Patchwork-Id: 9623 Delivered-To: ffmpegpatchwork@gmail.com Received: by 2002:a02:104:0:0:0:0:0 with SMTP id c4-v6csp1225090jad; Wed, 4 Jul 2018 15:07:05 -0700 (PDT) X-Google-Smtp-Source: AAOMgpfh2KFWdshubvbtM6JPL3XbAo6iTfeYIsFvjDJod9eymaDGAlWtEMM+hyY2eyT7A5kk2xxS X-Received: by 2002:adf:cc0a:: with SMTP id x10-v6mr2539070wrh.242.1530742025641; Wed, 04 Jul 2018 15:07:05 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1530742025; cv=none; d=google.com; s=arc-20160816; b=rwtmYQvrHV224L0nkwkpS7Wpb4pIt6hnwfHCihLg873Yhs7gJMRYUv/4alxFYmTTCb aKCBzFNQHNQZY8eUCyAMUBo0EKEFnJNsyuCh5aPEmX2teYw1GsvJr6x5JtyVqgvEWcKs 57drhpzZTfzV+RnNz9acWH1z82EKln4caRCB+4c0B/SEiJejvtEhG7oB3IFeJvThX2ip rAx1uTMXQETAtqXjxuWPjT5Oy2g7QyNPBsnApXIvZRcqbhvjavssRXM7d5muTeJ+NKCm 7+bm56CebTJuuMz/glnSzig2g2u3Sh5EATH6bQA55Xk3mOdAocCOX0BMCaI/KysfKMol wQVw== 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=YGoi0OOLxBecl9O7zpVMEaFqBWp4ogKqs4uz5lXgsFI=; b=Kjn4m9H9oMFFsOlDuLHKX+N3sB4gP2ULYXLYZiQcN/2janBcPMB83ty1IcckbxiThx +6SgcNQfWCS3opLr1hgVSf8Gp0y4P8xCdd/r86vieaH1IWcKnccBrsMgLTH/xvdcw44R 3+NCNnMMt8GRf70a4xw2tZDA/4aVLK2D6k4+UKjLF5gg89Nn8hrT2BWuYVPXNLYVAJYF /8nXN9pxo7+iCZP3rky22DHq0jtGnACZ6YEGXBLh0sSoZti/dY8SLKAWBgwtgi0S2gRC xaTj4z0MnuFg7FCKfgG560kc+3NNiFFyAGGKRBHL58+n+/WDtBF6u2Q7xgE+Hb/5Lscc sEuQ== ARC-Authentication-Results: i=1; mx.google.com; dkim=neutral (body hash did not verify) header.i=@gmail.com header.s=20161025 header.b=c2H2NNCW; 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 203-v6si3397022wmt.8.2018.07.04.15.07.05; Wed, 04 Jul 2018 15:07:05 -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=c2H2NNCW; 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 CC59368AB77; Thu, 5 Jul 2018 01:06:59 +0300 (EEST) X-Original-To: ffmpeg-devel@ffmpeg.org Delivered-To: ffmpeg-devel@ffmpeg.org Received: from mail-pf0-f181.google.com (mail-pf0-f181.google.com [209.85.192.181]) by ffbox0-bg.mplayerhq.hu (Postfix) with ESMTPS id EA8B168AAFA for ; Thu, 5 Jul 2018 01:06:52 +0300 (EEST) Received: by mail-pf0-f181.google.com with SMTP id h20-v6so3566197pfn.4 for ; Wed, 04 Jul 2018 15:06:57 -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=E51UBBbKmKszg0nSKG/NWy0USeXsNLYMe5W0e9v+uoM=; b=c2H2NNCWLLRNklzRca8mLHfVe6qhqtri2ZJBm94iyoPCN3QkjPsD3Zszxz2Qen//yw iLA6XdqAIf9krfdMdjCMBLQo5rYnj7BxbAotUm75cc+o4AuDuO3Xw6vWkUWFgQyigMFG effUkYN06ZnDPS8okeqMVVCBfU98L+Ude37A9yt66YvLtMrcMEXwTzAfET+oVwyKekiJ YSrwbbqgiNLyoWmMi6l7hqWztT94xdSoKJcvXa2xnUy3WDRm/9ke8PlAF9wPcJU0nIfm NzG2DjzQA6dW5Exh1K+iXJD3ud0r9vyaQoM2NvoJB6XXtQ6fZrr3fkOZhR7DA7yXI37X d3iw== 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=E51UBBbKmKszg0nSKG/NWy0USeXsNLYMe5W0e9v+uoM=; b=Tt97zEcoe4Yv2sofQmQLLApVPpSAVkaov3HroI0tC/3+w0oIOvckXjGIN//l4tBzpY leiCtoyUxMBcJuUoxPl8gioyTaRcSYDyZnEjC4045N5NLDjsPm4ivOuKEMvcPo7DU25q AsyfEG04Z+TSB8+iMcjITkrggRS9FkH8Ip/0R6wBFGq1IDdOYUQkidwICnAKmxrA/8i7 2jwnDi+xe5T+H2LyHySctOpQkZRLP0toOmFU0iWHlKJ7r5H93BnIUal5Br/oz4AYg010 KF3qyjfYHBVP33f6I7UxMIW2vcw+L4zSutd4D8ifYpaWT7mgY8fes1cyxwsx+IC/3Ili w6qg== X-Gm-Message-State: APt69E0uzJAR8kzuV4v2cbEu7rod6zRgKoMLqx6k8tEUoWGVUAsdaNMl lL843OIf5bko2FRLBTcyxf2aYg== X-Received: by 2002:a62:ee01:: with SMTP id e1-v6mr3790708pfi.2.1530742015813; Wed, 04 Jul 2018 15:06:55 -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 x5-v6sm7120919pfh.67.2018.07.04.15.06.54 for (version=TLS1_2 cipher=ECDHE-RSA-AES128-SHA bits=128/128); Wed, 04 Jul 2018 15:06:55 -0700 (PDT) From: Baptiste Coudurier To: ffmpeg-devel@ffmpeg.org Date: Wed, 4 Jul 2018 15:06:54 -0700 Message-Id: <20180704220654.75605-1-baptiste.coudurier@gmail.com> X-Mailer: git-send-email 2.17.0 (Apple Git-106) Subject: [FFmpeg-devel] [PATCH v2] 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 | 2 ++ libavformat/mxfenc.c | 41 +++++++++++++++++++++++++++++++++++++---- libavformat/utils.c | 6 +++++- 4 files changed, 45 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 b76beb962f..575126d639 100644 --- a/libavformat/mxfdec.c +++ b/libavformat/mxfdec.c @@ -3299,6 +3299,8 @@ static int mxf_set_pts(MXFContext *mxf, AVStream *st, AVPacket *pkt) return ret; } else if (track) { track->sample_count++; + pkt->dts = pkt->pts = track->sample_count; + 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