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. */
70ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang#define NESTEGG_CODEC_VP9    2 /**< Track uses Google On2 VP9 codec. */
71538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber
72538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber#define NESTEGG_SEEK_SET 0 /**< Seek offset relative to beginning of stream. */
73538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber#define NESTEGG_SEEK_CUR 1 /**< Seek offset relative to current position in stream. */
74538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber#define NESTEGG_SEEK_END 2 /**< Seek offset relative to end of stream. */
75538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber
76538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber#define NESTEGG_LOG_DEBUG    1     /**< Debug level log message. */
77538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber#define NESTEGG_LOG_INFO     10    /**< Informational level log message. */
78538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber#define NESTEGG_LOG_WARNING  100   /**< Warning level log message. */
79538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber#define NESTEGG_LOG_ERROR    1000  /**< Error level log message. */
80538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber#define NESTEGG_LOG_CRITICAL 10000 /**< Critical level log message. */
81538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber
82538f6170b788de7408b06efc6613dc98579aa6a6Andreas Hubertypedef struct nestegg nestegg;               /**< Opaque handle referencing the stream state. */
83538f6170b788de7408b06efc6613dc98579aa6a6Andreas Hubertypedef struct nestegg_packet nestegg_packet; /**< Opaque handle referencing a packet of data. */
84538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber
85538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber/** User supplied IO context. */
86538f6170b788de7408b06efc6613dc98579aa6a6Andreas Hubertypedef struct {
87538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber  /** User supplied read callback.
88538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber      @param buffer   Buffer to read data into.
89538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber      @param length   Length of supplied buffer in bytes.
90538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber      @param userdata The #userdata supplied by the user.
91538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber      @retval  1 Read succeeded.
92538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber      @retval  0 End of stream.
93538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber      @retval -1 Error. */
94538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber  int (* read)(void * buffer, size_t length, void * userdata);
95538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber
96538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber  /** User supplied seek callback.
97538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber      @param offset   Offset within the stream to seek to.
98538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber      @param whence   Seek direction.  One of #NESTEGG_SEEK_SET,
99538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber                      #NESTEGG_SEEK_CUR, or #NESTEGG_SEEK_END.
100538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber      @param userdata The #userdata supplied by the user.
101538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber      @retval  0 Seek succeeded.
102538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber      @retval -1 Error. */
103538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber  int (* seek)(int64_t offset, int whence, void * userdata);
104538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber
105538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber  /** User supplied tell callback.
106538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber      @param userdata The #userdata supplied by the user.
107538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber      @returns Current position within the stream.
108538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber      @retval -1 Error. */
109538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber  int64_t (* tell)(void * userdata);
110538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber
111538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber  /** User supplied pointer to be passed to the IO callbacks. */
112538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber  void * userdata;
113538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber} nestegg_io;
114538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber
115538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber/** Parameters specific to a video track. */
116538f6170b788de7408b06efc6613dc98579aa6a6Andreas Hubertypedef struct {
117538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber  unsigned int width;          /**< Width of the video frame in pixels. */
118538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber  unsigned int height;         /**< Height of the video frame in pixels. */
119538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber  unsigned int display_width;  /**< Display width of the video frame in pixels. */
120538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber  unsigned int display_height; /**< Display height of the video frame in pixels. */
121538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber  unsigned int crop_bottom;    /**< Pixels to crop from the bottom of the frame. */
122538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber  unsigned int crop_top;       /**< Pixels to crop from the top of the frame. */
123538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber  unsigned int crop_left;      /**< Pixels to crop from the left of the frame. */
124538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber  unsigned int crop_right;     /**< Pixels to crop from the right of the frame. */
125538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber} nestegg_video_params;
126538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber
127538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber/** Parameters specific to an audio track. */
128538f6170b788de7408b06efc6613dc98579aa6a6Andreas Hubertypedef struct {
129538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber  double rate;           /**< Sampling rate in Hz. */
130538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber  unsigned int channels; /**< Number of audio channels. */
131538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber  unsigned int depth;    /**< Bits per sample. */
132538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber} nestegg_audio_params;
133538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber
134538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber/** Logging callback function pointer. */
135538f6170b788de7408b06efc6613dc98579aa6a6Andreas Hubertypedef void (* nestegg_log)(nestegg * context, unsigned int severity, char const * format, ...);
136538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber
137538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber/** Initialize a nestegg context.  During initialization the parser will
138538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber    read forward in the stream processing all elements until the first
139538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber    block of media is reached.  All track metadata has been processed at this point.
140538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber    @param context  Storage for the new nestegg context.  @see nestegg_destroy
141538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber    @param io       User supplied IO context.
142538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber    @param callback Optional logging callback function pointer.  May be NULL.
143538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber    @retval  0 Success.
144538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber    @retval -1 Error. */
145538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huberint nestegg_init(nestegg ** context, nestegg_io io, nestegg_log callback);
146538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber
147538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber/** Destroy a nestegg context and free associated memory.
148538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber    @param context #nestegg context to be freed.  @see nestegg_init */
149538f6170b788de7408b06efc6613dc98579aa6a6Andreas Hubervoid nestegg_destroy(nestegg * context);
150538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber
151538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber/** Query the duration of the media stream in nanoseconds.
152538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber    @param context  Stream context initialized by #nestegg_init.
153538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber    @param duration Storage for the queried duration.
154538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber    @retval  0 Success.
155538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber    @retval -1 Error. */
156538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huberint nestegg_duration(nestegg * context, uint64_t * duration);
157538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber
158538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber/** Query the tstamp scale of the media stream in nanoseconds.
159538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber    Timecodes presented by nestegg have been scaled by this value
160538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber    before presentation to the caller.
161538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber    @param context Stream context initialized by #nestegg_init.
162538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber    @param scale   Storage for the queried scale factor.
163538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber    @retval  0 Success.
164538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber    @retval -1 Error. */
165538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huberint nestegg_tstamp_scale(nestegg * context, uint64_t * scale);
166538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber
167538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber/** Query the number of tracks in the media stream.
168538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber    @param context Stream context initialized by #nestegg_init.
169538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber    @param tracks  Storage for the queried track count.
170538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber    @retval  0 Success.
171538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber    @retval -1 Error. */
172538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huberint nestegg_track_count(nestegg * context, unsigned int * tracks);
173538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber
174538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber/** Seek @a track to @a tstamp.  Stream seek will terminate at the earliest
175538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber    key point in the stream at or before @a tstamp.  Other tracks in the
176538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber    stream will output packets with unspecified but nearby timestamps.
177538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber    @param context Stream context initialized by #nestegg_init.
178538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber    @param track   Zero based track number.
179538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber    @param tstamp  Absolute timestamp in nanoseconds.
180538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber    @retval  0 Success.
181538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber    @retval -1 Error. */
182538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huberint nestegg_track_seek(nestegg * context, unsigned int track, uint64_t tstamp);
183538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber
184538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber/** Query the type specified by @a track.
185538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber    @param context Stream context initialized by #nestegg_init.
186538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber    @param track   Zero based track number.
187538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber    @retval #NESTEGG_TRACK_VIDEO Track type is video.
188538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber    @retval #NESTEGG_TRACK_AUDIO Track type is audio.
189538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber    @retval -1 Error. */
190538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huberint nestegg_track_type(nestegg * context, unsigned int track);
191538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber
192538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber/** Query the codec ID specified by @a track.
193538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber    @param context Stream context initialized by #nestegg_init.
194538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber    @param track   Zero based track number.
195538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber    @retval #NESTEGG_CODEC_VP8    Track codec is VP8.
196538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber    @retval #NESTEGG_CODEC_VORBIS Track codec is Vorbis.
197538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber    @retval -1 Error. */
198538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huberint nestegg_track_codec_id(nestegg * context, unsigned int track);
199538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber
200538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber/** Query the number of codec initialization chunks for @a track.  Each
201538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber    chunk of data should be passed to the codec initialization functions in
202538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber    the order returned.
203538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber    @param context Stream context initialized by #nestegg_init.
204538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber    @param track   Zero based track number.
205538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber    @param count   Storage for the queried chunk count.
206538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber    @retval  0 Success.
207538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber    @retval -1 Error. */
208538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huberint nestegg_track_codec_data_count(nestegg * context, unsigned int track,
209538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber                                   unsigned int * count);
210538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber
211538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber/** Get a pointer to chunk number @a item of codec initialization data for
212538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber    @a track.
213538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber    @param context Stream context initialized by #nestegg_init.
214538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber    @param track   Zero based track number.
215538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber    @param item    Zero based chunk item number.
216538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber    @param data    Storage for the queried data pointer.
217538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber                   The data is owned by the #nestegg context.
218538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber    @param length  Storage for the queried data size.
219538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber    @retval  0 Success.
220538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber    @retval -1 Error. */
221538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huberint nestegg_track_codec_data(nestegg * context, unsigned int track, unsigned int item,
222538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber                             unsigned char ** data, size_t * length);
223538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber
224538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber/** Query the video parameters specified by @a track.
225538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber    @param context Stream context initialized by #nestegg_init.
226538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber    @param track   Zero based track number.
227538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber    @param params  Storage for the queried video parameters.
228538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber    @retval  0 Success.
229538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber    @retval -1 Error. */
230538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huberint nestegg_track_video_params(nestegg * context, unsigned int track,
231538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber                               nestegg_video_params * params);
232538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber
233538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber/** Query the audio parameters specified by @a track.
234538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber    @param context Stream context initialized by #nestegg_init.
235538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber    @param track   Zero based track number.
236538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber    @param params  Storage for the queried audio parameters.
237538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber    @retval  0 Success.
238538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber    @retval -1 Error. */
239538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huberint nestegg_track_audio_params(nestegg * context, unsigned int track,
240538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber                               nestegg_audio_params * params);
241538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber
242538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber/** Read a packet of media data.  A packet consists of one or more chunks of
243538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber    data associated with a single track.  nestegg_read_packet should be
244538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber    called in a loop while the return value is 1 to drive the stream parser
245538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber    forward.  @see nestegg_free_packet
246538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber    @param context Context returned by #nestegg_init.
247538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber    @param packet  Storage for the returned nestegg_packet.
248538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber    @retval  1 Additional packets may be read in subsequent calls.
249538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber    @retval  0 End of stream.
250538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber    @retval -1 Error. */
251538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huberint nestegg_read_packet(nestegg * context, nestegg_packet ** packet);
252538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber
253538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber/** Destroy a nestegg_packet and free associated memory.
254538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber    @param packet #nestegg_packet to be freed. @see nestegg_read_packet */
255538f6170b788de7408b06efc6613dc98579aa6a6Andreas Hubervoid nestegg_free_packet(nestegg_packet * packet);
256538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber
257538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber/** Query the track number of @a packet.
258538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber    @param packet Packet initialized by #nestegg_read_packet.
259538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber    @param track  Storage for the queried zero based track index.
260538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber    @retval  0 Success.
261538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber    @retval -1 Error. */
262538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huberint nestegg_packet_track(nestegg_packet * packet, unsigned int * track);
263538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber
264538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber/** Query the time stamp in nanoseconds of @a packet.
265538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber    @param packet Packet initialized by #nestegg_read_packet.
266538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber    @param tstamp Storage for the queried timestamp in nanoseconds.
267538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber    @retval  0 Success.
268538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber    @retval -1 Error. */
269538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huberint nestegg_packet_tstamp(nestegg_packet * packet, uint64_t * tstamp);
270538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber
271538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber/** Query the number of data chunks contained in @a packet.
272538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber    @param packet Packet initialized by #nestegg_read_packet.
273538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber    @param count  Storage for the queried timestamp in nanoseconds.
274538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber    @retval  0 Success.
275538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber    @retval -1 Error. */
276538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huberint nestegg_packet_count(nestegg_packet * packet, unsigned int * count);
277538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber
278538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber/** Get a pointer to chunk number @a item of packet data.
279538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber    @param packet  Packet initialized by #nestegg_read_packet.
280538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber    @param item    Zero based chunk item number.
281538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber    @param data    Storage for the queried data pointer.
282538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber                   The data is owned by the #nestegg_packet packet.
283538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber    @param length  Storage for the queried data size.
284538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber    @retval  0 Success.
285538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber    @retval -1 Error. */
286538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huberint nestegg_packet_data(nestegg_packet * packet, unsigned int item,
287538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber                        unsigned char ** data, size_t * length);
288538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber
289538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber#ifdef __cplusplus
290538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber}
291538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber#endif
292538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber
293538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber#endif /* NESTEGG_671cac2a_365d_ed69_d7a3_4491d3538d79 */
294