x264中比特流的存储结构

本文介绍了H.264编码过程中NAL单元和比特流的数据结构,包括NAL单元的类型、优先级、长度及数据地址等属性;详细解释了比特流的起始、当前位置及结束指针,以及数据写入和长度计算的过程。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

转自:http://qiudw1020.blog.163.com/blog/static/12091345620098110342609/

在未包含熵编码时,这涉及到3个结构体

NAL单元的数据结构:

typedef struct

{   int i_ref_idc;    //指该NAL单元的优先级

    int i_type;       //指该NAL单元的类型

    int i_payload;     //该nal单元包含的字节数

    uint8_t *p_payload;//该NAL单元存储数据的开始地址

} x264_nal_t;

比特流的数据结构:

typedef struct bs_s

{

    uint8_t *p_start;   //比特流的起始位置指针

    uint8_t *p;         //比特流当前位置指针

    uint8_t *p_end;     //比特流结尾位置指针

    intptr_t cur_bits;  // 当前的数据,长度为系统规定的int类型的比特长度

    int  i_left;        //在cur_bits中尚未写入数据的剩余比特数

    int  i_bits_encoded; /* RD only */

}

x264结构体中对于输出数据的结构定义:

    struct {

        int         i_nal;

        x264_nal_t  nal[X264_NAL_MAX];

        int         i_bitstream;    //预先设定的比特流的大小,应该大于最大数据时的长度

        uint8_t     *p_bitstream;   //比特流数据地址

        bs_t        bs;

        int         i_frame_size;//当前编码的图像帧码流大小,用于码率控制

    } out;

 

上面,x264.out中可以包含若干个nal单元,每个nal单元记录其本身的数据长度和数据存储的地址,x264.out中还包含一个bs单元,该单元用来比特流的写入操作,因为编码之后的数据常常以比特的形式出现,需要将之变换成字节、字型的数据进行存储。

 

数据在比特流中的存储通过三个函数来完成

bs_init:设置bs->p=bs->start=out->p_bitstream

x264_nal_start:初始化nal单元的数据结构,指定nal->p_payload等于p_bitstream的当前起始位置

x264_xxx_write:写入数据到bs-.>p,同时bs->p相应的增长

x264_nal_end:使用bs->p  bs->p_start得到写完该NAL的在p_bitstream中的位置,用该位置-nal->p_payload得到数据的长度。

 

上面3个结构体的逻辑关系可以见下图:

 

x264中比特流的存储结构 - 秋冬 - 秋冬的博客

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值