ffmpeg中的h264解码器流程
ffmpeg解码器可用demo的主干流程如下:
流程图中关键函数的作用如下所列:
avcodec_register_all():注册所有的编解码器。
avcodec_find_decoder():查找解码器。
avcodec_alloc_context3():为AVCodecContext分配内存。
avcodec_open2():打开解码器。
avcodec_decode_video2():解码一帧数据。
其中的parser部分函数:
av_parser_init():初始化AVCodecParserContext。
av_parser_parse2():解析获得一个Packet。
这里也可以不使用parser函数获取Packet,而自己根据需求定义packet。
两个存储数据的结构体如下所列:
AVFrame:存储一帧解码后的像素数据
AVPacket:存储一帧(一般情况下)压缩编码数据
具体的解码流程如下:
其中AVCodec结构体包含了编码解码器的所有信息,调用codec->init()之后会注册给具体的函数指针操作,这里就是注册264解码器。ff_h264_decode_int会去创建解码器句柄和做各种初始化工作。之后调用codec->encode2()之后就会调用解码器具体的函数指针进行解码:decode_nal_units。解码根据nal类型不断解码,当nal类型为I,P,B,SP,SI slice的时候就会调用ff_h264_execute_decode_slices做具体的解码操作。
ff_h264_execute_decode_slices函数主要就是根据pps中的entropy_coding_mode_flag的值选择进行cabac或者cavlc的解码。最后调用ff_h264_hl_decode_mb解码宏块数据,最后调用环路滤波进行块效应消除。具体这一部分内部的解码函数还非常复杂,包括预测,逆变化,逆量化,重建等等,还需要时间分析。
- 点赞
- 收藏
- 关注作者
评论(0)