ffmpeg中的h264解码器流程

举报
费德勒 发表于 2017/03/24 15:56:56 2017/03/24
【摘要】 本文主要介绍了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解码宏块数据,最后调用环路滤波进行块效应消除。具体这一部分内部的解码函数还非常复杂,包括预测,逆变化,逆量化,重建等等,还需要时间分析。

作者 | 夏彬峰

转载请注明出处:华为云博客 https://portal.hwclouds.com/blogs

【版权声明】本文为华为云社区用户原创内容,转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息, 否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。