AwesomePlayer.cpp revision 83ed9d41b5aea53a5f3f0ae2fa14e101c079a12a
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 176c00983982d167bdb348c437f0480a480f38696cGlenn Kasten#undef 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" 27681755fc0d0797506456f46a2a10555916d6be32Andreas Huber#include "include/DRMExtractor.h" 28733b7729ea462fae9c6899456444e28fef1c757cAndreas Huber#include "include/SoftwareRenderer.h" 290a5baa9b411fe086013d2a5e9126ed63fbad046cAndreas Huber#include "include/NuCachedSource2.h" 300a5baa9b411fe086013d2a5e9126ed63fbad046cAndreas Huber#include "include/ThrottledSource.h" 31bff07d0b22a5ee2d9f044f6cb5e4be1532017ab0Andreas Huber#include "include/MPEG2TSExtractor.h" 32681755fc0d0797506456f46a2a10555916d6be32Andreas Huber#include "include/WVMExtractor.h" 33bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber 34965d08ba16ee82bc85f69546360c18e7da907406Gloria Wang#include "timedtext/TimedTextPlayer.h" 35965d08ba16ee82bc85f69546360c18e7da907406Gloria Wang 364844ac54e8b5997c3b03872dbafe8ebed4787517Andreas Huber#include <binder/IPCThreadState.h> 377cf180c9bff69e5cc4a2f4e53b432db45ebbebabGloria Wang#include <binder/IServiceManager.h> 387cf180c9bff69e5cc4a2f4e53b432db45ebbebabGloria Wang#include <media/IMediaPlayerService.h> 39e2b1028852120bcfded33b8f06f66b780437fe92Andreas Huber#include <media/stagefright/foundation/hexdump.h> 40e2b1028852120bcfded33b8f06f66b780437fe92Andreas Huber#include <media/stagefright/foundation/ADebug.h> 41bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber#include <media/stagefright/AudioPlayer.h> 42bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber#include <media/stagefright/DataSource.h> 43bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber#include <media/stagefright/FileSource.h> 44bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber#include <media/stagefright/MediaBuffer.h> 45717826ececd8d39596f62418677721d70776add1Andreas Huber#include <media/stagefright/MediaDefs.h> 46bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber#include <media/stagefright/MediaExtractor.h> 47bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber#include <media/stagefright/MediaSource.h> 48bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber#include <media/stagefright/MetaData.h> 49bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber#include <media/stagefright/OMXCodec.h> 50717826ececd8d39596f62418677721d70776add1Andreas Huber 515daeb129a2c2ba3d14ccd94af283b5f561c783eaAndreas Huber#include <surfaceflinger/Surface.h> 521173118eace0e9e347cb007f0da817cee87579edGlenn Kasten#include <gui/ISurfaceTexture.h> 531173118eace0e9e347cb007f0da817cee87579edGlenn Kasten#include <gui/SurfaceTextureClient.h> 542eb62955eb84b97695e8a7e56e14310cbb86412bGlenn Kasten#include <surfaceflinger/ISurfaceComposer.h> 553cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian 56cf7b9c7aae758ac0b99833915053c63c2ac46e09Andreas Huber#include <media/stagefright/foundation/ALooper.h> 5714acc736e336cbd6026df781d4f411e908831815Andreas Huber#include <media/stagefright/foundation/AMessage.h> 58e71d10e7ad55ccbcb0756c007caef1c959090384Andreas Huber 59eabd34665adc284525fe7337ad5c56a8b92964efGlenn Kasten#include <cutils/properties.h> 60eabd34665adc284525fe7337ad5c56a8b92964efGlenn Kasten 61e332a9181cf6a3155ed1a0fd2afc212ccb1f2753Andreas Huber#define USE_SURFACE_ALLOC 1 62e332a9181cf6a3155ed1a0fd2afc212ccb1f2753Andreas Huber 63bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Hubernamespace android { 64bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber 658650e1960905097f6f1d6aa462ccb1c93c656834Andreas Huberstatic int64_t kLowWaterMarkUs = 2000000ll; // 2secs 6683ed9d41b5aea53a5f3f0ae2fa14e101c079a12aGloria Wangstatic int64_t kHighWaterMarkUs = 5000000ll; // 5secs 67100a4408968b90e314526185d572c72ea4cc784aAndreas Huberstatic int64_t kHighWaterMarkRTSPUs = 4000000ll; // 4secs 68ac05c317cd818701535c5d72ce90da98c4bae75bAndreas Huberstatic const size_t kLowWaterMarkBytes = 40000; 69ac05c317cd818701535c5d72ce90da98c4bae75bAndreas Huberstatic const size_t kHighWaterMarkBytes = 200000; 708650e1960905097f6f1d6aa462ccb1c93c656834Andreas Huber 71bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huberstruct AwesomeEvent : public TimedEventQueue::Event { 72c23f12af0394aa2f6651968a3c8840f1af317aa1Andreas Huber AwesomeEvent( 73c23f12af0394aa2f6651968a3c8840f1af317aa1Andreas Huber AwesomePlayer *player, 74c23f12af0394aa2f6651968a3c8840f1af317aa1Andreas Huber void (AwesomePlayer::*method)()) 75bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber : mPlayer(player), 76c23f12af0394aa2f6651968a3c8840f1af317aa1Andreas Huber mMethod(method) { 77bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber } 78bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber 79bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huberprotected: 80bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber virtual ~AwesomeEvent() {} 81bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber 82bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber virtual void fire(TimedEventQueue *queue, int64_t /* now_us */) { 83c23f12af0394aa2f6651968a3c8840f1af317aa1Andreas Huber (mPlayer->*mMethod)(); 84bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber } 85bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber 86bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huberprivate: 87bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber AwesomePlayer *mPlayer; 88c23f12af0394aa2f6651968a3c8840f1af317aa1Andreas Huber void (AwesomePlayer::*mMethod)(); 89bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber 90bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber AwesomeEvent(const AwesomeEvent &); 91bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber AwesomeEvent &operator=(const AwesomeEvent &); 92bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber}; 93bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber 94733b7729ea462fae9c6899456444e28fef1c757cAndreas Huberstruct AwesomeLocalRenderer : public AwesomeRenderer { 95733b7729ea462fae9c6899456444e28fef1c757cAndreas Huber AwesomeLocalRenderer( 961173118eace0e9e347cb007f0da817cee87579edGlenn Kasten const sp<ANativeWindow> &nativeWindow, const sp<MetaData> &meta) 971173118eace0e9e347cb007f0da817cee87579edGlenn Kasten : mTarget(new SoftwareRenderer(nativeWindow, meta)) { 98733b7729ea462fae9c6899456444e28fef1c757cAndreas Huber } 99733b7729ea462fae9c6899456444e28fef1c757cAndreas Huber 100733b7729ea462fae9c6899456444e28fef1c757cAndreas Huber virtual void render(MediaBuffer *buffer) { 101fa090f541bb84a546af2ec834e91a032ff10e66eAndreas Huber render((const uint8_t *)buffer->data() + buffer->range_offset(), 102fa090f541bb84a546af2ec834e91a032ff10e66eAndreas Huber buffer->range_length()); 103fa090f541bb84a546af2ec834e91a032ff10e66eAndreas Huber } 104fa090f541bb84a546af2ec834e91a032ff10e66eAndreas Huber 105fa090f541bb84a546af2ec834e91a032ff10e66eAndreas Huber void render(const void *data, size_t size) { 106fa090f541bb84a546af2ec834e91a032ff10e66eAndreas Huber mTarget->render(data, size, NULL); 107733b7729ea462fae9c6899456444e28fef1c757cAndreas Huber } 108733b7729ea462fae9c6899456444e28fef1c757cAndreas Huber 109733b7729ea462fae9c6899456444e28fef1c757cAndreas Huberprotected: 110733b7729ea462fae9c6899456444e28fef1c757cAndreas Huber virtual ~AwesomeLocalRenderer() { 111733b7729ea462fae9c6899456444e28fef1c757cAndreas Huber delete mTarget; 112733b7729ea462fae9c6899456444e28fef1c757cAndreas Huber mTarget = NULL; 113733b7729ea462fae9c6899456444e28fef1c757cAndreas Huber } 114733b7729ea462fae9c6899456444e28fef1c757cAndreas Huber 115733b7729ea462fae9c6899456444e28fef1c757cAndreas Huberprivate: 1160a5ca668c6f7d45706e9aec4a1dfec0aacc6d233Andreas Huber SoftwareRenderer *mTarget; 117988e3f0b2c74095deae580157c57935a98573052Andreas Huber 118733b7729ea462fae9c6899456444e28fef1c757cAndreas Huber AwesomeLocalRenderer(const AwesomeLocalRenderer &); 119733b7729ea462fae9c6899456444e28fef1c757cAndreas Huber AwesomeLocalRenderer &operator=(const AwesomeLocalRenderer &);; 120733b7729ea462fae9c6899456444e28fef1c757cAndreas Huber}; 121733b7729ea462fae9c6899456444e28fef1c757cAndreas Huber 1226a9da9fc558263548ebfbae2cbf177eb7454a41bJamie Gennisstruct AwesomeNativeWindowRenderer : public AwesomeRenderer { 123ba529e486dde15fe75ea1b48570f9d60a4cf3c48Andreas Huber AwesomeNativeWindowRenderer( 124ba529e486dde15fe75ea1b48570f9d60a4cf3c48Andreas Huber const sp<ANativeWindow> &nativeWindow, 125ba529e486dde15fe75ea1b48570f9d60a4cf3c48Andreas Huber int32_t rotationDegrees) 1266a9da9fc558263548ebfbae2cbf177eb7454a41bJamie Gennis : mNativeWindow(nativeWindow) { 127ba529e486dde15fe75ea1b48570f9d60a4cf3c48Andreas Huber applyRotation(rotationDegrees); 1286a9da9fc558263548ebfbae2cbf177eb7454a41bJamie Gennis } 1296a9da9fc558263548ebfbae2cbf177eb7454a41bJamie Gennis 1306a9da9fc558263548ebfbae2cbf177eb7454a41bJamie Gennis virtual void render(MediaBuffer *buffer) { 131593e2773f616a926af45e74359e21a898c89875fGlenn Kasten int64_t timeUs; 132593e2773f616a926af45e74359e21a898c89875fGlenn Kasten CHECK(buffer->meta_data()->findInt64(kKeyTime, &timeUs)); 133593e2773f616a926af45e74359e21a898c89875fGlenn Kasten native_window_set_buffers_timestamp(mNativeWindow.get(), timeUs * 1000); 1346a9da9fc558263548ebfbae2cbf177eb7454a41bJamie Gennis status_t err = mNativeWindow->queueBuffer( 1356a9da9fc558263548ebfbae2cbf177eb7454a41bJamie Gennis mNativeWindow.get(), buffer->graphicBuffer().get()); 1366a9da9fc558263548ebfbae2cbf177eb7454a41bJamie Gennis if (err != 0) { 1376a9da9fc558263548ebfbae2cbf177eb7454a41bJamie Gennis LOGE("queueBuffer failed with error %s (%d)", strerror(-err), 1386a9da9fc558263548ebfbae2cbf177eb7454a41bJamie Gennis -err); 1396a9da9fc558263548ebfbae2cbf177eb7454a41bJamie Gennis return; 1406a9da9fc558263548ebfbae2cbf177eb7454a41bJamie Gennis } 1416a9da9fc558263548ebfbae2cbf177eb7454a41bJamie Gennis 1426a9da9fc558263548ebfbae2cbf177eb7454a41bJamie Gennis sp<MetaData> metaData = buffer->meta_data(); 1436a9da9fc558263548ebfbae2cbf177eb7454a41bJamie Gennis metaData->setInt32(kKeyRendered, 1); 1446a9da9fc558263548ebfbae2cbf177eb7454a41bJamie Gennis } 1456a9da9fc558263548ebfbae2cbf177eb7454a41bJamie Gennis 1466a9da9fc558263548ebfbae2cbf177eb7454a41bJamie Gennisprotected: 1476a9da9fc558263548ebfbae2cbf177eb7454a41bJamie Gennis virtual ~AwesomeNativeWindowRenderer() {} 1486a9da9fc558263548ebfbae2cbf177eb7454a41bJamie Gennis 1496a9da9fc558263548ebfbae2cbf177eb7454a41bJamie Gennisprivate: 1506a9da9fc558263548ebfbae2cbf177eb7454a41bJamie Gennis sp<ANativeWindow> mNativeWindow; 1516a9da9fc558263548ebfbae2cbf177eb7454a41bJamie Gennis 152ba529e486dde15fe75ea1b48570f9d60a4cf3c48Andreas Huber void applyRotation(int32_t rotationDegrees) { 153ba529e486dde15fe75ea1b48570f9d60a4cf3c48Andreas Huber uint32_t transform; 154ba529e486dde15fe75ea1b48570f9d60a4cf3c48Andreas Huber switch (rotationDegrees) { 155ba529e486dde15fe75ea1b48570f9d60a4cf3c48Andreas Huber case 0: transform = 0; break; 156ba529e486dde15fe75ea1b48570f9d60a4cf3c48Andreas Huber case 90: transform = HAL_TRANSFORM_ROT_90; break; 157ba529e486dde15fe75ea1b48570f9d60a4cf3c48Andreas Huber case 180: transform = HAL_TRANSFORM_ROT_180; break; 158ba529e486dde15fe75ea1b48570f9d60a4cf3c48Andreas Huber case 270: transform = HAL_TRANSFORM_ROT_270; break; 159ba529e486dde15fe75ea1b48570f9d60a4cf3c48Andreas Huber default: transform = 0; break; 160ba529e486dde15fe75ea1b48570f9d60a4cf3c48Andreas Huber } 161ba529e486dde15fe75ea1b48570f9d60a4cf3c48Andreas Huber 162ba529e486dde15fe75ea1b48570f9d60a4cf3c48Andreas Huber if (transform) { 163ba529e486dde15fe75ea1b48570f9d60a4cf3c48Andreas Huber CHECK_EQ(0, native_window_set_buffers_transform( 164ba529e486dde15fe75ea1b48570f9d60a4cf3c48Andreas Huber mNativeWindow.get(), transform)); 165ba529e486dde15fe75ea1b48570f9d60a4cf3c48Andreas Huber } 166ba529e486dde15fe75ea1b48570f9d60a4cf3c48Andreas Huber } 167ba529e486dde15fe75ea1b48570f9d60a4cf3c48Andreas Huber 1686a9da9fc558263548ebfbae2cbf177eb7454a41bJamie Gennis AwesomeNativeWindowRenderer(const AwesomeNativeWindowRenderer &); 1696a9da9fc558263548ebfbae2cbf177eb7454a41bJamie Gennis AwesomeNativeWindowRenderer &operator=( 1706a9da9fc558263548ebfbae2cbf177eb7454a41bJamie Gennis const AwesomeNativeWindowRenderer &); 1716a9da9fc558263548ebfbae2cbf177eb7454a41bJamie Gennis}; 1726a9da9fc558263548ebfbae2cbf177eb7454a41bJamie Gennis 1737cf180c9bff69e5cc4a2f4e53b432db45ebbebabGloria Wang// To collect the decoder usage 1747cf180c9bff69e5cc4a2f4e53b432db45ebbebabGloria Wangvoid addBatteryData(uint32_t params) { 1757cf180c9bff69e5cc4a2f4e53b432db45ebbebabGloria Wang sp<IBinder> binder = 1767cf180c9bff69e5cc4a2f4e53b432db45ebbebabGloria Wang defaultServiceManager()->getService(String16("media.player")); 1777cf180c9bff69e5cc4a2f4e53b432db45ebbebabGloria Wang sp<IMediaPlayerService> service = interface_cast<IMediaPlayerService>(binder); 1787cf180c9bff69e5cc4a2f4e53b432db45ebbebabGloria Wang CHECK(service.get() != NULL); 1797cf180c9bff69e5cc4a2f4e53b432db45ebbebabGloria Wang 1807cf180c9bff69e5cc4a2f4e53b432db45ebbebabGloria Wang service->addBatteryData(params); 1817cf180c9bff69e5cc4a2f4e53b432db45ebbebabGloria Wang} 182e2b1028852120bcfded33b8f06f66b780437fe92Andreas Huber 1837cf180c9bff69e5cc4a2f4e53b432db45ebbebabGloria Wang//////////////////////////////////////////////////////////////////////////////// 184bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas HuberAwesomePlayer::AwesomePlayer() 1852e8ffaf95bd35358ecd14ddf00cddaf3abefe0a9Andreas Huber : mQueueStarted(false), 1869b80c2bdb205bc143104f54d0743b6eedd67b14eAndreas Huber mUIDValid(false), 1872e8ffaf95bd35358ecd14ddf00cddaf3abefe0a9Andreas Huber mTimeSource(NULL), 188fa090f541bb84a546af2ec834e91a032ff10e66eAndreas Huber mVideoRendererIsPreview(false), 189bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber mAudioPlayer(NULL), 190b45c01c2b8588ff431b511151666a55a39f0a6aeJames Dong mDisplayWidth(0), 191b45c01c2b8588ff431b511151666a55a39f0a6aeJames Dong mDisplayHeight(0), 192bd22c52280179b29eefac91ef7e7bbbc33d25904Andreas Huber mFlags(0), 193acdd9d0f59c3d8bdc3de80664a609527ec3d21e2Andreas Huber mExtractorFlags(0), 1947b3396acc702451be9bafb19d7fe26d55d43a316Andreas Huber mVideoBuffer(NULL), 195150694cda0842d38a9358fe8d1fcb4fb4a76599eAndreas Huber mDecryptHandle(NULL), 1967a1e3e81264189e23a1db2b174e1b5a5d4c7d1c3Gloria Wang mLastVideoTimeUs(-1), 1977a1e3e81264189e23a1db2b174e1b5a5d4c7d1c3Gloria Wang mTextPlayer(NULL) { 198e2b1028852120bcfded33b8f06f66b780437fe92Andreas Huber CHECK_EQ(mClient.connect(), (status_t)OK); 199bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber 200bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber DataSource::RegisterDefaultSniffers(); 201bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber 202c23f12af0394aa2f6651968a3c8840f1af317aa1Andreas Huber mVideoEvent = new AwesomeEvent(this, &AwesomePlayer::onVideoEvent); 203bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber mVideoEventPending = false; 204c23f12af0394aa2f6651968a3c8840f1af317aa1Andreas Huber mStreamDoneEvent = new AwesomeEvent(this, &AwesomePlayer::onStreamDone); 205bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber mStreamDoneEventPending = false; 206c23f12af0394aa2f6651968a3c8840f1af317aa1Andreas Huber mBufferingEvent = new AwesomeEvent(this, &AwesomePlayer::onBufferingUpdate); 20766b0a35c9a4136a84c3f73b1b25fcb5220138b95Andreas Huber mBufferingEventPending = false; 208145e68fc778275963189b02a1adcbe27cce4d769Andreas Huber mVideoLagEvent = new AwesomeEvent(this, &AwesomePlayer::onVideoLagUpdate); 209145e68fc778275963189b02a1adcbe27cce4d769Andreas Huber mVideoEventPending = false; 210c23f12af0394aa2f6651968a3c8840f1af317aa1Andreas Huber 211c23f12af0394aa2f6651968a3c8840f1af317aa1Andreas Huber mCheckAudioStatusEvent = new AwesomeEvent( 212c23f12af0394aa2f6651968a3c8840f1af317aa1Andreas Huber this, &AwesomePlayer::onCheckAudioStatus); 213c23f12af0394aa2f6651968a3c8840f1af317aa1Andreas Huber 2141862a33b246249630b654182afb5914da3480d4cAndreas Huber mAudioStatusEventPending = false; 215bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber 216bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber reset(); 217bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber} 218bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber 219bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas HuberAwesomePlayer::~AwesomePlayer() { 2202e8ffaf95bd35358ecd14ddf00cddaf3abefe0a9Andreas Huber if (mQueueStarted) { 2212e8ffaf95bd35358ecd14ddf00cddaf3abefe0a9Andreas Huber mQueue.stop(); 2222e8ffaf95bd35358ecd14ddf00cddaf3abefe0a9Andreas Huber } 223bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber 224bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber reset(); 225bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber 226bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber mClient.disconnect(); 227bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber} 228bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber 22966b0a35c9a4136a84c3f73b1b25fcb5220138b95Andreas Hubervoid AwesomePlayer::cancelPlayerEvents(bool keepBufferingGoing) { 230bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber mQueue.cancelEvent(mVideoEvent->eventID()); 231bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber mVideoEventPending = false; 232bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber mQueue.cancelEvent(mStreamDoneEvent->eventID()); 233bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber mStreamDoneEventPending = false; 2341862a33b246249630b654182afb5914da3480d4cAndreas Huber mQueue.cancelEvent(mCheckAudioStatusEvent->eventID()); 2351862a33b246249630b654182afb5914da3480d4cAndreas Huber mAudioStatusEventPending = false; 236145e68fc778275963189b02a1adcbe27cce4d769Andreas Huber mQueue.cancelEvent(mVideoLagEvent->eventID()); 237145e68fc778275963189b02a1adcbe27cce4d769Andreas Huber mVideoLagEventPending = false; 23866b0a35c9a4136a84c3f73b1b25fcb5220138b95Andreas Huber 23966b0a35c9a4136a84c3f73b1b25fcb5220138b95Andreas Huber if (!keepBufferingGoing) { 24066b0a35c9a4136a84c3f73b1b25fcb5220138b95Andreas Huber mQueue.cancelEvent(mBufferingEvent->eventID()); 24166b0a35c9a4136a84c3f73b1b25fcb5220138b95Andreas Huber mBufferingEventPending = false; 24266b0a35c9a4136a84c3f73b1b25fcb5220138b95Andreas Huber } 243bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber} 244bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber 2450726045216f576e97672ebeefc265d39c4ebaaa5Andreas Hubervoid AwesomePlayer::setListener(const wp<MediaPlayerBase> &listener) { 246bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber Mutex::Autolock autoLock(mLock); 247bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber mListener = listener; 248bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber} 249bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber 2509b80c2bdb205bc143104f54d0743b6eedd67b14eAndreas Hubervoid AwesomePlayer::setUID(uid_t uid) { 2519b80c2bdb205bc143104f54d0743b6eedd67b14eAndreas Huber LOGI("AwesomePlayer running on behalf of uid %d", uid); 2529b80c2bdb205bc143104f54d0743b6eedd67b14eAndreas Huber 2539b80c2bdb205bc143104f54d0743b6eedd67b14eAndreas Huber mUID = uid; 2549b80c2bdb205bc143104f54d0743b6eedd67b14eAndreas Huber mUIDValid = true; 2559b80c2bdb205bc143104f54d0743b6eedd67b14eAndreas Huber} 2569b80c2bdb205bc143104f54d0743b6eedd67b14eAndreas Huber 2575561ccf4a8db88a2e44eac1b3ed13b4ff53a7f20Andreas Huberstatus_t AwesomePlayer::setDataSource( 2585561ccf4a8db88a2e44eac1b3ed13b4ff53a7f20Andreas Huber const char *uri, const KeyedVector<String8, String8> *headers) { 259bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber Mutex::Autolock autoLock(mLock); 2607b3396acc702451be9bafb19d7fe26d55d43a316Andreas Huber return setDataSource_l(uri, headers); 2617b3396acc702451be9bafb19d7fe26d55d43a316Andreas Huber} 262bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber 2637b3396acc702451be9bafb19d7fe26d55d43a316Andreas Huberstatus_t AwesomePlayer::setDataSource_l( 2647b3396acc702451be9bafb19d7fe26d55d43a316Andreas Huber const char *uri, const KeyedVector<String8, String8> *headers) { 265bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber reset_l(); 266bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber 267bd22c52280179b29eefac91ef7e7bbbc33d25904Andreas Huber mUri = uri; 26866b0a35c9a4136a84c3f73b1b25fcb5220138b95Andreas Huber 269bd22c52280179b29eefac91ef7e7bbbc33d25904Andreas Huber if (headers) { 270bd22c52280179b29eefac91ef7e7bbbc33d25904Andreas Huber mUriHeaders = *headers; 2717314fa17093d514199fedcb55ac41136a1b31cb3Andreas Huber 2727314fa17093d514199fedcb55ac41136a1b31cb3Andreas Huber ssize_t index = mUriHeaders.indexOfKey(String8("x-hide-urls-from-log")); 2737314fa17093d514199fedcb55ac41136a1b31cb3Andreas Huber if (index >= 0) { 2747314fa17093d514199fedcb55ac41136a1b31cb3Andreas Huber // Browser is in "incognito" mode, suppress logging URLs. 2757314fa17093d514199fedcb55ac41136a1b31cb3Andreas Huber 2767314fa17093d514199fedcb55ac41136a1b31cb3Andreas Huber // This isn't something that should be passed to the server. 2777314fa17093d514199fedcb55ac41136a1b31cb3Andreas Huber mUriHeaders.removeItemsAt(index); 2787314fa17093d514199fedcb55ac41136a1b31cb3Andreas Huber 279a0b1d4b161599c2bb2a47119e50c51e75bbe980eAndreas Huber modifyFlags(INCOGNITO, SET); 2807314fa17093d514199fedcb55ac41136a1b31cb3Andreas Huber } 2817314fa17093d514199fedcb55ac41136a1b31cb3Andreas Huber } 2827314fa17093d514199fedcb55ac41136a1b31cb3Andreas Huber 2837314fa17093d514199fedcb55ac41136a1b31cb3Andreas Huber if (!(mFlags & INCOGNITO)) { 2847314fa17093d514199fedcb55ac41136a1b31cb3Andreas Huber LOGI("setDataSource_l('%s')", mUri.string()); 2857314fa17093d514199fedcb55ac41136a1b31cb3Andreas Huber } else { 2867314fa17093d514199fedcb55ac41136a1b31cb3Andreas Huber LOGI("setDataSource_l(URL suppressed)"); 28766b0a35c9a4136a84c3f73b1b25fcb5220138b95Andreas Huber } 28866b0a35c9a4136a84c3f73b1b25fcb5220138b95Andreas Huber 289bd22c52280179b29eefac91ef7e7bbbc33d25904Andreas Huber // The actual work will be done during preparation in the call to 290bd22c52280179b29eefac91ef7e7bbbc33d25904Andreas Huber // ::finishSetDataSource_l to avoid blocking the calling thread in 291bd22c52280179b29eefac91ef7e7bbbc33d25904Andreas Huber // setDataSource for any significant time. 29266b0a35c9a4136a84c3f73b1b25fcb5220138b95Andreas Huber 293a0b1d4b161599c2bb2a47119e50c51e75bbe980eAndreas Huber { 294a0b1d4b161599c2bb2a47119e50c51e75bbe980eAndreas Huber Mutex::Autolock autoLock(mStatsLock); 295a0b1d4b161599c2bb2a47119e50c51e75bbe980eAndreas Huber mStats.mFd = -1; 296a0b1d4b161599c2bb2a47119e50c51e75bbe980eAndreas Huber mStats.mURI = mUri; 297a0b1d4b161599c2bb2a47119e50c51e75bbe980eAndreas Huber } 298a0b1d4b161599c2bb2a47119e50c51e75bbe980eAndreas Huber 299bd22c52280179b29eefac91ef7e7bbbc33d25904Andreas Huber return OK; 300bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber} 301bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber 302bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huberstatus_t AwesomePlayer::setDataSource( 303bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber int fd, int64_t offset, int64_t length) { 304bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber Mutex::Autolock autoLock(mLock); 305bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber 306bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber reset_l(); 307bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber 3087b3396acc702451be9bafb19d7fe26d55d43a316Andreas Huber sp<DataSource> dataSource = new FileSource(fd, offset, length); 309bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber 3107b3396acc702451be9bafb19d7fe26d55d43a316Andreas Huber status_t err = dataSource->initCheck(); 311bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber 312bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber if (err != OK) { 313bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber return err; 314bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber } 315bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber 3167b3396acc702451be9bafb19d7fe26d55d43a316Andreas Huber mFileSource = dataSource; 3177b3396acc702451be9bafb19d7fe26d55d43a316Andreas Huber 318a0b1d4b161599c2bb2a47119e50c51e75bbe980eAndreas Huber { 319a0b1d4b161599c2bb2a47119e50c51e75bbe980eAndreas Huber Mutex::Autolock autoLock(mStatsLock); 320a0b1d4b161599c2bb2a47119e50c51e75bbe980eAndreas Huber mStats.mFd = fd; 321a0b1d4b161599c2bb2a47119e50c51e75bbe980eAndreas Huber mStats.mURI = String8(); 322a0b1d4b161599c2bb2a47119e50c51e75bbe980eAndreas Huber } 323a0b1d4b161599c2bb2a47119e50c51e75bbe980eAndreas Huber 3247b3396acc702451be9bafb19d7fe26d55d43a316Andreas Huber return setDataSource_l(dataSource); 3257b3396acc702451be9bafb19d7fe26d55d43a316Andreas Huber} 3267b3396acc702451be9bafb19d7fe26d55d43a316Andreas Huber 327e2b1028852120bcfded33b8f06f66b780437fe92Andreas Huberstatus_t AwesomePlayer::setDataSource(const sp<IStreamSource> &source) { 32885704836f33a199d7e442a23db82abbd5620d35dAndreas Huber return INVALID_OPERATION; 329e2b1028852120bcfded33b8f06f66b780437fe92Andreas Huber} 330e2b1028852120bcfded33b8f06f66b780437fe92Andreas Huber 3317b3396acc702451be9bafb19d7fe26d55d43a316Andreas Huberstatus_t AwesomePlayer::setDataSource_l( 3327b3396acc702451be9bafb19d7fe26d55d43a316Andreas Huber const sp<DataSource> &dataSource) { 3337b3396acc702451be9bafb19d7fe26d55d43a316Andreas Huber sp<MediaExtractor> extractor = MediaExtractor::Create(dataSource); 334bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber 335bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber if (extractor == NULL) { 336bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber return UNKNOWN_ERROR; 337bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber } 338bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber 339b5ce361d19e69fe156f7188c9ee0f4734b259874Gloria Wang dataSource->getDrmInfo(mDecryptHandle, &mDrmManagerClient); 3408f64134f749e4f7861a08a3063450fc714c4651dGloria Wang if (mDecryptHandle != NULL) { 3418f64134f749e4f7861a08a3063450fc714c4651dGloria Wang CHECK(mDrmManagerClient); 3428f64134f749e4f7861a08a3063450fc714c4651dGloria Wang if (RightsStatus::RIGHTS_VALID != mDecryptHandle->status) { 3437340743ce30766af6334bbd9acf813eb66dd5a60Gloria Wang notifyListener_l(MEDIA_ERROR, MEDIA_ERROR_UNKNOWN, ERROR_DRM_NO_LICENSE); 3448f64134f749e4f7861a08a3063450fc714c4651dGloria Wang } 345dcd25efb46c41c8d24a0a9cf61fb57f84149709eGloria Wang } 346dcd25efb46c41c8d24a0a9cf61fb57f84149709eGloria Wang 347bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber return setDataSource_l(extractor); 348bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber} 349bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber 350bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huberstatus_t AwesomePlayer::setDataSource_l(const sp<MediaExtractor> &extractor) { 3517fbdb0903dfbf70b314a74e64e28fb880cdb9247Andreas Huber // Attempt to approximate overall stream bitrate by summing all 3527fbdb0903dfbf70b314a74e64e28fb880cdb9247Andreas Huber // tracks' individual bitrates, if not all of them advertise bitrate, 3537fbdb0903dfbf70b314a74e64e28fb880cdb9247Andreas Huber // we have to fail. 3547fbdb0903dfbf70b314a74e64e28fb880cdb9247Andreas Huber 3557fbdb0903dfbf70b314a74e64e28fb880cdb9247Andreas Huber int64_t totalBitRate = 0; 3567fbdb0903dfbf70b314a74e64e28fb880cdb9247Andreas Huber 3577fbdb0903dfbf70b314a74e64e28fb880cdb9247Andreas Huber for (size_t i = 0; i < extractor->countTracks(); ++i) { 3587fbdb0903dfbf70b314a74e64e28fb880cdb9247Andreas Huber sp<MetaData> meta = extractor->getTrackMetaData(i); 3597fbdb0903dfbf70b314a74e64e28fb880cdb9247Andreas Huber 3607fbdb0903dfbf70b314a74e64e28fb880cdb9247Andreas Huber int32_t bitrate; 3617fbdb0903dfbf70b314a74e64e28fb880cdb9247Andreas Huber if (!meta->findInt32(kKeyBitRate, &bitrate)) { 362a0b1d4b161599c2bb2a47119e50c51e75bbe980eAndreas Huber const char *mime; 363a0b1d4b161599c2bb2a47119e50c51e75bbe980eAndreas Huber CHECK(meta->findCString(kKeyMIMEType, &mime)); 364a0b1d4b161599c2bb2a47119e50c51e75bbe980eAndreas Huber LOGW("track of type '%s' does not publish bitrate", mime); 365a0b1d4b161599c2bb2a47119e50c51e75bbe980eAndreas Huber 3667fbdb0903dfbf70b314a74e64e28fb880cdb9247Andreas Huber totalBitRate = -1; 3677fbdb0903dfbf70b314a74e64e28fb880cdb9247Andreas Huber break; 3687fbdb0903dfbf70b314a74e64e28fb880cdb9247Andreas Huber } 3697fbdb0903dfbf70b314a74e64e28fb880cdb9247Andreas Huber 3707fbdb0903dfbf70b314a74e64e28fb880cdb9247Andreas Huber totalBitRate += bitrate; 3717fbdb0903dfbf70b314a74e64e28fb880cdb9247Andreas Huber } 3727fbdb0903dfbf70b314a74e64e28fb880cdb9247Andreas Huber 3737fbdb0903dfbf70b314a74e64e28fb880cdb9247Andreas Huber mBitrate = totalBitRate; 3747fbdb0903dfbf70b314a74e64e28fb880cdb9247Andreas Huber 3757fbdb0903dfbf70b314a74e64e28fb880cdb9247Andreas Huber LOGV("mBitrate = %lld bits/sec", mBitrate); 3767fbdb0903dfbf70b314a74e64e28fb880cdb9247Andreas Huber 377a0b1d4b161599c2bb2a47119e50c51e75bbe980eAndreas Huber { 378a0b1d4b161599c2bb2a47119e50c51e75bbe980eAndreas Huber Mutex::Autolock autoLock(mStatsLock); 379a0b1d4b161599c2bb2a47119e50c51e75bbe980eAndreas Huber mStats.mBitrate = mBitrate; 380a0b1d4b161599c2bb2a47119e50c51e75bbe980eAndreas Huber mStats.mTracks.clear(); 381a0b1d4b161599c2bb2a47119e50c51e75bbe980eAndreas Huber mStats.mAudioTrackIndex = -1; 382a0b1d4b161599c2bb2a47119e50c51e75bbe980eAndreas Huber mStats.mVideoTrackIndex = -1; 383a0b1d4b161599c2bb2a47119e50c51e75bbe980eAndreas Huber } 384a0b1d4b161599c2bb2a47119e50c51e75bbe980eAndreas Huber 385bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber bool haveAudio = false; 386bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber bool haveVideo = false; 387bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber for (size_t i = 0; i < extractor->countTracks(); ++i) { 388bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber sp<MetaData> meta = extractor->getTrackMetaData(i); 389bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber 390bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber const char *mime; 391bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber CHECK(meta->findCString(kKeyMIMEType, &mime)); 392bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber 393bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber if (!haveVideo && !strncasecmp(mime, "video/", 6)) { 39488d8a83de12592635248aa1a3bd6b9ea46108501Andreas Huber setVideoSource(extractor->getTrack(i)); 39588d8a83de12592635248aa1a3bd6b9ea46108501Andreas Huber haveVideo = true; 396b45c01c2b8588ff431b511151666a55a39f0a6aeJames Dong 397b45c01c2b8588ff431b511151666a55a39f0a6aeJames Dong // Set the presentation/display size 398b45c01c2b8588ff431b511151666a55a39f0a6aeJames Dong int32_t displayWidth, displayHeight; 399b45c01c2b8588ff431b511151666a55a39f0a6aeJames Dong bool success = meta->findInt32(kKeyDisplayWidth, &displayWidth); 400b45c01c2b8588ff431b511151666a55a39f0a6aeJames Dong if (success) { 401b45c01c2b8588ff431b511151666a55a39f0a6aeJames Dong success = meta->findInt32(kKeyDisplayHeight, &displayHeight); 402b45c01c2b8588ff431b511151666a55a39f0a6aeJames Dong } 403b45c01c2b8588ff431b511151666a55a39f0a6aeJames Dong if (success) { 404b45c01c2b8588ff431b511151666a55a39f0a6aeJames Dong mDisplayWidth = displayWidth; 405b45c01c2b8588ff431b511151666a55a39f0a6aeJames Dong mDisplayHeight = displayHeight; 406b45c01c2b8588ff431b511151666a55a39f0a6aeJames Dong } 407b45c01c2b8588ff431b511151666a55a39f0a6aeJames Dong 408a0b1d4b161599c2bb2a47119e50c51e75bbe980eAndreas Huber { 409a0b1d4b161599c2bb2a47119e50c51e75bbe980eAndreas Huber Mutex::Autolock autoLock(mStatsLock); 410a0b1d4b161599c2bb2a47119e50c51e75bbe980eAndreas Huber mStats.mVideoTrackIndex = mStats.mTracks.size(); 411a0b1d4b161599c2bb2a47119e50c51e75bbe980eAndreas Huber mStats.mTracks.push(); 412a0b1d4b161599c2bb2a47119e50c51e75bbe980eAndreas Huber TrackStat *stat = 413a0b1d4b161599c2bb2a47119e50c51e75bbe980eAndreas Huber &mStats.mTracks.editItemAt(mStats.mVideoTrackIndex); 414a0b1d4b161599c2bb2a47119e50c51e75bbe980eAndreas Huber stat->mMIME = mime; 415a0b1d4b161599c2bb2a47119e50c51e75bbe980eAndreas Huber } 416bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber } else if (!haveAudio && !strncasecmp(mime, "audio/", 6)) { 41788d8a83de12592635248aa1a3bd6b9ea46108501Andreas Huber setAudioSource(extractor->getTrack(i)); 41888d8a83de12592635248aa1a3bd6b9ea46108501Andreas Huber haveAudio = true; 4198ae49d87b98d57d6758b0c51b95e28a6581a79f1Andreas Huber 420a0b1d4b161599c2bb2a47119e50c51e75bbe980eAndreas Huber { 421a0b1d4b161599c2bb2a47119e50c51e75bbe980eAndreas Huber Mutex::Autolock autoLock(mStatsLock); 422a0b1d4b161599c2bb2a47119e50c51e75bbe980eAndreas Huber mStats.mAudioTrackIndex = mStats.mTracks.size(); 423a0b1d4b161599c2bb2a47119e50c51e75bbe980eAndreas Huber mStats.mTracks.push(); 424a0b1d4b161599c2bb2a47119e50c51e75bbe980eAndreas Huber TrackStat *stat = 425a0b1d4b161599c2bb2a47119e50c51e75bbe980eAndreas Huber &mStats.mTracks.editItemAt(mStats.mAudioTrackIndex); 426a0b1d4b161599c2bb2a47119e50c51e75bbe980eAndreas Huber stat->mMIME = mime; 427a0b1d4b161599c2bb2a47119e50c51e75bbe980eAndreas Huber } 428a0b1d4b161599c2bb2a47119e50c51e75bbe980eAndreas Huber 4296954535ba64374e4e941cd83019a7af53edfb098Andreas Huber if (!strcasecmp(mime, MEDIA_MIMETYPE_AUDIO_VORBIS)) { 4306954535ba64374e4e941cd83019a7af53edfb098Andreas Huber // Only do this for vorbis audio, none of the other audio 4316954535ba64374e4e941cd83019a7af53edfb098Andreas Huber // formats even support this ringtone specific hack and 4326954535ba64374e4e941cd83019a7af53edfb098Andreas Huber // retrieving the metadata on some extractors may turn out 4336954535ba64374e4e941cd83019a7af53edfb098Andreas Huber // to be very expensive. 4346954535ba64374e4e941cd83019a7af53edfb098Andreas Huber sp<MetaData> fileMeta = extractor->getMetaData(); 4356954535ba64374e4e941cd83019a7af53edfb098Andreas Huber int32_t loop; 4366954535ba64374e4e941cd83019a7af53edfb098Andreas Huber if (fileMeta != NULL 4376954535ba64374e4e941cd83019a7af53edfb098Andreas Huber && fileMeta->findInt32(kKeyAutoLoop, &loop) && loop != 0) { 438a0b1d4b161599c2bb2a47119e50c51e75bbe980eAndreas Huber modifyFlags(AUTO_LOOPING, SET); 4396954535ba64374e4e941cd83019a7af53edfb098Andreas Huber } 4408ae49d87b98d57d6758b0c51b95e28a6581a79f1Andreas Huber } 4417a1e3e81264189e23a1db2b174e1b5a5d4c7d1c3Gloria Wang } else if (!strcasecmp(mime, MEDIA_MIMETYPE_TEXT_3GPP)) { 4427a1e3e81264189e23a1db2b174e1b5a5d4c7d1c3Gloria Wang addTextSource(extractor->getTrack(i)); 443bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber } 444bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber } 445bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber 446acdd9d0f59c3d8bdc3de80664a609527ec3d21e2Andreas Huber if (!haveAudio && !haveVideo) { 447acdd9d0f59c3d8bdc3de80664a609527ec3d21e2Andreas Huber return UNKNOWN_ERROR; 448acdd9d0f59c3d8bdc3de80664a609527ec3d21e2Andreas Huber } 449acdd9d0f59c3d8bdc3de80664a609527ec3d21e2Andreas Huber 450acdd9d0f59c3d8bdc3de80664a609527ec3d21e2Andreas Huber mExtractorFlags = extractor->flags(); 451acdd9d0f59c3d8bdc3de80664a609527ec3d21e2Andreas Huber 452acdd9d0f59c3d8bdc3de80664a609527ec3d21e2Andreas Huber return OK; 453bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber} 454bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber 455bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Hubervoid AwesomePlayer::reset() { 456bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber Mutex::Autolock autoLock(mLock); 457bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber reset_l(); 458bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber} 459bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber 460bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Hubervoid AwesomePlayer::reset_l() { 461b45c01c2b8588ff431b511151666a55a39f0a6aeJames Dong mDisplayWidth = 0; 462b45c01c2b8588ff431b511151666a55a39f0a6aeJames Dong mDisplayHeight = 0; 46365a170e3ac593a29abd0c76e9aa531fabad7f56dAndreas Huber 464dcd25efb46c41c8d24a0a9cf61fb57f84149709eGloria Wang if (mDecryptHandle != NULL) { 465dcd25efb46c41c8d24a0a9cf61fb57f84149709eGloria Wang mDrmManagerClient->setPlaybackStatus(mDecryptHandle, 466dcd25efb46c41c8d24a0a9cf61fb57f84149709eGloria Wang Playback::STOP, 0); 467dcd25efb46c41c8d24a0a9cf61fb57f84149709eGloria Wang mDecryptHandle = NULL; 468dcd25efb46c41c8d24a0a9cf61fb57f84149709eGloria Wang mDrmManagerClient = NULL; 469dcd25efb46c41c8d24a0a9cf61fb57f84149709eGloria Wang } 470dcd25efb46c41c8d24a0a9cf61fb57f84149709eGloria Wang 4717cf180c9bff69e5cc4a2f4e53b432db45ebbebabGloria Wang if (mFlags & PLAYING) { 4727cf180c9bff69e5cc4a2f4e53b432db45ebbebabGloria Wang uint32_t params = IMediaPlayerService::kBatteryDataTrackDecoder; 4737cf180c9bff69e5cc4a2f4e53b432db45ebbebabGloria Wang if ((mAudioSource != NULL) && (mAudioSource != mAudioTrack)) { 4747cf180c9bff69e5cc4a2f4e53b432db45ebbebabGloria Wang params |= IMediaPlayerService::kBatteryDataTrackAudio; 4757cf180c9bff69e5cc4a2f4e53b432db45ebbebabGloria Wang } 4767cf180c9bff69e5cc4a2f4e53b432db45ebbebabGloria Wang if (mVideoSource != NULL) { 4777cf180c9bff69e5cc4a2f4e53b432db45ebbebabGloria Wang params |= IMediaPlayerService::kBatteryDataTrackVideo; 4787cf180c9bff69e5cc4a2f4e53b432db45ebbebabGloria Wang } 4797cf180c9bff69e5cc4a2f4e53b432db45ebbebabGloria Wang addBatteryData(params); 4807cf180c9bff69e5cc4a2f4e53b432db45ebbebabGloria Wang } 4817cf180c9bff69e5cc4a2f4e53b432db45ebbebabGloria Wang 482e94bd14078d327ef2f800e69907efce641a13272Andreas Huber if (mFlags & PREPARING) { 483a0b1d4b161599c2bb2a47119e50c51e75bbe980eAndreas Huber modifyFlags(PREPARE_CANCELLED, SET); 484e94bd14078d327ef2f800e69907efce641a13272Andreas Huber if (mConnectingDataSource != NULL) { 485e94bd14078d327ef2f800e69907efce641a13272Andreas Huber LOGI("interrupting the connection process"); 486e94bd14078d327ef2f800e69907efce641a13272Andreas Huber mConnectingDataSource->disconnect(); 487f1958f9442bc937e1f8c8d9175901500b944b021Andreas Huber } else if (mConnectingRTSPController != NULL) { 488f1958f9442bc937e1f8c8d9175901500b944b021Andreas Huber LOGI("interrupting the connection process"); 489f1958f9442bc937e1f8c8d9175901500b944b021Andreas Huber mConnectingRTSPController->disconnect(); 490e94bd14078d327ef2f800e69907efce641a13272Andreas Huber } 4916a05c9e912aeb8bfe1ef99516def91a177a481b6Andreas Huber 4926a05c9e912aeb8bfe1ef99516def91a177a481b6Andreas Huber if (mFlags & PREPARING_CONNECTED) { 4936a05c9e912aeb8bfe1ef99516def91a177a481b6Andreas Huber // We are basically done preparing, we're just buffering 4946a05c9e912aeb8bfe1ef99516def91a177a481b6Andreas Huber // enough data to start playback, we can safely interrupt that. 4956a05c9e912aeb8bfe1ef99516def91a177a481b6Andreas Huber finishAsyncPrepare_l(); 4966a05c9e912aeb8bfe1ef99516def91a177a481b6Andreas Huber } 497e94bd14078d327ef2f800e69907efce641a13272Andreas Huber } 498e94bd14078d327ef2f800e69907efce641a13272Andreas Huber 499bd22c52280179b29eefac91ef7e7bbbc33d25904Andreas Huber while (mFlags & PREPARING) { 500bd22c52280179b29eefac91ef7e7bbbc33d25904Andreas Huber mPreparedCondition.wait(mLock); 501bd22c52280179b29eefac91ef7e7bbbc33d25904Andreas Huber } 502bd22c52280179b29eefac91ef7e7bbbc33d25904Andreas Huber 503bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber cancelPlayerEvents(); 504bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber 505681755fc0d0797506456f46a2a10555916d6be32Andreas Huber mWVMExtractor.clear(); 5060a5baa9b411fe086013d2a5e9126ed63fbad046cAndreas Huber mCachedSource.clear(); 50788d8a83de12592635248aa1a3bd6b9ea46108501Andreas Huber mAudioTrack.clear(); 50888d8a83de12592635248aa1a3bd6b9ea46108501Andreas Huber mVideoTrack.clear(); 50988d8a83de12592635248aa1a3bd6b9ea46108501Andreas Huber 5107b3396acc702451be9bafb19d7fe26d55d43a316Andreas Huber // Shutdown audio first, so that the respone to the reset request 5117b3396acc702451be9bafb19d7fe26d55d43a316Andreas Huber // appears to happen instantaneously as far as the user is concerned 5127b3396acc702451be9bafb19d7fe26d55d43a316Andreas Huber // If we did this later, audio would continue playing while we 5137b3396acc702451be9bafb19d7fe26d55d43a316Andreas Huber // shutdown the video-related resources and the player appear to 5147b3396acc702451be9bafb19d7fe26d55d43a316Andreas Huber // not be as responsive to a reset request. 515e94bd14078d327ef2f800e69907efce641a13272Andreas Huber if (mAudioPlayer == NULL && mAudioSource != NULL) { 516e94bd14078d327ef2f800e69907efce641a13272Andreas Huber // If we had an audio player, it would have effectively 517e94bd14078d327ef2f800e69907efce641a13272Andreas Huber // taken possession of the audio source and stopped it when 518e94bd14078d327ef2f800e69907efce641a13272Andreas Huber // _it_ is stopped. Otherwise this is still our responsibility. 519e94bd14078d327ef2f800e69907efce641a13272Andreas Huber mAudioSource->stop(); 520e94bd14078d327ef2f800e69907efce641a13272Andreas Huber } 5217b3396acc702451be9bafb19d7fe26d55d43a316Andreas Huber mAudioSource.clear(); 5227b3396acc702451be9bafb19d7fe26d55d43a316Andreas Huber 5237b3396acc702451be9bafb19d7fe26d55d43a316Andreas Huber mTimeSource = NULL; 5247b3396acc702451be9bafb19d7fe26d55d43a316Andreas Huber 5257b3396acc702451be9bafb19d7fe26d55d43a316Andreas Huber delete mAudioPlayer; 5267b3396acc702451be9bafb19d7fe26d55d43a316Andreas Huber mAudioPlayer = NULL; 5277b3396acc702451be9bafb19d7fe26d55d43a316Andreas Huber 5287a1e3e81264189e23a1db2b174e1b5a5d4c7d1c3Gloria Wang if (mTextPlayer != NULL) { 5297a1e3e81264189e23a1db2b174e1b5a5d4c7d1c3Gloria Wang delete mTextPlayer; 5307a1e3e81264189e23a1db2b174e1b5a5d4c7d1c3Gloria Wang mTextPlayer = NULL; 5317a1e3e81264189e23a1db2b174e1b5a5d4c7d1c3Gloria Wang } 5327a1e3e81264189e23a1db2b174e1b5a5d4c7d1c3Gloria Wang 533b9280d5c2313c41eb490f58198c4e59118e0e3e6Andreas Huber mVideoRenderer.clear(); 534b9280d5c2313c41eb490f58198c4e59118e0e3e6Andreas Huber 535cce326fe43411855aca2f719e505b051bc4b61b3Andreas Huber if (mRTSPController != NULL) { 536cce326fe43411855aca2f719e505b051bc4b61b3Andreas Huber mRTSPController->disconnect(); 537cce326fe43411855aca2f719e505b051bc4b61b3Andreas Huber mRTSPController.clear(); 538cce326fe43411855aca2f719e505b051bc4b61b3Andreas Huber } 539cce326fe43411855aca2f719e505b051bc4b61b3Andreas Huber 540bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber if (mVideoSource != NULL) { 541150694cda0842d38a9358fe8d1fcb4fb4a76599eAndreas Huber shutdownVideoDecoder_l(); 542bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber } 543bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber 544bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber mDurationUs = -1; 545a0b1d4b161599c2bb2a47119e50c51e75bbe980eAndreas Huber modifyFlags(0, ASSIGN); 546acdd9d0f59c3d8bdc3de80664a609527ec3d21e2Andreas Huber mExtractorFlags = 0; 547bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber mTimeSourceDeltaUs = 0; 548bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber mVideoTimeUs = 0; 549bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber 55064bb6983690bf994d904591145a3cdd6373bdbe6Andreas Huber mSeeking = NO_SEEK; 5511321fdd94d354431b930735e9f38f32ecd189a2dAndreas Huber mSeekNotificationSent = false; 552bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber mSeekTimeUs = 0; 55366b0a35c9a4136a84c3f73b1b25fcb5220138b95Andreas Huber 554bd22c52280179b29eefac91ef7e7bbbc33d25904Andreas Huber mUri.setTo(""); 555bd22c52280179b29eefac91ef7e7bbbc33d25904Andreas Huber mUriHeaders.clear(); 5567b3396acc702451be9bafb19d7fe26d55d43a316Andreas Huber 5577b3396acc702451be9bafb19d7fe26d55d43a316Andreas Huber mFileSource.clear(); 5587b3396acc702451be9bafb19d7fe26d55d43a316Andreas Huber 5597fbdb0903dfbf70b314a74e64e28fb880cdb9247Andreas Huber mBitrate = -1; 560150694cda0842d38a9358fe8d1fcb4fb4a76599eAndreas Huber mLastVideoTimeUs = -1; 561a0b1d4b161599c2bb2a47119e50c51e75bbe980eAndreas Huber 562a0b1d4b161599c2bb2a47119e50c51e75bbe980eAndreas Huber { 563a0b1d4b161599c2bb2a47119e50c51e75bbe980eAndreas Huber Mutex::Autolock autoLock(mStatsLock); 564a0b1d4b161599c2bb2a47119e50c51e75bbe980eAndreas Huber mStats.mFd = -1; 565a0b1d4b161599c2bb2a47119e50c51e75bbe980eAndreas Huber mStats.mURI = String8(); 566a0b1d4b161599c2bb2a47119e50c51e75bbe980eAndreas Huber mStats.mBitrate = -1; 567a0b1d4b161599c2bb2a47119e50c51e75bbe980eAndreas Huber mStats.mAudioTrackIndex = -1; 568a0b1d4b161599c2bb2a47119e50c51e75bbe980eAndreas Huber mStats.mVideoTrackIndex = -1; 569a0b1d4b161599c2bb2a47119e50c51e75bbe980eAndreas Huber mStats.mNumVideoFramesDecoded = 0; 570a0b1d4b161599c2bb2a47119e50c51e75bbe980eAndreas Huber mStats.mNumVideoFramesDropped = 0; 571a0b1d4b161599c2bb2a47119e50c51e75bbe980eAndreas Huber mStats.mVideoWidth = -1; 572a0b1d4b161599c2bb2a47119e50c51e75bbe980eAndreas Huber mStats.mVideoHeight = -1; 573a0b1d4b161599c2bb2a47119e50c51e75bbe980eAndreas Huber mStats.mFlags = 0; 574a0b1d4b161599c2bb2a47119e50c51e75bbe980eAndreas Huber mStats.mTracks.clear(); 575a0b1d4b161599c2bb2a47119e50c51e75bbe980eAndreas Huber } 576a0b1d4b161599c2bb2a47119e50c51e75bbe980eAndreas Huber 577bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber} 578bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber 579c23f12af0394aa2f6651968a3c8840f1af317aa1Andreas Hubervoid AwesomePlayer::notifyListener_l(int msg, int ext1, int ext2) { 5800726045216f576e97672ebeefc265d39c4ebaaa5Andreas Huber if (mListener != NULL) { 5810726045216f576e97672ebeefc265d39c4ebaaa5Andreas Huber sp<MediaPlayerBase> listener = mListener.promote(); 5820726045216f576e97672ebeefc265d39c4ebaaa5Andreas Huber 5830726045216f576e97672ebeefc265d39c4ebaaa5Andreas Huber if (listener != NULL) { 584c23f12af0394aa2f6651968a3c8840f1af317aa1Andreas Huber listener->sendEvent(msg, ext1, ext2); 58566b0a35c9a4136a84c3f73b1b25fcb5220138b95Andreas Huber } 58666b0a35c9a4136a84c3f73b1b25fcb5220138b95Andreas Huber } 58766b0a35c9a4136a84c3f73b1b25fcb5220138b95Andreas Huber} 58866b0a35c9a4136a84c3f73b1b25fcb5220138b95Andreas Huber 5897fbdb0903dfbf70b314a74e64e28fb880cdb9247Andreas Huberbool AwesomePlayer::getBitrate(int64_t *bitrate) { 590c7fc37a3dab9bd1f96713649f351b5990e6316ffJames Dong off64_t size; 5917fbdb0903dfbf70b314a74e64e28fb880cdb9247Andreas Huber if (mDurationUs >= 0 && mCachedSource != NULL 5927fbdb0903dfbf70b314a74e64e28fb880cdb9247Andreas Huber && mCachedSource->getSize(&size) == OK) { 5937fbdb0903dfbf70b314a74e64e28fb880cdb9247Andreas Huber *bitrate = size * 8000000ll / mDurationUs; // in bits/sec 5947fbdb0903dfbf70b314a74e64e28fb880cdb9247Andreas Huber return true; 5957fbdb0903dfbf70b314a74e64e28fb880cdb9247Andreas Huber } 5967fbdb0903dfbf70b314a74e64e28fb880cdb9247Andreas Huber 5977fbdb0903dfbf70b314a74e64e28fb880cdb9247Andreas Huber if (mBitrate >= 0) { 5987fbdb0903dfbf70b314a74e64e28fb880cdb9247Andreas Huber *bitrate = mBitrate; 5997fbdb0903dfbf70b314a74e64e28fb880cdb9247Andreas Huber return true; 6007fbdb0903dfbf70b314a74e64e28fb880cdb9247Andreas Huber } 6017fbdb0903dfbf70b314a74e64e28fb880cdb9247Andreas Huber 6027fbdb0903dfbf70b314a74e64e28fb880cdb9247Andreas Huber *bitrate = 0; 6037fbdb0903dfbf70b314a74e64e28fb880cdb9247Andreas Huber 6047fbdb0903dfbf70b314a74e64e28fb880cdb9247Andreas Huber return false; 6057fbdb0903dfbf70b314a74e64e28fb880cdb9247Andreas Huber} 6067fbdb0903dfbf70b314a74e64e28fb880cdb9247Andreas Huber 6078650e1960905097f6f1d6aa462ccb1c93c656834Andreas Huber// Returns true iff cached duration is available/applicable. 6088650e1960905097f6f1d6aa462ccb1c93c656834Andreas Huberbool AwesomePlayer::getCachedDuration_l(int64_t *durationUs, bool *eos) { 6097fbdb0903dfbf70b314a74e64e28fb880cdb9247Andreas Huber int64_t bitrate; 6108650e1960905097f6f1d6aa462ccb1c93c656834Andreas Huber 6118650e1960905097f6f1d6aa462ccb1c93c656834Andreas Huber if (mRTSPController != NULL) { 6128650e1960905097f6f1d6aa462ccb1c93c656834Andreas Huber *durationUs = mRTSPController->getQueueDurationUs(eos); 6138650e1960905097f6f1d6aa462ccb1c93c656834Andreas Huber return true; 6147fbdb0903dfbf70b314a74e64e28fb880cdb9247Andreas Huber } else if (mCachedSource != NULL && getBitrate(&bitrate)) { 6151bd233ce7e1aa7730bc18d46ffd57791391738cdBryan Mawhinney status_t finalStatus; 6161bd233ce7e1aa7730bc18d46ffd57791391738cdBryan Mawhinney size_t cachedDataRemaining = mCachedSource->approxDataRemaining(&finalStatus); 6178650e1960905097f6f1d6aa462ccb1c93c656834Andreas Huber *durationUs = cachedDataRemaining * 8000000ll / bitrate; 6181bd233ce7e1aa7730bc18d46ffd57791391738cdBryan Mawhinney *eos = (finalStatus != OK); 6198650e1960905097f6f1d6aa462ccb1c93c656834Andreas Huber return true; 620681755fc0d0797506456f46a2a10555916d6be32Andreas Huber } else if (mWVMExtractor != NULL) { 621681755fc0d0797506456f46a2a10555916d6be32Andreas Huber status_t finalStatus; 622681755fc0d0797506456f46a2a10555916d6be32Andreas Huber *durationUs = mWVMExtractor->getCachedDurationUs(&finalStatus); 623681755fc0d0797506456f46a2a10555916d6be32Andreas Huber *eos = (finalStatus != OK); 624681755fc0d0797506456f46a2a10555916d6be32Andreas Huber return true; 6258650e1960905097f6f1d6aa462ccb1c93c656834Andreas Huber } 6268650e1960905097f6f1d6aa462ccb1c93c656834Andreas Huber 6278650e1960905097f6f1d6aa462ccb1c93c656834Andreas Huber return false; 6288650e1960905097f6f1d6aa462ccb1c93c656834Andreas Huber} 6298650e1960905097f6f1d6aa462ccb1c93c656834Andreas Huber 63034ef0f32c8fc0186236a27e07405328cc1f7c56dAndreas Hubervoid AwesomePlayer::ensureCacheIsFetching_l() { 63134ef0f32c8fc0186236a27e07405328cc1f7c56dAndreas Huber if (mCachedSource != NULL) { 63234ef0f32c8fc0186236a27e07405328cc1f7c56dAndreas Huber mCachedSource->resumeFetchingIfNecessary(); 63334ef0f32c8fc0186236a27e07405328cc1f7c56dAndreas Huber } 63434ef0f32c8fc0186236a27e07405328cc1f7c56dAndreas Huber} 63534ef0f32c8fc0186236a27e07405328cc1f7c56dAndreas Huber 636145e68fc778275963189b02a1adcbe27cce4d769Andreas Hubervoid AwesomePlayer::onVideoLagUpdate() { 637145e68fc778275963189b02a1adcbe27cce4d769Andreas Huber Mutex::Autolock autoLock(mLock); 638145e68fc778275963189b02a1adcbe27cce4d769Andreas Huber if (!mVideoLagEventPending) { 639145e68fc778275963189b02a1adcbe27cce4d769Andreas Huber return; 640145e68fc778275963189b02a1adcbe27cce4d769Andreas Huber } 641145e68fc778275963189b02a1adcbe27cce4d769Andreas Huber mVideoLagEventPending = false; 642145e68fc778275963189b02a1adcbe27cce4d769Andreas Huber 643145e68fc778275963189b02a1adcbe27cce4d769Andreas Huber int64_t audioTimeUs = mAudioPlayer->getMediaTimeUs(); 644145e68fc778275963189b02a1adcbe27cce4d769Andreas Huber int64_t videoLateByUs = audioTimeUs - mVideoTimeUs; 645145e68fc778275963189b02a1adcbe27cce4d769Andreas Huber 6465dac87b088556b8ed7f2a4f5546d31be0bb68680Andreas Huber if (!(mFlags & VIDEO_AT_EOS) && videoLateByUs > 300000ll) { 647145e68fc778275963189b02a1adcbe27cce4d769Andreas Huber LOGV("video late by %lld ms.", videoLateByUs / 1000ll); 648145e68fc778275963189b02a1adcbe27cce4d769Andreas Huber 649145e68fc778275963189b02a1adcbe27cce4d769Andreas Huber notifyListener_l( 650145e68fc778275963189b02a1adcbe27cce4d769Andreas Huber MEDIA_INFO, 651145e68fc778275963189b02a1adcbe27cce4d769Andreas Huber MEDIA_INFO_VIDEO_TRACK_LAGGING, 652145e68fc778275963189b02a1adcbe27cce4d769Andreas Huber videoLateByUs / 1000ll); 653145e68fc778275963189b02a1adcbe27cce4d769Andreas Huber } 654145e68fc778275963189b02a1adcbe27cce4d769Andreas Huber 655145e68fc778275963189b02a1adcbe27cce4d769Andreas Huber postVideoLagEvent_l(); 656145e68fc778275963189b02a1adcbe27cce4d769Andreas Huber} 657145e68fc778275963189b02a1adcbe27cce4d769Andreas Huber 65866b0a35c9a4136a84c3f73b1b25fcb5220138b95Andreas Hubervoid AwesomePlayer::onBufferingUpdate() { 65966b0a35c9a4136a84c3f73b1b25fcb5220138b95Andreas Huber Mutex::Autolock autoLock(mLock); 660d29345dfa29cdcc650f3705e43950ef2500f6728Andreas Huber if (!mBufferingEventPending) { 661d29345dfa29cdcc650f3705e43950ef2500f6728Andreas Huber return; 662d29345dfa29cdcc650f3705e43950ef2500f6728Andreas Huber } 66366b0a35c9a4136a84c3f73b1b25fcb5220138b95Andreas Huber mBufferingEventPending = false; 66466b0a35c9a4136a84c3f73b1b25fcb5220138b95Andreas Huber 6658650e1960905097f6f1d6aa462ccb1c93c656834Andreas Huber if (mCachedSource != NULL) { 6661bd233ce7e1aa7730bc18d46ffd57791391738cdBryan Mawhinney status_t finalStatus; 6671bd233ce7e1aa7730bc18d46ffd57791391738cdBryan Mawhinney size_t cachedDataRemaining = mCachedSource->approxDataRemaining(&finalStatus); 6681bd233ce7e1aa7730bc18d46ffd57791391738cdBryan Mawhinney bool eos = (finalStatus != OK); 669c9e894872c298b25fe9d74e68aa1e7287a541ac3Andreas Huber 6708650e1960905097f6f1d6aa462ccb1c93c656834Andreas Huber if (eos) { 6711bd233ce7e1aa7730bc18d46ffd57791391738cdBryan Mawhinney if (finalStatus == ERROR_END_OF_STREAM) { 6721bd233ce7e1aa7730bc18d46ffd57791391738cdBryan Mawhinney notifyListener_l(MEDIA_BUFFERING_UPDATE, 100); 6731bd233ce7e1aa7730bc18d46ffd57791391738cdBryan Mawhinney } 67483977eb230d829cfe520f55d7977037a904ce548Andreas Huber if (mFlags & PREPARING) { 67583977eb230d829cfe520f55d7977037a904ce548Andreas Huber LOGV("cache has reached EOS, prepare is done."); 67683977eb230d829cfe520f55d7977037a904ce548Andreas Huber finishAsyncPrepare_l(); 67783977eb230d829cfe520f55d7977037a904ce548Andreas Huber } 6788650e1960905097f6f1d6aa462ccb1c93c656834Andreas Huber } else { 6797fbdb0903dfbf70b314a74e64e28fb880cdb9247Andreas Huber int64_t bitrate; 6807fbdb0903dfbf70b314a74e64e28fb880cdb9247Andreas Huber if (getBitrate(&bitrate)) { 6818650e1960905097f6f1d6aa462ccb1c93c656834Andreas Huber size_t cachedSize = mCachedSource->cachedSize(); 6828650e1960905097f6f1d6aa462ccb1c93c656834Andreas Huber int64_t cachedDurationUs = cachedSize * 8000000ll / bitrate; 683c9e894872c298b25fe9d74e68aa1e7287a541ac3Andreas Huber 6848650e1960905097f6f1d6aa462ccb1c93c656834Andreas Huber int percentage = 100.0 * (double)cachedDurationUs / mDurationUs; 6858650e1960905097f6f1d6aa462ccb1c93c656834Andreas Huber if (percentage > 100) { 6868650e1960905097f6f1d6aa462ccb1c93c656834Andreas Huber percentage = 100; 6878650e1960905097f6f1d6aa462ccb1c93c656834Andreas Huber } 688c9e894872c298b25fe9d74e68aa1e7287a541ac3Andreas Huber 6898650e1960905097f6f1d6aa462ccb1c93c656834Andreas Huber notifyListener_l(MEDIA_BUFFERING_UPDATE, percentage); 6908650e1960905097f6f1d6aa462ccb1c93c656834Andreas Huber } else { 6918650e1960905097f6f1d6aa462ccb1c93c656834Andreas Huber // We don't know the bitrate of the stream, use absolute size 6928650e1960905097f6f1d6aa462ccb1c93c656834Andreas Huber // limits to maintain the cache. 6938650e1960905097f6f1d6aa462ccb1c93c656834Andreas Huber 6948650e1960905097f6f1d6aa462ccb1c93c656834Andreas Huber if ((mFlags & PLAYING) && !eos 6958650e1960905097f6f1d6aa462ccb1c93c656834Andreas Huber && (cachedDataRemaining < kLowWaterMarkBytes)) { 6968650e1960905097f6f1d6aa462ccb1c93c656834Andreas Huber LOGI("cache is running low (< %d) , pausing.", 6978650e1960905097f6f1d6aa462ccb1c93c656834Andreas Huber kLowWaterMarkBytes); 698a0b1d4b161599c2bb2a47119e50c51e75bbe980eAndreas Huber modifyFlags(CACHE_UNDERRUN, SET); 6998650e1960905097f6f1d6aa462ccb1c93c656834Andreas Huber pause_l(); 70034ef0f32c8fc0186236a27e07405328cc1f7c56dAndreas Huber ensureCacheIsFetching_l(); 7015b1b8a93a07326f1cbc627f09e02988375189e0aJames Dong sendCacheStats(); 7028650e1960905097f6f1d6aa462ccb1c93c656834Andreas Huber notifyListener_l(MEDIA_INFO, MEDIA_INFO_BUFFERING_START); 7038650e1960905097f6f1d6aa462ccb1c93c656834Andreas Huber } else if (eos || cachedDataRemaining > kHighWaterMarkBytes) { 7048650e1960905097f6f1d6aa462ccb1c93c656834Andreas Huber if (mFlags & CACHE_UNDERRUN) { 7058650e1960905097f6f1d6aa462ccb1c93c656834Andreas Huber LOGI("cache has filled up (> %d), resuming.", 7068650e1960905097f6f1d6aa462ccb1c93c656834Andreas Huber kHighWaterMarkBytes); 707a0b1d4b161599c2bb2a47119e50c51e75bbe980eAndreas Huber modifyFlags(CACHE_UNDERRUN, CLEAR); 7088650e1960905097f6f1d6aa462ccb1c93c656834Andreas Huber play_l(); 7098650e1960905097f6f1d6aa462ccb1c93c656834Andreas Huber notifyListener_l(MEDIA_INFO, MEDIA_INFO_BUFFERING_END); 7108650e1960905097f6f1d6aa462ccb1c93c656834Andreas Huber } else if (mFlags & PREPARING) { 7118650e1960905097f6f1d6aa462ccb1c93c656834Andreas Huber LOGV("cache has filled up (> %d), prepare is done", 7128650e1960905097f6f1d6aa462ccb1c93c656834Andreas Huber kHighWaterMarkBytes); 7138650e1960905097f6f1d6aa462ccb1c93c656834Andreas Huber finishAsyncPrepare_l(); 7148650e1960905097f6f1d6aa462ccb1c93c656834Andreas Huber } 7158650e1960905097f6f1d6aa462ccb1c93c656834Andreas Huber } 7168650e1960905097f6f1d6aa462ccb1c93c656834Andreas Huber } 7178650e1960905097f6f1d6aa462ccb1c93c656834Andreas Huber } 718681755fc0d0797506456f46a2a10555916d6be32Andreas Huber } else if (mWVMExtractor != NULL) { 719681755fc0d0797506456f46a2a10555916d6be32Andreas Huber status_t finalStatus; 720681755fc0d0797506456f46a2a10555916d6be32Andreas Huber 721681755fc0d0797506456f46a2a10555916d6be32Andreas Huber int64_t cachedDurationUs 722681755fc0d0797506456f46a2a10555916d6be32Andreas Huber = mWVMExtractor->getCachedDurationUs(&finalStatus); 723681755fc0d0797506456f46a2a10555916d6be32Andreas Huber 724681755fc0d0797506456f46a2a10555916d6be32Andreas Huber bool eos = (finalStatus != OK); 725681755fc0d0797506456f46a2a10555916d6be32Andreas Huber 726681755fc0d0797506456f46a2a10555916d6be32Andreas Huber if (eos) { 727681755fc0d0797506456f46a2a10555916d6be32Andreas Huber if (finalStatus == ERROR_END_OF_STREAM) { 728681755fc0d0797506456f46a2a10555916d6be32Andreas Huber notifyListener_l(MEDIA_BUFFERING_UPDATE, 100); 729681755fc0d0797506456f46a2a10555916d6be32Andreas Huber } 730681755fc0d0797506456f46a2a10555916d6be32Andreas Huber if (mFlags & PREPARING) { 731681755fc0d0797506456f46a2a10555916d6be32Andreas Huber LOGV("cache has reached EOS, prepare is done."); 732681755fc0d0797506456f46a2a10555916d6be32Andreas Huber finishAsyncPrepare_l(); 733681755fc0d0797506456f46a2a10555916d6be32Andreas Huber } 734681755fc0d0797506456f46a2a10555916d6be32Andreas Huber } else { 735681755fc0d0797506456f46a2a10555916d6be32Andreas Huber int percentage = 100.0 * (double)cachedDurationUs / mDurationUs; 736681755fc0d0797506456f46a2a10555916d6be32Andreas Huber if (percentage > 100) { 737681755fc0d0797506456f46a2a10555916d6be32Andreas Huber percentage = 100; 738681755fc0d0797506456f46a2a10555916d6be32Andreas Huber } 739681755fc0d0797506456f46a2a10555916d6be32Andreas Huber 740681755fc0d0797506456f46a2a10555916d6be32Andreas Huber notifyListener_l(MEDIA_BUFFERING_UPDATE, percentage); 741681755fc0d0797506456f46a2a10555916d6be32Andreas Huber } 7422415ecb5bb4e1459024f6d6c8ae2d6e3dc4fbdc7Andreas Huber } 7432415ecb5bb4e1459024f6d6c8ae2d6e3dc4fbdc7Andreas Huber 7448650e1960905097f6f1d6aa462ccb1c93c656834Andreas Huber int64_t cachedDurationUs; 7452a4b49bd3863024884a694b454e2e452752e6ea0Andreas Huber bool eos; 7468650e1960905097f6f1d6aa462ccb1c93c656834Andreas Huber if (getCachedDuration_l(&cachedDurationUs, &eos)) { 74734ef0f32c8fc0186236a27e07405328cc1f7c56dAndreas Huber LOGV("cachedDurationUs = %.2f secs, eos=%d", 74834ef0f32c8fc0186236a27e07405328cc1f7c56dAndreas Huber cachedDurationUs / 1E6, eos); 74934ef0f32c8fc0186236a27e07405328cc1f7c56dAndreas Huber 750100a4408968b90e314526185d572c72ea4cc784aAndreas Huber int64_t highWaterMarkUs = 751100a4408968b90e314526185d572c72ea4cc784aAndreas Huber (mRTSPController != NULL) ? kHighWaterMarkRTSPUs : kHighWaterMarkUs; 752100a4408968b90e314526185d572c72ea4cc784aAndreas Huber 7538650e1960905097f6f1d6aa462ccb1c93c656834Andreas Huber if ((mFlags & PLAYING) && !eos 7548650e1960905097f6f1d6aa462ccb1c93c656834Andreas Huber && (cachedDurationUs < kLowWaterMarkUs)) { 7558650e1960905097f6f1d6aa462ccb1c93c656834Andreas Huber LOGI("cache is running low (%.2f secs) , pausing.", 7568650e1960905097f6f1d6aa462ccb1c93c656834Andreas Huber cachedDurationUs / 1E6); 757a0b1d4b161599c2bb2a47119e50c51e75bbe980eAndreas Huber modifyFlags(CACHE_UNDERRUN, SET); 7588650e1960905097f6f1d6aa462ccb1c93c656834Andreas Huber pause_l(); 75934ef0f32c8fc0186236a27e07405328cc1f7c56dAndreas Huber ensureCacheIsFetching_l(); 7605b1b8a93a07326f1cbc627f09e02988375189e0aJames Dong sendCacheStats(); 7618650e1960905097f6f1d6aa462ccb1c93c656834Andreas Huber notifyListener_l(MEDIA_INFO, MEDIA_INFO_BUFFERING_START); 762100a4408968b90e314526185d572c72ea4cc784aAndreas Huber } else if (eos || cachedDurationUs > highWaterMarkUs) { 7638650e1960905097f6f1d6aa462ccb1c93c656834Andreas Huber if (mFlags & CACHE_UNDERRUN) { 7648650e1960905097f6f1d6aa462ccb1c93c656834Andreas Huber LOGI("cache has filled up (%.2f secs), resuming.", 7658650e1960905097f6f1d6aa462ccb1c93c656834Andreas Huber cachedDurationUs / 1E6); 766a0b1d4b161599c2bb2a47119e50c51e75bbe980eAndreas Huber modifyFlags(CACHE_UNDERRUN, CLEAR); 7678650e1960905097f6f1d6aa462ccb1c93c656834Andreas Huber play_l(); 7688650e1960905097f6f1d6aa462ccb1c93c656834Andreas Huber notifyListener_l(MEDIA_INFO, MEDIA_INFO_BUFFERING_END); 7698650e1960905097f6f1d6aa462ccb1c93c656834Andreas Huber } else if (mFlags & PREPARING) { 7708650e1960905097f6f1d6aa462ccb1c93c656834Andreas Huber LOGV("cache has filled up (%.2f secs), prepare is done", 7718650e1960905097f6f1d6aa462ccb1c93c656834Andreas Huber cachedDurationUs / 1E6); 7728650e1960905097f6f1d6aa462ccb1c93c656834Andreas Huber finishAsyncPrepare_l(); 7732a4b49bd3863024884a694b454e2e452752e6ea0Andreas Huber } 7742a4b49bd3863024884a694b454e2e452752e6ea0Andreas Huber } 7750a5baa9b411fe086013d2a5e9126ed63fbad046cAndreas Huber } 7760a5baa9b411fe086013d2a5e9126ed63fbad046cAndreas Huber 7770a5baa9b411fe086013d2a5e9126ed63fbad046cAndreas Huber postBufferingEvent_l(); 7780726045216f576e97672ebeefc265d39c4ebaaa5Andreas Huber} 7790726045216f576e97672ebeefc265d39c4ebaaa5Andreas Huber 7805b1b8a93a07326f1cbc627f09e02988375189e0aJames Dongvoid AwesomePlayer::sendCacheStats() { 7815b1b8a93a07326f1cbc627f09e02988375189e0aJames Dong sp<MediaPlayerBase> listener = mListener.promote(); 782b33d2ac90cfce0fe6db8c3e979e7ae2bbfc28163James Dong if (listener != NULL && mCachedSource != NULL) { 7835b1b8a93a07326f1cbc627f09e02988375189e0aJames Dong int32_t kbps = 0; 7845b1b8a93a07326f1cbc627f09e02988375189e0aJames Dong status_t err = mCachedSource->getEstimatedBandwidthKbps(&kbps); 7855b1b8a93a07326f1cbc627f09e02988375189e0aJames Dong if (err == OK) { 7865b1b8a93a07326f1cbc627f09e02988375189e0aJames Dong listener->sendEvent( 7875b1b8a93a07326f1cbc627f09e02988375189e0aJames Dong MEDIA_INFO, MEDIA_INFO_NETWORK_BANDWIDTH, kbps); 7885b1b8a93a07326f1cbc627f09e02988375189e0aJames Dong } 7895b1b8a93a07326f1cbc627f09e02988375189e0aJames Dong } 7905b1b8a93a07326f1cbc627f09e02988375189e0aJames Dong} 7915b1b8a93a07326f1cbc627f09e02988375189e0aJames Dong 792bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Hubervoid AwesomePlayer::onStreamDone() { 793bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber // Posted whenever any stream finishes playing. 794bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber 795bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber Mutex::Autolock autoLock(mLock); 796d29345dfa29cdcc650f3705e43950ef2500f6728Andreas Huber if (!mStreamDoneEventPending) { 797d29345dfa29cdcc650f3705e43950ef2500f6728Andreas Huber return; 798d29345dfa29cdcc650f3705e43950ef2500f6728Andreas Huber } 799bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber mStreamDoneEventPending = false; 800bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber 801ed8d14f6a934072cd012992c4ef16990a54baa9aAndreas Huber if (mStreamDoneStatus != ERROR_END_OF_STREAM) { 8025d2de4da54504836e4b772b3010ac28c19f667f0Andreas Huber LOGV("MEDIA_ERROR %d", mStreamDoneStatus); 8035d2de4da54504836e4b772b3010ac28c19f667f0Andreas Huber 8045d2de4da54504836e4b772b3010ac28c19f667f0Andreas Huber notifyListener_l( 8055d2de4da54504836e4b772b3010ac28c19f667f0Andreas Huber MEDIA_ERROR, MEDIA_ERROR_UNKNOWN, mStreamDoneStatus); 8065d2de4da54504836e4b772b3010ac28c19f667f0Andreas Huber 807b2e3954c94717e43b3dc9b880564f166cfbbc0a2Andreas Huber pause_l(true /* at eos */); 8085d2de4da54504836e4b772b3010ac28c19f667f0Andreas Huber 809a0b1d4b161599c2bb2a47119e50c51e75bbe980eAndreas Huber modifyFlags(AT_EOS, SET); 8105d2de4da54504836e4b772b3010ac28c19f667f0Andreas Huber return; 8115d2de4da54504836e4b772b3010ac28c19f667f0Andreas Huber } 8125d2de4da54504836e4b772b3010ac28c19f667f0Andreas Huber 8135d2de4da54504836e4b772b3010ac28c19f667f0Andreas Huber const bool allDone = 8145d2de4da54504836e4b772b3010ac28c19f667f0Andreas Huber (mVideoSource == NULL || (mFlags & VIDEO_AT_EOS)) 8155d2de4da54504836e4b772b3010ac28c19f667f0Andreas Huber && (mAudioSource == NULL || (mFlags & AUDIO_AT_EOS)); 8165d2de4da54504836e4b772b3010ac28c19f667f0Andreas Huber 8175d2de4da54504836e4b772b3010ac28c19f667f0Andreas Huber if (!allDone) { 8185d2de4da54504836e4b772b3010ac28c19f667f0Andreas Huber return; 8195d2de4da54504836e4b772b3010ac28c19f667f0Andreas Huber } 8205d2de4da54504836e4b772b3010ac28c19f667f0Andreas Huber 8218ae49d87b98d57d6758b0c51b95e28a6581a79f1Andreas Huber if (mFlags & (LOOPING | AUTO_LOOPING)) { 822bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber seekTo_l(0); 823bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber 824a657f8deaf21acbe5faba7be1df9c6681d44d471Andreas Huber if (mVideoSource != NULL) { 825bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber postVideoEvent_l(); 826bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber } 827bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber } else { 8285d2de4da54504836e4b772b3010ac28c19f667f0Andreas Huber LOGV("MEDIA_PLAYBACK_COMPLETE"); 8295d2de4da54504836e4b772b3010ac28c19f667f0Andreas Huber notifyListener_l(MEDIA_PLAYBACK_COMPLETE); 830bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber 831b2e3954c94717e43b3dc9b880564f166cfbbc0a2Andreas Huber pause_l(true /* at eos */); 8322e8ffaf95bd35358ecd14ddf00cddaf3abefe0a9Andreas Huber 833a0b1d4b161599c2bb2a47119e50c51e75bbe980eAndreas Huber modifyFlags(AT_EOS, SET); 834bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber } 835bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber} 836bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber 837bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huberstatus_t AwesomePlayer::play() { 838bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber Mutex::Autolock autoLock(mLock); 8390a5baa9b411fe086013d2a5e9126ed63fbad046cAndreas Huber 840a0b1d4b161599c2bb2a47119e50c51e75bbe980eAndreas Huber modifyFlags(CACHE_UNDERRUN, CLEAR); 8410a5baa9b411fe086013d2a5e9126ed63fbad046cAndreas Huber 8427b3396acc702451be9bafb19d7fe26d55d43a316Andreas Huber return play_l(); 8437b3396acc702451be9bafb19d7fe26d55d43a316Andreas Huber} 844bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber 8457b3396acc702451be9bafb19d7fe26d55d43a316Andreas Huberstatus_t AwesomePlayer::play_l() { 846a0b1d4b161599c2bb2a47119e50c51e75bbe980eAndreas Huber modifyFlags(SEEK_PREVIEW, CLEAR); 8472b1222f8938356669672f35e0e53e176c78c40efAndreas Huber 848bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber if (mFlags & PLAYING) { 849bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber return OK; 850bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber } 851bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber 852bd22c52280179b29eefac91ef7e7bbbc33d25904Andreas Huber if (!(mFlags & PREPARED)) { 853bd22c52280179b29eefac91ef7e7bbbc33d25904Andreas Huber status_t err = prepare_l(); 854bd22c52280179b29eefac91ef7e7bbbc33d25904Andreas Huber 855bd22c52280179b29eefac91ef7e7bbbc33d25904Andreas Huber if (err != OK) { 856bd22c52280179b29eefac91ef7e7bbbc33d25904Andreas Huber return err; 857bd22c52280179b29eefac91ef7e7bbbc33d25904Andreas Huber } 858bd22c52280179b29eefac91ef7e7bbbc33d25904Andreas Huber } 859bd22c52280179b29eefac91ef7e7bbbc33d25904Andreas Huber 860a0b1d4b161599c2bb2a47119e50c51e75bbe980eAndreas Huber modifyFlags(PLAYING, SET); 861a0b1d4b161599c2bb2a47119e50c51e75bbe980eAndreas Huber modifyFlags(FIRST_FRAME, SET); 862bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber 863c130b5bf563d049bd391ccd96985ac278ef8ff8dGloria Wang if (mDecryptHandle != NULL) { 864c130b5bf563d049bd391ccd96985ac278ef8ff8dGloria Wang int64_t position; 865c130b5bf563d049bd391ccd96985ac278ef8ff8dGloria Wang getPosition(&position); 866c130b5bf563d049bd391ccd96985ac278ef8ff8dGloria Wang mDrmManagerClient->setPlaybackStatus(mDecryptHandle, 867c130b5bf563d049bd391ccd96985ac278ef8ff8dGloria Wang Playback::START, position / 1000); 868c130b5bf563d049bd391ccd96985ac278ef8ff8dGloria Wang } 869c130b5bf563d049bd391ccd96985ac278ef8ff8dGloria Wang 870bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber if (mAudioSource != NULL) { 871bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber if (mAudioPlayer == NULL) { 872bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber if (mAudioSink != NULL) { 873ed54ad0f8619ae416b0968ade6248894cbfc4dbaAndreas Huber mAudioPlayer = new AudioPlayer(mAudioSink, this); 874bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber mAudioPlayer->setSource(mAudioSource); 875e7e3b785a0e7819db4c895a4f60e9a4dd755880cAndreas Huber 876f03034408506051f2f836e59305fcd5f662bf19aAndreas Huber mTimeSource = mAudioPlayer; 87788c030e0e0152791ff74f90249f55fce01371198Andreas Huber 878b874cd085bba63528c570f74c493bfea835190d9Andreas Huber // If there was a seek request before we ever started, 879b874cd085bba63528c570f74c493bfea835190d9Andreas Huber // honor the request now. 880b874cd085bba63528c570f74c493bfea835190d9Andreas Huber // Make sure to do this before starting the audio player 881b874cd085bba63528c570f74c493bfea835190d9Andreas Huber // to avoid a race condition. 882b874cd085bba63528c570f74c493bfea835190d9Andreas Huber seekAudioIfNecessary_l(); 883f03034408506051f2f836e59305fcd5f662bf19aAndreas Huber } 884f03034408506051f2f836e59305fcd5f662bf19aAndreas Huber } 88588c030e0e0152791ff74f90249f55fce01371198Andreas Huber 886f03034408506051f2f836e59305fcd5f662bf19aAndreas Huber CHECK(!(mFlags & AUDIO_RUNNING)); 887c130b5bf563d049bd391ccd96985ac278ef8ff8dGloria Wang 888f03034408506051f2f836e59305fcd5f662bf19aAndreas Huber if (mVideoSource == NULL) { 8895442cb59e8483e18b3a02400d431d167ea7074b3Andreas Huber // We don't want to post an error notification at this point, 8905442cb59e8483e18b3a02400d431d167ea7074b3Andreas Huber // the error returned from MediaPlayer::start() will suffice. 8915442cb59e8483e18b3a02400d431d167ea7074b3Andreas Huber 8925442cb59e8483e18b3a02400d431d167ea7074b3Andreas Huber status_t err = startAudioPlayer_l( 8935442cb59e8483e18b3a02400d431d167ea7074b3Andreas Huber false /* sendErrorNotification */); 894bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber 895f03034408506051f2f836e59305fcd5f662bf19aAndreas Huber if (err != OK) { 896f03034408506051f2f836e59305fcd5f662bf19aAndreas Huber delete mAudioPlayer; 897f03034408506051f2f836e59305fcd5f662bf19aAndreas Huber mAudioPlayer = NULL; 898bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber 899a0b1d4b161599c2bb2a47119e50c51e75bbe980eAndreas Huber modifyFlags((PLAYING | FIRST_FRAME), CLEAR); 9001862a33b246249630b654182afb5914da3480d4cAndreas Huber 901f03034408506051f2f836e59305fcd5f662bf19aAndreas Huber if (mDecryptHandle != NULL) { 902f03034408506051f2f836e59305fcd5f662bf19aAndreas Huber mDrmManagerClient->setPlaybackStatus( 903f03034408506051f2f836e59305fcd5f662bf19aAndreas Huber mDecryptHandle, Playback::STOP, 0); 904f03034408506051f2f836e59305fcd5f662bf19aAndreas Huber } 905f03034408506051f2f836e59305fcd5f662bf19aAndreas Huber 906f03034408506051f2f836e59305fcd5f662bf19aAndreas Huber return err; 907bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber } 908bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber } 909bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber } 910bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber 911bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber if (mTimeSource == NULL && mAudioPlayer == NULL) { 9125d2de4da54504836e4b772b3010ac28c19f667f0Andreas Huber mTimeSource = &mSystemTimeSource; 913bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber } 914bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber 915bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber if (mVideoSource != NULL) { 916a657f8deaf21acbe5faba7be1df9c6681d44d471Andreas Huber // Kick off video playback 917a657f8deaf21acbe5faba7be1df9c6681d44d471Andreas Huber postVideoEvent_l(); 918145e68fc778275963189b02a1adcbe27cce4d769Andreas Huber 919145e68fc778275963189b02a1adcbe27cce4d769Andreas Huber if (mAudioSource != NULL && mVideoSource != NULL) { 920145e68fc778275963189b02a1adcbe27cce4d769Andreas Huber postVideoLagEvent_l(); 921145e68fc778275963189b02a1adcbe27cce4d769Andreas Huber } 922bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber } 923bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber 9242e8ffaf95bd35358ecd14ddf00cddaf3abefe0a9Andreas Huber if (mFlags & AT_EOS) { 9252e8ffaf95bd35358ecd14ddf00cddaf3abefe0a9Andreas Huber // Legacy behaviour, if a stream finishes playing and then 9262e8ffaf95bd35358ecd14ddf00cddaf3abefe0a9Andreas Huber // is started again, we play from the start... 9272e8ffaf95bd35358ecd14ddf00cddaf3abefe0a9Andreas Huber seekTo_l(0); 9282e8ffaf95bd35358ecd14ddf00cddaf3abefe0a9Andreas Huber } 9292e8ffaf95bd35358ecd14ddf00cddaf3abefe0a9Andreas Huber 9307cf180c9bff69e5cc4a2f4e53b432db45ebbebabGloria Wang uint32_t params = IMediaPlayerService::kBatteryDataCodecStarted 9317cf180c9bff69e5cc4a2f4e53b432db45ebbebabGloria Wang | IMediaPlayerService::kBatteryDataTrackDecoder; 9327cf180c9bff69e5cc4a2f4e53b432db45ebbebabGloria Wang if ((mAudioSource != NULL) && (mAudioSource != mAudioTrack)) { 9337cf180c9bff69e5cc4a2f4e53b432db45ebbebabGloria Wang params |= IMediaPlayerService::kBatteryDataTrackAudio; 9347cf180c9bff69e5cc4a2f4e53b432db45ebbebabGloria Wang } 9357cf180c9bff69e5cc4a2f4e53b432db45ebbebabGloria Wang if (mVideoSource != NULL) { 9367cf180c9bff69e5cc4a2f4e53b432db45ebbebabGloria Wang params |= IMediaPlayerService::kBatteryDataTrackVideo; 9377cf180c9bff69e5cc4a2f4e53b432db45ebbebabGloria Wang } 9387cf180c9bff69e5cc4a2f4e53b432db45ebbebabGloria Wang addBatteryData(params); 9397cf180c9bff69e5cc4a2f4e53b432db45ebbebabGloria Wang 940bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber return OK; 941bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber} 942bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber 9435442cb59e8483e18b3a02400d431d167ea7074b3Andreas Huberstatus_t AwesomePlayer::startAudioPlayer_l(bool sendErrorNotification) { 944f03034408506051f2f836e59305fcd5f662bf19aAndreas Huber CHECK(!(mFlags & AUDIO_RUNNING)); 945f03034408506051f2f836e59305fcd5f662bf19aAndreas Huber 946f03034408506051f2f836e59305fcd5f662bf19aAndreas Huber if (mAudioSource == NULL || mAudioPlayer == NULL) { 947f03034408506051f2f836e59305fcd5f662bf19aAndreas Huber return OK; 948f03034408506051f2f836e59305fcd5f662bf19aAndreas Huber } 949f03034408506051f2f836e59305fcd5f662bf19aAndreas Huber 950f03034408506051f2f836e59305fcd5f662bf19aAndreas Huber if (!(mFlags & AUDIOPLAYER_STARTED)) { 951a0b1d4b161599c2bb2a47119e50c51e75bbe980eAndreas Huber modifyFlags(AUDIOPLAYER_STARTED, SET); 952f03034408506051f2f836e59305fcd5f662bf19aAndreas Huber 953c0dfc5b02d4179769bbdd25c10d430576ec09568Andreas Huber bool wasSeeking = mAudioPlayer->isSeeking(); 954c0dfc5b02d4179769bbdd25c10d430576ec09568Andreas Huber 955f03034408506051f2f836e59305fcd5f662bf19aAndreas Huber // We've already started the MediaSource in order to enable 956f03034408506051f2f836e59305fcd5f662bf19aAndreas Huber // the prefetcher to read its data. 957f03034408506051f2f836e59305fcd5f662bf19aAndreas Huber status_t err = mAudioPlayer->start( 958f03034408506051f2f836e59305fcd5f662bf19aAndreas Huber true /* sourceAlreadyStarted */); 959f03034408506051f2f836e59305fcd5f662bf19aAndreas Huber 960f03034408506051f2f836e59305fcd5f662bf19aAndreas Huber if (err != OK) { 9615442cb59e8483e18b3a02400d431d167ea7074b3Andreas Huber if (sendErrorNotification) { 9625442cb59e8483e18b3a02400d431d167ea7074b3Andreas Huber notifyListener_l(MEDIA_ERROR, MEDIA_ERROR_UNKNOWN, err); 9635442cb59e8483e18b3a02400d431d167ea7074b3Andreas Huber } 9645442cb59e8483e18b3a02400d431d167ea7074b3Andreas Huber 965f03034408506051f2f836e59305fcd5f662bf19aAndreas Huber return err; 966f03034408506051f2f836e59305fcd5f662bf19aAndreas Huber } 967c0dfc5b02d4179769bbdd25c10d430576ec09568Andreas Huber 968c0dfc5b02d4179769bbdd25c10d430576ec09568Andreas Huber if (wasSeeking) { 969c0dfc5b02d4179769bbdd25c10d430576ec09568Andreas Huber CHECK(!mAudioPlayer->isSeeking()); 970c0dfc5b02d4179769bbdd25c10d430576ec09568Andreas Huber 971c0dfc5b02d4179769bbdd25c10d430576ec09568Andreas Huber // We will have finished the seek while starting the audio player. 972c0dfc5b02d4179769bbdd25c10d430576ec09568Andreas Huber postAudioSeekComplete_l(); 973c0dfc5b02d4179769bbdd25c10d430576ec09568Andreas Huber } 974f03034408506051f2f836e59305fcd5f662bf19aAndreas Huber } else { 975f03034408506051f2f836e59305fcd5f662bf19aAndreas Huber mAudioPlayer->resume(); 976f03034408506051f2f836e59305fcd5f662bf19aAndreas Huber } 977f03034408506051f2f836e59305fcd5f662bf19aAndreas Huber 978a0b1d4b161599c2bb2a47119e50c51e75bbe980eAndreas Huber modifyFlags(AUDIO_RUNNING, SET); 979f03034408506051f2f836e59305fcd5f662bf19aAndreas Huber 980f03034408506051f2f836e59305fcd5f662bf19aAndreas Huber mWatchForAudioEOS = true; 981f03034408506051f2f836e59305fcd5f662bf19aAndreas Huber 982f03034408506051f2f836e59305fcd5f662bf19aAndreas Huber return OK; 983f03034408506051f2f836e59305fcd5f662bf19aAndreas Huber} 984f03034408506051f2f836e59305fcd5f662bf19aAndreas Huber 9855daeb129a2c2ba3d14ccd94af283b5f561c783eaAndreas Hubervoid AwesomePlayer::notifyVideoSize_l() { 9865daeb129a2c2ba3d14ccd94af283b5f561c783eaAndreas Huber sp<MetaData> meta = mVideoSource->getFormat(); 9875daeb129a2c2ba3d14ccd94af283b5f561c783eaAndreas Huber 988f5ab57c2d5e02af7483c94eddb177e4f5c9e9892Andreas Huber int32_t cropLeft, cropTop, cropRight, cropBottom; 989f5ab57c2d5e02af7483c94eddb177e4f5c9e9892Andreas Huber if (!meta->findRect( 990f5ab57c2d5e02af7483c94eddb177e4f5c9e9892Andreas Huber kKeyCropRect, &cropLeft, &cropTop, &cropRight, &cropBottom)) { 991f5ab57c2d5e02af7483c94eddb177e4f5c9e9892Andreas Huber int32_t width, height; 992f5ab57c2d5e02af7483c94eddb177e4f5c9e9892Andreas Huber CHECK(meta->findInt32(kKeyWidth, &width)); 993f5ab57c2d5e02af7483c94eddb177e4f5c9e9892Andreas Huber CHECK(meta->findInt32(kKeyHeight, &height)); 994f5ab57c2d5e02af7483c94eddb177e4f5c9e9892Andreas Huber 995f5ab57c2d5e02af7483c94eddb177e4f5c9e9892Andreas Huber cropLeft = cropTop = 0; 996f5ab57c2d5e02af7483c94eddb177e4f5c9e9892Andreas Huber cropRight = width - 1; 997f5ab57c2d5e02af7483c94eddb177e4f5c9e9892Andreas Huber cropBottom = height - 1; 998f5ab57c2d5e02af7483c94eddb177e4f5c9e9892Andreas Huber 999f5ab57c2d5e02af7483c94eddb177e4f5c9e9892Andreas Huber LOGV("got dimensions only %d x %d", width, height); 1000f5ab57c2d5e02af7483c94eddb177e4f5c9e9892Andreas Huber } else { 1001f5ab57c2d5e02af7483c94eddb177e4f5c9e9892Andreas Huber LOGV("got crop rect %d, %d, %d, %d", 1002f5ab57c2d5e02af7483c94eddb177e4f5c9e9892Andreas Huber cropLeft, cropTop, cropRight, cropBottom); 1003f5ab57c2d5e02af7483c94eddb177e4f5c9e9892Andreas Huber } 1004f5ab57c2d5e02af7483c94eddb177e4f5c9e9892Andreas Huber 10059cbb1a6f99003a9cd8765e11b9d7380e67839f82James Dong int32_t displayWidth; 10069cbb1a6f99003a9cd8765e11b9d7380e67839f82James Dong if (meta->findInt32(kKeyDisplayWidth, &displayWidth)) { 10079cbb1a6f99003a9cd8765e11b9d7380e67839f82James Dong LOGV("Display width changed (%d=>%d)", mDisplayWidth, displayWidth); 10089cbb1a6f99003a9cd8765e11b9d7380e67839f82James Dong mDisplayWidth = displayWidth; 10099cbb1a6f99003a9cd8765e11b9d7380e67839f82James Dong } 10109cbb1a6f99003a9cd8765e11b9d7380e67839f82James Dong int32_t displayHeight; 10119cbb1a6f99003a9cd8765e11b9d7380e67839f82James Dong if (meta->findInt32(kKeyDisplayHeight, &displayHeight)) { 10129cbb1a6f99003a9cd8765e11b9d7380e67839f82James Dong LOGV("Display height changed (%d=>%d)", mDisplayHeight, displayHeight); 10139cbb1a6f99003a9cd8765e11b9d7380e67839f82James Dong mDisplayHeight = displayHeight; 10149cbb1a6f99003a9cd8765e11b9d7380e67839f82James Dong } 10159cbb1a6f99003a9cd8765e11b9d7380e67839f82James Dong 1016f5ab57c2d5e02af7483c94eddb177e4f5c9e9892Andreas Huber int32_t usableWidth = cropRight - cropLeft + 1; 1017f5ab57c2d5e02af7483c94eddb177e4f5c9e9892Andreas Huber int32_t usableHeight = cropBottom - cropTop + 1; 1018b45c01c2b8588ff431b511151666a55a39f0a6aeJames Dong if (mDisplayWidth != 0) { 1019b45c01c2b8588ff431b511151666a55a39f0a6aeJames Dong usableWidth = mDisplayWidth; 1020b45c01c2b8588ff431b511151666a55a39f0a6aeJames Dong } 1021b45c01c2b8588ff431b511151666a55a39f0a6aeJames Dong if (mDisplayHeight != 0) { 1022b45c01c2b8588ff431b511151666a55a39f0a6aeJames Dong usableHeight = mDisplayHeight; 1023b45c01c2b8588ff431b511151666a55a39f0a6aeJames Dong } 10245daeb129a2c2ba3d14ccd94af283b5f561c783eaAndreas Huber 1025a0b1d4b161599c2bb2a47119e50c51e75bbe980eAndreas Huber { 1026a0b1d4b161599c2bb2a47119e50c51e75bbe980eAndreas Huber Mutex::Autolock autoLock(mStatsLock); 1027a0b1d4b161599c2bb2a47119e50c51e75bbe980eAndreas Huber mStats.mVideoWidth = usableWidth; 1028a0b1d4b161599c2bb2a47119e50c51e75bbe980eAndreas Huber mStats.mVideoHeight = usableHeight; 1029a0b1d4b161599c2bb2a47119e50c51e75bbe980eAndreas Huber } 1030a0b1d4b161599c2bb2a47119e50c51e75bbe980eAndreas Huber 1031ba529e486dde15fe75ea1b48570f9d60a4cf3c48Andreas Huber int32_t rotationDegrees; 1032ba529e486dde15fe75ea1b48570f9d60a4cf3c48Andreas Huber if (!mVideoTrack->getFormat()->findInt32( 1033ba529e486dde15fe75ea1b48570f9d60a4cf3c48Andreas Huber kKeyRotation, &rotationDegrees)) { 1034ba529e486dde15fe75ea1b48570f9d60a4cf3c48Andreas Huber rotationDegrees = 0; 1035ba529e486dde15fe75ea1b48570f9d60a4cf3c48Andreas Huber } 1036ba529e486dde15fe75ea1b48570f9d60a4cf3c48Andreas Huber 1037ba529e486dde15fe75ea1b48570f9d60a4cf3c48Andreas Huber if (rotationDegrees == 90 || rotationDegrees == 270) { 1038ba529e486dde15fe75ea1b48570f9d60a4cf3c48Andreas Huber notifyListener_l( 1039f5ab57c2d5e02af7483c94eddb177e4f5c9e9892Andreas Huber MEDIA_SET_VIDEO_SIZE, usableHeight, usableWidth); 1040ba529e486dde15fe75ea1b48570f9d60a4cf3c48Andreas Huber } else { 1041ba529e486dde15fe75ea1b48570f9d60a4cf3c48Andreas Huber notifyListener_l( 1042f5ab57c2d5e02af7483c94eddb177e4f5c9e9892Andreas Huber MEDIA_SET_VIDEO_SIZE, usableWidth, usableHeight); 1043ba529e486dde15fe75ea1b48570f9d60a4cf3c48Andreas Huber } 10445daeb129a2c2ba3d14ccd94af283b5f561c783eaAndreas Huber} 10455daeb129a2c2ba3d14ccd94af283b5f561c783eaAndreas Huber 1046bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Hubervoid AwesomePlayer::initRenderer_l() { 10471173118eace0e9e347cb007f0da817cee87579edGlenn Kasten if (mNativeWindow == NULL) { 10480a5ca668c6f7d45706e9aec4a1dfec0aacc6d233Andreas Huber return; 10490a5ca668c6f7d45706e9aec4a1dfec0aacc6d233Andreas Huber } 1050bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber 10510a5ca668c6f7d45706e9aec4a1dfec0aacc6d233Andreas Huber sp<MetaData> meta = mVideoSource->getFormat(); 1052bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber 10530a5ca668c6f7d45706e9aec4a1dfec0aacc6d233Andreas Huber int32_t format; 10540a5ca668c6f7d45706e9aec4a1dfec0aacc6d233Andreas Huber const char *component; 10550a5ca668c6f7d45706e9aec4a1dfec0aacc6d233Andreas Huber int32_t decodedWidth, decodedHeight; 10560a5ca668c6f7d45706e9aec4a1dfec0aacc6d233Andreas Huber CHECK(meta->findInt32(kKeyColorFormat, &format)); 10570a5ca668c6f7d45706e9aec4a1dfec0aacc6d233Andreas Huber CHECK(meta->findCString(kKeyDecoderComponent, &component)); 10580a5ca668c6f7d45706e9aec4a1dfec0aacc6d233Andreas Huber CHECK(meta->findInt32(kKeyWidth, &decodedWidth)); 10590a5ca668c6f7d45706e9aec4a1dfec0aacc6d233Andreas Huber CHECK(meta->findInt32(kKeyHeight, &decodedHeight)); 10604844ac54e8b5997c3b03872dbafe8ebed4787517Andreas Huber 1061ba529e486dde15fe75ea1b48570f9d60a4cf3c48Andreas Huber int32_t rotationDegrees; 1062ba529e486dde15fe75ea1b48570f9d60a4cf3c48Andreas Huber if (!mVideoTrack->getFormat()->findInt32( 1063ba529e486dde15fe75ea1b48570f9d60a4cf3c48Andreas Huber kKeyRotation, &rotationDegrees)) { 1064ba529e486dde15fe75ea1b48570f9d60a4cf3c48Andreas Huber rotationDegrees = 0; 1065ba529e486dde15fe75ea1b48570f9d60a4cf3c48Andreas Huber } 1066ba529e486dde15fe75ea1b48570f9d60a4cf3c48Andreas Huber 10670a5ca668c6f7d45706e9aec4a1dfec0aacc6d233Andreas Huber mVideoRenderer.clear(); 10684844ac54e8b5997c3b03872dbafe8ebed4787517Andreas Huber 10690a5ca668c6f7d45706e9aec4a1dfec0aacc6d233Andreas Huber // Must ensure that mVideoRenderer's destructor is actually executed 10700a5ca668c6f7d45706e9aec4a1dfec0aacc6d233Andreas Huber // before creating a new one. 10710a5ca668c6f7d45706e9aec4a1dfec0aacc6d233Andreas Huber IPCThreadState::self()->flushCommands(); 10720a5ca668c6f7d45706e9aec4a1dfec0aacc6d233Andreas Huber 1073bbba88cb1bdc34705d1477208990a06904c022e7Andreas Huber if (USE_SURFACE_ALLOC 1074bbba88cb1bdc34705d1477208990a06904c022e7Andreas Huber && !strncmp(component, "OMX.", 4) 1075bbba88cb1bdc34705d1477208990a06904c022e7Andreas Huber && strncmp(component, "OMX.google.", 11)) { 10760a5ca668c6f7d45706e9aec4a1dfec0aacc6d233Andreas Huber // Hardware decoders avoid the CPU color conversion by decoding 10770a5ca668c6f7d45706e9aec4a1dfec0aacc6d233Andreas Huber // directly to ANativeBuffers, so we must use a renderer that 10780a5ca668c6f7d45706e9aec4a1dfec0aacc6d233Andreas Huber // just pushes those buffers to the ANativeWindow. 1079ba529e486dde15fe75ea1b48570f9d60a4cf3c48Andreas Huber mVideoRenderer = 10801173118eace0e9e347cb007f0da817cee87579edGlenn Kasten new AwesomeNativeWindowRenderer(mNativeWindow, rotationDegrees); 10810a5ca668c6f7d45706e9aec4a1dfec0aacc6d233Andreas Huber } else { 10820a5ca668c6f7d45706e9aec4a1dfec0aacc6d233Andreas Huber // Other decoders are instantiated locally and as a consequence 10830a5ca668c6f7d45706e9aec4a1dfec0aacc6d233Andreas Huber // allocate their buffers in local address space. This renderer 10840a5ca668c6f7d45706e9aec4a1dfec0aacc6d233Andreas Huber // then performs a color conversion and copy to get the data 10850a5ca668c6f7d45706e9aec4a1dfec0aacc6d233Andreas Huber // into the ANativeBuffer. 10861173118eace0e9e347cb007f0da817cee87579edGlenn Kasten mVideoRenderer = new AwesomeLocalRenderer(mNativeWindow, meta); 1087bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber } 1088bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber} 1089bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber 1090bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huberstatus_t AwesomePlayer::pause() { 1091bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber Mutex::Autolock autoLock(mLock); 10920a5baa9b411fe086013d2a5e9126ed63fbad046cAndreas Huber 1093a0b1d4b161599c2bb2a47119e50c51e75bbe980eAndreas Huber modifyFlags(CACHE_UNDERRUN, CLEAR); 10940a5baa9b411fe086013d2a5e9126ed63fbad046cAndreas Huber 1095bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber return pause_l(); 1096bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber} 1097bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber 1098b2e3954c94717e43b3dc9b880564f166cfbbc0a2Andreas Huberstatus_t AwesomePlayer::pause_l(bool at_eos) { 1099bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber if (!(mFlags & PLAYING)) { 1100bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber return OK; 1101bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber } 1102bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber 110366b0a35c9a4136a84c3f73b1b25fcb5220138b95Andreas Huber cancelPlayerEvents(true /* keepBufferingGoing */); 1104bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber 1105f03034408506051f2f836e59305fcd5f662bf19aAndreas Huber if (mAudioPlayer != NULL && (mFlags & AUDIO_RUNNING)) { 1106b2e3954c94717e43b3dc9b880564f166cfbbc0a2Andreas Huber if (at_eos) { 1107b2e3954c94717e43b3dc9b880564f166cfbbc0a2Andreas Huber // If we played the audio stream to completion we 1108b2e3954c94717e43b3dc9b880564f166cfbbc0a2Andreas Huber // want to make sure that all samples remaining in the audio 1109b2e3954c94717e43b3dc9b880564f166cfbbc0a2Andreas Huber // track's queue are played out. 1110b2e3954c94717e43b3dc9b880564f166cfbbc0a2Andreas Huber mAudioPlayer->pause(true /* playPendingSamples */); 1111b2e3954c94717e43b3dc9b880564f166cfbbc0a2Andreas Huber } else { 1112b2e3954c94717e43b3dc9b880564f166cfbbc0a2Andreas Huber mAudioPlayer->pause(); 1113b2e3954c94717e43b3dc9b880564f166cfbbc0a2Andreas Huber } 1114f03034408506051f2f836e59305fcd5f662bf19aAndreas Huber 1115a0b1d4b161599c2bb2a47119e50c51e75bbe980eAndreas Huber modifyFlags(AUDIO_RUNNING, CLEAR); 1116bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber } 1117bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber 11187a1e3e81264189e23a1db2b174e1b5a5d4c7d1c3Gloria Wang if (mFlags & TEXTPLAYER_STARTED) { 11197a1e3e81264189e23a1db2b174e1b5a5d4c7d1c3Gloria Wang mTextPlayer->pause(); 1120a0b1d4b161599c2bb2a47119e50c51e75bbe980eAndreas Huber modifyFlags(TEXT_RUNNING, CLEAR); 11217a1e3e81264189e23a1db2b174e1b5a5d4c7d1c3Gloria Wang } 11227a1e3e81264189e23a1db2b174e1b5a5d4c7d1c3Gloria Wang 1123a0b1d4b161599c2bb2a47119e50c51e75bbe980eAndreas Huber modifyFlags(PLAYING, CLEAR); 1124bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber 1125dcd25efb46c41c8d24a0a9cf61fb57f84149709eGloria Wang if (mDecryptHandle != NULL) { 1126dcd25efb46c41c8d24a0a9cf61fb57f84149709eGloria Wang mDrmManagerClient->setPlaybackStatus(mDecryptHandle, 1127dcd25efb46c41c8d24a0a9cf61fb57f84149709eGloria Wang Playback::PAUSE, 0); 1128dcd25efb46c41c8d24a0a9cf61fb57f84149709eGloria Wang } 1129dcd25efb46c41c8d24a0a9cf61fb57f84149709eGloria Wang 11307cf180c9bff69e5cc4a2f4e53b432db45ebbebabGloria Wang uint32_t params = IMediaPlayerService::kBatteryDataTrackDecoder; 11317cf180c9bff69e5cc4a2f4e53b432db45ebbebabGloria Wang if ((mAudioSource != NULL) && (mAudioSource != mAudioTrack)) { 11327cf180c9bff69e5cc4a2f4e53b432db45ebbebabGloria Wang params |= IMediaPlayerService::kBatteryDataTrackAudio; 11337cf180c9bff69e5cc4a2f4e53b432db45ebbebabGloria Wang } 11347cf180c9bff69e5cc4a2f4e53b432db45ebbebabGloria Wang if (mVideoSource != NULL) { 11357cf180c9bff69e5cc4a2f4e53b432db45ebbebabGloria Wang params |= IMediaPlayerService::kBatteryDataTrackVideo; 11367cf180c9bff69e5cc4a2f4e53b432db45ebbebabGloria Wang } 11377cf180c9bff69e5cc4a2f4e53b432db45ebbebabGloria Wang 11387cf180c9bff69e5cc4a2f4e53b432db45ebbebabGloria Wang addBatteryData(params); 11397cf180c9bff69e5cc4a2f4e53b432db45ebbebabGloria Wang 1140bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber return OK; 1141bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber} 1142bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber 1143bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huberbool AwesomePlayer::isPlaying() const { 11440a5baa9b411fe086013d2a5e9126ed63fbad046cAndreas Huber return (mFlags & PLAYING) || (mFlags & CACHE_UNDERRUN); 1145bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber} 1146bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber 11475daeb129a2c2ba3d14ccd94af283b5f561c783eaAndreas Hubervoid AwesomePlayer::setSurface(const sp<Surface> &surface) { 11485daeb129a2c2ba3d14ccd94af283b5f561c783eaAndreas Huber Mutex::Autolock autoLock(mLock); 11495daeb129a2c2ba3d14ccd94af283b5f561c783eaAndreas Huber 11505daeb129a2c2ba3d14ccd94af283b5f561c783eaAndreas Huber mSurface = surface; 1151150694cda0842d38a9358fe8d1fcb4fb4a76599eAndreas Huber setNativeWindow_l(surface); 11521173118eace0e9e347cb007f0da817cee87579edGlenn Kasten} 11531173118eace0e9e347cb007f0da817cee87579edGlenn Kasten 11541173118eace0e9e347cb007f0da817cee87579edGlenn Kastenvoid AwesomePlayer::setSurfaceTexture(const sp<ISurfaceTexture> &surfaceTexture) { 11551173118eace0e9e347cb007f0da817cee87579edGlenn Kasten Mutex::Autolock autoLock(mLock); 11561173118eace0e9e347cb007f0da817cee87579edGlenn Kasten 11571173118eace0e9e347cb007f0da817cee87579edGlenn Kasten mSurface.clear(); 11581173118eace0e9e347cb007f0da817cee87579edGlenn Kasten if (surfaceTexture != NULL) { 1159150694cda0842d38a9358fe8d1fcb4fb4a76599eAndreas Huber setNativeWindow_l(new SurfaceTextureClient(surfaceTexture)); 11601173118eace0e9e347cb007f0da817cee87579edGlenn Kasten } 1161150694cda0842d38a9358fe8d1fcb4fb4a76599eAndreas Huber} 11621173118eace0e9e347cb007f0da817cee87579edGlenn Kasten 1163150694cda0842d38a9358fe8d1fcb4fb4a76599eAndreas Hubervoid AwesomePlayer::shutdownVideoDecoder_l() { 1164150694cda0842d38a9358fe8d1fcb4fb4a76599eAndreas Huber if (mVideoBuffer) { 1165150694cda0842d38a9358fe8d1fcb4fb4a76599eAndreas Huber mVideoBuffer->release(); 1166150694cda0842d38a9358fe8d1fcb4fb4a76599eAndreas Huber mVideoBuffer = NULL; 1167150694cda0842d38a9358fe8d1fcb4fb4a76599eAndreas Huber } 1168150694cda0842d38a9358fe8d1fcb4fb4a76599eAndreas Huber 1169150694cda0842d38a9358fe8d1fcb4fb4a76599eAndreas Huber mVideoSource->stop(); 1170150694cda0842d38a9358fe8d1fcb4fb4a76599eAndreas Huber 1171150694cda0842d38a9358fe8d1fcb4fb4a76599eAndreas Huber // The following hack is necessary to ensure that the OMX 1172150694cda0842d38a9358fe8d1fcb4fb4a76599eAndreas Huber // component is completely released by the time we may try 1173150694cda0842d38a9358fe8d1fcb4fb4a76599eAndreas Huber // to instantiate it again. 1174150694cda0842d38a9358fe8d1fcb4fb4a76599eAndreas Huber wp<MediaSource> tmp = mVideoSource; 1175150694cda0842d38a9358fe8d1fcb4fb4a76599eAndreas Huber mVideoSource.clear(); 1176150694cda0842d38a9358fe8d1fcb4fb4a76599eAndreas Huber while (tmp.promote() != NULL) { 1177150694cda0842d38a9358fe8d1fcb4fb4a76599eAndreas Huber usleep(1000); 1178150694cda0842d38a9358fe8d1fcb4fb4a76599eAndreas Huber } 1179150694cda0842d38a9358fe8d1fcb4fb4a76599eAndreas Huber IPCThreadState::self()->flushCommands(); 11809eff287f4f59d6a0c9ca1d5dd8a7bb6e64acf5a4James Dong LOGI("video decoder shutdown completed"); 1181150694cda0842d38a9358fe8d1fcb4fb4a76599eAndreas Huber} 1182150694cda0842d38a9358fe8d1fcb4fb4a76599eAndreas Huber 1183150694cda0842d38a9358fe8d1fcb4fb4a76599eAndreas Hubervoid AwesomePlayer::setNativeWindow_l(const sp<ANativeWindow> &native) { 1184150694cda0842d38a9358fe8d1fcb4fb4a76599eAndreas Huber mNativeWindow = native; 1185150694cda0842d38a9358fe8d1fcb4fb4a76599eAndreas Huber 1186150694cda0842d38a9358fe8d1fcb4fb4a76599eAndreas Huber if (mVideoSource == NULL) { 1187150694cda0842d38a9358fe8d1fcb4fb4a76599eAndreas Huber return; 1188150694cda0842d38a9358fe8d1fcb4fb4a76599eAndreas Huber } 1189150694cda0842d38a9358fe8d1fcb4fb4a76599eAndreas Huber 1190150694cda0842d38a9358fe8d1fcb4fb4a76599eAndreas Huber LOGI("attempting to reconfigure to use new surface"); 1191150694cda0842d38a9358fe8d1fcb4fb4a76599eAndreas Huber 1192150694cda0842d38a9358fe8d1fcb4fb4a76599eAndreas Huber bool wasPlaying = (mFlags & PLAYING) != 0; 1193150694cda0842d38a9358fe8d1fcb4fb4a76599eAndreas Huber 1194150694cda0842d38a9358fe8d1fcb4fb4a76599eAndreas Huber pause_l(); 1195150694cda0842d38a9358fe8d1fcb4fb4a76599eAndreas Huber mVideoRenderer.clear(); 1196150694cda0842d38a9358fe8d1fcb4fb4a76599eAndreas Huber 1197150694cda0842d38a9358fe8d1fcb4fb4a76599eAndreas Huber shutdownVideoDecoder_l(); 1198150694cda0842d38a9358fe8d1fcb4fb4a76599eAndreas Huber 1199150694cda0842d38a9358fe8d1fcb4fb4a76599eAndreas Huber CHECK_EQ(initVideoDecoder(), (status_t)OK); 1200150694cda0842d38a9358fe8d1fcb4fb4a76599eAndreas Huber 1201150694cda0842d38a9358fe8d1fcb4fb4a76599eAndreas Huber if (mLastVideoTimeUs >= 0) { 1202150694cda0842d38a9358fe8d1fcb4fb4a76599eAndreas Huber mSeeking = SEEK; 1203150694cda0842d38a9358fe8d1fcb4fb4a76599eAndreas Huber mSeekNotificationSent = true; 1204150694cda0842d38a9358fe8d1fcb4fb4a76599eAndreas Huber mSeekTimeUs = mLastVideoTimeUs; 1205a0b1d4b161599c2bb2a47119e50c51e75bbe980eAndreas Huber modifyFlags((AT_EOS | AUDIO_AT_EOS | VIDEO_AT_EOS), CLEAR); 1206150694cda0842d38a9358fe8d1fcb4fb4a76599eAndreas Huber } 1207150694cda0842d38a9358fe8d1fcb4fb4a76599eAndreas Huber 1208150694cda0842d38a9358fe8d1fcb4fb4a76599eAndreas Huber if (wasPlaying) { 1209150694cda0842d38a9358fe8d1fcb4fb4a76599eAndreas Huber play_l(); 1210150694cda0842d38a9358fe8d1fcb4fb4a76599eAndreas Huber } 12115daeb129a2c2ba3d14ccd94af283b5f561c783eaAndreas Huber} 12125daeb129a2c2ba3d14ccd94af283b5f561c783eaAndreas Huber 1213bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Hubervoid AwesomePlayer::setAudioSink( 1214bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber const sp<MediaPlayerBase::AudioSink> &audioSink) { 1215bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber Mutex::Autolock autoLock(mLock); 1216bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber 1217bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber mAudioSink = audioSink; 1218bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber} 1219bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber 1220bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huberstatus_t AwesomePlayer::setLooping(bool shouldLoop) { 1221bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber Mutex::Autolock autoLock(mLock); 1222bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber 1223a0b1d4b161599c2bb2a47119e50c51e75bbe980eAndreas Huber modifyFlags(LOOPING, CLEAR); 1224bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber 1225bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber if (shouldLoop) { 1226a0b1d4b161599c2bb2a47119e50c51e75bbe980eAndreas Huber modifyFlags(LOOPING, SET); 1227bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber } 1228bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber 1229bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber return OK; 1230bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber} 1231bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber 1232bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huberstatus_t AwesomePlayer::getDuration(int64_t *durationUs) { 12332415ecb5bb4e1459024f6d6c8ae2d6e3dc4fbdc7Andreas Huber Mutex::Autolock autoLock(mMiscStateLock); 1234bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber 1235bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber if (mDurationUs < 0) { 1236bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber return UNKNOWN_ERROR; 1237bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber } 1238bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber 1239bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber *durationUs = mDurationUs; 1240bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber 1241bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber return OK; 1242bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber} 1243bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber 1244bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huberstatus_t AwesomePlayer::getPosition(int64_t *positionUs) { 12458d342970108926c4ea355c90d26a2a353ec0fd47Andreas Huber if (mRTSPController != NULL) { 12468d342970108926c4ea355c90d26a2a353ec0fd47Andreas Huber *positionUs = mRTSPController->getNormalPlayTimeUs(); 12478d342970108926c4ea355c90d26a2a353ec0fd47Andreas Huber } 124864bb6983690bf994d904591145a3cdd6373bdbe6Andreas Huber else if (mSeeking != NO_SEEK) { 1249dac4ee72bac87388a1495e098f39d73168c8078fAndreas Huber *positionUs = mSeekTimeUs; 12505dac87b088556b8ed7f2a4f5546d31be0bb68680Andreas Huber } else if (mVideoSource != NULL 12515dac87b088556b8ed7f2a4f5546d31be0bb68680Andreas Huber && (mAudioPlayer == NULL || !(mFlags & VIDEO_AT_EOS))) { 12522415ecb5bb4e1459024f6d6c8ae2d6e3dc4fbdc7Andreas Huber Mutex::Autolock autoLock(mMiscStateLock); 1253bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber *positionUs = mVideoTimeUs; 1254bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber } else if (mAudioPlayer != NULL) { 1255bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber *positionUs = mAudioPlayer->getMediaTimeUs(); 1256bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber } else { 1257bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber *positionUs = 0; 1258bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber } 1259bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber 1260bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber return OK; 1261bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber} 1262bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber 1263bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huberstatus_t AwesomePlayer::seekTo(int64_t timeUs) { 126470f521de2675ce6eedf4b22beed94ea1289b0f38Andreas Huber if (mExtractorFlags & MediaExtractor::CAN_SEEK) { 1265acdd9d0f59c3d8bdc3de80664a609527ec3d21e2Andreas Huber Mutex::Autolock autoLock(mLock); 1266acdd9d0f59c3d8bdc3de80664a609527ec3d21e2Andreas Huber return seekTo_l(timeUs); 1267acdd9d0f59c3d8bdc3de80664a609527ec3d21e2Andreas Huber } 1268acdd9d0f59c3d8bdc3de80664a609527ec3d21e2Andreas Huber 1269acdd9d0f59c3d8bdc3de80664a609527ec3d21e2Andreas Huber return OK; 1270bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber} 1271bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber 12727a1e3e81264189e23a1db2b174e1b5a5d4c7d1c3Gloria Wangstatus_t AwesomePlayer::setTimedTextTrackIndex(int32_t index) { 12737a1e3e81264189e23a1db2b174e1b5a5d4c7d1c3Gloria Wang if (mTextPlayer != NULL) { 12747a1e3e81264189e23a1db2b174e1b5a5d4c7d1c3Gloria Wang if (index >= 0) { // to turn on a text track 12757a1e3e81264189e23a1db2b174e1b5a5d4c7d1c3Gloria Wang status_t err = mTextPlayer->setTimedTextTrackIndex(index); 12767a1e3e81264189e23a1db2b174e1b5a5d4c7d1c3Gloria Wang if (err != OK) { 12777a1e3e81264189e23a1db2b174e1b5a5d4c7d1c3Gloria Wang return err; 12787a1e3e81264189e23a1db2b174e1b5a5d4c7d1c3Gloria Wang } 12797a1e3e81264189e23a1db2b174e1b5a5d4c7d1c3Gloria Wang 1280a0b1d4b161599c2bb2a47119e50c51e75bbe980eAndreas Huber modifyFlags(TEXT_RUNNING, SET); 1281a0b1d4b161599c2bb2a47119e50c51e75bbe980eAndreas Huber modifyFlags(TEXTPLAYER_STARTED, SET); 12827a1e3e81264189e23a1db2b174e1b5a5d4c7d1c3Gloria Wang return OK; 12837a1e3e81264189e23a1db2b174e1b5a5d4c7d1c3Gloria Wang } else { // to turn off the text track display 12847a1e3e81264189e23a1db2b174e1b5a5d4c7d1c3Gloria Wang if (mFlags & TEXT_RUNNING) { 1285a0b1d4b161599c2bb2a47119e50c51e75bbe980eAndreas Huber modifyFlags(TEXT_RUNNING, CLEAR); 12867a1e3e81264189e23a1db2b174e1b5a5d4c7d1c3Gloria Wang } 12877a1e3e81264189e23a1db2b174e1b5a5d4c7d1c3Gloria Wang if (mFlags & TEXTPLAYER_STARTED) { 1288a0b1d4b161599c2bb2a47119e50c51e75bbe980eAndreas Huber modifyFlags(TEXTPLAYER_STARTED, CLEAR); 12897a1e3e81264189e23a1db2b174e1b5a5d4c7d1c3Gloria Wang } 12907a1e3e81264189e23a1db2b174e1b5a5d4c7d1c3Gloria Wang 12917a1e3e81264189e23a1db2b174e1b5a5d4c7d1c3Gloria Wang return mTextPlayer->setTimedTextTrackIndex(index); 12927a1e3e81264189e23a1db2b174e1b5a5d4c7d1c3Gloria Wang } 12937a1e3e81264189e23a1db2b174e1b5a5d4c7d1c3Gloria Wang } else { 12947a1e3e81264189e23a1db2b174e1b5a5d4c7d1c3Gloria Wang return INVALID_OPERATION; 12957a1e3e81264189e23a1db2b174e1b5a5d4c7d1c3Gloria Wang } 12967a1e3e81264189e23a1db2b174e1b5a5d4c7d1c3Gloria Wang} 12977a1e3e81264189e23a1db2b174e1b5a5d4c7d1c3Gloria Wang 12980dcd837af4169bdb6fb2a0c384722dc4f57433c6Andreas Huber// static 12990dcd837af4169bdb6fb2a0c384722dc4f57433c6Andreas Hubervoid AwesomePlayer::OnRTSPSeekDoneWrapper(void *cookie) { 13000dcd837af4169bdb6fb2a0c384722dc4f57433c6Andreas Huber static_cast<AwesomePlayer *>(cookie)->onRTSPSeekDone(); 13010dcd837af4169bdb6fb2a0c384722dc4f57433c6Andreas Huber} 13020dcd837af4169bdb6fb2a0c384722dc4f57433c6Andreas Huber 13030dcd837af4169bdb6fb2a0c384722dc4f57433c6Andreas Hubervoid AwesomePlayer::onRTSPSeekDone() { 13040dcd837af4169bdb6fb2a0c384722dc4f57433c6Andreas Huber notifyListener_l(MEDIA_SEEK_COMPLETE); 13050dcd837af4169bdb6fb2a0c384722dc4f57433c6Andreas Huber mSeekNotificationSent = true; 13060dcd837af4169bdb6fb2a0c384722dc4f57433c6Andreas Huber} 13070dcd837af4169bdb6fb2a0c384722dc4f57433c6Andreas Huber 1308bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huberstatus_t AwesomePlayer::seekTo_l(int64_t timeUs) { 1309cce326fe43411855aca2f719e505b051bc4b61b3Andreas Huber if (mRTSPController != NULL) { 13100dcd837af4169bdb6fb2a0c384722dc4f57433c6Andreas Huber mRTSPController->seekAsync(timeUs, OnRTSPSeekDoneWrapper, this); 1311cce326fe43411855aca2f719e505b051bc4b61b3Andreas Huber return OK; 1312cce326fe43411855aca2f719e505b051bc4b61b3Andreas Huber } 1313cce326fe43411855aca2f719e505b051bc4b61b3Andreas Huber 13140a5baa9b411fe086013d2a5e9126ed63fbad046cAndreas Huber if (mFlags & CACHE_UNDERRUN) { 1315a0b1d4b161599c2bb2a47119e50c51e75bbe980eAndreas Huber modifyFlags(CACHE_UNDERRUN, CLEAR); 13160a5baa9b411fe086013d2a5e9126ed63fbad046cAndreas Huber play_l(); 13170a5baa9b411fe086013d2a5e9126ed63fbad046cAndreas Huber } 13180a5baa9b411fe086013d2a5e9126ed63fbad046cAndreas Huber 13195dac87b088556b8ed7f2a4f5546d31be0bb68680Andreas Huber if ((mFlags & PLAYING) && mVideoSource != NULL && (mFlags & VIDEO_AT_EOS)) { 13205dac87b088556b8ed7f2a4f5546d31be0bb68680Andreas Huber // Video playback completed before, there's no pending 13215dac87b088556b8ed7f2a4f5546d31be0bb68680Andreas Huber // video event right now. In order for this new seek 13225dac87b088556b8ed7f2a4f5546d31be0bb68680Andreas Huber // to be honored, we need to post one. 13235dac87b088556b8ed7f2a4f5546d31be0bb68680Andreas Huber 13245dac87b088556b8ed7f2a4f5546d31be0bb68680Andreas Huber postVideoEvent_l(); 13255dac87b088556b8ed7f2a4f5546d31be0bb68680Andreas Huber } 13265dac87b088556b8ed7f2a4f5546d31be0bb68680Andreas Huber 132764bb6983690bf994d904591145a3cdd6373bdbe6Andreas Huber mSeeking = SEEK; 13281321fdd94d354431b930735e9f38f32ecd189a2dAndreas Huber mSeekNotificationSent = false; 1329bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber mSeekTimeUs = timeUs; 1330a0b1d4b161599c2bb2a47119e50c51e75bbe980eAndreas Huber modifyFlags((AT_EOS | AUDIO_AT_EOS | VIDEO_AT_EOS), CLEAR); 1331bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber 1332bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber seekAudioIfNecessary_l(); 1333bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber 13347a1e3e81264189e23a1db2b174e1b5a5d4c7d1c3Gloria Wang if (mFlags & TEXTPLAYER_STARTED) { 13357a1e3e81264189e23a1db2b174e1b5a5d4c7d1c3Gloria Wang mTextPlayer->seekTo(mSeekTimeUs); 13367a1e3e81264189e23a1db2b174e1b5a5d4c7d1c3Gloria Wang } 13377a1e3e81264189e23a1db2b174e1b5a5d4c7d1c3Gloria Wang 13381321fdd94d354431b930735e9f38f32ecd189a2dAndreas Huber if (!(mFlags & PLAYING)) { 13391321fdd94d354431b930735e9f38f32ecd189a2dAndreas Huber LOGV("seeking while paused, sending SEEK_COMPLETE notification" 13401321fdd94d354431b930735e9f38f32ecd189a2dAndreas Huber " immediately."); 13411321fdd94d354431b930735e9f38f32ecd189a2dAndreas Huber 13421321fdd94d354431b930735e9f38f32ecd189a2dAndreas Huber notifyListener_l(MEDIA_SEEK_COMPLETE); 13431321fdd94d354431b930735e9f38f32ecd189a2dAndreas Huber mSeekNotificationSent = true; 13442b1222f8938356669672f35e0e53e176c78c40efAndreas Huber 13452b1222f8938356669672f35e0e53e176c78c40efAndreas Huber if ((mFlags & PREPARED) && mVideoSource != NULL) { 1346a0b1d4b161599c2bb2a47119e50c51e75bbe980eAndreas Huber modifyFlags(SEEK_PREVIEW, SET); 13472b1222f8938356669672f35e0e53e176c78c40efAndreas Huber postVideoEvent_l(); 13482b1222f8938356669672f35e0e53e176c78c40efAndreas Huber } 13491321fdd94d354431b930735e9f38f32ecd189a2dAndreas Huber } 13501321fdd94d354431b930735e9f38f32ecd189a2dAndreas Huber 1351bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber return OK; 1352bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber} 1353bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber 1354bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Hubervoid AwesomePlayer::seekAudioIfNecessary_l() { 135564bb6983690bf994d904591145a3cdd6373bdbe6Andreas Huber if (mSeeking != NO_SEEK && mVideoSource == NULL && mAudioPlayer != NULL) { 1356bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber mAudioPlayer->seekTo(mSeekTimeUs); 1357bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber 13581862a33b246249630b654182afb5914da3480d4cAndreas Huber mWatchForAudioSeekComplete = true; 13591862a33b246249630b654182afb5914da3480d4cAndreas Huber mWatchForAudioEOS = true; 1360dcd25efb46c41c8d24a0a9cf61fb57f84149709eGloria Wang 1361dcd25efb46c41c8d24a0a9cf61fb57f84149709eGloria Wang if (mDecryptHandle != NULL) { 1362dcd25efb46c41c8d24a0a9cf61fb57f84149709eGloria Wang mDrmManagerClient->setPlaybackStatus(mDecryptHandle, 1363dcd25efb46c41c8d24a0a9cf61fb57f84149709eGloria Wang Playback::PAUSE, 0); 1364dcd25efb46c41c8d24a0a9cf61fb57f84149709eGloria Wang mDrmManagerClient->setPlaybackStatus(mDecryptHandle, 1365dcd25efb46c41c8d24a0a9cf61fb57f84149709eGloria Wang Playback::START, mSeekTimeUs / 1000); 1366dcd25efb46c41c8d24a0a9cf61fb57f84149709eGloria Wang } 1367bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber } 1368bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber} 1369bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber 137088d8a83de12592635248aa1a3bd6b9ea46108501Andreas Hubervoid AwesomePlayer::setAudioSource(sp<MediaSource> source) { 137188d8a83de12592635248aa1a3bd6b9ea46108501Andreas Huber CHECK(source != NULL); 1372bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber 137388d8a83de12592635248aa1a3bd6b9ea46108501Andreas Huber mAudioTrack = source; 137488d8a83de12592635248aa1a3bd6b9ea46108501Andreas Huber} 137588d8a83de12592635248aa1a3bd6b9ea46108501Andreas Huber 13767a1e3e81264189e23a1db2b174e1b5a5d4c7d1c3Gloria Wangvoid AwesomePlayer::addTextSource(sp<MediaSource> source) { 1377965d08ba16ee82bc85f69546360c18e7da907406Gloria Wang Mutex::Autolock autoLock(mTimedTextLock); 13787a1e3e81264189e23a1db2b174e1b5a5d4c7d1c3Gloria Wang CHECK(source != NULL); 13797a1e3e81264189e23a1db2b174e1b5a5d4c7d1c3Gloria Wang 13807a1e3e81264189e23a1db2b174e1b5a5d4c7d1c3Gloria Wang if (mTextPlayer == NULL) { 13817a1e3e81264189e23a1db2b174e1b5a5d4c7d1c3Gloria Wang mTextPlayer = new TimedTextPlayer(this, mListener, &mQueue); 13827a1e3e81264189e23a1db2b174e1b5a5d4c7d1c3Gloria Wang } 13837a1e3e81264189e23a1db2b174e1b5a5d4c7d1c3Gloria Wang 13847a1e3e81264189e23a1db2b174e1b5a5d4c7d1c3Gloria Wang mTextPlayer->addTextSource(source); 13857a1e3e81264189e23a1db2b174e1b5a5d4c7d1c3Gloria Wang} 13867a1e3e81264189e23a1db2b174e1b5a5d4c7d1c3Gloria Wang 138788d8a83de12592635248aa1a3bd6b9ea46108501Andreas Huberstatus_t AwesomePlayer::initAudioDecoder() { 138888d8a83de12592635248aa1a3bd6b9ea46108501Andreas Huber sp<MetaData> meta = mAudioTrack->getFormat(); 1389717826ececd8d39596f62418677721d70776add1Andreas Huber 1390717826ececd8d39596f62418677721d70776add1Andreas Huber const char *mime; 1391717826ececd8d39596f62418677721d70776add1Andreas Huber CHECK(meta->findCString(kKeyMIMEType, &mime)); 1392717826ececd8d39596f62418677721d70776add1Andreas Huber 1393717826ececd8d39596f62418677721d70776add1Andreas Huber if (!strcasecmp(mime, MEDIA_MIMETYPE_AUDIO_RAW)) { 139488d8a83de12592635248aa1a3bd6b9ea46108501Andreas Huber mAudioSource = mAudioTrack; 1395717826ececd8d39596f62418677721d70776add1Andreas Huber } else { 1396717826ececd8d39596f62418677721d70776add1Andreas Huber mAudioSource = OMXCodec::Create( 139788d8a83de12592635248aa1a3bd6b9ea46108501Andreas Huber mClient.interface(), mAudioTrack->getFormat(), 1398717826ececd8d39596f62418677721d70776add1Andreas Huber false, // createEncoder 139988d8a83de12592635248aa1a3bd6b9ea46108501Andreas Huber mAudioTrack); 1400717826ececd8d39596f62418677721d70776add1Andreas Huber } 1401bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber 1402bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber if (mAudioSource != NULL) { 1403bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber int64_t durationUs; 140488d8a83de12592635248aa1a3bd6b9ea46108501Andreas Huber if (mAudioTrack->getFormat()->findInt64(kKeyDuration, &durationUs)) { 14052415ecb5bb4e1459024f6d6c8ae2d6e3dc4fbdc7Andreas Huber Mutex::Autolock autoLock(mMiscStateLock); 1406bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber if (mDurationUs < 0 || durationUs > mDurationUs) { 1407bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber mDurationUs = durationUs; 1408bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber } 1409bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber } 1410bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber 1411a945bfd91aa291fba4d9201ffcb38fce40eab7feAndreas Huber status_t err = mAudioSource->start(); 1412a945bfd91aa291fba4d9201ffcb38fce40eab7feAndreas Huber 1413a945bfd91aa291fba4d9201ffcb38fce40eab7feAndreas Huber if (err != OK) { 1414a945bfd91aa291fba4d9201ffcb38fce40eab7feAndreas Huber mAudioSource.clear(); 1415a945bfd91aa291fba4d9201ffcb38fce40eab7feAndreas Huber return err; 1416a945bfd91aa291fba4d9201ffcb38fce40eab7feAndreas Huber } 141781f82c32459029bf0744e28c73f95a7f18cab5acAndreas Huber } else if (!strcasecmp(mime, MEDIA_MIMETYPE_AUDIO_QCELP)) { 141881f82c32459029bf0744e28c73f95a7f18cab5acAndreas Huber // For legacy reasons we're simply going to ignore the absence 141981f82c32459029bf0744e28c73f95a7f18cab5acAndreas Huber // of an audio decoder for QCELP instead of aborting playback 142081f82c32459029bf0744e28c73f95a7f18cab5acAndreas Huber // altogether. 142181f82c32459029bf0744e28c73f95a7f18cab5acAndreas Huber return OK; 142281f82c32459029bf0744e28c73f95a7f18cab5acAndreas Huber } 1423e7e3b785a0e7819db4c895a4f60e9a4dd755880cAndreas Huber 1424a0b1d4b161599c2bb2a47119e50c51e75bbe980eAndreas Huber if (mAudioSource != NULL) { 1425a0b1d4b161599c2bb2a47119e50c51e75bbe980eAndreas Huber Mutex::Autolock autoLock(mStatsLock); 1426a0b1d4b161599c2bb2a47119e50c51e75bbe980eAndreas Huber TrackStat *stat = &mStats.mTracks.editItemAt(mStats.mAudioTrackIndex); 1427a0b1d4b161599c2bb2a47119e50c51e75bbe980eAndreas Huber 1428a0b1d4b161599c2bb2a47119e50c51e75bbe980eAndreas Huber const char *component; 1429a0b1d4b161599c2bb2a47119e50c51e75bbe980eAndreas Huber if (!mAudioSource->getFormat() 1430a0b1d4b161599c2bb2a47119e50c51e75bbe980eAndreas Huber ->findCString(kKeyDecoderComponent, &component)) { 1431a0b1d4b161599c2bb2a47119e50c51e75bbe980eAndreas Huber component = "none"; 1432a0b1d4b161599c2bb2a47119e50c51e75bbe980eAndreas Huber } 1433a0b1d4b161599c2bb2a47119e50c51e75bbe980eAndreas Huber 1434a0b1d4b161599c2bb2a47119e50c51e75bbe980eAndreas Huber stat->mDecoderName = component; 1435a0b1d4b161599c2bb2a47119e50c51e75bbe980eAndreas Huber } 1436a0b1d4b161599c2bb2a47119e50c51e75bbe980eAndreas Huber 1437bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber return mAudioSource != NULL ? OK : UNKNOWN_ERROR; 1438bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber} 1439bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber 144088d8a83de12592635248aa1a3bd6b9ea46108501Andreas Hubervoid AwesomePlayer::setVideoSource(sp<MediaSource> source) { 144188d8a83de12592635248aa1a3bd6b9ea46108501Andreas Huber CHECK(source != NULL); 1442bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber 144388d8a83de12592635248aa1a3bd6b9ea46108501Andreas Huber mVideoTrack = source; 144488d8a83de12592635248aa1a3bd6b9ea46108501Andreas Huber} 144588d8a83de12592635248aa1a3bd6b9ea46108501Andreas Huber 14462a4d22d79e927f2245537921e10fc5fda1c47a29Andreas Huberstatus_t AwesomePlayer::initVideoDecoder(uint32_t flags) { 14472eb62955eb84b97695e8a7e56e14310cbb86412bGlenn Kasten 14482eb62955eb84b97695e8a7e56e14310cbb86412bGlenn Kasten // Either the application or the DRM system can independently say 14492eb62955eb84b97695e8a7e56e14310cbb86412bGlenn Kasten // that there must be a hardware-protected path to an external video sink. 14502eb62955eb84b97695e8a7e56e14310cbb86412bGlenn Kasten // For now we always require a hardware-protected path to external video sink 14512eb62955eb84b97695e8a7e56e14310cbb86412bGlenn Kasten // if content is DRMed, but eventually this could be optional per DRM agent. 14522eb62955eb84b97695e8a7e56e14310cbb86412bGlenn Kasten // When the application wants protection, then 14532eb62955eb84b97695e8a7e56e14310cbb86412bGlenn Kasten // (USE_SURFACE_ALLOC && (mSurface != 0) && 14542eb62955eb84b97695e8a7e56e14310cbb86412bGlenn Kasten // (mSurface->getFlags() & ISurfaceComposer::eProtectedByApp)) 14552eb62955eb84b97695e8a7e56e14310cbb86412bGlenn Kasten // will be true, but that part is already handled by SurfaceFlinger. 1456eabd34665adc284525fe7337ad5c56a8b92964efGlenn Kasten 1457eabd34665adc284525fe7337ad5c56a8b92964efGlenn Kasten#ifdef DEBUG_HDCP 1458eabd34665adc284525fe7337ad5c56a8b92964efGlenn Kasten // For debugging, we allow a system property to control the protected usage. 1459eabd34665adc284525fe7337ad5c56a8b92964efGlenn Kasten // In case of uninitialized or unexpected property, we default to "DRM only". 1460eabd34665adc284525fe7337ad5c56a8b92964efGlenn Kasten bool setProtectionBit = false; 1461eabd34665adc284525fe7337ad5c56a8b92964efGlenn Kasten char value[PROPERTY_VALUE_MAX]; 1462eabd34665adc284525fe7337ad5c56a8b92964efGlenn Kasten if (property_get("persist.sys.hdcp_checking", value, NULL)) { 1463eabd34665adc284525fe7337ad5c56a8b92964efGlenn Kasten if (!strcmp(value, "never")) { 1464eabd34665adc284525fe7337ad5c56a8b92964efGlenn Kasten // nop 1465eabd34665adc284525fe7337ad5c56a8b92964efGlenn Kasten } else if (!strcmp(value, "always")) { 1466eabd34665adc284525fe7337ad5c56a8b92964efGlenn Kasten setProtectionBit = true; 1467eabd34665adc284525fe7337ad5c56a8b92964efGlenn Kasten } else if (!strcmp(value, "drm-only")) { 1468eabd34665adc284525fe7337ad5c56a8b92964efGlenn Kasten if (mDecryptHandle != NULL) { 1469eabd34665adc284525fe7337ad5c56a8b92964efGlenn Kasten setProtectionBit = true; 1470eabd34665adc284525fe7337ad5c56a8b92964efGlenn Kasten } 1471eabd34665adc284525fe7337ad5c56a8b92964efGlenn Kasten // property value is empty, or unexpected value 1472eabd34665adc284525fe7337ad5c56a8b92964efGlenn Kasten } else { 1473eabd34665adc284525fe7337ad5c56a8b92964efGlenn Kasten if (mDecryptHandle != NULL) { 1474eabd34665adc284525fe7337ad5c56a8b92964efGlenn Kasten setProtectionBit = true; 1475eabd34665adc284525fe7337ad5c56a8b92964efGlenn Kasten } 1476eabd34665adc284525fe7337ad5c56a8b92964efGlenn Kasten } 1477eabd34665adc284525fe7337ad5c56a8b92964efGlenn Kasten // can' read property value 1478eabd34665adc284525fe7337ad5c56a8b92964efGlenn Kasten } else { 1479eabd34665adc284525fe7337ad5c56a8b92964efGlenn Kasten if (mDecryptHandle != NULL) { 1480eabd34665adc284525fe7337ad5c56a8b92964efGlenn Kasten setProtectionBit = true; 1481eabd34665adc284525fe7337ad5c56a8b92964efGlenn Kasten } 1482eabd34665adc284525fe7337ad5c56a8b92964efGlenn Kasten } 1483eabd34665adc284525fe7337ad5c56a8b92964efGlenn Kasten // note that usage bit is already cleared, so no need to clear it in the "else" case 1484eabd34665adc284525fe7337ad5c56a8b92964efGlenn Kasten if (setProtectionBit) { 1485eabd34665adc284525fe7337ad5c56a8b92964efGlenn Kasten flags |= OMXCodec::kEnableGrallocUsageProtected; 1486eabd34665adc284525fe7337ad5c56a8b92964efGlenn Kasten } 1487eabd34665adc284525fe7337ad5c56a8b92964efGlenn Kasten#else 14882eb62955eb84b97695e8a7e56e14310cbb86412bGlenn Kasten if (mDecryptHandle != NULL) { 14892eb62955eb84b97695e8a7e56e14310cbb86412bGlenn Kasten flags |= OMXCodec::kEnableGrallocUsageProtected; 14902eb62955eb84b97695e8a7e56e14310cbb86412bGlenn Kasten } 1491eabd34665adc284525fe7337ad5c56a8b92964efGlenn Kasten#endif 14922eb62955eb84b97695e8a7e56e14310cbb86412bGlenn Kasten LOGV("initVideoDecoder flags=0x%x", flags); 1493bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber mVideoSource = OMXCodec::Create( 149488d8a83de12592635248aa1a3bd6b9ea46108501Andreas Huber mClient.interface(), mVideoTrack->getFormat(), 1495bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber false, // createEncoder 149639ddf8e0f18766f7ba1e3246b774aa6ebd93eea8Andreas Huber mVideoTrack, 14971173118eace0e9e347cb007f0da817cee87579edGlenn Kasten NULL, flags, USE_SURFACE_ALLOC ? mNativeWindow : NULL); 1498bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber 1499bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber if (mVideoSource != NULL) { 1500bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber int64_t durationUs; 150188d8a83de12592635248aa1a3bd6b9ea46108501Andreas Huber if (mVideoTrack->getFormat()->findInt64(kKeyDuration, &durationUs)) { 15022415ecb5bb4e1459024f6d6c8ae2d6e3dc4fbdc7Andreas Huber Mutex::Autolock autoLock(mMiscStateLock); 1503bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber if (mDurationUs < 0 || durationUs > mDurationUs) { 1504bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber mDurationUs = durationUs; 1505bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber } 1506bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber } 1507bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber 1508139a5d5bd33c9fc7708d0a79f11ee928f7796e6bAndreas Huber status_t err = mVideoSource->start(); 1509139a5d5bd33c9fc7708d0a79f11ee928f7796e6bAndreas Huber 1510139a5d5bd33c9fc7708d0a79f11ee928f7796e6bAndreas Huber if (err != OK) { 1511139a5d5bd33c9fc7708d0a79f11ee928f7796e6bAndreas Huber mVideoSource.clear(); 1512139a5d5bd33c9fc7708d0a79f11ee928f7796e6bAndreas Huber return err; 1513139a5d5bd33c9fc7708d0a79f11ee928f7796e6bAndreas Huber } 1514bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber } 1515bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber 1516a0b1d4b161599c2bb2a47119e50c51e75bbe980eAndreas Huber if (mVideoSource != NULL) { 1517a0b1d4b161599c2bb2a47119e50c51e75bbe980eAndreas Huber Mutex::Autolock autoLock(mStatsLock); 1518a0b1d4b161599c2bb2a47119e50c51e75bbe980eAndreas Huber TrackStat *stat = &mStats.mTracks.editItemAt(mStats.mVideoTrackIndex); 1519a0b1d4b161599c2bb2a47119e50c51e75bbe980eAndreas Huber 1520a0b1d4b161599c2bb2a47119e50c51e75bbe980eAndreas Huber const char *component; 1521a0b1d4b161599c2bb2a47119e50c51e75bbe980eAndreas Huber CHECK(mVideoSource->getFormat() 1522a0b1d4b161599c2bb2a47119e50c51e75bbe980eAndreas Huber ->findCString(kKeyDecoderComponent, &component)); 1523a0b1d4b161599c2bb2a47119e50c51e75bbe980eAndreas Huber 1524a0b1d4b161599c2bb2a47119e50c51e75bbe980eAndreas Huber stat->mDecoderName = component; 1525a0b1d4b161599c2bb2a47119e50c51e75bbe980eAndreas Huber } 1526a0b1d4b161599c2bb2a47119e50c51e75bbe980eAndreas Huber 1527bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber return mVideoSource != NULL ? OK : UNKNOWN_ERROR; 1528bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber} 1529bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber 15304769cc92740e3ab58e9263d42553c12bbf79e3beAndreas Hubervoid AwesomePlayer::finishSeekIfNecessary(int64_t videoTimeUs) { 153164bb6983690bf994d904591145a3cdd6373bdbe6Andreas Huber if (mSeeking == SEEK_VIDEO_ONLY) { 153264bb6983690bf994d904591145a3cdd6373bdbe6Andreas Huber mSeeking = NO_SEEK; 153364bb6983690bf994d904591145a3cdd6373bdbe6Andreas Huber return; 153464bb6983690bf994d904591145a3cdd6373bdbe6Andreas Huber } 153564bb6983690bf994d904591145a3cdd6373bdbe6Andreas Huber 153664bb6983690bf994d904591145a3cdd6373bdbe6Andreas Huber if (mSeeking == NO_SEEK || (mFlags & SEEK_PREVIEW)) { 15374769cc92740e3ab58e9263d42553c12bbf79e3beAndreas Huber return; 15384769cc92740e3ab58e9263d42553c12bbf79e3beAndreas Huber } 15394769cc92740e3ab58e9263d42553c12bbf79e3beAndreas Huber 15404769cc92740e3ab58e9263d42553c12bbf79e3beAndreas Huber if (mAudioPlayer != NULL) { 1541f83dd80384f70da1f6d36d60e831439ff7739ad7Jamie Gennis LOGV("seeking audio to %lld us (%.2f secs).", videoTimeUs, videoTimeUs / 1E6); 15424769cc92740e3ab58e9263d42553c12bbf79e3beAndreas Huber 15434769cc92740e3ab58e9263d42553c12bbf79e3beAndreas Huber // If we don't have a video time, seek audio to the originally 15444769cc92740e3ab58e9263d42553c12bbf79e3beAndreas Huber // requested seek time instead. 15454769cc92740e3ab58e9263d42553c12bbf79e3beAndreas Huber 15464769cc92740e3ab58e9263d42553c12bbf79e3beAndreas Huber mAudioPlayer->seekTo(videoTimeUs < 0 ? mSeekTimeUs : videoTimeUs); 15474769cc92740e3ab58e9263d42553c12bbf79e3beAndreas Huber mWatchForAudioSeekComplete = true; 15485dac87b088556b8ed7f2a4f5546d31be0bb68680Andreas Huber mWatchForAudioEOS = true; 15494769cc92740e3ab58e9263d42553c12bbf79e3beAndreas Huber } else if (!mSeekNotificationSent) { 15504769cc92740e3ab58e9263d42553c12bbf79e3beAndreas Huber // If we're playing video only, report seek complete now, 15514769cc92740e3ab58e9263d42553c12bbf79e3beAndreas Huber // otherwise audio player will notify us later. 15524769cc92740e3ab58e9263d42553c12bbf79e3beAndreas Huber notifyListener_l(MEDIA_SEEK_COMPLETE); 1553512895089f2035bc86d3f502255199809aca721bAndreas Huber mSeekNotificationSent = true; 15544769cc92740e3ab58e9263d42553c12bbf79e3beAndreas Huber } 15554769cc92740e3ab58e9263d42553c12bbf79e3beAndreas Huber 1556a0b1d4b161599c2bb2a47119e50c51e75bbe980eAndreas Huber modifyFlags(FIRST_FRAME, SET); 155764bb6983690bf994d904591145a3cdd6373bdbe6Andreas Huber mSeeking = NO_SEEK; 1558a89082944308805b0def7de87c67e370e74b8789Gloria Wang 1559a89082944308805b0def7de87c67e370e74b8789Gloria Wang if (mDecryptHandle != NULL) { 1560a89082944308805b0def7de87c67e370e74b8789Gloria Wang mDrmManagerClient->setPlaybackStatus(mDecryptHandle, 1561a89082944308805b0def7de87c67e370e74b8789Gloria Wang Playback::PAUSE, 0); 1562a89082944308805b0def7de87c67e370e74b8789Gloria Wang mDrmManagerClient->setPlaybackStatus(mDecryptHandle, 1563a89082944308805b0def7de87c67e370e74b8789Gloria Wang Playback::START, videoTimeUs / 1000); 1564a89082944308805b0def7de87c67e370e74b8789Gloria Wang } 15654769cc92740e3ab58e9263d42553c12bbf79e3beAndreas Huber} 15664769cc92740e3ab58e9263d42553c12bbf79e3beAndreas Huber 1567c23f12af0394aa2f6651968a3c8840f1af317aa1Andreas Hubervoid AwesomePlayer::onVideoEvent() { 1568bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber Mutex::Autolock autoLock(mLock); 15697b3396acc702451be9bafb19d7fe26d55d43a316Andreas Huber if (!mVideoEventPending) { 15707b3396acc702451be9bafb19d7fe26d55d43a316Andreas Huber // The event has been cancelled in reset_l() but had already 15717b3396acc702451be9bafb19d7fe26d55d43a316Andreas Huber // been scheduled for execution at that time. 15727b3396acc702451be9bafb19d7fe26d55d43a316Andreas Huber return; 15737b3396acc702451be9bafb19d7fe26d55d43a316Andreas Huber } 1574bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber mVideoEventPending = false; 1575bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber 157664bb6983690bf994d904591145a3cdd6373bdbe6Andreas Huber if (mSeeking != NO_SEEK) { 1577bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber if (mVideoBuffer) { 1578bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber mVideoBuffer->release(); 1579bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber mVideoBuffer = NULL; 1580bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber } 15810a5baa9b411fe086013d2a5e9126ed63fbad046cAndreas Huber 1582681755fc0d0797506456f46a2a10555916d6be32Andreas Huber if (mSeeking == SEEK && isStreamingHTTP() && mAudioSource != NULL 15832b1222f8938356669672f35e0e53e176c78c40efAndreas Huber && !(mFlags & SEEK_PREVIEW)) { 15840a5baa9b411fe086013d2a5e9126ed63fbad046cAndreas Huber // We're going to seek the video source first, followed by 15850a5baa9b411fe086013d2a5e9126ed63fbad046cAndreas Huber // the audio source. 15860a5baa9b411fe086013d2a5e9126ed63fbad046cAndreas Huber // In order to avoid jumps in the DataSource offset caused by 15870a5baa9b411fe086013d2a5e9126ed63fbad046cAndreas Huber // the audio codec prefetching data from the old locations 15880a5baa9b411fe086013d2a5e9126ed63fbad046cAndreas Huber // while the video codec is already reading data from the new 15890a5baa9b411fe086013d2a5e9126ed63fbad046cAndreas Huber // locations, we'll "pause" the audio source, causing it to 15900a5baa9b411fe086013d2a5e9126ed63fbad046cAndreas Huber // stop reading input data until a subsequent seek. 15910a5baa9b411fe086013d2a5e9126ed63fbad046cAndreas Huber 1592f03034408506051f2f836e59305fcd5f662bf19aAndreas Huber if (mAudioPlayer != NULL && (mFlags & AUDIO_RUNNING)) { 15930a5baa9b411fe086013d2a5e9126ed63fbad046cAndreas Huber mAudioPlayer->pause(); 1594f03034408506051f2f836e59305fcd5f662bf19aAndreas Huber 1595a0b1d4b161599c2bb2a47119e50c51e75bbe980eAndreas Huber modifyFlags(AUDIO_RUNNING, CLEAR); 15960a5baa9b411fe086013d2a5e9126ed63fbad046cAndreas Huber } 15970a5baa9b411fe086013d2a5e9126ed63fbad046cAndreas Huber mAudioSource->pause(); 15980a5baa9b411fe086013d2a5e9126ed63fbad046cAndreas Huber } 1599bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber } 1600bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber 1601bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber if (!mVideoBuffer) { 1602bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber MediaSource::ReadOptions options; 160364bb6983690bf994d904591145a3cdd6373bdbe6Andreas Huber if (mSeeking != NO_SEEK) { 1604bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber LOGV("seeking to %lld us (%.2f secs)", mSeekTimeUs, mSeekTimeUs / 1E6); 1605bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber 1606abd1f4f870925d6776dbe4b930b759a1ab6595caAndreas Huber options.setSeekTo( 160764bb6983690bf994d904591145a3cdd6373bdbe6Andreas Huber mSeekTimeUs, 160864bb6983690bf994d904591145a3cdd6373bdbe6Andreas Huber mSeeking == SEEK_VIDEO_ONLY 160964bb6983690bf994d904591145a3cdd6373bdbe6Andreas Huber ? MediaSource::ReadOptions::SEEK_NEXT_SYNC 161064bb6983690bf994d904591145a3cdd6373bdbe6Andreas Huber : MediaSource::ReadOptions::SEEK_CLOSEST_SYNC); 1611bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber } 1612bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber for (;;) { 1613bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber status_t err = mVideoSource->read(&mVideoBuffer, &options); 1614c1689e49ac867de33f2e81289449878ac2e536a0Andreas Huber options.clearSeekTo(); 1615bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber 1616bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber if (err != OK) { 1617e2b1028852120bcfded33b8f06f66b780437fe92Andreas Huber CHECK(mVideoBuffer == NULL); 1618bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber 1619bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber if (err == INFO_FORMAT_CHANGED) { 1620bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber LOGV("VideoSource signalled format change."); 1621bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber 16225daeb129a2c2ba3d14ccd94af283b5f561c783eaAndreas Huber notifyVideoSize_l(); 16235daeb129a2c2ba3d14ccd94af283b5f561c783eaAndreas Huber 1624a657f8deaf21acbe5faba7be1df9c6681d44d471Andreas Huber if (mVideoRenderer != NULL) { 1625fa090f541bb84a546af2ec834e91a032ff10e66eAndreas Huber mVideoRendererIsPreview = false; 1626a657f8deaf21acbe5faba7be1df9c6681d44d471Andreas Huber initRenderer_l(); 1627a657f8deaf21acbe5faba7be1df9c6681d44d471Andreas Huber } 1628bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber continue; 1629bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber } 1630bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber 16314769cc92740e3ab58e9263d42553c12bbf79e3beAndreas Huber // So video playback is complete, but we may still have 16324769cc92740e3ab58e9263d42553c12bbf79e3beAndreas Huber // a seek request pending that needs to be applied 16334769cc92740e3ab58e9263d42553c12bbf79e3beAndreas Huber // to the audio track. 163464bb6983690bf994d904591145a3cdd6373bdbe6Andreas Huber if (mSeeking != NO_SEEK) { 16354769cc92740e3ab58e9263d42553c12bbf79e3beAndreas Huber LOGV("video stream ended while seeking!"); 16364769cc92740e3ab58e9263d42553c12bbf79e3beAndreas Huber } 16374769cc92740e3ab58e9263d42553c12bbf79e3beAndreas Huber finishSeekIfNecessary(-1); 16384769cc92740e3ab58e9263d42553c12bbf79e3beAndreas Huber 16395dac87b088556b8ed7f2a4f5546d31be0bb68680Andreas Huber if (mAudioPlayer != NULL 16405dac87b088556b8ed7f2a4f5546d31be0bb68680Andreas Huber && !(mFlags & (AUDIO_RUNNING | SEEK_PREVIEW))) { 16415dac87b088556b8ed7f2a4f5546d31be0bb68680Andreas Huber startAudioPlayer_l(); 16425dac87b088556b8ed7f2a4f5546d31be0bb68680Andreas Huber } 16435dac87b088556b8ed7f2a4f5546d31be0bb68680Andreas Huber 1644a0b1d4b161599c2bb2a47119e50c51e75bbe980eAndreas Huber modifyFlags(VIDEO_AT_EOS, SET); 16455295c0c55d41a2906ea7f65a3f22e6278cb17d4bAndreas Huber postStreamDoneEvent_l(err); 1646bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber return; 1647bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber } 1648bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber 16494844ac54e8b5997c3b03872dbafe8ebed4787517Andreas Huber if (mVideoBuffer->range_length() == 0) { 165008411b75d4c30ce26180639f158e2f33d190eee8Andreas Huber // Some decoders, notably the PV AVC software decoder 165108411b75d4c30ce26180639f158e2f33d190eee8Andreas Huber // return spurious empty buffers that we just want to ignore. 165208411b75d4c30ce26180639f158e2f33d190eee8Andreas Huber 16534844ac54e8b5997c3b03872dbafe8ebed4787517Andreas Huber mVideoBuffer->release(); 16544844ac54e8b5997c3b03872dbafe8ebed4787517Andreas Huber mVideoBuffer = NULL; 16554844ac54e8b5997c3b03872dbafe8ebed4787517Andreas Huber continue; 16564844ac54e8b5997c3b03872dbafe8ebed4787517Andreas Huber } 16574844ac54e8b5997c3b03872dbafe8ebed4787517Andreas Huber 1658bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber break; 1659bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber } 1660a0b1d4b161599c2bb2a47119e50c51e75bbe980eAndreas Huber 1661a0b1d4b161599c2bb2a47119e50c51e75bbe980eAndreas Huber { 1662a0b1d4b161599c2bb2a47119e50c51e75bbe980eAndreas Huber Mutex::Autolock autoLock(mStatsLock); 1663a0b1d4b161599c2bb2a47119e50c51e75bbe980eAndreas Huber ++mStats.mNumVideoFramesDecoded; 1664a0b1d4b161599c2bb2a47119e50c51e75bbe980eAndreas Huber } 1665bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber } 1666bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber 1667bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber int64_t timeUs; 1668bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber CHECK(mVideoBuffer->meta_data()->findInt64(kKeyTime, &timeUs)); 1669bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber 1670150694cda0842d38a9358fe8d1fcb4fb4a76599eAndreas Huber mLastVideoTimeUs = timeUs; 1671150694cda0842d38a9358fe8d1fcb4fb4a76599eAndreas Huber 167264bb6983690bf994d904591145a3cdd6373bdbe6Andreas Huber if (mSeeking == SEEK_VIDEO_ONLY) { 167364bb6983690bf994d904591145a3cdd6373bdbe6Andreas Huber if (mSeekTimeUs > timeUs) { 167464bb6983690bf994d904591145a3cdd6373bdbe6Andreas Huber LOGI("XXX mSeekTimeUs = %lld us, timeUs = %lld us", 167564bb6983690bf994d904591145a3cdd6373bdbe6Andreas Huber mSeekTimeUs, timeUs); 167664bb6983690bf994d904591145a3cdd6373bdbe6Andreas Huber } 167764bb6983690bf994d904591145a3cdd6373bdbe6Andreas Huber } 167864bb6983690bf994d904591145a3cdd6373bdbe6Andreas Huber 16792415ecb5bb4e1459024f6d6c8ae2d6e3dc4fbdc7Andreas Huber { 16802415ecb5bb4e1459024f6d6c8ae2d6e3dc4fbdc7Andreas Huber Mutex::Autolock autoLock(mMiscStateLock); 16812415ecb5bb4e1459024f6d6c8ae2d6e3dc4fbdc7Andreas Huber mVideoTimeUs = timeUs; 16822415ecb5bb4e1459024f6d6c8ae2d6e3dc4fbdc7Andreas Huber } 1683bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber 168464bb6983690bf994d904591145a3cdd6373bdbe6Andreas Huber SeekType wasSeeking = mSeeking; 16854769cc92740e3ab58e9263d42553c12bbf79e3beAndreas Huber finishSeekIfNecessary(timeUs); 1686bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber 1687f03034408506051f2f836e59305fcd5f662bf19aAndreas Huber if (mAudioPlayer != NULL && !(mFlags & (AUDIO_RUNNING | SEEK_PREVIEW))) { 1688f03034408506051f2f836e59305fcd5f662bf19aAndreas Huber status_t err = startAudioPlayer_l(); 1689f03034408506051f2f836e59305fcd5f662bf19aAndreas Huber if (err != OK) { 16905442cb59e8483e18b3a02400d431d167ea7074b3Andreas Huber LOGE("Starting the audio player failed w/ err %d", err); 1691f03034408506051f2f836e59305fcd5f662bf19aAndreas Huber return; 1692f03034408506051f2f836e59305fcd5f662bf19aAndreas Huber } 1693f03034408506051f2f836e59305fcd5f662bf19aAndreas Huber } 1694f03034408506051f2f836e59305fcd5f662bf19aAndreas Huber 16957a1e3e81264189e23a1db2b174e1b5a5d4c7d1c3Gloria Wang if ((mFlags & TEXTPLAYER_STARTED) && !(mFlags & (TEXT_RUNNING | SEEK_PREVIEW))) { 16967a1e3e81264189e23a1db2b174e1b5a5d4c7d1c3Gloria Wang mTextPlayer->resume(); 1697a0b1d4b161599c2bb2a47119e50c51e75bbe980eAndreas Huber modifyFlags(TEXT_RUNNING, SET); 16987a1e3e81264189e23a1db2b174e1b5a5d4c7d1c3Gloria Wang } 16997a1e3e81264189e23a1db2b174e1b5a5d4c7d1c3Gloria Wang 17005d2de4da54504836e4b772b3010ac28c19f667f0Andreas Huber TimeSource *ts = (mFlags & AUDIO_AT_EOS) ? &mSystemTimeSource : mTimeSource; 17015d2de4da54504836e4b772b3010ac28c19f667f0Andreas Huber 1702bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber if (mFlags & FIRST_FRAME) { 1703a0b1d4b161599c2bb2a47119e50c51e75bbe980eAndreas Huber modifyFlags(FIRST_FRAME, CLEAR); 17045d2de4da54504836e4b772b3010ac28c19f667f0Andreas Huber mTimeSourceDeltaUs = ts->getRealTimeUs() - timeUs; 1705bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber } 1706bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber 1707bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber int64_t realTimeUs, mediaTimeUs; 17085d2de4da54504836e4b772b3010ac28c19f667f0Andreas Huber if (!(mFlags & AUDIO_AT_EOS) && mAudioPlayer != NULL 1709bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber && mAudioPlayer->getMediaTimeMapping(&realTimeUs, &mediaTimeUs)) { 1710bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber mTimeSourceDeltaUs = realTimeUs - mediaTimeUs; 1711bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber } 1712bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber 171364bb6983690bf994d904591145a3cdd6373bdbe6Andreas Huber if (wasSeeking == SEEK_VIDEO_ONLY) { 171464bb6983690bf994d904591145a3cdd6373bdbe6Andreas Huber int64_t nowUs = ts->getRealTimeUs() - mTimeSourceDeltaUs; 171564bb6983690bf994d904591145a3cdd6373bdbe6Andreas Huber 171664bb6983690bf994d904591145a3cdd6373bdbe6Andreas Huber int64_t latenessUs = nowUs - timeUs; 171764bb6983690bf994d904591145a3cdd6373bdbe6Andreas Huber 171864bb6983690bf994d904591145a3cdd6373bdbe6Andreas Huber if (latenessUs > 0) { 171964bb6983690bf994d904591145a3cdd6373bdbe6Andreas Huber LOGI("after SEEK_VIDEO_ONLY we're late by %.2f secs", latenessUs / 1E6); 172064bb6983690bf994d904591145a3cdd6373bdbe6Andreas Huber } 172164bb6983690bf994d904591145a3cdd6373bdbe6Andreas Huber } 172264bb6983690bf994d904591145a3cdd6373bdbe6Andreas Huber 172364bb6983690bf994d904591145a3cdd6373bdbe6Andreas Huber if (wasSeeking == NO_SEEK) { 172402a1db7dc1de2f2df306ec10bab992bc8bbaaca8Andreas Huber // Let's display the first frame after seeking right away. 1725f8ca90452ff3e252f20de38f1c3eee524c808c3eAndreas Huber 17262b1222f8938356669672f35e0e53e176c78c40efAndreas Huber int64_t nowUs = ts->getRealTimeUs() - mTimeSourceDeltaUs; 1727bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber 17282b1222f8938356669672f35e0e53e176c78c40efAndreas Huber int64_t latenessUs = nowUs - timeUs; 17292b1222f8938356669672f35e0e53e176c78c40efAndreas Huber 173064bb6983690bf994d904591145a3cdd6373bdbe6Andreas Huber if (latenessUs > 500000ll 173164bb6983690bf994d904591145a3cdd6373bdbe6Andreas Huber && mRTSPController == NULL 173264bb6983690bf994d904591145a3cdd6373bdbe6Andreas Huber && mAudioPlayer != NULL 173364bb6983690bf994d904591145a3cdd6373bdbe6Andreas Huber && mAudioPlayer->getMediaTimeMapping( 173464bb6983690bf994d904591145a3cdd6373bdbe6Andreas Huber &realTimeUs, &mediaTimeUs)) { 173564bb6983690bf994d904591145a3cdd6373bdbe6Andreas Huber LOGI("we're much too late (%.2f secs), video skipping ahead", 173664bb6983690bf994d904591145a3cdd6373bdbe6Andreas Huber latenessUs / 1E6); 173764bb6983690bf994d904591145a3cdd6373bdbe6Andreas Huber 173864bb6983690bf994d904591145a3cdd6373bdbe6Andreas Huber mVideoBuffer->release(); 173964bb6983690bf994d904591145a3cdd6373bdbe6Andreas Huber mVideoBuffer = NULL; 174064bb6983690bf994d904591145a3cdd6373bdbe6Andreas Huber 174164bb6983690bf994d904591145a3cdd6373bdbe6Andreas Huber mSeeking = SEEK_VIDEO_ONLY; 174264bb6983690bf994d904591145a3cdd6373bdbe6Andreas Huber mSeekTimeUs = mediaTimeUs; 174364bb6983690bf994d904591145a3cdd6373bdbe6Andreas Huber 174464bb6983690bf994d904591145a3cdd6373bdbe6Andreas Huber postVideoEvent_l(); 174564bb6983690bf994d904591145a3cdd6373bdbe6Andreas Huber return; 174664bb6983690bf994d904591145a3cdd6373bdbe6Andreas Huber } 174764bb6983690bf994d904591145a3cdd6373bdbe6Andreas Huber 17482b1222f8938356669672f35e0e53e176c78c40efAndreas Huber if (latenessUs > 40000) { 17492b1222f8938356669672f35e0e53e176c78c40efAndreas Huber // We're more than 40ms late. 1750dab59b5a4956b7e9b1ffc64a0676e7990579934eAndreas Huber LOGV("we're late by %lld us (%.2f secs), dropping frame", 1751dab59b5a4956b7e9b1ffc64a0676e7990579934eAndreas Huber latenessUs, latenessUs / 1E6); 1752dab59b5a4956b7e9b1ffc64a0676e7990579934eAndreas Huber mVideoBuffer->release(); 1753dab59b5a4956b7e9b1ffc64a0676e7990579934eAndreas Huber mVideoBuffer = NULL; 17542b1222f8938356669672f35e0e53e176c78c40efAndreas Huber 1755a0b1d4b161599c2bb2a47119e50c51e75bbe980eAndreas Huber { 1756a0b1d4b161599c2bb2a47119e50c51e75bbe980eAndreas Huber Mutex::Autolock autoLock(mStatsLock); 1757a0b1d4b161599c2bb2a47119e50c51e75bbe980eAndreas Huber ++mStats.mNumVideoFramesDropped; 1758a0b1d4b161599c2bb2a47119e50c51e75bbe980eAndreas Huber } 1759a0b1d4b161599c2bb2a47119e50c51e75bbe980eAndreas Huber 1760dab59b5a4956b7e9b1ffc64a0676e7990579934eAndreas Huber postVideoEvent_l(); 1761dab59b5a4956b7e9b1ffc64a0676e7990579934eAndreas Huber return; 1762aee6c07b3572bf2510cd9e7d29c454fcfedde31dpmehendale } 1763bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber 17642b1222f8938356669672f35e0e53e176c78c40efAndreas Huber if (latenessUs < -10000) { 17652b1222f8938356669672f35e0e53e176c78c40efAndreas Huber // We're more than 10ms early. 1766bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber 17672b1222f8938356669672f35e0e53e176c78c40efAndreas Huber postVideoEvent_l(10000); 17682b1222f8938356669672f35e0e53e176c78c40efAndreas Huber return; 17692b1222f8938356669672f35e0e53e176c78c40efAndreas Huber } 1770bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber } 1771bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber 1772fa090f541bb84a546af2ec834e91a032ff10e66eAndreas Huber if (mVideoRendererIsPreview || mVideoRenderer == NULL) { 1773fa090f541bb84a546af2ec834e91a032ff10e66eAndreas Huber mVideoRendererIsPreview = false; 1774fa090f541bb84a546af2ec834e91a032ff10e66eAndreas Huber 1775a657f8deaf21acbe5faba7be1df9c6681d44d471Andreas Huber initRenderer_l(); 1776a657f8deaf21acbe5faba7be1df9c6681d44d471Andreas Huber } 1777a657f8deaf21acbe5faba7be1df9c6681d44d471Andreas Huber 1778a657f8deaf21acbe5faba7be1df9c6681d44d471Andreas Huber if (mVideoRenderer != NULL) { 1779a657f8deaf21acbe5faba7be1df9c6681d44d471Andreas Huber mVideoRenderer->render(mVideoBuffer); 1780a657f8deaf21acbe5faba7be1df9c6681d44d471Andreas Huber } 1781bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber 1782f5ab57c2d5e02af7483c94eddb177e4f5c9e9892Andreas Huber mVideoBuffer->release(); 1783bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber mVideoBuffer = NULL; 1784bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber 178564bb6983690bf994d904591145a3cdd6373bdbe6Andreas Huber if (wasSeeking != NO_SEEK && (mFlags & SEEK_PREVIEW)) { 1786a0b1d4b161599c2bb2a47119e50c51e75bbe980eAndreas Huber modifyFlags(SEEK_PREVIEW, CLEAR); 17872b1222f8938356669672f35e0e53e176c78c40efAndreas Huber return; 17882b1222f8938356669672f35e0e53e176c78c40efAndreas Huber } 17892b1222f8938356669672f35e0e53e176c78c40efAndreas Huber 1790bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber postVideoEvent_l(); 1791bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber} 1792bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber 1793bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Hubervoid AwesomePlayer::postVideoEvent_l(int64_t delayUs) { 1794bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber if (mVideoEventPending) { 1795bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber return; 1796bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber } 1797bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber 1798bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber mVideoEventPending = true; 1799bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber mQueue.postEventWithDelay(mVideoEvent, delayUs < 0 ? 10000 : delayUs); 1800bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber} 1801bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber 18025295c0c55d41a2906ea7f65a3f22e6278cb17d4bAndreas Hubervoid AwesomePlayer::postStreamDoneEvent_l(status_t status) { 1803bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber if (mStreamDoneEventPending) { 1804bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber return; 1805bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber } 1806bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber mStreamDoneEventPending = true; 18075295c0c55d41a2906ea7f65a3f22e6278cb17d4bAndreas Huber 18085295c0c55d41a2906ea7f65a3f22e6278cb17d4bAndreas Huber mStreamDoneStatus = status; 1809bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber mQueue.postEvent(mStreamDoneEvent); 1810bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber} 1811bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber 181266b0a35c9a4136a84c3f73b1b25fcb5220138b95Andreas Hubervoid AwesomePlayer::postBufferingEvent_l() { 181366b0a35c9a4136a84c3f73b1b25fcb5220138b95Andreas Huber if (mBufferingEventPending) { 181466b0a35c9a4136a84c3f73b1b25fcb5220138b95Andreas Huber return; 181566b0a35c9a4136a84c3f73b1b25fcb5220138b95Andreas Huber } 181666b0a35c9a4136a84c3f73b1b25fcb5220138b95Andreas Huber mBufferingEventPending = true; 181766b0a35c9a4136a84c3f73b1b25fcb5220138b95Andreas Huber mQueue.postEventWithDelay(mBufferingEvent, 1000000ll); 181866b0a35c9a4136a84c3f73b1b25fcb5220138b95Andreas Huber} 181966b0a35c9a4136a84c3f73b1b25fcb5220138b95Andreas Huber 1820145e68fc778275963189b02a1adcbe27cce4d769Andreas Hubervoid AwesomePlayer::postVideoLagEvent_l() { 1821145e68fc778275963189b02a1adcbe27cce4d769Andreas Huber if (mVideoLagEventPending) { 1822145e68fc778275963189b02a1adcbe27cce4d769Andreas Huber return; 1823145e68fc778275963189b02a1adcbe27cce4d769Andreas Huber } 1824145e68fc778275963189b02a1adcbe27cce4d769Andreas Huber mVideoLagEventPending = true; 1825145e68fc778275963189b02a1adcbe27cce4d769Andreas Huber mQueue.postEventWithDelay(mVideoLagEvent, 1000000ll); 1826145e68fc778275963189b02a1adcbe27cce4d769Andreas Huber} 1827145e68fc778275963189b02a1adcbe27cce4d769Andreas Huber 182884b343f29063fbfa2ee61b2e3d37ba059ca507d4Andreas Hubervoid AwesomePlayer::postCheckAudioStatusEvent_l(int64_t delayUs) { 18291862a33b246249630b654182afb5914da3480d4cAndreas Huber if (mAudioStatusEventPending) { 18301862a33b246249630b654182afb5914da3480d4cAndreas Huber return; 18311862a33b246249630b654182afb5914da3480d4cAndreas Huber } 18321862a33b246249630b654182afb5914da3480d4cAndreas Huber mAudioStatusEventPending = true; 183384b343f29063fbfa2ee61b2e3d37ba059ca507d4Andreas Huber mQueue.postEventWithDelay(mCheckAudioStatusEvent, delayUs); 18341862a33b246249630b654182afb5914da3480d4cAndreas Huber} 18351862a33b246249630b654182afb5914da3480d4cAndreas Huber 18361862a33b246249630b654182afb5914da3480d4cAndreas Hubervoid AwesomePlayer::onCheckAudioStatus() { 18371862a33b246249630b654182afb5914da3480d4cAndreas Huber Mutex::Autolock autoLock(mLock); 1838d29345dfa29cdcc650f3705e43950ef2500f6728Andreas Huber if (!mAudioStatusEventPending) { 1839d29345dfa29cdcc650f3705e43950ef2500f6728Andreas Huber // Event was dispatched and while we were blocking on the mutex, 1840d29345dfa29cdcc650f3705e43950ef2500f6728Andreas Huber // has already been cancelled. 1841d29345dfa29cdcc650f3705e43950ef2500f6728Andreas Huber return; 1842d29345dfa29cdcc650f3705e43950ef2500f6728Andreas Huber } 1843d29345dfa29cdcc650f3705e43950ef2500f6728Andreas Huber 18441862a33b246249630b654182afb5914da3480d4cAndreas Huber mAudioStatusEventPending = false; 18451862a33b246249630b654182afb5914da3480d4cAndreas Huber 18461862a33b246249630b654182afb5914da3480d4cAndreas Huber if (mWatchForAudioSeekComplete && !mAudioPlayer->isSeeking()) { 18471862a33b246249630b654182afb5914da3480d4cAndreas Huber mWatchForAudioSeekComplete = false; 18481321fdd94d354431b930735e9f38f32ecd189a2dAndreas Huber 18491321fdd94d354431b930735e9f38f32ecd189a2dAndreas Huber if (!mSeekNotificationSent) { 18501321fdd94d354431b930735e9f38f32ecd189a2dAndreas Huber notifyListener_l(MEDIA_SEEK_COMPLETE); 18511321fdd94d354431b930735e9f38f32ecd189a2dAndreas Huber mSeekNotificationSent = true; 18521321fdd94d354431b930735e9f38f32ecd189a2dAndreas Huber } 1853dac4ee72bac87388a1495e098f39d73168c8078fAndreas Huber 185464bb6983690bf994d904591145a3cdd6373bdbe6Andreas Huber mSeeking = NO_SEEK; 18551862a33b246249630b654182afb5914da3480d4cAndreas Huber } 18561862a33b246249630b654182afb5914da3480d4cAndreas Huber 18575295c0c55d41a2906ea7f65a3f22e6278cb17d4bAndreas Huber status_t finalStatus; 18585295c0c55d41a2906ea7f65a3f22e6278cb17d4bAndreas Huber if (mWatchForAudioEOS && mAudioPlayer->reachedEOS(&finalStatus)) { 18591862a33b246249630b654182afb5914da3480d4cAndreas Huber mWatchForAudioEOS = false; 1860a0b1d4b161599c2bb2a47119e50c51e75bbe980eAndreas Huber modifyFlags(AUDIO_AT_EOS, SET); 1861a0b1d4b161599c2bb2a47119e50c51e75bbe980eAndreas Huber modifyFlags(FIRST_FRAME, SET); 18625295c0c55d41a2906ea7f65a3f22e6278cb17d4bAndreas Huber postStreamDoneEvent_l(finalStatus); 18631862a33b246249630b654182afb5914da3480d4cAndreas Huber } 18641862a33b246249630b654182afb5914da3480d4cAndreas Huber} 18651862a33b246249630b654182afb5914da3480d4cAndreas Huber 1866c23f12af0394aa2f6651968a3c8840f1af317aa1Andreas Huberstatus_t AwesomePlayer::prepare() { 1867c23f12af0394aa2f6651968a3c8840f1af317aa1Andreas Huber Mutex::Autolock autoLock(mLock); 1868bd22c52280179b29eefac91ef7e7bbbc33d25904Andreas Huber return prepare_l(); 1869bd22c52280179b29eefac91ef7e7bbbc33d25904Andreas Huber} 1870c23f12af0394aa2f6651968a3c8840f1af317aa1Andreas Huber 1871bd22c52280179b29eefac91ef7e7bbbc33d25904Andreas Huberstatus_t AwesomePlayer::prepare_l() { 1872bd22c52280179b29eefac91ef7e7bbbc33d25904Andreas Huber if (mFlags & PREPARED) { 1873bd22c52280179b29eefac91ef7e7bbbc33d25904Andreas Huber return OK; 1874bd22c52280179b29eefac91ef7e7bbbc33d25904Andreas Huber } 1875bd22c52280179b29eefac91ef7e7bbbc33d25904Andreas Huber 1876bd22c52280179b29eefac91ef7e7bbbc33d25904Andreas Huber if (mFlags & PREPARING) { 1877bd22c52280179b29eefac91ef7e7bbbc33d25904Andreas Huber return UNKNOWN_ERROR; 1878bd22c52280179b29eefac91ef7e7bbbc33d25904Andreas Huber } 1879bd22c52280179b29eefac91ef7e7bbbc33d25904Andreas Huber 1880bd22c52280179b29eefac91ef7e7bbbc33d25904Andreas Huber mIsAsyncPrepare = false; 1881c23f12af0394aa2f6651968a3c8840f1af317aa1Andreas Huber status_t err = prepareAsync_l(); 1882c23f12af0394aa2f6651968a3c8840f1af317aa1Andreas Huber 1883c23f12af0394aa2f6651968a3c8840f1af317aa1Andreas Huber if (err != OK) { 1884c23f12af0394aa2f6651968a3c8840f1af317aa1Andreas Huber return err; 1885c23f12af0394aa2f6651968a3c8840f1af317aa1Andreas Huber } 1886c23f12af0394aa2f6651968a3c8840f1af317aa1Andreas Huber 1887bd22c52280179b29eefac91ef7e7bbbc33d25904Andreas Huber while (mFlags & PREPARING) { 1888c23f12af0394aa2f6651968a3c8840f1af317aa1Andreas Huber mPreparedCondition.wait(mLock); 1889c23f12af0394aa2f6651968a3c8840f1af317aa1Andreas Huber } 1890c23f12af0394aa2f6651968a3c8840f1af317aa1Andreas Huber 1891bd22c52280179b29eefac91ef7e7bbbc33d25904Andreas Huber return mPrepareResult; 1892c23f12af0394aa2f6651968a3c8840f1af317aa1Andreas Huber} 1893c23f12af0394aa2f6651968a3c8840f1af317aa1Andreas Huber 1894c23f12af0394aa2f6651968a3c8840f1af317aa1Andreas Huberstatus_t AwesomePlayer::prepareAsync() { 1895c23f12af0394aa2f6651968a3c8840f1af317aa1Andreas Huber Mutex::Autolock autoLock(mLock); 1896bd22c52280179b29eefac91ef7e7bbbc33d25904Andreas Huber 1897bd22c52280179b29eefac91ef7e7bbbc33d25904Andreas Huber if (mFlags & PREPARING) { 1898bd22c52280179b29eefac91ef7e7bbbc33d25904Andreas Huber return UNKNOWN_ERROR; // async prepare already pending 1899bd22c52280179b29eefac91ef7e7bbbc33d25904Andreas Huber } 1900bd22c52280179b29eefac91ef7e7bbbc33d25904Andreas Huber 1901bd22c52280179b29eefac91ef7e7bbbc33d25904Andreas Huber mIsAsyncPrepare = true; 1902c23f12af0394aa2f6651968a3c8840f1af317aa1Andreas Huber return prepareAsync_l(); 1903c23f12af0394aa2f6651968a3c8840f1af317aa1Andreas Huber} 1904c23f12af0394aa2f6651968a3c8840f1af317aa1Andreas Huber 1905c23f12af0394aa2f6651968a3c8840f1af317aa1Andreas Huberstatus_t AwesomePlayer::prepareAsync_l() { 1906bd22c52280179b29eefac91ef7e7bbbc33d25904Andreas Huber if (mFlags & PREPARING) { 1907bd22c52280179b29eefac91ef7e7bbbc33d25904Andreas Huber return UNKNOWN_ERROR; // async prepare already pending 1908c23f12af0394aa2f6651968a3c8840f1af317aa1Andreas Huber } 1909c23f12af0394aa2f6651968a3c8840f1af317aa1Andreas Huber 19102e8ffaf95bd35358ecd14ddf00cddaf3abefe0a9Andreas Huber if (!mQueueStarted) { 19112e8ffaf95bd35358ecd14ddf00cddaf3abefe0a9Andreas Huber mQueue.start(); 19122e8ffaf95bd35358ecd14ddf00cddaf3abefe0a9Andreas Huber mQueueStarted = true; 19132e8ffaf95bd35358ecd14ddf00cddaf3abefe0a9Andreas Huber } 19142e8ffaf95bd35358ecd14ddf00cddaf3abefe0a9Andreas Huber 1915a0b1d4b161599c2bb2a47119e50c51e75bbe980eAndreas Huber modifyFlags(PREPARING, SET); 1916c23f12af0394aa2f6651968a3c8840f1af317aa1Andreas Huber mAsyncPrepareEvent = new AwesomeEvent( 1917c23f12af0394aa2f6651968a3c8840f1af317aa1Andreas Huber this, &AwesomePlayer::onPrepareAsyncEvent); 1918c23f12af0394aa2f6651968a3c8840f1af317aa1Andreas Huber 1919c23f12af0394aa2f6651968a3c8840f1af317aa1Andreas Huber mQueue.postEvent(mAsyncPrepareEvent); 1920c23f12af0394aa2f6651968a3c8840f1af317aa1Andreas Huber 1921c23f12af0394aa2f6651968a3c8840f1af317aa1Andreas Huber return OK; 1922c23f12af0394aa2f6651968a3c8840f1af317aa1Andreas Huber} 1923c23f12af0394aa2f6651968a3c8840f1af317aa1Andreas Huber 1924bd22c52280179b29eefac91ef7e7bbbc33d25904Andreas Huberstatus_t AwesomePlayer::finishSetDataSource_l() { 1925e94bd14078d327ef2f800e69907efce641a13272Andreas Huber sp<DataSource> dataSource; 1926e94bd14078d327ef2f800e69907efce641a13272Andreas Huber 1927681755fc0d0797506456f46a2a10555916d6be32Andreas Huber bool isWidevineStreaming = false; 1928681755fc0d0797506456f46a2a10555916d6be32Andreas Huber if (!strncasecmp("widevine://", mUri.string(), 11)) { 1929681755fc0d0797506456f46a2a10555916d6be32Andreas Huber isWidevineStreaming = true; 1930681755fc0d0797506456f46a2a10555916d6be32Andreas Huber 1931681755fc0d0797506456f46a2a10555916d6be32Andreas Huber String8 newURI = String8("http://"); 1932681755fc0d0797506456f46a2a10555916d6be32Andreas Huber newURI.append(mUri.string() + 11); 1933681755fc0d0797506456f46a2a10555916d6be32Andreas Huber 1934681755fc0d0797506456f46a2a10555916d6be32Andreas Huber mUri = newURI; 1935681755fc0d0797506456f46a2a10555916d6be32Andreas Huber } 1936681755fc0d0797506456f46a2a10555916d6be32Andreas Huber 19378cb0c4168bf4b678e4a6edfcf409247016be20d5Andreas Huber if (!strncasecmp("http://", mUri.string(), 7) 1938681755fc0d0797506456f46a2a10555916d6be32Andreas Huber || !strncasecmp("https://", mUri.string(), 8) 1939681755fc0d0797506456f46a2a10555916d6be32Andreas Huber || isWidevineStreaming) { 19401156dc913a5ba7b2bc86489468d4914430f03d14Andreas Huber mConnectingDataSource = HTTPBase::Create( 19411156dc913a5ba7b2bc86489468d4914430f03d14Andreas Huber (mFlags & INCOGNITO) 19421156dc913a5ba7b2bc86489468d4914430f03d14Andreas Huber ? HTTPBase::kFlagIncognito 19431156dc913a5ba7b2bc86489468d4914430f03d14Andreas Huber : 0); 1944e94bd14078d327ef2f800e69907efce641a13272Andreas Huber 19459b80c2bdb205bc143104f54d0743b6eedd67b14eAndreas Huber if (mUIDValid) { 19469b80c2bdb205bc143104f54d0743b6eedd67b14eAndreas Huber mConnectingDataSource->setUID(mUID); 19479b80c2bdb205bc143104f54d0743b6eedd67b14eAndreas Huber } 19489b80c2bdb205bc143104f54d0743b6eedd67b14eAndreas Huber 1949e94bd14078d327ef2f800e69907efce641a13272Andreas Huber mLock.unlock(); 195079f77ef3b0a37660ba8c5bcb2dfbfda3860f2135Andreas Huber status_t err = mConnectingDataSource->connect(mUri, &mUriHeaders); 1951e94bd14078d327ef2f800e69907efce641a13272Andreas Huber mLock.lock(); 1952e94bd14078d327ef2f800e69907efce641a13272Andreas Huber 1953e94bd14078d327ef2f800e69907efce641a13272Andreas Huber if (err != OK) { 1954e94bd14078d327ef2f800e69907efce641a13272Andreas Huber mConnectingDataSource.clear(); 1955e94bd14078d327ef2f800e69907efce641a13272Andreas Huber 1956e94bd14078d327ef2f800e69907efce641a13272Andreas Huber LOGI("mConnectingDataSource->connect() returned %d", err); 1957e94bd14078d327ef2f800e69907efce641a13272Andreas Huber return err; 1958e94bd14078d327ef2f800e69907efce641a13272Andreas Huber } 1959e94bd14078d327ef2f800e69907efce641a13272Andreas Huber 1960681755fc0d0797506456f46a2a10555916d6be32Andreas Huber if (!isWidevineStreaming) { 1961681755fc0d0797506456f46a2a10555916d6be32Andreas Huber // The widevine extractor does its own caching. 1962681755fc0d0797506456f46a2a10555916d6be32Andreas Huber 19630a5baa9b411fe086013d2a5e9126ed63fbad046cAndreas Huber#if 0 1964681755fc0d0797506456f46a2a10555916d6be32Andreas Huber mCachedSource = new NuCachedSource2( 1965681755fc0d0797506456f46a2a10555916d6be32Andreas Huber new ThrottledSource( 1966681755fc0d0797506456f46a2a10555916d6be32Andreas Huber mConnectingDataSource, 50 * 1024 /* bytes/sec */)); 19670a5baa9b411fe086013d2a5e9126ed63fbad046cAndreas Huber#else 1968681755fc0d0797506456f46a2a10555916d6be32Andreas Huber mCachedSource = new NuCachedSource2(mConnectingDataSource); 19690a5baa9b411fe086013d2a5e9126ed63fbad046cAndreas Huber#endif 1970681755fc0d0797506456f46a2a10555916d6be32Andreas Huber 1971681755fc0d0797506456f46a2a10555916d6be32Andreas Huber dataSource = mCachedSource; 1972681755fc0d0797506456f46a2a10555916d6be32Andreas Huber } else { 1973681755fc0d0797506456f46a2a10555916d6be32Andreas Huber dataSource = mConnectingDataSource; 1974681755fc0d0797506456f46a2a10555916d6be32Andreas Huber } 1975681755fc0d0797506456f46a2a10555916d6be32Andreas Huber 1976e94bd14078d327ef2f800e69907efce641a13272Andreas Huber mConnectingDataSource.clear(); 19770a5baa9b411fe086013d2a5e9126ed63fbad046cAndreas Huber 1978ac05c317cd818701535c5d72ce90da98c4bae75bAndreas Huber 19796511c9755c3a3360ba869772600c7aae048a7ffcAndreas Huber String8 contentType = dataSource->getMIMEType(); 1980ac05c317cd818701535c5d72ce90da98c4bae75bAndreas Huber 19816511c9755c3a3360ba869772600c7aae048a7ffcAndreas Huber if (strncasecmp(contentType.string(), "audio/", 6)) { 19826511c9755c3a3360ba869772600c7aae048a7ffcAndreas Huber // We're not doing this for streams that appear to be audio-only 19836511c9755c3a3360ba869772600c7aae048a7ffcAndreas Huber // streams to ensure that even low bandwidth streams start 19846511c9755c3a3360ba869772600c7aae048a7ffcAndreas Huber // playing back fairly instantly. 1985ac05c317cd818701535c5d72ce90da98c4bae75bAndreas Huber 19866511c9755c3a3360ba869772600c7aae048a7ffcAndreas Huber // We're going to prefill the cache before trying to instantiate 19876511c9755c3a3360ba869772600c7aae048a7ffcAndreas Huber // the extractor below, as the latter is an operation that otherwise 19886511c9755c3a3360ba869772600c7aae048a7ffcAndreas Huber // could block on the datasource for a significant amount of time. 19896511c9755c3a3360ba869772600c7aae048a7ffcAndreas Huber // During that time we'd be unable to abort the preparation phase 19906511c9755c3a3360ba869772600c7aae048a7ffcAndreas Huber // without this prefill. 1991e39350924f4e743ec04cc9640526e06990c8cbdaJames Dong if (mCachedSource != NULL) { 1992e39350924f4e743ec04cc9640526e06990c8cbdaJames Dong // We're going to prefill the cache before trying to instantiate 1993e39350924f4e743ec04cc9640526e06990c8cbdaJames Dong // the extractor below, as the latter is an operation that otherwise 1994e39350924f4e743ec04cc9640526e06990c8cbdaJames Dong // could block on the datasource for a significant amount of time. 1995e39350924f4e743ec04cc9640526e06990c8cbdaJames Dong // During that time we'd be unable to abort the preparation phase 1996e39350924f4e743ec04cc9640526e06990c8cbdaJames Dong // without this prefill. 1997e39350924f4e743ec04cc9640526e06990c8cbdaJames Dong 1998e39350924f4e743ec04cc9640526e06990c8cbdaJames Dong mLock.unlock(); 1999e39350924f4e743ec04cc9640526e06990c8cbdaJames Dong 2000e39350924f4e743ec04cc9640526e06990c8cbdaJames Dong for (;;) { 2001e39350924f4e743ec04cc9640526e06990c8cbdaJames Dong status_t finalStatus; 2002e39350924f4e743ec04cc9640526e06990c8cbdaJames Dong size_t cachedDataRemaining = 2003e39350924f4e743ec04cc9640526e06990c8cbdaJames Dong mCachedSource->approxDataRemaining(&finalStatus); 2004e39350924f4e743ec04cc9640526e06990c8cbdaJames Dong 2005e39350924f4e743ec04cc9640526e06990c8cbdaJames Dong if (finalStatus != OK || cachedDataRemaining >= kHighWaterMarkBytes 2006e39350924f4e743ec04cc9640526e06990c8cbdaJames Dong || (mFlags & PREPARE_CANCELLED)) { 2007e39350924f4e743ec04cc9640526e06990c8cbdaJames Dong break; 2008e39350924f4e743ec04cc9640526e06990c8cbdaJames Dong } 20096511c9755c3a3360ba869772600c7aae048a7ffcAndreas Huber 2010e39350924f4e743ec04cc9640526e06990c8cbdaJames Dong usleep(200000); 20116511c9755c3a3360ba869772600c7aae048a7ffcAndreas Huber } 20126511c9755c3a3360ba869772600c7aae048a7ffcAndreas Huber 2013e39350924f4e743ec04cc9640526e06990c8cbdaJames Dong mLock.lock(); 2014ac05c317cd818701535c5d72ce90da98c4bae75bAndreas Huber } 2015ac05c317cd818701535c5d72ce90da98c4bae75bAndreas Huber 2016e39350924f4e743ec04cc9640526e06990c8cbdaJames Dong if (mFlags & PREPARE_CANCELLED) { 2017e39350924f4e743ec04cc9640526e06990c8cbdaJames Dong LOGI("Prepare cancelled while waiting for initial cache fill."); 2018e39350924f4e743ec04cc9640526e06990c8cbdaJames Dong return UNKNOWN_ERROR; 2019e39350924f4e743ec04cc9640526e06990c8cbdaJames Dong } 2020ac05c317cd818701535c5d72ce90da98c4bae75bAndreas Huber } 2021cf7b9c7aae758ac0b99833915053c63c2ac46e09Andreas Huber } else if (!strncasecmp("rtsp://", mUri.string(), 7)) { 2022cf7b9c7aae758ac0b99833915053c63c2ac46e09Andreas Huber if (mLooper == NULL) { 2023cf7b9c7aae758ac0b99833915053c63c2ac46e09Andreas Huber mLooper = new ALooper; 2024a814c1fdc2acf0ed2ee3b175110f6039be7c4873Andreas Huber mLooper->setName("rtsp"); 2025cf7b9c7aae758ac0b99833915053c63c2ac46e09Andreas Huber mLooper->start(); 2026cf7b9c7aae758ac0b99833915053c63c2ac46e09Andreas Huber } 2027cf7b9c7aae758ac0b99833915053c63c2ac46e09Andreas Huber mRTSPController = new ARTSPController(mLooper); 2028f1958f9442bc937e1f8c8d9175901500b944b021Andreas Huber mConnectingRTSPController = mRTSPController; 2029f1958f9442bc937e1f8c8d9175901500b944b021Andreas Huber 20309b80c2bdb205bc143104f54d0743b6eedd67b14eAndreas Huber if (mUIDValid) { 20319b80c2bdb205bc143104f54d0743b6eedd67b14eAndreas Huber mConnectingRTSPController->setUID(mUID); 20329b80c2bdb205bc143104f54d0743b6eedd67b14eAndreas Huber } 20339b80c2bdb205bc143104f54d0743b6eedd67b14eAndreas Huber 2034f1958f9442bc937e1f8c8d9175901500b944b021Andreas Huber mLock.unlock(); 2035cf7b9c7aae758ac0b99833915053c63c2ac46e09Andreas Huber status_t err = mRTSPController->connect(mUri.string()); 2036f1958f9442bc937e1f8c8d9175901500b944b021Andreas Huber mLock.lock(); 2037f1958f9442bc937e1f8c8d9175901500b944b021Andreas Huber 2038f1958f9442bc937e1f8c8d9175901500b944b021Andreas Huber mConnectingRTSPController.clear(); 2039cf7b9c7aae758ac0b99833915053c63c2ac46e09Andreas Huber 2040cf7b9c7aae758ac0b99833915053c63c2ac46e09Andreas Huber LOGI("ARTSPController::connect returned %d", err); 2041cf7b9c7aae758ac0b99833915053c63c2ac46e09Andreas Huber 2042cf7b9c7aae758ac0b99833915053c63c2ac46e09Andreas Huber if (err != OK) { 2043cf7b9c7aae758ac0b99833915053c63c2ac46e09Andreas Huber mRTSPController.clear(); 2044cf7b9c7aae758ac0b99833915053c63c2ac46e09Andreas Huber return err; 2045cf7b9c7aae758ac0b99833915053c63c2ac46e09Andreas Huber } 2046e71d10e7ad55ccbcb0756c007caef1c959090384Andreas Huber 2047cf7b9c7aae758ac0b99833915053c63c2ac46e09Andreas Huber sp<MediaExtractor> extractor = mRTSPController.get(); 2048e71d10e7ad55ccbcb0756c007caef1c959090384Andreas Huber return setDataSource_l(extractor); 2049e94bd14078d327ef2f800e69907efce641a13272Andreas Huber } else { 2050e94bd14078d327ef2f800e69907efce641a13272Andreas Huber dataSource = DataSource::CreateFromURI(mUri.string(), &mUriHeaders); 2051e94bd14078d327ef2f800e69907efce641a13272Andreas Huber } 2052bd22c52280179b29eefac91ef7e7bbbc33d25904Andreas Huber 2053bd22c52280179b29eefac91ef7e7bbbc33d25904Andreas Huber if (dataSource == NULL) { 2054bd22c52280179b29eefac91ef7e7bbbc33d25904Andreas Huber return UNKNOWN_ERROR; 2055bd22c52280179b29eefac91ef7e7bbbc33d25904Andreas Huber } 2056bd22c52280179b29eefac91ef7e7bbbc33d25904Andreas Huber 2057681755fc0d0797506456f46a2a10555916d6be32Andreas Huber sp<MediaExtractor> extractor; 2058bd22c52280179b29eefac91ef7e7bbbc33d25904Andreas Huber 2059681755fc0d0797506456f46a2a10555916d6be32Andreas Huber if (isWidevineStreaming) { 2060681755fc0d0797506456f46a2a10555916d6be32Andreas Huber String8 mimeType; 2061681755fc0d0797506456f46a2a10555916d6be32Andreas Huber float confidence; 2062681755fc0d0797506456f46a2a10555916d6be32Andreas Huber sp<AMessage> dummy; 2063681755fc0d0797506456f46a2a10555916d6be32Andreas Huber bool success = SniffDRM(dataSource, &mimeType, &confidence, &dummy); 2064681755fc0d0797506456f46a2a10555916d6be32Andreas Huber 2065681755fc0d0797506456f46a2a10555916d6be32Andreas Huber if (!success 2066681755fc0d0797506456f46a2a10555916d6be32Andreas Huber || strcasecmp( 2067681755fc0d0797506456f46a2a10555916d6be32Andreas Huber mimeType.string(), MEDIA_MIMETYPE_CONTAINER_WVM)) { 2068681755fc0d0797506456f46a2a10555916d6be32Andreas Huber return ERROR_UNSUPPORTED; 2069681755fc0d0797506456f46a2a10555916d6be32Andreas Huber } 2070681755fc0d0797506456f46a2a10555916d6be32Andreas Huber 2071681755fc0d0797506456f46a2a10555916d6be32Andreas Huber mWVMExtractor = new WVMExtractor(dataSource); 2072681755fc0d0797506456f46a2a10555916d6be32Andreas Huber mWVMExtractor->setAdaptiveStreamingMode(true); 2073681755fc0d0797506456f46a2a10555916d6be32Andreas Huber extractor = mWVMExtractor; 2074681755fc0d0797506456f46a2a10555916d6be32Andreas Huber } else { 2075681755fc0d0797506456f46a2a10555916d6be32Andreas Huber extractor = MediaExtractor::Create(dataSource); 2076681755fc0d0797506456f46a2a10555916d6be32Andreas Huber 2077681755fc0d0797506456f46a2a10555916d6be32Andreas Huber if (extractor == NULL) { 2078681755fc0d0797506456f46a2a10555916d6be32Andreas Huber return UNKNOWN_ERROR; 2079681755fc0d0797506456f46a2a10555916d6be32Andreas Huber } 2080bd22c52280179b29eefac91ef7e7bbbc33d25904Andreas Huber } 2081bd22c52280179b29eefac91ef7e7bbbc33d25904Andreas Huber 2082b5ce361d19e69fe156f7188c9ee0f4734b259874Gloria Wang dataSource->getDrmInfo(mDecryptHandle, &mDrmManagerClient); 2083b5ce361d19e69fe156f7188c9ee0f4734b259874Gloria Wang 2084b371426ce4cf2fa6d8c3d1903b61322feb165d35Gloria Wang if (mDecryptHandle != NULL) { 20858f64134f749e4f7861a08a3063450fc714c4651dGloria Wang CHECK(mDrmManagerClient); 20863318523222e31fb4a7fcc345ddb4ec845d30ef96James Dong if (RightsStatus::RIGHTS_VALID != mDecryptHandle->status) { 20877340743ce30766af6334bbd9acf813eb66dd5a60Gloria Wang notifyListener_l(MEDIA_ERROR, MEDIA_ERROR_UNKNOWN, ERROR_DRM_NO_LICENSE); 2088b371426ce4cf2fa6d8c3d1903b61322feb165d35Gloria Wang } 2089dcd25efb46c41c8d24a0a9cf61fb57f84149709eGloria Wang } 2090dcd25efb46c41c8d24a0a9cf61fb57f84149709eGloria Wang 2091681755fc0d0797506456f46a2a10555916d6be32Andreas Huber status_t err = setDataSource_l(extractor); 2092681755fc0d0797506456f46a2a10555916d6be32Andreas Huber 2093681755fc0d0797506456f46a2a10555916d6be32Andreas Huber if (err != OK) { 2094681755fc0d0797506456f46a2a10555916d6be32Andreas Huber mWVMExtractor.clear(); 2095681755fc0d0797506456f46a2a10555916d6be32Andreas Huber 2096681755fc0d0797506456f46a2a10555916d6be32Andreas Huber return err; 2097681755fc0d0797506456f46a2a10555916d6be32Andreas Huber } 2098681755fc0d0797506456f46a2a10555916d6be32Andreas Huber 2099681755fc0d0797506456f46a2a10555916d6be32Andreas Huber return OK; 2100bd22c52280179b29eefac91ef7e7bbbc33d25904Andreas Huber} 2101bd22c52280179b29eefac91ef7e7bbbc33d25904Andreas Huber 210288d8a83de12592635248aa1a3bd6b9ea46108501Andreas Hubervoid AwesomePlayer::abortPrepare(status_t err) { 210388d8a83de12592635248aa1a3bd6b9ea46108501Andreas Huber CHECK(err != OK); 210488d8a83de12592635248aa1a3bd6b9ea46108501Andreas Huber 210588d8a83de12592635248aa1a3bd6b9ea46108501Andreas Huber if (mIsAsyncPrepare) { 210688d8a83de12592635248aa1a3bd6b9ea46108501Andreas Huber notifyListener_l(MEDIA_ERROR, MEDIA_ERROR_UNKNOWN, err); 210788d8a83de12592635248aa1a3bd6b9ea46108501Andreas Huber } 210888d8a83de12592635248aa1a3bd6b9ea46108501Andreas Huber 210988d8a83de12592635248aa1a3bd6b9ea46108501Andreas Huber mPrepareResult = err; 2110a0b1d4b161599c2bb2a47119e50c51e75bbe980eAndreas Huber modifyFlags((PREPARING|PREPARE_CANCELLED|PREPARING_CONNECTED), CLEAR); 211188d8a83de12592635248aa1a3bd6b9ea46108501Andreas Huber mAsyncPrepareEvent = NULL; 211288d8a83de12592635248aa1a3bd6b9ea46108501Andreas Huber mPreparedCondition.broadcast(); 211388d8a83de12592635248aa1a3bd6b9ea46108501Andreas Huber} 211488d8a83de12592635248aa1a3bd6b9ea46108501Andreas Huber 2115e966fb05c7e67a7f5dce65024de60aac83eb6f81Andreas Huber// static 2116e966fb05c7e67a7f5dce65024de60aac83eb6f81Andreas Huberbool AwesomePlayer::ContinuePreparation(void *cookie) { 2117e966fb05c7e67a7f5dce65024de60aac83eb6f81Andreas Huber AwesomePlayer *me = static_cast<AwesomePlayer *>(cookie); 2118e966fb05c7e67a7f5dce65024de60aac83eb6f81Andreas Huber 2119e966fb05c7e67a7f5dce65024de60aac83eb6f81Andreas Huber return (me->mFlags & PREPARE_CANCELLED) == 0; 2120e966fb05c7e67a7f5dce65024de60aac83eb6f81Andreas Huber} 2121e966fb05c7e67a7f5dce65024de60aac83eb6f81Andreas Huber 2122c23f12af0394aa2f6651968a3c8840f1af317aa1Andreas Hubervoid AwesomePlayer::onPrepareAsyncEvent() { 21238650e1960905097f6f1d6aa462ccb1c93c656834Andreas Huber Mutex::Autolock autoLock(mLock); 2124bd22c52280179b29eefac91ef7e7bbbc33d25904Andreas Huber 21258650e1960905097f6f1d6aa462ccb1c93c656834Andreas Huber if (mFlags & PREPARE_CANCELLED) { 21268650e1960905097f6f1d6aa462ccb1c93c656834Andreas Huber LOGI("prepare was cancelled before doing anything"); 21278650e1960905097f6f1d6aa462ccb1c93c656834Andreas Huber abortPrepare(UNKNOWN_ERROR); 21288650e1960905097f6f1d6aa462ccb1c93c656834Andreas Huber return; 21298650e1960905097f6f1d6aa462ccb1c93c656834Andreas Huber } 2130e94bd14078d327ef2f800e69907efce641a13272Andreas Huber 21318650e1960905097f6f1d6aa462ccb1c93c656834Andreas Huber if (mUri.size() > 0) { 21328650e1960905097f6f1d6aa462ccb1c93c656834Andreas Huber status_t err = finishSetDataSource_l(); 2133bd22c52280179b29eefac91ef7e7bbbc33d25904Andreas Huber 21348650e1960905097f6f1d6aa462ccb1c93c656834Andreas Huber if (err != OK) { 21358650e1960905097f6f1d6aa462ccb1c93c656834Andreas Huber abortPrepare(err); 21368650e1960905097f6f1d6aa462ccb1c93c656834Andreas Huber return; 2137bd22c52280179b29eefac91ef7e7bbbc33d25904Andreas Huber } 21388650e1960905097f6f1d6aa462ccb1c93c656834Andreas Huber } 2139bd22c52280179b29eefac91ef7e7bbbc33d25904Andreas Huber 21408650e1960905097f6f1d6aa462ccb1c93c656834Andreas Huber if (mVideoTrack != NULL && mVideoSource == NULL) { 21418650e1960905097f6f1d6aa462ccb1c93c656834Andreas Huber status_t err = initVideoDecoder(); 21421322e7ebc33e8e161fb73cd47e43dd93357608e4Andreas Huber 21438650e1960905097f6f1d6aa462ccb1c93c656834Andreas Huber if (err != OK) { 21448650e1960905097f6f1d6aa462ccb1c93c656834Andreas Huber abortPrepare(err); 21458650e1960905097f6f1d6aa462ccb1c93c656834Andreas Huber return; 21461322e7ebc33e8e161fb73cd47e43dd93357608e4Andreas Huber } 21478650e1960905097f6f1d6aa462ccb1c93c656834Andreas Huber } 21481322e7ebc33e8e161fb73cd47e43dd93357608e4Andreas Huber 21498650e1960905097f6f1d6aa462ccb1c93c656834Andreas Huber if (mAudioTrack != NULL && mAudioSource == NULL) { 21508650e1960905097f6f1d6aa462ccb1c93c656834Andreas Huber status_t err = initAudioDecoder(); 21511322e7ebc33e8e161fb73cd47e43dd93357608e4Andreas Huber 21528650e1960905097f6f1d6aa462ccb1c93c656834Andreas Huber if (err != OK) { 21538650e1960905097f6f1d6aa462ccb1c93c656834Andreas Huber abortPrepare(err); 21548650e1960905097f6f1d6aa462ccb1c93c656834Andreas Huber return; 21551322e7ebc33e8e161fb73cd47e43dd93357608e4Andreas Huber } 2156c23f12af0394aa2f6651968a3c8840f1af317aa1Andreas Huber } 2157c23f12af0394aa2f6651968a3c8840f1af317aa1Andreas Huber 2158a0b1d4b161599c2bb2a47119e50c51e75bbe980eAndreas Huber modifyFlags(PREPARING_CONNECTED, SET); 21596a05c9e912aeb8bfe1ef99516def91a177a481b6Andreas Huber 2160681755fc0d0797506456f46a2a10555916d6be32Andreas Huber if (isStreamingHTTP() || mRTSPController != NULL) { 21618650e1960905097f6f1d6aa462ccb1c93c656834Andreas Huber postBufferingEvent_l(); 21628650e1960905097f6f1d6aa462ccb1c93c656834Andreas Huber } else { 21638650e1960905097f6f1d6aa462ccb1c93c656834Andreas Huber finishAsyncPrepare_l(); 21648650e1960905097f6f1d6aa462ccb1c93c656834Andreas Huber } 21658650e1960905097f6f1d6aa462ccb1c93c656834Andreas Huber} 2166c23f12af0394aa2f6651968a3c8840f1af317aa1Andreas Huber 21678650e1960905097f6f1d6aa462ccb1c93c656834Andreas Hubervoid AwesomePlayer::finishAsyncPrepare_l() { 2168bd22c52280179b29eefac91ef7e7bbbc33d25904Andreas Huber if (mIsAsyncPrepare) { 21695daeb129a2c2ba3d14ccd94af283b5f561c783eaAndreas Huber if (mVideoSource == NULL) { 2170bd22c52280179b29eefac91ef7e7bbbc33d25904Andreas Huber notifyListener_l(MEDIA_SET_VIDEO_SIZE, 0, 0); 2171bd22c52280179b29eefac91ef7e7bbbc33d25904Andreas Huber } else { 21725daeb129a2c2ba3d14ccd94af283b5f561c783eaAndreas Huber notifyVideoSize_l(); 2173bd22c52280179b29eefac91ef7e7bbbc33d25904Andreas Huber } 2174c23f12af0394aa2f6651968a3c8840f1af317aa1Andreas Huber 2175bd22c52280179b29eefac91ef7e7bbbc33d25904Andreas Huber notifyListener_l(MEDIA_PREPARED); 2176bd22c52280179b29eefac91ef7e7bbbc33d25904Andreas Huber } 2177c23f12af0394aa2f6651968a3c8840f1af317aa1Andreas Huber 2178bd22c52280179b29eefac91ef7e7bbbc33d25904Andreas Huber mPrepareResult = OK; 2179a0b1d4b161599c2bb2a47119e50c51e75bbe980eAndreas Huber modifyFlags((PREPARING|PREPARE_CANCELLED|PREPARING_CONNECTED), CLEAR); 2180a0b1d4b161599c2bb2a47119e50c51e75bbe980eAndreas Huber modifyFlags(PREPARED, SET); 2181c23f12af0394aa2f6651968a3c8840f1af317aa1Andreas Huber mAsyncPrepareEvent = NULL; 2182bd22c52280179b29eefac91ef7e7bbbc33d25904Andreas Huber mPreparedCondition.broadcast(); 2183c23f12af0394aa2f6651968a3c8840f1af317aa1Andreas Huber} 2184c23f12af0394aa2f6651968a3c8840f1af317aa1Andreas Huber 2185acdd9d0f59c3d8bdc3de80664a609527ec3d21e2Andreas Huberuint32_t AwesomePlayer::flags() const { 2186acdd9d0f59c3d8bdc3de80664a609527ec3d21e2Andreas Huber return mExtractorFlags; 2187acdd9d0f59c3d8bdc3de80664a609527ec3d21e2Andreas Huber} 2188acdd9d0f59c3d8bdc3de80664a609527ec3d21e2Andreas Huber 218984b343f29063fbfa2ee61b2e3d37ba059ca507d4Andreas Hubervoid AwesomePlayer::postAudioEOS(int64_t delayUs) { 2190bd7b7177f88ae6e83bd7bb8bfd9b7018be923931Andreas Huber Mutex::Autolock autoLock(mLock); 219184b343f29063fbfa2ee61b2e3d37ba059ca507d4Andreas Huber postCheckAudioStatusEvent_l(delayUs); 2192ed54ad0f8619ae416b0968ade6248894cbfc4dbaAndreas Huber} 2193ed54ad0f8619ae416b0968ade6248894cbfc4dbaAndreas Huber 2194ed54ad0f8619ae416b0968ade6248894cbfc4dbaAndreas Hubervoid AwesomePlayer::postAudioSeekComplete() { 2195bd7b7177f88ae6e83bd7bb8bfd9b7018be923931Andreas Huber Mutex::Autolock autoLock(mLock); 2196c0dfc5b02d4179769bbdd25c10d430576ec09568Andreas Huber postAudioSeekComplete_l(); 2197c0dfc5b02d4179769bbdd25c10d430576ec09568Andreas Huber} 2198c0dfc5b02d4179769bbdd25c10d430576ec09568Andreas Huber 2199c0dfc5b02d4179769bbdd25c10d430576ec09568Andreas Hubervoid AwesomePlayer::postAudioSeekComplete_l() { 220084b343f29063fbfa2ee61b2e3d37ba059ca507d4Andreas Huber postCheckAudioStatusEvent_l(0 /* delayUs */); 2201ed54ad0f8619ae416b0968ade6248894cbfc4dbaAndreas Huber} 2202ed54ad0f8619ae416b0968ade6248894cbfc4dbaAndreas Huber 22034f9e47f2c03ce36261c4717cd7e131d7940bb068Gloria Wangstatus_t AwesomePlayer::setParameter(int key, const Parcel &request) { 2204965d08ba16ee82bc85f69546360c18e7da907406Gloria Wang switch (key) { 2205965d08ba16ee82bc85f69546360c18e7da907406Gloria Wang case KEY_PARAMETER_TIMED_TEXT_TRACK_INDEX: 2206965d08ba16ee82bc85f69546360c18e7da907406Gloria Wang { 2207965d08ba16ee82bc85f69546360c18e7da907406Gloria Wang Mutex::Autolock autoLock(mTimedTextLock); 2208965d08ba16ee82bc85f69546360c18e7da907406Gloria Wang return setTimedTextTrackIndex(request.readInt32()); 2209965d08ba16ee82bc85f69546360c18e7da907406Gloria Wang } 2210965d08ba16ee82bc85f69546360c18e7da907406Gloria Wang case KEY_PARAMETER_TIMED_TEXT_ADD_OUT_OF_BAND_SOURCE: 2211965d08ba16ee82bc85f69546360c18e7da907406Gloria Wang { 2212965d08ba16ee82bc85f69546360c18e7da907406Gloria Wang Mutex::Autolock autoLock(mTimedTextLock); 2213965d08ba16ee82bc85f69546360c18e7da907406Gloria Wang if (mTextPlayer == NULL) { 2214965d08ba16ee82bc85f69546360c18e7da907406Gloria Wang mTextPlayer = new TimedTextPlayer(this, mListener, &mQueue); 2215965d08ba16ee82bc85f69546360c18e7da907406Gloria Wang } 2216965d08ba16ee82bc85f69546360c18e7da907406Gloria Wang 2217965d08ba16ee82bc85f69546360c18e7da907406Gloria Wang return mTextPlayer->setParameter(key, request); 2218965d08ba16ee82bc85f69546360c18e7da907406Gloria Wang } 22195b1b8a93a07326f1cbc627f09e02988375189e0aJames Dong case KEY_PARAMETER_CACHE_STAT_COLLECT_FREQ_MS: 22205b1b8a93a07326f1cbc627f09e02988375189e0aJames Dong { 22215b1b8a93a07326f1cbc627f09e02988375189e0aJames Dong return setCacheStatCollectFreq(request); 22225b1b8a93a07326f1cbc627f09e02988375189e0aJames Dong } 2223965d08ba16ee82bc85f69546360c18e7da907406Gloria Wang default: 2224965d08ba16ee82bc85f69546360c18e7da907406Gloria Wang { 2225965d08ba16ee82bc85f69546360c18e7da907406Gloria Wang return ERROR_UNSUPPORTED; 2226965d08ba16ee82bc85f69546360c18e7da907406Gloria Wang } 22277a1e3e81264189e23a1db2b174e1b5a5d4c7d1c3Gloria Wang } 22284f9e47f2c03ce36261c4717cd7e131d7940bb068Gloria Wang} 22294f9e47f2c03ce36261c4717cd7e131d7940bb068Gloria Wang 22305b1b8a93a07326f1cbc627f09e02988375189e0aJames Dongstatus_t AwesomePlayer::setCacheStatCollectFreq(const Parcel &request) { 22315b1b8a93a07326f1cbc627f09e02988375189e0aJames Dong if (mCachedSource != NULL) { 22325b1b8a93a07326f1cbc627f09e02988375189e0aJames Dong int32_t freqMs = request.readInt32(); 22335b1b8a93a07326f1cbc627f09e02988375189e0aJames Dong LOGD("Request to keep cache stats in the past %d ms", 22345b1b8a93a07326f1cbc627f09e02988375189e0aJames Dong freqMs); 22355b1b8a93a07326f1cbc627f09e02988375189e0aJames Dong return mCachedSource->setCacheStatCollectFreq(freqMs); 22365b1b8a93a07326f1cbc627f09e02988375189e0aJames Dong } 22375b1b8a93a07326f1cbc627f09e02988375189e0aJames Dong return ERROR_UNSUPPORTED; 22385b1b8a93a07326f1cbc627f09e02988375189e0aJames Dong} 22395b1b8a93a07326f1cbc627f09e02988375189e0aJames Dong 22404f9e47f2c03ce36261c4717cd7e131d7940bb068Gloria Wangstatus_t AwesomePlayer::getParameter(int key, Parcel *reply) { 2241cd25fed09742235fac10953b9d4b77268c695063Glenn Kasten switch (key) { 2242cd25fed09742235fac10953b9d4b77268c695063Glenn Kasten case KEY_PARAMETER_AUDIO_CHANNEL_COUNT: 2243cd25fed09742235fac10953b9d4b77268c695063Glenn Kasten { 2244cd25fed09742235fac10953b9d4b77268c695063Glenn Kasten int32_t channelCount; 2245cd25fed09742235fac10953b9d4b77268c695063Glenn Kasten if (mAudioTrack == 0 || 2246cd25fed09742235fac10953b9d4b77268c695063Glenn Kasten !mAudioTrack->getFormat()->findInt32(kKeyChannelCount, &channelCount)) { 2247cd25fed09742235fac10953b9d4b77268c695063Glenn Kasten channelCount = 0; 2248cd25fed09742235fac10953b9d4b77268c695063Glenn Kasten } 2249cd25fed09742235fac10953b9d4b77268c695063Glenn Kasten reply->writeInt32(channelCount); 2250cd25fed09742235fac10953b9d4b77268c695063Glenn Kasten } 2251cd25fed09742235fac10953b9d4b77268c695063Glenn Kasten return OK; 2252cd25fed09742235fac10953b9d4b77268c695063Glenn Kasten default: 2253cd25fed09742235fac10953b9d4b77268c695063Glenn Kasten { 2254cd25fed09742235fac10953b9d4b77268c695063Glenn Kasten return ERROR_UNSUPPORTED; 2255cd25fed09742235fac10953b9d4b77268c695063Glenn Kasten } 2256cd25fed09742235fac10953b9d4b77268c695063Glenn Kasten } 22574f9e47f2c03ce36261c4717cd7e131d7940bb068Gloria Wang} 2258ed54ad0f8619ae416b0968ade6248894cbfc4dbaAndreas Huber 2259681755fc0d0797506456f46a2a10555916d6be32Andreas Huberbool AwesomePlayer::isStreamingHTTP() const { 2260681755fc0d0797506456f46a2a10555916d6be32Andreas Huber return mCachedSource != NULL || mWVMExtractor != NULL; 2261681755fc0d0797506456f46a2a10555916d6be32Andreas Huber} 2262681755fc0d0797506456f46a2a10555916d6be32Andreas Huber 2263a0b1d4b161599c2bb2a47119e50c51e75bbe980eAndreas Huberstatus_t AwesomePlayer::dump(int fd, const Vector<String16> &args) const { 2264a0b1d4b161599c2bb2a47119e50c51e75bbe980eAndreas Huber Mutex::Autolock autoLock(mStatsLock); 2265a0b1d4b161599c2bb2a47119e50c51e75bbe980eAndreas Huber 2266a0b1d4b161599c2bb2a47119e50c51e75bbe980eAndreas Huber FILE *out = fdopen(dup(fd), "w"); 2267a0b1d4b161599c2bb2a47119e50c51e75bbe980eAndreas Huber 2268a0b1d4b161599c2bb2a47119e50c51e75bbe980eAndreas Huber fprintf(out, " AwesomePlayer\n"); 2269a0b1d4b161599c2bb2a47119e50c51e75bbe980eAndreas Huber if (mStats.mFd < 0) { 2270a0b1d4b161599c2bb2a47119e50c51e75bbe980eAndreas Huber fprintf(out, " URI(%s)", mStats.mURI.string()); 2271a0b1d4b161599c2bb2a47119e50c51e75bbe980eAndreas Huber } else { 2272a0b1d4b161599c2bb2a47119e50c51e75bbe980eAndreas Huber fprintf(out, " fd(%d)", mStats.mFd); 2273a0b1d4b161599c2bb2a47119e50c51e75bbe980eAndreas Huber } 2274a0b1d4b161599c2bb2a47119e50c51e75bbe980eAndreas Huber 2275a0b1d4b161599c2bb2a47119e50c51e75bbe980eAndreas Huber fprintf(out, ", flags(0x%08x)", mStats.mFlags); 2276a0b1d4b161599c2bb2a47119e50c51e75bbe980eAndreas Huber 2277a0b1d4b161599c2bb2a47119e50c51e75bbe980eAndreas Huber if (mStats.mBitrate >= 0) { 2278a0b1d4b161599c2bb2a47119e50c51e75bbe980eAndreas Huber fprintf(out, ", bitrate(%lld bps)", mStats.mBitrate); 2279a0b1d4b161599c2bb2a47119e50c51e75bbe980eAndreas Huber } 2280a0b1d4b161599c2bb2a47119e50c51e75bbe980eAndreas Huber 2281a0b1d4b161599c2bb2a47119e50c51e75bbe980eAndreas Huber fprintf(out, "\n"); 2282a0b1d4b161599c2bb2a47119e50c51e75bbe980eAndreas Huber 2283a0b1d4b161599c2bb2a47119e50c51e75bbe980eAndreas Huber for (size_t i = 0; i < mStats.mTracks.size(); ++i) { 2284a0b1d4b161599c2bb2a47119e50c51e75bbe980eAndreas Huber const TrackStat &stat = mStats.mTracks.itemAt(i); 2285a0b1d4b161599c2bb2a47119e50c51e75bbe980eAndreas Huber 2286a0b1d4b161599c2bb2a47119e50c51e75bbe980eAndreas Huber fprintf(out, " Track %d\n", i + 1); 2287a0b1d4b161599c2bb2a47119e50c51e75bbe980eAndreas Huber fprintf(out, " MIME(%s)", stat.mMIME.string()); 2288a0b1d4b161599c2bb2a47119e50c51e75bbe980eAndreas Huber 2289a0b1d4b161599c2bb2a47119e50c51e75bbe980eAndreas Huber if (!stat.mDecoderName.isEmpty()) { 2290a0b1d4b161599c2bb2a47119e50c51e75bbe980eAndreas Huber fprintf(out, ", decoder(%s)", stat.mDecoderName.string()); 2291a0b1d4b161599c2bb2a47119e50c51e75bbe980eAndreas Huber } 2292a0b1d4b161599c2bb2a47119e50c51e75bbe980eAndreas Huber 2293a0b1d4b161599c2bb2a47119e50c51e75bbe980eAndreas Huber fprintf(out, "\n"); 2294a0b1d4b161599c2bb2a47119e50c51e75bbe980eAndreas Huber 2295a0b1d4b161599c2bb2a47119e50c51e75bbe980eAndreas Huber if ((ssize_t)i == mStats.mVideoTrackIndex) { 2296a0b1d4b161599c2bb2a47119e50c51e75bbe980eAndreas Huber fprintf(out, 2297a0b1d4b161599c2bb2a47119e50c51e75bbe980eAndreas Huber " videoDimensions(%d x %d), " 2298a0b1d4b161599c2bb2a47119e50c51e75bbe980eAndreas Huber "numVideoFramesDecoded(%lld), " 2299a0b1d4b161599c2bb2a47119e50c51e75bbe980eAndreas Huber "numVideoFramesDropped(%lld)\n", 2300a0b1d4b161599c2bb2a47119e50c51e75bbe980eAndreas Huber mStats.mVideoWidth, 2301a0b1d4b161599c2bb2a47119e50c51e75bbe980eAndreas Huber mStats.mVideoHeight, 2302a0b1d4b161599c2bb2a47119e50c51e75bbe980eAndreas Huber mStats.mNumVideoFramesDecoded, 2303a0b1d4b161599c2bb2a47119e50c51e75bbe980eAndreas Huber mStats.mNumVideoFramesDropped); 2304a0b1d4b161599c2bb2a47119e50c51e75bbe980eAndreas Huber } 2305a0b1d4b161599c2bb2a47119e50c51e75bbe980eAndreas Huber } 2306a0b1d4b161599c2bb2a47119e50c51e75bbe980eAndreas Huber 2307a0b1d4b161599c2bb2a47119e50c51e75bbe980eAndreas Huber fclose(out); 2308a0b1d4b161599c2bb2a47119e50c51e75bbe980eAndreas Huber out = NULL; 2309a0b1d4b161599c2bb2a47119e50c51e75bbe980eAndreas Huber 2310a0b1d4b161599c2bb2a47119e50c51e75bbe980eAndreas Huber return OK; 2311a0b1d4b161599c2bb2a47119e50c51e75bbe980eAndreas Huber} 2312a0b1d4b161599c2bb2a47119e50c51e75bbe980eAndreas Huber 2313a0b1d4b161599c2bb2a47119e50c51e75bbe980eAndreas Hubervoid AwesomePlayer::modifyFlags(unsigned value, FlagMode mode) { 2314a0b1d4b161599c2bb2a47119e50c51e75bbe980eAndreas Huber switch (mode) { 2315a0b1d4b161599c2bb2a47119e50c51e75bbe980eAndreas Huber case SET: 2316a0b1d4b161599c2bb2a47119e50c51e75bbe980eAndreas Huber mFlags |= value; 2317a0b1d4b161599c2bb2a47119e50c51e75bbe980eAndreas Huber break; 2318a0b1d4b161599c2bb2a47119e50c51e75bbe980eAndreas Huber case CLEAR: 2319a0b1d4b161599c2bb2a47119e50c51e75bbe980eAndreas Huber mFlags &= ~value; 2320a0b1d4b161599c2bb2a47119e50c51e75bbe980eAndreas Huber break; 2321a0b1d4b161599c2bb2a47119e50c51e75bbe980eAndreas Huber case ASSIGN: 2322a0b1d4b161599c2bb2a47119e50c51e75bbe980eAndreas Huber mFlags = value; 2323a0b1d4b161599c2bb2a47119e50c51e75bbe980eAndreas Huber break; 2324a0b1d4b161599c2bb2a47119e50c51e75bbe980eAndreas Huber default: 2325a0b1d4b161599c2bb2a47119e50c51e75bbe980eAndreas Huber TRESPASS(); 2326a0b1d4b161599c2bb2a47119e50c51e75bbe980eAndreas Huber } 2327a0b1d4b161599c2bb2a47119e50c51e75bbe980eAndreas Huber 2328a0b1d4b161599c2bb2a47119e50c51e75bbe980eAndreas Huber { 2329a0b1d4b161599c2bb2a47119e50c51e75bbe980eAndreas Huber Mutex::Autolock autoLock(mStatsLock); 2330a0b1d4b161599c2bb2a47119e50c51e75bbe980eAndreas Huber mStats.mFlags = mFlags; 2331a0b1d4b161599c2bb2a47119e50c51e75bbe980eAndreas Huber } 2332a0b1d4b161599c2bb2a47119e50c51e75bbe980eAndreas Huber} 2333a0b1d4b161599c2bb2a47119e50c51e75bbe980eAndreas Huber 2334bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber} // namespace android 2335