lqt_codecs.c

来自「这个库实现了录象功能」· C语言 代码 · 共 1,088 行 · 第 1/3 页

C
1,088
字号
static int decode_audio_old(quicktime_t *file,                             int16_t ** output_i,                             float ** output_f,                             long samples,                             int track)  {  int result;  quicktime_audio_map_t * atrack;  atrack = &(file->atracks[track]);  if(atrack->sample_format == LQT_SAMPLE_UNDEFINED)    ((quicktime_codec_t*)(atrack->codec))->decode_audio(file, (void*)0,                                                         0, track);      /* (Re)allocate sample buffer */  if(atrack->sample_buffer_alloc < samples)    {    atrack->sample_buffer_alloc = samples + 1024;    atrack->sample_buffer = realloc(atrack->sample_buffer,                                    atrack->sample_buffer_alloc *                                    atrack->channels *                                    bytes_per_sample(atrack->sample_format));    }    /* Decode */  result = ((quicktime_codec_t*)(atrack->codec))->decode_audio(file, atrack->sample_buffer,                                                                samples,                                                               track);    /* Convert */  lqt_convert_audio_decode(file, atrack->sample_buffer, output_i, output_f,                           atrack->channels, samples,                           atrack->sample_format);  return result;  }int quicktime_decode_audio(quicktime_t *file,                            int16_t *output_i,                            float *output_f,                            long samples,                            int channel){        float   ** channels_f;        int16_t ** channels_i;        int quicktime_track, quicktime_channel;	int result = 1;        quicktime_channel_location(file, &quicktime_track,                                   &quicktime_channel, channel);        if(file->atracks[quicktime_track].eof)          return 1;                if(output_i)          {          channels_i = calloc(quicktime_track_channels(file, quicktime_track), sizeof(*channels_i));          channels_i[quicktime_channel] = output_i;          }        else          channels_i = (int16_t**)0;                if(output_f)          {          channels_f = calloc(quicktime_track_channels(file, quicktime_track), sizeof(*channels_f));          channels_f[quicktime_channel] = output_f;          }        else          channels_f = (float**)0;        	result = decode_audio_old(file, channels_i, channels_f, samples, quicktime_track);	file->atracks[quicktime_track].current_position += result;        if(channels_i)          free(channels_i);        else if(channels_f)          free(channels_f);	return ((result < 0) ? 1 : 0);}int lqt_total_channels(quicktime_t *file){	int i = 0, total_channels = 0;	for( i=0; i < file->total_atracks; i++ )	{		total_channels += file->atracks[i].channels;	}	return total_channels;}/* * Same as quicktime_decode_audio, but it grabs all channels at * once. Or if you want only some channels you can leave the channels * you don't want = NULL in the poutput array. The poutput arrays * must contain at least lqt_total_channels(file) elements. */int lqt_decode_audio(quicktime_t *file, 				int16_t **poutput_i, 				float **poutput_f, 				long samples){	int result = 1;	int i = 0;	int16_t **output_i;	float   **output_f;	int total_tracks = quicktime_audio_tracks(file);        int track_channels;        if(poutput_i)          output_i = poutput_i;        else          output_i = (int16_t**)0;        if(poutput_f)          output_f = poutput_f;        else          output_f = (float**)0;        	for( i=0; i < total_tracks; i++ )          {          track_channels = quicktime_track_channels(file, i);          if(file->atracks[i].eof)            return 1;                              result = decode_audio_old(file, output_i, output_f, samples, i);          if(output_f)            output_f += track_channels;          if(output_i)            output_i += track_channels;          file->atracks[i].current_position += samples;          }	return result;}int lqt_decode_audio_track(quicktime_t *file,                            int16_t **poutput_i,                            float **poutput_f,                            long samples,                           int track)  {  int result = 1;  if(file->atracks[track].eof)    return 1;              result = !decode_audio_old(file, poutput_i, poutput_f, samples, track);    file->atracks[track].current_position += samples;    return result;  }static int encode_audio_old(quicktime_t *file,                      int16_t **input_i,                      float **input_f,                      long samples,                     int track)  {  quicktime_audio_map_t * atrack;  atrack = &(file->atracks[track]);  start_encoding(file);    if(!samples)    return 0;    if(atrack->sample_format == LQT_SAMPLE_UNDEFINED)    ((quicktime_codec_t*)(atrack->codec))->encode_audio(file, (void*)0,                                                         0, track);    /* (Re)allocate sample buffer */  if(atrack->sample_buffer_alloc < samples)    {    atrack->sample_buffer_alloc = samples + 1024;    atrack->sample_buffer = realloc(atrack->sample_buffer,                                    atrack->sample_buffer_alloc *                                    atrack->channels *                                    bytes_per_sample(atrack->sample_format));    }  /* Convert */  lqt_convert_audio_encode(file, input_i, input_f, atrack->sample_buffer, atrack->channels, samples,                           atrack->sample_format);  /* Encode */  file->atracks[track].current_position += samples;    return ((quicktime_codec_t*)(atrack->codec))->encode_audio(file, atrack->sample_buffer,                                                             samples, track);    }int lqt_encode_audio_track(quicktime_t *file,                            int16_t **input_i,                            float **input_f,                            long samples,                           int track)  {	int result = 1;	result = encode_audio_old(file, input_i, input_f, samples, track);        return result;    }int quicktime_encode_audio(quicktime_t *file, int16_t **input_i, float **input_f, long samples)  {  return lqt_encode_audio_track(file, input_i, input_f, samples, 0);  }int quicktime_reads_cmodel(quicktime_t *file, 	int colormodel, 	int track){        return lqt_colormodel_has_conversion(file->vtracks[track].stream_cmodel, colormodel);}int quicktime_writes_cmodel(quicktime_t *file, 	int colormodel, 	int track){        return lqt_colormodel_has_conversion(colormodel, file->vtracks[track].stream_cmodel);}/* Compressors that can only encode a window at a time *//* need to flush extra data here. */static int quicktime_flush_acodec(quicktime_t *file, int track){	((quicktime_codec_t*)file->atracks[track].codec)->flush(file, track);	return 0;};static void quicktime_flush_vcodec(quicktime_t *file, int track)  {  int64_t dts, stts_index, stts_count;  quicktime_stts_t * stts;  stts = &file->vtracks[track].track->mdia.minf.stbl.stts;  /* First, we set the final stts */  stts->table[stts->total_entries-1].sample_count++;    while(((quicktime_codec_t*)file->vtracks[track].codec)->flush(file, track))    {    dts = quicktime_sample_to_time(stts,                                   file->vtracks->current_chunk-2,                                   &stts_index, &stts_count);        quicktime_update_ctts(&file->vtracks[track].track->mdia.minf.stbl.ctts,                          file->vtracks[track].current_chunk - 2,                          file->vtracks[track].coded_timestamp - dts);    }  /* Fix stts for timecode track */  if(file->vtracks[track].timecode_track &&     file->vtracks[track].timecodes_written)    {    int64_t duration;    quicktime_trak_duration(file->vtracks[track].track,                            &duration, (int*)0);    lqt_flush_timecode(file, track, duration, 1);    }  }int quicktime_codecs_flush(quicktime_t *file){	int result = 0;	int i;	if(!file->wr) return result;	if(file->total_atracks)	{		for(i = 0; i < file->total_atracks && !result; i++)		{			quicktime_flush_acodec(file, i);		}	}	if(file->total_vtracks)	{		for(i = 0; i < file->total_vtracks && !result; i++)		{                quicktime_flush_vcodec(file, i);		}	}	return result;}/* Copy audio */int lqt_copy_audio(int16_t ** dst_i, float ** dst_f,                   int16_t ** src_i, float ** src_f,                   int dst_pos, int src_pos,                   int dst_size, int src_size, int num_channels)  {    int i, j, i_tmp;  int samples_to_copy;  samples_to_copy = src_size < dst_size ? src_size : dst_size;    if(src_i)    {    for(i = 0; i < num_channels; i++)      {      if(dst_i && dst_i[i]) /* int -> int */        {        memcpy(dst_i[i] + dst_pos, src_i[i] + src_pos, samples_to_copy * sizeof(int16_t));        }      if(dst_f && dst_f[i]) /* int -> float */        {        for(j = 0; j < samples_to_copy; j++)          {          dst_f[i][dst_pos + j] = (float)src_i[i][src_pos + j] / 32767.0;          }        }      }    }  else if(src_f)    {    for(i = 0; i < num_channels; i++)      {      if(dst_i && dst_i[i]) /* float -> int */        {        for(j = 0; j < samples_to_copy; j++)          {          i_tmp = (int)(src_f[i][src_pos + j] * 32767.0);                    if(i_tmp > 32767)            i_tmp = 32767;          if(i_tmp < -32768)            i_tmp = -32768;                    dst_i[i][dst_pos + j] = i_tmp;          }        }      if(dst_f && dst_f[i]) /* float -> float */        {        memcpy(dst_f[i] + dst_pos, src_f[i] + src_pos, samples_to_copy * sizeof(float));        }      }    }  return samples_to_copy;  }

⌨️ 快捷键说明

复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?