00001
00002
00003 #include "funcprotos.h"
00004 #include "quicktime.h"
00005
00006
00007
00008
00009 #define MAX_VBR_BUFFER 0x200000
00010
00011
00012
00013 void quicktime_init_vbr(quicktime_vbr_t *ptr, int channels)
00014 {
00015 ptr->channels = channels;
00016 if(!ptr->output_buffer)
00017 {
00018 int i;
00019 ptr->output_buffer = calloc(channels, sizeof(double*));
00020 for(i = 0; i < channels; i++)
00021 ptr->output_buffer[i] = calloc(MAX_VBR_BUFFER, sizeof(double));
00022 }
00023 }
00024
00025 void quicktime_clear_vbr(quicktime_vbr_t *ptr)
00026 {
00027 int i;
00028
00029 if(ptr->output_buffer)
00030 {
00031 for(i = 0; i < ptr->channels; i++)
00032 free(ptr->output_buffer[i]);
00033 free(ptr->output_buffer);
00034 }
00035
00036 if(ptr->input_buffer)
00037 {
00038 free(ptr->input_buffer);
00039 }
00040 }
00041
00042 void quicktime_vbr_set_channels(quicktime_vbr_t *ptr, int channels)
00043 {
00044 ptr->channels = channels;
00045 }
00046
00047 int64_t quicktime_vbr_end(quicktime_vbr_t *ptr)
00048 {
00049 return ptr->buffer_end;
00050 }
00051
00052 unsigned char* quicktime_vbr_input(quicktime_vbr_t *ptr)
00053 {
00054 return ptr->input_buffer;
00055 }
00056
00057 int quicktime_vbr_input_size(quicktime_vbr_t *ptr)
00058 {
00059 return ptr->input_size;
00060 }
00061
00062 static int limit_samples(int samples)
00063 {
00064 if(samples > MAX_VBR_BUFFER)
00065 {
00066 fprintf(stderr,
00067 "quicktime_align_vbr: can't decode more than %p samples at a time.\n",
00068 MAX_VBR_BUFFER);
00069 return 1;
00070 }
00071 return 0;
00072 }
00073
00074 int quicktime_align_vbr(quicktime_audio_map_t *atrack,
00075 int samples)
00076 {
00077 quicktime_vbr_t *ptr = &atrack->vbr;
00078 int64_t start_position = atrack->current_position;
00079
00080 if(limit_samples(samples)) return 1;
00081
00082
00083
00084 if(start_position < ptr->buffer_end - ptr->buffer_size ||
00085 start_position > ptr->buffer_end)
00086 {
00087 int64_t start_time = start_position;
00088 ptr->sample = quicktime_time_to_sample(&atrack->track->mdia.minf.stbl.stts,
00089 &start_time);
00090 ptr->buffer_end = start_time;
00091 ptr->buffer_size = 0;
00092 }
00093
00094 return 0;
00095 }
00096
00097 int quicktime_read_vbr(quicktime_t *file,
00098 quicktime_audio_map_t *atrack)
00099 {
00100 quicktime_vbr_t *vbr = &atrack->vbr;
00101 quicktime_trak_t *trak = atrack->track;
00102 int64_t offset = quicktime_sample_to_offset(file,
00103 trak,
00104 vbr->sample);
00105 int size = quicktime_sample_size(trak, vbr->sample);
00106 int new_allocation = vbr->input_size + size;
00107 int result = 0;
00108
00109 if(vbr->input_allocation < new_allocation)
00110 {
00111 vbr->input_buffer = realloc(vbr->input_buffer, new_allocation);
00112 vbr->input_allocation = new_allocation;
00113 }
00114
00115
00116 quicktime_set_position(file, offset);
00117 result = !quicktime_read_data(file, vbr->input_buffer + vbr->input_size, size);
00118 vbr->input_size += size;
00119 vbr->sample++;
00120 return result;
00121 }
00122
00123 void quicktime_shift_vbr(quicktime_audio_map_t *atrack, int bytes)
00124 {
00125 quicktime_vbr_t *vbr = &atrack->vbr;
00126 if(bytes >= vbr->input_size)
00127 {
00128 vbr->input_size = 0;
00129 }
00130 else
00131 {
00132 int i, j;
00133 for(i = 0, j = bytes; j < vbr->input_size; i++, j++)
00134 vbr->input_buffer[i] = vbr->input_buffer[j];
00135 vbr->input_size -= bytes;
00136 }
00137 }
00138
00139 void quicktime_store_vbr_float(quicktime_audio_map_t *atrack,
00140 float *samples,
00141 int sample_count)
00142 {
00143 int i, j;
00144 quicktime_vbr_t *vbr = &atrack->vbr;
00145 for(i = 0; i < sample_count; i++)
00146 {
00147 for(j = 0; j < vbr->channels; j++)
00148 {
00149 vbr->output_buffer[j][vbr->buffer_ptr] =
00150 samples[i * vbr->channels + j];
00151 }
00152 vbr->buffer_ptr++;
00153 if(vbr->buffer_ptr >= MAX_VBR_BUFFER)
00154 vbr->buffer_ptr = 0;
00155 }
00156 vbr->buffer_end += sample_count;
00157 vbr->buffer_size += sample_count;
00158 if(vbr->buffer_size > MAX_VBR_BUFFER) vbr->buffer_size = MAX_VBR_BUFFER;
00159 }
00160
00161 void quicktime_copy_vbr_float(quicktime_vbr_t *vbr,
00162 int64_t start_position,
00163 int samples,
00164 float *output,
00165 int channel)
00166 {
00167 int i, j;
00168 int input_ptr = vbr->buffer_ptr -
00169 (vbr->buffer_end - start_position);
00170 while(input_ptr < 0) input_ptr += MAX_VBR_BUFFER;
00171
00172 for(i = 0; i < samples; i++)
00173 {
00174 output[i] = vbr->output_buffer[channel][input_ptr++];
00175 if(input_ptr >= MAX_VBR_BUFFER)
00176 input_ptr = 0;
00177 }
00178 }
00179
00180
00181 void quicktime_copy_vbr_int16(quicktime_vbr_t *vbr,
00182 int64_t start_position,
00183 int samples,
00184 int16_t *output,
00185 int channel)
00186 {
00187 int i, j;
00188 int input_ptr = vbr->buffer_ptr -
00189 (vbr->buffer_end - start_position);
00190 while(input_ptr < 0) input_ptr += MAX_VBR_BUFFER;
00191
00192 for(i = 0; i < samples; i++)
00193 {
00194 output[i] = (int)(vbr->output_buffer[channel][input_ptr++] * 32767);
00195 if(input_ptr >= MAX_VBR_BUFFER)
00196 input_ptr = 0;
00197 }
00198 }
00199
00200
00201