| OLD | NEW |
| (Empty) |
| 1 /* | |
| 2 * Copyright © 2010 Mozilla Foundation | |
| 3 * | |
| 4 * This program is made available under an ISC-style license. See the | |
| 5 * accompanying file LICENSE for details. | |
| 6 */ | |
| 7 #if !defined(NESTEGG_671cac2a_365d_ed69_d7a3_4491d3538d79) | |
| 8 #define NESTEGG_671cac2a_365d_ed69_d7a3_4491d3538d79 | |
| 9 | |
| 10 #include "vpx/vpx_integer.h" | |
| 11 | |
| 12 #if defined(__cplusplus) | |
| 13 extern "C" { | |
| 14 #endif | |
| 15 | |
| 16 /** @mainpage | |
| 17 | |
| 18 @section intro Introduction | |
| 19 | |
| 20 This is the documentation for the <tt>libnestegg</tt> C API. | |
| 21 <tt>libnestegg</tt> is a demultiplexing library for <a | |
| 22 href="http://www.webmproject.org/code/specs/container/">WebM</a> | |
| 23 media files. | |
| 24 | |
| 25 @section example Example code | |
| 26 | |
| 27 @code | |
| 28 nestegg * demux_ctx; | |
| 29 nestegg_init(&demux_ctx, io, NULL); | |
| 30 | |
| 31 nestegg_packet * pkt; | |
| 32 while ((r = nestegg_read_packet(demux_ctx, &pkt)) > 0) { | |
| 33 unsigned int track; | |
| 34 | |
| 35 nestegg_packet_track(pkt, &track); | |
| 36 | |
| 37 // This example decodes the first track only. | |
| 38 if (track == 0) { | |
| 39 unsigned int chunk, chunks; | |
| 40 | |
| 41 nestegg_packet_count(pkt, &chunks); | |
| 42 | |
| 43 // Decode each chunk of data. | |
| 44 for (chunk = 0; chunk < chunks; ++chunk) { | |
| 45 unsigned char * data; | |
| 46 size_t data_size; | |
| 47 | |
| 48 nestegg_packet_data(pkt, chunk, &data, &data_size); | |
| 49 | |
| 50 example_codec_decode(codec_ctx, data, data_size); | |
| 51 } | |
| 52 } | |
| 53 | |
| 54 nestegg_free_packet(pkt); | |
| 55 } | |
| 56 | |
| 57 nestegg_destroy(demux_ctx); | |
| 58 @endcode | |
| 59 */ | |
| 60 | |
| 61 | |
| 62 /** @file | |
| 63 The <tt>libnestegg</tt> C API. */ | |
| 64 | |
| 65 #define NESTEGG_TRACK_VIDEO 0 /**< Track is of type video. */ | |
| 66 #define NESTEGG_TRACK_AUDIO 1 /**< Track is of type audio. */ | |
| 67 | |
| 68 #define NESTEGG_CODEC_VP8 0 /**< Track uses Google On2 VP8 codec. */ | |
| 69 #define NESTEGG_CODEC_VORBIS 1 /**< Track uses Xiph Vorbis codec. */ | |
| 70 #define NESTEGG_CODEC_VP9 2 /**< Track uses Google On2 VP9 codec. */ | |
| 71 #define NESTEGG_CODEC_OPUS 3 /**< Track uses Xiph Opus codec. */ | |
| 72 | |
| 73 #define NESTEGG_VIDEO_MONO 0 /**< Track is mono video. */ | |
| 74 #define NESTEGG_VIDEO_STEREO_LEFT_RIGHT 1 /**< Track is side-by-side stereo vide
o. Left first. */ | |
| 75 #define NESTEGG_VIDEO_STEREO_BOTTOM_TOP 2 /**< Track is top-bottom stereo video.
Right first. */ | |
| 76 #define NESTEGG_VIDEO_STEREO_TOP_BOTTOM 3 /**< Track is top-bottom stereo video.
Left first. */ | |
| 77 #define NESTEGG_VIDEO_STEREO_RIGHT_LEFT 11 /**< Track is side-by-side stereo vid
eo. Right first. */ | |
| 78 | |
| 79 #define NESTEGG_SEEK_SET 0 /**< Seek offset relative to beginning of stream. */ | |
| 80 #define NESTEGG_SEEK_CUR 1 /**< Seek offset relative to current position in stre
am. */ | |
| 81 #define NESTEGG_SEEK_END 2 /**< Seek offset relative to end of stream. */ | |
| 82 | |
| 83 #define NESTEGG_LOG_DEBUG 1 /**< Debug level log message. */ | |
| 84 #define NESTEGG_LOG_INFO 10 /**< Informational level log message. */ | |
| 85 #define NESTEGG_LOG_WARNING 100 /**< Warning level log message. */ | |
| 86 #define NESTEGG_LOG_ERROR 1000 /**< Error level log message. */ | |
| 87 #define NESTEGG_LOG_CRITICAL 10000 /**< Critical level log message. */ | |
| 88 | |
| 89 typedef struct nestegg nestegg; /**< Opaque handle referencing the
stream state. */ | |
| 90 typedef struct nestegg_packet nestegg_packet; /**< Opaque handle referencing a p
acket of data. */ | |
| 91 | |
| 92 /** User supplied IO context. */ | |
| 93 typedef struct { | |
| 94 /** User supplied read callback. | |
| 95 @param buffer Buffer to read data into. | |
| 96 @param length Length of supplied buffer in bytes. | |
| 97 @param userdata The #userdata supplied by the user. | |
| 98 @retval 1 Read succeeded. | |
| 99 @retval 0 End of stream. | |
| 100 @retval -1 Error. */ | |
| 101 int (* read)(void * buffer, size_t length, void * userdata); | |
| 102 | |
| 103 /** User supplied seek callback. | |
| 104 @param offset Offset within the stream to seek to. | |
| 105 @param whence Seek direction. One of #NESTEGG_SEEK_SET, | |
| 106 #NESTEGG_SEEK_CUR, or #NESTEGG_SEEK_END. | |
| 107 @param userdata The #userdata supplied by the user. | |
| 108 @retval 0 Seek succeeded. | |
| 109 @retval -1 Error. */ | |
| 110 int (* seek)(int64_t offset, int whence, void * userdata); | |
| 111 | |
| 112 /** User supplied tell callback. | |
| 113 @param userdata The #userdata supplied by the user. | |
| 114 @returns Current position within the stream. | |
| 115 @retval -1 Error. */ | |
| 116 int64_t (* tell)(void * userdata); | |
| 117 | |
| 118 /** User supplied pointer to be passed to the IO callbacks. */ | |
| 119 void * userdata; | |
| 120 } nestegg_io; | |
| 121 | |
| 122 /** Parameters specific to a video track. */ | |
| 123 typedef struct { | |
| 124 unsigned int stereo_mode; /**< Video mode. One of #NESTEGG_VIDEO_MONO, | |
| 125 #NESTEGG_VIDEO_STEREO_LEFT_RIGHT, | |
| 126 #NESTEGG_VIDEO_STEREO_BOTTOM_TOP, or | |
| 127 #NESTEGG_VIDEO_STEREO_TOP_BOTTOM. */ | |
| 128 unsigned int width; /**< Width of the video frame in pixels. */ | |
| 129 unsigned int height; /**< Height of the video frame in pixels. */ | |
| 130 unsigned int display_width; /**< Display width of the video frame in pixels.
*/ | |
| 131 unsigned int display_height; /**< Display height of the video frame in pixels.
*/ | |
| 132 unsigned int crop_bottom; /**< Pixels to crop from the bottom of the frame.
*/ | |
| 133 unsigned int crop_top; /**< Pixels to crop from the top of the frame. */ | |
| 134 unsigned int crop_left; /**< Pixels to crop from the left of the frame. *
/ | |
| 135 unsigned int crop_right; /**< Pixels to crop from the right of the frame.
*/ | |
| 136 } nestegg_video_params; | |
| 137 | |
| 138 /** Parameters specific to an audio track. */ | |
| 139 typedef struct { | |
| 140 double rate; /**< Sampling rate in Hz. */ | |
| 141 unsigned int channels; /**< Number of audio channels. */ | |
| 142 unsigned int depth; /**< Bits per sample. */ | |
| 143 uint64_t codec_delay; /**< Nanoseconds that must be discarded from the start.
*/ | |
| 144 uint64_t seek_preroll;/**< Nanoseconds that must be discarded after a seek. *
/ | |
| 145 } nestegg_audio_params; | |
| 146 | |
| 147 /** Logging callback function pointer. */ | |
| 148 typedef void (* nestegg_log)(nestegg * context, unsigned int severity, char cons
t * format, ...); | |
| 149 | |
| 150 /** Initialize a nestegg context. During initialization the parser will | |
| 151 read forward in the stream processing all elements until the first | |
| 152 block of media is reached. All track metadata has been processed at this po
int. | |
| 153 @param context Storage for the new nestegg context. @see nestegg_destroy | |
| 154 @param io User supplied IO context. | |
| 155 @param callback Optional logging callback function pointer. May be NULL. | |
| 156 @param max_offset Optional maximum offset to be read. Set -1 to ignore. | |
| 157 @retval 0 Success. | |
| 158 @retval -1 Error. */ | |
| 159 int nestegg_init(nestegg ** context, nestegg_io io, nestegg_log callback, int64_
t max_offset); | |
| 160 | |
| 161 /** Destroy a nestegg context and free associated memory. | |
| 162 @param context #nestegg context to be freed. @see nestegg_init */ | |
| 163 void nestegg_destroy(nestegg * context); | |
| 164 | |
| 165 /** Query the duration of the media stream in nanoseconds. | |
| 166 @param context Stream context initialized by #nestegg_init. | |
| 167 @param duration Storage for the queried duration. | |
| 168 @retval 0 Success. | |
| 169 @retval -1 Error. */ | |
| 170 int nestegg_duration(nestegg * context, uint64_t * duration); | |
| 171 | |
| 172 /** Query the tstamp scale of the media stream in nanoseconds. | |
| 173 Timecodes presented by nestegg have been scaled by this value | |
| 174 before presentation to the caller. | |
| 175 @param context Stream context initialized by #nestegg_init. | |
| 176 @param scale Storage for the queried scale factor. | |
| 177 @retval 0 Success. | |
| 178 @retval -1 Error. */ | |
| 179 int nestegg_tstamp_scale(nestegg * context, uint64_t * scale); | |
| 180 | |
| 181 /** Query the number of tracks in the media stream. | |
| 182 @param context Stream context initialized by #nestegg_init. | |
| 183 @param tracks Storage for the queried track count. | |
| 184 @retval 0 Success. | |
| 185 @retval -1 Error. */ | |
| 186 int nestegg_track_count(nestegg * context, unsigned int * tracks); | |
| 187 | |
| 188 /** Query the start and end offset for a particular cluster. | |
| 189 @param context Stream context initialized by #nestegg_init. | |
| 190 @param cluster_num Zero-based cluster number; order they appear in cues. | |
| 191 @param max_offset Optional maximum offset to be read. Set -1 to ignore. | |
| 192 @param start_pos Starting offset of the cluster. -1 means non-existant. | |
| 193 @param end_pos Starting offset of the cluster. -1 means non-existant or | |
| 194 final cluster. | |
| 195 @param tstamp Starting timestamp of the cluster. | |
| 196 @retval 0 Success. | |
| 197 @retval -1 Error. */ | |
| 198 int nestegg_get_cue_point(nestegg * context, unsigned int cluster_num, | |
| 199 int64_t max_offset, int64_t * start_pos, | |
| 200 int64_t * end_pos, uint64_t * tstamp); | |
| 201 | |
| 202 /** Seek to @a offset. Stream will seek directly to offset. | |
| 203 Should be used to seek to the start of a resync point, i.e. cluster; the | |
| 204 parser will not be able to understand other offsets. | |
| 205 @param context Stream context initialized by #nestegg_init. | |
| 206 @param offset Absolute offset in bytes. | |
| 207 @retval 0 Success. | |
| 208 @retval -1 Error. */ | |
| 209 int nestegg_offset_seek(nestegg * context, uint64_t offset); | |
| 210 | |
| 211 /** Seek @a track to @a tstamp. Stream seek will terminate at the earliest | |
| 212 key point in the stream at or before @a tstamp. Other tracks in the | |
| 213 stream will output packets with unspecified but nearby timestamps. | |
| 214 @param context Stream context initialized by #nestegg_init. | |
| 215 @param track Zero based track number. | |
| 216 @param tstamp Absolute timestamp in nanoseconds. | |
| 217 @retval 0 Success. | |
| 218 @retval -1 Error. */ | |
| 219 int nestegg_track_seek(nestegg * context, unsigned int track, uint64_t tstamp); | |
| 220 | |
| 221 /** Query the type specified by @a track. | |
| 222 @param context Stream context initialized by #nestegg_init. | |
| 223 @param track Zero based track number. | |
| 224 @retval #NESTEGG_TRACK_VIDEO Track type is video. | |
| 225 @retval #NESTEGG_TRACK_AUDIO Track type is audio. | |
| 226 @retval -1 Error. */ | |
| 227 int nestegg_track_type(nestegg * context, unsigned int track); | |
| 228 | |
| 229 /** Query the codec ID specified by @a track. | |
| 230 @param context Stream context initialized by #nestegg_init. | |
| 231 @param track Zero based track number. | |
| 232 @retval #NESTEGG_CODEC_VP8 Track codec is VP8. | |
| 233 @retval #NESTEGG_CODEC_VORBIS Track codec is Vorbis. | |
| 234 @retval -1 Error. */ | |
| 235 int nestegg_track_codec_id(nestegg * context, unsigned int track); | |
| 236 | |
| 237 /** Query the number of codec initialization chunks for @a track. Each | |
| 238 chunk of data should be passed to the codec initialization functions in | |
| 239 the order returned. | |
| 240 @param context Stream context initialized by #nestegg_init. | |
| 241 @param track Zero based track number. | |
| 242 @param count Storage for the queried chunk count. | |
| 243 @retval 0 Success. | |
| 244 @retval -1 Error. */ | |
| 245 int nestegg_track_codec_data_count(nestegg * context, unsigned int track, | |
| 246 unsigned int * count); | |
| 247 | |
| 248 /** Get a pointer to chunk number @a item of codec initialization data for | |
| 249 @a track. | |
| 250 @param context Stream context initialized by #nestegg_init. | |
| 251 @param track Zero based track number. | |
| 252 @param item Zero based chunk item number. | |
| 253 @param data Storage for the queried data pointer. | |
| 254 The data is owned by the #nestegg context. | |
| 255 @param length Storage for the queried data size. | |
| 256 @retval 0 Success. | |
| 257 @retval -1 Error. */ | |
| 258 int nestegg_track_codec_data(nestegg * context, unsigned int track, unsigned int
item, | |
| 259 unsigned char ** data, size_t * length); | |
| 260 | |
| 261 /** Query the video parameters specified by @a track. | |
| 262 @param context Stream context initialized by #nestegg_init. | |
| 263 @param track Zero based track number. | |
| 264 @param params Storage for the queried video parameters. | |
| 265 @retval 0 Success. | |
| 266 @retval -1 Error. */ | |
| 267 int nestegg_track_video_params(nestegg * context, unsigned int track, | |
| 268 nestegg_video_params * params); | |
| 269 | |
| 270 /** Query the audio parameters specified by @a track. | |
| 271 @param context Stream context initialized by #nestegg_init. | |
| 272 @param track Zero based track number. | |
| 273 @param params Storage for the queried audio parameters. | |
| 274 @retval 0 Success. | |
| 275 @retval -1 Error. */ | |
| 276 int nestegg_track_audio_params(nestegg * context, unsigned int track, | |
| 277 nestegg_audio_params * params); | |
| 278 | |
| 279 /** Read a packet of media data. A packet consists of one or more chunks of | |
| 280 data associated with a single track. nestegg_read_packet should be | |
| 281 called in a loop while the return value is 1 to drive the stream parser | |
| 282 forward. @see nestegg_free_packet | |
| 283 @param context Context returned by #nestegg_init. | |
| 284 @param packet Storage for the returned nestegg_packet. | |
| 285 @retval 1 Additional packets may be read in subsequent calls. | |
| 286 @retval 0 End of stream. | |
| 287 @retval -1 Error. */ | |
| 288 int nestegg_read_packet(nestegg * context, nestegg_packet ** packet); | |
| 289 | |
| 290 /** Destroy a nestegg_packet and free associated memory. | |
| 291 @param packet #nestegg_packet to be freed. @see nestegg_read_packet */ | |
| 292 void nestegg_free_packet(nestegg_packet * packet); | |
| 293 | |
| 294 /** Query the track number of @a packet. | |
| 295 @param packet Packet initialized by #nestegg_read_packet. | |
| 296 @param track Storage for the queried zero based track index. | |
| 297 @retval 0 Success. | |
| 298 @retval -1 Error. */ | |
| 299 int nestegg_packet_track(nestegg_packet * packet, unsigned int * track); | |
| 300 | |
| 301 /** Query the time stamp in nanoseconds of @a packet. | |
| 302 @param packet Packet initialized by #nestegg_read_packet. | |
| 303 @param tstamp Storage for the queried timestamp in nanoseconds. | |
| 304 @retval 0 Success. | |
| 305 @retval -1 Error. */ | |
| 306 int nestegg_packet_tstamp(nestegg_packet * packet, uint64_t * tstamp); | |
| 307 | |
| 308 /** Query the number of data chunks contained in @a packet. | |
| 309 @param packet Packet initialized by #nestegg_read_packet. | |
| 310 @param count Storage for the queried timestamp in nanoseconds. | |
| 311 @retval 0 Success. | |
| 312 @retval -1 Error. */ | |
| 313 int nestegg_packet_count(nestegg_packet * packet, unsigned int * count); | |
| 314 | |
| 315 /** Get a pointer to chunk number @a item of packet data. | |
| 316 @param packet Packet initialized by #nestegg_read_packet. | |
| 317 @param item Zero based chunk item number. | |
| 318 @param data Storage for the queried data pointer. | |
| 319 The data is owned by the #nestegg_packet packet. | |
| 320 @param length Storage for the queried data size. | |
| 321 @retval 0 Success. | |
| 322 @retval -1 Error. */ | |
| 323 int nestegg_packet_data(nestegg_packet * packet, unsigned int item, | |
| 324 unsigned char ** data, size_t * length); | |
| 325 | |
| 326 /** Returns discard_padding for given packet | |
| 327 @param packet Packet initialized by #nestegg_read_packet. | |
| 328 @param discard_padding pointer to store discard padding in. | |
| 329 @retval 0 Success. | |
| 330 @retval -1 Error. */ | |
| 331 int nestegg_packet_discard_padding(nestegg_packet * packet, | |
| 332 int64_t * discard_padding); | |
| 333 | |
| 334 /** Query the presence of cues. | |
| 335 @param context Stream context initialized by #nestegg_init. | |
| 336 @retval 0 The media has no cues. | |
| 337 @retval 1 The media has cues. */ | |
| 338 int nestegg_has_cues(nestegg * context); | |
| 339 | |
| 340 /** | |
| 341 * Try to determine if the buffer looks like the beginning of a WebM file. | |
| 342 * | |
| 343 * @param buffer A buffer containing the beginning of a media file. | |
| 344 * @param length The size of the buffer. | |
| 345 * @retval 0 The file is not a WebM file. | |
| 346 * @retval 1 The file is a WebM file. */ | |
| 347 int nestegg_sniff(unsigned char const * buffer, size_t length); | |
| 348 | |
| 349 #if defined(__cplusplus) | |
| 350 } | |
| 351 #endif | |
| 352 | |
| 353 #endif /* NESTEGG_671cac2a_365d_ed69_d7a3_4491d3538d79 */ | |
| OLD | NEW |