RTP 하중 H264코드 흐름

5608 단어 RTPH264rtph264

1. 하중구조


RTP는 세 가지 하중 H264 코드 흐름의 구조를 정의했다. 채택된 구조 형식은 RTP가 하중하는 H264 코드 흐름의 첫 번째 바이트의 뒷 5개bit, 즉 데이터[0]의 뒷 5개bit비트이다.: unsigned nalType = data[0] & 0x1f;즉 데이터[0] & 0001 1111로 계산할 수 있다.     1.단일 NAL 유닛 패키지, nalType>=1 & & nalType<=23.즉, 하중의 H264 코드 스트림 중 NAL 유닛은 하나뿐입니다.  2.통합 패키지: 1.단일 시간 집합 패키지 유형 A(STAP-A),nalType=24.      2.단일 시간 집합 패키지 유형 B(STAP-B),nalType=25.      3.MTAP16(Multi-Time Aggregation Package Type = 26)    4.MTAP24(Multi-Time Aggregation Package Type) 24비트 변위(MTAP24),nalType==27.즉 H264코드 스트림에 여러 NAL 유닛이 있습니다.  3.슬라이스 장치, FU-A, FU-B, NAL 장치 유형 28, 29로 식별됩니다.단일 NAL 셀에서 여러 RTP 패키지로 슬라이스화할 수 있습니다.
RTP 하중의 H264 코드 흐름에 대한 안드로이드 N 버전의 다른 하중 구조를 다음과 같이 처리합니다.
ARTPAssembler::AssemblyStatus AAVCAssembler::addNALUnit(
        const sp &source) {
    List > *queue = source->queue();

    if (queue->empty()) {
        return NOT_ENOUGH_DATA;
    }

    if (mNextExpectedSeqNoValid) {
        List >::iterator it = queue->begin();
        while (it != queue->end()) {
            if ((uint32_t)(*it)->int32Data() >= mNextExpectedSeqNo) {
                break;
            }

            it = queue->erase(it);
        }

        if (queue->empty()) {
            return NOT_ENOUGH_DATA;
        }
    }

    sp buffer = *queue->begin();

    if (!mNextExpectedSeqNoValid) {
        mNextExpectedSeqNoValid = true;
        mNextExpectedSeqNo = (uint32_t)buffer->int32Data();
    } else if ((uint32_t)buffer->int32Data() != mNextExpectedSeqNo) {
        ALOGV("Not the sequence number I expected");

        return WRONG_SEQUENCE_NUMBER;
    }

    const uint8_t *data = buffer->data();
    size_t size = buffer->size();

    if (size < 1 || (data[0] & 0x80)) {
        // Corrupt.

        ALOGV("Ignoring corrupt buffer.");
        queue->erase(queue->begin());

        ++mNextExpectedSeqNo;
        return MALFORMED_PACKET;
    }

    unsigned nalType = data[0] & 0x1f;// RTP H264 

    if (nalType >= 1 && nalType <= 23) { 
    // NAL 
        addSingleNALUnit(buffer);
        queue->erase(queue->begin());
        ++mNextExpectedSeqNo;
        return OK;
    } else if (nalType == 28) {
       // FU-A 
        // FU-A
        return addFragmentedNALUnit(queue);
    } else if (nalType == 24) {
       // A(STAP-A) 
        // STAP-A
        bool success = addSingleTimeAggregationPacket(buffer);
        queue->erase(queue->begin());
        ++mNextExpectedSeqNo;

        return success ? OK : MALFORMED_PACKET;
    } else if (nalType == 0) {
        ALOGV("Ignoring undefined nal type.");

        queue->erase(queue->begin());
        ++mNextExpectedSeqNo;

        return OK;
    } else {
        ALOGV("Ignoring unsupported buffer (nalType=%d)", nalType);

        queue->erase(queue->begin());
        ++mNextExpectedSeqNo;

        return MALFORMED_PACKET;
    }
}

코드 중의 중국어 주석은 제가 여러분의 이해를 보조하는 것을 추가합니다.안드로이드 N 버전이 NAL 타입을 모두 지원하지는 않았음을 알 수 있다.

좋은 웹페이지 즐겨찾기