ffmpeg h264解码器分析sps(一)

sps解码

int ff_h264_decode_seq_parameter_set(GetBitContext *gb, AVCodecContext *avctx,

H264ParamSets *ps, int ignore_truncation)

{

AVBufferRef *sps_buf;

int profile_idc, level_idc, constraint_set_flags = 0;

unsigned int sps_id;

int i, log2_max_frame_num_minus4;

SPS *sps;

int ret;

 

sps_buf = av_buffer_allocz(sizeof(*sps));

if (!sps_buf)

return AVERROR(ENOMEM);

sps = (SPS*)sps_buf->data;

 

sps->data_size = gb->buffer_end - gb->buffer;

if (sps->data_size > sizeof(sps->data)) {

av_log(avctx, AV_LOG_DEBUG, "Truncating likely oversized SPS\n");

sps->data_size = sizeof(sps->data);

}

memcpy(sps->data, gb->buffer, sps->data_size);

 

profile_idc = get_bits(gb, 8); //编码参数 profile类型

constraint_set_flags |= get_bits1(gb) << 0; // constraint_set0_flag

constraint_set_flags |= get_bits1(gb) << 1; // constraint_set1_flag

constraint_set_flags |= get_bits1(gb) << 2; // constraint_set2_flag

constraint_set_flags |= get_bits1(gb) << 3; // constraint_set3_flag

constraint_set_flags |= get_bits1(gb) << 4; // constraint_set4_flag

constraint_set_flags |= get_bits1(gb) << 5; // constraint_set5_flag

//固定设置参数

skip_bits(gb, 2); // reserved_zero_2bits 保留2bits

level_idc = get_bits(gb, 8); // 编码level 8bits

sps_id = get_ue_golomb_31(gb); // ue无符号哥伦布编码读取, sps_id https://blog.csdn.net/fantasy_ARM9/article/details/105635317

 

if (sps_id >= MAX_SPS_COUNT) { //sps最大个数 32个

av_log(avctx, AV_LOG_ERROR, "sps_id %u out of range\n", sps_id);

goto fail;

}

 

sps->sps_id = sps_id;

sps->time_offset_length =

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 3
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值