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 + -
显示快捷键?