[FFmpeg-devel] [PATCH 1/5] avformat/imf: Headers
Jean-Baptiste Kempf
jb at videolan.org
Thu Sep 30 09:45:59 EEST 2021
Sorry, but why does this need a public header?
On Wed, 29 Sep 2021, at 22:47, pal at sandflow.com wrote:
> From: Pierre-Anthony Lemieux <pal at sandflow.com>
>
> Signed-off-by: Pierre-Anthony Lemieux <pal at sandflow.com>
> ---
>
> Notes:
> The IMF demuxer accepts as input an IMF CPL. The assets referenced
> by the CPL can be
> contained in multiple deliveries, each defined by an ASSETMAP file:
>
> ffmpeg -assetmaps <path of ASSETMAP1>,<path of ASSETMAP>,... -i
> <path of CPL>
>
> If -assetmaps is not specified, FFMPEG looks for a file called
> ASSETMAP.xml in the same directory as the CPL.
>
> EXAMPLE:
> ffmpeg -i
> http://ffmpeg-imf-samples-public.s3-website-us-west-1.amazonaws.com/countdown/CPL_f5095caa-f204-4e1c-8a84-7af48c7ae16b.xml
> out.mp4
>
> The Interoperable Master Format (IMF) is a file-based media format
> for the
> delivery and storage of professional audio-visual masters.
> An IMF Composition consists of an XML playlist (the Composition
> Playlist)
> and a collection of MXF files (the Track Files). The Composition
> Playlist (CPL)
> assembles the Track Files onto a timeline, which consists of
> multiple tracks.
> The location of the Track Files referenced by the Composition
> Playlist is stored
> in one or more XML documents called Asset Maps. More details at
> https://www.imfug.com/explainer.
> The IMF standard was first introduced in 2013 and is managed by the
> SMPTE.
>
> Public and private header files. The functions and constants
> in imf.h are intended to be useable by other modules.
>
> CHANGE NOTES:
>
> - fixed patchwork warnings
> - updated patch notes
>
> libavformat/imf.h | 156 +++++++++++++++++++++++++++++++++++++
> libavformat/imf_internal.h | 100 ++++++++++++++++++++++++
> 2 files changed, 256 insertions(+)
> create mode 100644 libavformat/imf.h
> create mode 100644 libavformat/imf_internal.h
>
> diff --git a/libavformat/imf.h b/libavformat/imf.h
> new file mode 100644
> index 0000000000..8162cbc031
> --- /dev/null
> +++ b/libavformat/imf.h
> @@ -0,0 +1,156 @@
> +/*
> + * This file is part of FFmpeg.
> + *
> + * Copyright (c) Sandflow Consulting LLC
> + *
> + * Redistribution and use in source and binary forms, with or without
> + * modification, are permitted provided that the following conditions
> are met:
> + *
> + * * Redistributions of source code must retain the above copyright
> notice, this
> + * list of conditions and the following disclaimer.
> + * * Redistributions in binary form must reproduce the above copyright
> notice,
> + * this list of conditions and the following disclaimer in the
> documentation
> + * and/or other materials provided with the distribution.
> + *
> + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
> "AS IS"
> + * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED
> TO, THE
> + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
> PURPOSE
> + * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR
> CONTRIBUTORS BE
> + * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
> + * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
> + * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR
> BUSINESS
> + * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
> WHETHER IN
> + * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR
> OTHERWISE)
> + * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED
> OF THE
> + * POSSIBILITY OF SUCH DAMAGE.
> + */
> +
> +/**
> + * Public header file for the processing of Interoperable Master
> Format (IMF) packages.
> + *
> + * @author Pierre-Anthony Lemieux
> + * @file
> + * @ingroup lavu_imf
> + */
> +
> +#ifndef AVFORMAT_IMF_H
> +#define AVFORMAT_IMF_H
> +
> +#include "avformat.h"
> +#include "libavformat/avio.h"
> +#include "libavutil/rational.h"
> +#include <libxml/tree.h>
> +
> +/**
> + * UUID as defined in IETF RFC 422
> + */
> +typedef uint8_t UUID[16];
> +
> +/**
> + * IMF Composition Playlist Base Resource
> + */
> +typedef struct IMFBaseResource {
> + AVRational edit_rate; /**< BaseResourceType/EditRate */
> + unsigned long entry_point; /**< BaseResourceType/EntryPoint */
> + unsigned long duration; /**< BaseResourceType/Duration */
> + unsigned long repeat_count; /**< BaseResourceType/RepeatCount */
> +} IMFBaseResource;
> +
> +/**
> + * IMF Composition Playlist Track File Resource
> + */
> +typedef struct IMFTrackFileResource {
> + IMFBaseResource base;
> + UUID track_file_uuid; /**< TrackFileResourceType/TrackFileId */
> +} IMFTrackFileResource;
> +
> +/**
> + * IMF Marker
> + */
> +typedef struct IMFMarker {
> + xmlChar *label_utf8; /**< Marker/Label */
> + xmlChar *scope_utf8; /**< Marker/Label/\@scope */
> + unsigned long offset; /**< Marker/Offset */
> +} IMFMarker;
> +
> +/**
> + * IMF Composition Playlist Marker Resource
> + */
> +typedef struct IMFMarkerResource {
> + IMFBaseResource base;
> + unsigned long marker_count; /**< Number of Marker elements */
> + IMFMarker *markers; /**< Marker elements */
> +} IMFMarkerResource;
> +
> +/**
> + * IMF Composition Playlist Virtual Track
> + */
> +typedef struct IMFBaseVirtualTrack {
> + UUID id_uuid; /**< TrackId associated with the Virtual Track */
> +} IMFBaseVirtualTrack;
> +
> +/**
> + * IMF Composition Playlist Virtual Track that consists of Track File
> Resources
> + */
> +typedef struct IMFTrackFileVirtualTrack {
> + IMFBaseVirtualTrack base;
> + unsigned long resource_count; /**< Number of Resource elements
> present in the Virtual Track */
> + IMFTrackFileResource *resources; /**< Resource elements of the
> Virtual Track */
> +} IMFTrackFileVirtualTrack;
> +
> +/**
> + * IMF Composition Playlist Virtual Track that consists of Marker
> Resources
> + */
> +typedef struct IMFMarkerVirtualTrack {
> + IMFBaseVirtualTrack base;
> + unsigned long resource_count; /**< Number of Resource elements
> present in the Virtual Track */
> + IMFMarkerResource *resources; /**< Resource elements of the
> Virtual Track */
> +} IMFMarkerVirtualTrack;
> +
> +/**
> + * IMF Composition Playlist
> + */
> +typedef struct IMFCPL {
> + UUID id_uuid; /**< CompositionPlaylist/Id element */
> + xmlChar *content_title_utf8; /**< CompositionPlaylist/ContentTitle
> element */
> + AVRational edit_rate; /**< CompositionPlaylist/EditRate element */
> + IMFMarkerVirtualTrack *main_markers_track; /**< Main Marker
> Virtual Track */
> + IMFTrackFileVirtualTrack *main_image_2d_track; /**< Main Image
> Virtual Track */
> + unsigned long main_audio_track_count; /**< Number of Main Audio
> Virtual Tracks */
> + IMFTrackFileVirtualTrack *main_audio_tracks; /**< Main Audio
> Virtual Tracks */
> +} IMFCPL;
> +
> +/**
> + * Parse an IMF CompositionPlaylist element into the IMFCPL data
> structure.
> + * @param[in] doc An XML document from which the CPL is read.
> + * @param[out] cpl Pointer to a memory area (allocated by the client),
> where the function writes a pointer to the newly constructed
> + * IMFCPL structure (or NULL if the CPL could not be parsed). The
> client is responsible for freeing the IMFCPL structure using
> + * imf_cpl_free().
> + * @return A non-zero value in case of an error.
> + */
> +int parse_imf_cpl_from_xml_dom(xmlDocPtr doc, IMFCPL **cpl);
> +
> +/**
> + * Parse an IMF Composition Playlist document into the IMFCPL data
> structure.
> + * @param[in] in The context from which the CPL is read.
> + * @param[out] cpl Pointer to a memory area (allocated by the client),
> where the function writes a pointer to the newly constructed
> + * IMFCPL structure (or NULL if the CPL could not be parsed). The
> client is responsible for freeing the IMFCPL structure using
> + * imf_cpl_free().
> + * @return A non-zero value in case of an error.
> + */
> +int parse_imf_cpl(AVIOContext *in, IMFCPL **cpl);
> +
> +/**
> + * Allocates and initializes an IMFCPL data structure.
> + * @return A pointer to the newly constructed IMFCPL structure (or
> NULL if the structure could not be constructed). The client is
> + * responsible for freeing the IMFCPL structure using imf_cpl_free().
> + */
> +IMFCPL *imf_cpl_alloc(void);
> +
> +/**
> + * Deletes an IMFCPL data structure previously instantiated with
> imf_cpl_alloc().
> + * @param[in] cpl The IMFCPL structure to delete.
> + */
> +void imf_cpl_free(IMFCPL *cpl);
> +
> +#endif
> diff --git a/libavformat/imf_internal.h b/libavformat/imf_internal.h
> new file mode 100644
> index 0000000000..a631497920
> --- /dev/null
> +++ b/libavformat/imf_internal.h
> @@ -0,0 +1,100 @@
> +/*
> + * This file is part of FFmpeg.
> + *
> + * Copyright (c) Sandflow Consulting LLC
> + *
> + * Redistribution and use in source and binary forms, with or without
> + * modification, are permitted provided that the following conditions
> are met:
> + *
> + * * Redistributions of source code must retain the above copyright
> notice, this
> + * list of conditions and the following disclaimer.
> + * * Redistributions in binary form must reproduce the above copyright
> notice,
> + * this list of conditions and the following disclaimer in the
> documentation
> + * and/or other materials provided with the distribution.
> + *
> + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
> "AS IS"
> + * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED
> TO, THE
> + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
> PURPOSE
> + * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR
> CONTRIBUTORS BE
> + * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
> + * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
> + * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR
> BUSINESS
> + * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
> WHETHER IN
> + * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR
> OTHERWISE)
> + * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED
> OF THE
> + * POSSIBILITY OF SUCH DAMAGE.
> + */
> +
> +/**
> + * Private header file for the processing of Interoperable Master
> Format (IMF) packages.
> + *
> + * @author Pierre-Anthony Lemieux
> + * @author Valentin Noel
> + * @file
> + * @ingroup lavu_imf
> + */
> +
> +#ifndef AVFORMAT_IMF_INTERNAL_H
> +#define AVFORMAT_IMF_INTERNAL_H
> +
> +#include "libavformat/avio.h"
> +#include "libavutil/rational.h"
> +#include <libxml/tree.h>
> +
> +#define UUID_FORMAT
> "urn:uuid:%02hhx%02hhx%02hhx%02hhx-%02hhx%02hhx-%02hhx%02hhx-%02hhx%02hhx-%02hhx%02hhx%02hhx%02hhx%02hhx%02hhx"
> +#define AVRATIONAL_FORMAT "%d/%d"
> +#define AVRATIONAL_ARG(rational) rational.num, rational.den
> +
> +/**
> + * IMF Asset locator
> + */
> +typedef struct IMFAssetLocator {
> + UUID uuid;
> + const char *absolute_uri;
> +} IMFAssetLocator;
> +
> +/**
> + * IMF Asset locator map
> + * Results from the parsing of one or more ASSETMAP XML files
> + */
> +typedef struct IMFAssetLocatorMap {
> + uint8_t asset_count;
> + IMFAssetLocator **assets;
> +} IMFAssetLocatorMap;
> +
> +int xml_read_ulong(xmlNodePtr element, unsigned long *number);
> +
> +int xml_read_rational(xmlNodePtr element, AVRational *rational);
> +
> +int xml_read_UUID(xmlNodePtr element, uint8_t uuid[16]);
> +
> +xmlNodePtr xml_get_child_element_by_name(xmlNodePtr parent, const char
> *name_utf8);
> +
> +/**
> + * Parse a ASSETMAP XML file to extract the UUID-URI mapping of assets.
> + * @param s the current format context, if any (can be NULL).
> + * @param doc the XML document to be parsed.
> + * @param asset_map pointer on the IMFAssetLocatorMap pointer to fill.
> + * @param base_url the url of the asset map XML file, if any (can be
> NULL).
> + * @return a negative value in case of error, 0 otherwise.
> + */
> +int parse_imf_asset_map_from_xml_dom(AVFormatContext *s, xmlDocPtr
> doc, IMFAssetLocatorMap **asset_map, const char *base_url);
> +
> +/**
> + * Allocate a IMFAssetLocatorMap pointer and return it.
> + * @return the allocated IMFAssetLocatorMap pointer.
> + */
> +IMFAssetLocatorMap *imf_asset_locator_map_alloc(void);
> +
> +/**
> + * Free a IMFAssetLocatorMap pointer.
> + */
> +void imf_asset_locator_map_free(IMFAssetLocatorMap *asset_map);
> +
> +int is_url(const char *string);
> +
> +int is_unix_absolute_path(const char *string);
> +
> +int is_dos_absolute_path(const char *string);
> +
> +#endif
> --
> 2.17.1
>
> _______________________________________________
> ffmpeg-devel mailing list
> ffmpeg-devel at ffmpeg.org
> https://ffmpeg.org/mailman/listinfo/ffmpeg-devel
>
> To unsubscribe, visit link above, or email
> ffmpeg-devel-request at ffmpeg.org with subject "unsubscribe".
--
Jean-Baptiste Kempf - President
+33 672 704 734
More information about the ffmpeg-devel
mailing list