r802: Remove renderframfsclient and renderfarmfsserver .h and .C from Makefile.am...
[cinelerra_cv/mob.git] / libmpeg3 / mpeg3atrack.c
blob57a39ad19b7ddbf13e4a354267a5c99c7f63383a
1 #include "libmpeg3.h"
2 #include "mpeg3protos.h"
4 #include <stdlib.h>
6 mpeg3_atrack_t* mpeg3_new_atrack(mpeg3_t *file,
7 int custom_id,
8 int format,
9 mpeg3_demuxer_t *demuxer,
10 int number)
12 mpeg3_atrack_t *new_atrack;
14 new_atrack = calloc(1, sizeof(mpeg3_atrack_t));
15 if(file->channel_counts)
16 new_atrack->channels = file->channel_counts[number];
17 new_atrack->sample_rate = 0;
18 new_atrack->total_samples = 0;
19 new_atrack->demuxer = mpeg3_new_demuxer(file, 1, 0, custom_id);
20 if(file->seekable)
22 mpeg3demux_copy_titles(new_atrack->demuxer, demuxer);
24 new_atrack->current_position = 0;
25 new_atrack->pid = custom_id;
28 /* Copy pointers */
29 if(file->sample_offsets)
31 new_atrack->sample_offsets = file->sample_offsets[number];
32 new_atrack->total_sample_offsets = file->total_sample_offsets[number];
33 new_atrack->demuxer->stream_end = file->audio_eof[number];
36 new_atrack->audio = mpeg3audio_new(file,
37 new_atrack,
38 format);
40 if(!new_atrack->audio)
42 /* Failed */
43 mpeg3_delete_atrack(file, new_atrack);
44 new_atrack = 0;
47 return new_atrack;
50 int mpeg3_delete_atrack(mpeg3_t *file, mpeg3_atrack_t *atrack)
52 if(atrack->audio) mpeg3audio_delete(atrack->audio);
53 if(atrack->demuxer) mpeg3_delete_demuxer(atrack->demuxer);
54 if(atrack->sample_offsets && atrack->private_offsets)
56 free(atrack->sample_offsets);
58 free(atrack);
59 return 0;
62 void mpeg3_append_samples(mpeg3_atrack_t *atrack, int64_t offset)
64 if(atrack->total_sample_offsets >= atrack->sample_offsets_allocated)
66 atrack->sample_offsets_allocated =
67 MAX(atrack->total_sample_offsets * 2, 1024);
68 atrack->sample_offsets = realloc(atrack->sample_offsets,
69 sizeof(int64_t) * atrack->sample_offsets_allocated);
71 atrack->sample_offsets[atrack->total_sample_offsets++] =
72 offset;
73 atrack->private_offsets = 1;