HTTPLiveSource.cpp revision 5bc087c573c70c84c6a39946457590b42d392a33
189fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project/* 289fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project * Copyright (C) 2010 The Android Open Source Project 389fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project * 489fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project * Licensed under the Apache License, Version 2.0 (the "License"); 589fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project * you may not use this file except in compliance with the License. 689fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project * You may obtain a copy of the License at 789fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project * 889fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project * http://www.apache.org/licenses/LICENSE-2.0 989fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project * 1089fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project * Unless required by applicable law or agreed to in writing, software 1189fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project * distributed under the License is distributed on an "AS IS" BASIS, 1289fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 1389fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project * See the License for the specific language governing permissions and 1489fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project * limitations under the License. 1589fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project */ 1689fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project 1789fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project//#define LOG_NDEBUG 0 1889fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project#define LOG_TAG "HTTPLiveSource" 1989fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project#include <utils/Log.h> 2089fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project 217562408b2261d38415453378b6188f74fda99d88Mathias Agopian#include "HTTPLiveSource.h" 2289fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project 23c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent#include "ATSParser.h" 2489fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project#include "AnotherPacketSource.h" 2589fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project#include "LiveDataSource.h" 2664760240f931714858a59c1579f07264d7182ba2Dima Zavin#include "LiveSession.h" 27fce7a473248381cc83a01855f92581077d3c9ee2Dima Zavin 28c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent#include <media/stagefright/foundation/ABuffer.h> 29c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent#include <media/stagefright/foundation/ADebug.h> 30c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent#include <media/stagefright/foundation/AMessage.h> 31c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent#include <media/stagefright/MediaErrors.h> 32c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent#include <media/stagefright/MetaData.h> 33c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent 34c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurentnamespace android { 35c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent 36c2f1f07084818942352c6bbfb36af9b6b330eb4eEric LaurentNuPlayer::HTTPLiveSource::HTTPLiveSource(const char *url) 3789fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project : mURL(url), 3889fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project mEOS(false), 3989fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project mOffset(0) { 4089fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project} 4189fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project 4289fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source ProjectNuPlayer::HTTPLiveSource::~HTTPLiveSource() { 4389fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project mLiveSession->disconnect(); 4489fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project mLiveLooper->stop(); 45c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent} 46c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent 47c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurentvoid NuPlayer::HTTPLiveSource::start() { 4889fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project mLiveLooper = new ALooper; 4989fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project mLiveLooper->setName("http live"); 50fce7a473248381cc83a01855f92581077d3c9ee2Dima Zavin mLiveLooper->start(); 5189fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project 5289fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project mLiveSession = new LiveSession; 5389fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project mLiveLooper->registerHandler(mLiveSession); 5489fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project 5589fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project mLiveSession->connect(mURL.c_str()); 5689fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project 5789fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project mTSParser = new ATSParser; 5889fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project} 5989fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project 6089fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Projectsp<MetaData> NuPlayer::HTTPLiveSource::getFormat(bool audio) { 6189fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project ATSParser::SourceType type = 6289fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project audio ? ATSParser::MPEG2ADTS_AUDIO : ATSParser::AVC_VIDEO; 6389fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project 6489fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project sp<AnotherPacketSource> source = 6589fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project static_cast<AnotherPacketSource *>(mTSParser->getSource(type).get()); 6689fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project 6789fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project if (source == NULL) { 6889fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project return NULL; 6989fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project } 7089fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project 7189fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project return source->getFormat(); 7289fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project} 7389fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project 7489fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Projectbool NuPlayer::HTTPLiveSource::feedMoreTSData() { 7589fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project if (mEOS) { 7689fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project return false; 7789fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project } 7889fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project 7989fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project sp<LiveDataSource> source = 8089fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project static_cast<LiveDataSource *>(mLiveSession->getDataSource().get()); 8189fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project 82c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent for (int32_t i = 0; i < 10; ++i) { 8389fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project char buffer[188]; 8489fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project ssize_t n = source->readAtNonBlocking(mOffset, buffer, sizeof(buffer)); 8589fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project 8689fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project if (n == -EWOULDBLOCK) { 8789fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project break; 8889fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project } else if (n < 0) { 8989fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project LOGI("input data EOS reached."); 9089fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project mTSParser->signalEOS(ERROR_END_OF_STREAM); 9189fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project mEOS = true; 9289fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project break; 9389fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project } else { 9489fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project if (buffer[0] == 0x00) { 9589fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project // XXX legacy 9689fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project mTSParser->signalDiscontinuity( 9789fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project buffer[1] == 0x00 9889fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project ? ATSParser::DISCONTINUITY_SEEK 9989fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project : ATSParser::DISCONTINUITY_FORMATCHANGE); 10089fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project } else { 10189fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project mTSParser->feedTSPacket(buffer, sizeof(buffer)); 10289fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project } 10389fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project 10489fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project mOffset += n; 10589fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project } 10689fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project } 10789fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project 10889fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project return true; 10989fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project} 11089fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project 11189fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Projectstatus_t NuPlayer::HTTPLiveSource::dequeueAccessUnit( 11289fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project bool audio, sp<ABuffer> *accessUnit) { 11389fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project ATSParser::SourceType type = 11489fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project audio ? ATSParser::MPEG2ADTS_AUDIO : ATSParser::AVC_VIDEO; 11589fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project 11689fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project sp<AnotherPacketSource> source = 11789fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project static_cast<AnotherPacketSource *>(mTSParser->getSource(type).get()); 11889fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project 11989fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project if (source == NULL) { 12089fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project return -EWOULDBLOCK; 12189fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project } 12289fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project 12389fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project status_t finalResult; 12489fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project if (!source->hasBufferAvailable(&finalResult)) { 12589fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project return finalResult == OK ? -EWOULDBLOCK : finalResult; 12689fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project } 12789fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project 12889fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project return source->dequeueAccessUnit(accessUnit); 12989fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project} 130fa2877b9ea48baed934b866d2ab3658b69c4c869Eric Laurent 13189fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project} // namespace android 132fce7a473248381cc83a01855f92581077d3c9ee2Dima Zavin 13389fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project