AwesomePlayer.cpp revision b5ce361d19e69fe156f7188c9ee0f4734b259874
1bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber/* 2bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber * Copyright (C) 2009 The Android Open Source Project 3bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber * 4bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber * Licensed under the Apache License, Version 2.0 (the "License"); 5bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber * you may not use this file except in compliance with the License. 6bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber * You may obtain a copy of the License at 7bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber * 8bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber * http://www.apache.org/licenses/LICENSE-2.0 9bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber * 10bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber * Unless required by applicable law or agreed to in writing, software 11bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber * distributed under the License is distributed on an "AS IS" BASIS, 12bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber * See the License for the specific language governing permissions and 14bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber * limitations under the License. 15bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber */ 16bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber 17bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber//#define LOG_NDEBUG 0 18bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber#define LOG_TAG "AwesomePlayer" 19bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber#include <utils/Log.h> 20bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber 21988e3f0b2c74095deae580157c57935a98573052Andreas Huber#include <dlfcn.h> 22988e3f0b2c74095deae580157c57935a98573052Andreas Huber 23cf7b9c7aae758ac0b99833915053c63c2ac46e09Andreas Huber#include "include/ARTSPController.h" 24bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber#include "include/AwesomePlayer.h" 25733b7729ea462fae9c6899456444e28fef1c757cAndreas Huber#include "include/SoftwareRenderer.h" 260a5baa9b411fe086013d2a5e9126ed63fbad046cAndreas Huber#include "include/NuCachedSource2.h" 270a5baa9b411fe086013d2a5e9126ed63fbad046cAndreas Huber#include "include/ThrottledSource.h" 28bff07d0b22a5ee2d9f044f6cb5e4be1532017ab0Andreas Huber#include "include/MPEG2TSExtractor.h" 29bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber 304844ac54e8b5997c3b03872dbafe8ebed4787517Andreas Huber#include <binder/IPCThreadState.h> 317cf180c9bff69e5cc4a2f4e53b432db45ebbebabGloria Wang#include <binder/IServiceManager.h> 327cf180c9bff69e5cc4a2f4e53b432db45ebbebabGloria Wang#include <media/IMediaPlayerService.h> 33e2b1028852120bcfded33b8f06f66b780437fe92Andreas Huber#include <media/stagefright/foundation/hexdump.h> 34e2b1028852120bcfded33b8f06f66b780437fe92Andreas Huber#include <media/stagefright/foundation/ADebug.h> 35bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber#include <media/stagefright/AudioPlayer.h> 36bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber#include <media/stagefright/DataSource.h> 37bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber#include <media/stagefright/FileSource.h> 38bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber#include <media/stagefright/MediaBuffer.h> 39717826ececd8d39596f62418677721d70776add1Andreas Huber#include <media/stagefright/MediaDefs.h> 40bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber#include <media/stagefright/MediaExtractor.h> 41bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber#include <media/stagefright/MediaSource.h> 42bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber#include <media/stagefright/MetaData.h> 43bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber#include <media/stagefright/OMXCodec.h> 44717826ececd8d39596f62418677721d70776add1Andreas Huber 455daeb129a2c2ba3d14ccd94af283b5f561c783eaAndreas Huber#include <surfaceflinger/Surface.h> 461173118eace0e9e347cb007f0da817cee87579edGlenn Kasten#include <gui/ISurfaceTexture.h> 471173118eace0e9e347cb007f0da817cee87579edGlenn Kasten#include <gui/SurfaceTextureClient.h> 483cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian 49cf7b9c7aae758ac0b99833915053c63c2ac46e09Andreas Huber#include <media/stagefright/foundation/ALooper.h> 5014acc736e336cbd6026df781d4f411e908831815Andreas Huber#include <media/stagefright/foundation/AMessage.h> 51e71d10e7ad55ccbcb0756c007caef1c959090384Andreas Huber 52e332a9181cf6a3155ed1a0fd2afc212ccb1f2753Andreas Huber#define USE_SURFACE_ALLOC 1 5364bb6983690bf994d904591145a3cdd6373bdbe6Andreas Huber#define FRAME_DROP_FREQ 0 54e332a9181cf6a3155ed1a0fd2afc212ccb1f2753Andreas Huber 55bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Hubernamespace android { 56bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber 578650e1960905097f6f1d6aa462ccb1c93c656834Andreas Huberstatic int64_t kLowWaterMarkUs = 2000000ll; // 2secs 588650e1960905097f6f1d6aa462ccb1c93c656834Andreas Huberstatic int64_t kHighWaterMarkUs = 10000000ll; // 10secs 59100a4408968b90e314526185d572c72ea4cc784aAndreas Huberstatic int64_t kHighWaterMarkRTSPUs = 4000000ll; // 4secs 60ac05c317cd818701535c5d72ce90da98c4bae75bAndreas Huberstatic const size_t kLowWaterMarkBytes = 40000; 61ac05c317cd818701535c5d72ce90da98c4bae75bAndreas Huberstatic const size_t kHighWaterMarkBytes = 200000; 628650e1960905097f6f1d6aa462ccb1c93c656834Andreas Huber 63bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huberstruct AwesomeEvent : public TimedEventQueue::Event { 64c23f12af0394aa2f6651968a3c8840f1af317aa1Andreas Huber AwesomeEvent( 65c23f12af0394aa2f6651968a3c8840f1af317aa1Andreas Huber AwesomePlayer *player, 66c23f12af0394aa2f6651968a3c8840f1af317aa1Andreas Huber void (AwesomePlayer::*method)()) 67bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber : mPlayer(player), 68c23f12af0394aa2f6651968a3c8840f1af317aa1Andreas Huber mMethod(method) { 69bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber } 70bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber 71bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huberprotected: 72bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber virtual ~AwesomeEvent() {} 73bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber 74bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber virtual void fire(TimedEventQueue *queue, int64_t /* now_us */) { 75c23f12af0394aa2f6651968a3c8840f1af317aa1Andreas Huber (mPlayer->*mMethod)(); 76bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber } 77bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber 78bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huberprivate: 79bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber AwesomePlayer *mPlayer; 80c23f12af0394aa2f6651968a3c8840f1af317aa1Andreas Huber void (AwesomePlayer::*mMethod)(); 81bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber 82bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber AwesomeEvent(const AwesomeEvent &); 83bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber AwesomeEvent &operator=(const AwesomeEvent &); 84bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber}; 85bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber 86733b7729ea462fae9c6899456444e28fef1c757cAndreas Huberstruct AwesomeLocalRenderer : public AwesomeRenderer { 87733b7729ea462fae9c6899456444e28fef1c757cAndreas Huber AwesomeLocalRenderer( 881173118eace0e9e347cb007f0da817cee87579edGlenn Kasten const sp<ANativeWindow> &nativeWindow, const sp<MetaData> &meta) 891173118eace0e9e347cb007f0da817cee87579edGlenn Kasten : mTarget(new SoftwareRenderer(nativeWindow, meta)) { 90733b7729ea462fae9c6899456444e28fef1c757cAndreas Huber } 91733b7729ea462fae9c6899456444e28fef1c757cAndreas Huber 92733b7729ea462fae9c6899456444e28fef1c757cAndreas Huber virtual void render(MediaBuffer *buffer) { 93fa090f541bb84a546af2ec834e91a032ff10e66eAndreas Huber render((const uint8_t *)buffer->data() + buffer->range_offset(), 94fa090f541bb84a546af2ec834e91a032ff10e66eAndreas Huber buffer->range_length()); 95fa090f541bb84a546af2ec834e91a032ff10e66eAndreas Huber } 96fa090f541bb84a546af2ec834e91a032ff10e66eAndreas Huber 97fa090f541bb84a546af2ec834e91a032ff10e66eAndreas Huber void render(const void *data, size_t size) { 98fa090f541bb84a546af2ec834e91a032ff10e66eAndreas Huber mTarget->render(data, size, NULL); 99733b7729ea462fae9c6899456444e28fef1c757cAndreas Huber } 100733b7729ea462fae9c6899456444e28fef1c757cAndreas Huber 101733b7729ea462fae9c6899456444e28fef1c757cAndreas Huberprotected: 102733b7729ea462fae9c6899456444e28fef1c757cAndreas Huber virtual ~AwesomeLocalRenderer() { 103733b7729ea462fae9c6899456444e28fef1c757cAndreas Huber delete mTarget; 104733b7729ea462fae9c6899456444e28fef1c757cAndreas Huber mTarget = NULL; 105733b7729ea462fae9c6899456444e28fef1c757cAndreas Huber } 106733b7729ea462fae9c6899456444e28fef1c757cAndreas Huber 107733b7729ea462fae9c6899456444e28fef1c757cAndreas Huberprivate: 1080a5ca668c6f7d45706e9aec4a1dfec0aacc6d233Andreas Huber SoftwareRenderer *mTarget; 109988e3f0b2c74095deae580157c57935a98573052Andreas Huber 110733b7729ea462fae9c6899456444e28fef1c757cAndreas Huber AwesomeLocalRenderer(const AwesomeLocalRenderer &); 111733b7729ea462fae9c6899456444e28fef1c757cAndreas Huber AwesomeLocalRenderer &operator=(const AwesomeLocalRenderer &);; 112733b7729ea462fae9c6899456444e28fef1c757cAndreas Huber}; 113733b7729ea462fae9c6899456444e28fef1c757cAndreas Huber 1146a9da9fc558263548ebfbae2cbf177eb7454a41bJamie Gennisstruct AwesomeNativeWindowRenderer : public AwesomeRenderer { 115ba529e486dde15fe75ea1b48570f9d60a4cf3c48Andreas Huber AwesomeNativeWindowRenderer( 116ba529e486dde15fe75ea1b48570f9d60a4cf3c48Andreas Huber const sp<ANativeWindow> &nativeWindow, 117ba529e486dde15fe75ea1b48570f9d60a4cf3c48Andreas Huber int32_t rotationDegrees) 1186a9da9fc558263548ebfbae2cbf177eb7454a41bJamie Gennis : mNativeWindow(nativeWindow) { 119ba529e486dde15fe75ea1b48570f9d60a4cf3c48Andreas Huber applyRotation(rotationDegrees); 1206a9da9fc558263548ebfbae2cbf177eb7454a41bJamie Gennis } 1216a9da9fc558263548ebfbae2cbf177eb7454a41bJamie Gennis 1226a9da9fc558263548ebfbae2cbf177eb7454a41bJamie Gennis virtual void render(MediaBuffer *buffer) { 1236a9da9fc558263548ebfbae2cbf177eb7454a41bJamie Gennis status_t err = mNativeWindow->queueBuffer( 1246a9da9fc558263548ebfbae2cbf177eb7454a41bJamie Gennis mNativeWindow.get(), buffer->graphicBuffer().get()); 1256a9da9fc558263548ebfbae2cbf177eb7454a41bJamie Gennis if (err != 0) { 1266a9da9fc558263548ebfbae2cbf177eb7454a41bJamie Gennis LOGE("queueBuffer failed with error %s (%d)", strerror(-err), 1276a9da9fc558263548ebfbae2cbf177eb7454a41bJamie Gennis -err); 1286a9da9fc558263548ebfbae2cbf177eb7454a41bJamie Gennis return; 1296a9da9fc558263548ebfbae2cbf177eb7454a41bJamie Gennis } 1306a9da9fc558263548ebfbae2cbf177eb7454a41bJamie Gennis 1316a9da9fc558263548ebfbae2cbf177eb7454a41bJamie Gennis sp<MetaData> metaData = buffer->meta_data(); 1326a9da9fc558263548ebfbae2cbf177eb7454a41bJamie Gennis metaData->setInt32(kKeyRendered, 1); 1336a9da9fc558263548ebfbae2cbf177eb7454a41bJamie Gennis } 1346a9da9fc558263548ebfbae2cbf177eb7454a41bJamie Gennis 1356a9da9fc558263548ebfbae2cbf177eb7454a41bJamie Gennisprotected: 1366a9da9fc558263548ebfbae2cbf177eb7454a41bJamie Gennis virtual ~AwesomeNativeWindowRenderer() {} 1376a9da9fc558263548ebfbae2cbf177eb7454a41bJamie Gennis 1386a9da9fc558263548ebfbae2cbf177eb7454a41bJamie Gennisprivate: 1396a9da9fc558263548ebfbae2cbf177eb7454a41bJamie Gennis sp<ANativeWindow> mNativeWindow; 1406a9da9fc558263548ebfbae2cbf177eb7454a41bJamie Gennis 141ba529e486dde15fe75ea1b48570f9d60a4cf3c48Andreas Huber void applyRotation(int32_t rotationDegrees) { 142ba529e486dde15fe75ea1b48570f9d60a4cf3c48Andreas Huber uint32_t transform; 143ba529e486dde15fe75ea1b48570f9d60a4cf3c48Andreas Huber switch (rotationDegrees) { 144ba529e486dde15fe75ea1b48570f9d60a4cf3c48Andreas Huber case 0: transform = 0; break; 145ba529e486dde15fe75ea1b48570f9d60a4cf3c48Andreas Huber case 90: transform = HAL_TRANSFORM_ROT_90; break; 146ba529e486dde15fe75ea1b48570f9d60a4cf3c48Andreas Huber case 180: transform = HAL_TRANSFORM_ROT_180; break; 147ba529e486dde15fe75ea1b48570f9d60a4cf3c48Andreas Huber case 270: transform = HAL_TRANSFORM_ROT_270; break; 148ba529e486dde15fe75ea1b48570f9d60a4cf3c48Andreas Huber default: transform = 0; break; 149ba529e486dde15fe75ea1b48570f9d60a4cf3c48Andreas Huber } 150ba529e486dde15fe75ea1b48570f9d60a4cf3c48Andreas Huber 151ba529e486dde15fe75ea1b48570f9d60a4cf3c48Andreas Huber if (transform) { 152ba529e486dde15fe75ea1b48570f9d60a4cf3c48Andreas Huber CHECK_EQ(0, native_window_set_buffers_transform( 153ba529e486dde15fe75ea1b48570f9d60a4cf3c48Andreas Huber mNativeWindow.get(), transform)); 154ba529e486dde15fe75ea1b48570f9d60a4cf3c48Andreas Huber } 155ba529e486dde15fe75ea1b48570f9d60a4cf3c48Andreas Huber } 156ba529e486dde15fe75ea1b48570f9d60a4cf3c48Andreas Huber 1576a9da9fc558263548ebfbae2cbf177eb7454a41bJamie Gennis AwesomeNativeWindowRenderer(const AwesomeNativeWindowRenderer &); 1586a9da9fc558263548ebfbae2cbf177eb7454a41bJamie Gennis AwesomeNativeWindowRenderer &operator=( 1596a9da9fc558263548ebfbae2cbf177eb7454a41bJamie Gennis const AwesomeNativeWindowRenderer &); 1606a9da9fc558263548ebfbae2cbf177eb7454a41bJamie Gennis}; 1616a9da9fc558263548ebfbae2cbf177eb7454a41bJamie Gennis 1627cf180c9bff69e5cc4a2f4e53b432db45ebbebabGloria Wang// To collect the decoder usage 1637cf180c9bff69e5cc4a2f4e53b432db45ebbebabGloria Wangvoid addBatteryData(uint32_t params) { 1647cf180c9bff69e5cc4a2f4e53b432db45ebbebabGloria Wang sp<IBinder> binder = 1657cf180c9bff69e5cc4a2f4e53b432db45ebbebabGloria Wang defaultServiceManager()->getService(String16("media.player")); 1667cf180c9bff69e5cc4a2f4e53b432db45ebbebabGloria Wang sp<IMediaPlayerService> service = interface_cast<IMediaPlayerService>(binder); 1677cf180c9bff69e5cc4a2f4e53b432db45ebbebabGloria Wang CHECK(service.get() != NULL); 1687cf180c9bff69e5cc4a2f4e53b432db45ebbebabGloria Wang 1697cf180c9bff69e5cc4a2f4e53b432db45ebbebabGloria Wang service->addBatteryData(params); 1707cf180c9bff69e5cc4a2f4e53b432db45ebbebabGloria Wang} 171e2b1028852120bcfded33b8f06f66b780437fe92Andreas Huber 1727cf180c9bff69e5cc4a2f4e53b432db45ebbebabGloria Wang//////////////////////////////////////////////////////////////////////////////// 173bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas HuberAwesomePlayer::AwesomePlayer() 1742e8ffaf95bd35358ecd14ddf00cddaf3abefe0a9Andreas Huber : mQueueStarted(false), 1752e8ffaf95bd35358ecd14ddf00cddaf3abefe0a9Andreas Huber mTimeSource(NULL), 176fa090f541bb84a546af2ec834e91a032ff10e66eAndreas Huber mVideoRendererIsPreview(false), 177bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber mAudioPlayer(NULL), 178b45c01c2b8588ff431b511151666a55a39f0a6aeJames Dong mDisplayWidth(0), 179b45c01c2b8588ff431b511151666a55a39f0a6aeJames Dong mDisplayHeight(0), 180bd22c52280179b29eefac91ef7e7bbbc33d25904Andreas Huber mFlags(0), 181acdd9d0f59c3d8bdc3de80664a609527ec3d21e2Andreas Huber mExtractorFlags(0), 1827b3396acc702451be9bafb19d7fe26d55d43a316Andreas Huber mVideoBuffer(NULL), 183dcd25efb46c41c8d24a0a9cf61fb57f84149709eGloria Wang mDecryptHandle(NULL) { 184e2b1028852120bcfded33b8f06f66b780437fe92Andreas Huber CHECK_EQ(mClient.connect(), (status_t)OK); 185bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber 186bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber DataSource::RegisterDefaultSniffers(); 187bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber 188c23f12af0394aa2f6651968a3c8840f1af317aa1Andreas Huber mVideoEvent = new AwesomeEvent(this, &AwesomePlayer::onVideoEvent); 189bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber mVideoEventPending = false; 190c23f12af0394aa2f6651968a3c8840f1af317aa1Andreas Huber mStreamDoneEvent = new AwesomeEvent(this, &AwesomePlayer::onStreamDone); 191bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber mStreamDoneEventPending = false; 192c23f12af0394aa2f6651968a3c8840f1af317aa1Andreas Huber mBufferingEvent = new AwesomeEvent(this, &AwesomePlayer::onBufferingUpdate); 19366b0a35c9a4136a84c3f73b1b25fcb5220138b95Andreas Huber mBufferingEventPending = false; 194145e68fc778275963189b02a1adcbe27cce4d769Andreas Huber mVideoLagEvent = new AwesomeEvent(this, &AwesomePlayer::onVideoLagUpdate); 195145e68fc778275963189b02a1adcbe27cce4d769Andreas Huber mVideoEventPending = false; 196c23f12af0394aa2f6651968a3c8840f1af317aa1Andreas Huber 197c23f12af0394aa2f6651968a3c8840f1af317aa1Andreas Huber mCheckAudioStatusEvent = new AwesomeEvent( 198c23f12af0394aa2f6651968a3c8840f1af317aa1Andreas Huber this, &AwesomePlayer::onCheckAudioStatus); 199c23f12af0394aa2f6651968a3c8840f1af317aa1Andreas Huber 2001862a33b246249630b654182afb5914da3480d4cAndreas Huber mAudioStatusEventPending = false; 201bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber 202bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber reset(); 203bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber} 204bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber 205bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas HuberAwesomePlayer::~AwesomePlayer() { 2062e8ffaf95bd35358ecd14ddf00cddaf3abefe0a9Andreas Huber if (mQueueStarted) { 2072e8ffaf95bd35358ecd14ddf00cddaf3abefe0a9Andreas Huber mQueue.stop(); 2082e8ffaf95bd35358ecd14ddf00cddaf3abefe0a9Andreas Huber } 209bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber 210bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber reset(); 211bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber 212bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber mClient.disconnect(); 213bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber} 214bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber 21566b0a35c9a4136a84c3f73b1b25fcb5220138b95Andreas Hubervoid AwesomePlayer::cancelPlayerEvents(bool keepBufferingGoing) { 216bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber mQueue.cancelEvent(mVideoEvent->eventID()); 217bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber mVideoEventPending = false; 218bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber mQueue.cancelEvent(mStreamDoneEvent->eventID()); 219bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber mStreamDoneEventPending = false; 2201862a33b246249630b654182afb5914da3480d4cAndreas Huber mQueue.cancelEvent(mCheckAudioStatusEvent->eventID()); 2211862a33b246249630b654182afb5914da3480d4cAndreas Huber mAudioStatusEventPending = false; 222145e68fc778275963189b02a1adcbe27cce4d769Andreas Huber mQueue.cancelEvent(mVideoLagEvent->eventID()); 223145e68fc778275963189b02a1adcbe27cce4d769Andreas Huber mVideoLagEventPending = false; 22466b0a35c9a4136a84c3f73b1b25fcb5220138b95Andreas Huber 22566b0a35c9a4136a84c3f73b1b25fcb5220138b95Andreas Huber if (!keepBufferingGoing) { 22666b0a35c9a4136a84c3f73b1b25fcb5220138b95Andreas Huber mQueue.cancelEvent(mBufferingEvent->eventID()); 22766b0a35c9a4136a84c3f73b1b25fcb5220138b95Andreas Huber mBufferingEventPending = false; 22866b0a35c9a4136a84c3f73b1b25fcb5220138b95Andreas Huber } 229bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber} 230bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber 2310726045216f576e97672ebeefc265d39c4ebaaa5Andreas Hubervoid AwesomePlayer::setListener(const wp<MediaPlayerBase> &listener) { 232bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber Mutex::Autolock autoLock(mLock); 233bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber mListener = listener; 234bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber} 235bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber 2365561ccf4a8db88a2e44eac1b3ed13b4ff53a7f20Andreas Huberstatus_t AwesomePlayer::setDataSource( 2375561ccf4a8db88a2e44eac1b3ed13b4ff53a7f20Andreas Huber const char *uri, const KeyedVector<String8, String8> *headers) { 238bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber Mutex::Autolock autoLock(mLock); 2397b3396acc702451be9bafb19d7fe26d55d43a316Andreas Huber return setDataSource_l(uri, headers); 2407b3396acc702451be9bafb19d7fe26d55d43a316Andreas Huber} 241bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber 2427b3396acc702451be9bafb19d7fe26d55d43a316Andreas Huberstatus_t AwesomePlayer::setDataSource_l( 2437b3396acc702451be9bafb19d7fe26d55d43a316Andreas Huber const char *uri, const KeyedVector<String8, String8> *headers) { 244bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber reset_l(); 245bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber 246bd22c52280179b29eefac91ef7e7bbbc33d25904Andreas Huber mUri = uri; 24766b0a35c9a4136a84c3f73b1b25fcb5220138b95Andreas Huber 248bd22c52280179b29eefac91ef7e7bbbc33d25904Andreas Huber if (headers) { 249bd22c52280179b29eefac91ef7e7bbbc33d25904Andreas Huber mUriHeaders = *headers; 2507314fa17093d514199fedcb55ac41136a1b31cb3Andreas Huber 2517314fa17093d514199fedcb55ac41136a1b31cb3Andreas Huber ssize_t index = mUriHeaders.indexOfKey(String8("x-hide-urls-from-log")); 2527314fa17093d514199fedcb55ac41136a1b31cb3Andreas Huber if (index >= 0) { 2537314fa17093d514199fedcb55ac41136a1b31cb3Andreas Huber // Browser is in "incognito" mode, suppress logging URLs. 2547314fa17093d514199fedcb55ac41136a1b31cb3Andreas Huber 2557314fa17093d514199fedcb55ac41136a1b31cb3Andreas Huber // This isn't something that should be passed to the server. 2567314fa17093d514199fedcb55ac41136a1b31cb3Andreas Huber mUriHeaders.removeItemsAt(index); 2577314fa17093d514199fedcb55ac41136a1b31cb3Andreas Huber 2587314fa17093d514199fedcb55ac41136a1b31cb3Andreas Huber mFlags |= INCOGNITO; 2597314fa17093d514199fedcb55ac41136a1b31cb3Andreas Huber } 2607314fa17093d514199fedcb55ac41136a1b31cb3Andreas Huber } 2617314fa17093d514199fedcb55ac41136a1b31cb3Andreas Huber 2627314fa17093d514199fedcb55ac41136a1b31cb3Andreas Huber if (!(mFlags & INCOGNITO)) { 2637314fa17093d514199fedcb55ac41136a1b31cb3Andreas Huber LOGI("setDataSource_l('%s')", mUri.string()); 2647314fa17093d514199fedcb55ac41136a1b31cb3Andreas Huber } else { 2657314fa17093d514199fedcb55ac41136a1b31cb3Andreas Huber LOGI("setDataSource_l(URL suppressed)"); 26666b0a35c9a4136a84c3f73b1b25fcb5220138b95Andreas Huber } 26766b0a35c9a4136a84c3f73b1b25fcb5220138b95Andreas Huber 268bd22c52280179b29eefac91ef7e7bbbc33d25904Andreas Huber // The actual work will be done during preparation in the call to 269bd22c52280179b29eefac91ef7e7bbbc33d25904Andreas Huber // ::finishSetDataSource_l to avoid blocking the calling thread in 270bd22c52280179b29eefac91ef7e7bbbc33d25904Andreas Huber // setDataSource for any significant time. 27166b0a35c9a4136a84c3f73b1b25fcb5220138b95Andreas Huber 272bd22c52280179b29eefac91ef7e7bbbc33d25904Andreas Huber return OK; 273bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber} 274bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber 275bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huberstatus_t AwesomePlayer::setDataSource( 276bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber int fd, int64_t offset, int64_t length) { 277bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber Mutex::Autolock autoLock(mLock); 278bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber 279bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber reset_l(); 280bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber 2817b3396acc702451be9bafb19d7fe26d55d43a316Andreas Huber sp<DataSource> dataSource = new FileSource(fd, offset, length); 282bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber 2837b3396acc702451be9bafb19d7fe26d55d43a316Andreas Huber status_t err = dataSource->initCheck(); 284bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber 285bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber if (err != OK) { 286bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber return err; 287bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber } 288bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber 2897b3396acc702451be9bafb19d7fe26d55d43a316Andreas Huber mFileSource = dataSource; 2907b3396acc702451be9bafb19d7fe26d55d43a316Andreas Huber 2917b3396acc702451be9bafb19d7fe26d55d43a316Andreas Huber return setDataSource_l(dataSource); 2927b3396acc702451be9bafb19d7fe26d55d43a316Andreas Huber} 2937b3396acc702451be9bafb19d7fe26d55d43a316Andreas Huber 294e2b1028852120bcfded33b8f06f66b780437fe92Andreas Huberstatus_t AwesomePlayer::setDataSource(const sp<IStreamSource> &source) { 29585704836f33a199d7e442a23db82abbd5620d35dAndreas Huber return INVALID_OPERATION; 296e2b1028852120bcfded33b8f06f66b780437fe92Andreas Huber} 297e2b1028852120bcfded33b8f06f66b780437fe92Andreas Huber 2987b3396acc702451be9bafb19d7fe26d55d43a316Andreas Huberstatus_t AwesomePlayer::setDataSource_l( 2997b3396acc702451be9bafb19d7fe26d55d43a316Andreas Huber const sp<DataSource> &dataSource) { 3007b3396acc702451be9bafb19d7fe26d55d43a316Andreas Huber sp<MediaExtractor> extractor = MediaExtractor::Create(dataSource); 301bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber 302bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber if (extractor == NULL) { 303bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber return UNKNOWN_ERROR; 304bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber } 305bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber 306b5ce361d19e69fe156f7188c9ee0f4734b259874Gloria Wang dataSource->getDrmInfo(mDecryptHandle, &mDrmManagerClient); 3078f64134f749e4f7861a08a3063450fc714c4651dGloria Wang if (mDecryptHandle != NULL) { 3088f64134f749e4f7861a08a3063450fc714c4651dGloria Wang CHECK(mDrmManagerClient); 3098f64134f749e4f7861a08a3063450fc714c4651dGloria Wang if (RightsStatus::RIGHTS_VALID != mDecryptHandle->status) { 3108f64134f749e4f7861a08a3063450fc714c4651dGloria Wang notifyListener_l(MEDIA_ERROR, MEDIA_ERROR_UNKNOWN, ERROR_NO_LICENSE); 3118f64134f749e4f7861a08a3063450fc714c4651dGloria Wang } 312dcd25efb46c41c8d24a0a9cf61fb57f84149709eGloria Wang } 313dcd25efb46c41c8d24a0a9cf61fb57f84149709eGloria Wang 314bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber return setDataSource_l(extractor); 315bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber} 316bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber 317bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huberstatus_t AwesomePlayer::setDataSource_l(const sp<MediaExtractor> &extractor) { 3187fbdb0903dfbf70b314a74e64e28fb880cdb9247Andreas Huber // Attempt to approximate overall stream bitrate by summing all 3197fbdb0903dfbf70b314a74e64e28fb880cdb9247Andreas Huber // tracks' individual bitrates, if not all of them advertise bitrate, 3207fbdb0903dfbf70b314a74e64e28fb880cdb9247Andreas Huber // we have to fail. 3217fbdb0903dfbf70b314a74e64e28fb880cdb9247Andreas Huber 3227fbdb0903dfbf70b314a74e64e28fb880cdb9247Andreas Huber int64_t totalBitRate = 0; 3237fbdb0903dfbf70b314a74e64e28fb880cdb9247Andreas Huber 3247fbdb0903dfbf70b314a74e64e28fb880cdb9247Andreas Huber for (size_t i = 0; i < extractor->countTracks(); ++i) { 3257fbdb0903dfbf70b314a74e64e28fb880cdb9247Andreas Huber sp<MetaData> meta = extractor->getTrackMetaData(i); 3267fbdb0903dfbf70b314a74e64e28fb880cdb9247Andreas Huber 3277fbdb0903dfbf70b314a74e64e28fb880cdb9247Andreas Huber int32_t bitrate; 3287fbdb0903dfbf70b314a74e64e28fb880cdb9247Andreas Huber if (!meta->findInt32(kKeyBitRate, &bitrate)) { 3297fbdb0903dfbf70b314a74e64e28fb880cdb9247Andreas Huber totalBitRate = -1; 3307fbdb0903dfbf70b314a74e64e28fb880cdb9247Andreas Huber break; 3317fbdb0903dfbf70b314a74e64e28fb880cdb9247Andreas Huber } 3327fbdb0903dfbf70b314a74e64e28fb880cdb9247Andreas Huber 3337fbdb0903dfbf70b314a74e64e28fb880cdb9247Andreas Huber totalBitRate += bitrate; 3347fbdb0903dfbf70b314a74e64e28fb880cdb9247Andreas Huber } 3357fbdb0903dfbf70b314a74e64e28fb880cdb9247Andreas Huber 3367fbdb0903dfbf70b314a74e64e28fb880cdb9247Andreas Huber mBitrate = totalBitRate; 3377fbdb0903dfbf70b314a74e64e28fb880cdb9247Andreas Huber 3387fbdb0903dfbf70b314a74e64e28fb880cdb9247Andreas Huber LOGV("mBitrate = %lld bits/sec", mBitrate); 3397fbdb0903dfbf70b314a74e64e28fb880cdb9247Andreas Huber 340bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber bool haveAudio = false; 341bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber bool haveVideo = false; 342bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber for (size_t i = 0; i < extractor->countTracks(); ++i) { 343bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber sp<MetaData> meta = extractor->getTrackMetaData(i); 344bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber 345bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber const char *mime; 346bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber CHECK(meta->findCString(kKeyMIMEType, &mime)); 347bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber 348bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber if (!haveVideo && !strncasecmp(mime, "video/", 6)) { 34988d8a83de12592635248aa1a3bd6b9ea46108501Andreas Huber setVideoSource(extractor->getTrack(i)); 35088d8a83de12592635248aa1a3bd6b9ea46108501Andreas Huber haveVideo = true; 351b45c01c2b8588ff431b511151666a55a39f0a6aeJames Dong 352b45c01c2b8588ff431b511151666a55a39f0a6aeJames Dong // Set the presentation/display size 353b45c01c2b8588ff431b511151666a55a39f0a6aeJames Dong int32_t displayWidth, displayHeight; 354b45c01c2b8588ff431b511151666a55a39f0a6aeJames Dong bool success = meta->findInt32(kKeyDisplayWidth, &displayWidth); 355b45c01c2b8588ff431b511151666a55a39f0a6aeJames Dong if (success) { 356b45c01c2b8588ff431b511151666a55a39f0a6aeJames Dong success = meta->findInt32(kKeyDisplayHeight, &displayHeight); 357b45c01c2b8588ff431b511151666a55a39f0a6aeJames Dong } 358b45c01c2b8588ff431b511151666a55a39f0a6aeJames Dong if (success) { 359b45c01c2b8588ff431b511151666a55a39f0a6aeJames Dong mDisplayWidth = displayWidth; 360b45c01c2b8588ff431b511151666a55a39f0a6aeJames Dong mDisplayHeight = displayHeight; 361b45c01c2b8588ff431b511151666a55a39f0a6aeJames Dong } 362b45c01c2b8588ff431b511151666a55a39f0a6aeJames Dong 363bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber } else if (!haveAudio && !strncasecmp(mime, "audio/", 6)) { 36488d8a83de12592635248aa1a3bd6b9ea46108501Andreas Huber setAudioSource(extractor->getTrack(i)); 36588d8a83de12592635248aa1a3bd6b9ea46108501Andreas Huber haveAudio = true; 3668ae49d87b98d57d6758b0c51b95e28a6581a79f1Andreas Huber 3676954535ba64374e4e941cd83019a7af53edfb098Andreas Huber if (!strcasecmp(mime, MEDIA_MIMETYPE_AUDIO_VORBIS)) { 3686954535ba64374e4e941cd83019a7af53edfb098Andreas Huber // Only do this for vorbis audio, none of the other audio 3696954535ba64374e4e941cd83019a7af53edfb098Andreas Huber // formats even support this ringtone specific hack and 3706954535ba64374e4e941cd83019a7af53edfb098Andreas Huber // retrieving the metadata on some extractors may turn out 3716954535ba64374e4e941cd83019a7af53edfb098Andreas Huber // to be very expensive. 3726954535ba64374e4e941cd83019a7af53edfb098Andreas Huber sp<MetaData> fileMeta = extractor->getMetaData(); 3736954535ba64374e4e941cd83019a7af53edfb098Andreas Huber int32_t loop; 3746954535ba64374e4e941cd83019a7af53edfb098Andreas Huber if (fileMeta != NULL 3756954535ba64374e4e941cd83019a7af53edfb098Andreas Huber && fileMeta->findInt32(kKeyAutoLoop, &loop) && loop != 0) { 3766954535ba64374e4e941cd83019a7af53edfb098Andreas Huber mFlags |= AUTO_LOOPING; 3776954535ba64374e4e941cd83019a7af53edfb098Andreas Huber } 3788ae49d87b98d57d6758b0c51b95e28a6581a79f1Andreas Huber } 379bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber } 380bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber 381bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber if (haveAudio && haveVideo) { 382bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber break; 383bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber } 384bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber } 385bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber 386acdd9d0f59c3d8bdc3de80664a609527ec3d21e2Andreas Huber if (!haveAudio && !haveVideo) { 387acdd9d0f59c3d8bdc3de80664a609527ec3d21e2Andreas Huber return UNKNOWN_ERROR; 388acdd9d0f59c3d8bdc3de80664a609527ec3d21e2Andreas Huber } 389acdd9d0f59c3d8bdc3de80664a609527ec3d21e2Andreas Huber 390acdd9d0f59c3d8bdc3de80664a609527ec3d21e2Andreas Huber mExtractorFlags = extractor->flags(); 391acdd9d0f59c3d8bdc3de80664a609527ec3d21e2Andreas Huber 392acdd9d0f59c3d8bdc3de80664a609527ec3d21e2Andreas Huber return OK; 393bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber} 394bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber 395bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Hubervoid AwesomePlayer::reset() { 396bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber Mutex::Autolock autoLock(mLock); 397bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber reset_l(); 398bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber} 399bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber 400bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Hubervoid AwesomePlayer::reset_l() { 401b45c01c2b8588ff431b511151666a55a39f0a6aeJames Dong mDisplayWidth = 0; 402b45c01c2b8588ff431b511151666a55a39f0a6aeJames Dong mDisplayHeight = 0; 40365a170e3ac593a29abd0c76e9aa531fabad7f56dAndreas Huber 404dcd25efb46c41c8d24a0a9cf61fb57f84149709eGloria Wang if (mDecryptHandle != NULL) { 405dcd25efb46c41c8d24a0a9cf61fb57f84149709eGloria Wang mDrmManagerClient->setPlaybackStatus(mDecryptHandle, 406dcd25efb46c41c8d24a0a9cf61fb57f84149709eGloria Wang Playback::STOP, 0); 407dcd25efb46c41c8d24a0a9cf61fb57f84149709eGloria Wang mDecryptHandle = NULL; 408dcd25efb46c41c8d24a0a9cf61fb57f84149709eGloria Wang mDrmManagerClient = NULL; 409dcd25efb46c41c8d24a0a9cf61fb57f84149709eGloria Wang } 410dcd25efb46c41c8d24a0a9cf61fb57f84149709eGloria Wang 4117cf180c9bff69e5cc4a2f4e53b432db45ebbebabGloria Wang if (mFlags & PLAYING) { 4127cf180c9bff69e5cc4a2f4e53b432db45ebbebabGloria Wang uint32_t params = IMediaPlayerService::kBatteryDataTrackDecoder; 4137cf180c9bff69e5cc4a2f4e53b432db45ebbebabGloria Wang if ((mAudioSource != NULL) && (mAudioSource != mAudioTrack)) { 4147cf180c9bff69e5cc4a2f4e53b432db45ebbebabGloria Wang params |= IMediaPlayerService::kBatteryDataTrackAudio; 4157cf180c9bff69e5cc4a2f4e53b432db45ebbebabGloria Wang } 4167cf180c9bff69e5cc4a2f4e53b432db45ebbebabGloria Wang if (mVideoSource != NULL) { 4177cf180c9bff69e5cc4a2f4e53b432db45ebbebabGloria Wang params |= IMediaPlayerService::kBatteryDataTrackVideo; 4187cf180c9bff69e5cc4a2f4e53b432db45ebbebabGloria Wang } 4197cf180c9bff69e5cc4a2f4e53b432db45ebbebabGloria Wang addBatteryData(params); 4207cf180c9bff69e5cc4a2f4e53b432db45ebbebabGloria Wang } 4217cf180c9bff69e5cc4a2f4e53b432db45ebbebabGloria Wang 422e94bd14078d327ef2f800e69907efce641a13272Andreas Huber if (mFlags & PREPARING) { 423e94bd14078d327ef2f800e69907efce641a13272Andreas Huber mFlags |= PREPARE_CANCELLED; 424e94bd14078d327ef2f800e69907efce641a13272Andreas Huber if (mConnectingDataSource != NULL) { 425e94bd14078d327ef2f800e69907efce641a13272Andreas Huber LOGI("interrupting the connection process"); 426e94bd14078d327ef2f800e69907efce641a13272Andreas Huber mConnectingDataSource->disconnect(); 427f1958f9442bc937e1f8c8d9175901500b944b021Andreas Huber } else if (mConnectingRTSPController != NULL) { 428f1958f9442bc937e1f8c8d9175901500b944b021Andreas Huber LOGI("interrupting the connection process"); 429f1958f9442bc937e1f8c8d9175901500b944b021Andreas Huber mConnectingRTSPController->disconnect(); 430e94bd14078d327ef2f800e69907efce641a13272Andreas Huber } 4316a05c9e912aeb8bfe1ef99516def91a177a481b6Andreas Huber 4326a05c9e912aeb8bfe1ef99516def91a177a481b6Andreas Huber if (mFlags & PREPARING_CONNECTED) { 4336a05c9e912aeb8bfe1ef99516def91a177a481b6Andreas Huber // We are basically done preparing, we're just buffering 4346a05c9e912aeb8bfe1ef99516def91a177a481b6Andreas Huber // enough data to start playback, we can safely interrupt that. 4356a05c9e912aeb8bfe1ef99516def91a177a481b6Andreas Huber finishAsyncPrepare_l(); 4366a05c9e912aeb8bfe1ef99516def91a177a481b6Andreas Huber } 437e94bd14078d327ef2f800e69907efce641a13272Andreas Huber } 438e94bd14078d327ef2f800e69907efce641a13272Andreas Huber 439bd22c52280179b29eefac91ef7e7bbbc33d25904Andreas Huber while (mFlags & PREPARING) { 440bd22c52280179b29eefac91ef7e7bbbc33d25904Andreas Huber mPreparedCondition.wait(mLock); 441bd22c52280179b29eefac91ef7e7bbbc33d25904Andreas Huber } 442bd22c52280179b29eefac91ef7e7bbbc33d25904Andreas Huber 443bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber cancelPlayerEvents(); 444bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber 4450a5baa9b411fe086013d2a5e9126ed63fbad046cAndreas Huber mCachedSource.clear(); 44688d8a83de12592635248aa1a3bd6b9ea46108501Andreas Huber mAudioTrack.clear(); 44788d8a83de12592635248aa1a3bd6b9ea46108501Andreas Huber mVideoTrack.clear(); 44888d8a83de12592635248aa1a3bd6b9ea46108501Andreas Huber 4497b3396acc702451be9bafb19d7fe26d55d43a316Andreas Huber // Shutdown audio first, so that the respone to the reset request 4507b3396acc702451be9bafb19d7fe26d55d43a316Andreas Huber // appears to happen instantaneously as far as the user is concerned 4517b3396acc702451be9bafb19d7fe26d55d43a316Andreas Huber // If we did this later, audio would continue playing while we 4527b3396acc702451be9bafb19d7fe26d55d43a316Andreas Huber // shutdown the video-related resources and the player appear to 4537b3396acc702451be9bafb19d7fe26d55d43a316Andreas Huber // not be as responsive to a reset request. 454e94bd14078d327ef2f800e69907efce641a13272Andreas Huber if (mAudioPlayer == NULL && mAudioSource != NULL) { 455e94bd14078d327ef2f800e69907efce641a13272Andreas Huber // If we had an audio player, it would have effectively 456e94bd14078d327ef2f800e69907efce641a13272Andreas Huber // taken possession of the audio source and stopped it when 457e94bd14078d327ef2f800e69907efce641a13272Andreas Huber // _it_ is stopped. Otherwise this is still our responsibility. 458e94bd14078d327ef2f800e69907efce641a13272Andreas Huber mAudioSource->stop(); 459e94bd14078d327ef2f800e69907efce641a13272Andreas Huber } 4607b3396acc702451be9bafb19d7fe26d55d43a316Andreas Huber mAudioSource.clear(); 4617b3396acc702451be9bafb19d7fe26d55d43a316Andreas Huber 4627b3396acc702451be9bafb19d7fe26d55d43a316Andreas Huber mTimeSource = NULL; 4637b3396acc702451be9bafb19d7fe26d55d43a316Andreas Huber 4647b3396acc702451be9bafb19d7fe26d55d43a316Andreas Huber delete mAudioPlayer; 4657b3396acc702451be9bafb19d7fe26d55d43a316Andreas Huber mAudioPlayer = NULL; 4667b3396acc702451be9bafb19d7fe26d55d43a316Andreas Huber 467b9280d5c2313c41eb490f58198c4e59118e0e3e6Andreas Huber mVideoRenderer.clear(); 468b9280d5c2313c41eb490f58198c4e59118e0e3e6Andreas Huber 469bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber if (mVideoBuffer) { 470bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber mVideoBuffer->release(); 471bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber mVideoBuffer = NULL; 472bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber } 473bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber 474cce326fe43411855aca2f719e505b051bc4b61b3Andreas Huber if (mRTSPController != NULL) { 475cce326fe43411855aca2f719e505b051bc4b61b3Andreas Huber mRTSPController->disconnect(); 476cce326fe43411855aca2f719e505b051bc4b61b3Andreas Huber mRTSPController.clear(); 477cce326fe43411855aca2f719e505b051bc4b61b3Andreas Huber } 478cce326fe43411855aca2f719e505b051bc4b61b3Andreas Huber 479bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber if (mVideoSource != NULL) { 480bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber mVideoSource->stop(); 48169f5f4c021ee55055df39718244c036faf2d3382Andreas Huber 48269f5f4c021ee55055df39718244c036faf2d3382Andreas Huber // The following hack is necessary to ensure that the OMX 48369f5f4c021ee55055df39718244c036faf2d3382Andreas Huber // component is completely released by the time we may try 48469f5f4c021ee55055df39718244c036faf2d3382Andreas Huber // to instantiate it again. 48569f5f4c021ee55055df39718244c036faf2d3382Andreas Huber wp<MediaSource> tmp = mVideoSource; 486bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber mVideoSource.clear(); 48769f5f4c021ee55055df39718244c036faf2d3382Andreas Huber while (tmp.promote() != NULL) { 48869f5f4c021ee55055df39718244c036faf2d3382Andreas Huber usleep(1000); 48969f5f4c021ee55055df39718244c036faf2d3382Andreas Huber } 49069f5f4c021ee55055df39718244c036faf2d3382Andreas Huber IPCThreadState::self()->flushCommands(); 491bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber } 492bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber 493bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber mDurationUs = -1; 494bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber mFlags = 0; 495acdd9d0f59c3d8bdc3de80664a609527ec3d21e2Andreas Huber mExtractorFlags = 0; 496bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber mTimeSourceDeltaUs = 0; 497bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber mVideoTimeUs = 0; 498bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber 49964bb6983690bf994d904591145a3cdd6373bdbe6Andreas Huber mSeeking = NO_SEEK; 5001321fdd94d354431b930735e9f38f32ecd189a2dAndreas Huber mSeekNotificationSent = false; 501bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber mSeekTimeUs = 0; 50266b0a35c9a4136a84c3f73b1b25fcb5220138b95Andreas Huber 503bd22c52280179b29eefac91ef7e7bbbc33d25904Andreas Huber mUri.setTo(""); 504bd22c52280179b29eefac91ef7e7bbbc33d25904Andreas Huber mUriHeaders.clear(); 5057b3396acc702451be9bafb19d7fe26d55d43a316Andreas Huber 5067b3396acc702451be9bafb19d7fe26d55d43a316Andreas Huber mFileSource.clear(); 5077b3396acc702451be9bafb19d7fe26d55d43a316Andreas Huber 5087fbdb0903dfbf70b314a74e64e28fb880cdb9247Andreas Huber mBitrate = -1; 509bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber} 510bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber 511c23f12af0394aa2f6651968a3c8840f1af317aa1Andreas Hubervoid AwesomePlayer::notifyListener_l(int msg, int ext1, int ext2) { 5120726045216f576e97672ebeefc265d39c4ebaaa5Andreas Huber if (mListener != NULL) { 5130726045216f576e97672ebeefc265d39c4ebaaa5Andreas Huber sp<MediaPlayerBase> listener = mListener.promote(); 5140726045216f576e97672ebeefc265d39c4ebaaa5Andreas Huber 5150726045216f576e97672ebeefc265d39c4ebaaa5Andreas Huber if (listener != NULL) { 516c23f12af0394aa2f6651968a3c8840f1af317aa1Andreas Huber listener->sendEvent(msg, ext1, ext2); 51766b0a35c9a4136a84c3f73b1b25fcb5220138b95Andreas Huber } 51866b0a35c9a4136a84c3f73b1b25fcb5220138b95Andreas Huber } 51966b0a35c9a4136a84c3f73b1b25fcb5220138b95Andreas Huber} 52066b0a35c9a4136a84c3f73b1b25fcb5220138b95Andreas Huber 5217fbdb0903dfbf70b314a74e64e28fb880cdb9247Andreas Huberbool AwesomePlayer::getBitrate(int64_t *bitrate) { 522c7fc37a3dab9bd1f96713649f351b5990e6316ffJames Dong off64_t size; 5237fbdb0903dfbf70b314a74e64e28fb880cdb9247Andreas Huber if (mDurationUs >= 0 && mCachedSource != NULL 5247fbdb0903dfbf70b314a74e64e28fb880cdb9247Andreas Huber && mCachedSource->getSize(&size) == OK) { 5257fbdb0903dfbf70b314a74e64e28fb880cdb9247Andreas Huber *bitrate = size * 8000000ll / mDurationUs; // in bits/sec 5267fbdb0903dfbf70b314a74e64e28fb880cdb9247Andreas Huber return true; 5277fbdb0903dfbf70b314a74e64e28fb880cdb9247Andreas Huber } 5287fbdb0903dfbf70b314a74e64e28fb880cdb9247Andreas Huber 5297fbdb0903dfbf70b314a74e64e28fb880cdb9247Andreas Huber if (mBitrate >= 0) { 5307fbdb0903dfbf70b314a74e64e28fb880cdb9247Andreas Huber *bitrate = mBitrate; 5317fbdb0903dfbf70b314a74e64e28fb880cdb9247Andreas Huber return true; 5327fbdb0903dfbf70b314a74e64e28fb880cdb9247Andreas Huber } 5337fbdb0903dfbf70b314a74e64e28fb880cdb9247Andreas Huber 5347fbdb0903dfbf70b314a74e64e28fb880cdb9247Andreas Huber *bitrate = 0; 5357fbdb0903dfbf70b314a74e64e28fb880cdb9247Andreas Huber 5367fbdb0903dfbf70b314a74e64e28fb880cdb9247Andreas Huber return false; 5377fbdb0903dfbf70b314a74e64e28fb880cdb9247Andreas Huber} 5387fbdb0903dfbf70b314a74e64e28fb880cdb9247Andreas Huber 5398650e1960905097f6f1d6aa462ccb1c93c656834Andreas Huber// Returns true iff cached duration is available/applicable. 5408650e1960905097f6f1d6aa462ccb1c93c656834Andreas Huberbool AwesomePlayer::getCachedDuration_l(int64_t *durationUs, bool *eos) { 5417fbdb0903dfbf70b314a74e64e28fb880cdb9247Andreas Huber int64_t bitrate; 5428650e1960905097f6f1d6aa462ccb1c93c656834Andreas Huber 5438650e1960905097f6f1d6aa462ccb1c93c656834Andreas Huber if (mRTSPController != NULL) { 5448650e1960905097f6f1d6aa462ccb1c93c656834Andreas Huber *durationUs = mRTSPController->getQueueDurationUs(eos); 5458650e1960905097f6f1d6aa462ccb1c93c656834Andreas Huber return true; 5467fbdb0903dfbf70b314a74e64e28fb880cdb9247Andreas Huber } else if (mCachedSource != NULL && getBitrate(&bitrate)) { 5471bd233ce7e1aa7730bc18d46ffd57791391738cdBryan Mawhinney status_t finalStatus; 5481bd233ce7e1aa7730bc18d46ffd57791391738cdBryan Mawhinney size_t cachedDataRemaining = mCachedSource->approxDataRemaining(&finalStatus); 5498650e1960905097f6f1d6aa462ccb1c93c656834Andreas Huber *durationUs = cachedDataRemaining * 8000000ll / bitrate; 5501bd233ce7e1aa7730bc18d46ffd57791391738cdBryan Mawhinney *eos = (finalStatus != OK); 5518650e1960905097f6f1d6aa462ccb1c93c656834Andreas Huber return true; 5528650e1960905097f6f1d6aa462ccb1c93c656834Andreas Huber } 5538650e1960905097f6f1d6aa462ccb1c93c656834Andreas Huber 5548650e1960905097f6f1d6aa462ccb1c93c656834Andreas Huber return false; 5558650e1960905097f6f1d6aa462ccb1c93c656834Andreas Huber} 5568650e1960905097f6f1d6aa462ccb1c93c656834Andreas Huber 55734ef0f32c8fc0186236a27e07405328cc1f7c56dAndreas Hubervoid AwesomePlayer::ensureCacheIsFetching_l() { 55834ef0f32c8fc0186236a27e07405328cc1f7c56dAndreas Huber if (mCachedSource != NULL) { 55934ef0f32c8fc0186236a27e07405328cc1f7c56dAndreas Huber mCachedSource->resumeFetchingIfNecessary(); 56034ef0f32c8fc0186236a27e07405328cc1f7c56dAndreas Huber } 56134ef0f32c8fc0186236a27e07405328cc1f7c56dAndreas Huber} 56234ef0f32c8fc0186236a27e07405328cc1f7c56dAndreas Huber 563145e68fc778275963189b02a1adcbe27cce4d769Andreas Hubervoid AwesomePlayer::onVideoLagUpdate() { 564145e68fc778275963189b02a1adcbe27cce4d769Andreas Huber Mutex::Autolock autoLock(mLock); 565145e68fc778275963189b02a1adcbe27cce4d769Andreas Huber if (!mVideoLagEventPending) { 566145e68fc778275963189b02a1adcbe27cce4d769Andreas Huber return; 567145e68fc778275963189b02a1adcbe27cce4d769Andreas Huber } 568145e68fc778275963189b02a1adcbe27cce4d769Andreas Huber mVideoLagEventPending = false; 569145e68fc778275963189b02a1adcbe27cce4d769Andreas Huber 570145e68fc778275963189b02a1adcbe27cce4d769Andreas Huber int64_t audioTimeUs = mAudioPlayer->getMediaTimeUs(); 571145e68fc778275963189b02a1adcbe27cce4d769Andreas Huber int64_t videoLateByUs = audioTimeUs - mVideoTimeUs; 572145e68fc778275963189b02a1adcbe27cce4d769Andreas Huber 573145e68fc778275963189b02a1adcbe27cce4d769Andreas Huber if (videoLateByUs > 300000ll) { 574145e68fc778275963189b02a1adcbe27cce4d769Andreas Huber LOGV("video late by %lld ms.", videoLateByUs / 1000ll); 575145e68fc778275963189b02a1adcbe27cce4d769Andreas Huber 576145e68fc778275963189b02a1adcbe27cce4d769Andreas Huber notifyListener_l( 577145e68fc778275963189b02a1adcbe27cce4d769Andreas Huber MEDIA_INFO, 578145e68fc778275963189b02a1adcbe27cce4d769Andreas Huber MEDIA_INFO_VIDEO_TRACK_LAGGING, 579145e68fc778275963189b02a1adcbe27cce4d769Andreas Huber videoLateByUs / 1000ll); 580145e68fc778275963189b02a1adcbe27cce4d769Andreas Huber } 581145e68fc778275963189b02a1adcbe27cce4d769Andreas Huber 582145e68fc778275963189b02a1adcbe27cce4d769Andreas Huber postVideoLagEvent_l(); 583145e68fc778275963189b02a1adcbe27cce4d769Andreas Huber} 584145e68fc778275963189b02a1adcbe27cce4d769Andreas Huber 58566b0a35c9a4136a84c3f73b1b25fcb5220138b95Andreas Hubervoid AwesomePlayer::onBufferingUpdate() { 58666b0a35c9a4136a84c3f73b1b25fcb5220138b95Andreas Huber Mutex::Autolock autoLock(mLock); 587d29345dfa29cdcc650f3705e43950ef2500f6728Andreas Huber if (!mBufferingEventPending) { 588d29345dfa29cdcc650f3705e43950ef2500f6728Andreas Huber return; 589d29345dfa29cdcc650f3705e43950ef2500f6728Andreas Huber } 59066b0a35c9a4136a84c3f73b1b25fcb5220138b95Andreas Huber mBufferingEventPending = false; 59166b0a35c9a4136a84c3f73b1b25fcb5220138b95Andreas Huber 5928650e1960905097f6f1d6aa462ccb1c93c656834Andreas Huber if (mCachedSource != NULL) { 5931bd233ce7e1aa7730bc18d46ffd57791391738cdBryan Mawhinney status_t finalStatus; 5941bd233ce7e1aa7730bc18d46ffd57791391738cdBryan Mawhinney size_t cachedDataRemaining = mCachedSource->approxDataRemaining(&finalStatus); 5951bd233ce7e1aa7730bc18d46ffd57791391738cdBryan Mawhinney bool eos = (finalStatus != OK); 596c9e894872c298b25fe9d74e68aa1e7287a541ac3Andreas Huber 5978650e1960905097f6f1d6aa462ccb1c93c656834Andreas Huber if (eos) { 5981bd233ce7e1aa7730bc18d46ffd57791391738cdBryan Mawhinney if (finalStatus == ERROR_END_OF_STREAM) { 5991bd233ce7e1aa7730bc18d46ffd57791391738cdBryan Mawhinney notifyListener_l(MEDIA_BUFFERING_UPDATE, 100); 6001bd233ce7e1aa7730bc18d46ffd57791391738cdBryan Mawhinney } 60183977eb230d829cfe520f55d7977037a904ce548Andreas Huber if (mFlags & PREPARING) { 60283977eb230d829cfe520f55d7977037a904ce548Andreas Huber LOGV("cache has reached EOS, prepare is done."); 60383977eb230d829cfe520f55d7977037a904ce548Andreas Huber finishAsyncPrepare_l(); 60483977eb230d829cfe520f55d7977037a904ce548Andreas Huber } 6058650e1960905097f6f1d6aa462ccb1c93c656834Andreas Huber } else { 6067fbdb0903dfbf70b314a74e64e28fb880cdb9247Andreas Huber int64_t bitrate; 6077fbdb0903dfbf70b314a74e64e28fb880cdb9247Andreas Huber if (getBitrate(&bitrate)) { 6088650e1960905097f6f1d6aa462ccb1c93c656834Andreas Huber size_t cachedSize = mCachedSource->cachedSize(); 6098650e1960905097f6f1d6aa462ccb1c93c656834Andreas Huber int64_t cachedDurationUs = cachedSize * 8000000ll / bitrate; 610c9e894872c298b25fe9d74e68aa1e7287a541ac3Andreas Huber 6118650e1960905097f6f1d6aa462ccb1c93c656834Andreas Huber int percentage = 100.0 * (double)cachedDurationUs / mDurationUs; 6128650e1960905097f6f1d6aa462ccb1c93c656834Andreas Huber if (percentage > 100) { 6138650e1960905097f6f1d6aa462ccb1c93c656834Andreas Huber percentage = 100; 6148650e1960905097f6f1d6aa462ccb1c93c656834Andreas Huber } 615c9e894872c298b25fe9d74e68aa1e7287a541ac3Andreas Huber 6168650e1960905097f6f1d6aa462ccb1c93c656834Andreas Huber notifyListener_l(MEDIA_BUFFERING_UPDATE, percentage); 6178650e1960905097f6f1d6aa462ccb1c93c656834Andreas Huber } else { 6188650e1960905097f6f1d6aa462ccb1c93c656834Andreas Huber // We don't know the bitrate of the stream, use absolute size 6198650e1960905097f6f1d6aa462ccb1c93c656834Andreas Huber // limits to maintain the cache. 6208650e1960905097f6f1d6aa462ccb1c93c656834Andreas Huber 6218650e1960905097f6f1d6aa462ccb1c93c656834Andreas Huber if ((mFlags & PLAYING) && !eos 6228650e1960905097f6f1d6aa462ccb1c93c656834Andreas Huber && (cachedDataRemaining < kLowWaterMarkBytes)) { 6238650e1960905097f6f1d6aa462ccb1c93c656834Andreas Huber LOGI("cache is running low (< %d) , pausing.", 6248650e1960905097f6f1d6aa462ccb1c93c656834Andreas Huber kLowWaterMarkBytes); 6258650e1960905097f6f1d6aa462ccb1c93c656834Andreas Huber mFlags |= CACHE_UNDERRUN; 6268650e1960905097f6f1d6aa462ccb1c93c656834Andreas Huber pause_l(); 62734ef0f32c8fc0186236a27e07405328cc1f7c56dAndreas Huber ensureCacheIsFetching_l(); 6288650e1960905097f6f1d6aa462ccb1c93c656834Andreas Huber notifyListener_l(MEDIA_INFO, MEDIA_INFO_BUFFERING_START); 6298650e1960905097f6f1d6aa462ccb1c93c656834Andreas Huber } else if (eos || cachedDataRemaining > kHighWaterMarkBytes) { 6308650e1960905097f6f1d6aa462ccb1c93c656834Andreas Huber if (mFlags & CACHE_UNDERRUN) { 6318650e1960905097f6f1d6aa462ccb1c93c656834Andreas Huber LOGI("cache has filled up (> %d), resuming.", 6328650e1960905097f6f1d6aa462ccb1c93c656834Andreas Huber kHighWaterMarkBytes); 6338650e1960905097f6f1d6aa462ccb1c93c656834Andreas Huber mFlags &= ~CACHE_UNDERRUN; 6348650e1960905097f6f1d6aa462ccb1c93c656834Andreas Huber play_l(); 6358650e1960905097f6f1d6aa462ccb1c93c656834Andreas Huber notifyListener_l(MEDIA_INFO, MEDIA_INFO_BUFFERING_END); 6368650e1960905097f6f1d6aa462ccb1c93c656834Andreas Huber } else if (mFlags & PREPARING) { 6378650e1960905097f6f1d6aa462ccb1c93c656834Andreas Huber LOGV("cache has filled up (> %d), prepare is done", 6388650e1960905097f6f1d6aa462ccb1c93c656834Andreas Huber kHighWaterMarkBytes); 6398650e1960905097f6f1d6aa462ccb1c93c656834Andreas Huber finishAsyncPrepare_l(); 6408650e1960905097f6f1d6aa462ccb1c93c656834Andreas Huber } 6418650e1960905097f6f1d6aa462ccb1c93c656834Andreas Huber } 6428650e1960905097f6f1d6aa462ccb1c93c656834Andreas Huber } 6438650e1960905097f6f1d6aa462ccb1c93c656834Andreas Huber } 6442415ecb5bb4e1459024f6d6c8ae2d6e3dc4fbdc7Andreas Huber } 6452415ecb5bb4e1459024f6d6c8ae2d6e3dc4fbdc7Andreas Huber 6468650e1960905097f6f1d6aa462ccb1c93c656834Andreas Huber int64_t cachedDurationUs; 6472a4b49bd3863024884a694b454e2e452752e6ea0Andreas Huber bool eos; 6488650e1960905097f6f1d6aa462ccb1c93c656834Andreas Huber if (getCachedDuration_l(&cachedDurationUs, &eos)) { 64934ef0f32c8fc0186236a27e07405328cc1f7c56dAndreas Huber LOGV("cachedDurationUs = %.2f secs, eos=%d", 65034ef0f32c8fc0186236a27e07405328cc1f7c56dAndreas Huber cachedDurationUs / 1E6, eos); 65134ef0f32c8fc0186236a27e07405328cc1f7c56dAndreas Huber 652100a4408968b90e314526185d572c72ea4cc784aAndreas Huber int64_t highWaterMarkUs = 653100a4408968b90e314526185d572c72ea4cc784aAndreas Huber (mRTSPController != NULL) ? kHighWaterMarkRTSPUs : kHighWaterMarkUs; 654100a4408968b90e314526185d572c72ea4cc784aAndreas Huber 6558650e1960905097f6f1d6aa462ccb1c93c656834Andreas Huber if ((mFlags & PLAYING) && !eos 6568650e1960905097f6f1d6aa462ccb1c93c656834Andreas Huber && (cachedDurationUs < kLowWaterMarkUs)) { 6578650e1960905097f6f1d6aa462ccb1c93c656834Andreas Huber LOGI("cache is running low (%.2f secs) , pausing.", 6588650e1960905097f6f1d6aa462ccb1c93c656834Andreas Huber cachedDurationUs / 1E6); 6598650e1960905097f6f1d6aa462ccb1c93c656834Andreas Huber mFlags |= CACHE_UNDERRUN; 6608650e1960905097f6f1d6aa462ccb1c93c656834Andreas Huber pause_l(); 66134ef0f32c8fc0186236a27e07405328cc1f7c56dAndreas Huber ensureCacheIsFetching_l(); 6628650e1960905097f6f1d6aa462ccb1c93c656834Andreas Huber notifyListener_l(MEDIA_INFO, MEDIA_INFO_BUFFERING_START); 663100a4408968b90e314526185d572c72ea4cc784aAndreas Huber } else if (eos || cachedDurationUs > highWaterMarkUs) { 6648650e1960905097f6f1d6aa462ccb1c93c656834Andreas Huber if (mFlags & CACHE_UNDERRUN) { 6658650e1960905097f6f1d6aa462ccb1c93c656834Andreas Huber LOGI("cache has filled up (%.2f secs), resuming.", 6668650e1960905097f6f1d6aa462ccb1c93c656834Andreas Huber cachedDurationUs / 1E6); 6678650e1960905097f6f1d6aa462ccb1c93c656834Andreas Huber mFlags &= ~CACHE_UNDERRUN; 6688650e1960905097f6f1d6aa462ccb1c93c656834Andreas Huber play_l(); 6698650e1960905097f6f1d6aa462ccb1c93c656834Andreas Huber notifyListener_l(MEDIA_INFO, MEDIA_INFO_BUFFERING_END); 6708650e1960905097f6f1d6aa462ccb1c93c656834Andreas Huber } else if (mFlags & PREPARING) { 6718650e1960905097f6f1d6aa462ccb1c93c656834Andreas Huber LOGV("cache has filled up (%.2f secs), prepare is done", 6728650e1960905097f6f1d6aa462ccb1c93c656834Andreas Huber cachedDurationUs / 1E6); 6738650e1960905097f6f1d6aa462ccb1c93c656834Andreas Huber finishAsyncPrepare_l(); 6742a4b49bd3863024884a694b454e2e452752e6ea0Andreas Huber } 6752a4b49bd3863024884a694b454e2e452752e6ea0Andreas Huber } 6760a5baa9b411fe086013d2a5e9126ed63fbad046cAndreas Huber } 6770a5baa9b411fe086013d2a5e9126ed63fbad046cAndreas Huber 6780a5baa9b411fe086013d2a5e9126ed63fbad046cAndreas Huber postBufferingEvent_l(); 6790726045216f576e97672ebeefc265d39c4ebaaa5Andreas Huber} 6800726045216f576e97672ebeefc265d39c4ebaaa5Andreas Huber 681bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Hubervoid AwesomePlayer::onStreamDone() { 682bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber // Posted whenever any stream finishes playing. 683bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber 684bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber Mutex::Autolock autoLock(mLock); 685d29345dfa29cdcc650f3705e43950ef2500f6728Andreas Huber if (!mStreamDoneEventPending) { 686d29345dfa29cdcc650f3705e43950ef2500f6728Andreas Huber return; 687d29345dfa29cdcc650f3705e43950ef2500f6728Andreas Huber } 688bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber mStreamDoneEventPending = false; 689bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber 690ed8d14f6a934072cd012992c4ef16990a54baa9aAndreas Huber if (mStreamDoneStatus != ERROR_END_OF_STREAM) { 6915d2de4da54504836e4b772b3010ac28c19f667f0Andreas Huber LOGV("MEDIA_ERROR %d", mStreamDoneStatus); 6925d2de4da54504836e4b772b3010ac28c19f667f0Andreas Huber 6935d2de4da54504836e4b772b3010ac28c19f667f0Andreas Huber notifyListener_l( 6945d2de4da54504836e4b772b3010ac28c19f667f0Andreas Huber MEDIA_ERROR, MEDIA_ERROR_UNKNOWN, mStreamDoneStatus); 6955d2de4da54504836e4b772b3010ac28c19f667f0Andreas Huber 696b2e3954c94717e43b3dc9b880564f166cfbbc0a2Andreas Huber pause_l(true /* at eos */); 6975d2de4da54504836e4b772b3010ac28c19f667f0Andreas Huber 6985d2de4da54504836e4b772b3010ac28c19f667f0Andreas Huber mFlags |= AT_EOS; 6995d2de4da54504836e4b772b3010ac28c19f667f0Andreas Huber return; 7005d2de4da54504836e4b772b3010ac28c19f667f0Andreas Huber } 7015d2de4da54504836e4b772b3010ac28c19f667f0Andreas Huber 7025d2de4da54504836e4b772b3010ac28c19f667f0Andreas Huber const bool allDone = 7035d2de4da54504836e4b772b3010ac28c19f667f0Andreas Huber (mVideoSource == NULL || (mFlags & VIDEO_AT_EOS)) 7045d2de4da54504836e4b772b3010ac28c19f667f0Andreas Huber && (mAudioSource == NULL || (mFlags & AUDIO_AT_EOS)); 7055d2de4da54504836e4b772b3010ac28c19f667f0Andreas Huber 7065d2de4da54504836e4b772b3010ac28c19f667f0Andreas Huber if (!allDone) { 7075d2de4da54504836e4b772b3010ac28c19f667f0Andreas Huber return; 7085d2de4da54504836e4b772b3010ac28c19f667f0Andreas Huber } 7095d2de4da54504836e4b772b3010ac28c19f667f0Andreas Huber 7108ae49d87b98d57d6758b0c51b95e28a6581a79f1Andreas Huber if (mFlags & (LOOPING | AUTO_LOOPING)) { 711bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber seekTo_l(0); 712bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber 713a657f8deaf21acbe5faba7be1df9c6681d44d471Andreas Huber if (mVideoSource != NULL) { 714bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber postVideoEvent_l(); 715bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber } 716bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber } else { 7175d2de4da54504836e4b772b3010ac28c19f667f0Andreas Huber LOGV("MEDIA_PLAYBACK_COMPLETE"); 7185d2de4da54504836e4b772b3010ac28c19f667f0Andreas Huber notifyListener_l(MEDIA_PLAYBACK_COMPLETE); 719bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber 720b2e3954c94717e43b3dc9b880564f166cfbbc0a2Andreas Huber pause_l(true /* at eos */); 7212e8ffaf95bd35358ecd14ddf00cddaf3abefe0a9Andreas Huber 7222e8ffaf95bd35358ecd14ddf00cddaf3abefe0a9Andreas Huber mFlags |= AT_EOS; 723bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber } 724bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber} 725bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber 726bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huberstatus_t AwesomePlayer::play() { 727bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber Mutex::Autolock autoLock(mLock); 7280a5baa9b411fe086013d2a5e9126ed63fbad046cAndreas Huber 7290a5baa9b411fe086013d2a5e9126ed63fbad046cAndreas Huber mFlags &= ~CACHE_UNDERRUN; 7300a5baa9b411fe086013d2a5e9126ed63fbad046cAndreas Huber 7317b3396acc702451be9bafb19d7fe26d55d43a316Andreas Huber return play_l(); 7327b3396acc702451be9bafb19d7fe26d55d43a316Andreas Huber} 733bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber 7347b3396acc702451be9bafb19d7fe26d55d43a316Andreas Huberstatus_t AwesomePlayer::play_l() { 7352b1222f8938356669672f35e0e53e176c78c40efAndreas Huber mFlags &= ~SEEK_PREVIEW; 7362b1222f8938356669672f35e0e53e176c78c40efAndreas Huber 737bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber if (mFlags & PLAYING) { 738bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber return OK; 739bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber } 740bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber 741bd22c52280179b29eefac91ef7e7bbbc33d25904Andreas Huber if (!(mFlags & PREPARED)) { 742bd22c52280179b29eefac91ef7e7bbbc33d25904Andreas Huber status_t err = prepare_l(); 743bd22c52280179b29eefac91ef7e7bbbc33d25904Andreas Huber 744bd22c52280179b29eefac91ef7e7bbbc33d25904Andreas Huber if (err != OK) { 745bd22c52280179b29eefac91ef7e7bbbc33d25904Andreas Huber return err; 746bd22c52280179b29eefac91ef7e7bbbc33d25904Andreas Huber } 747bd22c52280179b29eefac91ef7e7bbbc33d25904Andreas Huber } 748bd22c52280179b29eefac91ef7e7bbbc33d25904Andreas Huber 749bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber mFlags |= PLAYING; 750bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber mFlags |= FIRST_FRAME; 751bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber 752fd4a8e09a54469bbccea6248f84319a1eb78765eAndreas Huber bool deferredAudioSeek = false; 753fd4a8e09a54469bbccea6248f84319a1eb78765eAndreas Huber 754c130b5bf563d049bd391ccd96985ac278ef8ff8dGloria Wang if (mDecryptHandle != NULL) { 755c130b5bf563d049bd391ccd96985ac278ef8ff8dGloria Wang int64_t position; 756c130b5bf563d049bd391ccd96985ac278ef8ff8dGloria Wang getPosition(&position); 757c130b5bf563d049bd391ccd96985ac278ef8ff8dGloria Wang mDrmManagerClient->setPlaybackStatus(mDecryptHandle, 758c130b5bf563d049bd391ccd96985ac278ef8ff8dGloria Wang Playback::START, position / 1000); 759c130b5bf563d049bd391ccd96985ac278ef8ff8dGloria Wang } 760c130b5bf563d049bd391ccd96985ac278ef8ff8dGloria Wang 761bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber if (mAudioSource != NULL) { 762bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber if (mAudioPlayer == NULL) { 763bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber if (mAudioSink != NULL) { 764ed54ad0f8619ae416b0968ade6248894cbfc4dbaAndreas Huber mAudioPlayer = new AudioPlayer(mAudioSink, this); 765bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber mAudioPlayer->setSource(mAudioSource); 766e7e3b785a0e7819db4c895a4f60e9a4dd755880cAndreas Huber 767f03034408506051f2f836e59305fcd5f662bf19aAndreas Huber mTimeSource = mAudioPlayer; 76888c030e0e0152791ff74f90249f55fce01371198Andreas Huber 769f03034408506051f2f836e59305fcd5f662bf19aAndreas Huber deferredAudioSeek = true; 77088c030e0e0152791ff74f90249f55fce01371198Andreas Huber 771f03034408506051f2f836e59305fcd5f662bf19aAndreas Huber mWatchForAudioSeekComplete = false; 772f03034408506051f2f836e59305fcd5f662bf19aAndreas Huber mWatchForAudioEOS = true; 773f03034408506051f2f836e59305fcd5f662bf19aAndreas Huber } 774f03034408506051f2f836e59305fcd5f662bf19aAndreas Huber } 77588c030e0e0152791ff74f90249f55fce01371198Andreas Huber 776f03034408506051f2f836e59305fcd5f662bf19aAndreas Huber CHECK(!(mFlags & AUDIO_RUNNING)); 777c130b5bf563d049bd391ccd96985ac278ef8ff8dGloria Wang 778f03034408506051f2f836e59305fcd5f662bf19aAndreas Huber if (mVideoSource == NULL) { 779f03034408506051f2f836e59305fcd5f662bf19aAndreas Huber status_t err = startAudioPlayer_l(); 780bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber 781f03034408506051f2f836e59305fcd5f662bf19aAndreas Huber if (err != OK) { 782f03034408506051f2f836e59305fcd5f662bf19aAndreas Huber delete mAudioPlayer; 783f03034408506051f2f836e59305fcd5f662bf19aAndreas Huber mAudioPlayer = NULL; 784bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber 785f03034408506051f2f836e59305fcd5f662bf19aAndreas Huber mFlags &= ~(PLAYING | FIRST_FRAME); 7861862a33b246249630b654182afb5914da3480d4cAndreas Huber 787f03034408506051f2f836e59305fcd5f662bf19aAndreas Huber if (mDecryptHandle != NULL) { 788f03034408506051f2f836e59305fcd5f662bf19aAndreas Huber mDrmManagerClient->setPlaybackStatus( 789f03034408506051f2f836e59305fcd5f662bf19aAndreas Huber mDecryptHandle, Playback::STOP, 0); 790f03034408506051f2f836e59305fcd5f662bf19aAndreas Huber } 791f03034408506051f2f836e59305fcd5f662bf19aAndreas Huber 792f03034408506051f2f836e59305fcd5f662bf19aAndreas Huber return err; 793bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber } 794bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber } 795bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber } 796bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber 797bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber if (mTimeSource == NULL && mAudioPlayer == NULL) { 7985d2de4da54504836e4b772b3010ac28c19f667f0Andreas Huber mTimeSource = &mSystemTimeSource; 799bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber } 800bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber 801bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber if (mVideoSource != NULL) { 802a657f8deaf21acbe5faba7be1df9c6681d44d471Andreas Huber // Kick off video playback 803a657f8deaf21acbe5faba7be1df9c6681d44d471Andreas Huber postVideoEvent_l(); 804145e68fc778275963189b02a1adcbe27cce4d769Andreas Huber 805145e68fc778275963189b02a1adcbe27cce4d769Andreas Huber if (mAudioSource != NULL && mVideoSource != NULL) { 806145e68fc778275963189b02a1adcbe27cce4d769Andreas Huber postVideoLagEvent_l(); 807145e68fc778275963189b02a1adcbe27cce4d769Andreas Huber } 808bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber } 809bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber 810fd4a8e09a54469bbccea6248f84319a1eb78765eAndreas Huber if (deferredAudioSeek) { 811fd4a8e09a54469bbccea6248f84319a1eb78765eAndreas Huber // If there was a seek request while we were paused 812fd4a8e09a54469bbccea6248f84319a1eb78765eAndreas Huber // and we're just starting up again, honor the request now. 813fd4a8e09a54469bbccea6248f84319a1eb78765eAndreas Huber seekAudioIfNecessary_l(); 814fd4a8e09a54469bbccea6248f84319a1eb78765eAndreas Huber } 815fd4a8e09a54469bbccea6248f84319a1eb78765eAndreas Huber 8162e8ffaf95bd35358ecd14ddf00cddaf3abefe0a9Andreas Huber if (mFlags & AT_EOS) { 8172e8ffaf95bd35358ecd14ddf00cddaf3abefe0a9Andreas Huber // Legacy behaviour, if a stream finishes playing and then 8182e8ffaf95bd35358ecd14ddf00cddaf3abefe0a9Andreas Huber // is started again, we play from the start... 8192e8ffaf95bd35358ecd14ddf00cddaf3abefe0a9Andreas Huber seekTo_l(0); 8202e8ffaf95bd35358ecd14ddf00cddaf3abefe0a9Andreas Huber } 8212e8ffaf95bd35358ecd14ddf00cddaf3abefe0a9Andreas Huber 8227cf180c9bff69e5cc4a2f4e53b432db45ebbebabGloria Wang uint32_t params = IMediaPlayerService::kBatteryDataCodecStarted 8237cf180c9bff69e5cc4a2f4e53b432db45ebbebabGloria Wang | IMediaPlayerService::kBatteryDataTrackDecoder; 8247cf180c9bff69e5cc4a2f4e53b432db45ebbebabGloria Wang if ((mAudioSource != NULL) && (mAudioSource != mAudioTrack)) { 8257cf180c9bff69e5cc4a2f4e53b432db45ebbebabGloria Wang params |= IMediaPlayerService::kBatteryDataTrackAudio; 8267cf180c9bff69e5cc4a2f4e53b432db45ebbebabGloria Wang } 8277cf180c9bff69e5cc4a2f4e53b432db45ebbebabGloria Wang if (mVideoSource != NULL) { 8287cf180c9bff69e5cc4a2f4e53b432db45ebbebabGloria Wang params |= IMediaPlayerService::kBatteryDataTrackVideo; 8297cf180c9bff69e5cc4a2f4e53b432db45ebbebabGloria Wang } 8307cf180c9bff69e5cc4a2f4e53b432db45ebbebabGloria Wang addBatteryData(params); 8317cf180c9bff69e5cc4a2f4e53b432db45ebbebabGloria Wang 832bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber return OK; 833bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber} 834bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber 835f03034408506051f2f836e59305fcd5f662bf19aAndreas Huberstatus_t AwesomePlayer::startAudioPlayer_l() { 836f03034408506051f2f836e59305fcd5f662bf19aAndreas Huber CHECK(!(mFlags & AUDIO_RUNNING)); 837f03034408506051f2f836e59305fcd5f662bf19aAndreas Huber 838f03034408506051f2f836e59305fcd5f662bf19aAndreas Huber if (mAudioSource == NULL || mAudioPlayer == NULL) { 839f03034408506051f2f836e59305fcd5f662bf19aAndreas Huber return OK; 840f03034408506051f2f836e59305fcd5f662bf19aAndreas Huber } 841f03034408506051f2f836e59305fcd5f662bf19aAndreas Huber 842f03034408506051f2f836e59305fcd5f662bf19aAndreas Huber if (!(mFlags & AUDIOPLAYER_STARTED)) { 843f03034408506051f2f836e59305fcd5f662bf19aAndreas Huber mFlags |= AUDIOPLAYER_STARTED; 844f03034408506051f2f836e59305fcd5f662bf19aAndreas Huber 845f03034408506051f2f836e59305fcd5f662bf19aAndreas Huber // We've already started the MediaSource in order to enable 846f03034408506051f2f836e59305fcd5f662bf19aAndreas Huber // the prefetcher to read its data. 847f03034408506051f2f836e59305fcd5f662bf19aAndreas Huber status_t err = mAudioPlayer->start( 848f03034408506051f2f836e59305fcd5f662bf19aAndreas Huber true /* sourceAlreadyStarted */); 849f03034408506051f2f836e59305fcd5f662bf19aAndreas Huber 850f03034408506051f2f836e59305fcd5f662bf19aAndreas Huber if (err != OK) { 851f03034408506051f2f836e59305fcd5f662bf19aAndreas Huber notifyListener_l(MEDIA_ERROR, MEDIA_ERROR_UNKNOWN, err); 852f03034408506051f2f836e59305fcd5f662bf19aAndreas Huber return err; 853f03034408506051f2f836e59305fcd5f662bf19aAndreas Huber } 854f03034408506051f2f836e59305fcd5f662bf19aAndreas Huber } else { 855f03034408506051f2f836e59305fcd5f662bf19aAndreas Huber mAudioPlayer->resume(); 856f03034408506051f2f836e59305fcd5f662bf19aAndreas Huber } 857f03034408506051f2f836e59305fcd5f662bf19aAndreas Huber 858f03034408506051f2f836e59305fcd5f662bf19aAndreas Huber mFlags |= AUDIO_RUNNING; 859f03034408506051f2f836e59305fcd5f662bf19aAndreas Huber 860f03034408506051f2f836e59305fcd5f662bf19aAndreas Huber mWatchForAudioEOS = true; 861f03034408506051f2f836e59305fcd5f662bf19aAndreas Huber 862f03034408506051f2f836e59305fcd5f662bf19aAndreas Huber return OK; 863f03034408506051f2f836e59305fcd5f662bf19aAndreas Huber} 864f03034408506051f2f836e59305fcd5f662bf19aAndreas Huber 8655daeb129a2c2ba3d14ccd94af283b5f561c783eaAndreas Hubervoid AwesomePlayer::notifyVideoSize_l() { 8665daeb129a2c2ba3d14ccd94af283b5f561c783eaAndreas Huber sp<MetaData> meta = mVideoSource->getFormat(); 8675daeb129a2c2ba3d14ccd94af283b5f561c783eaAndreas Huber 868f5ab57c2d5e02af7483c94eddb177e4f5c9e9892Andreas Huber int32_t cropLeft, cropTop, cropRight, cropBottom; 869f5ab57c2d5e02af7483c94eddb177e4f5c9e9892Andreas Huber if (!meta->findRect( 870f5ab57c2d5e02af7483c94eddb177e4f5c9e9892Andreas Huber kKeyCropRect, &cropLeft, &cropTop, &cropRight, &cropBottom)) { 871f5ab57c2d5e02af7483c94eddb177e4f5c9e9892Andreas Huber int32_t width, height; 872f5ab57c2d5e02af7483c94eddb177e4f5c9e9892Andreas Huber CHECK(meta->findInt32(kKeyWidth, &width)); 873f5ab57c2d5e02af7483c94eddb177e4f5c9e9892Andreas Huber CHECK(meta->findInt32(kKeyHeight, &height)); 874f5ab57c2d5e02af7483c94eddb177e4f5c9e9892Andreas Huber 875f5ab57c2d5e02af7483c94eddb177e4f5c9e9892Andreas Huber cropLeft = cropTop = 0; 876f5ab57c2d5e02af7483c94eddb177e4f5c9e9892Andreas Huber cropRight = width - 1; 877f5ab57c2d5e02af7483c94eddb177e4f5c9e9892Andreas Huber cropBottom = height - 1; 878f5ab57c2d5e02af7483c94eddb177e4f5c9e9892Andreas Huber 879f5ab57c2d5e02af7483c94eddb177e4f5c9e9892Andreas Huber LOGV("got dimensions only %d x %d", width, height); 880f5ab57c2d5e02af7483c94eddb177e4f5c9e9892Andreas Huber } else { 881f5ab57c2d5e02af7483c94eddb177e4f5c9e9892Andreas Huber LOGV("got crop rect %d, %d, %d, %d", 882f5ab57c2d5e02af7483c94eddb177e4f5c9e9892Andreas Huber cropLeft, cropTop, cropRight, cropBottom); 883f5ab57c2d5e02af7483c94eddb177e4f5c9e9892Andreas Huber } 884f5ab57c2d5e02af7483c94eddb177e4f5c9e9892Andreas Huber 885f5ab57c2d5e02af7483c94eddb177e4f5c9e9892Andreas Huber int32_t usableWidth = cropRight - cropLeft + 1; 886f5ab57c2d5e02af7483c94eddb177e4f5c9e9892Andreas Huber int32_t usableHeight = cropBottom - cropTop + 1; 887b45c01c2b8588ff431b511151666a55a39f0a6aeJames Dong if (mDisplayWidth != 0) { 888b45c01c2b8588ff431b511151666a55a39f0a6aeJames Dong usableWidth = mDisplayWidth; 889b45c01c2b8588ff431b511151666a55a39f0a6aeJames Dong } 890b45c01c2b8588ff431b511151666a55a39f0a6aeJames Dong if (mDisplayHeight != 0) { 891b45c01c2b8588ff431b511151666a55a39f0a6aeJames Dong usableHeight = mDisplayHeight; 892b45c01c2b8588ff431b511151666a55a39f0a6aeJames Dong } 8935daeb129a2c2ba3d14ccd94af283b5f561c783eaAndreas Huber 894ba529e486dde15fe75ea1b48570f9d60a4cf3c48Andreas Huber int32_t rotationDegrees; 895ba529e486dde15fe75ea1b48570f9d60a4cf3c48Andreas Huber if (!mVideoTrack->getFormat()->findInt32( 896ba529e486dde15fe75ea1b48570f9d60a4cf3c48Andreas Huber kKeyRotation, &rotationDegrees)) { 897ba529e486dde15fe75ea1b48570f9d60a4cf3c48Andreas Huber rotationDegrees = 0; 898ba529e486dde15fe75ea1b48570f9d60a4cf3c48Andreas Huber } 899ba529e486dde15fe75ea1b48570f9d60a4cf3c48Andreas Huber 900ba529e486dde15fe75ea1b48570f9d60a4cf3c48Andreas Huber if (rotationDegrees == 90 || rotationDegrees == 270) { 901ba529e486dde15fe75ea1b48570f9d60a4cf3c48Andreas Huber notifyListener_l( 902f5ab57c2d5e02af7483c94eddb177e4f5c9e9892Andreas Huber MEDIA_SET_VIDEO_SIZE, usableHeight, usableWidth); 903ba529e486dde15fe75ea1b48570f9d60a4cf3c48Andreas Huber } else { 904ba529e486dde15fe75ea1b48570f9d60a4cf3c48Andreas Huber notifyListener_l( 905f5ab57c2d5e02af7483c94eddb177e4f5c9e9892Andreas Huber MEDIA_SET_VIDEO_SIZE, usableWidth, usableHeight); 906ba529e486dde15fe75ea1b48570f9d60a4cf3c48Andreas Huber } 9075daeb129a2c2ba3d14ccd94af283b5f561c783eaAndreas Huber} 9085daeb129a2c2ba3d14ccd94af283b5f561c783eaAndreas Huber 909bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Hubervoid AwesomePlayer::initRenderer_l() { 9101173118eace0e9e347cb007f0da817cee87579edGlenn Kasten if (mNativeWindow == NULL) { 9110a5ca668c6f7d45706e9aec4a1dfec0aacc6d233Andreas Huber return; 9120a5ca668c6f7d45706e9aec4a1dfec0aacc6d233Andreas Huber } 913bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber 9140a5ca668c6f7d45706e9aec4a1dfec0aacc6d233Andreas Huber sp<MetaData> meta = mVideoSource->getFormat(); 915bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber 9160a5ca668c6f7d45706e9aec4a1dfec0aacc6d233Andreas Huber int32_t format; 9170a5ca668c6f7d45706e9aec4a1dfec0aacc6d233Andreas Huber const char *component; 9180a5ca668c6f7d45706e9aec4a1dfec0aacc6d233Andreas Huber int32_t decodedWidth, decodedHeight; 9190a5ca668c6f7d45706e9aec4a1dfec0aacc6d233Andreas Huber CHECK(meta->findInt32(kKeyColorFormat, &format)); 9200a5ca668c6f7d45706e9aec4a1dfec0aacc6d233Andreas Huber CHECK(meta->findCString(kKeyDecoderComponent, &component)); 9210a5ca668c6f7d45706e9aec4a1dfec0aacc6d233Andreas Huber CHECK(meta->findInt32(kKeyWidth, &decodedWidth)); 9220a5ca668c6f7d45706e9aec4a1dfec0aacc6d233Andreas Huber CHECK(meta->findInt32(kKeyHeight, &decodedHeight)); 9234844ac54e8b5997c3b03872dbafe8ebed4787517Andreas Huber 924ba529e486dde15fe75ea1b48570f9d60a4cf3c48Andreas Huber int32_t rotationDegrees; 925ba529e486dde15fe75ea1b48570f9d60a4cf3c48Andreas Huber if (!mVideoTrack->getFormat()->findInt32( 926ba529e486dde15fe75ea1b48570f9d60a4cf3c48Andreas Huber kKeyRotation, &rotationDegrees)) { 927ba529e486dde15fe75ea1b48570f9d60a4cf3c48Andreas Huber rotationDegrees = 0; 928ba529e486dde15fe75ea1b48570f9d60a4cf3c48Andreas Huber } 929ba529e486dde15fe75ea1b48570f9d60a4cf3c48Andreas Huber 9300a5ca668c6f7d45706e9aec4a1dfec0aacc6d233Andreas Huber mVideoRenderer.clear(); 9314844ac54e8b5997c3b03872dbafe8ebed4787517Andreas Huber 9320a5ca668c6f7d45706e9aec4a1dfec0aacc6d233Andreas Huber // Must ensure that mVideoRenderer's destructor is actually executed 9330a5ca668c6f7d45706e9aec4a1dfec0aacc6d233Andreas Huber // before creating a new one. 9340a5ca668c6f7d45706e9aec4a1dfec0aacc6d233Andreas Huber IPCThreadState::self()->flushCommands(); 9350a5ca668c6f7d45706e9aec4a1dfec0aacc6d233Andreas Huber 9360a5ca668c6f7d45706e9aec4a1dfec0aacc6d233Andreas Huber if (USE_SURFACE_ALLOC && strncmp(component, "OMX.", 4) == 0) { 9370a5ca668c6f7d45706e9aec4a1dfec0aacc6d233Andreas Huber // Hardware decoders avoid the CPU color conversion by decoding 9380a5ca668c6f7d45706e9aec4a1dfec0aacc6d233Andreas Huber // directly to ANativeBuffers, so we must use a renderer that 9390a5ca668c6f7d45706e9aec4a1dfec0aacc6d233Andreas Huber // just pushes those buffers to the ANativeWindow. 940ba529e486dde15fe75ea1b48570f9d60a4cf3c48Andreas Huber mVideoRenderer = 9411173118eace0e9e347cb007f0da817cee87579edGlenn Kasten new AwesomeNativeWindowRenderer(mNativeWindow, rotationDegrees); 9420a5ca668c6f7d45706e9aec4a1dfec0aacc6d233Andreas Huber } else { 9430a5ca668c6f7d45706e9aec4a1dfec0aacc6d233Andreas Huber // Other decoders are instantiated locally and as a consequence 9440a5ca668c6f7d45706e9aec4a1dfec0aacc6d233Andreas Huber // allocate their buffers in local address space. This renderer 9450a5ca668c6f7d45706e9aec4a1dfec0aacc6d233Andreas Huber // then performs a color conversion and copy to get the data 9460a5ca668c6f7d45706e9aec4a1dfec0aacc6d233Andreas Huber // into the ANativeBuffer. 9471173118eace0e9e347cb007f0da817cee87579edGlenn Kasten mVideoRenderer = new AwesomeLocalRenderer(mNativeWindow, meta); 948bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber } 949bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber} 950bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber 951bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huberstatus_t AwesomePlayer::pause() { 952bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber Mutex::Autolock autoLock(mLock); 9530a5baa9b411fe086013d2a5e9126ed63fbad046cAndreas Huber 9540a5baa9b411fe086013d2a5e9126ed63fbad046cAndreas Huber mFlags &= ~CACHE_UNDERRUN; 9550a5baa9b411fe086013d2a5e9126ed63fbad046cAndreas Huber 956bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber return pause_l(); 957bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber} 958bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber 959b2e3954c94717e43b3dc9b880564f166cfbbc0a2Andreas Huberstatus_t AwesomePlayer::pause_l(bool at_eos) { 960bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber if (!(mFlags & PLAYING)) { 961bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber return OK; 962bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber } 963bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber 96466b0a35c9a4136a84c3f73b1b25fcb5220138b95Andreas Huber cancelPlayerEvents(true /* keepBufferingGoing */); 965bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber 966f03034408506051f2f836e59305fcd5f662bf19aAndreas Huber if (mAudioPlayer != NULL && (mFlags & AUDIO_RUNNING)) { 967b2e3954c94717e43b3dc9b880564f166cfbbc0a2Andreas Huber if (at_eos) { 968b2e3954c94717e43b3dc9b880564f166cfbbc0a2Andreas Huber // If we played the audio stream to completion we 969b2e3954c94717e43b3dc9b880564f166cfbbc0a2Andreas Huber // want to make sure that all samples remaining in the audio 970b2e3954c94717e43b3dc9b880564f166cfbbc0a2Andreas Huber // track's queue are played out. 971b2e3954c94717e43b3dc9b880564f166cfbbc0a2Andreas Huber mAudioPlayer->pause(true /* playPendingSamples */); 972b2e3954c94717e43b3dc9b880564f166cfbbc0a2Andreas Huber } else { 973b2e3954c94717e43b3dc9b880564f166cfbbc0a2Andreas Huber mAudioPlayer->pause(); 974b2e3954c94717e43b3dc9b880564f166cfbbc0a2Andreas Huber } 975f03034408506051f2f836e59305fcd5f662bf19aAndreas Huber 976f03034408506051f2f836e59305fcd5f662bf19aAndreas Huber mFlags &= ~AUDIO_RUNNING; 977bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber } 978bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber 979bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber mFlags &= ~PLAYING; 980bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber 981dcd25efb46c41c8d24a0a9cf61fb57f84149709eGloria Wang if (mDecryptHandle != NULL) { 982dcd25efb46c41c8d24a0a9cf61fb57f84149709eGloria Wang mDrmManagerClient->setPlaybackStatus(mDecryptHandle, 983dcd25efb46c41c8d24a0a9cf61fb57f84149709eGloria Wang Playback::PAUSE, 0); 984dcd25efb46c41c8d24a0a9cf61fb57f84149709eGloria Wang } 985dcd25efb46c41c8d24a0a9cf61fb57f84149709eGloria Wang 9867cf180c9bff69e5cc4a2f4e53b432db45ebbebabGloria Wang uint32_t params = IMediaPlayerService::kBatteryDataTrackDecoder; 9877cf180c9bff69e5cc4a2f4e53b432db45ebbebabGloria Wang if ((mAudioSource != NULL) && (mAudioSource != mAudioTrack)) { 9887cf180c9bff69e5cc4a2f4e53b432db45ebbebabGloria Wang params |= IMediaPlayerService::kBatteryDataTrackAudio; 9897cf180c9bff69e5cc4a2f4e53b432db45ebbebabGloria Wang } 9907cf180c9bff69e5cc4a2f4e53b432db45ebbebabGloria Wang if (mVideoSource != NULL) { 9917cf180c9bff69e5cc4a2f4e53b432db45ebbebabGloria Wang params |= IMediaPlayerService::kBatteryDataTrackVideo; 9927cf180c9bff69e5cc4a2f4e53b432db45ebbebabGloria Wang } 9937cf180c9bff69e5cc4a2f4e53b432db45ebbebabGloria Wang 9947cf180c9bff69e5cc4a2f4e53b432db45ebbebabGloria Wang addBatteryData(params); 9957cf180c9bff69e5cc4a2f4e53b432db45ebbebabGloria Wang 996bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber return OK; 997bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber} 998bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber 999bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huberbool AwesomePlayer::isPlaying() const { 10000a5baa9b411fe086013d2a5e9126ed63fbad046cAndreas Huber return (mFlags & PLAYING) || (mFlags & CACHE_UNDERRUN); 1001bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber} 1002bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber 10035daeb129a2c2ba3d14ccd94af283b5f561c783eaAndreas Hubervoid AwesomePlayer::setSurface(const sp<Surface> &surface) { 10045daeb129a2c2ba3d14ccd94af283b5f561c783eaAndreas Huber Mutex::Autolock autoLock(mLock); 10055daeb129a2c2ba3d14ccd94af283b5f561c783eaAndreas Huber 10065daeb129a2c2ba3d14ccd94af283b5f561c783eaAndreas Huber mSurface = surface; 10071173118eace0e9e347cb007f0da817cee87579edGlenn Kasten mNativeWindow = surface; 10081173118eace0e9e347cb007f0da817cee87579edGlenn Kasten} 10091173118eace0e9e347cb007f0da817cee87579edGlenn Kasten 10101173118eace0e9e347cb007f0da817cee87579edGlenn Kastenvoid AwesomePlayer::setSurfaceTexture(const sp<ISurfaceTexture> &surfaceTexture) { 10111173118eace0e9e347cb007f0da817cee87579edGlenn Kasten Mutex::Autolock autoLock(mLock); 10121173118eace0e9e347cb007f0da817cee87579edGlenn Kasten 10131173118eace0e9e347cb007f0da817cee87579edGlenn Kasten mSurface.clear(); 10141173118eace0e9e347cb007f0da817cee87579edGlenn Kasten if (surfaceTexture != NULL) { 10151173118eace0e9e347cb007f0da817cee87579edGlenn Kasten mNativeWindow = new SurfaceTextureClient(surfaceTexture); 10161173118eace0e9e347cb007f0da817cee87579edGlenn Kasten } 10171173118eace0e9e347cb007f0da817cee87579edGlenn Kasten 10185daeb129a2c2ba3d14ccd94af283b5f561c783eaAndreas Huber} 10195daeb129a2c2ba3d14ccd94af283b5f561c783eaAndreas Huber 1020bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Hubervoid AwesomePlayer::setAudioSink( 1021bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber const sp<MediaPlayerBase::AudioSink> &audioSink) { 1022bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber Mutex::Autolock autoLock(mLock); 1023bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber 1024bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber mAudioSink = audioSink; 1025bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber} 1026bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber 1027bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huberstatus_t AwesomePlayer::setLooping(bool shouldLoop) { 1028bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber Mutex::Autolock autoLock(mLock); 1029bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber 1030bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber mFlags = mFlags & ~LOOPING; 1031bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber 1032bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber if (shouldLoop) { 1033bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber mFlags |= LOOPING; 1034bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber } 1035bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber 1036bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber return OK; 1037bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber} 1038bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber 1039bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huberstatus_t AwesomePlayer::getDuration(int64_t *durationUs) { 10402415ecb5bb4e1459024f6d6c8ae2d6e3dc4fbdc7Andreas Huber Mutex::Autolock autoLock(mMiscStateLock); 1041bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber 1042bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber if (mDurationUs < 0) { 1043bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber return UNKNOWN_ERROR; 1044bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber } 1045bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber 1046bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber *durationUs = mDurationUs; 1047bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber 1048bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber return OK; 1049bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber} 1050bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber 1051bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huberstatus_t AwesomePlayer::getPosition(int64_t *positionUs) { 10528d342970108926c4ea355c90d26a2a353ec0fd47Andreas Huber if (mRTSPController != NULL) { 10538d342970108926c4ea355c90d26a2a353ec0fd47Andreas Huber *positionUs = mRTSPController->getNormalPlayTimeUs(); 10548d342970108926c4ea355c90d26a2a353ec0fd47Andreas Huber } 105564bb6983690bf994d904591145a3cdd6373bdbe6Andreas Huber else if (mSeeking != NO_SEEK) { 1056dac4ee72bac87388a1495e098f39d73168c8078fAndreas Huber *positionUs = mSeekTimeUs; 1057dac4ee72bac87388a1495e098f39d73168c8078fAndreas Huber } else if (mVideoSource != NULL) { 10582415ecb5bb4e1459024f6d6c8ae2d6e3dc4fbdc7Andreas Huber Mutex::Autolock autoLock(mMiscStateLock); 1059bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber *positionUs = mVideoTimeUs; 1060bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber } else if (mAudioPlayer != NULL) { 1061bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber *positionUs = mAudioPlayer->getMediaTimeUs(); 1062bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber } else { 1063bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber *positionUs = 0; 1064bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber } 1065bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber 1066bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber return OK; 1067bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber} 1068bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber 1069bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huberstatus_t AwesomePlayer::seekTo(int64_t timeUs) { 107070f521de2675ce6eedf4b22beed94ea1289b0f38Andreas Huber if (mExtractorFlags & MediaExtractor::CAN_SEEK) { 1071acdd9d0f59c3d8bdc3de80664a609527ec3d21e2Andreas Huber Mutex::Autolock autoLock(mLock); 1072acdd9d0f59c3d8bdc3de80664a609527ec3d21e2Andreas Huber return seekTo_l(timeUs); 1073acdd9d0f59c3d8bdc3de80664a609527ec3d21e2Andreas Huber } 1074acdd9d0f59c3d8bdc3de80664a609527ec3d21e2Andreas Huber 1075acdd9d0f59c3d8bdc3de80664a609527ec3d21e2Andreas Huber return OK; 1076bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber} 1077bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber 10780dcd837af4169bdb6fb2a0c384722dc4f57433c6Andreas Huber// static 10790dcd837af4169bdb6fb2a0c384722dc4f57433c6Andreas Hubervoid AwesomePlayer::OnRTSPSeekDoneWrapper(void *cookie) { 10800dcd837af4169bdb6fb2a0c384722dc4f57433c6Andreas Huber static_cast<AwesomePlayer *>(cookie)->onRTSPSeekDone(); 10810dcd837af4169bdb6fb2a0c384722dc4f57433c6Andreas Huber} 10820dcd837af4169bdb6fb2a0c384722dc4f57433c6Andreas Huber 10830dcd837af4169bdb6fb2a0c384722dc4f57433c6Andreas Hubervoid AwesomePlayer::onRTSPSeekDone() { 10840dcd837af4169bdb6fb2a0c384722dc4f57433c6Andreas Huber notifyListener_l(MEDIA_SEEK_COMPLETE); 10850dcd837af4169bdb6fb2a0c384722dc4f57433c6Andreas Huber mSeekNotificationSent = true; 10860dcd837af4169bdb6fb2a0c384722dc4f57433c6Andreas Huber} 10870dcd837af4169bdb6fb2a0c384722dc4f57433c6Andreas Huber 1088bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huberstatus_t AwesomePlayer::seekTo_l(int64_t timeUs) { 1089cce326fe43411855aca2f719e505b051bc4b61b3Andreas Huber if (mRTSPController != NULL) { 10900dcd837af4169bdb6fb2a0c384722dc4f57433c6Andreas Huber mRTSPController->seekAsync(timeUs, OnRTSPSeekDoneWrapper, this); 1091cce326fe43411855aca2f719e505b051bc4b61b3Andreas Huber return OK; 1092cce326fe43411855aca2f719e505b051bc4b61b3Andreas Huber } 1093cce326fe43411855aca2f719e505b051bc4b61b3Andreas Huber 10940a5baa9b411fe086013d2a5e9126ed63fbad046cAndreas Huber if (mFlags & CACHE_UNDERRUN) { 10950a5baa9b411fe086013d2a5e9126ed63fbad046cAndreas Huber mFlags &= ~CACHE_UNDERRUN; 10960a5baa9b411fe086013d2a5e9126ed63fbad046cAndreas Huber play_l(); 10970a5baa9b411fe086013d2a5e9126ed63fbad046cAndreas Huber } 10980a5baa9b411fe086013d2a5e9126ed63fbad046cAndreas Huber 109964bb6983690bf994d904591145a3cdd6373bdbe6Andreas Huber mSeeking = SEEK; 11001321fdd94d354431b930735e9f38f32ecd189a2dAndreas Huber mSeekNotificationSent = false; 1101bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber mSeekTimeUs = timeUs; 11025d2de4da54504836e4b772b3010ac28c19f667f0Andreas Huber mFlags &= ~(AT_EOS | AUDIO_AT_EOS | VIDEO_AT_EOS); 1103bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber 1104bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber seekAudioIfNecessary_l(); 1105bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber 11061321fdd94d354431b930735e9f38f32ecd189a2dAndreas Huber if (!(mFlags & PLAYING)) { 11071321fdd94d354431b930735e9f38f32ecd189a2dAndreas Huber LOGV("seeking while paused, sending SEEK_COMPLETE notification" 11081321fdd94d354431b930735e9f38f32ecd189a2dAndreas Huber " immediately."); 11091321fdd94d354431b930735e9f38f32ecd189a2dAndreas Huber 11101321fdd94d354431b930735e9f38f32ecd189a2dAndreas Huber notifyListener_l(MEDIA_SEEK_COMPLETE); 11111321fdd94d354431b930735e9f38f32ecd189a2dAndreas Huber mSeekNotificationSent = true; 11122b1222f8938356669672f35e0e53e176c78c40efAndreas Huber 11132b1222f8938356669672f35e0e53e176c78c40efAndreas Huber if ((mFlags & PREPARED) && mVideoSource != NULL) { 11142b1222f8938356669672f35e0e53e176c78c40efAndreas Huber mFlags |= SEEK_PREVIEW; 11152b1222f8938356669672f35e0e53e176c78c40efAndreas Huber postVideoEvent_l(); 11162b1222f8938356669672f35e0e53e176c78c40efAndreas Huber } 11171321fdd94d354431b930735e9f38f32ecd189a2dAndreas Huber } 11181321fdd94d354431b930735e9f38f32ecd189a2dAndreas Huber 1119bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber return OK; 1120bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber} 1121bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber 1122bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Hubervoid AwesomePlayer::seekAudioIfNecessary_l() { 112364bb6983690bf994d904591145a3cdd6373bdbe6Andreas Huber if (mSeeking != NO_SEEK && mVideoSource == NULL && mAudioPlayer != NULL) { 1124bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber mAudioPlayer->seekTo(mSeekTimeUs); 1125bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber 11261862a33b246249630b654182afb5914da3480d4cAndreas Huber mWatchForAudioSeekComplete = true; 11271862a33b246249630b654182afb5914da3480d4cAndreas Huber mWatchForAudioEOS = true; 11281321fdd94d354431b930735e9f38f32ecd189a2dAndreas Huber mSeekNotificationSent = false; 1129dcd25efb46c41c8d24a0a9cf61fb57f84149709eGloria Wang 1130dcd25efb46c41c8d24a0a9cf61fb57f84149709eGloria Wang if (mDecryptHandle != NULL) { 1131dcd25efb46c41c8d24a0a9cf61fb57f84149709eGloria Wang mDrmManagerClient->setPlaybackStatus(mDecryptHandle, 1132dcd25efb46c41c8d24a0a9cf61fb57f84149709eGloria Wang Playback::PAUSE, 0); 1133dcd25efb46c41c8d24a0a9cf61fb57f84149709eGloria Wang mDrmManagerClient->setPlaybackStatus(mDecryptHandle, 1134dcd25efb46c41c8d24a0a9cf61fb57f84149709eGloria Wang Playback::START, mSeekTimeUs / 1000); 1135dcd25efb46c41c8d24a0a9cf61fb57f84149709eGloria Wang } 1136bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber } 1137bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber} 1138bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber 113988d8a83de12592635248aa1a3bd6b9ea46108501Andreas Hubervoid AwesomePlayer::setAudioSource(sp<MediaSource> source) { 114088d8a83de12592635248aa1a3bd6b9ea46108501Andreas Huber CHECK(source != NULL); 1141bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber 114288d8a83de12592635248aa1a3bd6b9ea46108501Andreas Huber mAudioTrack = source; 114388d8a83de12592635248aa1a3bd6b9ea46108501Andreas Huber} 114488d8a83de12592635248aa1a3bd6b9ea46108501Andreas Huber 114588d8a83de12592635248aa1a3bd6b9ea46108501Andreas Huberstatus_t AwesomePlayer::initAudioDecoder() { 114688d8a83de12592635248aa1a3bd6b9ea46108501Andreas Huber sp<MetaData> meta = mAudioTrack->getFormat(); 1147717826ececd8d39596f62418677721d70776add1Andreas Huber 1148717826ececd8d39596f62418677721d70776add1Andreas Huber const char *mime; 1149717826ececd8d39596f62418677721d70776add1Andreas Huber CHECK(meta->findCString(kKeyMIMEType, &mime)); 1150717826ececd8d39596f62418677721d70776add1Andreas Huber 1151717826ececd8d39596f62418677721d70776add1Andreas Huber if (!strcasecmp(mime, MEDIA_MIMETYPE_AUDIO_RAW)) { 115288d8a83de12592635248aa1a3bd6b9ea46108501Andreas Huber mAudioSource = mAudioTrack; 1153717826ececd8d39596f62418677721d70776add1Andreas Huber } else { 1154717826ececd8d39596f62418677721d70776add1Andreas Huber mAudioSource = OMXCodec::Create( 115588d8a83de12592635248aa1a3bd6b9ea46108501Andreas Huber mClient.interface(), mAudioTrack->getFormat(), 1156717826ececd8d39596f62418677721d70776add1Andreas Huber false, // createEncoder 115788d8a83de12592635248aa1a3bd6b9ea46108501Andreas Huber mAudioTrack); 1158717826ececd8d39596f62418677721d70776add1Andreas Huber } 1159bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber 1160bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber if (mAudioSource != NULL) { 1161bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber int64_t durationUs; 116288d8a83de12592635248aa1a3bd6b9ea46108501Andreas Huber if (mAudioTrack->getFormat()->findInt64(kKeyDuration, &durationUs)) { 11632415ecb5bb4e1459024f6d6c8ae2d6e3dc4fbdc7Andreas Huber Mutex::Autolock autoLock(mMiscStateLock); 1164bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber if (mDurationUs < 0 || durationUs > mDurationUs) { 1165bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber mDurationUs = durationUs; 1166bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber } 1167bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber } 1168bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber 1169a945bfd91aa291fba4d9201ffcb38fce40eab7feAndreas Huber status_t err = mAudioSource->start(); 1170a945bfd91aa291fba4d9201ffcb38fce40eab7feAndreas Huber 1171a945bfd91aa291fba4d9201ffcb38fce40eab7feAndreas Huber if (err != OK) { 1172a945bfd91aa291fba4d9201ffcb38fce40eab7feAndreas Huber mAudioSource.clear(); 1173a945bfd91aa291fba4d9201ffcb38fce40eab7feAndreas Huber return err; 1174a945bfd91aa291fba4d9201ffcb38fce40eab7feAndreas Huber } 117581f82c32459029bf0744e28c73f95a7f18cab5acAndreas Huber } else if (!strcasecmp(mime, MEDIA_MIMETYPE_AUDIO_QCELP)) { 117681f82c32459029bf0744e28c73f95a7f18cab5acAndreas Huber // For legacy reasons we're simply going to ignore the absence 117781f82c32459029bf0744e28c73f95a7f18cab5acAndreas Huber // of an audio decoder for QCELP instead of aborting playback 117881f82c32459029bf0744e28c73f95a7f18cab5acAndreas Huber // altogether. 117981f82c32459029bf0744e28c73f95a7f18cab5acAndreas Huber return OK; 118081f82c32459029bf0744e28c73f95a7f18cab5acAndreas Huber } 1181e7e3b785a0e7819db4c895a4f60e9a4dd755880cAndreas Huber 1182bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber return mAudioSource != NULL ? OK : UNKNOWN_ERROR; 1183bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber} 1184bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber 118588d8a83de12592635248aa1a3bd6b9ea46108501Andreas Hubervoid AwesomePlayer::setVideoSource(sp<MediaSource> source) { 118688d8a83de12592635248aa1a3bd6b9ea46108501Andreas Huber CHECK(source != NULL); 1187bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber 118888d8a83de12592635248aa1a3bd6b9ea46108501Andreas Huber mVideoTrack = source; 118988d8a83de12592635248aa1a3bd6b9ea46108501Andreas Huber} 119088d8a83de12592635248aa1a3bd6b9ea46108501Andreas Huber 11912a4d22d79e927f2245537921e10fc5fda1c47a29Andreas Huberstatus_t AwesomePlayer::initVideoDecoder(uint32_t flags) { 1192bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber mVideoSource = OMXCodec::Create( 119388d8a83de12592635248aa1a3bd6b9ea46108501Andreas Huber mClient.interface(), mVideoTrack->getFormat(), 1194bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber false, // createEncoder 119539ddf8e0f18766f7ba1e3246b774aa6ebd93eea8Andreas Huber mVideoTrack, 11961173118eace0e9e347cb007f0da817cee87579edGlenn Kasten NULL, flags, USE_SURFACE_ALLOC ? mNativeWindow : NULL); 1197bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber 1198bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber if (mVideoSource != NULL) { 1199bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber int64_t durationUs; 120088d8a83de12592635248aa1a3bd6b9ea46108501Andreas Huber if (mVideoTrack->getFormat()->findInt64(kKeyDuration, &durationUs)) { 12012415ecb5bb4e1459024f6d6c8ae2d6e3dc4fbdc7Andreas Huber Mutex::Autolock autoLock(mMiscStateLock); 1202bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber if (mDurationUs < 0 || durationUs > mDurationUs) { 1203bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber mDurationUs = durationUs; 1204bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber } 1205bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber } 1206bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber 1207139a5d5bd33c9fc7708d0a79f11ee928f7796e6bAndreas Huber status_t err = mVideoSource->start(); 1208139a5d5bd33c9fc7708d0a79f11ee928f7796e6bAndreas Huber 1209139a5d5bd33c9fc7708d0a79f11ee928f7796e6bAndreas Huber if (err != OK) { 1210139a5d5bd33c9fc7708d0a79f11ee928f7796e6bAndreas Huber mVideoSource.clear(); 1211139a5d5bd33c9fc7708d0a79f11ee928f7796e6bAndreas Huber return err; 1212139a5d5bd33c9fc7708d0a79f11ee928f7796e6bAndreas Huber } 1213bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber } 1214bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber 1215bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber return mVideoSource != NULL ? OK : UNKNOWN_ERROR; 1216bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber} 1217bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber 12184769cc92740e3ab58e9263d42553c12bbf79e3beAndreas Hubervoid AwesomePlayer::finishSeekIfNecessary(int64_t videoTimeUs) { 121964bb6983690bf994d904591145a3cdd6373bdbe6Andreas Huber if (mSeeking == SEEK_VIDEO_ONLY) { 122064bb6983690bf994d904591145a3cdd6373bdbe6Andreas Huber mSeeking = NO_SEEK; 122164bb6983690bf994d904591145a3cdd6373bdbe6Andreas Huber return; 122264bb6983690bf994d904591145a3cdd6373bdbe6Andreas Huber } 122364bb6983690bf994d904591145a3cdd6373bdbe6Andreas Huber 122464bb6983690bf994d904591145a3cdd6373bdbe6Andreas Huber if (mSeeking == NO_SEEK || (mFlags & SEEK_PREVIEW)) { 12254769cc92740e3ab58e9263d42553c12bbf79e3beAndreas Huber return; 12264769cc92740e3ab58e9263d42553c12bbf79e3beAndreas Huber } 12274769cc92740e3ab58e9263d42553c12bbf79e3beAndreas Huber 12284769cc92740e3ab58e9263d42553c12bbf79e3beAndreas Huber if (mAudioPlayer != NULL) { 1229f83dd80384f70da1f6d36d60e831439ff7739ad7Jamie Gennis LOGV("seeking audio to %lld us (%.2f secs).", videoTimeUs, videoTimeUs / 1E6); 12304769cc92740e3ab58e9263d42553c12bbf79e3beAndreas Huber 12314769cc92740e3ab58e9263d42553c12bbf79e3beAndreas Huber // If we don't have a video time, seek audio to the originally 12324769cc92740e3ab58e9263d42553c12bbf79e3beAndreas Huber // requested seek time instead. 12334769cc92740e3ab58e9263d42553c12bbf79e3beAndreas Huber 12344769cc92740e3ab58e9263d42553c12bbf79e3beAndreas Huber mAudioPlayer->seekTo(videoTimeUs < 0 ? mSeekTimeUs : videoTimeUs); 12354769cc92740e3ab58e9263d42553c12bbf79e3beAndreas Huber mWatchForAudioSeekComplete = true; 12364769cc92740e3ab58e9263d42553c12bbf79e3beAndreas Huber } else if (!mSeekNotificationSent) { 12374769cc92740e3ab58e9263d42553c12bbf79e3beAndreas Huber // If we're playing video only, report seek complete now, 12384769cc92740e3ab58e9263d42553c12bbf79e3beAndreas Huber // otherwise audio player will notify us later. 12394769cc92740e3ab58e9263d42553c12bbf79e3beAndreas Huber notifyListener_l(MEDIA_SEEK_COMPLETE); 12404769cc92740e3ab58e9263d42553c12bbf79e3beAndreas Huber } 12414769cc92740e3ab58e9263d42553c12bbf79e3beAndreas Huber 12424769cc92740e3ab58e9263d42553c12bbf79e3beAndreas Huber mFlags |= FIRST_FRAME; 124364bb6983690bf994d904591145a3cdd6373bdbe6Andreas Huber mSeeking = NO_SEEK; 12444769cc92740e3ab58e9263d42553c12bbf79e3beAndreas Huber mSeekNotificationSent = false; 1245a89082944308805b0def7de87c67e370e74b8789Gloria Wang 1246a89082944308805b0def7de87c67e370e74b8789Gloria Wang if (mDecryptHandle != NULL) { 1247a89082944308805b0def7de87c67e370e74b8789Gloria Wang mDrmManagerClient->setPlaybackStatus(mDecryptHandle, 1248a89082944308805b0def7de87c67e370e74b8789Gloria Wang Playback::PAUSE, 0); 1249a89082944308805b0def7de87c67e370e74b8789Gloria Wang mDrmManagerClient->setPlaybackStatus(mDecryptHandle, 1250a89082944308805b0def7de87c67e370e74b8789Gloria Wang Playback::START, videoTimeUs / 1000); 1251a89082944308805b0def7de87c67e370e74b8789Gloria Wang } 12524769cc92740e3ab58e9263d42553c12bbf79e3beAndreas Huber} 12534769cc92740e3ab58e9263d42553c12bbf79e3beAndreas Huber 1254c23f12af0394aa2f6651968a3c8840f1af317aa1Andreas Hubervoid AwesomePlayer::onVideoEvent() { 1255bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber Mutex::Autolock autoLock(mLock); 12567b3396acc702451be9bafb19d7fe26d55d43a316Andreas Huber if (!mVideoEventPending) { 12577b3396acc702451be9bafb19d7fe26d55d43a316Andreas Huber // The event has been cancelled in reset_l() but had already 12587b3396acc702451be9bafb19d7fe26d55d43a316Andreas Huber // been scheduled for execution at that time. 12597b3396acc702451be9bafb19d7fe26d55d43a316Andreas Huber return; 12607b3396acc702451be9bafb19d7fe26d55d43a316Andreas Huber } 1261bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber mVideoEventPending = false; 1262bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber 126364bb6983690bf994d904591145a3cdd6373bdbe6Andreas Huber if (mSeeking != NO_SEEK) { 1264bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber if (mVideoBuffer) { 1265bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber mVideoBuffer->release(); 1266bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber mVideoBuffer = NULL; 1267bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber } 12680a5baa9b411fe086013d2a5e9126ed63fbad046cAndreas Huber 126964bb6983690bf994d904591145a3cdd6373bdbe6Andreas Huber if (mSeeking == SEEK && mCachedSource != NULL && mAudioSource != NULL 12702b1222f8938356669672f35e0e53e176c78c40efAndreas Huber && !(mFlags & SEEK_PREVIEW)) { 12710a5baa9b411fe086013d2a5e9126ed63fbad046cAndreas Huber // We're going to seek the video source first, followed by 12720a5baa9b411fe086013d2a5e9126ed63fbad046cAndreas Huber // the audio source. 12730a5baa9b411fe086013d2a5e9126ed63fbad046cAndreas Huber // In order to avoid jumps in the DataSource offset caused by 12740a5baa9b411fe086013d2a5e9126ed63fbad046cAndreas Huber // the audio codec prefetching data from the old locations 12750a5baa9b411fe086013d2a5e9126ed63fbad046cAndreas Huber // while the video codec is already reading data from the new 12760a5baa9b411fe086013d2a5e9126ed63fbad046cAndreas Huber // locations, we'll "pause" the audio source, causing it to 12770a5baa9b411fe086013d2a5e9126ed63fbad046cAndreas Huber // stop reading input data until a subsequent seek. 12780a5baa9b411fe086013d2a5e9126ed63fbad046cAndreas Huber 1279f03034408506051f2f836e59305fcd5f662bf19aAndreas Huber if (mAudioPlayer != NULL && (mFlags & AUDIO_RUNNING)) { 12800a5baa9b411fe086013d2a5e9126ed63fbad046cAndreas Huber mAudioPlayer->pause(); 1281f03034408506051f2f836e59305fcd5f662bf19aAndreas Huber 1282f03034408506051f2f836e59305fcd5f662bf19aAndreas Huber mFlags &= ~AUDIO_RUNNING; 12830a5baa9b411fe086013d2a5e9126ed63fbad046cAndreas Huber } 12840a5baa9b411fe086013d2a5e9126ed63fbad046cAndreas Huber mAudioSource->pause(); 12850a5baa9b411fe086013d2a5e9126ed63fbad046cAndreas Huber } 1286bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber } 1287bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber 1288bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber if (!mVideoBuffer) { 1289bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber MediaSource::ReadOptions options; 129064bb6983690bf994d904591145a3cdd6373bdbe6Andreas Huber if (mSeeking != NO_SEEK) { 1291bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber LOGV("seeking to %lld us (%.2f secs)", mSeekTimeUs, mSeekTimeUs / 1E6); 1292bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber 1293abd1f4f870925d6776dbe4b930b759a1ab6595caAndreas Huber options.setSeekTo( 129464bb6983690bf994d904591145a3cdd6373bdbe6Andreas Huber mSeekTimeUs, 129564bb6983690bf994d904591145a3cdd6373bdbe6Andreas Huber mSeeking == SEEK_VIDEO_ONLY 129664bb6983690bf994d904591145a3cdd6373bdbe6Andreas Huber ? MediaSource::ReadOptions::SEEK_NEXT_SYNC 129764bb6983690bf994d904591145a3cdd6373bdbe6Andreas Huber : MediaSource::ReadOptions::SEEK_CLOSEST_SYNC); 1298bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber } 1299bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber for (;;) { 1300bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber status_t err = mVideoSource->read(&mVideoBuffer, &options); 1301c1689e49ac867de33f2e81289449878ac2e536a0Andreas Huber options.clearSeekTo(); 1302bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber 1303bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber if (err != OK) { 1304e2b1028852120bcfded33b8f06f66b780437fe92Andreas Huber CHECK(mVideoBuffer == NULL); 1305bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber 1306bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber if (err == INFO_FORMAT_CHANGED) { 1307bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber LOGV("VideoSource signalled format change."); 1308bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber 13095daeb129a2c2ba3d14ccd94af283b5f561c783eaAndreas Huber notifyVideoSize_l(); 13105daeb129a2c2ba3d14ccd94af283b5f561c783eaAndreas Huber 1311a657f8deaf21acbe5faba7be1df9c6681d44d471Andreas Huber if (mVideoRenderer != NULL) { 1312fa090f541bb84a546af2ec834e91a032ff10e66eAndreas Huber mVideoRendererIsPreview = false; 1313a657f8deaf21acbe5faba7be1df9c6681d44d471Andreas Huber initRenderer_l(); 1314a657f8deaf21acbe5faba7be1df9c6681d44d471Andreas Huber } 1315bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber continue; 1316bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber } 1317bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber 13184769cc92740e3ab58e9263d42553c12bbf79e3beAndreas Huber // So video playback is complete, but we may still have 13194769cc92740e3ab58e9263d42553c12bbf79e3beAndreas Huber // a seek request pending that needs to be applied 13204769cc92740e3ab58e9263d42553c12bbf79e3beAndreas Huber // to the audio track. 132164bb6983690bf994d904591145a3cdd6373bdbe6Andreas Huber if (mSeeking != NO_SEEK) { 13224769cc92740e3ab58e9263d42553c12bbf79e3beAndreas Huber LOGV("video stream ended while seeking!"); 13234769cc92740e3ab58e9263d42553c12bbf79e3beAndreas Huber } 13244769cc92740e3ab58e9263d42553c12bbf79e3beAndreas Huber finishSeekIfNecessary(-1); 13254769cc92740e3ab58e9263d42553c12bbf79e3beAndreas Huber 13265d2de4da54504836e4b772b3010ac28c19f667f0Andreas Huber mFlags |= VIDEO_AT_EOS; 13275295c0c55d41a2906ea7f65a3f22e6278cb17d4bAndreas Huber postStreamDoneEvent_l(err); 1328bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber return; 1329bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber } 1330bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber 13314844ac54e8b5997c3b03872dbafe8ebed4787517Andreas Huber if (mVideoBuffer->range_length() == 0) { 133208411b75d4c30ce26180639f158e2f33d190eee8Andreas Huber // Some decoders, notably the PV AVC software decoder 133308411b75d4c30ce26180639f158e2f33d190eee8Andreas Huber // return spurious empty buffers that we just want to ignore. 133408411b75d4c30ce26180639f158e2f33d190eee8Andreas Huber 13354844ac54e8b5997c3b03872dbafe8ebed4787517Andreas Huber mVideoBuffer->release(); 13364844ac54e8b5997c3b03872dbafe8ebed4787517Andreas Huber mVideoBuffer = NULL; 13374844ac54e8b5997c3b03872dbafe8ebed4787517Andreas Huber continue; 13384844ac54e8b5997c3b03872dbafe8ebed4787517Andreas Huber } 13394844ac54e8b5997c3b03872dbafe8ebed4787517Andreas Huber 1340bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber break; 1341bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber } 1342bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber } 1343bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber 1344bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber int64_t timeUs; 1345bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber CHECK(mVideoBuffer->meta_data()->findInt64(kKeyTime, &timeUs)); 1346bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber 134764bb6983690bf994d904591145a3cdd6373bdbe6Andreas Huber if (mSeeking == SEEK_VIDEO_ONLY) { 134864bb6983690bf994d904591145a3cdd6373bdbe6Andreas Huber if (mSeekTimeUs > timeUs) { 134964bb6983690bf994d904591145a3cdd6373bdbe6Andreas Huber LOGI("XXX mSeekTimeUs = %lld us, timeUs = %lld us", 135064bb6983690bf994d904591145a3cdd6373bdbe6Andreas Huber mSeekTimeUs, timeUs); 135164bb6983690bf994d904591145a3cdd6373bdbe6Andreas Huber } 135264bb6983690bf994d904591145a3cdd6373bdbe6Andreas Huber } 135364bb6983690bf994d904591145a3cdd6373bdbe6Andreas Huber 13542415ecb5bb4e1459024f6d6c8ae2d6e3dc4fbdc7Andreas Huber { 13552415ecb5bb4e1459024f6d6c8ae2d6e3dc4fbdc7Andreas Huber Mutex::Autolock autoLock(mMiscStateLock); 13562415ecb5bb4e1459024f6d6c8ae2d6e3dc4fbdc7Andreas Huber mVideoTimeUs = timeUs; 13572415ecb5bb4e1459024f6d6c8ae2d6e3dc4fbdc7Andreas Huber } 1358bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber 135964bb6983690bf994d904591145a3cdd6373bdbe6Andreas Huber SeekType wasSeeking = mSeeking; 13604769cc92740e3ab58e9263d42553c12bbf79e3beAndreas Huber finishSeekIfNecessary(timeUs); 1361bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber 1362f03034408506051f2f836e59305fcd5f662bf19aAndreas Huber if (mAudioPlayer != NULL && !(mFlags & (AUDIO_RUNNING | SEEK_PREVIEW))) { 1363f03034408506051f2f836e59305fcd5f662bf19aAndreas Huber status_t err = startAudioPlayer_l(); 1364f03034408506051f2f836e59305fcd5f662bf19aAndreas Huber if (err != OK) { 1365f03034408506051f2f836e59305fcd5f662bf19aAndreas Huber LOGE("Startung the audio player failed w/ err %d", err); 1366f03034408506051f2f836e59305fcd5f662bf19aAndreas Huber return; 1367f03034408506051f2f836e59305fcd5f662bf19aAndreas Huber } 1368f03034408506051f2f836e59305fcd5f662bf19aAndreas Huber } 1369f03034408506051f2f836e59305fcd5f662bf19aAndreas Huber 13705d2de4da54504836e4b772b3010ac28c19f667f0Andreas Huber TimeSource *ts = (mFlags & AUDIO_AT_EOS) ? &mSystemTimeSource : mTimeSource; 13715d2de4da54504836e4b772b3010ac28c19f667f0Andreas Huber 1372bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber if (mFlags & FIRST_FRAME) { 1373bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber mFlags &= ~FIRST_FRAME; 1374aee6c07b3572bf2510cd9e7d29c454fcfedde31dpmehendale mSinceLastDropped = 0; 13755d2de4da54504836e4b772b3010ac28c19f667f0Andreas Huber mTimeSourceDeltaUs = ts->getRealTimeUs() - timeUs; 1376bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber } 1377bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber 1378bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber int64_t realTimeUs, mediaTimeUs; 13795d2de4da54504836e4b772b3010ac28c19f667f0Andreas Huber if (!(mFlags & AUDIO_AT_EOS) && mAudioPlayer != NULL 1380bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber && mAudioPlayer->getMediaTimeMapping(&realTimeUs, &mediaTimeUs)) { 1381bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber mTimeSourceDeltaUs = realTimeUs - mediaTimeUs; 1382bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber } 1383bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber 138464bb6983690bf994d904591145a3cdd6373bdbe6Andreas Huber if (wasSeeking == SEEK_VIDEO_ONLY) { 138564bb6983690bf994d904591145a3cdd6373bdbe6Andreas Huber int64_t nowUs = ts->getRealTimeUs() - mTimeSourceDeltaUs; 138664bb6983690bf994d904591145a3cdd6373bdbe6Andreas Huber 138764bb6983690bf994d904591145a3cdd6373bdbe6Andreas Huber int64_t latenessUs = nowUs - timeUs; 138864bb6983690bf994d904591145a3cdd6373bdbe6Andreas Huber 138964bb6983690bf994d904591145a3cdd6373bdbe6Andreas Huber if (latenessUs > 0) { 139064bb6983690bf994d904591145a3cdd6373bdbe6Andreas Huber LOGI("after SEEK_VIDEO_ONLY we're late by %.2f secs", latenessUs / 1E6); 139164bb6983690bf994d904591145a3cdd6373bdbe6Andreas Huber } 139264bb6983690bf994d904591145a3cdd6373bdbe6Andreas Huber } 139364bb6983690bf994d904591145a3cdd6373bdbe6Andreas Huber 139464bb6983690bf994d904591145a3cdd6373bdbe6Andreas Huber if (wasSeeking == NO_SEEK) { 139502a1db7dc1de2f2df306ec10bab992bc8bbaaca8Andreas Huber // Let's display the first frame after seeking right away. 1396f8ca90452ff3e252f20de38f1c3eee524c808c3eAndreas Huber 13972b1222f8938356669672f35e0e53e176c78c40efAndreas Huber int64_t nowUs = ts->getRealTimeUs() - mTimeSourceDeltaUs; 1398bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber 13992b1222f8938356669672f35e0e53e176c78c40efAndreas Huber int64_t latenessUs = nowUs - timeUs; 14002b1222f8938356669672f35e0e53e176c78c40efAndreas Huber 140164bb6983690bf994d904591145a3cdd6373bdbe6Andreas Huber if (latenessUs > 500000ll 140264bb6983690bf994d904591145a3cdd6373bdbe6Andreas Huber && mRTSPController == NULL 140364bb6983690bf994d904591145a3cdd6373bdbe6Andreas Huber && mAudioPlayer != NULL 140464bb6983690bf994d904591145a3cdd6373bdbe6Andreas Huber && mAudioPlayer->getMediaTimeMapping( 140564bb6983690bf994d904591145a3cdd6373bdbe6Andreas Huber &realTimeUs, &mediaTimeUs)) { 140664bb6983690bf994d904591145a3cdd6373bdbe6Andreas Huber LOGI("we're much too late (%.2f secs), video skipping ahead", 140764bb6983690bf994d904591145a3cdd6373bdbe6Andreas Huber latenessUs / 1E6); 140864bb6983690bf994d904591145a3cdd6373bdbe6Andreas Huber 140964bb6983690bf994d904591145a3cdd6373bdbe6Andreas Huber mVideoBuffer->release(); 141064bb6983690bf994d904591145a3cdd6373bdbe6Andreas Huber mVideoBuffer = NULL; 141164bb6983690bf994d904591145a3cdd6373bdbe6Andreas Huber 141264bb6983690bf994d904591145a3cdd6373bdbe6Andreas Huber mSeeking = SEEK_VIDEO_ONLY; 141364bb6983690bf994d904591145a3cdd6373bdbe6Andreas Huber mSeekTimeUs = mediaTimeUs; 141464bb6983690bf994d904591145a3cdd6373bdbe6Andreas Huber 141564bb6983690bf994d904591145a3cdd6373bdbe6Andreas Huber postVideoEvent_l(); 141664bb6983690bf994d904591145a3cdd6373bdbe6Andreas Huber return; 141764bb6983690bf994d904591145a3cdd6373bdbe6Andreas Huber } 141864bb6983690bf994d904591145a3cdd6373bdbe6Andreas Huber 14192b1222f8938356669672f35e0e53e176c78c40efAndreas Huber if (latenessUs > 40000) { 14202b1222f8938356669672f35e0e53e176c78c40efAndreas Huber // We're more than 40ms late. 14212b1222f8938356669672f35e0e53e176c78c40efAndreas Huber LOGV("we're late by %lld us (%.2f secs)", latenessUs, latenessUs / 1E6); 14222b1222f8938356669672f35e0e53e176c78c40efAndreas Huber if ( mSinceLastDropped > FRAME_DROP_FREQ) 14232b1222f8938356669672f35e0e53e176c78c40efAndreas Huber { 14242b1222f8938356669672f35e0e53e176c78c40efAndreas Huber LOGV("we're late by %lld us (%.2f secs) dropping one after %d frames", latenessUs, latenessUs / 1E6, mSinceLastDropped); 14252b1222f8938356669672f35e0e53e176c78c40efAndreas Huber mSinceLastDropped = 0; 14262b1222f8938356669672f35e0e53e176c78c40efAndreas Huber mVideoBuffer->release(); 14272b1222f8938356669672f35e0e53e176c78c40efAndreas Huber mVideoBuffer = NULL; 14282b1222f8938356669672f35e0e53e176c78c40efAndreas Huber 14292b1222f8938356669672f35e0e53e176c78c40efAndreas Huber postVideoEvent_l(); 14302b1222f8938356669672f35e0e53e176c78c40efAndreas Huber return; 14312b1222f8938356669672f35e0e53e176c78c40efAndreas Huber } 1432aee6c07b3572bf2510cd9e7d29c454fcfedde31dpmehendale } 1433bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber 14342b1222f8938356669672f35e0e53e176c78c40efAndreas Huber if (latenessUs < -10000) { 14352b1222f8938356669672f35e0e53e176c78c40efAndreas Huber // We're more than 10ms early. 1436bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber 14372b1222f8938356669672f35e0e53e176c78c40efAndreas Huber postVideoEvent_l(10000); 14382b1222f8938356669672f35e0e53e176c78c40efAndreas Huber return; 14392b1222f8938356669672f35e0e53e176c78c40efAndreas Huber } 1440bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber } 1441bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber 1442fa090f541bb84a546af2ec834e91a032ff10e66eAndreas Huber if (mVideoRendererIsPreview || mVideoRenderer == NULL) { 1443fa090f541bb84a546af2ec834e91a032ff10e66eAndreas Huber mVideoRendererIsPreview = false; 1444fa090f541bb84a546af2ec834e91a032ff10e66eAndreas Huber 1445a657f8deaf21acbe5faba7be1df9c6681d44d471Andreas Huber initRenderer_l(); 1446a657f8deaf21acbe5faba7be1df9c6681d44d471Andreas Huber } 1447a657f8deaf21acbe5faba7be1df9c6681d44d471Andreas Huber 1448a657f8deaf21acbe5faba7be1df9c6681d44d471Andreas Huber if (mVideoRenderer != NULL) { 1449aee6c07b3572bf2510cd9e7d29c454fcfedde31dpmehendale mSinceLastDropped++; 1450a657f8deaf21acbe5faba7be1df9c6681d44d471Andreas Huber mVideoRenderer->render(mVideoBuffer); 1451a657f8deaf21acbe5faba7be1df9c6681d44d471Andreas Huber } 1452bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber 1453f5ab57c2d5e02af7483c94eddb177e4f5c9e9892Andreas Huber mVideoBuffer->release(); 1454bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber mVideoBuffer = NULL; 1455bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber 145664bb6983690bf994d904591145a3cdd6373bdbe6Andreas Huber if (wasSeeking != NO_SEEK && (mFlags & SEEK_PREVIEW)) { 14572b1222f8938356669672f35e0e53e176c78c40efAndreas Huber mFlags &= ~SEEK_PREVIEW; 14582b1222f8938356669672f35e0e53e176c78c40efAndreas Huber return; 14592b1222f8938356669672f35e0e53e176c78c40efAndreas Huber } 14602b1222f8938356669672f35e0e53e176c78c40efAndreas Huber 1461bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber postVideoEvent_l(); 1462bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber} 1463bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber 1464bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Hubervoid AwesomePlayer::postVideoEvent_l(int64_t delayUs) { 1465bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber if (mVideoEventPending) { 1466bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber return; 1467bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber } 1468bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber 1469bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber mVideoEventPending = true; 1470bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber mQueue.postEventWithDelay(mVideoEvent, delayUs < 0 ? 10000 : delayUs); 1471bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber} 1472bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber 14735295c0c55d41a2906ea7f65a3f22e6278cb17d4bAndreas Hubervoid AwesomePlayer::postStreamDoneEvent_l(status_t status) { 1474bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber if (mStreamDoneEventPending) { 1475bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber return; 1476bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber } 1477bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber mStreamDoneEventPending = true; 14785295c0c55d41a2906ea7f65a3f22e6278cb17d4bAndreas Huber 14795295c0c55d41a2906ea7f65a3f22e6278cb17d4bAndreas Huber mStreamDoneStatus = status; 1480bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber mQueue.postEvent(mStreamDoneEvent); 1481bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber} 1482bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber 148366b0a35c9a4136a84c3f73b1b25fcb5220138b95Andreas Hubervoid AwesomePlayer::postBufferingEvent_l() { 148466b0a35c9a4136a84c3f73b1b25fcb5220138b95Andreas Huber if (mBufferingEventPending) { 148566b0a35c9a4136a84c3f73b1b25fcb5220138b95Andreas Huber return; 148666b0a35c9a4136a84c3f73b1b25fcb5220138b95Andreas Huber } 148766b0a35c9a4136a84c3f73b1b25fcb5220138b95Andreas Huber mBufferingEventPending = true; 148866b0a35c9a4136a84c3f73b1b25fcb5220138b95Andreas Huber mQueue.postEventWithDelay(mBufferingEvent, 1000000ll); 148966b0a35c9a4136a84c3f73b1b25fcb5220138b95Andreas Huber} 149066b0a35c9a4136a84c3f73b1b25fcb5220138b95Andreas Huber 1491145e68fc778275963189b02a1adcbe27cce4d769Andreas Hubervoid AwesomePlayer::postVideoLagEvent_l() { 1492145e68fc778275963189b02a1adcbe27cce4d769Andreas Huber if (mVideoLagEventPending) { 1493145e68fc778275963189b02a1adcbe27cce4d769Andreas Huber return; 1494145e68fc778275963189b02a1adcbe27cce4d769Andreas Huber } 1495145e68fc778275963189b02a1adcbe27cce4d769Andreas Huber mVideoLagEventPending = true; 1496145e68fc778275963189b02a1adcbe27cce4d769Andreas Huber mQueue.postEventWithDelay(mVideoLagEvent, 1000000ll); 1497145e68fc778275963189b02a1adcbe27cce4d769Andreas Huber} 1498145e68fc778275963189b02a1adcbe27cce4d769Andreas Huber 14991862a33b246249630b654182afb5914da3480d4cAndreas Hubervoid AwesomePlayer::postCheckAudioStatusEvent_l() { 15001862a33b246249630b654182afb5914da3480d4cAndreas Huber if (mAudioStatusEventPending) { 15011862a33b246249630b654182afb5914da3480d4cAndreas Huber return; 15021862a33b246249630b654182afb5914da3480d4cAndreas Huber } 15031862a33b246249630b654182afb5914da3480d4cAndreas Huber mAudioStatusEventPending = true; 1504ed54ad0f8619ae416b0968ade6248894cbfc4dbaAndreas Huber mQueue.postEvent(mCheckAudioStatusEvent); 15051862a33b246249630b654182afb5914da3480d4cAndreas Huber} 15061862a33b246249630b654182afb5914da3480d4cAndreas Huber 15071862a33b246249630b654182afb5914da3480d4cAndreas Hubervoid AwesomePlayer::onCheckAudioStatus() { 15081862a33b246249630b654182afb5914da3480d4cAndreas Huber Mutex::Autolock autoLock(mLock); 1509d29345dfa29cdcc650f3705e43950ef2500f6728Andreas Huber if (!mAudioStatusEventPending) { 1510d29345dfa29cdcc650f3705e43950ef2500f6728Andreas Huber // Event was dispatched and while we were blocking on the mutex, 1511d29345dfa29cdcc650f3705e43950ef2500f6728Andreas Huber // has already been cancelled. 1512d29345dfa29cdcc650f3705e43950ef2500f6728Andreas Huber return; 1513d29345dfa29cdcc650f3705e43950ef2500f6728Andreas Huber } 1514d29345dfa29cdcc650f3705e43950ef2500f6728Andreas Huber 15151862a33b246249630b654182afb5914da3480d4cAndreas Huber mAudioStatusEventPending = false; 15161862a33b246249630b654182afb5914da3480d4cAndreas Huber 15171862a33b246249630b654182afb5914da3480d4cAndreas Huber if (mWatchForAudioSeekComplete && !mAudioPlayer->isSeeking()) { 15181862a33b246249630b654182afb5914da3480d4cAndreas Huber mWatchForAudioSeekComplete = false; 15191321fdd94d354431b930735e9f38f32ecd189a2dAndreas Huber 15201321fdd94d354431b930735e9f38f32ecd189a2dAndreas Huber if (!mSeekNotificationSent) { 15211321fdd94d354431b930735e9f38f32ecd189a2dAndreas Huber notifyListener_l(MEDIA_SEEK_COMPLETE); 15221321fdd94d354431b930735e9f38f32ecd189a2dAndreas Huber mSeekNotificationSent = true; 15231321fdd94d354431b930735e9f38f32ecd189a2dAndreas Huber } 1524dac4ee72bac87388a1495e098f39d73168c8078fAndreas Huber 152564bb6983690bf994d904591145a3cdd6373bdbe6Andreas Huber mSeeking = NO_SEEK; 15261862a33b246249630b654182afb5914da3480d4cAndreas Huber } 15271862a33b246249630b654182afb5914da3480d4cAndreas Huber 15285295c0c55d41a2906ea7f65a3f22e6278cb17d4bAndreas Huber status_t finalStatus; 15295295c0c55d41a2906ea7f65a3f22e6278cb17d4bAndreas Huber if (mWatchForAudioEOS && mAudioPlayer->reachedEOS(&finalStatus)) { 15301862a33b246249630b654182afb5914da3480d4cAndreas Huber mWatchForAudioEOS = false; 15315d2de4da54504836e4b772b3010ac28c19f667f0Andreas Huber mFlags |= AUDIO_AT_EOS; 15325d2de4da54504836e4b772b3010ac28c19f667f0Andreas Huber mFlags |= FIRST_FRAME; 15335295c0c55d41a2906ea7f65a3f22e6278cb17d4bAndreas Huber postStreamDoneEvent_l(finalStatus); 15341862a33b246249630b654182afb5914da3480d4cAndreas Huber } 15351862a33b246249630b654182afb5914da3480d4cAndreas Huber} 15361862a33b246249630b654182afb5914da3480d4cAndreas Huber 1537c23f12af0394aa2f6651968a3c8840f1af317aa1Andreas Huberstatus_t AwesomePlayer::prepare() { 1538c23f12af0394aa2f6651968a3c8840f1af317aa1Andreas Huber Mutex::Autolock autoLock(mLock); 1539bd22c52280179b29eefac91ef7e7bbbc33d25904Andreas Huber return prepare_l(); 1540bd22c52280179b29eefac91ef7e7bbbc33d25904Andreas Huber} 1541c23f12af0394aa2f6651968a3c8840f1af317aa1Andreas Huber 1542bd22c52280179b29eefac91ef7e7bbbc33d25904Andreas Huberstatus_t AwesomePlayer::prepare_l() { 1543bd22c52280179b29eefac91ef7e7bbbc33d25904Andreas Huber if (mFlags & PREPARED) { 1544bd22c52280179b29eefac91ef7e7bbbc33d25904Andreas Huber return OK; 1545bd22c52280179b29eefac91ef7e7bbbc33d25904Andreas Huber } 1546bd22c52280179b29eefac91ef7e7bbbc33d25904Andreas Huber 1547bd22c52280179b29eefac91ef7e7bbbc33d25904Andreas Huber if (mFlags & PREPARING) { 1548bd22c52280179b29eefac91ef7e7bbbc33d25904Andreas Huber return UNKNOWN_ERROR; 1549bd22c52280179b29eefac91ef7e7bbbc33d25904Andreas Huber } 1550bd22c52280179b29eefac91ef7e7bbbc33d25904Andreas Huber 1551bd22c52280179b29eefac91ef7e7bbbc33d25904Andreas Huber mIsAsyncPrepare = false; 1552c23f12af0394aa2f6651968a3c8840f1af317aa1Andreas Huber status_t err = prepareAsync_l(); 1553c23f12af0394aa2f6651968a3c8840f1af317aa1Andreas Huber 1554c23f12af0394aa2f6651968a3c8840f1af317aa1Andreas Huber if (err != OK) { 1555c23f12af0394aa2f6651968a3c8840f1af317aa1Andreas Huber return err; 1556c23f12af0394aa2f6651968a3c8840f1af317aa1Andreas Huber } 1557c23f12af0394aa2f6651968a3c8840f1af317aa1Andreas Huber 1558bd22c52280179b29eefac91ef7e7bbbc33d25904Andreas Huber while (mFlags & PREPARING) { 1559c23f12af0394aa2f6651968a3c8840f1af317aa1Andreas Huber mPreparedCondition.wait(mLock); 1560c23f12af0394aa2f6651968a3c8840f1af317aa1Andreas Huber } 1561c23f12af0394aa2f6651968a3c8840f1af317aa1Andreas Huber 1562bd22c52280179b29eefac91ef7e7bbbc33d25904Andreas Huber return mPrepareResult; 1563c23f12af0394aa2f6651968a3c8840f1af317aa1Andreas Huber} 1564c23f12af0394aa2f6651968a3c8840f1af317aa1Andreas Huber 1565c23f12af0394aa2f6651968a3c8840f1af317aa1Andreas Huberstatus_t AwesomePlayer::prepareAsync() { 1566c23f12af0394aa2f6651968a3c8840f1af317aa1Andreas Huber Mutex::Autolock autoLock(mLock); 1567bd22c52280179b29eefac91ef7e7bbbc33d25904Andreas Huber 1568bd22c52280179b29eefac91ef7e7bbbc33d25904Andreas Huber if (mFlags & PREPARING) { 1569bd22c52280179b29eefac91ef7e7bbbc33d25904Andreas Huber return UNKNOWN_ERROR; // async prepare already pending 1570bd22c52280179b29eefac91ef7e7bbbc33d25904Andreas Huber } 1571bd22c52280179b29eefac91ef7e7bbbc33d25904Andreas Huber 1572bd22c52280179b29eefac91ef7e7bbbc33d25904Andreas Huber mIsAsyncPrepare = true; 1573c23f12af0394aa2f6651968a3c8840f1af317aa1Andreas Huber return prepareAsync_l(); 1574c23f12af0394aa2f6651968a3c8840f1af317aa1Andreas Huber} 1575c23f12af0394aa2f6651968a3c8840f1af317aa1Andreas Huber 1576c23f12af0394aa2f6651968a3c8840f1af317aa1Andreas Huberstatus_t AwesomePlayer::prepareAsync_l() { 1577bd22c52280179b29eefac91ef7e7bbbc33d25904Andreas Huber if (mFlags & PREPARING) { 1578bd22c52280179b29eefac91ef7e7bbbc33d25904Andreas Huber return UNKNOWN_ERROR; // async prepare already pending 1579c23f12af0394aa2f6651968a3c8840f1af317aa1Andreas Huber } 1580c23f12af0394aa2f6651968a3c8840f1af317aa1Andreas Huber 15812e8ffaf95bd35358ecd14ddf00cddaf3abefe0a9Andreas Huber if (!mQueueStarted) { 15822e8ffaf95bd35358ecd14ddf00cddaf3abefe0a9Andreas Huber mQueue.start(); 15832e8ffaf95bd35358ecd14ddf00cddaf3abefe0a9Andreas Huber mQueueStarted = true; 15842e8ffaf95bd35358ecd14ddf00cddaf3abefe0a9Andreas Huber } 15852e8ffaf95bd35358ecd14ddf00cddaf3abefe0a9Andreas Huber 1586bd22c52280179b29eefac91ef7e7bbbc33d25904Andreas Huber mFlags |= PREPARING; 1587c23f12af0394aa2f6651968a3c8840f1af317aa1Andreas Huber mAsyncPrepareEvent = new AwesomeEvent( 1588c23f12af0394aa2f6651968a3c8840f1af317aa1Andreas Huber this, &AwesomePlayer::onPrepareAsyncEvent); 1589c23f12af0394aa2f6651968a3c8840f1af317aa1Andreas Huber 1590c23f12af0394aa2f6651968a3c8840f1af317aa1Andreas Huber mQueue.postEvent(mAsyncPrepareEvent); 1591c23f12af0394aa2f6651968a3c8840f1af317aa1Andreas Huber 1592c23f12af0394aa2f6651968a3c8840f1af317aa1Andreas Huber return OK; 1593c23f12af0394aa2f6651968a3c8840f1af317aa1Andreas Huber} 1594c23f12af0394aa2f6651968a3c8840f1af317aa1Andreas Huber 1595bd22c52280179b29eefac91ef7e7bbbc33d25904Andreas Huberstatus_t AwesomePlayer::finishSetDataSource_l() { 1596e94bd14078d327ef2f800e69907efce641a13272Andreas Huber sp<DataSource> dataSource; 1597e94bd14078d327ef2f800e69907efce641a13272Andreas Huber 15988cb0c4168bf4b678e4a6edfcf409247016be20d5Andreas Huber if (!strncasecmp("http://", mUri.string(), 7) 15998cb0c4168bf4b678e4a6edfcf409247016be20d5Andreas Huber || !strncasecmp("https://", mUri.string(), 8)) { 16001156dc913a5ba7b2bc86489468d4914430f03d14Andreas Huber mConnectingDataSource = HTTPBase::Create( 16011156dc913a5ba7b2bc86489468d4914430f03d14Andreas Huber (mFlags & INCOGNITO) 16021156dc913a5ba7b2bc86489468d4914430f03d14Andreas Huber ? HTTPBase::kFlagIncognito 16031156dc913a5ba7b2bc86489468d4914430f03d14Andreas Huber : 0); 1604e94bd14078d327ef2f800e69907efce641a13272Andreas Huber 1605e94bd14078d327ef2f800e69907efce641a13272Andreas Huber mLock.unlock(); 160679f77ef3b0a37660ba8c5bcb2dfbfda3860f2135Andreas Huber status_t err = mConnectingDataSource->connect(mUri, &mUriHeaders); 1607e94bd14078d327ef2f800e69907efce641a13272Andreas Huber mLock.lock(); 1608e94bd14078d327ef2f800e69907efce641a13272Andreas Huber 1609e94bd14078d327ef2f800e69907efce641a13272Andreas Huber if (err != OK) { 1610e94bd14078d327ef2f800e69907efce641a13272Andreas Huber mConnectingDataSource.clear(); 1611e94bd14078d327ef2f800e69907efce641a13272Andreas Huber 1612e94bd14078d327ef2f800e69907efce641a13272Andreas Huber LOGI("mConnectingDataSource->connect() returned %d", err); 1613e94bd14078d327ef2f800e69907efce641a13272Andreas Huber return err; 1614e94bd14078d327ef2f800e69907efce641a13272Andreas Huber } 1615e94bd14078d327ef2f800e69907efce641a13272Andreas Huber 16160a5baa9b411fe086013d2a5e9126ed63fbad046cAndreas Huber#if 0 16170a5baa9b411fe086013d2a5e9126ed63fbad046cAndreas Huber mCachedSource = new NuCachedSource2( 16180a5baa9b411fe086013d2a5e9126ed63fbad046cAndreas Huber new ThrottledSource( 16190a5baa9b411fe086013d2a5e9126ed63fbad046cAndreas Huber mConnectingDataSource, 50 * 1024 /* bytes/sec */)); 16200a5baa9b411fe086013d2a5e9126ed63fbad046cAndreas Huber#else 16210a5baa9b411fe086013d2a5e9126ed63fbad046cAndreas Huber mCachedSource = new NuCachedSource2(mConnectingDataSource); 16220a5baa9b411fe086013d2a5e9126ed63fbad046cAndreas Huber#endif 1623e94bd14078d327ef2f800e69907efce641a13272Andreas Huber mConnectingDataSource.clear(); 16240a5baa9b411fe086013d2a5e9126ed63fbad046cAndreas Huber 16250a5baa9b411fe086013d2a5e9126ed63fbad046cAndreas Huber dataSource = mCachedSource; 1626ac05c317cd818701535c5d72ce90da98c4bae75bAndreas Huber 1627ac05c317cd818701535c5d72ce90da98c4bae75bAndreas Huber // We're going to prefill the cache before trying to instantiate 1628ac05c317cd818701535c5d72ce90da98c4bae75bAndreas Huber // the extractor below, as the latter is an operation that otherwise 1629ac05c317cd818701535c5d72ce90da98c4bae75bAndreas Huber // could block on the datasource for a significant amount of time. 1630ac05c317cd818701535c5d72ce90da98c4bae75bAndreas Huber // During that time we'd be unable to abort the preparation phase 1631ac05c317cd818701535c5d72ce90da98c4bae75bAndreas Huber // without this prefill. 1632ac05c317cd818701535c5d72ce90da98c4bae75bAndreas Huber 1633ac05c317cd818701535c5d72ce90da98c4bae75bAndreas Huber mLock.unlock(); 1634ac05c317cd818701535c5d72ce90da98c4bae75bAndreas Huber 1635ac05c317cd818701535c5d72ce90da98c4bae75bAndreas Huber for (;;) { 1636ac05c317cd818701535c5d72ce90da98c4bae75bAndreas Huber status_t finalStatus; 1637ac05c317cd818701535c5d72ce90da98c4bae75bAndreas Huber size_t cachedDataRemaining = 1638ac05c317cd818701535c5d72ce90da98c4bae75bAndreas Huber mCachedSource->approxDataRemaining(&finalStatus); 1639ac05c317cd818701535c5d72ce90da98c4bae75bAndreas Huber 1640ac05c317cd818701535c5d72ce90da98c4bae75bAndreas Huber if (finalStatus != OK || cachedDataRemaining >= kHighWaterMarkBytes 1641ac05c317cd818701535c5d72ce90da98c4bae75bAndreas Huber || (mFlags & PREPARE_CANCELLED)) { 1642ac05c317cd818701535c5d72ce90da98c4bae75bAndreas Huber break; 1643ac05c317cd818701535c5d72ce90da98c4bae75bAndreas Huber } 1644ac05c317cd818701535c5d72ce90da98c4bae75bAndreas Huber 1645ac05c317cd818701535c5d72ce90da98c4bae75bAndreas Huber usleep(200000); 1646ac05c317cd818701535c5d72ce90da98c4bae75bAndreas Huber } 1647ac05c317cd818701535c5d72ce90da98c4bae75bAndreas Huber 1648ac05c317cd818701535c5d72ce90da98c4bae75bAndreas Huber mLock.lock(); 1649ac05c317cd818701535c5d72ce90da98c4bae75bAndreas Huber 1650ac05c317cd818701535c5d72ce90da98c4bae75bAndreas Huber if (mFlags & PREPARE_CANCELLED) { 1651ac05c317cd818701535c5d72ce90da98c4bae75bAndreas Huber LOGI("Prepare cancelled while waiting for initial cache fill."); 1652ac05c317cd818701535c5d72ce90da98c4bae75bAndreas Huber return UNKNOWN_ERROR; 1653ac05c317cd818701535c5d72ce90da98c4bae75bAndreas Huber } 1654cf7b9c7aae758ac0b99833915053c63c2ac46e09Andreas Huber } else if (!strncasecmp("rtsp://", mUri.string(), 7)) { 1655cf7b9c7aae758ac0b99833915053c63c2ac46e09Andreas Huber if (mLooper == NULL) { 1656cf7b9c7aae758ac0b99833915053c63c2ac46e09Andreas Huber mLooper = new ALooper; 1657a814c1fdc2acf0ed2ee3b175110f6039be7c4873Andreas Huber mLooper->setName("rtsp"); 1658cf7b9c7aae758ac0b99833915053c63c2ac46e09Andreas Huber mLooper->start(); 1659cf7b9c7aae758ac0b99833915053c63c2ac46e09Andreas Huber } 1660cf7b9c7aae758ac0b99833915053c63c2ac46e09Andreas Huber mRTSPController = new ARTSPController(mLooper); 1661f1958f9442bc937e1f8c8d9175901500b944b021Andreas Huber mConnectingRTSPController = mRTSPController; 1662f1958f9442bc937e1f8c8d9175901500b944b021Andreas Huber 1663f1958f9442bc937e1f8c8d9175901500b944b021Andreas Huber mLock.unlock(); 1664cf7b9c7aae758ac0b99833915053c63c2ac46e09Andreas Huber status_t err = mRTSPController->connect(mUri.string()); 1665f1958f9442bc937e1f8c8d9175901500b944b021Andreas Huber mLock.lock(); 1666f1958f9442bc937e1f8c8d9175901500b944b021Andreas Huber 1667f1958f9442bc937e1f8c8d9175901500b944b021Andreas Huber mConnectingRTSPController.clear(); 1668cf7b9c7aae758ac0b99833915053c63c2ac46e09Andreas Huber 1669cf7b9c7aae758ac0b99833915053c63c2ac46e09Andreas Huber LOGI("ARTSPController::connect returned %d", err); 1670cf7b9c7aae758ac0b99833915053c63c2ac46e09Andreas Huber 1671cf7b9c7aae758ac0b99833915053c63c2ac46e09Andreas Huber if (err != OK) { 1672cf7b9c7aae758ac0b99833915053c63c2ac46e09Andreas Huber mRTSPController.clear(); 1673cf7b9c7aae758ac0b99833915053c63c2ac46e09Andreas Huber return err; 1674cf7b9c7aae758ac0b99833915053c63c2ac46e09Andreas Huber } 1675e71d10e7ad55ccbcb0756c007caef1c959090384Andreas Huber 1676cf7b9c7aae758ac0b99833915053c63c2ac46e09Andreas Huber sp<MediaExtractor> extractor = mRTSPController.get(); 1677e71d10e7ad55ccbcb0756c007caef1c959090384Andreas Huber return setDataSource_l(extractor); 1678e94bd14078d327ef2f800e69907efce641a13272Andreas Huber } else { 1679e94bd14078d327ef2f800e69907efce641a13272Andreas Huber dataSource = DataSource::CreateFromURI(mUri.string(), &mUriHeaders); 1680e94bd14078d327ef2f800e69907efce641a13272Andreas Huber } 1681bd22c52280179b29eefac91ef7e7bbbc33d25904Andreas Huber 1682bd22c52280179b29eefac91ef7e7bbbc33d25904Andreas Huber if (dataSource == NULL) { 1683bd22c52280179b29eefac91ef7e7bbbc33d25904Andreas Huber return UNKNOWN_ERROR; 1684bd22c52280179b29eefac91ef7e7bbbc33d25904Andreas Huber } 1685bd22c52280179b29eefac91ef7e7bbbc33d25904Andreas Huber 1686bd22c52280179b29eefac91ef7e7bbbc33d25904Andreas Huber sp<MediaExtractor> extractor = MediaExtractor::Create(dataSource); 1687bd22c52280179b29eefac91ef7e7bbbc33d25904Andreas Huber 1688bd22c52280179b29eefac91ef7e7bbbc33d25904Andreas Huber if (extractor == NULL) { 1689bd22c52280179b29eefac91ef7e7bbbc33d25904Andreas Huber return UNKNOWN_ERROR; 1690bd22c52280179b29eefac91ef7e7bbbc33d25904Andreas Huber } 1691bd22c52280179b29eefac91ef7e7bbbc33d25904Andreas Huber 1692b5ce361d19e69fe156f7188c9ee0f4734b259874Gloria Wang dataSource->getDrmInfo(mDecryptHandle, &mDrmManagerClient); 1693b5ce361d19e69fe156f7188c9ee0f4734b259874Gloria Wang 1694b371426ce4cf2fa6d8c3d1903b61322feb165d35Gloria Wang if (mDecryptHandle != NULL) { 16958f64134f749e4f7861a08a3063450fc714c4651dGloria Wang CHECK(mDrmManagerClient); 1696b371426ce4cf2fa6d8c3d1903b61322feb165d35Gloria Wang if (RightsStatus::RIGHTS_VALID == mDecryptHandle->status) { 1697b371426ce4cf2fa6d8c3d1903b61322feb165d35Gloria Wang if (DecryptApiType::WV_BASED == mDecryptHandle->decryptApiType) { 1698b371426ce4cf2fa6d8c3d1903b61322feb165d35Gloria Wang LOGD("Setting mCachedSource to NULL for WVM\n"); 1699b371426ce4cf2fa6d8c3d1903b61322feb165d35Gloria Wang mCachedSource.clear(); 1700b371426ce4cf2fa6d8c3d1903b61322feb165d35Gloria Wang } 1701b371426ce4cf2fa6d8c3d1903b61322feb165d35Gloria Wang } else { 1702b371426ce4cf2fa6d8c3d1903b61322feb165d35Gloria Wang notifyListener_l(MEDIA_ERROR, MEDIA_ERROR_UNKNOWN, ERROR_NO_LICENSE); 1703b371426ce4cf2fa6d8c3d1903b61322feb165d35Gloria Wang } 1704dcd25efb46c41c8d24a0a9cf61fb57f84149709eGloria Wang } 1705dcd25efb46c41c8d24a0a9cf61fb57f84149709eGloria Wang 1706bd22c52280179b29eefac91ef7e7bbbc33d25904Andreas Huber return setDataSource_l(extractor); 1707bd22c52280179b29eefac91ef7e7bbbc33d25904Andreas Huber} 1708bd22c52280179b29eefac91ef7e7bbbc33d25904Andreas Huber 170988d8a83de12592635248aa1a3bd6b9ea46108501Andreas Hubervoid AwesomePlayer::abortPrepare(status_t err) { 171088d8a83de12592635248aa1a3bd6b9ea46108501Andreas Huber CHECK(err != OK); 171188d8a83de12592635248aa1a3bd6b9ea46108501Andreas Huber 171288d8a83de12592635248aa1a3bd6b9ea46108501Andreas Huber if (mIsAsyncPrepare) { 171388d8a83de12592635248aa1a3bd6b9ea46108501Andreas Huber notifyListener_l(MEDIA_ERROR, MEDIA_ERROR_UNKNOWN, err); 171488d8a83de12592635248aa1a3bd6b9ea46108501Andreas Huber } 171588d8a83de12592635248aa1a3bd6b9ea46108501Andreas Huber 171688d8a83de12592635248aa1a3bd6b9ea46108501Andreas Huber mPrepareResult = err; 17176a05c9e912aeb8bfe1ef99516def91a177a481b6Andreas Huber mFlags &= ~(PREPARING|PREPARE_CANCELLED|PREPARING_CONNECTED); 171888d8a83de12592635248aa1a3bd6b9ea46108501Andreas Huber mAsyncPrepareEvent = NULL; 171988d8a83de12592635248aa1a3bd6b9ea46108501Andreas Huber mPreparedCondition.broadcast(); 172088d8a83de12592635248aa1a3bd6b9ea46108501Andreas Huber} 172188d8a83de12592635248aa1a3bd6b9ea46108501Andreas Huber 1722e966fb05c7e67a7f5dce65024de60aac83eb6f81Andreas Huber// static 1723e966fb05c7e67a7f5dce65024de60aac83eb6f81Andreas Huberbool AwesomePlayer::ContinuePreparation(void *cookie) { 1724e966fb05c7e67a7f5dce65024de60aac83eb6f81Andreas Huber AwesomePlayer *me = static_cast<AwesomePlayer *>(cookie); 1725e966fb05c7e67a7f5dce65024de60aac83eb6f81Andreas Huber 1726e966fb05c7e67a7f5dce65024de60aac83eb6f81Andreas Huber return (me->mFlags & PREPARE_CANCELLED) == 0; 1727e966fb05c7e67a7f5dce65024de60aac83eb6f81Andreas Huber} 1728e966fb05c7e67a7f5dce65024de60aac83eb6f81Andreas Huber 1729c23f12af0394aa2f6651968a3c8840f1af317aa1Andreas Hubervoid AwesomePlayer::onPrepareAsyncEvent() { 17308650e1960905097f6f1d6aa462ccb1c93c656834Andreas Huber Mutex::Autolock autoLock(mLock); 1731bd22c52280179b29eefac91ef7e7bbbc33d25904Andreas Huber 17328650e1960905097f6f1d6aa462ccb1c93c656834Andreas Huber if (mFlags & PREPARE_CANCELLED) { 17338650e1960905097f6f1d6aa462ccb1c93c656834Andreas Huber LOGI("prepare was cancelled before doing anything"); 17348650e1960905097f6f1d6aa462ccb1c93c656834Andreas Huber abortPrepare(UNKNOWN_ERROR); 17358650e1960905097f6f1d6aa462ccb1c93c656834Andreas Huber return; 17368650e1960905097f6f1d6aa462ccb1c93c656834Andreas Huber } 1737e94bd14078d327ef2f800e69907efce641a13272Andreas Huber 17388650e1960905097f6f1d6aa462ccb1c93c656834Andreas Huber if (mUri.size() > 0) { 17398650e1960905097f6f1d6aa462ccb1c93c656834Andreas Huber status_t err = finishSetDataSource_l(); 1740bd22c52280179b29eefac91ef7e7bbbc33d25904Andreas Huber 17418650e1960905097f6f1d6aa462ccb1c93c656834Andreas Huber if (err != OK) { 17428650e1960905097f6f1d6aa462ccb1c93c656834Andreas Huber abortPrepare(err); 17438650e1960905097f6f1d6aa462ccb1c93c656834Andreas Huber return; 1744bd22c52280179b29eefac91ef7e7bbbc33d25904Andreas Huber } 17458650e1960905097f6f1d6aa462ccb1c93c656834Andreas Huber } 1746bd22c52280179b29eefac91ef7e7bbbc33d25904Andreas Huber 17478650e1960905097f6f1d6aa462ccb1c93c656834Andreas Huber if (mVideoTrack != NULL && mVideoSource == NULL) { 17488650e1960905097f6f1d6aa462ccb1c93c656834Andreas Huber status_t err = initVideoDecoder(); 17491322e7ebc33e8e161fb73cd47e43dd93357608e4Andreas Huber 17508650e1960905097f6f1d6aa462ccb1c93c656834Andreas Huber if (err != OK) { 17518650e1960905097f6f1d6aa462ccb1c93c656834Andreas Huber abortPrepare(err); 17528650e1960905097f6f1d6aa462ccb1c93c656834Andreas Huber return; 17531322e7ebc33e8e161fb73cd47e43dd93357608e4Andreas Huber } 17548650e1960905097f6f1d6aa462ccb1c93c656834Andreas Huber } 17551322e7ebc33e8e161fb73cd47e43dd93357608e4Andreas Huber 17568650e1960905097f6f1d6aa462ccb1c93c656834Andreas Huber if (mAudioTrack != NULL && mAudioSource == NULL) { 17578650e1960905097f6f1d6aa462ccb1c93c656834Andreas Huber status_t err = initAudioDecoder(); 17581322e7ebc33e8e161fb73cd47e43dd93357608e4Andreas Huber 17598650e1960905097f6f1d6aa462ccb1c93c656834Andreas Huber if (err != OK) { 17608650e1960905097f6f1d6aa462ccb1c93c656834Andreas Huber abortPrepare(err); 17618650e1960905097f6f1d6aa462ccb1c93c656834Andreas Huber return; 17621322e7ebc33e8e161fb73cd47e43dd93357608e4Andreas Huber } 1763c23f12af0394aa2f6651968a3c8840f1af317aa1Andreas Huber } 1764c23f12af0394aa2f6651968a3c8840f1af317aa1Andreas Huber 17656a05c9e912aeb8bfe1ef99516def91a177a481b6Andreas Huber mFlags |= PREPARING_CONNECTED; 17666a05c9e912aeb8bfe1ef99516def91a177a481b6Andreas Huber 17678650e1960905097f6f1d6aa462ccb1c93c656834Andreas Huber if (mCachedSource != NULL || mRTSPController != NULL) { 17688650e1960905097f6f1d6aa462ccb1c93c656834Andreas Huber postBufferingEvent_l(); 17698650e1960905097f6f1d6aa462ccb1c93c656834Andreas Huber } else { 17708650e1960905097f6f1d6aa462ccb1c93c656834Andreas Huber finishAsyncPrepare_l(); 17718650e1960905097f6f1d6aa462ccb1c93c656834Andreas Huber } 17728650e1960905097f6f1d6aa462ccb1c93c656834Andreas Huber} 1773c23f12af0394aa2f6651968a3c8840f1af317aa1Andreas Huber 17748650e1960905097f6f1d6aa462ccb1c93c656834Andreas Hubervoid AwesomePlayer::finishAsyncPrepare_l() { 1775bd22c52280179b29eefac91ef7e7bbbc33d25904Andreas Huber if (mIsAsyncPrepare) { 17765daeb129a2c2ba3d14ccd94af283b5f561c783eaAndreas Huber if (mVideoSource == NULL) { 1777bd22c52280179b29eefac91ef7e7bbbc33d25904Andreas Huber notifyListener_l(MEDIA_SET_VIDEO_SIZE, 0, 0); 1778bd22c52280179b29eefac91ef7e7bbbc33d25904Andreas Huber } else { 17795daeb129a2c2ba3d14ccd94af283b5f561c783eaAndreas Huber notifyVideoSize_l(); 1780bd22c52280179b29eefac91ef7e7bbbc33d25904Andreas Huber } 1781c23f12af0394aa2f6651968a3c8840f1af317aa1Andreas Huber 1782bd22c52280179b29eefac91ef7e7bbbc33d25904Andreas Huber notifyListener_l(MEDIA_PREPARED); 1783bd22c52280179b29eefac91ef7e7bbbc33d25904Andreas Huber } 1784c23f12af0394aa2f6651968a3c8840f1af317aa1Andreas Huber 1785bd22c52280179b29eefac91ef7e7bbbc33d25904Andreas Huber mPrepareResult = OK; 17866a05c9e912aeb8bfe1ef99516def91a177a481b6Andreas Huber mFlags &= ~(PREPARING|PREPARE_CANCELLED|PREPARING_CONNECTED); 1787bd22c52280179b29eefac91ef7e7bbbc33d25904Andreas Huber mFlags |= PREPARED; 1788c23f12af0394aa2f6651968a3c8840f1af317aa1Andreas Huber mAsyncPrepareEvent = NULL; 1789bd22c52280179b29eefac91ef7e7bbbc33d25904Andreas Huber mPreparedCondition.broadcast(); 1790c23f12af0394aa2f6651968a3c8840f1af317aa1Andreas Huber} 1791c23f12af0394aa2f6651968a3c8840f1af317aa1Andreas Huber 1792acdd9d0f59c3d8bdc3de80664a609527ec3d21e2Andreas Huberuint32_t AwesomePlayer::flags() const { 1793acdd9d0f59c3d8bdc3de80664a609527ec3d21e2Andreas Huber return mExtractorFlags; 1794acdd9d0f59c3d8bdc3de80664a609527ec3d21e2Andreas Huber} 1795acdd9d0f59c3d8bdc3de80664a609527ec3d21e2Andreas Huber 1796ed54ad0f8619ae416b0968ade6248894cbfc4dbaAndreas Hubervoid AwesomePlayer::postAudioEOS() { 1797ed54ad0f8619ae416b0968ade6248894cbfc4dbaAndreas Huber postCheckAudioStatusEvent_l(); 1798ed54ad0f8619ae416b0968ade6248894cbfc4dbaAndreas Huber} 1799ed54ad0f8619ae416b0968ade6248894cbfc4dbaAndreas Huber 1800ed54ad0f8619ae416b0968ade6248894cbfc4dbaAndreas Hubervoid AwesomePlayer::postAudioSeekComplete() { 1801ed54ad0f8619ae416b0968ade6248894cbfc4dbaAndreas Huber postCheckAudioStatusEvent_l(); 1802ed54ad0f8619ae416b0968ade6248894cbfc4dbaAndreas Huber} 1803ed54ad0f8619ae416b0968ade6248894cbfc4dbaAndreas Huber 1804bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber} // namespace android 1805