关于ffmpeg 中对ff_h264_find_frame_end 的分析
int ff_h264_find_frame_end(H264Context *h, const uint8_t *buf, int buf_size){
int i;
uint32_t state;
ParseContext *pc = &(h->s.parse_context);
//printf("first %02X%02X%02X%02X\n", buf[0], buf[1],buf[2],buf[3]);
// mb_addr= pc->mb_addr - 1;
state= pc->state;
if(state>13)
state= 7;//表示初始状态,即没有找到起始码001中任何一个0的状态
for(i=0; i<buf_size; i++)
{
if(state==7)
{
for(; i<buf_size; i++)
{
if(!buf[i])
{
state=2;//从初始状态找到一个0的状态就是2
break;
}
}
}
else if(state<=2)
{ // 状态2:找到1个0,状态1:找到2个0,状态0:找到3个0
if(buf[i]==1) state^= 5; //2->7, 1->4, 0->5 ;如果找到了1个0,则状态变为初始化状态,
如果找到了 2个0 则变为状态4,即状态4为找到001的状态,如果找到了0001则状态变为5,
else if(buf[i]) state = 7; // 如果在只找到,1,2,3个0的状态后面遇到了一个非1的情况,则需要进入初始化状态
else state>>=1; //2->1, 1->0, 0->0 ,找到几个0的状态
}
else if(state<=5)
{
//表示找到了001或者0001,即起始码的状态
int v= buf[i] & 0x1F;//nal unit 类型
if(v==7 || v==8 || v==9)
{
//sps,pps,单元分割类型
if(pc->frame_start_found){//如果之前已找到了帧头
i++;
goto found;
}
}
else if(v==1 || v==2 || v==5)
{
//表示有slice header的nal unit type
if(pc->frame_start_found){//如果之前已找到了帧头
state+=8;//即大于等于8的状态表示找到了两个帧头,但没有找到帧尾的状态
continue;
}
else//这里表示找到了开始的帧头位置
pc->frame_start_found = 1;
}
state= 7;//继续寻找下一个帧头开始的位置
}
else
{
if(buf[i] & 0x80)//这里表示找到码流结尾,不确定,求指教??
goto found;
state= 7;
}
}
pc->state= state;
return END_NOT_FOUND;
found:
pc->state=7;
pc->frame_start_found= 0;
return i-(state&5);//state &5 表示001和0001的长度加1,总长度即是一个完整帧的长度
}