HTTPLiveSource.cpp revision 0852843d304006e3ab333081fddda13b07193de8
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
261b86fe063badb5f28c467ade39be0f4008688947Andreas Huber#include <media/IMediaHTTPService.h>
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>
320852843d304006e3ab333081fddda13b07193de8Robert Shih#include <media/stagefright/MediaDefs.h>
335bc087c573c70c84c6a39946457590b42d392a33Andreas Huber
345bc087c573c70c84c6a39946457590b42d392a33Andreas Hubernamespace android {
355bc087c573c70c84c6a39946457590b42d392a33Andreas Huber
36ad0d9c9c39a24b7fbd94e935a5855c9025341929Andreas HuberNuPlayer::HTTPLiveSource::HTTPLiveSource(
37b5f25f005bc1d3ae35f45b58c88345e183dc336dAndreas Huber        const sp<AMessage> &notify,
381b86fe063badb5f28c467ade39be0f4008688947Andreas Huber        const sp<IMediaHTTPService> &httpService,
39ad0d9c9c39a24b7fbd94e935a5855c9025341929Andreas Huber        const char *url,
4081e68448f3361eaf8618930471fdc3c21bdf5cbcAndreas Huber        const KeyedVector<String8, String8> *headers)
41b5f25f005bc1d3ae35f45b58c88345e183dc336dAndreas Huber    : Source(notify),
421b86fe063badb5f28c467ade39be0f4008688947Andreas Huber      mHTTPService(httpService),
43b5f25f005bc1d3ae35f45b58c88345e183dc336dAndreas Huber      mURL(url),
44ad0d9c9c39a24b7fbd94e935a5855c9025341929Andreas Huber      mFlags(0),
45eac68baf095aeef54865c28b6888924dc6295cbdAndreas Huber      mFinalResult(OK),
46dcb89b3b505522efde173c105a851c412f947178Chong Zhang      mOffset(0),
470852843d304006e3ab333081fddda13b07193de8Robert Shih      mFetchSubtitleDataGeneration(0),
480852843d304006e3ab333081fddda13b07193de8Robert Shih      mFetchMetaDataGeneration(0),
490852843d304006e3ab333081fddda13b07193de8Robert Shih      mHasMetadata(false),
500852843d304006e3ab333081fddda13b07193de8Robert Shih      mMetadataSelected(false) {
51ad0d9c9c39a24b7fbd94e935a5855c9025341929Andreas Huber    if (headers) {
52ad0d9c9c39a24b7fbd94e935a5855c9025341929Andreas Huber        mExtraHeaders = *headers;
53ad0d9c9c39a24b7fbd94e935a5855c9025341929Andreas Huber
54ad0d9c9c39a24b7fbd94e935a5855c9025341929Andreas Huber        ssize_t index =
55ad0d9c9c39a24b7fbd94e935a5855c9025341929Andreas Huber            mExtraHeaders.indexOfKey(String8("x-hide-urls-from-log"));
56ad0d9c9c39a24b7fbd94e935a5855c9025341929Andreas Huber
57ad0d9c9c39a24b7fbd94e935a5855c9025341929Andreas Huber        if (index >= 0) {
58ad0d9c9c39a24b7fbd94e935a5855c9025341929Andreas Huber            mFlags |= kFlagIncognito;
59ad0d9c9c39a24b7fbd94e935a5855c9025341929Andreas Huber
60ad0d9c9c39a24b7fbd94e935a5855c9025341929Andreas Huber            mExtraHeaders.removeItemsAt(index);
61ad0d9c9c39a24b7fbd94e935a5855c9025341929Andreas Huber        }
62ad0d9c9c39a24b7fbd94e935a5855c9025341929Andreas Huber    }
635bc087c573c70c84c6a39946457590b42d392a33Andreas Huber}
645bc087c573c70c84c6a39946457590b42d392a33Andreas Huber
655bc087c573c70c84c6a39946457590b42d392a33Andreas HuberNuPlayer::HTTPLiveSource::~HTTPLiveSource() {
662048d0cfccce48be26816dec8711a6691ebff71cAndreas Huber    if (mLiveSession != NULL) {
672048d0cfccce48be26816dec8711a6691ebff71cAndreas Huber        mLiveSession->disconnect();
6814f7672b5d450ed26a06fd3bb3ce045ea78b11b2Andreas Huber
691228d6b175de8b21787cbe0c6c4bb5642f4d555eChong Zhang        mLiveLooper->unregisterHandler(mLiveSession->id());
701228d6b175de8b21787cbe0c6c4bb5642f4d555eChong Zhang        mLiveLooper->unregisterHandler(id());
712048d0cfccce48be26816dec8711a6691ebff71cAndreas Huber        mLiveLooper->stop();
721228d6b175de8b21787cbe0c6c4bb5642f4d555eChong Zhang
731228d6b175de8b21787cbe0c6c4bb5642f4d555eChong Zhang        mLiveSession.clear();
7414f7672b5d450ed26a06fd3bb3ce045ea78b11b2Andreas Huber        mLiveLooper.clear();
752048d0cfccce48be26816dec8711a6691ebff71cAndreas Huber    }
765bc087c573c70c84c6a39946457590b42d392a33Andreas Huber}
775bc087c573c70c84c6a39946457590b42d392a33Andreas Huber
789575c96b6e418914e2ffc6741ecc8d71e3968dbeAndreas Hubervoid NuPlayer::HTTPLiveSource::prepareAsync() {
791228d6b175de8b21787cbe0c6c4bb5642f4d555eChong Zhang    if (mLiveLooper == NULL) {
801228d6b175de8b21787cbe0c6c4bb5642f4d555eChong Zhang        mLiveLooper = new ALooper;
811228d6b175de8b21787cbe0c6c4bb5642f4d555eChong Zhang        mLiveLooper->setName("http live");
821228d6b175de8b21787cbe0c6c4bb5642f4d555eChong Zhang        mLiveLooper->start();
831228d6b175de8b21787cbe0c6c4bb5642f4d555eChong Zhang
841228d6b175de8b21787cbe0c6c4bb5642f4d555eChong Zhang        mLiveLooper->registerHandler(this);
851228d6b175de8b21787cbe0c6c4bb5642f4d555eChong Zhang    }
865bc087c573c70c84c6a39946457590b42d392a33Andreas Huber
871d15ab58bf8239069ef343de6cb21aabf3ef7d78Lajos Molnar    sp<AMessage> notify = new AMessage(kWhatSessionNotify, this);
880df36ec3303c2c6bf9b42c07945ac8bd234153f3Andreas Huber
897314fa17093d514199fedcb55ac41136a1b31cb3Andreas Huber    mLiveSession = new LiveSession(
900df36ec3303c2c6bf9b42c07945ac8bd234153f3Andreas Huber            notify,
919b80c2bdb205bc143104f54d0743b6eedd67b14eAndreas Huber            (mFlags & kFlagIncognito) ? LiveSession::kFlagIncognito : 0,
9281e68448f3361eaf8618930471fdc3c21bdf5cbcAndreas Huber            mHTTPService);
937314fa17093d514199fedcb55ac41136a1b31cb3Andreas Huber
945bc087c573c70c84c6a39946457590b42d392a33Andreas Huber    mLiveLooper->registerHandler(mLiveSession);
955bc087c573c70c84c6a39946457590b42d392a33Andreas Huber
9614f7672b5d450ed26a06fd3bb3ce045ea78b11b2Andreas Huber    mLiveSession->connectAsync(
97ad0d9c9c39a24b7fbd94e935a5855c9025341929Andreas Huber            mURL.c_str(), mExtraHeaders.isEmpty() ? NULL : &mExtraHeaders);
989575c96b6e418914e2ffc6741ecc8d71e3968dbeAndreas Huber}
999575c96b6e418914e2ffc6741ecc8d71e3968dbeAndreas Huber
1009575c96b6e418914e2ffc6741ecc8d71e3968dbeAndreas Hubervoid NuPlayer::HTTPLiveSource::start() {
1015bc087c573c70c84c6a39946457590b42d392a33Andreas Huber}
1025bc087c573c70c84c6a39946457590b42d392a33Andreas Huber
10314f7672b5d450ed26a06fd3bb3ce045ea78b11b2Andreas Hubersp<AMessage> NuPlayer::HTTPLiveSource::getFormat(bool audio) {
1041098d87e56f726184ae9c8fe903ea4743669f35bRobert Shih    if (mLiveSession == NULL) {
1051098d87e56f726184ae9c8fe903ea4743669f35bRobert Shih        return NULL;
1061098d87e56f726184ae9c8fe903ea4743669f35bRobert Shih    }
1071098d87e56f726184ae9c8fe903ea4743669f35bRobert Shih
10814f7672b5d450ed26a06fd3bb3ce045ea78b11b2Andreas Huber    sp<AMessage> format;
10914f7672b5d450ed26a06fd3bb3ce045ea78b11b2Andreas Huber    status_t err = mLiveSession->getStreamFormat(
11014f7672b5d450ed26a06fd3bb3ce045ea78b11b2Andreas Huber            audio ? LiveSession::STREAMTYPE_AUDIO
11114f7672b5d450ed26a06fd3bb3ce045ea78b11b2Andreas Huber                  : LiveSession::STREAMTYPE_VIDEO,
11214f7672b5d450ed26a06fd3bb3ce045ea78b11b2Andreas Huber            &format);
1135bc087c573c70c84c6a39946457590b42d392a33Andreas Huber
11414f7672b5d450ed26a06fd3bb3ce045ea78b11b2Andreas Huber    if (err != OK) {
1155bc087c573c70c84c6a39946457590b42d392a33Andreas Huber        return NULL;
1165bc087c573c70c84c6a39946457590b42d392a33Andreas Huber    }
1175bc087c573c70c84c6a39946457590b42d392a33Andreas Huber
11814f7672b5d450ed26a06fd3bb3ce045ea78b11b2Andreas Huber    return format;
1195bc087c573c70c84c6a39946457590b42d392a33Andreas Huber}
1205bc087c573c70c84c6a39946457590b42d392a33Andreas Huber
121eac68baf095aeef54865c28b6888924dc6295cbdAndreas Huberstatus_t NuPlayer::HTTPLiveSource::feedMoreTSData() {
122eac68baf095aeef54865c28b6888924dc6295cbdAndreas Huber    return OK;
1235bc087c573c70c84c6a39946457590b42d392a33Andreas Huber}
1245bc087c573c70c84c6a39946457590b42d392a33Andreas Huber
1255bc087c573c70c84c6a39946457590b42d392a33Andreas Huberstatus_t NuPlayer::HTTPLiveSource::dequeueAccessUnit(
1265bc087c573c70c84c6a39946457590b42d392a33Andreas Huber        bool audio, sp<ABuffer> *accessUnit) {
12714f7672b5d450ed26a06fd3bb3ce045ea78b11b2Andreas Huber    return mLiveSession->dequeueAccessUnit(
12814f7672b5d450ed26a06fd3bb3ce045ea78b11b2Andreas Huber            audio ? LiveSession::STREAMTYPE_AUDIO
12914f7672b5d450ed26a06fd3bb3ce045ea78b11b2Andreas Huber                  : LiveSession::STREAMTYPE_VIDEO,
13014f7672b5d450ed26a06fd3bb3ce045ea78b11b2Andreas Huber            accessUnit);
1315bc087c573c70c84c6a39946457590b42d392a33Andreas Huber}
1325bc087c573c70c84c6a39946457590b42d392a33Andreas Huber
13343c3e6ce02215ca99d506458f596cb1211639f29Andreas Huberstatus_t NuPlayer::HTTPLiveSource::getDuration(int64_t *durationUs) {
13443c3e6ce02215ca99d506458f596cb1211639f29Andreas Huber    return mLiveSession->getDuration(durationUs);
13543c3e6ce02215ca99d506458f596cb1211639f29Andreas Huber}
13643c3e6ce02215ca99d506458f596cb1211639f29Andreas Huber
137404fced9bfa8fa423ee210a271ca051ffd1bec13Chong Zhangsize_t NuPlayer::HTTPLiveSource::getTrackCount() const {
138404fced9bfa8fa423ee210a271ca051ffd1bec13Chong Zhang    return mLiveSession->getTrackCount();
139404fced9bfa8fa423ee210a271ca051ffd1bec13Chong Zhang}
140404fced9bfa8fa423ee210a271ca051ffd1bec13Chong Zhang
141404fced9bfa8fa423ee210a271ca051ffd1bec13Chong Zhangsp<AMessage> NuPlayer::HTTPLiveSource::getTrackInfo(size_t trackIndex) const {
142404fced9bfa8fa423ee210a271ca051ffd1bec13Chong Zhang    return mLiveSession->getTrackInfo(trackIndex);
143dcb89b3b505522efde173c105a851c412f947178Chong Zhang}
144dcb89b3b505522efde173c105a851c412f947178Chong Zhang
14589bf2525c5b57f17260de5b00c5f3f78ac4b881eRobert Shihssize_t NuPlayer::HTTPLiveSource::getSelectedTrack(media_track_type type) const {
14689bf2525c5b57f17260de5b00c5f3f78ac4b881eRobert Shih    if (mLiveSession == NULL) {
14789bf2525c5b57f17260de5b00c5f3f78ac4b881eRobert Shih        return -1;
1480852843d304006e3ab333081fddda13b07193de8Robert Shih    } else if (type == MEDIA_TRACK_TYPE_METADATA) {
1490852843d304006e3ab333081fddda13b07193de8Robert Shih        // MEDIA_TRACK_TYPE_METADATA is always last track
1500852843d304006e3ab333081fddda13b07193de8Robert Shih        // mMetadataSelected can only be true when mHasMetadata is true
1510852843d304006e3ab333081fddda13b07193de8Robert Shih        return mMetadataSelected ? (mLiveSession->getTrackCount() - 1) : -1;
15289bf2525c5b57f17260de5b00c5f3f78ac4b881eRobert Shih    } else {
15389bf2525c5b57f17260de5b00c5f3f78ac4b881eRobert Shih        return mLiveSession->getSelectedTrack(type);
15489bf2525c5b57f17260de5b00c5f3f78ac4b881eRobert Shih    }
15589bf2525c5b57f17260de5b00c5f3f78ac4b881eRobert Shih}
15689bf2525c5b57f17260de5b00c5f3f78ac4b881eRobert Shih
1576ffb1fd67eb8f00f130a6db914ba42a8432aec70Robert Shihstatus_t NuPlayer::HTTPLiveSource::selectTrack(size_t trackIndex, bool select, int64_t /*timeUs*/) {
1580852843d304006e3ab333081fddda13b07193de8Robert Shih    if (mLiveSession == NULL) {
1590852843d304006e3ab333081fddda13b07193de8Robert Shih        return INVALID_OPERATION;
1600852843d304006e3ab333081fddda13b07193de8Robert Shih    }
1610852843d304006e3ab333081fddda13b07193de8Robert Shih
1620852843d304006e3ab333081fddda13b07193de8Robert Shih    status_t err = INVALID_OPERATION;
1630852843d304006e3ab333081fddda13b07193de8Robert Shih    bool postFetchMsg = false, isSub = false;
1640852843d304006e3ab333081fddda13b07193de8Robert Shih    if (trackIndex != mLiveSession->getTrackCount() - 1) {
1650852843d304006e3ab333081fddda13b07193de8Robert Shih        err = mLiveSession->selectTrack(trackIndex, select);
1660852843d304006e3ab333081fddda13b07193de8Robert Shih        postFetchMsg = select;
1670852843d304006e3ab333081fddda13b07193de8Robert Shih        isSub = true;
1680852843d304006e3ab333081fddda13b07193de8Robert Shih    } else {
1690852843d304006e3ab333081fddda13b07193de8Robert Shih        // metadata track
1700852843d304006e3ab333081fddda13b07193de8Robert Shih        if (mHasMetadata) {
1710852843d304006e3ab333081fddda13b07193de8Robert Shih            if (mMetadataSelected && !select) {
1720852843d304006e3ab333081fddda13b07193de8Robert Shih                err = OK;
1730852843d304006e3ab333081fddda13b07193de8Robert Shih            } else if (!mMetadataSelected && select) {
1740852843d304006e3ab333081fddda13b07193de8Robert Shih                postFetchMsg = true;
1750852843d304006e3ab333081fddda13b07193de8Robert Shih                err = OK;
1760852843d304006e3ab333081fddda13b07193de8Robert Shih            } else {
1770852843d304006e3ab333081fddda13b07193de8Robert Shih                err = BAD_VALUE; // behave as LiveSession::selectTrack
1780852843d304006e3ab333081fddda13b07193de8Robert Shih            }
1790852843d304006e3ab333081fddda13b07193de8Robert Shih
1800852843d304006e3ab333081fddda13b07193de8Robert Shih            mMetadataSelected = select;
1810852843d304006e3ab333081fddda13b07193de8Robert Shih        }
1820852843d304006e3ab333081fddda13b07193de8Robert Shih    }
183dcb89b3b505522efde173c105a851c412f947178Chong Zhang
184dcb89b3b505522efde173c105a851c412f947178Chong Zhang    if (err == OK) {
1850852843d304006e3ab333081fddda13b07193de8Robert Shih        int32_t &generation = isSub ? mFetchSubtitleDataGeneration : mFetchMetaDataGeneration;
1860852843d304006e3ab333081fddda13b07193de8Robert Shih        generation++;
1870852843d304006e3ab333081fddda13b07193de8Robert Shih        if (postFetchMsg) {
1880852843d304006e3ab333081fddda13b07193de8Robert Shih            int32_t what = isSub ? kWhatFetchSubtitleData : kWhatFetchMetaData;
1890852843d304006e3ab333081fddda13b07193de8Robert Shih            sp<AMessage> msg = new AMessage(what, this);
1900852843d304006e3ab333081fddda13b07193de8Robert Shih            msg->setInt32("generation", generation);
191dcb89b3b505522efde173c105a851c412f947178Chong Zhang            msg->post();
192dcb89b3b505522efde173c105a851c412f947178Chong Zhang        }
193dcb89b3b505522efde173c105a851c412f947178Chong Zhang    }
194dcb89b3b505522efde173c105a851c412f947178Chong Zhang
195dcb89b3b505522efde173c105a851c412f947178Chong Zhang    // LiveSession::selectTrack returns BAD_VALUE when selecting the currently
196dcb89b3b505522efde173c105a851c412f947178Chong Zhang    // selected track, or unselecting a non-selected track. In this case it's an
197dcb89b3b505522efde173c105a851c412f947178Chong Zhang    // no-op so we return OK.
19884333e0475bc911adc16417f4ca327c975cf6c36Andreas Huber    return (err == OK || err == BAD_VALUE) ? (status_t)OK : err;
199dcb89b3b505522efde173c105a851c412f947178Chong Zhang}
200dcb89b3b505522efde173c105a851c412f947178Chong Zhang
20143c3e6ce02215ca99d506458f596cb1211639f29Andreas Huberstatus_t NuPlayer::HTTPLiveSource::seekTo(int64_t seekTimeUs) {
20214f7672b5d450ed26a06fd3bb3ce045ea78b11b2Andreas Huber    return mLiveSession->seekTo(seekTimeUs);
20343c3e6ce02215ca99d506458f596cb1211639f29Andreas Huber}
20443c3e6ce02215ca99d506458f596cb1211639f29Andreas Huber
2050852843d304006e3ab333081fddda13b07193de8Robert Shihvoid NuPlayer::HTTPLiveSource::pollForRawData(
2060852843d304006e3ab333081fddda13b07193de8Robert Shih        const sp<AMessage> &msg, int32_t currentGeneration,
2070852843d304006e3ab333081fddda13b07193de8Robert Shih        LiveSession::StreamType fetchType, int32_t pushWhat) {
2080852843d304006e3ab333081fddda13b07193de8Robert Shih
2090852843d304006e3ab333081fddda13b07193de8Robert Shih    int32_t generation;
2100852843d304006e3ab333081fddda13b07193de8Robert Shih    CHECK(msg->findInt32("generation", &generation));
2110852843d304006e3ab333081fddda13b07193de8Robert Shih
2120852843d304006e3ab333081fddda13b07193de8Robert Shih    if (generation != currentGeneration) {
2130852843d304006e3ab333081fddda13b07193de8Robert Shih        return;
2140852843d304006e3ab333081fddda13b07193de8Robert Shih    }
2150852843d304006e3ab333081fddda13b07193de8Robert Shih
2160852843d304006e3ab333081fddda13b07193de8Robert Shih    sp<ABuffer> buffer;
2170852843d304006e3ab333081fddda13b07193de8Robert Shih    while (mLiveSession->dequeueAccessUnit(fetchType, &buffer) == OK) {
2180852843d304006e3ab333081fddda13b07193de8Robert Shih
2190852843d304006e3ab333081fddda13b07193de8Robert Shih        sp<AMessage> notify = dupNotify();
2200852843d304006e3ab333081fddda13b07193de8Robert Shih        notify->setInt32("what", pushWhat);
2210852843d304006e3ab333081fddda13b07193de8Robert Shih        notify->setBuffer("buffer", buffer);
2220852843d304006e3ab333081fddda13b07193de8Robert Shih
2230852843d304006e3ab333081fddda13b07193de8Robert Shih        int64_t timeUs, baseUs, delayUs;
2240852843d304006e3ab333081fddda13b07193de8Robert Shih        CHECK(buffer->meta()->findInt64("baseUs", &baseUs));
2250852843d304006e3ab333081fddda13b07193de8Robert Shih        CHECK(buffer->meta()->findInt64("timeUs", &timeUs));
2260852843d304006e3ab333081fddda13b07193de8Robert Shih        delayUs = baseUs + timeUs - ALooper::GetNowUs();
2270852843d304006e3ab333081fddda13b07193de8Robert Shih
2280852843d304006e3ab333081fddda13b07193de8Robert Shih        if (fetchType == LiveSession::STREAMTYPE_SUBTITLES) {
2290852843d304006e3ab333081fddda13b07193de8Robert Shih            notify->post();
2300852843d304006e3ab333081fddda13b07193de8Robert Shih            msg->post(delayUs > 0ll ? delayUs : 0ll);
2310852843d304006e3ab333081fddda13b07193de8Robert Shih            return;
2320852843d304006e3ab333081fddda13b07193de8Robert Shih        } else if (fetchType == LiveSession::STREAMTYPE_METADATA) {
2330852843d304006e3ab333081fddda13b07193de8Robert Shih            if (delayUs < -1000000ll) { // 1 second
2340852843d304006e3ab333081fddda13b07193de8Robert Shih                continue;
2350852843d304006e3ab333081fddda13b07193de8Robert Shih            }
2360852843d304006e3ab333081fddda13b07193de8Robert Shih            notify->post();
2370852843d304006e3ab333081fddda13b07193de8Robert Shih            // push all currently available metadata buffers in each invocation of pollForRawData
2380852843d304006e3ab333081fddda13b07193de8Robert Shih            // continue;
2390852843d304006e3ab333081fddda13b07193de8Robert Shih        } else {
2400852843d304006e3ab333081fddda13b07193de8Robert Shih            TRESPASS();
2410852843d304006e3ab333081fddda13b07193de8Robert Shih        }
2420852843d304006e3ab333081fddda13b07193de8Robert Shih    }
2430852843d304006e3ab333081fddda13b07193de8Robert Shih
2440852843d304006e3ab333081fddda13b07193de8Robert Shih    // try again in 1 second
2450852843d304006e3ab333081fddda13b07193de8Robert Shih    msg->post(1000000ll);
2460852843d304006e3ab333081fddda13b07193de8Robert Shih}
2470852843d304006e3ab333081fddda13b07193de8Robert Shih
2480df36ec3303c2c6bf9b42c07945ac8bd234153f3Andreas Hubervoid NuPlayer::HTTPLiveSource::onMessageReceived(const sp<AMessage> &msg) {
2490df36ec3303c2c6bf9b42c07945ac8bd234153f3Andreas Huber    switch (msg->what()) {
2500df36ec3303c2c6bf9b42c07945ac8bd234153f3Andreas Huber        case kWhatSessionNotify:
2510df36ec3303c2c6bf9b42c07945ac8bd234153f3Andreas Huber        {
2520df36ec3303c2c6bf9b42c07945ac8bd234153f3Andreas Huber            onSessionNotify(msg);
2530df36ec3303c2c6bf9b42c07945ac8bd234153f3Andreas Huber            break;
2540df36ec3303c2c6bf9b42c07945ac8bd234153f3Andreas Huber        }
2550df36ec3303c2c6bf9b42c07945ac8bd234153f3Andreas Huber
256dcb89b3b505522efde173c105a851c412f947178Chong Zhang        case kWhatFetchSubtitleData:
257dcb89b3b505522efde173c105a851c412f947178Chong Zhang        {
2580852843d304006e3ab333081fddda13b07193de8Robert Shih            pollForRawData(
2590852843d304006e3ab333081fddda13b07193de8Robert Shih                    msg, mFetchSubtitleDataGeneration,
2600852843d304006e3ab333081fddda13b07193de8Robert Shih                    /* fetch */ LiveSession::STREAMTYPE_SUBTITLES,
2610852843d304006e3ab333081fddda13b07193de8Robert Shih                    /* push */ kWhatSubtitleData);
2620852843d304006e3ab333081fddda13b07193de8Robert Shih
2630852843d304006e3ab333081fddda13b07193de8Robert Shih            break;
2640852843d304006e3ab333081fddda13b07193de8Robert Shih        }
265dcb89b3b505522efde173c105a851c412f947178Chong Zhang
2660852843d304006e3ab333081fddda13b07193de8Robert Shih        case kWhatFetchMetaData:
2670852843d304006e3ab333081fddda13b07193de8Robert Shih        {
2680852843d304006e3ab333081fddda13b07193de8Robert Shih            if (!mMetadataSelected) {
269dcb89b3b505522efde173c105a851c412f947178Chong Zhang                break;
270dcb89b3b505522efde173c105a851c412f947178Chong Zhang            }
271dcb89b3b505522efde173c105a851c412f947178Chong Zhang
2720852843d304006e3ab333081fddda13b07193de8Robert Shih            pollForRawData(
2730852843d304006e3ab333081fddda13b07193de8Robert Shih                    msg, mFetchMetaDataGeneration,
2740852843d304006e3ab333081fddda13b07193de8Robert Shih                    /* fetch */ LiveSession::STREAMTYPE_METADATA,
2750852843d304006e3ab333081fddda13b07193de8Robert Shih                    /* push */ kWhatTimedMetaData);
276dcb89b3b505522efde173c105a851c412f947178Chong Zhang
277dcb89b3b505522efde173c105a851c412f947178Chong Zhang            break;
278dcb89b3b505522efde173c105a851c412f947178Chong Zhang        }
279dcb89b3b505522efde173c105a851c412f947178Chong Zhang
2800df36ec3303c2c6bf9b42c07945ac8bd234153f3Andreas Huber        default:
2810df36ec3303c2c6bf9b42c07945ac8bd234153f3Andreas Huber            Source::onMessageReceived(msg);
2820df36ec3303c2c6bf9b42c07945ac8bd234153f3Andreas Huber            break;
2830df36ec3303c2c6bf9b42c07945ac8bd234153f3Andreas Huber    }
2840df36ec3303c2c6bf9b42c07945ac8bd234153f3Andreas Huber}
2850df36ec3303c2c6bf9b42c07945ac8bd234153f3Andreas Huber
2860df36ec3303c2c6bf9b42c07945ac8bd234153f3Andreas Hubervoid NuPlayer::HTTPLiveSource::onSessionNotify(const sp<AMessage> &msg) {
2870df36ec3303c2c6bf9b42c07945ac8bd234153f3Andreas Huber    int32_t what;
2880df36ec3303c2c6bf9b42c07945ac8bd234153f3Andreas Huber    CHECK(msg->findInt32("what", &what));
2890df36ec3303c2c6bf9b42c07945ac8bd234153f3Andreas Huber
2900df36ec3303c2c6bf9b42c07945ac8bd234153f3Andreas Huber    switch (what) {
2910df36ec3303c2c6bf9b42c07945ac8bd234153f3Andreas Huber        case LiveSession::kWhatPrepared:
2920df36ec3303c2c6bf9b42c07945ac8bd234153f3Andreas Huber        {
2933e518fd5d679abb83b654e473ea0fa5f7f16235fMarco Nelissen            // notify the current size here if we have it, otherwise report an initial size of (0,0)
2943e518fd5d679abb83b654e473ea0fa5f7f16235fMarco Nelissen            sp<AMessage> format = getFormat(false /* audio */);
2953e518fd5d679abb83b654e473ea0fa5f7f16235fMarco Nelissen            int32_t width;
2963e518fd5d679abb83b654e473ea0fa5f7f16235fMarco Nelissen            int32_t height;
2973e518fd5d679abb83b654e473ea0fa5f7f16235fMarco Nelissen            if (format != NULL &&
2983e518fd5d679abb83b654e473ea0fa5f7f16235fMarco Nelissen                    format->findInt32("width", &width) && format->findInt32("height", &height)) {
299ced1c2f8f6c422063092f5cc5c675ccdebb2dc10Chong Zhang                notifyVideoSizeChanged(format);
3003e518fd5d679abb83b654e473ea0fa5f7f16235fMarco Nelissen            } else {
301ced1c2f8f6c422063092f5cc5c675ccdebb2dc10Chong Zhang                notifyVideoSizeChanged();
3023e518fd5d679abb83b654e473ea0fa5f7f16235fMarco Nelissen            }
3030df36ec3303c2c6bf9b42c07945ac8bd234153f3Andreas Huber
3040df36ec3303c2c6bf9b42c07945ac8bd234153f3Andreas Huber            uint32_t flags = FLAG_CAN_PAUSE;
3050df36ec3303c2c6bf9b42c07945ac8bd234153f3Andreas Huber            if (mLiveSession->isSeekable()) {
3060df36ec3303c2c6bf9b42c07945ac8bd234153f3Andreas Huber                flags |= FLAG_CAN_SEEK;
3070df36ec3303c2c6bf9b42c07945ac8bd234153f3Andreas Huber                flags |= FLAG_CAN_SEEK_BACKWARD;
3080df36ec3303c2c6bf9b42c07945ac8bd234153f3Andreas Huber                flags |= FLAG_CAN_SEEK_FORWARD;
3090df36ec3303c2c6bf9b42c07945ac8bd234153f3Andreas Huber            }
3100df36ec3303c2c6bf9b42c07945ac8bd234153f3Andreas Huber
3110df36ec3303c2c6bf9b42c07945ac8bd234153f3Andreas Huber            if (mLiveSession->hasDynamicDuration()) {
3120df36ec3303c2c6bf9b42c07945ac8bd234153f3Andreas Huber                flags |= FLAG_DYNAMIC_DURATION;
3130df36ec3303c2c6bf9b42c07945ac8bd234153f3Andreas Huber            }
3140df36ec3303c2c6bf9b42c07945ac8bd234153f3Andreas Huber
3150df36ec3303c2c6bf9b42c07945ac8bd234153f3Andreas Huber            notifyFlagsChanged(flags);
3160df36ec3303c2c6bf9b42c07945ac8bd234153f3Andreas Huber
3170df36ec3303c2c6bf9b42c07945ac8bd234153f3Andreas Huber            notifyPrepared();
3180df36ec3303c2c6bf9b42c07945ac8bd234153f3Andreas Huber            break;
3190df36ec3303c2c6bf9b42c07945ac8bd234153f3Andreas Huber        }
3200df36ec3303c2c6bf9b42c07945ac8bd234153f3Andreas Huber
3210df36ec3303c2c6bf9b42c07945ac8bd234153f3Andreas Huber        case LiveSession::kWhatPreparationFailed:
3220df36ec3303c2c6bf9b42c07945ac8bd234153f3Andreas Huber        {
3230df36ec3303c2c6bf9b42c07945ac8bd234153f3Andreas Huber            status_t err;
3240df36ec3303c2c6bf9b42c07945ac8bd234153f3Andreas Huber            CHECK(msg->findInt32("err", &err));
3250df36ec3303c2c6bf9b42c07945ac8bd234153f3Andreas Huber
3260df36ec3303c2c6bf9b42c07945ac8bd234153f3Andreas Huber            notifyPrepared(err);
3270df36ec3303c2c6bf9b42c07945ac8bd234153f3Andreas Huber            break;
3280df36ec3303c2c6bf9b42c07945ac8bd234153f3Andreas Huber        }
3290df36ec3303c2c6bf9b42c07945ac8bd234153f3Andreas Huber
33014f7672b5d450ed26a06fd3bb3ce045ea78b11b2Andreas Huber        case LiveSession::kWhatStreamsChanged:
33114f7672b5d450ed26a06fd3bb3ce045ea78b11b2Andreas Huber        {
33214f7672b5d450ed26a06fd3bb3ce045ea78b11b2Andreas Huber            uint32_t changedMask;
33314f7672b5d450ed26a06fd3bb3ce045ea78b11b2Andreas Huber            CHECK(msg->findInt32(
33414f7672b5d450ed26a06fd3bb3ce045ea78b11b2Andreas Huber                        "changedMask", (int32_t *)&changedMask));
33514f7672b5d450ed26a06fd3bb3ce045ea78b11b2Andreas Huber
33614f7672b5d450ed26a06fd3bb3ce045ea78b11b2Andreas Huber            bool audio = changedMask & LiveSession::STREAMTYPE_AUDIO;
33714f7672b5d450ed26a06fd3bb3ce045ea78b11b2Andreas Huber            bool video = changedMask & LiveSession::STREAMTYPE_VIDEO;
33814f7672b5d450ed26a06fd3bb3ce045ea78b11b2Andreas Huber
33914f7672b5d450ed26a06fd3bb3ce045ea78b11b2Andreas Huber            sp<AMessage> reply;
34014f7672b5d450ed26a06fd3bb3ce045ea78b11b2Andreas Huber            CHECK(msg->findMessage("reply", &reply));
34114f7672b5d450ed26a06fd3bb3ce045ea78b11b2Andreas Huber
34214f7672b5d450ed26a06fd3bb3ce045ea78b11b2Andreas Huber            sp<AMessage> notify = dupNotify();
34314f7672b5d450ed26a06fd3bb3ce045ea78b11b2Andreas Huber            notify->setInt32("what", kWhatQueueDecoderShutdown);
34414f7672b5d450ed26a06fd3bb3ce045ea78b11b2Andreas Huber            notify->setInt32("audio", audio);
34514f7672b5d450ed26a06fd3bb3ce045ea78b11b2Andreas Huber            notify->setInt32("video", video);
34614f7672b5d450ed26a06fd3bb3ce045ea78b11b2Andreas Huber            notify->setMessage("reply", reply);
34714f7672b5d450ed26a06fd3bb3ce045ea78b11b2Andreas Huber            notify->post();
34814f7672b5d450ed26a06fd3bb3ce045ea78b11b2Andreas Huber            break;
34914f7672b5d450ed26a06fd3bb3ce045ea78b11b2Andreas Huber        }
35014f7672b5d450ed26a06fd3bb3ce045ea78b11b2Andreas Huber
3517c8708046117e03c0d38006bdd9685139df3ac6bChong Zhang        case LiveSession::kWhatBufferingStart:
3527c8708046117e03c0d38006bdd9685139df3ac6bChong Zhang        {
3537c8708046117e03c0d38006bdd9685139df3ac6bChong Zhang            sp<AMessage> notify = dupNotify();
3547c8708046117e03c0d38006bdd9685139df3ac6bChong Zhang            notify->setInt32("what", kWhatPauseOnBufferingStart);
3557c8708046117e03c0d38006bdd9685139df3ac6bChong Zhang            notify->post();
3567c8708046117e03c0d38006bdd9685139df3ac6bChong Zhang            break;
3577c8708046117e03c0d38006bdd9685139df3ac6bChong Zhang        }
3587c8708046117e03c0d38006bdd9685139df3ac6bChong Zhang
3597c8708046117e03c0d38006bdd9685139df3ac6bChong Zhang        case LiveSession::kWhatBufferingEnd:
3607c8708046117e03c0d38006bdd9685139df3ac6bChong Zhang        {
3617c8708046117e03c0d38006bdd9685139df3ac6bChong Zhang            sp<AMessage> notify = dupNotify();
3627c8708046117e03c0d38006bdd9685139df3ac6bChong Zhang            notify->setInt32("what", kWhatResumeOnBufferingEnd);
3637c8708046117e03c0d38006bdd9685139df3ac6bChong Zhang            notify->post();
3647c8708046117e03c0d38006bdd9685139df3ac6bChong Zhang            break;
3657c8708046117e03c0d38006bdd9685139df3ac6bChong Zhang        }
3667c8708046117e03c0d38006bdd9685139df3ac6bChong Zhang
3677c8708046117e03c0d38006bdd9685139df3ac6bChong Zhang
3687c8708046117e03c0d38006bdd9685139df3ac6bChong Zhang        case LiveSession::kWhatBufferingUpdate:
3697c8708046117e03c0d38006bdd9685139df3ac6bChong Zhang        {
3707c8708046117e03c0d38006bdd9685139df3ac6bChong Zhang            sp<AMessage> notify = dupNotify();
3717c8708046117e03c0d38006bdd9685139df3ac6bChong Zhang            int32_t percentage;
3727c8708046117e03c0d38006bdd9685139df3ac6bChong Zhang            CHECK(msg->findInt32("percentage", &percentage));
3737c8708046117e03c0d38006bdd9685139df3ac6bChong Zhang            notify->setInt32("what", kWhatBufferingUpdate);
3747c8708046117e03c0d38006bdd9685139df3ac6bChong Zhang            notify->setInt32("percentage", percentage);
3757c8708046117e03c0d38006bdd9685139df3ac6bChong Zhang            notify->post();
3767c8708046117e03c0d38006bdd9685139df3ac6bChong Zhang            break;
3777c8708046117e03c0d38006bdd9685139df3ac6bChong Zhang        }
3787c8708046117e03c0d38006bdd9685139df3ac6bChong Zhang
3790852843d304006e3ab333081fddda13b07193de8Robert Shih        case LiveSession::kWhatMetadataDetected:
3800852843d304006e3ab333081fddda13b07193de8Robert Shih        {
3810852843d304006e3ab333081fddda13b07193de8Robert Shih            if (!mHasMetadata) {
3820852843d304006e3ab333081fddda13b07193de8Robert Shih                mHasMetadata = true;
3830852843d304006e3ab333081fddda13b07193de8Robert Shih
3840852843d304006e3ab333081fddda13b07193de8Robert Shih                sp<AMessage> notify = dupNotify();
3850852843d304006e3ab333081fddda13b07193de8Robert Shih                // notification without buffer triggers MEDIA_INFO_METADATA_UPDATE
3860852843d304006e3ab333081fddda13b07193de8Robert Shih                notify->setInt32("what", kWhatTimedMetaData);
3870852843d304006e3ab333081fddda13b07193de8Robert Shih                notify->post();
3880852843d304006e3ab333081fddda13b07193de8Robert Shih            }
3890852843d304006e3ab333081fddda13b07193de8Robert Shih            break;
3900852843d304006e3ab333081fddda13b07193de8Robert Shih        }
3910852843d304006e3ab333081fddda13b07193de8Robert Shih
39214f7672b5d450ed26a06fd3bb3ce045ea78b11b2Andreas Huber        case LiveSession::kWhatError:
39314f7672b5d450ed26a06fd3bb3ce045ea78b11b2Andreas Huber        {
39414f7672b5d450ed26a06fd3bb3ce045ea78b11b2Andreas Huber            break;
39514f7672b5d450ed26a06fd3bb3ce045ea78b11b2Andreas Huber        }
39614f7672b5d450ed26a06fd3bb3ce045ea78b11b2Andreas Huber
3970df36ec3303c2c6bf9b42c07945ac8bd234153f3Andreas Huber        default:
3980df36ec3303c2c6bf9b42c07945ac8bd234153f3Andreas Huber            TRESPASS();
3990df36ec3303c2c6bf9b42c07945ac8bd234153f3Andreas Huber    }
4000df36ec3303c2c6bf9b42c07945ac8bd234153f3Andreas Huber}
4010df36ec3303c2c6bf9b42c07945ac8bd234153f3Andreas Huber
4025bc087c573c70c84c6a39946457590b42d392a33Andreas Huber}  // namespace android
4035bc087c573c70c84c6a39946457590b42d392a33Andreas Huber
404