426 x264全局 完整有些东西还没理解

http://blog.csdn.net/szu030606/article/details/7212315 完整版  有些东西还是没有理解

  1. 判断上一帧重构fdec是否做参考帧,如果是参考帧, 放入reference队列中,然后从unused队列中分配一帧给fdec,如果上一帧不是参考帧(比如b帧), 返回,具体实现函数x264_reference_update()
  2. 从unused队列中取一帧给fenc,然后将输入的yuv数据复制到fenc的缓冲区中。
  3. 图像宽度高度不是16的倍数的时候进行扩边。
  4. H->frames.i_input记录图像的输入顺序。将fenc指针放入next队列中。(next队列)

Current是已经准备就绪可以编码的帧,其类型已经确定,next是尚未确定类型的帧,

Unused用于回收不是用的frame结构体以备再次使用

  1. 对进入待编码队列的帧进行下采样,又参数h->frames.b_have_lowres控制,函数x264_frames_init_lowres()
  2. 编码的延迟帧数为h->frames.i_delay + 1 – h->param.i_threads.单线程的延迟帧数为h->frames.i_delay。当h->frames.i_input > h->frames.i_delay进行编码,否则返回。也就是说当编码第一帧的时候,next队列里缓存了(h->frames.i_delay+1)帧数据
  3. 当h->frames.current[0]为空时,需要对next队列里的帧进行冲排序,将排序后的当前编码帧指针放到current队列里。重排序的方法是调用x264_slicetype_decide()产生next队列里各帧的帧类型,然后将next队列里的非b帧先压倒current队列里,然后将next队列里的b帧压倒current队列里。

注意:当h->frames.current[0]不为空时,表明h->frames.current[0]里的帧的顺序已经经过了重排序,不需要再更改。

  1. 将current[0]指针pop到fenc里,开始边编码。
  2. 根据h->fenc->i_type对nal单元的类型进行初始化。
  3. 初始化h->fenc->i_poc,然后根据当前帧的h->fenc->i_poc对参考帧队列进行排序。生成新的h->fref0和h->fref1
  4. 初始化以下数据

X264_ratecontrol_start()

X264_macroblock_bipred_init()

X264_slice_init()

Bs_init()

  1. 当i_nal_type是NAL_SLICE_IDR时,编序列头sps和图像头pps
  2. 编多组块。对应函数是x264_slices_write() .这个函数里面包括编码的各个模块,也是最耗时的部分。
  3. 如果p帧编的不好,重新编码,编成i帧
  4. 统计编码时间,psnr,mb类型比例。释放编码分配的空间,对应函数x264_frame_end()
原文地址:https://www.cnblogs.com/hatreds/p/2471260.html