您的位置:首页 > 其它

NAL聚合包(STAP-A)

2017-03-07 11:24 120 查看
  下面贴出安卓N版本AAVCAssembler::addSingleTimeAggregationPacket对聚合的NAL包(STAP-A)的处理:

  

bool AAVCAssembler::addSingleTimeAggregationPacket(const sp<ABuffer> &buffer) {
const uint8_t *data = buffer->data();
size_t size = buffer->size();

if (size < 3) {
//对于聚合的NAL单元包(STAP-A)来说,数据最小的长度位3个字节,其中data[0]表明是聚合的
//NAL单元包(STAP-A)即,nalType = data[0] & 0x1f == 28
//data[1]和data[2]用16个bit位表示的一个16位整数的值表示紧跟着第一个NAL单元的长度
ALOGV("Discarding too small STAP-A packet.");
return false;
}
//跳过data[0],data[0]表明是聚合的NAL单元包(STAP-A)
++data;
--size;

//因为紧跟着data[0]后续会有多个NAL单元,所以需要循环处理这些NAL单元
while (size >= 2) {

//前两个字节表示的16位整数的值表示的是该NAL单元的长度,不包括这两个字节
size_t nalSize = (data[0] << 8) | data[1];

if (size < nalSize + 2) {
//标识一个NAL单元的范围位是2+nalSize,2表示的是该NAL单元的长度,nalSize
//是实际一个NAL单元的长度
ALOGV("Discarding malformed STAP-A packet.");
return false;
}

//创建一个buffer将该解析得到的单个的NAL单元拷贝到该buffer中
sp<ABuffer> unit = new ABuffer(nalSize);
memcpy(unit->data(), &data[2], nalSize);

//对该单个的NAL单元添加时间戳信息
CopyTimes(unit, buffer);

//调用addSingleNALUnit(unit)方法处理单个的NAL单元
addSingleNALUnit(unit);

//迭代进行处理下一个NAL单元
data += 2 + nalSize;
size -= 2 + nalSize;
}

if (size != 0) {
ALOGV("Unexpected padding at end of STAP-A packet.");
}

return true;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  NAL Assembler STAP-A