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