NAL聚合包(STAP-A)

  下面貼出安卓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;
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章