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