在h中同时定义了下面几个帧数组用以实现帧的管理.


/* store the sequence of b frame being encoded */  
x264_frame_t *bframe_current[X264_BFRAME_MAX];  
 
/* store the next sequence of frames to be encoded */ 
x264_frame_t *frame_next[X264_BFRAME_MAX+1]; //下一个帧, 不一定是B帧.  
 
/* store unused frames */  
x264_frame_t *frame_unused[X264_BFRAME_MAX+1]; 

同时还有下面4个函数(定义在\ENCODER\encoder.c中). 


x264_encoder_frame_put_from_picture();  
x264_encoder_frame_put();  
x264_encoder_frame_get();  
x264_frame_copy_picture();  
这3个数组和4个函数可以说完成了整个帧的类型的判定问题.但此处代码里if, else语句较多,容易使人迷惑.需要把握下面一个实质: 在不对P帧进行编码之前, 不对B帧进行编码, 只是把B帧放进缓冲区(就是前面提到的数组).       比如视频序列: I  B  B  P  B  B  P 先确立第一个帧的类型, 然后进行编码. 然后是2个B帧, 把它放进缓冲区数组. 然后是P帧, 可以判定它的类型并进行编码. 同时, 将缓冲区的B帧放进h->bframe_current[i], 不过这时P帧前的两个B帧并没有编码. 当读到P帧后面的第一个B帧时, 实际上才将h->bframe_current数组中的第一个B帧编码, 也就是将在I帧后面的第一个B帧(说成P帧前面的第一个B帧容易误解)编码. (vblittleboy)