下面贴出安卓N版本AAVCAssembler::addSingleNALUnit函数对单个NAL单元的处理:
void AAVCAssembler::addSingleNALUnit(const sp<ABuffer> &buffer) {
ALOGV("addSingleNALUnit of size %zu", buffer->size());
#if !LOG_NDEBUG
hexdump(buffer->data(), buffer->size());
#endif
//该buffer是单个NAL单元
//获取该单个NAL单元标识的时间戳
uint32_t rtpTime;
CHECK(buffer->meta()->findInt32("rtp-time", (int32_t *)&rtpTime));
//mAccessUnitRTPTime变量是标识具有相同时间戳的单个NAL单元是属于同一帧数据
//如果正在被处理的这个单个NAL单元被标识的时间戳和当前的mAccessUnitRTPTime变量值不相同
//说明该单个NAL单元是不和mNALUnits里的NAL单元属于同一帧的数据的,调用submitAccessUnit()
//对mNALUnits里的NAL单元进行处理,大致的处理过程就是将mNALUnits组装成一个完整的一帧数据
//然后发送出去
if (!mNALUnits.empty() && rtpTime != mAccessUnitRTPTime) {
submitAccessUnit();
}
//替换mAccessUnitRTPTime的值,收集下一帧数据的NAL单元
mAccessUnitRTPTime = rtpTime;
//将该NAL单元收集到mNALUnits容器里
mNALUnits.push_back(buffer);
}