HTTPLiveSource.cpp revision 1b86fe063badb5f28c467ade39be0f4008688947
15bc087c573c70c84c6a39946457590b42d392a33Andreas Huber/* 25bc087c573c70c84c6a39946457590b42d392a33Andreas Huber * Copyright (C) 2010 The Android Open Source Project 35bc087c573c70c84c6a39946457590b42d392a33Andreas Huber * 45bc087c573c70c84c6a39946457590b42d392a33Andreas Huber * Licensed under the Apache License, Version 2.0 (the "License"); 55bc087c573c70c84c6a39946457590b42d392a33Andreas Huber * you may not use this file except in compliance with the License. 65bc087c573c70c84c6a39946457590b42d392a33Andreas Huber * You may obtain a copy of the License at 75bc087c573c70c84c6a39946457590b42d392a33Andreas Huber * 85bc087c573c70c84c6a39946457590b42d392a33Andreas Huber * http://www.apache.org/licenses/LICENSE-2.0 95bc087c573c70c84c6a39946457590b42d392a33Andreas Huber * 105bc087c573c70c84c6a39946457590b42d392a33Andreas Huber * Unless required by applicable law or agreed to in writing, software 115bc087c573c70c84c6a39946457590b42d392a33Andreas Huber * distributed under the License is distributed on an "AS IS" BASIS, 125bc087c573c70c84c6a39946457590b42d392a33Andreas Huber * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 135bc087c573c70c84c6a39946457590b42d392a33Andreas Huber * See the License for the specific language governing permissions and 145bc087c573c70c84c6a39946457590b42d392a33Andreas Huber * limitations under the License. 155bc087c573c70c84c6a39946457590b42d392a33Andreas Huber */ 165bc087c573c70c84c6a39946457590b42d392a33Andreas Huber 175bc087c573c70c84c6a39946457590b42d392a33Andreas Huber//#define LOG_NDEBUG 0 185bc087c573c70c84c6a39946457590b42d392a33Andreas Huber#define LOG_TAG "HTTPLiveSource" 195bc087c573c70c84c6a39946457590b42d392a33Andreas Huber#include <utils/Log.h> 205bc087c573c70c84c6a39946457590b42d392a33Andreas Huber 215bc087c573c70c84c6a39946457590b42d392a33Andreas Huber#include "HTTPLiveSource.h" 225bc087c573c70c84c6a39946457590b42d392a33Andreas Huber 235bc087c573c70c84c6a39946457590b42d392a33Andreas Huber#include "AnotherPacketSource.h" 245bc087c573c70c84c6a39946457590b42d392a33Andreas Huber#include "LiveDataSource.h" 255bc087c573c70c84c6a39946457590b42d392a33Andreas Huber#include "LiveSession.h" 265bc087c573c70c84c6a39946457590b42d392a33Andreas Huber 271b86fe063badb5f28c467ade39be0f4008688947Andreas Huber#include <media/IMediaHTTPService.h> 285bc087c573c70c84c6a39946457590b42d392a33Andreas Huber#include <media/stagefright/foundation/ABuffer.h> 295bc087c573c70c84c6a39946457590b42d392a33Andreas Huber#include <media/stagefright/foundation/ADebug.h> 305bc087c573c70c84c6a39946457590b42d392a33Andreas Huber#include <media/stagefright/foundation/AMessage.h> 315bc087c573c70c84c6a39946457590b42d392a33Andreas Huber#include <media/stagefright/MediaErrors.h> 325bc087c573c70c84c6a39946457590b42d392a33Andreas Huber#include <media/stagefright/MetaData.h> 335bc087c573c70c84c6a39946457590b42d392a33Andreas Huber 345bc087c573c70c84c6a39946457590b42d392a33Andreas Hubernamespace android { 355bc087c573c70c84c6a39946457590b42d392a33Andreas Huber 36ad0d9c9c39a24b7fbd94e935a5855c9025341929Andreas HuberNuPlayer::HTTPLiveSource::HTTPLiveSource( 37b5f25f005bc1d3ae35f45b58c88345e183dc336dAndreas Huber const sp<AMessage> ¬ify, 381b86fe063badb5f28c467ade39be0f4008688947Andreas Huber const sp<IMediaHTTPService> &httpService, 39ad0d9c9c39a24b7fbd94e935a5855c9025341929Andreas Huber const char *url, 409b80c2bdb205bc143104f54d0743b6eedd67b14eAndreas Huber const KeyedVector<String8, String8> *headers, 419b80c2bdb205bc143104f54d0743b6eedd67b14eAndreas Huber bool uidValid, uid_t uid) 42b5f25f005bc1d3ae35f45b58c88345e183dc336dAndreas Huber : Source(notify), 431b86fe063badb5f28c467ade39be0f4008688947Andreas Huber mHTTPService(httpService), 44b5f25f005bc1d3ae35f45b58c88345e183dc336dAndreas Huber mURL(url), 459b80c2bdb205bc143104f54d0743b6eedd67b14eAndreas Huber mUIDValid(uidValid), 469b80c2bdb205bc143104f54d0743b6eedd67b14eAndreas Huber mUID(uid), 47ad0d9c9c39a24b7fbd94e935a5855c9025341929Andreas Huber mFlags(0), 48eac68baf095aeef54865c28b6888924dc6295cbdAndreas Huber mFinalResult(OK), 49dcb89b3b505522efde173c105a851c412f947178Chong Zhang mOffset(0), 50dcb89b3b505522efde173c105a851c412f947178Chong Zhang mFetchSubtitleDataGeneration(0) { 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 mLiveSession.clear(); 6914f7672b5d450ed26a06fd3bb3ce045ea78b11b2Andreas Huber 702048d0cfccce48be26816dec8711a6691ebff71cAndreas Huber mLiveLooper->stop(); 7114f7672b5d450ed26a06fd3bb3ce045ea78b11b2Andreas Huber mLiveLooper.clear(); 722048d0cfccce48be26816dec8711a6691ebff71cAndreas Huber } 735bc087c573c70c84c6a39946457590b42d392a33Andreas Huber} 745bc087c573c70c84c6a39946457590b42d392a33Andreas Huber 759575c96b6e418914e2ffc6741ecc8d71e3968dbeAndreas Hubervoid NuPlayer::HTTPLiveSource::prepareAsync() { 765bc087c573c70c84c6a39946457590b42d392a33Andreas Huber mLiveLooper = new ALooper; 775bc087c573c70c84c6a39946457590b42d392a33Andreas Huber mLiveLooper->setName("http live"); 785bc087c573c70c84c6a39946457590b42d392a33Andreas Huber mLiveLooper->start(); 795bc087c573c70c84c6a39946457590b42d392a33Andreas Huber 800df36ec3303c2c6bf9b42c07945ac8bd234153f3Andreas Huber sp<AMessage> notify = new AMessage(kWhatSessionNotify, id()); 810df36ec3303c2c6bf9b42c07945ac8bd234153f3Andreas Huber 827314fa17093d514199fedcb55ac41136a1b31cb3Andreas Huber mLiveSession = new LiveSession( 830df36ec3303c2c6bf9b42c07945ac8bd234153f3Andreas Huber notify, 849b80c2bdb205bc143104f54d0743b6eedd67b14eAndreas Huber (mFlags & kFlagIncognito) ? LiveSession::kFlagIncognito : 0, 851b86fe063badb5f28c467ade39be0f4008688947Andreas Huber mHTTPService, 8614f7672b5d450ed26a06fd3bb3ce045ea78b11b2Andreas Huber mUIDValid, 8714f7672b5d450ed26a06fd3bb3ce045ea78b11b2Andreas Huber mUID); 887314fa17093d514199fedcb55ac41136a1b31cb3Andreas Huber 895bc087c573c70c84c6a39946457590b42d392a33Andreas Huber mLiveLooper->registerHandler(mLiveSession); 905bc087c573c70c84c6a39946457590b42d392a33Andreas Huber 9114f7672b5d450ed26a06fd3bb3ce045ea78b11b2Andreas Huber mLiveSession->connectAsync( 92ad0d9c9c39a24b7fbd94e935a5855c9025341929Andreas Huber mURL.c_str(), mExtraHeaders.isEmpty() ? NULL : &mExtraHeaders); 939575c96b6e418914e2ffc6741ecc8d71e3968dbeAndreas Huber} 949575c96b6e418914e2ffc6741ecc8d71e3968dbeAndreas Huber 959575c96b6e418914e2ffc6741ecc8d71e3968dbeAndreas Hubervoid NuPlayer::HTTPLiveSource::start() { 965bc087c573c70c84c6a39946457590b42d392a33Andreas Huber} 975bc087c573c70c84c6a39946457590b42d392a33Andreas Huber 9814f7672b5d450ed26a06fd3bb3ce045ea78b11b2Andreas Hubersp<AMessage> NuPlayer::HTTPLiveSource::getFormat(bool audio) { 9914f7672b5d450ed26a06fd3bb3ce045ea78b11b2Andreas Huber sp<AMessage> format; 10014f7672b5d450ed26a06fd3bb3ce045ea78b11b2Andreas Huber status_t err = mLiveSession->getStreamFormat( 10114f7672b5d450ed26a06fd3bb3ce045ea78b11b2Andreas Huber audio ? LiveSession::STREAMTYPE_AUDIO 10214f7672b5d450ed26a06fd3bb3ce045ea78b11b2Andreas Huber : LiveSession::STREAMTYPE_VIDEO, 10314f7672b5d450ed26a06fd3bb3ce045ea78b11b2Andreas Huber &format); 1045bc087c573c70c84c6a39946457590b42d392a33Andreas Huber 10514f7672b5d450ed26a06fd3bb3ce045ea78b11b2Andreas Huber if (err != OK) { 1065bc087c573c70c84c6a39946457590b42d392a33Andreas Huber return NULL; 1075bc087c573c70c84c6a39946457590b42d392a33Andreas Huber } 1085bc087c573c70c84c6a39946457590b42d392a33Andreas Huber 10914f7672b5d450ed26a06fd3bb3ce045ea78b11b2Andreas Huber return format; 1105bc087c573c70c84c6a39946457590b42d392a33Andreas Huber} 1115bc087c573c70c84c6a39946457590b42d392a33Andreas Huber 112eac68baf095aeef54865c28b6888924dc6295cbdAndreas Huberstatus_t NuPlayer::HTTPLiveSource::feedMoreTSData() { 113eac68baf095aeef54865c28b6888924dc6295cbdAndreas Huber return OK; 1145bc087c573c70c84c6a39946457590b42d392a33Andreas Huber} 1155bc087c573c70c84c6a39946457590b42d392a33Andreas Huber 1165bc087c573c70c84c6a39946457590b42d392a33Andreas Huberstatus_t NuPlayer::HTTPLiveSource::dequeueAccessUnit( 1175bc087c573c70c84c6a39946457590b42d392a33Andreas Huber bool audio, sp<ABuffer> *accessUnit) { 11814f7672b5d450ed26a06fd3bb3ce045ea78b11b2Andreas Huber return mLiveSession->dequeueAccessUnit( 11914f7672b5d450ed26a06fd3bb3ce045ea78b11b2Andreas Huber audio ? LiveSession::STREAMTYPE_AUDIO 12014f7672b5d450ed26a06fd3bb3ce045ea78b11b2Andreas Huber : LiveSession::STREAMTYPE_VIDEO, 12114f7672b5d450ed26a06fd3bb3ce045ea78b11b2Andreas Huber accessUnit); 1225bc087c573c70c84c6a39946457590b42d392a33Andreas Huber} 1235bc087c573c70c84c6a39946457590b42d392a33Andreas Huber 12443c3e6ce02215ca99d506458f596cb1211639f29Andreas Huberstatus_t NuPlayer::HTTPLiveSource::getDuration(int64_t *durationUs) { 12543c3e6ce02215ca99d506458f596cb1211639f29Andreas Huber return mLiveSession->getDuration(durationUs); 12643c3e6ce02215ca99d506458f596cb1211639f29Andreas Huber} 12743c3e6ce02215ca99d506458f596cb1211639f29Andreas Huber 128dcb89b3b505522efde173c105a851c412f947178Chong Zhangstatus_t NuPlayer::HTTPLiveSource::getTrackInfo(Parcel *reply) const { 129dcb89b3b505522efde173c105a851c412f947178Chong Zhang return mLiveSession->getTrackInfo(reply); 130dcb89b3b505522efde173c105a851c412f947178Chong Zhang} 131dcb89b3b505522efde173c105a851c412f947178Chong Zhang 132dcb89b3b505522efde173c105a851c412f947178Chong Zhangstatus_t NuPlayer::HTTPLiveSource::selectTrack(size_t trackIndex, bool select) { 133dcb89b3b505522efde173c105a851c412f947178Chong Zhang status_t err = mLiveSession->selectTrack(trackIndex, select); 134dcb89b3b505522efde173c105a851c412f947178Chong Zhang 135dcb89b3b505522efde173c105a851c412f947178Chong Zhang if (err == OK) { 136dcb89b3b505522efde173c105a851c412f947178Chong Zhang mFetchSubtitleDataGeneration++; 137dcb89b3b505522efde173c105a851c412f947178Chong Zhang if (select) { 138dcb89b3b505522efde173c105a851c412f947178Chong Zhang sp<AMessage> msg = new AMessage(kWhatFetchSubtitleData, id()); 139dcb89b3b505522efde173c105a851c412f947178Chong Zhang msg->setInt32("generation", mFetchSubtitleDataGeneration); 140dcb89b3b505522efde173c105a851c412f947178Chong Zhang msg->post(); 141dcb89b3b505522efde173c105a851c412f947178Chong Zhang } 142dcb89b3b505522efde173c105a851c412f947178Chong Zhang } 143dcb89b3b505522efde173c105a851c412f947178Chong Zhang 144dcb89b3b505522efde173c105a851c412f947178Chong Zhang // LiveSession::selectTrack returns BAD_VALUE when selecting the currently 145dcb89b3b505522efde173c105a851c412f947178Chong Zhang // selected track, or unselecting a non-selected track. In this case it's an 146dcb89b3b505522efde173c105a851c412f947178Chong Zhang // no-op so we return OK. 147dcb89b3b505522efde173c105a851c412f947178Chong Zhang return (err == OK || err == BAD_VALUE) ? OK : err; 148dcb89b3b505522efde173c105a851c412f947178Chong Zhang} 149dcb89b3b505522efde173c105a851c412f947178Chong Zhang 15043c3e6ce02215ca99d506458f596cb1211639f29Andreas Huberstatus_t NuPlayer::HTTPLiveSource::seekTo(int64_t seekTimeUs) { 15114f7672b5d450ed26a06fd3bb3ce045ea78b11b2Andreas Huber return mLiveSession->seekTo(seekTimeUs); 15243c3e6ce02215ca99d506458f596cb1211639f29Andreas Huber} 15343c3e6ce02215ca99d506458f596cb1211639f29Andreas Huber 1540df36ec3303c2c6bf9b42c07945ac8bd234153f3Andreas Hubervoid NuPlayer::HTTPLiveSource::onMessageReceived(const sp<AMessage> &msg) { 1550df36ec3303c2c6bf9b42c07945ac8bd234153f3Andreas Huber switch (msg->what()) { 1560df36ec3303c2c6bf9b42c07945ac8bd234153f3Andreas Huber case kWhatSessionNotify: 1570df36ec3303c2c6bf9b42c07945ac8bd234153f3Andreas Huber { 1580df36ec3303c2c6bf9b42c07945ac8bd234153f3Andreas Huber onSessionNotify(msg); 1590df36ec3303c2c6bf9b42c07945ac8bd234153f3Andreas Huber break; 1600df36ec3303c2c6bf9b42c07945ac8bd234153f3Andreas Huber } 1610df36ec3303c2c6bf9b42c07945ac8bd234153f3Andreas Huber 162dcb89b3b505522efde173c105a851c412f947178Chong Zhang case kWhatFetchSubtitleData: 163dcb89b3b505522efde173c105a851c412f947178Chong Zhang { 164dcb89b3b505522efde173c105a851c412f947178Chong Zhang int32_t generation; 165dcb89b3b505522efde173c105a851c412f947178Chong Zhang CHECK(msg->findInt32("generation", &generation)); 166dcb89b3b505522efde173c105a851c412f947178Chong Zhang 167dcb89b3b505522efde173c105a851c412f947178Chong Zhang if (generation != mFetchSubtitleDataGeneration) { 168dcb89b3b505522efde173c105a851c412f947178Chong Zhang // stale 169dcb89b3b505522efde173c105a851c412f947178Chong Zhang break; 170dcb89b3b505522efde173c105a851c412f947178Chong Zhang } 171dcb89b3b505522efde173c105a851c412f947178Chong Zhang 172dcb89b3b505522efde173c105a851c412f947178Chong Zhang sp<ABuffer> buffer; 173dcb89b3b505522efde173c105a851c412f947178Chong Zhang if (mLiveSession->dequeueAccessUnit( 174dcb89b3b505522efde173c105a851c412f947178Chong Zhang LiveSession::STREAMTYPE_SUBTITLES, &buffer) == OK) { 175dcb89b3b505522efde173c105a851c412f947178Chong Zhang sp<AMessage> notify = dupNotify(); 176dcb89b3b505522efde173c105a851c412f947178Chong Zhang notify->setInt32("what", kWhatSubtitleData); 177dcb89b3b505522efde173c105a851c412f947178Chong Zhang notify->setBuffer("buffer", buffer); 178dcb89b3b505522efde173c105a851c412f947178Chong Zhang notify->post(); 179dcb89b3b505522efde173c105a851c412f947178Chong Zhang 180dcb89b3b505522efde173c105a851c412f947178Chong Zhang int64_t timeUs, baseUs, durationUs, delayUs; 181dcb89b3b505522efde173c105a851c412f947178Chong Zhang CHECK(buffer->meta()->findInt64("baseUs", &baseUs)); 182dcb89b3b505522efde173c105a851c412f947178Chong Zhang CHECK(buffer->meta()->findInt64("timeUs", &timeUs)); 183dcb89b3b505522efde173c105a851c412f947178Chong Zhang CHECK(buffer->meta()->findInt64("durationUs", &durationUs)); 184dcb89b3b505522efde173c105a851c412f947178Chong Zhang delayUs = baseUs + timeUs - ALooper::GetNowUs(); 185dcb89b3b505522efde173c105a851c412f947178Chong Zhang 186dcb89b3b505522efde173c105a851c412f947178Chong Zhang msg->post(delayUs > 0ll ? delayUs : 0ll); 187dcb89b3b505522efde173c105a851c412f947178Chong Zhang } else { 188dcb89b3b505522efde173c105a851c412f947178Chong Zhang // try again in 1 second 189dcb89b3b505522efde173c105a851c412f947178Chong Zhang msg->post(1000000ll); 190dcb89b3b505522efde173c105a851c412f947178Chong Zhang } 191dcb89b3b505522efde173c105a851c412f947178Chong Zhang 192dcb89b3b505522efde173c105a851c412f947178Chong Zhang break; 193dcb89b3b505522efde173c105a851c412f947178Chong Zhang } 194dcb89b3b505522efde173c105a851c412f947178Chong Zhang 1950df36ec3303c2c6bf9b42c07945ac8bd234153f3Andreas Huber default: 1960df36ec3303c2c6bf9b42c07945ac8bd234153f3Andreas Huber Source::onMessageReceived(msg); 1970df36ec3303c2c6bf9b42c07945ac8bd234153f3Andreas Huber break; 1980df36ec3303c2c6bf9b42c07945ac8bd234153f3Andreas Huber } 1990df36ec3303c2c6bf9b42c07945ac8bd234153f3Andreas Huber} 2000df36ec3303c2c6bf9b42c07945ac8bd234153f3Andreas Huber 2010df36ec3303c2c6bf9b42c07945ac8bd234153f3Andreas Hubervoid NuPlayer::HTTPLiveSource::onSessionNotify(const sp<AMessage> &msg) { 2020df36ec3303c2c6bf9b42c07945ac8bd234153f3Andreas Huber int32_t what; 2030df36ec3303c2c6bf9b42c07945ac8bd234153f3Andreas Huber CHECK(msg->findInt32("what", &what)); 2040df36ec3303c2c6bf9b42c07945ac8bd234153f3Andreas Huber 2050df36ec3303c2c6bf9b42c07945ac8bd234153f3Andreas Huber switch (what) { 2060df36ec3303c2c6bf9b42c07945ac8bd234153f3Andreas Huber case LiveSession::kWhatPrepared: 2070df36ec3303c2c6bf9b42c07945ac8bd234153f3Andreas Huber { 2083e518fd5d679abb83b654e473ea0fa5f7f16235fMarco Nelissen // notify the current size here if we have it, otherwise report an initial size of (0,0) 2093e518fd5d679abb83b654e473ea0fa5f7f16235fMarco Nelissen sp<AMessage> format = getFormat(false /* audio */); 2103e518fd5d679abb83b654e473ea0fa5f7f16235fMarco Nelissen int32_t width; 2113e518fd5d679abb83b654e473ea0fa5f7f16235fMarco Nelissen int32_t height; 2123e518fd5d679abb83b654e473ea0fa5f7f16235fMarco Nelissen if (format != NULL && 2133e518fd5d679abb83b654e473ea0fa5f7f16235fMarco Nelissen format->findInt32("width", &width) && format->findInt32("height", &height)) { 2143e518fd5d679abb83b654e473ea0fa5f7f16235fMarco Nelissen notifyVideoSizeChanged(width, height); 2153e518fd5d679abb83b654e473ea0fa5f7f16235fMarco Nelissen } else { 2163e518fd5d679abb83b654e473ea0fa5f7f16235fMarco Nelissen notifyVideoSizeChanged(0, 0); 2173e518fd5d679abb83b654e473ea0fa5f7f16235fMarco Nelissen } 2180df36ec3303c2c6bf9b42c07945ac8bd234153f3Andreas Huber 2190df36ec3303c2c6bf9b42c07945ac8bd234153f3Andreas Huber uint32_t flags = FLAG_CAN_PAUSE; 2200df36ec3303c2c6bf9b42c07945ac8bd234153f3Andreas Huber if (mLiveSession->isSeekable()) { 2210df36ec3303c2c6bf9b42c07945ac8bd234153f3Andreas Huber flags |= FLAG_CAN_SEEK; 2220df36ec3303c2c6bf9b42c07945ac8bd234153f3Andreas Huber flags |= FLAG_CAN_SEEK_BACKWARD; 2230df36ec3303c2c6bf9b42c07945ac8bd234153f3Andreas Huber flags |= FLAG_CAN_SEEK_FORWARD; 2240df36ec3303c2c6bf9b42c07945ac8bd234153f3Andreas Huber } 2250df36ec3303c2c6bf9b42c07945ac8bd234153f3Andreas Huber 2260df36ec3303c2c6bf9b42c07945ac8bd234153f3Andreas Huber if (mLiveSession->hasDynamicDuration()) { 2270df36ec3303c2c6bf9b42c07945ac8bd234153f3Andreas Huber flags |= FLAG_DYNAMIC_DURATION; 2280df36ec3303c2c6bf9b42c07945ac8bd234153f3Andreas Huber } 2290df36ec3303c2c6bf9b42c07945ac8bd234153f3Andreas Huber 2300df36ec3303c2c6bf9b42c07945ac8bd234153f3Andreas Huber notifyFlagsChanged(flags); 2310df36ec3303c2c6bf9b42c07945ac8bd234153f3Andreas Huber 2320df36ec3303c2c6bf9b42c07945ac8bd234153f3Andreas Huber notifyPrepared(); 2330df36ec3303c2c6bf9b42c07945ac8bd234153f3Andreas Huber break; 2340df36ec3303c2c6bf9b42c07945ac8bd234153f3Andreas Huber } 2350df36ec3303c2c6bf9b42c07945ac8bd234153f3Andreas Huber 2360df36ec3303c2c6bf9b42c07945ac8bd234153f3Andreas Huber case LiveSession::kWhatPreparationFailed: 2370df36ec3303c2c6bf9b42c07945ac8bd234153f3Andreas Huber { 2380df36ec3303c2c6bf9b42c07945ac8bd234153f3Andreas Huber status_t err; 2390df36ec3303c2c6bf9b42c07945ac8bd234153f3Andreas Huber CHECK(msg->findInt32("err", &err)); 2400df36ec3303c2c6bf9b42c07945ac8bd234153f3Andreas Huber 2410df36ec3303c2c6bf9b42c07945ac8bd234153f3Andreas Huber notifyPrepared(err); 2420df36ec3303c2c6bf9b42c07945ac8bd234153f3Andreas Huber break; 2430df36ec3303c2c6bf9b42c07945ac8bd234153f3Andreas Huber } 2440df36ec3303c2c6bf9b42c07945ac8bd234153f3Andreas Huber 24514f7672b5d450ed26a06fd3bb3ce045ea78b11b2Andreas Huber case LiveSession::kWhatStreamsChanged: 24614f7672b5d450ed26a06fd3bb3ce045ea78b11b2Andreas Huber { 24714f7672b5d450ed26a06fd3bb3ce045ea78b11b2Andreas Huber uint32_t changedMask; 24814f7672b5d450ed26a06fd3bb3ce045ea78b11b2Andreas Huber CHECK(msg->findInt32( 24914f7672b5d450ed26a06fd3bb3ce045ea78b11b2Andreas Huber "changedMask", (int32_t *)&changedMask)); 25014f7672b5d450ed26a06fd3bb3ce045ea78b11b2Andreas Huber 25114f7672b5d450ed26a06fd3bb3ce045ea78b11b2Andreas Huber bool audio = changedMask & LiveSession::STREAMTYPE_AUDIO; 25214f7672b5d450ed26a06fd3bb3ce045ea78b11b2Andreas Huber bool video = changedMask & LiveSession::STREAMTYPE_VIDEO; 25314f7672b5d450ed26a06fd3bb3ce045ea78b11b2Andreas Huber 25414f7672b5d450ed26a06fd3bb3ce045ea78b11b2Andreas Huber sp<AMessage> reply; 25514f7672b5d450ed26a06fd3bb3ce045ea78b11b2Andreas Huber CHECK(msg->findMessage("reply", &reply)); 25614f7672b5d450ed26a06fd3bb3ce045ea78b11b2Andreas Huber 25714f7672b5d450ed26a06fd3bb3ce045ea78b11b2Andreas Huber sp<AMessage> notify = dupNotify(); 25814f7672b5d450ed26a06fd3bb3ce045ea78b11b2Andreas Huber notify->setInt32("what", kWhatQueueDecoderShutdown); 25914f7672b5d450ed26a06fd3bb3ce045ea78b11b2Andreas Huber notify->setInt32("audio", audio); 26014f7672b5d450ed26a06fd3bb3ce045ea78b11b2Andreas Huber notify->setInt32("video", video); 26114f7672b5d450ed26a06fd3bb3ce045ea78b11b2Andreas Huber notify->setMessage("reply", reply); 26214f7672b5d450ed26a06fd3bb3ce045ea78b11b2Andreas Huber notify->post(); 26314f7672b5d450ed26a06fd3bb3ce045ea78b11b2Andreas Huber break; 26414f7672b5d450ed26a06fd3bb3ce045ea78b11b2Andreas Huber } 26514f7672b5d450ed26a06fd3bb3ce045ea78b11b2Andreas Huber 26614f7672b5d450ed26a06fd3bb3ce045ea78b11b2Andreas Huber case LiveSession::kWhatError: 26714f7672b5d450ed26a06fd3bb3ce045ea78b11b2Andreas Huber { 26814f7672b5d450ed26a06fd3bb3ce045ea78b11b2Andreas Huber break; 26914f7672b5d450ed26a06fd3bb3ce045ea78b11b2Andreas Huber } 27014f7672b5d450ed26a06fd3bb3ce045ea78b11b2Andreas Huber 2710df36ec3303c2c6bf9b42c07945ac8bd234153f3Andreas Huber default: 2720df36ec3303c2c6bf9b42c07945ac8bd234153f3Andreas Huber TRESPASS(); 2730df36ec3303c2c6bf9b42c07945ac8bd234153f3Andreas Huber } 2740df36ec3303c2c6bf9b42c07945ac8bd234153f3Andreas Huber} 2750df36ec3303c2c6bf9b42c07945ac8bd234153f3Andreas Huber 2765bc087c573c70c84c6a39946457590b42d392a33Andreas Huber} // namespace android 2775bc087c573c70c84c6a39946457590b42d392a33Andreas Huber 278