AwesomePlayer.cpp revision 7a1e3e81264189e23a1db2b174e1b5a5d4c7d1c3
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" 27733b7729ea462fae9c6899456444e28fef1c757cAndreas Huber#include "include/SoftwareRenderer.h" 280a5baa9b411fe086013d2a5e9126ed63fbad046cAndreas Huber#include "include/NuCachedSource2.h" 290a5baa9b411fe086013d2a5e9126ed63fbad046cAndreas Huber#include "include/ThrottledSource.h" 30bff07d0b22a5ee2d9f044f6cb5e4be1532017ab0Andreas Huber#include "include/MPEG2TSExtractor.h" 317a1e3e81264189e23a1db2b174e1b5a5d4c7d1c3Gloria Wang#include "include/TimedTextPlayer.h" 32bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber 334844ac54e8b5997c3b03872dbafe8ebed4787517Andreas Huber#include <binder/IPCThreadState.h> 347cf180c9bff69e5cc4a2f4e53b432db45ebbebabGloria Wang#include <binder/IServiceManager.h> 357cf180c9bff69e5cc4a2f4e53b432db45ebbebabGloria Wang#include <media/IMediaPlayerService.h> 36e2b1028852120bcfded33b8f06f66b780437fe92Andreas Huber#include <media/stagefright/foundation/hexdump.h> 37e2b1028852120bcfded33b8f06f66b780437fe92Andreas Huber#include <media/stagefright/foundation/ADebug.h> 38bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber#include <media/stagefright/AudioPlayer.h> 39bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber#include <media/stagefright/DataSource.h> 40bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber#include <media/stagefright/FileSource.h> 41bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber#include <media/stagefright/MediaBuffer.h> 42717826ececd8d39596f62418677721d70776add1Andreas Huber#include <media/stagefright/MediaDefs.h> 43bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber#include <media/stagefright/MediaExtractor.h> 44bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber#include <media/stagefright/MediaSource.h> 45bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber#include <media/stagefright/MetaData.h> 46bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber#include <media/stagefright/OMXCodec.h> 47717826ececd8d39596f62418677721d70776add1Andreas Huber 485daeb129a2c2ba3d14ccd94af283b5f561c783eaAndreas Huber#include <surfaceflinger/Surface.h> 491173118eace0e9e347cb007f0da817cee87579edGlenn Kasten#include <gui/ISurfaceTexture.h> 501173118eace0e9e347cb007f0da817cee87579edGlenn Kasten#include <gui/SurfaceTextureClient.h> 512eb62955eb84b97695e8a7e56e14310cbb86412bGlenn Kasten#include <surfaceflinger/ISurfaceComposer.h> 523cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian 53cf7b9c7aae758ac0b99833915053c63c2ac46e09Andreas Huber#include <media/stagefright/foundation/ALooper.h> 5414acc736e336cbd6026df781d4f411e908831815Andreas Huber#include <media/stagefright/foundation/AMessage.h> 55e71d10e7ad55ccbcb0756c007caef1c959090384Andreas Huber 56eabd34665adc284525fe7337ad5c56a8b92964efGlenn Kasten#include <cutils/properties.h> 57eabd34665adc284525fe7337ad5c56a8b92964efGlenn Kasten 58e332a9181cf6a3155ed1a0fd2afc212ccb1f2753Andreas Huber#define USE_SURFACE_ALLOC 1 59e332a9181cf6a3155ed1a0fd2afc212ccb1f2753Andreas Huber 60bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Hubernamespace android { 61bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber 628650e1960905097f6f1d6aa462ccb1c93c656834Andreas Huberstatic int64_t kLowWaterMarkUs = 2000000ll; // 2secs 638650e1960905097f6f1d6aa462ccb1c93c656834Andreas Huberstatic int64_t kHighWaterMarkUs = 10000000ll; // 10secs 64100a4408968b90e314526185d572c72ea4cc784aAndreas Huberstatic int64_t kHighWaterMarkRTSPUs = 4000000ll; // 4secs 65ac05c317cd818701535c5d72ce90da98c4bae75bAndreas Huberstatic const size_t kLowWaterMarkBytes = 40000; 66ac05c317cd818701535c5d72ce90da98c4bae75bAndreas Huberstatic const size_t kHighWaterMarkBytes = 200000; 678650e1960905097f6f1d6aa462ccb1c93c656834Andreas Huber 68bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huberstruct AwesomeEvent : public TimedEventQueue::Event { 69c23f12af0394aa2f6651968a3c8840f1af317aa1Andreas Huber AwesomeEvent( 70c23f12af0394aa2f6651968a3c8840f1af317aa1Andreas Huber AwesomePlayer *player, 71c23f12af0394aa2f6651968a3c8840f1af317aa1Andreas Huber void (AwesomePlayer::*method)()) 72bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber : mPlayer(player), 73c23f12af0394aa2f6651968a3c8840f1af317aa1Andreas Huber mMethod(method) { 74bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber } 75bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber 76bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huberprotected: 77bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber virtual ~AwesomeEvent() {} 78bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber 79bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber virtual void fire(TimedEventQueue *queue, int64_t /* now_us */) { 80c23f12af0394aa2f6651968a3c8840f1af317aa1Andreas Huber (mPlayer->*mMethod)(); 81bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber } 82bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber 83bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huberprivate: 84bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber AwesomePlayer *mPlayer; 85c23f12af0394aa2f6651968a3c8840f1af317aa1Andreas Huber void (AwesomePlayer::*mMethod)(); 86bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber 87bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber AwesomeEvent(const AwesomeEvent &); 88bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber AwesomeEvent &operator=(const AwesomeEvent &); 89bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber}; 90bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber 91733b7729ea462fae9c6899456444e28fef1c757cAndreas Huberstruct AwesomeLocalRenderer : public AwesomeRenderer { 92733b7729ea462fae9c6899456444e28fef1c757cAndreas Huber AwesomeLocalRenderer( 931173118eace0e9e347cb007f0da817cee87579edGlenn Kasten const sp<ANativeWindow> &nativeWindow, const sp<MetaData> &meta) 941173118eace0e9e347cb007f0da817cee87579edGlenn Kasten : mTarget(new SoftwareRenderer(nativeWindow, meta)) { 95733b7729ea462fae9c6899456444e28fef1c757cAndreas Huber } 96733b7729ea462fae9c6899456444e28fef1c757cAndreas Huber 97733b7729ea462fae9c6899456444e28fef1c757cAndreas Huber virtual void render(MediaBuffer *buffer) { 98fa090f541bb84a546af2ec834e91a032ff10e66eAndreas Huber render((const uint8_t *)buffer->data() + buffer->range_offset(), 99fa090f541bb84a546af2ec834e91a032ff10e66eAndreas Huber buffer->range_length()); 100fa090f541bb84a546af2ec834e91a032ff10e66eAndreas Huber } 101fa090f541bb84a546af2ec834e91a032ff10e66eAndreas Huber 102fa090f541bb84a546af2ec834e91a032ff10e66eAndreas Huber void render(const void *data, size_t size) { 103fa090f541bb84a546af2ec834e91a032ff10e66eAndreas Huber mTarget->render(data, size, NULL); 104733b7729ea462fae9c6899456444e28fef1c757cAndreas Huber } 105733b7729ea462fae9c6899456444e28fef1c757cAndreas Huber 106733b7729ea462fae9c6899456444e28fef1c757cAndreas Huberprotected: 107733b7729ea462fae9c6899456444e28fef1c757cAndreas Huber virtual ~AwesomeLocalRenderer() { 108733b7729ea462fae9c6899456444e28fef1c757cAndreas Huber delete mTarget; 109733b7729ea462fae9c6899456444e28fef1c757cAndreas Huber mTarget = NULL; 110733b7729ea462fae9c6899456444e28fef1c757cAndreas Huber } 111733b7729ea462fae9c6899456444e28fef1c757cAndreas Huber 112733b7729ea462fae9c6899456444e28fef1c757cAndreas Huberprivate: 1130a5ca668c6f7d45706e9aec4a1dfec0aacc6d233Andreas Huber SoftwareRenderer *mTarget; 114988e3f0b2c74095deae580157c57935a98573052Andreas Huber 115733b7729ea462fae9c6899456444e28fef1c757cAndreas Huber AwesomeLocalRenderer(const AwesomeLocalRenderer &); 116733b7729ea462fae9c6899456444e28fef1c757cAndreas Huber AwesomeLocalRenderer &operator=(const AwesomeLocalRenderer &);; 117733b7729ea462fae9c6899456444e28fef1c757cAndreas Huber}; 118733b7729ea462fae9c6899456444e28fef1c757cAndreas Huber 1196a9da9fc558263548ebfbae2cbf177eb7454a41bJamie Gennisstruct AwesomeNativeWindowRenderer : public AwesomeRenderer { 120ba529e486dde15fe75ea1b48570f9d60a4cf3c48Andreas Huber AwesomeNativeWindowRenderer( 121ba529e486dde15fe75ea1b48570f9d60a4cf3c48Andreas Huber const sp<ANativeWindow> &nativeWindow, 122ba529e486dde15fe75ea1b48570f9d60a4cf3c48Andreas Huber int32_t rotationDegrees) 1236a9da9fc558263548ebfbae2cbf177eb7454a41bJamie Gennis : mNativeWindow(nativeWindow) { 124ba529e486dde15fe75ea1b48570f9d60a4cf3c48Andreas Huber applyRotation(rotationDegrees); 1256a9da9fc558263548ebfbae2cbf177eb7454a41bJamie Gennis } 1266a9da9fc558263548ebfbae2cbf177eb7454a41bJamie Gennis 1276a9da9fc558263548ebfbae2cbf177eb7454a41bJamie Gennis virtual void render(MediaBuffer *buffer) { 1286a9da9fc558263548ebfbae2cbf177eb7454a41bJamie Gennis status_t err = mNativeWindow->queueBuffer( 1296a9da9fc558263548ebfbae2cbf177eb7454a41bJamie Gennis mNativeWindow.get(), buffer->graphicBuffer().get()); 1306a9da9fc558263548ebfbae2cbf177eb7454a41bJamie Gennis if (err != 0) { 1316a9da9fc558263548ebfbae2cbf177eb7454a41bJamie Gennis LOGE("queueBuffer failed with error %s (%d)", strerror(-err), 1326a9da9fc558263548ebfbae2cbf177eb7454a41bJamie Gennis -err); 1336a9da9fc558263548ebfbae2cbf177eb7454a41bJamie Gennis return; 1346a9da9fc558263548ebfbae2cbf177eb7454a41bJamie Gennis } 1356a9da9fc558263548ebfbae2cbf177eb7454a41bJamie Gennis 1366a9da9fc558263548ebfbae2cbf177eb7454a41bJamie Gennis sp<MetaData> metaData = buffer->meta_data(); 1376a9da9fc558263548ebfbae2cbf177eb7454a41bJamie Gennis metaData->setInt32(kKeyRendered, 1); 1386a9da9fc558263548ebfbae2cbf177eb7454a41bJamie Gennis } 1396a9da9fc558263548ebfbae2cbf177eb7454a41bJamie Gennis 1406a9da9fc558263548ebfbae2cbf177eb7454a41bJamie Gennisprotected: 1416a9da9fc558263548ebfbae2cbf177eb7454a41bJamie Gennis virtual ~AwesomeNativeWindowRenderer() {} 1426a9da9fc558263548ebfbae2cbf177eb7454a41bJamie Gennis 1436a9da9fc558263548ebfbae2cbf177eb7454a41bJamie Gennisprivate: 1446a9da9fc558263548ebfbae2cbf177eb7454a41bJamie Gennis sp<ANativeWindow> mNativeWindow; 1456a9da9fc558263548ebfbae2cbf177eb7454a41bJamie Gennis 146ba529e486dde15fe75ea1b48570f9d60a4cf3c48Andreas Huber void applyRotation(int32_t rotationDegrees) { 147ba529e486dde15fe75ea1b48570f9d60a4cf3c48Andreas Huber uint32_t transform; 148ba529e486dde15fe75ea1b48570f9d60a4cf3c48Andreas Huber switch (rotationDegrees) { 149ba529e486dde15fe75ea1b48570f9d60a4cf3c48Andreas Huber case 0: transform = 0; break; 150ba529e486dde15fe75ea1b48570f9d60a4cf3c48Andreas Huber case 90: transform = HAL_TRANSFORM_ROT_90; break; 151ba529e486dde15fe75ea1b48570f9d60a4cf3c48Andreas Huber case 180: transform = HAL_TRANSFORM_ROT_180; break; 152ba529e486dde15fe75ea1b48570f9d60a4cf3c48Andreas Huber case 270: transform = HAL_TRANSFORM_ROT_270; break; 153ba529e486dde15fe75ea1b48570f9d60a4cf3c48Andreas Huber default: transform = 0; break; 154ba529e486dde15fe75ea1b48570f9d60a4cf3c48Andreas Huber } 155ba529e486dde15fe75ea1b48570f9d60a4cf3c48Andreas Huber 156ba529e486dde15fe75ea1b48570f9d60a4cf3c48Andreas Huber if (transform) { 157ba529e486dde15fe75ea1b48570f9d60a4cf3c48Andreas Huber CHECK_EQ(0, native_window_set_buffers_transform( 158ba529e486dde15fe75ea1b48570f9d60a4cf3c48Andreas Huber mNativeWindow.get(), transform)); 159ba529e486dde15fe75ea1b48570f9d60a4cf3c48Andreas Huber } 160ba529e486dde15fe75ea1b48570f9d60a4cf3c48Andreas Huber } 161ba529e486dde15fe75ea1b48570f9d60a4cf3c48Andreas Huber 1626a9da9fc558263548ebfbae2cbf177eb7454a41bJamie Gennis AwesomeNativeWindowRenderer(const AwesomeNativeWindowRenderer &); 1636a9da9fc558263548ebfbae2cbf177eb7454a41bJamie Gennis AwesomeNativeWindowRenderer &operator=( 1646a9da9fc558263548ebfbae2cbf177eb7454a41bJamie Gennis const AwesomeNativeWindowRenderer &); 1656a9da9fc558263548ebfbae2cbf177eb7454a41bJamie Gennis}; 1666a9da9fc558263548ebfbae2cbf177eb7454a41bJamie Gennis 1677cf180c9bff69e5cc4a2f4e53b432db45ebbebabGloria Wang// To collect the decoder usage 1687cf180c9bff69e5cc4a2f4e53b432db45ebbebabGloria Wangvoid addBatteryData(uint32_t params) { 1697cf180c9bff69e5cc4a2f4e53b432db45ebbebabGloria Wang sp<IBinder> binder = 1707cf180c9bff69e5cc4a2f4e53b432db45ebbebabGloria Wang defaultServiceManager()->getService(String16("media.player")); 1717cf180c9bff69e5cc4a2f4e53b432db45ebbebabGloria Wang sp<IMediaPlayerService> service = interface_cast<IMediaPlayerService>(binder); 1727cf180c9bff69e5cc4a2f4e53b432db45ebbebabGloria Wang CHECK(service.get() != NULL); 1737cf180c9bff69e5cc4a2f4e53b432db45ebbebabGloria Wang 1747cf180c9bff69e5cc4a2f4e53b432db45ebbebabGloria Wang service->addBatteryData(params); 1757cf180c9bff69e5cc4a2f4e53b432db45ebbebabGloria Wang} 176e2b1028852120bcfded33b8f06f66b780437fe92Andreas Huber 1777cf180c9bff69e5cc4a2f4e53b432db45ebbebabGloria Wang//////////////////////////////////////////////////////////////////////////////// 178bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas HuberAwesomePlayer::AwesomePlayer() 1792e8ffaf95bd35358ecd14ddf00cddaf3abefe0a9Andreas Huber : mQueueStarted(false), 1802e8ffaf95bd35358ecd14ddf00cddaf3abefe0a9Andreas Huber mTimeSource(NULL), 181fa090f541bb84a546af2ec834e91a032ff10e66eAndreas Huber mVideoRendererIsPreview(false), 182bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber mAudioPlayer(NULL), 183b45c01c2b8588ff431b511151666a55a39f0a6aeJames Dong mDisplayWidth(0), 184b45c01c2b8588ff431b511151666a55a39f0a6aeJames Dong mDisplayHeight(0), 185bd22c52280179b29eefac91ef7e7bbbc33d25904Andreas Huber mFlags(0), 186acdd9d0f59c3d8bdc3de80664a609527ec3d21e2Andreas Huber mExtractorFlags(0), 1877b3396acc702451be9bafb19d7fe26d55d43a316Andreas Huber mVideoBuffer(NULL), 188150694cda0842d38a9358fe8d1fcb4fb4a76599eAndreas Huber mDecryptHandle(NULL), 1897a1e3e81264189e23a1db2b174e1b5a5d4c7d1c3Gloria Wang mLastVideoTimeUs(-1), 1907a1e3e81264189e23a1db2b174e1b5a5d4c7d1c3Gloria Wang mTextPlayer(NULL) { 191e2b1028852120bcfded33b8f06f66b780437fe92Andreas Huber CHECK_EQ(mClient.connect(), (status_t)OK); 192bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber 193bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber DataSource::RegisterDefaultSniffers(); 194bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber 195c23f12af0394aa2f6651968a3c8840f1af317aa1Andreas Huber mVideoEvent = new AwesomeEvent(this, &AwesomePlayer::onVideoEvent); 196bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber mVideoEventPending = false; 197c23f12af0394aa2f6651968a3c8840f1af317aa1Andreas Huber mStreamDoneEvent = new AwesomeEvent(this, &AwesomePlayer::onStreamDone); 198bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber mStreamDoneEventPending = false; 199c23f12af0394aa2f6651968a3c8840f1af317aa1Andreas Huber mBufferingEvent = new AwesomeEvent(this, &AwesomePlayer::onBufferingUpdate); 20066b0a35c9a4136a84c3f73b1b25fcb5220138b95Andreas Huber mBufferingEventPending = false; 201145e68fc778275963189b02a1adcbe27cce4d769Andreas Huber mVideoLagEvent = new AwesomeEvent(this, &AwesomePlayer::onVideoLagUpdate); 202145e68fc778275963189b02a1adcbe27cce4d769Andreas Huber mVideoEventPending = false; 203c23f12af0394aa2f6651968a3c8840f1af317aa1Andreas Huber 204c23f12af0394aa2f6651968a3c8840f1af317aa1Andreas Huber mCheckAudioStatusEvent = new AwesomeEvent( 205c23f12af0394aa2f6651968a3c8840f1af317aa1Andreas Huber this, &AwesomePlayer::onCheckAudioStatus); 206c23f12af0394aa2f6651968a3c8840f1af317aa1Andreas Huber 2071862a33b246249630b654182afb5914da3480d4cAndreas Huber mAudioStatusEventPending = false; 208bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber 209bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber reset(); 210bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber} 211bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber 212bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas HuberAwesomePlayer::~AwesomePlayer() { 2132e8ffaf95bd35358ecd14ddf00cddaf3abefe0a9Andreas Huber if (mQueueStarted) { 2142e8ffaf95bd35358ecd14ddf00cddaf3abefe0a9Andreas Huber mQueue.stop(); 2152e8ffaf95bd35358ecd14ddf00cddaf3abefe0a9Andreas Huber } 216bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber 217bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber reset(); 218bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber 219bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber mClient.disconnect(); 220bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber} 221bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber 22266b0a35c9a4136a84c3f73b1b25fcb5220138b95Andreas Hubervoid AwesomePlayer::cancelPlayerEvents(bool keepBufferingGoing) { 223bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber mQueue.cancelEvent(mVideoEvent->eventID()); 224bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber mVideoEventPending = false; 225bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber mQueue.cancelEvent(mStreamDoneEvent->eventID()); 226bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber mStreamDoneEventPending = false; 2271862a33b246249630b654182afb5914da3480d4cAndreas Huber mQueue.cancelEvent(mCheckAudioStatusEvent->eventID()); 2281862a33b246249630b654182afb5914da3480d4cAndreas Huber mAudioStatusEventPending = false; 229145e68fc778275963189b02a1adcbe27cce4d769Andreas Huber mQueue.cancelEvent(mVideoLagEvent->eventID()); 230145e68fc778275963189b02a1adcbe27cce4d769Andreas Huber mVideoLagEventPending = false; 23166b0a35c9a4136a84c3f73b1b25fcb5220138b95Andreas Huber 23266b0a35c9a4136a84c3f73b1b25fcb5220138b95Andreas Huber if (!keepBufferingGoing) { 23366b0a35c9a4136a84c3f73b1b25fcb5220138b95Andreas Huber mQueue.cancelEvent(mBufferingEvent->eventID()); 23466b0a35c9a4136a84c3f73b1b25fcb5220138b95Andreas Huber mBufferingEventPending = false; 23566b0a35c9a4136a84c3f73b1b25fcb5220138b95Andreas Huber } 236bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber} 237bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber 2380726045216f576e97672ebeefc265d39c4ebaaa5Andreas Hubervoid AwesomePlayer::setListener(const wp<MediaPlayerBase> &listener) { 239bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber Mutex::Autolock autoLock(mLock); 240bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber mListener = listener; 241bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber} 242bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber 2435561ccf4a8db88a2e44eac1b3ed13b4ff53a7f20Andreas Huberstatus_t AwesomePlayer::setDataSource( 2445561ccf4a8db88a2e44eac1b3ed13b4ff53a7f20Andreas Huber const char *uri, const KeyedVector<String8, String8> *headers) { 245bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber Mutex::Autolock autoLock(mLock); 2467b3396acc702451be9bafb19d7fe26d55d43a316Andreas Huber return setDataSource_l(uri, headers); 2477b3396acc702451be9bafb19d7fe26d55d43a316Andreas Huber} 248bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber 2497b3396acc702451be9bafb19d7fe26d55d43a316Andreas Huberstatus_t AwesomePlayer::setDataSource_l( 2507b3396acc702451be9bafb19d7fe26d55d43a316Andreas Huber const char *uri, const KeyedVector<String8, String8> *headers) { 251bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber reset_l(); 252bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber 253bd22c52280179b29eefac91ef7e7bbbc33d25904Andreas Huber mUri = uri; 25466b0a35c9a4136a84c3f73b1b25fcb5220138b95Andreas Huber 255bd22c52280179b29eefac91ef7e7bbbc33d25904Andreas Huber if (headers) { 256bd22c52280179b29eefac91ef7e7bbbc33d25904Andreas Huber mUriHeaders = *headers; 2577314fa17093d514199fedcb55ac41136a1b31cb3Andreas Huber 2587314fa17093d514199fedcb55ac41136a1b31cb3Andreas Huber ssize_t index = mUriHeaders.indexOfKey(String8("x-hide-urls-from-log")); 2597314fa17093d514199fedcb55ac41136a1b31cb3Andreas Huber if (index >= 0) { 2607314fa17093d514199fedcb55ac41136a1b31cb3Andreas Huber // Browser is in "incognito" mode, suppress logging URLs. 2617314fa17093d514199fedcb55ac41136a1b31cb3Andreas Huber 2627314fa17093d514199fedcb55ac41136a1b31cb3Andreas Huber // This isn't something that should be passed to the server. 2637314fa17093d514199fedcb55ac41136a1b31cb3Andreas Huber mUriHeaders.removeItemsAt(index); 2647314fa17093d514199fedcb55ac41136a1b31cb3Andreas Huber 2657314fa17093d514199fedcb55ac41136a1b31cb3Andreas Huber mFlags |= INCOGNITO; 2667314fa17093d514199fedcb55ac41136a1b31cb3Andreas Huber } 2677314fa17093d514199fedcb55ac41136a1b31cb3Andreas Huber } 2687314fa17093d514199fedcb55ac41136a1b31cb3Andreas Huber 2697314fa17093d514199fedcb55ac41136a1b31cb3Andreas Huber if (!(mFlags & INCOGNITO)) { 2707314fa17093d514199fedcb55ac41136a1b31cb3Andreas Huber LOGI("setDataSource_l('%s')", mUri.string()); 2717314fa17093d514199fedcb55ac41136a1b31cb3Andreas Huber } else { 2727314fa17093d514199fedcb55ac41136a1b31cb3Andreas Huber LOGI("setDataSource_l(URL suppressed)"); 27366b0a35c9a4136a84c3f73b1b25fcb5220138b95Andreas Huber } 27466b0a35c9a4136a84c3f73b1b25fcb5220138b95Andreas Huber 275bd22c52280179b29eefac91ef7e7bbbc33d25904Andreas Huber // The actual work will be done during preparation in the call to 276bd22c52280179b29eefac91ef7e7bbbc33d25904Andreas Huber // ::finishSetDataSource_l to avoid blocking the calling thread in 277bd22c52280179b29eefac91ef7e7bbbc33d25904Andreas Huber // setDataSource for any significant time. 27866b0a35c9a4136a84c3f73b1b25fcb5220138b95Andreas Huber 279bd22c52280179b29eefac91ef7e7bbbc33d25904Andreas Huber return OK; 280bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber} 281bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber 282bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huberstatus_t AwesomePlayer::setDataSource( 283bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber int fd, int64_t offset, int64_t length) { 284bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber Mutex::Autolock autoLock(mLock); 285bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber 286bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber reset_l(); 287bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber 2887b3396acc702451be9bafb19d7fe26d55d43a316Andreas Huber sp<DataSource> dataSource = new FileSource(fd, offset, length); 289bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber 2907b3396acc702451be9bafb19d7fe26d55d43a316Andreas Huber status_t err = dataSource->initCheck(); 291bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber 292bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber if (err != OK) { 293bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber return err; 294bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber } 295bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber 2967b3396acc702451be9bafb19d7fe26d55d43a316Andreas Huber mFileSource = dataSource; 2977b3396acc702451be9bafb19d7fe26d55d43a316Andreas Huber 2987b3396acc702451be9bafb19d7fe26d55d43a316Andreas Huber return setDataSource_l(dataSource); 2997b3396acc702451be9bafb19d7fe26d55d43a316Andreas Huber} 3007b3396acc702451be9bafb19d7fe26d55d43a316Andreas Huber 301e2b1028852120bcfded33b8f06f66b780437fe92Andreas Huberstatus_t AwesomePlayer::setDataSource(const sp<IStreamSource> &source) { 30285704836f33a199d7e442a23db82abbd5620d35dAndreas Huber return INVALID_OPERATION; 303e2b1028852120bcfded33b8f06f66b780437fe92Andreas Huber} 304e2b1028852120bcfded33b8f06f66b780437fe92Andreas Huber 3057b3396acc702451be9bafb19d7fe26d55d43a316Andreas Huberstatus_t AwesomePlayer::setDataSource_l( 3067b3396acc702451be9bafb19d7fe26d55d43a316Andreas Huber const sp<DataSource> &dataSource) { 3077b3396acc702451be9bafb19d7fe26d55d43a316Andreas Huber sp<MediaExtractor> extractor = MediaExtractor::Create(dataSource); 308bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber 309bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber if (extractor == NULL) { 310bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber return UNKNOWN_ERROR; 311bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber } 312bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber 313b5ce361d19e69fe156f7188c9ee0f4734b259874Gloria Wang dataSource->getDrmInfo(mDecryptHandle, &mDrmManagerClient); 3148f64134f749e4f7861a08a3063450fc714c4651dGloria Wang if (mDecryptHandle != NULL) { 3158f64134f749e4f7861a08a3063450fc714c4651dGloria Wang CHECK(mDrmManagerClient); 3168f64134f749e4f7861a08a3063450fc714c4651dGloria Wang if (RightsStatus::RIGHTS_VALID != mDecryptHandle->status) { 3177340743ce30766af6334bbd9acf813eb66dd5a60Gloria Wang notifyListener_l(MEDIA_ERROR, MEDIA_ERROR_UNKNOWN, ERROR_DRM_NO_LICENSE); 3188f64134f749e4f7861a08a3063450fc714c4651dGloria Wang } 319dcd25efb46c41c8d24a0a9cf61fb57f84149709eGloria Wang } 320dcd25efb46c41c8d24a0a9cf61fb57f84149709eGloria Wang 321bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber return setDataSource_l(extractor); 322bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber} 323bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber 324bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huberstatus_t AwesomePlayer::setDataSource_l(const sp<MediaExtractor> &extractor) { 3257fbdb0903dfbf70b314a74e64e28fb880cdb9247Andreas Huber // Attempt to approximate overall stream bitrate by summing all 3267fbdb0903dfbf70b314a74e64e28fb880cdb9247Andreas Huber // tracks' individual bitrates, if not all of them advertise bitrate, 3277fbdb0903dfbf70b314a74e64e28fb880cdb9247Andreas Huber // we have to fail. 3287fbdb0903dfbf70b314a74e64e28fb880cdb9247Andreas Huber 3297fbdb0903dfbf70b314a74e64e28fb880cdb9247Andreas Huber int64_t totalBitRate = 0; 3307fbdb0903dfbf70b314a74e64e28fb880cdb9247Andreas Huber 3317fbdb0903dfbf70b314a74e64e28fb880cdb9247Andreas Huber for (size_t i = 0; i < extractor->countTracks(); ++i) { 3327fbdb0903dfbf70b314a74e64e28fb880cdb9247Andreas Huber sp<MetaData> meta = extractor->getTrackMetaData(i); 3337fbdb0903dfbf70b314a74e64e28fb880cdb9247Andreas Huber 3347fbdb0903dfbf70b314a74e64e28fb880cdb9247Andreas Huber int32_t bitrate; 3357fbdb0903dfbf70b314a74e64e28fb880cdb9247Andreas Huber if (!meta->findInt32(kKeyBitRate, &bitrate)) { 3367fbdb0903dfbf70b314a74e64e28fb880cdb9247Andreas Huber totalBitRate = -1; 3377fbdb0903dfbf70b314a74e64e28fb880cdb9247Andreas Huber break; 3387fbdb0903dfbf70b314a74e64e28fb880cdb9247Andreas Huber } 3397fbdb0903dfbf70b314a74e64e28fb880cdb9247Andreas Huber 3407fbdb0903dfbf70b314a74e64e28fb880cdb9247Andreas Huber totalBitRate += bitrate; 3417fbdb0903dfbf70b314a74e64e28fb880cdb9247Andreas Huber } 3427fbdb0903dfbf70b314a74e64e28fb880cdb9247Andreas Huber 3437fbdb0903dfbf70b314a74e64e28fb880cdb9247Andreas Huber mBitrate = totalBitRate; 3447fbdb0903dfbf70b314a74e64e28fb880cdb9247Andreas Huber 3457fbdb0903dfbf70b314a74e64e28fb880cdb9247Andreas Huber LOGV("mBitrate = %lld bits/sec", mBitrate); 3467fbdb0903dfbf70b314a74e64e28fb880cdb9247Andreas Huber 347bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber bool haveAudio = false; 348bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber bool haveVideo = false; 349bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber for (size_t i = 0; i < extractor->countTracks(); ++i) { 350bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber sp<MetaData> meta = extractor->getTrackMetaData(i); 351bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber 352bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber const char *mime; 353bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber CHECK(meta->findCString(kKeyMIMEType, &mime)); 354bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber 355bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber if (!haveVideo && !strncasecmp(mime, "video/", 6)) { 35688d8a83de12592635248aa1a3bd6b9ea46108501Andreas Huber setVideoSource(extractor->getTrack(i)); 35788d8a83de12592635248aa1a3bd6b9ea46108501Andreas Huber haveVideo = true; 358b45c01c2b8588ff431b511151666a55a39f0a6aeJames Dong 359b45c01c2b8588ff431b511151666a55a39f0a6aeJames Dong // Set the presentation/display size 360b45c01c2b8588ff431b511151666a55a39f0a6aeJames Dong int32_t displayWidth, displayHeight; 361b45c01c2b8588ff431b511151666a55a39f0a6aeJames Dong bool success = meta->findInt32(kKeyDisplayWidth, &displayWidth); 362b45c01c2b8588ff431b511151666a55a39f0a6aeJames Dong if (success) { 363b45c01c2b8588ff431b511151666a55a39f0a6aeJames Dong success = meta->findInt32(kKeyDisplayHeight, &displayHeight); 364b45c01c2b8588ff431b511151666a55a39f0a6aeJames Dong } 365b45c01c2b8588ff431b511151666a55a39f0a6aeJames Dong if (success) { 366b45c01c2b8588ff431b511151666a55a39f0a6aeJames Dong mDisplayWidth = displayWidth; 367b45c01c2b8588ff431b511151666a55a39f0a6aeJames Dong mDisplayHeight = displayHeight; 368b45c01c2b8588ff431b511151666a55a39f0a6aeJames Dong } 369b45c01c2b8588ff431b511151666a55a39f0a6aeJames Dong 370bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber } else if (!haveAudio && !strncasecmp(mime, "audio/", 6)) { 37188d8a83de12592635248aa1a3bd6b9ea46108501Andreas Huber setAudioSource(extractor->getTrack(i)); 37288d8a83de12592635248aa1a3bd6b9ea46108501Andreas Huber haveAudio = true; 3738ae49d87b98d57d6758b0c51b95e28a6581a79f1Andreas Huber 3746954535ba64374e4e941cd83019a7af53edfb098Andreas Huber if (!strcasecmp(mime, MEDIA_MIMETYPE_AUDIO_VORBIS)) { 3756954535ba64374e4e941cd83019a7af53edfb098Andreas Huber // Only do this for vorbis audio, none of the other audio 3766954535ba64374e4e941cd83019a7af53edfb098Andreas Huber // formats even support this ringtone specific hack and 3776954535ba64374e4e941cd83019a7af53edfb098Andreas Huber // retrieving the metadata on some extractors may turn out 3786954535ba64374e4e941cd83019a7af53edfb098Andreas Huber // to be very expensive. 3796954535ba64374e4e941cd83019a7af53edfb098Andreas Huber sp<MetaData> fileMeta = extractor->getMetaData(); 3806954535ba64374e4e941cd83019a7af53edfb098Andreas Huber int32_t loop; 3816954535ba64374e4e941cd83019a7af53edfb098Andreas Huber if (fileMeta != NULL 3826954535ba64374e4e941cd83019a7af53edfb098Andreas Huber && fileMeta->findInt32(kKeyAutoLoop, &loop) && loop != 0) { 3836954535ba64374e4e941cd83019a7af53edfb098Andreas Huber mFlags |= AUTO_LOOPING; 3846954535ba64374e4e941cd83019a7af53edfb098Andreas Huber } 3858ae49d87b98d57d6758b0c51b95e28a6581a79f1Andreas Huber } 3867a1e3e81264189e23a1db2b174e1b5a5d4c7d1c3Gloria Wang } else if (!strcasecmp(mime, MEDIA_MIMETYPE_TEXT_3GPP)) { 3877a1e3e81264189e23a1db2b174e1b5a5d4c7d1c3Gloria Wang addTextSource(extractor->getTrack(i)); 388bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber } 389bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber } 390bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber 391acdd9d0f59c3d8bdc3de80664a609527ec3d21e2Andreas Huber if (!haveAudio && !haveVideo) { 392acdd9d0f59c3d8bdc3de80664a609527ec3d21e2Andreas Huber return UNKNOWN_ERROR; 393acdd9d0f59c3d8bdc3de80664a609527ec3d21e2Andreas Huber } 394acdd9d0f59c3d8bdc3de80664a609527ec3d21e2Andreas Huber 395acdd9d0f59c3d8bdc3de80664a609527ec3d21e2Andreas Huber mExtractorFlags = extractor->flags(); 396acdd9d0f59c3d8bdc3de80664a609527ec3d21e2Andreas Huber 397acdd9d0f59c3d8bdc3de80664a609527ec3d21e2Andreas Huber return OK; 398bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber} 399bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber 400bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Hubervoid AwesomePlayer::reset() { 401bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber Mutex::Autolock autoLock(mLock); 402bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber reset_l(); 403bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber} 404bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber 405bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Hubervoid AwesomePlayer::reset_l() { 406b45c01c2b8588ff431b511151666a55a39f0a6aeJames Dong mDisplayWidth = 0; 407b45c01c2b8588ff431b511151666a55a39f0a6aeJames Dong mDisplayHeight = 0; 40865a170e3ac593a29abd0c76e9aa531fabad7f56dAndreas Huber 409dcd25efb46c41c8d24a0a9cf61fb57f84149709eGloria Wang if (mDecryptHandle != NULL) { 410dcd25efb46c41c8d24a0a9cf61fb57f84149709eGloria Wang mDrmManagerClient->setPlaybackStatus(mDecryptHandle, 411dcd25efb46c41c8d24a0a9cf61fb57f84149709eGloria Wang Playback::STOP, 0); 412dcd25efb46c41c8d24a0a9cf61fb57f84149709eGloria Wang mDecryptHandle = NULL; 413dcd25efb46c41c8d24a0a9cf61fb57f84149709eGloria Wang mDrmManagerClient = NULL; 414dcd25efb46c41c8d24a0a9cf61fb57f84149709eGloria Wang } 415dcd25efb46c41c8d24a0a9cf61fb57f84149709eGloria Wang 4167cf180c9bff69e5cc4a2f4e53b432db45ebbebabGloria Wang if (mFlags & PLAYING) { 4177cf180c9bff69e5cc4a2f4e53b432db45ebbebabGloria Wang uint32_t params = IMediaPlayerService::kBatteryDataTrackDecoder; 4187cf180c9bff69e5cc4a2f4e53b432db45ebbebabGloria Wang if ((mAudioSource != NULL) && (mAudioSource != mAudioTrack)) { 4197cf180c9bff69e5cc4a2f4e53b432db45ebbebabGloria Wang params |= IMediaPlayerService::kBatteryDataTrackAudio; 4207cf180c9bff69e5cc4a2f4e53b432db45ebbebabGloria Wang } 4217cf180c9bff69e5cc4a2f4e53b432db45ebbebabGloria Wang if (mVideoSource != NULL) { 4227cf180c9bff69e5cc4a2f4e53b432db45ebbebabGloria Wang params |= IMediaPlayerService::kBatteryDataTrackVideo; 4237cf180c9bff69e5cc4a2f4e53b432db45ebbebabGloria Wang } 4247cf180c9bff69e5cc4a2f4e53b432db45ebbebabGloria Wang addBatteryData(params); 4257cf180c9bff69e5cc4a2f4e53b432db45ebbebabGloria Wang } 4267cf180c9bff69e5cc4a2f4e53b432db45ebbebabGloria Wang 427e94bd14078d327ef2f800e69907efce641a13272Andreas Huber if (mFlags & PREPARING) { 428e94bd14078d327ef2f800e69907efce641a13272Andreas Huber mFlags |= PREPARE_CANCELLED; 429e94bd14078d327ef2f800e69907efce641a13272Andreas Huber if (mConnectingDataSource != NULL) { 430e94bd14078d327ef2f800e69907efce641a13272Andreas Huber LOGI("interrupting the connection process"); 431e94bd14078d327ef2f800e69907efce641a13272Andreas Huber mConnectingDataSource->disconnect(); 432f1958f9442bc937e1f8c8d9175901500b944b021Andreas Huber } else if (mConnectingRTSPController != NULL) { 433f1958f9442bc937e1f8c8d9175901500b944b021Andreas Huber LOGI("interrupting the connection process"); 434f1958f9442bc937e1f8c8d9175901500b944b021Andreas Huber mConnectingRTSPController->disconnect(); 435e94bd14078d327ef2f800e69907efce641a13272Andreas Huber } 4366a05c9e912aeb8bfe1ef99516def91a177a481b6Andreas Huber 4376a05c9e912aeb8bfe1ef99516def91a177a481b6Andreas Huber if (mFlags & PREPARING_CONNECTED) { 4386a05c9e912aeb8bfe1ef99516def91a177a481b6Andreas Huber // We are basically done preparing, we're just buffering 4396a05c9e912aeb8bfe1ef99516def91a177a481b6Andreas Huber // enough data to start playback, we can safely interrupt that. 4406a05c9e912aeb8bfe1ef99516def91a177a481b6Andreas Huber finishAsyncPrepare_l(); 4416a05c9e912aeb8bfe1ef99516def91a177a481b6Andreas Huber } 442e94bd14078d327ef2f800e69907efce641a13272Andreas Huber } 443e94bd14078d327ef2f800e69907efce641a13272Andreas Huber 444bd22c52280179b29eefac91ef7e7bbbc33d25904Andreas Huber while (mFlags & PREPARING) { 445bd22c52280179b29eefac91ef7e7bbbc33d25904Andreas Huber mPreparedCondition.wait(mLock); 446bd22c52280179b29eefac91ef7e7bbbc33d25904Andreas Huber } 447bd22c52280179b29eefac91ef7e7bbbc33d25904Andreas Huber 448bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber cancelPlayerEvents(); 449bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber 4500a5baa9b411fe086013d2a5e9126ed63fbad046cAndreas Huber mCachedSource.clear(); 45188d8a83de12592635248aa1a3bd6b9ea46108501Andreas Huber mAudioTrack.clear(); 45288d8a83de12592635248aa1a3bd6b9ea46108501Andreas Huber mVideoTrack.clear(); 45388d8a83de12592635248aa1a3bd6b9ea46108501Andreas Huber 4547b3396acc702451be9bafb19d7fe26d55d43a316Andreas Huber // Shutdown audio first, so that the respone to the reset request 4557b3396acc702451be9bafb19d7fe26d55d43a316Andreas Huber // appears to happen instantaneously as far as the user is concerned 4567b3396acc702451be9bafb19d7fe26d55d43a316Andreas Huber // If we did this later, audio would continue playing while we 4577b3396acc702451be9bafb19d7fe26d55d43a316Andreas Huber // shutdown the video-related resources and the player appear to 4587b3396acc702451be9bafb19d7fe26d55d43a316Andreas Huber // not be as responsive to a reset request. 459e94bd14078d327ef2f800e69907efce641a13272Andreas Huber if (mAudioPlayer == NULL && mAudioSource != NULL) { 460e94bd14078d327ef2f800e69907efce641a13272Andreas Huber // If we had an audio player, it would have effectively 461e94bd14078d327ef2f800e69907efce641a13272Andreas Huber // taken possession of the audio source and stopped it when 462e94bd14078d327ef2f800e69907efce641a13272Andreas Huber // _it_ is stopped. Otherwise this is still our responsibility. 463e94bd14078d327ef2f800e69907efce641a13272Andreas Huber mAudioSource->stop(); 464e94bd14078d327ef2f800e69907efce641a13272Andreas Huber } 4657b3396acc702451be9bafb19d7fe26d55d43a316Andreas Huber mAudioSource.clear(); 4667b3396acc702451be9bafb19d7fe26d55d43a316Andreas Huber 4677b3396acc702451be9bafb19d7fe26d55d43a316Andreas Huber mTimeSource = NULL; 4687b3396acc702451be9bafb19d7fe26d55d43a316Andreas Huber 4697b3396acc702451be9bafb19d7fe26d55d43a316Andreas Huber delete mAudioPlayer; 4707b3396acc702451be9bafb19d7fe26d55d43a316Andreas Huber mAudioPlayer = NULL; 4717b3396acc702451be9bafb19d7fe26d55d43a316Andreas Huber 4727a1e3e81264189e23a1db2b174e1b5a5d4c7d1c3Gloria Wang if (mTextPlayer != NULL) { 4737a1e3e81264189e23a1db2b174e1b5a5d4c7d1c3Gloria Wang delete mTextPlayer; 4747a1e3e81264189e23a1db2b174e1b5a5d4c7d1c3Gloria Wang mTextPlayer = NULL; 4757a1e3e81264189e23a1db2b174e1b5a5d4c7d1c3Gloria Wang } 4767a1e3e81264189e23a1db2b174e1b5a5d4c7d1c3Gloria Wang 477b9280d5c2313c41eb490f58198c4e59118e0e3e6Andreas Huber mVideoRenderer.clear(); 478b9280d5c2313c41eb490f58198c4e59118e0e3e6Andreas Huber 479cce326fe43411855aca2f719e505b051bc4b61b3Andreas Huber if (mRTSPController != NULL) { 480cce326fe43411855aca2f719e505b051bc4b61b3Andreas Huber mRTSPController->disconnect(); 481cce326fe43411855aca2f719e505b051bc4b61b3Andreas Huber mRTSPController.clear(); 482cce326fe43411855aca2f719e505b051bc4b61b3Andreas Huber } 483cce326fe43411855aca2f719e505b051bc4b61b3Andreas Huber 484bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber if (mVideoSource != NULL) { 485150694cda0842d38a9358fe8d1fcb4fb4a76599eAndreas Huber shutdownVideoDecoder_l(); 486bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber } 487bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber 488bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber mDurationUs = -1; 489bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber mFlags = 0; 490acdd9d0f59c3d8bdc3de80664a609527ec3d21e2Andreas Huber mExtractorFlags = 0; 491bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber mTimeSourceDeltaUs = 0; 492bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber mVideoTimeUs = 0; 493bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber 49464bb6983690bf994d904591145a3cdd6373bdbe6Andreas Huber mSeeking = NO_SEEK; 4951321fdd94d354431b930735e9f38f32ecd189a2dAndreas Huber mSeekNotificationSent = false; 496bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber mSeekTimeUs = 0; 49766b0a35c9a4136a84c3f73b1b25fcb5220138b95Andreas Huber 498bd22c52280179b29eefac91ef7e7bbbc33d25904Andreas Huber mUri.setTo(""); 499bd22c52280179b29eefac91ef7e7bbbc33d25904Andreas Huber mUriHeaders.clear(); 5007b3396acc702451be9bafb19d7fe26d55d43a316Andreas Huber 5017b3396acc702451be9bafb19d7fe26d55d43a316Andreas Huber mFileSource.clear(); 5027b3396acc702451be9bafb19d7fe26d55d43a316Andreas Huber 5037fbdb0903dfbf70b314a74e64e28fb880cdb9247Andreas Huber mBitrate = -1; 504150694cda0842d38a9358fe8d1fcb4fb4a76599eAndreas Huber mLastVideoTimeUs = -1; 505bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber} 506bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber 507c23f12af0394aa2f6651968a3c8840f1af317aa1Andreas Hubervoid AwesomePlayer::notifyListener_l(int msg, int ext1, int ext2) { 5080726045216f576e97672ebeefc265d39c4ebaaa5Andreas Huber if (mListener != NULL) { 5090726045216f576e97672ebeefc265d39c4ebaaa5Andreas Huber sp<MediaPlayerBase> listener = mListener.promote(); 5100726045216f576e97672ebeefc265d39c4ebaaa5Andreas Huber 5110726045216f576e97672ebeefc265d39c4ebaaa5Andreas Huber if (listener != NULL) { 512c23f12af0394aa2f6651968a3c8840f1af317aa1Andreas Huber listener->sendEvent(msg, ext1, ext2); 51366b0a35c9a4136a84c3f73b1b25fcb5220138b95Andreas Huber } 51466b0a35c9a4136a84c3f73b1b25fcb5220138b95Andreas Huber } 51566b0a35c9a4136a84c3f73b1b25fcb5220138b95Andreas Huber} 51666b0a35c9a4136a84c3f73b1b25fcb5220138b95Andreas Huber 5177fbdb0903dfbf70b314a74e64e28fb880cdb9247Andreas Huberbool AwesomePlayer::getBitrate(int64_t *bitrate) { 518c7fc37a3dab9bd1f96713649f351b5990e6316ffJames Dong off64_t size; 5197fbdb0903dfbf70b314a74e64e28fb880cdb9247Andreas Huber if (mDurationUs >= 0 && mCachedSource != NULL 5207fbdb0903dfbf70b314a74e64e28fb880cdb9247Andreas Huber && mCachedSource->getSize(&size) == OK) { 5217fbdb0903dfbf70b314a74e64e28fb880cdb9247Andreas Huber *bitrate = size * 8000000ll / mDurationUs; // in bits/sec 5227fbdb0903dfbf70b314a74e64e28fb880cdb9247Andreas Huber return true; 5237fbdb0903dfbf70b314a74e64e28fb880cdb9247Andreas Huber } 5247fbdb0903dfbf70b314a74e64e28fb880cdb9247Andreas Huber 5257fbdb0903dfbf70b314a74e64e28fb880cdb9247Andreas Huber if (mBitrate >= 0) { 5267fbdb0903dfbf70b314a74e64e28fb880cdb9247Andreas Huber *bitrate = mBitrate; 5277fbdb0903dfbf70b314a74e64e28fb880cdb9247Andreas Huber return true; 5287fbdb0903dfbf70b314a74e64e28fb880cdb9247Andreas Huber } 5297fbdb0903dfbf70b314a74e64e28fb880cdb9247Andreas Huber 5307fbdb0903dfbf70b314a74e64e28fb880cdb9247Andreas Huber *bitrate = 0; 5317fbdb0903dfbf70b314a74e64e28fb880cdb9247Andreas Huber 5327fbdb0903dfbf70b314a74e64e28fb880cdb9247Andreas Huber return false; 5337fbdb0903dfbf70b314a74e64e28fb880cdb9247Andreas Huber} 5347fbdb0903dfbf70b314a74e64e28fb880cdb9247Andreas Huber 5358650e1960905097f6f1d6aa462ccb1c93c656834Andreas Huber// Returns true iff cached duration is available/applicable. 5368650e1960905097f6f1d6aa462ccb1c93c656834Andreas Huberbool AwesomePlayer::getCachedDuration_l(int64_t *durationUs, bool *eos) { 5377fbdb0903dfbf70b314a74e64e28fb880cdb9247Andreas Huber int64_t bitrate; 5388650e1960905097f6f1d6aa462ccb1c93c656834Andreas Huber 5398650e1960905097f6f1d6aa462ccb1c93c656834Andreas Huber if (mRTSPController != NULL) { 5408650e1960905097f6f1d6aa462ccb1c93c656834Andreas Huber *durationUs = mRTSPController->getQueueDurationUs(eos); 5418650e1960905097f6f1d6aa462ccb1c93c656834Andreas Huber return true; 5427fbdb0903dfbf70b314a74e64e28fb880cdb9247Andreas Huber } else if (mCachedSource != NULL && getBitrate(&bitrate)) { 5431bd233ce7e1aa7730bc18d46ffd57791391738cdBryan Mawhinney status_t finalStatus; 5441bd233ce7e1aa7730bc18d46ffd57791391738cdBryan Mawhinney size_t cachedDataRemaining = mCachedSource->approxDataRemaining(&finalStatus); 5458650e1960905097f6f1d6aa462ccb1c93c656834Andreas Huber *durationUs = cachedDataRemaining * 8000000ll / bitrate; 5461bd233ce7e1aa7730bc18d46ffd57791391738cdBryan Mawhinney *eos = (finalStatus != OK); 5478650e1960905097f6f1d6aa462ccb1c93c656834Andreas Huber return true; 5488650e1960905097f6f1d6aa462ccb1c93c656834Andreas Huber } 5498650e1960905097f6f1d6aa462ccb1c93c656834Andreas Huber 5508650e1960905097f6f1d6aa462ccb1c93c656834Andreas Huber return false; 5518650e1960905097f6f1d6aa462ccb1c93c656834Andreas Huber} 5528650e1960905097f6f1d6aa462ccb1c93c656834Andreas Huber 55334ef0f32c8fc0186236a27e07405328cc1f7c56dAndreas Hubervoid AwesomePlayer::ensureCacheIsFetching_l() { 55434ef0f32c8fc0186236a27e07405328cc1f7c56dAndreas Huber if (mCachedSource != NULL) { 55534ef0f32c8fc0186236a27e07405328cc1f7c56dAndreas Huber mCachedSource->resumeFetchingIfNecessary(); 55634ef0f32c8fc0186236a27e07405328cc1f7c56dAndreas Huber } 55734ef0f32c8fc0186236a27e07405328cc1f7c56dAndreas Huber} 55834ef0f32c8fc0186236a27e07405328cc1f7c56dAndreas Huber 559145e68fc778275963189b02a1adcbe27cce4d769Andreas Hubervoid AwesomePlayer::onVideoLagUpdate() { 560145e68fc778275963189b02a1adcbe27cce4d769Andreas Huber Mutex::Autolock autoLock(mLock); 561145e68fc778275963189b02a1adcbe27cce4d769Andreas Huber if (!mVideoLagEventPending) { 562145e68fc778275963189b02a1adcbe27cce4d769Andreas Huber return; 563145e68fc778275963189b02a1adcbe27cce4d769Andreas Huber } 564145e68fc778275963189b02a1adcbe27cce4d769Andreas Huber mVideoLagEventPending = false; 565145e68fc778275963189b02a1adcbe27cce4d769Andreas Huber 566145e68fc778275963189b02a1adcbe27cce4d769Andreas Huber int64_t audioTimeUs = mAudioPlayer->getMediaTimeUs(); 567145e68fc778275963189b02a1adcbe27cce4d769Andreas Huber int64_t videoLateByUs = audioTimeUs - mVideoTimeUs; 568145e68fc778275963189b02a1adcbe27cce4d769Andreas Huber 5695dac87b088556b8ed7f2a4f5546d31be0bb68680Andreas Huber if (!(mFlags & VIDEO_AT_EOS) && videoLateByUs > 300000ll) { 570145e68fc778275963189b02a1adcbe27cce4d769Andreas Huber LOGV("video late by %lld ms.", videoLateByUs / 1000ll); 571145e68fc778275963189b02a1adcbe27cce4d769Andreas Huber 572145e68fc778275963189b02a1adcbe27cce4d769Andreas Huber notifyListener_l( 573145e68fc778275963189b02a1adcbe27cce4d769Andreas Huber MEDIA_INFO, 574145e68fc778275963189b02a1adcbe27cce4d769Andreas Huber MEDIA_INFO_VIDEO_TRACK_LAGGING, 575145e68fc778275963189b02a1adcbe27cce4d769Andreas Huber videoLateByUs / 1000ll); 576145e68fc778275963189b02a1adcbe27cce4d769Andreas Huber } 577145e68fc778275963189b02a1adcbe27cce4d769Andreas Huber 578145e68fc778275963189b02a1adcbe27cce4d769Andreas Huber postVideoLagEvent_l(); 579145e68fc778275963189b02a1adcbe27cce4d769Andreas Huber} 580145e68fc778275963189b02a1adcbe27cce4d769Andreas Huber 58166b0a35c9a4136a84c3f73b1b25fcb5220138b95Andreas Hubervoid AwesomePlayer::onBufferingUpdate() { 58266b0a35c9a4136a84c3f73b1b25fcb5220138b95Andreas Huber Mutex::Autolock autoLock(mLock); 583d29345dfa29cdcc650f3705e43950ef2500f6728Andreas Huber if (!mBufferingEventPending) { 584d29345dfa29cdcc650f3705e43950ef2500f6728Andreas Huber return; 585d29345dfa29cdcc650f3705e43950ef2500f6728Andreas Huber } 58666b0a35c9a4136a84c3f73b1b25fcb5220138b95Andreas Huber mBufferingEventPending = false; 58766b0a35c9a4136a84c3f73b1b25fcb5220138b95Andreas Huber 5888650e1960905097f6f1d6aa462ccb1c93c656834Andreas Huber if (mCachedSource != NULL) { 5891bd233ce7e1aa7730bc18d46ffd57791391738cdBryan Mawhinney status_t finalStatus; 5901bd233ce7e1aa7730bc18d46ffd57791391738cdBryan Mawhinney size_t cachedDataRemaining = mCachedSource->approxDataRemaining(&finalStatus); 5911bd233ce7e1aa7730bc18d46ffd57791391738cdBryan Mawhinney bool eos = (finalStatus != OK); 592c9e894872c298b25fe9d74e68aa1e7287a541ac3Andreas Huber 5938650e1960905097f6f1d6aa462ccb1c93c656834Andreas Huber if (eos) { 5941bd233ce7e1aa7730bc18d46ffd57791391738cdBryan Mawhinney if (finalStatus == ERROR_END_OF_STREAM) { 5951bd233ce7e1aa7730bc18d46ffd57791391738cdBryan Mawhinney notifyListener_l(MEDIA_BUFFERING_UPDATE, 100); 5961bd233ce7e1aa7730bc18d46ffd57791391738cdBryan Mawhinney } 59783977eb230d829cfe520f55d7977037a904ce548Andreas Huber if (mFlags & PREPARING) { 59883977eb230d829cfe520f55d7977037a904ce548Andreas Huber LOGV("cache has reached EOS, prepare is done."); 59983977eb230d829cfe520f55d7977037a904ce548Andreas Huber finishAsyncPrepare_l(); 60083977eb230d829cfe520f55d7977037a904ce548Andreas Huber } 6018650e1960905097f6f1d6aa462ccb1c93c656834Andreas Huber } else { 6027fbdb0903dfbf70b314a74e64e28fb880cdb9247Andreas Huber int64_t bitrate; 6037fbdb0903dfbf70b314a74e64e28fb880cdb9247Andreas Huber if (getBitrate(&bitrate)) { 6048650e1960905097f6f1d6aa462ccb1c93c656834Andreas Huber size_t cachedSize = mCachedSource->cachedSize(); 6058650e1960905097f6f1d6aa462ccb1c93c656834Andreas Huber int64_t cachedDurationUs = cachedSize * 8000000ll / bitrate; 606c9e894872c298b25fe9d74e68aa1e7287a541ac3Andreas Huber 6078650e1960905097f6f1d6aa462ccb1c93c656834Andreas Huber int percentage = 100.0 * (double)cachedDurationUs / mDurationUs; 6088650e1960905097f6f1d6aa462ccb1c93c656834Andreas Huber if (percentage > 100) { 6098650e1960905097f6f1d6aa462ccb1c93c656834Andreas Huber percentage = 100; 6108650e1960905097f6f1d6aa462ccb1c93c656834Andreas Huber } 611c9e894872c298b25fe9d74e68aa1e7287a541ac3Andreas Huber 6128650e1960905097f6f1d6aa462ccb1c93c656834Andreas Huber notifyListener_l(MEDIA_BUFFERING_UPDATE, percentage); 6138650e1960905097f6f1d6aa462ccb1c93c656834Andreas Huber } else { 6148650e1960905097f6f1d6aa462ccb1c93c656834Andreas Huber // We don't know the bitrate of the stream, use absolute size 6158650e1960905097f6f1d6aa462ccb1c93c656834Andreas Huber // limits to maintain the cache. 6168650e1960905097f6f1d6aa462ccb1c93c656834Andreas Huber 6178650e1960905097f6f1d6aa462ccb1c93c656834Andreas Huber if ((mFlags & PLAYING) && !eos 6188650e1960905097f6f1d6aa462ccb1c93c656834Andreas Huber && (cachedDataRemaining < kLowWaterMarkBytes)) { 6198650e1960905097f6f1d6aa462ccb1c93c656834Andreas Huber LOGI("cache is running low (< %d) , pausing.", 6208650e1960905097f6f1d6aa462ccb1c93c656834Andreas Huber kLowWaterMarkBytes); 6218650e1960905097f6f1d6aa462ccb1c93c656834Andreas Huber mFlags |= CACHE_UNDERRUN; 6228650e1960905097f6f1d6aa462ccb1c93c656834Andreas Huber pause_l(); 62334ef0f32c8fc0186236a27e07405328cc1f7c56dAndreas Huber ensureCacheIsFetching_l(); 6248650e1960905097f6f1d6aa462ccb1c93c656834Andreas Huber notifyListener_l(MEDIA_INFO, MEDIA_INFO_BUFFERING_START); 6258650e1960905097f6f1d6aa462ccb1c93c656834Andreas Huber } else if (eos || cachedDataRemaining > kHighWaterMarkBytes) { 6268650e1960905097f6f1d6aa462ccb1c93c656834Andreas Huber if (mFlags & CACHE_UNDERRUN) { 6278650e1960905097f6f1d6aa462ccb1c93c656834Andreas Huber LOGI("cache has filled up (> %d), resuming.", 6288650e1960905097f6f1d6aa462ccb1c93c656834Andreas Huber kHighWaterMarkBytes); 6298650e1960905097f6f1d6aa462ccb1c93c656834Andreas Huber mFlags &= ~CACHE_UNDERRUN; 6308650e1960905097f6f1d6aa462ccb1c93c656834Andreas Huber play_l(); 6318650e1960905097f6f1d6aa462ccb1c93c656834Andreas Huber notifyListener_l(MEDIA_INFO, MEDIA_INFO_BUFFERING_END); 6328650e1960905097f6f1d6aa462ccb1c93c656834Andreas Huber } else if (mFlags & PREPARING) { 6338650e1960905097f6f1d6aa462ccb1c93c656834Andreas Huber LOGV("cache has filled up (> %d), prepare is done", 6348650e1960905097f6f1d6aa462ccb1c93c656834Andreas Huber kHighWaterMarkBytes); 6358650e1960905097f6f1d6aa462ccb1c93c656834Andreas Huber finishAsyncPrepare_l(); 6368650e1960905097f6f1d6aa462ccb1c93c656834Andreas Huber } 6378650e1960905097f6f1d6aa462ccb1c93c656834Andreas Huber } 6388650e1960905097f6f1d6aa462ccb1c93c656834Andreas Huber } 6398650e1960905097f6f1d6aa462ccb1c93c656834Andreas Huber } 6402415ecb5bb4e1459024f6d6c8ae2d6e3dc4fbdc7Andreas Huber } 6412415ecb5bb4e1459024f6d6c8ae2d6e3dc4fbdc7Andreas Huber 6428650e1960905097f6f1d6aa462ccb1c93c656834Andreas Huber int64_t cachedDurationUs; 6432a4b49bd3863024884a694b454e2e452752e6ea0Andreas Huber bool eos; 6448650e1960905097f6f1d6aa462ccb1c93c656834Andreas Huber if (getCachedDuration_l(&cachedDurationUs, &eos)) { 64534ef0f32c8fc0186236a27e07405328cc1f7c56dAndreas Huber LOGV("cachedDurationUs = %.2f secs, eos=%d", 64634ef0f32c8fc0186236a27e07405328cc1f7c56dAndreas Huber cachedDurationUs / 1E6, eos); 64734ef0f32c8fc0186236a27e07405328cc1f7c56dAndreas Huber 648100a4408968b90e314526185d572c72ea4cc784aAndreas Huber int64_t highWaterMarkUs = 649100a4408968b90e314526185d572c72ea4cc784aAndreas Huber (mRTSPController != NULL) ? kHighWaterMarkRTSPUs : kHighWaterMarkUs; 650100a4408968b90e314526185d572c72ea4cc784aAndreas Huber 6518650e1960905097f6f1d6aa462ccb1c93c656834Andreas Huber if ((mFlags & PLAYING) && !eos 6528650e1960905097f6f1d6aa462ccb1c93c656834Andreas Huber && (cachedDurationUs < kLowWaterMarkUs)) { 6538650e1960905097f6f1d6aa462ccb1c93c656834Andreas Huber LOGI("cache is running low (%.2f secs) , pausing.", 6548650e1960905097f6f1d6aa462ccb1c93c656834Andreas Huber cachedDurationUs / 1E6); 6558650e1960905097f6f1d6aa462ccb1c93c656834Andreas Huber mFlags |= CACHE_UNDERRUN; 6568650e1960905097f6f1d6aa462ccb1c93c656834Andreas Huber pause_l(); 65734ef0f32c8fc0186236a27e07405328cc1f7c56dAndreas Huber ensureCacheIsFetching_l(); 6588650e1960905097f6f1d6aa462ccb1c93c656834Andreas Huber notifyListener_l(MEDIA_INFO, MEDIA_INFO_BUFFERING_START); 659100a4408968b90e314526185d572c72ea4cc784aAndreas Huber } else if (eos || cachedDurationUs > highWaterMarkUs) { 6608650e1960905097f6f1d6aa462ccb1c93c656834Andreas Huber if (mFlags & CACHE_UNDERRUN) { 6618650e1960905097f6f1d6aa462ccb1c93c656834Andreas Huber LOGI("cache has filled up (%.2f secs), resuming.", 6628650e1960905097f6f1d6aa462ccb1c93c656834Andreas Huber cachedDurationUs / 1E6); 6638650e1960905097f6f1d6aa462ccb1c93c656834Andreas Huber mFlags &= ~CACHE_UNDERRUN; 6648650e1960905097f6f1d6aa462ccb1c93c656834Andreas Huber play_l(); 6658650e1960905097f6f1d6aa462ccb1c93c656834Andreas Huber notifyListener_l(MEDIA_INFO, MEDIA_INFO_BUFFERING_END); 6668650e1960905097f6f1d6aa462ccb1c93c656834Andreas Huber } else if (mFlags & PREPARING) { 6678650e1960905097f6f1d6aa462ccb1c93c656834Andreas Huber LOGV("cache has filled up (%.2f secs), prepare is done", 6688650e1960905097f6f1d6aa462ccb1c93c656834Andreas Huber cachedDurationUs / 1E6); 6698650e1960905097f6f1d6aa462ccb1c93c656834Andreas Huber finishAsyncPrepare_l(); 6702a4b49bd3863024884a694b454e2e452752e6ea0Andreas Huber } 6712a4b49bd3863024884a694b454e2e452752e6ea0Andreas Huber } 6720a5baa9b411fe086013d2a5e9126ed63fbad046cAndreas Huber } 6730a5baa9b411fe086013d2a5e9126ed63fbad046cAndreas Huber 6740a5baa9b411fe086013d2a5e9126ed63fbad046cAndreas Huber postBufferingEvent_l(); 6750726045216f576e97672ebeefc265d39c4ebaaa5Andreas Huber} 6760726045216f576e97672ebeefc265d39c4ebaaa5Andreas Huber 677bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Hubervoid AwesomePlayer::onStreamDone() { 678bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber // Posted whenever any stream finishes playing. 679bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber 680bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber Mutex::Autolock autoLock(mLock); 681d29345dfa29cdcc650f3705e43950ef2500f6728Andreas Huber if (!mStreamDoneEventPending) { 682d29345dfa29cdcc650f3705e43950ef2500f6728Andreas Huber return; 683d29345dfa29cdcc650f3705e43950ef2500f6728Andreas Huber } 684bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber mStreamDoneEventPending = false; 685bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber 686ed8d14f6a934072cd012992c4ef16990a54baa9aAndreas Huber if (mStreamDoneStatus != ERROR_END_OF_STREAM) { 6875d2de4da54504836e4b772b3010ac28c19f667f0Andreas Huber LOGV("MEDIA_ERROR %d", mStreamDoneStatus); 6885d2de4da54504836e4b772b3010ac28c19f667f0Andreas Huber 6895d2de4da54504836e4b772b3010ac28c19f667f0Andreas Huber notifyListener_l( 6905d2de4da54504836e4b772b3010ac28c19f667f0Andreas Huber MEDIA_ERROR, MEDIA_ERROR_UNKNOWN, mStreamDoneStatus); 6915d2de4da54504836e4b772b3010ac28c19f667f0Andreas Huber 692b2e3954c94717e43b3dc9b880564f166cfbbc0a2Andreas Huber pause_l(true /* at eos */); 6935d2de4da54504836e4b772b3010ac28c19f667f0Andreas Huber 6945d2de4da54504836e4b772b3010ac28c19f667f0Andreas Huber mFlags |= AT_EOS; 6955d2de4da54504836e4b772b3010ac28c19f667f0Andreas Huber return; 6965d2de4da54504836e4b772b3010ac28c19f667f0Andreas Huber } 6975d2de4da54504836e4b772b3010ac28c19f667f0Andreas Huber 6985d2de4da54504836e4b772b3010ac28c19f667f0Andreas Huber const bool allDone = 6995d2de4da54504836e4b772b3010ac28c19f667f0Andreas Huber (mVideoSource == NULL || (mFlags & VIDEO_AT_EOS)) 7005d2de4da54504836e4b772b3010ac28c19f667f0Andreas Huber && (mAudioSource == NULL || (mFlags & AUDIO_AT_EOS)); 7015d2de4da54504836e4b772b3010ac28c19f667f0Andreas Huber 7025d2de4da54504836e4b772b3010ac28c19f667f0Andreas Huber if (!allDone) { 7035d2de4da54504836e4b772b3010ac28c19f667f0Andreas Huber return; 7045d2de4da54504836e4b772b3010ac28c19f667f0Andreas Huber } 7055d2de4da54504836e4b772b3010ac28c19f667f0Andreas Huber 7068ae49d87b98d57d6758b0c51b95e28a6581a79f1Andreas Huber if (mFlags & (LOOPING | AUTO_LOOPING)) { 707bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber seekTo_l(0); 708bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber 709a657f8deaf21acbe5faba7be1df9c6681d44d471Andreas Huber if (mVideoSource != NULL) { 710bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber postVideoEvent_l(); 711bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber } 712bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber } else { 7135d2de4da54504836e4b772b3010ac28c19f667f0Andreas Huber LOGV("MEDIA_PLAYBACK_COMPLETE"); 7145d2de4da54504836e4b772b3010ac28c19f667f0Andreas Huber notifyListener_l(MEDIA_PLAYBACK_COMPLETE); 715bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber 716b2e3954c94717e43b3dc9b880564f166cfbbc0a2Andreas Huber pause_l(true /* at eos */); 7172e8ffaf95bd35358ecd14ddf00cddaf3abefe0a9Andreas Huber 7182e8ffaf95bd35358ecd14ddf00cddaf3abefe0a9Andreas Huber mFlags |= AT_EOS; 719bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber } 720bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber} 721bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber 722bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huberstatus_t AwesomePlayer::play() { 723bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber Mutex::Autolock autoLock(mLock); 7240a5baa9b411fe086013d2a5e9126ed63fbad046cAndreas Huber 7250a5baa9b411fe086013d2a5e9126ed63fbad046cAndreas Huber mFlags &= ~CACHE_UNDERRUN; 7260a5baa9b411fe086013d2a5e9126ed63fbad046cAndreas Huber 7277b3396acc702451be9bafb19d7fe26d55d43a316Andreas Huber return play_l(); 7287b3396acc702451be9bafb19d7fe26d55d43a316Andreas Huber} 729bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber 7307b3396acc702451be9bafb19d7fe26d55d43a316Andreas Huberstatus_t AwesomePlayer::play_l() { 7312b1222f8938356669672f35e0e53e176c78c40efAndreas Huber mFlags &= ~SEEK_PREVIEW; 7322b1222f8938356669672f35e0e53e176c78c40efAndreas Huber 733bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber if (mFlags & PLAYING) { 734bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber return OK; 735bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber } 736bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber 737bd22c52280179b29eefac91ef7e7bbbc33d25904Andreas Huber if (!(mFlags & PREPARED)) { 738bd22c52280179b29eefac91ef7e7bbbc33d25904Andreas Huber status_t err = prepare_l(); 739bd22c52280179b29eefac91ef7e7bbbc33d25904Andreas Huber 740bd22c52280179b29eefac91ef7e7bbbc33d25904Andreas Huber if (err != OK) { 741bd22c52280179b29eefac91ef7e7bbbc33d25904Andreas Huber return err; 742bd22c52280179b29eefac91ef7e7bbbc33d25904Andreas Huber } 743bd22c52280179b29eefac91ef7e7bbbc33d25904Andreas Huber } 744bd22c52280179b29eefac91ef7e7bbbc33d25904Andreas Huber 745bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber mFlags |= PLAYING; 746bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber mFlags |= FIRST_FRAME; 747bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber 748c130b5bf563d049bd391ccd96985ac278ef8ff8dGloria Wang if (mDecryptHandle != NULL) { 749c130b5bf563d049bd391ccd96985ac278ef8ff8dGloria Wang int64_t position; 750c130b5bf563d049bd391ccd96985ac278ef8ff8dGloria Wang getPosition(&position); 751c130b5bf563d049bd391ccd96985ac278ef8ff8dGloria Wang mDrmManagerClient->setPlaybackStatus(mDecryptHandle, 752c130b5bf563d049bd391ccd96985ac278ef8ff8dGloria Wang Playback::START, position / 1000); 753c130b5bf563d049bd391ccd96985ac278ef8ff8dGloria Wang } 754c130b5bf563d049bd391ccd96985ac278ef8ff8dGloria Wang 755bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber if (mAudioSource != NULL) { 756bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber if (mAudioPlayer == NULL) { 757bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber if (mAudioSink != NULL) { 758ed54ad0f8619ae416b0968ade6248894cbfc4dbaAndreas Huber mAudioPlayer = new AudioPlayer(mAudioSink, this); 759bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber mAudioPlayer->setSource(mAudioSource); 760e7e3b785a0e7819db4c895a4f60e9a4dd755880cAndreas Huber 761f03034408506051f2f836e59305fcd5f662bf19aAndreas Huber mTimeSource = mAudioPlayer; 76288c030e0e0152791ff74f90249f55fce01371198Andreas Huber 763b874cd085bba63528c570f74c493bfea835190d9Andreas Huber // If there was a seek request before we ever started, 764b874cd085bba63528c570f74c493bfea835190d9Andreas Huber // honor the request now. 765b874cd085bba63528c570f74c493bfea835190d9Andreas Huber // Make sure to do this before starting the audio player 766b874cd085bba63528c570f74c493bfea835190d9Andreas Huber // to avoid a race condition. 767b874cd085bba63528c570f74c493bfea835190d9Andreas Huber seekAudioIfNecessary_l(); 768f03034408506051f2f836e59305fcd5f662bf19aAndreas Huber } 769f03034408506051f2f836e59305fcd5f662bf19aAndreas Huber } 77088c030e0e0152791ff74f90249f55fce01371198Andreas Huber 771f03034408506051f2f836e59305fcd5f662bf19aAndreas Huber CHECK(!(mFlags & AUDIO_RUNNING)); 772c130b5bf563d049bd391ccd96985ac278ef8ff8dGloria Wang 773f03034408506051f2f836e59305fcd5f662bf19aAndreas Huber if (mVideoSource == NULL) { 774f03034408506051f2f836e59305fcd5f662bf19aAndreas Huber status_t err = startAudioPlayer_l(); 775bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber 776f03034408506051f2f836e59305fcd5f662bf19aAndreas Huber if (err != OK) { 777f03034408506051f2f836e59305fcd5f662bf19aAndreas Huber delete mAudioPlayer; 778f03034408506051f2f836e59305fcd5f662bf19aAndreas Huber mAudioPlayer = NULL; 779bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber 780f03034408506051f2f836e59305fcd5f662bf19aAndreas Huber mFlags &= ~(PLAYING | FIRST_FRAME); 7811862a33b246249630b654182afb5914da3480d4cAndreas Huber 782f03034408506051f2f836e59305fcd5f662bf19aAndreas Huber if (mDecryptHandle != NULL) { 783f03034408506051f2f836e59305fcd5f662bf19aAndreas Huber mDrmManagerClient->setPlaybackStatus( 784f03034408506051f2f836e59305fcd5f662bf19aAndreas Huber mDecryptHandle, Playback::STOP, 0); 785f03034408506051f2f836e59305fcd5f662bf19aAndreas Huber } 786f03034408506051f2f836e59305fcd5f662bf19aAndreas Huber 787f03034408506051f2f836e59305fcd5f662bf19aAndreas Huber return err; 788bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber } 789bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber } 790bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber } 791bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber 792bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber if (mTimeSource == NULL && mAudioPlayer == NULL) { 7935d2de4da54504836e4b772b3010ac28c19f667f0Andreas Huber mTimeSource = &mSystemTimeSource; 794bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber } 795bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber 796bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber if (mVideoSource != NULL) { 797a657f8deaf21acbe5faba7be1df9c6681d44d471Andreas Huber // Kick off video playback 798a657f8deaf21acbe5faba7be1df9c6681d44d471Andreas Huber postVideoEvent_l(); 799145e68fc778275963189b02a1adcbe27cce4d769Andreas Huber 800145e68fc778275963189b02a1adcbe27cce4d769Andreas Huber if (mAudioSource != NULL && mVideoSource != NULL) { 801145e68fc778275963189b02a1adcbe27cce4d769Andreas Huber postVideoLagEvent_l(); 802145e68fc778275963189b02a1adcbe27cce4d769Andreas Huber } 803bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber } 804bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber 8052e8ffaf95bd35358ecd14ddf00cddaf3abefe0a9Andreas Huber if (mFlags & AT_EOS) { 8062e8ffaf95bd35358ecd14ddf00cddaf3abefe0a9Andreas Huber // Legacy behaviour, if a stream finishes playing and then 8072e8ffaf95bd35358ecd14ddf00cddaf3abefe0a9Andreas Huber // is started again, we play from the start... 8082e8ffaf95bd35358ecd14ddf00cddaf3abefe0a9Andreas Huber seekTo_l(0); 8092e8ffaf95bd35358ecd14ddf00cddaf3abefe0a9Andreas Huber } 8102e8ffaf95bd35358ecd14ddf00cddaf3abefe0a9Andreas Huber 8117cf180c9bff69e5cc4a2f4e53b432db45ebbebabGloria Wang uint32_t params = IMediaPlayerService::kBatteryDataCodecStarted 8127cf180c9bff69e5cc4a2f4e53b432db45ebbebabGloria Wang | IMediaPlayerService::kBatteryDataTrackDecoder; 8137cf180c9bff69e5cc4a2f4e53b432db45ebbebabGloria Wang if ((mAudioSource != NULL) && (mAudioSource != mAudioTrack)) { 8147cf180c9bff69e5cc4a2f4e53b432db45ebbebabGloria Wang params |= IMediaPlayerService::kBatteryDataTrackAudio; 8157cf180c9bff69e5cc4a2f4e53b432db45ebbebabGloria Wang } 8167cf180c9bff69e5cc4a2f4e53b432db45ebbebabGloria Wang if (mVideoSource != NULL) { 8177cf180c9bff69e5cc4a2f4e53b432db45ebbebabGloria Wang params |= IMediaPlayerService::kBatteryDataTrackVideo; 8187cf180c9bff69e5cc4a2f4e53b432db45ebbebabGloria Wang } 8197cf180c9bff69e5cc4a2f4e53b432db45ebbebabGloria Wang addBatteryData(params); 8207cf180c9bff69e5cc4a2f4e53b432db45ebbebabGloria Wang 821bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber return OK; 822bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber} 823bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber 824f03034408506051f2f836e59305fcd5f662bf19aAndreas Huberstatus_t AwesomePlayer::startAudioPlayer_l() { 825f03034408506051f2f836e59305fcd5f662bf19aAndreas Huber CHECK(!(mFlags & AUDIO_RUNNING)); 826f03034408506051f2f836e59305fcd5f662bf19aAndreas Huber 827f03034408506051f2f836e59305fcd5f662bf19aAndreas Huber if (mAudioSource == NULL || mAudioPlayer == NULL) { 828f03034408506051f2f836e59305fcd5f662bf19aAndreas Huber return OK; 829f03034408506051f2f836e59305fcd5f662bf19aAndreas Huber } 830f03034408506051f2f836e59305fcd5f662bf19aAndreas Huber 831f03034408506051f2f836e59305fcd5f662bf19aAndreas Huber if (!(mFlags & AUDIOPLAYER_STARTED)) { 832f03034408506051f2f836e59305fcd5f662bf19aAndreas Huber mFlags |= AUDIOPLAYER_STARTED; 833f03034408506051f2f836e59305fcd5f662bf19aAndreas Huber 834f03034408506051f2f836e59305fcd5f662bf19aAndreas Huber // We've already started the MediaSource in order to enable 835f03034408506051f2f836e59305fcd5f662bf19aAndreas Huber // the prefetcher to read its data. 836f03034408506051f2f836e59305fcd5f662bf19aAndreas Huber status_t err = mAudioPlayer->start( 837f03034408506051f2f836e59305fcd5f662bf19aAndreas Huber true /* sourceAlreadyStarted */); 838f03034408506051f2f836e59305fcd5f662bf19aAndreas Huber 839f03034408506051f2f836e59305fcd5f662bf19aAndreas Huber if (err != OK) { 840f03034408506051f2f836e59305fcd5f662bf19aAndreas Huber notifyListener_l(MEDIA_ERROR, MEDIA_ERROR_UNKNOWN, err); 841f03034408506051f2f836e59305fcd5f662bf19aAndreas Huber return err; 842f03034408506051f2f836e59305fcd5f662bf19aAndreas Huber } 843f03034408506051f2f836e59305fcd5f662bf19aAndreas Huber } else { 844f03034408506051f2f836e59305fcd5f662bf19aAndreas Huber mAudioPlayer->resume(); 845f03034408506051f2f836e59305fcd5f662bf19aAndreas Huber } 846f03034408506051f2f836e59305fcd5f662bf19aAndreas Huber 847f03034408506051f2f836e59305fcd5f662bf19aAndreas Huber mFlags |= AUDIO_RUNNING; 848f03034408506051f2f836e59305fcd5f662bf19aAndreas Huber 849f03034408506051f2f836e59305fcd5f662bf19aAndreas Huber mWatchForAudioEOS = true; 850f03034408506051f2f836e59305fcd5f662bf19aAndreas Huber 851f03034408506051f2f836e59305fcd5f662bf19aAndreas Huber return OK; 852f03034408506051f2f836e59305fcd5f662bf19aAndreas Huber} 853f03034408506051f2f836e59305fcd5f662bf19aAndreas Huber 8545daeb129a2c2ba3d14ccd94af283b5f561c783eaAndreas Hubervoid AwesomePlayer::notifyVideoSize_l() { 8555daeb129a2c2ba3d14ccd94af283b5f561c783eaAndreas Huber sp<MetaData> meta = mVideoSource->getFormat(); 8565daeb129a2c2ba3d14ccd94af283b5f561c783eaAndreas Huber 857f5ab57c2d5e02af7483c94eddb177e4f5c9e9892Andreas Huber int32_t cropLeft, cropTop, cropRight, cropBottom; 858f5ab57c2d5e02af7483c94eddb177e4f5c9e9892Andreas Huber if (!meta->findRect( 859f5ab57c2d5e02af7483c94eddb177e4f5c9e9892Andreas Huber kKeyCropRect, &cropLeft, &cropTop, &cropRight, &cropBottom)) { 860f5ab57c2d5e02af7483c94eddb177e4f5c9e9892Andreas Huber int32_t width, height; 861f5ab57c2d5e02af7483c94eddb177e4f5c9e9892Andreas Huber CHECK(meta->findInt32(kKeyWidth, &width)); 862f5ab57c2d5e02af7483c94eddb177e4f5c9e9892Andreas Huber CHECK(meta->findInt32(kKeyHeight, &height)); 863f5ab57c2d5e02af7483c94eddb177e4f5c9e9892Andreas Huber 864f5ab57c2d5e02af7483c94eddb177e4f5c9e9892Andreas Huber cropLeft = cropTop = 0; 865f5ab57c2d5e02af7483c94eddb177e4f5c9e9892Andreas Huber cropRight = width - 1; 866f5ab57c2d5e02af7483c94eddb177e4f5c9e9892Andreas Huber cropBottom = height - 1; 867f5ab57c2d5e02af7483c94eddb177e4f5c9e9892Andreas Huber 868f5ab57c2d5e02af7483c94eddb177e4f5c9e9892Andreas Huber LOGV("got dimensions only %d x %d", width, height); 869f5ab57c2d5e02af7483c94eddb177e4f5c9e9892Andreas Huber } else { 870f5ab57c2d5e02af7483c94eddb177e4f5c9e9892Andreas Huber LOGV("got crop rect %d, %d, %d, %d", 871f5ab57c2d5e02af7483c94eddb177e4f5c9e9892Andreas Huber cropLeft, cropTop, cropRight, cropBottom); 872f5ab57c2d5e02af7483c94eddb177e4f5c9e9892Andreas Huber } 873f5ab57c2d5e02af7483c94eddb177e4f5c9e9892Andreas Huber 8749cbb1a6f99003a9cd8765e11b9d7380e67839f82James Dong int32_t displayWidth; 8759cbb1a6f99003a9cd8765e11b9d7380e67839f82James Dong if (meta->findInt32(kKeyDisplayWidth, &displayWidth)) { 8769cbb1a6f99003a9cd8765e11b9d7380e67839f82James Dong LOGV("Display width changed (%d=>%d)", mDisplayWidth, displayWidth); 8779cbb1a6f99003a9cd8765e11b9d7380e67839f82James Dong mDisplayWidth = displayWidth; 8789cbb1a6f99003a9cd8765e11b9d7380e67839f82James Dong } 8799cbb1a6f99003a9cd8765e11b9d7380e67839f82James Dong int32_t displayHeight; 8809cbb1a6f99003a9cd8765e11b9d7380e67839f82James Dong if (meta->findInt32(kKeyDisplayHeight, &displayHeight)) { 8819cbb1a6f99003a9cd8765e11b9d7380e67839f82James Dong LOGV("Display height changed (%d=>%d)", mDisplayHeight, displayHeight); 8829cbb1a6f99003a9cd8765e11b9d7380e67839f82James Dong mDisplayHeight = displayHeight; 8839cbb1a6f99003a9cd8765e11b9d7380e67839f82James Dong } 8849cbb1a6f99003a9cd8765e11b9d7380e67839f82James Dong 885f5ab57c2d5e02af7483c94eddb177e4f5c9e9892Andreas Huber int32_t usableWidth = cropRight - cropLeft + 1; 886f5ab57c2d5e02af7483c94eddb177e4f5c9e9892Andreas Huber int32_t usableHeight = cropBottom - cropTop + 1; 887b45c01c2b8588ff431b511151666a55a39f0a6aeJames Dong if (mDisplayWidth != 0) { 888b45c01c2b8588ff431b511151666a55a39f0a6aeJames Dong usableWidth = mDisplayWidth; 889b45c01c2b8588ff431b511151666a55a39f0a6aeJames Dong } 890b45c01c2b8588ff431b511151666a55a39f0a6aeJames Dong if (mDisplayHeight != 0) { 891b45c01c2b8588ff431b511151666a55a39f0a6aeJames Dong usableHeight = mDisplayHeight; 892b45c01c2b8588ff431b511151666a55a39f0a6aeJames Dong } 8935daeb129a2c2ba3d14ccd94af283b5f561c783eaAndreas Huber 894ba529e486dde15fe75ea1b48570f9d60a4cf3c48Andreas Huber int32_t rotationDegrees; 895ba529e486dde15fe75ea1b48570f9d60a4cf3c48Andreas Huber if (!mVideoTrack->getFormat()->findInt32( 896ba529e486dde15fe75ea1b48570f9d60a4cf3c48Andreas Huber kKeyRotation, &rotationDegrees)) { 897ba529e486dde15fe75ea1b48570f9d60a4cf3c48Andreas Huber rotationDegrees = 0; 898ba529e486dde15fe75ea1b48570f9d60a4cf3c48Andreas Huber } 899ba529e486dde15fe75ea1b48570f9d60a4cf3c48Andreas Huber 900ba529e486dde15fe75ea1b48570f9d60a4cf3c48Andreas Huber if (rotationDegrees == 90 || rotationDegrees == 270) { 901ba529e486dde15fe75ea1b48570f9d60a4cf3c48Andreas Huber notifyListener_l( 902f5ab57c2d5e02af7483c94eddb177e4f5c9e9892Andreas Huber MEDIA_SET_VIDEO_SIZE, usableHeight, usableWidth); 903ba529e486dde15fe75ea1b48570f9d60a4cf3c48Andreas Huber } else { 904ba529e486dde15fe75ea1b48570f9d60a4cf3c48Andreas Huber notifyListener_l( 905f5ab57c2d5e02af7483c94eddb177e4f5c9e9892Andreas Huber MEDIA_SET_VIDEO_SIZE, usableWidth, usableHeight); 906ba529e486dde15fe75ea1b48570f9d60a4cf3c48Andreas Huber } 9075daeb129a2c2ba3d14ccd94af283b5f561c783eaAndreas Huber} 9085daeb129a2c2ba3d14ccd94af283b5f561c783eaAndreas Huber 909bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Hubervoid AwesomePlayer::initRenderer_l() { 9101173118eace0e9e347cb007f0da817cee87579edGlenn Kasten if (mNativeWindow == NULL) { 9110a5ca668c6f7d45706e9aec4a1dfec0aacc6d233Andreas Huber return; 9120a5ca668c6f7d45706e9aec4a1dfec0aacc6d233Andreas Huber } 913bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber 9140a5ca668c6f7d45706e9aec4a1dfec0aacc6d233Andreas Huber sp<MetaData> meta = mVideoSource->getFormat(); 915bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber 9160a5ca668c6f7d45706e9aec4a1dfec0aacc6d233Andreas Huber int32_t format; 9170a5ca668c6f7d45706e9aec4a1dfec0aacc6d233Andreas Huber const char *component; 9180a5ca668c6f7d45706e9aec4a1dfec0aacc6d233Andreas Huber int32_t decodedWidth, decodedHeight; 9190a5ca668c6f7d45706e9aec4a1dfec0aacc6d233Andreas Huber CHECK(meta->findInt32(kKeyColorFormat, &format)); 9200a5ca668c6f7d45706e9aec4a1dfec0aacc6d233Andreas Huber CHECK(meta->findCString(kKeyDecoderComponent, &component)); 9210a5ca668c6f7d45706e9aec4a1dfec0aacc6d233Andreas Huber CHECK(meta->findInt32(kKeyWidth, &decodedWidth)); 9220a5ca668c6f7d45706e9aec4a1dfec0aacc6d233Andreas Huber CHECK(meta->findInt32(kKeyHeight, &decodedHeight)); 9234844ac54e8b5997c3b03872dbafe8ebed4787517Andreas Huber 924ba529e486dde15fe75ea1b48570f9d60a4cf3c48Andreas Huber int32_t rotationDegrees; 925ba529e486dde15fe75ea1b48570f9d60a4cf3c48Andreas Huber if (!mVideoTrack->getFormat()->findInt32( 926ba529e486dde15fe75ea1b48570f9d60a4cf3c48Andreas Huber kKeyRotation, &rotationDegrees)) { 927ba529e486dde15fe75ea1b48570f9d60a4cf3c48Andreas Huber rotationDegrees = 0; 928ba529e486dde15fe75ea1b48570f9d60a4cf3c48Andreas Huber } 929ba529e486dde15fe75ea1b48570f9d60a4cf3c48Andreas Huber 9300a5ca668c6f7d45706e9aec4a1dfec0aacc6d233Andreas Huber mVideoRenderer.clear(); 9314844ac54e8b5997c3b03872dbafe8ebed4787517Andreas Huber 9320a5ca668c6f7d45706e9aec4a1dfec0aacc6d233Andreas Huber // Must ensure that mVideoRenderer's destructor is actually executed 9330a5ca668c6f7d45706e9aec4a1dfec0aacc6d233Andreas Huber // before creating a new one. 9340a5ca668c6f7d45706e9aec4a1dfec0aacc6d233Andreas Huber IPCThreadState::self()->flushCommands(); 9350a5ca668c6f7d45706e9aec4a1dfec0aacc6d233Andreas Huber 9360a5ca668c6f7d45706e9aec4a1dfec0aacc6d233Andreas Huber if (USE_SURFACE_ALLOC && strncmp(component, "OMX.", 4) == 0) { 9370a5ca668c6f7d45706e9aec4a1dfec0aacc6d233Andreas Huber // Hardware decoders avoid the CPU color conversion by decoding 9380a5ca668c6f7d45706e9aec4a1dfec0aacc6d233Andreas Huber // directly to ANativeBuffers, so we must use a renderer that 9390a5ca668c6f7d45706e9aec4a1dfec0aacc6d233Andreas Huber // just pushes those buffers to the ANativeWindow. 940ba529e486dde15fe75ea1b48570f9d60a4cf3c48Andreas Huber mVideoRenderer = 9411173118eace0e9e347cb007f0da817cee87579edGlenn Kasten new AwesomeNativeWindowRenderer(mNativeWindow, rotationDegrees); 9420a5ca668c6f7d45706e9aec4a1dfec0aacc6d233Andreas Huber } else { 9430a5ca668c6f7d45706e9aec4a1dfec0aacc6d233Andreas Huber // Other decoders are instantiated locally and as a consequence 9440a5ca668c6f7d45706e9aec4a1dfec0aacc6d233Andreas Huber // allocate their buffers in local address space. This renderer 9450a5ca668c6f7d45706e9aec4a1dfec0aacc6d233Andreas Huber // then performs a color conversion and copy to get the data 9460a5ca668c6f7d45706e9aec4a1dfec0aacc6d233Andreas Huber // into the ANativeBuffer. 9471173118eace0e9e347cb007f0da817cee87579edGlenn Kasten mVideoRenderer = new AwesomeLocalRenderer(mNativeWindow, meta); 948bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber } 949bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber} 950bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber 951bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huberstatus_t AwesomePlayer::pause() { 952bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber Mutex::Autolock autoLock(mLock); 9530a5baa9b411fe086013d2a5e9126ed63fbad046cAndreas Huber 9540a5baa9b411fe086013d2a5e9126ed63fbad046cAndreas Huber mFlags &= ~CACHE_UNDERRUN; 9550a5baa9b411fe086013d2a5e9126ed63fbad046cAndreas Huber 956bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber return pause_l(); 957bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber} 958bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber 959b2e3954c94717e43b3dc9b880564f166cfbbc0a2Andreas Huberstatus_t AwesomePlayer::pause_l(bool at_eos) { 960bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber if (!(mFlags & PLAYING)) { 961bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber return OK; 962bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber } 963bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber 96466b0a35c9a4136a84c3f73b1b25fcb5220138b95Andreas Huber cancelPlayerEvents(true /* keepBufferingGoing */); 965bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber 966f03034408506051f2f836e59305fcd5f662bf19aAndreas Huber if (mAudioPlayer != NULL && (mFlags & AUDIO_RUNNING)) { 967b2e3954c94717e43b3dc9b880564f166cfbbc0a2Andreas Huber if (at_eos) { 968b2e3954c94717e43b3dc9b880564f166cfbbc0a2Andreas Huber // If we played the audio stream to completion we 969b2e3954c94717e43b3dc9b880564f166cfbbc0a2Andreas Huber // want to make sure that all samples remaining in the audio 970b2e3954c94717e43b3dc9b880564f166cfbbc0a2Andreas Huber // track's queue are played out. 971b2e3954c94717e43b3dc9b880564f166cfbbc0a2Andreas Huber mAudioPlayer->pause(true /* playPendingSamples */); 972b2e3954c94717e43b3dc9b880564f166cfbbc0a2Andreas Huber } else { 973b2e3954c94717e43b3dc9b880564f166cfbbc0a2Andreas Huber mAudioPlayer->pause(); 974b2e3954c94717e43b3dc9b880564f166cfbbc0a2Andreas Huber } 975f03034408506051f2f836e59305fcd5f662bf19aAndreas Huber 976f03034408506051f2f836e59305fcd5f662bf19aAndreas Huber mFlags &= ~AUDIO_RUNNING; 977bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber } 978bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber 9797a1e3e81264189e23a1db2b174e1b5a5d4c7d1c3Gloria Wang if (mFlags & TEXTPLAYER_STARTED) { 9807a1e3e81264189e23a1db2b174e1b5a5d4c7d1c3Gloria Wang mTextPlayer->pause(); 9817a1e3e81264189e23a1db2b174e1b5a5d4c7d1c3Gloria Wang mFlags &= ~TEXT_RUNNING; 9827a1e3e81264189e23a1db2b174e1b5a5d4c7d1c3Gloria Wang } 9837a1e3e81264189e23a1db2b174e1b5a5d4c7d1c3Gloria Wang 984bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber mFlags &= ~PLAYING; 985bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber 986dcd25efb46c41c8d24a0a9cf61fb57f84149709eGloria Wang if (mDecryptHandle != NULL) { 987dcd25efb46c41c8d24a0a9cf61fb57f84149709eGloria Wang mDrmManagerClient->setPlaybackStatus(mDecryptHandle, 988dcd25efb46c41c8d24a0a9cf61fb57f84149709eGloria Wang Playback::PAUSE, 0); 989dcd25efb46c41c8d24a0a9cf61fb57f84149709eGloria Wang } 990dcd25efb46c41c8d24a0a9cf61fb57f84149709eGloria Wang 9917cf180c9bff69e5cc4a2f4e53b432db45ebbebabGloria Wang uint32_t params = IMediaPlayerService::kBatteryDataTrackDecoder; 9927cf180c9bff69e5cc4a2f4e53b432db45ebbebabGloria Wang if ((mAudioSource != NULL) && (mAudioSource != mAudioTrack)) { 9937cf180c9bff69e5cc4a2f4e53b432db45ebbebabGloria Wang params |= IMediaPlayerService::kBatteryDataTrackAudio; 9947cf180c9bff69e5cc4a2f4e53b432db45ebbebabGloria Wang } 9957cf180c9bff69e5cc4a2f4e53b432db45ebbebabGloria Wang if (mVideoSource != NULL) { 9967cf180c9bff69e5cc4a2f4e53b432db45ebbebabGloria Wang params |= IMediaPlayerService::kBatteryDataTrackVideo; 9977cf180c9bff69e5cc4a2f4e53b432db45ebbebabGloria Wang } 9987cf180c9bff69e5cc4a2f4e53b432db45ebbebabGloria Wang 9997cf180c9bff69e5cc4a2f4e53b432db45ebbebabGloria Wang addBatteryData(params); 10007cf180c9bff69e5cc4a2f4e53b432db45ebbebabGloria Wang 1001bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber return OK; 1002bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber} 1003bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber 1004bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huberbool AwesomePlayer::isPlaying() const { 10050a5baa9b411fe086013d2a5e9126ed63fbad046cAndreas Huber return (mFlags & PLAYING) || (mFlags & CACHE_UNDERRUN); 1006bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber} 1007bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber 10085daeb129a2c2ba3d14ccd94af283b5f561c783eaAndreas Hubervoid AwesomePlayer::setSurface(const sp<Surface> &surface) { 10095daeb129a2c2ba3d14ccd94af283b5f561c783eaAndreas Huber Mutex::Autolock autoLock(mLock); 10105daeb129a2c2ba3d14ccd94af283b5f561c783eaAndreas Huber 10115daeb129a2c2ba3d14ccd94af283b5f561c783eaAndreas Huber mSurface = surface; 1012150694cda0842d38a9358fe8d1fcb4fb4a76599eAndreas Huber setNativeWindow_l(surface); 10131173118eace0e9e347cb007f0da817cee87579edGlenn Kasten} 10141173118eace0e9e347cb007f0da817cee87579edGlenn Kasten 10151173118eace0e9e347cb007f0da817cee87579edGlenn Kastenvoid AwesomePlayer::setSurfaceTexture(const sp<ISurfaceTexture> &surfaceTexture) { 10161173118eace0e9e347cb007f0da817cee87579edGlenn Kasten Mutex::Autolock autoLock(mLock); 10171173118eace0e9e347cb007f0da817cee87579edGlenn Kasten 10181173118eace0e9e347cb007f0da817cee87579edGlenn Kasten mSurface.clear(); 10191173118eace0e9e347cb007f0da817cee87579edGlenn Kasten if (surfaceTexture != NULL) { 1020150694cda0842d38a9358fe8d1fcb4fb4a76599eAndreas Huber setNativeWindow_l(new SurfaceTextureClient(surfaceTexture)); 10211173118eace0e9e347cb007f0da817cee87579edGlenn Kasten } 1022150694cda0842d38a9358fe8d1fcb4fb4a76599eAndreas Huber} 10231173118eace0e9e347cb007f0da817cee87579edGlenn Kasten 1024150694cda0842d38a9358fe8d1fcb4fb4a76599eAndreas Hubervoid AwesomePlayer::shutdownVideoDecoder_l() { 1025150694cda0842d38a9358fe8d1fcb4fb4a76599eAndreas Huber if (mVideoBuffer) { 1026150694cda0842d38a9358fe8d1fcb4fb4a76599eAndreas Huber mVideoBuffer->release(); 1027150694cda0842d38a9358fe8d1fcb4fb4a76599eAndreas Huber mVideoBuffer = NULL; 1028150694cda0842d38a9358fe8d1fcb4fb4a76599eAndreas Huber } 1029150694cda0842d38a9358fe8d1fcb4fb4a76599eAndreas Huber 1030150694cda0842d38a9358fe8d1fcb4fb4a76599eAndreas Huber mVideoSource->stop(); 1031150694cda0842d38a9358fe8d1fcb4fb4a76599eAndreas Huber 1032150694cda0842d38a9358fe8d1fcb4fb4a76599eAndreas Huber // The following hack is necessary to ensure that the OMX 1033150694cda0842d38a9358fe8d1fcb4fb4a76599eAndreas Huber // component is completely released by the time we may try 1034150694cda0842d38a9358fe8d1fcb4fb4a76599eAndreas Huber // to instantiate it again. 1035150694cda0842d38a9358fe8d1fcb4fb4a76599eAndreas Huber wp<MediaSource> tmp = mVideoSource; 1036150694cda0842d38a9358fe8d1fcb4fb4a76599eAndreas Huber mVideoSource.clear(); 1037150694cda0842d38a9358fe8d1fcb4fb4a76599eAndreas Huber while (tmp.promote() != NULL) { 1038150694cda0842d38a9358fe8d1fcb4fb4a76599eAndreas Huber usleep(1000); 1039150694cda0842d38a9358fe8d1fcb4fb4a76599eAndreas Huber } 1040150694cda0842d38a9358fe8d1fcb4fb4a76599eAndreas Huber IPCThreadState::self()->flushCommands(); 1041150694cda0842d38a9358fe8d1fcb4fb4a76599eAndreas Huber} 1042150694cda0842d38a9358fe8d1fcb4fb4a76599eAndreas Huber 1043150694cda0842d38a9358fe8d1fcb4fb4a76599eAndreas Hubervoid AwesomePlayer::setNativeWindow_l(const sp<ANativeWindow> &native) { 1044150694cda0842d38a9358fe8d1fcb4fb4a76599eAndreas Huber mNativeWindow = native; 1045150694cda0842d38a9358fe8d1fcb4fb4a76599eAndreas Huber 1046150694cda0842d38a9358fe8d1fcb4fb4a76599eAndreas Huber if (mVideoSource == NULL) { 1047150694cda0842d38a9358fe8d1fcb4fb4a76599eAndreas Huber return; 1048150694cda0842d38a9358fe8d1fcb4fb4a76599eAndreas Huber } 1049150694cda0842d38a9358fe8d1fcb4fb4a76599eAndreas Huber 1050150694cda0842d38a9358fe8d1fcb4fb4a76599eAndreas Huber LOGI("attempting to reconfigure to use new surface"); 1051150694cda0842d38a9358fe8d1fcb4fb4a76599eAndreas Huber 1052150694cda0842d38a9358fe8d1fcb4fb4a76599eAndreas Huber bool wasPlaying = (mFlags & PLAYING) != 0; 1053150694cda0842d38a9358fe8d1fcb4fb4a76599eAndreas Huber 1054150694cda0842d38a9358fe8d1fcb4fb4a76599eAndreas Huber pause_l(); 1055150694cda0842d38a9358fe8d1fcb4fb4a76599eAndreas Huber mVideoRenderer.clear(); 1056150694cda0842d38a9358fe8d1fcb4fb4a76599eAndreas Huber 1057150694cda0842d38a9358fe8d1fcb4fb4a76599eAndreas Huber shutdownVideoDecoder_l(); 1058150694cda0842d38a9358fe8d1fcb4fb4a76599eAndreas Huber 1059150694cda0842d38a9358fe8d1fcb4fb4a76599eAndreas Huber CHECK_EQ(initVideoDecoder(), (status_t)OK); 1060150694cda0842d38a9358fe8d1fcb4fb4a76599eAndreas Huber 1061150694cda0842d38a9358fe8d1fcb4fb4a76599eAndreas Huber if (mLastVideoTimeUs >= 0) { 1062150694cda0842d38a9358fe8d1fcb4fb4a76599eAndreas Huber mSeeking = SEEK; 1063150694cda0842d38a9358fe8d1fcb4fb4a76599eAndreas Huber mSeekNotificationSent = true; 1064150694cda0842d38a9358fe8d1fcb4fb4a76599eAndreas Huber mSeekTimeUs = mLastVideoTimeUs; 1065150694cda0842d38a9358fe8d1fcb4fb4a76599eAndreas Huber mFlags &= ~(AT_EOS | AUDIO_AT_EOS | VIDEO_AT_EOS); 1066150694cda0842d38a9358fe8d1fcb4fb4a76599eAndreas Huber } 1067150694cda0842d38a9358fe8d1fcb4fb4a76599eAndreas Huber 1068150694cda0842d38a9358fe8d1fcb4fb4a76599eAndreas Huber if (wasPlaying) { 1069150694cda0842d38a9358fe8d1fcb4fb4a76599eAndreas Huber play_l(); 1070150694cda0842d38a9358fe8d1fcb4fb4a76599eAndreas Huber } 10715daeb129a2c2ba3d14ccd94af283b5f561c783eaAndreas Huber} 10725daeb129a2c2ba3d14ccd94af283b5f561c783eaAndreas Huber 1073bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Hubervoid AwesomePlayer::setAudioSink( 1074bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber const sp<MediaPlayerBase::AudioSink> &audioSink) { 1075bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber Mutex::Autolock autoLock(mLock); 1076bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber 1077bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber mAudioSink = audioSink; 1078bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber} 1079bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber 1080bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huberstatus_t AwesomePlayer::setLooping(bool shouldLoop) { 1081bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber Mutex::Autolock autoLock(mLock); 1082bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber 1083bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber mFlags = mFlags & ~LOOPING; 1084bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber 1085bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber if (shouldLoop) { 1086bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber mFlags |= LOOPING; 1087bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber } 1088bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber 1089bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber return OK; 1090bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber} 1091bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber 1092bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huberstatus_t AwesomePlayer::getDuration(int64_t *durationUs) { 10932415ecb5bb4e1459024f6d6c8ae2d6e3dc4fbdc7Andreas Huber Mutex::Autolock autoLock(mMiscStateLock); 1094bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber 1095bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber if (mDurationUs < 0) { 1096bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber return UNKNOWN_ERROR; 1097bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber } 1098bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber 1099bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber *durationUs = mDurationUs; 1100bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber 1101bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber return OK; 1102bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber} 1103bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber 1104bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huberstatus_t AwesomePlayer::getPosition(int64_t *positionUs) { 11058d342970108926c4ea355c90d26a2a353ec0fd47Andreas Huber if (mRTSPController != NULL) { 11068d342970108926c4ea355c90d26a2a353ec0fd47Andreas Huber *positionUs = mRTSPController->getNormalPlayTimeUs(); 11078d342970108926c4ea355c90d26a2a353ec0fd47Andreas Huber } 110864bb6983690bf994d904591145a3cdd6373bdbe6Andreas Huber else if (mSeeking != NO_SEEK) { 1109dac4ee72bac87388a1495e098f39d73168c8078fAndreas Huber *positionUs = mSeekTimeUs; 11105dac87b088556b8ed7f2a4f5546d31be0bb68680Andreas Huber } else if (mVideoSource != NULL 11115dac87b088556b8ed7f2a4f5546d31be0bb68680Andreas Huber && (mAudioPlayer == NULL || !(mFlags & VIDEO_AT_EOS))) { 11122415ecb5bb4e1459024f6d6c8ae2d6e3dc4fbdc7Andreas Huber Mutex::Autolock autoLock(mMiscStateLock); 1113bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber *positionUs = mVideoTimeUs; 1114bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber } else if (mAudioPlayer != NULL) { 1115bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber *positionUs = mAudioPlayer->getMediaTimeUs(); 1116bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber } else { 1117bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber *positionUs = 0; 1118bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber } 1119bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber 1120bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber return OK; 1121bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber} 1122bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber 1123bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huberstatus_t AwesomePlayer::seekTo(int64_t timeUs) { 112470f521de2675ce6eedf4b22beed94ea1289b0f38Andreas Huber if (mExtractorFlags & MediaExtractor::CAN_SEEK) { 1125acdd9d0f59c3d8bdc3de80664a609527ec3d21e2Andreas Huber Mutex::Autolock autoLock(mLock); 1126acdd9d0f59c3d8bdc3de80664a609527ec3d21e2Andreas Huber return seekTo_l(timeUs); 1127acdd9d0f59c3d8bdc3de80664a609527ec3d21e2Andreas Huber } 1128acdd9d0f59c3d8bdc3de80664a609527ec3d21e2Andreas Huber 1129acdd9d0f59c3d8bdc3de80664a609527ec3d21e2Andreas Huber return OK; 1130bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber} 1131bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber 11327a1e3e81264189e23a1db2b174e1b5a5d4c7d1c3Gloria Wangstatus_t AwesomePlayer::setTimedTextTrackIndex(int32_t index) { 11337a1e3e81264189e23a1db2b174e1b5a5d4c7d1c3Gloria Wang if (mTextPlayer != NULL) { 11347a1e3e81264189e23a1db2b174e1b5a5d4c7d1c3Gloria Wang if (index >= 0) { // to turn on a text track 11357a1e3e81264189e23a1db2b174e1b5a5d4c7d1c3Gloria Wang status_t err = mTextPlayer->setTimedTextTrackIndex(index); 11367a1e3e81264189e23a1db2b174e1b5a5d4c7d1c3Gloria Wang if (err != OK) { 11377a1e3e81264189e23a1db2b174e1b5a5d4c7d1c3Gloria Wang return err; 11387a1e3e81264189e23a1db2b174e1b5a5d4c7d1c3Gloria Wang } 11397a1e3e81264189e23a1db2b174e1b5a5d4c7d1c3Gloria Wang 11407a1e3e81264189e23a1db2b174e1b5a5d4c7d1c3Gloria Wang mFlags |= TEXT_RUNNING; 11417a1e3e81264189e23a1db2b174e1b5a5d4c7d1c3Gloria Wang mFlags |= TEXTPLAYER_STARTED; 11427a1e3e81264189e23a1db2b174e1b5a5d4c7d1c3Gloria Wang return OK; 11437a1e3e81264189e23a1db2b174e1b5a5d4c7d1c3Gloria Wang } else { // to turn off the text track display 11447a1e3e81264189e23a1db2b174e1b5a5d4c7d1c3Gloria Wang if (mFlags & TEXT_RUNNING) { 11457a1e3e81264189e23a1db2b174e1b5a5d4c7d1c3Gloria Wang mFlags &= ~TEXT_RUNNING; 11467a1e3e81264189e23a1db2b174e1b5a5d4c7d1c3Gloria Wang } 11477a1e3e81264189e23a1db2b174e1b5a5d4c7d1c3Gloria Wang if (mFlags & TEXTPLAYER_STARTED) { 11487a1e3e81264189e23a1db2b174e1b5a5d4c7d1c3Gloria Wang mFlags &= ~TEXTPLAYER_STARTED; 11497a1e3e81264189e23a1db2b174e1b5a5d4c7d1c3Gloria Wang } 11507a1e3e81264189e23a1db2b174e1b5a5d4c7d1c3Gloria Wang 11517a1e3e81264189e23a1db2b174e1b5a5d4c7d1c3Gloria Wang return mTextPlayer->setTimedTextTrackIndex(index); 11527a1e3e81264189e23a1db2b174e1b5a5d4c7d1c3Gloria Wang } 11537a1e3e81264189e23a1db2b174e1b5a5d4c7d1c3Gloria Wang } else { 11547a1e3e81264189e23a1db2b174e1b5a5d4c7d1c3Gloria Wang return INVALID_OPERATION; 11557a1e3e81264189e23a1db2b174e1b5a5d4c7d1c3Gloria Wang } 11567a1e3e81264189e23a1db2b174e1b5a5d4c7d1c3Gloria Wang} 11577a1e3e81264189e23a1db2b174e1b5a5d4c7d1c3Gloria Wang 11580dcd837af4169bdb6fb2a0c384722dc4f57433c6Andreas Huber// static 11590dcd837af4169bdb6fb2a0c384722dc4f57433c6Andreas Hubervoid AwesomePlayer::OnRTSPSeekDoneWrapper(void *cookie) { 11600dcd837af4169bdb6fb2a0c384722dc4f57433c6Andreas Huber static_cast<AwesomePlayer *>(cookie)->onRTSPSeekDone(); 11610dcd837af4169bdb6fb2a0c384722dc4f57433c6Andreas Huber} 11620dcd837af4169bdb6fb2a0c384722dc4f57433c6Andreas Huber 11630dcd837af4169bdb6fb2a0c384722dc4f57433c6Andreas Hubervoid AwesomePlayer::onRTSPSeekDone() { 11640dcd837af4169bdb6fb2a0c384722dc4f57433c6Andreas Huber notifyListener_l(MEDIA_SEEK_COMPLETE); 11650dcd837af4169bdb6fb2a0c384722dc4f57433c6Andreas Huber mSeekNotificationSent = true; 11660dcd837af4169bdb6fb2a0c384722dc4f57433c6Andreas Huber} 11670dcd837af4169bdb6fb2a0c384722dc4f57433c6Andreas Huber 1168bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huberstatus_t AwesomePlayer::seekTo_l(int64_t timeUs) { 1169cce326fe43411855aca2f719e505b051bc4b61b3Andreas Huber if (mRTSPController != NULL) { 11700dcd837af4169bdb6fb2a0c384722dc4f57433c6Andreas Huber mRTSPController->seekAsync(timeUs, OnRTSPSeekDoneWrapper, this); 1171cce326fe43411855aca2f719e505b051bc4b61b3Andreas Huber return OK; 1172cce326fe43411855aca2f719e505b051bc4b61b3Andreas Huber } 1173cce326fe43411855aca2f719e505b051bc4b61b3Andreas Huber 11740a5baa9b411fe086013d2a5e9126ed63fbad046cAndreas Huber if (mFlags & CACHE_UNDERRUN) { 11750a5baa9b411fe086013d2a5e9126ed63fbad046cAndreas Huber mFlags &= ~CACHE_UNDERRUN; 11760a5baa9b411fe086013d2a5e9126ed63fbad046cAndreas Huber play_l(); 11770a5baa9b411fe086013d2a5e9126ed63fbad046cAndreas Huber } 11780a5baa9b411fe086013d2a5e9126ed63fbad046cAndreas Huber 11795dac87b088556b8ed7f2a4f5546d31be0bb68680Andreas Huber if ((mFlags & PLAYING) && mVideoSource != NULL && (mFlags & VIDEO_AT_EOS)) { 11805dac87b088556b8ed7f2a4f5546d31be0bb68680Andreas Huber // Video playback completed before, there's no pending 11815dac87b088556b8ed7f2a4f5546d31be0bb68680Andreas Huber // video event right now. In order for this new seek 11825dac87b088556b8ed7f2a4f5546d31be0bb68680Andreas Huber // to be honored, we need to post one. 11835dac87b088556b8ed7f2a4f5546d31be0bb68680Andreas Huber 11845dac87b088556b8ed7f2a4f5546d31be0bb68680Andreas Huber postVideoEvent_l(); 11855dac87b088556b8ed7f2a4f5546d31be0bb68680Andreas Huber } 11865dac87b088556b8ed7f2a4f5546d31be0bb68680Andreas Huber 118764bb6983690bf994d904591145a3cdd6373bdbe6Andreas Huber mSeeking = SEEK; 11881321fdd94d354431b930735e9f38f32ecd189a2dAndreas Huber mSeekNotificationSent = false; 1189bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber mSeekTimeUs = timeUs; 11905d2de4da54504836e4b772b3010ac28c19f667f0Andreas Huber mFlags &= ~(AT_EOS | AUDIO_AT_EOS | VIDEO_AT_EOS); 1191bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber 1192bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber seekAudioIfNecessary_l(); 1193bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber 11947a1e3e81264189e23a1db2b174e1b5a5d4c7d1c3Gloria Wang if (mFlags & TEXTPLAYER_STARTED) { 11957a1e3e81264189e23a1db2b174e1b5a5d4c7d1c3Gloria Wang mTextPlayer->seekTo(mSeekTimeUs); 11967a1e3e81264189e23a1db2b174e1b5a5d4c7d1c3Gloria Wang } 11977a1e3e81264189e23a1db2b174e1b5a5d4c7d1c3Gloria Wang 11981321fdd94d354431b930735e9f38f32ecd189a2dAndreas Huber if (!(mFlags & PLAYING)) { 11991321fdd94d354431b930735e9f38f32ecd189a2dAndreas Huber LOGV("seeking while paused, sending SEEK_COMPLETE notification" 12001321fdd94d354431b930735e9f38f32ecd189a2dAndreas Huber " immediately."); 12011321fdd94d354431b930735e9f38f32ecd189a2dAndreas Huber 12021321fdd94d354431b930735e9f38f32ecd189a2dAndreas Huber notifyListener_l(MEDIA_SEEK_COMPLETE); 12031321fdd94d354431b930735e9f38f32ecd189a2dAndreas Huber mSeekNotificationSent = true; 12042b1222f8938356669672f35e0e53e176c78c40efAndreas Huber 12052b1222f8938356669672f35e0e53e176c78c40efAndreas Huber if ((mFlags & PREPARED) && mVideoSource != NULL) { 12062b1222f8938356669672f35e0e53e176c78c40efAndreas Huber mFlags |= SEEK_PREVIEW; 12072b1222f8938356669672f35e0e53e176c78c40efAndreas Huber postVideoEvent_l(); 12082b1222f8938356669672f35e0e53e176c78c40efAndreas Huber } 12091321fdd94d354431b930735e9f38f32ecd189a2dAndreas Huber } 12101321fdd94d354431b930735e9f38f32ecd189a2dAndreas Huber 1211bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber return OK; 1212bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber} 1213bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber 1214bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Hubervoid AwesomePlayer::seekAudioIfNecessary_l() { 121564bb6983690bf994d904591145a3cdd6373bdbe6Andreas Huber if (mSeeking != NO_SEEK && mVideoSource == NULL && mAudioPlayer != NULL) { 1216bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber mAudioPlayer->seekTo(mSeekTimeUs); 1217bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber 12181862a33b246249630b654182afb5914da3480d4cAndreas Huber mWatchForAudioSeekComplete = true; 12191862a33b246249630b654182afb5914da3480d4cAndreas Huber mWatchForAudioEOS = true; 1220dcd25efb46c41c8d24a0a9cf61fb57f84149709eGloria Wang 1221dcd25efb46c41c8d24a0a9cf61fb57f84149709eGloria Wang if (mDecryptHandle != NULL) { 1222dcd25efb46c41c8d24a0a9cf61fb57f84149709eGloria Wang mDrmManagerClient->setPlaybackStatus(mDecryptHandle, 1223dcd25efb46c41c8d24a0a9cf61fb57f84149709eGloria Wang Playback::PAUSE, 0); 1224dcd25efb46c41c8d24a0a9cf61fb57f84149709eGloria Wang mDrmManagerClient->setPlaybackStatus(mDecryptHandle, 1225dcd25efb46c41c8d24a0a9cf61fb57f84149709eGloria Wang Playback::START, mSeekTimeUs / 1000); 1226dcd25efb46c41c8d24a0a9cf61fb57f84149709eGloria Wang } 1227bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber } 1228bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber} 1229bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber 123088d8a83de12592635248aa1a3bd6b9ea46108501Andreas Hubervoid AwesomePlayer::setAudioSource(sp<MediaSource> source) { 123188d8a83de12592635248aa1a3bd6b9ea46108501Andreas Huber CHECK(source != NULL); 1232bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber 123388d8a83de12592635248aa1a3bd6b9ea46108501Andreas Huber mAudioTrack = source; 123488d8a83de12592635248aa1a3bd6b9ea46108501Andreas Huber} 123588d8a83de12592635248aa1a3bd6b9ea46108501Andreas Huber 12367a1e3e81264189e23a1db2b174e1b5a5d4c7d1c3Gloria Wangvoid AwesomePlayer::addTextSource(sp<MediaSource> source) { 12377a1e3e81264189e23a1db2b174e1b5a5d4c7d1c3Gloria Wang CHECK(source != NULL); 12387a1e3e81264189e23a1db2b174e1b5a5d4c7d1c3Gloria Wang 12397a1e3e81264189e23a1db2b174e1b5a5d4c7d1c3Gloria Wang if (mTextPlayer == NULL) { 12407a1e3e81264189e23a1db2b174e1b5a5d4c7d1c3Gloria Wang mTextPlayer = new TimedTextPlayer(this, mListener, &mQueue); 12417a1e3e81264189e23a1db2b174e1b5a5d4c7d1c3Gloria Wang } 12427a1e3e81264189e23a1db2b174e1b5a5d4c7d1c3Gloria Wang 12437a1e3e81264189e23a1db2b174e1b5a5d4c7d1c3Gloria Wang mTextPlayer->addTextSource(source); 12447a1e3e81264189e23a1db2b174e1b5a5d4c7d1c3Gloria Wang} 12457a1e3e81264189e23a1db2b174e1b5a5d4c7d1c3Gloria Wang 124688d8a83de12592635248aa1a3bd6b9ea46108501Andreas Huberstatus_t AwesomePlayer::initAudioDecoder() { 124788d8a83de12592635248aa1a3bd6b9ea46108501Andreas Huber sp<MetaData> meta = mAudioTrack->getFormat(); 1248717826ececd8d39596f62418677721d70776add1Andreas Huber 1249717826ececd8d39596f62418677721d70776add1Andreas Huber const char *mime; 1250717826ececd8d39596f62418677721d70776add1Andreas Huber CHECK(meta->findCString(kKeyMIMEType, &mime)); 1251717826ececd8d39596f62418677721d70776add1Andreas Huber 1252717826ececd8d39596f62418677721d70776add1Andreas Huber if (!strcasecmp(mime, MEDIA_MIMETYPE_AUDIO_RAW)) { 125388d8a83de12592635248aa1a3bd6b9ea46108501Andreas Huber mAudioSource = mAudioTrack; 1254717826ececd8d39596f62418677721d70776add1Andreas Huber } else { 1255717826ececd8d39596f62418677721d70776add1Andreas Huber mAudioSource = OMXCodec::Create( 125688d8a83de12592635248aa1a3bd6b9ea46108501Andreas Huber mClient.interface(), mAudioTrack->getFormat(), 1257717826ececd8d39596f62418677721d70776add1Andreas Huber false, // createEncoder 125888d8a83de12592635248aa1a3bd6b9ea46108501Andreas Huber mAudioTrack); 1259717826ececd8d39596f62418677721d70776add1Andreas Huber } 1260bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber 1261bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber if (mAudioSource != NULL) { 1262bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber int64_t durationUs; 126388d8a83de12592635248aa1a3bd6b9ea46108501Andreas Huber if (mAudioTrack->getFormat()->findInt64(kKeyDuration, &durationUs)) { 12642415ecb5bb4e1459024f6d6c8ae2d6e3dc4fbdc7Andreas Huber Mutex::Autolock autoLock(mMiscStateLock); 1265bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber if (mDurationUs < 0 || durationUs > mDurationUs) { 1266bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber mDurationUs = durationUs; 1267bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber } 1268bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber } 1269bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber 1270a945bfd91aa291fba4d9201ffcb38fce40eab7feAndreas Huber status_t err = mAudioSource->start(); 1271a945bfd91aa291fba4d9201ffcb38fce40eab7feAndreas Huber 1272a945bfd91aa291fba4d9201ffcb38fce40eab7feAndreas Huber if (err != OK) { 1273a945bfd91aa291fba4d9201ffcb38fce40eab7feAndreas Huber mAudioSource.clear(); 1274a945bfd91aa291fba4d9201ffcb38fce40eab7feAndreas Huber return err; 1275a945bfd91aa291fba4d9201ffcb38fce40eab7feAndreas Huber } 127681f82c32459029bf0744e28c73f95a7f18cab5acAndreas Huber } else if (!strcasecmp(mime, MEDIA_MIMETYPE_AUDIO_QCELP)) { 127781f82c32459029bf0744e28c73f95a7f18cab5acAndreas Huber // For legacy reasons we're simply going to ignore the absence 127881f82c32459029bf0744e28c73f95a7f18cab5acAndreas Huber // of an audio decoder for QCELP instead of aborting playback 127981f82c32459029bf0744e28c73f95a7f18cab5acAndreas Huber // altogether. 128081f82c32459029bf0744e28c73f95a7f18cab5acAndreas Huber return OK; 128181f82c32459029bf0744e28c73f95a7f18cab5acAndreas Huber } 1282e7e3b785a0e7819db4c895a4f60e9a4dd755880cAndreas Huber 1283bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber return mAudioSource != NULL ? OK : UNKNOWN_ERROR; 1284bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber} 1285bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber 128688d8a83de12592635248aa1a3bd6b9ea46108501Andreas Hubervoid AwesomePlayer::setVideoSource(sp<MediaSource> source) { 128788d8a83de12592635248aa1a3bd6b9ea46108501Andreas Huber CHECK(source != NULL); 1288bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber 128988d8a83de12592635248aa1a3bd6b9ea46108501Andreas Huber mVideoTrack = source; 129088d8a83de12592635248aa1a3bd6b9ea46108501Andreas Huber} 129188d8a83de12592635248aa1a3bd6b9ea46108501Andreas Huber 12922a4d22d79e927f2245537921e10fc5fda1c47a29Andreas Huberstatus_t AwesomePlayer::initVideoDecoder(uint32_t flags) { 12932eb62955eb84b97695e8a7e56e14310cbb86412bGlenn Kasten 12942eb62955eb84b97695e8a7e56e14310cbb86412bGlenn Kasten // Either the application or the DRM system can independently say 12952eb62955eb84b97695e8a7e56e14310cbb86412bGlenn Kasten // that there must be a hardware-protected path to an external video sink. 12962eb62955eb84b97695e8a7e56e14310cbb86412bGlenn Kasten // For now we always require a hardware-protected path to external video sink 12972eb62955eb84b97695e8a7e56e14310cbb86412bGlenn Kasten // if content is DRMed, but eventually this could be optional per DRM agent. 12982eb62955eb84b97695e8a7e56e14310cbb86412bGlenn Kasten // When the application wants protection, then 12992eb62955eb84b97695e8a7e56e14310cbb86412bGlenn Kasten // (USE_SURFACE_ALLOC && (mSurface != 0) && 13002eb62955eb84b97695e8a7e56e14310cbb86412bGlenn Kasten // (mSurface->getFlags() & ISurfaceComposer::eProtectedByApp)) 13012eb62955eb84b97695e8a7e56e14310cbb86412bGlenn Kasten // will be true, but that part is already handled by SurfaceFlinger. 1302eabd34665adc284525fe7337ad5c56a8b92964efGlenn Kasten 1303eabd34665adc284525fe7337ad5c56a8b92964efGlenn Kasten#ifdef DEBUG_HDCP 1304eabd34665adc284525fe7337ad5c56a8b92964efGlenn Kasten // For debugging, we allow a system property to control the protected usage. 1305eabd34665adc284525fe7337ad5c56a8b92964efGlenn Kasten // In case of uninitialized or unexpected property, we default to "DRM only". 1306eabd34665adc284525fe7337ad5c56a8b92964efGlenn Kasten bool setProtectionBit = false; 1307eabd34665adc284525fe7337ad5c56a8b92964efGlenn Kasten char value[PROPERTY_VALUE_MAX]; 1308eabd34665adc284525fe7337ad5c56a8b92964efGlenn Kasten if (property_get("persist.sys.hdcp_checking", value, NULL)) { 1309eabd34665adc284525fe7337ad5c56a8b92964efGlenn Kasten if (!strcmp(value, "never")) { 1310eabd34665adc284525fe7337ad5c56a8b92964efGlenn Kasten // nop 1311eabd34665adc284525fe7337ad5c56a8b92964efGlenn Kasten } else if (!strcmp(value, "always")) { 1312eabd34665adc284525fe7337ad5c56a8b92964efGlenn Kasten setProtectionBit = true; 1313eabd34665adc284525fe7337ad5c56a8b92964efGlenn Kasten } else if (!strcmp(value, "drm-only")) { 1314eabd34665adc284525fe7337ad5c56a8b92964efGlenn Kasten if (mDecryptHandle != NULL) { 1315eabd34665adc284525fe7337ad5c56a8b92964efGlenn Kasten setProtectionBit = true; 1316eabd34665adc284525fe7337ad5c56a8b92964efGlenn Kasten } 1317eabd34665adc284525fe7337ad5c56a8b92964efGlenn Kasten // property value is empty, or unexpected value 1318eabd34665adc284525fe7337ad5c56a8b92964efGlenn Kasten } else { 1319eabd34665adc284525fe7337ad5c56a8b92964efGlenn Kasten if (mDecryptHandle != NULL) { 1320eabd34665adc284525fe7337ad5c56a8b92964efGlenn Kasten setProtectionBit = true; 1321eabd34665adc284525fe7337ad5c56a8b92964efGlenn Kasten } 1322eabd34665adc284525fe7337ad5c56a8b92964efGlenn Kasten } 1323eabd34665adc284525fe7337ad5c56a8b92964efGlenn Kasten // can' read property value 1324eabd34665adc284525fe7337ad5c56a8b92964efGlenn Kasten } else { 1325eabd34665adc284525fe7337ad5c56a8b92964efGlenn Kasten if (mDecryptHandle != NULL) { 1326eabd34665adc284525fe7337ad5c56a8b92964efGlenn Kasten setProtectionBit = true; 1327eabd34665adc284525fe7337ad5c56a8b92964efGlenn Kasten } 1328eabd34665adc284525fe7337ad5c56a8b92964efGlenn Kasten } 1329eabd34665adc284525fe7337ad5c56a8b92964efGlenn Kasten // note that usage bit is already cleared, so no need to clear it in the "else" case 1330eabd34665adc284525fe7337ad5c56a8b92964efGlenn Kasten if (setProtectionBit) { 1331eabd34665adc284525fe7337ad5c56a8b92964efGlenn Kasten flags |= OMXCodec::kEnableGrallocUsageProtected; 1332eabd34665adc284525fe7337ad5c56a8b92964efGlenn Kasten } 1333eabd34665adc284525fe7337ad5c56a8b92964efGlenn Kasten#else 13342eb62955eb84b97695e8a7e56e14310cbb86412bGlenn Kasten if (mDecryptHandle != NULL) { 13352eb62955eb84b97695e8a7e56e14310cbb86412bGlenn Kasten flags |= OMXCodec::kEnableGrallocUsageProtected; 13362eb62955eb84b97695e8a7e56e14310cbb86412bGlenn Kasten } 1337eabd34665adc284525fe7337ad5c56a8b92964efGlenn Kasten#endif 13382eb62955eb84b97695e8a7e56e14310cbb86412bGlenn Kasten LOGV("initVideoDecoder flags=0x%x", flags); 1339bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber mVideoSource = OMXCodec::Create( 134088d8a83de12592635248aa1a3bd6b9ea46108501Andreas Huber mClient.interface(), mVideoTrack->getFormat(), 1341bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber false, // createEncoder 134239ddf8e0f18766f7ba1e3246b774aa6ebd93eea8Andreas Huber mVideoTrack, 13431173118eace0e9e347cb007f0da817cee87579edGlenn Kasten NULL, flags, USE_SURFACE_ALLOC ? mNativeWindow : NULL); 1344bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber 1345bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber if (mVideoSource != NULL) { 1346bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber int64_t durationUs; 134788d8a83de12592635248aa1a3bd6b9ea46108501Andreas Huber if (mVideoTrack->getFormat()->findInt64(kKeyDuration, &durationUs)) { 13482415ecb5bb4e1459024f6d6c8ae2d6e3dc4fbdc7Andreas Huber Mutex::Autolock autoLock(mMiscStateLock); 1349bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber if (mDurationUs < 0 || durationUs > mDurationUs) { 1350bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber mDurationUs = durationUs; 1351bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber } 1352bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber } 1353bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber 1354139a5d5bd33c9fc7708d0a79f11ee928f7796e6bAndreas Huber status_t err = mVideoSource->start(); 1355139a5d5bd33c9fc7708d0a79f11ee928f7796e6bAndreas Huber 1356139a5d5bd33c9fc7708d0a79f11ee928f7796e6bAndreas Huber if (err != OK) { 1357139a5d5bd33c9fc7708d0a79f11ee928f7796e6bAndreas Huber mVideoSource.clear(); 1358139a5d5bd33c9fc7708d0a79f11ee928f7796e6bAndreas Huber return err; 1359139a5d5bd33c9fc7708d0a79f11ee928f7796e6bAndreas Huber } 1360bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber } 1361bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber 1362bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber return mVideoSource != NULL ? OK : UNKNOWN_ERROR; 1363bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber} 1364bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber 13654769cc92740e3ab58e9263d42553c12bbf79e3beAndreas Hubervoid AwesomePlayer::finishSeekIfNecessary(int64_t videoTimeUs) { 136664bb6983690bf994d904591145a3cdd6373bdbe6Andreas Huber if (mSeeking == SEEK_VIDEO_ONLY) { 136764bb6983690bf994d904591145a3cdd6373bdbe6Andreas Huber mSeeking = NO_SEEK; 136864bb6983690bf994d904591145a3cdd6373bdbe6Andreas Huber return; 136964bb6983690bf994d904591145a3cdd6373bdbe6Andreas Huber } 137064bb6983690bf994d904591145a3cdd6373bdbe6Andreas Huber 137164bb6983690bf994d904591145a3cdd6373bdbe6Andreas Huber if (mSeeking == NO_SEEK || (mFlags & SEEK_PREVIEW)) { 13724769cc92740e3ab58e9263d42553c12bbf79e3beAndreas Huber return; 13734769cc92740e3ab58e9263d42553c12bbf79e3beAndreas Huber } 13744769cc92740e3ab58e9263d42553c12bbf79e3beAndreas Huber 13754769cc92740e3ab58e9263d42553c12bbf79e3beAndreas Huber if (mAudioPlayer != NULL) { 1376f83dd80384f70da1f6d36d60e831439ff7739ad7Jamie Gennis LOGV("seeking audio to %lld us (%.2f secs).", videoTimeUs, videoTimeUs / 1E6); 13774769cc92740e3ab58e9263d42553c12bbf79e3beAndreas Huber 13784769cc92740e3ab58e9263d42553c12bbf79e3beAndreas Huber // If we don't have a video time, seek audio to the originally 13794769cc92740e3ab58e9263d42553c12bbf79e3beAndreas Huber // requested seek time instead. 13804769cc92740e3ab58e9263d42553c12bbf79e3beAndreas Huber 13814769cc92740e3ab58e9263d42553c12bbf79e3beAndreas Huber mAudioPlayer->seekTo(videoTimeUs < 0 ? mSeekTimeUs : videoTimeUs); 13824769cc92740e3ab58e9263d42553c12bbf79e3beAndreas Huber mWatchForAudioSeekComplete = true; 13835dac87b088556b8ed7f2a4f5546d31be0bb68680Andreas Huber mWatchForAudioEOS = true; 13844769cc92740e3ab58e9263d42553c12bbf79e3beAndreas Huber } else if (!mSeekNotificationSent) { 13854769cc92740e3ab58e9263d42553c12bbf79e3beAndreas Huber // If we're playing video only, report seek complete now, 13864769cc92740e3ab58e9263d42553c12bbf79e3beAndreas Huber // otherwise audio player will notify us later. 13874769cc92740e3ab58e9263d42553c12bbf79e3beAndreas Huber notifyListener_l(MEDIA_SEEK_COMPLETE); 1388512895089f2035bc86d3f502255199809aca721bAndreas Huber mSeekNotificationSent = true; 13894769cc92740e3ab58e9263d42553c12bbf79e3beAndreas Huber } 13904769cc92740e3ab58e9263d42553c12bbf79e3beAndreas Huber 13914769cc92740e3ab58e9263d42553c12bbf79e3beAndreas Huber mFlags |= FIRST_FRAME; 139264bb6983690bf994d904591145a3cdd6373bdbe6Andreas Huber mSeeking = NO_SEEK; 1393a89082944308805b0def7de87c67e370e74b8789Gloria Wang 1394a89082944308805b0def7de87c67e370e74b8789Gloria Wang if (mDecryptHandle != NULL) { 1395a89082944308805b0def7de87c67e370e74b8789Gloria Wang mDrmManagerClient->setPlaybackStatus(mDecryptHandle, 1396a89082944308805b0def7de87c67e370e74b8789Gloria Wang Playback::PAUSE, 0); 1397a89082944308805b0def7de87c67e370e74b8789Gloria Wang mDrmManagerClient->setPlaybackStatus(mDecryptHandle, 1398a89082944308805b0def7de87c67e370e74b8789Gloria Wang Playback::START, videoTimeUs / 1000); 1399a89082944308805b0def7de87c67e370e74b8789Gloria Wang } 14004769cc92740e3ab58e9263d42553c12bbf79e3beAndreas Huber} 14014769cc92740e3ab58e9263d42553c12bbf79e3beAndreas Huber 1402c23f12af0394aa2f6651968a3c8840f1af317aa1Andreas Hubervoid AwesomePlayer::onVideoEvent() { 1403bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber Mutex::Autolock autoLock(mLock); 14047b3396acc702451be9bafb19d7fe26d55d43a316Andreas Huber if (!mVideoEventPending) { 14057b3396acc702451be9bafb19d7fe26d55d43a316Andreas Huber // The event has been cancelled in reset_l() but had already 14067b3396acc702451be9bafb19d7fe26d55d43a316Andreas Huber // been scheduled for execution at that time. 14077b3396acc702451be9bafb19d7fe26d55d43a316Andreas Huber return; 14087b3396acc702451be9bafb19d7fe26d55d43a316Andreas Huber } 1409bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber mVideoEventPending = false; 1410bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber 141164bb6983690bf994d904591145a3cdd6373bdbe6Andreas Huber if (mSeeking != NO_SEEK) { 1412bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber if (mVideoBuffer) { 1413bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber mVideoBuffer->release(); 1414bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber mVideoBuffer = NULL; 1415bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber } 14160a5baa9b411fe086013d2a5e9126ed63fbad046cAndreas Huber 141764bb6983690bf994d904591145a3cdd6373bdbe6Andreas Huber if (mSeeking == SEEK && mCachedSource != NULL && mAudioSource != NULL 14182b1222f8938356669672f35e0e53e176c78c40efAndreas Huber && !(mFlags & SEEK_PREVIEW)) { 14190a5baa9b411fe086013d2a5e9126ed63fbad046cAndreas Huber // We're going to seek the video source first, followed by 14200a5baa9b411fe086013d2a5e9126ed63fbad046cAndreas Huber // the audio source. 14210a5baa9b411fe086013d2a5e9126ed63fbad046cAndreas Huber // In order to avoid jumps in the DataSource offset caused by 14220a5baa9b411fe086013d2a5e9126ed63fbad046cAndreas Huber // the audio codec prefetching data from the old locations 14230a5baa9b411fe086013d2a5e9126ed63fbad046cAndreas Huber // while the video codec is already reading data from the new 14240a5baa9b411fe086013d2a5e9126ed63fbad046cAndreas Huber // locations, we'll "pause" the audio source, causing it to 14250a5baa9b411fe086013d2a5e9126ed63fbad046cAndreas Huber // stop reading input data until a subsequent seek. 14260a5baa9b411fe086013d2a5e9126ed63fbad046cAndreas Huber 1427f03034408506051f2f836e59305fcd5f662bf19aAndreas Huber if (mAudioPlayer != NULL && (mFlags & AUDIO_RUNNING)) { 14280a5baa9b411fe086013d2a5e9126ed63fbad046cAndreas Huber mAudioPlayer->pause(); 1429f03034408506051f2f836e59305fcd5f662bf19aAndreas Huber 1430f03034408506051f2f836e59305fcd5f662bf19aAndreas Huber mFlags &= ~AUDIO_RUNNING; 14310a5baa9b411fe086013d2a5e9126ed63fbad046cAndreas Huber } 14320a5baa9b411fe086013d2a5e9126ed63fbad046cAndreas Huber mAudioSource->pause(); 14330a5baa9b411fe086013d2a5e9126ed63fbad046cAndreas Huber } 1434bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber } 1435bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber 1436bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber if (!mVideoBuffer) { 1437bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber MediaSource::ReadOptions options; 143864bb6983690bf994d904591145a3cdd6373bdbe6Andreas Huber if (mSeeking != NO_SEEK) { 1439bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber LOGV("seeking to %lld us (%.2f secs)", mSeekTimeUs, mSeekTimeUs / 1E6); 1440bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber 1441abd1f4f870925d6776dbe4b930b759a1ab6595caAndreas Huber options.setSeekTo( 144264bb6983690bf994d904591145a3cdd6373bdbe6Andreas Huber mSeekTimeUs, 144364bb6983690bf994d904591145a3cdd6373bdbe6Andreas Huber mSeeking == SEEK_VIDEO_ONLY 144464bb6983690bf994d904591145a3cdd6373bdbe6Andreas Huber ? MediaSource::ReadOptions::SEEK_NEXT_SYNC 144564bb6983690bf994d904591145a3cdd6373bdbe6Andreas Huber : MediaSource::ReadOptions::SEEK_CLOSEST_SYNC); 1446bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber } 1447bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber for (;;) { 1448bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber status_t err = mVideoSource->read(&mVideoBuffer, &options); 1449c1689e49ac867de33f2e81289449878ac2e536a0Andreas Huber options.clearSeekTo(); 1450bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber 1451bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber if (err != OK) { 1452e2b1028852120bcfded33b8f06f66b780437fe92Andreas Huber CHECK(mVideoBuffer == NULL); 1453bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber 1454bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber if (err == INFO_FORMAT_CHANGED) { 1455bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber LOGV("VideoSource signalled format change."); 1456bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber 14575daeb129a2c2ba3d14ccd94af283b5f561c783eaAndreas Huber notifyVideoSize_l(); 14585daeb129a2c2ba3d14ccd94af283b5f561c783eaAndreas Huber 1459a657f8deaf21acbe5faba7be1df9c6681d44d471Andreas Huber if (mVideoRenderer != NULL) { 1460fa090f541bb84a546af2ec834e91a032ff10e66eAndreas Huber mVideoRendererIsPreview = false; 1461a657f8deaf21acbe5faba7be1df9c6681d44d471Andreas Huber initRenderer_l(); 1462a657f8deaf21acbe5faba7be1df9c6681d44d471Andreas Huber } 1463bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber continue; 1464bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber } 1465bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber 14664769cc92740e3ab58e9263d42553c12bbf79e3beAndreas Huber // So video playback is complete, but we may still have 14674769cc92740e3ab58e9263d42553c12bbf79e3beAndreas Huber // a seek request pending that needs to be applied 14684769cc92740e3ab58e9263d42553c12bbf79e3beAndreas Huber // to the audio track. 146964bb6983690bf994d904591145a3cdd6373bdbe6Andreas Huber if (mSeeking != NO_SEEK) { 14704769cc92740e3ab58e9263d42553c12bbf79e3beAndreas Huber LOGV("video stream ended while seeking!"); 14714769cc92740e3ab58e9263d42553c12bbf79e3beAndreas Huber } 14724769cc92740e3ab58e9263d42553c12bbf79e3beAndreas Huber finishSeekIfNecessary(-1); 14734769cc92740e3ab58e9263d42553c12bbf79e3beAndreas Huber 14745dac87b088556b8ed7f2a4f5546d31be0bb68680Andreas Huber if (mAudioPlayer != NULL 14755dac87b088556b8ed7f2a4f5546d31be0bb68680Andreas Huber && !(mFlags & (AUDIO_RUNNING | SEEK_PREVIEW))) { 14765dac87b088556b8ed7f2a4f5546d31be0bb68680Andreas Huber startAudioPlayer_l(); 14775dac87b088556b8ed7f2a4f5546d31be0bb68680Andreas Huber } 14785dac87b088556b8ed7f2a4f5546d31be0bb68680Andreas Huber 14795d2de4da54504836e4b772b3010ac28c19f667f0Andreas Huber mFlags |= VIDEO_AT_EOS; 14805295c0c55d41a2906ea7f65a3f22e6278cb17d4bAndreas Huber postStreamDoneEvent_l(err); 1481bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber return; 1482bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber } 1483bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber 14844844ac54e8b5997c3b03872dbafe8ebed4787517Andreas Huber if (mVideoBuffer->range_length() == 0) { 148508411b75d4c30ce26180639f158e2f33d190eee8Andreas Huber // Some decoders, notably the PV AVC software decoder 148608411b75d4c30ce26180639f158e2f33d190eee8Andreas Huber // return spurious empty buffers that we just want to ignore. 148708411b75d4c30ce26180639f158e2f33d190eee8Andreas Huber 14884844ac54e8b5997c3b03872dbafe8ebed4787517Andreas Huber mVideoBuffer->release(); 14894844ac54e8b5997c3b03872dbafe8ebed4787517Andreas Huber mVideoBuffer = NULL; 14904844ac54e8b5997c3b03872dbafe8ebed4787517Andreas Huber continue; 14914844ac54e8b5997c3b03872dbafe8ebed4787517Andreas Huber } 14924844ac54e8b5997c3b03872dbafe8ebed4787517Andreas Huber 1493bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber break; 1494bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber } 1495bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber } 1496bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber 1497bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber int64_t timeUs; 1498bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber CHECK(mVideoBuffer->meta_data()->findInt64(kKeyTime, &timeUs)); 1499bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber 1500150694cda0842d38a9358fe8d1fcb4fb4a76599eAndreas Huber mLastVideoTimeUs = timeUs; 1501150694cda0842d38a9358fe8d1fcb4fb4a76599eAndreas Huber 150264bb6983690bf994d904591145a3cdd6373bdbe6Andreas Huber if (mSeeking == SEEK_VIDEO_ONLY) { 150364bb6983690bf994d904591145a3cdd6373bdbe6Andreas Huber if (mSeekTimeUs > timeUs) { 150464bb6983690bf994d904591145a3cdd6373bdbe6Andreas Huber LOGI("XXX mSeekTimeUs = %lld us, timeUs = %lld us", 150564bb6983690bf994d904591145a3cdd6373bdbe6Andreas Huber mSeekTimeUs, timeUs); 150664bb6983690bf994d904591145a3cdd6373bdbe6Andreas Huber } 150764bb6983690bf994d904591145a3cdd6373bdbe6Andreas Huber } 150864bb6983690bf994d904591145a3cdd6373bdbe6Andreas Huber 15092415ecb5bb4e1459024f6d6c8ae2d6e3dc4fbdc7Andreas Huber { 15102415ecb5bb4e1459024f6d6c8ae2d6e3dc4fbdc7Andreas Huber Mutex::Autolock autoLock(mMiscStateLock); 15112415ecb5bb4e1459024f6d6c8ae2d6e3dc4fbdc7Andreas Huber mVideoTimeUs = timeUs; 15122415ecb5bb4e1459024f6d6c8ae2d6e3dc4fbdc7Andreas Huber } 1513bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber 151464bb6983690bf994d904591145a3cdd6373bdbe6Andreas Huber SeekType wasSeeking = mSeeking; 15154769cc92740e3ab58e9263d42553c12bbf79e3beAndreas Huber finishSeekIfNecessary(timeUs); 1516bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber 1517f03034408506051f2f836e59305fcd5f662bf19aAndreas Huber if (mAudioPlayer != NULL && !(mFlags & (AUDIO_RUNNING | SEEK_PREVIEW))) { 1518f03034408506051f2f836e59305fcd5f662bf19aAndreas Huber status_t err = startAudioPlayer_l(); 1519f03034408506051f2f836e59305fcd5f662bf19aAndreas Huber if (err != OK) { 1520f03034408506051f2f836e59305fcd5f662bf19aAndreas Huber LOGE("Startung the audio player failed w/ err %d", err); 1521f03034408506051f2f836e59305fcd5f662bf19aAndreas Huber return; 1522f03034408506051f2f836e59305fcd5f662bf19aAndreas Huber } 1523f03034408506051f2f836e59305fcd5f662bf19aAndreas Huber } 1524f03034408506051f2f836e59305fcd5f662bf19aAndreas Huber 15257a1e3e81264189e23a1db2b174e1b5a5d4c7d1c3Gloria Wang if ((mFlags & TEXTPLAYER_STARTED) && !(mFlags & (TEXT_RUNNING | SEEK_PREVIEW))) { 15267a1e3e81264189e23a1db2b174e1b5a5d4c7d1c3Gloria Wang mTextPlayer->resume(); 15277a1e3e81264189e23a1db2b174e1b5a5d4c7d1c3Gloria Wang mFlags |= TEXT_RUNNING; 15287a1e3e81264189e23a1db2b174e1b5a5d4c7d1c3Gloria Wang } 15297a1e3e81264189e23a1db2b174e1b5a5d4c7d1c3Gloria Wang 15305d2de4da54504836e4b772b3010ac28c19f667f0Andreas Huber TimeSource *ts = (mFlags & AUDIO_AT_EOS) ? &mSystemTimeSource : mTimeSource; 15315d2de4da54504836e4b772b3010ac28c19f667f0Andreas Huber 1532bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber if (mFlags & FIRST_FRAME) { 1533bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber mFlags &= ~FIRST_FRAME; 15345d2de4da54504836e4b772b3010ac28c19f667f0Andreas Huber mTimeSourceDeltaUs = ts->getRealTimeUs() - timeUs; 1535bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber } 1536bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber 1537bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber int64_t realTimeUs, mediaTimeUs; 15385d2de4da54504836e4b772b3010ac28c19f667f0Andreas Huber if (!(mFlags & AUDIO_AT_EOS) && mAudioPlayer != NULL 1539bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber && mAudioPlayer->getMediaTimeMapping(&realTimeUs, &mediaTimeUs)) { 1540bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber mTimeSourceDeltaUs = realTimeUs - mediaTimeUs; 1541bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber } 1542bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber 154364bb6983690bf994d904591145a3cdd6373bdbe6Andreas Huber if (wasSeeking == SEEK_VIDEO_ONLY) { 154464bb6983690bf994d904591145a3cdd6373bdbe6Andreas Huber int64_t nowUs = ts->getRealTimeUs() - mTimeSourceDeltaUs; 154564bb6983690bf994d904591145a3cdd6373bdbe6Andreas Huber 154664bb6983690bf994d904591145a3cdd6373bdbe6Andreas Huber int64_t latenessUs = nowUs - timeUs; 154764bb6983690bf994d904591145a3cdd6373bdbe6Andreas Huber 154864bb6983690bf994d904591145a3cdd6373bdbe6Andreas Huber if (latenessUs > 0) { 154964bb6983690bf994d904591145a3cdd6373bdbe6Andreas Huber LOGI("after SEEK_VIDEO_ONLY we're late by %.2f secs", latenessUs / 1E6); 155064bb6983690bf994d904591145a3cdd6373bdbe6Andreas Huber } 155164bb6983690bf994d904591145a3cdd6373bdbe6Andreas Huber } 155264bb6983690bf994d904591145a3cdd6373bdbe6Andreas Huber 155364bb6983690bf994d904591145a3cdd6373bdbe6Andreas Huber if (wasSeeking == NO_SEEK) { 155402a1db7dc1de2f2df306ec10bab992bc8bbaaca8Andreas Huber // Let's display the first frame after seeking right away. 1555f8ca90452ff3e252f20de38f1c3eee524c808c3eAndreas Huber 15562b1222f8938356669672f35e0e53e176c78c40efAndreas Huber int64_t nowUs = ts->getRealTimeUs() - mTimeSourceDeltaUs; 1557bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber 15582b1222f8938356669672f35e0e53e176c78c40efAndreas Huber int64_t latenessUs = nowUs - timeUs; 15592b1222f8938356669672f35e0e53e176c78c40efAndreas Huber 156064bb6983690bf994d904591145a3cdd6373bdbe6Andreas Huber if (latenessUs > 500000ll 156164bb6983690bf994d904591145a3cdd6373bdbe6Andreas Huber && mRTSPController == NULL 156264bb6983690bf994d904591145a3cdd6373bdbe6Andreas Huber && mAudioPlayer != NULL 156364bb6983690bf994d904591145a3cdd6373bdbe6Andreas Huber && mAudioPlayer->getMediaTimeMapping( 156464bb6983690bf994d904591145a3cdd6373bdbe6Andreas Huber &realTimeUs, &mediaTimeUs)) { 156564bb6983690bf994d904591145a3cdd6373bdbe6Andreas Huber LOGI("we're much too late (%.2f secs), video skipping ahead", 156664bb6983690bf994d904591145a3cdd6373bdbe6Andreas Huber latenessUs / 1E6); 156764bb6983690bf994d904591145a3cdd6373bdbe6Andreas Huber 156864bb6983690bf994d904591145a3cdd6373bdbe6Andreas Huber mVideoBuffer->release(); 156964bb6983690bf994d904591145a3cdd6373bdbe6Andreas Huber mVideoBuffer = NULL; 157064bb6983690bf994d904591145a3cdd6373bdbe6Andreas Huber 157164bb6983690bf994d904591145a3cdd6373bdbe6Andreas Huber mSeeking = SEEK_VIDEO_ONLY; 157264bb6983690bf994d904591145a3cdd6373bdbe6Andreas Huber mSeekTimeUs = mediaTimeUs; 157364bb6983690bf994d904591145a3cdd6373bdbe6Andreas Huber 157464bb6983690bf994d904591145a3cdd6373bdbe6Andreas Huber postVideoEvent_l(); 157564bb6983690bf994d904591145a3cdd6373bdbe6Andreas Huber return; 157664bb6983690bf994d904591145a3cdd6373bdbe6Andreas Huber } 157764bb6983690bf994d904591145a3cdd6373bdbe6Andreas Huber 15782b1222f8938356669672f35e0e53e176c78c40efAndreas Huber if (latenessUs > 40000) { 15792b1222f8938356669672f35e0e53e176c78c40efAndreas Huber // We're more than 40ms late. 1580dab59b5a4956b7e9b1ffc64a0676e7990579934eAndreas Huber LOGV("we're late by %lld us (%.2f secs), dropping frame", 1581dab59b5a4956b7e9b1ffc64a0676e7990579934eAndreas Huber latenessUs, latenessUs / 1E6); 1582dab59b5a4956b7e9b1ffc64a0676e7990579934eAndreas Huber mVideoBuffer->release(); 1583dab59b5a4956b7e9b1ffc64a0676e7990579934eAndreas Huber mVideoBuffer = NULL; 15842b1222f8938356669672f35e0e53e176c78c40efAndreas Huber 1585dab59b5a4956b7e9b1ffc64a0676e7990579934eAndreas Huber postVideoEvent_l(); 1586dab59b5a4956b7e9b1ffc64a0676e7990579934eAndreas Huber return; 1587aee6c07b3572bf2510cd9e7d29c454fcfedde31dpmehendale } 1588bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber 15892b1222f8938356669672f35e0e53e176c78c40efAndreas Huber if (latenessUs < -10000) { 15902b1222f8938356669672f35e0e53e176c78c40efAndreas Huber // We're more than 10ms early. 1591bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber 15922b1222f8938356669672f35e0e53e176c78c40efAndreas Huber postVideoEvent_l(10000); 15932b1222f8938356669672f35e0e53e176c78c40efAndreas Huber return; 15942b1222f8938356669672f35e0e53e176c78c40efAndreas Huber } 1595bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber } 1596bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber 1597fa090f541bb84a546af2ec834e91a032ff10e66eAndreas Huber if (mVideoRendererIsPreview || mVideoRenderer == NULL) { 1598fa090f541bb84a546af2ec834e91a032ff10e66eAndreas Huber mVideoRendererIsPreview = false; 1599fa090f541bb84a546af2ec834e91a032ff10e66eAndreas Huber 1600a657f8deaf21acbe5faba7be1df9c6681d44d471Andreas Huber initRenderer_l(); 1601a657f8deaf21acbe5faba7be1df9c6681d44d471Andreas Huber } 1602a657f8deaf21acbe5faba7be1df9c6681d44d471Andreas Huber 1603a657f8deaf21acbe5faba7be1df9c6681d44d471Andreas Huber if (mVideoRenderer != NULL) { 1604a657f8deaf21acbe5faba7be1df9c6681d44d471Andreas Huber mVideoRenderer->render(mVideoBuffer); 1605a657f8deaf21acbe5faba7be1df9c6681d44d471Andreas Huber } 1606bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber 1607f5ab57c2d5e02af7483c94eddb177e4f5c9e9892Andreas Huber mVideoBuffer->release(); 1608bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber mVideoBuffer = NULL; 1609bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber 161064bb6983690bf994d904591145a3cdd6373bdbe6Andreas Huber if (wasSeeking != NO_SEEK && (mFlags & SEEK_PREVIEW)) { 16112b1222f8938356669672f35e0e53e176c78c40efAndreas Huber mFlags &= ~SEEK_PREVIEW; 16122b1222f8938356669672f35e0e53e176c78c40efAndreas Huber return; 16132b1222f8938356669672f35e0e53e176c78c40efAndreas Huber } 16142b1222f8938356669672f35e0e53e176c78c40efAndreas Huber 1615bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber postVideoEvent_l(); 1616bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber} 1617bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber 1618bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Hubervoid AwesomePlayer::postVideoEvent_l(int64_t delayUs) { 1619bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber if (mVideoEventPending) { 1620bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber return; 1621bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber } 1622bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber 1623bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber mVideoEventPending = true; 1624bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber mQueue.postEventWithDelay(mVideoEvent, delayUs < 0 ? 10000 : delayUs); 1625bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber} 1626bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber 16275295c0c55d41a2906ea7f65a3f22e6278cb17d4bAndreas Hubervoid AwesomePlayer::postStreamDoneEvent_l(status_t status) { 1628bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber if (mStreamDoneEventPending) { 1629bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber return; 1630bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber } 1631bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber mStreamDoneEventPending = true; 16325295c0c55d41a2906ea7f65a3f22e6278cb17d4bAndreas Huber 16335295c0c55d41a2906ea7f65a3f22e6278cb17d4bAndreas Huber mStreamDoneStatus = status; 1634bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber mQueue.postEvent(mStreamDoneEvent); 1635bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber} 1636bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber 163766b0a35c9a4136a84c3f73b1b25fcb5220138b95Andreas Hubervoid AwesomePlayer::postBufferingEvent_l() { 163866b0a35c9a4136a84c3f73b1b25fcb5220138b95Andreas Huber if (mBufferingEventPending) { 163966b0a35c9a4136a84c3f73b1b25fcb5220138b95Andreas Huber return; 164066b0a35c9a4136a84c3f73b1b25fcb5220138b95Andreas Huber } 164166b0a35c9a4136a84c3f73b1b25fcb5220138b95Andreas Huber mBufferingEventPending = true; 164266b0a35c9a4136a84c3f73b1b25fcb5220138b95Andreas Huber mQueue.postEventWithDelay(mBufferingEvent, 1000000ll); 164366b0a35c9a4136a84c3f73b1b25fcb5220138b95Andreas Huber} 164466b0a35c9a4136a84c3f73b1b25fcb5220138b95Andreas Huber 1645145e68fc778275963189b02a1adcbe27cce4d769Andreas Hubervoid AwesomePlayer::postVideoLagEvent_l() { 1646145e68fc778275963189b02a1adcbe27cce4d769Andreas Huber if (mVideoLagEventPending) { 1647145e68fc778275963189b02a1adcbe27cce4d769Andreas Huber return; 1648145e68fc778275963189b02a1adcbe27cce4d769Andreas Huber } 1649145e68fc778275963189b02a1adcbe27cce4d769Andreas Huber mVideoLagEventPending = true; 1650145e68fc778275963189b02a1adcbe27cce4d769Andreas Huber mQueue.postEventWithDelay(mVideoLagEvent, 1000000ll); 1651145e68fc778275963189b02a1adcbe27cce4d769Andreas Huber} 1652145e68fc778275963189b02a1adcbe27cce4d769Andreas Huber 165384b343f29063fbfa2ee61b2e3d37ba059ca507d4Andreas Hubervoid AwesomePlayer::postCheckAudioStatusEvent_l(int64_t delayUs) { 16541862a33b246249630b654182afb5914da3480d4cAndreas Huber if (mAudioStatusEventPending) { 16551862a33b246249630b654182afb5914da3480d4cAndreas Huber return; 16561862a33b246249630b654182afb5914da3480d4cAndreas Huber } 16571862a33b246249630b654182afb5914da3480d4cAndreas Huber mAudioStatusEventPending = true; 165884b343f29063fbfa2ee61b2e3d37ba059ca507d4Andreas Huber mQueue.postEventWithDelay(mCheckAudioStatusEvent, delayUs); 16591862a33b246249630b654182afb5914da3480d4cAndreas Huber} 16601862a33b246249630b654182afb5914da3480d4cAndreas Huber 16611862a33b246249630b654182afb5914da3480d4cAndreas Hubervoid AwesomePlayer::onCheckAudioStatus() { 16621862a33b246249630b654182afb5914da3480d4cAndreas Huber Mutex::Autolock autoLock(mLock); 1663d29345dfa29cdcc650f3705e43950ef2500f6728Andreas Huber if (!mAudioStatusEventPending) { 1664d29345dfa29cdcc650f3705e43950ef2500f6728Andreas Huber // Event was dispatched and while we were blocking on the mutex, 1665d29345dfa29cdcc650f3705e43950ef2500f6728Andreas Huber // has already been cancelled. 1666d29345dfa29cdcc650f3705e43950ef2500f6728Andreas Huber return; 1667d29345dfa29cdcc650f3705e43950ef2500f6728Andreas Huber } 1668d29345dfa29cdcc650f3705e43950ef2500f6728Andreas Huber 16691862a33b246249630b654182afb5914da3480d4cAndreas Huber mAudioStatusEventPending = false; 16701862a33b246249630b654182afb5914da3480d4cAndreas Huber 16711862a33b246249630b654182afb5914da3480d4cAndreas Huber if (mWatchForAudioSeekComplete && !mAudioPlayer->isSeeking()) { 16721862a33b246249630b654182afb5914da3480d4cAndreas Huber mWatchForAudioSeekComplete = false; 16731321fdd94d354431b930735e9f38f32ecd189a2dAndreas Huber 16741321fdd94d354431b930735e9f38f32ecd189a2dAndreas Huber if (!mSeekNotificationSent) { 16751321fdd94d354431b930735e9f38f32ecd189a2dAndreas Huber notifyListener_l(MEDIA_SEEK_COMPLETE); 16761321fdd94d354431b930735e9f38f32ecd189a2dAndreas Huber mSeekNotificationSent = true; 16771321fdd94d354431b930735e9f38f32ecd189a2dAndreas Huber } 1678dac4ee72bac87388a1495e098f39d73168c8078fAndreas Huber 167964bb6983690bf994d904591145a3cdd6373bdbe6Andreas Huber mSeeking = NO_SEEK; 16801862a33b246249630b654182afb5914da3480d4cAndreas Huber } 16811862a33b246249630b654182afb5914da3480d4cAndreas Huber 16825295c0c55d41a2906ea7f65a3f22e6278cb17d4bAndreas Huber status_t finalStatus; 16835295c0c55d41a2906ea7f65a3f22e6278cb17d4bAndreas Huber if (mWatchForAudioEOS && mAudioPlayer->reachedEOS(&finalStatus)) { 16841862a33b246249630b654182afb5914da3480d4cAndreas Huber mWatchForAudioEOS = false; 16855d2de4da54504836e4b772b3010ac28c19f667f0Andreas Huber mFlags |= AUDIO_AT_EOS; 16865d2de4da54504836e4b772b3010ac28c19f667f0Andreas Huber mFlags |= FIRST_FRAME; 16875295c0c55d41a2906ea7f65a3f22e6278cb17d4bAndreas Huber postStreamDoneEvent_l(finalStatus); 16881862a33b246249630b654182afb5914da3480d4cAndreas Huber } 16891862a33b246249630b654182afb5914da3480d4cAndreas Huber} 16901862a33b246249630b654182afb5914da3480d4cAndreas Huber 1691c23f12af0394aa2f6651968a3c8840f1af317aa1Andreas Huberstatus_t AwesomePlayer::prepare() { 1692c23f12af0394aa2f6651968a3c8840f1af317aa1Andreas Huber Mutex::Autolock autoLock(mLock); 1693bd22c52280179b29eefac91ef7e7bbbc33d25904Andreas Huber return prepare_l(); 1694bd22c52280179b29eefac91ef7e7bbbc33d25904Andreas Huber} 1695c23f12af0394aa2f6651968a3c8840f1af317aa1Andreas Huber 1696bd22c52280179b29eefac91ef7e7bbbc33d25904Andreas Huberstatus_t AwesomePlayer::prepare_l() { 1697bd22c52280179b29eefac91ef7e7bbbc33d25904Andreas Huber if (mFlags & PREPARED) { 1698bd22c52280179b29eefac91ef7e7bbbc33d25904Andreas Huber return OK; 1699bd22c52280179b29eefac91ef7e7bbbc33d25904Andreas Huber } 1700bd22c52280179b29eefac91ef7e7bbbc33d25904Andreas Huber 1701bd22c52280179b29eefac91ef7e7bbbc33d25904Andreas Huber if (mFlags & PREPARING) { 1702bd22c52280179b29eefac91ef7e7bbbc33d25904Andreas Huber return UNKNOWN_ERROR; 1703bd22c52280179b29eefac91ef7e7bbbc33d25904Andreas Huber } 1704bd22c52280179b29eefac91ef7e7bbbc33d25904Andreas Huber 1705bd22c52280179b29eefac91ef7e7bbbc33d25904Andreas Huber mIsAsyncPrepare = false; 1706c23f12af0394aa2f6651968a3c8840f1af317aa1Andreas Huber status_t err = prepareAsync_l(); 1707c23f12af0394aa2f6651968a3c8840f1af317aa1Andreas Huber 1708c23f12af0394aa2f6651968a3c8840f1af317aa1Andreas Huber if (err != OK) { 1709c23f12af0394aa2f6651968a3c8840f1af317aa1Andreas Huber return err; 1710c23f12af0394aa2f6651968a3c8840f1af317aa1Andreas Huber } 1711c23f12af0394aa2f6651968a3c8840f1af317aa1Andreas Huber 1712bd22c52280179b29eefac91ef7e7bbbc33d25904Andreas Huber while (mFlags & PREPARING) { 1713c23f12af0394aa2f6651968a3c8840f1af317aa1Andreas Huber mPreparedCondition.wait(mLock); 1714c23f12af0394aa2f6651968a3c8840f1af317aa1Andreas Huber } 1715c23f12af0394aa2f6651968a3c8840f1af317aa1Andreas Huber 1716bd22c52280179b29eefac91ef7e7bbbc33d25904Andreas Huber return mPrepareResult; 1717c23f12af0394aa2f6651968a3c8840f1af317aa1Andreas Huber} 1718c23f12af0394aa2f6651968a3c8840f1af317aa1Andreas Huber 1719c23f12af0394aa2f6651968a3c8840f1af317aa1Andreas Huberstatus_t AwesomePlayer::prepareAsync() { 1720c23f12af0394aa2f6651968a3c8840f1af317aa1Andreas Huber Mutex::Autolock autoLock(mLock); 1721bd22c52280179b29eefac91ef7e7bbbc33d25904Andreas Huber 1722bd22c52280179b29eefac91ef7e7bbbc33d25904Andreas Huber if (mFlags & PREPARING) { 1723bd22c52280179b29eefac91ef7e7bbbc33d25904Andreas Huber return UNKNOWN_ERROR; // async prepare already pending 1724bd22c52280179b29eefac91ef7e7bbbc33d25904Andreas Huber } 1725bd22c52280179b29eefac91ef7e7bbbc33d25904Andreas Huber 1726bd22c52280179b29eefac91ef7e7bbbc33d25904Andreas Huber mIsAsyncPrepare = true; 1727c23f12af0394aa2f6651968a3c8840f1af317aa1Andreas Huber return prepareAsync_l(); 1728c23f12af0394aa2f6651968a3c8840f1af317aa1Andreas Huber} 1729c23f12af0394aa2f6651968a3c8840f1af317aa1Andreas Huber 1730c23f12af0394aa2f6651968a3c8840f1af317aa1Andreas Huberstatus_t AwesomePlayer::prepareAsync_l() { 1731bd22c52280179b29eefac91ef7e7bbbc33d25904Andreas Huber if (mFlags & PREPARING) { 1732bd22c52280179b29eefac91ef7e7bbbc33d25904Andreas Huber return UNKNOWN_ERROR; // async prepare already pending 1733c23f12af0394aa2f6651968a3c8840f1af317aa1Andreas Huber } 1734c23f12af0394aa2f6651968a3c8840f1af317aa1Andreas Huber 17352e8ffaf95bd35358ecd14ddf00cddaf3abefe0a9Andreas Huber if (!mQueueStarted) { 17362e8ffaf95bd35358ecd14ddf00cddaf3abefe0a9Andreas Huber mQueue.start(); 17372e8ffaf95bd35358ecd14ddf00cddaf3abefe0a9Andreas Huber mQueueStarted = true; 17382e8ffaf95bd35358ecd14ddf00cddaf3abefe0a9Andreas Huber } 17392e8ffaf95bd35358ecd14ddf00cddaf3abefe0a9Andreas Huber 1740bd22c52280179b29eefac91ef7e7bbbc33d25904Andreas Huber mFlags |= PREPARING; 1741c23f12af0394aa2f6651968a3c8840f1af317aa1Andreas Huber mAsyncPrepareEvent = new AwesomeEvent( 1742c23f12af0394aa2f6651968a3c8840f1af317aa1Andreas Huber this, &AwesomePlayer::onPrepareAsyncEvent); 1743c23f12af0394aa2f6651968a3c8840f1af317aa1Andreas Huber 1744c23f12af0394aa2f6651968a3c8840f1af317aa1Andreas Huber mQueue.postEvent(mAsyncPrepareEvent); 1745c23f12af0394aa2f6651968a3c8840f1af317aa1Andreas Huber 1746c23f12af0394aa2f6651968a3c8840f1af317aa1Andreas Huber return OK; 1747c23f12af0394aa2f6651968a3c8840f1af317aa1Andreas Huber} 1748c23f12af0394aa2f6651968a3c8840f1af317aa1Andreas Huber 1749bd22c52280179b29eefac91ef7e7bbbc33d25904Andreas Huberstatus_t AwesomePlayer::finishSetDataSource_l() { 1750e94bd14078d327ef2f800e69907efce641a13272Andreas Huber sp<DataSource> dataSource; 1751e94bd14078d327ef2f800e69907efce641a13272Andreas Huber 17528cb0c4168bf4b678e4a6edfcf409247016be20d5Andreas Huber if (!strncasecmp("http://", mUri.string(), 7) 17538cb0c4168bf4b678e4a6edfcf409247016be20d5Andreas Huber || !strncasecmp("https://", mUri.string(), 8)) { 17541156dc913a5ba7b2bc86489468d4914430f03d14Andreas Huber mConnectingDataSource = HTTPBase::Create( 17551156dc913a5ba7b2bc86489468d4914430f03d14Andreas Huber (mFlags & INCOGNITO) 17561156dc913a5ba7b2bc86489468d4914430f03d14Andreas Huber ? HTTPBase::kFlagIncognito 17571156dc913a5ba7b2bc86489468d4914430f03d14Andreas Huber : 0); 1758e94bd14078d327ef2f800e69907efce641a13272Andreas Huber 1759e94bd14078d327ef2f800e69907efce641a13272Andreas Huber mLock.unlock(); 176079f77ef3b0a37660ba8c5bcb2dfbfda3860f2135Andreas Huber status_t err = mConnectingDataSource->connect(mUri, &mUriHeaders); 1761e94bd14078d327ef2f800e69907efce641a13272Andreas Huber mLock.lock(); 1762e94bd14078d327ef2f800e69907efce641a13272Andreas Huber 1763e94bd14078d327ef2f800e69907efce641a13272Andreas Huber if (err != OK) { 1764e94bd14078d327ef2f800e69907efce641a13272Andreas Huber mConnectingDataSource.clear(); 1765e94bd14078d327ef2f800e69907efce641a13272Andreas Huber 1766e94bd14078d327ef2f800e69907efce641a13272Andreas Huber LOGI("mConnectingDataSource->connect() returned %d", err); 1767e94bd14078d327ef2f800e69907efce641a13272Andreas Huber return err; 1768e94bd14078d327ef2f800e69907efce641a13272Andreas Huber } 1769e94bd14078d327ef2f800e69907efce641a13272Andreas Huber 17700a5baa9b411fe086013d2a5e9126ed63fbad046cAndreas Huber#if 0 17710a5baa9b411fe086013d2a5e9126ed63fbad046cAndreas Huber mCachedSource = new NuCachedSource2( 17720a5baa9b411fe086013d2a5e9126ed63fbad046cAndreas Huber new ThrottledSource( 17730a5baa9b411fe086013d2a5e9126ed63fbad046cAndreas Huber mConnectingDataSource, 50 * 1024 /* bytes/sec */)); 17740a5baa9b411fe086013d2a5e9126ed63fbad046cAndreas Huber#else 17750a5baa9b411fe086013d2a5e9126ed63fbad046cAndreas Huber mCachedSource = new NuCachedSource2(mConnectingDataSource); 17760a5baa9b411fe086013d2a5e9126ed63fbad046cAndreas Huber#endif 1777e94bd14078d327ef2f800e69907efce641a13272Andreas Huber mConnectingDataSource.clear(); 17780a5baa9b411fe086013d2a5e9126ed63fbad046cAndreas Huber 17790a5baa9b411fe086013d2a5e9126ed63fbad046cAndreas Huber dataSource = mCachedSource; 1780ac05c317cd818701535c5d72ce90da98c4bae75bAndreas Huber 17816511c9755c3a3360ba869772600c7aae048a7ffcAndreas Huber String8 contentType = dataSource->getMIMEType(); 1782ac05c317cd818701535c5d72ce90da98c4bae75bAndreas Huber 17836511c9755c3a3360ba869772600c7aae048a7ffcAndreas Huber if (strncasecmp(contentType.string(), "audio/", 6)) { 17846511c9755c3a3360ba869772600c7aae048a7ffcAndreas Huber // We're not doing this for streams that appear to be audio-only 17856511c9755c3a3360ba869772600c7aae048a7ffcAndreas Huber // streams to ensure that even low bandwidth streams start 17866511c9755c3a3360ba869772600c7aae048a7ffcAndreas Huber // playing back fairly instantly. 1787ac05c317cd818701535c5d72ce90da98c4bae75bAndreas Huber 17886511c9755c3a3360ba869772600c7aae048a7ffcAndreas Huber // We're going to prefill the cache before trying to instantiate 17896511c9755c3a3360ba869772600c7aae048a7ffcAndreas Huber // the extractor below, as the latter is an operation that otherwise 17906511c9755c3a3360ba869772600c7aae048a7ffcAndreas Huber // could block on the datasource for a significant amount of time. 17916511c9755c3a3360ba869772600c7aae048a7ffcAndreas Huber // During that time we'd be unable to abort the preparation phase 17926511c9755c3a3360ba869772600c7aae048a7ffcAndreas Huber // without this prefill. 17936511c9755c3a3360ba869772600c7aae048a7ffcAndreas Huber 17946511c9755c3a3360ba869772600c7aae048a7ffcAndreas Huber mLock.unlock(); 17956511c9755c3a3360ba869772600c7aae048a7ffcAndreas Huber 17966511c9755c3a3360ba869772600c7aae048a7ffcAndreas Huber for (;;) { 17976511c9755c3a3360ba869772600c7aae048a7ffcAndreas Huber status_t finalStatus; 17986511c9755c3a3360ba869772600c7aae048a7ffcAndreas Huber size_t cachedDataRemaining = 17996511c9755c3a3360ba869772600c7aae048a7ffcAndreas Huber mCachedSource->approxDataRemaining(&finalStatus); 1800ac05c317cd818701535c5d72ce90da98c4bae75bAndreas Huber 18016511c9755c3a3360ba869772600c7aae048a7ffcAndreas Huber if (finalStatus != OK || cachedDataRemaining >= kHighWaterMarkBytes 18026511c9755c3a3360ba869772600c7aae048a7ffcAndreas Huber || (mFlags & PREPARE_CANCELLED)) { 18036511c9755c3a3360ba869772600c7aae048a7ffcAndreas Huber break; 18046511c9755c3a3360ba869772600c7aae048a7ffcAndreas Huber } 18056511c9755c3a3360ba869772600c7aae048a7ffcAndreas Huber 18066511c9755c3a3360ba869772600c7aae048a7ffcAndreas Huber usleep(200000); 1807ac05c317cd818701535c5d72ce90da98c4bae75bAndreas Huber } 1808ac05c317cd818701535c5d72ce90da98c4bae75bAndreas Huber 18096511c9755c3a3360ba869772600c7aae048a7ffcAndreas Huber mLock.lock(); 1810ac05c317cd818701535c5d72ce90da98c4bae75bAndreas Huber } 1811ac05c317cd818701535c5d72ce90da98c4bae75bAndreas Huber 1812ac05c317cd818701535c5d72ce90da98c4bae75bAndreas Huber if (mFlags & PREPARE_CANCELLED) { 1813ac05c317cd818701535c5d72ce90da98c4bae75bAndreas Huber LOGI("Prepare cancelled while waiting for initial cache fill."); 1814ac05c317cd818701535c5d72ce90da98c4bae75bAndreas Huber return UNKNOWN_ERROR; 1815ac05c317cd818701535c5d72ce90da98c4bae75bAndreas Huber } 1816cf7b9c7aae758ac0b99833915053c63c2ac46e09Andreas Huber } else if (!strncasecmp("rtsp://", mUri.string(), 7)) { 1817cf7b9c7aae758ac0b99833915053c63c2ac46e09Andreas Huber if (mLooper == NULL) { 1818cf7b9c7aae758ac0b99833915053c63c2ac46e09Andreas Huber mLooper = new ALooper; 1819a814c1fdc2acf0ed2ee3b175110f6039be7c4873Andreas Huber mLooper->setName("rtsp"); 1820cf7b9c7aae758ac0b99833915053c63c2ac46e09Andreas Huber mLooper->start(); 1821cf7b9c7aae758ac0b99833915053c63c2ac46e09Andreas Huber } 1822cf7b9c7aae758ac0b99833915053c63c2ac46e09Andreas Huber mRTSPController = new ARTSPController(mLooper); 1823f1958f9442bc937e1f8c8d9175901500b944b021Andreas Huber mConnectingRTSPController = mRTSPController; 1824f1958f9442bc937e1f8c8d9175901500b944b021Andreas Huber 1825f1958f9442bc937e1f8c8d9175901500b944b021Andreas Huber mLock.unlock(); 1826cf7b9c7aae758ac0b99833915053c63c2ac46e09Andreas Huber status_t err = mRTSPController->connect(mUri.string()); 1827f1958f9442bc937e1f8c8d9175901500b944b021Andreas Huber mLock.lock(); 1828f1958f9442bc937e1f8c8d9175901500b944b021Andreas Huber 1829f1958f9442bc937e1f8c8d9175901500b944b021Andreas Huber mConnectingRTSPController.clear(); 1830cf7b9c7aae758ac0b99833915053c63c2ac46e09Andreas Huber 1831cf7b9c7aae758ac0b99833915053c63c2ac46e09Andreas Huber LOGI("ARTSPController::connect returned %d", err); 1832cf7b9c7aae758ac0b99833915053c63c2ac46e09Andreas Huber 1833cf7b9c7aae758ac0b99833915053c63c2ac46e09Andreas Huber if (err != OK) { 1834cf7b9c7aae758ac0b99833915053c63c2ac46e09Andreas Huber mRTSPController.clear(); 1835cf7b9c7aae758ac0b99833915053c63c2ac46e09Andreas Huber return err; 1836cf7b9c7aae758ac0b99833915053c63c2ac46e09Andreas Huber } 1837e71d10e7ad55ccbcb0756c007caef1c959090384Andreas Huber 1838cf7b9c7aae758ac0b99833915053c63c2ac46e09Andreas Huber sp<MediaExtractor> extractor = mRTSPController.get(); 1839e71d10e7ad55ccbcb0756c007caef1c959090384Andreas Huber return setDataSource_l(extractor); 1840e94bd14078d327ef2f800e69907efce641a13272Andreas Huber } else { 1841e94bd14078d327ef2f800e69907efce641a13272Andreas Huber dataSource = DataSource::CreateFromURI(mUri.string(), &mUriHeaders); 1842e94bd14078d327ef2f800e69907efce641a13272Andreas Huber } 1843bd22c52280179b29eefac91ef7e7bbbc33d25904Andreas Huber 1844bd22c52280179b29eefac91ef7e7bbbc33d25904Andreas Huber if (dataSource == NULL) { 1845bd22c52280179b29eefac91ef7e7bbbc33d25904Andreas Huber return UNKNOWN_ERROR; 1846bd22c52280179b29eefac91ef7e7bbbc33d25904Andreas Huber } 1847bd22c52280179b29eefac91ef7e7bbbc33d25904Andreas Huber 1848bd22c52280179b29eefac91ef7e7bbbc33d25904Andreas Huber sp<MediaExtractor> extractor = MediaExtractor::Create(dataSource); 1849bd22c52280179b29eefac91ef7e7bbbc33d25904Andreas Huber 1850bd22c52280179b29eefac91ef7e7bbbc33d25904Andreas Huber if (extractor == NULL) { 1851bd22c52280179b29eefac91ef7e7bbbc33d25904Andreas Huber return UNKNOWN_ERROR; 1852bd22c52280179b29eefac91ef7e7bbbc33d25904Andreas Huber } 1853bd22c52280179b29eefac91ef7e7bbbc33d25904Andreas Huber 1854b5ce361d19e69fe156f7188c9ee0f4734b259874Gloria Wang dataSource->getDrmInfo(mDecryptHandle, &mDrmManagerClient); 1855b5ce361d19e69fe156f7188c9ee0f4734b259874Gloria Wang 1856b371426ce4cf2fa6d8c3d1903b61322feb165d35Gloria Wang if (mDecryptHandle != NULL) { 18578f64134f749e4f7861a08a3063450fc714c4651dGloria Wang CHECK(mDrmManagerClient); 18583318523222e31fb4a7fcc345ddb4ec845d30ef96James Dong if (RightsStatus::RIGHTS_VALID != mDecryptHandle->status) { 18597340743ce30766af6334bbd9acf813eb66dd5a60Gloria Wang notifyListener_l(MEDIA_ERROR, MEDIA_ERROR_UNKNOWN, ERROR_DRM_NO_LICENSE); 1860b371426ce4cf2fa6d8c3d1903b61322feb165d35Gloria Wang } 1861dcd25efb46c41c8d24a0a9cf61fb57f84149709eGloria Wang } 1862dcd25efb46c41c8d24a0a9cf61fb57f84149709eGloria Wang 1863bd22c52280179b29eefac91ef7e7bbbc33d25904Andreas Huber return setDataSource_l(extractor); 1864bd22c52280179b29eefac91ef7e7bbbc33d25904Andreas Huber} 1865bd22c52280179b29eefac91ef7e7bbbc33d25904Andreas Huber 186688d8a83de12592635248aa1a3bd6b9ea46108501Andreas Hubervoid AwesomePlayer::abortPrepare(status_t err) { 186788d8a83de12592635248aa1a3bd6b9ea46108501Andreas Huber CHECK(err != OK); 186888d8a83de12592635248aa1a3bd6b9ea46108501Andreas Huber 186988d8a83de12592635248aa1a3bd6b9ea46108501Andreas Huber if (mIsAsyncPrepare) { 187088d8a83de12592635248aa1a3bd6b9ea46108501Andreas Huber notifyListener_l(MEDIA_ERROR, MEDIA_ERROR_UNKNOWN, err); 187188d8a83de12592635248aa1a3bd6b9ea46108501Andreas Huber } 187288d8a83de12592635248aa1a3bd6b9ea46108501Andreas Huber 187388d8a83de12592635248aa1a3bd6b9ea46108501Andreas Huber mPrepareResult = err; 18746a05c9e912aeb8bfe1ef99516def91a177a481b6Andreas Huber mFlags &= ~(PREPARING|PREPARE_CANCELLED|PREPARING_CONNECTED); 187588d8a83de12592635248aa1a3bd6b9ea46108501Andreas Huber mAsyncPrepareEvent = NULL; 187688d8a83de12592635248aa1a3bd6b9ea46108501Andreas Huber mPreparedCondition.broadcast(); 187788d8a83de12592635248aa1a3bd6b9ea46108501Andreas Huber} 187888d8a83de12592635248aa1a3bd6b9ea46108501Andreas Huber 1879e966fb05c7e67a7f5dce65024de60aac83eb6f81Andreas Huber// static 1880e966fb05c7e67a7f5dce65024de60aac83eb6f81Andreas Huberbool AwesomePlayer::ContinuePreparation(void *cookie) { 1881e966fb05c7e67a7f5dce65024de60aac83eb6f81Andreas Huber AwesomePlayer *me = static_cast<AwesomePlayer *>(cookie); 1882e966fb05c7e67a7f5dce65024de60aac83eb6f81Andreas Huber 1883e966fb05c7e67a7f5dce65024de60aac83eb6f81Andreas Huber return (me->mFlags & PREPARE_CANCELLED) == 0; 1884e966fb05c7e67a7f5dce65024de60aac83eb6f81Andreas Huber} 1885e966fb05c7e67a7f5dce65024de60aac83eb6f81Andreas Huber 1886c23f12af0394aa2f6651968a3c8840f1af317aa1Andreas Hubervoid AwesomePlayer::onPrepareAsyncEvent() { 18878650e1960905097f6f1d6aa462ccb1c93c656834Andreas Huber Mutex::Autolock autoLock(mLock); 1888bd22c52280179b29eefac91ef7e7bbbc33d25904Andreas Huber 18898650e1960905097f6f1d6aa462ccb1c93c656834Andreas Huber if (mFlags & PREPARE_CANCELLED) { 18908650e1960905097f6f1d6aa462ccb1c93c656834Andreas Huber LOGI("prepare was cancelled before doing anything"); 18918650e1960905097f6f1d6aa462ccb1c93c656834Andreas Huber abortPrepare(UNKNOWN_ERROR); 18928650e1960905097f6f1d6aa462ccb1c93c656834Andreas Huber return; 18938650e1960905097f6f1d6aa462ccb1c93c656834Andreas Huber } 1894e94bd14078d327ef2f800e69907efce641a13272Andreas Huber 18958650e1960905097f6f1d6aa462ccb1c93c656834Andreas Huber if (mUri.size() > 0) { 18968650e1960905097f6f1d6aa462ccb1c93c656834Andreas Huber status_t err = finishSetDataSource_l(); 1897bd22c52280179b29eefac91ef7e7bbbc33d25904Andreas Huber 18988650e1960905097f6f1d6aa462ccb1c93c656834Andreas Huber if (err != OK) { 18998650e1960905097f6f1d6aa462ccb1c93c656834Andreas Huber abortPrepare(err); 19008650e1960905097f6f1d6aa462ccb1c93c656834Andreas Huber return; 1901bd22c52280179b29eefac91ef7e7bbbc33d25904Andreas Huber } 19028650e1960905097f6f1d6aa462ccb1c93c656834Andreas Huber } 1903bd22c52280179b29eefac91ef7e7bbbc33d25904Andreas Huber 19048650e1960905097f6f1d6aa462ccb1c93c656834Andreas Huber if (mVideoTrack != NULL && mVideoSource == NULL) { 19058650e1960905097f6f1d6aa462ccb1c93c656834Andreas Huber status_t err = initVideoDecoder(); 19061322e7ebc33e8e161fb73cd47e43dd93357608e4Andreas Huber 19078650e1960905097f6f1d6aa462ccb1c93c656834Andreas Huber if (err != OK) { 19088650e1960905097f6f1d6aa462ccb1c93c656834Andreas Huber abortPrepare(err); 19098650e1960905097f6f1d6aa462ccb1c93c656834Andreas Huber return; 19101322e7ebc33e8e161fb73cd47e43dd93357608e4Andreas Huber } 19118650e1960905097f6f1d6aa462ccb1c93c656834Andreas Huber } 19121322e7ebc33e8e161fb73cd47e43dd93357608e4Andreas Huber 19138650e1960905097f6f1d6aa462ccb1c93c656834Andreas Huber if (mAudioTrack != NULL && mAudioSource == NULL) { 19148650e1960905097f6f1d6aa462ccb1c93c656834Andreas Huber status_t err = initAudioDecoder(); 19151322e7ebc33e8e161fb73cd47e43dd93357608e4Andreas Huber 19168650e1960905097f6f1d6aa462ccb1c93c656834Andreas Huber if (err != OK) { 19178650e1960905097f6f1d6aa462ccb1c93c656834Andreas Huber abortPrepare(err); 19188650e1960905097f6f1d6aa462ccb1c93c656834Andreas Huber return; 19191322e7ebc33e8e161fb73cd47e43dd93357608e4Andreas Huber } 1920c23f12af0394aa2f6651968a3c8840f1af317aa1Andreas Huber } 1921c23f12af0394aa2f6651968a3c8840f1af317aa1Andreas Huber 19226a05c9e912aeb8bfe1ef99516def91a177a481b6Andreas Huber mFlags |= PREPARING_CONNECTED; 19236a05c9e912aeb8bfe1ef99516def91a177a481b6Andreas Huber 19248650e1960905097f6f1d6aa462ccb1c93c656834Andreas Huber if (mCachedSource != NULL || mRTSPController != NULL) { 19258650e1960905097f6f1d6aa462ccb1c93c656834Andreas Huber postBufferingEvent_l(); 19268650e1960905097f6f1d6aa462ccb1c93c656834Andreas Huber } else { 19278650e1960905097f6f1d6aa462ccb1c93c656834Andreas Huber finishAsyncPrepare_l(); 19288650e1960905097f6f1d6aa462ccb1c93c656834Andreas Huber } 19298650e1960905097f6f1d6aa462ccb1c93c656834Andreas Huber} 1930c23f12af0394aa2f6651968a3c8840f1af317aa1Andreas Huber 19318650e1960905097f6f1d6aa462ccb1c93c656834Andreas Hubervoid AwesomePlayer::finishAsyncPrepare_l() { 1932bd22c52280179b29eefac91ef7e7bbbc33d25904Andreas Huber if (mIsAsyncPrepare) { 19335daeb129a2c2ba3d14ccd94af283b5f561c783eaAndreas Huber if (mVideoSource == NULL) { 1934bd22c52280179b29eefac91ef7e7bbbc33d25904Andreas Huber notifyListener_l(MEDIA_SET_VIDEO_SIZE, 0, 0); 1935bd22c52280179b29eefac91ef7e7bbbc33d25904Andreas Huber } else { 19365daeb129a2c2ba3d14ccd94af283b5f561c783eaAndreas Huber notifyVideoSize_l(); 1937bd22c52280179b29eefac91ef7e7bbbc33d25904Andreas Huber } 1938c23f12af0394aa2f6651968a3c8840f1af317aa1Andreas Huber 1939bd22c52280179b29eefac91ef7e7bbbc33d25904Andreas Huber notifyListener_l(MEDIA_PREPARED); 1940bd22c52280179b29eefac91ef7e7bbbc33d25904Andreas Huber } 1941c23f12af0394aa2f6651968a3c8840f1af317aa1Andreas Huber 1942bd22c52280179b29eefac91ef7e7bbbc33d25904Andreas Huber mPrepareResult = OK; 19436a05c9e912aeb8bfe1ef99516def91a177a481b6Andreas Huber mFlags &= ~(PREPARING|PREPARE_CANCELLED|PREPARING_CONNECTED); 1944bd22c52280179b29eefac91ef7e7bbbc33d25904Andreas Huber mFlags |= PREPARED; 1945c23f12af0394aa2f6651968a3c8840f1af317aa1Andreas Huber mAsyncPrepareEvent = NULL; 1946bd22c52280179b29eefac91ef7e7bbbc33d25904Andreas Huber mPreparedCondition.broadcast(); 1947c23f12af0394aa2f6651968a3c8840f1af317aa1Andreas Huber} 1948c23f12af0394aa2f6651968a3c8840f1af317aa1Andreas Huber 1949acdd9d0f59c3d8bdc3de80664a609527ec3d21e2Andreas Huberuint32_t AwesomePlayer::flags() const { 1950acdd9d0f59c3d8bdc3de80664a609527ec3d21e2Andreas Huber return mExtractorFlags; 1951acdd9d0f59c3d8bdc3de80664a609527ec3d21e2Andreas Huber} 1952acdd9d0f59c3d8bdc3de80664a609527ec3d21e2Andreas Huber 195384b343f29063fbfa2ee61b2e3d37ba059ca507d4Andreas Hubervoid AwesomePlayer::postAudioEOS(int64_t delayUs) { 1954bd7b7177f88ae6e83bd7bb8bfd9b7018be923931Andreas Huber Mutex::Autolock autoLock(mLock); 195584b343f29063fbfa2ee61b2e3d37ba059ca507d4Andreas Huber postCheckAudioStatusEvent_l(delayUs); 1956ed54ad0f8619ae416b0968ade6248894cbfc4dbaAndreas Huber} 1957ed54ad0f8619ae416b0968ade6248894cbfc4dbaAndreas Huber 1958ed54ad0f8619ae416b0968ade6248894cbfc4dbaAndreas Hubervoid AwesomePlayer::postAudioSeekComplete() { 1959bd7b7177f88ae6e83bd7bb8bfd9b7018be923931Andreas Huber Mutex::Autolock autoLock(mLock); 196084b343f29063fbfa2ee61b2e3d37ba059ca507d4Andreas Huber postCheckAudioStatusEvent_l(0 /* delayUs */); 1961ed54ad0f8619ae416b0968ade6248894cbfc4dbaAndreas Huber} 1962ed54ad0f8619ae416b0968ade6248894cbfc4dbaAndreas Huber 19634f9e47f2c03ce36261c4717cd7e131d7940bb068Gloria Wangstatus_t AwesomePlayer::setParameter(int key, const Parcel &request) { 19647a1e3e81264189e23a1db2b174e1b5a5d4c7d1c3Gloria Wang if (key == KEY_PARAMETER_TIMED_TEXT_TRACK_INDEX) { 19657a1e3e81264189e23a1db2b174e1b5a5d4c7d1c3Gloria Wang return setTimedTextTrackIndex(request.readInt32()); 19667a1e3e81264189e23a1db2b174e1b5a5d4c7d1c3Gloria Wang } 19677a1e3e81264189e23a1db2b174e1b5a5d4c7d1c3Gloria Wang return ERROR_UNSUPPORTED; 19684f9e47f2c03ce36261c4717cd7e131d7940bb068Gloria Wang} 19694f9e47f2c03ce36261c4717cd7e131d7940bb068Gloria Wang 19704f9e47f2c03ce36261c4717cd7e131d7940bb068Gloria Wangstatus_t AwesomePlayer::getParameter(int key, Parcel *reply) { 19714f9e47f2c03ce36261c4717cd7e131d7940bb068Gloria Wang return OK; 19724f9e47f2c03ce36261c4717cd7e131d7940bb068Gloria Wang} 1973bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber} // namespace android 1974