ARTPAssembler::AssemblyStatus AH263Assembler::addPacket( const sp<ARTPSource> &source) { List<sp<ABuffer> > *queue = source->queue(); if (queue->empty()) { return NOT_ENOUGH_DATA; } if (mNextExpectedSeqNoValid) { List<sp<ABuffer> >::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<ABuffer> buffer = *queue->begin(); if (!mNextExpectedSeqNoValid) { mNextExpectedSeqNoValid = true; mNextExpectedSeqNo = (uint32_t)buffer->int32Data(); } else if ((uint32_t)buffer->int32Data() != mNextExpectedSeqNo) { #if VERBOSE LOG(VERBOSE) << "Not the sequence number I expected"; #endif return WRONG_SEQUENCE_NUMBER; } uint32_t rtpTime; CHECK(buffer->meta()->findInt32("rtp-time", (int32_t *)&rtpTime)); if (mPackets.size() > 0 && rtpTime != mAccessUnitRTPTime) { submitAccessUnit(); } mAccessUnitRTPTime = rtpTime; // hexdump(buffer->data(), buffer->size()); if (buffer->size() < 2) { queue->erase(queue->begin()); ++mNextExpectedSeqNo; return MALFORMED_PACKET; } unsigned payloadHeader = U16_AT(buffer->data()); unsigned P = (payloadHeader >> 10) & 1; unsigned V = (payloadHeader >> 9) & 1; unsigned PLEN = (payloadHeader >> 3) & 0x3f; unsigned PEBIT = payloadHeader & 7; // V=0 if (V != 0u) { queue->erase(queue->begin()); ++mNextExpectedSeqNo; ALOGW("Packet discarded due to VRC (V != 0)"); return MALFORMED_PACKET; } // PLEN=0 if (PLEN != 0u) { queue->erase(queue->begin()); ++mNextExpectedSeqNo; ALOGW("Packet discarded (PLEN != 0)"); return MALFORMED_PACKET; } // PEBIT=0 if (PEBIT != 0u) { queue->erase(queue->begin()); ++mNextExpectedSeqNo; ALOGW("Packet discarded (PEBIT != 0)"); return MALFORMED_PACKET; } size_t skip = V + PLEN + (P ? 0 : 2); buffer->setRange(buffer->offset() + skip, buffer->size() - skip); if (P) { buffer->data()[0] = 0x00; buffer->data()[1] = 0x00; } mPackets.push_back(buffer); queue->erase(queue->begin()); ++mNextExpectedSeqNo; return OK; }
ARTPAssembler::AssemblyStatus AMPEG4AudioAssembler::addPacket( const sp<ARTPSource> &source) { List<sp<ABuffer> > *queue = source->queue(); if (queue->empty()) { return NOT_ENOUGH_DATA; } if (mNextExpectedSeqNoValid) { List<sp<ABuffer> >::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<ABuffer> buffer = *queue->begin(); if (!mNextExpectedSeqNoValid) { mNextExpectedSeqNoValid = true; mNextExpectedSeqNo = (uint32_t)buffer->int32Data(); } else if ((uint32_t)buffer->int32Data() != mNextExpectedSeqNo) { #if VERBOSE LOG(VERBOSE) << "Not the sequence number I expected"; #endif #ifdef MTK_AOSP_ENHANCEMENT return getAssembleStatus(queue, mNextExpectedSeqNo); #else return WRONG_SEQUENCE_NUMBER; #endif // #ifdef MTK_AOSP_ENHANCEMENT } uint32_t rtpTime; CHECK(buffer->meta()->findInt32("rtp-time", (int32_t *)&rtpTime)); if (mPackets.size() > 0 && rtpTime != mAccessUnitRTPTime) { submitAccessUnit(); } mAccessUnitRTPTime = rtpTime; mPackets.push_back(buffer); queue->erase(queue->begin()); ++mNextExpectedSeqNo; return OK; }
ARTPAssembler::AssemblyStatus AMPEG4ElementaryAssembler::addPacket( const sp<ARTPSource> &source) { List<sp<ABuffer> > *queue = source->queue(); if (queue->empty()) { return NOT_ENOUGH_DATA; } if (mNextExpectedSeqNoValid) { List<sp<ABuffer> >::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<ABuffer> buffer = *queue->begin(); if (!mNextExpectedSeqNoValid) { mNextExpectedSeqNoValid = true; mNextExpectedSeqNo = (uint32_t)buffer->int32Data(); } else if ((uint32_t)buffer->int32Data() != mNextExpectedSeqNo) { LOGV("Not the sequence number I expected"); return WRONG_SEQUENCE_NUMBER; } uint32_t rtpTime; CHECK(buffer->meta()->findInt32("rtp-time", (int32_t *)&rtpTime)); if (mPackets.size() > 0 && rtpTime != mAccessUnitRTPTime) { submitAccessUnit(); } mAccessUnitRTPTime = rtpTime; if (!mIsGeneric) { mPackets.push_back(buffer); } else { // hexdump(buffer->data(), buffer->size()); CHECK_GE(buffer->size(), 2u); unsigned AU_headers_length = U16_AT(buffer->data()); // in bits CHECK_GE(buffer->size(), 2 + (AU_headers_length + 7) / 8); List<AUHeader> headers; ABitReader bits(buffer->data() + 2, buffer->size() - 2); unsigned numBitsLeft = AU_headers_length; unsigned AU_serial = 0; for (;;) { if (numBitsLeft < mSizeLength) { break; } unsigned AU_size = bits.getBits(mSizeLength); numBitsLeft -= mSizeLength; size_t n = headers.empty() ? mIndexLength : mIndexDeltaLength; if (numBitsLeft < n) { break; } unsigned AU_index = bits.getBits(n); numBitsLeft -= n; if (headers.empty()) { AU_serial = AU_index; } else { AU_serial += 1 + AU_index; } if (mCTSDeltaLength > 0) { if (numBitsLeft < 1) { break; } --numBitsLeft; if (bits.getBits(1)) { if (numBitsLeft < mCTSDeltaLength) { break; } bits.skipBits(mCTSDeltaLength); numBitsLeft -= mCTSDeltaLength; } } if (mDTSDeltaLength > 0) { if (numBitsLeft < 1) { break; } --numBitsLeft; if (bits.getBits(1)) { if (numBitsLeft < mDTSDeltaLength) { break; } bits.skipBits(mDTSDeltaLength); numBitsLeft -= mDTSDeltaLength; } } if (mRandomAccessIndication) { if (numBitsLeft < 1) { break; } bits.skipBits(1); --numBitsLeft; } if (mStreamStateIndication > 0) { if (numBitsLeft < mStreamStateIndication) { break; } bits.skipBits(mStreamStateIndication); } AUHeader header; header.mSize = AU_size; header.mSerial = AU_serial; headers.push_back(header); } size_t offset = 2 + (AU_headers_length + 7) / 8; if (mAuxiliaryDataSizeLength > 0) { ABitReader bits(buffer->data() + offset, buffer->size() - offset); unsigned auxSize = bits.getBits(mAuxiliaryDataSizeLength); offset += (mAuxiliaryDataSizeLength + auxSize + 7) / 8; } for (List<AUHeader>::iterator it = headers.begin(); it != headers.end(); ++it) { const AUHeader &header = *it; CHECK_LE(offset + header.mSize, buffer->size()); sp<ABuffer> accessUnit = new ABuffer(header.mSize); memcpy(accessUnit->data(), buffer->data() + offset, header.mSize); offset += header.mSize; CopyTimes(accessUnit, buffer); mPackets.push_back(accessUnit); } CHECK_EQ(offset, buffer->size()); } queue->erase(queue->begin()); ++mNextExpectedSeqNo; return OK; }
ARTPAssembler::AssemblyStatus AH263Assembler::addPacket( const sp<ARTPSource> &source) { List<sp<ABuffer> > *queue = source->queue(); if (queue->empty()) { return NOT_ENOUGH_DATA; } if (mNextExpectedSeqNoValid) { List<sp<ABuffer> >::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<ABuffer> buffer = *queue->begin(); if (!mNextExpectedSeqNoValid) { mNextExpectedSeqNoValid = true; mNextExpectedSeqNo = (uint32_t)buffer->int32Data(); } else if ((uint32_t)buffer->int32Data() != mNextExpectedSeqNo) { #if VERBOSE LOG(VERBOSE) << "Not the sequence number I expected"; #endif return WRONG_SEQUENCE_NUMBER; } uint32_t rtpTime; if (!buffer->meta()->findInt32("rtp-time", (int32_t *)&rtpTime)) { queue->erase(queue->begin()); ++mNextExpectedSeqNo; LOGW("Cannot find rtp-time. Malformed packet."); return MALFORMED_PACKET; } if (mPackets.size() > 0 && rtpTime != mAccessUnitRTPTime) { if (!submitAccessUnit()) { queue->erase(queue->begin()); ++mNextExpectedSeqNo; LOGW("Cannot find rtp-time. Malformed packet."); return MALFORMED_PACKET; } } mAccessUnitRTPTime = rtpTime; // hexdump(buffer->data(), buffer->size()); if (buffer->size() < 2) { queue->erase(queue->begin()); ++mNextExpectedSeqNo; return MALFORMED_PACKET; } // RFC 4629, Sec. 5.1 General H.263+ Payload Header. // The H.263+ payload header is structured as follows: // 0 1 // 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 // +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ // | RR |P|V| PLEN |PEBIT| // +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ // // RR: 5 bits // Reserved bits. It SHALL be zero and MUST be ignored by receivers. // P: 1 bit // Indicates the picture start or a picture segment (GOB/Slice) start or // a video sequence end (EOS or EOSBS). Two bytes of zero bits then have // to be prefixed to the payload of such a packet to compose a complete // picture/GOB/slice/EOS/EOSBS start code. This bit allows the omission // of the two first bytes of the start code, thus improving the // compression ratio. // V: 1 bit // Indicates the presence of an 8-bit field containing information for // Video Redundancy Coding (VRC), which follows immediately after the // initial 16 bits of the payload header. // PLEN: 6 bits // Length, in bytes, of the extra picture header. If no extra picture // header is attached, PLEN is 0. If PLEN>0, the extra picture header is // attached immediately following the rest of the payload header. Note // that the length reflects the omission of the first two bytes of the // picture start code (PSC). // PEBIT: 3 bits // Indicates the number of bits that shall be ignored in the last byte // of the picture header. If PLEN is not zero, the ignored bits shall be // the least significant bits of the byte. If PLEN is zero, then PEBIT // shall also be zero. unsigned payloadHeader = U16_AT(buffer->data()); unsigned P = (payloadHeader >> 10) & 1; unsigned V = (payloadHeader >> 9) & 1; unsigned PLEN = (payloadHeader >> 3) & 0x3f; unsigned PEBIT = payloadHeader & 7; // V = 0 // We do not support VRC header extension for now, so just discard it if // present. if (V != 0u) { queue->erase(queue->begin()); ++mNextExpectedSeqNo; LOGW("Packet discarded due to VRC (V != 0)"); return MALFORMED_PACKET; } // If PLEN is zero, then PEBIT shall also be zero. if (PLEN == 0u && PEBIT != 0u) { queue->erase(queue->begin()); ++mNextExpectedSeqNo; LOGW("Packet discarded (PEBIT != 0)"); return MALFORMED_PACKET; } size_t skip = PLEN + (P ? 0: 2); buffer->setRange(buffer->offset() + skip, buffer->size() - skip); if (P) { buffer->data()[0] = 0x00; buffer->data()[1] = 0x00; } mPackets.push_back(buffer); queue->erase(queue->begin()); ++mNextExpectedSeqNo; return OK; }
ARTPAssembler::AssemblyStatus AMPEG4ElementaryAssembler::addPacket( const sp<ARTPSource> &source) { List<sp<ABuffer> > *queue = source->queue(); if (queue->empty()) { return NOT_ENOUGH_DATA; } if (mNextExpectedSeqNoValid) { List<sp<ABuffer> >::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<ABuffer> buffer = *queue->begin(); if (!mNextExpectedSeqNoValid) { mNextExpectedSeqNoValid = true; mNextExpectedSeqNo = (uint32_t)buffer->int32Data(); } else if ((uint32_t)buffer->int32Data() != mNextExpectedSeqNo) { LOGV("Not the sequence number I expected"); return WRONG_SEQUENCE_NUMBER; } uint32_t rtpTime; if (!buffer->meta()->findInt32("rtp-time", (int32_t *)&rtpTime)) { LOGW("Cannot find rtp-time. Malformed packet."); return MALFORMED_PACKET; } if (mPackets.size() > 0 && rtpTime != mAccessUnitRTPTime) { if (!submitAccessUnit()) { LOGW("Cannot find rtp-time. Malformed packet."); return MALFORMED_PACKET; } } // If constantDuration and CTSDelta are not present. We should assume the // stream has fixed duration and calculate the mConstantDuration. if (!mConstantDuration && !mCTSDeltaLength && mPreviousAUCount && rtpTime > mAccessUnitRTPTime) { mConstantDuration = (rtpTime - mAccessUnitRTPTime) / mPreviousAUCount; } mAccessUnitRTPTime = rtpTime; if (!mIsGeneric) { mPackets.push_back(buffer); } else { // hexdump(buffer->data(), buffer->size()); if (buffer->size() < 2u) { LOGW("Payload format error. Malformed packet."); return MALFORMED_PACKET; } unsigned AU_headers_length = U16_AT(buffer->data()); // in bits if (buffer->size() < 2 + (AU_headers_length + 7) / 8) { LOGW("Payload format error. Malformed packet."); return MALFORMED_PACKET; } List<AUHeader> headers; ABitReader bits(buffer->data() + 2, buffer->size() - 2); unsigned numBitsLeft = AU_headers_length; unsigned AU_serial = 0; for (;;) { if (numBitsLeft < mSizeLength) { break; } unsigned AU_size = bits.getBits(mSizeLength); numBitsLeft -= mSizeLength; size_t n = headers.empty() ? mIndexLength : mIndexDeltaLength; if (numBitsLeft < n) { break; } unsigned AU_index = bits.getBits(n); numBitsLeft -= n; if (headers.empty()) { AU_serial = AU_index; } else { AU_serial += 1 + AU_index; } if (mCTSDeltaLength > 0) { if (numBitsLeft < 1) { break; } --numBitsLeft; if (bits.getBits(1)) { if (numBitsLeft < mCTSDeltaLength) { break; } bits.skipBits(mCTSDeltaLength); numBitsLeft -= mCTSDeltaLength; } } if (mDTSDeltaLength > 0) { if (numBitsLeft < 1) { break; } --numBitsLeft; if (bits.getBits(1)) { if (numBitsLeft < mDTSDeltaLength) { break; } bits.skipBits(mDTSDeltaLength); numBitsLeft -= mDTSDeltaLength; } } if (mRandomAccessIndication) { if (numBitsLeft < 1) { break; } bits.skipBits(1); --numBitsLeft; } if (mStreamStateIndication > 0) { if (numBitsLeft < mStreamStateIndication) { break; } bits.skipBits(mStreamStateIndication); } AUHeader header; header.mSize = AU_size; header.mSerial = AU_serial; headers.push_back(header); } size_t offset = 2 + (AU_headers_length + 7) / 8; if (mAuxiliaryDataSizeLength > 0) { ABitReader bits(buffer->data() + offset, buffer->size() - offset); unsigned auxSize = bits.getBits(mAuxiliaryDataSizeLength); offset += (mAuxiliaryDataSizeLength + auxSize + 7) / 8; } mPreviousAUCount = 0; for (List<AUHeader>::iterator it = headers.begin(); it != headers.end(); ++it) { mPreviousAUCount++; const AUHeader &header = *it; const AUHeader &first = *headers.begin(); if (offset + header.mSize > buffer->size()) { LOGW("Payload format error. Malformed packet."); return MALFORMED_PACKET; } sp<ABuffer> accessUnit = new ABuffer(header.mSize); memcpy(accessUnit->data(), buffer->data() + offset, header.mSize); offset += header.mSize; int rtpTime = mAccessUnitRTPTime + mConstantDuration * (header.mSerial - first.mSerial); accessUnit->meta()->setInt32("rtp-time", rtpTime); accessUnit->setInt32Data(buffer->int32Data()); mPackets.push_back(accessUnit); } if (offset != buffer->size()) { LOGW("Payload format error. Malformed packet."); return MALFORMED_PACKET; } } queue->erase(queue->begin()); ++mNextExpectedSeqNo; return OK; }
ARTPAssembler::AssemblyStatus AH263Assembler::addPacket( const sp<ARTPSource> &source) { List<sp<ABuffer> > *queue = source->queue(); if (queue->empty()) { return NOT_ENOUGH_DATA; } if (mNextExpectedSeqNoValid) { List<sp<ABuffer> >::iterator it = queue->begin(); while (it != queue->end()) { if ((uint32_t)(*it)->int32Data() >= mNextExpectedSeqNo) { break; } //check whether the rtp time of this later packet is equal //to the current one, if yes, it means this packet belongs //to the candidate access unit and should be inserted. uint32_t rtpTime; bool ret = (*it)->meta()->findInt32("rtp-time", (int32_t *)&rtpTime); if (ret && mPackets.size() > 0 && rtpTime == mAccessUnitRTPTime) { ALOGV("insert the rtp packet into the candidate access unit"); insertPacket(*it); } it = queue->erase(it); } if (queue->empty()) { return NOT_ENOUGH_DATA; } } sp<ABuffer> buffer = *queue->begin(); if (!mNextExpectedSeqNoValid) { mNextExpectedSeqNoValid = true; mNextExpectedSeqNo = (uint32_t)buffer->int32Data(); } else if ((uint32_t)buffer->int32Data() != mNextExpectedSeqNo) { #if VERBOSE LOG(VERBOSE) << "Not the sequence number I expected"; #endif return WRONG_SEQUENCE_NUMBER; } uint32_t rtpTime; CHECK(buffer->meta()->findInt32("rtp-time", (int32_t *)&rtpTime)); if (mPackets.size() > 0 && rtpTime != mAccessUnitRTPTime) { submitAccessUnit(); } mAccessUnitRTPTime = rtpTime; // hexdump(buffer->data(), buffer->size()); size_t skip; if ((skip = getOffsetOfHeader(buffer)) == 1){ queue->erase(queue->begin()); ++mNextExpectedSeqNo; return MALFORMED_PACKET; } buffer->setRange(buffer->offset() + skip, buffer->size() - skip); if (skip == 0) { buffer->data()[0] = 0x00; buffer->data()[1] = 0x00; } mPackets.push_back(buffer); queue->erase(queue->begin()); ++mNextExpectedSeqNo; return OK; }