1cabdff1aSopenharmony_ci/* 2cabdff1aSopenharmony_ci * This file is part of FFmpeg. 3cabdff1aSopenharmony_ci * 4cabdff1aSopenharmony_ci * FFmpeg is free software; you can redistribute it and/or 5cabdff1aSopenharmony_ci * modify it under the terms of the GNU Lesser General Public 6cabdff1aSopenharmony_ci * License as published by the Free Software Foundation; either 7cabdff1aSopenharmony_ci * version 2.1 of the License, or (at your option) any later version. 8cabdff1aSopenharmony_ci * 9cabdff1aSopenharmony_ci * FFmpeg is distributed in the hope that it will be useful, 10cabdff1aSopenharmony_ci * but WITHOUT ANY WARRANTY; without even the implied warranty of 11cabdff1aSopenharmony_ci * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU 12cabdff1aSopenharmony_ci * Lesser General Public License for more details. 13cabdff1aSopenharmony_ci * 14cabdff1aSopenharmony_ci * You should have received a copy of the GNU Lesser General Public 15cabdff1aSopenharmony_ci * License along with FFmpeg; if not, write to the Free Software 16cabdff1aSopenharmony_ci * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA 17cabdff1aSopenharmony_ci */ 18cabdff1aSopenharmony_ci 19cabdff1aSopenharmony_ci/* 20cabdff1aSopenharmony_ci * 21cabdff1aSopenharmony_ci * Copyright (c) Sandflow Consulting LLC 22cabdff1aSopenharmony_ci * 23cabdff1aSopenharmony_ci * Redistribution and use in source and binary forms, with or without 24cabdff1aSopenharmony_ci * modification, are permitted provided that the following conditions are met: 25cabdff1aSopenharmony_ci * 26cabdff1aSopenharmony_ci * * Redistributions of source code must retain the above copyright notice, this 27cabdff1aSopenharmony_ci * list of conditions and the following disclaimer. 28cabdff1aSopenharmony_ci * * Redistributions in binary form must reproduce the above copyright notice, 29cabdff1aSopenharmony_ci * this list of conditions and the following disclaimer in the documentation 30cabdff1aSopenharmony_ci * and/or other materials provided with the distribution. 31cabdff1aSopenharmony_ci * 32cabdff1aSopenharmony_ci * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" 33cabdff1aSopenharmony_ci * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE 34cabdff1aSopenharmony_ci * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE 35cabdff1aSopenharmony_ci * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE 36cabdff1aSopenharmony_ci * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR 37cabdff1aSopenharmony_ci * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF 38cabdff1aSopenharmony_ci * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS 39cabdff1aSopenharmony_ci * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN 40cabdff1aSopenharmony_ci * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) 41cabdff1aSopenharmony_ci * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE 42cabdff1aSopenharmony_ci * POSSIBILITY OF SUCH DAMAGE. 43cabdff1aSopenharmony_ci */ 44cabdff1aSopenharmony_ci 45cabdff1aSopenharmony_ci/** 46cabdff1aSopenharmony_ci * Tests for IMF CPL and ASSETMAP processing 47cabdff1aSopenharmony_ci * 48cabdff1aSopenharmony_ci * @author Valentin Noel 49cabdff1aSopenharmony_ci * @author Pierre-Anthony Lemieux 50cabdff1aSopenharmony_ci * @file 51cabdff1aSopenharmony_ci * @ingroup lavu_imf 52cabdff1aSopenharmony_ci */ 53cabdff1aSopenharmony_ci 54cabdff1aSopenharmony_ci#include "libavformat/imf_cpl.c" 55cabdff1aSopenharmony_ci#include "libavformat/imfdec.c" 56cabdff1aSopenharmony_ci#include "libavformat/mxf.h" 57cabdff1aSopenharmony_ci 58cabdff1aSopenharmony_ci#include <stdio.h> 59cabdff1aSopenharmony_ci 60cabdff1aSopenharmony_ciconst char *cpl_doc = 61cabdff1aSopenharmony_ci "<CompositionPlaylist xmlns=\"http://www.smpte-ra.org/schemas/2067-3/2016\"" 62cabdff1aSopenharmony_ci " xmlns:cc=\"http://www.smpte-ra.org/schemas/2067-2/2016\"" 63cabdff1aSopenharmony_ci " xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\">" 64cabdff1aSopenharmony_ci "<Id>urn:uuid:8713c020-2489-45f5-a9f7-87be539e20b5</Id>" 65cabdff1aSopenharmony_ci "<IssueDate>2021-07-13T17:06:22Z</IssueDate>" 66cabdff1aSopenharmony_ci "<Creator language=\"en\">FFMPEG</Creator>" 67cabdff1aSopenharmony_ci "<ContentTitle>FFMPEG sample content</ContentTitle>" 68cabdff1aSopenharmony_ci "<EssenceDescriptorList>" 69cabdff1aSopenharmony_ci " <EssenceDescriptor>" 70cabdff1aSopenharmony_ci " <Id>urn:uuid:8e097bb0-cff7-4969-a692-bad47bfb528f</Id>" 71cabdff1aSopenharmony_ci " </EssenceDescriptor>" 72cabdff1aSopenharmony_ci "</EssenceDescriptorList>" 73cabdff1aSopenharmony_ci "<EditRate>24000 1001</EditRate>" 74cabdff1aSopenharmony_ci "<SegmentList>" 75cabdff1aSopenharmony_ci "<Segment>" 76cabdff1aSopenharmony_ci "<Id>urn:uuid:81fed4e5-9722-400a-b9d1-7f2bd21df4b6</Id>" 77cabdff1aSopenharmony_ci "<SequenceList>" 78cabdff1aSopenharmony_ci "<MarkerSequence>" 79cabdff1aSopenharmony_ci "<Id>urn:uuid:16327185-9205-47ef-a17b-ee28df251db7</Id>" 80cabdff1aSopenharmony_ci "<TrackId>urn:uuid:461f5424-8f6e-48a9-a385-5eda46fda381</TrackId>" 81cabdff1aSopenharmony_ci "<ResourceList>" 82cabdff1aSopenharmony_ci "<Resource xsi:type=\"MarkerResourceType\">" 83cabdff1aSopenharmony_ci "<Id>urn:uuid:ea3d0f23-55d6-4e03-86ec-cfe0666f0e6a</Id>" 84cabdff1aSopenharmony_ci "<IntrinsicDuration>24</IntrinsicDuration>" 85cabdff1aSopenharmony_ci "<Marker>" 86cabdff1aSopenharmony_ci "<Label>LFOA</Label>" 87cabdff1aSopenharmony_ci "<Offset>5</Offset>" 88cabdff1aSopenharmony_ci "</Marker>" 89cabdff1aSopenharmony_ci "</Resource>" 90cabdff1aSopenharmony_ci "</ResourceList>" 91cabdff1aSopenharmony_ci "</MarkerSequence>" 92cabdff1aSopenharmony_ci "<cc:MainImageSequence>" 93cabdff1aSopenharmony_ci "<Id>urn:uuid:6ae100b0-92d1-41be-9321-85e0933dfc42</Id>" 94cabdff1aSopenharmony_ci "<TrackId>urn:uuid:e8ef9653-565c-479c-8039-82d4547973c5</TrackId>" 95cabdff1aSopenharmony_ci "<ResourceList>" 96cabdff1aSopenharmony_ci "<Resource xsi:type=\"TrackFileResourceType\">" 97cabdff1aSopenharmony_ci "<Id>urn:uuid:7d418acb-07a3-4e57-984c-b8ea2f7de4ec</Id>" 98cabdff1aSopenharmony_ci "<IntrinsicDuration>24</IntrinsicDuration>" 99cabdff1aSopenharmony_ci "<SourceEncoding>urn:uuid:f00e49a8-0dec-4e6c-95e7-078df988b751</SourceEncoding>" 100cabdff1aSopenharmony_ci "<TrackFileId>urn:uuid:6f768ca4-c89e-4dac-9056-a29425d40ba1</TrackFileId>" 101cabdff1aSopenharmony_ci "</Resource>" 102cabdff1aSopenharmony_ci "</ResourceList>" 103cabdff1aSopenharmony_ci "</cc:MainImageSequence>" 104cabdff1aSopenharmony_ci "<cc:MainAudioSequence>" 105cabdff1aSopenharmony_ci "<Id>urn:uuid:754dae53-c25f-4f3c-97e4-2bfe5463f83b</Id>" 106cabdff1aSopenharmony_ci "<TrackId>urn:uuid:68e3fae5-d94b-44d2-92a6-b94877fbcdb5</TrackId>" 107cabdff1aSopenharmony_ci "<ResourceList>" 108cabdff1aSopenharmony_ci "<Resource xsi:type=\"TrackFileResourceType\">" 109cabdff1aSopenharmony_ci "<Id>urn:uuid:61ce2a70-10a2-4521-850b-4218755ff3c9</Id>" 110cabdff1aSopenharmony_ci "<IntrinsicDuration>24</IntrinsicDuration>" 111cabdff1aSopenharmony_ci "<SourceEncoding>urn:uuid:f00e49a8-0dec-4e6c-95e7-078df988b751</SourceEncoding>" 112cabdff1aSopenharmony_ci "<TrackFileId>urn:uuid:381dadd2-061e-46cc-a63a-e3d58ce7f488</TrackFileId>" 113cabdff1aSopenharmony_ci "</Resource>" 114cabdff1aSopenharmony_ci "</ResourceList>" 115cabdff1aSopenharmony_ci "</cc:MainAudioSequence>" 116cabdff1aSopenharmony_ci "<cc:MainAudioSequence>" 117cabdff1aSopenharmony_ci "<Id>urn:uuid:d29b3884-6633-4dad-9c67-7154af342bc6</Id>" 118cabdff1aSopenharmony_ci "<TrackId>urn:uuid:6978c106-95bc-424b-a17c-628206a5892d</TrackId>" 119cabdff1aSopenharmony_ci "<ResourceList>" 120cabdff1aSopenharmony_ci "<Resource xsi:type=\"TrackFileResourceType\">" 121cabdff1aSopenharmony_ci "<Id>urn:uuid:001ea472-f5da-436c-86de-acaa68c1a7e4</Id>" 122cabdff1aSopenharmony_ci "<IntrinsicDuration>24</IntrinsicDuration>" 123cabdff1aSopenharmony_ci "<SourceEncoding>urn:uuid:f00e49a8-0dec-4e6c-95e7-078df988b751</SourceEncoding>" 124cabdff1aSopenharmony_ci "<TrackFileId>urn:uuid:381dadd2-061e-46cc-a63a-e3d58ce7f488</TrackFileId>" 125cabdff1aSopenharmony_ci "</Resource>" 126cabdff1aSopenharmony_ci "</ResourceList>" 127cabdff1aSopenharmony_ci "</cc:MainAudioSequence>" 128cabdff1aSopenharmony_ci "<cc:SubtitlesSequence>" 129cabdff1aSopenharmony_ci "<Id>urn:uuid:02af22bf-f776-488a-b001-eb6e16953119</Id>" 130cabdff1aSopenharmony_ci "<TrackId>urn:uuid:19ff6da1-be79-4235-8d04-42201ad06e65</TrackId>" 131cabdff1aSopenharmony_ci "<ResourceList>" 132cabdff1aSopenharmony_ci "<Resource xsi:type=\"TrackFileResourceType\">" 133cabdff1aSopenharmony_ci "<Id>urn:uuid:dfa84292-0609-4097-824c-8e2e15e2ce4d</Id>" 134cabdff1aSopenharmony_ci "<IntrinsicDuration>24</IntrinsicDuration>" 135cabdff1aSopenharmony_ci "<SourceEncoding>urn:uuid:f00e49a8-0dec-4e6c-95e7-078df988b751</SourceEncoding>" 136cabdff1aSopenharmony_ci "<TrackFileId>urn:uuid:bd6272b6-511e-47c1-93bc-d56ebd314a70</TrackFileId>" 137cabdff1aSopenharmony_ci "</Resource>" 138cabdff1aSopenharmony_ci "</ResourceList>" 139cabdff1aSopenharmony_ci "</cc:SubtitlesSequence>" 140cabdff1aSopenharmony_ci "</SequenceList>" 141cabdff1aSopenharmony_ci "</Segment>" 142cabdff1aSopenharmony_ci "<Segment>" 143cabdff1aSopenharmony_ci "<Id>urn:uuid:a94be493-cd55-4bf7-b496-ea87bfe38632</Id>" 144cabdff1aSopenharmony_ci "<SequenceList>" 145cabdff1aSopenharmony_ci "<MarkerSequence>" 146cabdff1aSopenharmony_ci "<Id>urn:uuid:20c6020b-1fc0-4080-bcf7-89f09f95bea8</Id>" 147cabdff1aSopenharmony_ci "<TrackId>urn:uuid:461f5424-8f6e-48a9-a385-5eda46fda381</TrackId>" 148cabdff1aSopenharmony_ci "<ResourceList>" 149cabdff1aSopenharmony_ci "<Resource xsi:type=\"MarkerResourceType\">" 150cabdff1aSopenharmony_ci "<Id>urn:uuid:d1f93845-d3e5-4c3b-aa67-8d96c45cfe9c</Id>" 151cabdff1aSopenharmony_ci "<IntrinsicDuration>36</IntrinsicDuration>" 152cabdff1aSopenharmony_ci "<Marker>" 153cabdff1aSopenharmony_ci "<Label>FFOA</Label>" 154cabdff1aSopenharmony_ci "<Offset>20</Offset>" 155cabdff1aSopenharmony_ci "</Marker>" 156cabdff1aSopenharmony_ci "<Marker>" 157cabdff1aSopenharmony_ci "<Label>LFOC</Label>" 158cabdff1aSopenharmony_ci "<Offset>24</Offset>" 159cabdff1aSopenharmony_ci "</Marker>" 160cabdff1aSopenharmony_ci "</Resource>" 161cabdff1aSopenharmony_ci "</ResourceList>" 162cabdff1aSopenharmony_ci "</MarkerSequence>" 163cabdff1aSopenharmony_ci "<cc:MainImageSequence>" 164cabdff1aSopenharmony_ci "<Id>urn:uuid:9b509f42-e4e8-4f78-8c2a-12ddd79ef3c5</Id>" 165cabdff1aSopenharmony_ci "<TrackId>urn:uuid:e8ef9653-565c-479c-8039-82d4547973c5</TrackId>" 166cabdff1aSopenharmony_ci "<ResourceList>" 167cabdff1aSopenharmony_ci "<Resource xsi:type=\"TrackFileResourceType\">" 168cabdff1aSopenharmony_ci "<Id>urn:uuid:a733d812-a3d7-45e9-ba50-13b856d5d35a</Id>" 169cabdff1aSopenharmony_ci "<IntrinsicDuration>36</IntrinsicDuration>" 170cabdff1aSopenharmony_ci "<SourceEncoding>urn:uuid:f00e49a8-0dec-4e6c-95e7-078df988b751</SourceEncoding>" 171cabdff1aSopenharmony_ci "<TrackFileId>urn:uuid:f3b263b3-096b-4360-a952-b1a9623cd0ca</TrackFileId>" 172cabdff1aSopenharmony_ci "</Resource>" 173cabdff1aSopenharmony_ci "</ResourceList>" 174cabdff1aSopenharmony_ci "</cc:MainImageSequence>" 175cabdff1aSopenharmony_ci "<cc:MainAudioSequence>" 176cabdff1aSopenharmony_ci "<Id>urn:uuid:19a282e6-beac-4d99-a008-afa61378eb6c</Id>" 177cabdff1aSopenharmony_ci "<TrackId>urn:uuid:68e3fae5-d94b-44d2-92a6-b94877fbcdb5</TrackId>" 178cabdff1aSopenharmony_ci "<ResourceList>" 179cabdff1aSopenharmony_ci "<Resource xsi:type=\"TrackFileResourceType\">" 180cabdff1aSopenharmony_ci "<Id>urn:uuid:53de5ff9-f5f7-47c5-a2d8-117c36cce517</Id>" 181cabdff1aSopenharmony_ci "<IntrinsicDuration>36</IntrinsicDuration>" 182cabdff1aSopenharmony_ci "<SourceEncoding>urn:uuid:f00e49a8-0dec-4e6c-95e7-078df988b751</SourceEncoding>" 183cabdff1aSopenharmony_ci "<TrackFileId>urn:uuid:2484d613-bb7d-4bcc-8b0f-2e65938f0535</TrackFileId>" 184cabdff1aSopenharmony_ci "</Resource>" 185cabdff1aSopenharmony_ci "</ResourceList>" 186cabdff1aSopenharmony_ci "</cc:MainAudioSequence>" 187cabdff1aSopenharmony_ci "<cc:MainAudioSequence>" 188cabdff1aSopenharmony_ci "<Id>urn:uuid:94b0ef77-0621-4086-95a2-85432fa97d40</Id>" 189cabdff1aSopenharmony_ci "<TrackId>urn:uuid:6978c106-95bc-424b-a17c-628206a5892d</TrackId>" 190cabdff1aSopenharmony_ci "<ResourceList>" 191cabdff1aSopenharmony_ci "<Resource xsi:type=\"TrackFileResourceType\">" 192cabdff1aSopenharmony_ci "<Id>urn:uuid:2ce499f2-59bc-4053-87bc-80f4b7e7b73e</Id>" 193cabdff1aSopenharmony_ci "<IntrinsicDuration>36</IntrinsicDuration>" 194cabdff1aSopenharmony_ci "<SourceEncoding>urn:uuid:f00e49a8-0dec-4e6c-95e7-078df988b751</SourceEncoding>" 195cabdff1aSopenharmony_ci "<TrackFileId>urn:uuid:2484d613-bb7d-4bcc-8b0f-2e65938f0535</TrackFileId>" 196cabdff1aSopenharmony_ci "</Resource>" 197cabdff1aSopenharmony_ci "</ResourceList>" 198cabdff1aSopenharmony_ci "</cc:MainAudioSequence>" 199cabdff1aSopenharmony_ci "<cc:SubtitlesSequence>" 200cabdff1aSopenharmony_ci "<Id>urn:uuid:9ac3b905-c599-4da8-8f0f-fc07e619899d</Id>" 201cabdff1aSopenharmony_ci "<TrackId>urn:uuid:19ff6da1-be79-4235-8d04-42201ad06e65</TrackId>" 202cabdff1aSopenharmony_ci "<ResourceList>" 203cabdff1aSopenharmony_ci "<Resource xsi:type=\"TrackFileResourceType\">" 204cabdff1aSopenharmony_ci "<Id>urn:uuid:0239017b-2ad9-4235-b46d-c4c1126e29fc</Id>" 205cabdff1aSopenharmony_ci "<IntrinsicDuration>36</IntrinsicDuration>" 206cabdff1aSopenharmony_ci "<SourceEncoding>urn:uuid:f00e49a8-0dec-4e6c-95e7-078df988b751</SourceEncoding>" 207cabdff1aSopenharmony_ci "<TrackFileId>urn:uuid:bd6272b6-511e-47c1-93bc-d56ebd314a70</TrackFileId>" 208cabdff1aSopenharmony_ci "</Resource>" 209cabdff1aSopenharmony_ci "</ResourceList>" 210cabdff1aSopenharmony_ci "</cc:SubtitlesSequence>" 211cabdff1aSopenharmony_ci "</SequenceList>" 212cabdff1aSopenharmony_ci "</Segment>" 213cabdff1aSopenharmony_ci "</SegmentList>" 214cabdff1aSopenharmony_ci "</CompositionPlaylist>"; 215cabdff1aSopenharmony_ci 216cabdff1aSopenharmony_ciconst char *cpl_bad_doc = "<Composition></Composition>"; 217cabdff1aSopenharmony_ci 218cabdff1aSopenharmony_ciconst char *asset_map_doc = 219cabdff1aSopenharmony_ci "<?xml version=\"1.0\" encoding=\"UTF-8\" ?>" 220cabdff1aSopenharmony_ci "<am:AssetMap xmlns:am=\"http://www.smpte-ra.org/schemas/429-9/2007/AM\">" 221cabdff1aSopenharmony_ci "<am:Id>urn:uuid:68d9f591-8191-46b5-38b4-affb87a14132</am:Id>" 222cabdff1aSopenharmony_ci "<am:AnnotationText>IMF_TEST_ASSET_MAP</am:AnnotationText>" 223cabdff1aSopenharmony_ci "<am:Creator>Some tool</am:Creator>" 224cabdff1aSopenharmony_ci "<am:VolumeCount>1</am:VolumeCount>" 225cabdff1aSopenharmony_ci "<am:IssueDate>2021-06-07T12:00:00+00:00</am:IssueDate>" 226cabdff1aSopenharmony_ci "<am:Issuer>FFmpeg</am:Issuer>" 227cabdff1aSopenharmony_ci "<am:AssetList>" 228cabdff1aSopenharmony_ci "<am:Asset>" 229cabdff1aSopenharmony_ci "<am:Id>urn:uuid:b5d674b8-c6ce-4bce-3bdf-be045dfdb2d0</am:Id>" 230cabdff1aSopenharmony_ci "<am:ChunkList>" 231cabdff1aSopenharmony_ci "<am:Chunk>" 232cabdff1aSopenharmony_ci "<am:Path>IMF_TEST_ASSET_MAP_video.mxf</am:Path>" 233cabdff1aSopenharmony_ci "<am:VolumeIndex>1</am:VolumeIndex>" 234cabdff1aSopenharmony_ci "<am:Offset>0</am:Offset>" 235cabdff1aSopenharmony_ci "<am:Length>1234567</am:Length>" 236cabdff1aSopenharmony_ci "</am:Chunk>" 237cabdff1aSopenharmony_ci "</am:ChunkList>" 238cabdff1aSopenharmony_ci "</am:Asset>" 239cabdff1aSopenharmony_ci "<am:Asset>" 240cabdff1aSopenharmony_ci "<am:Id>urn:uuid:ec3467ec-ab2a-4f49-c8cb-89caa3761f4a</am:Id>" 241cabdff1aSopenharmony_ci "<am:ChunkList>" 242cabdff1aSopenharmony_ci "<am:Chunk>" 243cabdff1aSopenharmony_ci "<am:Path>IMF_TEST_ASSET_MAP_video_1.mxf</am:Path>" 244cabdff1aSopenharmony_ci "<am:VolumeIndex>1</am:VolumeIndex>" 245cabdff1aSopenharmony_ci "<am:Offset>0</am:Offset>" 246cabdff1aSopenharmony_ci "<am:Length>234567</am:Length>" 247cabdff1aSopenharmony_ci "</am:Chunk>" 248cabdff1aSopenharmony_ci "</am:ChunkList>" 249cabdff1aSopenharmony_ci "</am:Asset>" 250cabdff1aSopenharmony_ci "<am:Asset>" 251cabdff1aSopenharmony_ci "<am:Id>urn:uuid:5cf5b5a7-8bb3-4f08-eaa6-3533d4b77fa6</am:Id>" 252cabdff1aSopenharmony_ci "<am:ChunkList>" 253cabdff1aSopenharmony_ci "<am:Chunk>" 254cabdff1aSopenharmony_ci "<am:Path>IMF_TEST_ASSET_MAP_audio.mxf</am:Path>" 255cabdff1aSopenharmony_ci "<am:VolumeIndex>1</am:VolumeIndex>" 256cabdff1aSopenharmony_ci "<am:Offset>0</am:Offset>" 257cabdff1aSopenharmony_ci "<am:Length>34567</am:Length>" 258cabdff1aSopenharmony_ci "</am:Chunk>" 259cabdff1aSopenharmony_ci "</am:ChunkList>" 260cabdff1aSopenharmony_ci "</am:Asset>" 261cabdff1aSopenharmony_ci "<am:Asset>" 262cabdff1aSopenharmony_ci "<am:Id>urn:uuid:559777d6-ec29-4375-f90d-300b0bf73686</am:Id>" 263cabdff1aSopenharmony_ci "<am:ChunkList>" 264cabdff1aSopenharmony_ci "<am:Chunk>" 265cabdff1aSopenharmony_ci "<am:Path>CPL_IMF_TEST_ASSET_MAP.xml</am:Path>" 266cabdff1aSopenharmony_ci "<am:VolumeIndex>1</am:VolumeIndex>" 267cabdff1aSopenharmony_ci "<am:Offset>0</am:Offset>" 268cabdff1aSopenharmony_ci "<am:Length>12345</am:Length>" 269cabdff1aSopenharmony_ci "</am:Chunk>" 270cabdff1aSopenharmony_ci "</am:ChunkList>" 271cabdff1aSopenharmony_ci "</am:Asset>" 272cabdff1aSopenharmony_ci "<am:Asset>" 273cabdff1aSopenharmony_ci "<am:Id>urn:uuid:dd04528d-9b80-452a-7a13-805b08278b3d</am:Id>" 274cabdff1aSopenharmony_ci "<am:PackingList>true</am:PackingList>" 275cabdff1aSopenharmony_ci "<am:ChunkList>" 276cabdff1aSopenharmony_ci "<am:Chunk>" 277cabdff1aSopenharmony_ci "<am:Path>PKL_IMF_TEST_ASSET_MAP.xml</am:Path>" 278cabdff1aSopenharmony_ci "<am:VolumeIndex>1</am:VolumeIndex>" 279cabdff1aSopenharmony_ci "<am:Offset>0</am:Offset>" 280cabdff1aSopenharmony_ci "<am:Length>2345</am:Length>" 281cabdff1aSopenharmony_ci "</am:Chunk>" 282cabdff1aSopenharmony_ci "</am:ChunkList>" 283cabdff1aSopenharmony_ci "</am:Asset>" 284cabdff1aSopenharmony_ci "</am:AssetList>" 285cabdff1aSopenharmony_ci "</am:AssetMap>"; 286cabdff1aSopenharmony_ci 287cabdff1aSopenharmony_cistatic int test_cpl_parsing(void) 288cabdff1aSopenharmony_ci{ 289cabdff1aSopenharmony_ci xmlDocPtr doc; 290cabdff1aSopenharmony_ci FFIMFCPL *cpl; 291cabdff1aSopenharmony_ci int ret; 292cabdff1aSopenharmony_ci 293cabdff1aSopenharmony_ci doc = xmlReadMemory(cpl_doc, strlen(cpl_doc), NULL, NULL, 0); 294cabdff1aSopenharmony_ci if (doc == NULL) { 295cabdff1aSopenharmony_ci printf("XML parsing failed.\n"); 296cabdff1aSopenharmony_ci return 1; 297cabdff1aSopenharmony_ci } 298cabdff1aSopenharmony_ci 299cabdff1aSopenharmony_ci ret = ff_imf_parse_cpl_from_xml_dom(doc, &cpl); 300cabdff1aSopenharmony_ci xmlFreeDoc(doc); 301cabdff1aSopenharmony_ci if (ret) { 302cabdff1aSopenharmony_ci printf("CPL parsing failed.\n"); 303cabdff1aSopenharmony_ci return 1; 304cabdff1aSopenharmony_ci } 305cabdff1aSopenharmony_ci 306cabdff1aSopenharmony_ci printf("%s\n", cpl->content_title_utf8); 307cabdff1aSopenharmony_ci printf(AV_PRI_URN_UUID "\n", AV_UUID_ARG(cpl->id_uuid)); 308cabdff1aSopenharmony_ci printf("%i %i\n", cpl->edit_rate.num, cpl->edit_rate.den); 309cabdff1aSopenharmony_ci 310cabdff1aSopenharmony_ci printf("Marker resource count: %" PRIu32 "\n", cpl->main_markers_track->resource_count); 311cabdff1aSopenharmony_ci for (uint32_t i = 0; i < cpl->main_markers_track->resource_count; i++) { 312cabdff1aSopenharmony_ci printf("Marker resource %" PRIu32 "\n", i); 313cabdff1aSopenharmony_ci for (uint32_t j = 0; j < cpl->main_markers_track->resources[i].marker_count; j++) { 314cabdff1aSopenharmony_ci printf(" Marker %" PRIu32 "\n", j); 315cabdff1aSopenharmony_ci printf(" Label %s\n", cpl->main_markers_track->resources[i].markers[j].label_utf8); 316cabdff1aSopenharmony_ci printf(" Offset %" PRIu32 "\n", cpl->main_markers_track->resources[i].markers[j].offset); 317cabdff1aSopenharmony_ci } 318cabdff1aSopenharmony_ci } 319cabdff1aSopenharmony_ci 320cabdff1aSopenharmony_ci printf("Main image resource count: %" PRIu32 "\n", cpl->main_image_2d_track->resource_count); 321cabdff1aSopenharmony_ci for (uint32_t i = 0; i < cpl->main_image_2d_track->resource_count; i++) { 322cabdff1aSopenharmony_ci printf("Track file resource %" PRIu32 "\n", i); 323cabdff1aSopenharmony_ci printf(" " AV_PRI_URN_UUID "\n", AV_UUID_ARG(cpl->main_image_2d_track->resources[i].track_file_uuid)); 324cabdff1aSopenharmony_ci } 325cabdff1aSopenharmony_ci 326cabdff1aSopenharmony_ci printf("Main audio track count: %" PRIu32 "\n", cpl->main_audio_track_count); 327cabdff1aSopenharmony_ci for (uint32_t i = 0; i < cpl->main_audio_track_count; i++) { 328cabdff1aSopenharmony_ci printf(" Main audio virtual track %" PRIu32 "\n", i); 329cabdff1aSopenharmony_ci printf(" Main audio resource count: %" PRIu32 "\n", cpl->main_audio_tracks[i].resource_count); 330cabdff1aSopenharmony_ci for (uint32_t j = 0; j < cpl->main_audio_tracks[i].resource_count; j++) { 331cabdff1aSopenharmony_ci printf(" Track file resource %" PRIu32 "\n", j); 332cabdff1aSopenharmony_ci printf(" " AV_PRI_URN_UUID "\n", AV_UUID_ARG(cpl->main_audio_tracks[i].resources[j].track_file_uuid)); 333cabdff1aSopenharmony_ci } 334cabdff1aSopenharmony_ci } 335cabdff1aSopenharmony_ci 336cabdff1aSopenharmony_ci ff_imf_cpl_free(cpl); 337cabdff1aSopenharmony_ci 338cabdff1aSopenharmony_ci return 0; 339cabdff1aSopenharmony_ci} 340cabdff1aSopenharmony_ci 341cabdff1aSopenharmony_cistatic int test_bad_cpl_parsing(void) 342cabdff1aSopenharmony_ci{ 343cabdff1aSopenharmony_ci xmlDocPtr doc; 344cabdff1aSopenharmony_ci FFIMFCPL *cpl; 345cabdff1aSopenharmony_ci int ret; 346cabdff1aSopenharmony_ci 347cabdff1aSopenharmony_ci doc = xmlReadMemory(cpl_bad_doc, strlen(cpl_bad_doc), NULL, NULL, 0); 348cabdff1aSopenharmony_ci if (doc == NULL) { 349cabdff1aSopenharmony_ci printf("XML parsing failed.\n"); 350cabdff1aSopenharmony_ci return 1; 351cabdff1aSopenharmony_ci } 352cabdff1aSopenharmony_ci 353cabdff1aSopenharmony_ci ret = ff_imf_parse_cpl_from_xml_dom(doc, &cpl); 354cabdff1aSopenharmony_ci xmlFreeDoc(doc); 355cabdff1aSopenharmony_ci if (ret) { 356cabdff1aSopenharmony_ci printf("CPL parsing failed.\n"); 357cabdff1aSopenharmony_ci return ret; 358cabdff1aSopenharmony_ci } 359cabdff1aSopenharmony_ci 360cabdff1aSopenharmony_ci return 0; 361cabdff1aSopenharmony_ci} 362cabdff1aSopenharmony_ci 363cabdff1aSopenharmony_cistatic int check_asset_locator_attributes(IMFAssetLocator *asset, IMFAssetLocator *expected_asset) 364cabdff1aSopenharmony_ci{ 365cabdff1aSopenharmony_ci 366cabdff1aSopenharmony_ci printf("\tCompare " AV_PRI_URN_UUID " to " AV_PRI_URN_UUID ".\n", 367cabdff1aSopenharmony_ci AV_UUID_ARG(asset->uuid), 368cabdff1aSopenharmony_ci AV_UUID_ARG(expected_asset->uuid)); 369cabdff1aSopenharmony_ci 370cabdff1aSopenharmony_ci for (uint32_t i = 0; i < 16; ++i) { 371cabdff1aSopenharmony_ci if (asset->uuid[i] != expected_asset->uuid[i]) { 372cabdff1aSopenharmony_ci printf("Invalid asset locator UUID: found " AV_PRI_URN_UUID " instead of " AV_PRI_URN_UUID " expected.\n", 373cabdff1aSopenharmony_ci AV_UUID_ARG(asset->uuid), 374cabdff1aSopenharmony_ci AV_UUID_ARG(expected_asset->uuid)); 375cabdff1aSopenharmony_ci return 1; 376cabdff1aSopenharmony_ci } 377cabdff1aSopenharmony_ci } 378cabdff1aSopenharmony_ci 379cabdff1aSopenharmony_ci printf("\tCompare %s to %s.\n", asset->absolute_uri, expected_asset->absolute_uri); 380cabdff1aSopenharmony_ci if (strcmp(asset->absolute_uri, expected_asset->absolute_uri) != 0) { 381cabdff1aSopenharmony_ci printf("Invalid asset locator URI: found %s instead of %s expected.\n", 382cabdff1aSopenharmony_ci asset->absolute_uri, 383cabdff1aSopenharmony_ci expected_asset->absolute_uri); 384cabdff1aSopenharmony_ci return 1; 385cabdff1aSopenharmony_ci } 386cabdff1aSopenharmony_ci 387cabdff1aSopenharmony_ci return 0; 388cabdff1aSopenharmony_ci} 389cabdff1aSopenharmony_ci 390cabdff1aSopenharmony_cistatic IMFAssetLocator ASSET_MAP_EXPECTED_LOCATORS[5] = { 391cabdff1aSopenharmony_ci {.uuid = {0xb5, 0xd6, 0x74, 0xb8, 0xc6, 0xce, 0x4b, 0xce, 0x3b, 0xdf, 0xbe, 0x04, 0x5d, 0xfd, 0xb2, 0xd0}, 392cabdff1aSopenharmony_ci .absolute_uri = (char *)"IMF_TEST_ASSET_MAP_video.mxf"}, 393cabdff1aSopenharmony_ci {.uuid = {0xec, 0x34, 0x67, 0xec, 0xab, 0x2a, 0x4f, 0x49, 0xc8, 0xcb, 0x89, 0xca, 0xa3, 0x76, 0x1f, 0x4a}, 394cabdff1aSopenharmony_ci .absolute_uri = (char *)"IMF_TEST_ASSET_MAP_video_1.mxf"}, 395cabdff1aSopenharmony_ci {.uuid = {0x5c, 0xf5, 0xb5, 0xa7, 0x8b, 0xb3, 0x4f, 0x08, 0xea, 0xa6, 0x35, 0x33, 0xd4, 0xb7, 0x7f, 0xa6}, 396cabdff1aSopenharmony_ci .absolute_uri = (char *)"IMF_TEST_ASSET_MAP_audio.mxf"}, 397cabdff1aSopenharmony_ci {.uuid = {0x55, 0x97, 0x77, 0xd6, 0xec, 0x29, 0x43, 0x75, 0xf9, 0x0d, 0x30, 0x0b, 0x0b, 0xf7, 0x36, 0x86}, 398cabdff1aSopenharmony_ci .absolute_uri = (char *)"CPL_IMF_TEST_ASSET_MAP.xml"}, 399cabdff1aSopenharmony_ci {.uuid = {0xdd, 0x04, 0x52, 0x8d, 0x9b, 0x80, 0x45, 0x2a, 0x7a, 0x13, 0x80, 0x5b, 0x08, 0x27, 0x8b, 0x3d}, 400cabdff1aSopenharmony_ci .absolute_uri = (char *)"PKL_IMF_TEST_ASSET_MAP.xml"}, 401cabdff1aSopenharmony_ci}; 402cabdff1aSopenharmony_ci 403cabdff1aSopenharmony_cistatic int test_asset_map_parsing(void) 404cabdff1aSopenharmony_ci{ 405cabdff1aSopenharmony_ci IMFAssetLocatorMap asset_locator_map; 406cabdff1aSopenharmony_ci xmlDoc *doc; 407cabdff1aSopenharmony_ci int ret; 408cabdff1aSopenharmony_ci 409cabdff1aSopenharmony_ci doc = xmlReadMemory(asset_map_doc, strlen(asset_map_doc), NULL, NULL, 0); 410cabdff1aSopenharmony_ci if (doc == NULL) { 411cabdff1aSopenharmony_ci printf("Asset map XML parsing failed.\n"); 412cabdff1aSopenharmony_ci return 1; 413cabdff1aSopenharmony_ci } 414cabdff1aSopenharmony_ci 415cabdff1aSopenharmony_ci printf("Allocate asset map\n"); 416cabdff1aSopenharmony_ci imf_asset_locator_map_init(&asset_locator_map); 417cabdff1aSopenharmony_ci 418cabdff1aSopenharmony_ci printf("Parse asset map XML document\n"); 419cabdff1aSopenharmony_ci ret = parse_imf_asset_map_from_xml_dom(NULL, doc, &asset_locator_map, doc->name); 420cabdff1aSopenharmony_ci if (ret) { 421cabdff1aSopenharmony_ci printf("Asset map parsing failed.\n"); 422cabdff1aSopenharmony_ci goto cleanup; 423cabdff1aSopenharmony_ci } 424cabdff1aSopenharmony_ci 425cabdff1aSopenharmony_ci printf("Compare assets count: %d to 5\n", asset_locator_map.asset_count); 426cabdff1aSopenharmony_ci if (asset_locator_map.asset_count != 5) { 427cabdff1aSopenharmony_ci printf("Asset map parsing failed: found %d assets instead of 5 expected.\n", 428cabdff1aSopenharmony_ci asset_locator_map.asset_count); 429cabdff1aSopenharmony_ci ret = 1; 430cabdff1aSopenharmony_ci goto cleanup; 431cabdff1aSopenharmony_ci } 432cabdff1aSopenharmony_ci 433cabdff1aSopenharmony_ci for (uint32_t i = 0; i < asset_locator_map.asset_count; ++i) { 434cabdff1aSopenharmony_ci printf("For asset: %d:\n", i); 435cabdff1aSopenharmony_ci ret = check_asset_locator_attributes(&(asset_locator_map.assets[i]), 436cabdff1aSopenharmony_ci &(ASSET_MAP_EXPECTED_LOCATORS[i])); 437cabdff1aSopenharmony_ci if (ret > 0) 438cabdff1aSopenharmony_ci goto cleanup; 439cabdff1aSopenharmony_ci } 440cabdff1aSopenharmony_ci 441cabdff1aSopenharmony_cicleanup: 442cabdff1aSopenharmony_ci imf_asset_locator_map_deinit(&asset_locator_map); 443cabdff1aSopenharmony_ci xmlFreeDoc(doc); 444cabdff1aSopenharmony_ci return ret; 445cabdff1aSopenharmony_ci} 446cabdff1aSopenharmony_ci 447cabdff1aSopenharmony_citypedef struct PathTypeTestStruct { 448cabdff1aSopenharmony_ci const char *path; 449cabdff1aSopenharmony_ci int is_url; 450cabdff1aSopenharmony_ci int is_unix_absolute_path; 451cabdff1aSopenharmony_ci int is_dos_absolute_path; 452cabdff1aSopenharmony_ci} PathTypeTestStruct; 453cabdff1aSopenharmony_ci 454cabdff1aSopenharmony_cistatic const PathTypeTestStruct PATH_TYPE_TEST_STRUCTS[11] = { 455cabdff1aSopenharmony_ci {.path = "file://path/to/somewhere", .is_url = 1, .is_unix_absolute_path = 0, .is_dos_absolute_path = 0}, 456cabdff1aSopenharmony_ci {.path = "http://path/to/somewhere", .is_url = 1, .is_unix_absolute_path = 0, .is_dos_absolute_path = 0}, 457cabdff1aSopenharmony_ci {.path = "https://path/to/somewhere", .is_url = 1, .is_unix_absolute_path = 0, .is_dos_absolute_path = 0}, 458cabdff1aSopenharmony_ci {.path = "s3://path/to/somewhere", .is_url = 1, .is_unix_absolute_path = 0, .is_dos_absolute_path = 0}, 459cabdff1aSopenharmony_ci {.path = "ftp://path/to/somewhere", .is_url = 1, .is_unix_absolute_path = 0, .is_dos_absolute_path = 0}, 460cabdff1aSopenharmony_ci {.path = "/path/to/somewhere", .is_url = 0, .is_unix_absolute_path = 1, .is_dos_absolute_path = 0}, 461cabdff1aSopenharmony_ci {.path = "path/to/somewhere", .is_url = 0, .is_unix_absolute_path = 0, .is_dos_absolute_path = 0}, 462cabdff1aSopenharmony_ci {.path = "C:\\path\\to\\somewhere", .is_url = 0, .is_unix_absolute_path = 0, .is_dos_absolute_path = 1}, 463cabdff1aSopenharmony_ci {.path = "C:/path/to/somewhere", .is_url = 0, .is_unix_absolute_path = 0, .is_dos_absolute_path = 1}, 464cabdff1aSopenharmony_ci {.path = "\\\\path\\to\\somewhere", .is_url = 0, .is_unix_absolute_path = 0, .is_dos_absolute_path = 1}, 465cabdff1aSopenharmony_ci {.path = "path\\to\\somewhere", .is_url = 0, .is_unix_absolute_path = 0, .is_dos_absolute_path = 0}, 466cabdff1aSopenharmony_ci}; 467cabdff1aSopenharmony_ci 468cabdff1aSopenharmony_cistatic int test_path_type_functions(void) 469cabdff1aSopenharmony_ci{ 470cabdff1aSopenharmony_ci PathTypeTestStruct path_type; 471cabdff1aSopenharmony_ci for (uint32_t i = 0; i < 11; ++i) { 472cabdff1aSopenharmony_ci path_type = PATH_TYPE_TEST_STRUCTS[i]; 473cabdff1aSopenharmony_ci if (imf_uri_is_url(path_type.path) != path_type.is_url) { 474cabdff1aSopenharmony_ci fprintf(stderr, 475cabdff1aSopenharmony_ci "URL comparison test failed for '%s', got %d instead of expected %d\n", 476cabdff1aSopenharmony_ci path_type.path, 477cabdff1aSopenharmony_ci path_type.is_url, 478cabdff1aSopenharmony_ci !path_type.is_url); 479cabdff1aSopenharmony_ci goto fail; 480cabdff1aSopenharmony_ci } 481cabdff1aSopenharmony_ci 482cabdff1aSopenharmony_ci if (imf_uri_is_unix_abs_path(path_type.path) != path_type.is_unix_absolute_path) { 483cabdff1aSopenharmony_ci fprintf(stderr, 484cabdff1aSopenharmony_ci "Unix absolute path comparison test failed for '%s', got %d instead of expected %d\n", 485cabdff1aSopenharmony_ci path_type.path, 486cabdff1aSopenharmony_ci path_type.is_unix_absolute_path, 487cabdff1aSopenharmony_ci !path_type.is_unix_absolute_path); 488cabdff1aSopenharmony_ci goto fail; 489cabdff1aSopenharmony_ci } 490cabdff1aSopenharmony_ci 491cabdff1aSopenharmony_ci if (imf_uri_is_dos_abs_path(path_type.path) != path_type.is_dos_absolute_path) { 492cabdff1aSopenharmony_ci fprintf(stderr, 493cabdff1aSopenharmony_ci "DOS absolute path comparison test failed for '%s', got %d instead of expected %d\n", 494cabdff1aSopenharmony_ci path_type.path, 495cabdff1aSopenharmony_ci path_type.is_dos_absolute_path, 496cabdff1aSopenharmony_ci !path_type.is_dos_absolute_path); 497cabdff1aSopenharmony_ci goto fail; 498cabdff1aSopenharmony_ci } 499cabdff1aSopenharmony_ci } 500cabdff1aSopenharmony_ci 501cabdff1aSopenharmony_ci return 0; 502cabdff1aSopenharmony_ci 503cabdff1aSopenharmony_cifail: 504cabdff1aSopenharmony_ci return 1; 505cabdff1aSopenharmony_ci} 506cabdff1aSopenharmony_ci 507cabdff1aSopenharmony_ciint main(int argc, char *argv[]) 508cabdff1aSopenharmony_ci{ 509cabdff1aSopenharmony_ci int ret = 0; 510cabdff1aSopenharmony_ci 511cabdff1aSopenharmony_ci if (test_cpl_parsing() != 0) 512cabdff1aSopenharmony_ci ret = 1; 513cabdff1aSopenharmony_ci 514cabdff1aSopenharmony_ci if (test_asset_map_parsing() != 0) 515cabdff1aSopenharmony_ci ret = 1; 516cabdff1aSopenharmony_ci 517cabdff1aSopenharmony_ci if (test_path_type_functions() != 0) 518cabdff1aSopenharmony_ci ret = 1; 519cabdff1aSopenharmony_ci 520cabdff1aSopenharmony_ci printf("#### The following should fail ####\n"); 521cabdff1aSopenharmony_ci if (test_bad_cpl_parsing() == 0) 522cabdff1aSopenharmony_ci ret = 1; 523cabdff1aSopenharmony_ci printf("#### End failing test ####\n"); 524cabdff1aSopenharmony_ci 525cabdff1aSopenharmony_ci return ret; 526cabdff1aSopenharmony_ci} 527