ARTPSource.cpp revision ff53123821a3ec2e71fdb1a971ea2cbae3119826
1cf7b9c7aae758ac0b99833915053c63c2ac46e09Andreas Huber/* 2cf7b9c7aae758ac0b99833915053c63c2ac46e09Andreas Huber * Copyright (C) 2010 The Android Open Source Project 3cf7b9c7aae758ac0b99833915053c63c2ac46e09Andreas Huber * 4cf7b9c7aae758ac0b99833915053c63c2ac46e09Andreas Huber * Licensed under the Apache License, Version 2.0 (the "License"); 5cf7b9c7aae758ac0b99833915053c63c2ac46e09Andreas Huber * you may not use this file except in compliance with the License. 6cf7b9c7aae758ac0b99833915053c63c2ac46e09Andreas Huber * You may obtain a copy of the License at 7cf7b9c7aae758ac0b99833915053c63c2ac46e09Andreas Huber * 8cf7b9c7aae758ac0b99833915053c63c2ac46e09Andreas Huber * http://www.apache.org/licenses/LICENSE-2.0 9cf7b9c7aae758ac0b99833915053c63c2ac46e09Andreas Huber * 10cf7b9c7aae758ac0b99833915053c63c2ac46e09Andreas Huber * Unless required by applicable law or agreed to in writing, software 11cf7b9c7aae758ac0b99833915053c63c2ac46e09Andreas Huber * distributed under the License is distributed on an "AS IS" BASIS, 12cf7b9c7aae758ac0b99833915053c63c2ac46e09Andreas Huber * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13cf7b9c7aae758ac0b99833915053c63c2ac46e09Andreas Huber * See the License for the specific language governing permissions and 14cf7b9c7aae758ac0b99833915053c63c2ac46e09Andreas Huber * limitations under the License. 15cf7b9c7aae758ac0b99833915053c63c2ac46e09Andreas Huber */ 16cf7b9c7aae758ac0b99833915053c63c2ac46e09Andreas Huber 17cf7b9c7aae758ac0b99833915053c63c2ac46e09Andreas Huber#include "ARTPSource.h" 18cf7b9c7aae758ac0b99833915053c63c2ac46e09Andreas Huber 1939ddf8e0f18766f7ba1e3246b774aa6ebd93eea8Andreas Huber#include "AAMRAssembler.h" 20cf7b9c7aae758ac0b99833915053c63c2ac46e09Andreas Huber#include "AAVCAssembler.h" 2139ddf8e0f18766f7ba1e3246b774aa6ebd93eea8Andreas Huber#include "AH263Assembler.h" 22cf7b9c7aae758ac0b99833915053c63c2ac46e09Andreas Huber#include "AMPEG4AudioAssembler.h" 23cf7b9c7aae758ac0b99833915053c63c2ac46e09Andreas Huber#include "ASessionDescription.h" 24cf7b9c7aae758ac0b99833915053c63c2ac46e09Andreas Huber 25cf7b9c7aae758ac0b99833915053c63c2ac46e09Andreas Huber#include <media/stagefright/foundation/ABuffer.h> 26cf7b9c7aae758ac0b99833915053c63c2ac46e09Andreas Huber#include <media/stagefright/foundation/ADebug.h> 27cf7b9c7aae758ac0b99833915053c63c2ac46e09Andreas Huber#include <media/stagefright/foundation/AMessage.h> 28cf7b9c7aae758ac0b99833915053c63c2ac46e09Andreas Huber 2939ddf8e0f18766f7ba1e3246b774aa6ebd93eea8Andreas Huber#define BE_VERBOSE 0 30cf7b9c7aae758ac0b99833915053c63c2ac46e09Andreas Huber 31cf7b9c7aae758ac0b99833915053c63c2ac46e09Andreas Hubernamespace android { 32cf7b9c7aae758ac0b99833915053c63c2ac46e09Andreas Huber 3339ddf8e0f18766f7ba1e3246b774aa6ebd93eea8Andreas Huberstatic const uint32_t kSourceID = 0xdeadbeef; 3439ddf8e0f18766f7ba1e3246b774aa6ebd93eea8Andreas Huber 35cf7b9c7aae758ac0b99833915053c63c2ac46e09Andreas HuberARTPSource::ARTPSource( 36cf7b9c7aae758ac0b99833915053c63c2ac46e09Andreas Huber uint32_t id, 37cf7b9c7aae758ac0b99833915053c63c2ac46e09Andreas Huber const sp<ASessionDescription> &sessionDesc, size_t index, 38cf7b9c7aae758ac0b99833915053c63c2ac46e09Andreas Huber const sp<AMessage> ¬ify) 39cf7b9c7aae758ac0b99833915053c63c2ac46e09Andreas Huber : mID(id), 40cf7b9c7aae758ac0b99833915053c63c2ac46e09Andreas Huber mHighestSeqNumber(0), 41cf7b9c7aae758ac0b99833915053c63c2ac46e09Andreas Huber mNumBuffersReceived(0), 4239ddf8e0f18766f7ba1e3246b774aa6ebd93eea8Andreas Huber mNumTimes(0), 4339ddf8e0f18766f7ba1e3246b774aa6ebd93eea8Andreas Huber mLastNTPTime(0), 4439ddf8e0f18766f7ba1e3246b774aa6ebd93eea8Andreas Huber mLastNTPTimeUpdateUs(0), 4539ddf8e0f18766f7ba1e3246b774aa6ebd93eea8Andreas Huber mIssueFIRRequests(false), 4639ddf8e0f18766f7ba1e3246b774aa6ebd93eea8Andreas Huber mLastFIRRequestUs(-1), 4739ddf8e0f18766f7ba1e3246b774aa6ebd93eea8Andreas Huber mNextFIRSeqNo((rand() * 256.0) / RAND_MAX) { 48cf7b9c7aae758ac0b99833915053c63c2ac46e09Andreas Huber unsigned long PT; 49cf7b9c7aae758ac0b99833915053c63c2ac46e09Andreas Huber AString desc; 50cf7b9c7aae758ac0b99833915053c63c2ac46e09Andreas Huber AString params; 51cf7b9c7aae758ac0b99833915053c63c2ac46e09Andreas Huber sessionDesc->getFormatType(index, &PT, &desc, ¶ms); 52cf7b9c7aae758ac0b99833915053c63c2ac46e09Andreas Huber 53cf7b9c7aae758ac0b99833915053c63c2ac46e09Andreas Huber if (!strncmp(desc.c_str(), "H264/", 5)) { 54cf7b9c7aae758ac0b99833915053c63c2ac46e09Andreas Huber mAssembler = new AAVCAssembler(notify); 5539ddf8e0f18766f7ba1e3246b774aa6ebd93eea8Andreas Huber mIssueFIRRequests = true; 5639ddf8e0f18766f7ba1e3246b774aa6ebd93eea8Andreas Huber } else if (!strncmp(desc.c_str(), "MP4A-LATM/", 10)) { 57cf7b9c7aae758ac0b99833915053c63c2ac46e09Andreas Huber mAssembler = new AMPEG4AudioAssembler(notify); 5839ddf8e0f18766f7ba1e3246b774aa6ebd93eea8Andreas Huber } else if (!strncmp(desc.c_str(), "H263-1998/", 10) 5939ddf8e0f18766f7ba1e3246b774aa6ebd93eea8Andreas Huber || !strncmp(desc.c_str(), "H263-2000/", 10)) { 6039ddf8e0f18766f7ba1e3246b774aa6ebd93eea8Andreas Huber mAssembler = new AH263Assembler(notify); 61ff53123821a3ec2e71fdb1a971ea2cbae3119826Andreas Huber mIssueFIRRequests = true; 6239ddf8e0f18766f7ba1e3246b774aa6ebd93eea8Andreas Huber } else if (!strncmp(desc.c_str(), "AMR/", 4)) { 6339ddf8e0f18766f7ba1e3246b774aa6ebd93eea8Andreas Huber mAssembler = new AAMRAssembler(notify, false /* isWide */, params); 6439ddf8e0f18766f7ba1e3246b774aa6ebd93eea8Andreas Huber } else if (!strncmp(desc.c_str(), "AMR-WB/", 7)) { 6539ddf8e0f18766f7ba1e3246b774aa6ebd93eea8Andreas Huber mAssembler = new AAMRAssembler(notify, true /* isWide */, params); 66cf7b9c7aae758ac0b99833915053c63c2ac46e09Andreas Huber } else { 67cf7b9c7aae758ac0b99833915053c63c2ac46e09Andreas Huber TRESPASS(); 68cf7b9c7aae758ac0b99833915053c63c2ac46e09Andreas Huber } 69cf7b9c7aae758ac0b99833915053c63c2ac46e09Andreas Huber} 70cf7b9c7aae758ac0b99833915053c63c2ac46e09Andreas Huber 71cf7b9c7aae758ac0b99833915053c63c2ac46e09Andreas Huberstatic uint32_t AbsDiff(uint32_t seq1, uint32_t seq2) { 72cf7b9c7aae758ac0b99833915053c63c2ac46e09Andreas Huber return seq1 > seq2 ? seq1 - seq2 : seq2 - seq1; 73cf7b9c7aae758ac0b99833915053c63c2ac46e09Andreas Huber} 74cf7b9c7aae758ac0b99833915053c63c2ac46e09Andreas Huber 75cf7b9c7aae758ac0b99833915053c63c2ac46e09Andreas Hubervoid ARTPSource::processRTPPacket(const sp<ABuffer> &buffer) { 7639ddf8e0f18766f7ba1e3246b774aa6ebd93eea8Andreas Huber if (queuePacket(buffer) 7739ddf8e0f18766f7ba1e3246b774aa6ebd93eea8Andreas Huber && mNumTimes == 2 7839ddf8e0f18766f7ba1e3246b774aa6ebd93eea8Andreas Huber && mAssembler != NULL) { 79cf7b9c7aae758ac0b99833915053c63c2ac46e09Andreas Huber mAssembler->onPacketReceived(this); 80cf7b9c7aae758ac0b99833915053c63c2ac46e09Andreas Huber } 81cf7b9c7aae758ac0b99833915053c63c2ac46e09Andreas Huber 82cf7b9c7aae758ac0b99833915053c63c2ac46e09Andreas Huber dump(); 83cf7b9c7aae758ac0b99833915053c63c2ac46e09Andreas Huber} 84cf7b9c7aae758ac0b99833915053c63c2ac46e09Andreas Huber 85cf7b9c7aae758ac0b99833915053c63c2ac46e09Andreas Hubervoid ARTPSource::timeUpdate(uint32_t rtpTime, uint64_t ntpTime) { 8639ddf8e0f18766f7ba1e3246b774aa6ebd93eea8Andreas Huber#if BE_VERBOSE 87cf7b9c7aae758ac0b99833915053c63c2ac46e09Andreas Huber LOG(VERBOSE) << "timeUpdate"; 88cf7b9c7aae758ac0b99833915053c63c2ac46e09Andreas Huber#endif 89cf7b9c7aae758ac0b99833915053c63c2ac46e09Andreas Huber 9039ddf8e0f18766f7ba1e3246b774aa6ebd93eea8Andreas Huber mLastNTPTime = ntpTime; 9139ddf8e0f18766f7ba1e3246b774aa6ebd93eea8Andreas Huber mLastNTPTimeUpdateUs = ALooper::GetNowUs(); 9239ddf8e0f18766f7ba1e3246b774aa6ebd93eea8Andreas Huber 93cf7b9c7aae758ac0b99833915053c63c2ac46e09Andreas Huber if (mNumTimes == 2) { 94cf7b9c7aae758ac0b99833915053c63c2ac46e09Andreas Huber mNTPTime[0] = mNTPTime[1]; 95cf7b9c7aae758ac0b99833915053c63c2ac46e09Andreas Huber mRTPTime[0] = mRTPTime[1]; 96cf7b9c7aae758ac0b99833915053c63c2ac46e09Andreas Huber mNumTimes = 1; 97cf7b9c7aae758ac0b99833915053c63c2ac46e09Andreas Huber } 98cf7b9c7aae758ac0b99833915053c63c2ac46e09Andreas Huber mNTPTime[mNumTimes] = ntpTime; 99cf7b9c7aae758ac0b99833915053c63c2ac46e09Andreas Huber mRTPTime[mNumTimes++] = rtpTime; 100cf7b9c7aae758ac0b99833915053c63c2ac46e09Andreas Huber 101cf7b9c7aae758ac0b99833915053c63c2ac46e09Andreas Huber if (mNumTimes == 2) { 102cf7b9c7aae758ac0b99833915053c63c2ac46e09Andreas Huber for (List<sp<ABuffer> >::iterator it = mQueue.begin(); 103cf7b9c7aae758ac0b99833915053c63c2ac46e09Andreas Huber it != mQueue.end(); ++it) { 104cf7b9c7aae758ac0b99833915053c63c2ac46e09Andreas Huber sp<AMessage> meta = (*it)->meta(); 105cf7b9c7aae758ac0b99833915053c63c2ac46e09Andreas Huber 106cf7b9c7aae758ac0b99833915053c63c2ac46e09Andreas Huber uint32_t rtpTime; 107cf7b9c7aae758ac0b99833915053c63c2ac46e09Andreas Huber CHECK(meta->findInt32("rtp-time", (int32_t *)&rtpTime)); 108cf7b9c7aae758ac0b99833915053c63c2ac46e09Andreas Huber 109cf7b9c7aae758ac0b99833915053c63c2ac46e09Andreas Huber meta->setInt64("ntp-time", RTP2NTP(rtpTime)); 110cf7b9c7aae758ac0b99833915053c63c2ac46e09Andreas Huber } 111cf7b9c7aae758ac0b99833915053c63c2ac46e09Andreas Huber } 112cf7b9c7aae758ac0b99833915053c63c2ac46e09Andreas Huber} 113cf7b9c7aae758ac0b99833915053c63c2ac46e09Andreas Huber 114cf7b9c7aae758ac0b99833915053c63c2ac46e09Andreas Huberbool ARTPSource::queuePacket(const sp<ABuffer> &buffer) { 11539ddf8e0f18766f7ba1e3246b774aa6ebd93eea8Andreas Huber#if 1 11639ddf8e0f18766f7ba1e3246b774aa6ebd93eea8Andreas Huber if (mNumTimes != 2) { 11739ddf8e0f18766f7ba1e3246b774aa6ebd93eea8Andreas Huber // Drop incoming packets until we've established a time base. 11839ddf8e0f18766f7ba1e3246b774aa6ebd93eea8Andreas Huber return false; 11939ddf8e0f18766f7ba1e3246b774aa6ebd93eea8Andreas Huber } 12039ddf8e0f18766f7ba1e3246b774aa6ebd93eea8Andreas Huber#endif 12139ddf8e0f18766f7ba1e3246b774aa6ebd93eea8Andreas Huber 122cf7b9c7aae758ac0b99833915053c63c2ac46e09Andreas Huber uint32_t seqNum = (uint32_t)buffer->int32Data(); 123cf7b9c7aae758ac0b99833915053c63c2ac46e09Andreas Huber 124cf7b9c7aae758ac0b99833915053c63c2ac46e09Andreas Huber if (mNumTimes == 2) { 125cf7b9c7aae758ac0b99833915053c63c2ac46e09Andreas Huber sp<AMessage> meta = buffer->meta(); 126cf7b9c7aae758ac0b99833915053c63c2ac46e09Andreas Huber 127cf7b9c7aae758ac0b99833915053c63c2ac46e09Andreas Huber uint32_t rtpTime; 128cf7b9c7aae758ac0b99833915053c63c2ac46e09Andreas Huber CHECK(meta->findInt32("rtp-time", (int32_t *)&rtpTime)); 129cf7b9c7aae758ac0b99833915053c63c2ac46e09Andreas Huber 130cf7b9c7aae758ac0b99833915053c63c2ac46e09Andreas Huber meta->setInt64("ntp-time", RTP2NTP(rtpTime)); 131cf7b9c7aae758ac0b99833915053c63c2ac46e09Andreas Huber } 132cf7b9c7aae758ac0b99833915053c63c2ac46e09Andreas Huber 133cf7b9c7aae758ac0b99833915053c63c2ac46e09Andreas Huber if (mNumBuffersReceived++ == 0) { 134cf7b9c7aae758ac0b99833915053c63c2ac46e09Andreas Huber mHighestSeqNumber = seqNum; 135cf7b9c7aae758ac0b99833915053c63c2ac46e09Andreas Huber mQueue.push_back(buffer); 136cf7b9c7aae758ac0b99833915053c63c2ac46e09Andreas Huber return true; 137cf7b9c7aae758ac0b99833915053c63c2ac46e09Andreas Huber } 138cf7b9c7aae758ac0b99833915053c63c2ac46e09Andreas Huber 139cf7b9c7aae758ac0b99833915053c63c2ac46e09Andreas Huber // Only the lower 16-bit of the sequence numbers are transmitted, 140cf7b9c7aae758ac0b99833915053c63c2ac46e09Andreas Huber // derive the high-order bits by choosing the candidate closest 141cf7b9c7aae758ac0b99833915053c63c2ac46e09Andreas Huber // to the highest sequence number (extended to 32 bits) received so far. 142cf7b9c7aae758ac0b99833915053c63c2ac46e09Andreas Huber 143cf7b9c7aae758ac0b99833915053c63c2ac46e09Andreas Huber uint32_t seq1 = seqNum | (mHighestSeqNumber & 0xffff0000); 144cf7b9c7aae758ac0b99833915053c63c2ac46e09Andreas Huber uint32_t seq2 = seqNum | ((mHighestSeqNumber & 0xffff0000) + 0x10000); 145cf7b9c7aae758ac0b99833915053c63c2ac46e09Andreas Huber uint32_t seq3 = seqNum | ((mHighestSeqNumber & 0xffff0000) - 0x10000); 146cf7b9c7aae758ac0b99833915053c63c2ac46e09Andreas Huber uint32_t diff1 = AbsDiff(seq1, mHighestSeqNumber); 147cf7b9c7aae758ac0b99833915053c63c2ac46e09Andreas Huber uint32_t diff2 = AbsDiff(seq2, mHighestSeqNumber); 148cf7b9c7aae758ac0b99833915053c63c2ac46e09Andreas Huber uint32_t diff3 = AbsDiff(seq3, mHighestSeqNumber); 149cf7b9c7aae758ac0b99833915053c63c2ac46e09Andreas Huber 150cf7b9c7aae758ac0b99833915053c63c2ac46e09Andreas Huber if (diff1 < diff2) { 151cf7b9c7aae758ac0b99833915053c63c2ac46e09Andreas Huber if (diff1 < diff3) { 152cf7b9c7aae758ac0b99833915053c63c2ac46e09Andreas Huber // diff1 < diff2 ^ diff1 < diff3 153cf7b9c7aae758ac0b99833915053c63c2ac46e09Andreas Huber seqNum = seq1; 154cf7b9c7aae758ac0b99833915053c63c2ac46e09Andreas Huber } else { 155cf7b9c7aae758ac0b99833915053c63c2ac46e09Andreas Huber // diff3 <= diff1 < diff2 156cf7b9c7aae758ac0b99833915053c63c2ac46e09Andreas Huber seqNum = seq3; 157cf7b9c7aae758ac0b99833915053c63c2ac46e09Andreas Huber } 158cf7b9c7aae758ac0b99833915053c63c2ac46e09Andreas Huber } else if (diff2 < diff3) { 159cf7b9c7aae758ac0b99833915053c63c2ac46e09Andreas Huber // diff2 <= diff1 ^ diff2 < diff3 160cf7b9c7aae758ac0b99833915053c63c2ac46e09Andreas Huber seqNum = seq2; 161cf7b9c7aae758ac0b99833915053c63c2ac46e09Andreas Huber } else { 162cf7b9c7aae758ac0b99833915053c63c2ac46e09Andreas Huber // diff3 <= diff2 <= diff1 163cf7b9c7aae758ac0b99833915053c63c2ac46e09Andreas Huber seqNum = seq3; 164cf7b9c7aae758ac0b99833915053c63c2ac46e09Andreas Huber } 165cf7b9c7aae758ac0b99833915053c63c2ac46e09Andreas Huber 166cf7b9c7aae758ac0b99833915053c63c2ac46e09Andreas Huber if (seqNum > mHighestSeqNumber) { 167cf7b9c7aae758ac0b99833915053c63c2ac46e09Andreas Huber mHighestSeqNumber = seqNum; 168cf7b9c7aae758ac0b99833915053c63c2ac46e09Andreas Huber } 169cf7b9c7aae758ac0b99833915053c63c2ac46e09Andreas Huber 170cf7b9c7aae758ac0b99833915053c63c2ac46e09Andreas Huber buffer->setInt32Data(seqNum); 171cf7b9c7aae758ac0b99833915053c63c2ac46e09Andreas Huber 172cf7b9c7aae758ac0b99833915053c63c2ac46e09Andreas Huber List<sp<ABuffer> >::iterator it = mQueue.begin(); 173cf7b9c7aae758ac0b99833915053c63c2ac46e09Andreas Huber while (it != mQueue.end() && (uint32_t)(*it)->int32Data() < seqNum) { 174cf7b9c7aae758ac0b99833915053c63c2ac46e09Andreas Huber ++it; 175cf7b9c7aae758ac0b99833915053c63c2ac46e09Andreas Huber } 176cf7b9c7aae758ac0b99833915053c63c2ac46e09Andreas Huber 177cf7b9c7aae758ac0b99833915053c63c2ac46e09Andreas Huber if (it != mQueue.end() && (uint32_t)(*it)->int32Data() == seqNum) { 178cf7b9c7aae758ac0b99833915053c63c2ac46e09Andreas Huber LOG(WARNING) << "Discarding duplicate buffer"; 179cf7b9c7aae758ac0b99833915053c63c2ac46e09Andreas Huber return false; 180cf7b9c7aae758ac0b99833915053c63c2ac46e09Andreas Huber } 181cf7b9c7aae758ac0b99833915053c63c2ac46e09Andreas Huber 182cf7b9c7aae758ac0b99833915053c63c2ac46e09Andreas Huber mQueue.insert(it, buffer); 183cf7b9c7aae758ac0b99833915053c63c2ac46e09Andreas Huber 184cf7b9c7aae758ac0b99833915053c63c2ac46e09Andreas Huber return true; 185cf7b9c7aae758ac0b99833915053c63c2ac46e09Andreas Huber} 186cf7b9c7aae758ac0b99833915053c63c2ac46e09Andreas Huber 187cf7b9c7aae758ac0b99833915053c63c2ac46e09Andreas Hubervoid ARTPSource::dump() const { 188cf7b9c7aae758ac0b99833915053c63c2ac46e09Andreas Huber if ((mNumBuffersReceived % 128) != 0) { 189cf7b9c7aae758ac0b99833915053c63c2ac46e09Andreas Huber return; 190cf7b9c7aae758ac0b99833915053c63c2ac46e09Andreas Huber } 191cf7b9c7aae758ac0b99833915053c63c2ac46e09Andreas Huber 192cf7b9c7aae758ac0b99833915053c63c2ac46e09Andreas Huber#if 0 193cf7b9c7aae758ac0b99833915053c63c2ac46e09Andreas Huber if (mAssembler == NULL) { 194cf7b9c7aae758ac0b99833915053c63c2ac46e09Andreas Huber char tmp[20]; 195cf7b9c7aae758ac0b99833915053c63c2ac46e09Andreas Huber sprintf(tmp, "0x%08x", mID); 196cf7b9c7aae758ac0b99833915053c63c2ac46e09Andreas Huber 197cf7b9c7aae758ac0b99833915053c63c2ac46e09Andreas Huber int32_t numMissing = 0; 198cf7b9c7aae758ac0b99833915053c63c2ac46e09Andreas Huber 199cf7b9c7aae758ac0b99833915053c63c2ac46e09Andreas Huber if (!mQueue.empty()) { 200cf7b9c7aae758ac0b99833915053c63c2ac46e09Andreas Huber List<sp<ABuffer> >::const_iterator it = mQueue.begin(); 201cf7b9c7aae758ac0b99833915053c63c2ac46e09Andreas Huber uint32_t expectedSeqNum = (uint32_t)(*it)->int32Data(); 202cf7b9c7aae758ac0b99833915053c63c2ac46e09Andreas Huber ++expectedSeqNum; 203cf7b9c7aae758ac0b99833915053c63c2ac46e09Andreas Huber ++it; 204cf7b9c7aae758ac0b99833915053c63c2ac46e09Andreas Huber 205cf7b9c7aae758ac0b99833915053c63c2ac46e09Andreas Huber for (; it != mQueue.end(); ++it) { 206cf7b9c7aae758ac0b99833915053c63c2ac46e09Andreas Huber uint32_t seqNum = (uint32_t)(*it)->int32Data(); 207cf7b9c7aae758ac0b99833915053c63c2ac46e09Andreas Huber CHECK_GE(seqNum, expectedSeqNum); 208cf7b9c7aae758ac0b99833915053c63c2ac46e09Andreas Huber 209cf7b9c7aae758ac0b99833915053c63c2ac46e09Andreas Huber if (seqNum != expectedSeqNum) { 210cf7b9c7aae758ac0b99833915053c63c2ac46e09Andreas Huber numMissing += seqNum - expectedSeqNum; 211cf7b9c7aae758ac0b99833915053c63c2ac46e09Andreas Huber expectedSeqNum = seqNum; 212cf7b9c7aae758ac0b99833915053c63c2ac46e09Andreas Huber } 213cf7b9c7aae758ac0b99833915053c63c2ac46e09Andreas Huber 214cf7b9c7aae758ac0b99833915053c63c2ac46e09Andreas Huber ++expectedSeqNum; 215cf7b9c7aae758ac0b99833915053c63c2ac46e09Andreas Huber } 216cf7b9c7aae758ac0b99833915053c63c2ac46e09Andreas Huber } 217cf7b9c7aae758ac0b99833915053c63c2ac46e09Andreas Huber 218cf7b9c7aae758ac0b99833915053c63c2ac46e09Andreas Huber LOG(VERBOSE) << "[" << tmp << "] Missing " << numMissing 219cf7b9c7aae758ac0b99833915053c63c2ac46e09Andreas Huber << " / " << (mNumBuffersReceived + numMissing) << " packets. (" 220cf7b9c7aae758ac0b99833915053c63c2ac46e09Andreas Huber << (100.0 * numMissing / (mNumBuffersReceived + numMissing)) 221cf7b9c7aae758ac0b99833915053c63c2ac46e09Andreas Huber << " %%)"; 222cf7b9c7aae758ac0b99833915053c63c2ac46e09Andreas Huber } 223cf7b9c7aae758ac0b99833915053c63c2ac46e09Andreas Huber#endif 224cf7b9c7aae758ac0b99833915053c63c2ac46e09Andreas Huber 225cf7b9c7aae758ac0b99833915053c63c2ac46e09Andreas Huber#if 0 226cf7b9c7aae758ac0b99833915053c63c2ac46e09Andreas Huber AString out; 22739ddf8e0f18766f7ba1e3246b774aa6ebd93eea8Andreas Huber 228cf7b9c7aae758ac0b99833915053c63c2ac46e09Andreas Huber out.append(tmp); 229cf7b9c7aae758ac0b99833915053c63c2ac46e09Andreas Huber out.append(" ["); 230cf7b9c7aae758ac0b99833915053c63c2ac46e09Andreas Huber 231cf7b9c7aae758ac0b99833915053c63c2ac46e09Andreas Huber List<sp<ABuffer> >::const_iterator it = mQueue.begin(); 232cf7b9c7aae758ac0b99833915053c63c2ac46e09Andreas Huber while (it != mQueue.end()) { 233cf7b9c7aae758ac0b99833915053c63c2ac46e09Andreas Huber uint32_t start = (uint32_t)(*it)->int32Data(); 234cf7b9c7aae758ac0b99833915053c63c2ac46e09Andreas Huber 235cf7b9c7aae758ac0b99833915053c63c2ac46e09Andreas Huber out.append(start); 236cf7b9c7aae758ac0b99833915053c63c2ac46e09Andreas Huber 237cf7b9c7aae758ac0b99833915053c63c2ac46e09Andreas Huber ++it; 238cf7b9c7aae758ac0b99833915053c63c2ac46e09Andreas Huber uint32_t expected = start + 1; 239cf7b9c7aae758ac0b99833915053c63c2ac46e09Andreas Huber 240cf7b9c7aae758ac0b99833915053c63c2ac46e09Andreas Huber while (it != mQueue.end()) { 241cf7b9c7aae758ac0b99833915053c63c2ac46e09Andreas Huber uint32_t seqNum = (uint32_t)(*it)->int32Data(); 242cf7b9c7aae758ac0b99833915053c63c2ac46e09Andreas Huber 243cf7b9c7aae758ac0b99833915053c63c2ac46e09Andreas Huber if (seqNum != expected) { 244cf7b9c7aae758ac0b99833915053c63c2ac46e09Andreas Huber if (expected > start + 1) { 245cf7b9c7aae758ac0b99833915053c63c2ac46e09Andreas Huber out.append("-"); 246cf7b9c7aae758ac0b99833915053c63c2ac46e09Andreas Huber out.append(expected - 1); 247cf7b9c7aae758ac0b99833915053c63c2ac46e09Andreas Huber } 248cf7b9c7aae758ac0b99833915053c63c2ac46e09Andreas Huber out.append(", "); 249cf7b9c7aae758ac0b99833915053c63c2ac46e09Andreas Huber break; 250cf7b9c7aae758ac0b99833915053c63c2ac46e09Andreas Huber } 251cf7b9c7aae758ac0b99833915053c63c2ac46e09Andreas Huber 252cf7b9c7aae758ac0b99833915053c63c2ac46e09Andreas Huber ++it; 253cf7b9c7aae758ac0b99833915053c63c2ac46e09Andreas Huber ++expected; 254cf7b9c7aae758ac0b99833915053c63c2ac46e09Andreas Huber } 255cf7b9c7aae758ac0b99833915053c63c2ac46e09Andreas Huber 256cf7b9c7aae758ac0b99833915053c63c2ac46e09Andreas Huber if (it == mQueue.end()) { 257cf7b9c7aae758ac0b99833915053c63c2ac46e09Andreas Huber if (expected > start + 1) { 258cf7b9c7aae758ac0b99833915053c63c2ac46e09Andreas Huber out.append("-"); 259cf7b9c7aae758ac0b99833915053c63c2ac46e09Andreas Huber out.append(expected - 1); 260cf7b9c7aae758ac0b99833915053c63c2ac46e09Andreas Huber } 261cf7b9c7aae758ac0b99833915053c63c2ac46e09Andreas Huber } 262cf7b9c7aae758ac0b99833915053c63c2ac46e09Andreas Huber } 263cf7b9c7aae758ac0b99833915053c63c2ac46e09Andreas Huber 264cf7b9c7aae758ac0b99833915053c63c2ac46e09Andreas Huber out.append("]"); 265cf7b9c7aae758ac0b99833915053c63c2ac46e09Andreas Huber 266cf7b9c7aae758ac0b99833915053c63c2ac46e09Andreas Huber LOG(VERBOSE) << out; 267cf7b9c7aae758ac0b99833915053c63c2ac46e09Andreas Huber#endif 268cf7b9c7aae758ac0b99833915053c63c2ac46e09Andreas Huber} 269cf7b9c7aae758ac0b99833915053c63c2ac46e09Andreas Huber 270cf7b9c7aae758ac0b99833915053c63c2ac46e09Andreas Huberuint64_t ARTPSource::RTP2NTP(uint32_t rtpTime) const { 271cf7b9c7aae758ac0b99833915053c63c2ac46e09Andreas Huber CHECK_EQ(mNumTimes, 2u); 272cf7b9c7aae758ac0b99833915053c63c2ac46e09Andreas Huber 273cf7b9c7aae758ac0b99833915053c63c2ac46e09Andreas Huber return mNTPTime[0] + (double)(mNTPTime[1] - mNTPTime[0]) 274cf7b9c7aae758ac0b99833915053c63c2ac46e09Andreas Huber * ((double)rtpTime - (double)mRTPTime[0]) 275cf7b9c7aae758ac0b99833915053c63c2ac46e09Andreas Huber / (double)(mRTPTime[1] - mRTPTime[0]); 276cf7b9c7aae758ac0b99833915053c63c2ac46e09Andreas Huber} 277cf7b9c7aae758ac0b99833915053c63c2ac46e09Andreas Huber 27839ddf8e0f18766f7ba1e3246b774aa6ebd93eea8Andreas Hubervoid ARTPSource::byeReceived() { 27939ddf8e0f18766f7ba1e3246b774aa6ebd93eea8Andreas Huber mAssembler->onByeReceived(); 28039ddf8e0f18766f7ba1e3246b774aa6ebd93eea8Andreas Huber} 28139ddf8e0f18766f7ba1e3246b774aa6ebd93eea8Andreas Huber 28239ddf8e0f18766f7ba1e3246b774aa6ebd93eea8Andreas Hubervoid ARTPSource::addFIR(const sp<ABuffer> &buffer) { 28339ddf8e0f18766f7ba1e3246b774aa6ebd93eea8Andreas Huber if (!mIssueFIRRequests) { 28439ddf8e0f18766f7ba1e3246b774aa6ebd93eea8Andreas Huber return; 28539ddf8e0f18766f7ba1e3246b774aa6ebd93eea8Andreas Huber } 28639ddf8e0f18766f7ba1e3246b774aa6ebd93eea8Andreas Huber 28739ddf8e0f18766f7ba1e3246b774aa6ebd93eea8Andreas Huber int64_t nowUs = ALooper::GetNowUs(); 28839ddf8e0f18766f7ba1e3246b774aa6ebd93eea8Andreas Huber if (mLastFIRRequestUs >= 0 && mLastFIRRequestUs + 5000000ll > nowUs) { 28939ddf8e0f18766f7ba1e3246b774aa6ebd93eea8Andreas Huber // Send FIR requests at most every 5 secs. 29039ddf8e0f18766f7ba1e3246b774aa6ebd93eea8Andreas Huber return; 29139ddf8e0f18766f7ba1e3246b774aa6ebd93eea8Andreas Huber } 29239ddf8e0f18766f7ba1e3246b774aa6ebd93eea8Andreas Huber 29339ddf8e0f18766f7ba1e3246b774aa6ebd93eea8Andreas Huber mLastFIRRequestUs = nowUs; 29439ddf8e0f18766f7ba1e3246b774aa6ebd93eea8Andreas Huber 29539ddf8e0f18766f7ba1e3246b774aa6ebd93eea8Andreas Huber if (buffer->size() + 20 > buffer->capacity()) { 29639ddf8e0f18766f7ba1e3246b774aa6ebd93eea8Andreas Huber LOG(WARNING) << "RTCP buffer too small to accomodate FIR."; 29739ddf8e0f18766f7ba1e3246b774aa6ebd93eea8Andreas Huber return; 29839ddf8e0f18766f7ba1e3246b774aa6ebd93eea8Andreas Huber } 29939ddf8e0f18766f7ba1e3246b774aa6ebd93eea8Andreas Huber 30039ddf8e0f18766f7ba1e3246b774aa6ebd93eea8Andreas Huber uint8_t *data = buffer->data() + buffer->size(); 30139ddf8e0f18766f7ba1e3246b774aa6ebd93eea8Andreas Huber 30239ddf8e0f18766f7ba1e3246b774aa6ebd93eea8Andreas Huber data[0] = 0x80 | 4; 30339ddf8e0f18766f7ba1e3246b774aa6ebd93eea8Andreas Huber data[1] = 206; // PSFB 30439ddf8e0f18766f7ba1e3246b774aa6ebd93eea8Andreas Huber data[2] = 0; 30539ddf8e0f18766f7ba1e3246b774aa6ebd93eea8Andreas Huber data[3] = 4; 30639ddf8e0f18766f7ba1e3246b774aa6ebd93eea8Andreas Huber data[4] = kSourceID >> 24; 30739ddf8e0f18766f7ba1e3246b774aa6ebd93eea8Andreas Huber data[5] = (kSourceID >> 16) & 0xff; 30839ddf8e0f18766f7ba1e3246b774aa6ebd93eea8Andreas Huber data[6] = (kSourceID >> 8) & 0xff; 30939ddf8e0f18766f7ba1e3246b774aa6ebd93eea8Andreas Huber data[7] = kSourceID & 0xff; 31039ddf8e0f18766f7ba1e3246b774aa6ebd93eea8Andreas Huber 31139ddf8e0f18766f7ba1e3246b774aa6ebd93eea8Andreas Huber data[8] = 0x00; // SSRC of media source (unused) 31239ddf8e0f18766f7ba1e3246b774aa6ebd93eea8Andreas Huber data[9] = 0x00; 31339ddf8e0f18766f7ba1e3246b774aa6ebd93eea8Andreas Huber data[10] = 0x00; 31439ddf8e0f18766f7ba1e3246b774aa6ebd93eea8Andreas Huber data[11] = 0x00; 31539ddf8e0f18766f7ba1e3246b774aa6ebd93eea8Andreas Huber 31639ddf8e0f18766f7ba1e3246b774aa6ebd93eea8Andreas Huber data[12] = mID >> 24; 31739ddf8e0f18766f7ba1e3246b774aa6ebd93eea8Andreas Huber data[13] = (mID >> 16) & 0xff; 31839ddf8e0f18766f7ba1e3246b774aa6ebd93eea8Andreas Huber data[14] = (mID >> 8) & 0xff; 31939ddf8e0f18766f7ba1e3246b774aa6ebd93eea8Andreas Huber data[15] = mID & 0xff; 32039ddf8e0f18766f7ba1e3246b774aa6ebd93eea8Andreas Huber 32139ddf8e0f18766f7ba1e3246b774aa6ebd93eea8Andreas Huber data[16] = mNextFIRSeqNo++; // Seq Nr. 32239ddf8e0f18766f7ba1e3246b774aa6ebd93eea8Andreas Huber 32339ddf8e0f18766f7ba1e3246b774aa6ebd93eea8Andreas Huber data[17] = 0x00; // Reserved 32439ddf8e0f18766f7ba1e3246b774aa6ebd93eea8Andreas Huber data[18] = 0x00; 32539ddf8e0f18766f7ba1e3246b774aa6ebd93eea8Andreas Huber data[19] = 0x00; 32639ddf8e0f18766f7ba1e3246b774aa6ebd93eea8Andreas Huber 32739ddf8e0f18766f7ba1e3246b774aa6ebd93eea8Andreas Huber buffer->setRange(buffer->offset(), buffer->size() + 20); 32839ddf8e0f18766f7ba1e3246b774aa6ebd93eea8Andreas Huber 32939ddf8e0f18766f7ba1e3246b774aa6ebd93eea8Andreas Huber LOG(VERBOSE) << "Added FIR request."; 33039ddf8e0f18766f7ba1e3246b774aa6ebd93eea8Andreas Huber} 33139ddf8e0f18766f7ba1e3246b774aa6ebd93eea8Andreas Huber 33239ddf8e0f18766f7ba1e3246b774aa6ebd93eea8Andreas Hubervoid ARTPSource::addReceiverReport(const sp<ABuffer> &buffer) { 33339ddf8e0f18766f7ba1e3246b774aa6ebd93eea8Andreas Huber if (buffer->size() + 32 > buffer->capacity()) { 33439ddf8e0f18766f7ba1e3246b774aa6ebd93eea8Andreas Huber LOG(WARNING) << "RTCP buffer too small to accomodate RR."; 33539ddf8e0f18766f7ba1e3246b774aa6ebd93eea8Andreas Huber return; 33639ddf8e0f18766f7ba1e3246b774aa6ebd93eea8Andreas Huber } 33739ddf8e0f18766f7ba1e3246b774aa6ebd93eea8Andreas Huber 33839ddf8e0f18766f7ba1e3246b774aa6ebd93eea8Andreas Huber uint8_t *data = buffer->data() + buffer->size(); 33939ddf8e0f18766f7ba1e3246b774aa6ebd93eea8Andreas Huber 34039ddf8e0f18766f7ba1e3246b774aa6ebd93eea8Andreas Huber data[0] = 0x80 | 1; 34139ddf8e0f18766f7ba1e3246b774aa6ebd93eea8Andreas Huber data[1] = 201; // RR 34239ddf8e0f18766f7ba1e3246b774aa6ebd93eea8Andreas Huber data[2] = 0; 34339ddf8e0f18766f7ba1e3246b774aa6ebd93eea8Andreas Huber data[3] = 7; 34439ddf8e0f18766f7ba1e3246b774aa6ebd93eea8Andreas Huber data[4] = kSourceID >> 24; 34539ddf8e0f18766f7ba1e3246b774aa6ebd93eea8Andreas Huber data[5] = (kSourceID >> 16) & 0xff; 34639ddf8e0f18766f7ba1e3246b774aa6ebd93eea8Andreas Huber data[6] = (kSourceID >> 8) & 0xff; 34739ddf8e0f18766f7ba1e3246b774aa6ebd93eea8Andreas Huber data[7] = kSourceID & 0xff; 34839ddf8e0f18766f7ba1e3246b774aa6ebd93eea8Andreas Huber 34939ddf8e0f18766f7ba1e3246b774aa6ebd93eea8Andreas Huber data[8] = mID >> 24; 35039ddf8e0f18766f7ba1e3246b774aa6ebd93eea8Andreas Huber data[9] = (mID >> 16) & 0xff; 35139ddf8e0f18766f7ba1e3246b774aa6ebd93eea8Andreas Huber data[10] = (mID >> 8) & 0xff; 35239ddf8e0f18766f7ba1e3246b774aa6ebd93eea8Andreas Huber data[11] = mID & 0xff; 35339ddf8e0f18766f7ba1e3246b774aa6ebd93eea8Andreas Huber 35439ddf8e0f18766f7ba1e3246b774aa6ebd93eea8Andreas Huber data[12] = 0x00; // fraction lost 35539ddf8e0f18766f7ba1e3246b774aa6ebd93eea8Andreas Huber 35639ddf8e0f18766f7ba1e3246b774aa6ebd93eea8Andreas Huber data[13] = 0x00; // cumulative lost 35739ddf8e0f18766f7ba1e3246b774aa6ebd93eea8Andreas Huber data[14] = 0x00; 35839ddf8e0f18766f7ba1e3246b774aa6ebd93eea8Andreas Huber data[15] = 0x00; 35939ddf8e0f18766f7ba1e3246b774aa6ebd93eea8Andreas Huber 36039ddf8e0f18766f7ba1e3246b774aa6ebd93eea8Andreas Huber data[16] = mHighestSeqNumber >> 24; 36139ddf8e0f18766f7ba1e3246b774aa6ebd93eea8Andreas Huber data[17] = (mHighestSeqNumber >> 16) & 0xff; 36239ddf8e0f18766f7ba1e3246b774aa6ebd93eea8Andreas Huber data[18] = (mHighestSeqNumber >> 8) & 0xff; 36339ddf8e0f18766f7ba1e3246b774aa6ebd93eea8Andreas Huber data[19] = mHighestSeqNumber & 0xff; 36439ddf8e0f18766f7ba1e3246b774aa6ebd93eea8Andreas Huber 36539ddf8e0f18766f7ba1e3246b774aa6ebd93eea8Andreas Huber data[20] = 0x00; // Interarrival jitter 36639ddf8e0f18766f7ba1e3246b774aa6ebd93eea8Andreas Huber data[21] = 0x00; 36739ddf8e0f18766f7ba1e3246b774aa6ebd93eea8Andreas Huber data[22] = 0x00; 36839ddf8e0f18766f7ba1e3246b774aa6ebd93eea8Andreas Huber data[23] = 0x00; 36939ddf8e0f18766f7ba1e3246b774aa6ebd93eea8Andreas Huber 37039ddf8e0f18766f7ba1e3246b774aa6ebd93eea8Andreas Huber uint32_t LSR = 0; 37139ddf8e0f18766f7ba1e3246b774aa6ebd93eea8Andreas Huber uint32_t DLSR = 0; 37239ddf8e0f18766f7ba1e3246b774aa6ebd93eea8Andreas Huber if (mLastNTPTime != 0) { 37339ddf8e0f18766f7ba1e3246b774aa6ebd93eea8Andreas Huber LSR = (mLastNTPTime >> 16) & 0xffffffff; 37439ddf8e0f18766f7ba1e3246b774aa6ebd93eea8Andreas Huber 37539ddf8e0f18766f7ba1e3246b774aa6ebd93eea8Andreas Huber DLSR = (uint32_t) 37639ddf8e0f18766f7ba1e3246b774aa6ebd93eea8Andreas Huber ((ALooper::GetNowUs() - mLastNTPTimeUpdateUs) * 65536.0 / 1E6); 37739ddf8e0f18766f7ba1e3246b774aa6ebd93eea8Andreas Huber } 37839ddf8e0f18766f7ba1e3246b774aa6ebd93eea8Andreas Huber 37939ddf8e0f18766f7ba1e3246b774aa6ebd93eea8Andreas Huber data[24] = LSR >> 24; 38039ddf8e0f18766f7ba1e3246b774aa6ebd93eea8Andreas Huber data[25] = (LSR >> 16) & 0xff; 38139ddf8e0f18766f7ba1e3246b774aa6ebd93eea8Andreas Huber data[26] = (LSR >> 8) & 0xff; 38239ddf8e0f18766f7ba1e3246b774aa6ebd93eea8Andreas Huber data[27] = LSR & 0xff; 38339ddf8e0f18766f7ba1e3246b774aa6ebd93eea8Andreas Huber 38439ddf8e0f18766f7ba1e3246b774aa6ebd93eea8Andreas Huber data[28] = DLSR >> 24; 38539ddf8e0f18766f7ba1e3246b774aa6ebd93eea8Andreas Huber data[29] = (DLSR >> 16) & 0xff; 38639ddf8e0f18766f7ba1e3246b774aa6ebd93eea8Andreas Huber data[30] = (DLSR >> 8) & 0xff; 38739ddf8e0f18766f7ba1e3246b774aa6ebd93eea8Andreas Huber data[31] = DLSR & 0xff; 38839ddf8e0f18766f7ba1e3246b774aa6ebd93eea8Andreas Huber 38939ddf8e0f18766f7ba1e3246b774aa6ebd93eea8Andreas Huber buffer->setRange(buffer->offset(), buffer->size() + 32); 39039ddf8e0f18766f7ba1e3246b774aa6ebd93eea8Andreas Huber} 39139ddf8e0f18766f7ba1e3246b774aa6ebd93eea8Andreas Huber 392cf7b9c7aae758ac0b99833915053c63c2ac46e09Andreas Huber} // namespace android 393cf7b9c7aae758ac0b99833915053c63c2ac46e09Andreas Huber 394cf7b9c7aae758ac0b99833915053c63c2ac46e09Andreas Huber 395