HTTPLiveSource.cpp revision 14f7672b5d450ed26a06fd3bb3ce045ea78b11b2
15bc087c573c70c84c6a39946457590b42d392a33Andreas Huber/*
25bc087c573c70c84c6a39946457590b42d392a33Andreas Huber * Copyright (C) 2010 The Android Open Source Project
35bc087c573c70c84c6a39946457590b42d392a33Andreas Huber *
45bc087c573c70c84c6a39946457590b42d392a33Andreas Huber * Licensed under the Apache License, Version 2.0 (the "License");
55bc087c573c70c84c6a39946457590b42d392a33Andreas Huber * you may not use this file except in compliance with the License.
65bc087c573c70c84c6a39946457590b42d392a33Andreas Huber * You may obtain a copy of the License at
75bc087c573c70c84c6a39946457590b42d392a33Andreas Huber *
85bc087c573c70c84c6a39946457590b42d392a33Andreas Huber *      http://www.apache.org/licenses/LICENSE-2.0
95bc087c573c70c84c6a39946457590b42d392a33Andreas Huber *
105bc087c573c70c84c6a39946457590b42d392a33Andreas Huber * Unless required by applicable law or agreed to in writing, software
115bc087c573c70c84c6a39946457590b42d392a33Andreas Huber * distributed under the License is distributed on an "AS IS" BASIS,
125bc087c573c70c84c6a39946457590b42d392a33Andreas Huber * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
135bc087c573c70c84c6a39946457590b42d392a33Andreas Huber * See the License for the specific language governing permissions and
145bc087c573c70c84c6a39946457590b42d392a33Andreas Huber * limitations under the License.
155bc087c573c70c84c6a39946457590b42d392a33Andreas Huber */
165bc087c573c70c84c6a39946457590b42d392a33Andreas Huber
175bc087c573c70c84c6a39946457590b42d392a33Andreas Huber//#define LOG_NDEBUG 0
185bc087c573c70c84c6a39946457590b42d392a33Andreas Huber#define LOG_TAG "HTTPLiveSource"
195bc087c573c70c84c6a39946457590b42d392a33Andreas Huber#include <utils/Log.h>
205bc087c573c70c84c6a39946457590b42d392a33Andreas Huber
215bc087c573c70c84c6a39946457590b42d392a33Andreas Huber#include "HTTPLiveSource.h"
225bc087c573c70c84c6a39946457590b42d392a33Andreas Huber
235bc087c573c70c84c6a39946457590b42d392a33Andreas Huber#include "AnotherPacketSource.h"
245bc087c573c70c84c6a39946457590b42d392a33Andreas Huber#include "LiveDataSource.h"
255bc087c573c70c84c6a39946457590b42d392a33Andreas Huber#include "LiveSession.h"
265bc087c573c70c84c6a39946457590b42d392a33Andreas Huber
275bc087c573c70c84c6a39946457590b42d392a33Andreas Huber#include <media/stagefright/foundation/ABuffer.h>
285bc087c573c70c84c6a39946457590b42d392a33Andreas Huber#include <media/stagefright/foundation/ADebug.h>
295bc087c573c70c84c6a39946457590b42d392a33Andreas Huber#include <media/stagefright/foundation/AMessage.h>
305bc087c573c70c84c6a39946457590b42d392a33Andreas Huber#include <media/stagefright/MediaErrors.h>
315bc087c573c70c84c6a39946457590b42d392a33Andreas Huber#include <media/stagefright/MetaData.h>
325bc087c573c70c84c6a39946457590b42d392a33Andreas Huber
335bc087c573c70c84c6a39946457590b42d392a33Andreas Hubernamespace android {
345bc087c573c70c84c6a39946457590b42d392a33Andreas Huber
35ad0d9c9c39a24b7fbd94e935a5855c9025341929Andreas HuberNuPlayer::HTTPLiveSource::HTTPLiveSource(
36b5f25f005bc1d3ae35f45b58c88345e183dc336dAndreas Huber        const sp<AMessage> &notify,
37ad0d9c9c39a24b7fbd94e935a5855c9025341929Andreas Huber        const char *url,
389b80c2bdb205bc143104f54d0743b6eedd67b14eAndreas Huber        const KeyedVector<String8, String8> *headers,
399b80c2bdb205bc143104f54d0743b6eedd67b14eAndreas Huber        bool uidValid, uid_t uid)
40b5f25f005bc1d3ae35f45b58c88345e183dc336dAndreas Huber    : Source(notify),
41b5f25f005bc1d3ae35f45b58c88345e183dc336dAndreas Huber      mURL(url),
429b80c2bdb205bc143104f54d0743b6eedd67b14eAndreas Huber      mUIDValid(uidValid),
439b80c2bdb205bc143104f54d0743b6eedd67b14eAndreas Huber      mUID(uid),
44ad0d9c9c39a24b7fbd94e935a5855c9025341929Andreas Huber      mFlags(0),
45eac68baf095aeef54865c28b6888924dc6295cbdAndreas Huber      mFinalResult(OK),
465bc087c573c70c84c6a39946457590b42d392a33Andreas Huber      mOffset(0) {
47ad0d9c9c39a24b7fbd94e935a5855c9025341929Andreas Huber    if (headers) {
48ad0d9c9c39a24b7fbd94e935a5855c9025341929Andreas Huber        mExtraHeaders = *headers;
49ad0d9c9c39a24b7fbd94e935a5855c9025341929Andreas Huber
50ad0d9c9c39a24b7fbd94e935a5855c9025341929Andreas Huber        ssize_t index =
51ad0d9c9c39a24b7fbd94e935a5855c9025341929Andreas Huber            mExtraHeaders.indexOfKey(String8("x-hide-urls-from-log"));
52ad0d9c9c39a24b7fbd94e935a5855c9025341929Andreas Huber
53ad0d9c9c39a24b7fbd94e935a5855c9025341929Andreas Huber        if (index >= 0) {
54ad0d9c9c39a24b7fbd94e935a5855c9025341929Andreas Huber            mFlags |= kFlagIncognito;
55ad0d9c9c39a24b7fbd94e935a5855c9025341929Andreas Huber
56ad0d9c9c39a24b7fbd94e935a5855c9025341929Andreas Huber            mExtraHeaders.removeItemsAt(index);
57ad0d9c9c39a24b7fbd94e935a5855c9025341929Andreas Huber        }
58ad0d9c9c39a24b7fbd94e935a5855c9025341929Andreas Huber    }
595bc087c573c70c84c6a39946457590b42d392a33Andreas Huber}
605bc087c573c70c84c6a39946457590b42d392a33Andreas Huber
615bc087c573c70c84c6a39946457590b42d392a33Andreas HuberNuPlayer::HTTPLiveSource::~HTTPLiveSource() {
622048d0cfccce48be26816dec8711a6691ebff71cAndreas Huber    if (mLiveSession != NULL) {
632048d0cfccce48be26816dec8711a6691ebff71cAndreas Huber        mLiveSession->disconnect();
6414f7672b5d450ed26a06fd3bb3ce045ea78b11b2Andreas Huber        mLiveSession.clear();
6514f7672b5d450ed26a06fd3bb3ce045ea78b11b2Andreas Huber
662048d0cfccce48be26816dec8711a6691ebff71cAndreas Huber        mLiveLooper->stop();
6714f7672b5d450ed26a06fd3bb3ce045ea78b11b2Andreas Huber        mLiveLooper.clear();
682048d0cfccce48be26816dec8711a6691ebff71cAndreas Huber    }
695bc087c573c70c84c6a39946457590b42d392a33Andreas Huber}
705bc087c573c70c84c6a39946457590b42d392a33Andreas Huber
719575c96b6e418914e2ffc6741ecc8d71e3968dbeAndreas Hubervoid NuPlayer::HTTPLiveSource::prepareAsync() {
725bc087c573c70c84c6a39946457590b42d392a33Andreas Huber    mLiveLooper = new ALooper;
735bc087c573c70c84c6a39946457590b42d392a33Andreas Huber    mLiveLooper->setName("http live");
745bc087c573c70c84c6a39946457590b42d392a33Andreas Huber    mLiveLooper->start();
755bc087c573c70c84c6a39946457590b42d392a33Andreas Huber
760df36ec3303c2c6bf9b42c07945ac8bd234153f3Andreas Huber    sp<AMessage> notify = new AMessage(kWhatSessionNotify, id());
770df36ec3303c2c6bf9b42c07945ac8bd234153f3Andreas Huber
787314fa17093d514199fedcb55ac41136a1b31cb3Andreas Huber    mLiveSession = new LiveSession(
790df36ec3303c2c6bf9b42c07945ac8bd234153f3Andreas Huber            notify,
809b80c2bdb205bc143104f54d0743b6eedd67b14eAndreas Huber            (mFlags & kFlagIncognito) ? LiveSession::kFlagIncognito : 0,
8114f7672b5d450ed26a06fd3bb3ce045ea78b11b2Andreas Huber            mUIDValid,
8214f7672b5d450ed26a06fd3bb3ce045ea78b11b2Andreas Huber            mUID);
837314fa17093d514199fedcb55ac41136a1b31cb3Andreas Huber
845bc087c573c70c84c6a39946457590b42d392a33Andreas Huber    mLiveLooper->registerHandler(mLiveSession);
855bc087c573c70c84c6a39946457590b42d392a33Andreas Huber
8614f7672b5d450ed26a06fd3bb3ce045ea78b11b2Andreas Huber    mLiveSession->connectAsync(
87ad0d9c9c39a24b7fbd94e935a5855c9025341929Andreas Huber            mURL.c_str(), mExtraHeaders.isEmpty() ? NULL : &mExtraHeaders);
889575c96b6e418914e2ffc6741ecc8d71e3968dbeAndreas Huber}
899575c96b6e418914e2ffc6741ecc8d71e3968dbeAndreas Huber
909575c96b6e418914e2ffc6741ecc8d71e3968dbeAndreas Hubervoid NuPlayer::HTTPLiveSource::start() {
915bc087c573c70c84c6a39946457590b42d392a33Andreas Huber}
925bc087c573c70c84c6a39946457590b42d392a33Andreas Huber
9314f7672b5d450ed26a06fd3bb3ce045ea78b11b2Andreas Hubersp<AMessage> NuPlayer::HTTPLiveSource::getFormat(bool audio) {
9414f7672b5d450ed26a06fd3bb3ce045ea78b11b2Andreas Huber    sp<AMessage> format;
9514f7672b5d450ed26a06fd3bb3ce045ea78b11b2Andreas Huber    status_t err = mLiveSession->getStreamFormat(
9614f7672b5d450ed26a06fd3bb3ce045ea78b11b2Andreas Huber            audio ? LiveSession::STREAMTYPE_AUDIO
9714f7672b5d450ed26a06fd3bb3ce045ea78b11b2Andreas Huber                  : LiveSession::STREAMTYPE_VIDEO,
9814f7672b5d450ed26a06fd3bb3ce045ea78b11b2Andreas Huber            &format);
995bc087c573c70c84c6a39946457590b42d392a33Andreas Huber
10014f7672b5d450ed26a06fd3bb3ce045ea78b11b2Andreas Huber    if (err != OK) {
1015bc087c573c70c84c6a39946457590b42d392a33Andreas Huber        return NULL;
1025bc087c573c70c84c6a39946457590b42d392a33Andreas Huber    }
1035bc087c573c70c84c6a39946457590b42d392a33Andreas Huber
10414f7672b5d450ed26a06fd3bb3ce045ea78b11b2Andreas Huber    return format;
1055bc087c573c70c84c6a39946457590b42d392a33Andreas Huber}
1065bc087c573c70c84c6a39946457590b42d392a33Andreas Huber
107eac68baf095aeef54865c28b6888924dc6295cbdAndreas Huberstatus_t NuPlayer::HTTPLiveSource::feedMoreTSData() {
108eac68baf095aeef54865c28b6888924dc6295cbdAndreas Huber    return OK;
1095bc087c573c70c84c6a39946457590b42d392a33Andreas Huber}
1105bc087c573c70c84c6a39946457590b42d392a33Andreas Huber
1115bc087c573c70c84c6a39946457590b42d392a33Andreas Huberstatus_t NuPlayer::HTTPLiveSource::dequeueAccessUnit(
1125bc087c573c70c84c6a39946457590b42d392a33Andreas Huber        bool audio, sp<ABuffer> *accessUnit) {
11314f7672b5d450ed26a06fd3bb3ce045ea78b11b2Andreas Huber    return mLiveSession->dequeueAccessUnit(
11414f7672b5d450ed26a06fd3bb3ce045ea78b11b2Andreas Huber            audio ? LiveSession::STREAMTYPE_AUDIO
11514f7672b5d450ed26a06fd3bb3ce045ea78b11b2Andreas Huber                  : LiveSession::STREAMTYPE_VIDEO,
11614f7672b5d450ed26a06fd3bb3ce045ea78b11b2Andreas Huber            accessUnit);
1175bc087c573c70c84c6a39946457590b42d392a33Andreas Huber}
1185bc087c573c70c84c6a39946457590b42d392a33Andreas Huber
11943c3e6ce02215ca99d506458f596cb1211639f29Andreas Huberstatus_t NuPlayer::HTTPLiveSource::getDuration(int64_t *durationUs) {
12043c3e6ce02215ca99d506458f596cb1211639f29Andreas Huber    return mLiveSession->getDuration(durationUs);
12143c3e6ce02215ca99d506458f596cb1211639f29Andreas Huber}
12243c3e6ce02215ca99d506458f596cb1211639f29Andreas Huber
12343c3e6ce02215ca99d506458f596cb1211639f29Andreas Huberstatus_t NuPlayer::HTTPLiveSource::seekTo(int64_t seekTimeUs) {
12414f7672b5d450ed26a06fd3bb3ce045ea78b11b2Andreas Huber    return mLiveSession->seekTo(seekTimeUs);
12543c3e6ce02215ca99d506458f596cb1211639f29Andreas Huber}
12643c3e6ce02215ca99d506458f596cb1211639f29Andreas Huber
1270df36ec3303c2c6bf9b42c07945ac8bd234153f3Andreas Hubervoid NuPlayer::HTTPLiveSource::onMessageReceived(const sp<AMessage> &msg) {
1280df36ec3303c2c6bf9b42c07945ac8bd234153f3Andreas Huber    switch (msg->what()) {
1290df36ec3303c2c6bf9b42c07945ac8bd234153f3Andreas Huber        case kWhatSessionNotify:
1300df36ec3303c2c6bf9b42c07945ac8bd234153f3Andreas Huber        {
1310df36ec3303c2c6bf9b42c07945ac8bd234153f3Andreas Huber            onSessionNotify(msg);
1320df36ec3303c2c6bf9b42c07945ac8bd234153f3Andreas Huber            break;
1330df36ec3303c2c6bf9b42c07945ac8bd234153f3Andreas Huber        }
1340df36ec3303c2c6bf9b42c07945ac8bd234153f3Andreas Huber
1350df36ec3303c2c6bf9b42c07945ac8bd234153f3Andreas Huber        default:
1360df36ec3303c2c6bf9b42c07945ac8bd234153f3Andreas Huber            Source::onMessageReceived(msg);
1370df36ec3303c2c6bf9b42c07945ac8bd234153f3Andreas Huber            break;
1380df36ec3303c2c6bf9b42c07945ac8bd234153f3Andreas Huber    }
1390df36ec3303c2c6bf9b42c07945ac8bd234153f3Andreas Huber}
1400df36ec3303c2c6bf9b42c07945ac8bd234153f3Andreas Huber
1410df36ec3303c2c6bf9b42c07945ac8bd234153f3Andreas Hubervoid NuPlayer::HTTPLiveSource::onSessionNotify(const sp<AMessage> &msg) {
1420df36ec3303c2c6bf9b42c07945ac8bd234153f3Andreas Huber    int32_t what;
1430df36ec3303c2c6bf9b42c07945ac8bd234153f3Andreas Huber    CHECK(msg->findInt32("what", &what));
1440df36ec3303c2c6bf9b42c07945ac8bd234153f3Andreas Huber
1450df36ec3303c2c6bf9b42c07945ac8bd234153f3Andreas Huber    switch (what) {
1460df36ec3303c2c6bf9b42c07945ac8bd234153f3Andreas Huber        case LiveSession::kWhatPrepared:
1470df36ec3303c2c6bf9b42c07945ac8bd234153f3Andreas Huber        {
1480df36ec3303c2c6bf9b42c07945ac8bd234153f3Andreas Huber            notifyVideoSizeChanged(0, 0);
1490df36ec3303c2c6bf9b42c07945ac8bd234153f3Andreas Huber
1500df36ec3303c2c6bf9b42c07945ac8bd234153f3Andreas Huber            uint32_t flags = FLAG_CAN_PAUSE;
1510df36ec3303c2c6bf9b42c07945ac8bd234153f3Andreas Huber            if (mLiveSession->isSeekable()) {
1520df36ec3303c2c6bf9b42c07945ac8bd234153f3Andreas Huber                flags |= FLAG_CAN_SEEK;
1530df36ec3303c2c6bf9b42c07945ac8bd234153f3Andreas Huber                flags |= FLAG_CAN_SEEK_BACKWARD;
1540df36ec3303c2c6bf9b42c07945ac8bd234153f3Andreas Huber                flags |= FLAG_CAN_SEEK_FORWARD;
1550df36ec3303c2c6bf9b42c07945ac8bd234153f3Andreas Huber            }
1560df36ec3303c2c6bf9b42c07945ac8bd234153f3Andreas Huber
1570df36ec3303c2c6bf9b42c07945ac8bd234153f3Andreas Huber            if (mLiveSession->hasDynamicDuration()) {
1580df36ec3303c2c6bf9b42c07945ac8bd234153f3Andreas Huber                flags |= FLAG_DYNAMIC_DURATION;
1590df36ec3303c2c6bf9b42c07945ac8bd234153f3Andreas Huber            }
1600df36ec3303c2c6bf9b42c07945ac8bd234153f3Andreas Huber
1610df36ec3303c2c6bf9b42c07945ac8bd234153f3Andreas Huber            notifyFlagsChanged(flags);
1620df36ec3303c2c6bf9b42c07945ac8bd234153f3Andreas Huber
1630df36ec3303c2c6bf9b42c07945ac8bd234153f3Andreas Huber            notifyPrepared();
1640df36ec3303c2c6bf9b42c07945ac8bd234153f3Andreas Huber            break;
1650df36ec3303c2c6bf9b42c07945ac8bd234153f3Andreas Huber        }
1660df36ec3303c2c6bf9b42c07945ac8bd234153f3Andreas Huber
1670df36ec3303c2c6bf9b42c07945ac8bd234153f3Andreas Huber        case LiveSession::kWhatPreparationFailed:
1680df36ec3303c2c6bf9b42c07945ac8bd234153f3Andreas Huber        {
1690df36ec3303c2c6bf9b42c07945ac8bd234153f3Andreas Huber            status_t err;
1700df36ec3303c2c6bf9b42c07945ac8bd234153f3Andreas Huber            CHECK(msg->findInt32("err", &err));
1710df36ec3303c2c6bf9b42c07945ac8bd234153f3Andreas Huber
1720df36ec3303c2c6bf9b42c07945ac8bd234153f3Andreas Huber            notifyPrepared(err);
1730df36ec3303c2c6bf9b42c07945ac8bd234153f3Andreas Huber            break;
1740df36ec3303c2c6bf9b42c07945ac8bd234153f3Andreas Huber        }
1750df36ec3303c2c6bf9b42c07945ac8bd234153f3Andreas Huber
17614f7672b5d450ed26a06fd3bb3ce045ea78b11b2Andreas Huber        case LiveSession::kWhatStreamsChanged:
17714f7672b5d450ed26a06fd3bb3ce045ea78b11b2Andreas Huber        {
17814f7672b5d450ed26a06fd3bb3ce045ea78b11b2Andreas Huber            uint32_t changedMask;
17914f7672b5d450ed26a06fd3bb3ce045ea78b11b2Andreas Huber            CHECK(msg->findInt32(
18014f7672b5d450ed26a06fd3bb3ce045ea78b11b2Andreas Huber                        "changedMask", (int32_t *)&changedMask));
18114f7672b5d450ed26a06fd3bb3ce045ea78b11b2Andreas Huber
18214f7672b5d450ed26a06fd3bb3ce045ea78b11b2Andreas Huber            bool audio = changedMask & LiveSession::STREAMTYPE_AUDIO;
18314f7672b5d450ed26a06fd3bb3ce045ea78b11b2Andreas Huber            bool video = changedMask & LiveSession::STREAMTYPE_VIDEO;
18414f7672b5d450ed26a06fd3bb3ce045ea78b11b2Andreas Huber
18514f7672b5d450ed26a06fd3bb3ce045ea78b11b2Andreas Huber            sp<AMessage> reply;
18614f7672b5d450ed26a06fd3bb3ce045ea78b11b2Andreas Huber            CHECK(msg->findMessage("reply", &reply));
18714f7672b5d450ed26a06fd3bb3ce045ea78b11b2Andreas Huber
18814f7672b5d450ed26a06fd3bb3ce045ea78b11b2Andreas Huber            sp<AMessage> notify = dupNotify();
18914f7672b5d450ed26a06fd3bb3ce045ea78b11b2Andreas Huber            notify->setInt32("what", kWhatQueueDecoderShutdown);
19014f7672b5d450ed26a06fd3bb3ce045ea78b11b2Andreas Huber            notify->setInt32("audio", audio);
19114f7672b5d450ed26a06fd3bb3ce045ea78b11b2Andreas Huber            notify->setInt32("video", video);
19214f7672b5d450ed26a06fd3bb3ce045ea78b11b2Andreas Huber            notify->setMessage("reply", reply);
19314f7672b5d450ed26a06fd3bb3ce045ea78b11b2Andreas Huber            notify->post();
19414f7672b5d450ed26a06fd3bb3ce045ea78b11b2Andreas Huber            break;
19514f7672b5d450ed26a06fd3bb3ce045ea78b11b2Andreas Huber        }
19614f7672b5d450ed26a06fd3bb3ce045ea78b11b2Andreas Huber
19714f7672b5d450ed26a06fd3bb3ce045ea78b11b2Andreas Huber        case LiveSession::kWhatError:
19814f7672b5d450ed26a06fd3bb3ce045ea78b11b2Andreas Huber        {
19914f7672b5d450ed26a06fd3bb3ce045ea78b11b2Andreas Huber            break;
20014f7672b5d450ed26a06fd3bb3ce045ea78b11b2Andreas Huber        }
20114f7672b5d450ed26a06fd3bb3ce045ea78b11b2Andreas Huber
2020df36ec3303c2c6bf9b42c07945ac8bd234153f3Andreas Huber        default:
2030df36ec3303c2c6bf9b42c07945ac8bd234153f3Andreas Huber            TRESPASS();
2040df36ec3303c2c6bf9b42c07945ac8bd234153f3Andreas Huber    }
2050df36ec3303c2c6bf9b42c07945ac8bd234153f3Andreas Huber}
2060df36ec3303c2c6bf9b42c07945ac8bd234153f3Andreas Huber
2075bc087c573c70c84c6a39946457590b42d392a33Andreas Huber}  // namespace android
2085bc087c573c70c84c6a39946457590b42d392a33Andreas Huber
209