在H.264里面当前帧属于哪个slice的决定形式是多种多样的,对于JM中的码流中,一般一帧图象就认为是一个slice,那么如果当前帧是一个I帧,那么它就属于一个I slice.这时整个frame的为一个slice.但是具体我们用什么样的方式来进行slice type的决策呢,这也是一个问题。我们看一下T264里面是如何处理这个问题的。
在T264中,如果我们设定了,USE_SCENEDETECT的话,当前的slice种类是由当前帧的帧号与设定的idrframe,iframe跟bframe相关的,如果frame_no%idrframe==0的话,那么说明当前帧是属于一个IDR slice的,如果frame_no%iframe==0的话,该帧属于一个I slice.如果上面的情况不满足那么是属于P slice或B slice.由于码流中只有如下几种类型:0) I P P P ..... I P P P 1) I B P B P.....B P B P 2) I B B P B B P.....B B P I B B P,所以如果frame_no%(bframe+1)==0的话,就属于P slice,如果不是的话属于B slice.
如没有使用USE_SCENEDETECT的话,是用MeAnalysis来决定当前属于什么slice的。这种形式是动态式地决定是不是要加入一个I slice。决定流程如下:如果我们达到了我们在config里面设定的iframe interval的话,当前帧就是一个I slice.我们设定一个INTRA_THRESHOLD,对帧中的每一个宏块进行预测,来计算sad.这个过程因为计算量比较大,所以使用了简化算法,首先用前一帧的mv做预测值,计算sad,如果这个值大于我们设定的SEARCH_THRESHOLD的话,说明上一帧的mv已不适合做当前帧的预测,我们会使用一个简化的diamond search来简单地找一下当前宏块的mv,进行sad计算。整个帧的sad计算结束之后,我们与INTRA_THRESHOLD进行比较,如果sad大的话,这一帧为I slice中的一帧,如果小的话,我们认为它是一个P或B帧。对于当前帧是P还是B帧还是用上面的方法进行。