00001 #include "libmpeg3.h"
00002 #include "mpeg3protos.h"
00003
00004 #include <stdlib.h>
00005
00006 mpeg3_atrack_t* mpeg3_new_atrack(mpeg3_t *file,
00007 int custom_id,
00008 int format,
00009 mpeg3_demuxer_t *demuxer,
00010 int number)
00011 {
00012 mpeg3_atrack_t *new_atrack;
00013
00014 new_atrack = calloc(1, sizeof(mpeg3_atrack_t));
00015 if(file->channel_counts)
00016 new_atrack->channels = file->channel_counts[number];
00017 new_atrack->sample_rate = 0;
00018 new_atrack->total_samples = 0;
00019 new_atrack->demuxer = mpeg3_new_demuxer(file, 1, 0, custom_id);
00020 if(file->seekable)
00021 {
00022 mpeg3demux_copy_titles(new_atrack->demuxer, demuxer);
00023 }
00024 new_atrack->current_position = 0;
00025 new_atrack->pid = custom_id;
00026
00027
00028
00029 if(file->sample_offsets)
00030 {
00031 new_atrack->sample_offsets = file->sample_offsets[number];
00032 new_atrack->total_sample_offsets = file->total_sample_offsets[number];
00033 new_atrack->total_samples = file->total_samples[number];
00034 new_atrack->demuxer->stream_end = file->audio_eof[number];
00035 }
00036
00037 new_atrack->audio = mpeg3audio_new(file,
00038 new_atrack,
00039 format);
00040
00041 if(!new_atrack->audio)
00042 {
00043
00044 mpeg3_delete_atrack(file, new_atrack);
00045 new_atrack = 0;
00046 }
00047
00048 return new_atrack;
00049 }
00050
00051 int mpeg3_delete_atrack(mpeg3_t *file, mpeg3_atrack_t *atrack)
00052 {
00053 if(atrack->audio) mpeg3audio_delete(atrack->audio);
00054 if(atrack->demuxer) mpeg3_delete_demuxer(atrack->demuxer);
00055 if(atrack->sample_offsets && atrack->private_offsets)
00056 {
00057 free(atrack->sample_offsets);
00058 }
00059 free(atrack);
00060 return 0;
00061 }
00062
00063 void mpeg3_append_samples(mpeg3_atrack_t *atrack, int64_t offset)
00064 {
00065 if(atrack->total_sample_offsets >= atrack->sample_offsets_allocated)
00066 {
00067 atrack->sample_offsets_allocated =
00068 MAX(atrack->total_sample_offsets * 2, 1024);
00069 atrack->sample_offsets = realloc(atrack->sample_offsets,
00070 sizeof(int64_t) * atrack->sample_offsets_allocated);
00071 }
00072 atrack->sample_offsets[atrack->total_sample_offsets++] =
00073 offset;
00074 atrack->private_offsets = 1;
00075 }
00076
00077
00078
00079