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