AwesomePlayer.cpp revision 6511c9755c3a3360ba869772600c7aae048a7ffc
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 17eabd34665adc284525fe7337ad5c56a8b92964efGlenn Kasten#define DEBUG_HDCP 18eabd34665adc284525fe7337ad5c56a8b92964efGlenn Kasten 19bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber//#define LOG_NDEBUG 0 20bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber#define LOG_TAG "AwesomePlayer" 21bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber#include <utils/Log.h> 22bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber 23988e3f0b2c74095deae580157c57935a98573052Andreas Huber#include <dlfcn.h> 24988e3f0b2c74095deae580157c57935a98573052Andreas Huber 25cf7b9c7aae758ac0b99833915053c63c2ac46e09Andreas Huber#include "include/ARTSPController.h" 26bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber#include "include/AwesomePlayer.h" 27733b7729ea462fae9c6899456444e28fef1c757cAndreas Huber#include "include/SoftwareRenderer.h" 280a5baa9b411fe086013d2a5e9126ed63fbad046cAndreas Huber#include "include/NuCachedSource2.h" 290a5baa9b411fe086013d2a5e9126ed63fbad046cAndreas Huber#include "include/ThrottledSource.h" 30bff07d0b22a5ee2d9f044f6cb5e4be1532017ab0Andreas Huber#include "include/MPEG2TSExtractor.h" 31bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber 324844ac54e8b5997c3b03872dbafe8ebed4787517Andreas Huber#include <binder/IPCThreadState.h> 337cf180c9bff69e5cc4a2f4e53b432db45ebbebabGloria Wang#include <binder/IServiceManager.h> 347cf180c9bff69e5cc4a2f4e53b432db45ebbebabGloria Wang#include <media/IMediaPlayerService.h> 35e2b1028852120bcfded33b8f06f66b780437fe92Andreas Huber#include <media/stagefright/foundation/hexdump.h> 36e2b1028852120bcfded33b8f06f66b780437fe92Andreas Huber#include <media/stagefright/foundation/ADebug.h> 37bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber#include <media/stagefright/AudioPlayer.h> 38bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber#include <media/stagefright/DataSource.h> 39bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber#include <media/stagefright/FileSource.h> 40bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber#include <media/stagefright/MediaBuffer.h> 41717826ececd8d39596f62418677721d70776add1Andreas Huber#include <media/stagefright/MediaDefs.h> 42bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber#include <media/stagefright/MediaExtractor.h> 43bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber#include <media/stagefright/MediaSource.h> 44bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber#include <media/stagefright/MetaData.h> 45bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber#include <media/stagefright/OMXCodec.h> 46717826ececd8d39596f62418677721d70776add1Andreas Huber 475daeb129a2c2ba3d14ccd94af283b5f561c783eaAndreas Huber#include <surfaceflinger/Surface.h> 481173118eace0e9e347cb007f0da817cee87579edGlenn Kasten#include <gui/ISurfaceTexture.h> 491173118eace0e9e347cb007f0da817cee87579edGlenn Kasten#include <gui/SurfaceTextureClient.h> 502eb62955eb84b97695e8a7e56e14310cbb86412bGlenn Kasten#include <surfaceflinger/ISurfaceComposer.h> 513cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian 52cf7b9c7aae758ac0b99833915053c63c2ac46e09Andreas Huber#include <media/stagefright/foundation/ALooper.h> 5314acc736e336cbd6026df781d4f411e908831815Andreas Huber#include <media/stagefright/foundation/AMessage.h> 54e71d10e7ad55ccbcb0756c007caef1c959090384Andreas Huber 55eabd34665adc284525fe7337ad5c56a8b92964efGlenn Kasten#include <cutils/properties.h> 56eabd34665adc284525fe7337ad5c56a8b92964efGlenn Kasten 57e332a9181cf6a3155ed1a0fd2afc212ccb1f2753Andreas Huber#define USE_SURFACE_ALLOC 1 5864bb6983690bf994d904591145a3cdd6373bdbe6Andreas Huber#define FRAME_DROP_FREQ 0 59e332a9181cf6a3155ed1a0fd2afc212ccb1f2753Andreas Huber 60bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Hubernamespace android { 61bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber 628650e1960905097f6f1d6aa462ccb1c93c656834Andreas Huberstatic int64_t kLowWaterMarkUs = 2000000ll; // 2secs 638650e1960905097f6f1d6aa462ccb1c93c656834Andreas Huberstatic int64_t kHighWaterMarkUs = 10000000ll; // 10secs 64100a4408968b90e314526185d572c72ea4cc784aAndreas Huberstatic int64_t kHighWaterMarkRTSPUs = 4000000ll; // 4secs 65ac05c317cd818701535c5d72ce90da98c4bae75bAndreas Huberstatic const size_t kLowWaterMarkBytes = 40000; 66ac05c317cd818701535c5d72ce90da98c4bae75bAndreas Huberstatic const size_t kHighWaterMarkBytes = 200000; 678650e1960905097f6f1d6aa462ccb1c93c656834Andreas Huber 68bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huberstruct AwesomeEvent : public TimedEventQueue::Event { 69c23f12af0394aa2f6651968a3c8840f1af317aa1Andreas Huber AwesomeEvent( 70c23f12af0394aa2f6651968a3c8840f1af317aa1Andreas Huber AwesomePlayer *player, 71c23f12af0394aa2f6651968a3c8840f1af317aa1Andreas Huber void (AwesomePlayer::*method)()) 72bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber : mPlayer(player), 73c23f12af0394aa2f6651968a3c8840f1af317aa1Andreas Huber mMethod(method) { 74bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber } 75bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber 76bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huberprotected: 77bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber virtual ~AwesomeEvent() {} 78bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber 79bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber virtual void fire(TimedEventQueue *queue, int64_t /* now_us */) { 80c23f12af0394aa2f6651968a3c8840f1af317aa1Andreas Huber (mPlayer->*mMethod)(); 81bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber } 82bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber 83bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huberprivate: 84bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber AwesomePlayer *mPlayer; 85c23f12af0394aa2f6651968a3c8840f1af317aa1Andreas Huber void (AwesomePlayer::*mMethod)(); 86bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber 87bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber AwesomeEvent(const AwesomeEvent &); 88bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber AwesomeEvent &operator=(const AwesomeEvent &); 89bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber}; 90bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber 91733b7729ea462fae9c6899456444e28fef1c757cAndreas Huberstruct AwesomeLocalRenderer : public AwesomeRenderer { 92733b7729ea462fae9c6899456444e28fef1c757cAndreas Huber AwesomeLocalRenderer( 931173118eace0e9e347cb007f0da817cee87579edGlenn Kasten const sp<ANativeWindow> &nativeWindow, const sp<MetaData> &meta) 941173118eace0e9e347cb007f0da817cee87579edGlenn Kasten : mTarget(new SoftwareRenderer(nativeWindow, meta)) { 95733b7729ea462fae9c6899456444e28fef1c757cAndreas Huber } 96733b7729ea462fae9c6899456444e28fef1c757cAndreas Huber 97733b7729ea462fae9c6899456444e28fef1c757cAndreas Huber virtual void render(MediaBuffer *buffer) { 98fa090f541bb84a546af2ec834e91a032ff10e66eAndreas Huber render((const uint8_t *)buffer->data() + buffer->range_offset(), 99fa090f541bb84a546af2ec834e91a032ff10e66eAndreas Huber buffer->range_length()); 100fa090f541bb84a546af2ec834e91a032ff10e66eAndreas Huber } 101fa090f541bb84a546af2ec834e91a032ff10e66eAndreas Huber 102fa090f541bb84a546af2ec834e91a032ff10e66eAndreas Huber void render(const void *data, size_t size) { 103fa090f541bb84a546af2ec834e91a032ff10e66eAndreas Huber mTarget->render(data, size, NULL); 104733b7729ea462fae9c6899456444e28fef1c757cAndreas Huber } 105733b7729ea462fae9c6899456444e28fef1c757cAndreas Huber 106733b7729ea462fae9c6899456444e28fef1c757cAndreas Huberprotected: 107733b7729ea462fae9c6899456444e28fef1c757cAndreas Huber virtual ~AwesomeLocalRenderer() { 108733b7729ea462fae9c6899456444e28fef1c757cAndreas Huber delete mTarget; 109733b7729ea462fae9c6899456444e28fef1c757cAndreas Huber mTarget = NULL; 110733b7729ea462fae9c6899456444e28fef1c757cAndreas Huber } 111733b7729ea462fae9c6899456444e28fef1c757cAndreas Huber 112733b7729ea462fae9c6899456444e28fef1c757cAndreas Huberprivate: 1130a5ca668c6f7d45706e9aec4a1dfec0aacc6d233Andreas Huber SoftwareRenderer *mTarget; 114988e3f0b2c74095deae580157c57935a98573052Andreas Huber 115733b7729ea462fae9c6899456444e28fef1c757cAndreas Huber AwesomeLocalRenderer(const AwesomeLocalRenderer &); 116733b7729ea462fae9c6899456444e28fef1c757cAndreas Huber AwesomeLocalRenderer &operator=(const AwesomeLocalRenderer &);; 117733b7729ea462fae9c6899456444e28fef1c757cAndreas Huber}; 118733b7729ea462fae9c6899456444e28fef1c757cAndreas Huber 1196a9da9fc558263548ebfbae2cbf177eb7454a41bJamie Gennisstruct AwesomeNativeWindowRenderer : public AwesomeRenderer { 120ba529e486dde15fe75ea1b48570f9d60a4cf3c48Andreas Huber AwesomeNativeWindowRenderer( 121ba529e486dde15fe75ea1b48570f9d60a4cf3c48Andreas Huber const sp<ANativeWindow> &nativeWindow, 122ba529e486dde15fe75ea1b48570f9d60a4cf3c48Andreas Huber int32_t rotationDegrees) 1236a9da9fc558263548ebfbae2cbf177eb7454a41bJamie Gennis : mNativeWindow(nativeWindow) { 124ba529e486dde15fe75ea1b48570f9d60a4cf3c48Andreas Huber applyRotation(rotationDegrees); 1256a9da9fc558263548ebfbae2cbf177eb7454a41bJamie Gennis } 1266a9da9fc558263548ebfbae2cbf177eb7454a41bJamie Gennis 1276a9da9fc558263548ebfbae2cbf177eb7454a41bJamie Gennis virtual void render(MediaBuffer *buffer) { 1286a9da9fc558263548ebfbae2cbf177eb7454a41bJamie Gennis status_t err = mNativeWindow->queueBuffer( 1296a9da9fc558263548ebfbae2cbf177eb7454a41bJamie Gennis mNativeWindow.get(), buffer->graphicBuffer().get()); 1306a9da9fc558263548ebfbae2cbf177eb7454a41bJamie Gennis if (err != 0) { 1316a9da9fc558263548ebfbae2cbf177eb7454a41bJamie Gennis LOGE("queueBuffer failed with error %s (%d)", strerror(-err), 1326a9da9fc558263548ebfbae2cbf177eb7454a41bJamie Gennis -err); 1336a9da9fc558263548ebfbae2cbf177eb7454a41bJamie Gennis return; 1346a9da9fc558263548ebfbae2cbf177eb7454a41bJamie Gennis } 1356a9da9fc558263548ebfbae2cbf177eb7454a41bJamie Gennis 1366a9da9fc558263548ebfbae2cbf177eb7454a41bJamie Gennis sp<MetaData> metaData = buffer->meta_data(); 1376a9da9fc558263548ebfbae2cbf177eb7454a41bJamie Gennis metaData->setInt32(kKeyRendered, 1); 1386a9da9fc558263548ebfbae2cbf177eb7454a41bJamie Gennis } 1396a9da9fc558263548ebfbae2cbf177eb7454a41bJamie Gennis 1406a9da9fc558263548ebfbae2cbf177eb7454a41bJamie Gennisprotected: 1416a9da9fc558263548ebfbae2cbf177eb7454a41bJamie Gennis virtual ~AwesomeNativeWindowRenderer() {} 1426a9da9fc558263548ebfbae2cbf177eb7454a41bJamie Gennis 1436a9da9fc558263548ebfbae2cbf177eb7454a41bJamie Gennisprivate: 1446a9da9fc558263548ebfbae2cbf177eb7454a41bJamie Gennis sp<ANativeWindow> mNativeWindow; 1456a9da9fc558263548ebfbae2cbf177eb7454a41bJamie Gennis 146ba529e486dde15fe75ea1b48570f9d60a4cf3c48Andreas Huber void applyRotation(int32_t rotationDegrees) { 147ba529e486dde15fe75ea1b48570f9d60a4cf3c48Andreas Huber uint32_t transform; 148ba529e486dde15fe75ea1b48570f9d60a4cf3c48Andreas Huber switch (rotationDegrees) { 149ba529e486dde15fe75ea1b48570f9d60a4cf3c48Andreas Huber case 0: transform = 0; break; 150ba529e486dde15fe75ea1b48570f9d60a4cf3c48Andreas Huber case 90: transform = HAL_TRANSFORM_ROT_90; break; 151ba529e486dde15fe75ea1b48570f9d60a4cf3c48Andreas Huber case 180: transform = HAL_TRANSFORM_ROT_180; break; 152ba529e486dde15fe75ea1b48570f9d60a4cf3c48Andreas Huber case 270: transform = HAL_TRANSFORM_ROT_270; break; 153ba529e486dde15fe75ea1b48570f9d60a4cf3c48Andreas Huber default: transform = 0; break; 154ba529e486dde15fe75ea1b48570f9d60a4cf3c48Andreas Huber } 155ba529e486dde15fe75ea1b48570f9d60a4cf3c48Andreas Huber 156ba529e486dde15fe75ea1b48570f9d60a4cf3c48Andreas Huber if (transform) { 157ba529e486dde15fe75ea1b48570f9d60a4cf3c48Andreas Huber CHECK_EQ(0, native_window_set_buffers_transform( 158ba529e486dde15fe75ea1b48570f9d60a4cf3c48Andreas Huber mNativeWindow.get(), transform)); 159ba529e486dde15fe75ea1b48570f9d60a4cf3c48Andreas Huber } 160ba529e486dde15fe75ea1b48570f9d60a4cf3c48Andreas Huber } 161ba529e486dde15fe75ea1b48570f9d60a4cf3c48Andreas Huber 1626a9da9fc558263548ebfbae2cbf177eb7454a41bJamie Gennis AwesomeNativeWindowRenderer(const AwesomeNativeWindowRenderer &); 1636a9da9fc558263548ebfbae2cbf177eb7454a41bJamie Gennis AwesomeNativeWindowRenderer &operator=( 1646a9da9fc558263548ebfbae2cbf177eb7454a41bJamie Gennis const AwesomeNativeWindowRenderer &); 1656a9da9fc558263548ebfbae2cbf177eb7454a41bJamie Gennis}; 1666a9da9fc558263548ebfbae2cbf177eb7454a41bJamie Gennis 1677cf180c9bff69e5cc4a2f4e53b432db45ebbebabGloria Wang// To collect the decoder usage 1687cf180c9bff69e5cc4a2f4e53b432db45ebbebabGloria Wangvoid addBatteryData(uint32_t params) { 1697cf180c9bff69e5cc4a2f4e53b432db45ebbebabGloria Wang sp<IBinder> binder = 1707cf180c9bff69e5cc4a2f4e53b432db45ebbebabGloria Wang defaultServiceManager()->getService(String16("media.player")); 1717cf180c9bff69e5cc4a2f4e53b432db45ebbebabGloria Wang sp<IMediaPlayerService> service = interface_cast<IMediaPlayerService>(binder); 1727cf180c9bff69e5cc4a2f4e53b432db45ebbebabGloria Wang CHECK(service.get() != NULL); 1737cf180c9bff69e5cc4a2f4e53b432db45ebbebabGloria Wang 1747cf180c9bff69e5cc4a2f4e53b432db45ebbebabGloria Wang service->addBatteryData(params); 1757cf180c9bff69e5cc4a2f4e53b432db45ebbebabGloria Wang} 176e2b1028852120bcfded33b8f06f66b780437fe92Andreas Huber 1777cf180c9bff69e5cc4a2f4e53b432db45ebbebabGloria Wang//////////////////////////////////////////////////////////////////////////////// 178bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas HuberAwesomePlayer::AwesomePlayer() 1792e8ffaf95bd35358ecd14ddf00cddaf3abefe0a9Andreas Huber : mQueueStarted(false), 1802e8ffaf95bd35358ecd14ddf00cddaf3abefe0a9Andreas Huber mTimeSource(NULL), 181fa090f541bb84a546af2ec834e91a032ff10e66eAndreas Huber mVideoRendererIsPreview(false), 182bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber mAudioPlayer(NULL), 183b45c01c2b8588ff431b511151666a55a39f0a6aeJames Dong mDisplayWidth(0), 184b45c01c2b8588ff431b511151666a55a39f0a6aeJames Dong mDisplayHeight(0), 185bd22c52280179b29eefac91ef7e7bbbc33d25904Andreas Huber mFlags(0), 186acdd9d0f59c3d8bdc3de80664a609527ec3d21e2Andreas Huber mExtractorFlags(0), 1877b3396acc702451be9bafb19d7fe26d55d43a316Andreas Huber mVideoBuffer(NULL), 188dcd25efb46c41c8d24a0a9cf61fb57f84149709eGloria Wang mDecryptHandle(NULL) { 189e2b1028852120bcfded33b8f06f66b780437fe92Andreas Huber CHECK_EQ(mClient.connect(), (status_t)OK); 190bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber 191bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber DataSource::RegisterDefaultSniffers(); 192bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber 193c23f12af0394aa2f6651968a3c8840f1af317aa1Andreas Huber mVideoEvent = new AwesomeEvent(this, &AwesomePlayer::onVideoEvent); 194bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber mVideoEventPending = false; 195c23f12af0394aa2f6651968a3c8840f1af317aa1Andreas Huber mStreamDoneEvent = new AwesomeEvent(this, &AwesomePlayer::onStreamDone); 196bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber mStreamDoneEventPending = false; 197c23f12af0394aa2f6651968a3c8840f1af317aa1Andreas Huber mBufferingEvent = new AwesomeEvent(this, &AwesomePlayer::onBufferingUpdate); 19866b0a35c9a4136a84c3f73b1b25fcb5220138b95Andreas Huber mBufferingEventPending = false; 199145e68fc778275963189b02a1adcbe27cce4d769Andreas Huber mVideoLagEvent = new AwesomeEvent(this, &AwesomePlayer::onVideoLagUpdate); 200145e68fc778275963189b02a1adcbe27cce4d769Andreas Huber mVideoEventPending = false; 201c23f12af0394aa2f6651968a3c8840f1af317aa1Andreas Huber 202c23f12af0394aa2f6651968a3c8840f1af317aa1Andreas Huber mCheckAudioStatusEvent = new AwesomeEvent( 203c23f12af0394aa2f6651968a3c8840f1af317aa1Andreas Huber this, &AwesomePlayer::onCheckAudioStatus); 204c23f12af0394aa2f6651968a3c8840f1af317aa1Andreas Huber 2051862a33b246249630b654182afb5914da3480d4cAndreas Huber mAudioStatusEventPending = false; 206bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber 207bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber reset(); 208bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber} 209bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber 210bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas HuberAwesomePlayer::~AwesomePlayer() { 2112e8ffaf95bd35358ecd14ddf00cddaf3abefe0a9Andreas Huber if (mQueueStarted) { 2122e8ffaf95bd35358ecd14ddf00cddaf3abefe0a9Andreas Huber mQueue.stop(); 2132e8ffaf95bd35358ecd14ddf00cddaf3abefe0a9Andreas Huber } 214bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber 215bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber reset(); 216bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber 217bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber mClient.disconnect(); 218bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber} 219bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber 22066b0a35c9a4136a84c3f73b1b25fcb5220138b95Andreas Hubervoid AwesomePlayer::cancelPlayerEvents(bool keepBufferingGoing) { 221bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber mQueue.cancelEvent(mVideoEvent->eventID()); 222bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber mVideoEventPending = false; 223bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber mQueue.cancelEvent(mStreamDoneEvent->eventID()); 224bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber mStreamDoneEventPending = false; 2251862a33b246249630b654182afb5914da3480d4cAndreas Huber mQueue.cancelEvent(mCheckAudioStatusEvent->eventID()); 2261862a33b246249630b654182afb5914da3480d4cAndreas Huber mAudioStatusEventPending = false; 227145e68fc778275963189b02a1adcbe27cce4d769Andreas Huber mQueue.cancelEvent(mVideoLagEvent->eventID()); 228145e68fc778275963189b02a1adcbe27cce4d769Andreas Huber mVideoLagEventPending = false; 22966b0a35c9a4136a84c3f73b1b25fcb5220138b95Andreas Huber 23066b0a35c9a4136a84c3f73b1b25fcb5220138b95Andreas Huber if (!keepBufferingGoing) { 23166b0a35c9a4136a84c3f73b1b25fcb5220138b95Andreas Huber mQueue.cancelEvent(mBufferingEvent->eventID()); 23266b0a35c9a4136a84c3f73b1b25fcb5220138b95Andreas Huber mBufferingEventPending = false; 23366b0a35c9a4136a84c3f73b1b25fcb5220138b95Andreas Huber } 234bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber} 235bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber 2360726045216f576e97672ebeefc265d39c4ebaaa5Andreas Hubervoid AwesomePlayer::setListener(const wp<MediaPlayerBase> &listener) { 237bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber Mutex::Autolock autoLock(mLock); 238bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber mListener = listener; 239bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber} 240bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber 2415561ccf4a8db88a2e44eac1b3ed13b4ff53a7f20Andreas Huberstatus_t AwesomePlayer::setDataSource( 2425561ccf4a8db88a2e44eac1b3ed13b4ff53a7f20Andreas Huber const char *uri, const KeyedVector<String8, String8> *headers) { 243bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber Mutex::Autolock autoLock(mLock); 2447b3396acc702451be9bafb19d7fe26d55d43a316Andreas Huber return setDataSource_l(uri, headers); 2457b3396acc702451be9bafb19d7fe26d55d43a316Andreas Huber} 246bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber 2477b3396acc702451be9bafb19d7fe26d55d43a316Andreas Huberstatus_t AwesomePlayer::setDataSource_l( 2487b3396acc702451be9bafb19d7fe26d55d43a316Andreas Huber const char *uri, const KeyedVector<String8, String8> *headers) { 249bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber reset_l(); 250bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber 251bd22c52280179b29eefac91ef7e7bbbc33d25904Andreas Huber mUri = uri; 25266b0a35c9a4136a84c3f73b1b25fcb5220138b95Andreas Huber 253bd22c52280179b29eefac91ef7e7bbbc33d25904Andreas Huber if (headers) { 254bd22c52280179b29eefac91ef7e7bbbc33d25904Andreas Huber mUriHeaders = *headers; 2557314fa17093d514199fedcb55ac41136a1b31cb3Andreas Huber 2567314fa17093d514199fedcb55ac41136a1b31cb3Andreas Huber ssize_t index = mUriHeaders.indexOfKey(String8("x-hide-urls-from-log")); 2577314fa17093d514199fedcb55ac41136a1b31cb3Andreas Huber if (index >= 0) { 2587314fa17093d514199fedcb55ac41136a1b31cb3Andreas Huber // Browser is in "incognito" mode, suppress logging URLs. 2597314fa17093d514199fedcb55ac41136a1b31cb3Andreas Huber 2607314fa17093d514199fedcb55ac41136a1b31cb3Andreas Huber // This isn't something that should be passed to the server. 2617314fa17093d514199fedcb55ac41136a1b31cb3Andreas Huber mUriHeaders.removeItemsAt(index); 2627314fa17093d514199fedcb55ac41136a1b31cb3Andreas Huber 2637314fa17093d514199fedcb55ac41136a1b31cb3Andreas Huber mFlags |= INCOGNITO; 2647314fa17093d514199fedcb55ac41136a1b31cb3Andreas Huber } 2657314fa17093d514199fedcb55ac41136a1b31cb3Andreas Huber } 2667314fa17093d514199fedcb55ac41136a1b31cb3Andreas Huber 2677314fa17093d514199fedcb55ac41136a1b31cb3Andreas Huber if (!(mFlags & INCOGNITO)) { 2687314fa17093d514199fedcb55ac41136a1b31cb3Andreas Huber LOGI("setDataSource_l('%s')", mUri.string()); 2697314fa17093d514199fedcb55ac41136a1b31cb3Andreas Huber } else { 2707314fa17093d514199fedcb55ac41136a1b31cb3Andreas Huber LOGI("setDataSource_l(URL suppressed)"); 27166b0a35c9a4136a84c3f73b1b25fcb5220138b95Andreas Huber } 27266b0a35c9a4136a84c3f73b1b25fcb5220138b95Andreas Huber 273bd22c52280179b29eefac91ef7e7bbbc33d25904Andreas Huber // The actual work will be done during preparation in the call to 274bd22c52280179b29eefac91ef7e7bbbc33d25904Andreas Huber // ::finishSetDataSource_l to avoid blocking the calling thread in 275bd22c52280179b29eefac91ef7e7bbbc33d25904Andreas Huber // setDataSource for any significant time. 27666b0a35c9a4136a84c3f73b1b25fcb5220138b95Andreas Huber 277bd22c52280179b29eefac91ef7e7bbbc33d25904Andreas Huber return OK; 278bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber} 279bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber 280bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huberstatus_t AwesomePlayer::setDataSource( 281bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber int fd, int64_t offset, int64_t length) { 282bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber Mutex::Autolock autoLock(mLock); 283bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber 284bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber reset_l(); 285bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber 2867b3396acc702451be9bafb19d7fe26d55d43a316Andreas Huber sp<DataSource> dataSource = new FileSource(fd, offset, length); 287bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber 2887b3396acc702451be9bafb19d7fe26d55d43a316Andreas Huber status_t err = dataSource->initCheck(); 289bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber 290bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber if (err != OK) { 291bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber return err; 292bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber } 293bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber 2947b3396acc702451be9bafb19d7fe26d55d43a316Andreas Huber mFileSource = dataSource; 2957b3396acc702451be9bafb19d7fe26d55d43a316Andreas Huber 2967b3396acc702451be9bafb19d7fe26d55d43a316Andreas Huber return setDataSource_l(dataSource); 2977b3396acc702451be9bafb19d7fe26d55d43a316Andreas Huber} 2987b3396acc702451be9bafb19d7fe26d55d43a316Andreas Huber 299e2b1028852120bcfded33b8f06f66b780437fe92Andreas Huberstatus_t AwesomePlayer::setDataSource(const sp<IStreamSource> &source) { 30085704836f33a199d7e442a23db82abbd5620d35dAndreas Huber return INVALID_OPERATION; 301e2b1028852120bcfded33b8f06f66b780437fe92Andreas Huber} 302e2b1028852120bcfded33b8f06f66b780437fe92Andreas Huber 3037b3396acc702451be9bafb19d7fe26d55d43a316Andreas Huberstatus_t AwesomePlayer::setDataSource_l( 3047b3396acc702451be9bafb19d7fe26d55d43a316Andreas Huber const sp<DataSource> &dataSource) { 3057b3396acc702451be9bafb19d7fe26d55d43a316Andreas Huber sp<MediaExtractor> extractor = MediaExtractor::Create(dataSource); 306bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber 307bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber if (extractor == NULL) { 308bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber return UNKNOWN_ERROR; 309bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber } 310bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber 311b5ce361d19e69fe156f7188c9ee0f4734b259874Gloria Wang dataSource->getDrmInfo(mDecryptHandle, &mDrmManagerClient); 3128f64134f749e4f7861a08a3063450fc714c4651dGloria Wang if (mDecryptHandle != NULL) { 3138f64134f749e4f7861a08a3063450fc714c4651dGloria Wang CHECK(mDrmManagerClient); 3148f64134f749e4f7861a08a3063450fc714c4651dGloria Wang if (RightsStatus::RIGHTS_VALID != mDecryptHandle->status) { 3158f64134f749e4f7861a08a3063450fc714c4651dGloria Wang notifyListener_l(MEDIA_ERROR, MEDIA_ERROR_UNKNOWN, ERROR_NO_LICENSE); 3168f64134f749e4f7861a08a3063450fc714c4651dGloria Wang } 317dcd25efb46c41c8d24a0a9cf61fb57f84149709eGloria Wang } 318dcd25efb46c41c8d24a0a9cf61fb57f84149709eGloria Wang 319bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber return setDataSource_l(extractor); 320bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber} 321bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber 322bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huberstatus_t AwesomePlayer::setDataSource_l(const sp<MediaExtractor> &extractor) { 3237fbdb0903dfbf70b314a74e64e28fb880cdb9247Andreas Huber // Attempt to approximate overall stream bitrate by summing all 3247fbdb0903dfbf70b314a74e64e28fb880cdb9247Andreas Huber // tracks' individual bitrates, if not all of them advertise bitrate, 3257fbdb0903dfbf70b314a74e64e28fb880cdb9247Andreas Huber // we have to fail. 3267fbdb0903dfbf70b314a74e64e28fb880cdb9247Andreas Huber 3277fbdb0903dfbf70b314a74e64e28fb880cdb9247Andreas Huber int64_t totalBitRate = 0; 3287fbdb0903dfbf70b314a74e64e28fb880cdb9247Andreas Huber 3297fbdb0903dfbf70b314a74e64e28fb880cdb9247Andreas Huber for (size_t i = 0; i < extractor->countTracks(); ++i) { 3307fbdb0903dfbf70b314a74e64e28fb880cdb9247Andreas Huber sp<MetaData> meta = extractor->getTrackMetaData(i); 3317fbdb0903dfbf70b314a74e64e28fb880cdb9247Andreas Huber 3327fbdb0903dfbf70b314a74e64e28fb880cdb9247Andreas Huber int32_t bitrate; 3337fbdb0903dfbf70b314a74e64e28fb880cdb9247Andreas Huber if (!meta->findInt32(kKeyBitRate, &bitrate)) { 3347fbdb0903dfbf70b314a74e64e28fb880cdb9247Andreas Huber totalBitRate = -1; 3357fbdb0903dfbf70b314a74e64e28fb880cdb9247Andreas Huber break; 3367fbdb0903dfbf70b314a74e64e28fb880cdb9247Andreas Huber } 3377fbdb0903dfbf70b314a74e64e28fb880cdb9247Andreas Huber 3387fbdb0903dfbf70b314a74e64e28fb880cdb9247Andreas Huber totalBitRate += bitrate; 3397fbdb0903dfbf70b314a74e64e28fb880cdb9247Andreas Huber } 3407fbdb0903dfbf70b314a74e64e28fb880cdb9247Andreas Huber 3417fbdb0903dfbf70b314a74e64e28fb880cdb9247Andreas Huber mBitrate = totalBitRate; 3427fbdb0903dfbf70b314a74e64e28fb880cdb9247Andreas Huber 3437fbdb0903dfbf70b314a74e64e28fb880cdb9247Andreas Huber LOGV("mBitrate = %lld bits/sec", mBitrate); 3447fbdb0903dfbf70b314a74e64e28fb880cdb9247Andreas Huber 345bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber bool haveAudio = false; 346bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber bool haveVideo = false; 347bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber for (size_t i = 0; i < extractor->countTracks(); ++i) { 348bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber sp<MetaData> meta = extractor->getTrackMetaData(i); 349bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber 350bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber const char *mime; 351bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber CHECK(meta->findCString(kKeyMIMEType, &mime)); 352bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber 353bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber if (!haveVideo && !strncasecmp(mime, "video/", 6)) { 35488d8a83de12592635248aa1a3bd6b9ea46108501Andreas Huber setVideoSource(extractor->getTrack(i)); 35588d8a83de12592635248aa1a3bd6b9ea46108501Andreas Huber haveVideo = true; 356b45c01c2b8588ff431b511151666a55a39f0a6aeJames Dong 357b45c01c2b8588ff431b511151666a55a39f0a6aeJames Dong // Set the presentation/display size 358b45c01c2b8588ff431b511151666a55a39f0a6aeJames Dong int32_t displayWidth, displayHeight; 359b45c01c2b8588ff431b511151666a55a39f0a6aeJames Dong bool success = meta->findInt32(kKeyDisplayWidth, &displayWidth); 360b45c01c2b8588ff431b511151666a55a39f0a6aeJames Dong if (success) { 361b45c01c2b8588ff431b511151666a55a39f0a6aeJames Dong success = meta->findInt32(kKeyDisplayHeight, &displayHeight); 362b45c01c2b8588ff431b511151666a55a39f0a6aeJames Dong } 363b45c01c2b8588ff431b511151666a55a39f0a6aeJames Dong if (success) { 364b45c01c2b8588ff431b511151666a55a39f0a6aeJames Dong mDisplayWidth = displayWidth; 365b45c01c2b8588ff431b511151666a55a39f0a6aeJames Dong mDisplayHeight = displayHeight; 366b45c01c2b8588ff431b511151666a55a39f0a6aeJames Dong } 367b45c01c2b8588ff431b511151666a55a39f0a6aeJames Dong 368bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber } else if (!haveAudio && !strncasecmp(mime, "audio/", 6)) { 36988d8a83de12592635248aa1a3bd6b9ea46108501Andreas Huber setAudioSource(extractor->getTrack(i)); 37088d8a83de12592635248aa1a3bd6b9ea46108501Andreas Huber haveAudio = true; 3718ae49d87b98d57d6758b0c51b95e28a6581a79f1Andreas Huber 3726954535ba64374e4e941cd83019a7af53edfb098Andreas Huber if (!strcasecmp(mime, MEDIA_MIMETYPE_AUDIO_VORBIS)) { 3736954535ba64374e4e941cd83019a7af53edfb098Andreas Huber // Only do this for vorbis audio, none of the other audio 3746954535ba64374e4e941cd83019a7af53edfb098Andreas Huber // formats even support this ringtone specific hack and 3756954535ba64374e4e941cd83019a7af53edfb098Andreas Huber // retrieving the metadata on some extractors may turn out 3766954535ba64374e4e941cd83019a7af53edfb098Andreas Huber // to be very expensive. 3776954535ba64374e4e941cd83019a7af53edfb098Andreas Huber sp<MetaData> fileMeta = extractor->getMetaData(); 3786954535ba64374e4e941cd83019a7af53edfb098Andreas Huber int32_t loop; 3796954535ba64374e4e941cd83019a7af53edfb098Andreas Huber if (fileMeta != NULL 3806954535ba64374e4e941cd83019a7af53edfb098Andreas Huber && fileMeta->findInt32(kKeyAutoLoop, &loop) && loop != 0) { 3816954535ba64374e4e941cd83019a7af53edfb098Andreas Huber mFlags |= AUTO_LOOPING; 3826954535ba64374e4e941cd83019a7af53edfb098Andreas Huber } 3838ae49d87b98d57d6758b0c51b95e28a6581a79f1Andreas Huber } 384bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber } 385bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber 386bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber if (haveAudio && haveVideo) { 387bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber break; 388bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber } 389bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber } 390bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber 391acdd9d0f59c3d8bdc3de80664a609527ec3d21e2Andreas Huber if (!haveAudio && !haveVideo) { 392acdd9d0f59c3d8bdc3de80664a609527ec3d21e2Andreas Huber return UNKNOWN_ERROR; 393acdd9d0f59c3d8bdc3de80664a609527ec3d21e2Andreas Huber } 394acdd9d0f59c3d8bdc3de80664a609527ec3d21e2Andreas Huber 395acdd9d0f59c3d8bdc3de80664a609527ec3d21e2Andreas Huber mExtractorFlags = extractor->flags(); 396acdd9d0f59c3d8bdc3de80664a609527ec3d21e2Andreas Huber 397acdd9d0f59c3d8bdc3de80664a609527ec3d21e2Andreas Huber return OK; 398bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber} 399bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber 400bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Hubervoid AwesomePlayer::reset() { 401bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber Mutex::Autolock autoLock(mLock); 402bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber reset_l(); 403bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber} 404bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber 405bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Hubervoid AwesomePlayer::reset_l() { 406b45c01c2b8588ff431b511151666a55a39f0a6aeJames Dong mDisplayWidth = 0; 407b45c01c2b8588ff431b511151666a55a39f0a6aeJames Dong mDisplayHeight = 0; 40865a170e3ac593a29abd0c76e9aa531fabad7f56dAndreas Huber 409dcd25efb46c41c8d24a0a9cf61fb57f84149709eGloria Wang if (mDecryptHandle != NULL) { 410dcd25efb46c41c8d24a0a9cf61fb57f84149709eGloria Wang mDrmManagerClient->setPlaybackStatus(mDecryptHandle, 411dcd25efb46c41c8d24a0a9cf61fb57f84149709eGloria Wang Playback::STOP, 0); 412dcd25efb46c41c8d24a0a9cf61fb57f84149709eGloria Wang mDecryptHandle = NULL; 413dcd25efb46c41c8d24a0a9cf61fb57f84149709eGloria Wang mDrmManagerClient = NULL; 414dcd25efb46c41c8d24a0a9cf61fb57f84149709eGloria Wang } 415dcd25efb46c41c8d24a0a9cf61fb57f84149709eGloria Wang 4167cf180c9bff69e5cc4a2f4e53b432db45ebbebabGloria Wang if (mFlags & PLAYING) { 4177cf180c9bff69e5cc4a2f4e53b432db45ebbebabGloria Wang uint32_t params = IMediaPlayerService::kBatteryDataTrackDecoder; 4187cf180c9bff69e5cc4a2f4e53b432db45ebbebabGloria Wang if ((mAudioSource != NULL) && (mAudioSource != mAudioTrack)) { 4197cf180c9bff69e5cc4a2f4e53b432db45ebbebabGloria Wang params |= IMediaPlayerService::kBatteryDataTrackAudio; 4207cf180c9bff69e5cc4a2f4e53b432db45ebbebabGloria Wang } 4217cf180c9bff69e5cc4a2f4e53b432db45ebbebabGloria Wang if (mVideoSource != NULL) { 4227cf180c9bff69e5cc4a2f4e53b432db45ebbebabGloria Wang params |= IMediaPlayerService::kBatteryDataTrackVideo; 4237cf180c9bff69e5cc4a2f4e53b432db45ebbebabGloria Wang } 4247cf180c9bff69e5cc4a2f4e53b432db45ebbebabGloria Wang addBatteryData(params); 4257cf180c9bff69e5cc4a2f4e53b432db45ebbebabGloria Wang } 4267cf180c9bff69e5cc4a2f4e53b432db45ebbebabGloria Wang 427e94bd14078d327ef2f800e69907efce641a13272Andreas Huber if (mFlags & PREPARING) { 428e94bd14078d327ef2f800e69907efce641a13272Andreas Huber mFlags |= PREPARE_CANCELLED; 429e94bd14078d327ef2f800e69907efce641a13272Andreas Huber if (mConnectingDataSource != NULL) { 430e94bd14078d327ef2f800e69907efce641a13272Andreas Huber LOGI("interrupting the connection process"); 431e94bd14078d327ef2f800e69907efce641a13272Andreas Huber mConnectingDataSource->disconnect(); 432f1958f9442bc937e1f8c8d9175901500b944b021Andreas Huber } else if (mConnectingRTSPController != NULL) { 433f1958f9442bc937e1f8c8d9175901500b944b021Andreas Huber LOGI("interrupting the connection process"); 434f1958f9442bc937e1f8c8d9175901500b944b021Andreas Huber mConnectingRTSPController->disconnect(); 435e94bd14078d327ef2f800e69907efce641a13272Andreas Huber } 4366a05c9e912aeb8bfe1ef99516def91a177a481b6Andreas Huber 4376a05c9e912aeb8bfe1ef99516def91a177a481b6Andreas Huber if (mFlags & PREPARING_CONNECTED) { 4386a05c9e912aeb8bfe1ef99516def91a177a481b6Andreas Huber // We are basically done preparing, we're just buffering 4396a05c9e912aeb8bfe1ef99516def91a177a481b6Andreas Huber // enough data to start playback, we can safely interrupt that. 4406a05c9e912aeb8bfe1ef99516def91a177a481b6Andreas Huber finishAsyncPrepare_l(); 4416a05c9e912aeb8bfe1ef99516def91a177a481b6Andreas Huber } 442e94bd14078d327ef2f800e69907efce641a13272Andreas Huber } 443e94bd14078d327ef2f800e69907efce641a13272Andreas Huber 444bd22c52280179b29eefac91ef7e7bbbc33d25904Andreas Huber while (mFlags & PREPARING) { 445bd22c52280179b29eefac91ef7e7bbbc33d25904Andreas Huber mPreparedCondition.wait(mLock); 446bd22c52280179b29eefac91ef7e7bbbc33d25904Andreas Huber } 447bd22c52280179b29eefac91ef7e7bbbc33d25904Andreas Huber 448bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber cancelPlayerEvents(); 449bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber 4500a5baa9b411fe086013d2a5e9126ed63fbad046cAndreas Huber mCachedSource.clear(); 45188d8a83de12592635248aa1a3bd6b9ea46108501Andreas Huber mAudioTrack.clear(); 45288d8a83de12592635248aa1a3bd6b9ea46108501Andreas Huber mVideoTrack.clear(); 45388d8a83de12592635248aa1a3bd6b9ea46108501Andreas Huber 4547b3396acc702451be9bafb19d7fe26d55d43a316Andreas Huber // Shutdown audio first, so that the respone to the reset request 4557b3396acc702451be9bafb19d7fe26d55d43a316Andreas Huber // appears to happen instantaneously as far as the user is concerned 4567b3396acc702451be9bafb19d7fe26d55d43a316Andreas Huber // If we did this later, audio would continue playing while we 4577b3396acc702451be9bafb19d7fe26d55d43a316Andreas Huber // shutdown the video-related resources and the player appear to 4587b3396acc702451be9bafb19d7fe26d55d43a316Andreas Huber // not be as responsive to a reset request. 459e94bd14078d327ef2f800e69907efce641a13272Andreas Huber if (mAudioPlayer == NULL && mAudioSource != NULL) { 460e94bd14078d327ef2f800e69907efce641a13272Andreas Huber // If we had an audio player, it would have effectively 461e94bd14078d327ef2f800e69907efce641a13272Andreas Huber // taken possession of the audio source and stopped it when 462e94bd14078d327ef2f800e69907efce641a13272Andreas Huber // _it_ is stopped. Otherwise this is still our responsibility. 463e94bd14078d327ef2f800e69907efce641a13272Andreas Huber mAudioSource->stop(); 464e94bd14078d327ef2f800e69907efce641a13272Andreas Huber } 4657b3396acc702451be9bafb19d7fe26d55d43a316Andreas Huber mAudioSource.clear(); 4667b3396acc702451be9bafb19d7fe26d55d43a316Andreas Huber 4677b3396acc702451be9bafb19d7fe26d55d43a316Andreas Huber mTimeSource = NULL; 4687b3396acc702451be9bafb19d7fe26d55d43a316Andreas Huber 4697b3396acc702451be9bafb19d7fe26d55d43a316Andreas Huber delete mAudioPlayer; 4707b3396acc702451be9bafb19d7fe26d55d43a316Andreas Huber mAudioPlayer = NULL; 4717b3396acc702451be9bafb19d7fe26d55d43a316Andreas Huber 472b9280d5c2313c41eb490f58198c4e59118e0e3e6Andreas Huber mVideoRenderer.clear(); 473b9280d5c2313c41eb490f58198c4e59118e0e3e6Andreas Huber 474bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber if (mVideoBuffer) { 475bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber mVideoBuffer->release(); 476bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber mVideoBuffer = NULL; 477bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber } 478bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber 479cce326fe43411855aca2f719e505b051bc4b61b3Andreas Huber if (mRTSPController != NULL) { 480cce326fe43411855aca2f719e505b051bc4b61b3Andreas Huber mRTSPController->disconnect(); 481cce326fe43411855aca2f719e505b051bc4b61b3Andreas Huber mRTSPController.clear(); 482cce326fe43411855aca2f719e505b051bc4b61b3Andreas Huber } 483cce326fe43411855aca2f719e505b051bc4b61b3Andreas Huber 484bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber if (mVideoSource != NULL) { 485bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber mVideoSource->stop(); 48669f5f4c021ee55055df39718244c036faf2d3382Andreas Huber 48769f5f4c021ee55055df39718244c036faf2d3382Andreas Huber // The following hack is necessary to ensure that the OMX 48869f5f4c021ee55055df39718244c036faf2d3382Andreas Huber // component is completely released by the time we may try 48969f5f4c021ee55055df39718244c036faf2d3382Andreas Huber // to instantiate it again. 49069f5f4c021ee55055df39718244c036faf2d3382Andreas Huber wp<MediaSource> tmp = mVideoSource; 491bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber mVideoSource.clear(); 49269f5f4c021ee55055df39718244c036faf2d3382Andreas Huber while (tmp.promote() != NULL) { 49369f5f4c021ee55055df39718244c036faf2d3382Andreas Huber usleep(1000); 49469f5f4c021ee55055df39718244c036faf2d3382Andreas Huber } 49569f5f4c021ee55055df39718244c036faf2d3382Andreas Huber IPCThreadState::self()->flushCommands(); 496bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber } 497bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber 498bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber mDurationUs = -1; 499bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber mFlags = 0; 500acdd9d0f59c3d8bdc3de80664a609527ec3d21e2Andreas Huber mExtractorFlags = 0; 501bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber mTimeSourceDeltaUs = 0; 502bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber mVideoTimeUs = 0; 503bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber 50464bb6983690bf994d904591145a3cdd6373bdbe6Andreas Huber mSeeking = NO_SEEK; 5051321fdd94d354431b930735e9f38f32ecd189a2dAndreas Huber mSeekNotificationSent = false; 506bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber mSeekTimeUs = 0; 50766b0a35c9a4136a84c3f73b1b25fcb5220138b95Andreas Huber 508bd22c52280179b29eefac91ef7e7bbbc33d25904Andreas Huber mUri.setTo(""); 509bd22c52280179b29eefac91ef7e7bbbc33d25904Andreas Huber mUriHeaders.clear(); 5107b3396acc702451be9bafb19d7fe26d55d43a316Andreas Huber 5117b3396acc702451be9bafb19d7fe26d55d43a316Andreas Huber mFileSource.clear(); 5127b3396acc702451be9bafb19d7fe26d55d43a316Andreas Huber 5137fbdb0903dfbf70b314a74e64e28fb880cdb9247Andreas Huber mBitrate = -1; 514bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber} 515bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber 516c23f12af0394aa2f6651968a3c8840f1af317aa1Andreas Hubervoid AwesomePlayer::notifyListener_l(int msg, int ext1, int ext2) { 5170726045216f576e97672ebeefc265d39c4ebaaa5Andreas Huber if (mListener != NULL) { 5180726045216f576e97672ebeefc265d39c4ebaaa5Andreas Huber sp<MediaPlayerBase> listener = mListener.promote(); 5190726045216f576e97672ebeefc265d39c4ebaaa5Andreas Huber 5200726045216f576e97672ebeefc265d39c4ebaaa5Andreas Huber if (listener != NULL) { 521c23f12af0394aa2f6651968a3c8840f1af317aa1Andreas Huber listener->sendEvent(msg, ext1, ext2); 52266b0a35c9a4136a84c3f73b1b25fcb5220138b95Andreas Huber } 52366b0a35c9a4136a84c3f73b1b25fcb5220138b95Andreas Huber } 52466b0a35c9a4136a84c3f73b1b25fcb5220138b95Andreas Huber} 52566b0a35c9a4136a84c3f73b1b25fcb5220138b95Andreas Huber 5267fbdb0903dfbf70b314a74e64e28fb880cdb9247Andreas Huberbool AwesomePlayer::getBitrate(int64_t *bitrate) { 527c7fc37a3dab9bd1f96713649f351b5990e6316ffJames Dong off64_t size; 5287fbdb0903dfbf70b314a74e64e28fb880cdb9247Andreas Huber if (mDurationUs >= 0 && mCachedSource != NULL 5297fbdb0903dfbf70b314a74e64e28fb880cdb9247Andreas Huber && mCachedSource->getSize(&size) == OK) { 5307fbdb0903dfbf70b314a74e64e28fb880cdb9247Andreas Huber *bitrate = size * 8000000ll / mDurationUs; // in bits/sec 5317fbdb0903dfbf70b314a74e64e28fb880cdb9247Andreas Huber return true; 5327fbdb0903dfbf70b314a74e64e28fb880cdb9247Andreas Huber } 5337fbdb0903dfbf70b314a74e64e28fb880cdb9247Andreas Huber 5347fbdb0903dfbf70b314a74e64e28fb880cdb9247Andreas Huber if (mBitrate >= 0) { 5357fbdb0903dfbf70b314a74e64e28fb880cdb9247Andreas Huber *bitrate = mBitrate; 5367fbdb0903dfbf70b314a74e64e28fb880cdb9247Andreas Huber return true; 5377fbdb0903dfbf70b314a74e64e28fb880cdb9247Andreas Huber } 5387fbdb0903dfbf70b314a74e64e28fb880cdb9247Andreas Huber 5397fbdb0903dfbf70b314a74e64e28fb880cdb9247Andreas Huber *bitrate = 0; 5407fbdb0903dfbf70b314a74e64e28fb880cdb9247Andreas Huber 5417fbdb0903dfbf70b314a74e64e28fb880cdb9247Andreas Huber return false; 5427fbdb0903dfbf70b314a74e64e28fb880cdb9247Andreas Huber} 5437fbdb0903dfbf70b314a74e64e28fb880cdb9247Andreas Huber 5448650e1960905097f6f1d6aa462ccb1c93c656834Andreas Huber// Returns true iff cached duration is available/applicable. 5458650e1960905097f6f1d6aa462ccb1c93c656834Andreas Huberbool AwesomePlayer::getCachedDuration_l(int64_t *durationUs, bool *eos) { 5467fbdb0903dfbf70b314a74e64e28fb880cdb9247Andreas Huber int64_t bitrate; 5478650e1960905097f6f1d6aa462ccb1c93c656834Andreas Huber 5488650e1960905097f6f1d6aa462ccb1c93c656834Andreas Huber if (mRTSPController != NULL) { 5498650e1960905097f6f1d6aa462ccb1c93c656834Andreas Huber *durationUs = mRTSPController->getQueueDurationUs(eos); 5508650e1960905097f6f1d6aa462ccb1c93c656834Andreas Huber return true; 5517fbdb0903dfbf70b314a74e64e28fb880cdb9247Andreas Huber } else if (mCachedSource != NULL && getBitrate(&bitrate)) { 5521bd233ce7e1aa7730bc18d46ffd57791391738cdBryan Mawhinney status_t finalStatus; 5531bd233ce7e1aa7730bc18d46ffd57791391738cdBryan Mawhinney size_t cachedDataRemaining = mCachedSource->approxDataRemaining(&finalStatus); 5548650e1960905097f6f1d6aa462ccb1c93c656834Andreas Huber *durationUs = cachedDataRemaining * 8000000ll / bitrate; 5551bd233ce7e1aa7730bc18d46ffd57791391738cdBryan Mawhinney *eos = (finalStatus != OK); 5568650e1960905097f6f1d6aa462ccb1c93c656834Andreas Huber return true; 5578650e1960905097f6f1d6aa462ccb1c93c656834Andreas Huber } 5588650e1960905097f6f1d6aa462ccb1c93c656834Andreas Huber 5598650e1960905097f6f1d6aa462ccb1c93c656834Andreas Huber return false; 5608650e1960905097f6f1d6aa462ccb1c93c656834Andreas Huber} 5618650e1960905097f6f1d6aa462ccb1c93c656834Andreas Huber 56234ef0f32c8fc0186236a27e07405328cc1f7c56dAndreas Hubervoid AwesomePlayer::ensureCacheIsFetching_l() { 56334ef0f32c8fc0186236a27e07405328cc1f7c56dAndreas Huber if (mCachedSource != NULL) { 56434ef0f32c8fc0186236a27e07405328cc1f7c56dAndreas Huber mCachedSource->resumeFetchingIfNecessary(); 56534ef0f32c8fc0186236a27e07405328cc1f7c56dAndreas Huber } 56634ef0f32c8fc0186236a27e07405328cc1f7c56dAndreas Huber} 56734ef0f32c8fc0186236a27e07405328cc1f7c56dAndreas Huber 568145e68fc778275963189b02a1adcbe27cce4d769Andreas Hubervoid AwesomePlayer::onVideoLagUpdate() { 569145e68fc778275963189b02a1adcbe27cce4d769Andreas Huber Mutex::Autolock autoLock(mLock); 570145e68fc778275963189b02a1adcbe27cce4d769Andreas Huber if (!mVideoLagEventPending) { 571145e68fc778275963189b02a1adcbe27cce4d769Andreas Huber return; 572145e68fc778275963189b02a1adcbe27cce4d769Andreas Huber } 573145e68fc778275963189b02a1adcbe27cce4d769Andreas Huber mVideoLagEventPending = false; 574145e68fc778275963189b02a1adcbe27cce4d769Andreas Huber 575145e68fc778275963189b02a1adcbe27cce4d769Andreas Huber int64_t audioTimeUs = mAudioPlayer->getMediaTimeUs(); 576145e68fc778275963189b02a1adcbe27cce4d769Andreas Huber int64_t videoLateByUs = audioTimeUs - mVideoTimeUs; 577145e68fc778275963189b02a1adcbe27cce4d769Andreas Huber 5785dac87b088556b8ed7f2a4f5546d31be0bb68680Andreas Huber if (!(mFlags & VIDEO_AT_EOS) && videoLateByUs > 300000ll) { 579145e68fc778275963189b02a1adcbe27cce4d769Andreas Huber LOGV("video late by %lld ms.", videoLateByUs / 1000ll); 580145e68fc778275963189b02a1adcbe27cce4d769Andreas Huber 581145e68fc778275963189b02a1adcbe27cce4d769Andreas Huber notifyListener_l( 582145e68fc778275963189b02a1adcbe27cce4d769Andreas Huber MEDIA_INFO, 583145e68fc778275963189b02a1adcbe27cce4d769Andreas Huber MEDIA_INFO_VIDEO_TRACK_LAGGING, 584145e68fc778275963189b02a1adcbe27cce4d769Andreas Huber videoLateByUs / 1000ll); 585145e68fc778275963189b02a1adcbe27cce4d769Andreas Huber } 586145e68fc778275963189b02a1adcbe27cce4d769Andreas Huber 587145e68fc778275963189b02a1adcbe27cce4d769Andreas Huber postVideoLagEvent_l(); 588145e68fc778275963189b02a1adcbe27cce4d769Andreas Huber} 589145e68fc778275963189b02a1adcbe27cce4d769Andreas Huber 59066b0a35c9a4136a84c3f73b1b25fcb5220138b95Andreas Hubervoid AwesomePlayer::onBufferingUpdate() { 59166b0a35c9a4136a84c3f73b1b25fcb5220138b95Andreas Huber Mutex::Autolock autoLock(mLock); 592d29345dfa29cdcc650f3705e43950ef2500f6728Andreas Huber if (!mBufferingEventPending) { 593d29345dfa29cdcc650f3705e43950ef2500f6728Andreas Huber return; 594d29345dfa29cdcc650f3705e43950ef2500f6728Andreas Huber } 59566b0a35c9a4136a84c3f73b1b25fcb5220138b95Andreas Huber mBufferingEventPending = false; 59666b0a35c9a4136a84c3f73b1b25fcb5220138b95Andreas Huber 5978650e1960905097f6f1d6aa462ccb1c93c656834Andreas Huber if (mCachedSource != NULL) { 5981bd233ce7e1aa7730bc18d46ffd57791391738cdBryan Mawhinney status_t finalStatus; 5991bd233ce7e1aa7730bc18d46ffd57791391738cdBryan Mawhinney size_t cachedDataRemaining = mCachedSource->approxDataRemaining(&finalStatus); 6001bd233ce7e1aa7730bc18d46ffd57791391738cdBryan Mawhinney bool eos = (finalStatus != OK); 601c9e894872c298b25fe9d74e68aa1e7287a541ac3Andreas Huber 6028650e1960905097f6f1d6aa462ccb1c93c656834Andreas Huber if (eos) { 6031bd233ce7e1aa7730bc18d46ffd57791391738cdBryan Mawhinney if (finalStatus == ERROR_END_OF_STREAM) { 6041bd233ce7e1aa7730bc18d46ffd57791391738cdBryan Mawhinney notifyListener_l(MEDIA_BUFFERING_UPDATE, 100); 6051bd233ce7e1aa7730bc18d46ffd57791391738cdBryan Mawhinney } 60683977eb230d829cfe520f55d7977037a904ce548Andreas Huber if (mFlags & PREPARING) { 60783977eb230d829cfe520f55d7977037a904ce548Andreas Huber LOGV("cache has reached EOS, prepare is done."); 60883977eb230d829cfe520f55d7977037a904ce548Andreas Huber finishAsyncPrepare_l(); 60983977eb230d829cfe520f55d7977037a904ce548Andreas Huber } 6108650e1960905097f6f1d6aa462ccb1c93c656834Andreas Huber } else { 6117fbdb0903dfbf70b314a74e64e28fb880cdb9247Andreas Huber int64_t bitrate; 6127fbdb0903dfbf70b314a74e64e28fb880cdb9247Andreas Huber if (getBitrate(&bitrate)) { 6138650e1960905097f6f1d6aa462ccb1c93c656834Andreas Huber size_t cachedSize = mCachedSource->cachedSize(); 6148650e1960905097f6f1d6aa462ccb1c93c656834Andreas Huber int64_t cachedDurationUs = cachedSize * 8000000ll / bitrate; 615c9e894872c298b25fe9d74e68aa1e7287a541ac3Andreas Huber 6168650e1960905097f6f1d6aa462ccb1c93c656834Andreas Huber int percentage = 100.0 * (double)cachedDurationUs / mDurationUs; 6178650e1960905097f6f1d6aa462ccb1c93c656834Andreas Huber if (percentage > 100) { 6188650e1960905097f6f1d6aa462ccb1c93c656834Andreas Huber percentage = 100; 6198650e1960905097f6f1d6aa462ccb1c93c656834Andreas Huber } 620c9e894872c298b25fe9d74e68aa1e7287a541ac3Andreas Huber 6218650e1960905097f6f1d6aa462ccb1c93c656834Andreas Huber notifyListener_l(MEDIA_BUFFERING_UPDATE, percentage); 6228650e1960905097f6f1d6aa462ccb1c93c656834Andreas Huber } else { 6238650e1960905097f6f1d6aa462ccb1c93c656834Andreas Huber // We don't know the bitrate of the stream, use absolute size 6248650e1960905097f6f1d6aa462ccb1c93c656834Andreas Huber // limits to maintain the cache. 6258650e1960905097f6f1d6aa462ccb1c93c656834Andreas Huber 6268650e1960905097f6f1d6aa462ccb1c93c656834Andreas Huber if ((mFlags & PLAYING) && !eos 6278650e1960905097f6f1d6aa462ccb1c93c656834Andreas Huber && (cachedDataRemaining < kLowWaterMarkBytes)) { 6288650e1960905097f6f1d6aa462ccb1c93c656834Andreas Huber LOGI("cache is running low (< %d) , pausing.", 6298650e1960905097f6f1d6aa462ccb1c93c656834Andreas Huber kLowWaterMarkBytes); 6308650e1960905097f6f1d6aa462ccb1c93c656834Andreas Huber mFlags |= CACHE_UNDERRUN; 6318650e1960905097f6f1d6aa462ccb1c93c656834Andreas Huber pause_l(); 63234ef0f32c8fc0186236a27e07405328cc1f7c56dAndreas Huber ensureCacheIsFetching_l(); 6338650e1960905097f6f1d6aa462ccb1c93c656834Andreas Huber notifyListener_l(MEDIA_INFO, MEDIA_INFO_BUFFERING_START); 6348650e1960905097f6f1d6aa462ccb1c93c656834Andreas Huber } else if (eos || cachedDataRemaining > kHighWaterMarkBytes) { 6358650e1960905097f6f1d6aa462ccb1c93c656834Andreas Huber if (mFlags & CACHE_UNDERRUN) { 6368650e1960905097f6f1d6aa462ccb1c93c656834Andreas Huber LOGI("cache has filled up (> %d), resuming.", 6378650e1960905097f6f1d6aa462ccb1c93c656834Andreas Huber kHighWaterMarkBytes); 6388650e1960905097f6f1d6aa462ccb1c93c656834Andreas Huber mFlags &= ~CACHE_UNDERRUN; 6398650e1960905097f6f1d6aa462ccb1c93c656834Andreas Huber play_l(); 6408650e1960905097f6f1d6aa462ccb1c93c656834Andreas Huber notifyListener_l(MEDIA_INFO, MEDIA_INFO_BUFFERING_END); 6418650e1960905097f6f1d6aa462ccb1c93c656834Andreas Huber } else if (mFlags & PREPARING) { 6428650e1960905097f6f1d6aa462ccb1c93c656834Andreas Huber LOGV("cache has filled up (> %d), prepare is done", 6438650e1960905097f6f1d6aa462ccb1c93c656834Andreas Huber kHighWaterMarkBytes); 6448650e1960905097f6f1d6aa462ccb1c93c656834Andreas Huber finishAsyncPrepare_l(); 6458650e1960905097f6f1d6aa462ccb1c93c656834Andreas Huber } 6468650e1960905097f6f1d6aa462ccb1c93c656834Andreas Huber } 6478650e1960905097f6f1d6aa462ccb1c93c656834Andreas Huber } 6488650e1960905097f6f1d6aa462ccb1c93c656834Andreas Huber } 6492415ecb5bb4e1459024f6d6c8ae2d6e3dc4fbdc7Andreas Huber } 6502415ecb5bb4e1459024f6d6c8ae2d6e3dc4fbdc7Andreas Huber 6518650e1960905097f6f1d6aa462ccb1c93c656834Andreas Huber int64_t cachedDurationUs; 6522a4b49bd3863024884a694b454e2e452752e6ea0Andreas Huber bool eos; 6538650e1960905097f6f1d6aa462ccb1c93c656834Andreas Huber if (getCachedDuration_l(&cachedDurationUs, &eos)) { 65434ef0f32c8fc0186236a27e07405328cc1f7c56dAndreas Huber LOGV("cachedDurationUs = %.2f secs, eos=%d", 65534ef0f32c8fc0186236a27e07405328cc1f7c56dAndreas Huber cachedDurationUs / 1E6, eos); 65634ef0f32c8fc0186236a27e07405328cc1f7c56dAndreas Huber 657100a4408968b90e314526185d572c72ea4cc784aAndreas Huber int64_t highWaterMarkUs = 658100a4408968b90e314526185d572c72ea4cc784aAndreas Huber (mRTSPController != NULL) ? kHighWaterMarkRTSPUs : kHighWaterMarkUs; 659100a4408968b90e314526185d572c72ea4cc784aAndreas Huber 6608650e1960905097f6f1d6aa462ccb1c93c656834Andreas Huber if ((mFlags & PLAYING) && !eos 6618650e1960905097f6f1d6aa462ccb1c93c656834Andreas Huber && (cachedDurationUs < kLowWaterMarkUs)) { 6628650e1960905097f6f1d6aa462ccb1c93c656834Andreas Huber LOGI("cache is running low (%.2f secs) , pausing.", 6638650e1960905097f6f1d6aa462ccb1c93c656834Andreas Huber cachedDurationUs / 1E6); 6648650e1960905097f6f1d6aa462ccb1c93c656834Andreas Huber mFlags |= CACHE_UNDERRUN; 6658650e1960905097f6f1d6aa462ccb1c93c656834Andreas Huber pause_l(); 66634ef0f32c8fc0186236a27e07405328cc1f7c56dAndreas Huber ensureCacheIsFetching_l(); 6678650e1960905097f6f1d6aa462ccb1c93c656834Andreas Huber notifyListener_l(MEDIA_INFO, MEDIA_INFO_BUFFERING_START); 668100a4408968b90e314526185d572c72ea4cc784aAndreas Huber } else if (eos || cachedDurationUs > highWaterMarkUs) { 6698650e1960905097f6f1d6aa462ccb1c93c656834Andreas Huber if (mFlags & CACHE_UNDERRUN) { 6708650e1960905097f6f1d6aa462ccb1c93c656834Andreas Huber LOGI("cache has filled up (%.2f secs), resuming.", 6718650e1960905097f6f1d6aa462ccb1c93c656834Andreas Huber cachedDurationUs / 1E6); 6728650e1960905097f6f1d6aa462ccb1c93c656834Andreas Huber mFlags &= ~CACHE_UNDERRUN; 6738650e1960905097f6f1d6aa462ccb1c93c656834Andreas Huber play_l(); 6748650e1960905097f6f1d6aa462ccb1c93c656834Andreas Huber notifyListener_l(MEDIA_INFO, MEDIA_INFO_BUFFERING_END); 6758650e1960905097f6f1d6aa462ccb1c93c656834Andreas Huber } else if (mFlags & PREPARING) { 6768650e1960905097f6f1d6aa462ccb1c93c656834Andreas Huber LOGV("cache has filled up (%.2f secs), prepare is done", 6778650e1960905097f6f1d6aa462ccb1c93c656834Andreas Huber cachedDurationUs / 1E6); 6788650e1960905097f6f1d6aa462ccb1c93c656834Andreas Huber finishAsyncPrepare_l(); 6792a4b49bd3863024884a694b454e2e452752e6ea0Andreas Huber } 6802a4b49bd3863024884a694b454e2e452752e6ea0Andreas Huber } 6810a5baa9b411fe086013d2a5e9126ed63fbad046cAndreas Huber } 6820a5baa9b411fe086013d2a5e9126ed63fbad046cAndreas Huber 6830a5baa9b411fe086013d2a5e9126ed63fbad046cAndreas Huber postBufferingEvent_l(); 6840726045216f576e97672ebeefc265d39c4ebaaa5Andreas Huber} 6850726045216f576e97672ebeefc265d39c4ebaaa5Andreas Huber 686bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Hubervoid AwesomePlayer::onStreamDone() { 687bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber // Posted whenever any stream finishes playing. 688bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber 689bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber Mutex::Autolock autoLock(mLock); 690d29345dfa29cdcc650f3705e43950ef2500f6728Andreas Huber if (!mStreamDoneEventPending) { 691d29345dfa29cdcc650f3705e43950ef2500f6728Andreas Huber return; 692d29345dfa29cdcc650f3705e43950ef2500f6728Andreas Huber } 693bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber mStreamDoneEventPending = false; 694bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber 695ed8d14f6a934072cd012992c4ef16990a54baa9aAndreas Huber if (mStreamDoneStatus != ERROR_END_OF_STREAM) { 6965d2de4da54504836e4b772b3010ac28c19f667f0Andreas Huber LOGV("MEDIA_ERROR %d", mStreamDoneStatus); 6975d2de4da54504836e4b772b3010ac28c19f667f0Andreas Huber 6985d2de4da54504836e4b772b3010ac28c19f667f0Andreas Huber notifyListener_l( 6995d2de4da54504836e4b772b3010ac28c19f667f0Andreas Huber MEDIA_ERROR, MEDIA_ERROR_UNKNOWN, mStreamDoneStatus); 7005d2de4da54504836e4b772b3010ac28c19f667f0Andreas Huber 701b2e3954c94717e43b3dc9b880564f166cfbbc0a2Andreas Huber pause_l(true /* at eos */); 7025d2de4da54504836e4b772b3010ac28c19f667f0Andreas Huber 7035d2de4da54504836e4b772b3010ac28c19f667f0Andreas Huber mFlags |= AT_EOS; 7045d2de4da54504836e4b772b3010ac28c19f667f0Andreas Huber return; 7055d2de4da54504836e4b772b3010ac28c19f667f0Andreas Huber } 7065d2de4da54504836e4b772b3010ac28c19f667f0Andreas Huber 7075d2de4da54504836e4b772b3010ac28c19f667f0Andreas Huber const bool allDone = 7085d2de4da54504836e4b772b3010ac28c19f667f0Andreas Huber (mVideoSource == NULL || (mFlags & VIDEO_AT_EOS)) 7095d2de4da54504836e4b772b3010ac28c19f667f0Andreas Huber && (mAudioSource == NULL || (mFlags & AUDIO_AT_EOS)); 7105d2de4da54504836e4b772b3010ac28c19f667f0Andreas Huber 7115d2de4da54504836e4b772b3010ac28c19f667f0Andreas Huber if (!allDone) { 7125d2de4da54504836e4b772b3010ac28c19f667f0Andreas Huber return; 7135d2de4da54504836e4b772b3010ac28c19f667f0Andreas Huber } 7145d2de4da54504836e4b772b3010ac28c19f667f0Andreas Huber 7158ae49d87b98d57d6758b0c51b95e28a6581a79f1Andreas Huber if (mFlags & (LOOPING | AUTO_LOOPING)) { 716bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber seekTo_l(0); 717bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber 718a657f8deaf21acbe5faba7be1df9c6681d44d471Andreas Huber if (mVideoSource != NULL) { 719bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber postVideoEvent_l(); 720bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber } 721bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber } else { 7225d2de4da54504836e4b772b3010ac28c19f667f0Andreas Huber LOGV("MEDIA_PLAYBACK_COMPLETE"); 7235d2de4da54504836e4b772b3010ac28c19f667f0Andreas Huber notifyListener_l(MEDIA_PLAYBACK_COMPLETE); 724bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber 725b2e3954c94717e43b3dc9b880564f166cfbbc0a2Andreas Huber pause_l(true /* at eos */); 7262e8ffaf95bd35358ecd14ddf00cddaf3abefe0a9Andreas Huber 7272e8ffaf95bd35358ecd14ddf00cddaf3abefe0a9Andreas Huber mFlags |= AT_EOS; 728bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber } 729bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber} 730bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber 731bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huberstatus_t AwesomePlayer::play() { 732bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber Mutex::Autolock autoLock(mLock); 7330a5baa9b411fe086013d2a5e9126ed63fbad046cAndreas Huber 7340a5baa9b411fe086013d2a5e9126ed63fbad046cAndreas Huber mFlags &= ~CACHE_UNDERRUN; 7350a5baa9b411fe086013d2a5e9126ed63fbad046cAndreas Huber 7367b3396acc702451be9bafb19d7fe26d55d43a316Andreas Huber return play_l(); 7377b3396acc702451be9bafb19d7fe26d55d43a316Andreas Huber} 738bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber 7397b3396acc702451be9bafb19d7fe26d55d43a316Andreas Huberstatus_t AwesomePlayer::play_l() { 7402b1222f8938356669672f35e0e53e176c78c40efAndreas Huber mFlags &= ~SEEK_PREVIEW; 7412b1222f8938356669672f35e0e53e176c78c40efAndreas Huber 742bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber if (mFlags & PLAYING) { 743bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber return OK; 744bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber } 745bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber 746bd22c52280179b29eefac91ef7e7bbbc33d25904Andreas Huber if (!(mFlags & PREPARED)) { 747bd22c52280179b29eefac91ef7e7bbbc33d25904Andreas Huber status_t err = prepare_l(); 748bd22c52280179b29eefac91ef7e7bbbc33d25904Andreas Huber 749bd22c52280179b29eefac91ef7e7bbbc33d25904Andreas Huber if (err != OK) { 750bd22c52280179b29eefac91ef7e7bbbc33d25904Andreas Huber return err; 751bd22c52280179b29eefac91ef7e7bbbc33d25904Andreas Huber } 752bd22c52280179b29eefac91ef7e7bbbc33d25904Andreas Huber } 753bd22c52280179b29eefac91ef7e7bbbc33d25904Andreas Huber 754bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber mFlags |= PLAYING; 755bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber mFlags |= FIRST_FRAME; 756bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber 757c130b5bf563d049bd391ccd96985ac278ef8ff8dGloria Wang if (mDecryptHandle != NULL) { 758c130b5bf563d049bd391ccd96985ac278ef8ff8dGloria Wang int64_t position; 759c130b5bf563d049bd391ccd96985ac278ef8ff8dGloria Wang getPosition(&position); 760c130b5bf563d049bd391ccd96985ac278ef8ff8dGloria Wang mDrmManagerClient->setPlaybackStatus(mDecryptHandle, 761c130b5bf563d049bd391ccd96985ac278ef8ff8dGloria Wang Playback::START, position / 1000); 762c130b5bf563d049bd391ccd96985ac278ef8ff8dGloria Wang } 763c130b5bf563d049bd391ccd96985ac278ef8ff8dGloria Wang 764bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber if (mAudioSource != NULL) { 765bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber if (mAudioPlayer == NULL) { 766bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber if (mAudioSink != NULL) { 767ed54ad0f8619ae416b0968ade6248894cbfc4dbaAndreas Huber mAudioPlayer = new AudioPlayer(mAudioSink, this); 768bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber mAudioPlayer->setSource(mAudioSource); 769e7e3b785a0e7819db4c895a4f60e9a4dd755880cAndreas Huber 770f03034408506051f2f836e59305fcd5f662bf19aAndreas Huber mTimeSource = mAudioPlayer; 77188c030e0e0152791ff74f90249f55fce01371198Andreas Huber 772b874cd085bba63528c570f74c493bfea835190d9Andreas Huber // If there was a seek request before we ever started, 773b874cd085bba63528c570f74c493bfea835190d9Andreas Huber // honor the request now. 774b874cd085bba63528c570f74c493bfea835190d9Andreas Huber // Make sure to do this before starting the audio player 775b874cd085bba63528c570f74c493bfea835190d9Andreas Huber // to avoid a race condition. 776b874cd085bba63528c570f74c493bfea835190d9Andreas Huber seekAudioIfNecessary_l(); 777f03034408506051f2f836e59305fcd5f662bf19aAndreas Huber } 778f03034408506051f2f836e59305fcd5f662bf19aAndreas Huber } 77988c030e0e0152791ff74f90249f55fce01371198Andreas Huber 780f03034408506051f2f836e59305fcd5f662bf19aAndreas Huber CHECK(!(mFlags & AUDIO_RUNNING)); 781c130b5bf563d049bd391ccd96985ac278ef8ff8dGloria Wang 782f03034408506051f2f836e59305fcd5f662bf19aAndreas Huber if (mVideoSource == NULL) { 783f03034408506051f2f836e59305fcd5f662bf19aAndreas Huber status_t err = startAudioPlayer_l(); 784bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber 785f03034408506051f2f836e59305fcd5f662bf19aAndreas Huber if (err != OK) { 786f03034408506051f2f836e59305fcd5f662bf19aAndreas Huber delete mAudioPlayer; 787f03034408506051f2f836e59305fcd5f662bf19aAndreas Huber mAudioPlayer = NULL; 788bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber 789f03034408506051f2f836e59305fcd5f662bf19aAndreas Huber mFlags &= ~(PLAYING | FIRST_FRAME); 7901862a33b246249630b654182afb5914da3480d4cAndreas Huber 791f03034408506051f2f836e59305fcd5f662bf19aAndreas Huber if (mDecryptHandle != NULL) { 792f03034408506051f2f836e59305fcd5f662bf19aAndreas Huber mDrmManagerClient->setPlaybackStatus( 793f03034408506051f2f836e59305fcd5f662bf19aAndreas Huber mDecryptHandle, Playback::STOP, 0); 794f03034408506051f2f836e59305fcd5f662bf19aAndreas Huber } 795f03034408506051f2f836e59305fcd5f662bf19aAndreas Huber 796f03034408506051f2f836e59305fcd5f662bf19aAndreas Huber return err; 797bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber } 798bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber } 799bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber } 800bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber 801bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber if (mTimeSource == NULL && mAudioPlayer == NULL) { 8025d2de4da54504836e4b772b3010ac28c19f667f0Andreas Huber mTimeSource = &mSystemTimeSource; 803bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber } 804bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber 805bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber if (mVideoSource != NULL) { 806a657f8deaf21acbe5faba7be1df9c6681d44d471Andreas Huber // Kick off video playback 807a657f8deaf21acbe5faba7be1df9c6681d44d471Andreas Huber postVideoEvent_l(); 808145e68fc778275963189b02a1adcbe27cce4d769Andreas Huber 809145e68fc778275963189b02a1adcbe27cce4d769Andreas Huber if (mAudioSource != NULL && mVideoSource != NULL) { 810145e68fc778275963189b02a1adcbe27cce4d769Andreas Huber postVideoLagEvent_l(); 811145e68fc778275963189b02a1adcbe27cce4d769Andreas Huber } 812bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber } 813bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber 8142e8ffaf95bd35358ecd14ddf00cddaf3abefe0a9Andreas Huber if (mFlags & AT_EOS) { 8152e8ffaf95bd35358ecd14ddf00cddaf3abefe0a9Andreas Huber // Legacy behaviour, if a stream finishes playing and then 8162e8ffaf95bd35358ecd14ddf00cddaf3abefe0a9Andreas Huber // is started again, we play from the start... 8172e8ffaf95bd35358ecd14ddf00cddaf3abefe0a9Andreas Huber seekTo_l(0); 8182e8ffaf95bd35358ecd14ddf00cddaf3abefe0a9Andreas Huber } 8192e8ffaf95bd35358ecd14ddf00cddaf3abefe0a9Andreas Huber 8207cf180c9bff69e5cc4a2f4e53b432db45ebbebabGloria Wang uint32_t params = IMediaPlayerService::kBatteryDataCodecStarted 8217cf180c9bff69e5cc4a2f4e53b432db45ebbebabGloria Wang | IMediaPlayerService::kBatteryDataTrackDecoder; 8227cf180c9bff69e5cc4a2f4e53b432db45ebbebabGloria Wang if ((mAudioSource != NULL) && (mAudioSource != mAudioTrack)) { 8237cf180c9bff69e5cc4a2f4e53b432db45ebbebabGloria Wang params |= IMediaPlayerService::kBatteryDataTrackAudio; 8247cf180c9bff69e5cc4a2f4e53b432db45ebbebabGloria Wang } 8257cf180c9bff69e5cc4a2f4e53b432db45ebbebabGloria Wang if (mVideoSource != NULL) { 8267cf180c9bff69e5cc4a2f4e53b432db45ebbebabGloria Wang params |= IMediaPlayerService::kBatteryDataTrackVideo; 8277cf180c9bff69e5cc4a2f4e53b432db45ebbebabGloria Wang } 8287cf180c9bff69e5cc4a2f4e53b432db45ebbebabGloria Wang addBatteryData(params); 8297cf180c9bff69e5cc4a2f4e53b432db45ebbebabGloria Wang 830bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber return OK; 831bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber} 832bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber 833f03034408506051f2f836e59305fcd5f662bf19aAndreas Huberstatus_t AwesomePlayer::startAudioPlayer_l() { 834f03034408506051f2f836e59305fcd5f662bf19aAndreas Huber CHECK(!(mFlags & AUDIO_RUNNING)); 835f03034408506051f2f836e59305fcd5f662bf19aAndreas Huber 836f03034408506051f2f836e59305fcd5f662bf19aAndreas Huber if (mAudioSource == NULL || mAudioPlayer == NULL) { 837f03034408506051f2f836e59305fcd5f662bf19aAndreas Huber return OK; 838f03034408506051f2f836e59305fcd5f662bf19aAndreas Huber } 839f03034408506051f2f836e59305fcd5f662bf19aAndreas Huber 840f03034408506051f2f836e59305fcd5f662bf19aAndreas Huber if (!(mFlags & AUDIOPLAYER_STARTED)) { 841f03034408506051f2f836e59305fcd5f662bf19aAndreas Huber mFlags |= AUDIOPLAYER_STARTED; 842f03034408506051f2f836e59305fcd5f662bf19aAndreas Huber 843f03034408506051f2f836e59305fcd5f662bf19aAndreas Huber // We've already started the MediaSource in order to enable 844f03034408506051f2f836e59305fcd5f662bf19aAndreas Huber // the prefetcher to read its data. 845f03034408506051f2f836e59305fcd5f662bf19aAndreas Huber status_t err = mAudioPlayer->start( 846f03034408506051f2f836e59305fcd5f662bf19aAndreas Huber true /* sourceAlreadyStarted */); 847f03034408506051f2f836e59305fcd5f662bf19aAndreas Huber 848f03034408506051f2f836e59305fcd5f662bf19aAndreas Huber if (err != OK) { 849f03034408506051f2f836e59305fcd5f662bf19aAndreas Huber notifyListener_l(MEDIA_ERROR, MEDIA_ERROR_UNKNOWN, err); 850f03034408506051f2f836e59305fcd5f662bf19aAndreas Huber return err; 851f03034408506051f2f836e59305fcd5f662bf19aAndreas Huber } 852f03034408506051f2f836e59305fcd5f662bf19aAndreas Huber } else { 853f03034408506051f2f836e59305fcd5f662bf19aAndreas Huber mAudioPlayer->resume(); 854f03034408506051f2f836e59305fcd5f662bf19aAndreas Huber } 855f03034408506051f2f836e59305fcd5f662bf19aAndreas Huber 856f03034408506051f2f836e59305fcd5f662bf19aAndreas Huber mFlags |= AUDIO_RUNNING; 857f03034408506051f2f836e59305fcd5f662bf19aAndreas Huber 858f03034408506051f2f836e59305fcd5f662bf19aAndreas Huber mWatchForAudioEOS = true; 859f03034408506051f2f836e59305fcd5f662bf19aAndreas Huber 860f03034408506051f2f836e59305fcd5f662bf19aAndreas Huber return OK; 861f03034408506051f2f836e59305fcd5f662bf19aAndreas Huber} 862f03034408506051f2f836e59305fcd5f662bf19aAndreas Huber 8635daeb129a2c2ba3d14ccd94af283b5f561c783eaAndreas Hubervoid AwesomePlayer::notifyVideoSize_l() { 8645daeb129a2c2ba3d14ccd94af283b5f561c783eaAndreas Huber sp<MetaData> meta = mVideoSource->getFormat(); 8655daeb129a2c2ba3d14ccd94af283b5f561c783eaAndreas Huber 866f5ab57c2d5e02af7483c94eddb177e4f5c9e9892Andreas Huber int32_t cropLeft, cropTop, cropRight, cropBottom; 867f5ab57c2d5e02af7483c94eddb177e4f5c9e9892Andreas Huber if (!meta->findRect( 868f5ab57c2d5e02af7483c94eddb177e4f5c9e9892Andreas Huber kKeyCropRect, &cropLeft, &cropTop, &cropRight, &cropBottom)) { 869f5ab57c2d5e02af7483c94eddb177e4f5c9e9892Andreas Huber int32_t width, height; 870f5ab57c2d5e02af7483c94eddb177e4f5c9e9892Andreas Huber CHECK(meta->findInt32(kKeyWidth, &width)); 871f5ab57c2d5e02af7483c94eddb177e4f5c9e9892Andreas Huber CHECK(meta->findInt32(kKeyHeight, &height)); 872f5ab57c2d5e02af7483c94eddb177e4f5c9e9892Andreas Huber 873f5ab57c2d5e02af7483c94eddb177e4f5c9e9892Andreas Huber cropLeft = cropTop = 0; 874f5ab57c2d5e02af7483c94eddb177e4f5c9e9892Andreas Huber cropRight = width - 1; 875f5ab57c2d5e02af7483c94eddb177e4f5c9e9892Andreas Huber cropBottom = height - 1; 876f5ab57c2d5e02af7483c94eddb177e4f5c9e9892Andreas Huber 877f5ab57c2d5e02af7483c94eddb177e4f5c9e9892Andreas Huber LOGV("got dimensions only %d x %d", width, height); 878f5ab57c2d5e02af7483c94eddb177e4f5c9e9892Andreas Huber } else { 879f5ab57c2d5e02af7483c94eddb177e4f5c9e9892Andreas Huber LOGV("got crop rect %d, %d, %d, %d", 880f5ab57c2d5e02af7483c94eddb177e4f5c9e9892Andreas Huber cropLeft, cropTop, cropRight, cropBottom); 881f5ab57c2d5e02af7483c94eddb177e4f5c9e9892Andreas Huber } 882f5ab57c2d5e02af7483c94eddb177e4f5c9e9892Andreas Huber 8839cbb1a6f99003a9cd8765e11b9d7380e67839f82James Dong int32_t displayWidth; 8849cbb1a6f99003a9cd8765e11b9d7380e67839f82James Dong if (meta->findInt32(kKeyDisplayWidth, &displayWidth)) { 8859cbb1a6f99003a9cd8765e11b9d7380e67839f82James Dong LOGV("Display width changed (%d=>%d)", mDisplayWidth, displayWidth); 8869cbb1a6f99003a9cd8765e11b9d7380e67839f82James Dong mDisplayWidth = displayWidth; 8879cbb1a6f99003a9cd8765e11b9d7380e67839f82James Dong } 8889cbb1a6f99003a9cd8765e11b9d7380e67839f82James Dong int32_t displayHeight; 8899cbb1a6f99003a9cd8765e11b9d7380e67839f82James Dong if (meta->findInt32(kKeyDisplayHeight, &displayHeight)) { 8909cbb1a6f99003a9cd8765e11b9d7380e67839f82James Dong LOGV("Display height changed (%d=>%d)", mDisplayHeight, displayHeight); 8919cbb1a6f99003a9cd8765e11b9d7380e67839f82James Dong mDisplayHeight = displayHeight; 8929cbb1a6f99003a9cd8765e11b9d7380e67839f82James Dong } 8939cbb1a6f99003a9cd8765e11b9d7380e67839f82James Dong 894f5ab57c2d5e02af7483c94eddb177e4f5c9e9892Andreas Huber int32_t usableWidth = cropRight - cropLeft + 1; 895f5ab57c2d5e02af7483c94eddb177e4f5c9e9892Andreas Huber int32_t usableHeight = cropBottom - cropTop + 1; 896b45c01c2b8588ff431b511151666a55a39f0a6aeJames Dong if (mDisplayWidth != 0) { 897b45c01c2b8588ff431b511151666a55a39f0a6aeJames Dong usableWidth = mDisplayWidth; 898b45c01c2b8588ff431b511151666a55a39f0a6aeJames Dong } 899b45c01c2b8588ff431b511151666a55a39f0a6aeJames Dong if (mDisplayHeight != 0) { 900b45c01c2b8588ff431b511151666a55a39f0a6aeJames Dong usableHeight = mDisplayHeight; 901b45c01c2b8588ff431b511151666a55a39f0a6aeJames Dong } 9025daeb129a2c2ba3d14ccd94af283b5f561c783eaAndreas Huber 903ba529e486dde15fe75ea1b48570f9d60a4cf3c48Andreas Huber int32_t rotationDegrees; 904ba529e486dde15fe75ea1b48570f9d60a4cf3c48Andreas Huber if (!mVideoTrack->getFormat()->findInt32( 905ba529e486dde15fe75ea1b48570f9d60a4cf3c48Andreas Huber kKeyRotation, &rotationDegrees)) { 906ba529e486dde15fe75ea1b48570f9d60a4cf3c48Andreas Huber rotationDegrees = 0; 907ba529e486dde15fe75ea1b48570f9d60a4cf3c48Andreas Huber } 908ba529e486dde15fe75ea1b48570f9d60a4cf3c48Andreas Huber 909ba529e486dde15fe75ea1b48570f9d60a4cf3c48Andreas Huber if (rotationDegrees == 90 || rotationDegrees == 270) { 910ba529e486dde15fe75ea1b48570f9d60a4cf3c48Andreas Huber notifyListener_l( 911f5ab57c2d5e02af7483c94eddb177e4f5c9e9892Andreas Huber MEDIA_SET_VIDEO_SIZE, usableHeight, usableWidth); 912ba529e486dde15fe75ea1b48570f9d60a4cf3c48Andreas Huber } else { 913ba529e486dde15fe75ea1b48570f9d60a4cf3c48Andreas Huber notifyListener_l( 914f5ab57c2d5e02af7483c94eddb177e4f5c9e9892Andreas Huber MEDIA_SET_VIDEO_SIZE, usableWidth, usableHeight); 915ba529e486dde15fe75ea1b48570f9d60a4cf3c48Andreas Huber } 9165daeb129a2c2ba3d14ccd94af283b5f561c783eaAndreas Huber} 9175daeb129a2c2ba3d14ccd94af283b5f561c783eaAndreas Huber 918bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Hubervoid AwesomePlayer::initRenderer_l() { 9191173118eace0e9e347cb007f0da817cee87579edGlenn Kasten if (mNativeWindow == NULL) { 9200a5ca668c6f7d45706e9aec4a1dfec0aacc6d233Andreas Huber return; 9210a5ca668c6f7d45706e9aec4a1dfec0aacc6d233Andreas Huber } 922bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber 9230a5ca668c6f7d45706e9aec4a1dfec0aacc6d233Andreas Huber sp<MetaData> meta = mVideoSource->getFormat(); 924bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber 9250a5ca668c6f7d45706e9aec4a1dfec0aacc6d233Andreas Huber int32_t format; 9260a5ca668c6f7d45706e9aec4a1dfec0aacc6d233Andreas Huber const char *component; 9270a5ca668c6f7d45706e9aec4a1dfec0aacc6d233Andreas Huber int32_t decodedWidth, decodedHeight; 9280a5ca668c6f7d45706e9aec4a1dfec0aacc6d233Andreas Huber CHECK(meta->findInt32(kKeyColorFormat, &format)); 9290a5ca668c6f7d45706e9aec4a1dfec0aacc6d233Andreas Huber CHECK(meta->findCString(kKeyDecoderComponent, &component)); 9300a5ca668c6f7d45706e9aec4a1dfec0aacc6d233Andreas Huber CHECK(meta->findInt32(kKeyWidth, &decodedWidth)); 9310a5ca668c6f7d45706e9aec4a1dfec0aacc6d233Andreas Huber CHECK(meta->findInt32(kKeyHeight, &decodedHeight)); 9324844ac54e8b5997c3b03872dbafe8ebed4787517Andreas Huber 933ba529e486dde15fe75ea1b48570f9d60a4cf3c48Andreas Huber int32_t rotationDegrees; 934ba529e486dde15fe75ea1b48570f9d60a4cf3c48Andreas Huber if (!mVideoTrack->getFormat()->findInt32( 935ba529e486dde15fe75ea1b48570f9d60a4cf3c48Andreas Huber kKeyRotation, &rotationDegrees)) { 936ba529e486dde15fe75ea1b48570f9d60a4cf3c48Andreas Huber rotationDegrees = 0; 937ba529e486dde15fe75ea1b48570f9d60a4cf3c48Andreas Huber } 938ba529e486dde15fe75ea1b48570f9d60a4cf3c48Andreas Huber 9390a5ca668c6f7d45706e9aec4a1dfec0aacc6d233Andreas Huber mVideoRenderer.clear(); 9404844ac54e8b5997c3b03872dbafe8ebed4787517Andreas Huber 9410a5ca668c6f7d45706e9aec4a1dfec0aacc6d233Andreas Huber // Must ensure that mVideoRenderer's destructor is actually executed 9420a5ca668c6f7d45706e9aec4a1dfec0aacc6d233Andreas Huber // before creating a new one. 9430a5ca668c6f7d45706e9aec4a1dfec0aacc6d233Andreas Huber IPCThreadState::self()->flushCommands(); 9440a5ca668c6f7d45706e9aec4a1dfec0aacc6d233Andreas Huber 9450a5ca668c6f7d45706e9aec4a1dfec0aacc6d233Andreas Huber if (USE_SURFACE_ALLOC && strncmp(component, "OMX.", 4) == 0) { 9460a5ca668c6f7d45706e9aec4a1dfec0aacc6d233Andreas Huber // Hardware decoders avoid the CPU color conversion by decoding 9470a5ca668c6f7d45706e9aec4a1dfec0aacc6d233Andreas Huber // directly to ANativeBuffers, so we must use a renderer that 9480a5ca668c6f7d45706e9aec4a1dfec0aacc6d233Andreas Huber // just pushes those buffers to the ANativeWindow. 949ba529e486dde15fe75ea1b48570f9d60a4cf3c48Andreas Huber mVideoRenderer = 9501173118eace0e9e347cb007f0da817cee87579edGlenn Kasten new AwesomeNativeWindowRenderer(mNativeWindow, rotationDegrees); 9510a5ca668c6f7d45706e9aec4a1dfec0aacc6d233Andreas Huber } else { 9520a5ca668c6f7d45706e9aec4a1dfec0aacc6d233Andreas Huber // Other decoders are instantiated locally and as a consequence 9530a5ca668c6f7d45706e9aec4a1dfec0aacc6d233Andreas Huber // allocate their buffers in local address space. This renderer 9540a5ca668c6f7d45706e9aec4a1dfec0aacc6d233Andreas Huber // then performs a color conversion and copy to get the data 9550a5ca668c6f7d45706e9aec4a1dfec0aacc6d233Andreas Huber // into the ANativeBuffer. 9561173118eace0e9e347cb007f0da817cee87579edGlenn Kasten mVideoRenderer = new AwesomeLocalRenderer(mNativeWindow, meta); 957bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber } 958bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber} 959bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber 960bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huberstatus_t AwesomePlayer::pause() { 961bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber Mutex::Autolock autoLock(mLock); 9620a5baa9b411fe086013d2a5e9126ed63fbad046cAndreas Huber 9630a5baa9b411fe086013d2a5e9126ed63fbad046cAndreas Huber mFlags &= ~CACHE_UNDERRUN; 9640a5baa9b411fe086013d2a5e9126ed63fbad046cAndreas Huber 965bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber return pause_l(); 966bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber} 967bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber 968b2e3954c94717e43b3dc9b880564f166cfbbc0a2Andreas Huberstatus_t AwesomePlayer::pause_l(bool at_eos) { 969bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber if (!(mFlags & PLAYING)) { 970bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber return OK; 971bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber } 972bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber 97366b0a35c9a4136a84c3f73b1b25fcb5220138b95Andreas Huber cancelPlayerEvents(true /* keepBufferingGoing */); 974bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber 975f03034408506051f2f836e59305fcd5f662bf19aAndreas Huber if (mAudioPlayer != NULL && (mFlags & AUDIO_RUNNING)) { 976b2e3954c94717e43b3dc9b880564f166cfbbc0a2Andreas Huber if (at_eos) { 977b2e3954c94717e43b3dc9b880564f166cfbbc0a2Andreas Huber // If we played the audio stream to completion we 978b2e3954c94717e43b3dc9b880564f166cfbbc0a2Andreas Huber // want to make sure that all samples remaining in the audio 979b2e3954c94717e43b3dc9b880564f166cfbbc0a2Andreas Huber // track's queue are played out. 980b2e3954c94717e43b3dc9b880564f166cfbbc0a2Andreas Huber mAudioPlayer->pause(true /* playPendingSamples */); 981b2e3954c94717e43b3dc9b880564f166cfbbc0a2Andreas Huber } else { 982b2e3954c94717e43b3dc9b880564f166cfbbc0a2Andreas Huber mAudioPlayer->pause(); 983b2e3954c94717e43b3dc9b880564f166cfbbc0a2Andreas Huber } 984f03034408506051f2f836e59305fcd5f662bf19aAndreas Huber 985f03034408506051f2f836e59305fcd5f662bf19aAndreas Huber mFlags &= ~AUDIO_RUNNING; 986bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber } 987bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber 988bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber mFlags &= ~PLAYING; 989bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber 990dcd25efb46c41c8d24a0a9cf61fb57f84149709eGloria Wang if (mDecryptHandle != NULL) { 991dcd25efb46c41c8d24a0a9cf61fb57f84149709eGloria Wang mDrmManagerClient->setPlaybackStatus(mDecryptHandle, 992dcd25efb46c41c8d24a0a9cf61fb57f84149709eGloria Wang Playback::PAUSE, 0); 993dcd25efb46c41c8d24a0a9cf61fb57f84149709eGloria Wang } 994dcd25efb46c41c8d24a0a9cf61fb57f84149709eGloria Wang 9957cf180c9bff69e5cc4a2f4e53b432db45ebbebabGloria Wang uint32_t params = IMediaPlayerService::kBatteryDataTrackDecoder; 9967cf180c9bff69e5cc4a2f4e53b432db45ebbebabGloria Wang if ((mAudioSource != NULL) && (mAudioSource != mAudioTrack)) { 9977cf180c9bff69e5cc4a2f4e53b432db45ebbebabGloria Wang params |= IMediaPlayerService::kBatteryDataTrackAudio; 9987cf180c9bff69e5cc4a2f4e53b432db45ebbebabGloria Wang } 9997cf180c9bff69e5cc4a2f4e53b432db45ebbebabGloria Wang if (mVideoSource != NULL) { 10007cf180c9bff69e5cc4a2f4e53b432db45ebbebabGloria Wang params |= IMediaPlayerService::kBatteryDataTrackVideo; 10017cf180c9bff69e5cc4a2f4e53b432db45ebbebabGloria Wang } 10027cf180c9bff69e5cc4a2f4e53b432db45ebbebabGloria Wang 10037cf180c9bff69e5cc4a2f4e53b432db45ebbebabGloria Wang addBatteryData(params); 10047cf180c9bff69e5cc4a2f4e53b432db45ebbebabGloria Wang 1005bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber return OK; 1006bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber} 1007bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber 1008bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huberbool AwesomePlayer::isPlaying() const { 10090a5baa9b411fe086013d2a5e9126ed63fbad046cAndreas Huber return (mFlags & PLAYING) || (mFlags & CACHE_UNDERRUN); 1010bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber} 1011bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber 10125daeb129a2c2ba3d14ccd94af283b5f561c783eaAndreas Hubervoid AwesomePlayer::setSurface(const sp<Surface> &surface) { 10135daeb129a2c2ba3d14ccd94af283b5f561c783eaAndreas Huber Mutex::Autolock autoLock(mLock); 10145daeb129a2c2ba3d14ccd94af283b5f561c783eaAndreas Huber 10155daeb129a2c2ba3d14ccd94af283b5f561c783eaAndreas Huber mSurface = surface; 10161173118eace0e9e347cb007f0da817cee87579edGlenn Kasten mNativeWindow = surface; 10171173118eace0e9e347cb007f0da817cee87579edGlenn Kasten} 10181173118eace0e9e347cb007f0da817cee87579edGlenn Kasten 10191173118eace0e9e347cb007f0da817cee87579edGlenn Kastenvoid AwesomePlayer::setSurfaceTexture(const sp<ISurfaceTexture> &surfaceTexture) { 10201173118eace0e9e347cb007f0da817cee87579edGlenn Kasten Mutex::Autolock autoLock(mLock); 10211173118eace0e9e347cb007f0da817cee87579edGlenn Kasten 10221173118eace0e9e347cb007f0da817cee87579edGlenn Kasten mSurface.clear(); 10231173118eace0e9e347cb007f0da817cee87579edGlenn Kasten if (surfaceTexture != NULL) { 10241173118eace0e9e347cb007f0da817cee87579edGlenn Kasten mNativeWindow = new SurfaceTextureClient(surfaceTexture); 10251173118eace0e9e347cb007f0da817cee87579edGlenn Kasten } 10261173118eace0e9e347cb007f0da817cee87579edGlenn Kasten 10275daeb129a2c2ba3d14ccd94af283b5f561c783eaAndreas Huber} 10285daeb129a2c2ba3d14ccd94af283b5f561c783eaAndreas Huber 1029bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Hubervoid AwesomePlayer::setAudioSink( 1030bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber const sp<MediaPlayerBase::AudioSink> &audioSink) { 1031bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber Mutex::Autolock autoLock(mLock); 1032bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber 1033bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber mAudioSink = audioSink; 1034bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber} 1035bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber 1036bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huberstatus_t AwesomePlayer::setLooping(bool shouldLoop) { 1037bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber Mutex::Autolock autoLock(mLock); 1038bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber 1039bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber mFlags = mFlags & ~LOOPING; 1040bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber 1041bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber if (shouldLoop) { 1042bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber mFlags |= LOOPING; 1043bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber } 1044bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber 1045bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber return OK; 1046bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber} 1047bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber 1048bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huberstatus_t AwesomePlayer::getDuration(int64_t *durationUs) { 10492415ecb5bb4e1459024f6d6c8ae2d6e3dc4fbdc7Andreas Huber Mutex::Autolock autoLock(mMiscStateLock); 1050bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber 1051bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber if (mDurationUs < 0) { 1052bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber return UNKNOWN_ERROR; 1053bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber } 1054bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber 1055bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber *durationUs = mDurationUs; 1056bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber 1057bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber return OK; 1058bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber} 1059bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber 1060bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huberstatus_t AwesomePlayer::getPosition(int64_t *positionUs) { 10618d342970108926c4ea355c90d26a2a353ec0fd47Andreas Huber if (mRTSPController != NULL) { 10628d342970108926c4ea355c90d26a2a353ec0fd47Andreas Huber *positionUs = mRTSPController->getNormalPlayTimeUs(); 10638d342970108926c4ea355c90d26a2a353ec0fd47Andreas Huber } 106464bb6983690bf994d904591145a3cdd6373bdbe6Andreas Huber else if (mSeeking != NO_SEEK) { 1065dac4ee72bac87388a1495e098f39d73168c8078fAndreas Huber *positionUs = mSeekTimeUs; 10665dac87b088556b8ed7f2a4f5546d31be0bb68680Andreas Huber } else if (mVideoSource != NULL 10675dac87b088556b8ed7f2a4f5546d31be0bb68680Andreas Huber && (mAudioPlayer == NULL || !(mFlags & VIDEO_AT_EOS))) { 10682415ecb5bb4e1459024f6d6c8ae2d6e3dc4fbdc7Andreas Huber Mutex::Autolock autoLock(mMiscStateLock); 1069bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber *positionUs = mVideoTimeUs; 1070bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber } else if (mAudioPlayer != NULL) { 1071bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber *positionUs = mAudioPlayer->getMediaTimeUs(); 1072bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber } else { 1073bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber *positionUs = 0; 1074bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber } 1075bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber 1076bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber return OK; 1077bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber} 1078bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber 1079bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huberstatus_t AwesomePlayer::seekTo(int64_t timeUs) { 108070f521de2675ce6eedf4b22beed94ea1289b0f38Andreas Huber if (mExtractorFlags & MediaExtractor::CAN_SEEK) { 1081acdd9d0f59c3d8bdc3de80664a609527ec3d21e2Andreas Huber Mutex::Autolock autoLock(mLock); 1082acdd9d0f59c3d8bdc3de80664a609527ec3d21e2Andreas Huber return seekTo_l(timeUs); 1083acdd9d0f59c3d8bdc3de80664a609527ec3d21e2Andreas Huber } 1084acdd9d0f59c3d8bdc3de80664a609527ec3d21e2Andreas Huber 1085acdd9d0f59c3d8bdc3de80664a609527ec3d21e2Andreas Huber return OK; 1086bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber} 1087bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber 10880dcd837af4169bdb6fb2a0c384722dc4f57433c6Andreas Huber// static 10890dcd837af4169bdb6fb2a0c384722dc4f57433c6Andreas Hubervoid AwesomePlayer::OnRTSPSeekDoneWrapper(void *cookie) { 10900dcd837af4169bdb6fb2a0c384722dc4f57433c6Andreas Huber static_cast<AwesomePlayer *>(cookie)->onRTSPSeekDone(); 10910dcd837af4169bdb6fb2a0c384722dc4f57433c6Andreas Huber} 10920dcd837af4169bdb6fb2a0c384722dc4f57433c6Andreas Huber 10930dcd837af4169bdb6fb2a0c384722dc4f57433c6Andreas Hubervoid AwesomePlayer::onRTSPSeekDone() { 10940dcd837af4169bdb6fb2a0c384722dc4f57433c6Andreas Huber notifyListener_l(MEDIA_SEEK_COMPLETE); 10950dcd837af4169bdb6fb2a0c384722dc4f57433c6Andreas Huber mSeekNotificationSent = true; 10960dcd837af4169bdb6fb2a0c384722dc4f57433c6Andreas Huber} 10970dcd837af4169bdb6fb2a0c384722dc4f57433c6Andreas Huber 1098bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huberstatus_t AwesomePlayer::seekTo_l(int64_t timeUs) { 1099cce326fe43411855aca2f719e505b051bc4b61b3Andreas Huber if (mRTSPController != NULL) { 11000dcd837af4169bdb6fb2a0c384722dc4f57433c6Andreas Huber mRTSPController->seekAsync(timeUs, OnRTSPSeekDoneWrapper, this); 1101cce326fe43411855aca2f719e505b051bc4b61b3Andreas Huber return OK; 1102cce326fe43411855aca2f719e505b051bc4b61b3Andreas Huber } 1103cce326fe43411855aca2f719e505b051bc4b61b3Andreas Huber 11040a5baa9b411fe086013d2a5e9126ed63fbad046cAndreas Huber if (mFlags & CACHE_UNDERRUN) { 11050a5baa9b411fe086013d2a5e9126ed63fbad046cAndreas Huber mFlags &= ~CACHE_UNDERRUN; 11060a5baa9b411fe086013d2a5e9126ed63fbad046cAndreas Huber play_l(); 11070a5baa9b411fe086013d2a5e9126ed63fbad046cAndreas Huber } 11080a5baa9b411fe086013d2a5e9126ed63fbad046cAndreas Huber 11095dac87b088556b8ed7f2a4f5546d31be0bb68680Andreas Huber if ((mFlags & PLAYING) && mVideoSource != NULL && (mFlags & VIDEO_AT_EOS)) { 11105dac87b088556b8ed7f2a4f5546d31be0bb68680Andreas Huber // Video playback completed before, there's no pending 11115dac87b088556b8ed7f2a4f5546d31be0bb68680Andreas Huber // video event right now. In order for this new seek 11125dac87b088556b8ed7f2a4f5546d31be0bb68680Andreas Huber // to be honored, we need to post one. 11135dac87b088556b8ed7f2a4f5546d31be0bb68680Andreas Huber 11145dac87b088556b8ed7f2a4f5546d31be0bb68680Andreas Huber postVideoEvent_l(); 11155dac87b088556b8ed7f2a4f5546d31be0bb68680Andreas Huber } 11165dac87b088556b8ed7f2a4f5546d31be0bb68680Andreas Huber 111764bb6983690bf994d904591145a3cdd6373bdbe6Andreas Huber mSeeking = SEEK; 11181321fdd94d354431b930735e9f38f32ecd189a2dAndreas Huber mSeekNotificationSent = false; 1119bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber mSeekTimeUs = timeUs; 11205d2de4da54504836e4b772b3010ac28c19f667f0Andreas Huber mFlags &= ~(AT_EOS | AUDIO_AT_EOS | VIDEO_AT_EOS); 1121bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber 1122bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber seekAudioIfNecessary_l(); 1123bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber 11241321fdd94d354431b930735e9f38f32ecd189a2dAndreas Huber if (!(mFlags & PLAYING)) { 11251321fdd94d354431b930735e9f38f32ecd189a2dAndreas Huber LOGV("seeking while paused, sending SEEK_COMPLETE notification" 11261321fdd94d354431b930735e9f38f32ecd189a2dAndreas Huber " immediately."); 11271321fdd94d354431b930735e9f38f32ecd189a2dAndreas Huber 11281321fdd94d354431b930735e9f38f32ecd189a2dAndreas Huber notifyListener_l(MEDIA_SEEK_COMPLETE); 11291321fdd94d354431b930735e9f38f32ecd189a2dAndreas Huber mSeekNotificationSent = true; 11302b1222f8938356669672f35e0e53e176c78c40efAndreas Huber 11312b1222f8938356669672f35e0e53e176c78c40efAndreas Huber if ((mFlags & PREPARED) && mVideoSource != NULL) { 11322b1222f8938356669672f35e0e53e176c78c40efAndreas Huber mFlags |= SEEK_PREVIEW; 11332b1222f8938356669672f35e0e53e176c78c40efAndreas Huber postVideoEvent_l(); 11342b1222f8938356669672f35e0e53e176c78c40efAndreas Huber } 11351321fdd94d354431b930735e9f38f32ecd189a2dAndreas Huber } 11361321fdd94d354431b930735e9f38f32ecd189a2dAndreas Huber 1137bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber return OK; 1138bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber} 1139bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber 1140bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Hubervoid AwesomePlayer::seekAudioIfNecessary_l() { 114164bb6983690bf994d904591145a3cdd6373bdbe6Andreas Huber if (mSeeking != NO_SEEK && mVideoSource == NULL && mAudioPlayer != NULL) { 1142bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber mAudioPlayer->seekTo(mSeekTimeUs); 1143bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber 11441862a33b246249630b654182afb5914da3480d4cAndreas Huber mWatchForAudioSeekComplete = true; 11451862a33b246249630b654182afb5914da3480d4cAndreas Huber mWatchForAudioEOS = true; 1146dcd25efb46c41c8d24a0a9cf61fb57f84149709eGloria Wang 1147dcd25efb46c41c8d24a0a9cf61fb57f84149709eGloria Wang if (mDecryptHandle != NULL) { 1148dcd25efb46c41c8d24a0a9cf61fb57f84149709eGloria Wang mDrmManagerClient->setPlaybackStatus(mDecryptHandle, 1149dcd25efb46c41c8d24a0a9cf61fb57f84149709eGloria Wang Playback::PAUSE, 0); 1150dcd25efb46c41c8d24a0a9cf61fb57f84149709eGloria Wang mDrmManagerClient->setPlaybackStatus(mDecryptHandle, 1151dcd25efb46c41c8d24a0a9cf61fb57f84149709eGloria Wang Playback::START, mSeekTimeUs / 1000); 1152dcd25efb46c41c8d24a0a9cf61fb57f84149709eGloria Wang } 1153bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber } 1154bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber} 1155bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber 115688d8a83de12592635248aa1a3bd6b9ea46108501Andreas Hubervoid AwesomePlayer::setAudioSource(sp<MediaSource> source) { 115788d8a83de12592635248aa1a3bd6b9ea46108501Andreas Huber CHECK(source != NULL); 1158bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber 115988d8a83de12592635248aa1a3bd6b9ea46108501Andreas Huber mAudioTrack = source; 116088d8a83de12592635248aa1a3bd6b9ea46108501Andreas Huber} 116188d8a83de12592635248aa1a3bd6b9ea46108501Andreas Huber 116288d8a83de12592635248aa1a3bd6b9ea46108501Andreas Huberstatus_t AwesomePlayer::initAudioDecoder() { 116388d8a83de12592635248aa1a3bd6b9ea46108501Andreas Huber sp<MetaData> meta = mAudioTrack->getFormat(); 1164717826ececd8d39596f62418677721d70776add1Andreas Huber 1165717826ececd8d39596f62418677721d70776add1Andreas Huber const char *mime; 1166717826ececd8d39596f62418677721d70776add1Andreas Huber CHECK(meta->findCString(kKeyMIMEType, &mime)); 1167717826ececd8d39596f62418677721d70776add1Andreas Huber 1168717826ececd8d39596f62418677721d70776add1Andreas Huber if (!strcasecmp(mime, MEDIA_MIMETYPE_AUDIO_RAW)) { 116988d8a83de12592635248aa1a3bd6b9ea46108501Andreas Huber mAudioSource = mAudioTrack; 1170717826ececd8d39596f62418677721d70776add1Andreas Huber } else { 1171717826ececd8d39596f62418677721d70776add1Andreas Huber mAudioSource = OMXCodec::Create( 117288d8a83de12592635248aa1a3bd6b9ea46108501Andreas Huber mClient.interface(), mAudioTrack->getFormat(), 1173717826ececd8d39596f62418677721d70776add1Andreas Huber false, // createEncoder 117488d8a83de12592635248aa1a3bd6b9ea46108501Andreas Huber mAudioTrack); 1175717826ececd8d39596f62418677721d70776add1Andreas Huber } 1176bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber 1177bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber if (mAudioSource != NULL) { 1178bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber int64_t durationUs; 117988d8a83de12592635248aa1a3bd6b9ea46108501Andreas Huber if (mAudioTrack->getFormat()->findInt64(kKeyDuration, &durationUs)) { 11802415ecb5bb4e1459024f6d6c8ae2d6e3dc4fbdc7Andreas Huber Mutex::Autolock autoLock(mMiscStateLock); 1181bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber if (mDurationUs < 0 || durationUs > mDurationUs) { 1182bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber mDurationUs = durationUs; 1183bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber } 1184bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber } 1185bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber 1186a945bfd91aa291fba4d9201ffcb38fce40eab7feAndreas Huber status_t err = mAudioSource->start(); 1187a945bfd91aa291fba4d9201ffcb38fce40eab7feAndreas Huber 1188a945bfd91aa291fba4d9201ffcb38fce40eab7feAndreas Huber if (err != OK) { 1189a945bfd91aa291fba4d9201ffcb38fce40eab7feAndreas Huber mAudioSource.clear(); 1190a945bfd91aa291fba4d9201ffcb38fce40eab7feAndreas Huber return err; 1191a945bfd91aa291fba4d9201ffcb38fce40eab7feAndreas Huber } 119281f82c32459029bf0744e28c73f95a7f18cab5acAndreas Huber } else if (!strcasecmp(mime, MEDIA_MIMETYPE_AUDIO_QCELP)) { 119381f82c32459029bf0744e28c73f95a7f18cab5acAndreas Huber // For legacy reasons we're simply going to ignore the absence 119481f82c32459029bf0744e28c73f95a7f18cab5acAndreas Huber // of an audio decoder for QCELP instead of aborting playback 119581f82c32459029bf0744e28c73f95a7f18cab5acAndreas Huber // altogether. 119681f82c32459029bf0744e28c73f95a7f18cab5acAndreas Huber return OK; 119781f82c32459029bf0744e28c73f95a7f18cab5acAndreas Huber } 1198e7e3b785a0e7819db4c895a4f60e9a4dd755880cAndreas Huber 1199bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber return mAudioSource != NULL ? OK : UNKNOWN_ERROR; 1200bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber} 1201bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber 120288d8a83de12592635248aa1a3bd6b9ea46108501Andreas Hubervoid AwesomePlayer::setVideoSource(sp<MediaSource> source) { 120388d8a83de12592635248aa1a3bd6b9ea46108501Andreas Huber CHECK(source != NULL); 1204bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber 120588d8a83de12592635248aa1a3bd6b9ea46108501Andreas Huber mVideoTrack = source; 120688d8a83de12592635248aa1a3bd6b9ea46108501Andreas Huber} 120788d8a83de12592635248aa1a3bd6b9ea46108501Andreas Huber 12082a4d22d79e927f2245537921e10fc5fda1c47a29Andreas Huberstatus_t AwesomePlayer::initVideoDecoder(uint32_t flags) { 12092eb62955eb84b97695e8a7e56e14310cbb86412bGlenn Kasten 12102eb62955eb84b97695e8a7e56e14310cbb86412bGlenn Kasten // Either the application or the DRM system can independently say 12112eb62955eb84b97695e8a7e56e14310cbb86412bGlenn Kasten // that there must be a hardware-protected path to an external video sink. 12122eb62955eb84b97695e8a7e56e14310cbb86412bGlenn Kasten // For now we always require a hardware-protected path to external video sink 12132eb62955eb84b97695e8a7e56e14310cbb86412bGlenn Kasten // if content is DRMed, but eventually this could be optional per DRM agent. 12142eb62955eb84b97695e8a7e56e14310cbb86412bGlenn Kasten // When the application wants protection, then 12152eb62955eb84b97695e8a7e56e14310cbb86412bGlenn Kasten // (USE_SURFACE_ALLOC && (mSurface != 0) && 12162eb62955eb84b97695e8a7e56e14310cbb86412bGlenn Kasten // (mSurface->getFlags() & ISurfaceComposer::eProtectedByApp)) 12172eb62955eb84b97695e8a7e56e14310cbb86412bGlenn Kasten // will be true, but that part is already handled by SurfaceFlinger. 1218eabd34665adc284525fe7337ad5c56a8b92964efGlenn Kasten 1219eabd34665adc284525fe7337ad5c56a8b92964efGlenn Kasten#ifdef DEBUG_HDCP 1220eabd34665adc284525fe7337ad5c56a8b92964efGlenn Kasten // For debugging, we allow a system property to control the protected usage. 1221eabd34665adc284525fe7337ad5c56a8b92964efGlenn Kasten // In case of uninitialized or unexpected property, we default to "DRM only". 1222eabd34665adc284525fe7337ad5c56a8b92964efGlenn Kasten bool setProtectionBit = false; 1223eabd34665adc284525fe7337ad5c56a8b92964efGlenn Kasten char value[PROPERTY_VALUE_MAX]; 1224eabd34665adc284525fe7337ad5c56a8b92964efGlenn Kasten if (property_get("persist.sys.hdcp_checking", value, NULL)) { 1225eabd34665adc284525fe7337ad5c56a8b92964efGlenn Kasten if (!strcmp(value, "never")) { 1226eabd34665adc284525fe7337ad5c56a8b92964efGlenn Kasten // nop 1227eabd34665adc284525fe7337ad5c56a8b92964efGlenn Kasten } else if (!strcmp(value, "always")) { 1228eabd34665adc284525fe7337ad5c56a8b92964efGlenn Kasten setProtectionBit = true; 1229eabd34665adc284525fe7337ad5c56a8b92964efGlenn Kasten } else if (!strcmp(value, "drm-only")) { 1230eabd34665adc284525fe7337ad5c56a8b92964efGlenn Kasten if (mDecryptHandle != NULL) { 1231eabd34665adc284525fe7337ad5c56a8b92964efGlenn Kasten setProtectionBit = true; 1232eabd34665adc284525fe7337ad5c56a8b92964efGlenn Kasten } 1233eabd34665adc284525fe7337ad5c56a8b92964efGlenn Kasten // property value is empty, or unexpected value 1234eabd34665adc284525fe7337ad5c56a8b92964efGlenn Kasten } else { 1235eabd34665adc284525fe7337ad5c56a8b92964efGlenn Kasten if (mDecryptHandle != NULL) { 1236eabd34665adc284525fe7337ad5c56a8b92964efGlenn Kasten setProtectionBit = true; 1237eabd34665adc284525fe7337ad5c56a8b92964efGlenn Kasten } 1238eabd34665adc284525fe7337ad5c56a8b92964efGlenn Kasten } 1239eabd34665adc284525fe7337ad5c56a8b92964efGlenn Kasten // can' read property value 1240eabd34665adc284525fe7337ad5c56a8b92964efGlenn Kasten } else { 1241eabd34665adc284525fe7337ad5c56a8b92964efGlenn Kasten if (mDecryptHandle != NULL) { 1242eabd34665adc284525fe7337ad5c56a8b92964efGlenn Kasten setProtectionBit = true; 1243eabd34665adc284525fe7337ad5c56a8b92964efGlenn Kasten } 1244eabd34665adc284525fe7337ad5c56a8b92964efGlenn Kasten } 1245eabd34665adc284525fe7337ad5c56a8b92964efGlenn Kasten // note that usage bit is already cleared, so no need to clear it in the "else" case 1246eabd34665adc284525fe7337ad5c56a8b92964efGlenn Kasten if (setProtectionBit) { 1247eabd34665adc284525fe7337ad5c56a8b92964efGlenn Kasten flags |= OMXCodec::kEnableGrallocUsageProtected; 1248eabd34665adc284525fe7337ad5c56a8b92964efGlenn Kasten } 1249eabd34665adc284525fe7337ad5c56a8b92964efGlenn Kasten#else 12502eb62955eb84b97695e8a7e56e14310cbb86412bGlenn Kasten if (mDecryptHandle != NULL) { 12512eb62955eb84b97695e8a7e56e14310cbb86412bGlenn Kasten flags |= OMXCodec::kEnableGrallocUsageProtected; 12522eb62955eb84b97695e8a7e56e14310cbb86412bGlenn Kasten } 1253eabd34665adc284525fe7337ad5c56a8b92964efGlenn Kasten#endif 12542eb62955eb84b97695e8a7e56e14310cbb86412bGlenn Kasten LOGV("initVideoDecoder flags=0x%x", flags); 1255bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber mVideoSource = OMXCodec::Create( 125688d8a83de12592635248aa1a3bd6b9ea46108501Andreas Huber mClient.interface(), mVideoTrack->getFormat(), 1257bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber false, // createEncoder 125839ddf8e0f18766f7ba1e3246b774aa6ebd93eea8Andreas Huber mVideoTrack, 12591173118eace0e9e347cb007f0da817cee87579edGlenn Kasten NULL, flags, USE_SURFACE_ALLOC ? mNativeWindow : NULL); 1260bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber 1261bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber if (mVideoSource != NULL) { 1262bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber int64_t durationUs; 126388d8a83de12592635248aa1a3bd6b9ea46108501Andreas Huber if (mVideoTrack->getFormat()->findInt64(kKeyDuration, &durationUs)) { 12642415ecb5bb4e1459024f6d6c8ae2d6e3dc4fbdc7Andreas Huber Mutex::Autolock autoLock(mMiscStateLock); 1265bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber if (mDurationUs < 0 || durationUs > mDurationUs) { 1266bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber mDurationUs = durationUs; 1267bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber } 1268bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber } 1269bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber 1270139a5d5bd33c9fc7708d0a79f11ee928f7796e6bAndreas Huber status_t err = mVideoSource->start(); 1271139a5d5bd33c9fc7708d0a79f11ee928f7796e6bAndreas Huber 1272139a5d5bd33c9fc7708d0a79f11ee928f7796e6bAndreas Huber if (err != OK) { 1273139a5d5bd33c9fc7708d0a79f11ee928f7796e6bAndreas Huber mVideoSource.clear(); 1274139a5d5bd33c9fc7708d0a79f11ee928f7796e6bAndreas Huber return err; 1275139a5d5bd33c9fc7708d0a79f11ee928f7796e6bAndreas Huber } 1276bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber } 1277bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber 1278bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber return mVideoSource != NULL ? OK : UNKNOWN_ERROR; 1279bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber} 1280bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber 12814769cc92740e3ab58e9263d42553c12bbf79e3beAndreas Hubervoid AwesomePlayer::finishSeekIfNecessary(int64_t videoTimeUs) { 128264bb6983690bf994d904591145a3cdd6373bdbe6Andreas Huber if (mSeeking == SEEK_VIDEO_ONLY) { 128364bb6983690bf994d904591145a3cdd6373bdbe6Andreas Huber mSeeking = NO_SEEK; 128464bb6983690bf994d904591145a3cdd6373bdbe6Andreas Huber return; 128564bb6983690bf994d904591145a3cdd6373bdbe6Andreas Huber } 128664bb6983690bf994d904591145a3cdd6373bdbe6Andreas Huber 128764bb6983690bf994d904591145a3cdd6373bdbe6Andreas Huber if (mSeeking == NO_SEEK || (mFlags & SEEK_PREVIEW)) { 12884769cc92740e3ab58e9263d42553c12bbf79e3beAndreas Huber return; 12894769cc92740e3ab58e9263d42553c12bbf79e3beAndreas Huber } 12904769cc92740e3ab58e9263d42553c12bbf79e3beAndreas Huber 12914769cc92740e3ab58e9263d42553c12bbf79e3beAndreas Huber if (mAudioPlayer != NULL) { 1292f83dd80384f70da1f6d36d60e831439ff7739ad7Jamie Gennis LOGV("seeking audio to %lld us (%.2f secs).", videoTimeUs, videoTimeUs / 1E6); 12934769cc92740e3ab58e9263d42553c12bbf79e3beAndreas Huber 12944769cc92740e3ab58e9263d42553c12bbf79e3beAndreas Huber // If we don't have a video time, seek audio to the originally 12954769cc92740e3ab58e9263d42553c12bbf79e3beAndreas Huber // requested seek time instead. 12964769cc92740e3ab58e9263d42553c12bbf79e3beAndreas Huber 12974769cc92740e3ab58e9263d42553c12bbf79e3beAndreas Huber mAudioPlayer->seekTo(videoTimeUs < 0 ? mSeekTimeUs : videoTimeUs); 12984769cc92740e3ab58e9263d42553c12bbf79e3beAndreas Huber mWatchForAudioSeekComplete = true; 12995dac87b088556b8ed7f2a4f5546d31be0bb68680Andreas Huber mWatchForAudioEOS = true; 13004769cc92740e3ab58e9263d42553c12bbf79e3beAndreas Huber } else if (!mSeekNotificationSent) { 13014769cc92740e3ab58e9263d42553c12bbf79e3beAndreas Huber // If we're playing video only, report seek complete now, 13024769cc92740e3ab58e9263d42553c12bbf79e3beAndreas Huber // otherwise audio player will notify us later. 13034769cc92740e3ab58e9263d42553c12bbf79e3beAndreas Huber notifyListener_l(MEDIA_SEEK_COMPLETE); 1304512895089f2035bc86d3f502255199809aca721bAndreas Huber mSeekNotificationSent = true; 13054769cc92740e3ab58e9263d42553c12bbf79e3beAndreas Huber } 13064769cc92740e3ab58e9263d42553c12bbf79e3beAndreas Huber 13074769cc92740e3ab58e9263d42553c12bbf79e3beAndreas Huber mFlags |= FIRST_FRAME; 130864bb6983690bf994d904591145a3cdd6373bdbe6Andreas Huber mSeeking = NO_SEEK; 1309a89082944308805b0def7de87c67e370e74b8789Gloria Wang 1310a89082944308805b0def7de87c67e370e74b8789Gloria Wang if (mDecryptHandle != NULL) { 1311a89082944308805b0def7de87c67e370e74b8789Gloria Wang mDrmManagerClient->setPlaybackStatus(mDecryptHandle, 1312a89082944308805b0def7de87c67e370e74b8789Gloria Wang Playback::PAUSE, 0); 1313a89082944308805b0def7de87c67e370e74b8789Gloria Wang mDrmManagerClient->setPlaybackStatus(mDecryptHandle, 1314a89082944308805b0def7de87c67e370e74b8789Gloria Wang Playback::START, videoTimeUs / 1000); 1315a89082944308805b0def7de87c67e370e74b8789Gloria Wang } 13164769cc92740e3ab58e9263d42553c12bbf79e3beAndreas Huber} 13174769cc92740e3ab58e9263d42553c12bbf79e3beAndreas Huber 1318c23f12af0394aa2f6651968a3c8840f1af317aa1Andreas Hubervoid AwesomePlayer::onVideoEvent() { 1319bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber Mutex::Autolock autoLock(mLock); 13207b3396acc702451be9bafb19d7fe26d55d43a316Andreas Huber if (!mVideoEventPending) { 13217b3396acc702451be9bafb19d7fe26d55d43a316Andreas Huber // The event has been cancelled in reset_l() but had already 13227b3396acc702451be9bafb19d7fe26d55d43a316Andreas Huber // been scheduled for execution at that time. 13237b3396acc702451be9bafb19d7fe26d55d43a316Andreas Huber return; 13247b3396acc702451be9bafb19d7fe26d55d43a316Andreas Huber } 1325bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber mVideoEventPending = false; 1326bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber 132764bb6983690bf994d904591145a3cdd6373bdbe6Andreas Huber if (mSeeking != NO_SEEK) { 1328bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber if (mVideoBuffer) { 1329bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber mVideoBuffer->release(); 1330bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber mVideoBuffer = NULL; 1331bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber } 13320a5baa9b411fe086013d2a5e9126ed63fbad046cAndreas Huber 133364bb6983690bf994d904591145a3cdd6373bdbe6Andreas Huber if (mSeeking == SEEK && mCachedSource != NULL && mAudioSource != NULL 13342b1222f8938356669672f35e0e53e176c78c40efAndreas Huber && !(mFlags & SEEK_PREVIEW)) { 13350a5baa9b411fe086013d2a5e9126ed63fbad046cAndreas Huber // We're going to seek the video source first, followed by 13360a5baa9b411fe086013d2a5e9126ed63fbad046cAndreas Huber // the audio source. 13370a5baa9b411fe086013d2a5e9126ed63fbad046cAndreas Huber // In order to avoid jumps in the DataSource offset caused by 13380a5baa9b411fe086013d2a5e9126ed63fbad046cAndreas Huber // the audio codec prefetching data from the old locations 13390a5baa9b411fe086013d2a5e9126ed63fbad046cAndreas Huber // while the video codec is already reading data from the new 13400a5baa9b411fe086013d2a5e9126ed63fbad046cAndreas Huber // locations, we'll "pause" the audio source, causing it to 13410a5baa9b411fe086013d2a5e9126ed63fbad046cAndreas Huber // stop reading input data until a subsequent seek. 13420a5baa9b411fe086013d2a5e9126ed63fbad046cAndreas Huber 1343f03034408506051f2f836e59305fcd5f662bf19aAndreas Huber if (mAudioPlayer != NULL && (mFlags & AUDIO_RUNNING)) { 13440a5baa9b411fe086013d2a5e9126ed63fbad046cAndreas Huber mAudioPlayer->pause(); 1345f03034408506051f2f836e59305fcd5f662bf19aAndreas Huber 1346f03034408506051f2f836e59305fcd5f662bf19aAndreas Huber mFlags &= ~AUDIO_RUNNING; 13470a5baa9b411fe086013d2a5e9126ed63fbad046cAndreas Huber } 13480a5baa9b411fe086013d2a5e9126ed63fbad046cAndreas Huber mAudioSource->pause(); 13490a5baa9b411fe086013d2a5e9126ed63fbad046cAndreas Huber } 1350bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber } 1351bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber 1352bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber if (!mVideoBuffer) { 1353bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber MediaSource::ReadOptions options; 135464bb6983690bf994d904591145a3cdd6373bdbe6Andreas Huber if (mSeeking != NO_SEEK) { 1355bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber LOGV("seeking to %lld us (%.2f secs)", mSeekTimeUs, mSeekTimeUs / 1E6); 1356bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber 1357abd1f4f870925d6776dbe4b930b759a1ab6595caAndreas Huber options.setSeekTo( 135864bb6983690bf994d904591145a3cdd6373bdbe6Andreas Huber mSeekTimeUs, 135964bb6983690bf994d904591145a3cdd6373bdbe6Andreas Huber mSeeking == SEEK_VIDEO_ONLY 136064bb6983690bf994d904591145a3cdd6373bdbe6Andreas Huber ? MediaSource::ReadOptions::SEEK_NEXT_SYNC 136164bb6983690bf994d904591145a3cdd6373bdbe6Andreas Huber : MediaSource::ReadOptions::SEEK_CLOSEST_SYNC); 1362bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber } 1363bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber for (;;) { 1364bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber status_t err = mVideoSource->read(&mVideoBuffer, &options); 1365c1689e49ac867de33f2e81289449878ac2e536a0Andreas Huber options.clearSeekTo(); 1366bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber 1367bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber if (err != OK) { 1368e2b1028852120bcfded33b8f06f66b780437fe92Andreas Huber CHECK(mVideoBuffer == NULL); 1369bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber 1370bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber if (err == INFO_FORMAT_CHANGED) { 1371bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber LOGV("VideoSource signalled format change."); 1372bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber 13735daeb129a2c2ba3d14ccd94af283b5f561c783eaAndreas Huber notifyVideoSize_l(); 13745daeb129a2c2ba3d14ccd94af283b5f561c783eaAndreas Huber 1375a657f8deaf21acbe5faba7be1df9c6681d44d471Andreas Huber if (mVideoRenderer != NULL) { 1376fa090f541bb84a546af2ec834e91a032ff10e66eAndreas Huber mVideoRendererIsPreview = false; 1377a657f8deaf21acbe5faba7be1df9c6681d44d471Andreas Huber initRenderer_l(); 1378a657f8deaf21acbe5faba7be1df9c6681d44d471Andreas Huber } 1379bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber continue; 1380bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber } 1381bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber 13824769cc92740e3ab58e9263d42553c12bbf79e3beAndreas Huber // So video playback is complete, but we may still have 13834769cc92740e3ab58e9263d42553c12bbf79e3beAndreas Huber // a seek request pending that needs to be applied 13844769cc92740e3ab58e9263d42553c12bbf79e3beAndreas Huber // to the audio track. 138564bb6983690bf994d904591145a3cdd6373bdbe6Andreas Huber if (mSeeking != NO_SEEK) { 13864769cc92740e3ab58e9263d42553c12bbf79e3beAndreas Huber LOGV("video stream ended while seeking!"); 13874769cc92740e3ab58e9263d42553c12bbf79e3beAndreas Huber } 13884769cc92740e3ab58e9263d42553c12bbf79e3beAndreas Huber finishSeekIfNecessary(-1); 13894769cc92740e3ab58e9263d42553c12bbf79e3beAndreas Huber 13905dac87b088556b8ed7f2a4f5546d31be0bb68680Andreas Huber if (mAudioPlayer != NULL 13915dac87b088556b8ed7f2a4f5546d31be0bb68680Andreas Huber && !(mFlags & (AUDIO_RUNNING | SEEK_PREVIEW))) { 13925dac87b088556b8ed7f2a4f5546d31be0bb68680Andreas Huber startAudioPlayer_l(); 13935dac87b088556b8ed7f2a4f5546d31be0bb68680Andreas Huber } 13945dac87b088556b8ed7f2a4f5546d31be0bb68680Andreas Huber 13955d2de4da54504836e4b772b3010ac28c19f667f0Andreas Huber mFlags |= VIDEO_AT_EOS; 13965295c0c55d41a2906ea7f65a3f22e6278cb17d4bAndreas Huber postStreamDoneEvent_l(err); 1397bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber return; 1398bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber } 1399bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber 14004844ac54e8b5997c3b03872dbafe8ebed4787517Andreas Huber if (mVideoBuffer->range_length() == 0) { 140108411b75d4c30ce26180639f158e2f33d190eee8Andreas Huber // Some decoders, notably the PV AVC software decoder 140208411b75d4c30ce26180639f158e2f33d190eee8Andreas Huber // return spurious empty buffers that we just want to ignore. 140308411b75d4c30ce26180639f158e2f33d190eee8Andreas Huber 14044844ac54e8b5997c3b03872dbafe8ebed4787517Andreas Huber mVideoBuffer->release(); 14054844ac54e8b5997c3b03872dbafe8ebed4787517Andreas Huber mVideoBuffer = NULL; 14064844ac54e8b5997c3b03872dbafe8ebed4787517Andreas Huber continue; 14074844ac54e8b5997c3b03872dbafe8ebed4787517Andreas Huber } 14084844ac54e8b5997c3b03872dbafe8ebed4787517Andreas Huber 1409bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber break; 1410bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber } 1411bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber } 1412bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber 1413bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber int64_t timeUs; 1414bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber CHECK(mVideoBuffer->meta_data()->findInt64(kKeyTime, &timeUs)); 1415bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber 141664bb6983690bf994d904591145a3cdd6373bdbe6Andreas Huber if (mSeeking == SEEK_VIDEO_ONLY) { 141764bb6983690bf994d904591145a3cdd6373bdbe6Andreas Huber if (mSeekTimeUs > timeUs) { 141864bb6983690bf994d904591145a3cdd6373bdbe6Andreas Huber LOGI("XXX mSeekTimeUs = %lld us, timeUs = %lld us", 141964bb6983690bf994d904591145a3cdd6373bdbe6Andreas Huber mSeekTimeUs, timeUs); 142064bb6983690bf994d904591145a3cdd6373bdbe6Andreas Huber } 142164bb6983690bf994d904591145a3cdd6373bdbe6Andreas Huber } 142264bb6983690bf994d904591145a3cdd6373bdbe6Andreas Huber 14232415ecb5bb4e1459024f6d6c8ae2d6e3dc4fbdc7Andreas Huber { 14242415ecb5bb4e1459024f6d6c8ae2d6e3dc4fbdc7Andreas Huber Mutex::Autolock autoLock(mMiscStateLock); 14252415ecb5bb4e1459024f6d6c8ae2d6e3dc4fbdc7Andreas Huber mVideoTimeUs = timeUs; 14262415ecb5bb4e1459024f6d6c8ae2d6e3dc4fbdc7Andreas Huber } 1427bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber 142864bb6983690bf994d904591145a3cdd6373bdbe6Andreas Huber SeekType wasSeeking = mSeeking; 14294769cc92740e3ab58e9263d42553c12bbf79e3beAndreas Huber finishSeekIfNecessary(timeUs); 1430bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber 1431f03034408506051f2f836e59305fcd5f662bf19aAndreas Huber if (mAudioPlayer != NULL && !(mFlags & (AUDIO_RUNNING | SEEK_PREVIEW))) { 1432f03034408506051f2f836e59305fcd5f662bf19aAndreas Huber status_t err = startAudioPlayer_l(); 1433f03034408506051f2f836e59305fcd5f662bf19aAndreas Huber if (err != OK) { 1434f03034408506051f2f836e59305fcd5f662bf19aAndreas Huber LOGE("Startung the audio player failed w/ err %d", err); 1435f03034408506051f2f836e59305fcd5f662bf19aAndreas Huber return; 1436f03034408506051f2f836e59305fcd5f662bf19aAndreas Huber } 1437f03034408506051f2f836e59305fcd5f662bf19aAndreas Huber } 1438f03034408506051f2f836e59305fcd5f662bf19aAndreas Huber 14395d2de4da54504836e4b772b3010ac28c19f667f0Andreas Huber TimeSource *ts = (mFlags & AUDIO_AT_EOS) ? &mSystemTimeSource : mTimeSource; 14405d2de4da54504836e4b772b3010ac28c19f667f0Andreas Huber 1441bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber if (mFlags & FIRST_FRAME) { 1442bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber mFlags &= ~FIRST_FRAME; 1443aee6c07b3572bf2510cd9e7d29c454fcfedde31dpmehendale mSinceLastDropped = 0; 14445d2de4da54504836e4b772b3010ac28c19f667f0Andreas Huber mTimeSourceDeltaUs = ts->getRealTimeUs() - timeUs; 1445bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber } 1446bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber 1447bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber int64_t realTimeUs, mediaTimeUs; 14485d2de4da54504836e4b772b3010ac28c19f667f0Andreas Huber if (!(mFlags & AUDIO_AT_EOS) && mAudioPlayer != NULL 1449bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber && mAudioPlayer->getMediaTimeMapping(&realTimeUs, &mediaTimeUs)) { 1450bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber mTimeSourceDeltaUs = realTimeUs - mediaTimeUs; 1451bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber } 1452bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber 145364bb6983690bf994d904591145a3cdd6373bdbe6Andreas Huber if (wasSeeking == SEEK_VIDEO_ONLY) { 145464bb6983690bf994d904591145a3cdd6373bdbe6Andreas Huber int64_t nowUs = ts->getRealTimeUs() - mTimeSourceDeltaUs; 145564bb6983690bf994d904591145a3cdd6373bdbe6Andreas Huber 145664bb6983690bf994d904591145a3cdd6373bdbe6Andreas Huber int64_t latenessUs = nowUs - timeUs; 145764bb6983690bf994d904591145a3cdd6373bdbe6Andreas Huber 145864bb6983690bf994d904591145a3cdd6373bdbe6Andreas Huber if (latenessUs > 0) { 145964bb6983690bf994d904591145a3cdd6373bdbe6Andreas Huber LOGI("after SEEK_VIDEO_ONLY we're late by %.2f secs", latenessUs / 1E6); 146064bb6983690bf994d904591145a3cdd6373bdbe6Andreas Huber } 146164bb6983690bf994d904591145a3cdd6373bdbe6Andreas Huber } 146264bb6983690bf994d904591145a3cdd6373bdbe6Andreas Huber 146364bb6983690bf994d904591145a3cdd6373bdbe6Andreas Huber if (wasSeeking == NO_SEEK) { 146402a1db7dc1de2f2df306ec10bab992bc8bbaaca8Andreas Huber // Let's display the first frame after seeking right away. 1465f8ca90452ff3e252f20de38f1c3eee524c808c3eAndreas Huber 14662b1222f8938356669672f35e0e53e176c78c40efAndreas Huber int64_t nowUs = ts->getRealTimeUs() - mTimeSourceDeltaUs; 1467bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber 14682b1222f8938356669672f35e0e53e176c78c40efAndreas Huber int64_t latenessUs = nowUs - timeUs; 14692b1222f8938356669672f35e0e53e176c78c40efAndreas Huber 147064bb6983690bf994d904591145a3cdd6373bdbe6Andreas Huber if (latenessUs > 500000ll 147164bb6983690bf994d904591145a3cdd6373bdbe6Andreas Huber && mRTSPController == NULL 147264bb6983690bf994d904591145a3cdd6373bdbe6Andreas Huber && mAudioPlayer != NULL 147364bb6983690bf994d904591145a3cdd6373bdbe6Andreas Huber && mAudioPlayer->getMediaTimeMapping( 147464bb6983690bf994d904591145a3cdd6373bdbe6Andreas Huber &realTimeUs, &mediaTimeUs)) { 147564bb6983690bf994d904591145a3cdd6373bdbe6Andreas Huber LOGI("we're much too late (%.2f secs), video skipping ahead", 147664bb6983690bf994d904591145a3cdd6373bdbe6Andreas Huber latenessUs / 1E6); 147764bb6983690bf994d904591145a3cdd6373bdbe6Andreas Huber 147864bb6983690bf994d904591145a3cdd6373bdbe6Andreas Huber mVideoBuffer->release(); 147964bb6983690bf994d904591145a3cdd6373bdbe6Andreas Huber mVideoBuffer = NULL; 148064bb6983690bf994d904591145a3cdd6373bdbe6Andreas Huber 148164bb6983690bf994d904591145a3cdd6373bdbe6Andreas Huber mSeeking = SEEK_VIDEO_ONLY; 148264bb6983690bf994d904591145a3cdd6373bdbe6Andreas Huber mSeekTimeUs = mediaTimeUs; 148364bb6983690bf994d904591145a3cdd6373bdbe6Andreas Huber 148464bb6983690bf994d904591145a3cdd6373bdbe6Andreas Huber postVideoEvent_l(); 148564bb6983690bf994d904591145a3cdd6373bdbe6Andreas Huber return; 148664bb6983690bf994d904591145a3cdd6373bdbe6Andreas Huber } 148764bb6983690bf994d904591145a3cdd6373bdbe6Andreas Huber 14882b1222f8938356669672f35e0e53e176c78c40efAndreas Huber if (latenessUs > 40000) { 14892b1222f8938356669672f35e0e53e176c78c40efAndreas Huber // We're more than 40ms late. 14902b1222f8938356669672f35e0e53e176c78c40efAndreas Huber LOGV("we're late by %lld us (%.2f secs)", latenessUs, latenessUs / 1E6); 14912b1222f8938356669672f35e0e53e176c78c40efAndreas Huber if ( mSinceLastDropped > FRAME_DROP_FREQ) 14922b1222f8938356669672f35e0e53e176c78c40efAndreas Huber { 14932b1222f8938356669672f35e0e53e176c78c40efAndreas Huber LOGV("we're late by %lld us (%.2f secs) dropping one after %d frames", latenessUs, latenessUs / 1E6, mSinceLastDropped); 14942b1222f8938356669672f35e0e53e176c78c40efAndreas Huber mSinceLastDropped = 0; 14952b1222f8938356669672f35e0e53e176c78c40efAndreas Huber mVideoBuffer->release(); 14962b1222f8938356669672f35e0e53e176c78c40efAndreas Huber mVideoBuffer = NULL; 14972b1222f8938356669672f35e0e53e176c78c40efAndreas Huber 14982b1222f8938356669672f35e0e53e176c78c40efAndreas Huber postVideoEvent_l(); 14992b1222f8938356669672f35e0e53e176c78c40efAndreas Huber return; 15002b1222f8938356669672f35e0e53e176c78c40efAndreas Huber } 1501aee6c07b3572bf2510cd9e7d29c454fcfedde31dpmehendale } 1502bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber 15032b1222f8938356669672f35e0e53e176c78c40efAndreas Huber if (latenessUs < -10000) { 15042b1222f8938356669672f35e0e53e176c78c40efAndreas Huber // We're more than 10ms early. 1505bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber 15062b1222f8938356669672f35e0e53e176c78c40efAndreas Huber postVideoEvent_l(10000); 15072b1222f8938356669672f35e0e53e176c78c40efAndreas Huber return; 15082b1222f8938356669672f35e0e53e176c78c40efAndreas Huber } 1509bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber } 1510bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber 1511fa090f541bb84a546af2ec834e91a032ff10e66eAndreas Huber if (mVideoRendererIsPreview || mVideoRenderer == NULL) { 1512fa090f541bb84a546af2ec834e91a032ff10e66eAndreas Huber mVideoRendererIsPreview = false; 1513fa090f541bb84a546af2ec834e91a032ff10e66eAndreas Huber 1514a657f8deaf21acbe5faba7be1df9c6681d44d471Andreas Huber initRenderer_l(); 1515a657f8deaf21acbe5faba7be1df9c6681d44d471Andreas Huber } 1516a657f8deaf21acbe5faba7be1df9c6681d44d471Andreas Huber 1517a657f8deaf21acbe5faba7be1df9c6681d44d471Andreas Huber if (mVideoRenderer != NULL) { 1518aee6c07b3572bf2510cd9e7d29c454fcfedde31dpmehendale mSinceLastDropped++; 1519a657f8deaf21acbe5faba7be1df9c6681d44d471Andreas Huber mVideoRenderer->render(mVideoBuffer); 1520a657f8deaf21acbe5faba7be1df9c6681d44d471Andreas Huber } 1521bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber 1522f5ab57c2d5e02af7483c94eddb177e4f5c9e9892Andreas Huber mVideoBuffer->release(); 1523bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber mVideoBuffer = NULL; 1524bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber 152564bb6983690bf994d904591145a3cdd6373bdbe6Andreas Huber if (wasSeeking != NO_SEEK && (mFlags & SEEK_PREVIEW)) { 15262b1222f8938356669672f35e0e53e176c78c40efAndreas Huber mFlags &= ~SEEK_PREVIEW; 15272b1222f8938356669672f35e0e53e176c78c40efAndreas Huber return; 15282b1222f8938356669672f35e0e53e176c78c40efAndreas Huber } 15292b1222f8938356669672f35e0e53e176c78c40efAndreas Huber 1530bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber postVideoEvent_l(); 1531bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber} 1532bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber 1533bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Hubervoid AwesomePlayer::postVideoEvent_l(int64_t delayUs) { 1534bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber if (mVideoEventPending) { 1535bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber return; 1536bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber } 1537bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber 1538bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber mVideoEventPending = true; 1539bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber mQueue.postEventWithDelay(mVideoEvent, delayUs < 0 ? 10000 : delayUs); 1540bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber} 1541bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber 15425295c0c55d41a2906ea7f65a3f22e6278cb17d4bAndreas Hubervoid AwesomePlayer::postStreamDoneEvent_l(status_t status) { 1543bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber if (mStreamDoneEventPending) { 1544bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber return; 1545bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber } 1546bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber mStreamDoneEventPending = true; 15475295c0c55d41a2906ea7f65a3f22e6278cb17d4bAndreas Huber 15485295c0c55d41a2906ea7f65a3f22e6278cb17d4bAndreas Huber mStreamDoneStatus = status; 1549bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber mQueue.postEvent(mStreamDoneEvent); 1550bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber} 1551bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber 155266b0a35c9a4136a84c3f73b1b25fcb5220138b95Andreas Hubervoid AwesomePlayer::postBufferingEvent_l() { 155366b0a35c9a4136a84c3f73b1b25fcb5220138b95Andreas Huber if (mBufferingEventPending) { 155466b0a35c9a4136a84c3f73b1b25fcb5220138b95Andreas Huber return; 155566b0a35c9a4136a84c3f73b1b25fcb5220138b95Andreas Huber } 155666b0a35c9a4136a84c3f73b1b25fcb5220138b95Andreas Huber mBufferingEventPending = true; 155766b0a35c9a4136a84c3f73b1b25fcb5220138b95Andreas Huber mQueue.postEventWithDelay(mBufferingEvent, 1000000ll); 155866b0a35c9a4136a84c3f73b1b25fcb5220138b95Andreas Huber} 155966b0a35c9a4136a84c3f73b1b25fcb5220138b95Andreas Huber 1560145e68fc778275963189b02a1adcbe27cce4d769Andreas Hubervoid AwesomePlayer::postVideoLagEvent_l() { 1561145e68fc778275963189b02a1adcbe27cce4d769Andreas Huber if (mVideoLagEventPending) { 1562145e68fc778275963189b02a1adcbe27cce4d769Andreas Huber return; 1563145e68fc778275963189b02a1adcbe27cce4d769Andreas Huber } 1564145e68fc778275963189b02a1adcbe27cce4d769Andreas Huber mVideoLagEventPending = true; 1565145e68fc778275963189b02a1adcbe27cce4d769Andreas Huber mQueue.postEventWithDelay(mVideoLagEvent, 1000000ll); 1566145e68fc778275963189b02a1adcbe27cce4d769Andreas Huber} 1567145e68fc778275963189b02a1adcbe27cce4d769Andreas Huber 156884b343f29063fbfa2ee61b2e3d37ba059ca507d4Andreas Hubervoid AwesomePlayer::postCheckAudioStatusEvent_l(int64_t delayUs) { 15691862a33b246249630b654182afb5914da3480d4cAndreas Huber if (mAudioStatusEventPending) { 15701862a33b246249630b654182afb5914da3480d4cAndreas Huber return; 15711862a33b246249630b654182afb5914da3480d4cAndreas Huber } 15721862a33b246249630b654182afb5914da3480d4cAndreas Huber mAudioStatusEventPending = true; 157384b343f29063fbfa2ee61b2e3d37ba059ca507d4Andreas Huber mQueue.postEventWithDelay(mCheckAudioStatusEvent, delayUs); 15741862a33b246249630b654182afb5914da3480d4cAndreas Huber} 15751862a33b246249630b654182afb5914da3480d4cAndreas Huber 15761862a33b246249630b654182afb5914da3480d4cAndreas Hubervoid AwesomePlayer::onCheckAudioStatus() { 15771862a33b246249630b654182afb5914da3480d4cAndreas Huber Mutex::Autolock autoLock(mLock); 1578d29345dfa29cdcc650f3705e43950ef2500f6728Andreas Huber if (!mAudioStatusEventPending) { 1579d29345dfa29cdcc650f3705e43950ef2500f6728Andreas Huber // Event was dispatched and while we were blocking on the mutex, 1580d29345dfa29cdcc650f3705e43950ef2500f6728Andreas Huber // has already been cancelled. 1581d29345dfa29cdcc650f3705e43950ef2500f6728Andreas Huber return; 1582d29345dfa29cdcc650f3705e43950ef2500f6728Andreas Huber } 1583d29345dfa29cdcc650f3705e43950ef2500f6728Andreas Huber 15841862a33b246249630b654182afb5914da3480d4cAndreas Huber mAudioStatusEventPending = false; 15851862a33b246249630b654182afb5914da3480d4cAndreas Huber 15861862a33b246249630b654182afb5914da3480d4cAndreas Huber if (mWatchForAudioSeekComplete && !mAudioPlayer->isSeeking()) { 15871862a33b246249630b654182afb5914da3480d4cAndreas Huber mWatchForAudioSeekComplete = false; 15881321fdd94d354431b930735e9f38f32ecd189a2dAndreas Huber 15891321fdd94d354431b930735e9f38f32ecd189a2dAndreas Huber if (!mSeekNotificationSent) { 15901321fdd94d354431b930735e9f38f32ecd189a2dAndreas Huber notifyListener_l(MEDIA_SEEK_COMPLETE); 15911321fdd94d354431b930735e9f38f32ecd189a2dAndreas Huber mSeekNotificationSent = true; 15921321fdd94d354431b930735e9f38f32ecd189a2dAndreas Huber } 1593dac4ee72bac87388a1495e098f39d73168c8078fAndreas Huber 159464bb6983690bf994d904591145a3cdd6373bdbe6Andreas Huber mSeeking = NO_SEEK; 15951862a33b246249630b654182afb5914da3480d4cAndreas Huber } 15961862a33b246249630b654182afb5914da3480d4cAndreas Huber 15975295c0c55d41a2906ea7f65a3f22e6278cb17d4bAndreas Huber status_t finalStatus; 15985295c0c55d41a2906ea7f65a3f22e6278cb17d4bAndreas Huber if (mWatchForAudioEOS && mAudioPlayer->reachedEOS(&finalStatus)) { 15991862a33b246249630b654182afb5914da3480d4cAndreas Huber mWatchForAudioEOS = false; 16005d2de4da54504836e4b772b3010ac28c19f667f0Andreas Huber mFlags |= AUDIO_AT_EOS; 16015d2de4da54504836e4b772b3010ac28c19f667f0Andreas Huber mFlags |= FIRST_FRAME; 16025295c0c55d41a2906ea7f65a3f22e6278cb17d4bAndreas Huber postStreamDoneEvent_l(finalStatus); 16031862a33b246249630b654182afb5914da3480d4cAndreas Huber } 16041862a33b246249630b654182afb5914da3480d4cAndreas Huber} 16051862a33b246249630b654182afb5914da3480d4cAndreas Huber 1606c23f12af0394aa2f6651968a3c8840f1af317aa1Andreas Huberstatus_t AwesomePlayer::prepare() { 1607c23f12af0394aa2f6651968a3c8840f1af317aa1Andreas Huber Mutex::Autolock autoLock(mLock); 1608bd22c52280179b29eefac91ef7e7bbbc33d25904Andreas Huber return prepare_l(); 1609bd22c52280179b29eefac91ef7e7bbbc33d25904Andreas Huber} 1610c23f12af0394aa2f6651968a3c8840f1af317aa1Andreas Huber 1611bd22c52280179b29eefac91ef7e7bbbc33d25904Andreas Huberstatus_t AwesomePlayer::prepare_l() { 1612bd22c52280179b29eefac91ef7e7bbbc33d25904Andreas Huber if (mFlags & PREPARED) { 1613bd22c52280179b29eefac91ef7e7bbbc33d25904Andreas Huber return OK; 1614bd22c52280179b29eefac91ef7e7bbbc33d25904Andreas Huber } 1615bd22c52280179b29eefac91ef7e7bbbc33d25904Andreas Huber 1616bd22c52280179b29eefac91ef7e7bbbc33d25904Andreas Huber if (mFlags & PREPARING) { 1617bd22c52280179b29eefac91ef7e7bbbc33d25904Andreas Huber return UNKNOWN_ERROR; 1618bd22c52280179b29eefac91ef7e7bbbc33d25904Andreas Huber } 1619bd22c52280179b29eefac91ef7e7bbbc33d25904Andreas Huber 1620bd22c52280179b29eefac91ef7e7bbbc33d25904Andreas Huber mIsAsyncPrepare = false; 1621c23f12af0394aa2f6651968a3c8840f1af317aa1Andreas Huber status_t err = prepareAsync_l(); 1622c23f12af0394aa2f6651968a3c8840f1af317aa1Andreas Huber 1623c23f12af0394aa2f6651968a3c8840f1af317aa1Andreas Huber if (err != OK) { 1624c23f12af0394aa2f6651968a3c8840f1af317aa1Andreas Huber return err; 1625c23f12af0394aa2f6651968a3c8840f1af317aa1Andreas Huber } 1626c23f12af0394aa2f6651968a3c8840f1af317aa1Andreas Huber 1627bd22c52280179b29eefac91ef7e7bbbc33d25904Andreas Huber while (mFlags & PREPARING) { 1628c23f12af0394aa2f6651968a3c8840f1af317aa1Andreas Huber mPreparedCondition.wait(mLock); 1629c23f12af0394aa2f6651968a3c8840f1af317aa1Andreas Huber } 1630c23f12af0394aa2f6651968a3c8840f1af317aa1Andreas Huber 1631bd22c52280179b29eefac91ef7e7bbbc33d25904Andreas Huber return mPrepareResult; 1632c23f12af0394aa2f6651968a3c8840f1af317aa1Andreas Huber} 1633c23f12af0394aa2f6651968a3c8840f1af317aa1Andreas Huber 1634c23f12af0394aa2f6651968a3c8840f1af317aa1Andreas Huberstatus_t AwesomePlayer::prepareAsync() { 1635c23f12af0394aa2f6651968a3c8840f1af317aa1Andreas Huber Mutex::Autolock autoLock(mLock); 1636bd22c52280179b29eefac91ef7e7bbbc33d25904Andreas Huber 1637bd22c52280179b29eefac91ef7e7bbbc33d25904Andreas Huber if (mFlags & PREPARING) { 1638bd22c52280179b29eefac91ef7e7bbbc33d25904Andreas Huber return UNKNOWN_ERROR; // async prepare already pending 1639bd22c52280179b29eefac91ef7e7bbbc33d25904Andreas Huber } 1640bd22c52280179b29eefac91ef7e7bbbc33d25904Andreas Huber 1641bd22c52280179b29eefac91ef7e7bbbc33d25904Andreas Huber mIsAsyncPrepare = true; 1642c23f12af0394aa2f6651968a3c8840f1af317aa1Andreas Huber return prepareAsync_l(); 1643c23f12af0394aa2f6651968a3c8840f1af317aa1Andreas Huber} 1644c23f12af0394aa2f6651968a3c8840f1af317aa1Andreas Huber 1645c23f12af0394aa2f6651968a3c8840f1af317aa1Andreas Huberstatus_t AwesomePlayer::prepareAsync_l() { 1646bd22c52280179b29eefac91ef7e7bbbc33d25904Andreas Huber if (mFlags & PREPARING) { 1647bd22c52280179b29eefac91ef7e7bbbc33d25904Andreas Huber return UNKNOWN_ERROR; // async prepare already pending 1648c23f12af0394aa2f6651968a3c8840f1af317aa1Andreas Huber } 1649c23f12af0394aa2f6651968a3c8840f1af317aa1Andreas Huber 16502e8ffaf95bd35358ecd14ddf00cddaf3abefe0a9Andreas Huber if (!mQueueStarted) { 16512e8ffaf95bd35358ecd14ddf00cddaf3abefe0a9Andreas Huber mQueue.start(); 16522e8ffaf95bd35358ecd14ddf00cddaf3abefe0a9Andreas Huber mQueueStarted = true; 16532e8ffaf95bd35358ecd14ddf00cddaf3abefe0a9Andreas Huber } 16542e8ffaf95bd35358ecd14ddf00cddaf3abefe0a9Andreas Huber 1655bd22c52280179b29eefac91ef7e7bbbc33d25904Andreas Huber mFlags |= PREPARING; 1656c23f12af0394aa2f6651968a3c8840f1af317aa1Andreas Huber mAsyncPrepareEvent = new AwesomeEvent( 1657c23f12af0394aa2f6651968a3c8840f1af317aa1Andreas Huber this, &AwesomePlayer::onPrepareAsyncEvent); 1658c23f12af0394aa2f6651968a3c8840f1af317aa1Andreas Huber 1659c23f12af0394aa2f6651968a3c8840f1af317aa1Andreas Huber mQueue.postEvent(mAsyncPrepareEvent); 1660c23f12af0394aa2f6651968a3c8840f1af317aa1Andreas Huber 1661c23f12af0394aa2f6651968a3c8840f1af317aa1Andreas Huber return OK; 1662c23f12af0394aa2f6651968a3c8840f1af317aa1Andreas Huber} 1663c23f12af0394aa2f6651968a3c8840f1af317aa1Andreas Huber 1664bd22c52280179b29eefac91ef7e7bbbc33d25904Andreas Huberstatus_t AwesomePlayer::finishSetDataSource_l() { 1665e94bd14078d327ef2f800e69907efce641a13272Andreas Huber sp<DataSource> dataSource; 1666e94bd14078d327ef2f800e69907efce641a13272Andreas Huber 16678cb0c4168bf4b678e4a6edfcf409247016be20d5Andreas Huber if (!strncasecmp("http://", mUri.string(), 7) 16688cb0c4168bf4b678e4a6edfcf409247016be20d5Andreas Huber || !strncasecmp("https://", mUri.string(), 8)) { 16691156dc913a5ba7b2bc86489468d4914430f03d14Andreas Huber mConnectingDataSource = HTTPBase::Create( 16701156dc913a5ba7b2bc86489468d4914430f03d14Andreas Huber (mFlags & INCOGNITO) 16711156dc913a5ba7b2bc86489468d4914430f03d14Andreas Huber ? HTTPBase::kFlagIncognito 16721156dc913a5ba7b2bc86489468d4914430f03d14Andreas Huber : 0); 1673e94bd14078d327ef2f800e69907efce641a13272Andreas Huber 1674e94bd14078d327ef2f800e69907efce641a13272Andreas Huber mLock.unlock(); 167579f77ef3b0a37660ba8c5bcb2dfbfda3860f2135Andreas Huber status_t err = mConnectingDataSource->connect(mUri, &mUriHeaders); 1676e94bd14078d327ef2f800e69907efce641a13272Andreas Huber mLock.lock(); 1677e94bd14078d327ef2f800e69907efce641a13272Andreas Huber 1678e94bd14078d327ef2f800e69907efce641a13272Andreas Huber if (err != OK) { 1679e94bd14078d327ef2f800e69907efce641a13272Andreas Huber mConnectingDataSource.clear(); 1680e94bd14078d327ef2f800e69907efce641a13272Andreas Huber 1681e94bd14078d327ef2f800e69907efce641a13272Andreas Huber LOGI("mConnectingDataSource->connect() returned %d", err); 1682e94bd14078d327ef2f800e69907efce641a13272Andreas Huber return err; 1683e94bd14078d327ef2f800e69907efce641a13272Andreas Huber } 1684e94bd14078d327ef2f800e69907efce641a13272Andreas Huber 16850a5baa9b411fe086013d2a5e9126ed63fbad046cAndreas Huber#if 0 16860a5baa9b411fe086013d2a5e9126ed63fbad046cAndreas Huber mCachedSource = new NuCachedSource2( 16870a5baa9b411fe086013d2a5e9126ed63fbad046cAndreas Huber new ThrottledSource( 16880a5baa9b411fe086013d2a5e9126ed63fbad046cAndreas Huber mConnectingDataSource, 50 * 1024 /* bytes/sec */)); 16890a5baa9b411fe086013d2a5e9126ed63fbad046cAndreas Huber#else 16900a5baa9b411fe086013d2a5e9126ed63fbad046cAndreas Huber mCachedSource = new NuCachedSource2(mConnectingDataSource); 16910a5baa9b411fe086013d2a5e9126ed63fbad046cAndreas Huber#endif 1692e94bd14078d327ef2f800e69907efce641a13272Andreas Huber mConnectingDataSource.clear(); 16930a5baa9b411fe086013d2a5e9126ed63fbad046cAndreas Huber 16940a5baa9b411fe086013d2a5e9126ed63fbad046cAndreas Huber dataSource = mCachedSource; 1695ac05c317cd818701535c5d72ce90da98c4bae75bAndreas Huber 16966511c9755c3a3360ba869772600c7aae048a7ffcAndreas Huber String8 contentType = dataSource->getMIMEType(); 1697ac05c317cd818701535c5d72ce90da98c4bae75bAndreas Huber 16986511c9755c3a3360ba869772600c7aae048a7ffcAndreas Huber if (strncasecmp(contentType.string(), "audio/", 6)) { 16996511c9755c3a3360ba869772600c7aae048a7ffcAndreas Huber // We're not doing this for streams that appear to be audio-only 17006511c9755c3a3360ba869772600c7aae048a7ffcAndreas Huber // streams to ensure that even low bandwidth streams start 17016511c9755c3a3360ba869772600c7aae048a7ffcAndreas Huber // playing back fairly instantly. 1702ac05c317cd818701535c5d72ce90da98c4bae75bAndreas Huber 17036511c9755c3a3360ba869772600c7aae048a7ffcAndreas Huber // We're going to prefill the cache before trying to instantiate 17046511c9755c3a3360ba869772600c7aae048a7ffcAndreas Huber // the extractor below, as the latter is an operation that otherwise 17056511c9755c3a3360ba869772600c7aae048a7ffcAndreas Huber // could block on the datasource for a significant amount of time. 17066511c9755c3a3360ba869772600c7aae048a7ffcAndreas Huber // During that time we'd be unable to abort the preparation phase 17076511c9755c3a3360ba869772600c7aae048a7ffcAndreas Huber // without this prefill. 17086511c9755c3a3360ba869772600c7aae048a7ffcAndreas Huber 17096511c9755c3a3360ba869772600c7aae048a7ffcAndreas Huber mLock.unlock(); 17106511c9755c3a3360ba869772600c7aae048a7ffcAndreas Huber 17116511c9755c3a3360ba869772600c7aae048a7ffcAndreas Huber for (;;) { 17126511c9755c3a3360ba869772600c7aae048a7ffcAndreas Huber status_t finalStatus; 17136511c9755c3a3360ba869772600c7aae048a7ffcAndreas Huber size_t cachedDataRemaining = 17146511c9755c3a3360ba869772600c7aae048a7ffcAndreas Huber mCachedSource->approxDataRemaining(&finalStatus); 1715ac05c317cd818701535c5d72ce90da98c4bae75bAndreas Huber 17166511c9755c3a3360ba869772600c7aae048a7ffcAndreas Huber if (finalStatus != OK || cachedDataRemaining >= kHighWaterMarkBytes 17176511c9755c3a3360ba869772600c7aae048a7ffcAndreas Huber || (mFlags & PREPARE_CANCELLED)) { 17186511c9755c3a3360ba869772600c7aae048a7ffcAndreas Huber break; 17196511c9755c3a3360ba869772600c7aae048a7ffcAndreas Huber } 17206511c9755c3a3360ba869772600c7aae048a7ffcAndreas Huber 17216511c9755c3a3360ba869772600c7aae048a7ffcAndreas Huber usleep(200000); 1722ac05c317cd818701535c5d72ce90da98c4bae75bAndreas Huber } 1723ac05c317cd818701535c5d72ce90da98c4bae75bAndreas Huber 17246511c9755c3a3360ba869772600c7aae048a7ffcAndreas Huber mLock.lock(); 1725ac05c317cd818701535c5d72ce90da98c4bae75bAndreas Huber } 1726ac05c317cd818701535c5d72ce90da98c4bae75bAndreas Huber 1727ac05c317cd818701535c5d72ce90da98c4bae75bAndreas Huber if (mFlags & PREPARE_CANCELLED) { 1728ac05c317cd818701535c5d72ce90da98c4bae75bAndreas Huber LOGI("Prepare cancelled while waiting for initial cache fill."); 1729ac05c317cd818701535c5d72ce90da98c4bae75bAndreas Huber return UNKNOWN_ERROR; 1730ac05c317cd818701535c5d72ce90da98c4bae75bAndreas Huber } 1731cf7b9c7aae758ac0b99833915053c63c2ac46e09Andreas Huber } else if (!strncasecmp("rtsp://", mUri.string(), 7)) { 1732cf7b9c7aae758ac0b99833915053c63c2ac46e09Andreas Huber if (mLooper == NULL) { 1733cf7b9c7aae758ac0b99833915053c63c2ac46e09Andreas Huber mLooper = new ALooper; 1734a814c1fdc2acf0ed2ee3b175110f6039be7c4873Andreas Huber mLooper->setName("rtsp"); 1735cf7b9c7aae758ac0b99833915053c63c2ac46e09Andreas Huber mLooper->start(); 1736cf7b9c7aae758ac0b99833915053c63c2ac46e09Andreas Huber } 1737cf7b9c7aae758ac0b99833915053c63c2ac46e09Andreas Huber mRTSPController = new ARTSPController(mLooper); 1738f1958f9442bc937e1f8c8d9175901500b944b021Andreas Huber mConnectingRTSPController = mRTSPController; 1739f1958f9442bc937e1f8c8d9175901500b944b021Andreas Huber 1740f1958f9442bc937e1f8c8d9175901500b944b021Andreas Huber mLock.unlock(); 1741cf7b9c7aae758ac0b99833915053c63c2ac46e09Andreas Huber status_t err = mRTSPController->connect(mUri.string()); 1742f1958f9442bc937e1f8c8d9175901500b944b021Andreas Huber mLock.lock(); 1743f1958f9442bc937e1f8c8d9175901500b944b021Andreas Huber 1744f1958f9442bc937e1f8c8d9175901500b944b021Andreas Huber mConnectingRTSPController.clear(); 1745cf7b9c7aae758ac0b99833915053c63c2ac46e09Andreas Huber 1746cf7b9c7aae758ac0b99833915053c63c2ac46e09Andreas Huber LOGI("ARTSPController::connect returned %d", err); 1747cf7b9c7aae758ac0b99833915053c63c2ac46e09Andreas Huber 1748cf7b9c7aae758ac0b99833915053c63c2ac46e09Andreas Huber if (err != OK) { 1749cf7b9c7aae758ac0b99833915053c63c2ac46e09Andreas Huber mRTSPController.clear(); 1750cf7b9c7aae758ac0b99833915053c63c2ac46e09Andreas Huber return err; 1751cf7b9c7aae758ac0b99833915053c63c2ac46e09Andreas Huber } 1752e71d10e7ad55ccbcb0756c007caef1c959090384Andreas Huber 1753cf7b9c7aae758ac0b99833915053c63c2ac46e09Andreas Huber sp<MediaExtractor> extractor = mRTSPController.get(); 1754e71d10e7ad55ccbcb0756c007caef1c959090384Andreas Huber return setDataSource_l(extractor); 1755e94bd14078d327ef2f800e69907efce641a13272Andreas Huber } else { 1756e94bd14078d327ef2f800e69907efce641a13272Andreas Huber dataSource = DataSource::CreateFromURI(mUri.string(), &mUriHeaders); 1757e94bd14078d327ef2f800e69907efce641a13272Andreas Huber } 1758bd22c52280179b29eefac91ef7e7bbbc33d25904Andreas Huber 1759bd22c52280179b29eefac91ef7e7bbbc33d25904Andreas Huber if (dataSource == NULL) { 1760bd22c52280179b29eefac91ef7e7bbbc33d25904Andreas Huber return UNKNOWN_ERROR; 1761bd22c52280179b29eefac91ef7e7bbbc33d25904Andreas Huber } 1762bd22c52280179b29eefac91ef7e7bbbc33d25904Andreas Huber 1763bd22c52280179b29eefac91ef7e7bbbc33d25904Andreas Huber sp<MediaExtractor> extractor = MediaExtractor::Create(dataSource); 1764bd22c52280179b29eefac91ef7e7bbbc33d25904Andreas Huber 1765bd22c52280179b29eefac91ef7e7bbbc33d25904Andreas Huber if (extractor == NULL) { 1766bd22c52280179b29eefac91ef7e7bbbc33d25904Andreas Huber return UNKNOWN_ERROR; 1767bd22c52280179b29eefac91ef7e7bbbc33d25904Andreas Huber } 1768bd22c52280179b29eefac91ef7e7bbbc33d25904Andreas Huber 1769b5ce361d19e69fe156f7188c9ee0f4734b259874Gloria Wang dataSource->getDrmInfo(mDecryptHandle, &mDrmManagerClient); 1770b5ce361d19e69fe156f7188c9ee0f4734b259874Gloria Wang 1771b371426ce4cf2fa6d8c3d1903b61322feb165d35Gloria Wang if (mDecryptHandle != NULL) { 17728f64134f749e4f7861a08a3063450fc714c4651dGloria Wang CHECK(mDrmManagerClient); 17733318523222e31fb4a7fcc345ddb4ec845d30ef96James Dong if (RightsStatus::RIGHTS_VALID != mDecryptHandle->status) { 1774b371426ce4cf2fa6d8c3d1903b61322feb165d35Gloria Wang notifyListener_l(MEDIA_ERROR, MEDIA_ERROR_UNKNOWN, ERROR_NO_LICENSE); 1775b371426ce4cf2fa6d8c3d1903b61322feb165d35Gloria Wang } 1776dcd25efb46c41c8d24a0a9cf61fb57f84149709eGloria Wang } 1777dcd25efb46c41c8d24a0a9cf61fb57f84149709eGloria Wang 1778bd22c52280179b29eefac91ef7e7bbbc33d25904Andreas Huber return setDataSource_l(extractor); 1779bd22c52280179b29eefac91ef7e7bbbc33d25904Andreas Huber} 1780bd22c52280179b29eefac91ef7e7bbbc33d25904Andreas Huber 178188d8a83de12592635248aa1a3bd6b9ea46108501Andreas Hubervoid AwesomePlayer::abortPrepare(status_t err) { 178288d8a83de12592635248aa1a3bd6b9ea46108501Andreas Huber CHECK(err != OK); 178388d8a83de12592635248aa1a3bd6b9ea46108501Andreas Huber 178488d8a83de12592635248aa1a3bd6b9ea46108501Andreas Huber if (mIsAsyncPrepare) { 178588d8a83de12592635248aa1a3bd6b9ea46108501Andreas Huber notifyListener_l(MEDIA_ERROR, MEDIA_ERROR_UNKNOWN, err); 178688d8a83de12592635248aa1a3bd6b9ea46108501Andreas Huber } 178788d8a83de12592635248aa1a3bd6b9ea46108501Andreas Huber 178888d8a83de12592635248aa1a3bd6b9ea46108501Andreas Huber mPrepareResult = err; 17896a05c9e912aeb8bfe1ef99516def91a177a481b6Andreas Huber mFlags &= ~(PREPARING|PREPARE_CANCELLED|PREPARING_CONNECTED); 179088d8a83de12592635248aa1a3bd6b9ea46108501Andreas Huber mAsyncPrepareEvent = NULL; 179188d8a83de12592635248aa1a3bd6b9ea46108501Andreas Huber mPreparedCondition.broadcast(); 179288d8a83de12592635248aa1a3bd6b9ea46108501Andreas Huber} 179388d8a83de12592635248aa1a3bd6b9ea46108501Andreas Huber 1794e966fb05c7e67a7f5dce65024de60aac83eb6f81Andreas Huber// static 1795e966fb05c7e67a7f5dce65024de60aac83eb6f81Andreas Huberbool AwesomePlayer::ContinuePreparation(void *cookie) { 1796e966fb05c7e67a7f5dce65024de60aac83eb6f81Andreas Huber AwesomePlayer *me = static_cast<AwesomePlayer *>(cookie); 1797e966fb05c7e67a7f5dce65024de60aac83eb6f81Andreas Huber 1798e966fb05c7e67a7f5dce65024de60aac83eb6f81Andreas Huber return (me->mFlags & PREPARE_CANCELLED) == 0; 1799e966fb05c7e67a7f5dce65024de60aac83eb6f81Andreas Huber} 1800e966fb05c7e67a7f5dce65024de60aac83eb6f81Andreas Huber 1801c23f12af0394aa2f6651968a3c8840f1af317aa1Andreas Hubervoid AwesomePlayer::onPrepareAsyncEvent() { 18028650e1960905097f6f1d6aa462ccb1c93c656834Andreas Huber Mutex::Autolock autoLock(mLock); 1803bd22c52280179b29eefac91ef7e7bbbc33d25904Andreas Huber 18048650e1960905097f6f1d6aa462ccb1c93c656834Andreas Huber if (mFlags & PREPARE_CANCELLED) { 18058650e1960905097f6f1d6aa462ccb1c93c656834Andreas Huber LOGI("prepare was cancelled before doing anything"); 18068650e1960905097f6f1d6aa462ccb1c93c656834Andreas Huber abortPrepare(UNKNOWN_ERROR); 18078650e1960905097f6f1d6aa462ccb1c93c656834Andreas Huber return; 18088650e1960905097f6f1d6aa462ccb1c93c656834Andreas Huber } 1809e94bd14078d327ef2f800e69907efce641a13272Andreas Huber 18108650e1960905097f6f1d6aa462ccb1c93c656834Andreas Huber if (mUri.size() > 0) { 18118650e1960905097f6f1d6aa462ccb1c93c656834Andreas Huber status_t err = finishSetDataSource_l(); 1812bd22c52280179b29eefac91ef7e7bbbc33d25904Andreas Huber 18138650e1960905097f6f1d6aa462ccb1c93c656834Andreas Huber if (err != OK) { 18148650e1960905097f6f1d6aa462ccb1c93c656834Andreas Huber abortPrepare(err); 18158650e1960905097f6f1d6aa462ccb1c93c656834Andreas Huber return; 1816bd22c52280179b29eefac91ef7e7bbbc33d25904Andreas Huber } 18178650e1960905097f6f1d6aa462ccb1c93c656834Andreas Huber } 1818bd22c52280179b29eefac91ef7e7bbbc33d25904Andreas Huber 18198650e1960905097f6f1d6aa462ccb1c93c656834Andreas Huber if (mVideoTrack != NULL && mVideoSource == NULL) { 18208650e1960905097f6f1d6aa462ccb1c93c656834Andreas Huber status_t err = initVideoDecoder(); 18211322e7ebc33e8e161fb73cd47e43dd93357608e4Andreas Huber 18228650e1960905097f6f1d6aa462ccb1c93c656834Andreas Huber if (err != OK) { 18238650e1960905097f6f1d6aa462ccb1c93c656834Andreas Huber abortPrepare(err); 18248650e1960905097f6f1d6aa462ccb1c93c656834Andreas Huber return; 18251322e7ebc33e8e161fb73cd47e43dd93357608e4Andreas Huber } 18268650e1960905097f6f1d6aa462ccb1c93c656834Andreas Huber } 18271322e7ebc33e8e161fb73cd47e43dd93357608e4Andreas Huber 18288650e1960905097f6f1d6aa462ccb1c93c656834Andreas Huber if (mAudioTrack != NULL && mAudioSource == NULL) { 18298650e1960905097f6f1d6aa462ccb1c93c656834Andreas Huber status_t err = initAudioDecoder(); 18301322e7ebc33e8e161fb73cd47e43dd93357608e4Andreas Huber 18318650e1960905097f6f1d6aa462ccb1c93c656834Andreas Huber if (err != OK) { 18328650e1960905097f6f1d6aa462ccb1c93c656834Andreas Huber abortPrepare(err); 18338650e1960905097f6f1d6aa462ccb1c93c656834Andreas Huber return; 18341322e7ebc33e8e161fb73cd47e43dd93357608e4Andreas Huber } 1835c23f12af0394aa2f6651968a3c8840f1af317aa1Andreas Huber } 1836c23f12af0394aa2f6651968a3c8840f1af317aa1Andreas Huber 18376a05c9e912aeb8bfe1ef99516def91a177a481b6Andreas Huber mFlags |= PREPARING_CONNECTED; 18386a05c9e912aeb8bfe1ef99516def91a177a481b6Andreas Huber 18398650e1960905097f6f1d6aa462ccb1c93c656834Andreas Huber if (mCachedSource != NULL || mRTSPController != NULL) { 18408650e1960905097f6f1d6aa462ccb1c93c656834Andreas Huber postBufferingEvent_l(); 18418650e1960905097f6f1d6aa462ccb1c93c656834Andreas Huber } else { 18428650e1960905097f6f1d6aa462ccb1c93c656834Andreas Huber finishAsyncPrepare_l(); 18438650e1960905097f6f1d6aa462ccb1c93c656834Andreas Huber } 18448650e1960905097f6f1d6aa462ccb1c93c656834Andreas Huber} 1845c23f12af0394aa2f6651968a3c8840f1af317aa1Andreas Huber 18468650e1960905097f6f1d6aa462ccb1c93c656834Andreas Hubervoid AwesomePlayer::finishAsyncPrepare_l() { 1847bd22c52280179b29eefac91ef7e7bbbc33d25904Andreas Huber if (mIsAsyncPrepare) { 18485daeb129a2c2ba3d14ccd94af283b5f561c783eaAndreas Huber if (mVideoSource == NULL) { 1849bd22c52280179b29eefac91ef7e7bbbc33d25904Andreas Huber notifyListener_l(MEDIA_SET_VIDEO_SIZE, 0, 0); 1850bd22c52280179b29eefac91ef7e7bbbc33d25904Andreas Huber } else { 18515daeb129a2c2ba3d14ccd94af283b5f561c783eaAndreas Huber notifyVideoSize_l(); 1852bd22c52280179b29eefac91ef7e7bbbc33d25904Andreas Huber } 1853c23f12af0394aa2f6651968a3c8840f1af317aa1Andreas Huber 1854bd22c52280179b29eefac91ef7e7bbbc33d25904Andreas Huber notifyListener_l(MEDIA_PREPARED); 1855bd22c52280179b29eefac91ef7e7bbbc33d25904Andreas Huber } 1856c23f12af0394aa2f6651968a3c8840f1af317aa1Andreas Huber 1857bd22c52280179b29eefac91ef7e7bbbc33d25904Andreas Huber mPrepareResult = OK; 18586a05c9e912aeb8bfe1ef99516def91a177a481b6Andreas Huber mFlags &= ~(PREPARING|PREPARE_CANCELLED|PREPARING_CONNECTED); 1859bd22c52280179b29eefac91ef7e7bbbc33d25904Andreas Huber mFlags |= PREPARED; 1860c23f12af0394aa2f6651968a3c8840f1af317aa1Andreas Huber mAsyncPrepareEvent = NULL; 1861bd22c52280179b29eefac91ef7e7bbbc33d25904Andreas Huber mPreparedCondition.broadcast(); 1862c23f12af0394aa2f6651968a3c8840f1af317aa1Andreas Huber} 1863c23f12af0394aa2f6651968a3c8840f1af317aa1Andreas Huber 1864acdd9d0f59c3d8bdc3de80664a609527ec3d21e2Andreas Huberuint32_t AwesomePlayer::flags() const { 1865acdd9d0f59c3d8bdc3de80664a609527ec3d21e2Andreas Huber return mExtractorFlags; 1866acdd9d0f59c3d8bdc3de80664a609527ec3d21e2Andreas Huber} 1867acdd9d0f59c3d8bdc3de80664a609527ec3d21e2Andreas Huber 186884b343f29063fbfa2ee61b2e3d37ba059ca507d4Andreas Hubervoid AwesomePlayer::postAudioEOS(int64_t delayUs) { 186984b343f29063fbfa2ee61b2e3d37ba059ca507d4Andreas Huber postCheckAudioStatusEvent_l(delayUs); 1870ed54ad0f8619ae416b0968ade6248894cbfc4dbaAndreas Huber} 1871ed54ad0f8619ae416b0968ade6248894cbfc4dbaAndreas Huber 1872ed54ad0f8619ae416b0968ade6248894cbfc4dbaAndreas Hubervoid AwesomePlayer::postAudioSeekComplete() { 187384b343f29063fbfa2ee61b2e3d37ba059ca507d4Andreas Huber postCheckAudioStatusEvent_l(0 /* delayUs */); 1874ed54ad0f8619ae416b0968ade6248894cbfc4dbaAndreas Huber} 1875ed54ad0f8619ae416b0968ade6248894cbfc4dbaAndreas Huber 1876bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber} // namespace android 1877