00001 #include "mpeg3private.h"
00002 #include "mpeg3protos.h"
00003
00004 #include <stdlib.h>
00005 #include <string.h>
00006
00007
00008 mpeg3_strack_t* mpeg3_new_strack(int id)
00009 {
00010 mpeg3_strack_t *result = calloc(sizeof(mpeg3_strack_t), 1);
00011 result->id = id;
00012 return result;
00013 }
00014
00015 void mpeg3_delete_strack(mpeg3_strack_t *ptr)
00016 {
00017 int i;
00018 for(i = 0; i < ptr->total_subtitles; i++)
00019 {
00020 mpeg3_delete_subtitle(ptr->subtitles[i]);
00021 }
00022 if(ptr->subtitles) free(ptr->subtitles);
00023 if(ptr->offsets) free(ptr->offsets);
00024 free(ptr);
00025 }
00026
00027 void mpeg3_delete_subtitle(mpeg3_subtitle_t *subtitle)
00028 {
00029 if(subtitle->data) free(subtitle->data);
00030 if(subtitle->image_y) free(subtitle->image_y);
00031 if(subtitle->image_u) free(subtitle->image_u);
00032 if(subtitle->image_v) free(subtitle->image_v);
00033 if(subtitle->image_a) free(subtitle->image_a);
00034 free(subtitle);
00035 }
00036
00037
00038 void mpeg3_copy_strack(mpeg3_strack_t *dst, mpeg3_strack_t *src)
00039 {
00040 dst->id = src->id;
00041 dst->offsets = calloc(sizeof(int64_t) * src->allocated_offsets, 1);
00042 memcpy(dst->offsets, src->offsets, sizeof(int64_t) * src->total_offsets);
00043 dst->total_offsets = src->total_offsets;
00044 dst->allocated_offsets = src->allocated_offsets;
00045 }
00046
00047 mpeg3_strack_t* mpeg3_get_strack_id(mpeg3_t *file, int id)
00048 {
00049 int i;
00050 for(i = 0; i < file->total_sstreams; i++)
00051 {
00052 if(file->strack[i]->id == id) return file->strack[i];
00053 }
00054 return 0;
00055 }
00056
00057 mpeg3_strack_t* mpeg3_get_strack(mpeg3_t *file, int number)
00058 {
00059 int i;
00060 if(number >= file->total_sstreams || number < 0) return 0;
00061 return file->strack[number];
00062 }
00063
00064 mpeg3_strack_t* mpeg3_create_strack(mpeg3_t *file, int id)
00065 {
00066 int i;
00067 int j;
00068 mpeg3_strack_t *result = 0;
00069
00070 if(!(result = mpeg3_get_strack_id(file, id)))
00071 {
00072 result = mpeg3_new_strack(id);
00073 for(i = 0; i < file->total_sstreams; i++)
00074 {
00075
00076 if(file->strack[i]->id > id)
00077 {
00078
00079 for(j = file->total_sstreams; j >= i; j--)
00080 {
00081 file->strack[j] = file->strack[j - 1];
00082 }
00083 break;
00084 }
00085 }
00086
00087
00088 file->strack[i] = result;
00089 file->total_sstreams++;
00090 }
00091
00092 return result;
00093 }
00094
00095 void mpeg3_append_subtitle_offset(mpeg3_strack_t *dst, int64_t program_offset)
00096 {
00097 int new_total = dst->total_offsets + 1;
00098 if(new_total >= dst->allocated_offsets)
00099 {
00100 int new_allocated = MAX(new_total, dst->allocated_offsets * 2);
00101 int64_t *new_offsets = malloc(sizeof(int64_t) * new_allocated);
00102
00103 if(dst->offsets)
00104 {
00105 memcpy(new_offsets, dst->offsets, dst->total_offsets * sizeof(int64_t));
00106 free(dst->offsets);
00107 }
00108
00109 dst->offsets = new_offsets;
00110 dst->allocated_offsets = new_allocated;
00111 }
00112
00113 dst->offsets[dst->total_offsets++] = program_offset;
00114 }
00115
00116 void mpeg3_append_subtitle(mpeg3_strack_t *strack, mpeg3_subtitle_t *subtitle)
00117 {
00118 int new_total = strack->total_subtitles + 1;
00119 if(new_total >= strack->allocated_subtitles)
00120 {
00121 int new_allocated = MAX(new_total, strack->allocated_subtitles * 2);
00122 mpeg3_subtitle_t **new_subtitles = malloc(sizeof(mpeg3_subtitle_t*) * new_allocated);
00123
00124
00125 if(strack->subtitles)
00126 {
00127 memcpy(new_subtitles,
00128 strack->subtitles,
00129 strack->total_subtitles * sizeof(mpeg3_subtitle_t*));
00130 free(strack->subtitles);
00131 }
00132
00133 strack->subtitles = new_subtitles;
00134 strack->allocated_subtitles = new_allocated;
00135 }
00136
00137 strack->subtitles[strack->total_subtitles++] = subtitle;
00138
00139
00140 while(strack->total_subtitles > MPEG3_MAX_SUBTITLES)
00141 mpeg3_pop_subtitle(strack, 0, 1);
00142 }
00143
00144 void mpeg3_pop_subtitle(mpeg3_strack_t *strack, int number, int delete_it)
00145 {
00146 int i;
00147 if(strack->total_subtitles)
00148 {
00149 if(delete_it) mpeg3_delete_subtitle(strack->subtitles[number]);
00150 for(i = number; i < strack->total_subtitles - 1; i++)
00151 strack->subtitles[i] = strack->subtitles[i + 1];
00152 strack->total_subtitles--;
00153 }
00154 }
00155
00156
00157 void mpeg3_pop_all_subtitles(mpeg3_strack_t *strack)
00158 {
00159 int i;
00160 for(i = 0; i < strack->total_subtitles; i++)
00161 {
00162 mpeg3_delete_subtitle(strack->subtitles[i]);
00163 }
00164 strack->total_subtitles = 0;
00165 }
00166
00167
00168 mpeg3_subtitle_t* mpeg3_get_subtitle(mpeg3_strack_t *strack)
00169 {
00170 int i;
00171 for(i = 0; i < strack->total_subtitles; i++)
00172 {
00173 if(!strack->subtitles[i]->active)
00174 return strack->subtitles[i];
00175 }
00176 return 0;
00177 }
00178
00179 int mpeg3_subtitle_tracks(mpeg3_t *file)
00180 {
00181 return file->total_sstreams;
00182 }
00183
00184 void mpeg3_show_subtitle(mpeg3_t *file, int track)
00185 {
00186 file->subtitle_track = track;
00187 }
00188
00189 void mpeg3_reset_subtitles(mpeg3_t *file)
00190 {
00191 int i;
00192 for(i = 0; i < file->total_sstreams; i++)
00193 {
00194 mpeg3_pop_all_subtitles(file->strack[i]);
00195 }
00196 }
00197
00198