1538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber/*
2538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber * Copyright © 2010 Mozilla Foundation
3538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber *
4538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber * This program is made available under an ISC-style license.  See the
5538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber * accompanying file LICENSE for details.
6538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber */
7538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber#ifndef   NESTEGG_671cac2a_365d_ed69_d7a3_4491d3538d79
8538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber#define   NESTEGG_671cac2a_365d_ed69_d7a3_4491d3538d79
9538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber
10538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber#include "vpx/vpx_integer.h"
11538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber
12538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber#ifdef __cplusplus
13538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huberextern "C" {
14538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber#endif
15538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber
16538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber/** @mainpage
17538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber
18538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber    @section intro Introduction
19538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber
20538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber    This is the documentation fot the <tt>libnestegg</tt> C API.
21538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber    <tt>libnestegg</tt> is a demultiplexing library for <a
22538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber    href="http://www.matroska.org/">Matroska</a> and <a
23538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber    href="http://www.webmproject.org/">WebMedia</a> media files.
24538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber
25538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber    @section example Example code
26538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber
27538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber    @code
28538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber    nestegg * demux_ctx;
29538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber    nestegg_init(&demux_ctx, io, NULL);
30538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber
31538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber    nestegg_packet * pkt;
32538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber    while ((r = nestegg_read_packet(demux_ctx, &pkt)) > 0) {
33538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber      unsigned int track;
34538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber
35538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber      nestegg_packet_track(pkt, &track);
36538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber
37538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber      // This example decodes the first track only.
38538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber      if (track == 0) {
39538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber        unsigned int chunk, chunks;
40538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber
41538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber        nestegg_packet_count(pkt, &chunks);
42538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber
43538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber        // Decode each chunk of data.
44538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber        for (chunk = 0; chunk < chunks; ++chunk) {
45538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber          unsigned char * data;
46538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber          size_t data_size;
47538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber
48538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber          nestegg_packet_data(pkt, chunk, &data, &data_size);
49538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber
50538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber          example_codec_decode(codec_ctx, data, data_size);
51538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber        }
52538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber      }
53538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber
54538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber      nestegg_free_packet(pkt);
55538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber    }
56538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber
57538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber    nestegg_destroy(demux_ctx);
58538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber    @endcode
59538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber*/
60538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber
61538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber
62538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber/** @file
63538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber    The <tt>libnestegg</tt> C API. */
64538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber
65538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber#define NESTEGG_TRACK_VIDEO 0 /**< Track is of type video. */
66538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber#define NESTEGG_TRACK_AUDIO 1 /**< Track is of type audio. */
67538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber
68538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber#define NESTEGG_CODEC_VP8    0 /**< Track uses Google On2 VP8 codec. */
69538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber#define NESTEGG_CODEC_VORBIS 1 /**< Track uses Xiph Vorbis codec. */
70538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber
71538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber#define NESTEGG_SEEK_SET 0 /**< Seek offset relative to beginning of stream. */
72538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber#define NESTEGG_SEEK_CUR 1 /**< Seek offset relative to current position in stream. */
73538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber#define NESTEGG_SEEK_END 2 /**< Seek offset relative to end of stream. */
74538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber
75538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber#define NESTEGG_LOG_DEBUG    1     /**< Debug level log message. */
76538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber#define NESTEGG_LOG_INFO     10    /**< Informational level log message. */
77538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber#define NESTEGG_LOG_WARNING  100   /**< Warning level log message. */
78538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber#define NESTEGG_LOG_ERROR    1000  /**< Error level log message. */
79538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber#define NESTEGG_LOG_CRITICAL 10000 /**< Critical level log message. */
80538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber
81538f6170b788de7408b06efc6613dc98579aa6a6Andreas Hubertypedef struct nestegg nestegg;               /**< Opaque handle referencing the stream state. */
82538f6170b788de7408b06efc6613dc98579aa6a6Andreas Hubertypedef struct nestegg_packet nestegg_packet; /**< Opaque handle referencing a packet of data. */
83538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber
84538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber/** User supplied IO context. */
85538f6170b788de7408b06efc6613dc98579aa6a6Andreas Hubertypedef struct {
86538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber  /** User supplied read callback.
87538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber      @param buffer   Buffer to read data into.
88538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber      @param length   Length of supplied buffer in bytes.
89538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber      @param userdata The #userdata supplied by the user.
90538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber      @retval  1 Read succeeded.
91538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber      @retval  0 End of stream.
92538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber      @retval -1 Error. */
93538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber  int (* read)(void * buffer, size_t length, void * userdata);
94538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber
95538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber  /** User supplied seek callback.
96538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber      @param offset   Offset within the stream to seek to.
97538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber      @param whence   Seek direction.  One of #NESTEGG_SEEK_SET,
98538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber                      #NESTEGG_SEEK_CUR, or #NESTEGG_SEEK_END.
99538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber      @param userdata The #userdata supplied by the user.
100538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber      @retval  0 Seek succeeded.
101538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber      @retval -1 Error. */
102538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber  int (* seek)(int64_t offset, int whence, void * userdata);
103538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber
104538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber  /** User supplied tell callback.
105538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber      @param userdata The #userdata supplied by the user.
106538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber      @returns Current position within the stream.
107538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber      @retval -1 Error. */
108538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber  int64_t (* tell)(void * userdata);
109538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber
110538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber  /** User supplied pointer to be passed to the IO callbacks. */
111538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber  void * userdata;
112538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber} nestegg_io;
113538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber
114538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber/** Parameters specific to a video track. */
115538f6170b788de7408b06efc6613dc98579aa6a6Andreas Hubertypedef struct {
116538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber  unsigned int width;          /**< Width of the video frame in pixels. */
117538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber  unsigned int height;         /**< Height of the video frame in pixels. */
118538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber  unsigned int display_width;  /**< Display width of the video frame in pixels. */
119538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber  unsigned int display_height; /**< Display height of the video frame in pixels. */
120538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber  unsigned int crop_bottom;    /**< Pixels to crop from the bottom of the frame. */
121538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber  unsigned int crop_top;       /**< Pixels to crop from the top of the frame. */
122538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber  unsigned int crop_left;      /**< Pixels to crop from the left of the frame. */
123538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber  unsigned int crop_right;     /**< Pixels to crop from the right of the frame. */
124538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber} nestegg_video_params;
125538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber
126538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber/** Parameters specific to an audio track. */
127538f6170b788de7408b06efc6613dc98579aa6a6Andreas Hubertypedef struct {
128538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber  double rate;           /**< Sampling rate in Hz. */
129538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber  unsigned int channels; /**< Number of audio channels. */
130538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber  unsigned int depth;    /**< Bits per sample. */
131538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber} nestegg_audio_params;
132538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber
133538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber/** Logging callback function pointer. */
134538f6170b788de7408b06efc6613dc98579aa6a6Andreas Hubertypedef void (* nestegg_log)(nestegg * context, unsigned int severity, char const * format, ...);
135538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber
136538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber/** Initialize a nestegg context.  During initialization the parser will
137538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber    read forward in the stream processing all elements until the first
138538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber    block of media is reached.  All track metadata has been processed at this point.
139538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber    @param context  Storage for the new nestegg context.  @see nestegg_destroy
140538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber    @param io       User supplied IO context.
141538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber    @param callback Optional logging callback function pointer.  May be NULL.
142538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber    @retval  0 Success.
143538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber    @retval -1 Error. */
144538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huberint nestegg_init(nestegg ** context, nestegg_io io, nestegg_log callback);
145538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber
146538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber/** Destroy a nestegg context and free associated memory.
147538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber    @param context #nestegg context to be freed.  @see nestegg_init */
148538f6170b788de7408b06efc6613dc98579aa6a6Andreas Hubervoid nestegg_destroy(nestegg * context);
149538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber
150538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber/** Query the duration of the media stream in nanoseconds.
151538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber    @param context  Stream context initialized by #nestegg_init.
152538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber    @param duration Storage for the queried duration.
153538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber    @retval  0 Success.
154538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber    @retval -1 Error. */
155538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huberint nestegg_duration(nestegg * context, uint64_t * duration);
156538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber
157538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber/** Query the tstamp scale of the media stream in nanoseconds.
158538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber    Timecodes presented by nestegg have been scaled by this value
159538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber    before presentation to the caller.
160538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber    @param context Stream context initialized by #nestegg_init.
161538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber    @param scale   Storage for the queried scale factor.
162538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber    @retval  0 Success.
163538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber    @retval -1 Error. */
164538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huberint nestegg_tstamp_scale(nestegg * context, uint64_t * scale);
165538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber
166538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber/** Query the number of tracks in the media stream.
167538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber    @param context Stream context initialized by #nestegg_init.
168538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber    @param tracks  Storage for the queried track count.
169538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber    @retval  0 Success.
170538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber    @retval -1 Error. */
171538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huberint nestegg_track_count(nestegg * context, unsigned int * tracks);
172538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber
173538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber/** Seek @a track to @a tstamp.  Stream seek will terminate at the earliest
174538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber    key point in the stream at or before @a tstamp.  Other tracks in the
175538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber    stream will output packets with unspecified but nearby timestamps.
176538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber    @param context Stream context initialized by #nestegg_init.
177538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber    @param track   Zero based track number.
178538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber    @param tstamp  Absolute timestamp in nanoseconds.
179538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber    @retval  0 Success.
180538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber    @retval -1 Error. */
181538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huberint nestegg_track_seek(nestegg * context, unsigned int track, uint64_t tstamp);
182538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber
183538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber/** Query the type specified by @a track.
184538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber    @param context Stream context initialized by #nestegg_init.
185538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber    @param track   Zero based track number.
186538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber    @retval #NESTEGG_TRACK_VIDEO Track type is video.
187538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber    @retval #NESTEGG_TRACK_AUDIO Track type is audio.
188538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber    @retval -1 Error. */
189538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huberint nestegg_track_type(nestegg * context, unsigned int track);
190538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber
191538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber/** Query the codec ID specified by @a track.
192538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber    @param context Stream context initialized by #nestegg_init.
193538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber    @param track   Zero based track number.
194538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber    @retval #NESTEGG_CODEC_VP8    Track codec is VP8.
195538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber    @retval #NESTEGG_CODEC_VORBIS Track codec is Vorbis.
196538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber    @retval -1 Error. */
197538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huberint nestegg_track_codec_id(nestegg * context, unsigned int track);
198538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber
199538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber/** Query the number of codec initialization chunks for @a track.  Each
200538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber    chunk of data should be passed to the codec initialization functions in
201538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber    the order returned.
202538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber    @param context Stream context initialized by #nestegg_init.
203538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber    @param track   Zero based track number.
204538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber    @param count   Storage for the queried chunk count.
205538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber    @retval  0 Success.
206538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber    @retval -1 Error. */
207538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huberint nestegg_track_codec_data_count(nestegg * context, unsigned int track,
208538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber                                   unsigned int * count);
209538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber
210538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber/** Get a pointer to chunk number @a item of codec initialization data for
211538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber    @a track.
212538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber    @param context Stream context initialized by #nestegg_init.
213538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber    @param track   Zero based track number.
214538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber    @param item    Zero based chunk item number.
215538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber    @param data    Storage for the queried data pointer.
216538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber                   The data is owned by the #nestegg context.
217538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber    @param length  Storage for the queried data size.
218538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber    @retval  0 Success.
219538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber    @retval -1 Error. */
220538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huberint nestegg_track_codec_data(nestegg * context, unsigned int track, unsigned int item,
221538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber                             unsigned char ** data, size_t * length);
222538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber
223538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber/** Query the video parameters specified by @a track.
224538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber    @param context Stream context initialized by #nestegg_init.
225538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber    @param track   Zero based track number.
226538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber    @param params  Storage for the queried video parameters.
227538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber    @retval  0 Success.
228538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber    @retval -1 Error. */
229538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huberint nestegg_track_video_params(nestegg * context, unsigned int track,
230538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber                               nestegg_video_params * params);
231538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber
232538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber/** Query the audio parameters specified by @a track.
233538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber    @param context Stream context initialized by #nestegg_init.
234538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber    @param track   Zero based track number.
235538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber    @param params  Storage for the queried audio parameters.
236538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber    @retval  0 Success.
237538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber    @retval -1 Error. */
238538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huberint nestegg_track_audio_params(nestegg * context, unsigned int track,
239538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber                               nestegg_audio_params * params);
240538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber
241538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber/** Read a packet of media data.  A packet consists of one or more chunks of
242538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber    data associated with a single track.  nestegg_read_packet should be
243538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber    called in a loop while the return value is 1 to drive the stream parser
244538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber    forward.  @see nestegg_free_packet
245538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber    @param context Context returned by #nestegg_init.
246538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber    @param packet  Storage for the returned nestegg_packet.
247538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber    @retval  1 Additional packets may be read in subsequent calls.
248538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber    @retval  0 End of stream.
249538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber    @retval -1 Error. */
250538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huberint nestegg_read_packet(nestegg * context, nestegg_packet ** packet);
251538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber
252538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber/** Destroy a nestegg_packet and free associated memory.
253538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber    @param packet #nestegg_packet to be freed. @see nestegg_read_packet */
254538f6170b788de7408b06efc6613dc98579aa6a6Andreas Hubervoid nestegg_free_packet(nestegg_packet * packet);
255538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber
256538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber/** Query the track number of @a packet.
257538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber    @param packet Packet initialized by #nestegg_read_packet.
258538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber    @param track  Storage for the queried zero based track index.
259538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber    @retval  0 Success.
260538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber    @retval -1 Error. */
261538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huberint nestegg_packet_track(nestegg_packet * packet, unsigned int * track);
262538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber
263538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber/** Query the time stamp in nanoseconds of @a packet.
264538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber    @param packet Packet initialized by #nestegg_read_packet.
265538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber    @param tstamp Storage for the queried timestamp in nanoseconds.
266538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber    @retval  0 Success.
267538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber    @retval -1 Error. */
268538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huberint nestegg_packet_tstamp(nestegg_packet * packet, uint64_t * tstamp);
269538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber
270538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber/** Query the number of data chunks contained in @a packet.
271538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber    @param packet Packet initialized by #nestegg_read_packet.
272538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber    @param count  Storage for the queried timestamp in nanoseconds.
273538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber    @retval  0 Success.
274538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber    @retval -1 Error. */
275538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huberint nestegg_packet_count(nestegg_packet * packet, unsigned int * count);
276538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber
277538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber/** Get a pointer to chunk number @a item of packet data.
278538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber    @param packet  Packet initialized by #nestegg_read_packet.
279538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber    @param item    Zero based chunk item number.
280538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber    @param data    Storage for the queried data pointer.
281538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber                   The data is owned by the #nestegg_packet packet.
282538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber    @param length  Storage for the queried data size.
283538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber    @retval  0 Success.
284538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber    @retval -1 Error. */
285538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huberint nestegg_packet_data(nestegg_packet * packet, unsigned int item,
286538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber                        unsigned char ** data, size_t * length);
287538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber
288538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber#ifdef __cplusplus
289538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber}
290538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber#endif
291538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber
292538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber#endif /* NESTEGG_671cac2a_365d_ed69_d7a3_4491d3538d79 */
293