| 1 | /* |
| 2 | Copyright (c) 2012, Broadcom Europe Ltd |
| 3 | All rights reserved. |
| 4 | |
| 5 | Redistribution and use in source and binary forms, with or without |
| 6 | modification, are permitted provided that the following conditions are met: |
| 7 | * Redistributions of source code must retain the above copyright |
| 8 | notice, this list of conditions and the following disclaimer. |
| 9 | * Redistributions in binary form must reproduce the above copyright |
| 10 | notice, this list of conditions and the following disclaimer in the |
| 11 | documentation and/or other materials provided with the distribution. |
| 12 | * Neither the name of the copyright holder nor the |
| 13 | names of its contributors may be used to endorse or promote products |
| 14 | derived from this software without specific prior written permission. |
| 15 | |
| 16 | THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND |
| 17 | ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED |
| 18 | WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE |
| 19 | DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY |
| 20 | DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES |
| 21 | (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; |
| 22 | LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND |
| 23 | ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT |
| 24 | (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS |
| 25 | SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. |
| 26 | */ |
| 27 | #ifndef VC_CONTAINERS_H |
| 28 | #define VC_CONTAINERS_H |
| 29 | |
| 30 | /** \file containers.h |
| 31 | * Public API for container readers and writers |
| 32 | */ |
| 33 | |
| 34 | #ifdef __cplusplus |
| 35 | extern "C" { |
| 36 | #endif |
| 37 | |
| 38 | #include "containers/containers_types.h" |
| 39 | |
| 40 | /** \defgroup VcContainerApi Container API |
| 41 | * API for container readers and writers */ |
| 42 | /* @{ */ |
| 43 | |
| 44 | /** Status codes returned by the container API */ |
| 45 | typedef enum |
| 46 | { |
| 47 | VC_CONTAINER_SUCCESS = 0, /**< No error */ |
| 48 | VC_CONTAINER_ERROR_FORMAT_NOT_SUPPORTED, /**< Format of container is not supported */ |
| 49 | VC_CONTAINER_ERROR_FORMAT_FEATURE_NOT_SUPPORTED, /**< Format of container uses unsupported features */ |
| 50 | VC_CONTAINER_ERROR_FORMAT_INVALID, /**< Format of container is invalid */ |
| 51 | VC_CONTAINER_ERROR_CORRUPTED, /**< Container is corrupted */ |
| 52 | VC_CONTAINER_ERROR_URI_NOT_FOUND, /**< URI could not be found */ |
| 53 | VC_CONTAINER_ERROR_URI_OPEN_FAILED, /**< URI could not be opened */ |
| 54 | VC_CONTAINER_ERROR_OUT_OF_MEMORY, /**< Out of memory */ |
| 55 | VC_CONTAINER_ERROR_OUT_OF_SPACE, /**< Out of disk space (used when writing) */ |
| 56 | VC_CONTAINER_ERROR_OUT_OF_RESOURCES, /**< Out of resources (other than memory) */ |
| 57 | VC_CONTAINER_ERROR_EOS, /**< End of stream reached */ |
| 58 | VC_CONTAINER_ERROR_LIMIT_REACHED, /**< User defined limit reached (used when writing) */ |
| 59 | VC_CONTAINER_ERROR_BUFFER_TOO_SMALL, /**< Given buffer is too small for data to be copied */ |
| 60 | VC_CONTAINER_ERROR_INCOMPLETE_DATA, /**< Requested data is incomplete */ |
| 61 | VC_CONTAINER_ERROR_NO_TRACK_AVAILABLE, /**< Container doesn't have any track */ |
| 62 | VC_CONTAINER_ERROR_TRACK_FORMAT_NOT_SUPPORTED, /**< Format of the track is not supported */ |
| 63 | VC_CONTAINER_ERROR_UNSUPPORTED_OPERATION, /**< The requested operation is not supported */ |
| 64 | VC_CONTAINER_ERROR_INVALID_ARGUMENT, /**< The argument provided is invalid */ |
| 65 | VC_CONTAINER_ERROR_CONTINUE, /**< The requested operation was interrupted and needs to be tried again */ |
| 66 | VC_CONTAINER_ERROR_ABORTED, /**< The requested operation was aborted */ |
| 67 | VC_CONTAINER_ERROR_NOT_FOUND, /**< The requested data was not found */ |
| 68 | VC_CONTAINER_ERROR_DRM_NOT_AUTHORIZED, /**< The DRM was not authorized */ |
| 69 | VC_CONTAINER_ERROR_DRM_EXPIRED, /**< The DRM has expired */ |
| 70 | VC_CONTAINER_ERROR_DRM_FAILED, /**< Generic DRM error */ |
| 71 | VC_CONTAINER_ERROR_FAILED, /**< Generic error */ |
| 72 | VC_CONTAINER_ERROR_NOT_READY /**< The container was not yet able to carry out the operation. */ |
| 73 | } VC_CONTAINER_STATUS_T; |
| 74 | |
| 75 | /** Four Character Code type used to identify codecs, etc. */ |
| 76 | typedef uint32_t VC_CONTAINER_FOURCC_T; |
| 77 | |
| 78 | /** Type definition for language codes. |
| 79 | * Language are defined as ISO639 Alpha-3 codes (http://en.wikipedia.org/wiki/List_of_ISO_639-2_codes) */ |
| 80 | typedef uint8_t VC_CONTAINER_LANGUAGE_T[3]; |
| 81 | |
| 82 | /** Enumeration of the character encodings supported. */ |
| 83 | typedef enum { |
| 84 | VC_CONTAINER_CHAR_ENCODING_UNKNOWN = 0, /**< Encoding is unknown */ |
| 85 | VC_CONTAINER_CHAR_ENCODING_UTF8 /**< UTF8 encoding */ |
| 86 | } VC_CONTAINER_CHAR_ENCODING_T; |
| 87 | |
| 88 | /** \name Container Capabilities |
| 89 | * The following flags are exported by containers to describe their capabilities */ |
| 90 | /* @{ */ |
| 91 | /** Type definition for container capabilities */ |
| 92 | typedef uint32_t VC_CONTAINER_CAPABILITIES_T; |
| 93 | /** The container can seek */ |
| 94 | #define VC_CONTAINER_CAPS_CAN_SEEK 0x1 |
| 95 | /** Seeking is fast. The absence of this flag can be used as a hint to avoid seeking as much as possible */ |
| 96 | #define VC_CONTAINER_CAPS_SEEK_IS_FAST 0x2 |
| 97 | /** The container controls the pace at which it is reading the data */ |
| 98 | #define VC_CONTAINER_CAPS_CAN_CONTROL_PACE 0x4 |
| 99 | /** The container provides an index. This basically means that seeking will be precise and fast */ |
| 100 | #define VC_CONTAINER_CAPS_HAS_INDEX 0x8 |
| 101 | /** The container provides keyframe information */ |
| 102 | #define VC_CONTAINER_CAPS_DATA_HAS_KEYFRAME_FLAG 0x10 |
| 103 | /** The container supports adding tracks after TRACK_ADD_DONE control message has been sent */ |
| 104 | #define VC_CONTAINER_CAPS_DYNAMIC_TRACK_ADD 0x20 |
| 105 | /** The container supports forcing reading of a given track */ |
| 106 | #define VC_CONTAINER_CAPS_FORCE_TRACK 0x40 |
| 107 | /* @} */ |
| 108 | |
| 109 | /** \defgroup VcContainerMetadata Container Metadata |
| 110 | * Container metadata contains descriptive information which is associated with the multimedia data */ |
| 111 | /* @{ */ |
| 112 | |
| 113 | /** Enumeration of the different metadata keys available. */ |
| 114 | typedef enum { |
| 115 | /* Metadata of global scope */ |
| 116 | VC_CONTAINER_METADATA_KEY_TITLE = VC_FOURCC('t','i','t','l'), |
| 117 | VC_CONTAINER_METADATA_KEY_ARTIST = VC_FOURCC('a','r','t','i'), |
| 118 | VC_CONTAINER_METADATA_KEY_ALBUM = VC_FOURCC('a','l','b','m'), |
| 119 | VC_CONTAINER_METADATA_KEY_DESCRIPTION = VC_FOURCC('d','e','s','c'), |
| 120 | VC_CONTAINER_METADATA_KEY_YEAR = VC_FOURCC('y','e','a','r'), |
| 121 | VC_CONTAINER_METADATA_KEY_GENRE = VC_FOURCC('g','e','n','r'), |
| 122 | VC_CONTAINER_METADATA_KEY_TRACK = VC_FOURCC('t','r','a','k'), |
| 123 | VC_CONTAINER_METADATA_KEY_LYRICS = VC_FOURCC('l','y','r','x'), |
| 124 | |
| 125 | VC_CONTAINER_METADATA_KEY_UNKNOWN = 0 |
| 126 | |
| 127 | } VC_CONTAINER_METADATA_KEY_T; |
| 128 | |
| 129 | /** Definition of the metadata type. |
| 130 | * This type is used to store one element of metadata */ |
| 131 | typedef struct VC_CONTAINER_METADATA_T |
| 132 | { |
| 133 | /** Identifier for the type of metadata the value refers to. |
| 134 | * Using an enum for the id will mean that a list of possible values will have to be |
| 135 | * defined and maintained. This might limit extensibility and customisation.\n |
| 136 | * Maybe it would be better to use a FOURCC or even a string here. */ |
| 137 | VC_CONTAINER_METADATA_KEY_T key; |
| 138 | |
| 139 | VC_CONTAINER_LANGUAGE_T language; /**< Language code for the metadata */ |
| 140 | VC_CONTAINER_CHAR_ENCODING_T encoding; /**< Encoding of the metadata */ |
| 141 | |
| 142 | /** Metadata value. This value is defined as null-terminated UTF-8 string.\n |
| 143 | * Do we want to support other types than strings (e.g. integer) ?\n |
| 144 | * We need an encoding conversion library! */ |
| 145 | char *value; |
| 146 | |
| 147 | /** Size of the memory area reserved for metadata value (including any |
| 148 | * terminating characters). */ |
| 149 | unsigned int size; |
| 150 | } VC_CONTAINER_METADATA_T; |
| 151 | /* @} */ |
| 152 | |
| 153 | /** \defgroup VcContainerESFormat Container Elementary Stream Format |
| 154 | * This describes the format of an elementary stream associated with a track */ |
| 155 | /* @{ */ |
| 156 | |
| 157 | /** Enumeration of the different types of elementary streams. |
| 158 | * This divides elementary streams into 4 big categories. */ |
| 159 | typedef enum |
| 160 | { |
| 161 | VC_CONTAINER_ES_TYPE_UNKNOWN, /**< Unknown elementary stream type */ |
| 162 | VC_CONTAINER_ES_TYPE_AUDIO, /**< Audio elementary stream */ |
| 163 | VC_CONTAINER_ES_TYPE_VIDEO, /**< Video elementary stream */ |
| 164 | VC_CONTAINER_ES_TYPE_SUBPICTURE /**< Sub-picture elementary stream (e.g. subtitles, overlays) */ |
| 165 | |
| 166 | } VC_CONTAINER_ES_TYPE_T; |
| 167 | |
| 168 | /** Definition of a video format. |
| 169 | * This describes the properties specific to a video stream */ |
| 170 | typedef struct VC_CONTAINER_VIDEO_FORMAT_T |
| 171 | { |
| 172 | uint32_t width; /**< Width of the frame */ |
| 173 | uint32_t height; /**< Height of the frame */ |
| 174 | uint32_t visible_width; /**< Width of the visible area of the frame */ |
| 175 | uint32_t visible_height; /**< Height of the visible area of the frame */ |
| 176 | uint32_t x_offset; /**< Offset to the start of the visible width */ |
| 177 | uint32_t y_offset; /**< Offset to the start of the visible height */ |
| 178 | uint32_t frame_rate_num; /**< Frame rate numerator */ |
| 179 | uint32_t frame_rate_den; /**< Frame rate denominator */ |
| 180 | uint32_t par_num; /**< Pixel aspect ratio numerator */ |
| 181 | uint32_t par_den; /**< Pixel aspect ratio denominator */ |
| 182 | } VC_CONTAINER_VIDEO_FORMAT_T; |
| 183 | |
| 184 | /** Enumeration for the different channel locations */ |
| 185 | typedef enum |
| 186 | { |
| 187 | VC_CONTAINER_AUDIO_CHANNEL_LEFT = 0, /**< Left channel */ |
| 188 | VC_CONTAINER_AUDIO_CHANNEL_RIGHT, /**< Right channel */ |
| 189 | VC_CONTAINER_AUDIO_CHANNEL_CENTER, /**< Center channel */ |
| 190 | VC_CONTAINER_AUDIO_CHANNEL_LOW_FREQUENCY, /**< Low frequency channel */ |
| 191 | VC_CONTAINER_AUDIO_CHANNEL_BACK_LEFT, /**< Back left channel */ |
| 192 | VC_CONTAINER_AUDIO_CHANNEL_BACK_RIGHT, /**< Back right channel */ |
| 193 | VC_CONTAINER_AUDIO_CHANNEL_BACK_CENTER, /**< Back center channel */ |
| 194 | VC_CONTAINER_AUDIO_CHANNEL_SIDE_LEFT, /**< Side left channel */ |
| 195 | VC_CONTAINER_AUDIO_CHANNEL_SIDE_RIGHT, /**< Side right channel */ |
| 196 | |
| 197 | VC_CONTAINER_AUDIO_CHANNELS_MAX = 32 /**< Maximum number of channels supported */ |
| 198 | |
| 199 | } VC_CONTAINER_AUDIO_CHANNEL_T; |
| 200 | |
| 201 | /** \name Audio format flags |
| 202 | * \anchor audioformatflags |
| 203 | * The following flags describe properties of an audio stream */ |
| 204 | /* @{ */ |
| 205 | #define VC_CONTAINER_AUDIO_FORMAT_FLAG_CHANNEL_MAPPING 0x1 /**< Channel mapping available */ |
| 206 | /* @} */ |
| 207 | |
| 208 | /** Definition of an audio format. |
| 209 | * This describes the properties specific to an audio stream */ |
| 210 | typedef struct VC_CONTAINER_AUDIO_FORMAT_T |
| 211 | { |
| 212 | uint32_t channels; /**< Number of audio channels */ |
| 213 | uint32_t sample_rate; /**< Sample rate */ |
| 214 | |
| 215 | uint32_t bits_per_sample; /**< Bits per sample */ |
| 216 | uint32_t block_align; /**< Size of a block of data */ |
| 217 | |
| 218 | uint32_t flags; /**< Flags describing the audio format. |
| 219 | * See \ref audioformatflags "Audio format flags". */ |
| 220 | |
| 221 | /** Mapping of the channels in order of appearance */ |
| 222 | VC_CONTAINER_AUDIO_CHANNEL_T channel_mapping[VC_CONTAINER_AUDIO_CHANNELS_MAX]; |
| 223 | |
| 224 | uint16_t gap_delay; /**< Delay introduced by the encoder. Used for gapless playback */ |
| 225 | uint16_t gap_padding; /**< Padding introduced by the encoder. Used for gapless playback */ |
| 226 | |
| 227 | /** Replay gain information. First element is the track information and the second |
| 228 | * is the album information. */ |
| 229 | struct { |
| 230 | float peak; /**< Peak value (full range is 1.0) */ |
| 231 | float gain; /**< Gain value in dB */ |
| 232 | } replay_gain[2]; |
| 233 | |
| 234 | } VC_CONTAINER_AUDIO_FORMAT_T; |
| 235 | |
| 236 | /** Definition of a subpicture format. |
| 237 | * This describes the properties specific to a subpicture stream */ |
| 238 | typedef struct VC_CONTAINER_SUBPICTURE_FORMAT_T |
| 239 | { |
| 240 | VC_CONTAINER_CHAR_ENCODING_T encoding; /**< Encoding for text based subpicture formats */ |
| 241 | uint32_t x_offset; /**< Width offset to the start of the subpicture */ |
| 242 | uint32_t y_offset; /**< Height offset to the start of the subpicture */ |
| 243 | } VC_CONTAINER_SUBPICTURE_FORMAT_T; |
| 244 | |
| 245 | /** \name Elementary stream format flags |
| 246 | * \anchor esformatflags |
| 247 | * The following flags describe properties of an elementary stream */ |
| 248 | /* @{ */ |
| 249 | #define VC_CONTAINER_ES_FORMAT_FLAG_FRAMED 0x1 /**< Elementary stream is framed */ |
| 250 | /* @} */ |
| 251 | |
| 252 | /** Definition of the type specific format. |
| 253 | * This describes the type specific information of the elementary stream. */ |
| 254 | typedef union |
| 255 | { |
| 256 | VC_CONTAINER_AUDIO_FORMAT_T audio; /**< Audio specific information */ |
| 257 | VC_CONTAINER_VIDEO_FORMAT_T video; /**< Video specific information */ |
| 258 | VC_CONTAINER_SUBPICTURE_FORMAT_T subpicture; /**< Subpicture specific information */ |
| 259 | } VC_CONTAINER_ES_SPECIFIC_FORMAT_T; |
| 260 | |
| 261 | /** Definition of an elementary stream format */ |
| 262 | typedef struct VC_CONTAINER_ES_FORMAT_T |
| 263 | { |
| 264 | VC_CONTAINER_ES_TYPE_T es_type; /**< Type of the elementary stream */ |
| 265 | VC_CONTAINER_FOURCC_T codec; /**< Coding of the elementary stream */ |
| 266 | VC_CONTAINER_FOURCC_T codec_variant; /**< If set, indicates a variant of the coding */ |
| 267 | |
| 268 | VC_CONTAINER_ES_SPECIFIC_FORMAT_T *type; /**< Type specific information for the elementary stream */ |
| 269 | |
| 270 | uint32_t bitrate; /**< Bitrate */ |
| 271 | |
| 272 | VC_CONTAINER_LANGUAGE_T language; /**< Language code for the elementary stream */ |
| 273 | uint32_t group_id; /**< ID of the group this elementary stream belongs to */ |
| 274 | |
| 275 | uint32_t flags; /**< Flags describing the properties of an elementary stream. |
| 276 | * See \ref esformatflags "Elementary stream format flags". */ |
| 277 | |
| 278 | unsigned int ; /**< Size of the codec specific data */ |
| 279 | uint8_t *; /**< Codec specific data */ |
| 280 | |
| 281 | } VC_CONTAINER_ES_FORMAT_T; |
| 282 | /* @} */ |
| 283 | |
| 284 | /** \defgroup VcContainerPacket Container Packet |
| 285 | * A container packet is the unit of data that is being read from or written to a container */ |
| 286 | /* @{ */ |
| 287 | |
| 288 | /** Structure describing a data packet */ |
| 289 | typedef struct VC_CONTAINER_PACKET_T |
| 290 | { |
| 291 | struct VC_CONTAINER_PACKET_T *next; /**< Used to build lists of packets */ |
| 292 | uint8_t *data; /**< Pointer to the buffer containing the actual data for the packet */ |
| 293 | unsigned int buffer_size; /**< Size of the p_data buffer. This is used to indicate how much data can be read in p_data */ |
| 294 | unsigned int size; /**< Size of the data contained in p_data */ |
| 295 | unsigned int frame_size; /**< If set, indicates the size of the frame this packet belongs to */ |
| 296 | int64_t pts; /**< Presentation Timestamp of the packet */ |
| 297 | int64_t dts; /**< Decoding Timestamp of the packet */ |
| 298 | uint64_t num; /**< Number of this packet */ |
| 299 | uint32_t track; /**< Track associated with this packet */ |
| 300 | uint32_t flags; /**< Flags associated with this packet */ |
| 301 | |
| 302 | void *user_data; /**< Field reserved for use by the client */ |
| 303 | void *framework_data; /**< Field reserved for use by the framework */ |
| 304 | |
| 305 | } VC_CONTAINER_PACKET_T; |
| 306 | |
| 307 | /** \name Container Packet Flags |
| 308 | * The following flags describe properties of the data packet */ |
| 309 | /* @{ */ |
| 310 | #define VC_CONTAINER_PACKET_FLAG_KEYFRAME 0x01 /**< Packet is a keyframe */ |
| 311 | #define VC_CONTAINER_PACKET_FLAG_FRAME_START 0x02 /**< Packet starts a frame */ |
| 312 | #define VC_CONTAINER_PACKET_FLAG_FRAME_END 0x04 /**< Packet ends a frame */ |
| 313 | #define VC_CONTAINER_PACKET_FLAG_FRAME 0x06 /**< Packet contains only complete frames */ |
| 314 | #define VC_CONTAINER_PACKET_FLAG_DISCONTINUITY 0x08 /**< Packet comes after a discontinuity in the stream. Decoders might have to be flushed */ |
| 315 | #define VC_CONTAINER_PACKET_FLAG_ENCRYPTED 0x10 /**< Packet contains DRM encrypted data */ |
| 316 | #define VC_CONTAINER_PACKET_FLAG_CONFIG 0x20 /**< Packet contains stream specific config data */ |
| 317 | /* @} */ |
| 318 | |
| 319 | /** \name Special Unknown Time Value |
| 320 | * This is the special value used to signal that a timestamp is not known */ |
| 321 | /* @{ */ |
| 322 | #define VC_CONTAINER_TIME_UNKNOWN (INT64_C(1)<<63) /**< Special value for signalling that time is not known */ |
| 323 | /* @} */ |
| 324 | |
| 325 | /* @} */ |
| 326 | |
| 327 | /** \name Track flags |
| 328 | * \anchor trackflags |
| 329 | * The following flags describe properties of a track */ |
| 330 | /* @{ */ |
| 331 | #define VC_CONTAINER_TRACK_FLAG_CHANGED 0x1 /**< Track definition has changed */ |
| 332 | /* @} */ |
| 333 | |
| 334 | /** Definition of the track type */ |
| 335 | typedef struct VC_CONTAINER_TRACK_T |
| 336 | { |
| 337 | struct VC_CONTAINER_TRACK_PRIVATE_T *priv; /**< Private member used by the implementation */ |
| 338 | uint32_t is_enabled; /**< Flag to specify if the track is enabled */ |
| 339 | uint32_t flags; /**< Flags describing the properties of a track. |
| 340 | * See \ref trackflags "Track flags". */ |
| 341 | |
| 342 | VC_CONTAINER_ES_FORMAT_T *format; /**< Format of the elementary stream contained in the track */ |
| 343 | |
| 344 | unsigned int meta_num; /**< Number of metadata elements associated with the track */ |
| 345 | VC_CONTAINER_METADATA_T **meta; /**< Array of metadata elements associated with the track */ |
| 346 | |
| 347 | } VC_CONTAINER_TRACK_T; |
| 348 | |
| 349 | /** Definition of the DRM type */ |
| 350 | typedef struct VC_CONTAINER_DRM_T |
| 351 | { |
| 352 | VC_CONTAINER_FOURCC_T format; /**< Four character code describing the format of the DRM in use */ |
| 353 | unsigned int views_max; /**< Maximum number of views allowed */ |
| 354 | unsigned int views_current; /**< Current number of views */ |
| 355 | |
| 356 | } VC_CONTAINER_DRM_T; |
| 357 | |
| 358 | /** Type definition for the progress reporting function. This function will be called regularly |
| 359 | * by the container during a call which blocks for too long and will report the progress of the |
| 360 | * operation as an estimated total length in microseconds and a percentage done. |
| 361 | * Returning anything else than VC_CONTAINER_SUCCESS in this function will abort the current |
| 362 | * operation. */ |
| 363 | typedef VC_CONTAINER_STATUS_T (*VC_CONTAINER_PROGRESS_REPORT_FUNC_T)(void *userdata, |
| 364 | int64_t length, unsigned int percentage_done); |
| 365 | |
| 366 | /** \name Container Events |
| 367 | * The following flags are exported by containers to notify the application of events */ |
| 368 | /* @{ */ |
| 369 | /** Type definition for container events */ |
| 370 | typedef uint32_t VC_CONTAINER_EVENTS_T; |
| 371 | #define VC_CONTAINER_EVENT_TRACKS_CHANGE 1 /**< Track information has changed */ |
| 372 | #define VC_CONTAINER_EVENT_METADATA_CHANGE 2 /**< Metadata has changed */ |
| 373 | /* @} */ |
| 374 | |
| 375 | /** Definition of the container context */ |
| 376 | typedef struct VC_CONTAINER_T |
| 377 | { |
| 378 | struct VC_CONTAINER_PRIVATE_T *priv; /**< Private member used by the implementation */ |
| 379 | |
| 380 | VC_CONTAINER_EVENTS_T events; /**< Events generated by the container */ |
| 381 | VC_CONTAINER_CAPABILITIES_T capabilities; /**< Capabilities exported by the container */ |
| 382 | |
| 383 | VC_CONTAINER_PROGRESS_REPORT_FUNC_T pf_progress; /**< Progress report function pointer */ |
| 384 | void *progress_userdata; /**< Progress report user data */ |
| 385 | |
| 386 | int64_t duration; /**< Duration of the media in microseconds */ |
| 387 | int64_t position; /**< Current time position into the media */ |
| 388 | int64_t size; /**< Size of the media in bytes */ |
| 389 | |
| 390 | unsigned int tracks_num; /**< Number of tracks available */ |
| 391 | /** Pointer to an array of pointers to track elements. |
| 392 | * The reasoning for using a pointer to pointers here is to allow us to extend |
| 393 | * VC_CONTAINER_TRACK_T without losing binary backward compatibility. */ |
| 394 | VC_CONTAINER_TRACK_T **tracks; |
| 395 | |
| 396 | unsigned int meta_num; /**< Number of metadata elements associated with the container */ |
| 397 | VC_CONTAINER_METADATA_T **meta; /**< Array of metadata elements associated with the container */ |
| 398 | |
| 399 | VC_CONTAINER_DRM_T *drm; /**< Description used for DRM protected content */ |
| 400 | |
| 401 | } VC_CONTAINER_T; |
| 402 | |
| 403 | /** Forward declaration of a container input / output context. |
| 404 | * This structure defines the context for a container io instance */ |
| 405 | typedef struct VC_CONTAINER_IO_T VC_CONTAINER_IO_T; |
| 406 | |
| 407 | /** Opens the media container pointed to by the URI for reading. |
| 408 | * This will create an an instance of a container reader and its associated context. |
| 409 | * The context returned will also be filled with the information retrieved from the media. |
| 410 | * |
| 411 | * If the media isn't accessible or recognized, this will return a null pointer as well as |
| 412 | * an error code indicating why this failed. |
| 413 | * |
| 414 | * \param psz_uri Unified Resource Identifier pointing to the media container |
| 415 | * \param status Returns the status of the operation |
| 416 | * \param pf_progress User provided function pointer to a progress report function. Can be set to |
| 417 | * null if no progress report is wanted. This function will be used during |
| 418 | * the whole lifetime of the instance (i.e. it will be used during |
| 419 | * open / seek / close) |
| 420 | * \param progress_userdata User provided pointer that will be passed during the progress report |
| 421 | * function call. |
| 422 | * \return A pointer to the context of the new instance of the |
| 423 | * container reader. Returns NULL on failure. |
| 424 | */ |
| 425 | VC_CONTAINER_T *vc_container_open_reader( const char *psz_uri, VC_CONTAINER_STATUS_T *status, |
| 426 | VC_CONTAINER_PROGRESS_REPORT_FUNC_T pf_progress, void *progress_userdata); |
| 427 | |
| 428 | /** Opens for reading the media container pointed to by the container i/o. |
| 429 | * This will create an an instance of a container reader and its associated context. |
| 430 | * The context returned will also be filled with the information retrieved from the media. |
| 431 | * |
| 432 | * If the media isn't accessible or recognized, this will return a null pointer as well as |
| 433 | * an error code indicating why this failed. |
| 434 | * |
| 435 | * \param p_io Instance of the container i/o to use |
| 436 | * \param psz_uri Unified Resource Identifier pointing to the media container (optional) |
| 437 | * \param status Returns the status of the operation |
| 438 | * \param pf_progress User provided function pointer to a progress report function. Can be set to |
| 439 | * null if no progress report is wanted. This function will be used during |
| 440 | * the whole lifetime of the instance (i.e. it will be used during |
| 441 | * open / seek / close) |
| 442 | * \param progress_userdata User provided pointer that will be passed during the progress report |
| 443 | * function call. |
| 444 | * \return A pointer to the context of the new instance of the |
| 445 | * container reader. Returns NULL on failure. |
| 446 | */ |
| 447 | VC_CONTAINER_T *vc_container_open_reader_with_io( VC_CONTAINER_IO_T *p_io, |
| 448 | const char *psz_uri, VC_CONTAINER_STATUS_T *status, |
| 449 | VC_CONTAINER_PROGRESS_REPORT_FUNC_T pf_progress, void *progress_userdata); |
| 450 | |
| 451 | /** Opens the media container pointed to by the URI for writing. |
| 452 | * This will create an an instance of a container writer and its associated context. |
| 453 | * The context returned will be initialised to sensible values. |
| 454 | * |
| 455 | * The application will need to add all the media tracks using \ref vc_container_control before |
| 456 | * it starts writing data using \ref vc_container_write. |
| 457 | * |
| 458 | * If the media isn't accessible or recognized, this will return a null pointer as well as |
| 459 | * an error code indicating why this failed. |
| 460 | * |
| 461 | * \param psz_uri Unified Resource Identifier pointing to the media container |
| 462 | * \param status Returns the status of the operation |
| 463 | * \param pf_progress User provided function pointer to a progess report function. Can be set to |
| 464 | * null if no progress report is wanted. |
| 465 | * \param progress_userdata User provided pointer that will be passed during the progress report |
| 466 | * function call. |
| 467 | * \return A pointer to the context of the new instance of the |
| 468 | * container writer. Returns NULL on failure. |
| 469 | */ |
| 470 | VC_CONTAINER_T *vc_container_open_writer( const char *psz_uri, VC_CONTAINER_STATUS_T *status, |
| 471 | VC_CONTAINER_PROGRESS_REPORT_FUNC_T pf_progress, void *progress_userdata); |
| 472 | |
| 473 | /** Closes an instance of a container reader / writer. |
| 474 | * This will free all the resources associated with the context. |
| 475 | * |
| 476 | * \param context Pointer to the context of the instance to close |
| 477 | * \return the status of the operation |
| 478 | */ |
| 479 | VC_CONTAINER_STATUS_T vc_container_close( VC_CONTAINER_T *context ); |
| 480 | |
| 481 | /** \name Container read flags |
| 482 | * The following flags can be passed during a read call */ |
| 483 | /* @{ */ |
| 484 | /** Type definition for the read flags */ |
| 485 | typedef uint32_t VC_CONTAINER_READ_FLAGS_T; |
| 486 | /** Ask the container to only return information on the next packet without reading it */ |
| 487 | #define VC_CONTAINER_READ_FLAG_INFO 1 |
| 488 | /** Ask the container to skip the next packet */ |
| 489 | #define VC_CONTAINER_READ_FLAG_SKIP 2 |
| 490 | /** Force the container to read data from the specified track */ |
| 491 | #define VC_CONTAINER_READ_FLAG_FORCE_TRACK 4 |
| 492 | /* @} */ |
| 493 | |
| 494 | /** Reads a data packet from a container reader. |
| 495 | * By default, the reader will read whatever packet comes next in the container and update the |
| 496 | * given \ref VC_CONTAINER_PACKET_T structure with this packet's information. |
| 497 | * This behaviour can be changed using the \ref VC_CONTAINER_READ_FLAGS_T.\n |
| 498 | * \ref VC_CONTAINER_READ_FLAG_INFO will instruct the reader to only return information on the |
| 499 | * following packet but not its actual data. The data can be retreived later by issuing another |
| 500 | * read request.\n |
| 501 | * \ref VC_CONTAINER_READ_FLAG_FORCE_TRACK will force the reader to read the next packet for the |
| 502 | * selected track (as present in the \ref VC_CONTAINER_PACKET_T structure) instead of defaulting |
| 503 | * to reading the packet which comes next in the container.\n |
| 504 | * \ref VC_CONTAINER_READ_FLAG_SKIP will instruct the reader to skip the next packet. In this case |
| 505 | * it isn't necessary for the caller to pass a pointer to a \ref VC_CONTAINER_PACKET_T structure |
| 506 | * unless the \ref VC_CONTAINER_READ_FLAG_INFO is also given.\n |
| 507 | * A combination of all these flags can be used. |
| 508 | * |
| 509 | * \param context Pointer to the context of the reader to use |
| 510 | * \param packet Pointer to the VC_CONTAINER_PACKET_T structure describing the data packet |
| 511 | * This needs to be partially filled before the call (buffer, buffer_size) |
| 512 | * \param flags Flags controlling the read operation |
| 513 | * \return the status of the operation |
| 514 | */ |
| 515 | VC_CONTAINER_STATUS_T vc_container_read( VC_CONTAINER_T *context, |
| 516 | VC_CONTAINER_PACKET_T *packet, VC_CONTAINER_READ_FLAGS_T flags ); |
| 517 | |
| 518 | /** Writes a data packet to a container writer. |
| 519 | * |
| 520 | * \param context Pointer to the context of the writer to use |
| 521 | * \param packet Pointer to the VC_CONTAINER_PACKET_T structure describing the data packet |
| 522 | * \return the status of the operation |
| 523 | */ |
| 524 | VC_CONTAINER_STATUS_T vc_container_write( VC_CONTAINER_T *context, |
| 525 | VC_CONTAINER_PACKET_T *packet ); |
| 526 | |
| 527 | /** Definition of the different seek modes */ |
| 528 | typedef enum |
| 529 | { |
| 530 | /** The offset provided for seeking is an absolute time offset in microseconds */ |
| 531 | VC_CONTAINER_SEEK_MODE_TIME = 0, |
| 532 | /** The offset provided for seeking is a percentage (Q32 ?) */ |
| 533 | VC_CONTAINER_SEEK_MODE_PERCENT |
| 534 | |
| 535 | } VC_CONTAINER_SEEK_MODE_T; |
| 536 | |
| 537 | /** \name Container Seek Flags |
| 538 | * The following flags control seek operations */ |
| 539 | /* @{ */ |
| 540 | /** Type definition for the seek flags */ |
| 541 | typedef uint32_t VC_CONTAINER_SEEK_FLAGS_T; |
| 542 | /** Choose precise seeking even if slower */ |
| 543 | #define VC_CONTAINER_SEEK_FLAG_PRECISE 0x1 |
| 544 | /** By default a seek will always seek to the keyframe which comes just before the requested |
| 545 | * position. This flag allows the caller to force the container to seek to the keyframe which |
| 546 | * comes just after the requested position. */ |
| 547 | #define VC_CONTAINER_SEEK_FLAG_FORWARD 0x2 |
| 548 | /* @} */ |
| 549 | |
| 550 | /** Seek into a container reader. |
| 551 | * |
| 552 | * \param context Pointer to the context of the reader to use |
| 553 | * \param offset Offset to seek to. Used as an input as well as output value. |
| 554 | * \param mode Seeking mode requested. |
| 555 | * \param flags Flags affecting the seeking operation. |
| 556 | * \return the status of the operation |
| 557 | */ |
| 558 | VC_CONTAINER_STATUS_T vc_container_seek( VC_CONTAINER_T *context, int64_t *offset, |
| 559 | VC_CONTAINER_SEEK_MODE_T mode, VC_CONTAINER_SEEK_FLAGS_T flags); |
| 560 | |
| 561 | /** Performance statistics. |
| 562 | */ |
| 563 | /** The maximum number of bins a statistics value is held in */ |
| 564 | #define VC_CONTAINER_STATS_BINS 10 |
| 565 | |
| 566 | /** This type is used to represent multiple values of a statistic. |
| 567 | */ |
| 568 | typedef struct VC_CONTAINER_STATS_T |
| 569 | { |
| 570 | /** The number of places to right shift count before using. Resulting values |
| 571 | * of zero are rounded to 1. */ |
| 572 | uint32_t shift; |
| 573 | |
| 574 | /** We store VC_CONTAINER_STATS_BINS+1 records, in sorted order of numpc. |
| 575 | * At least one will be invalid and all zero. We combine adjacent records |
| 576 | * as necessary. */ |
| 577 | struct { |
| 578 | /** Sum of count. For single value statistics this is the freqency, for paired statistics |
| 579 | * this is the number of bytes written. */ |
| 580 | uint32_t count; |
| 581 | /** Number of count. For single value statistics this is the total value, for paired statistics |
| 582 | * this is the total length of time. */ |
| 583 | uint32_t num; |
| 584 | /** Number>>shift per count. Stored to save recalculation. */ |
| 585 | uint32_t numpc; |
| 586 | } record[VC_CONTAINER_STATS_BINS+1]; |
| 587 | } VC_CONTAINER_STATS_T; |
| 588 | |
| 589 | /** This type represents the statistics saved by the io layer. */ |
| 590 | typedef struct VC_CONTAINER_WRITE_STATS_T |
| 591 | { |
| 592 | /** This logs the number of bytes written in count, and the microseconds taken to write |
| 593 | * in num. */ |
| 594 | VC_CONTAINER_STATS_T write; |
| 595 | /** This logs the length of time the write function has to wait for the asynchronous task. */ |
| 596 | VC_CONTAINER_STATS_T wait; |
| 597 | /** This logs the length of time that we wait for a flush command to complete. */ |
| 598 | VC_CONTAINER_STATS_T flush; |
| 599 | } VC_CONTAINER_WRITE_STATS_T; |
| 600 | |
| 601 | |
| 602 | /** Control operations which can be done on containers. */ |
| 603 | typedef enum |
| 604 | { |
| 605 | /** Adds a new track to the list of tracks. This should be used by writers to create |
| 606 | * their list of tracks.\n |
| 607 | * Arguments:\n |
| 608 | * arg1= VC_CONTAINER_ES_FORMAT_T *: format of the track to add\n |
| 609 | * return= VC_CONTAINER_ERROR_TRACK_FORMAT_NOT_SUPPORTED if the format is not supported */ |
| 610 | VC_CONTAINER_CONTROL_TRACK_ADD = 0, |
| 611 | |
| 612 | /** Specifies that we're done adding new tracks. This is optional but can be used by writers |
| 613 | * to trigger the writing of the container header early. If this isn't used, the header will be |
| 614 | * written when the first data packet is received.\n |
| 615 | * No arguments.\n |
| 616 | * return= VC_CONTAINER_ERROR_TRACK_FORMAT_NOT_SUPPORTED if the format is not supported */ |
| 617 | VC_CONTAINER_CONTROL_TRACK_ADD_DONE, |
| 618 | |
| 619 | /** Change the format of a track in the list of tracks. This should be used by writers to modify |
| 620 | * the format of a track at run-time.\n |
| 621 | * Arguments:\n |
| 622 | * arg1= unsigned int: index of track to change\n |
| 623 | * arg2= VC_CONTAINER_ES_FORMAT_T *: format of the track to add\n |
| 624 | * return= VC_CONTAINER_ERROR_TRACK_FORMAT_NOT_SUPPORTED if the format is not supported */ |
| 625 | VC_CONTAINER_CONTROL_TRACK_CHANGE, |
| 626 | |
| 627 | /** Deletes a track from the list of tracks. This should be used by writers to delete tracks |
| 628 | * during run-time. Note that vc_container_close will automatically delete all track so it |
| 629 | * isn't necessary to call this before closing a writer.\n |
| 630 | * Arguments:\n |
| 631 | * arg1= index of the track to delete */ |
| 632 | VC_CONTAINER_CONTROL_TRACK_DEL, |
| 633 | |
| 634 | /** Activate the playback of DRM protected content.\n |
| 635 | * No arguments.\n |
| 636 | * return= one of the VC_CONTAINER_ERROR_DRM error codes if content can't be played */ |
| 637 | VC_CONTAINER_CONTROL_DRM_PLAY, |
| 638 | |
| 639 | /** TBD */ |
| 640 | VC_CONTAINER_CONTROL_METADATA_ADD, |
| 641 | /** TBD */ |
| 642 | VC_CONTAINER_CONTROL_METADATA_CHANGE, |
| 643 | /** TBD */ |
| 644 | VC_CONTAINER_CONTROL_METADATA_DEL, |
| 645 | |
| 646 | /** TBD */ |
| 647 | VC_CONTAINER_CONTROL_CHAPTER_ADD, |
| 648 | /** TBD */ |
| 649 | VC_CONTAINER_CONTROL_CHAPTER_DEL, |
| 650 | |
| 651 | /** Set a maximum size for files generated by writers.\n |
| 652 | * Arguments:\n |
| 653 | * arg1= uint64_t: maximum size */ |
| 654 | VC_CONTAINER_CONTROL_SET_MAXIMUM_SIZE, |
| 655 | |
| 656 | /** Enables/disabled performance statistic gathering.\n |
| 657 | * Arguments:\n |
| 658 | * arg1= bool: enable or disable */ |
| 659 | VC_CONTAINER_CONTROL_SET_IO_PERF_STATS, |
| 660 | |
| 661 | /** Collects performance statistics.\n |
| 662 | * Arguments:\n |
| 663 | * arg1= VC_CONTAINER_WRITE_STATS_T *: */ |
| 664 | VC_CONTAINER_CONTROL_GET_IO_PERF_STATS, |
| 665 | |
| 666 | /** HACK.\n |
| 667 | * Arguments:\n |
| 668 | * arg1= void (*)(void *): callback function |
| 669 | * arg1= void *: opaque pointer to pass during the callback */ |
| 670 | VC_CONTAINER_CONTROL_SET_IO_BUFFER_FULL_CALLBACK, |
| 671 | |
| 672 | /** Set the I/O read buffer size to be used.\n |
| 673 | * Arguments:\n |
| 674 | * arg1= uint32_t: New buffer size in bytes*/ |
| 675 | VC_CONTAINER_CONTROL_IO_SET_READ_BUFFER_SIZE, |
| 676 | |
| 677 | /** Set the timeout on I/O read operations, if applicable.\n |
| 678 | * Arguments:\n |
| 679 | * arg1= uint32_t: New timeout in milliseconds, or VC_CONTAINER_READ_TIMEOUT_BLOCK */ |
| 680 | VC_CONTAINER_CONTROL_IO_SET_READ_TIMEOUT_MS, |
| 681 | |
| 682 | /** Set the timestamp base.\n |
| 683 | * The timestamp passed equates to time zero for the stream.\n |
| 684 | * Arguments:\n |
| 685 | * arg1= uint32_t: Timestamp base in stream clock units. */ |
| 686 | VC_CONTAINER_CONTROL_SET_TIMESTAMP_BASE, |
| 687 | |
| 688 | /** Set the next expected sequence number for the stream.\n |
| 689 | * Arguments:\n |
| 690 | * arg1= uint32_t: Next expected sequence number. */ |
| 691 | VC_CONTAINER_CONTROL_SET_NEXT_SEQUENCE_NUMBER, |
| 692 | |
| 693 | /** Set the source ID for the container.\n |
| 694 | * Arguments:\n |
| 695 | * arg1= uint32_t: Source identifier. */ |
| 696 | VC_CONTAINER_CONTROL_SET_SOURCE_ID, |
| 697 | |
| 698 | /** Arguments:\n |
| 699 | * arg1= void *: metadata buffer |
| 700 | * arg2= unsigned long: length of metadata in bytes */ |
| 701 | VC_CONTAINER_CONTROL_GET_DRM_METADATA, |
| 702 | |
| 703 | /** Arguments:\n |
| 704 | * arg1= unsigned long: track number |
| 705 | * arg2= VC_CONTAINER_FOURCC_T : drm type |
| 706 | * arg3= void *: encryption configuration parameters. |
| 707 | * arg4= unsigned long: configuration data length */ |
| 708 | VC_CONTAINER_CONTROL_ENCRYPT_TRACK, |
| 709 | |
| 710 | /** Causes the io to be flushed.\n |
| 711 | * Arguments: none */ |
| 712 | VC_CONTAINER_CONTROL_IO_FLUSH, |
| 713 | |
| 714 | /** Request the container reader to packetize data for the specified track. |
| 715 | * Arguments:\n |
| 716 | * arg1= unsigned long: track number |
| 717 | * arg2= VC_CONTAINER_FOURCC_T: codec variant to output */ |
| 718 | VC_CONTAINER_CONTROL_TRACK_PACKETIZE, |
| 719 | |
| 720 | /** Private user extensions must be above this number */ |
| 721 | VC_CONTAINER_CONTROL_USER_EXTENSIONS = 0x1000 |
| 722 | |
| 723 | } VC_CONTAINER_CONTROL_T; |
| 724 | |
| 725 | /** Used with the VC_CONTAINER_CONTROL_IO_SET_READ_TIMEOUT_MS control to indicate the read shall |
| 726 | * block until either data is available, or an error occurs. |
| 727 | */ |
| 728 | #define VC_CONTAINER_READ_TIMEOUT_BLOCK (uint32_t)(-1) |
| 729 | |
| 730 | /** Extensible control function for container readers and writers. |
| 731 | * This function takes a variable number of arguments which will depend on the specific operation. |
| 732 | * |
| 733 | * \param context Pointer to the VC_CONTAINER_T context to use |
| 734 | * \param operation The requested operation |
| 735 | * \return the status of the operation. Can be \ref VC_CONTAINER_ERROR_UNSUPPORTED_OPERATION |
| 736 | * if the operation is not supported or implemented by the container. |
| 737 | */ |
| 738 | VC_CONTAINER_STATUS_T vc_container_control( VC_CONTAINER_T *context, VC_CONTAINER_CONTROL_T operation, ... ); |
| 739 | |
| 740 | /* @} */ |
| 741 | |
| 742 | #ifdef __cplusplus |
| 743 | } |
| 744 | #endif |
| 745 | |
| 746 | #endif /* VC_CONTAINERS_H */ |
| 747 | |