From patchwork Wed Sep 21 20:42:06 2016 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Mark Reid X-Patchwork-Id: 672 Delivered-To: ffmpegpatchwork@gmail.com Received: by 10.103.140.66 with SMTP id o63csp1154728vsd; Wed, 21 Sep 2016 13:54:52 -0700 (PDT) X-Received: by 10.28.175.147 with SMTP id y141mr4817888wme.9.1474491292497; Wed, 21 Sep 2016 13:54:52 -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 190si32471270wmi.145.2016.09.21.13.54.51; Wed, 21 Sep 2016 13:54:52 -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 1D64A689CCA; Wed, 21 Sep 2016 23:54:34 +0300 (EEST) X-Original-To: ffmpeg-devel@ffmpeg.org Delivered-To: ffmpeg-devel@ffmpeg.org Received: from mail-pa0-f68.google.com (mail-pa0-f68.google.com [209.85.220.68]) by ffbox0-bg.mplayerhq.hu (Postfix) with ESMTPS id 62112689B2D for ; Wed, 21 Sep 2016 23:54:27 +0300 (EEST) Received: by mail-pa0-f68.google.com with SMTP id hi10so2714392pac.2 for ; Wed, 21 Sep 2016 13:54:43 -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=DyIFj4lRYw3Z7kfCQHBfu6MJCUPbCzbIM6PPjKiqM+A=; b=ysEK9jtwdmo3mEX2NJRJ+WyECmPClNKa/bRkMeYElTujqN1fyXhjw3DSpeBj9BpeNU rrkqdqkMXCO0RQ+ELzIL+s9j5wuLqRotQ5AVTTeTW3jx72h0qK3uNUQHmbr0HWh99zKf 1VHoBlu+vKt+klt1lF3+uP1tYm3JLyRzlfokRL9znLnxMmDAq8oqL3MWCpDQfubhaVyb 2T2PKgrCXjbsNQkHcgjarWeOaYPsyT0gBW+F7IpfW2OpFYPpPVSC/Albe2e1QacMlNju 4m8qChl/weAme6WDNpgLi+/zuDmkxtJ1z4qbjkZJfKYbeSkalcoNWFtuX7xrKpAyc3qc 1clw== 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=DyIFj4lRYw3Z7kfCQHBfu6MJCUPbCzbIM6PPjKiqM+A=; b=mY5h2QqJnzuulrv/M0cTzBpJa1b1YLp6mcd93G5cdUQXDF15pSL9Mw6jhWRccoWJFY au6LxbxKHYRawNqCNV4GLP1JO4Srd65gfuXQIajstVBJe4X+f1R9s3Igm+ow4OlTId7s uYUyhX74aItAtIBAQEO/QgB5THfAj63SxEKjChSQztXtnQhscPGv3B2C0FI4aHmJTMWg UOPgXD9pxqJFNv1k36mAF57xx5GT7MgtTVCWXEJ9kok6iC3yp7srZU0/vKpWDDQvAc2w s9Und2af+f3N+/PN14+GKvp82oQ0np/B0BWEnsgBAqSHO9A846XtFOcRXMYcteyOJLHl nO9Q== X-Gm-Message-State: AE9vXwPYG000oN6GuXKdNqZxAiS8u1fXFi6QjckT0SYEF0fIeLNJjNiWtr4pDm7+eWhr7A== X-Received: by 10.66.132.100 with SMTP id ot4mr17174002pab.84.1474490533731; Wed, 21 Sep 2016 13:42:13 -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.12 (version=TLS1 cipher=AES128-SHA bits=128/128); Wed, 21 Sep 2016 13:42:13 -0700 (PDT) From: Mark Reid To: ffmpeg-devel@ffmpeg.org Date: Wed, 21 Sep 2016 13:42:06 -0700 Message-Id: <20160921204209.8196-2-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 1/4] libavformat/mxfdec: export track name metadata 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 | 79 +++++++++++++++++++++++++++++----------------------- 1 file changed, 44 insertions(+), 35 deletions(-) diff --git a/libavformat/mxfdec.c b/libavformat/mxfdec.c index 1939761..23591b2 100644 --- a/libavformat/mxfdec.c +++ b/libavformat/mxfdec.c @@ -155,6 +155,7 @@ typedef struct { MXFSequence *sequence; /* mandatory, and only one */ UID sequence_ref; int track_id; + char *name; uint8_t track_number[4]; AVRational edit_rate; int intra_only; @@ -326,6 +327,9 @@ static void mxf_free_metadataset(MXFMetadataSet **ctx, int freectx) av_freep(&((MXFTaggedValue *)*ctx)->name); av_freep(&((MXFTaggedValue *)*ctx)->value); break; + case Track: + av_freep(&((MXFTrack *)*ctx)->name); + break; case IndexTableSegment: seg = (MXFIndexTableSegment *)*ctx; av_freep(&seg->temporal_offset_entries); @@ -705,6 +709,41 @@ static int mxf_read_strong_ref_array(AVIOContext *pb, UID **refs, int *count) return 0; } +static inline int mxf_read_utf16_string(AVIOContext *pb, int size, char** str, int be) +{ + int ret; + size_t buf_size; + + if (size < 0) + return AVERROR(EINVAL); + + buf_size = size + size / 2 + 1; + *str = av_malloc(buf_size); + if (!*str) + return AVERROR(ENOMEM); + + if (be) + ret = avio_get_str16be(pb, size, *str, buf_size); + else + ret = avio_get_str16le(pb, size, *str, buf_size); + + if (ret < 0) { + av_freep(str); + return ret; + } + + return ret; +} + +#define READ_STR16(type, big_endian) \ +static int mxf_read_utf16 ## type ##_string(AVIOContext *pb, int size, char** str) \ +{ \ +return mxf_read_utf16_string(pb, size, str, big_endian); \ +} +READ_STR16(be, 1) +READ_STR16(le, 0) +#undef READ_STR16 + static int mxf_read_content_storage(void *arg, AVIOContext *pb, int tag, int size, UID uid, int64_t klv_offset) { MXFContext *mxf = arg; @@ -778,6 +817,9 @@ static int mxf_read_track(void *arg, AVIOContext *pb, int tag, int size, UID uid case 0x4804: avio_read(pb, track->track_number, 4); break; + case 0x4802: + mxf_read_utf16be_string(pb, size, &track->name); + break; case 0x4b01: track->edit_rate.num = avio_rb32(pb); track->edit_rate.den = avio_rb32(pb); @@ -823,41 +865,6 @@ static int mxf_read_essence_group(void *arg, AVIOContext *pb, int tag, int size, return 0; } -static inline int mxf_read_utf16_string(AVIOContext *pb, int size, char** str, int be) -{ - int ret; - size_t buf_size; - - if (size < 0) - return AVERROR(EINVAL); - - buf_size = size + size / 2 + 1; - *str = av_malloc(buf_size); - if (!*str) - return AVERROR(ENOMEM); - - if (be) - ret = avio_get_str16be(pb, size, *str, buf_size); - else - ret = avio_get_str16le(pb, size, *str, buf_size); - - if (ret < 0) { - av_freep(str); - return ret; - } - - return ret; -} - -#define READ_STR16(type, big_endian) \ -static int mxf_read_utf16 ## type ##_string(AVIOContext *pb, int size, char** str) \ -{ \ -return mxf_read_utf16_string(pb, size, str, big_endian); \ -} -READ_STR16(be, 1) -READ_STR16(le, 0) -#undef READ_STR16 - static int mxf_read_package(void *arg, AVIOContext *pb, int tag, int size, UID uid, int64_t klv_offset) { MXFPackage *package = arg; @@ -2019,6 +2026,8 @@ static int mxf_parse_structural_metadata(MXFContext *mxf) mxf_add_umid_metadata(&st->metadata, "file_package_umid", source_package); if (source_package->name && source_package->name[0]) av_dict_set(&st->metadata, "file_package_name", source_package->name, 0); + if (material_track->name && material_track->name[0]) + av_dict_set(&st->metadata, "track_name", material_track->name, 0); mxf_parse_physical_source_package(mxf, source_track, st);