StreamingSource.cpp revision 32f3cefa373cd55e63deda36ca9d07c7fe22eaaf
19066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project/* 29066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Copyright (C) 2010 The Android Open Source Project 39066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 49066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Licensed under the Apache License, Version 2.0 (the "License"); 59066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * you may not use this file except in compliance with the License. 69066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * You may obtain a copy of the License at 79066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 89066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * http://www.apache.org/licenses/LICENSE-2.0 99066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Unless required by applicable law or agreed to in writing, software 119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * distributed under the License is distributed on an "AS IS" BASIS, 129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * See the License for the specific language governing permissions and 149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * limitations under the License. 159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project//#define LOG_NDEBUG 0 189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project#define LOG_TAG "StreamingSource" 199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project#include <utils/Log.h> 209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project#include "StreamingSource.h" 229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project#include "ATSParser.h" 249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project#include "AnotherPacketSource.h" 259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project#include "NuPlayerStreamListener.h" 269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 2780a60ba85b5c2ed40e8685a16ce6d3ed31ef0929Joe Onorato#include <media/stagefright/foundation/ABuffer.h> 289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project#include <media/stagefright/foundation/ADebug.h> 299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project#include <media/stagefright/foundation/AMessage.h> 309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project#include <media/stagefright/MediaSource.h> 319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project#include <media/stagefright/MetaData.h> 329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectnamespace android { 349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source ProjectNuPlayer::StreamingSource::StreamingSource(const sp<IStreamSource> &source) 36a63730d1f103f78589faef461d2af7351fc49f42Brad Fitzpatrick : mSource(source), 3718e939623556928f73fcc7511c85a537929a4a7eDan Egnor mEOS(false) { 3818e939623556928f73fcc7511c85a537929a4a7eDan Egnor} 396dabb63307a0b63f9386d61e8444aed29db2081eNarayan Kamath 4018e939623556928f73fcc7511c85a537929a4a7eDan EgnorNuPlayer::StreamingSource::~StreamingSource() { 4118e939623556928f73fcc7511c85a537929a4a7eDan Egnor} 42a63730d1f103f78589faef461d2af7351fc49f42Brad Fitzpatrick 439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectvoid NuPlayer::StreamingSource::start() { 449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mStreamListener = new NuPlayerStreamListener(mSource, 0); 459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mTSParser = new ATSParser; 469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mStreamListener->start(); 489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project} 499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectbool NuPlayer::StreamingSource::feedMoreTSData() { 519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (mEOS) { 529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return false; 53c1e8aa4c448807fc3ee9d21e8b67bb886fa065aaMike Lockwood } 549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project for (int32_t i = 0; i < 10; ++i) { 569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project char buffer[188]; 579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project sp<AMessage> extra; 589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project ssize_t n = mStreamListener->read(buffer, sizeof(buffer), &extra); 599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (n == 0) { 619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project LOGI("input data EOS reached."); 6275986cf9bc57ef11ad70f36fb77fbbf5d63af6ecsvetoslavganov mTSParser->signalEOS(ERROR_END_OF_STREAM); 63dace230043314d6fab1c5ced4b031eaccd814c25Dianne Hackborn mEOS = true; 64603073430bbcb1bd29db7afb9b14e2732ad589fbFred Quintana break; 65603073430bbcb1bd29db7afb9b14e2732ad589fbFred Quintana } else if (n == INFO_DISCONTINUITY) { 66603073430bbcb1bd29db7afb9b14e2732ad589fbFred Quintana mTSParser->signalDiscontinuity( 67603073430bbcb1bd29db7afb9b14e2732ad589fbFred Quintana ATSParser::DISCONTINUITY_SEEK, extra); 68b06ea706530e6d19eb2a1a9a7ae6c5dd77d80af0Dianne Hackborn } else if (n < 0) { 699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project CHECK_EQ(n, -EWOULDBLOCK); 709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project break; 719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } else { 72b06ea706530e6d19eb2a1a9a7ae6c5dd77d80af0Dianne Hackborn if (buffer[0] == 0x00) { 739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // XXX legacy 749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mTSParser->signalDiscontinuity( 75a4620793038b9a9163b26c6ece882cb454fcbf87Jeff Sharkey buffer[1] == 0x00 769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project ? ATSParser::DISCONTINUITY_SEEK 778d17f3f24bbda9a9cd7ea08c5925508dc2c011beBjorn Bringert : ATSParser::DISCONTINUITY_FORMATCHANGE, 789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project extra); 799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } else { 80f26fd99a7c2f554b0297760bb66336473c7db61fDianne Hackborn mTSParser->feedTSPacket(buffer, sizeof(buffer)); 819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 8227b28b3f62bd3b54fa13acd5d035940b9be464f3Tobias Haamel } 838cc6a5026aeb5cf9cc36529426fe0cc66714f5fbDianne Hackborn } 848cc6a5026aeb5cf9cc36529426fe0cc66714f5fbDianne Hackborn 8587bba1ee14279bb14a28d42e27c4ef66d9967bf8Dianne Hackborn return true; 864528186e0d65fc68ef0dd1941aa2ac8aefcd55a3Christopher Tate} 874a627c71ff53a4fca1f961f4b1dcc0461df18a06Christopher Tate 884528186e0d65fc68ef0dd1941aa2ac8aefcd55a3Christopher Tatesp<MetaData> NuPlayer::StreamingSource::getFormat(bool audio) { 894528186e0d65fc68ef0dd1941aa2ac8aefcd55a3Christopher Tate ATSParser::SourceType type = 90bd022f423a33f0794bb53e5b0720da2d67e4631cNick Pelly audio ? ATSParser::MPEG2ADTS_AUDIO : ATSParser::AVC_VIDEO; 919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 9216fb88a673c41b93c5d57ccb28c2697e7d87701aNick Pelly sp<AnotherPacketSource> source = 939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project static_cast<AnotherPacketSource *>(mTSParser->getSource(type).get()); 942ea1e85dcb57d17f5782dbafa1d25eb51c630e4bJaikumar Ganesh 953f41673265dcaaef058703311c5481e8a51fd8beJiafa Liu if (source == NULL) { 96ef2cb7c93a99096799d415e721dda46d1bf7a005Jaikumar Ganesh return NULL; 979f53119b72e6da865bcd53173d3dacd1eba01aeeDianne Hackborn } 98b06ea706530e6d19eb2a1a9a7ae6c5dd77d80af0Dianne Hackborn 991ccac75e1f1b97eccb916a8de04fc1012b30f6e5Suchi Amalapurapu return source->getFormat(); 1001ccac75e1f1b97eccb916a8de04fc1012b30f6e5Suchi Amalapurapu} 1019f53119b72e6da865bcd53173d3dacd1eba01aeeDianne Hackborn 1029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectstatus_t NuPlayer::StreamingSource::dequeueAccessUnit( 1039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project bool audio, sp<ABuffer> *accessUnit) { 104b06ea706530e6d19eb2a1a9a7ae6c5dd77d80af0Dianne Hackborn ATSParser::SourceType type = 1059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project audio ? ATSParser::MPEG2ADTS_AUDIO : ATSParser::AVC_VIDEO; 1069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project sp<AnotherPacketSource> source = 1089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project static_cast<AnotherPacketSource *>(mTSParser->getSource(type).get()); 1098946dd3355fc1dcbad872c0546e356474d4cc5deSuchi Amalapurapu 1109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (source == NULL) { 1119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return -EWOULDBLOCK; 112c4308f01c965571dc2354107c3574df113e397eeMike Lockwood } 1139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1144d02d001ef6e06583e858e63e48d1aebf54ba28dSan Mehat status_t finalResult; 115eb9cbb8fdddf4c887004b20b504083035d57a15fMike Lockwood if (!source->hasBufferAvailable(&finalResult)) { 116c006f1aec15454782c35e028ad64d79a5c161cc1Jeff Sharkey return finalResult == OK ? -EWOULDBLOCK : finalResult; 117d5cdd597b895a48ffa9a8e39f8a2504cd9b905c4Jeff Sharkey } 11875279904202357565cf5a1cb11148d01f42b4569Jeff Sharkey 11901425365a85e605139f612502f68954cad869e5bJason parks return source->dequeueAccessUnit(accessUnit); 120f36c6db108364dea89b1e3c27c0b15103e560d87Nick Pelly} 121367f41f8f61126c2ab34a34cc676756a9fc23ac2Nick Pelly 122f36c6db108364dea89b1e3c27c0b15103e560d87Nick Pelly} // namespace android 123eb9cbb8fdddf4c887004b20b504083035d57a15fMike Lockwood 1249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project