2 #include "mpeg3private.h"
3 #include "mpeg3protos.h"
9 #define MAX(a, b) ((a) > (b) ? (a) : (b))
28 mpeg3_t
* mpeg3_new(char *path
)
31 mpeg3_t
*file
= calloc(1, sizeof(mpeg3_t
));
33 file
->fs
= mpeg3_new_fs(path
);
34 // file->have_mmx = mpeg3_mmx_test();
35 // Late compilers don't produce usable code.
37 file
->demuxer
= mpeg3_new_demuxer(file
, 0, 0, -1);
42 int mpeg3_delete(mpeg3_t
*file
)
46 for(i
= 0; i
< file
->total_vstreams
; i
++)
47 mpeg3_delete_vtrack(file
, file
->vtrack
[i
]);
49 for(i
= 0; i
< file
->total_astreams
; i
++)
50 mpeg3_delete_atrack(file
, file
->atrack
[i
]);
52 mpeg3_delete_fs(file
->fs
);
53 mpeg3_delete_demuxer(file
->demuxer
);
55 if(file
->frame_offsets
)
57 for(i
= 0; i
< file
->total_vstreams
; i
++)
59 free(file
->frame_offsets
[i
]);
60 free(file
->keyframe_numbers
[i
]);
63 free(file
->frame_offsets
);
64 free(file
->keyframe_numbers
);
65 free(file
->total_frame_offsets
);
66 free(file
->total_keyframe_numbers
);
69 if(file
->sample_offsets
)
71 for(i
= 0; i
< file
->total_astreams
; i
++)
72 free(file
->sample_offsets
[i
]);
74 free(file
->sample_offsets
);
75 free(file
->total_sample_offsets
);
77 if(file
->channel_counts
)
78 free(file
->channel_counts
);
84 int mpeg3_check_sig(char *path
)
91 fs
= mpeg3_new_fs(path
);
92 if(mpeg3io_open_file(fs
))
98 bits
= mpeg3io_read_int32(fs
);
100 if(bits
== MPEG3_TOC_PREFIX
)
105 if((((bits
>> 24) & 0xff) == MPEG3_SYNC_BYTE
) ||
106 (bits
== MPEG3_PACK_START_CODE
) ||
107 ((bits
& 0xfff00000) == 0xfff00000) ||
108 ((bits
& 0xffff0000) == 0xffe30000) ||
109 (bits
== MPEG3_SEQUENCE_START_CODE
) ||
110 (bits
== MPEG3_PICTURE_START_CODE
) ||
111 (((bits
& 0xffff0000) >> 16) == MPEG3_AC3_START_CODE
) ||
112 ((bits
>> 8) == MPEG3_ID3_PREFIX
) ||
113 (bits
== MPEG3_RIFF_CODE
) ||
114 (bits
== MPEG3_IFO_PREFIX
))
118 ext
= strrchr(path
, '.');
121 /* Test file extension. */
122 if(strncasecmp(ext
, ".ifo", 4) &&
123 strncasecmp(ext
, ".mp2", 4) &&
124 strncasecmp(ext
, ".mp3", 4) &&
125 strncasecmp(ext
, ".m1v", 4) &&
126 strncasecmp(ext
, ".m2v", 4) &&
127 strncasecmp(ext
, ".m2s", 4) &&
128 strncasecmp(ext
, ".mpg", 4) &&
129 strncasecmp(ext
, ".vob", 4) &&
130 strncasecmp(ext
, ".mpeg", 4) &&
131 strncasecmp(ext
, ".ac3", 4))
136 mpeg3io_close_file(fs
);
142 static uint32_t read_int32(unsigned char *buffer
, int *position
)
146 if(MPEG3_LITTLE_ENDIAN
)
148 ((unsigned char*)&temp
)[3] = buffer
[(*position
)++];
149 ((unsigned char*)&temp
)[2] = buffer
[(*position
)++];
150 ((unsigned char*)&temp
)[1] = buffer
[(*position
)++];
151 ((unsigned char*)&temp
)[0] = buffer
[(*position
)++];
155 ((unsigned char*)&temp
)[0] = buffer
[(*position
)++];
156 ((unsigned char*)&temp
)[1] = buffer
[(*position
)++];
157 ((unsigned char*)&temp
)[2] = buffer
[(*position
)++];
158 ((unsigned char*)&temp
)[3] = buffer
[(*position
)++];
164 static uint64_t read_int64(unsigned char *buffer
, int *position
)
168 if(MPEG3_LITTLE_ENDIAN
)
170 ((unsigned char*)&temp
)[7] = buffer
[(*position
)++];
171 ((unsigned char*)&temp
)[6] = buffer
[(*position
)++];
172 ((unsigned char*)&temp
)[5] = buffer
[(*position
)++];
173 ((unsigned char*)&temp
)[4] = buffer
[(*position
)++];
174 ((unsigned char*)&temp
)[3] = buffer
[(*position
)++];
175 ((unsigned char*)&temp
)[2] = buffer
[(*position
)++];
176 ((unsigned char*)&temp
)[1] = buffer
[(*position
)++];
177 ((unsigned char*)&temp
)[0] = buffer
[(*position
)++];
181 ((unsigned char*)&temp
)[0] = buffer
[(*position
)++];
182 ((unsigned char*)&temp
)[1] = buffer
[(*position
)++];
183 ((unsigned char*)&temp
)[2] = buffer
[(*position
)++];
184 ((unsigned char*)&temp
)[3] = buffer
[(*position
)++];
185 ((unsigned char*)&temp
)[4] = buffer
[(*position
)++];
186 ((unsigned char*)&temp
)[5] = buffer
[(*position
)++];
187 ((unsigned char*)&temp
)[6] = buffer
[(*position
)++];
188 ((unsigned char*)&temp
)[7] = buffer
[(*position
)++];
199 static int read_toc(mpeg3_t
*file
, int *atracks_return
, int *vtracks_return
)
201 unsigned char *buffer
;
207 int vfs_len
= strlen(RENDERFARM_FS_PREFIX
);
209 int64_t current_byte
= 0;
211 // Fix title paths for Cinelerra VFS
212 if(!strncmp(file
->fs
->path
, RENDERFARM_FS_PREFIX
, vfs_len
))
215 buffer
= malloc(mpeg3io_total_bytes(file
->fs
));
216 mpeg3io_seek(file
->fs
, 0);
217 mpeg3io_read_data(buffer
, mpeg3io_total_bytes(file
->fs
), file
->fs
);
220 if((toc_version
= buffer
[position
++]) != MPEG3_TOC_VERSION
)
223 "read_toc: invalid TOC version %x\n",
228 //printf("read_toc %lld\n", mpeg3io_total_bytes(file->fs));
231 file_type
= buffer
[position
++];
234 case FILE_TYPE_PROGRAM
:
235 file
->is_program_stream
= 1;
237 case FILE_TYPE_TRANSPORT
:
238 file
->is_transport_stream
= 1;
240 case FILE_TYPE_AUDIO
:
241 file
->is_audio_stream
= 1;
243 case FILE_TYPE_VIDEO
:
244 file
->is_video_stream
= 1;
248 //printf("read_toc 10\n");
251 while((stream_type
= buffer
[position
]) != TITLE_PATH
)
256 //printf("read_toc %d %x\n", position, buffer[position]);
258 offset
= read_int32(buffer
, &position
);
259 stream_id
= read_int32(buffer
, &position
);
261 if(stream_type
== STREAM_AUDIO
)
263 file
->demuxer
->astream_table
[offset
] = stream_id
;
266 if(stream_type
== STREAM_VIDEO
)
268 file
->demuxer
->vstream_table
[offset
] = stream_id
;
274 //printf("read_toc 10\n");
278 while(buffer
[position
] == TITLE_PATH
)
280 char string
[MPEG3_STRLEN
];
282 mpeg3_title_t
*title
;
285 // Construct title path from VFS prefix and path.
289 strcpy(string
, RENDERFARM_FS_PREFIX
);
290 string_len
= vfs_len
;
292 while(buffer
[position
] != 0) string
[string_len
++] = buffer
[position
++];
293 string
[string_len
++] = 0;
296 // Test title availability
297 test_fd
= fopen(string
, "r");
304 // Try concatenating title and toc directory if title is not absolute and
305 // toc path has a directory section.
306 if((!is_vfs
&& string
[0] != '/') ||
307 (is_vfs
&& string
[vfs_len
] != '/'))
309 // Get toc filename without path
310 char *ptr
= strrchr(file
->fs
->path
, '/');
313 char string2
[MPEG3_STRLEN
];
315 // Stack filename on toc path
316 strcpy(string2
, file
->fs
->path
);
318 strcpy(&string2
[ptr
- file
->fs
->path
+ 1], string
);
320 strcpy(&string2
[ptr
- file
->fs
->path
+ 1], string
+ vfs_len
);
322 test_fd
= fopen(string2
, "r");
326 strcpy(string
, string2
);
331 "read_toc: failed to open %s or %s\n",
340 "read_toc: failed to open %s\n",
348 "read_toc: failed to open %s\n",
355 file
->demuxer
->titles
[file
->demuxer
->total_titles
++] =
356 mpeg3_new_title(file
, string
);
358 title
->total_bytes
= read_int64(buffer
, &position
);
359 title
->start_byte
= current_byte
;
360 title
->end_byte
= title
->start_byte
+ title
->total_bytes
;
361 current_byte
= title
->end_byte
;
364 title
->cell_table_size
=
365 title
->cell_table_allocation
=
366 read_int32(buffer
, &position
);
367 title
->cell_table
= calloc(title
->cell_table_size
, sizeof(mpeg3demux_cell_t
));
368 for(i
= 0; i
< title
->cell_table_size
; i
++)
370 title
->cell_table
[i
].start_byte
= read_int64(buffer
, &position
);
371 title
->cell_table
[i
].end_byte
= read_int64(buffer
, &position
);
372 title
->cell_table
[i
].program
= read_int32(buffer
, &position
);
375 //printf("read_toc 10\n");
382 *atracks_return
= read_int32(buffer
, &position
);
383 //printf("read_toc 10\n");
387 *vtracks_return
= read_int32(buffer
, &position
);
388 //printf("read_toc 10\n");
393 file
->channel_counts
= calloc(sizeof(int), *atracks_return
);
394 file
->sample_offsets
= malloc(sizeof(int64_t*) * *atracks_return
);
395 file
->total_sample_offsets
= malloc(sizeof(int*) * *atracks_return
);
397 for(i
= 0; i
< *atracks_return
; i
++)
399 file
->channel_counts
[i
] = read_int32(buffer
, &position
);
400 file
->total_sample_offsets
[i
] = read_int32(buffer
, &position
);
401 file
->sample_offsets
[i
] = malloc(file
->total_sample_offsets
[i
] * sizeof(int64_t));
402 for(j
= 0; j
< file
->total_sample_offsets
[i
]; j
++)
404 file
->sample_offsets
[i
][j
] = read_int64(buffer
, &position
);
405 //printf("samples %llx\n", file->sample_offsets[i][j]);
409 //printf("read_toc 10\n");
413 file
->frame_offsets
= malloc(sizeof(int64_t*) * *vtracks_return
);
414 file
->total_frame_offsets
= malloc(sizeof(int*) * *vtracks_return
);
415 file
->keyframe_numbers
= malloc(sizeof(int64_t*) * *vtracks_return
);
416 file
->total_keyframe_numbers
= malloc(sizeof(int*) * *vtracks_return
);
418 for(i
= 0; i
< *vtracks_return
; i
++)
420 file
->total_frame_offsets
[i
] = read_int32(buffer
, &position
);
421 file
->frame_offsets
[i
] = malloc(file
->total_frame_offsets
[i
] * sizeof(int64_t));
422 for(j
= 0; j
< file
->total_frame_offsets
[i
]; j
++)
424 file
->frame_offsets
[i
][j
] = read_int64(buffer
, &position
);
425 //printf("frame %llx\n", file->frame_offsets[i][j]);
429 file
->total_keyframe_numbers
[i
] = read_int32(buffer
, &position
);
430 file
->keyframe_numbers
[i
] = malloc(file
->total_keyframe_numbers
[i
] * sizeof(int64_t));
431 for(j
= 0; j
< file
->total_keyframe_numbers
[i
]; j
++)
433 file
->keyframe_numbers
[i
][j
] = read_int64(buffer
, &position
);
437 //printf("read_toc 10\n");
440 //printf("read_toc 10\n");
444 //printf("read_toc 1\n");
445 mpeg3demux_open_title(file
->demuxer
, 0);
446 //printf("read_toc 10\n");
448 //printf("read_toc 2 %llx\n", mpeg3demux_tell(file->demuxer));
455 mpeg3_t
* mpeg3_open_copy(char *path
, mpeg3_t
*old_file
)
460 /* The table of contents may have fewer tracks than are in the demuxer */
461 /* This limits the track count */
462 int toc_atracks
= 0x7fffffff;
463 int toc_vtracks
= 0x7fffffff;
465 /* Initialize the file structure */
466 file
= mpeg3_new(path
);
474 //printf("mpeg3_open_copy 1 %s\n", path);
476 /* Need to perform authentication before reading a single byte. */
477 if(mpeg3io_open_file(file
->fs
))
495 /* =============================== Create the title objects ========================= */
496 bits
= mpeg3io_read_int32(file
->fs
);
497 //printf("mpeg3_open 1 %p %d %d %d %d\n", old_file, file->is_transport_stream, file->is_program_stream, file->is_video_stream, file->is_audio_stream);
499 if(bits
== MPEG3_TOC_PREFIX
) /* TOC */
501 /* Table of contents for another title set */
504 if(read_toc(file
, &toc_atracks
, &toc_vtracks
))
506 mpeg3io_close_file(file
->fs
);
511 mpeg3io_close_file(file
->fs
);
515 if(bits
== MPEG3_IFO_PREFIX
)
519 if(mpeg3_read_ifo(file
, 0))
522 mpeg3io_close_file(file
->fs
);
526 file
->is_ifo_file
= 1;
527 mpeg3io_close_file(file
->fs
);
530 if(((bits
>> 24) & 0xff) == MPEG3_SYNC_BYTE
)
532 /* Transport stream */
533 file
->is_transport_stream
= 1;
536 if(bits
== MPEG3_PACK_START_CODE
)
539 /* Determine packet size empirically */
540 file
->is_program_stream
= 1;
543 if((bits
& 0xfff00000) == 0xfff00000 ||
544 (bits
& 0xffff0000) == 0xffe30000 ||
545 ((bits
>> 8) == MPEG3_ID3_PREFIX
) ||
546 (bits
== MPEG3_RIFF_CODE
))
548 /* MPEG Audio only */
549 file
->is_audio_stream
= 1;
552 if(bits
== MPEG3_SEQUENCE_START_CODE
||
553 bits
== MPEG3_PICTURE_START_CODE
)
556 file
->is_video_stream
= 1;
559 if(((bits
& 0xffff0000) >> 16) == MPEG3_AC3_START_CODE
)
562 file
->is_audio_stream
= 1;
567 fprintf(stderr
, "mpeg3_open: not an MPEG 2 stream\n");
572 * printf("mpeg3_open 2 %p %d %d %d %d\n",
574 * file->is_transport_stream,
575 * file->is_program_stream,
576 * file->is_video_stream,
577 * file->is_audio_stream);
591 // Configure packet size
592 if(file
->is_transport_stream
)
593 file
->packet_size
= MPEG3_TS_PACKET_SIZE
;
595 if(file
->is_program_stream
)
596 file
->packet_size
= 0;
598 if(file
->is_audio_stream
)
599 file
->packet_size
= MPEG3_DVD_PACKET_SIZE
;
601 if(file
->is_video_stream
)
602 file
->packet_size
= MPEG3_DVD_PACKET_SIZE
;
616 //printf("mpeg3_open 1 %d\n", file->demuxer->total_titles);
619 /* Copy timecodes from an old demuxer */
620 if(old_file
&& mpeg3_get_demuxer(old_file
))
622 mpeg3demux_copy_titles(file
->demuxer
, mpeg3_get_demuxer(old_file
));
623 file
->is_transport_stream
= old_file
->is_transport_stream
;
624 file
->is_program_stream
= old_file
->is_program_stream
;
627 /* Start from scratch */
628 if(!file
->demuxer
->total_titles
)
630 mpeg3demux_create_title(file
->demuxer
, 0, 0);
635 //printf("mpeg3_open 50\n");
647 /* Generate tracks */
648 if(file
->is_transport_stream
|| file
->is_program_stream
)
650 /* Create video tracks */
652 i
< MPEG3_MAX_STREAMS
&& file
->total_vstreams
< toc_vtracks
;
655 if(file
->demuxer
->vstream_table
[i
])
657 file
->vtrack
[file
->total_vstreams
] =
658 mpeg3_new_vtrack(file
,
661 file
->total_vstreams
);
662 if(file
->vtrack
[file
->total_vstreams
])
663 file
->total_vstreams
++;
668 /* Create audio tracks */
669 for(i
= 0; i
< MPEG3_MAX_STREAMS
&& file
->total_astreams
< toc_atracks
; i
++)
671 if(file
->demuxer
->astream_table
[i
])
673 file
->atrack
[file
->total_astreams
] = mpeg3_new_atrack(file
,
675 file
->demuxer
->astream_table
[i
],
677 file
->total_astreams
);
678 if(file
->atrack
[file
->total_astreams
]) file
->total_astreams
++;
683 if(file
->is_video_stream
)
685 /* Create video tracks */
686 file
->vtrack
[0] = mpeg3_new_vtrack(file
,
690 if(file
->vtrack
[0]) file
->total_vstreams
++;
693 if(file
->is_audio_stream
)
695 /* Create audio tracks */
697 file
->atrack
[0] = mpeg3_new_atrack(file
,
702 if(file
->atrack
[0]) file
->total_astreams
++;
708 mpeg3io_close_file(file
->fs
);
712 mpeg3_t
* mpeg3_open(char *path
)
714 return mpeg3_open_copy(path
, 0);
717 int mpeg3_close(mpeg3_t
*file
)
719 /* File is closed in the same procedure it is opened in. */
724 int mpeg3_set_cpus(mpeg3_t
*file
, int cpus
)
728 for(i
= 0; i
< file
->total_vstreams
; i
++)
729 mpeg3video_set_cpus(file
->vtrack
[i
]->video
, cpus
);
733 int mpeg3_set_mmx(mpeg3_t
*file
, int use_mmx
)
736 file
->have_mmx
= use_mmx
;
737 for(i
= 0; i
< file
->total_vstreams
; i
++)
738 mpeg3video_set_mmx(file
->vtrack
[i
]->video
, use_mmx
);
742 int mpeg3_has_audio(mpeg3_t
*file
)
744 return file
->total_astreams
> 0;
747 int mpeg3_total_astreams(mpeg3_t
*file
)
749 return file
->total_astreams
;
752 int mpeg3_audio_channels(mpeg3_t
*file
,
755 if(file
->total_astreams
)
756 return file
->atrack
[stream
]->channels
;
760 int mpeg3_sample_rate(mpeg3_t
*file
,
763 if(file
->total_astreams
)
764 return file
->atrack
[stream
]->sample_rate
;
768 long mpeg3_get_sample(mpeg3_t
*file
,
771 if(file
->total_astreams
)
772 return file
->atrack
[stream
]->current_position
;
776 int mpeg3_set_sample(mpeg3_t
*file
,
780 if(file
->total_astreams
)
782 //printf(__FUNCTION__ " 1 %d %d\n", file->atrack[stream]->current_position, sample);
783 file
->atrack
[stream
]->current_position
= sample
;
784 mpeg3audio_seek_sample(file
->atrack
[stream
]->audio
, sample
);
790 long mpeg3_audio_samples(mpeg3_t
*file
,
793 if(file
->total_astreams
)
794 return file
->atrack
[stream
]->total_samples
;
798 char* mpeg3_audio_format(mpeg3_t
*file
, int stream
)
800 if(stream
< file
->total_astreams
)
802 switch(file
->atrack
[stream
]->format
)
804 case AUDIO_UNKNOWN
: return "Unknown"; break;
805 case AUDIO_MPEG
: return "MPEG"; break;
806 case AUDIO_AC3
: return "AC3"; break;
807 case AUDIO_PCM
: return "PCM"; break;
808 case AUDIO_AAC
: return "AAC"; break;
809 case AUDIO_JESUS
: return "Vorbis"; break;
815 int mpeg3_has_video(mpeg3_t
*file
)
817 return file
->total_vstreams
> 0;
820 int mpeg3_total_vstreams(mpeg3_t
*file
)
822 return file
->total_vstreams
;
825 int mpeg3_video_width(mpeg3_t
*file
,
828 if(file
->total_vstreams
)
829 return file
->vtrack
[stream
]->width
;
833 int mpeg3_video_height(mpeg3_t
*file
,
836 if(file
->total_vstreams
)
837 return file
->vtrack
[stream
]->height
;
841 float mpeg3_aspect_ratio(mpeg3_t
*file
, int stream
)
843 if(file
->total_vstreams
)
844 return file
->vtrack
[stream
]->aspect_ratio
;
848 double mpeg3_frame_rate(mpeg3_t
*file
,
851 if(file
->total_vstreams
)
852 return file
->vtrack
[stream
]->frame_rate
;
856 long mpeg3_video_frames(mpeg3_t
*file
,
859 if(file
->total_vstreams
)
860 return file
->vtrack
[stream
]->total_frames
;
864 long mpeg3_get_frame(mpeg3_t
*file
,
867 if(file
->total_vstreams
)
868 return file
->vtrack
[stream
]->current_position
;
872 int mpeg3_set_frame(mpeg3_t
*file
,
876 if(file
->total_vstreams
)
878 file
->vtrack
[stream
]->current_position
= frame
;
879 mpeg3video_seek_frame(file
->vtrack
[stream
]->video
, frame
);
885 int mpeg3_seek_byte(mpeg3_t
*file
, int64_t byte
)
889 // file->percentage_pts = -1;
890 for(i
= 0; i
< file
->total_vstreams
; i
++)
892 file
->vtrack
[i
]->current_position
= 0;
893 mpeg3video_seek_byte(file
->vtrack
[i
]->video
, byte
);
896 for(i
= 0; i
< file
->total_astreams
; i
++)
898 file
->atrack
[i
]->current_position
= 0;
899 mpeg3audio_seek_byte(file
->atrack
[i
]->audio
, byte
);
906 * double mpeg3_get_percentage_pts(mpeg3_t *file)
908 * return file->percentage_pts;
911 * void mpeg3_set_percentage_pts(mpeg3_t *file, double pts)
917 int mpeg3_previous_frame(mpeg3_t
*file
, int stream
)
919 file
->last_type_read
= 2;
920 file
->last_stream_read
= stream
;
922 if(file
->total_vstreams
)
923 return mpeg3video_previous_frame(file
->vtrack
[stream
]->video
);
928 int64_t mpeg3_tell_byte(mpeg3_t
*file
)
931 if(file
->last_type_read
== 1)
933 result
= mpeg3demux_tell_byte(file
->atrack
[file
->last_stream_read
]->demuxer
);
936 if(file
->last_type_read
== 2)
938 result
= mpeg3demux_tell_byte(file
->vtrack
[file
->last_stream_read
]->demuxer
);
943 int64_t mpeg3_get_bytes(mpeg3_t
*file
)
945 return mpeg3demux_movie_size(file
->demuxer
);
948 double mpeg3_get_time(mpeg3_t
*file
)
950 double atime
= 0, vtime
= 0;
952 if(file
->is_transport_stream
|| file
->is_program_stream
)
954 /* Timecode only available in transport stream */
955 if(file
->last_type_read
== 1)
957 atime
= mpeg3demux_get_time(file
->atrack
[file
->last_stream_read
]->demuxer
);
960 if(file
->last_type_read
== 2)
962 vtime
= mpeg3demux_get_time(file
->vtrack
[file
->last_stream_read
]->demuxer
);
967 /* Use percentage and total time */
968 if(file
->total_astreams
)
970 atime
= mpeg3demux_tell_byte(file
->atrack
[0]->demuxer
) *
971 mpeg3_audio_samples(file
, 0) /
972 mpeg3_sample_rate(file
, 0) /
973 mpeg3_get_bytes(file
);
976 if(file
->total_vstreams
)
978 vtime
= mpeg3demux_tell_byte(file
->vtrack
[0]->demuxer
) *
979 mpeg3_video_frames(file
, 0) /
980 mpeg3_frame_rate(file
, 0) /
981 mpeg3_get_bytes(file
);
985 return MAX(atime
, vtime
);
988 int mpeg3_end_of_audio(mpeg3_t
*file
, int stream
)
991 if(!file
->atrack
[stream
]->channels
) return 1;
992 result
= mpeg3demux_eof(file
->atrack
[stream
]->demuxer
);
996 int mpeg3_end_of_video(mpeg3_t
*file
, int stream
)
999 result
= mpeg3demux_eof(file
->vtrack
[stream
]->demuxer
);
1004 int mpeg3_drop_frames(mpeg3_t
*file
, long frames
, int stream
)
1008 if(file
->total_vstreams
)
1010 result
= mpeg3video_drop_frames(file
->vtrack
[stream
]->video
,
1012 if(frames
> 0) file
->vtrack
[stream
]->current_position
+= frames
;
1013 file
->last_type_read
= 2;
1014 file
->last_stream_read
= stream
;
1019 int mpeg3_colormodel(mpeg3_t
*file
, int stream
)
1021 if(file
->total_vstreams
)
1023 return mpeg3video_colormodel(file
->vtrack
[stream
]->video
);
1028 int mpeg3_set_rowspan(mpeg3_t
*file
, int bytes
, int stream
)
1030 if(file
->total_vstreams
)
1032 file
->vtrack
[stream
]->video
->row_span
= bytes
;
1038 int mpeg3_read_frame(mpeg3_t
*file
,
1039 unsigned char **output_rows
,
1050 //printf("mpeg3_read_frame 1 %d\n", file->vtrack[stream]->current_position);
1052 if(file
->total_vstreams
)
1054 result
= mpeg3video_read_frame(file
->vtrack
[stream
]->video
,
1055 file
->vtrack
[stream
]->current_position
,
1064 //printf(__FUNCTION__ " 2\n");
1065 file
->last_type_read
= 2;
1066 file
->last_stream_read
= stream
;
1067 file
->vtrack
[stream
]->current_position
++;
1070 //printf("mpeg3_read_frame 2 %d\n", file->vtrack[stream]->current_position);
1074 int mpeg3_read_yuvframe(mpeg3_t
*file
,
1086 //printf("mpeg3_read_yuvframe 1\n");
1087 if(file
->total_vstreams
)
1089 result
= mpeg3video_read_yuvframe(file
->vtrack
[stream
]->video
,
1090 file
->vtrack
[stream
]->current_position
,
1098 file
->last_type_read
= 2;
1099 file
->last_stream_read
= stream
;
1100 file
->vtrack
[stream
]->current_position
++;
1102 //printf("mpeg3_read_yuvframe 100\n");
1106 int mpeg3_read_yuvframe_ptr(mpeg3_t
*file
,
1114 if(file
->total_vstreams
)
1116 result
= mpeg3video_read_yuvframe_ptr(file
->vtrack
[stream
]->video
,
1117 file
->vtrack
[stream
]->current_position
,
1121 file
->last_type_read
= 2;
1122 file
->last_stream_read
= stream
;
1123 file
->vtrack
[stream
]->current_position
++;
1128 int mpeg3_read_audio(mpeg3_t
*file
,
1137 if(file
->total_astreams
)
1139 result
= mpeg3audio_decode_audio(file
->atrack
[stream
]->audio
,
1144 file
->last_type_read
= 1;
1145 file
->last_stream_read
= stream
;
1146 file
->atrack
[stream
]->current_position
+= samples
;
1152 int mpeg3_reread_audio(mpeg3_t
*file
,
1159 if(file
->total_astreams
)
1161 mpeg3_set_sample(file
,
1162 file
->atrack
[stream
]->current_position
- samples
,
1164 file
->last_type_read
= 1;
1165 file
->last_stream_read
= stream
;
1166 return mpeg3_read_audio(file
,
1176 int mpeg3_read_audio_chunk(mpeg3_t
*file
,
1177 unsigned char *output
,
1183 if(file
->total_astreams
)
1185 result
= mpeg3audio_read_raw(file
->atrack
[stream
]->audio
, output
, size
, max_size
);
1186 file
->last_type_read
= 1;
1187 file
->last_stream_read
= stream
;
1192 int mpeg3_read_video_chunk(mpeg3_t
*file
,
1193 unsigned char *output
,
1199 if(file
->total_vstreams
)
1201 result
= mpeg3video_read_raw(file
->vtrack
[stream
]->video
, output
, size
, max_size
);
1202 file
->last_type_read
= 2;
1203 file
->last_stream_read
= stream
;