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> &notify)
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, &params);
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