From patchwork Wed Sep 21 20:42:08 2016 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Mark Reid X-Patchwork-Id: 671 Delivered-To: ffmpegpatchwork@gmail.com Received: by 10.103.140.66 with SMTP id o63csp1148153vsd; Wed, 21 Sep 2016 13:43:01 -0700 (PDT) X-Received: by 10.28.66.6 with SMTP id p6mr4637218wma.59.1474490581847; Wed, 21 Sep 2016 13:43:01 -0700 (PDT) Return-Path: Received: from ffbox0-bg.mplayerhq.hu (ffbox0-bg.ffmpeg.org. [79.124.17.100]) by mx.google.com with ESMTP id 19si39884266wjz.245.2016.09.21.13.42.39; Wed, 21 Sep 2016 13:43:01 -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; 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 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 71D1F689CDE; Wed, 21 Sep 2016 23:42:10 +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 9A6EB689CC7 for ; Wed, 21 Sep 2016 23:42:01 +0300 (EEST) Received: by mail-pf0-f194.google.com with SMTP id 6so2808433pfl.2 for ; Wed, 21 Sep 2016 13:42:17 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20120113; h=from:to:cc:subject:date:message-id:in-reply-to:references; bh=c1/6HsxLo5dCPXRF4pQpzyAF0AecCeR5WOYj01YRJLQ=; b=LtaUDWYaeLEEC2eLxyeXRX6JZVwTkVUwd0virnR2TXmr0StOG+vg27y8ynnyI9jHJ3 jbTwtWlczcrmbFKakXKAXp10m5H4WSN6Jh1rsOyvLt/gtMCtFJfKY/QaorTe9Bd1XJfH 53GlcgHWTD5ijoF5TuXDs1TZQ16WG/aFw/9psk3ib5Ooc9Jy/27NSLj8sUw9lAxpXoiP gfVZgILG/dsn/d1tBjQk0VlViBOKeGiU5RFQ0Jy+rCq+33HdBzknkAZl8WZnZwr3ztxI aJE9ozENTUR8wewJ/fFGQbol6wJ72XVrWaFp53oToTIzRSWVY9FaEQ1T1vbc9IacfTxO rubg== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20130820; h=x-gm-message-state:from:to:cc:subject:date:message-id:in-reply-to :references; bh=c1/6HsxLo5dCPXRF4pQpzyAF0AecCeR5WOYj01YRJLQ=; b=ljI0+P7ihEa6f4z7LvFctNH7wyK8k/NMSkR27Gd/UrXGf0e/oMVJah9XGyhURbsFdo SnnNF5CuSESUM6gmMUSpEX0GNytR4e6QAW/IQMkBsiFdv/9BRL6U4UoVh7NF2Y+eA5wq J6FvcFuXojl57HuDZauIbkWvS8uHg9gpyt3YDm1Eh4fTA/ikVAWyS7p2jAmX6fp+B8VK 309h5gxlTkc+MFDKvlFAdgcSp1Tawdp1i0JeKBMSl7f2F5dpB78JBIqGvQkLTV7rT/H+ s5vRyBXPdNpTeNcH1P7an/hwSz3qE2MWaRcxkf6+1XeY2yE5QGm4q7pPcFqrD0kaGPqP 1iVg== X-Gm-Message-State: AE9vXwMiLpWXLCPPYwyHFBu6SIF7XPE3c78J/N6q+tazPsI+jzkxaT2pup3afi4TrvvKgA== X-Received: by 10.98.57.2 with SMTP id g2mr54455260pfa.15.1474490535638; Wed, 21 Sep 2016 13:42:15 -0700 (PDT) Received: from localhost.localdomain (S0106ac228b6e4f8e.vc.shawcable.net. [24.86.216.51]) by smtp.gmail.com with ESMTPSA id y1sm17746623pfd.90.2016.09.21.13.42.14 (version=TLS1 cipher=AES128-SHA bits=128/128); Wed, 21 Sep 2016 13:42:15 -0700 (PDT) From: Mark Reid To: ffmpeg-devel@ffmpeg.org Date: Wed, 21 Sep 2016 13:42:08 -0700 Message-Id: <20160921204209.8196-4-mindmark@gmail.com> X-Mailer: git-send-email 2.9.2 In-Reply-To: <20160921204209.8196-1-mindmark@gmail.com> References: <20160921204209.8196-1-mindmark@gmail.com> Subject: [FFmpeg-devel] [PATCH 3/4] libavformat/mxfdec: add metadata streams for external referenced sourclips 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/mxfdec.c | 47 ++++++++++++++++++++++++++++++++++++++++++++--- 1 file changed, 44 insertions(+), 3 deletions(-) diff --git a/libavformat/mxfdec.c b/libavformat/mxfdec.c index a22b2d6..ef53eb6 100644 --- a/libavformat/mxfdec.c +++ b/libavformat/mxfdec.c @@ -102,6 +102,7 @@ typedef struct MXFCryptoContext { typedef struct MXFStructuralComponent { UID uid; enum MXFMetadataSetType type; + UID source_package_ul; UID source_package_uid; UID data_definition_ul; int64_t duration; @@ -769,7 +770,7 @@ static int mxf_read_source_clip(void *arg, AVIOContext *pb, int tag, int size, U break; case 0x1101: /* UMID, only get last 16 bytes */ - avio_skip(pb, 16); + avio_read(pb, source_clip->source_package_ul, 16); avio_read(pb, source_clip->source_package_uid, 16); break; case 0x1102: @@ -1835,6 +1836,43 @@ static int mxf_parse_physical_source_package(MXFContext *mxf, MXFTrack *source_t return 0; } +static int mxf_add_metadata_stream(MXFContext *mxf, MXFTrack *track) +{ + MXFStructuralComponent *component = NULL; + const MXFCodecUL *codec_ul = NULL; + MXFPackage tmp_package; + AVStream *st; + + for (int j = 0; j < track->sequence->structural_components_count; j++) { + component = mxf_resolve_sourceclip(mxf, &track->sequence->structural_components_refs[j]); + if (!component) + continue; + break; + } + if (!component) + return 0; + + st = avformat_new_stream(mxf->fc, NULL); + if (!st) { + av_log(mxf->fc, AV_LOG_ERROR, "could not allocate metadata stream\n"); + return AVERROR(ENOMEM); + } + + st->codecpar->codec_type = AVMEDIA_TYPE_DATA; + st->codecpar->codec_id = AV_CODEC_ID_NONE; + st->id = track->track_id; + + memcpy(&tmp_package.package_ul, component->source_package_ul, 16); + memcpy(&tmp_package.package_uid, component->source_package_uid, 16); + mxf_add_umid_metadata(&st->metadata, "file_package_umid", &tmp_package); + if (track->name && track->name[0]) + av_dict_set(&st->metadata, "track_name", track->name, 0); + + codec_ul = mxf_get_codec_ul(ff_mxf_data_definition_uls, &track->sequence->data_definition_ul); + av_dict_set(&st->metadata, "data_type", av_get_media_type_string(codec_ul->id), 0); + return 0; +} + static int mxf_parse_structural_metadata(MXFContext *mxf) { MXFPackage *material_package = NULL; @@ -1936,8 +1974,11 @@ static int mxf_parse_structural_metadata(MXFContext *mxf) if(source_track && component) break; } - if (!source_track || !component || !source_package) + if (!source_track || !component || !source_package) { + if((ret = mxf_add_metadata_stream(mxf, material_track))) + goto fail_and_free; continue; + } if (!(source_track->sequence = mxf_resolve_strong_ref(mxf, &source_track->sequence_ref, Sequence))) { av_log(mxf->fc, AV_LOG_ERROR, "could not resolve source track sequence strong ref\n"); @@ -1958,7 +1999,7 @@ static int mxf_parse_structural_metadata(MXFContext *mxf) ret = AVERROR(ENOMEM); goto fail_and_free; } - st->id = source_track->track_id; + st->id = material_track->track_id; st->priv_data = source_track; source_package->descriptor = mxf_resolve_strong_ref(mxf, &source_package->descriptor_ref, AnyType);