Go to the documentation of this file.
57 #include <libxml/parser.h>
61 xmlNodePtr cur_element;
63 cur_element = xmlFirstElementChild(parent);
65 if (xmlStrcmp(cur_element->name, name_utf8) == 0)
68 cur_element = xmlNextElementSibling(cur_element);
75 xmlChar *element_text =
NULL;
78 element_text = xmlNodeListGetString(element->doc, element->xmlChildrenNode, 1);
84 xmlFree(element_text);
91 xmlChar *element_text =
NULL;
94 element_text = xmlNodeListGetString(element->doc, element->xmlChildrenNode, 1);
95 if (sscanf(element_text,
"%i %i", &rational->
num, &rational->
den) != 2) {
99 xmlFree(element_text);
106 xmlChar *element_text =
NULL;
109 element_text = xmlNodeListGetString(element->doc, element->xmlChildrenNode, 1);
110 if (sscanf(element_text,
"%" PRIu32, number) != 1) {
114 xmlFree(element_text);
127 track->resource_count = 0;
128 track->resources =
NULL;
134 track->resource_count = 0;
135 track->resources_alloc_sz = 0;
136 track->resources =
NULL;
150 rsrc->marker_count = 0;
151 rsrc->markers =
NULL;
164 memset(rsrc->track_file_uuid, 0,
sizeof(rsrc->track_file_uuid));
169 xmlNodePtr element =
NULL;
176 element->xmlChildrenNode,
184 xmlNodePtr element =
NULL;
196 xmlNodePtr element =
NULL;
208 xmlNodePtr element =
NULL;
224 if (!(marker->
label_utf8 = xmlNodeListGetString(element->doc, element->xmlChildrenNode, 1))) {
228 if (!(marker->
scope_utf8 = xmlGetNoNsProp(element,
"scope"))) {
230 = xmlCharStrdup(
"http://www.smpte-ra.org/schemas/2067-3/2013#standard-markers");
242 xmlNodePtr element =
NULL;
293 xmlNodePtr element =
NULL;
317 xmlNodePtr element =
NULL;
324 element = xmlFirstElementChild(marker_resource_elem);
326 if (xmlStrcmp(element->name,
"Marker") == 0) {
329 if (marker_resource->marker_count == UINT32_MAX)
332 marker_resource->marker_count + 1,
336 marker_resource->markers =
tmp;
338 imf_marker_init(&marker_resource->markers[marker_resource->marker_count]);
340 &marker_resource->markers[marker_resource->marker_count]);
341 marker_resource->marker_count++;
346 element = xmlNextElementSibling(element);
356 xmlNodePtr resource_list_elem =
NULL;
357 xmlNodePtr resource_elem =
NULL;
358 xmlNodePtr track_id_elem =
NULL;
359 unsigned long resource_elem_count;
373 "Processing IMF CPL Marker Sequence for Virtual Track " AV_PRI_UUID "\n",
391 if (!resource_list_elem)
394 resource_elem_count = xmlChildElementCount(resource_list_elem);
395 if (resource_elem_count > UINT32_MAX
407 resource_elem = xmlFirstElementChild(resource_list_elem);
408 while (resource_elem) {
417 resource_elem = xmlNextElementSibling(resource_elem);
425 if (xmlStrcmp(element->name,
"Left") == 0 || xmlStrcmp(element->name,
"Right") == 0)
428 element = xmlFirstElementChild(element);
433 element = xmlNextElementSibling(element);
443 xmlNodePtr resource_list_elem =
NULL;
444 xmlNodePtr resource_elem =
NULL;
445 xmlNodePtr track_id_elem =
NULL;
446 unsigned long resource_elem_count;
461 "Processing IMF CPL Audio Sequence for Virtual Track " AV_PRI_UUID "\n",
491 if (!resource_list_elem)
494 resource_elem_count = xmlChildElementCount(resource_list_elem);
495 if (resource_elem_count > UINT32_MAX
508 resource_elem = xmlFirstElementChild(resource_list_elem);
509 while (resource_elem) {
520 resource_elem = xmlNextElementSibling(resource_elem);
530 xmlNodePtr resource_list_elem =
NULL;
531 xmlNodePtr resource_elem =
NULL;
532 xmlNodePtr track_id_elem =
NULL;
534 unsigned long resource_elem_count;
566 "Processing IMF CPL Main Image Sequence for Virtual Track " AV_PRI_UUID "\n",
571 if (!resource_list_elem)
574 resource_elem_count = xmlChildElementCount(resource_list_elem);
575 if (resource_elem_count > UINT32_MAX
590 resource_elem = xmlFirstElementChild(resource_list_elem);
591 while (resource_elem) {
603 resource_elem = xmlNextElementSibling(resource_elem);
612 xmlNodePtr segment_list_elem =
NULL;
613 xmlNodePtr segment_elem =
NULL;
614 xmlNodePtr sequence_list_elem =
NULL;
615 xmlNodePtr sequence_elem =
NULL;
623 segment_elem = xmlFirstElementChild(segment_list_elem);
624 while (segment_elem) {
628 if (!segment_list_elem)
631 sequence_elem = xmlFirstElementChild(sequence_list_elem);
632 while (sequence_elem) {
633 if (xmlStrcmp(sequence_elem->name,
"MarkerSequence") == 0)
636 else if (xmlStrcmp(sequence_elem->name,
"MainImageSequence") == 0)
639 else if (xmlStrcmp(sequence_elem->name,
"MainAudioSequence") == 0)
645 "The following Sequence is not supported and is ignored: %s\n",
646 sequence_elem->name);
652 sequence_elem = xmlNextElementSibling(sequence_elem);
655 segment_elem = xmlNextElementSibling(segment_elem);
664 xmlNodePtr cpl_element =
NULL;
672 cpl_element = xmlDocGetRootElement(doc);
673 if (!cpl_element || xmlStrcmp(cpl_element->name,
"CompositionPlaylist")) {
795 doc = xmlReadMemory(buf.str, buf.len,
NULL,
NULL, 0);
799 "XML parsing failed when reading the IMF CPL\n");
809 "IMF CPL ContentTitle: %s\n",
810 (*cpl)->content_title_utf8);
static void imf_base_virtual_track_init(FFIMFBaseVirtualTrack *track)
FFIMFTrackFileResource * resources
Resource elements of the Virtual Track.
AVUUID id_uuid
CompositionPlaylist/Id element.
Filter the word “frame” indicates either a video frame or a group of audio as stored in an AVFrame structure Format for each input and each output the list of supported formats For video that means pixel format For audio that means channel sample they are references to shared objects When the negotiation mechanism computes the intersection of the formats supported at each end of a all references to both lists are replaced with a reference to the intersection And when a single format is eventually chosen for a link amongst the remaining all references to the list are updated That means that if a filter requires that its input and output have the same format amongst a supported all it has to do is use a reference to the same list of formats query_formats can leave some formats unset and return AVERROR(EAGAIN) to cause the negotiation mechanism toagain later. That can be used by filters with complex requirements to use the format negotiated on one link to set the formats supported on another. Frame references ownership and permissions
int av_bprint_finalize(AVBPrint *buf, char **ret_str)
Finalize a print buffer.
uint8_t AVUUID[AV_UUID_LEN]
static int push_main_audio_sequence(xmlNodePtr audio_sequence_elem, FFIMFCPL *cpl)
void av_bprint_init(AVBPrint *buf, unsigned size_init, unsigned size_max)
void ff_imf_cpl_free(FFIMFCPL *cpl)
Deletes an FFIMFCPL data structure previously instantiated with ff_imf_cpl_alloc().
static void imf_marker_free(FFIMFMarker *marker)
FFIMFMarkerResource * resources
Resource elements of the Virtual Track.
FFIMFCPL * ff_imf_cpl_alloc(void)
Allocates and initializes an FFIMFCPL data structure.
static av_cold void cleanup(FlashSV2Context *s)
int ff_imf_parse_cpl_from_xml_dom(xmlDocPtr doc, FFIMFCPL **cpl)
Parse an IMF CompositionPlaylist element into the FFIMFCPL data structure.
uint32_t resource_count
Number of Resource elements present in the Virtual Track.
static void imf_trackfile_virtual_track_init(FFIMFTrackFileVirtualTrack *track)
IMF Composition Playlist Virtual Track that consists of Marker Resources.
xmlChar * content_title_utf8
CompositionPlaylist/ContentTitle element.
FFIMFTrackFileVirtualTrack * main_audio_tracks
Main Audio Virtual Tracks.
static void imf_cpl_init(FFIMFCPL *cpl)
uint32_t duration
BaseResourceType/Duration.
FFIMFMarkerVirtualTrack * main_markers_track
Main Marker Virtual Track.
static void imf_marker_virtual_track_free(FFIMFMarkerVirtualTrack *vt)
#define AV_LOG_ERROR
Something went wrong and cannot losslessly be recovered.
IMF Composition Playlist Virtual Track that consists of Track File Resources.
static int push_main_image_2d_sequence(xmlNodePtr image_sequence_elem, FFIMFCPL *cpl)
void * av_fast_realloc(void *ptr, unsigned int *size, size_t min_size)
Reallocate the given buffer if it is not large enough, otherwise do nothing.
static void imf_base_resource_init(FFIMFBaseResource *rsrc)
int avio_read_to_bprint(AVIOContext *h, struct AVBPrint *pb, size_t max_size)
Read contents of h into print buffer, up to max_size bytes, or up to EOF.
void * av_realloc_array(void *ptr, size_t nmemb, size_t size)
static void imf_marker_virtual_track_init(FFIMFMarkerVirtualTrack *track)
#define AV_LOG_DEBUG
Stuff which is only useful for libav* developers.
static void imf_trackfile_resource_init(FFIMFTrackFileResource *rsrc)
static int fill_base_resource(xmlNodePtr resource_elem, FFIMFBaseResource *resource, FFIMFCPL *cpl)
int ff_imf_xml_read_uint32(xmlNodePtr element, uint32_t *number)
Reads an unsigned 32-bit integer from an XML element.
AVRational edit_rate
CompositionPlaylist/EditRate element.
static int fill_trackfile_resource(xmlNodePtr tf_resource_elem, FFIMFTrackFileResource *tf_resource, FFIMFCPL *cpl)
unsigned int resources_alloc_sz
Size of the resources buffer.
#define AVERROR_PATCHWELCOME
Not yet implemented in FFmpeg, patches welcome.
IMF Composition Playlist Virtual Track.
IMF Composition Playlist Base Resource.
Rational number (pair of numerator and denominator).
FFIMFBaseVirtualTrack base
FFIMFBaseVirtualTrack base
static int has_stereo_resources(xmlNodePtr element)
AVRational edit_rate
BaseResourceType/EditRate.
static int fill_content_title(xmlNodePtr cpl_element, FFIMFCPL *cpl)
int ff_imf_xml_read_uuid(xmlNodePtr element, AVUUID uuid)
Reads a UUID from an XML element.
static int fill_marker(xmlNodePtr marker_elem, FFIMFMarker *marker)
static AVRational av_make_q(int num, int den)
Create an AVRational.
static void imf_marker_resource_free(FFIMFMarkerResource *rsrc)
static int fill_id(xmlNodePtr cpl_element, FFIMFCPL *cpl)
static int push_marker_sequence(xmlNodePtr marker_sequence_elem, FFIMFCPL *cpl)
static void av_uuid_nil(AVUUID uu)
Sets a UUID to the nil UUID, i.e.
uint32_t repeat_count
BaseResourceType/RepeatCount.
#define AV_LOG_INFO
Standard information.
static int av_uuid_equal(const AVUUID uu1, const AVUUID uu2)
Compares two UUIDs for equality.
#define i(width, name, range_min, range_max)
AVUUID id_uuid
TrackId associated with the Virtual Track.
uint32_t entry_point
BaseResourceType/EntryPoint.
static int fill_virtual_tracks(xmlNodePtr cpl_element, FFIMFCPL *cpl)
IMF Composition Playlist Marker Resource.
FFIMFMarker * markers
Marker elements.
int ff_imf_xml_read_rational(xmlNodePtr element, AVRational *rational)
Reads an AVRational from an XML element.
IMF Composition Playlist Track File Resource.
uint32_t offset
Marker/Offset.
static void imf_marker_resource_init(FFIMFMarkerResource *rsrc)
static void imf_marker_init(FFIMFMarker *marker)
uint32_t main_audio_track_count
Number of Main Audio Virtual Tracks.
uint32_t resource_count
Number of Resource elements present in the Virtual Track.
static void imf_trackfile_virtual_track_free(FFIMFTrackFileVirtualTrack *vt)
FFIMFTrackFileVirtualTrack * main_image_2d_track
Main Image Virtual Track.
uint32_t marker_count
Number of Marker elements.
static void av_uuid_copy(AVUUID dest, const AVUUID src)
Copies the bytes of src into dest.
IMF Composition Playlist.
Public header file for the processing of Interoperable Master Format (IMF) packages.
#define AVERROR_INVALIDDATA
Invalid data found when processing input.
xmlChar * label_utf8
Marker/Label.
int ff_imf_parse_cpl(AVIOContext *in, FFIMFCPL **cpl)
Parse an IMF Composition Playlist document into the FFIMFCPL data structure.
xmlChar * scope_utf8
Marker/Label/@scope.
static int fill_marker_resource(xmlNodePtr marker_resource_elem, FFIMFMarkerResource *marker_resource, FFIMFCPL *cpl)
int av_uuid_urn_parse(const char *in, AVUUID uu)
Parses a URN representation of a UUID, as specified at IETF RFC 4122, into an AVUUID.
xmlNodePtr ff_imf_xml_get_child_element_by_name(xmlNodePtr parent, const char *name_utf8)
Returns the first child element with the specified local name.
static int fill_edit_rate(xmlNodePtr cpl_element, FFIMFCPL *cpl)
int avio_feof(AVIOContext *s)
Similar to feof() but also returns nonzero on read errors.