summaryrefslogtreecommitdiff
authorllornkcor <llornkcor>2002-04-20 20:11:06 (UTC)
committer llornkcor <llornkcor>2002-04-20 20:11:06 (UTC)
commit99904a1df601bb5d1c0e6d43a3e04a63fe13cf51 (patch) (unidiff)
tree51ea12679f08c7007bf5367fa4b6cede2d4fc187
parent5d70d17bf478808387cf6e555cc1a65777e6399a (diff)
downloadopie-99904a1df601bb5d1c0e6d43a3e04a63fe13cf51.zip
opie-99904a1df601bb5d1c0e6d43a3e04a63fe13cf51.tar.gz
opie-99904a1df601bb5d1c0e6d43a3e04a63fe13cf51.tar.bz2
removed .mp3 files from using libmpeg
Diffstat (more/less context) (ignore whitespace changes)
-rw-r--r--core/multimedia/opieplayer/libmpeg3/libmpeg3.c2
1 files changed, 1 insertions, 1 deletions
diff --git a/core/multimedia/opieplayer/libmpeg3/libmpeg3.c b/core/multimedia/opieplayer/libmpeg3/libmpeg3.c
index c0fc570..acaecf7 100644
--- a/core/multimedia/opieplayer/libmpeg3/libmpeg3.c
+++ b/core/multimedia/opieplayer/libmpeg3/libmpeg3.c
@@ -1,672 +1,672 @@
1#include "libmpeg3.h" 1#include "libmpeg3.h"
2#include "mpeg3protos.h" 2#include "mpeg3protos.h"
3 3
4#include <stdlib.h> 4#include <stdlib.h>
5#include <string.h> 5#include <string.h>
6 6
7#define MAX(a, b) ((a) > (b) ? (a) : (b)) 7#define MAX(a, b) ((a) > (b) ? (a) : (b))
8 8
9mpeg3_t* mpeg3_new(char *path) 9mpeg3_t* mpeg3_new(char *path)
10{ 10{
11 int i; 11 int i;
12 mpeg3_t *file = (mpeg3_t*)calloc(1, sizeof(mpeg3_t)); 12 mpeg3_t *file = (mpeg3_t*)calloc(1, sizeof(mpeg3_t));
13 file->cpus = 1; 13 file->cpus = 1;
14 file->fs = mpeg3_new_fs(path); 14 file->fs = mpeg3_new_fs(path);
15 file->have_mmx = mpeg3_mmx_test(); 15 file->have_mmx = mpeg3_mmx_test();
16 file->demuxer = mpeg3_new_demuxer(file, 0, 0, -1); 16 file->demuxer = mpeg3_new_demuxer(file, 0, 0, -1);
17 return file; 17 return file;
18} 18}
19 19
20int mpeg3_delete(mpeg3_t *file) 20int mpeg3_delete(mpeg3_t *file)
21{ 21{
22 int i; 22 int i;
23 23
24 for(i = 0; i < file->total_vstreams; i++) 24 for(i = 0; i < file->total_vstreams; i++)
25 mpeg3_delete_vtrack(file, file->vtrack[i]); 25 mpeg3_delete_vtrack(file, file->vtrack[i]);
26 26
27 for(i = 0; i < file->total_astreams; i++) 27 for(i = 0; i < file->total_astreams; i++)
28 mpeg3_delete_atrack(file, file->atrack[i]); 28 mpeg3_delete_atrack(file, file->atrack[i]);
29 29
30 mpeg3_delete_fs(file->fs); 30 mpeg3_delete_fs(file->fs);
31 mpeg3_delete_demuxer(file->demuxer); 31 mpeg3_delete_demuxer(file->demuxer);
32 free(file); 32 free(file);
33} 33}
34 34
35int mpeg3_check_sig(char *path) 35int mpeg3_check_sig(char *path)
36{ 36{
37 mpeg3_fs_t *fs; 37 mpeg3_fs_t *fs;
38 unsigned int bits; 38 unsigned int bits;
39 char *ext; 39 char *ext;
40 int result = 0; 40 int result = 0;
41 41
42 fs = mpeg3_new_fs(path); 42 fs = mpeg3_new_fs(path);
43 if(mpeg3io_open_file(fs)) 43 if(mpeg3io_open_file(fs))
44 { 44 {
45/* File not found */ 45/* File not found */
46 return 0; 46 return 0;
47 } 47 }
48 48
49 bits = mpeg3io_read_int32(fs); 49 bits = mpeg3io_read_int32(fs);
50/* Test header */ 50/* Test header */
51 if(bits == MPEG3_TOC_PREFIX || bits == MPEG3_TOC_PREFIXLOWER) 51 if(bits == MPEG3_TOC_PREFIX || bits == MPEG3_TOC_PREFIXLOWER)
52 { 52 {
53 result = 1; 53 result = 1;
54 } 54 }
55 else 55 else
56 if((((bits >> 24) & 0xff) == MPEG3_SYNC_BYTE) || 56 if((((bits >> 24) & 0xff) == MPEG3_SYNC_BYTE) ||
57 (bits == MPEG3_PACK_START_CODE) || 57 (bits == MPEG3_PACK_START_CODE) ||
58 ((bits & 0xfff00000) == 0xfff00000) || 58 ((bits & 0xfff00000) == 0xfff00000) ||
59 (bits == MPEG3_SEQUENCE_START_CODE) || 59 (bits == MPEG3_SEQUENCE_START_CODE) ||
60 (bits == MPEG3_PICTURE_START_CODE) || 60 (bits == MPEG3_PICTURE_START_CODE) ||
61 (((bits & 0xffff0000) >> 16) == MPEG3_AC3_START_CODE) || 61 (((bits & 0xffff0000) >> 16) == MPEG3_AC3_START_CODE) ||
62 ((bits >> 8) == MPEG3_ID3_PREFIX) || 62 ((bits >> 8) == MPEG3_ID3_PREFIX) ||
63 (bits == MPEG3_RIFF_CODE)) 63 (bits == MPEG3_RIFF_CODE))
64 { 64 {
65 result = 1; 65 result = 1;
66 66
67 ext = strrchr(path, '.'); 67 ext = strrchr(path, '.');
68 if(ext) 68 if(ext)
69 { 69 {
70/* Test file extension. */ 70/* Test file extension. */
71 if(strncasecmp(ext, ".mp2", 4) && 71 if(strncasecmp(ext, ".mp2", 4) &&
72 strncasecmp(ext, ".mp3", 4) && 72 // strncasecmp(ext, ".mp3", 4) &&
73 strncasecmp(ext, ".m1v", 4) && 73 strncasecmp(ext, ".m1v", 4) &&
74 strncasecmp(ext, ".m2v", 4) && 74 strncasecmp(ext, ".m2v", 4) &&
75 strncasecmp(ext, ".m2s", 4) && 75 strncasecmp(ext, ".m2s", 4) &&
76 strncasecmp(ext, ".mpg", 4) && 76 strncasecmp(ext, ".mpg", 4) &&
77 strncasecmp(ext, ".vob", 4) && 77 strncasecmp(ext, ".vob", 4) &&
78 strncasecmp(ext, ".mpeg", 4) && 78 strncasecmp(ext, ".mpeg", 4) &&
79 strncasecmp(ext, ".ac3", 4)) 79 strncasecmp(ext, ".ac3", 4))
80 result = 0; 80 result = 0;
81 } 81 }
82 } 82 }
83 83
84 mpeg3io_close_file(fs); 84 mpeg3io_close_file(fs);
85 mpeg3_delete_fs(fs); 85 mpeg3_delete_fs(fs);
86 return result; 86 return result;
87} 87}
88 88
89mpeg3_t* mpeg3_open_copy(char *path, mpeg3_t *old_file) 89mpeg3_t* mpeg3_open_copy(char *path, mpeg3_t *old_file)
90{ 90{
91 mpeg3_t *file = 0; 91 mpeg3_t *file = 0;
92 unsigned int bits; 92 unsigned int bits;
93 int i, done; 93 int i, done;
94 94
95/* Initialize the file structure */ 95/* Initialize the file structure */
96 file = mpeg3_new(path); 96 file = mpeg3_new(path);
97 97
98/* Need to perform authentication before reading a single byte. */ 98/* Need to perform authentication before reading a single byte. */
99 if(mpeg3io_open_file(file->fs)) 99 if(mpeg3io_open_file(file->fs))
100 { 100 {
101 mpeg3_delete(file); 101 mpeg3_delete(file);
102 return 0; 102 return 0;
103 } 103 }
104 104
105/* =============================== Create the title objects ========================= */ 105/* =============================== Create the title objects ========================= */
106 bits = mpeg3io_read_int32(file->fs); 106 bits = mpeg3io_read_int32(file->fs);
107 107
108 if(bits == MPEG3_TOC_PREFIX || bits == MPEG3_TOC_PREFIXLOWER) /* TOCV */ 108 if(bits == MPEG3_TOC_PREFIX || bits == MPEG3_TOC_PREFIXLOWER) /* TOCV */
109 { 109 {
110/* Table of contents for another file */ 110/* Table of contents for another file */
111 if(mpeg3_read_toc(file)) 111 if(mpeg3_read_toc(file))
112 { 112 {
113 mpeg3_delete(file); 113 mpeg3_delete(file);
114 return 0; 114 return 0;
115 } 115 }
116 mpeg3io_close_file(file->fs); 116 mpeg3io_close_file(file->fs);
117 } 117 }
118 else 118 else
119 if(((bits >> 24) & 0xff) == MPEG3_SYNC_BYTE) 119 if(((bits >> 24) & 0xff) == MPEG3_SYNC_BYTE)
120 { 120 {
121/* Transport stream */ 121/* Transport stream */
122 file->packet_size = MPEG3_TS_PACKET_SIZE; 122 file->packet_size = MPEG3_TS_PACKET_SIZE;
123 file->is_transport_stream = 1; 123 file->is_transport_stream = 1;
124 } 124 }
125 else 125 else
126 if(bits == MPEG3_PACK_START_CODE) 126 if(bits == MPEG3_PACK_START_CODE)
127 { 127 {
128/* Program stream */ 128/* Program stream */
129 file->packet_size = MPEG3_DVD_PACKET_SIZE; 129 file->packet_size = MPEG3_DVD_PACKET_SIZE;
130 file->is_program_stream = 1; 130 file->is_program_stream = 1;
131 } 131 }
132 else 132 else
133 if((bits & 0xfff00000) == 0xfff00000 || 133 if((bits & 0xfff00000) == 0xfff00000 ||
134 ((bits >> 8) == MPEG3_ID3_PREFIX) || 134 ((bits >> 8) == MPEG3_ID3_PREFIX) ||
135 (bits == MPEG3_RIFF_CODE)) 135 (bits == MPEG3_RIFF_CODE))
136 { 136 {
137/* MPEG Audio only */ 137/* MPEG Audio only */
138 file->packet_size = MPEG3_DVD_PACKET_SIZE; 138 file->packet_size = MPEG3_DVD_PACKET_SIZE;
139 file->has_audio = 1; 139 file->has_audio = 1;
140 file->is_audio_stream = 1; 140 file->is_audio_stream = 1;
141 } 141 }
142 else 142 else
143 if(bits == MPEG3_SEQUENCE_START_CODE || 143 if(bits == MPEG3_SEQUENCE_START_CODE ||
144 bits == MPEG3_PICTURE_START_CODE) 144 bits == MPEG3_PICTURE_START_CODE)
145 { 145 {
146/* Video only */ 146/* Video only */
147 file->packet_size = MPEG3_DVD_PACKET_SIZE; 147 file->packet_size = MPEG3_DVD_PACKET_SIZE;
148 file->is_video_stream = 1; 148 file->is_video_stream = 1;
149 } 149 }
150 else 150 else
151 if(((bits & 0xffff0000) >> 16) == MPEG3_AC3_START_CODE) 151 if(((bits & 0xffff0000) >> 16) == MPEG3_AC3_START_CODE)
152 { 152 {
153/* AC3 Audio only */ 153/* AC3 Audio only */
154 file->packet_size = MPEG3_DVD_PACKET_SIZE; 154 file->packet_size = MPEG3_DVD_PACKET_SIZE;
155 file->has_audio = 1; 155 file->has_audio = 1;
156 file->is_audio_stream = 1; 156 file->is_audio_stream = 1;
157 } 157 }
158 else 158 else
159 { 159 {
160/* file->packet_size = MPEG3_DVD_PACKET_SIZE; */ 160/* file->packet_size = MPEG3_DVD_PACKET_SIZE; */
161/* file->is_audio_stream = 1; */ 161/* file->is_audio_stream = 1; */
162 mpeg3_delete(file); 162 mpeg3_delete(file);
163 fprintf(stderr, "mpeg3_open: not an MPEG 2 stream\n"); 163 fprintf(stderr, "mpeg3_open: not an MPEG 2 stream\n");
164 return 0; 164 return 0;
165 } 165 }
166 166
167/* Create title */ 167/* Create title */
168/* Copy timecodes from an old demuxer */ 168/* Copy timecodes from an old demuxer */
169 if(old_file && mpeg3_get_demuxer(old_file)) 169 if(old_file && mpeg3_get_demuxer(old_file))
170 { 170 {
171 mpeg3demux_copy_titles(file->demuxer, mpeg3_get_demuxer(old_file)); 171 mpeg3demux_copy_titles(file->demuxer, mpeg3_get_demuxer(old_file));
172 } 172 }
173 else 173 else
174/* Start from scratch */ 174/* Start from scratch */
175 if(!file->demuxer->total_titles) 175 if(!file->demuxer->total_titles)
176 { 176 {
177 mpeg3demux_create_title(file->demuxer, 0, 0); 177 mpeg3demux_create_title(file->demuxer, 0, 0);
178 } 178 }
179 179
180/* =============================== Get title information ========================= */ 180/* =============================== Get title information ========================= */
181 if(file->is_transport_stream || file->is_program_stream) 181 if(file->is_transport_stream || file->is_program_stream)
182 { 182 {
183/* Create video tracks */ 183/* Create video tracks */
184/* Video must be created before audio because audio uses the video timecode */ 184/* Video must be created before audio because audio uses the video timecode */
185/* to get its length. */ 185/* to get its length. */
186 for(i = 0; i < MPEG3_MAX_STREAMS; i++) 186 for(i = 0; i < MPEG3_MAX_STREAMS; i++)
187 { 187 {
188 if(file->demuxer->vstream_table[i]) 188 if(file->demuxer->vstream_table[i])
189 { 189 {
190 file->vtrack[file->total_vstreams] = mpeg3_new_vtrack(file, i, file->demuxer); 190 file->vtrack[file->total_vstreams] = mpeg3_new_vtrack(file, i, file->demuxer);
191 if(file->vtrack[file->total_vstreams]) file->total_vstreams++; 191 if(file->vtrack[file->total_vstreams]) file->total_vstreams++;
192 } 192 }
193 } 193 }
194 194
195/* Create audio tracks */ 195/* Create audio tracks */
196 for(i = 0; i < MPEG3_MAX_STREAMS; i++) 196 for(i = 0; i < MPEG3_MAX_STREAMS; i++)
197 { 197 {
198 if(file->demuxer->astream_table[i]) 198 if(file->demuxer->astream_table[i])
199 { 199 {
200 file->atrack[file->total_astreams] = mpeg3_new_atrack(file, 200 file->atrack[file->total_astreams] = mpeg3_new_atrack(file,
201 i, 201 i,
202 file->demuxer->astream_table[i], 202 file->demuxer->astream_table[i],
203 file->demuxer); 203 file->demuxer);
204 if(file->atrack[file->total_astreams]) file->total_astreams++; 204 if(file->atrack[file->total_astreams]) file->total_astreams++;
205 } 205 }
206 } 206 }
207 } 207 }
208 else 208 else
209 if(file->is_video_stream) 209 if(file->is_video_stream)
210 { 210 {
211/* Create video tracks */ 211/* Create video tracks */
212 file->vtrack[0] = mpeg3_new_vtrack(file, -1, file->demuxer); 212 file->vtrack[0] = mpeg3_new_vtrack(file, -1, file->demuxer);
213 if(file->vtrack[0]) file->total_vstreams++; 213 if(file->vtrack[0]) file->total_vstreams++;
214 } 214 }
215 else 215 else
216 if(file->is_audio_stream) 216 if(file->is_audio_stream)
217 { 217 {
218/* Create audio tracks */ 218/* Create audio tracks */
219 file->atrack[0] = mpeg3_new_atrack(file, -1, AUDIO_UNKNOWN, file->demuxer); 219 file->atrack[0] = mpeg3_new_atrack(file, -1, AUDIO_UNKNOWN, file->demuxer);
220 if(file->atrack[0]) file->total_astreams++; 220 if(file->atrack[0]) file->total_astreams++;
221 } 221 }
222 222
223 if(file->total_vstreams) file->has_video = 1; 223 if(file->total_vstreams) file->has_video = 1;
224 if(file->total_astreams) file->has_audio = 1; 224 if(file->total_astreams) file->has_audio = 1;
225 225
226 mpeg3io_close_file(file->fs); 226 mpeg3io_close_file(file->fs);
227 return file; 227 return file;
228} 228}
229 229
230mpeg3_t* mpeg3_open(char *path) 230mpeg3_t* mpeg3_open(char *path)
231{ 231{
232 return mpeg3_open_copy(path, 0); 232 return mpeg3_open_copy(path, 0);
233} 233}
234 234
235int mpeg3_close(mpeg3_t *file) 235int mpeg3_close(mpeg3_t *file)
236{ 236{
237/* File is closed in the same procedure it is opened in. */ 237/* File is closed in the same procedure it is opened in. */
238 mpeg3_delete(file); 238 mpeg3_delete(file);
239 return 0; 239 return 0;
240} 240}
241 241
242int mpeg3_set_cpus(mpeg3_t *file, int cpus) 242int mpeg3_set_cpus(mpeg3_t *file, int cpus)
243{ 243{
244 int i; 244 int i;
245 file->cpus = cpus; 245 file->cpus = cpus;
246 for(i = 0; i < file->total_vstreams; i++) 246 for(i = 0; i < file->total_vstreams; i++)
247 mpeg3video_set_cpus(file->vtrack[i]->video, cpus); 247 mpeg3video_set_cpus(file->vtrack[i]->video, cpus);
248 return 0; 248 return 0;
249} 249}
250 250
251int mpeg3_set_mmx(mpeg3_t *file, int use_mmx) 251int mpeg3_set_mmx(mpeg3_t *file, int use_mmx)
252{ 252{
253 int i; 253 int i;
254 file->have_mmx = use_mmx; 254 file->have_mmx = use_mmx;
255 for(i = 0; i < file->total_vstreams; i++) 255 for(i = 0; i < file->total_vstreams; i++)
256 mpeg3video_set_mmx(file->vtrack[i]->video, use_mmx); 256 mpeg3video_set_mmx(file->vtrack[i]->video, use_mmx);
257 return 0; 257 return 0;
258} 258}
259 259
260int mpeg3_generate_toc(FILE *output, char *path, int timecode_search, int print_streams) 260int mpeg3_generate_toc(FILE *output, char *path, int timecode_search, int print_streams)
261{ 261{
262 mpeg3_t *file = mpeg3_open(path); 262 mpeg3_t *file = mpeg3_open(path);
263 mpeg3_demuxer_t *demuxer; 263 mpeg3_demuxer_t *demuxer;
264 int i; 264 int i;
265 265
266 if(file) 266 if(file)
267 { 267 {
268 fprintf(output, "TOCVERSION 2\n" 268 fprintf(output, "TOCVERSION 2\n"
269 "PATH: %s\n", path); 269 "PATH: %s\n", path);
270 demuxer = mpeg3_new_demuxer(file, 0, 0, -1); 270 demuxer = mpeg3_new_demuxer(file, 0, 0, -1);
271 mpeg3demux_create_title(demuxer, timecode_search, output); 271 mpeg3demux_create_title(demuxer, timecode_search, output);
272/* Just print the first title's streams */ 272/* Just print the first title's streams */
273 if(print_streams) mpeg3demux_print_streams(demuxer, output); 273 if(print_streams) mpeg3demux_print_streams(demuxer, output);
274 274
275 fprintf(output, "SIZE: %ld\n", demuxer->titles[demuxer->current_title]->total_bytes); 275 fprintf(output, "SIZE: %ld\n", demuxer->titles[demuxer->current_title]->total_bytes);
276 fprintf(output, "PACKETSIZE: %ld\n", demuxer->packet_size); 276 fprintf(output, "PACKETSIZE: %ld\n", demuxer->packet_size);
277 277
278 mpeg3demux_print_timecodes(demuxer->titles[demuxer->current_title], output); 278 mpeg3demux_print_timecodes(demuxer->titles[demuxer->current_title], output);
279 279
280 mpeg3_delete_demuxer(demuxer); 280 mpeg3_delete_demuxer(demuxer);
281 mpeg3_close(file); 281 mpeg3_close(file);
282 return 0; 282 return 0;
283 } 283 }
284 return 1; 284 return 1;
285} 285}
286 286
287int mpeg3_read_toc(mpeg3_t *file) 287int mpeg3_read_toc(mpeg3_t *file)
288{ 288{
289 char string[MPEG3_STRLEN]; 289 char string[MPEG3_STRLEN];
290 int number1; 290 int number1;
291 291
292/* Test version number */ 292/* Test version number */
293 file->is_program_stream = 1; 293 file->is_program_stream = 1;
294 mpeg3io_seek(file->fs, 0); 294 mpeg3io_seek(file->fs, 0);
295 fscanf(file->fs->fd, "%s %d", string, &number1); 295 fscanf(file->fs->fd, "%s %d", string, &number1);
296 if(number1 > 2 || number1 < 2) return 1; 296 if(number1 > 2 || number1 < 2) return 1;
297 297
298/* Read titles */ 298/* Read titles */
299 mpeg3demux_read_titles(file->demuxer); 299 mpeg3demux_read_titles(file->demuxer);
300 return 0; 300 return 0;
301} 301}
302 302
303int mpeg3_has_audio(mpeg3_t *file) 303int mpeg3_has_audio(mpeg3_t *file)
304{ 304{
305 return file->has_audio; 305 return file->has_audio;
306} 306}
307 307
308int mpeg3_total_astreams(mpeg3_t *file) 308int mpeg3_total_astreams(mpeg3_t *file)
309{ 309{
310 return file->total_astreams; 310 return file->total_astreams;
311} 311}
312 312
313int mpeg3_audio_channels(mpeg3_t *file, 313int mpeg3_audio_channels(mpeg3_t *file,
314 int stream) 314 int stream)
315{ 315{
316 if(file->has_audio) 316 if(file->has_audio)
317 return file->atrack[stream]->channels; 317 return file->atrack[stream]->channels;
318 return -1; 318 return -1;
319} 319}
320 320
321int mpeg3_sample_rate(mpeg3_t *file, 321int mpeg3_sample_rate(mpeg3_t *file,
322 int stream) 322 int stream)
323{ 323{
324 if(file->has_audio) 324 if(file->has_audio)
325 return file->atrack[stream]->sample_rate; 325 return file->atrack[stream]->sample_rate;
326 return -1; 326 return -1;
327} 327}
328 328
329long mpeg3_get_sample(mpeg3_t *file, 329long mpeg3_get_sample(mpeg3_t *file,
330 int stream) 330 int stream)
331{ 331{
332 if(file->has_audio) 332 if(file->has_audio)
333 return file->atrack[stream]->current_position; 333 return file->atrack[stream]->current_position;
334 return -1; 334 return -1;
335} 335}
336 336
337int mpeg3_set_sample(mpeg3_t *file, 337int mpeg3_set_sample(mpeg3_t *file,
338 long sample, 338 long sample,
339 int stream) 339 int stream)
340{ 340{
341 if(file->has_audio) 341 if(file->has_audio)
342 { 342 {
343 file->atrack[stream]->current_position = sample; 343 file->atrack[stream]->current_position = sample;
344 mpeg3audio_seek_sample(file->atrack[stream]->audio, sample); 344 mpeg3audio_seek_sample(file->atrack[stream]->audio, sample);
345 return 0; 345 return 0;
346 } 346 }
347 return -1; 347 return -1;
348} 348}
349 349
350long mpeg3_audio_samples(mpeg3_t *file, 350long mpeg3_audio_samples(mpeg3_t *file,
351 int stream) 351 int stream)
352{ 352{
353 if(file->has_audio) 353 if(file->has_audio)
354 return file->atrack[stream]->total_samples; 354 return file->atrack[stream]->total_samples;
355 return -1; 355 return -1;
356} 356}
357 357
358int mpeg3_has_video(mpeg3_t *file) 358int mpeg3_has_video(mpeg3_t *file)
359{ 359{
360 return file->has_video; 360 return file->has_video;
361} 361}
362 362
363int mpeg3_total_vstreams(mpeg3_t *file) 363int mpeg3_total_vstreams(mpeg3_t *file)
364{ 364{
365 return file->total_vstreams; 365 return file->total_vstreams;
366} 366}
367 367
368int mpeg3_video_width(mpeg3_t *file, 368int mpeg3_video_width(mpeg3_t *file,
369 int stream) 369 int stream)
370{ 370{
371 if(file->has_video) 371 if(file->has_video)
372 return file->vtrack[stream]->width; 372 return file->vtrack[stream]->width;
373 return -1; 373 return -1;
374} 374}
375 375
376int mpeg3_video_height(mpeg3_t *file, 376int mpeg3_video_height(mpeg3_t *file,
377 int stream) 377 int stream)
378{ 378{
379 if(file->has_video) 379 if(file->has_video)
380 return file->vtrack[stream]->height; 380 return file->vtrack[stream]->height;
381 return -1; 381 return -1;
382} 382}
383 383
384float mpeg3_frame_rate(mpeg3_t *file, 384float mpeg3_frame_rate(mpeg3_t *file,
385 int stream) 385 int stream)
386{ 386{
387 if(file->has_video) 387 if(file->has_video)
388 return file->vtrack[stream]->frame_rate; 388 return file->vtrack[stream]->frame_rate;
389 return -1; 389 return -1;
390} 390}
391 391
392long mpeg3_video_frames(mpeg3_t *file, 392long mpeg3_video_frames(mpeg3_t *file,
393 int stream) 393 int stream)
394{ 394{
395 if(file->has_video) 395 if(file->has_video)
396 return file->vtrack[stream]->total_frames; 396 return file->vtrack[stream]->total_frames;
397 return -1; 397 return -1;
398} 398}
399 399
400long mpeg3_get_frame(mpeg3_t *file, 400long mpeg3_get_frame(mpeg3_t *file,
401 int stream) 401 int stream)
402{ 402{
403 if(file->has_video) 403 if(file->has_video)
404 return file->vtrack[stream]->current_position; 404 return file->vtrack[stream]->current_position;
405 return -1; 405 return -1;
406} 406}
407 407
408int mpeg3_set_frame(mpeg3_t *file, 408int mpeg3_set_frame(mpeg3_t *file,
409 long frame, 409 long frame,
410 int stream) 410 int stream)
411{ 411{
412 if(file->has_video) 412 if(file->has_video)
413 { 413 {
414 file->vtrack[stream]->current_position = frame; 414 file->vtrack[stream]->current_position = frame;
415 mpeg3video_seek_frame(file->vtrack[stream]->video, frame); 415 mpeg3video_seek_frame(file->vtrack[stream]->video, frame);
416 return 0; 416 return 0;
417 } 417 }
418 return -1; 418 return -1;
419} 419}
420 420
421int mpeg3_seek_percentage(mpeg3_t *file, double percentage) 421int mpeg3_seek_percentage(mpeg3_t *file, double percentage)
422{ 422{
423 int i; 423 int i;
424 for(i = 0; i < file->total_astreams; i++) 424 for(i = 0; i < file->total_astreams; i++)
425 { 425 {
426 mpeg3audio_seek_percentage(file->atrack[i]->audio, percentage); 426 mpeg3audio_seek_percentage(file->atrack[i]->audio, percentage);
427 } 427 }
428 428
429 for(i = 0; i < file->total_vstreams; i++) 429 for(i = 0; i < file->total_vstreams; i++)
430 { 430 {
431 mpeg3video_seek_percentage(file->vtrack[i]->video, percentage); 431 mpeg3video_seek_percentage(file->vtrack[i]->video, percentage);
432 } 432 }
433 return 0; 433 return 0;
434} 434}
435 435
436int mpeg3_previous_frame(mpeg3_t *file, int stream) 436int mpeg3_previous_frame(mpeg3_t *file, int stream)
437{ 437{
438 file->last_type_read = 2; 438 file->last_type_read = 2;
439 file->last_stream_read = stream; 439 file->last_stream_read = stream;
440 440
441 if(file->has_video) 441 if(file->has_video)
442 return mpeg3video_previous_frame(file->vtrack[stream]->video); 442 return mpeg3video_previous_frame(file->vtrack[stream]->video);
443} 443}
444 444
445double mpeg3_tell_percentage(mpeg3_t *file) 445double mpeg3_tell_percentage(mpeg3_t *file)
446{ 446{
447 double percent = 0; 447 double percent = 0;
448 if(file->last_type_read == 1) 448 if(file->last_type_read == 1)
449 { 449 {
450 percent = mpeg3demux_tell_percentage(file->atrack[file->last_stream_read]->demuxer); 450 percent = mpeg3demux_tell_percentage(file->atrack[file->last_stream_read]->demuxer);
451 } 451 }
452 452
453 if(file->last_type_read == 2) 453 if(file->last_type_read == 2)
454 { 454 {
455 percent = mpeg3demux_tell_percentage(file->vtrack[file->last_stream_read]->demuxer); 455 percent = mpeg3demux_tell_percentage(file->vtrack[file->last_stream_read]->demuxer);
456 } 456 }
457 return percent; 457 return percent;
458} 458}
459 459
460double mpeg3_get_time(mpeg3_t *file) 460double mpeg3_get_time(mpeg3_t *file)
461{ 461{
462 double atime = 0, vtime = 0; 462 double atime = 0, vtime = 0;
463 463
464 if(file->is_transport_stream || file->is_program_stream) 464 if(file->is_transport_stream || file->is_program_stream)
465 { 465 {
466/* Timecode only available in transport stream */ 466/* Timecode only available in transport stream */
467 if(file->last_type_read == 1) 467 if(file->last_type_read == 1)
468 { 468 {
469 atime = mpeg3demux_get_time(file->atrack[file->last_stream_read]->demuxer); 469 atime = mpeg3demux_get_time(file->atrack[file->last_stream_read]->demuxer);
470 } 470 }
471 else 471 else
472 if(file->last_type_read == 2) 472 if(file->last_type_read == 2)
473 { 473 {
474 vtime = mpeg3demux_get_time(file->vtrack[file->last_stream_read]->demuxer); 474 vtime = mpeg3demux_get_time(file->vtrack[file->last_stream_read]->demuxer);
475 } 475 }
476 } 476 }
477 else 477 else
478 { 478 {
479/* Use percentage and total time */ 479/* Use percentage and total time */
480 if(file->has_audio) 480 if(file->has_audio)
481 { 481 {
482 atime = mpeg3demux_tell_percentage(file->atrack[0]->demuxer) * 482 atime = mpeg3demux_tell_percentage(file->atrack[0]->demuxer) *
483 mpeg3_audio_samples(file, 0) / mpeg3_sample_rate(file, 0); 483 mpeg3_audio_samples(file, 0) / mpeg3_sample_rate(file, 0);
484 } 484 }
485 485
486 if(file->has_video) 486 if(file->has_video)
487 { 487 {
488 vtime = mpeg3demux_tell_percentage(file->vtrack[0]->demuxer) * 488 vtime = mpeg3demux_tell_percentage(file->vtrack[0]->demuxer) *
489 mpeg3_video_frames(file, 0) / mpeg3_frame_rate(file, 0); 489 mpeg3_video_frames(file, 0) / mpeg3_frame_rate(file, 0);
490 } 490 }
491 } 491 }
492 492
493 return MAX(atime, vtime); 493 return MAX(atime, vtime);
494} 494}
495 495
496int mpeg3_end_of_audio(mpeg3_t *file, int stream) 496int mpeg3_end_of_audio(mpeg3_t *file, int stream)
497{ 497{
498 int result = 0; 498 int result = 0;
499 result = mpeg3demux_eof(file->atrack[stream]->demuxer); 499 result = mpeg3demux_eof(file->atrack[stream]->demuxer);
500 return result; 500 return result;
501} 501}
502 502
503int mpeg3_end_of_video(mpeg3_t *file, int stream) 503int mpeg3_end_of_video(mpeg3_t *file, int stream)
504{ 504{
505 int result = 0; 505 int result = 0;
506 result = mpeg3demux_eof(file->vtrack[stream]->demuxer); 506 result = mpeg3demux_eof(file->vtrack[stream]->demuxer);
507 return result; 507 return result;
508} 508}
509 509
510 510
511int mpeg3_read_frame(mpeg3_t *file, 511int mpeg3_read_frame(mpeg3_t *file,
512 unsigned char **output_rows, 512 unsigned char **output_rows,
513 int in_x, 513 int in_x,
514 int in_y, 514 int in_y,
515 int in_w, 515 int in_w,
516 int in_h, 516 int in_h,
517 int out_w, 517 int out_w,
518 int out_h, 518 int out_h,
519 int color_model, 519 int color_model,
520 int stream) 520 int stream)
521{ 521{
522 int result = -1; 522 int result = -1;
523 523
524 if(file->has_video) 524 if(file->has_video)
525 { 525 {
526 result = mpeg3video_read_frame(file->vtrack[stream]->video, 526 result = mpeg3video_read_frame(file->vtrack[stream]->video,
527 file->vtrack[stream]->current_position, 527 file->vtrack[stream]->current_position,
528 output_rows, 528 output_rows,
529 in_x, 529 in_x,
530 in_y, 530 in_y,
531 in_w, 531 in_w,
532 in_h, 532 in_h,
533 out_w, 533 out_w,
534 out_h, 534 out_h,
535 color_model); 535 color_model);
536 file->last_type_read = 2; 536 file->last_type_read = 2;
537 file->last_stream_read = stream; 537 file->last_stream_read = stream;
538 file->vtrack[stream]->current_position++; 538 file->vtrack[stream]->current_position++;
539 } 539 }
540 return result; 540 return result;
541} 541}
542 542
543int mpeg3_drop_frames(mpeg3_t *file, long frames, int stream) 543int mpeg3_drop_frames(mpeg3_t *file, long frames, int stream)
544{ 544{
545 int result = -1; 545 int result = -1;
546 546
547 if(file->has_video) 547 if(file->has_video)
548 { 548 {
549 result = mpeg3video_drop_frames(file->vtrack[stream]->video, 549 result = mpeg3video_drop_frames(file->vtrack[stream]->video,
550 frames); 550 frames);
551 if(frames > 0) file->vtrack[stream]->current_position += frames; 551 if(frames > 0) file->vtrack[stream]->current_position += frames;
552 file->last_type_read = 2; 552 file->last_type_read = 2;
553 file->last_stream_read = stream; 553 file->last_stream_read = stream;
554 } 554 }
555 return result; 555 return result;
556} 556}
557 557
558int mpeg3_read_yuvframe(mpeg3_t *file, 558int mpeg3_read_yuvframe(mpeg3_t *file,
559 char *y_output, 559 char *y_output,
560 char *u_output, 560 char *u_output,
561 char *v_output, 561 char *v_output,
562 int in_x, 562 int in_x,
563 int in_y, 563 int in_y,
564 int in_w, 564 int in_w,
565 int in_h, 565 int in_h,
566 int stream) 566 int stream)
567{ 567{
568 int result = -1; 568 int result = -1;
569 569
570//printf("mpeg3_read_yuvframe 1 %d %d\n", mpeg3demux_tell(file->vtrack[stream]->demuxer), mpeg3demuxer_total_bytes(file->vtrack[stream]->demuxer)); 570//printf("mpeg3_read_yuvframe 1 %d %d\n", mpeg3demux_tell(file->vtrack[stream]->demuxer), mpeg3demuxer_total_bytes(file->vtrack[stream]->demuxer));
571 if(file->has_video) 571 if(file->has_video)
572 { 572 {
573 result = mpeg3video_read_yuvframe(file->vtrack[stream]->video, 573 result = mpeg3video_read_yuvframe(file->vtrack[stream]->video,
574 file->vtrack[stream]->current_position, 574 file->vtrack[stream]->current_position,
575 y_output, 575 y_output,
576 u_output, 576 u_output,
577 v_output, 577 v_output,
578 in_x, 578 in_x,
579 in_y, 579 in_y,
580 in_w, 580 in_w,
581 in_h); 581 in_h);
582 file->last_type_read = 2; 582 file->last_type_read = 2;
583 file->last_stream_read = stream; 583 file->last_stream_read = stream;
584 file->vtrack[stream]->current_position++; 584 file->vtrack[stream]->current_position++;
585 } 585 }
586//printf("mpeg3_read_yuvframe 2 %d %d\n", mpeg3demux_tell(file->vtrack[stream]->demuxer), mpeg3demuxer_total_bytes(file->vtrack[stream]->demuxer)); 586//printf("mpeg3_read_yuvframe 2 %d %d\n", mpeg3demux_tell(file->vtrack[stream]->demuxer), mpeg3demuxer_total_bytes(file->vtrack[stream]->demuxer));
587 return result; 587 return result;
588} 588}
589 589
590 590
591int mpeg3_read_audio(mpeg3_t *file, 591int mpeg3_read_audio(mpeg3_t *file,
592 mpeg3_real_t *output_f, 592 mpeg3_real_t *output_f,
593 short *output_i, int sampleSpacing, 593 short *output_i, int sampleSpacing,
594 int channel, 594 int channel,
595 long samples, 595 long samples,
596 int stream) 596 int stream)
597{ 597{
598 int result = -1; 598 int result = -1;
599 599
600//printf("mpeg3_read_audio 1 %d %d\n", mpeg3demux_tell(file->atrack[stream]->demuxer), mpeg3demuxer_total_bytes(file->atrack[stream]->demuxer)); 600//printf("mpeg3_read_audio 1 %d %d\n", mpeg3demux_tell(file->atrack[stream]->demuxer), mpeg3demuxer_total_bytes(file->atrack[stream]->demuxer));
601 if(file->has_audio) 601 if(file->has_audio)
602 { 602 {
603 result = mpeg3audio_decode_audio(file->atrack[stream]->audio, 603 result = mpeg3audio_decode_audio(file->atrack[stream]->audio,
604 output_f, 604 output_f,
605 output_i, sampleSpacing, 605 output_i, sampleSpacing,
606 channel, 606 channel,
607 file->atrack[stream]->current_position, 607 file->atrack[stream]->current_position,
608 samples); 608 samples);
609 file->last_type_read = 1; 609 file->last_type_read = 1;
610 file->last_stream_read = stream; 610 file->last_stream_read = stream;
611 file->atrack[stream]->current_position += samples; 611 file->atrack[stream]->current_position += samples;
612 } 612 }
613//printf("mpeg3_read_audio 2 %d %d\n", mpeg3demux_tell(file->atrack[stream]->demuxer), mpeg3demuxer_total_bytes(file->atrack[stream]->demuxer)); 613//printf("mpeg3_read_audio 2 %d %d\n", mpeg3demux_tell(file->atrack[stream]->demuxer), mpeg3demuxer_total_bytes(file->atrack[stream]->demuxer));
614 614
615 return result; 615 return result;
616} 616}
617 617
618int mpeg3_reread_audio(mpeg3_t *file, 618int mpeg3_reread_audio(mpeg3_t *file,
619 mpeg3_real_t *output_f, 619 mpeg3_real_t *output_f,
620 short *output_i, int sampleSpacing, 620 short *output_i, int sampleSpacing,
621 int channel, 621 int channel,
622 long samples, 622 long samples,
623 int stream) 623 int stream)
624{ 624{
625 if(file->has_audio) 625 if(file->has_audio)
626 { 626 {
627 mpeg3_set_sample(file, 627 mpeg3_set_sample(file,
628 file->atrack[stream]->current_position - samples, 628 file->atrack[stream]->current_position - samples,
629 stream); 629 stream);
630 file->last_type_read = 1; 630 file->last_type_read = 1;
631 file->last_stream_read = stream; 631 file->last_stream_read = stream;
632 return mpeg3_read_audio(file, 632 return mpeg3_read_audio(file,
633 output_f, 633 output_f,
634 output_i, sampleSpacing, 634 output_i, sampleSpacing,
635 channel, 635 channel,
636 samples, 636 samples,
637 stream); 637 stream);
638 } 638 }
639 return -1; 639 return -1;
640} 640}
641 641
642int mpeg3_read_audio_chunk(mpeg3_t *file, 642int mpeg3_read_audio_chunk(mpeg3_t *file,
643 unsigned char *output, 643 unsigned char *output,
644 long *size, 644 long *size,
645 long max_size, 645 long max_size,
646 int stream) 646 int stream)
647{ 647{
648 int result = 0; 648 int result = 0;
649 if(file->has_audio) 649 if(file->has_audio)
650 { 650 {
651 result = mpeg3audio_read_raw(file->atrack[stream]->audio, output, size, max_size); 651 result = mpeg3audio_read_raw(file->atrack[stream]->audio, output, size, max_size);
652 file->last_type_read = 1; 652 file->last_type_read = 1;
653 file->last_stream_read = stream; 653 file->last_stream_read = stream;
654 } 654 }
655 return result; 655 return result;
656} 656}
657 657
658int mpeg3_read_video_chunk(mpeg3_t *file, 658int mpeg3_read_video_chunk(mpeg3_t *file,
659 unsigned char *output, 659 unsigned char *output,
660 long *size, 660 long *size,
661 long max_size, 661 long max_size,
662 int stream) 662 int stream)
663{ 663{
664 int result = 0; 664 int result = 0;
665 if(file->has_video) 665 if(file->has_video)
666 { 666 {
667 result = mpeg3video_read_raw(file->vtrack[stream]->video, output, size, max_size); 667 result = mpeg3video_read_raw(file->vtrack[stream]->video, output, size, max_size);
668 file->last_type_read = 2; 668 file->last_type_read = 2;
669 file->last_stream_read = stream; 669 file->last_stream_read = stream;
670 } 670 }
671 return result; 671 return result;
672} 672}