1 /******************************************************************** |
|
2 * * |
|
3 * THIS FILE IS PART OF THE OggVorbis 'TREMOR' CODEC SOURCE CODE. * |
|
4 * * |
|
5 * USE, DISTRIBUTION AND REPRODUCTION OF THIS LIBRARY SOURCE IS * |
|
6 * GOVERNED BY A BSD-STYLE SOURCE LICENSE INCLUDED WITH THIS SOURCE * |
|
7 * IN 'COPYING'. PLEASE READ THESE TERMS BEFORE DISTRIBUTING. * |
|
8 * * |
|
9 * THE OggVorbis 'TREMOR' SOURCE CODE IS (C) COPYRIGHT 1994-2002 * |
|
10 * BY THE Xiph.Org FOUNDATION http://www.xiph.org/ * |
|
11 * * |
|
12 ******************************************************************** |
|
13 |
|
14 function: stdio-based convenience library for opening/seeking/decoding |
|
15 |
|
16 ********************************************************************/ |
|
17 |
|
18 #ifndef _OV_FILE_H_ |
|
19 #define _OV_FILE_H_ |
|
20 |
|
21 #ifdef __cplusplus |
|
22 extern "C" |
|
23 { |
|
24 #endif /* __cplusplus */ |
|
25 |
|
26 #include <stdio.h> |
|
27 #include "ivorbiscodec.h" |
|
28 |
|
29 #define CHUNKSIZE 1024 |
|
30 /* The function prototypes for the callbacks are basically the same as for |
|
31 * the stdio functions fread, fseek, fclose, ftell. |
|
32 * The one difference is that the FILE * arguments have been replaced with |
|
33 * a void * - this is to be used as a pointer to whatever internal data these |
|
34 * functions might need. In the stdio case, it's just a FILE * cast to a void * |
|
35 * |
|
36 * If you use other functions, check the docs for these functions and return |
|
37 * the right values. For seek_func(), you *MUST* return -1 if the stream is |
|
38 * unseekable |
|
39 */ |
|
40 typedef struct { |
|
41 size_t (*read_func) (void *ptr, size_t size, size_t nmemb, void *datasource); |
|
42 int (*seek_func) (void *datasource, ogg_int64_t offset, int whence); |
|
43 int (*close_func) (void *datasource); |
|
44 long (*tell_func) (void *datasource); |
|
45 } ov_callbacks; |
|
46 |
|
47 #define NOTOPEN 0 |
|
48 #define PARTOPEN 1 |
|
49 #define OPENED 2 |
|
50 #define STREAMSET 3 |
|
51 #define INITSET 4 |
|
52 |
|
53 typedef struct OggVorbis_File { |
|
54 void *datasource; /* Pointer to a FILE *, etc. */ |
|
55 int seekable; |
|
56 ogg_int64_t offset; |
|
57 ogg_int64_t end; |
|
58 ogg_sync_state *oy; |
|
59 |
|
60 /* If the FILE handle isn't seekable (eg, a pipe), only the current |
|
61 stream appears */ |
|
62 int links; |
|
63 ogg_int64_t *offsets; |
|
64 ogg_int64_t *dataoffsets; |
|
65 ogg_uint32_t *serialnos; |
|
66 ogg_int64_t *pcmlengths; |
|
67 vorbis_info *vi; |
|
68 vorbis_comment *vc; |
|
69 |
|
70 /* Decoding working state local storage */ |
|
71 ogg_int64_t pcm_offset; |
|
72 int ready_state; |
|
73 ogg_uint32_t current_serialno; |
|
74 int current_link; |
|
75 |
|
76 ogg_int64_t bittrack; |
|
77 ogg_int64_t samptrack; |
|
78 |
|
79 ogg_stream_state *os; /* take physical pages, weld into a logical |
|
80 stream of packets */ |
|
81 vorbis_dsp_state vd; /* central working state for the packet->PCM decoder */ |
|
82 vorbis_block vb; /* local working space for packet->PCM decode */ |
|
83 |
|
84 ov_callbacks callbacks; |
|
85 |
|
86 } OggVorbis_File; |
|
87 |
|
88 extern int ov_clear(OggVorbis_File *vf); |
|
89 extern int ov_open(FILE *f,OggVorbis_File *vf,char *initial,long ibytes); |
|
90 extern int ov_open_callbacks(void *datasource, OggVorbis_File *vf, |
|
91 char *initial, long ibytes, ov_callbacks callbacks); |
|
92 |
|
93 extern int ov_test(FILE *f,OggVorbis_File *vf,char *initial,long ibytes); |
|
94 extern int ov_test_callbacks(void *datasource, OggVorbis_File *vf, |
|
95 char *initial, long ibytes, ov_callbacks callbacks); |
|
96 extern int ov_test_open(OggVorbis_File *vf); |
|
97 |
|
98 extern long ov_bitrate(OggVorbis_File *vf,int i); |
|
99 extern long ov_bitrate_instant(OggVorbis_File *vf); |
|
100 extern long ov_streams(OggVorbis_File *vf); |
|
101 extern long ov_seekable(OggVorbis_File *vf); |
|
102 extern long ov_serialnumber(OggVorbis_File *vf,int i); |
|
103 |
|
104 extern ogg_int64_t ov_raw_total(OggVorbis_File *vf,int i); |
|
105 extern ogg_int64_t ov_pcm_total(OggVorbis_File *vf,int i); |
|
106 extern ogg_int64_t ov_time_total(OggVorbis_File *vf,int i); |
|
107 |
|
108 extern int ov_raw_seek(OggVorbis_File *vf,ogg_int64_t pos); |
|
109 extern int ov_pcm_seek(OggVorbis_File *vf,ogg_int64_t pos); |
|
110 extern int ov_pcm_seek_page(OggVorbis_File *vf,ogg_int64_t pos); |
|
111 extern int ov_time_seek(OggVorbis_File *vf,ogg_int64_t pos); |
|
112 extern int ov_time_seek_page(OggVorbis_File *vf,ogg_int64_t pos); |
|
113 |
|
114 extern ogg_int64_t ov_raw_tell(OggVorbis_File *vf); |
|
115 extern ogg_int64_t ov_pcm_tell(OggVorbis_File *vf); |
|
116 extern ogg_int64_t ov_time_tell(OggVorbis_File *vf); |
|
117 |
|
118 extern vorbis_info *ov_info(OggVorbis_File *vf,int link); |
|
119 extern vorbis_comment *ov_comment(OggVorbis_File *vf,int link); |
|
120 |
|
121 extern long ov_read(OggVorbis_File *vf,char *buffer,int length, |
|
122 int *bitstream); |
|
123 |
|
124 #ifdef __cplusplus |
|
125 } |
|
126 #endif /* __cplusplus */ |
|
127 |
|
128 #endif |
|
129 |
|
130 |
|