H264的2:3 pulldown的实现

关于pulldown的解释,参见http://en.wikipedia.org/wiki/Telecine#2:3_pulldown

简单的说,就是将电影的流媒体(24fps)转换为NTSC(30fps)或者PAL上可以正常播放的流媒体。

实现的方式就是播放器将4帧图像在播放时扩展为5帧图像。对于编码器来说,需要在编码时写入指定的SEI扩展信息。pulldown实现相关的SEI信息参考H264标准的D.2.1Buffering period SEI message semantics中Pic_Struct这一部分。

常见的2:3 pulldown的实现就是

帧号         0     1      2  3  4  5  6 ..
PIC_STRUCT  3     5      4    6    3  .......
场结构        TB    TBT    BT   BTB  TB .......

注意pulldown只对帧模式有效,因为标准中场模式情况下Pic_Struct只能是1(顶场)和2(底场)

除了Pic_Struct之外,相关的

cpb_removal_delay(dts) , dpb_output_delay(pts)

可能也需要调整,某些解码器可以根据上面的信息来调整播放时间(FFMPEG也只是提供了部分支持),好像一些商业软件(比如Sony的一些DVD制作工具)可以更好的利用dts,pts信息。

 

比如对于 IDR P P IDR PP....这样的帧结构

没有Pulldown时,dts应该是编码顺序,0, 2, 4, 6 ...

有pulldown时,dts需要调整为 0, 3, 5, 8。