x264代码剖析(七):encode()函数之x264_encoder_encode()函数

本文详细剖析了x264 Encoder的x264_encoder_encode()函数,它是编码过程的核心,涉及帧获取、帧类型决定、参考帧更新等多个关键步骤。通过调用一系列辅助函数,实现H.264视频编码,包括码率控制、Slice Header初始化及编码数据的写入等核心操作。
摘要由CSDN通过智能技术生成

x264代码剖析(七):encode()函数之x264_encoder_encode()函数

 

        encode()函数是x264的主干函数,主要包括x264_encoder_open()函数、x264_encoder_headers()函数、x264_encoder_encode()函数与x264_encoder_close()函数四大部分,其中x264_encoder_encode()函数是其核心部分,具体的H.264视频编码算法均在此模块。上两篇博文主要分析了x264_encoder_open()函数与x264_encoder_headers()函数,本文主要学习x264_encoder_encode()函数。

 

        在《x264代码剖析(三):主函数main()、解析函数parse()与编码函数encode()》的介绍中,我们知道x264_encoder_encode()函数被encode_frame()函数调用,而encode_frame()函数被encode()函数调用,encode()函数又被main()函数调用。由于main()函数、encode()函数与encode_frame()函数对应的代码已经分析完毕,本文主要分析x264_encoder_encode()函数。x264_encoder_encode()函数编码一帧YUVH.264码流,对应的函数关系图如下,主要调用了下面的函数:

        x264_frame_pop_unused():获取1x264_frame_t类型结构体fenc。如果frames.unused[]队列不为空,就调用x264_frame_pop()unused[]队列取1个现成的;否则就调用x264_frame_new()创建一个新的。

        x264_frame_copy_picture():将输入的图像数据拷贝至fenc

        x264_lookahead_put_frame():将fenc放入lookahead.next.list[]队列,等待确定帧类型。

        x264_lookahead_get_frames():通过lookahead分析帧类型。该函数调用了x264_slicetype_decide()x264_slicetype_analyse()x264_slicetype_frame_cost()等函数。经过一些列分析之后,最终确定了帧类型信息,并且将帧放入frames.current[]队列。

        x264_frame_shift():从frames.current[]队列取出1帧用于编码。

        x264_reference_update():更新参考帧队列。

        x264_reference_reset():如果为IDR帧,调用该函数清空参考帧列表。

        x264_reference_hierarchy_reset():如果是非IDRI帧、P帧、B帧(可做为参考帧),调用该函数。

        x264_reference_build_list():创建参考帧列表list0list1

        x264_ratecontrol_start():开启码率控制。

        x264_slice_init():创建 Slice Header

        x264_slices_write():编码数据(最关键的步骤)。其中调用了x264_slice_write()完成了编码的工作(注意“x264_slices_write()”和“x264_slice_write()”名字差了一个“s”)。

        x264_encoder_frame_end():编码结束后做一些后续处理,例如记录一些统计信息。其中调用了x264_encoder_encapsulate_nals()封装NALU(添加起始码),调用x264_frame_push_unused()fenc重新放回frames.unused[]队列,并且调用

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值