00001 #include "libmpeg3.h"
00002 #include "mpeg3protos.h"
00003
00004 #include <stdlib.h>
00005
00006 mpeg3_vtrack_t* mpeg3_new_vtrack(mpeg3_t *file,
00007 int custom_id,
00008 mpeg3_demuxer_t *demuxer,
00009 int number)
00010 {
00011 int result = 0;
00012 mpeg3_vtrack_t *new_vtrack;
00013
00014 new_vtrack = calloc(1, sizeof(mpeg3_vtrack_t));
00015 new_vtrack->demuxer = mpeg3_new_demuxer(file, 0, 1, custom_id);
00016 new_vtrack->frame_cache = mpeg3_new_cache();
00017 if(file->seekable)
00018 {
00019 mpeg3demux_copy_titles(new_vtrack->demuxer, demuxer);
00020 }
00021 new_vtrack->current_position = 0;
00022 new_vtrack->pid = custom_id;
00023
00024
00025 if(file->frame_offsets)
00026 {
00027 new_vtrack->frame_offsets = file->frame_offsets[number];
00028 new_vtrack->total_frame_offsets = file->total_frame_offsets[number];
00029 new_vtrack->keyframe_numbers = file->keyframe_numbers[number];
00030 new_vtrack->total_keyframe_numbers = file->total_keyframe_numbers[number];
00031 new_vtrack->demuxer->stream_end = file->video_eof[number];
00032 }
00033
00034
00035 new_vtrack->video = mpeg3video_new(file,
00036 new_vtrack);
00037
00038 if(!new_vtrack->video)
00039 {
00040
00041 mpeg3_delete_vtrack(file, new_vtrack);
00042 new_vtrack = 0;
00043 }
00044
00045
00046 return new_vtrack;
00047 }
00048
00049 int mpeg3_delete_vtrack(mpeg3_t *file, mpeg3_vtrack_t *vtrack)
00050 {
00051 if(vtrack->video) mpeg3video_delete(vtrack->video);
00052 if(vtrack->demuxer) mpeg3_delete_demuxer(vtrack->demuxer);
00053 if(vtrack->private_offsets)
00054 {
00055 if(vtrack->frame_offsets) free(vtrack->frame_offsets);
00056 if(vtrack->keyframe_numbers) free(vtrack->keyframe_numbers);
00057 }
00058 mpeg3_delete_cache(vtrack->frame_cache);
00059
00060 int i;
00061 for(i = 0; i < vtrack->total_subtitles; i++)
00062 {
00063 mpeg3_delete_subtitle(vtrack->subtitles[i]);
00064 }
00065 if(vtrack->subtitles) free(vtrack->subtitles);
00066 free(vtrack);
00067 return 0;
00068 }
00069
00070 static int last_keyframe = 0;
00071 void mpeg3_append_frame(mpeg3_vtrack_t *vtrack, int64_t offset, int is_keyframe)
00072 {
00073 if(vtrack->total_frame_offsets >= vtrack->frame_offsets_allocated)
00074 {
00075 vtrack->frame_offsets_allocated =
00076 MAX(vtrack->total_frame_offsets * 2, 1024);
00077 vtrack->frame_offsets = realloc(vtrack->frame_offsets,
00078 sizeof(int64_t) * vtrack->frame_offsets_allocated);
00079 }
00080
00081 vtrack->frame_offsets[vtrack->total_frame_offsets++] = offset;
00082
00083 if(is_keyframe)
00084 {
00085 if(vtrack->total_keyframe_numbers >= vtrack->keyframe_numbers_allocated)
00086 {
00087 vtrack->keyframe_numbers_allocated =
00088 MAX(vtrack->total_keyframe_numbers * 2, 1024);
00089 vtrack->keyframe_numbers = realloc(vtrack->keyframe_numbers,
00090 sizeof(int64_t) * vtrack->keyframe_numbers_allocated);
00091 }
00092
00093
00094
00095 int corrected_frame = vtrack->total_frame_offsets - 2;
00096 if(corrected_frame < 0) corrected_frame = 0;
00097 vtrack->keyframe_numbers[vtrack->total_keyframe_numbers++] =
00098 corrected_frame;
00099 }
00100
00101 vtrack->private_offsets = 1;
00102 }
00103
00104
00105
00106
00107
00108