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);
}
流程图:
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