From patchwork Mon Nov 27 05:42:18 2017 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Mark Reid X-Patchwork-Id: 6396 Delivered-To: ffmpegpatchwork@gmail.com Received: by 10.2.161.94 with SMTP id m30csp1268502jah; Sun, 26 Nov 2017 21:43:04 -0800 (PST) X-Google-Smtp-Source: AGs4zMYQox7LD5iVAZw1qrKDqO9dwcJMlNf/035WNFVsnZyCMj3Uc45EdmH1WzvRaOpYc8xp4DlD X-Received: by 10.223.154.182 with SMTP id a51mr5164087wrc.48.1511761384196; Sun, 26 Nov 2017 21:43:04 -0800 (PST) ARC-Seal: i=1; a=rsa-sha256; t=1511761384; cv=none; d=google.com; s=arc-20160816; b=kUqhbyZT2cLtRDPzrlV9NVGe8aCHi9ERGNpbpUYULcVVyYZ6o4JAs4UsUAnF9SMG3a YJAzhWaBqCtpc/Vgcf9AquBV2FI+COSVSpR9rZluy7aEylZCCFgRHyN77zqAl7bgrVoT XzwNVt48R32BsVrYHllV9nOaFdz6xkkPRUpWkMUhd+VjtSFZjqDGco6zqV0RcvRo2A5L p3sAmZOOayDH70haksoT2LvooMsCouzs7qg9aTkrhJdoaTT++93f0QDaSycLe9JScSi4 zCVq+Cuzd3RkfVRTVOXgweN467QXFC/iJiTeWBh0t08W0QUW4qUCP4jBcCnncr4ARtqC H/3A== 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:cc:reply-to :list-subscribe:list-help:list-post:list-archive:list-unsubscribe :list-id:precedence:subject:references:in-reply-to:message-id:date :to:from:dkim-signature:delivered-to:arc-authentication-results; bh=A3ruYeYxAK3HwQq4mqtLFljplNNRungrd4ndopCQk7U=; b=G6oTOQlsd9zfyBev/MXk6YF7oyWykXGit1cUTC7FnjURAXbBzg+YqtYusalAmLRnwo ms5LOHIzYE5+Y1NNCqaXVG3arb9nNPPoPR+5vSZnc9wh+ZeQ5kYO+TRGaYlD2/5A5vaB sM3Arb+K6wAAEVrsU08tSnqOHe6YpY3jLyf8lKtk/sQSQUEZRw+5GYWdMaAgMm64BDQY smyFZLOxVwQKlmEgEKgoMyJiuZ6ikgQe1/FWpd0PjZL+8Ug+Qj/2h/A0mCRdgtE2MZk5 uaSedNE9w1ld4V8JxE6xdu+6jJNVGucVbndwhUjqF3Cez5XR5+2SUkZhBwCXPGEwnf6A mMUg== ARC-Authentication-Results: i=1; mx.google.com; dkim=neutral (body hash did not verify) header.i=@gmail.com header.s=20161025 header.b=uCdcLiBx; 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=NONE 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 p19si19440382wre.405.2017.11.26.21.43.03; Sun, 26 Nov 2017 21:43:04 -0800 (PST) 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=uCdcLiBx; 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=NONE 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 E1227689FD9; Mon, 27 Nov 2017 07:42:36 +0200 (EET) X-Original-To: ffmpeg-devel@ffmpeg.org Delivered-To: ffmpeg-devel@ffmpeg.org Received: from mail-pf0-f193.google.com (mail-pf0-f193.google.com [209.85.192.193]) by ffbox0-bg.mplayerhq.hu (Postfix) with ESMTPS id 9DB9E689F5D for ; Mon, 27 Nov 2017 07:42:30 +0200 (EET) Received: by mail-pf0-f193.google.com with SMTP id p62so112481pfi.12 for ; Sun, 26 Nov 2017 21:42:32 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20161025; h=from:to:cc:subject:date:message-id:in-reply-to:references; bh=UrVG3OUPj++Q+xs7cpHL/YtsLxOlPpfH1axo0MRKPrM=; b=uCdcLiBx2Pbylp6jDsKK8FQsRXxurWXauIB4+pVJeBI165DrVkIS8lwCP9KilGHEW2 U2tx0QPd9hPZ6chCse5hn0UEjCNRdSrXUcL1UVPi5vYJKBZiwLZKQeKoHkPsaKKjlWTB elO2mM8ixl+Eu3X8T0av56xnu4Q/OBdw4D3SxiS0dk4q1c/pqfh/pg2DdRChvkLzFwC0 5OGnzP/0ch6FDEADqAfCGV/o6DBcq2mnYzcMpNSOvbDA909V63vwiswsUrN9oOuhjptt QTNizXMVZMCF9JFQlnpE07E9C40qzGNyPGwinx15AwLUU1EH3+JceznbH1fCqvvJ1rGX OjrQ== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:from:to:cc:subject:date:message-id:in-reply-to :references; bh=UrVG3OUPj++Q+xs7cpHL/YtsLxOlPpfH1axo0MRKPrM=; b=qMAGeQHdaYzajCQHDClN9fXEm+g871FmzWwINM31+ZPNJVdbc193NNcpX/MMz9tfJo zb3gnBcMnc1BRmZnf5ezOI+/Bk4JV2oNSJuTOZ338afUbJvLtxv4Jn0lP7JH21whxja1 laQRQGSdXvAZT7JZXwfSUmhZU1MDypPdxzALBG9yLKObmWqlt0wnREVj9PusZDQnMCKs +y6tnTk/4Hye9DEJtQ1MJzl717y2CRmdHf5JJnqzKUsNdc3gGm46w1fMgkCgnrO3bBfF IUaDLLvvr1cDoUVV3ctpV1Uk1ab24ROLuYcsCw/Ng2xAUe4XSHTh8yBCG1037J6LgJoj /ceg== X-Gm-Message-State: AJaThX4rcziGagynHh6YUT2WyGTYBtP6EtHeNYxEF7rb25vwuj+7Il7g NI0N4bO+FvrbKPrhEXgRh3kUsg== X-Received: by 10.99.147.77 with SMTP id w13mr23111652pgm.401.1511761350792; Sun, 26 Nov 2017 21:42:30 -0800 (PST) Received: from localhost.localdomain (S0106ac2e8b9e4f8e.vc.shawcable.net. [174.7.100.154]) by smtp.gmail.com with ESMTPSA id y1sm42378352pge.27.2017.11.26.21.42.29 (version=TLS1 cipher=AES128-SHA bits=128/128); Sun, 26 Nov 2017 21:42:29 -0800 (PST) From: Mark Reid To: ffmpeg-devel@ffmpeg.org Date: Sun, 26 Nov 2017 21:42:18 -0800 Message-Id: <20171127054219.37859-4-mindmark@gmail.com> X-Mailer: git-send-email 2.13.6 (Apple Git-96) In-Reply-To: <20171127054219.37859-1-mindmark@gmail.com> References: <20171127054219.37859-1-mindmark@gmail.com> Subject: [FFmpeg-devel] [PATCH 3/4] avformat/mxfenc: write reel_name if metadata key is present 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: Mark Reid MIME-Version: 1.0 Errors-To: ffmpeg-devel-bounces@ffmpeg.org Sender: "ffmpeg-devel" --- libavformat/mxf.h | 1 + libavformat/mxfenc.c | 52 ++++++++++++++++++++++++++++++++++++++++++++++------ 2 files changed, 47 insertions(+), 6 deletions(-) diff --git a/libavformat/mxf.h b/libavformat/mxf.h index 2d5b44943b..ffcc429a8b 100644 --- a/libavformat/mxf.h +++ b/libavformat/mxf.h @@ -47,6 +47,7 @@ enum MXFMetadataSetType { EssenceContainerData, EssenceGroup, TaggedValue, + TapeDescriptor, }; enum MXFFrameLayout { diff --git a/libavformat/mxfenc.c b/libavformat/mxfenc.c index d573586fe4..8280f0236e 100644 --- a/libavformat/mxfenc.c +++ b/libavformat/mxfenc.c @@ -106,6 +106,7 @@ typedef struct MXFPackage { enum MXFMetadataSetType type; int instance; int uuid_offset; + struct MXFPackage *ref; } MXFPackage; enum ULIndex { @@ -999,20 +1000,33 @@ static void mxf_write_structural_component(AVFormatContext *s, AVStream *st, MXF // write source package uid, end of the reference mxf_write_local_tag(pb, 32, 0x1101); - if (package->type == SourcePackage) { + if (!package->ref) { for (i = 0; i < 4; i++) avio_wb64(pb, 0); } else - mxf_write_umid(s, 1); + mxf_write_umid(s, package->ref->instance); // write source track id mxf_write_local_tag(pb, 4, 0x1102); - if (package->type == SourcePackage) + if (package->type == SourcePackage && !package->ref) avio_wb32(pb, 0); else avio_wb32(pb, st->index+2); } +static void mxf_write_tape_descriptor(AVFormatContext *s) +{ + AVIOContext *pb = s->pb; + + mxf_write_metadata_key(pb, 0x012e00); + PRINT_KEY(s, "tape descriptor key", pb->buf_ptr - 16); + klv_encode_ber_length(pb, 20); + mxf_write_local_tag(pb, 16, 0x3C0A); + mxf_write_uuid(pb, TapeDescriptor, 0); + PRINT_KEY(s, "tape_desc uid", pb->buf_ptr - 16); +} + + static void mxf_write_multi_descriptor(AVFormatContext *s) { MXFContext *mxf = s->priv_data; @@ -1396,13 +1410,17 @@ static int mxf_write_package(AVFormatContext *s, MXFPackage *package) } // write multiple descriptor reference - if (package->type == SourcePackage) { + if (package->instance == 1) { mxf_write_local_tag(pb, 16, 0x4701); if (s->nb_streams > 1) { mxf_write_uuid(pb, MultipleDescriptor, 0); mxf_write_multi_descriptor(s); } else mxf_write_uuid(pb, SubDescriptor, 0); + } else if (package->instance == 2) { + mxf_write_local_tag(pb, 16, 0x4701); + mxf_write_uuid(pb, TapeDescriptor, 0); + mxf_write_tape_descriptor(s); } // write timecode track @@ -1416,7 +1434,7 @@ static int mxf_write_package(AVFormatContext *s, MXFPackage *package) mxf_write_sequence(s, st, package); mxf_write_structural_component(s, st, package); - if (package->type == SourcePackage) { + if (package->instance == 1) { MXFStreamContext *sc = st->priv_data; mxf_essence_container_uls[sc->index].write_desc(s, st); } @@ -1452,11 +1470,13 @@ static int mxf_write_header_metadata_sets(AVFormatContext *s) AVStream *st = NULL; int i; int track_count = 0; - MXFPackage packages[2] = {}; + MXFPackage packages[3] = {}; int package_count = 2; packages[0].type = MaterialPackage; packages[1].type = SourcePackage; packages[1].instance = 1; + packages[0].ref = &packages[1]; + if (entry = av_dict_get(s->metadata, "material_package_name", NULL, 0)) packages[0].name = entry->value; @@ -1474,6 +1494,26 @@ static int mxf_write_header_metadata_sets(AVFormatContext *s) } } + if (entry = av_dict_get(s->metadata, "reel_name", NULL, 0)) { + packages[2].name = entry->value; + } else { + /* check if any of the streams contain a reel_name */ + for (i = 0; i < s->nb_streams; i++) { + st = s->streams[i]; + if (entry = av_dict_get(st->metadata, "reel_name", NULL, 0)) { + packages[2].name = entry->value; + break; + } + } + } + + if (packages[2].name) { + packages[2].type = SourcePackage; + packages[2].instance = 2; + packages[1].ref = &packages[2]; + package_count = 3; + } + mxf_write_preface(s); mxf_write_identification(s); mxf_write_content_storage(s, packages, package_count);