分享

关于ffmpeg 中对ff_h264_find_frame_end 的分析

 mediatv 2013-01-24

视频技术论坛's Archiver

chenwei1983 发表于 2012-2-22 06:10 PM

关于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,总长度即是一个完整帧的长度
}

页: [1]

Powered by Discuz! Archiver 7.2  ? 2001-2009 Comsenz Inc.

    本站是提供个人知识管理的网络存储空间,所有内容均由用户发布,不代表本站观点。请注意甄别内容中的联系方式、诱导购买等信息,谨防诈骗。如发现有害或侵权内容,请点击一键举报。
    转藏 分享 献花(0

    0条评论

    发表

    请遵守用户 评论公约

    类似文章 更多