h264中函数int RBSPtoSODB()注释

见标准7.4.1:

RBSP按下面的方式包含一个SODB:

1)     RBSP的第一个字节包含SODB(最高有效位,最左边)的八位;RBSP的下一字节包含SODB的下八位,以此类推;直到SODB剩余位数不足八位。

2)     SODB之后的rbsp_trailing bits( )按如下方式表示:

                                      i.              最后一个RBSP字节前面(最高有效位,最左边)的位包含SODB的剩余位,如果有的话。

                                     ii.              下一位是 rbsp_stop_bit,它等于1,并且

                                   iii.              如果rbsp_stop_bit不是一个字节对齐字节的最后一位,则会有一个或多个rbsp_alignment_bit(值为0) 使字节对齐。

3)在RBSP尾部的rbsp_trailing_bits( )之后,可能有一个或多个16位语法元素cabac_zero_word(等于0x0000)出现在一些RBSP中。

/*!

************************************************************************

* \brief

*    Converts RBSP to string of data bits

* \param streamBuffer

*          pointer to buffer containing data

*  \param last_byte_pos

*          position of the last byte containing data.

* \return last_byte_pos

*          position of the last byte pos. If the last-byte was entirely a stuffing byte,

*          it is removed, and the last_byte_pos is updated.

************************************************************************/

int RBSPtoSODB(byte *streamBuffer, int last_byte_pos)

{

  int ctr_bit, bitoffset;

  bitoffset = 0;

  //find trailing 1

  ctr_bit = (streamBuffer[last_byte_pos-1] & (0x01<<bitoffset));   // set up control bit

  while (ctr_bit==0)

  {                 // find trailing 1 bit

    bitoffset++;

    if(bitoffset == 8)

    {

     /* if(last_byte_pos == 0)

        printf(" Panic: All zero data sequence in RBSP \n");

      assert(last_byte_pos != 0);*/  //++优化

/*assert()是一个调试程序时经常使用的宏,在程序运行时它计算括号内的表达式,

如果表达式为FALSE (0), 程序将报告错误,并终止执行。

如果表达式不为0,则继续执行后面的语句。

这个宏通常原来判断程序中是否出现了明显非法的数据,

如果出现了终止程序以免导致严重后果,同时也便于查找错误。

例如,变量n在程序中不应该为0,如果为0可能导致错误,你可以这样写程序:

    ......

    assert( n != 0);

    k = 10/ n;

    ......

    ASSERT只有在Debug版本中才有效,*/

      last_byte_pos -= 1;  //++检测到一个字节为0x00,后退一个字节继续检测

      bitoffset = 0;

    }

    ctr_bit= streamBuffer[last_byte_pos-1] & (0x01<<(bitoffset));

  }

  // We keep the stop bit for now

/*  if (remove_stop)

  {

    streamBuffer[last_byte_pos-1] -= (0x01<<(bitoffset));

    if(bitoffset == 7)

      return(last_byte_pos-1);

    else

      return(last_byte_pos);

  }

*/

  return(last_byte_pos);

}

流程图:

h264中函数int RBSPtoSODB()注释_第1张图片

    

  ctr_bit即为用来是否找到包含rbsp_stop_bit的字节,非零表示找到。

例如:streamBuffer[last_byte_pos-1]=0x62,二进制为:1100010。

bitoffset初始值=0,0x01左移0位,然后与streamBuffer[last_byte_pos-1]相与,ctr_bit=0,则继续

bitoffset++后为1,0x01左移1位然后与streamBuffer[last_byte_pos-1]相与,1100010&0000010=00000010,ctr_bit!=0,找到包含rbsp_stop_bit的字节,最后返回 position of the last byte (包含rbsp_stop_bit的字节)

转载于:http://blog.21ic.com/user1/1600/archives/2007/39599.html

你可能感兴趣的:(h264中函数int RBSPtoSODB()注释)