• 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()
  • 相关阅读:
    通讯协议及Google.Protobuf(三)生成c#代码 序列及反序列化
    通讯协议及Google.Protobuf(二)获取Google.Protobuf.dll
    python TesseractOCR、pytesseract 图片文字识别
    win10系统中exe文件打不开解决方法
    Ubuntu22.04 安装 Kubernetes
    【关于本博客和你(不)感兴趣的秘密】
    Python将多张图片合并为PDF fang
    GCC打印定义的宏 fang
    经典CSS布局
    PycharmPro2019版破解教程有效期至2089年
  • 原文地址:https://www.cnblogs.com/hatreds/p/2471260.html
Copyright © 2020-2023  润新知