ARTPAssembler.cpp revision 8d342970108926c4ea355c90d26a2a353ec0fd47
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 "ARTPAssembler.h"
18cf7b9c7aae758ac0b99833915053c63c2ac46e09Andreas Huber
19cf7b9c7aae758ac0b99833915053c63c2ac46e09Andreas Huber#include <media/stagefright/foundation/ABuffer.h>
20cf7b9c7aae758ac0b99833915053c63c2ac46e09Andreas Huber#include <media/stagefright/foundation/ADebug.h>
21cf7b9c7aae758ac0b99833915053c63c2ac46e09Andreas Huber#include <media/stagefright/foundation/AMessage.h>
22cf7b9c7aae758ac0b99833915053c63c2ac46e09Andreas Huber
23cf7b9c7aae758ac0b99833915053c63c2ac46e09Andreas Huber#include <stdint.h>
24cf7b9c7aae758ac0b99833915053c63c2ac46e09Andreas Huber
25cf7b9c7aae758ac0b99833915053c63c2ac46e09Andreas Hubernamespace android {
26cf7b9c7aae758ac0b99833915053c63c2ac46e09Andreas Huber
27cf7b9c7aae758ac0b99833915053c63c2ac46e09Andreas Huberstatic int64_t getNowUs() {
28cf7b9c7aae758ac0b99833915053c63c2ac46e09Andreas Huber    struct timeval tv;
29cf7b9c7aae758ac0b99833915053c63c2ac46e09Andreas Huber    gettimeofday(&tv, NULL);
30cf7b9c7aae758ac0b99833915053c63c2ac46e09Andreas Huber
31cf7b9c7aae758ac0b99833915053c63c2ac46e09Andreas Huber    return (int64_t)tv.tv_usec + tv.tv_sec * 1000000ll;
32cf7b9c7aae758ac0b99833915053c63c2ac46e09Andreas Huber}
33cf7b9c7aae758ac0b99833915053c63c2ac46e09Andreas Huber
34cf7b9c7aae758ac0b99833915053c63c2ac46e09Andreas HuberARTPAssembler::ARTPAssembler()
35cf7b9c7aae758ac0b99833915053c63c2ac46e09Andreas Huber    : mFirstFailureTimeUs(-1) {
36cf7b9c7aae758ac0b99833915053c63c2ac46e09Andreas Huber}
37cf7b9c7aae758ac0b99833915053c63c2ac46e09Andreas Huber
38cf7b9c7aae758ac0b99833915053c63c2ac46e09Andreas Hubervoid ARTPAssembler::onPacketReceived(const sp<ARTPSource> &source) {
39cf7b9c7aae758ac0b99833915053c63c2ac46e09Andreas Huber    AssemblyStatus status;
40cf7b9c7aae758ac0b99833915053c63c2ac46e09Andreas Huber    for (;;) {
41cf7b9c7aae758ac0b99833915053c63c2ac46e09Andreas Huber        status = assembleMore(source);
42cf7b9c7aae758ac0b99833915053c63c2ac46e09Andreas Huber
43cf7b9c7aae758ac0b99833915053c63c2ac46e09Andreas Huber        if (status == WRONG_SEQUENCE_NUMBER) {
44cf7b9c7aae758ac0b99833915053c63c2ac46e09Andreas Huber            if (mFirstFailureTimeUs >= 0) {
45cf7b9c7aae758ac0b99833915053c63c2ac46e09Andreas Huber                if (getNowUs() - mFirstFailureTimeUs > 10000ll) {
46cf7b9c7aae758ac0b99833915053c63c2ac46e09Andreas Huber                    mFirstFailureTimeUs = -1;
47cf7b9c7aae758ac0b99833915053c63c2ac46e09Andreas Huber
48cf7b9c7aae758ac0b99833915053c63c2ac46e09Andreas Huber                    // LOG(VERBOSE) << "waited too long for packet.";
49cf7b9c7aae758ac0b99833915053c63c2ac46e09Andreas Huber                    packetLost();
50cf7b9c7aae758ac0b99833915053c63c2ac46e09Andreas Huber                    continue;
51cf7b9c7aae758ac0b99833915053c63c2ac46e09Andreas Huber                }
52cf7b9c7aae758ac0b99833915053c63c2ac46e09Andreas Huber            } else {
53cf7b9c7aae758ac0b99833915053c63c2ac46e09Andreas Huber                mFirstFailureTimeUs = getNowUs();
54cf7b9c7aae758ac0b99833915053c63c2ac46e09Andreas Huber            }
55cf7b9c7aae758ac0b99833915053c63c2ac46e09Andreas Huber            break;
56cf7b9c7aae758ac0b99833915053c63c2ac46e09Andreas Huber        } else {
57cf7b9c7aae758ac0b99833915053c63c2ac46e09Andreas Huber            mFirstFailureTimeUs = -1;
58cf7b9c7aae758ac0b99833915053c63c2ac46e09Andreas Huber
59cf7b9c7aae758ac0b99833915053c63c2ac46e09Andreas Huber            if (status == NOT_ENOUGH_DATA) {
60cf7b9c7aae758ac0b99833915053c63c2ac46e09Andreas Huber                break;
61cf7b9c7aae758ac0b99833915053c63c2ac46e09Andreas Huber            }
62cf7b9c7aae758ac0b99833915053c63c2ac46e09Andreas Huber        }
63cf7b9c7aae758ac0b99833915053c63c2ac46e09Andreas Huber    }
64cf7b9c7aae758ac0b99833915053c63c2ac46e09Andreas Huber}
65cf7b9c7aae758ac0b99833915053c63c2ac46e09Andreas Huber
668d342970108926c4ea355c90d26a2a353ec0fd47Andreas Huber// static
678d342970108926c4ea355c90d26a2a353ec0fd47Andreas Hubervoid ARTPAssembler::CopyTimes(const sp<ABuffer> &to, const sp<ABuffer> &from) {
688d342970108926c4ea355c90d26a2a353ec0fd47Andreas Huber    uint64_t ntpTime;
698d342970108926c4ea355c90d26a2a353ec0fd47Andreas Huber    CHECK(from->meta()->findInt64("ntp-time", (int64_t *)&ntpTime));
708d342970108926c4ea355c90d26a2a353ec0fd47Andreas Huber
718d342970108926c4ea355c90d26a2a353ec0fd47Andreas Huber    uint32_t rtpTime;
728d342970108926c4ea355c90d26a2a353ec0fd47Andreas Huber    CHECK(from->meta()->findInt32("rtp-time", (int32_t *)&rtpTime));
738d342970108926c4ea355c90d26a2a353ec0fd47Andreas Huber
748d342970108926c4ea355c90d26a2a353ec0fd47Andreas Huber    to->meta()->setInt64("ntp-time", ntpTime);
758d342970108926c4ea355c90d26a2a353ec0fd47Andreas Huber    to->meta()->setInt32("rtp-time", rtpTime);
768d342970108926c4ea355c90d26a2a353ec0fd47Andreas Huber
778d342970108926c4ea355c90d26a2a353ec0fd47Andreas Huber    // Copy the seq number.
788d342970108926c4ea355c90d26a2a353ec0fd47Andreas Huber    to->setInt32Data(from->int32Data());
798d342970108926c4ea355c90d26a2a353ec0fd47Andreas Huber}
808d342970108926c4ea355c90d26a2a353ec0fd47Andreas Huber
81cf7b9c7aae758ac0b99833915053c63c2ac46e09Andreas Huber}  // namespace android
82