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);
77 xmlChar *element_text = xmlNodeListGetString(element->doc, element->xmlChildrenNode, 1);
83 xmlFree(element_text);
92 xmlChar *element_text = xmlNodeListGetString(element->doc, element->xmlChildrenNode, 1);
93 if (sscanf(element_text,
"%i %i", &rational->
num, &rational->
den) != 2) {
97 xmlFree(element_text);
106 xmlChar *element_text = xmlNodeListGetString(element->doc, element->xmlChildrenNode, 1);
107 if (sscanf(element_text,
"%" PRIu32, number) != 1) {
111 xmlFree(element_text);
120 xmlChar *element_text = xmlNodeListGetString(element->doc, element->xmlChildrenNode, 1);
121 if (xmlStrcmp(element_text,
"true") == 0 || xmlStrcmp(element_text,
"1") == 0)
123 else if (xmlStrcmp(element_text,
"false") == 0 || xmlStrcmp(element_text,
"0") == 0)
127 xmlFree(element_text);
140 track->resource_count = 0;
141 track->resources =
NULL;
147 track->resource_count = 0;
148 track->resources_alloc_sz = 0;
149 track->resources =
NULL;
163 rsrc->marker_count = 0;
164 rsrc->markers =
NULL;
177 memset(rsrc->track_file_uuid, 0,
sizeof(rsrc->track_file_uuid));
182 xmlNodePtr element =
NULL;
189 element->xmlChildrenNode,
197 if (digit >=
'0' && digit <=
'9')
215 for (
int i = 0;
i < 4;
i++) {
222 if (hi == -1 || lo == -1)
225 tc_comps[
i] = 10 * hi + lo;
233 xmlNodePtr tc_element =
NULL;
234 xmlNodePtr element =
NULL;
235 xmlChar *tc_str =
NULL;
247 a TimecodeDropFrame child element\n");
258 a TimecodeStartAddress child element\n");
262 tc_str = xmlNodeListGetString(element->doc, element->xmlChildrenNode, 1);
273 comps[0], comps[1], comps[2], comps[3],
281 xmlNodePtr element =
NULL;
293 xmlNodePtr element =
NULL;
305 xmlNodePtr element =
NULL;
321 if (!(marker->
label_utf8 = xmlNodeListGetString(element->doc, element->xmlChildrenNode, 1))) {
325 if (!(marker->
scope_utf8 = xmlGetNoNsProp(element,
"scope"))) {
327 = xmlCharStrdup(
"http://www.smpte-ra.org/schemas/2067-3/2013#standard-markers");
339 xmlNodePtr element =
NULL;
390 xmlNodePtr element =
NULL;
414 xmlNodePtr element =
NULL;
421 element = xmlFirstElementChild(marker_resource_elem);
423 if (xmlStrcmp(element->name,
"Marker") == 0) {
426 if (marker_resource->marker_count == UINT32_MAX)
429 marker_resource->marker_count + 1,
433 marker_resource->markers =
tmp;
435 imf_marker_init(&marker_resource->markers[marker_resource->marker_count]);
437 &marker_resource->markers[marker_resource->marker_count]);
438 marker_resource->marker_count++;
443 element = xmlNextElementSibling(element);
453 xmlNodePtr resource_list_elem =
NULL;
454 xmlNodePtr resource_elem =
NULL;
455 xmlNodePtr track_id_elem =
NULL;
456 unsigned long resource_elem_count;
470 "Processing IMF CPL Marker Sequence for Virtual Track " AV_PRI_UUID "\n",
488 if (!resource_list_elem)
491 resource_elem_count = xmlChildElementCount(resource_list_elem);
492 if (resource_elem_count > UINT32_MAX
504 resource_elem = xmlFirstElementChild(resource_list_elem);
505 while (resource_elem) {
514 resource_elem = xmlNextElementSibling(resource_elem);
522 if (xmlStrcmp(element->name,
"Left") == 0 || xmlStrcmp(element->name,
"Right") == 0)
525 element = xmlFirstElementChild(element);
530 element = xmlNextElementSibling(element);
540 xmlNodePtr resource_list_elem =
NULL;
541 xmlNodePtr resource_elem =
NULL;
542 xmlNodePtr track_id_elem =
NULL;
543 unsigned long resource_elem_count;
558 "Processing IMF CPL Audio Sequence for Virtual Track " AV_PRI_UUID "\n",
588 if (!resource_list_elem)
591 resource_elem_count = xmlChildElementCount(resource_list_elem);
592 if (resource_elem_count > UINT32_MAX
605 resource_elem = xmlFirstElementChild(resource_list_elem);
606 while (resource_elem) {
617 resource_elem = xmlNextElementSibling(resource_elem);
627 xmlNodePtr resource_list_elem =
NULL;
628 xmlNodePtr resource_elem =
NULL;
629 xmlNodePtr track_id_elem =
NULL;
631 unsigned long resource_elem_count;
663 "Processing IMF CPL Main Image Sequence for Virtual Track " AV_PRI_UUID "\n",
668 if (!resource_list_elem)
671 resource_elem_count = xmlChildElementCount(resource_list_elem);
672 if (resource_elem_count > UINT32_MAX
687 resource_elem = xmlFirstElementChild(resource_list_elem);
688 while (resource_elem) {
700 resource_elem = xmlNextElementSibling(resource_elem);
709 xmlNodePtr segment_list_elem =
NULL;
710 xmlNodePtr segment_elem =
NULL;
711 xmlNodePtr sequence_list_elem =
NULL;
712 xmlNodePtr sequence_elem =
NULL;
720 segment_elem = xmlFirstElementChild(segment_list_elem);
721 while (segment_elem) {
725 if (!sequence_list_elem)
728 sequence_elem = xmlFirstElementChild(sequence_list_elem);
729 while (sequence_elem) {
730 if (xmlStrcmp(sequence_elem->name,
"MarkerSequence") == 0)
733 else if (xmlStrcmp(sequence_elem->name,
"MainImageSequence") == 0)
736 else if (xmlStrcmp(sequence_elem->name,
"MainAudioSequence") == 0)
742 "The following Sequence is not supported and is ignored: %s\n",
743 sequence_elem->name);
749 sequence_elem = xmlNextElementSibling(sequence_elem);
752 segment_elem = xmlNextElementSibling(segment_elem);
761 xmlNodePtr cpl_element =
NULL;
769 cpl_element = xmlDocGetRootElement(doc);
770 if (!cpl_element || xmlStrcmp(cpl_element->name,
"CompositionPlaylist")) {
898 doc = xmlReadMemory(buf.str, buf.len,
NULL,
NULL, 0);
902 "XML parsing failed when reading the IMF CPL\n");
912 "IMF CPL ContentTitle: %s\n",
913 (*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.
static int parse_cpl_tc_type(const char *s, int *tc_comps)
Parses a string that conform to the TimecodeType used in IMF CPL and defined in SMPTE ST 2067-3.
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
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)
static int digit_to_int(char digit)
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.
AVTimecode * tc
CompositionPlaylist/CompositionTimecode element.
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).
size_t static size_t av_strnlen(const char *s, size_t len)
Get the count of continuous non zero chars starting from the beginning.
static int fill_timecode(xmlNodePtr cpl_element, FFIMFCPL *cpl)
FFIMFBaseVirtualTrack base
FFIMFBaseVirtualTrack base
static int has_stereo_resources(xmlNodePtr element)
int av_timecode_init_from_components(AVTimecode *tc, AVRational rate, int flags, int hh, int mm, int ss, int ff, void *log_ctx)
Init a timecode struct from the passed timecode components.
AVRational edit_rate
BaseResourceType/EditRate.
static int fill_content_title(xmlNodePtr cpl_element, FFIMFCPL *cpl)
int av_bprint_finalize(AVBPrint *buf, char **ret_str)
Finalize a print buffer.
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.
it s the only field you need to keep assuming you have a context There is some magic you don t need to care about around this just let it vf default value
@ AV_TIMECODE_FLAG_DROPFRAME
timecode is drop frame
static int ff_imf_xml_read_boolean(xmlNodePtr element, int *value)
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.