xref: /third_party/ffmpeg/libavformat/tests/imf.c (revision cabdff1a)
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