From patchwork Mon Feb 19 23:42:39 2024 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Marton Balint X-Patchwork-Id: 46380 Delivered-To: ffmpegpatchwork2@gmail.com Received: by 2002:a05:6a20:dda5:b0:19e:cdac:8cce with SMTP id kw37csp1552689pzb; Mon, 19 Feb 2024 15:42:56 -0800 (PST) X-Forwarded-Encrypted: i=2; AJvYcCV5F20KUL1vCk0nMWqfaNKGZ/K3GTLUFNiPYFPOex/0yE7rFmqxn7fz14pEQsN/Y2aRKm7FiHbHB+4vnZlgqxAzjfrzAZwnP+wKgg== X-Google-Smtp-Source: AGHT+IE0bqZjBpi3so8/c6tnJpyoMpZjK3GZyA1l109rfOj9Cq6Y9jagEDcEf7XH2b2TqjaBmWac X-Received: by 2002:a17:906:b17:b0:a3e:ed80:561e with SMTP id u23-20020a1709060b1700b00a3eed80561emr371831ejg.47.1708386176423; Mon, 19 Feb 2024 15:42:56 -0800 (PST) ARC-Seal: i=1; a=rsa-sha256; t=1708386176; cv=none; d=google.com; s=arc-20160816; b=GgukL8M+3TQBmhBmTdZOGXxbABWbtQ7IIJtaVEw3Ic9iIV53bMituUuh5YWxrnrKOo Ql5QsvzVYbeoQ8wgHIGrmNLlbP/lTvwDrnt25RBZDZXDj6BlSI2SInVh2jYy2JwtZ+R9 E6QQ1yhOwstwMbcnye4uqL7HXGYGfF3EABbh6G6QitJ8f03+tAcsgOwJ7myQo009zptK UT2UyteIt9jgjP6WEvPm1NufeXYRjYCjhBYUw949nFKA8mzlfghYVgYcuzmt8FI8nBOX WxzLW67rESq/jHa2Z/IJDwyANkyQF/f7R0T5QjiYm4u7+55MKmH76WK4LRiy5Uu4fia2 quPw== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=sender:errors-to:content-transfer-encoding:cc:reply-to :list-subscribe:list-help:list-post:list-archive:list-unsubscribe :list-id:precedence:subject:mime-version:message-id:date:to:from :delivered-to; bh=owzpeUv7zHYDuyB24eCIgrrUIjbtUJiPNI2ol7Qnezw=; fh=s+G8Ss4JbeMFkWPSp2LmIH/LXFyBlALRiww1j3FPjHY=; b=MQsH/3hVr6PqO10ylUYJtdel4R1EaFBdmhg3jRcht5zogqZk0ymGgMDulvMpcPLKbJ u35UevF7bqkYc2bP5TWB4kc95vh8zCQJ/K7FmmdS/CJRfCyGHnx0Igl9IInB19ijT7hz sTN091hMeyGroIiiJIPoUBXpb5jLaWKGBcSr5gN8LlCStyUWYUTyIEzWWm5cRgadDdxY BGWmmnSrHLqi1JbXf0win7g+osD2r65z4d6r+NjrF6PWnbK3WIds23WpkJ3H9VuCvzeL kfqm8XiKD8xK6riBiLTj2KPwgoiY7IPsdvXJYrsYk42+fkzCu1LP0tR+8cBa9h8MsRbP 9Csg==; dara=google.com ARC-Authentication-Results: i=1; mx.google.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 Return-Path: Received: from ffbox0-bg.mplayerhq.hu (ffbox0-bg.ffmpeg.org. [79.124.17.100]) by mx.google.com with ESMTP id hq16-20020a1709073f1000b00a3ec1a9686fsi873208ejc.9.2024.02.19.15.42.56; Mon, 19 Feb 2024 15:42:56 -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; 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 Received: from [127.0.1.1] (localhost [127.0.0.1]) by ffbox0-bg.mplayerhq.hu (Postfix) with ESMTP id 260FD68D43E; Tue, 20 Feb 2024 01:42:53 +0200 (EET) X-Original-To: ffmpeg-devel@ffmpeg.org Delivered-To: ffmpeg-devel@ffmpeg.org Received: from iq.passwd.hu (iq.passwd.hu [217.27.212.140]) by ffbox0-bg.mplayerhq.hu (Postfix) with ESMTP id 024D768D420 for ; Tue, 20 Feb 2024 01:42:46 +0200 (EET) Received: from localhost (localhost [127.0.0.1]) by iq.passwd.hu (Postfix) with ESMTP id BD7DEE9F5E; Tue, 20 Feb 2024 00:42:46 +0100 (CET) X-Virus-Scanned: amavisd-new at passwd.hu Received: from iq.passwd.hu ([127.0.0.1]) by localhost (iq.passwd.hu [127.0.0.1]) (amavisd-new, port 10024) with ESMTP id OARhBEnDPM8o; Tue, 20 Feb 2024 00:42:44 +0100 (CET) Received: from bluegene.passwd.hu (localhost [127.0.0.1]) by iq.passwd.hu (Postfix) with ESMTP id 5D5C2E98C3; Tue, 20 Feb 2024 00:42:44 +0100 (CET) From: Marton Balint To: ffmpeg-devel@ffmpeg.org Date: Tue, 20 Feb 2024 00:42:39 +0100 Message-Id: <20240219234240.21622-1-cus@passwd.hu> X-Mailer: git-send-email 2.35.3 MIME-Version: 1.0 Subject: [FFmpeg-devel] [PATCH 1/2] avformat/mxfdec: remove resolve_strong_ref usage with AnyType X-BeenThere: ffmpeg-devel@ffmpeg.org X-Mailman-Version: 2.1.29 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: Marton Balint Errors-To: ffmpeg-devel-bounces@ffmpeg.org Sender: "ffmpeg-devel" X-TUID: Je0vD8Tt7Pfp UUIDs do not have to be unique if their type sets them apart, so avoid using AnyType, since we are only interested in specific types. Signed-off-by: Marton Balint --- libavformat/mxf.h | 3 +-- libavformat/mxfdec.c | 54 ++++++++++++++++---------------------------- 2 files changed, 20 insertions(+), 37 deletions(-) diff --git a/libavformat/mxf.h b/libavformat/mxf.h index 7dd1681e60..e16843214c 100644 --- a/libavformat/mxf.h +++ b/libavformat/mxf.h @@ -30,8 +30,7 @@ typedef AVUUID UID; enum MXFMetadataSetType { - AnyType, - MaterialPackage, + MaterialPackage = 1, SourcePackage, SourceClip, TimecodeComponent, diff --git a/libavformat/mxfdec.c b/libavformat/mxfdec.c index 446bcf3276..b7b9207a5b 100644 --- a/libavformat/mxfdec.c +++ b/libavformat/mxfdec.c @@ -1582,7 +1582,7 @@ static void *mxf_resolve_strong_ref(MXFContext *mxf, UID *strong_ref, enum MXFMe return NULL; for (i = mxf->metadata_sets_count - 1; i >= 0; i--) { if (!memcmp(*strong_ref, mxf->metadata_sets[i]->uid, 16) && - (type == AnyType || mxf->metadata_sets[i]->type == type)) { + (mxf->metadata_sets[i]->type == type)) { return mxf->metadata_sets[i]; } } @@ -2221,22 +2221,17 @@ static int mxf_add_timecode_metadata(AVDictionary **pm, const char *key, AVTimec static MXFTimecodeComponent* mxf_resolve_timecode_component(MXFContext *mxf, UID *strong_ref) { - MXFStructuralComponent *component = NULL; - MXFPulldownComponent *pulldown = NULL; + MXFTimecodeComponent *timecode; + MXFPulldownComponent *pulldown; - component = mxf_resolve_strong_ref(mxf, strong_ref, AnyType); - if (!component) - return NULL; + timecode = mxf_resolve_strong_ref(mxf, strong_ref, TimecodeComponent); + if (timecode) + return timecode; - switch (component->meta.type) { - case TimecodeComponent: - return (MXFTimecodeComponent*)component; - case PulldownComponent: /* timcode component may be located on a pulldown component */ - pulldown = (MXFPulldownComponent*)component; + pulldown = mxf_resolve_strong_ref(mxf, strong_ref, PulldownComponent); + if (pulldown) return mxf_resolve_strong_ref(mxf, &pulldown->input_segment_ref, TimecodeComponent); - default: - break; - } + return NULL; } @@ -2280,14 +2275,20 @@ static MXFDescriptor* mxf_resolve_descriptor(MXFContext *mxf, UID *strong_ref, i return NULL; } -static MXFStructuralComponent* mxf_resolve_essence_group_choice(MXFContext *mxf, MXFEssenceGroup *essence_group) +static MXFStructuralComponent* mxf_resolve_sourceclip(MXFContext *mxf, UID *strong_ref) { MXFStructuralComponent *component = NULL; MXFPackage *package = NULL; MXFDescriptor *descriptor = NULL; + MXFEssenceGroup *essence_group; int i; - if (!essence_group || !essence_group->structural_components_count) + component = mxf_resolve_strong_ref(mxf, strong_ref, SourceClip); + if (component) + return component; + + essence_group = mxf_resolve_strong_ref(mxf, strong_ref, EssenceGroup); + if (!essence_group) return NULL; /* essence groups contains multiple representations of the same media, @@ -2304,24 +2305,7 @@ static MXFStructuralComponent* mxf_resolve_essence_group_choice(MXFContext *mxf, if (descriptor) return component; } - return NULL; -} - -static MXFStructuralComponent* mxf_resolve_sourceclip(MXFContext *mxf, UID *strong_ref) -{ - MXFStructuralComponent *component = NULL; - component = mxf_resolve_strong_ref(mxf, strong_ref, AnyType); - if (!component) - return NULL; - switch (component->meta.type) { - case SourceClip: - return component; - case EssenceGroup: - return mxf_resolve_essence_group_choice(mxf, (MXFEssenceGroup*) component); - default: - break; - } return NULL; } @@ -3243,7 +3227,7 @@ static const MXFMetadataReadTableEntry mxf_metadata_read_table[] = { { { 0x06,0x0e,0x2b,0x34,0x02,0x05,0x01,0x01,0x0d,0x01,0x02,0x01,0x01,0x04,0x04,0x00 }, mxf_read_partition_pack }, { { 0x06,0x0e,0x2b,0x34,0x02,0x53,0x01,0x01,0x0d,0x01,0x01,0x01,0x01,0x01,0x2f,0x00 }, mxf_read_preface_metadata }, { { 0x06,0x0e,0x2b,0x34,0x02,0x53,0x01,0x01,0x0d,0x01,0x01,0x01,0x01,0x01,0x30,0x00 }, mxf_read_identification_metadata }, - { { 0x06,0x0e,0x2b,0x34,0x02,0x53,0x01,0x01,0x0d,0x01,0x01,0x01,0x01,0x01,0x18,0x00 }, mxf_read_content_storage, 0, AnyType }, + { { 0x06,0x0e,0x2b,0x34,0x02,0x53,0x01,0x01,0x0d,0x01,0x01,0x01,0x01,0x01,0x18,0x00 }, mxf_read_content_storage }, { { 0x06,0x0e,0x2b,0x34,0x02,0x53,0x01,0x01,0x0d,0x01,0x01,0x01,0x01,0x01,0x37,0x00 }, mxf_read_package, sizeof(MXFPackage), SourcePackage }, { { 0x06,0x0e,0x2b,0x34,0x02,0x53,0x01,0x01,0x0d,0x01,0x01,0x01,0x01,0x01,0x36,0x00 }, mxf_read_package, sizeof(MXFPackage), MaterialPackage }, { { 0x06,0x0e,0x2b,0x34,0x02,0x53,0x01,0x01,0x0d,0x01,0x01,0x01,0x01,0x01,0x0f,0x00 }, mxf_read_sequence, sizeof(MXFSequence), Sequence }, @@ -3272,7 +3256,7 @@ static const MXFMetadataReadTableEntry mxf_metadata_read_table[] = { { { 0x06,0x0e,0x2b,0x34,0x02,0x53,0x01,0x01,0x0d,0x01,0x04,0x01,0x02,0x02,0x00,0x00 }, mxf_read_cryptographic_context, sizeof(MXFCryptoContext), CryptoContext }, { { 0x06,0x0e,0x2b,0x34,0x02,0x53,0x01,0x01,0x0d,0x01,0x02,0x01,0x01,0x10,0x01,0x00 }, mxf_read_index_table_segment, sizeof(MXFIndexTableSegment), IndexTableSegment }, { { 0x06,0x0e,0x2b,0x34,0x02,0x53,0x01,0x01,0x0d,0x01,0x01,0x01,0x01,0x01,0x23,0x00 }, mxf_read_essence_container_data, sizeof(MXFEssenceContainerData), EssenceContainerData }, - { { 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00 }, NULL, 0, AnyType }, + { { 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00 }, NULL }, }; static int mxf_metadataset_init(MXFMetadataSet *ctx, enum MXFMetadataSetType type, MXFPartition *partition) From patchwork Mon Feb 19 23:42:40 2024 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Marton Balint X-Patchwork-Id: 46381 Delivered-To: ffmpegpatchwork2@gmail.com Received: by 2002:a05:6a20:dda5:b0:19e:cdac:8cce with SMTP id kw37csp1552756pzb; Mon, 19 Feb 2024 15:43:05 -0800 (PST) X-Forwarded-Encrypted: i=2; AJvYcCVLTIAAhxwq9mA1XEMjCkSJvc1URQJLIUCuF9ySDPoEtRk9HRiiL7Ypj3X1kJVMq69moLm9GFZ7CReZvhXDoaRnS8OaSp93RSSDNQ== X-Google-Smtp-Source: AGHT+IFZ1Ods8mHKAviY8bmMf8GWl5NOmFzjZ4ArU6FtJ8xM9ZOh66OljTOrwtx2M5bZHJp4kI0p X-Received: by 2002:a17:906:4a10:b0:a3e:8bd8:b711 with SMTP id w16-20020a1709064a1000b00a3e8bd8b711mr3433692eju.37.1708386185493; Mon, 19 Feb 2024 15:43:05 -0800 (PST) ARC-Seal: i=1; a=rsa-sha256; t=1708386185; cv=none; d=google.com; s=arc-20160816; b=FT7zyI/kUAzsexIrIywy5ebXZ3faSYCynEGP589ufrubfSkZhrYkfAF+niq8V05s1v dSZPzhIV5P3Cde8M/4PNpUtQbG6FJQfnFtfmHvB6yiJOsjAvFzp083H3ajcH1tfoWCh6 4yai9eVJzRcK1ZLoBs3CGvoJjKnY0/oER05hc151oJC5nA6FmMOQPt/d3e10dwH3GVWp 4kvpxXV/a+FEx8miuALAYQC2qSFbH60KIIecKSd5KNpSMbgy2TAFMLzwk1wFi8zCYwEb 3NDQGZMXBjwzH+1gSdq2tAbaJnw5k9KXeRqMvWlVAtxJwEfJTSj3xQLr4UXhyldzEM+m hCUQ== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=sender:errors-to:content-transfer-encoding:cc:reply-to :list-subscribe:list-help:list-post:list-archive:list-unsubscribe :list-id:precedence:subject:mime-version:references:in-reply-to :message-id:date:to:from:delivered-to; bh=oBHrg2SdVcb066RBqIv0b350sWKK1bLKa5pBwCUg+ps=; fh=s+G8Ss4JbeMFkWPSp2LmIH/LXFyBlALRiww1j3FPjHY=; b=fOVwbD2QOO4Cymhy6CGhFsyBchaLXjzVmhWMatDy1nrfRVMXFNy8facWepa4+Ixfvt y5RTv3RP2huyx9sD7IznGajaSb6eWu3WISkVq4fNxXutIV5R+D5Ky+jvt8hRcRnpQP0q BLb9mwmeFhET/b56/nAhUDBADeFCfiJzQ/sQtiTS5sbrubVQtfBz9u7Z9AXcIHUgvB/c UK2DFJIyIhhS+bunuMR0wEsPz6131yDKzSnKngFKVE7VCQxyDAE3DcSyf8v4gYdLdy8w gfzRwyKxSg76fsn0J0kjh3Vkr4EyUBc5TNhj3E30u1aNOUbVhOm5Hp/i8Cg4G6+jqnPj IqKg==; dara=google.com ARC-Authentication-Results: i=1; mx.google.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 Return-Path: Received: from ffbox0-bg.mplayerhq.hu (ffbox0-bg.ffmpeg.org. [79.124.17.100]) by mx.google.com with ESMTP id n4-20020a1709061d0400b00a3d9a81a912si2950134ejh.272.2024.02.19.15.43.05; Mon, 19 Feb 2024 15:43:05 -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; 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 Received: from [127.0.1.1] (localhost [127.0.0.1]) by ffbox0-bg.mplayerhq.hu (Postfix) with ESMTP id 6E4F268D445; Tue, 20 Feb 2024 01:42:57 +0200 (EET) X-Original-To: ffmpeg-devel@ffmpeg.org Delivered-To: ffmpeg-devel@ffmpeg.org Received: from iq.passwd.hu (iq.passwd.hu [217.27.212.140]) by ffbox0-bg.mplayerhq.hu (Postfix) with ESMTP id 1C46E68D43B for ; Tue, 20 Feb 2024 01:42:51 +0200 (EET) Received: from localhost (localhost [127.0.0.1]) by iq.passwd.hu (Postfix) with ESMTP id E9EBCE9F8F; Tue, 20 Feb 2024 00:42:50 +0100 (CET) X-Virus-Scanned: amavisd-new at passwd.hu Received: from iq.passwd.hu ([127.0.0.1]) by localhost (iq.passwd.hu [127.0.0.1]) (amavisd-new, port 10024) with ESMTP id x6DxUXgFVLoh; Tue, 20 Feb 2024 00:42:48 +0100 (CET) Received: from bluegene.passwd.hu (localhost [127.0.0.1]) by iq.passwd.hu (Postfix) with ESMTP id 1AC0AE98C3; Tue, 20 Feb 2024 00:42:48 +0100 (CET) From: Marton Balint To: ffmpeg-devel@ffmpeg.org Date: Tue, 20 Feb 2024 00:42:40 +0100 Message-Id: <20240219234240.21622-2-cus@passwd.hu> X-Mailer: git-send-email 2.35.3 In-Reply-To: <20240219234240.21622-1-cus@passwd.hu> References: <20240219234240.21622-1-cus@passwd.hu> MIME-Version: 1.0 Subject: [FFmpeg-devel] [PATCH 2/2] avformat/mxfdec: track metadata sets by their type X-BeenThere: ffmpeg-devel@ffmpeg.org X-Mailman-Version: 2.1.29 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: Marton Balint Errors-To: ffmpeg-devel-bounces@ffmpeg.org Sender: "ffmpeg-devel" X-TUID: hXc97QRU85nN We typically are only interesed in a single type of metadata set, so it is better to keep them separated instead of always filtering for them. Also use av_dynarray_add for increasing their array. Signed-off-by: Marton Balint --- libavformat/mxf.h | 1 + libavformat/mxfdec.c | 128 ++++++++++++++++++++----------------------- 2 files changed, 60 insertions(+), 69 deletions(-) diff --git a/libavformat/mxf.h b/libavformat/mxf.h index e16843214c..673703f6bc 100644 --- a/libavformat/mxf.h +++ b/libavformat/mxf.h @@ -55,6 +55,7 @@ enum MXFMetadataSetType { GroupOfSoundfieldGroupsLabelSubDescriptor, FFV1SubDescriptor, JPEG2000SubDescriptor, + MetadataSetTypeNB }; enum MXFFrameLayout { diff --git a/libavformat/mxfdec.c b/libavformat/mxfdec.c index b7b9207a5b..49387881b7 100644 --- a/libavformat/mxfdec.c +++ b/libavformat/mxfdec.c @@ -116,9 +116,13 @@ typedef struct MXFPartition { typedef struct MXFMetadataSet { UID uid; uint64_t partition_score; - enum MXFMetadataSetType type; } MXFMetadataSet; +typedef struct MXFMetadataSetGroup { + MXFMetadataSet **metadata_sets; + int metadata_sets_count; +} MXFMetadataSetGroup; + typedef struct MXFCryptoContext { MXFMetadataSet meta; UID source_container_ul; @@ -302,8 +306,7 @@ typedef struct MXFContext { int packages_count; UID *essence_container_data_refs; int essence_container_data_count; - MXFMetadataSet **metadata_sets; - int metadata_sets_count; + MXFMetadataSetGroup metadata_set_groups[MetadataSetTypeNB]; AVFormatContext *fc; struct AVAES *aesc; uint8_t *local_tags; @@ -374,10 +377,10 @@ static const uint8_t mxf_mastering_display_uls[4][16] = { #define IS_KLV_KEY(x, y) (!memcmp(x, y, sizeof(y))) -static void mxf_free_metadataset(MXFMetadataSet **ctx, int freectx) +static void mxf_free_metadataset(MXFMetadataSet **ctx, enum MXFMetadataSetType type) { MXFIndexTableSegment *seg; - switch ((*ctx)->type) { + switch (type) { case Descriptor: case MultipleDescriptor: av_freep(&((MXFDescriptor *)*ctx)->extradata); @@ -422,9 +425,7 @@ static void mxf_free_metadataset(MXFMetadataSet **ctx, int freectx) default: break; } - if (freectx) { - av_freep(ctx); - } + av_freep(ctx); } static int64_t klv_decode_ber_length(AVIOContext *pb) @@ -915,34 +916,32 @@ static uint64_t partition_score(MXFPartition *p) return (score << 60) | ((uint64_t)p->pack_ofs >> 4); } -static int mxf_add_metadata_set(MXFContext *mxf, MXFMetadataSet **metadata_set) +static int mxf_add_metadata_set(MXFContext *mxf, MXFMetadataSet **metadata_set, enum MXFMetadataSetType type) { - MXFMetadataSet **tmp; - enum MXFMetadataSetType type = (*metadata_set)->type; + MXFMetadataSetGroup *mg = &mxf->metadata_set_groups[type]; + int ret; // Index Table is special because it might be added manually without // partition and we iterate thorugh all instances of them. Also some files // use the same Instance UID for different index tables... if (type != IndexTableSegment) { - for (int i = 0; i < mxf->metadata_sets_count; i++) { - if (!memcmp((*metadata_set)->uid, mxf->metadata_sets[i]->uid, 16) && type == mxf->metadata_sets[i]->type) { - uint64_t old_s = mxf->metadata_sets[i]->partition_score; + for (int i = 0; i < mg->metadata_sets_count; i++) { + if (!memcmp((*metadata_set)->uid, mg->metadata_sets[i]->uid, 16)) { + uint64_t old_s = mg->metadata_sets[i]->partition_score; uint64_t new_s = (*metadata_set)->partition_score; if (old_s > new_s) { - mxf_free_metadataset(metadata_set, 1); + mxf_free_metadataset(metadata_set, type); return 0; } } } } - tmp = av_realloc_array(mxf->metadata_sets, mxf->metadata_sets_count + 1, sizeof(*mxf->metadata_sets)); - if (!tmp) { - mxf_free_metadataset(metadata_set, 1); - return AVERROR(ENOMEM); + + ret = av_dynarray_add_nofree(&mg->metadata_sets, &mg->metadata_sets_count, *metadata_set); + if (ret < 0) { + mxf_free_metadataset(metadata_set, type); + return ret; } - mxf->metadata_sets = tmp; - mxf->metadata_sets[mxf->metadata_sets_count] = *metadata_set; - mxf->metadata_sets_count++; return 0; } @@ -1576,16 +1575,14 @@ static const MXFCodecUL *mxf_get_codec_ul(const MXFCodecUL *uls, UID *uid) static void *mxf_resolve_strong_ref(MXFContext *mxf, UID *strong_ref, enum MXFMetadataSetType type) { - int i; + MXFMetadataSetGroup *mg = &mxf->metadata_set_groups[type]; if (!strong_ref) return NULL; - for (i = mxf->metadata_sets_count - 1; i >= 0; i--) { - if (!memcmp(*strong_ref, mxf->metadata_sets[i]->uid, 16) && - (mxf->metadata_sets[i]->type == type)) { - return mxf->metadata_sets[i]; - } - } + for (int i = mg->metadata_sets_count - 1; i >= 0; i--) + if (!memcmp(*strong_ref, mg->metadata_sets[i]->uid, 16)) + return mg->metadata_sets[i]; + return NULL; } @@ -1742,12 +1739,10 @@ static int mxf_get_sorted_table_segments(MXFContext *mxf, int *nb_sorted_segment int i, j, nb_segments = 0; MXFIndexTableSegment **unsorted_segments; int last_body_sid = -1, last_index_sid = -1, last_index_start = -1; + MXFMetadataSetGroup *mg = &mxf->metadata_set_groups[IndexTableSegment]; /* count number of segments, allocate arrays and copy unsorted segments */ - for (i = 0; i < mxf->metadata_sets_count; i++) - if (mxf->metadata_sets[i]->type == IndexTableSegment) - nb_segments++; - + nb_segments = mg->metadata_sets_count; if (!nb_segments) return AVERROR_INVALIDDATA; @@ -1758,15 +1753,13 @@ static int mxf_get_sorted_table_segments(MXFContext *mxf, int *nb_sorted_segment return AVERROR(ENOMEM); } - for (i = nb_segments = 0; i < mxf->metadata_sets_count; i++) { - if (mxf->metadata_sets[i]->type == IndexTableSegment) { - MXFIndexTableSegment *s = (MXFIndexTableSegment*)mxf->metadata_sets[i]; - if (s->edit_unit_byte_count || s->nb_index_entries) - unsorted_segments[nb_segments++] = s; - else - av_log(mxf->fc, AV_LOG_WARNING, "IndexSID %i segment at %"PRId64" missing EditUnitByteCount and IndexEntryArray\n", - s->index_sid, s->index_start_position); - } + for (i = nb_segments = 0; i < mg->metadata_sets_count; i++) { + MXFIndexTableSegment *s = (MXFIndexTableSegment*)mg->metadata_sets[i]; + if (s->edit_unit_byte_count || s->nb_index_entries) + unsorted_segments[nb_segments++] = s; + else + av_log(mxf->fc, AV_LOG_WARNING, "IndexSID %i segment at %"PRId64" missing EditUnitByteCount and IndexEntryArray\n", + s->index_sid, s->index_start_position); } if (!nb_segments) { @@ -2484,9 +2477,10 @@ static int set_language(AVFormatContext *s, const char *rfc5646, AVDictionary ** static MXFMCASubDescriptor *find_mca_link_id(MXFContext *mxf, enum MXFMetadataSetType type, UID *mca_link_id) { - for (int k = 0; k < mxf->metadata_sets_count; k++) { - MXFMCASubDescriptor *group = (MXFMCASubDescriptor*)mxf->metadata_sets[k]; - if (group->meta.type == type && !memcmp(&group->mca_link_id, mca_link_id, 16)) + MXFMetadataSetGroup *mg = &mxf->metadata_set_groups[type]; + for (int k = 0; k < mg->metadata_sets_count; k++) { + MXFMCASubDescriptor *group = (MXFMCASubDescriptor*)mg->metadata_sets[k]; + if (!memcmp(&group->mca_link_id, mca_link_id, 16)) return group; } return NULL; @@ -2622,7 +2616,6 @@ static int mxf_parse_structural_metadata(MXFContext *mxf) MXFPackage *material_package = NULL; int i, j, k, ret; - av_log(mxf->fc, AV_LOG_TRACE, "metadata sets count %d\n", mxf->metadata_sets_count); /* TODO: handle multiple material packages (OP3x) */ for (i = 0; i < mxf->packages_count; i++) { material_package = mxf_resolve_strong_ref(mxf, &mxf->packages_refs[i], MaterialPackage); @@ -2807,13 +2800,11 @@ static int mxf_parse_structural_metadata(MXFContext *mxf) /* HACK: replacing the original key with mxf_encrypted_essence_container * is not allowed according to s429-6, try to find correct information anyway */ if (IS_KLV_KEY(essence_container_ul, mxf_encrypted_essence_container)) { + MXFMetadataSetGroup *mg = &mxf->metadata_set_groups[CryptoContext]; av_log(mxf->fc, AV_LOG_INFO, "broken encrypted mxf file\n"); - for (k = 0; k < mxf->metadata_sets_count; k++) { - MXFMetadataSet *metadata = mxf->metadata_sets[k]; - if (metadata->type == CryptoContext) { - essence_container_ul = &((MXFCryptoContext *)metadata)->source_container_ul; - break; - } + if (mg->metadata_sets_count) { + MXFMetadataSet *metadata = mg->metadata_sets[0]; + essence_container_ul = &((MXFCryptoContext *)metadata)->source_container_ul; } } @@ -3261,7 +3252,6 @@ static const MXFMetadataReadTableEntry mxf_metadata_read_table[] = { static int mxf_metadataset_init(MXFMetadataSet *ctx, enum MXFMetadataSetType type, MXFPartition *partition) { - ctx->type = type; ctx->partition_score = partition_score(partition); switch (type){ case MultipleDescriptor: @@ -3300,7 +3290,7 @@ static int mxf_read_local_tags(MXFContext *mxf, KLVPacket *klv, MXFMetadataReadF UID uid = {0}; if (next < 0 || next > INT64_MAX - size) { if (meta) { - mxf_free_metadataset(&meta, 1); + mxf_free_metadataset(&meta, type); } return next < 0 ? next : AVERROR_INVALIDDATA; } @@ -3326,7 +3316,7 @@ static int mxf_read_local_tags(MXFContext *mxf, KLVPacket *klv, MXFMetadataReadF avio_read(pb, meta->uid, 16); } else if ((ret = read_child(ctx, pb, tag, size, uid, -1)) < 0) { if (meta) { - mxf_free_metadataset(&meta, 1); + mxf_free_metadataset(&meta, type); } return ret; } @@ -3335,7 +3325,7 @@ static int mxf_read_local_tags(MXFContext *mxf, KLVPacket *klv, MXFMetadataReadF * it extending past the end of the KLV though (zzuf5.mxf). */ if (avio_tell(pb) > klv_end) { if (meta) { - mxf_free_metadataset(&meta, 1); + mxf_free_metadataset(&meta, type); } av_log(mxf->fc, AV_LOG_ERROR, @@ -3345,7 +3335,7 @@ static int mxf_read_local_tags(MXFContext *mxf, KLVPacket *klv, MXFMetadataReadF } else if (avio_tell(pb) <= next) /* only seek forward, else this can loop for a long time */ avio_seek(pb, next, SEEK_SET); } - return meta ? mxf_add_metadata_set(mxf, &meta) : 0; + return meta ? mxf_add_metadata_set(mxf, &meta, type) : 0; } /** @@ -3601,17 +3591,16 @@ static int mxf_handle_missing_index_segment(MXFContext *mxf, AVStream *st) int essence_partition_count = 0; int edit_unit_byte_count = 0; int i, ret; + MXFMetadataSetGroup *mg = &mxf->metadata_set_groups[IndexTableSegment]; if (!track || track->wrapping != ClipWrapped) return 0; /* check if track already has an IndexTableSegment */ - for (i = 0; i < mxf->metadata_sets_count; i++) { - if (mxf->metadata_sets[i]->type == IndexTableSegment) { - MXFIndexTableSegment *s = (MXFIndexTableSegment*)mxf->metadata_sets[i]; - if (s->body_sid == track->body_sid) - return 0; - } + for (i = 0; i < mg->metadata_sets_count; i++) { + MXFIndexTableSegment *s = (MXFIndexTableSegment*)mg->metadata_sets[i]; + if (s->body_sid == track->body_sid) + return 0; } /* find the essence partition */ @@ -3643,7 +3632,7 @@ static int mxf_handle_missing_index_segment(MXFContext *mxf, AVStream *st) if (!(segment = av_mallocz(sizeof(*segment)))) return AVERROR(ENOMEM); - if ((ret = mxf_add_metadata_set(mxf, (MXFMetadataSet**)&segment))) + if ((ret = mxf_add_metadata_set(mxf, (MXFMetadataSet**)&segment, IndexTableSegment))) return ret; /* Make sure we have nonzero unique index_sid, body_sid will be ok, because @@ -3651,7 +3640,6 @@ static int mxf_handle_missing_index_segment(MXFContext *mxf, AVStream *st) if (!track->index_sid) track->index_sid = track->body_sid; - segment->meta.type = IndexTableSegment; /* stream will be treated as small EditUnitByteCount */ segment->edit_unit_byte_count = edit_unit_byte_count; segment->index_start_position = 0; @@ -4120,12 +4108,14 @@ static int mxf_read_close(AVFormatContext *s) for (i = 0; i < s->nb_streams; i++) s->streams[i]->priv_data = NULL; - for (i = 0; i < mxf->metadata_sets_count; i++) { - mxf_free_metadataset(mxf->metadata_sets + i, 1); + for (int type = 0; type < FF_ARRAY_ELEMS(mxf->metadata_set_groups); type++) { + MXFMetadataSetGroup *mg = &mxf->metadata_set_groups[type]; + for (i = 0; i < mg->metadata_sets_count; i++) + mxf_free_metadataset(mg->metadata_sets + i, type); + mg->metadata_sets_count = 0; + av_freep(&mg->metadata_sets); } - mxf->metadata_sets_count = 0; av_freep(&mxf->partitions); - av_freep(&mxf->metadata_sets); av_freep(&mxf->aesc); av_freep(&mxf->local_tags);