RTP 하중 H264코드 흐름
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 타입을 모두 지원하지는 않았음을 알 수 있다.
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
RFC1889(3) RTP*/ #define RTP_VERSION 2 #define RTP_SEQ_MOD (1<<16) #define RTP_MAX_SDES 255 /* maximum text length fo...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.