下面貼出安卓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;
}