open_input_file:
avformat_open_input 打开了输入文件
av_dict_get 获取信息
setup_find_stream_info_opts
avformat_find_stream_info
codec = avcodec_find_decoder
open_output_file
avformat_alloc_output_context2(&oc, NULL, o->format, filename)
new_output_stream(o, oc, AVMEDIA_TYPE_VIDEO, source_index)
avcodec_get_context_defaults3(st->codec, ost->enc);
init_input_stream:
有个if (ist->decoding_needed)判断,需要解码就 avcodec_open2;但是咱这里不需要,它只简单的初始化了以下几个:
ist->next_pts = AV_NOPTS_VALUE;
ist->next_dts = AV_NOPTS_VALUE;
ist->is_start = 1;
关于output_stream的初始化:
/* open each encoder */
for (i = 0; i < nb_output_streams; i++) {
ost = output_streams[i];
if (ost->encoding_needed) {
.... 咱这里并不需要编码。
} else {
av_opt_set_dict(ost->st->codec, &ost->opts);
}
在output_packet函数里判断是否需要编码:
if (ist->decoding_needed) { 如果需要编码:decode_audio (ist, &avpkt, &got_output); decode_video (ist, &avpkt, &got_output);
否则do_streamcopy(最终调用av_interleaved_write_frame)
在transcode_init 函数里从 input_xxx 拷贝到 ouput_xxx里的信息:
ost->st->disposition
codec->bits_per_raw_sample
codec->chroma_sample_location
codec->codec_id
codec->codec_type
有一个if判断的拷贝;
codec->bit_rate
codec->rc_max_rate
codec->rc_buffer_size
codec->field_order
codec->extradata ;这里分配内存
codec->extradata_size
codec->bits_per_coded_sample
codec->time_base
有个switch分支内拷贝: