avcodec_init主要包括dsp_static_init函数,而dsp_static_init函数主要负责静态查找表结构的初始化。在baseline中,主要是初始化ff_cropTbl。这个表很有意思,a = ff_cropTble[i]实现的功能实际上是a = i<0 ? 0 : (i>255 ? 255 : i);这个表的大小是2*MAX_NEG_CROP+256, 当MAX_NEG_CROP定义为1024时,实际上这个表可将-1024至1024的任意数转化为0-255的数。这样设计的实质是用查找表方式来减少所需执行的指令数量,是用空间上的代价来换取速度的提高,这是一种典型的优化方式。 avcodec_register_all主要包括register_avcodec(&h264_decoder),这个函数主要负责登记所需的编解码器,在ffmpeg中包括各种编解码器,要将它们登记在一个编解码器列表中,在本设计中,该列表只包括h264解码器。 video_decode_example分以下几个函数: avcodec_find_decoder:在登记的编解码器列表中找到h264解码器(通过CodecID); avcodec_alloc_context: 主要包括avcodec_get_context_defaults2函数。它负责初始化AVCodecContext中的某些函数指针(get_buffer, release_buffer)及某些参数设置(thread_count); avcodec_alloc_frame: 主要包括avcodec_get_frame_default函数。主要是分配AVFrame的空间,初始化一些属性(如key_frame=1),并返回指向AVFrame的指针; avcodec_open:为H264Context(它是avctx->priv_data)分配空间(122712字节),并清0; 设置AVCodecContext结构体中的codec,codec_id, frame_number,并利用avctx->codec->init (decode_init)来初始化解码器。 ff_h264_pred_init:初始化帧内预测函数的指针,包括9+3种4*4块,4+3种8*8色度块和 4+3种16*16 decode_init_vlc: 建立CAVLC相关的表格(包括chroma_dc_coeff_token, coeff_token, total_zeros, run_before)。主要通过init_vlc函数实现。init_vlc:建立某个CAVLC的表格,主要通过build_table实现。 打开图像文件; 进入无限循环体for(;;) 读入INBUF_SIZE大小的数据,若返回为0,刚break avcodec_decode_video函数;(下面单独讲此函数) 如果解码完一帧图像,则执行yuv_output,其实就是将yuv数据写到.yuv文件里 循环体结尾; (myyb) |