HTTPLiveSource.cpp revision 48fa06d1e80a872c7495804979256e021e566ae0
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>
33a83eebb78c3a7d57a769dac965b17a8aad7c7b8fRobert Shih#include <media/stagefright/Utils.h>
345bc087c573c70c84c6a39946457590b42d392a33Andreas Huber
3548fa06d1e80a872c7495804979256e021e566ae0Wei Jia// default buffer prepare/ready/underflow marks
3648fa06d1e80a872c7495804979256e021e566ae0Wei Jiastatic const int kReadyMarkMs     = 5000;  // 5 seconds
3748fa06d1e80a872c7495804979256e021e566ae0Wei Jiastatic const int kPrepareMarkMs   = 1500;  // 1.5 seconds
3848fa06d1e80a872c7495804979256e021e566ae0Wei Jiastatic const int kUnderflowMarkMs = 1000;  // 1 second
3948fa06d1e80a872c7495804979256e021e566ae0Wei Jia
405bc087c573c70c84c6a39946457590b42d392a33Andreas Hubernamespace android {
415bc087c573c70c84c6a39946457590b42d392a33Andreas Huber
42ad0d9c9c39a24b7fbd94e935a5855c9025341929Andreas HuberNuPlayer::HTTPLiveSource::HTTPLiveSource(
43b5f25f005bc1d3ae35f45b58c88345e183dc336dAndreas Huber        const sp<AMessage> &notify,
441b86fe063badb5f28c467ade39be0f4008688947Andreas Huber        const sp<IMediaHTTPService> &httpService,
45ad0d9c9c39a24b7fbd94e935a5855c9025341929Andreas Huber        const char *url,
4681e68448f3361eaf8618930471fdc3c21bdf5cbcAndreas Huber        const KeyedVector<String8, String8> *headers)
47b5f25f005bc1d3ae35f45b58c88345e183dc336dAndreas Huber    : Source(notify),
481b86fe063badb5f28c467ade39be0f4008688947Andreas Huber      mHTTPService(httpService),
49b5f25f005bc1d3ae35f45b58c88345e183dc336dAndreas Huber      mURL(url),
50ad0d9c9c39a24b7fbd94e935a5855c9025341929Andreas Huber      mFlags(0),
51eac68baf095aeef54865c28b6888924dc6295cbdAndreas Huber      mFinalResult(OK),
52dcb89b3b505522efde173c105a851c412f947178Chong Zhang      mOffset(0),
530852843d304006e3ab333081fddda13b07193de8Robert Shih      mFetchSubtitleDataGeneration(0),
540852843d304006e3ab333081fddda13b07193de8Robert Shih      mFetchMetaDataGeneration(0),
550852843d304006e3ab333081fddda13b07193de8Robert Shih      mHasMetadata(false),
560852843d304006e3ab333081fddda13b07193de8Robert Shih      mMetadataSelected(false) {
5748fa06d1e80a872c7495804979256e021e566ae0Wei Jia    getDefaultBufferingSettings(&mBufferingSettings);
58ad0d9c9c39a24b7fbd94e935a5855c9025341929Andreas Huber    if (headers) {
59ad0d9c9c39a24b7fbd94e935a5855c9025341929Andreas Huber        mExtraHeaders = *headers;
60ad0d9c9c39a24b7fbd94e935a5855c9025341929Andreas Huber
61ad0d9c9c39a24b7fbd94e935a5855c9025341929Andreas Huber        ssize_t index =
62ad0d9c9c39a24b7fbd94e935a5855c9025341929Andreas Huber            mExtraHeaders.indexOfKey(String8("x-hide-urls-from-log"));
63ad0d9c9c39a24b7fbd94e935a5855c9025341929Andreas Huber
64ad0d9c9c39a24b7fbd94e935a5855c9025341929Andreas Huber        if (index >= 0) {
65ad0d9c9c39a24b7fbd94e935a5855c9025341929Andreas Huber            mFlags |= kFlagIncognito;
66ad0d9c9c39a24b7fbd94e935a5855c9025341929Andreas Huber
67ad0d9c9c39a24b7fbd94e935a5855c9025341929Andreas Huber            mExtraHeaders.removeItemsAt(index);
68ad0d9c9c39a24b7fbd94e935a5855c9025341929Andreas Huber        }
69ad0d9c9c39a24b7fbd94e935a5855c9025341929Andreas Huber    }
705bc087c573c70c84c6a39946457590b42d392a33Andreas Huber}
715bc087c573c70c84c6a39946457590b42d392a33Andreas Huber
725bc087c573c70c84c6a39946457590b42d392a33Andreas HuberNuPlayer::HTTPLiveSource::~HTTPLiveSource() {
732048d0cfccce48be26816dec8711a6691ebff71cAndreas Huber    if (mLiveSession != NULL) {
742048d0cfccce48be26816dec8711a6691ebff71cAndreas Huber        mLiveSession->disconnect();
7514f7672b5d450ed26a06fd3bb3ce045ea78b11b2Andreas Huber
761228d6b175de8b21787cbe0c6c4bb5642f4d555eChong Zhang        mLiveLooper->unregisterHandler(mLiveSession->id());
771228d6b175de8b21787cbe0c6c4bb5642f4d555eChong Zhang        mLiveLooper->unregisterHandler(id());
782048d0cfccce48be26816dec8711a6691ebff71cAndreas Huber        mLiveLooper->stop();
791228d6b175de8b21787cbe0c6c4bb5642f4d555eChong Zhang
801228d6b175de8b21787cbe0c6c4bb5642f4d555eChong Zhang        mLiveSession.clear();
8114f7672b5d450ed26a06fd3bb3ce045ea78b11b2Andreas Huber        mLiveLooper.clear();
822048d0cfccce48be26816dec8711a6691ebff71cAndreas Huber    }
835bc087c573c70c84c6a39946457590b42d392a33Andreas Huber}
845bc087c573c70c84c6a39946457590b42d392a33Andreas Huber
8548fa06d1e80a872c7495804979256e021e566ae0Wei Jiastatus_t NuPlayer::HTTPLiveSource::getDefaultBufferingSettings(
8648fa06d1e80a872c7495804979256e021e566ae0Wei Jia            BufferingSettings* buffering /* nonnull */) {
8748fa06d1e80a872c7495804979256e021e566ae0Wei Jia    buffering->mInitialBufferingMode = BUFFERING_MODE_TIME_ONLY;
8848fa06d1e80a872c7495804979256e021e566ae0Wei Jia    buffering->mRebufferingMode = BUFFERING_MODE_TIME_ONLY;
8948fa06d1e80a872c7495804979256e021e566ae0Wei Jia    buffering->mInitialWatermarkMs = kPrepareMarkMs;
9048fa06d1e80a872c7495804979256e021e566ae0Wei Jia    buffering->mRebufferingWatermarkLowMs = kUnderflowMarkMs;
9148fa06d1e80a872c7495804979256e021e566ae0Wei Jia    buffering->mRebufferingWatermarkHighMs = kReadyMarkMs;
9248fa06d1e80a872c7495804979256e021e566ae0Wei Jia
9348fa06d1e80a872c7495804979256e021e566ae0Wei Jia    return OK;
9448fa06d1e80a872c7495804979256e021e566ae0Wei Jia}
9548fa06d1e80a872c7495804979256e021e566ae0Wei Jia
9648fa06d1e80a872c7495804979256e021e566ae0Wei Jiastatus_t NuPlayer::HTTPLiveSource::setBufferingSettings(const BufferingSettings& buffering) {
9748fa06d1e80a872c7495804979256e021e566ae0Wei Jia    if (buffering.IsSizeBasedBufferingMode(buffering.mInitialBufferingMode)
9848fa06d1e80a872c7495804979256e021e566ae0Wei Jia            || buffering.IsSizeBasedBufferingMode(buffering.mRebufferingMode)
9948fa06d1e80a872c7495804979256e021e566ae0Wei Jia            || (buffering.IsTimeBasedBufferingMode(buffering.mRebufferingMode)
10048fa06d1e80a872c7495804979256e021e566ae0Wei Jia                && buffering.mRebufferingWatermarkLowMs > buffering.mRebufferingWatermarkHighMs)) {
10148fa06d1e80a872c7495804979256e021e566ae0Wei Jia        return BAD_VALUE;
10248fa06d1e80a872c7495804979256e021e566ae0Wei Jia    }
10348fa06d1e80a872c7495804979256e021e566ae0Wei Jia
10448fa06d1e80a872c7495804979256e021e566ae0Wei Jia    mBufferingSettings = buffering;
10548fa06d1e80a872c7495804979256e021e566ae0Wei Jia
10648fa06d1e80a872c7495804979256e021e566ae0Wei Jia    if (mBufferingSettings.mInitialBufferingMode == BUFFERING_MODE_NONE) {
10748fa06d1e80a872c7495804979256e021e566ae0Wei Jia        mBufferingSettings.mInitialWatermarkMs = BufferingSettings::kNoWatermark;
10848fa06d1e80a872c7495804979256e021e566ae0Wei Jia    }
10948fa06d1e80a872c7495804979256e021e566ae0Wei Jia    if (mBufferingSettings.mRebufferingMode == BUFFERING_MODE_NONE) {
11048fa06d1e80a872c7495804979256e021e566ae0Wei Jia        mBufferingSettings.mRebufferingWatermarkLowMs = BufferingSettings::kNoWatermark;
11148fa06d1e80a872c7495804979256e021e566ae0Wei Jia        mBufferingSettings.mRebufferingWatermarkHighMs = INT32_MAX;
11248fa06d1e80a872c7495804979256e021e566ae0Wei Jia    }
11348fa06d1e80a872c7495804979256e021e566ae0Wei Jia
11448fa06d1e80a872c7495804979256e021e566ae0Wei Jia    if (mLiveSession != NULL) {
11548fa06d1e80a872c7495804979256e021e566ae0Wei Jia        mLiveSession->setBufferingSettings(mBufferingSettings);
11648fa06d1e80a872c7495804979256e021e566ae0Wei Jia    }
11748fa06d1e80a872c7495804979256e021e566ae0Wei Jia
11848fa06d1e80a872c7495804979256e021e566ae0Wei Jia    return OK;
11948fa06d1e80a872c7495804979256e021e566ae0Wei Jia}
12048fa06d1e80a872c7495804979256e021e566ae0Wei Jia
1219575c96b6e418914e2ffc6741ecc8d71e3968dbeAndreas Hubervoid NuPlayer::HTTPLiveSource::prepareAsync() {
1221228d6b175de8b21787cbe0c6c4bb5642f4d555eChong Zhang    if (mLiveLooper == NULL) {
1231228d6b175de8b21787cbe0c6c4bb5642f4d555eChong Zhang        mLiveLooper = new ALooper;
1241228d6b175de8b21787cbe0c6c4bb5642f4d555eChong Zhang        mLiveLooper->setName("http live");
1251228d6b175de8b21787cbe0c6c4bb5642f4d555eChong Zhang        mLiveLooper->start();
1261228d6b175de8b21787cbe0c6c4bb5642f4d555eChong Zhang
1271228d6b175de8b21787cbe0c6c4bb5642f4d555eChong Zhang        mLiveLooper->registerHandler(this);
1281228d6b175de8b21787cbe0c6c4bb5642f4d555eChong Zhang    }
1295bc087c573c70c84c6a39946457590b42d392a33Andreas Huber
1301d15ab58bf8239069ef343de6cb21aabf3ef7d78Lajos Molnar    sp<AMessage> notify = new AMessage(kWhatSessionNotify, this);
1310df36ec3303c2c6bf9b42c07945ac8bd234153f3Andreas Huber
1327314fa17093d514199fedcb55ac41136a1b31cb3Andreas Huber    mLiveSession = new LiveSession(
1330df36ec3303c2c6bf9b42c07945ac8bd234153f3Andreas Huber            notify,
1349b80c2bdb205bc143104f54d0743b6eedd67b14eAndreas Huber            (mFlags & kFlagIncognito) ? LiveSession::kFlagIncognito : 0,
13581e68448f3361eaf8618930471fdc3c21bdf5cbcAndreas Huber            mHTTPService);
1367314fa17093d514199fedcb55ac41136a1b31cb3Andreas Huber
1375bc087c573c70c84c6a39946457590b42d392a33Andreas Huber    mLiveLooper->registerHandler(mLiveSession);
1385bc087c573c70c84c6a39946457590b42d392a33Andreas Huber
13948fa06d1e80a872c7495804979256e021e566ae0Wei Jia    mLiveSession->setBufferingSettings(mBufferingSettings);
14014f7672b5d450ed26a06fd3bb3ce045ea78b11b2Andreas Huber    mLiveSession->connectAsync(
141ad0d9c9c39a24b7fbd94e935a5855c9025341929Andreas Huber            mURL.c_str(), mExtraHeaders.isEmpty() ? NULL : &mExtraHeaders);
1429575c96b6e418914e2ffc6741ecc8d71e3968dbeAndreas Huber}
1439575c96b6e418914e2ffc6741ecc8d71e3968dbeAndreas Huber
1449575c96b6e418914e2ffc6741ecc8d71e3968dbeAndreas Hubervoid NuPlayer::HTTPLiveSource::start() {
1455bc087c573c70c84c6a39946457590b42d392a33Andreas Huber}
1465bc087c573c70c84c6a39946457590b42d392a33Andreas Huber
147a83eebb78c3a7d57a769dac965b17a8aad7c7b8fRobert Shihsp<MetaData> NuPlayer::HTTPLiveSource::getFormatMeta(bool audio) {
148a83eebb78c3a7d57a769dac965b17a8aad7c7b8fRobert Shih    sp<MetaData> meta;
149a83eebb78c3a7d57a769dac965b17a8aad7c7b8fRobert Shih    if (mLiveSession != NULL) {
150a83eebb78c3a7d57a769dac965b17a8aad7c7b8fRobert Shih        mLiveSession->getStreamFormatMeta(
151a83eebb78c3a7d57a769dac965b17a8aad7c7b8fRobert Shih                audio ? LiveSession::STREAMTYPE_AUDIO
152a83eebb78c3a7d57a769dac965b17a8aad7c7b8fRobert Shih                      : LiveSession::STREAMTYPE_VIDEO,
153a83eebb78c3a7d57a769dac965b17a8aad7c7b8fRobert Shih                &meta);
154a83eebb78c3a7d57a769dac965b17a8aad7c7b8fRobert Shih    }
155a83eebb78c3a7d57a769dac965b17a8aad7c7b8fRobert Shih
156a83eebb78c3a7d57a769dac965b17a8aad7c7b8fRobert Shih    return meta;
157a83eebb78c3a7d57a769dac965b17a8aad7c7b8fRobert Shih}
158a83eebb78c3a7d57a769dac965b17a8aad7c7b8fRobert Shih
15914f7672b5d450ed26a06fd3bb3ce045ea78b11b2Andreas Hubersp<AMessage> NuPlayer::HTTPLiveSource::getFormat(bool audio) {
160a83eebb78c3a7d57a769dac965b17a8aad7c7b8fRobert Shih    sp<MetaData> meta;
1617350b057ca864f5dc9e53d48e34710a8e81133f8Robert Shih    status_t err = -EWOULDBLOCK;
1627350b057ca864f5dc9e53d48e34710a8e81133f8Robert Shih    if (mLiveSession != NULL) {
163a83eebb78c3a7d57a769dac965b17a8aad7c7b8fRobert Shih        err = mLiveSession->getStreamFormatMeta(
1647350b057ca864f5dc9e53d48e34710a8e81133f8Robert Shih                audio ? LiveSession::STREAMTYPE_AUDIO
1657350b057ca864f5dc9e53d48e34710a8e81133f8Robert Shih                      : LiveSession::STREAMTYPE_VIDEO,
166a83eebb78c3a7d57a769dac965b17a8aad7c7b8fRobert Shih                &meta);
1671098d87e56f726184ae9c8fe903ea4743669f35bRobert Shih    }
1681098d87e56f726184ae9c8fe903ea4743669f35bRobert Shih
169a83eebb78c3a7d57a769dac965b17a8aad7c7b8fRobert Shih    sp<AMessage> format;
1707350b057ca864f5dc9e53d48e34710a8e81133f8Robert Shih    if (err == -EWOULDBLOCK) {
1717350b057ca864f5dc9e53d48e34710a8e81133f8Robert Shih        format = new AMessage();
1727350b057ca864f5dc9e53d48e34710a8e81133f8Robert Shih        format->setInt32("err", err);
1737350b057ca864f5dc9e53d48e34710a8e81133f8Robert Shih        return format;
1747350b057ca864f5dc9e53d48e34710a8e81133f8Robert Shih    }
1755bc087c573c70c84c6a39946457590b42d392a33Andreas Huber
176a83eebb78c3a7d57a769dac965b17a8aad7c7b8fRobert Shih    if (err != OK || convertMetaDataToMessage(meta, &format) != OK) {
1775bc087c573c70c84c6a39946457590b42d392a33Andreas Huber        return NULL;
1785bc087c573c70c84c6a39946457590b42d392a33Andreas Huber    }
17914f7672b5d450ed26a06fd3bb3ce045ea78b11b2Andreas Huber    return format;
1805bc087c573c70c84c6a39946457590b42d392a33Andreas Huber}
1815bc087c573c70c84c6a39946457590b42d392a33Andreas Huber
182eac68baf095aeef54865c28b6888924dc6295cbdAndreas Huberstatus_t NuPlayer::HTTPLiveSource::feedMoreTSData() {
183eac68baf095aeef54865c28b6888924dc6295cbdAndreas Huber    return OK;
1845bc087c573c70c84c6a39946457590b42d392a33Andreas Huber}
1855bc087c573c70c84c6a39946457590b42d392a33Andreas Huber
1865bc087c573c70c84c6a39946457590b42d392a33Andreas Huberstatus_t NuPlayer::HTTPLiveSource::dequeueAccessUnit(
1875bc087c573c70c84c6a39946457590b42d392a33Andreas Huber        bool audio, sp<ABuffer> *accessUnit) {
18814f7672b5d450ed26a06fd3bb3ce045ea78b11b2Andreas Huber    return mLiveSession->dequeueAccessUnit(
18914f7672b5d450ed26a06fd3bb3ce045ea78b11b2Andreas Huber            audio ? LiveSession::STREAMTYPE_AUDIO
19014f7672b5d450ed26a06fd3bb3ce045ea78b11b2Andreas Huber                  : LiveSession::STREAMTYPE_VIDEO,
19114f7672b5d450ed26a06fd3bb3ce045ea78b11b2Andreas Huber            accessUnit);
1925bc087c573c70c84c6a39946457590b42d392a33Andreas Huber}
1935bc087c573c70c84c6a39946457590b42d392a33Andreas Huber
19443c3e6ce02215ca99d506458f596cb1211639f29Andreas Huberstatus_t NuPlayer::HTTPLiveSource::getDuration(int64_t *durationUs) {
19543c3e6ce02215ca99d506458f596cb1211639f29Andreas Huber    return mLiveSession->getDuration(durationUs);
19643c3e6ce02215ca99d506458f596cb1211639f29Andreas Huber}
19743c3e6ce02215ca99d506458f596cb1211639f29Andreas Huber
198404fced9bfa8fa423ee210a271ca051ffd1bec13Chong Zhangsize_t NuPlayer::HTTPLiveSource::getTrackCount() const {
199404fced9bfa8fa423ee210a271ca051ffd1bec13Chong Zhang    return mLiveSession->getTrackCount();
200404fced9bfa8fa423ee210a271ca051ffd1bec13Chong Zhang}
201404fced9bfa8fa423ee210a271ca051ffd1bec13Chong Zhang
202404fced9bfa8fa423ee210a271ca051ffd1bec13Chong Zhangsp<AMessage> NuPlayer::HTTPLiveSource::getTrackInfo(size_t trackIndex) const {
203404fced9bfa8fa423ee210a271ca051ffd1bec13Chong Zhang    return mLiveSession->getTrackInfo(trackIndex);
204dcb89b3b505522efde173c105a851c412f947178Chong Zhang}
205dcb89b3b505522efde173c105a851c412f947178Chong Zhang
20689bf2525c5b57f17260de5b00c5f3f78ac4b881eRobert Shihssize_t NuPlayer::HTTPLiveSource::getSelectedTrack(media_track_type type) const {
20789bf2525c5b57f17260de5b00c5f3f78ac4b881eRobert Shih    if (mLiveSession == NULL) {
20889bf2525c5b57f17260de5b00c5f3f78ac4b881eRobert Shih        return -1;
2090852843d304006e3ab333081fddda13b07193de8Robert Shih    } else if (type == MEDIA_TRACK_TYPE_METADATA) {
2100852843d304006e3ab333081fddda13b07193de8Robert Shih        // MEDIA_TRACK_TYPE_METADATA is always last track
2110852843d304006e3ab333081fddda13b07193de8Robert Shih        // mMetadataSelected can only be true when mHasMetadata is true
2120852843d304006e3ab333081fddda13b07193de8Robert Shih        return mMetadataSelected ? (mLiveSession->getTrackCount() - 1) : -1;
21389bf2525c5b57f17260de5b00c5f3f78ac4b881eRobert Shih    } else {
21489bf2525c5b57f17260de5b00c5f3f78ac4b881eRobert Shih        return mLiveSession->getSelectedTrack(type);
21589bf2525c5b57f17260de5b00c5f3f78ac4b881eRobert Shih    }
21689bf2525c5b57f17260de5b00c5f3f78ac4b881eRobert Shih}
21789bf2525c5b57f17260de5b00c5f3f78ac4b881eRobert Shih
2186ffb1fd67eb8f00f130a6db914ba42a8432aec70Robert Shihstatus_t NuPlayer::HTTPLiveSource::selectTrack(size_t trackIndex, bool select, int64_t /*timeUs*/) {
2190852843d304006e3ab333081fddda13b07193de8Robert Shih    if (mLiveSession == NULL) {
2200852843d304006e3ab333081fddda13b07193de8Robert Shih        return INVALID_OPERATION;
2210852843d304006e3ab333081fddda13b07193de8Robert Shih    }
2220852843d304006e3ab333081fddda13b07193de8Robert Shih
2230852843d304006e3ab333081fddda13b07193de8Robert Shih    status_t err = INVALID_OPERATION;
2240852843d304006e3ab333081fddda13b07193de8Robert Shih    bool postFetchMsg = false, isSub = false;
225055404ea1309d4cbc5d313332b026f86bd6f0da1Robert Shih    if (!mHasMetadata || trackIndex != mLiveSession->getTrackCount() - 1) {
2260852843d304006e3ab333081fddda13b07193de8Robert Shih        err = mLiveSession->selectTrack(trackIndex, select);
2270852843d304006e3ab333081fddda13b07193de8Robert Shih        postFetchMsg = select;
2280852843d304006e3ab333081fddda13b07193de8Robert Shih        isSub = true;
2290852843d304006e3ab333081fddda13b07193de8Robert Shih    } else {
230055404ea1309d4cbc5d313332b026f86bd6f0da1Robert Shih        // metadata track; i.e. (mHasMetadata && trackIndex == mLiveSession->getTrackCount() - 1)
231055404ea1309d4cbc5d313332b026f86bd6f0da1Robert Shih        if (mMetadataSelected && !select) {
232055404ea1309d4cbc5d313332b026f86bd6f0da1Robert Shih            err = OK;
233055404ea1309d4cbc5d313332b026f86bd6f0da1Robert Shih        } else if (!mMetadataSelected && select) {
234055404ea1309d4cbc5d313332b026f86bd6f0da1Robert Shih            postFetchMsg = true;
235055404ea1309d4cbc5d313332b026f86bd6f0da1Robert Shih            err = OK;
236055404ea1309d4cbc5d313332b026f86bd6f0da1Robert Shih        } else {
237055404ea1309d4cbc5d313332b026f86bd6f0da1Robert Shih            err = BAD_VALUE; // behave as LiveSession::selectTrack
2380852843d304006e3ab333081fddda13b07193de8Robert Shih        }
239055404ea1309d4cbc5d313332b026f86bd6f0da1Robert Shih
240055404ea1309d4cbc5d313332b026f86bd6f0da1Robert Shih        mMetadataSelected = select;
2410852843d304006e3ab333081fddda13b07193de8Robert Shih    }
242dcb89b3b505522efde173c105a851c412f947178Chong Zhang
243dcb89b3b505522efde173c105a851c412f947178Chong Zhang    if (err == OK) {
2440852843d304006e3ab333081fddda13b07193de8Robert Shih        int32_t &generation = isSub ? mFetchSubtitleDataGeneration : mFetchMetaDataGeneration;
2450852843d304006e3ab333081fddda13b07193de8Robert Shih        generation++;
2460852843d304006e3ab333081fddda13b07193de8Robert Shih        if (postFetchMsg) {
2470852843d304006e3ab333081fddda13b07193de8Robert Shih            int32_t what = isSub ? kWhatFetchSubtitleData : kWhatFetchMetaData;
2480852843d304006e3ab333081fddda13b07193de8Robert Shih            sp<AMessage> msg = new AMessage(what, this);
2490852843d304006e3ab333081fddda13b07193de8Robert Shih            msg->setInt32("generation", generation);
250dcb89b3b505522efde173c105a851c412f947178Chong Zhang            msg->post();
251dcb89b3b505522efde173c105a851c412f947178Chong Zhang        }
252dcb89b3b505522efde173c105a851c412f947178Chong Zhang    }
253dcb89b3b505522efde173c105a851c412f947178Chong Zhang
254dcb89b3b505522efde173c105a851c412f947178Chong Zhang    // LiveSession::selectTrack returns BAD_VALUE when selecting the currently
255dcb89b3b505522efde173c105a851c412f947178Chong Zhang    // selected track, or unselecting a non-selected track. In this case it's an
256dcb89b3b505522efde173c105a851c412f947178Chong Zhang    // no-op so we return OK.
25784333e0475bc911adc16417f4ca327c975cf6c36Andreas Huber    return (err == OK || err == BAD_VALUE) ? (status_t)OK : err;
258dcb89b3b505522efde173c105a851c412f947178Chong Zhang}
259dcb89b3b505522efde173c105a851c412f947178Chong Zhang
260c5de09127e9e0d5df7aa587be317e1487d793245Wei Jiastatus_t NuPlayer::HTTPLiveSource::seekTo(int64_t seekTimeUs, MediaPlayerSeekMode mode) {
261c5de09127e9e0d5df7aa587be317e1487d793245Wei Jia    return mLiveSession->seekTo(seekTimeUs, mode);
26243c3e6ce02215ca99d506458f596cb1211639f29Andreas Huber}
26343c3e6ce02215ca99d506458f596cb1211639f29Andreas Huber
2640852843d304006e3ab333081fddda13b07193de8Robert Shihvoid NuPlayer::HTTPLiveSource::pollForRawData(
2650852843d304006e3ab333081fddda13b07193de8Robert Shih        const sp<AMessage> &msg, int32_t currentGeneration,
2660852843d304006e3ab333081fddda13b07193de8Robert Shih        LiveSession::StreamType fetchType, int32_t pushWhat) {
2670852843d304006e3ab333081fddda13b07193de8Robert Shih
2680852843d304006e3ab333081fddda13b07193de8Robert Shih    int32_t generation;
2690852843d304006e3ab333081fddda13b07193de8Robert Shih    CHECK(msg->findInt32("generation", &generation));
2700852843d304006e3ab333081fddda13b07193de8Robert Shih
2710852843d304006e3ab333081fddda13b07193de8Robert Shih    if (generation != currentGeneration) {
2720852843d304006e3ab333081fddda13b07193de8Robert Shih        return;
2730852843d304006e3ab333081fddda13b07193de8Robert Shih    }
2740852843d304006e3ab333081fddda13b07193de8Robert Shih
2750852843d304006e3ab333081fddda13b07193de8Robert Shih    sp<ABuffer> buffer;
2760852843d304006e3ab333081fddda13b07193de8Robert Shih    while (mLiveSession->dequeueAccessUnit(fetchType, &buffer) == OK) {
2770852843d304006e3ab333081fddda13b07193de8Robert Shih
2780852843d304006e3ab333081fddda13b07193de8Robert Shih        sp<AMessage> notify = dupNotify();
2790852843d304006e3ab333081fddda13b07193de8Robert Shih        notify->setInt32("what", pushWhat);
2800852843d304006e3ab333081fddda13b07193de8Robert Shih        notify->setBuffer("buffer", buffer);
2810852843d304006e3ab333081fddda13b07193de8Robert Shih
2820852843d304006e3ab333081fddda13b07193de8Robert Shih        int64_t timeUs, baseUs, delayUs;
2830852843d304006e3ab333081fddda13b07193de8Robert Shih        CHECK(buffer->meta()->findInt64("baseUs", &baseUs));
2840852843d304006e3ab333081fddda13b07193de8Robert Shih        CHECK(buffer->meta()->findInt64("timeUs", &timeUs));
2850852843d304006e3ab333081fddda13b07193de8Robert Shih        delayUs = baseUs + timeUs - ALooper::GetNowUs();
2860852843d304006e3ab333081fddda13b07193de8Robert Shih
2870852843d304006e3ab333081fddda13b07193de8Robert Shih        if (fetchType == LiveSession::STREAMTYPE_SUBTITLES) {
2880852843d304006e3ab333081fddda13b07193de8Robert Shih            notify->post();
2890852843d304006e3ab333081fddda13b07193de8Robert Shih            msg->post(delayUs > 0ll ? delayUs : 0ll);
2900852843d304006e3ab333081fddda13b07193de8Robert Shih            return;
2910852843d304006e3ab333081fddda13b07193de8Robert Shih        } else if (fetchType == LiveSession::STREAMTYPE_METADATA) {
2920852843d304006e3ab333081fddda13b07193de8Robert Shih            if (delayUs < -1000000ll) { // 1 second
2930852843d304006e3ab333081fddda13b07193de8Robert Shih                continue;
2940852843d304006e3ab333081fddda13b07193de8Robert Shih            }
2950852843d304006e3ab333081fddda13b07193de8Robert Shih            notify->post();
2960852843d304006e3ab333081fddda13b07193de8Robert Shih            // push all currently available metadata buffers in each invocation of pollForRawData
2970852843d304006e3ab333081fddda13b07193de8Robert Shih            // continue;
2980852843d304006e3ab333081fddda13b07193de8Robert Shih        } else {
2990852843d304006e3ab333081fddda13b07193de8Robert Shih            TRESPASS();
3000852843d304006e3ab333081fddda13b07193de8Robert Shih        }
3010852843d304006e3ab333081fddda13b07193de8Robert Shih    }
3020852843d304006e3ab333081fddda13b07193de8Robert Shih
3030852843d304006e3ab333081fddda13b07193de8Robert Shih    // try again in 1 second
3040852843d304006e3ab333081fddda13b07193de8Robert Shih    msg->post(1000000ll);
3050852843d304006e3ab333081fddda13b07193de8Robert Shih}
3060852843d304006e3ab333081fddda13b07193de8Robert Shih
3070df36ec3303c2c6bf9b42c07945ac8bd234153f3Andreas Hubervoid NuPlayer::HTTPLiveSource::onMessageReceived(const sp<AMessage> &msg) {
3080df36ec3303c2c6bf9b42c07945ac8bd234153f3Andreas Huber    switch (msg->what()) {
3090df36ec3303c2c6bf9b42c07945ac8bd234153f3Andreas Huber        case kWhatSessionNotify:
3100df36ec3303c2c6bf9b42c07945ac8bd234153f3Andreas Huber        {
3110df36ec3303c2c6bf9b42c07945ac8bd234153f3Andreas Huber            onSessionNotify(msg);
3120df36ec3303c2c6bf9b42c07945ac8bd234153f3Andreas Huber            break;
3130df36ec3303c2c6bf9b42c07945ac8bd234153f3Andreas Huber        }
3140df36ec3303c2c6bf9b42c07945ac8bd234153f3Andreas Huber
315dcb89b3b505522efde173c105a851c412f947178Chong Zhang        case kWhatFetchSubtitleData:
316dcb89b3b505522efde173c105a851c412f947178Chong Zhang        {
3170852843d304006e3ab333081fddda13b07193de8Robert Shih            pollForRawData(
3180852843d304006e3ab333081fddda13b07193de8Robert Shih                    msg, mFetchSubtitleDataGeneration,
3190852843d304006e3ab333081fddda13b07193de8Robert Shih                    /* fetch */ LiveSession::STREAMTYPE_SUBTITLES,
3200852843d304006e3ab333081fddda13b07193de8Robert Shih                    /* push */ kWhatSubtitleData);
3210852843d304006e3ab333081fddda13b07193de8Robert Shih
3220852843d304006e3ab333081fddda13b07193de8Robert Shih            break;
3230852843d304006e3ab333081fddda13b07193de8Robert Shih        }
324dcb89b3b505522efde173c105a851c412f947178Chong Zhang
3250852843d304006e3ab333081fddda13b07193de8Robert Shih        case kWhatFetchMetaData:
3260852843d304006e3ab333081fddda13b07193de8Robert Shih        {
3270852843d304006e3ab333081fddda13b07193de8Robert Shih            if (!mMetadataSelected) {
328dcb89b3b505522efde173c105a851c412f947178Chong Zhang                break;
329dcb89b3b505522efde173c105a851c412f947178Chong Zhang            }
330dcb89b3b505522efde173c105a851c412f947178Chong Zhang
3310852843d304006e3ab333081fddda13b07193de8Robert Shih            pollForRawData(
3320852843d304006e3ab333081fddda13b07193de8Robert Shih                    msg, mFetchMetaDataGeneration,
3330852843d304006e3ab333081fddda13b07193de8Robert Shih                    /* fetch */ LiveSession::STREAMTYPE_METADATA,
3340852843d304006e3ab333081fddda13b07193de8Robert Shih                    /* push */ kWhatTimedMetaData);
335dcb89b3b505522efde173c105a851c412f947178Chong Zhang
336dcb89b3b505522efde173c105a851c412f947178Chong Zhang            break;
337dcb89b3b505522efde173c105a851c412f947178Chong Zhang        }
338dcb89b3b505522efde173c105a851c412f947178Chong Zhang
3390df36ec3303c2c6bf9b42c07945ac8bd234153f3Andreas Huber        default:
3400df36ec3303c2c6bf9b42c07945ac8bd234153f3Andreas Huber            Source::onMessageReceived(msg);
3410df36ec3303c2c6bf9b42c07945ac8bd234153f3Andreas Huber            break;
3420df36ec3303c2c6bf9b42c07945ac8bd234153f3Andreas Huber    }
3430df36ec3303c2c6bf9b42c07945ac8bd234153f3Andreas Huber}
3440df36ec3303c2c6bf9b42c07945ac8bd234153f3Andreas Huber
3450df36ec3303c2c6bf9b42c07945ac8bd234153f3Andreas Hubervoid NuPlayer::HTTPLiveSource::onSessionNotify(const sp<AMessage> &msg) {
3460df36ec3303c2c6bf9b42c07945ac8bd234153f3Andreas Huber    int32_t what;
3470df36ec3303c2c6bf9b42c07945ac8bd234153f3Andreas Huber    CHECK(msg->findInt32("what", &what));
3480df36ec3303c2c6bf9b42c07945ac8bd234153f3Andreas Huber
3490df36ec3303c2c6bf9b42c07945ac8bd234153f3Andreas Huber    switch (what) {
3500df36ec3303c2c6bf9b42c07945ac8bd234153f3Andreas Huber        case LiveSession::kWhatPrepared:
3510df36ec3303c2c6bf9b42c07945ac8bd234153f3Andreas Huber        {
3523e518fd5d679abb83b654e473ea0fa5f7f16235fMarco Nelissen            // notify the current size here if we have it, otherwise report an initial size of (0,0)
3533e518fd5d679abb83b654e473ea0fa5f7f16235fMarco Nelissen            sp<AMessage> format = getFormat(false /* audio */);
3543e518fd5d679abb83b654e473ea0fa5f7f16235fMarco Nelissen            int32_t width;
3553e518fd5d679abb83b654e473ea0fa5f7f16235fMarco Nelissen            int32_t height;
3563e518fd5d679abb83b654e473ea0fa5f7f16235fMarco Nelissen            if (format != NULL &&
3573e518fd5d679abb83b654e473ea0fa5f7f16235fMarco Nelissen                    format->findInt32("width", &width) && format->findInt32("height", &height)) {
358ced1c2f8f6c422063092f5cc5c675ccdebb2dc10Chong Zhang                notifyVideoSizeChanged(format);
3593e518fd5d679abb83b654e473ea0fa5f7f16235fMarco Nelissen            } else {
360ced1c2f8f6c422063092f5cc5c675ccdebb2dc10Chong Zhang                notifyVideoSizeChanged();
3613e518fd5d679abb83b654e473ea0fa5f7f16235fMarco Nelissen            }
3620df36ec3303c2c6bf9b42c07945ac8bd234153f3Andreas Huber
363f9dee0c74c68a89b6fe2a4ca6f9ce4871f5a0de7Roger            uint32_t flags = 0;
3640df36ec3303c2c6bf9b42c07945ac8bd234153f3Andreas Huber            if (mLiveSession->isSeekable()) {
365f9dee0c74c68a89b6fe2a4ca6f9ce4871f5a0de7Roger                flags |= FLAG_CAN_PAUSE;
3660df36ec3303c2c6bf9b42c07945ac8bd234153f3Andreas Huber                flags |= FLAG_CAN_SEEK;
3670df36ec3303c2c6bf9b42c07945ac8bd234153f3Andreas Huber                flags |= FLAG_CAN_SEEK_BACKWARD;
3680df36ec3303c2c6bf9b42c07945ac8bd234153f3Andreas Huber                flags |= FLAG_CAN_SEEK_FORWARD;
3690df36ec3303c2c6bf9b42c07945ac8bd234153f3Andreas Huber            }
3700df36ec3303c2c6bf9b42c07945ac8bd234153f3Andreas Huber
3710df36ec3303c2c6bf9b42c07945ac8bd234153f3Andreas Huber            if (mLiveSession->hasDynamicDuration()) {
3720df36ec3303c2c6bf9b42c07945ac8bd234153f3Andreas Huber                flags |= FLAG_DYNAMIC_DURATION;
3730df36ec3303c2c6bf9b42c07945ac8bd234153f3Andreas Huber            }
3740df36ec3303c2c6bf9b42c07945ac8bd234153f3Andreas Huber
3750df36ec3303c2c6bf9b42c07945ac8bd234153f3Andreas Huber            notifyFlagsChanged(flags);
3760df36ec3303c2c6bf9b42c07945ac8bd234153f3Andreas Huber
3770df36ec3303c2c6bf9b42c07945ac8bd234153f3Andreas Huber            notifyPrepared();
3780df36ec3303c2c6bf9b42c07945ac8bd234153f3Andreas Huber            break;
3790df36ec3303c2c6bf9b42c07945ac8bd234153f3Andreas Huber        }
3800df36ec3303c2c6bf9b42c07945ac8bd234153f3Andreas Huber
3810df36ec3303c2c6bf9b42c07945ac8bd234153f3Andreas Huber        case LiveSession::kWhatPreparationFailed:
3820df36ec3303c2c6bf9b42c07945ac8bd234153f3Andreas Huber        {
3830df36ec3303c2c6bf9b42c07945ac8bd234153f3Andreas Huber            status_t err;
3840df36ec3303c2c6bf9b42c07945ac8bd234153f3Andreas Huber            CHECK(msg->findInt32("err", &err));
3850df36ec3303c2c6bf9b42c07945ac8bd234153f3Andreas Huber
3860df36ec3303c2c6bf9b42c07945ac8bd234153f3Andreas Huber            notifyPrepared(err);
3870df36ec3303c2c6bf9b42c07945ac8bd234153f3Andreas Huber            break;
3880df36ec3303c2c6bf9b42c07945ac8bd234153f3Andreas Huber        }
3890df36ec3303c2c6bf9b42c07945ac8bd234153f3Andreas Huber
39014f7672b5d450ed26a06fd3bb3ce045ea78b11b2Andreas Huber        case LiveSession::kWhatStreamsChanged:
39114f7672b5d450ed26a06fd3bb3ce045ea78b11b2Andreas Huber        {
39214f7672b5d450ed26a06fd3bb3ce045ea78b11b2Andreas Huber            uint32_t changedMask;
39314f7672b5d450ed26a06fd3bb3ce045ea78b11b2Andreas Huber            CHECK(msg->findInt32(
39414f7672b5d450ed26a06fd3bb3ce045ea78b11b2Andreas Huber                        "changedMask", (int32_t *)&changedMask));
39514f7672b5d450ed26a06fd3bb3ce045ea78b11b2Andreas Huber
39614f7672b5d450ed26a06fd3bb3ce045ea78b11b2Andreas Huber            bool audio = changedMask & LiveSession::STREAMTYPE_AUDIO;
39714f7672b5d450ed26a06fd3bb3ce045ea78b11b2Andreas Huber            bool video = changedMask & LiveSession::STREAMTYPE_VIDEO;
39814f7672b5d450ed26a06fd3bb3ce045ea78b11b2Andreas Huber
39914f7672b5d450ed26a06fd3bb3ce045ea78b11b2Andreas Huber            sp<AMessage> reply;
40014f7672b5d450ed26a06fd3bb3ce045ea78b11b2Andreas Huber            CHECK(msg->findMessage("reply", &reply));
40114f7672b5d450ed26a06fd3bb3ce045ea78b11b2Andreas Huber
40214f7672b5d450ed26a06fd3bb3ce045ea78b11b2Andreas Huber            sp<AMessage> notify = dupNotify();
40314f7672b5d450ed26a06fd3bb3ce045ea78b11b2Andreas Huber            notify->setInt32("what", kWhatQueueDecoderShutdown);
40414f7672b5d450ed26a06fd3bb3ce045ea78b11b2Andreas Huber            notify->setInt32("audio", audio);
40514f7672b5d450ed26a06fd3bb3ce045ea78b11b2Andreas Huber            notify->setInt32("video", video);
40614f7672b5d450ed26a06fd3bb3ce045ea78b11b2Andreas Huber            notify->setMessage("reply", reply);
40714f7672b5d450ed26a06fd3bb3ce045ea78b11b2Andreas Huber            notify->post();
40814f7672b5d450ed26a06fd3bb3ce045ea78b11b2Andreas Huber            break;
40914f7672b5d450ed26a06fd3bb3ce045ea78b11b2Andreas Huber        }
41014f7672b5d450ed26a06fd3bb3ce045ea78b11b2Andreas Huber
4117c8708046117e03c0d38006bdd9685139df3ac6bChong Zhang        case LiveSession::kWhatBufferingStart:
4127c8708046117e03c0d38006bdd9685139df3ac6bChong Zhang        {
4137c8708046117e03c0d38006bdd9685139df3ac6bChong Zhang            sp<AMessage> notify = dupNotify();
4147c8708046117e03c0d38006bdd9685139df3ac6bChong Zhang            notify->setInt32("what", kWhatPauseOnBufferingStart);
4157c8708046117e03c0d38006bdd9685139df3ac6bChong Zhang            notify->post();
4167c8708046117e03c0d38006bdd9685139df3ac6bChong Zhang            break;
4177c8708046117e03c0d38006bdd9685139df3ac6bChong Zhang        }
4187c8708046117e03c0d38006bdd9685139df3ac6bChong Zhang
4197c8708046117e03c0d38006bdd9685139df3ac6bChong Zhang        case LiveSession::kWhatBufferingEnd:
4207c8708046117e03c0d38006bdd9685139df3ac6bChong Zhang        {
4217c8708046117e03c0d38006bdd9685139df3ac6bChong Zhang            sp<AMessage> notify = dupNotify();
4227c8708046117e03c0d38006bdd9685139df3ac6bChong Zhang            notify->setInt32("what", kWhatResumeOnBufferingEnd);
4237c8708046117e03c0d38006bdd9685139df3ac6bChong Zhang            notify->post();
4247c8708046117e03c0d38006bdd9685139df3ac6bChong Zhang            break;
4257c8708046117e03c0d38006bdd9685139df3ac6bChong Zhang        }
4267c8708046117e03c0d38006bdd9685139df3ac6bChong Zhang
4277c8708046117e03c0d38006bdd9685139df3ac6bChong Zhang
4287c8708046117e03c0d38006bdd9685139df3ac6bChong Zhang        case LiveSession::kWhatBufferingUpdate:
4297c8708046117e03c0d38006bdd9685139df3ac6bChong Zhang        {
4307c8708046117e03c0d38006bdd9685139df3ac6bChong Zhang            sp<AMessage> notify = dupNotify();
4317c8708046117e03c0d38006bdd9685139df3ac6bChong Zhang            int32_t percentage;
4327c8708046117e03c0d38006bdd9685139df3ac6bChong Zhang            CHECK(msg->findInt32("percentage", &percentage));
4337c8708046117e03c0d38006bdd9685139df3ac6bChong Zhang            notify->setInt32("what", kWhatBufferingUpdate);
4347c8708046117e03c0d38006bdd9685139df3ac6bChong Zhang            notify->setInt32("percentage", percentage);
4357c8708046117e03c0d38006bdd9685139df3ac6bChong Zhang            notify->post();
4367c8708046117e03c0d38006bdd9685139df3ac6bChong Zhang            break;
4377c8708046117e03c0d38006bdd9685139df3ac6bChong Zhang        }
4387c8708046117e03c0d38006bdd9685139df3ac6bChong Zhang
4390852843d304006e3ab333081fddda13b07193de8Robert Shih        case LiveSession::kWhatMetadataDetected:
4400852843d304006e3ab333081fddda13b07193de8Robert Shih        {
4410852843d304006e3ab333081fddda13b07193de8Robert Shih            if (!mHasMetadata) {
4420852843d304006e3ab333081fddda13b07193de8Robert Shih                mHasMetadata = true;
4430852843d304006e3ab333081fddda13b07193de8Robert Shih
4440852843d304006e3ab333081fddda13b07193de8Robert Shih                sp<AMessage> notify = dupNotify();
4450852843d304006e3ab333081fddda13b07193de8Robert Shih                // notification without buffer triggers MEDIA_INFO_METADATA_UPDATE
4460852843d304006e3ab333081fddda13b07193de8Robert Shih                notify->setInt32("what", kWhatTimedMetaData);
4470852843d304006e3ab333081fddda13b07193de8Robert Shih                notify->post();
4480852843d304006e3ab333081fddda13b07193de8Robert Shih            }
4490852843d304006e3ab333081fddda13b07193de8Robert Shih            break;
4500852843d304006e3ab333081fddda13b07193de8Robert Shih        }
4510852843d304006e3ab333081fddda13b07193de8Robert Shih
45214f7672b5d450ed26a06fd3bb3ce045ea78b11b2Andreas Huber        case LiveSession::kWhatError:
45314f7672b5d450ed26a06fd3bb3ce045ea78b11b2Andreas Huber        {
45414f7672b5d450ed26a06fd3bb3ce045ea78b11b2Andreas Huber            break;
45514f7672b5d450ed26a06fd3bb3ce045ea78b11b2Andreas Huber        }
45614f7672b5d450ed26a06fd3bb3ce045ea78b11b2Andreas Huber
4570df36ec3303c2c6bf9b42c07945ac8bd234153f3Andreas Huber        default:
4580df36ec3303c2c6bf9b42c07945ac8bd234153f3Andreas Huber            TRESPASS();
4590df36ec3303c2c6bf9b42c07945ac8bd234153f3Andreas Huber    }
4600df36ec3303c2c6bf9b42c07945ac8bd234153f3Andreas Huber}
4610df36ec3303c2c6bf9b42c07945ac8bd234153f3Andreas Huber
4625bc087c573c70c84c6a39946457590b42d392a33Andreas Huber}  // namespace android
4635bc087c573c70c84c6a39946457590b42d392a33Andreas Huber
464