HTTPLiveSource.cpp revision 7350b057ca864f5dc9e53d48e34710a8e81133f8
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) {
1047350b057ca864f5dc9e53d48e34710a8e81133f8Robert Shih    sp<AMessage> format;
1057350b057ca864f5dc9e53d48e34710a8e81133f8Robert Shih    status_t err = -EWOULDBLOCK;
1067350b057ca864f5dc9e53d48e34710a8e81133f8Robert Shih    if (mLiveSession != NULL) {
1077350b057ca864f5dc9e53d48e34710a8e81133f8Robert Shih        err = mLiveSession->getStreamFormat(
1087350b057ca864f5dc9e53d48e34710a8e81133f8Robert Shih                audio ? LiveSession::STREAMTYPE_AUDIO
1097350b057ca864f5dc9e53d48e34710a8e81133f8Robert Shih                      : LiveSession::STREAMTYPE_VIDEO,
1107350b057ca864f5dc9e53d48e34710a8e81133f8Robert Shih                &format);
1111098d87e56f726184ae9c8fe903ea4743669f35bRobert Shih    }
1121098d87e56f726184ae9c8fe903ea4743669f35bRobert Shih
1137350b057ca864f5dc9e53d48e34710a8e81133f8Robert Shih    if (err == -EWOULDBLOCK) {
1147350b057ca864f5dc9e53d48e34710a8e81133f8Robert Shih        format = new AMessage();
1157350b057ca864f5dc9e53d48e34710a8e81133f8Robert Shih        format->setInt32("err", err);
1167350b057ca864f5dc9e53d48e34710a8e81133f8Robert Shih        return format;
1177350b057ca864f5dc9e53d48e34710a8e81133f8Robert Shih    }
1185bc087c573c70c84c6a39946457590b42d392a33Andreas Huber
11914f7672b5d450ed26a06fd3bb3ce045ea78b11b2Andreas Huber    if (err != OK) {
1205bc087c573c70c84c6a39946457590b42d392a33Andreas Huber        return NULL;
1215bc087c573c70c84c6a39946457590b42d392a33Andreas Huber    }
1225bc087c573c70c84c6a39946457590b42d392a33Andreas Huber
12314f7672b5d450ed26a06fd3bb3ce045ea78b11b2Andreas Huber    return format;
1245bc087c573c70c84c6a39946457590b42d392a33Andreas Huber}
1255bc087c573c70c84c6a39946457590b42d392a33Andreas Huber
126eac68baf095aeef54865c28b6888924dc6295cbdAndreas Huberstatus_t NuPlayer::HTTPLiveSource::feedMoreTSData() {
127eac68baf095aeef54865c28b6888924dc6295cbdAndreas Huber    return OK;
1285bc087c573c70c84c6a39946457590b42d392a33Andreas Huber}
1295bc087c573c70c84c6a39946457590b42d392a33Andreas Huber
1305bc087c573c70c84c6a39946457590b42d392a33Andreas Huberstatus_t NuPlayer::HTTPLiveSource::dequeueAccessUnit(
1315bc087c573c70c84c6a39946457590b42d392a33Andreas Huber        bool audio, sp<ABuffer> *accessUnit) {
13214f7672b5d450ed26a06fd3bb3ce045ea78b11b2Andreas Huber    return mLiveSession->dequeueAccessUnit(
13314f7672b5d450ed26a06fd3bb3ce045ea78b11b2Andreas Huber            audio ? LiveSession::STREAMTYPE_AUDIO
13414f7672b5d450ed26a06fd3bb3ce045ea78b11b2Andreas Huber                  : LiveSession::STREAMTYPE_VIDEO,
13514f7672b5d450ed26a06fd3bb3ce045ea78b11b2Andreas Huber            accessUnit);
1365bc087c573c70c84c6a39946457590b42d392a33Andreas Huber}
1375bc087c573c70c84c6a39946457590b42d392a33Andreas Huber
13843c3e6ce02215ca99d506458f596cb1211639f29Andreas Huberstatus_t NuPlayer::HTTPLiveSource::getDuration(int64_t *durationUs) {
13943c3e6ce02215ca99d506458f596cb1211639f29Andreas Huber    return mLiveSession->getDuration(durationUs);
14043c3e6ce02215ca99d506458f596cb1211639f29Andreas Huber}
14143c3e6ce02215ca99d506458f596cb1211639f29Andreas Huber
142404fced9bfa8fa423ee210a271ca051ffd1bec13Chong Zhangsize_t NuPlayer::HTTPLiveSource::getTrackCount() const {
143404fced9bfa8fa423ee210a271ca051ffd1bec13Chong Zhang    return mLiveSession->getTrackCount();
144404fced9bfa8fa423ee210a271ca051ffd1bec13Chong Zhang}
145404fced9bfa8fa423ee210a271ca051ffd1bec13Chong Zhang
146404fced9bfa8fa423ee210a271ca051ffd1bec13Chong Zhangsp<AMessage> NuPlayer::HTTPLiveSource::getTrackInfo(size_t trackIndex) const {
147404fced9bfa8fa423ee210a271ca051ffd1bec13Chong Zhang    return mLiveSession->getTrackInfo(trackIndex);
148dcb89b3b505522efde173c105a851c412f947178Chong Zhang}
149dcb89b3b505522efde173c105a851c412f947178Chong Zhang
15089bf2525c5b57f17260de5b00c5f3f78ac4b881eRobert Shihssize_t NuPlayer::HTTPLiveSource::getSelectedTrack(media_track_type type) const {
15189bf2525c5b57f17260de5b00c5f3f78ac4b881eRobert Shih    if (mLiveSession == NULL) {
15289bf2525c5b57f17260de5b00c5f3f78ac4b881eRobert Shih        return -1;
1530852843d304006e3ab333081fddda13b07193de8Robert Shih    } else if (type == MEDIA_TRACK_TYPE_METADATA) {
1540852843d304006e3ab333081fddda13b07193de8Robert Shih        // MEDIA_TRACK_TYPE_METADATA is always last track
1550852843d304006e3ab333081fddda13b07193de8Robert Shih        // mMetadataSelected can only be true when mHasMetadata is true
1560852843d304006e3ab333081fddda13b07193de8Robert Shih        return mMetadataSelected ? (mLiveSession->getTrackCount() - 1) : -1;
15789bf2525c5b57f17260de5b00c5f3f78ac4b881eRobert Shih    } else {
15889bf2525c5b57f17260de5b00c5f3f78ac4b881eRobert Shih        return mLiveSession->getSelectedTrack(type);
15989bf2525c5b57f17260de5b00c5f3f78ac4b881eRobert Shih    }
16089bf2525c5b57f17260de5b00c5f3f78ac4b881eRobert Shih}
16189bf2525c5b57f17260de5b00c5f3f78ac4b881eRobert Shih
1626ffb1fd67eb8f00f130a6db914ba42a8432aec70Robert Shihstatus_t NuPlayer::HTTPLiveSource::selectTrack(size_t trackIndex, bool select, int64_t /*timeUs*/) {
1630852843d304006e3ab333081fddda13b07193de8Robert Shih    if (mLiveSession == NULL) {
1640852843d304006e3ab333081fddda13b07193de8Robert Shih        return INVALID_OPERATION;
1650852843d304006e3ab333081fddda13b07193de8Robert Shih    }
1660852843d304006e3ab333081fddda13b07193de8Robert Shih
1670852843d304006e3ab333081fddda13b07193de8Robert Shih    status_t err = INVALID_OPERATION;
1680852843d304006e3ab333081fddda13b07193de8Robert Shih    bool postFetchMsg = false, isSub = false;
169055404ea1309d4cbc5d313332b026f86bd6f0da1Robert Shih    if (!mHasMetadata || trackIndex != mLiveSession->getTrackCount() - 1) {
1700852843d304006e3ab333081fddda13b07193de8Robert Shih        err = mLiveSession->selectTrack(trackIndex, select);
1710852843d304006e3ab333081fddda13b07193de8Robert Shih        postFetchMsg = select;
1720852843d304006e3ab333081fddda13b07193de8Robert Shih        isSub = true;
1730852843d304006e3ab333081fddda13b07193de8Robert Shih    } else {
174055404ea1309d4cbc5d313332b026f86bd6f0da1Robert Shih        // metadata track; i.e. (mHasMetadata && trackIndex == mLiveSession->getTrackCount() - 1)
175055404ea1309d4cbc5d313332b026f86bd6f0da1Robert Shih        if (mMetadataSelected && !select) {
176055404ea1309d4cbc5d313332b026f86bd6f0da1Robert Shih            err = OK;
177055404ea1309d4cbc5d313332b026f86bd6f0da1Robert Shih        } else if (!mMetadataSelected && select) {
178055404ea1309d4cbc5d313332b026f86bd6f0da1Robert Shih            postFetchMsg = true;
179055404ea1309d4cbc5d313332b026f86bd6f0da1Robert Shih            err = OK;
180055404ea1309d4cbc5d313332b026f86bd6f0da1Robert Shih        } else {
181055404ea1309d4cbc5d313332b026f86bd6f0da1Robert Shih            err = BAD_VALUE; // behave as LiveSession::selectTrack
1820852843d304006e3ab333081fddda13b07193de8Robert Shih        }
183055404ea1309d4cbc5d313332b026f86bd6f0da1Robert Shih
184055404ea1309d4cbc5d313332b026f86bd6f0da1Robert Shih        mMetadataSelected = select;
1850852843d304006e3ab333081fddda13b07193de8Robert Shih    }
186dcb89b3b505522efde173c105a851c412f947178Chong Zhang
187dcb89b3b505522efde173c105a851c412f947178Chong Zhang    if (err == OK) {
1880852843d304006e3ab333081fddda13b07193de8Robert Shih        int32_t &generation = isSub ? mFetchSubtitleDataGeneration : mFetchMetaDataGeneration;
1890852843d304006e3ab333081fddda13b07193de8Robert Shih        generation++;
1900852843d304006e3ab333081fddda13b07193de8Robert Shih        if (postFetchMsg) {
1910852843d304006e3ab333081fddda13b07193de8Robert Shih            int32_t what = isSub ? kWhatFetchSubtitleData : kWhatFetchMetaData;
1920852843d304006e3ab333081fddda13b07193de8Robert Shih            sp<AMessage> msg = new AMessage(what, this);
1930852843d304006e3ab333081fddda13b07193de8Robert Shih            msg->setInt32("generation", generation);
194dcb89b3b505522efde173c105a851c412f947178Chong Zhang            msg->post();
195dcb89b3b505522efde173c105a851c412f947178Chong Zhang        }
196dcb89b3b505522efde173c105a851c412f947178Chong Zhang    }
197dcb89b3b505522efde173c105a851c412f947178Chong Zhang
198dcb89b3b505522efde173c105a851c412f947178Chong Zhang    // LiveSession::selectTrack returns BAD_VALUE when selecting the currently
199dcb89b3b505522efde173c105a851c412f947178Chong Zhang    // selected track, or unselecting a non-selected track. In this case it's an
200dcb89b3b505522efde173c105a851c412f947178Chong Zhang    // no-op so we return OK.
20184333e0475bc911adc16417f4ca327c975cf6c36Andreas Huber    return (err == OK || err == BAD_VALUE) ? (status_t)OK : err;
202dcb89b3b505522efde173c105a851c412f947178Chong Zhang}
203dcb89b3b505522efde173c105a851c412f947178Chong Zhang
20443c3e6ce02215ca99d506458f596cb1211639f29Andreas Huberstatus_t NuPlayer::HTTPLiveSource::seekTo(int64_t seekTimeUs) {
20514f7672b5d450ed26a06fd3bb3ce045ea78b11b2Andreas Huber    return mLiveSession->seekTo(seekTimeUs);
20643c3e6ce02215ca99d506458f596cb1211639f29Andreas Huber}
20743c3e6ce02215ca99d506458f596cb1211639f29Andreas Huber
2080852843d304006e3ab333081fddda13b07193de8Robert Shihvoid NuPlayer::HTTPLiveSource::pollForRawData(
2090852843d304006e3ab333081fddda13b07193de8Robert Shih        const sp<AMessage> &msg, int32_t currentGeneration,
2100852843d304006e3ab333081fddda13b07193de8Robert Shih        LiveSession::StreamType fetchType, int32_t pushWhat) {
2110852843d304006e3ab333081fddda13b07193de8Robert Shih
2120852843d304006e3ab333081fddda13b07193de8Robert Shih    int32_t generation;
2130852843d304006e3ab333081fddda13b07193de8Robert Shih    CHECK(msg->findInt32("generation", &generation));
2140852843d304006e3ab333081fddda13b07193de8Robert Shih
2150852843d304006e3ab333081fddda13b07193de8Robert Shih    if (generation != currentGeneration) {
2160852843d304006e3ab333081fddda13b07193de8Robert Shih        return;
2170852843d304006e3ab333081fddda13b07193de8Robert Shih    }
2180852843d304006e3ab333081fddda13b07193de8Robert Shih
2190852843d304006e3ab333081fddda13b07193de8Robert Shih    sp<ABuffer> buffer;
2200852843d304006e3ab333081fddda13b07193de8Robert Shih    while (mLiveSession->dequeueAccessUnit(fetchType, &buffer) == OK) {
2210852843d304006e3ab333081fddda13b07193de8Robert Shih
2220852843d304006e3ab333081fddda13b07193de8Robert Shih        sp<AMessage> notify = dupNotify();
2230852843d304006e3ab333081fddda13b07193de8Robert Shih        notify->setInt32("what", pushWhat);
2240852843d304006e3ab333081fddda13b07193de8Robert Shih        notify->setBuffer("buffer", buffer);
2250852843d304006e3ab333081fddda13b07193de8Robert Shih
2260852843d304006e3ab333081fddda13b07193de8Robert Shih        int64_t timeUs, baseUs, delayUs;
2270852843d304006e3ab333081fddda13b07193de8Robert Shih        CHECK(buffer->meta()->findInt64("baseUs", &baseUs));
2280852843d304006e3ab333081fddda13b07193de8Robert Shih        CHECK(buffer->meta()->findInt64("timeUs", &timeUs));
2290852843d304006e3ab333081fddda13b07193de8Robert Shih        delayUs = baseUs + timeUs - ALooper::GetNowUs();
2300852843d304006e3ab333081fddda13b07193de8Robert Shih
2310852843d304006e3ab333081fddda13b07193de8Robert Shih        if (fetchType == LiveSession::STREAMTYPE_SUBTITLES) {
2320852843d304006e3ab333081fddda13b07193de8Robert Shih            notify->post();
2330852843d304006e3ab333081fddda13b07193de8Robert Shih            msg->post(delayUs > 0ll ? delayUs : 0ll);
2340852843d304006e3ab333081fddda13b07193de8Robert Shih            return;
2350852843d304006e3ab333081fddda13b07193de8Robert Shih        } else if (fetchType == LiveSession::STREAMTYPE_METADATA) {
2360852843d304006e3ab333081fddda13b07193de8Robert Shih            if (delayUs < -1000000ll) { // 1 second
2370852843d304006e3ab333081fddda13b07193de8Robert Shih                continue;
2380852843d304006e3ab333081fddda13b07193de8Robert Shih            }
2390852843d304006e3ab333081fddda13b07193de8Robert Shih            notify->post();
2400852843d304006e3ab333081fddda13b07193de8Robert Shih            // push all currently available metadata buffers in each invocation of pollForRawData
2410852843d304006e3ab333081fddda13b07193de8Robert Shih            // continue;
2420852843d304006e3ab333081fddda13b07193de8Robert Shih        } else {
2430852843d304006e3ab333081fddda13b07193de8Robert Shih            TRESPASS();
2440852843d304006e3ab333081fddda13b07193de8Robert Shih        }
2450852843d304006e3ab333081fddda13b07193de8Robert Shih    }
2460852843d304006e3ab333081fddda13b07193de8Robert Shih
2470852843d304006e3ab333081fddda13b07193de8Robert Shih    // try again in 1 second
2480852843d304006e3ab333081fddda13b07193de8Robert Shih    msg->post(1000000ll);
2490852843d304006e3ab333081fddda13b07193de8Robert Shih}
2500852843d304006e3ab333081fddda13b07193de8Robert Shih
2510df36ec3303c2c6bf9b42c07945ac8bd234153f3Andreas Hubervoid NuPlayer::HTTPLiveSource::onMessageReceived(const sp<AMessage> &msg) {
2520df36ec3303c2c6bf9b42c07945ac8bd234153f3Andreas Huber    switch (msg->what()) {
2530df36ec3303c2c6bf9b42c07945ac8bd234153f3Andreas Huber        case kWhatSessionNotify:
2540df36ec3303c2c6bf9b42c07945ac8bd234153f3Andreas Huber        {
2550df36ec3303c2c6bf9b42c07945ac8bd234153f3Andreas Huber            onSessionNotify(msg);
2560df36ec3303c2c6bf9b42c07945ac8bd234153f3Andreas Huber            break;
2570df36ec3303c2c6bf9b42c07945ac8bd234153f3Andreas Huber        }
2580df36ec3303c2c6bf9b42c07945ac8bd234153f3Andreas Huber
259dcb89b3b505522efde173c105a851c412f947178Chong Zhang        case kWhatFetchSubtitleData:
260dcb89b3b505522efde173c105a851c412f947178Chong Zhang        {
2610852843d304006e3ab333081fddda13b07193de8Robert Shih            pollForRawData(
2620852843d304006e3ab333081fddda13b07193de8Robert Shih                    msg, mFetchSubtitleDataGeneration,
2630852843d304006e3ab333081fddda13b07193de8Robert Shih                    /* fetch */ LiveSession::STREAMTYPE_SUBTITLES,
2640852843d304006e3ab333081fddda13b07193de8Robert Shih                    /* push */ kWhatSubtitleData);
2650852843d304006e3ab333081fddda13b07193de8Robert Shih
2660852843d304006e3ab333081fddda13b07193de8Robert Shih            break;
2670852843d304006e3ab333081fddda13b07193de8Robert Shih        }
268dcb89b3b505522efde173c105a851c412f947178Chong Zhang
2690852843d304006e3ab333081fddda13b07193de8Robert Shih        case kWhatFetchMetaData:
2700852843d304006e3ab333081fddda13b07193de8Robert Shih        {
2710852843d304006e3ab333081fddda13b07193de8Robert Shih            if (!mMetadataSelected) {
272dcb89b3b505522efde173c105a851c412f947178Chong Zhang                break;
273dcb89b3b505522efde173c105a851c412f947178Chong Zhang            }
274dcb89b3b505522efde173c105a851c412f947178Chong Zhang
2750852843d304006e3ab333081fddda13b07193de8Robert Shih            pollForRawData(
2760852843d304006e3ab333081fddda13b07193de8Robert Shih                    msg, mFetchMetaDataGeneration,
2770852843d304006e3ab333081fddda13b07193de8Robert Shih                    /* fetch */ LiveSession::STREAMTYPE_METADATA,
2780852843d304006e3ab333081fddda13b07193de8Robert Shih                    /* push */ kWhatTimedMetaData);
279dcb89b3b505522efde173c105a851c412f947178Chong Zhang
280dcb89b3b505522efde173c105a851c412f947178Chong Zhang            break;
281dcb89b3b505522efde173c105a851c412f947178Chong Zhang        }
282dcb89b3b505522efde173c105a851c412f947178Chong Zhang
2830df36ec3303c2c6bf9b42c07945ac8bd234153f3Andreas Huber        default:
2840df36ec3303c2c6bf9b42c07945ac8bd234153f3Andreas Huber            Source::onMessageReceived(msg);
2850df36ec3303c2c6bf9b42c07945ac8bd234153f3Andreas Huber            break;
2860df36ec3303c2c6bf9b42c07945ac8bd234153f3Andreas Huber    }
2870df36ec3303c2c6bf9b42c07945ac8bd234153f3Andreas Huber}
2880df36ec3303c2c6bf9b42c07945ac8bd234153f3Andreas Huber
2890df36ec3303c2c6bf9b42c07945ac8bd234153f3Andreas Hubervoid NuPlayer::HTTPLiveSource::onSessionNotify(const sp<AMessage> &msg) {
2900df36ec3303c2c6bf9b42c07945ac8bd234153f3Andreas Huber    int32_t what;
2910df36ec3303c2c6bf9b42c07945ac8bd234153f3Andreas Huber    CHECK(msg->findInt32("what", &what));
2920df36ec3303c2c6bf9b42c07945ac8bd234153f3Andreas Huber
2930df36ec3303c2c6bf9b42c07945ac8bd234153f3Andreas Huber    switch (what) {
2940df36ec3303c2c6bf9b42c07945ac8bd234153f3Andreas Huber        case LiveSession::kWhatPrepared:
2950df36ec3303c2c6bf9b42c07945ac8bd234153f3Andreas Huber        {
2963e518fd5d679abb83b654e473ea0fa5f7f16235fMarco Nelissen            // notify the current size here if we have it, otherwise report an initial size of (0,0)
2973e518fd5d679abb83b654e473ea0fa5f7f16235fMarco Nelissen            sp<AMessage> format = getFormat(false /* audio */);
2983e518fd5d679abb83b654e473ea0fa5f7f16235fMarco Nelissen            int32_t width;
2993e518fd5d679abb83b654e473ea0fa5f7f16235fMarco Nelissen            int32_t height;
3003e518fd5d679abb83b654e473ea0fa5f7f16235fMarco Nelissen            if (format != NULL &&
3013e518fd5d679abb83b654e473ea0fa5f7f16235fMarco Nelissen                    format->findInt32("width", &width) && format->findInt32("height", &height)) {
302ced1c2f8f6c422063092f5cc5c675ccdebb2dc10Chong Zhang                notifyVideoSizeChanged(format);
3033e518fd5d679abb83b654e473ea0fa5f7f16235fMarco Nelissen            } else {
304ced1c2f8f6c422063092f5cc5c675ccdebb2dc10Chong Zhang                notifyVideoSizeChanged();
3053e518fd5d679abb83b654e473ea0fa5f7f16235fMarco Nelissen            }
3060df36ec3303c2c6bf9b42c07945ac8bd234153f3Andreas Huber
3070df36ec3303c2c6bf9b42c07945ac8bd234153f3Andreas Huber            uint32_t flags = FLAG_CAN_PAUSE;
3080df36ec3303c2c6bf9b42c07945ac8bd234153f3Andreas Huber            if (mLiveSession->isSeekable()) {
3090df36ec3303c2c6bf9b42c07945ac8bd234153f3Andreas Huber                flags |= FLAG_CAN_SEEK;
3100df36ec3303c2c6bf9b42c07945ac8bd234153f3Andreas Huber                flags |= FLAG_CAN_SEEK_BACKWARD;
3110df36ec3303c2c6bf9b42c07945ac8bd234153f3Andreas Huber                flags |= FLAG_CAN_SEEK_FORWARD;
3120df36ec3303c2c6bf9b42c07945ac8bd234153f3Andreas Huber            }
3130df36ec3303c2c6bf9b42c07945ac8bd234153f3Andreas Huber
3140df36ec3303c2c6bf9b42c07945ac8bd234153f3Andreas Huber            if (mLiveSession->hasDynamicDuration()) {
3150df36ec3303c2c6bf9b42c07945ac8bd234153f3Andreas Huber                flags |= FLAG_DYNAMIC_DURATION;
3160df36ec3303c2c6bf9b42c07945ac8bd234153f3Andreas Huber            }
3170df36ec3303c2c6bf9b42c07945ac8bd234153f3Andreas Huber
3180df36ec3303c2c6bf9b42c07945ac8bd234153f3Andreas Huber            notifyFlagsChanged(flags);
3190df36ec3303c2c6bf9b42c07945ac8bd234153f3Andreas Huber
3200df36ec3303c2c6bf9b42c07945ac8bd234153f3Andreas Huber            notifyPrepared();
3210df36ec3303c2c6bf9b42c07945ac8bd234153f3Andreas Huber            break;
3220df36ec3303c2c6bf9b42c07945ac8bd234153f3Andreas Huber        }
3230df36ec3303c2c6bf9b42c07945ac8bd234153f3Andreas Huber
3240df36ec3303c2c6bf9b42c07945ac8bd234153f3Andreas Huber        case LiveSession::kWhatPreparationFailed:
3250df36ec3303c2c6bf9b42c07945ac8bd234153f3Andreas Huber        {
3260df36ec3303c2c6bf9b42c07945ac8bd234153f3Andreas Huber            status_t err;
3270df36ec3303c2c6bf9b42c07945ac8bd234153f3Andreas Huber            CHECK(msg->findInt32("err", &err));
3280df36ec3303c2c6bf9b42c07945ac8bd234153f3Andreas Huber
3290df36ec3303c2c6bf9b42c07945ac8bd234153f3Andreas Huber            notifyPrepared(err);
3300df36ec3303c2c6bf9b42c07945ac8bd234153f3Andreas Huber            break;
3310df36ec3303c2c6bf9b42c07945ac8bd234153f3Andreas Huber        }
3320df36ec3303c2c6bf9b42c07945ac8bd234153f3Andreas Huber
33314f7672b5d450ed26a06fd3bb3ce045ea78b11b2Andreas Huber        case LiveSession::kWhatStreamsChanged:
33414f7672b5d450ed26a06fd3bb3ce045ea78b11b2Andreas Huber        {
33514f7672b5d450ed26a06fd3bb3ce045ea78b11b2Andreas Huber            uint32_t changedMask;
33614f7672b5d450ed26a06fd3bb3ce045ea78b11b2Andreas Huber            CHECK(msg->findInt32(
33714f7672b5d450ed26a06fd3bb3ce045ea78b11b2Andreas Huber                        "changedMask", (int32_t *)&changedMask));
33814f7672b5d450ed26a06fd3bb3ce045ea78b11b2Andreas Huber
33914f7672b5d450ed26a06fd3bb3ce045ea78b11b2Andreas Huber            bool audio = changedMask & LiveSession::STREAMTYPE_AUDIO;
34014f7672b5d450ed26a06fd3bb3ce045ea78b11b2Andreas Huber            bool video = changedMask & LiveSession::STREAMTYPE_VIDEO;
34114f7672b5d450ed26a06fd3bb3ce045ea78b11b2Andreas Huber
34214f7672b5d450ed26a06fd3bb3ce045ea78b11b2Andreas Huber            sp<AMessage> reply;
34314f7672b5d450ed26a06fd3bb3ce045ea78b11b2Andreas Huber            CHECK(msg->findMessage("reply", &reply));
34414f7672b5d450ed26a06fd3bb3ce045ea78b11b2Andreas Huber
34514f7672b5d450ed26a06fd3bb3ce045ea78b11b2Andreas Huber            sp<AMessage> notify = dupNotify();
34614f7672b5d450ed26a06fd3bb3ce045ea78b11b2Andreas Huber            notify->setInt32("what", kWhatQueueDecoderShutdown);
34714f7672b5d450ed26a06fd3bb3ce045ea78b11b2Andreas Huber            notify->setInt32("audio", audio);
34814f7672b5d450ed26a06fd3bb3ce045ea78b11b2Andreas Huber            notify->setInt32("video", video);
34914f7672b5d450ed26a06fd3bb3ce045ea78b11b2Andreas Huber            notify->setMessage("reply", reply);
35014f7672b5d450ed26a06fd3bb3ce045ea78b11b2Andreas Huber            notify->post();
35114f7672b5d450ed26a06fd3bb3ce045ea78b11b2Andreas Huber            break;
35214f7672b5d450ed26a06fd3bb3ce045ea78b11b2Andreas Huber        }
35314f7672b5d450ed26a06fd3bb3ce045ea78b11b2Andreas Huber
3547c8708046117e03c0d38006bdd9685139df3ac6bChong Zhang        case LiveSession::kWhatBufferingStart:
3557c8708046117e03c0d38006bdd9685139df3ac6bChong Zhang        {
3567c8708046117e03c0d38006bdd9685139df3ac6bChong Zhang            sp<AMessage> notify = dupNotify();
3577c8708046117e03c0d38006bdd9685139df3ac6bChong Zhang            notify->setInt32("what", kWhatPauseOnBufferingStart);
3587c8708046117e03c0d38006bdd9685139df3ac6bChong Zhang            notify->post();
3597c8708046117e03c0d38006bdd9685139df3ac6bChong Zhang            break;
3607c8708046117e03c0d38006bdd9685139df3ac6bChong Zhang        }
3617c8708046117e03c0d38006bdd9685139df3ac6bChong Zhang
3627c8708046117e03c0d38006bdd9685139df3ac6bChong Zhang        case LiveSession::kWhatBufferingEnd:
3637c8708046117e03c0d38006bdd9685139df3ac6bChong Zhang        {
3647c8708046117e03c0d38006bdd9685139df3ac6bChong Zhang            sp<AMessage> notify = dupNotify();
3657c8708046117e03c0d38006bdd9685139df3ac6bChong Zhang            notify->setInt32("what", kWhatResumeOnBufferingEnd);
3667c8708046117e03c0d38006bdd9685139df3ac6bChong Zhang            notify->post();
3677c8708046117e03c0d38006bdd9685139df3ac6bChong Zhang            break;
3687c8708046117e03c0d38006bdd9685139df3ac6bChong Zhang        }
3697c8708046117e03c0d38006bdd9685139df3ac6bChong Zhang
3707c8708046117e03c0d38006bdd9685139df3ac6bChong Zhang
3717c8708046117e03c0d38006bdd9685139df3ac6bChong Zhang        case LiveSession::kWhatBufferingUpdate:
3727c8708046117e03c0d38006bdd9685139df3ac6bChong Zhang        {
3737c8708046117e03c0d38006bdd9685139df3ac6bChong Zhang            sp<AMessage> notify = dupNotify();
3747c8708046117e03c0d38006bdd9685139df3ac6bChong Zhang            int32_t percentage;
3757c8708046117e03c0d38006bdd9685139df3ac6bChong Zhang            CHECK(msg->findInt32("percentage", &percentage));
3767c8708046117e03c0d38006bdd9685139df3ac6bChong Zhang            notify->setInt32("what", kWhatBufferingUpdate);
3777c8708046117e03c0d38006bdd9685139df3ac6bChong Zhang            notify->setInt32("percentage", percentage);
3787c8708046117e03c0d38006bdd9685139df3ac6bChong Zhang            notify->post();
3797c8708046117e03c0d38006bdd9685139df3ac6bChong Zhang            break;
3807c8708046117e03c0d38006bdd9685139df3ac6bChong Zhang        }
3817c8708046117e03c0d38006bdd9685139df3ac6bChong Zhang
3820852843d304006e3ab333081fddda13b07193de8Robert Shih        case LiveSession::kWhatMetadataDetected:
3830852843d304006e3ab333081fddda13b07193de8Robert Shih        {
3840852843d304006e3ab333081fddda13b07193de8Robert Shih            if (!mHasMetadata) {
3850852843d304006e3ab333081fddda13b07193de8Robert Shih                mHasMetadata = true;
3860852843d304006e3ab333081fddda13b07193de8Robert Shih
3870852843d304006e3ab333081fddda13b07193de8Robert Shih                sp<AMessage> notify = dupNotify();
3880852843d304006e3ab333081fddda13b07193de8Robert Shih                // notification without buffer triggers MEDIA_INFO_METADATA_UPDATE
3890852843d304006e3ab333081fddda13b07193de8Robert Shih                notify->setInt32("what", kWhatTimedMetaData);
3900852843d304006e3ab333081fddda13b07193de8Robert Shih                notify->post();
3910852843d304006e3ab333081fddda13b07193de8Robert Shih            }
3920852843d304006e3ab333081fddda13b07193de8Robert Shih            break;
3930852843d304006e3ab333081fddda13b07193de8Robert Shih        }
3940852843d304006e3ab333081fddda13b07193de8Robert Shih
39514f7672b5d450ed26a06fd3bb3ce045ea78b11b2Andreas Huber        case LiveSession::kWhatError:
39614f7672b5d450ed26a06fd3bb3ce045ea78b11b2Andreas Huber        {
39714f7672b5d450ed26a06fd3bb3ce045ea78b11b2Andreas Huber            break;
39814f7672b5d450ed26a06fd3bb3ce045ea78b11b2Andreas Huber        }
39914f7672b5d450ed26a06fd3bb3ce045ea78b11b2Andreas Huber
4000df36ec3303c2c6bf9b42c07945ac8bd234153f3Andreas Huber        default:
4010df36ec3303c2c6bf9b42c07945ac8bd234153f3Andreas Huber            TRESPASS();
4020df36ec3303c2c6bf9b42c07945ac8bd234153f3Andreas Huber    }
4030df36ec3303c2c6bf9b42c07945ac8bd234153f3Andreas Huber}
4040df36ec3303c2c6bf9b42c07945ac8bd234153f3Andreas Huber
4055bc087c573c70c84c6a39946457590b42d392a33Andreas Huber}  // namespace android
4065bc087c573c70c84c6a39946457590b42d392a33Andreas Huber
407