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