自适应关于帧场编码问题

H.264对帧场编码问题支持的比较完整,因为曾经有人问我,在h.264码流中,是否有判别帧场编码的元素。
我当时对H.264如果认定码流帧场编码不太了解,更别说是宏块级帧场编码了。
其实H.264对帧场编码有两种级别,分为:帧级和宏块级。

帧级是对整个帧一开始就分为top field,bottom field.对两个field分别进行ME,MC,mode decision等.

而宏块级Field编码,就不一样了。

我的答案是一个宏块级field编码,是这样子的,JM里面给出解释的是Field MB pair,场宏块对。也就是a couple of Field ,没有单独存在的一个Field宏块,只有Field MB pair。上面一个是Top field MB(两个MB的偶数行),下面一个是Bottom MB (两个宏块的奇数行),宏块序号上下是连续的,这个和一般的编号方式不同,上面一个是偶数,下面一个是奇数。

而不是象上面那段话那样,只有半个宏块的问题.
对此,我们做出解释,现在我们研究函数void dpb_split_field(FrameStore *fs),该函数完成的任务是对即将送入DPB的重建帧进行帧场分解,解出top,bottom field,对顶底场进行1/4象素插值,复制场参数,分解运动向量,参考帧序号,参考帧id等。

宏块级帧场自适应模式需要对宏块对进行场模式和帧模式分别编码,计算她们的RDCOST,选其中最少的RDCOST作为编码方式,所以自适应方式做最佳编码是付出了计算复杂度大大增加的代价。同样帧级帧场自适应方式需要帧编码,和场编码分别进行,计算RDCOST最少值作为最佳编码,同样付出计算复杂度。

回到文章开始时候提出的问题,码流中是否有标志指示后面访问单元(Access Unit)的帧场编码方式,答案是肯定的。
在一个 SPS(sequence parameter set)中能找到frame_mbs_only_flag标志,该标志显示是否帧编码,如果为0,那么还有一个参数mb_adaptive_frame_field_flag,下面对配置参数和以上两个元素的关系进行说明:
PicInterlace代表帧级隔行扫描,MbInterlace代表宏块级隔行扫描
PicInterlace             =  0     # Picture AFF    (0: frame coding, 1: field coding, 2:adaptive frame/field coding)
MbInterlace            =  0     # Macroblock AFF (0: frame coding, 1: field coding, 2:adaptive frame/field coding)
交叉位置(frame_mbs_only_flag, mb_adaptive_frame_field_flag),N/A为不需要该元素

PicInterlace             0                     1             2
MbInterlace            0  (1,N/A)     (0,0)        (0,0)
                        1      (0,1)              (0,1)        (0,1)
                        2      (0,1)              (0,1)        (0,1)

转载自:http://blog.sina.com.cn/s/blog_502d765f0100eui6.html

猜你喜欢

转载自blog.csdn.net/baidu_38172402/article/details/81179245