x264中不同帧类型的编码顺序

 

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
      
     
先确立第一个帧的类型
, 然后进行编码. 然后是2B, 把它放进缓冲区数组. 然后是P, 可以判定它的类型并进行编码. 同时, 将缓冲区的B帧放进h->bframe_current[i], 不过这时P帧前的两个B帧并没有编码. 当读到P帧后面的第一个B帧时, 实际上才将h->bframe_current数组中的第一个B帧编码, 也就是将在I帧后面的第一个B(说成P帧前面的第一个B帧容易误解)编码.

你可能感兴趣的:(x264中不同帧类型的编码顺序)