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; }
发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/225221.html原文链接:https://javaforall.net
