AwesomePlayer.cpp revision eabd34665adc284525fe7337ad5c56a8b92964ef
1bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber/* 2bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber * Copyright (C) 2009 The Android Open Source Project 3bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber * 4bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber * Licensed under the Apache License, Version 2.0 (the "License"); 5bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber * you may not use this file except in compliance with the License. 6bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber * You may obtain a copy of the License at 7bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber * 8bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber * http://www.apache.org/licenses/LICENSE-2.0 9bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber * 10bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber * Unless required by applicable law or agreed to in writing, software 11bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber * distributed under the License is distributed on an "AS IS" BASIS, 12bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber * See the License for the specific language governing permissions and 14bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber * limitations under the License. 15bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber */ 16bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber 17eabd34665adc284525fe7337ad5c56a8b92964efGlenn Kasten#define DEBUG_HDCP 18eabd34665adc284525fe7337ad5c56a8b92964efGlenn Kasten 19bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber//#define LOG_NDEBUG 0 20bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber#define LOG_TAG "AwesomePlayer" 21bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber#include <utils/Log.h> 22bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber 23988e3f0b2c74095deae580157c57935a98573052Andreas Huber#include <dlfcn.h> 24988e3f0b2c74095deae580157c57935a98573052Andreas Huber 25cf7b9c7aae758ac0b99833915053c63c2ac46e09Andreas Huber#include "include/ARTSPController.h" 26bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber#include "include/AwesomePlayer.h" 27733b7729ea462fae9c6899456444e28fef1c757cAndreas Huber#include "include/SoftwareRenderer.h" 280a5baa9b411fe086013d2a5e9126ed63fbad046cAndreas Huber#include "include/NuCachedSource2.h" 290a5baa9b411fe086013d2a5e9126ed63fbad046cAndreas Huber#include "include/ThrottledSource.h" 30bff07d0b22a5ee2d9f044f6cb5e4be1532017ab0Andreas Huber#include "include/MPEG2TSExtractor.h" 31bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber 324844ac54e8b5997c3b03872dbafe8ebed4787517Andreas Huber#include <binder/IPCThreadState.h> 337cf180c9bff69e5cc4a2f4e53b432db45ebbebabGloria Wang#include <binder/IServiceManager.h> 347cf180c9bff69e5cc4a2f4e53b432db45ebbebabGloria Wang#include <media/IMediaPlayerService.h> 35e2b1028852120bcfded33b8f06f66b780437fe92Andreas Huber#include <media/stagefright/foundation/hexdump.h> 36e2b1028852120bcfded33b8f06f66b780437fe92Andreas Huber#include <media/stagefright/foundation/ADebug.h> 37bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber#include <media/stagefright/AudioPlayer.h> 38bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber#include <media/stagefright/DataSource.h> 39bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber#include <media/stagefright/FileSource.h> 40bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber#include <media/stagefright/MediaBuffer.h> 41717826ececd8d39596f62418677721d70776add1Andreas Huber#include <media/stagefright/MediaDefs.h> 42bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber#include <media/stagefright/MediaExtractor.h> 43bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber#include <media/stagefright/MediaSource.h> 44bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber#include <media/stagefright/MetaData.h> 45bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber#include <media/stagefright/OMXCodec.h> 46717826ececd8d39596f62418677721d70776add1Andreas Huber 475daeb129a2c2ba3d14ccd94af283b5f561c783eaAndreas Huber#include <surfaceflinger/Surface.h> 481173118eace0e9e347cb007f0da817cee87579edGlenn Kasten#include <gui/ISurfaceTexture.h> 491173118eace0e9e347cb007f0da817cee87579edGlenn Kasten#include <gui/SurfaceTextureClient.h> 502eb62955eb84b97695e8a7e56e14310cbb86412bGlenn Kasten#include <surfaceflinger/ISurfaceComposer.h> 513cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian 52cf7b9c7aae758ac0b99833915053c63c2ac46e09Andreas Huber#include <media/stagefright/foundation/ALooper.h> 5314acc736e336cbd6026df781d4f411e908831815Andreas Huber#include <media/stagefright/foundation/AMessage.h> 54e71d10e7ad55ccbcb0756c007caef1c959090384Andreas Huber 55eabd34665adc284525fe7337ad5c56a8b92964efGlenn Kasten#include <cutils/properties.h> 56eabd34665adc284525fe7337ad5c56a8b92964efGlenn Kasten 57e332a9181cf6a3155ed1a0fd2afc212ccb1f2753Andreas Huber#define USE_SURFACE_ALLOC 1 5864bb6983690bf994d904591145a3cdd6373bdbe6Andreas Huber#define FRAME_DROP_FREQ 0 59e332a9181cf6a3155ed1a0fd2afc212ccb1f2753Andreas Huber 60bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Hubernamespace android { 61bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber 628650e1960905097f6f1d6aa462ccb1c93c656834Andreas Huberstatic int64_t kLowWaterMarkUs = 2000000ll; // 2secs 638650e1960905097f6f1d6aa462ccb1c93c656834Andreas Huberstatic int64_t kHighWaterMarkUs = 10000000ll; // 10secs 64100a4408968b90e314526185d572c72ea4cc784aAndreas Huberstatic int64_t kHighWaterMarkRTSPUs = 4000000ll; // 4secs 65ac05c317cd818701535c5d72ce90da98c4bae75bAndreas Huberstatic const size_t kLowWaterMarkBytes = 40000; 66ac05c317cd818701535c5d72ce90da98c4bae75bAndreas Huberstatic const size_t kHighWaterMarkBytes = 200000; 678650e1960905097f6f1d6aa462ccb1c93c656834Andreas Huber 68bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huberstruct AwesomeEvent : public TimedEventQueue::Event { 69c23f12af0394aa2f6651968a3c8840f1af317aa1Andreas Huber AwesomeEvent( 70c23f12af0394aa2f6651968a3c8840f1af317aa1Andreas Huber AwesomePlayer *player, 71c23f12af0394aa2f6651968a3c8840f1af317aa1Andreas Huber void (AwesomePlayer::*method)()) 72bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber : mPlayer(player), 73c23f12af0394aa2f6651968a3c8840f1af317aa1Andreas Huber mMethod(method) { 74bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber } 75bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber 76bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huberprotected: 77bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber virtual ~AwesomeEvent() {} 78bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber 79bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber virtual void fire(TimedEventQueue *queue, int64_t /* now_us */) { 80c23f12af0394aa2f6651968a3c8840f1af317aa1Andreas Huber (mPlayer->*mMethod)(); 81bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber } 82bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber 83bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huberprivate: 84bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber AwesomePlayer *mPlayer; 85c23f12af0394aa2f6651968a3c8840f1af317aa1Andreas Huber void (AwesomePlayer::*mMethod)(); 86bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber 87bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber AwesomeEvent(const AwesomeEvent &); 88bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber AwesomeEvent &operator=(const AwesomeEvent &); 89bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber}; 90bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber 91733b7729ea462fae9c6899456444e28fef1c757cAndreas Huberstruct AwesomeLocalRenderer : public AwesomeRenderer { 92733b7729ea462fae9c6899456444e28fef1c757cAndreas Huber AwesomeLocalRenderer( 931173118eace0e9e347cb007f0da817cee87579edGlenn Kasten const sp<ANativeWindow> &nativeWindow, const sp<MetaData> &meta) 941173118eace0e9e347cb007f0da817cee87579edGlenn Kasten : mTarget(new SoftwareRenderer(nativeWindow, meta)) { 95733b7729ea462fae9c6899456444e28fef1c757cAndreas Huber } 96733b7729ea462fae9c6899456444e28fef1c757cAndreas Huber 97733b7729ea462fae9c6899456444e28fef1c757cAndreas Huber virtual void render(MediaBuffer *buffer) { 98fa090f541bb84a546af2ec834e91a032ff10e66eAndreas Huber render((const uint8_t *)buffer->data() + buffer->range_offset(), 99fa090f541bb84a546af2ec834e91a032ff10e66eAndreas Huber buffer->range_length()); 100fa090f541bb84a546af2ec834e91a032ff10e66eAndreas Huber } 101fa090f541bb84a546af2ec834e91a032ff10e66eAndreas Huber 102fa090f541bb84a546af2ec834e91a032ff10e66eAndreas Huber void render(const void *data, size_t size) { 103fa090f541bb84a546af2ec834e91a032ff10e66eAndreas Huber mTarget->render(data, size, NULL); 104733b7729ea462fae9c6899456444e28fef1c757cAndreas Huber } 105733b7729ea462fae9c6899456444e28fef1c757cAndreas Huber 106733b7729ea462fae9c6899456444e28fef1c757cAndreas Huberprotected: 107733b7729ea462fae9c6899456444e28fef1c757cAndreas Huber virtual ~AwesomeLocalRenderer() { 108733b7729ea462fae9c6899456444e28fef1c757cAndreas Huber delete mTarget; 109733b7729ea462fae9c6899456444e28fef1c757cAndreas Huber mTarget = NULL; 110733b7729ea462fae9c6899456444e28fef1c757cAndreas Huber } 111733b7729ea462fae9c6899456444e28fef1c757cAndreas Huber 112733b7729ea462fae9c6899456444e28fef1c757cAndreas Huberprivate: 1130a5ca668c6f7d45706e9aec4a1dfec0aacc6d233Andreas Huber SoftwareRenderer *mTarget; 114988e3f0b2c74095deae580157c57935a98573052Andreas Huber 115733b7729ea462fae9c6899456444e28fef1c757cAndreas Huber AwesomeLocalRenderer(const AwesomeLocalRenderer &); 116733b7729ea462fae9c6899456444e28fef1c757cAndreas Huber AwesomeLocalRenderer &operator=(const AwesomeLocalRenderer &);; 117733b7729ea462fae9c6899456444e28fef1c757cAndreas Huber}; 118733b7729ea462fae9c6899456444e28fef1c757cAndreas Huber 1196a9da9fc558263548ebfbae2cbf177eb7454a41bJamie Gennisstruct AwesomeNativeWindowRenderer : public AwesomeRenderer { 120ba529e486dde15fe75ea1b48570f9d60a4cf3c48Andreas Huber AwesomeNativeWindowRenderer( 121ba529e486dde15fe75ea1b48570f9d60a4cf3c48Andreas Huber const sp<ANativeWindow> &nativeWindow, 122ba529e486dde15fe75ea1b48570f9d60a4cf3c48Andreas Huber int32_t rotationDegrees) 1236a9da9fc558263548ebfbae2cbf177eb7454a41bJamie Gennis : mNativeWindow(nativeWindow) { 124ba529e486dde15fe75ea1b48570f9d60a4cf3c48Andreas Huber applyRotation(rotationDegrees); 1256a9da9fc558263548ebfbae2cbf177eb7454a41bJamie Gennis } 1266a9da9fc558263548ebfbae2cbf177eb7454a41bJamie Gennis 1276a9da9fc558263548ebfbae2cbf177eb7454a41bJamie Gennis virtual void render(MediaBuffer *buffer) { 1286a9da9fc558263548ebfbae2cbf177eb7454a41bJamie Gennis status_t err = mNativeWindow->queueBuffer( 1296a9da9fc558263548ebfbae2cbf177eb7454a41bJamie Gennis mNativeWindow.get(), buffer->graphicBuffer().get()); 1306a9da9fc558263548ebfbae2cbf177eb7454a41bJamie Gennis if (err != 0) { 1316a9da9fc558263548ebfbae2cbf177eb7454a41bJamie Gennis LOGE("queueBuffer failed with error %s (%d)", strerror(-err), 1326a9da9fc558263548ebfbae2cbf177eb7454a41bJamie Gennis -err); 1336a9da9fc558263548ebfbae2cbf177eb7454a41bJamie Gennis return; 1346a9da9fc558263548ebfbae2cbf177eb7454a41bJamie Gennis } 1356a9da9fc558263548ebfbae2cbf177eb7454a41bJamie Gennis 1366a9da9fc558263548ebfbae2cbf177eb7454a41bJamie Gennis sp<MetaData> metaData = buffer->meta_data(); 1376a9da9fc558263548ebfbae2cbf177eb7454a41bJamie Gennis metaData->setInt32(kKeyRendered, 1); 1386a9da9fc558263548ebfbae2cbf177eb7454a41bJamie Gennis } 1396a9da9fc558263548ebfbae2cbf177eb7454a41bJamie Gennis 1406a9da9fc558263548ebfbae2cbf177eb7454a41bJamie Gennisprotected: 1416a9da9fc558263548ebfbae2cbf177eb7454a41bJamie Gennis virtual ~AwesomeNativeWindowRenderer() {} 1426a9da9fc558263548ebfbae2cbf177eb7454a41bJamie Gennis 1436a9da9fc558263548ebfbae2cbf177eb7454a41bJamie Gennisprivate: 1446a9da9fc558263548ebfbae2cbf177eb7454a41bJamie Gennis sp<ANativeWindow> mNativeWindow; 1456a9da9fc558263548ebfbae2cbf177eb7454a41bJamie Gennis 146ba529e486dde15fe75ea1b48570f9d60a4cf3c48Andreas Huber void applyRotation(int32_t rotationDegrees) { 147ba529e486dde15fe75ea1b48570f9d60a4cf3c48Andreas Huber uint32_t transform; 148ba529e486dde15fe75ea1b48570f9d60a4cf3c48Andreas Huber switch (rotationDegrees) { 149ba529e486dde15fe75ea1b48570f9d60a4cf3c48Andreas Huber case 0: transform = 0; break; 150ba529e486dde15fe75ea1b48570f9d60a4cf3c48Andreas Huber case 90: transform = HAL_TRANSFORM_ROT_90; break; 151ba529e486dde15fe75ea1b48570f9d60a4cf3c48Andreas Huber case 180: transform = HAL_TRANSFORM_ROT_180; break; 152ba529e486dde15fe75ea1b48570f9d60a4cf3c48Andreas Huber case 270: transform = HAL_TRANSFORM_ROT_270; break; 153ba529e486dde15fe75ea1b48570f9d60a4cf3c48Andreas Huber default: transform = 0; break; 154ba529e486dde15fe75ea1b48570f9d60a4cf3c48Andreas Huber } 155ba529e486dde15fe75ea1b48570f9d60a4cf3c48Andreas Huber 156ba529e486dde15fe75ea1b48570f9d60a4cf3c48Andreas Huber if (transform) { 157ba529e486dde15fe75ea1b48570f9d60a4cf3c48Andreas Huber CHECK_EQ(0, native_window_set_buffers_transform( 158ba529e486dde15fe75ea1b48570f9d60a4cf3c48Andreas Huber mNativeWindow.get(), transform)); 159ba529e486dde15fe75ea1b48570f9d60a4cf3c48Andreas Huber } 160ba529e486dde15fe75ea1b48570f9d60a4cf3c48Andreas Huber } 161ba529e486dde15fe75ea1b48570f9d60a4cf3c48Andreas Huber 1626a9da9fc558263548ebfbae2cbf177eb7454a41bJamie Gennis AwesomeNativeWindowRenderer(const AwesomeNativeWindowRenderer &); 1636a9da9fc558263548ebfbae2cbf177eb7454a41bJamie Gennis AwesomeNativeWindowRenderer &operator=( 1646a9da9fc558263548ebfbae2cbf177eb7454a41bJamie Gennis const AwesomeNativeWindowRenderer &); 1656a9da9fc558263548ebfbae2cbf177eb7454a41bJamie Gennis}; 1666a9da9fc558263548ebfbae2cbf177eb7454a41bJamie Gennis 1677cf180c9bff69e5cc4a2f4e53b432db45ebbebabGloria Wang// To collect the decoder usage 1687cf180c9bff69e5cc4a2f4e53b432db45ebbebabGloria Wangvoid addBatteryData(uint32_t params) { 1697cf180c9bff69e5cc4a2f4e53b432db45ebbebabGloria Wang sp<IBinder> binder = 1707cf180c9bff69e5cc4a2f4e53b432db45ebbebabGloria Wang defaultServiceManager()->getService(String16("media.player")); 1717cf180c9bff69e5cc4a2f4e53b432db45ebbebabGloria Wang sp<IMediaPlayerService> service = interface_cast<IMediaPlayerService>(binder); 1727cf180c9bff69e5cc4a2f4e53b432db45ebbebabGloria Wang CHECK(service.get() != NULL); 1737cf180c9bff69e5cc4a2f4e53b432db45ebbebabGloria Wang 1747cf180c9bff69e5cc4a2f4e53b432db45ebbebabGloria Wang service->addBatteryData(params); 1757cf180c9bff69e5cc4a2f4e53b432db45ebbebabGloria Wang} 176e2b1028852120bcfded33b8f06f66b780437fe92Andreas Huber 1777cf180c9bff69e5cc4a2f4e53b432db45ebbebabGloria Wang//////////////////////////////////////////////////////////////////////////////// 178bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas HuberAwesomePlayer::AwesomePlayer() 1792e8ffaf95bd35358ecd14ddf00cddaf3abefe0a9Andreas Huber : mQueueStarted(false), 1802e8ffaf95bd35358ecd14ddf00cddaf3abefe0a9Andreas Huber mTimeSource(NULL), 181fa090f541bb84a546af2ec834e91a032ff10e66eAndreas Huber mVideoRendererIsPreview(false), 182bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber mAudioPlayer(NULL), 183b45c01c2b8588ff431b511151666a55a39f0a6aeJames Dong mDisplayWidth(0), 184b45c01c2b8588ff431b511151666a55a39f0a6aeJames Dong mDisplayHeight(0), 185bd22c52280179b29eefac91ef7e7bbbc33d25904Andreas Huber mFlags(0), 186acdd9d0f59c3d8bdc3de80664a609527ec3d21e2Andreas Huber mExtractorFlags(0), 1877b3396acc702451be9bafb19d7fe26d55d43a316Andreas Huber mVideoBuffer(NULL), 188dcd25efb46c41c8d24a0a9cf61fb57f84149709eGloria Wang mDecryptHandle(NULL) { 189e2b1028852120bcfded33b8f06f66b780437fe92Andreas Huber CHECK_EQ(mClient.connect(), (status_t)OK); 190bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber 191bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber DataSource::RegisterDefaultSniffers(); 192bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber 193c23f12af0394aa2f6651968a3c8840f1af317aa1Andreas Huber mVideoEvent = new AwesomeEvent(this, &AwesomePlayer::onVideoEvent); 194bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber mVideoEventPending = false; 195c23f12af0394aa2f6651968a3c8840f1af317aa1Andreas Huber mStreamDoneEvent = new AwesomeEvent(this, &AwesomePlayer::onStreamDone); 196bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber mStreamDoneEventPending = false; 197c23f12af0394aa2f6651968a3c8840f1af317aa1Andreas Huber mBufferingEvent = new AwesomeEvent(this, &AwesomePlayer::onBufferingUpdate); 19866b0a35c9a4136a84c3f73b1b25fcb5220138b95Andreas Huber mBufferingEventPending = false; 199145e68fc778275963189b02a1adcbe27cce4d769Andreas Huber mVideoLagEvent = new AwesomeEvent(this, &AwesomePlayer::onVideoLagUpdate); 200145e68fc778275963189b02a1adcbe27cce4d769Andreas Huber mVideoEventPending = false; 201c23f12af0394aa2f6651968a3c8840f1af317aa1Andreas Huber 202c23f12af0394aa2f6651968a3c8840f1af317aa1Andreas Huber mCheckAudioStatusEvent = new AwesomeEvent( 203c23f12af0394aa2f6651968a3c8840f1af317aa1Andreas Huber this, &AwesomePlayer::onCheckAudioStatus); 204c23f12af0394aa2f6651968a3c8840f1af317aa1Andreas Huber 2051862a33b246249630b654182afb5914da3480d4cAndreas Huber mAudioStatusEventPending = false; 206bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber 207bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber reset(); 208bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber} 209bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber 210bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas HuberAwesomePlayer::~AwesomePlayer() { 2112e8ffaf95bd35358ecd14ddf00cddaf3abefe0a9Andreas Huber if (mQueueStarted) { 2122e8ffaf95bd35358ecd14ddf00cddaf3abefe0a9Andreas Huber mQueue.stop(); 2132e8ffaf95bd35358ecd14ddf00cddaf3abefe0a9Andreas Huber } 214bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber 215bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber reset(); 216bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber 217bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber mClient.disconnect(); 218bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber} 219bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber 22066b0a35c9a4136a84c3f73b1b25fcb5220138b95Andreas Hubervoid AwesomePlayer::cancelPlayerEvents(bool keepBufferingGoing) { 221bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber mQueue.cancelEvent(mVideoEvent->eventID()); 222bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber mVideoEventPending = false; 223bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber mQueue.cancelEvent(mStreamDoneEvent->eventID()); 224bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber mStreamDoneEventPending = false; 2251862a33b246249630b654182afb5914da3480d4cAndreas Huber mQueue.cancelEvent(mCheckAudioStatusEvent->eventID()); 2261862a33b246249630b654182afb5914da3480d4cAndreas Huber mAudioStatusEventPending = false; 227145e68fc778275963189b02a1adcbe27cce4d769Andreas Huber mQueue.cancelEvent(mVideoLagEvent->eventID()); 228145e68fc778275963189b02a1adcbe27cce4d769Andreas Huber mVideoLagEventPending = false; 22966b0a35c9a4136a84c3f73b1b25fcb5220138b95Andreas Huber 23066b0a35c9a4136a84c3f73b1b25fcb5220138b95Andreas Huber if (!keepBufferingGoing) { 23166b0a35c9a4136a84c3f73b1b25fcb5220138b95Andreas Huber mQueue.cancelEvent(mBufferingEvent->eventID()); 23266b0a35c9a4136a84c3f73b1b25fcb5220138b95Andreas Huber mBufferingEventPending = false; 23366b0a35c9a4136a84c3f73b1b25fcb5220138b95Andreas Huber } 234bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber} 235bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber 2360726045216f576e97672ebeefc265d39c4ebaaa5Andreas Hubervoid AwesomePlayer::setListener(const wp<MediaPlayerBase> &listener) { 237bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber Mutex::Autolock autoLock(mLock); 238bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber mListener = listener; 239bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber} 240bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber 2415561ccf4a8db88a2e44eac1b3ed13b4ff53a7f20Andreas Huberstatus_t AwesomePlayer::setDataSource( 2425561ccf4a8db88a2e44eac1b3ed13b4ff53a7f20Andreas Huber const char *uri, const KeyedVector<String8, String8> *headers) { 243bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber Mutex::Autolock autoLock(mLock); 2447b3396acc702451be9bafb19d7fe26d55d43a316Andreas Huber return setDataSource_l(uri, headers); 2457b3396acc702451be9bafb19d7fe26d55d43a316Andreas Huber} 246bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber 2477b3396acc702451be9bafb19d7fe26d55d43a316Andreas Huberstatus_t AwesomePlayer::setDataSource_l( 2487b3396acc702451be9bafb19d7fe26d55d43a316Andreas Huber const char *uri, const KeyedVector<String8, String8> *headers) { 249bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber reset_l(); 250bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber 251bd22c52280179b29eefac91ef7e7bbbc33d25904Andreas Huber mUri = uri; 25266b0a35c9a4136a84c3f73b1b25fcb5220138b95Andreas Huber 253bd22c52280179b29eefac91ef7e7bbbc33d25904Andreas Huber if (headers) { 254bd22c52280179b29eefac91ef7e7bbbc33d25904Andreas Huber mUriHeaders = *headers; 2557314fa17093d514199fedcb55ac41136a1b31cb3Andreas Huber 2567314fa17093d514199fedcb55ac41136a1b31cb3Andreas Huber ssize_t index = mUriHeaders.indexOfKey(String8("x-hide-urls-from-log")); 2577314fa17093d514199fedcb55ac41136a1b31cb3Andreas Huber if (index >= 0) { 2587314fa17093d514199fedcb55ac41136a1b31cb3Andreas Huber // Browser is in "incognito" mode, suppress logging URLs. 2597314fa17093d514199fedcb55ac41136a1b31cb3Andreas Huber 2607314fa17093d514199fedcb55ac41136a1b31cb3Andreas Huber // This isn't something that should be passed to the server. 2617314fa17093d514199fedcb55ac41136a1b31cb3Andreas Huber mUriHeaders.removeItemsAt(index); 2627314fa17093d514199fedcb55ac41136a1b31cb3Andreas Huber 2637314fa17093d514199fedcb55ac41136a1b31cb3Andreas Huber mFlags |= INCOGNITO; 2647314fa17093d514199fedcb55ac41136a1b31cb3Andreas Huber } 2657314fa17093d514199fedcb55ac41136a1b31cb3Andreas Huber } 2667314fa17093d514199fedcb55ac41136a1b31cb3Andreas Huber 2677314fa17093d514199fedcb55ac41136a1b31cb3Andreas Huber if (!(mFlags & INCOGNITO)) { 2687314fa17093d514199fedcb55ac41136a1b31cb3Andreas Huber LOGI("setDataSource_l('%s')", mUri.string()); 2697314fa17093d514199fedcb55ac41136a1b31cb3Andreas Huber } else { 2707314fa17093d514199fedcb55ac41136a1b31cb3Andreas Huber LOGI("setDataSource_l(URL suppressed)"); 27166b0a35c9a4136a84c3f73b1b25fcb5220138b95Andreas Huber } 27266b0a35c9a4136a84c3f73b1b25fcb5220138b95Andreas Huber 273bd22c52280179b29eefac91ef7e7bbbc33d25904Andreas Huber // The actual work will be done during preparation in the call to 274bd22c52280179b29eefac91ef7e7bbbc33d25904Andreas Huber // ::finishSetDataSource_l to avoid blocking the calling thread in 275bd22c52280179b29eefac91ef7e7bbbc33d25904Andreas Huber // setDataSource for any significant time. 27666b0a35c9a4136a84c3f73b1b25fcb5220138b95Andreas Huber 277bd22c52280179b29eefac91ef7e7bbbc33d25904Andreas Huber return OK; 278bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber} 279bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber 280bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huberstatus_t AwesomePlayer::setDataSource( 281bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber int fd, int64_t offset, int64_t length) { 282bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber Mutex::Autolock autoLock(mLock); 283bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber 284bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber reset_l(); 285bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber 2867b3396acc702451be9bafb19d7fe26d55d43a316Andreas Huber sp<DataSource> dataSource = new FileSource(fd, offset, length); 287bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber 2887b3396acc702451be9bafb19d7fe26d55d43a316Andreas Huber status_t err = dataSource->initCheck(); 289bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber 290bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber if (err != OK) { 291bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber return err; 292bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber } 293bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber 2947b3396acc702451be9bafb19d7fe26d55d43a316Andreas Huber mFileSource = dataSource; 2957b3396acc702451be9bafb19d7fe26d55d43a316Andreas Huber 2967b3396acc702451be9bafb19d7fe26d55d43a316Andreas Huber return setDataSource_l(dataSource); 2977b3396acc702451be9bafb19d7fe26d55d43a316Andreas Huber} 2987b3396acc702451be9bafb19d7fe26d55d43a316Andreas Huber 299e2b1028852120bcfded33b8f06f66b780437fe92Andreas Huberstatus_t AwesomePlayer::setDataSource(const sp<IStreamSource> &source) { 30085704836f33a199d7e442a23db82abbd5620d35dAndreas Huber return INVALID_OPERATION; 301e2b1028852120bcfded33b8f06f66b780437fe92Andreas Huber} 302e2b1028852120bcfded33b8f06f66b780437fe92Andreas Huber 3037b3396acc702451be9bafb19d7fe26d55d43a316Andreas Huberstatus_t AwesomePlayer::setDataSource_l( 3047b3396acc702451be9bafb19d7fe26d55d43a316Andreas Huber const sp<DataSource> &dataSource) { 3057b3396acc702451be9bafb19d7fe26d55d43a316Andreas Huber sp<MediaExtractor> extractor = MediaExtractor::Create(dataSource); 306bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber 307bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber if (extractor == NULL) { 308bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber return UNKNOWN_ERROR; 309bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber } 310bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber 311dcd25efb46c41c8d24a0a9cf61fb57f84149709eGloria Wang dataSource->getDrmInfo(&mDecryptHandle, &mDrmManagerClient); 3128f64134f749e4f7861a08a3063450fc714c4651dGloria Wang if (mDecryptHandle != NULL) { 3138f64134f749e4f7861a08a3063450fc714c4651dGloria Wang CHECK(mDrmManagerClient); 3148f64134f749e4f7861a08a3063450fc714c4651dGloria Wang if (RightsStatus::RIGHTS_VALID != mDecryptHandle->status) { 3158f64134f749e4f7861a08a3063450fc714c4651dGloria Wang notifyListener_l(MEDIA_ERROR, MEDIA_ERROR_UNKNOWN, ERROR_NO_LICENSE); 3168f64134f749e4f7861a08a3063450fc714c4651dGloria Wang } 317dcd25efb46c41c8d24a0a9cf61fb57f84149709eGloria Wang } 318dcd25efb46c41c8d24a0a9cf61fb57f84149709eGloria Wang 319bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber return setDataSource_l(extractor); 320bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber} 321bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber 322bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huberstatus_t AwesomePlayer::setDataSource_l(const sp<MediaExtractor> &extractor) { 3237fbdb0903dfbf70b314a74e64e28fb880cdb9247Andreas Huber // Attempt to approximate overall stream bitrate by summing all 3247fbdb0903dfbf70b314a74e64e28fb880cdb9247Andreas Huber // tracks' individual bitrates, if not all of them advertise bitrate, 3257fbdb0903dfbf70b314a74e64e28fb880cdb9247Andreas Huber // we have to fail. 3267fbdb0903dfbf70b314a74e64e28fb880cdb9247Andreas Huber 3277fbdb0903dfbf70b314a74e64e28fb880cdb9247Andreas Huber int64_t totalBitRate = 0; 3287fbdb0903dfbf70b314a74e64e28fb880cdb9247Andreas Huber 3297fbdb0903dfbf70b314a74e64e28fb880cdb9247Andreas Huber for (size_t i = 0; i < extractor->countTracks(); ++i) { 3307fbdb0903dfbf70b314a74e64e28fb880cdb9247Andreas Huber sp<MetaData> meta = extractor->getTrackMetaData(i); 3317fbdb0903dfbf70b314a74e64e28fb880cdb9247Andreas Huber 3327fbdb0903dfbf70b314a74e64e28fb880cdb9247Andreas Huber int32_t bitrate; 3337fbdb0903dfbf70b314a74e64e28fb880cdb9247Andreas Huber if (!meta->findInt32(kKeyBitRate, &bitrate)) { 3347fbdb0903dfbf70b314a74e64e28fb880cdb9247Andreas Huber totalBitRate = -1; 3357fbdb0903dfbf70b314a74e64e28fb880cdb9247Andreas Huber break; 3367fbdb0903dfbf70b314a74e64e28fb880cdb9247Andreas Huber } 3377fbdb0903dfbf70b314a74e64e28fb880cdb9247Andreas Huber 3387fbdb0903dfbf70b314a74e64e28fb880cdb9247Andreas Huber totalBitRate += bitrate; 3397fbdb0903dfbf70b314a74e64e28fb880cdb9247Andreas Huber } 3407fbdb0903dfbf70b314a74e64e28fb880cdb9247Andreas Huber 3417fbdb0903dfbf70b314a74e64e28fb880cdb9247Andreas Huber mBitrate = totalBitRate; 3427fbdb0903dfbf70b314a74e64e28fb880cdb9247Andreas Huber 3437fbdb0903dfbf70b314a74e64e28fb880cdb9247Andreas Huber LOGV("mBitrate = %lld bits/sec", mBitrate); 3447fbdb0903dfbf70b314a74e64e28fb880cdb9247Andreas Huber 345bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber bool haveAudio = false; 346bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber bool haveVideo = false; 347bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber for (size_t i = 0; i < extractor->countTracks(); ++i) { 348bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber sp<MetaData> meta = extractor->getTrackMetaData(i); 349bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber 350bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber const char *mime; 351bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber CHECK(meta->findCString(kKeyMIMEType, &mime)); 352bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber 353bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber if (!haveVideo && !strncasecmp(mime, "video/", 6)) { 35488d8a83de12592635248aa1a3bd6b9ea46108501Andreas Huber setVideoSource(extractor->getTrack(i)); 35588d8a83de12592635248aa1a3bd6b9ea46108501Andreas Huber haveVideo = true; 356b45c01c2b8588ff431b511151666a55a39f0a6aeJames Dong 357b45c01c2b8588ff431b511151666a55a39f0a6aeJames Dong // Set the presentation/display size 358b45c01c2b8588ff431b511151666a55a39f0a6aeJames Dong int32_t displayWidth, displayHeight; 359b45c01c2b8588ff431b511151666a55a39f0a6aeJames Dong bool success = meta->findInt32(kKeyDisplayWidth, &displayWidth); 360b45c01c2b8588ff431b511151666a55a39f0a6aeJames Dong if (success) { 361b45c01c2b8588ff431b511151666a55a39f0a6aeJames Dong success = meta->findInt32(kKeyDisplayHeight, &displayHeight); 362b45c01c2b8588ff431b511151666a55a39f0a6aeJames Dong } 363b45c01c2b8588ff431b511151666a55a39f0a6aeJames Dong if (success) { 364b45c01c2b8588ff431b511151666a55a39f0a6aeJames Dong mDisplayWidth = displayWidth; 365b45c01c2b8588ff431b511151666a55a39f0a6aeJames Dong mDisplayHeight = displayHeight; 366b45c01c2b8588ff431b511151666a55a39f0a6aeJames Dong } 367b45c01c2b8588ff431b511151666a55a39f0a6aeJames Dong 368bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber } else if (!haveAudio && !strncasecmp(mime, "audio/", 6)) { 36988d8a83de12592635248aa1a3bd6b9ea46108501Andreas Huber setAudioSource(extractor->getTrack(i)); 37088d8a83de12592635248aa1a3bd6b9ea46108501Andreas Huber haveAudio = true; 3718ae49d87b98d57d6758b0c51b95e28a6581a79f1Andreas Huber 3726954535ba64374e4e941cd83019a7af53edfb098Andreas Huber if (!strcasecmp(mime, MEDIA_MIMETYPE_AUDIO_VORBIS)) { 3736954535ba64374e4e941cd83019a7af53edfb098Andreas Huber // Only do this for vorbis audio, none of the other audio 3746954535ba64374e4e941cd83019a7af53edfb098Andreas Huber // formats even support this ringtone specific hack and 3756954535ba64374e4e941cd83019a7af53edfb098Andreas Huber // retrieving the metadata on some extractors may turn out 3766954535ba64374e4e941cd83019a7af53edfb098Andreas Huber // to be very expensive. 3776954535ba64374e4e941cd83019a7af53edfb098Andreas Huber sp<MetaData> fileMeta = extractor->getMetaData(); 3786954535ba64374e4e941cd83019a7af53edfb098Andreas Huber int32_t loop; 3796954535ba64374e4e941cd83019a7af53edfb098Andreas Huber if (fileMeta != NULL 3806954535ba64374e4e941cd83019a7af53edfb098Andreas Huber && fileMeta->findInt32(kKeyAutoLoop, &loop) && loop != 0) { 3816954535ba64374e4e941cd83019a7af53edfb098Andreas Huber mFlags |= AUTO_LOOPING; 3826954535ba64374e4e941cd83019a7af53edfb098Andreas Huber } 3838ae49d87b98d57d6758b0c51b95e28a6581a79f1Andreas Huber } 384bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber } 385bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber 386bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber if (haveAudio && haveVideo) { 387bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber break; 388bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber } 389bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber } 390bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber 391acdd9d0f59c3d8bdc3de80664a609527ec3d21e2Andreas Huber if (!haveAudio && !haveVideo) { 392acdd9d0f59c3d8bdc3de80664a609527ec3d21e2Andreas Huber return UNKNOWN_ERROR; 393acdd9d0f59c3d8bdc3de80664a609527ec3d21e2Andreas Huber } 394acdd9d0f59c3d8bdc3de80664a609527ec3d21e2Andreas Huber 395acdd9d0f59c3d8bdc3de80664a609527ec3d21e2Andreas Huber mExtractorFlags = extractor->flags(); 396acdd9d0f59c3d8bdc3de80664a609527ec3d21e2Andreas Huber 397acdd9d0f59c3d8bdc3de80664a609527ec3d21e2Andreas Huber return OK; 398bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber} 399bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber 400bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Hubervoid AwesomePlayer::reset() { 401bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber Mutex::Autolock autoLock(mLock); 402bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber reset_l(); 403bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber} 404bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber 405bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Hubervoid AwesomePlayer::reset_l() { 406b45c01c2b8588ff431b511151666a55a39f0a6aeJames Dong mDisplayWidth = 0; 407b45c01c2b8588ff431b511151666a55a39f0a6aeJames Dong mDisplayHeight = 0; 40865a170e3ac593a29abd0c76e9aa531fabad7f56dAndreas Huber 409dcd25efb46c41c8d24a0a9cf61fb57f84149709eGloria Wang if (mDecryptHandle != NULL) { 410dcd25efb46c41c8d24a0a9cf61fb57f84149709eGloria Wang mDrmManagerClient->setPlaybackStatus(mDecryptHandle, 411dcd25efb46c41c8d24a0a9cf61fb57f84149709eGloria Wang Playback::STOP, 0); 412dcd25efb46c41c8d24a0a9cf61fb57f84149709eGloria Wang mDecryptHandle = NULL; 413dcd25efb46c41c8d24a0a9cf61fb57f84149709eGloria Wang mDrmManagerClient = NULL; 414dcd25efb46c41c8d24a0a9cf61fb57f84149709eGloria Wang } 415dcd25efb46c41c8d24a0a9cf61fb57f84149709eGloria Wang 4167cf180c9bff69e5cc4a2f4e53b432db45ebbebabGloria Wang if (mFlags & PLAYING) { 4177cf180c9bff69e5cc4a2f4e53b432db45ebbebabGloria Wang uint32_t params = IMediaPlayerService::kBatteryDataTrackDecoder; 4187cf180c9bff69e5cc4a2f4e53b432db45ebbebabGloria Wang if ((mAudioSource != NULL) && (mAudioSource != mAudioTrack)) { 4197cf180c9bff69e5cc4a2f4e53b432db45ebbebabGloria Wang params |= IMediaPlayerService::kBatteryDataTrackAudio; 4207cf180c9bff69e5cc4a2f4e53b432db45ebbebabGloria Wang } 4217cf180c9bff69e5cc4a2f4e53b432db45ebbebabGloria Wang if (mVideoSource != NULL) { 4227cf180c9bff69e5cc4a2f4e53b432db45ebbebabGloria Wang params |= IMediaPlayerService::kBatteryDataTrackVideo; 4237cf180c9bff69e5cc4a2f4e53b432db45ebbebabGloria Wang } 4247cf180c9bff69e5cc4a2f4e53b432db45ebbebabGloria Wang addBatteryData(params); 4257cf180c9bff69e5cc4a2f4e53b432db45ebbebabGloria Wang } 4267cf180c9bff69e5cc4a2f4e53b432db45ebbebabGloria Wang 427e94bd14078d327ef2f800e69907efce641a13272Andreas Huber if (mFlags & PREPARING) { 428e94bd14078d327ef2f800e69907efce641a13272Andreas Huber mFlags |= PREPARE_CANCELLED; 429e94bd14078d327ef2f800e69907efce641a13272Andreas Huber if (mConnectingDataSource != NULL) { 430e94bd14078d327ef2f800e69907efce641a13272Andreas Huber LOGI("interrupting the connection process"); 431e94bd14078d327ef2f800e69907efce641a13272Andreas Huber mConnectingDataSource->disconnect(); 432f1958f9442bc937e1f8c8d9175901500b944b021Andreas Huber } else if (mConnectingRTSPController != NULL) { 433f1958f9442bc937e1f8c8d9175901500b944b021Andreas Huber LOGI("interrupting the connection process"); 434f1958f9442bc937e1f8c8d9175901500b944b021Andreas Huber mConnectingRTSPController->disconnect(); 435e94bd14078d327ef2f800e69907efce641a13272Andreas Huber } 4366a05c9e912aeb8bfe1ef99516def91a177a481b6Andreas Huber 4376a05c9e912aeb8bfe1ef99516def91a177a481b6Andreas Huber if (mFlags & PREPARING_CONNECTED) { 4386a05c9e912aeb8bfe1ef99516def91a177a481b6Andreas Huber // We are basically done preparing, we're just buffering 4396a05c9e912aeb8bfe1ef99516def91a177a481b6Andreas Huber // enough data to start playback, we can safely interrupt that. 4406a05c9e912aeb8bfe1ef99516def91a177a481b6Andreas Huber finishAsyncPrepare_l(); 4416a05c9e912aeb8bfe1ef99516def91a177a481b6Andreas Huber } 442e94bd14078d327ef2f800e69907efce641a13272Andreas Huber } 443e94bd14078d327ef2f800e69907efce641a13272Andreas Huber 444bd22c52280179b29eefac91ef7e7bbbc33d25904Andreas Huber while (mFlags & PREPARING) { 445bd22c52280179b29eefac91ef7e7bbbc33d25904Andreas Huber mPreparedCondition.wait(mLock); 446bd22c52280179b29eefac91ef7e7bbbc33d25904Andreas Huber } 447bd22c52280179b29eefac91ef7e7bbbc33d25904Andreas Huber 448bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber cancelPlayerEvents(); 449bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber 4500a5baa9b411fe086013d2a5e9126ed63fbad046cAndreas Huber mCachedSource.clear(); 45188d8a83de12592635248aa1a3bd6b9ea46108501Andreas Huber mAudioTrack.clear(); 45288d8a83de12592635248aa1a3bd6b9ea46108501Andreas Huber mVideoTrack.clear(); 45388d8a83de12592635248aa1a3bd6b9ea46108501Andreas Huber 4547b3396acc702451be9bafb19d7fe26d55d43a316Andreas Huber // Shutdown audio first, so that the respone to the reset request 4557b3396acc702451be9bafb19d7fe26d55d43a316Andreas Huber // appears to happen instantaneously as far as the user is concerned 4567b3396acc702451be9bafb19d7fe26d55d43a316Andreas Huber // If we did this later, audio would continue playing while we 4577b3396acc702451be9bafb19d7fe26d55d43a316Andreas Huber // shutdown the video-related resources and the player appear to 4587b3396acc702451be9bafb19d7fe26d55d43a316Andreas Huber // not be as responsive to a reset request. 459e94bd14078d327ef2f800e69907efce641a13272Andreas Huber if (mAudioPlayer == NULL && mAudioSource != NULL) { 460e94bd14078d327ef2f800e69907efce641a13272Andreas Huber // If we had an audio player, it would have effectively 461e94bd14078d327ef2f800e69907efce641a13272Andreas Huber // taken possession of the audio source and stopped it when 462e94bd14078d327ef2f800e69907efce641a13272Andreas Huber // _it_ is stopped. Otherwise this is still our responsibility. 463e94bd14078d327ef2f800e69907efce641a13272Andreas Huber mAudioSource->stop(); 464e94bd14078d327ef2f800e69907efce641a13272Andreas Huber } 4657b3396acc702451be9bafb19d7fe26d55d43a316Andreas Huber mAudioSource.clear(); 4667b3396acc702451be9bafb19d7fe26d55d43a316Andreas Huber 4677b3396acc702451be9bafb19d7fe26d55d43a316Andreas Huber mTimeSource = NULL; 4687b3396acc702451be9bafb19d7fe26d55d43a316Andreas Huber 4697b3396acc702451be9bafb19d7fe26d55d43a316Andreas Huber delete mAudioPlayer; 4707b3396acc702451be9bafb19d7fe26d55d43a316Andreas Huber mAudioPlayer = NULL; 4717b3396acc702451be9bafb19d7fe26d55d43a316Andreas Huber 472b9280d5c2313c41eb490f58198c4e59118e0e3e6Andreas Huber mVideoRenderer.clear(); 473b9280d5c2313c41eb490f58198c4e59118e0e3e6Andreas Huber 474bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber if (mVideoBuffer) { 475bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber mVideoBuffer->release(); 476bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber mVideoBuffer = NULL; 477bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber } 478bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber 479cce326fe43411855aca2f719e505b051bc4b61b3Andreas Huber if (mRTSPController != NULL) { 480cce326fe43411855aca2f719e505b051bc4b61b3Andreas Huber mRTSPController->disconnect(); 481cce326fe43411855aca2f719e505b051bc4b61b3Andreas Huber mRTSPController.clear(); 482cce326fe43411855aca2f719e505b051bc4b61b3Andreas Huber } 483cce326fe43411855aca2f719e505b051bc4b61b3Andreas Huber 484bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber if (mVideoSource != NULL) { 485bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber mVideoSource->stop(); 48669f5f4c021ee55055df39718244c036faf2d3382Andreas Huber 48769f5f4c021ee55055df39718244c036faf2d3382Andreas Huber // The following hack is necessary to ensure that the OMX 48869f5f4c021ee55055df39718244c036faf2d3382Andreas Huber // component is completely released by the time we may try 48969f5f4c021ee55055df39718244c036faf2d3382Andreas Huber // to instantiate it again. 49069f5f4c021ee55055df39718244c036faf2d3382Andreas Huber wp<MediaSource> tmp = mVideoSource; 491bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber mVideoSource.clear(); 49269f5f4c021ee55055df39718244c036faf2d3382Andreas Huber while (tmp.promote() != NULL) { 49369f5f4c021ee55055df39718244c036faf2d3382Andreas Huber usleep(1000); 49469f5f4c021ee55055df39718244c036faf2d3382Andreas Huber } 49569f5f4c021ee55055df39718244c036faf2d3382Andreas Huber IPCThreadState::self()->flushCommands(); 496bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber } 497bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber 498bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber mDurationUs = -1; 499bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber mFlags = 0; 500acdd9d0f59c3d8bdc3de80664a609527ec3d21e2Andreas Huber mExtractorFlags = 0; 501bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber mTimeSourceDeltaUs = 0; 502bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber mVideoTimeUs = 0; 503bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber 50464bb6983690bf994d904591145a3cdd6373bdbe6Andreas Huber mSeeking = NO_SEEK; 5051321fdd94d354431b930735e9f38f32ecd189a2dAndreas Huber mSeekNotificationSent = false; 506bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber mSeekTimeUs = 0; 50766b0a35c9a4136a84c3f73b1b25fcb5220138b95Andreas Huber 508bd22c52280179b29eefac91ef7e7bbbc33d25904Andreas Huber mUri.setTo(""); 509bd22c52280179b29eefac91ef7e7bbbc33d25904Andreas Huber mUriHeaders.clear(); 5107b3396acc702451be9bafb19d7fe26d55d43a316Andreas Huber 5117b3396acc702451be9bafb19d7fe26d55d43a316Andreas Huber mFileSource.clear(); 5127b3396acc702451be9bafb19d7fe26d55d43a316Andreas Huber 5137fbdb0903dfbf70b314a74e64e28fb880cdb9247Andreas Huber mBitrate = -1; 514bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber} 515bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber 516c23f12af0394aa2f6651968a3c8840f1af317aa1Andreas Hubervoid AwesomePlayer::notifyListener_l(int msg, int ext1, int ext2) { 5170726045216f576e97672ebeefc265d39c4ebaaa5Andreas Huber if (mListener != NULL) { 5180726045216f576e97672ebeefc265d39c4ebaaa5Andreas Huber sp<MediaPlayerBase> listener = mListener.promote(); 5190726045216f576e97672ebeefc265d39c4ebaaa5Andreas Huber 5200726045216f576e97672ebeefc265d39c4ebaaa5Andreas Huber if (listener != NULL) { 521c23f12af0394aa2f6651968a3c8840f1af317aa1Andreas Huber listener->sendEvent(msg, ext1, ext2); 52266b0a35c9a4136a84c3f73b1b25fcb5220138b95Andreas Huber } 52366b0a35c9a4136a84c3f73b1b25fcb5220138b95Andreas Huber } 52466b0a35c9a4136a84c3f73b1b25fcb5220138b95Andreas Huber} 52566b0a35c9a4136a84c3f73b1b25fcb5220138b95Andreas Huber 5267fbdb0903dfbf70b314a74e64e28fb880cdb9247Andreas Huberbool AwesomePlayer::getBitrate(int64_t *bitrate) { 527c7fc37a3dab9bd1f96713649f351b5990e6316ffJames Dong off64_t size; 5287fbdb0903dfbf70b314a74e64e28fb880cdb9247Andreas Huber if (mDurationUs >= 0 && mCachedSource != NULL 5297fbdb0903dfbf70b314a74e64e28fb880cdb9247Andreas Huber && mCachedSource->getSize(&size) == OK) { 5307fbdb0903dfbf70b314a74e64e28fb880cdb9247Andreas Huber *bitrate = size * 8000000ll / mDurationUs; // in bits/sec 5317fbdb0903dfbf70b314a74e64e28fb880cdb9247Andreas Huber return true; 5327fbdb0903dfbf70b314a74e64e28fb880cdb9247Andreas Huber } 5337fbdb0903dfbf70b314a74e64e28fb880cdb9247Andreas Huber 5347fbdb0903dfbf70b314a74e64e28fb880cdb9247Andreas Huber if (mBitrate >= 0) { 5357fbdb0903dfbf70b314a74e64e28fb880cdb9247Andreas Huber *bitrate = mBitrate; 5367fbdb0903dfbf70b314a74e64e28fb880cdb9247Andreas Huber return true; 5377fbdb0903dfbf70b314a74e64e28fb880cdb9247Andreas Huber } 5387fbdb0903dfbf70b314a74e64e28fb880cdb9247Andreas Huber 5397fbdb0903dfbf70b314a74e64e28fb880cdb9247Andreas Huber *bitrate = 0; 5407fbdb0903dfbf70b314a74e64e28fb880cdb9247Andreas Huber 5417fbdb0903dfbf70b314a74e64e28fb880cdb9247Andreas Huber return false; 5427fbdb0903dfbf70b314a74e64e28fb880cdb9247Andreas Huber} 5437fbdb0903dfbf70b314a74e64e28fb880cdb9247Andreas Huber 5448650e1960905097f6f1d6aa462ccb1c93c656834Andreas Huber// Returns true iff cached duration is available/applicable. 5458650e1960905097f6f1d6aa462ccb1c93c656834Andreas Huberbool AwesomePlayer::getCachedDuration_l(int64_t *durationUs, bool *eos) { 5467fbdb0903dfbf70b314a74e64e28fb880cdb9247Andreas Huber int64_t bitrate; 5478650e1960905097f6f1d6aa462ccb1c93c656834Andreas Huber 5488650e1960905097f6f1d6aa462ccb1c93c656834Andreas Huber if (mRTSPController != NULL) { 5498650e1960905097f6f1d6aa462ccb1c93c656834Andreas Huber *durationUs = mRTSPController->getQueueDurationUs(eos); 5508650e1960905097f6f1d6aa462ccb1c93c656834Andreas Huber return true; 5517fbdb0903dfbf70b314a74e64e28fb880cdb9247Andreas Huber } else if (mCachedSource != NULL && getBitrate(&bitrate)) { 5521bd233ce7e1aa7730bc18d46ffd57791391738cdBryan Mawhinney status_t finalStatus; 5531bd233ce7e1aa7730bc18d46ffd57791391738cdBryan Mawhinney size_t cachedDataRemaining = mCachedSource->approxDataRemaining(&finalStatus); 5548650e1960905097f6f1d6aa462ccb1c93c656834Andreas Huber *durationUs = cachedDataRemaining * 8000000ll / bitrate; 5551bd233ce7e1aa7730bc18d46ffd57791391738cdBryan Mawhinney *eos = (finalStatus != OK); 5568650e1960905097f6f1d6aa462ccb1c93c656834Andreas Huber return true; 5578650e1960905097f6f1d6aa462ccb1c93c656834Andreas Huber } 5588650e1960905097f6f1d6aa462ccb1c93c656834Andreas Huber 5598650e1960905097f6f1d6aa462ccb1c93c656834Andreas Huber return false; 5608650e1960905097f6f1d6aa462ccb1c93c656834Andreas Huber} 5618650e1960905097f6f1d6aa462ccb1c93c656834Andreas Huber 56234ef0f32c8fc0186236a27e07405328cc1f7c56dAndreas Hubervoid AwesomePlayer::ensureCacheIsFetching_l() { 56334ef0f32c8fc0186236a27e07405328cc1f7c56dAndreas Huber if (mCachedSource != NULL) { 56434ef0f32c8fc0186236a27e07405328cc1f7c56dAndreas Huber mCachedSource->resumeFetchingIfNecessary(); 56534ef0f32c8fc0186236a27e07405328cc1f7c56dAndreas Huber } 56634ef0f32c8fc0186236a27e07405328cc1f7c56dAndreas Huber} 56734ef0f32c8fc0186236a27e07405328cc1f7c56dAndreas Huber 568145e68fc778275963189b02a1adcbe27cce4d769Andreas Hubervoid AwesomePlayer::onVideoLagUpdate() { 569145e68fc778275963189b02a1adcbe27cce4d769Andreas Huber Mutex::Autolock autoLock(mLock); 570145e68fc778275963189b02a1adcbe27cce4d769Andreas Huber if (!mVideoLagEventPending) { 571145e68fc778275963189b02a1adcbe27cce4d769Andreas Huber return; 572145e68fc778275963189b02a1adcbe27cce4d769Andreas Huber } 573145e68fc778275963189b02a1adcbe27cce4d769Andreas Huber mVideoLagEventPending = false; 574145e68fc778275963189b02a1adcbe27cce4d769Andreas Huber 575145e68fc778275963189b02a1adcbe27cce4d769Andreas Huber int64_t audioTimeUs = mAudioPlayer->getMediaTimeUs(); 576145e68fc778275963189b02a1adcbe27cce4d769Andreas Huber int64_t videoLateByUs = audioTimeUs - mVideoTimeUs; 577145e68fc778275963189b02a1adcbe27cce4d769Andreas Huber 578145e68fc778275963189b02a1adcbe27cce4d769Andreas Huber if (videoLateByUs > 300000ll) { 579145e68fc778275963189b02a1adcbe27cce4d769Andreas Huber LOGV("video late by %lld ms.", videoLateByUs / 1000ll); 580145e68fc778275963189b02a1adcbe27cce4d769Andreas Huber 581145e68fc778275963189b02a1adcbe27cce4d769Andreas Huber notifyListener_l( 582145e68fc778275963189b02a1adcbe27cce4d769Andreas Huber MEDIA_INFO, 583145e68fc778275963189b02a1adcbe27cce4d769Andreas Huber MEDIA_INFO_VIDEO_TRACK_LAGGING, 584145e68fc778275963189b02a1adcbe27cce4d769Andreas Huber videoLateByUs / 1000ll); 585145e68fc778275963189b02a1adcbe27cce4d769Andreas Huber } 586145e68fc778275963189b02a1adcbe27cce4d769Andreas Huber 587145e68fc778275963189b02a1adcbe27cce4d769Andreas Huber postVideoLagEvent_l(); 588145e68fc778275963189b02a1adcbe27cce4d769Andreas Huber} 589145e68fc778275963189b02a1adcbe27cce4d769Andreas Huber 59066b0a35c9a4136a84c3f73b1b25fcb5220138b95Andreas Hubervoid AwesomePlayer::onBufferingUpdate() { 59166b0a35c9a4136a84c3f73b1b25fcb5220138b95Andreas Huber Mutex::Autolock autoLock(mLock); 592d29345dfa29cdcc650f3705e43950ef2500f6728Andreas Huber if (!mBufferingEventPending) { 593d29345dfa29cdcc650f3705e43950ef2500f6728Andreas Huber return; 594d29345dfa29cdcc650f3705e43950ef2500f6728Andreas Huber } 59566b0a35c9a4136a84c3f73b1b25fcb5220138b95Andreas Huber mBufferingEventPending = false; 59666b0a35c9a4136a84c3f73b1b25fcb5220138b95Andreas Huber 5978650e1960905097f6f1d6aa462ccb1c93c656834Andreas Huber if (mCachedSource != NULL) { 5981bd233ce7e1aa7730bc18d46ffd57791391738cdBryan Mawhinney status_t finalStatus; 5991bd233ce7e1aa7730bc18d46ffd57791391738cdBryan Mawhinney size_t cachedDataRemaining = mCachedSource->approxDataRemaining(&finalStatus); 6001bd233ce7e1aa7730bc18d46ffd57791391738cdBryan Mawhinney bool eos = (finalStatus != OK); 601c9e894872c298b25fe9d74e68aa1e7287a541ac3Andreas Huber 6028650e1960905097f6f1d6aa462ccb1c93c656834Andreas Huber if (eos) { 6031bd233ce7e1aa7730bc18d46ffd57791391738cdBryan Mawhinney if (finalStatus == ERROR_END_OF_STREAM) { 6041bd233ce7e1aa7730bc18d46ffd57791391738cdBryan Mawhinney notifyListener_l(MEDIA_BUFFERING_UPDATE, 100); 6051bd233ce7e1aa7730bc18d46ffd57791391738cdBryan Mawhinney } 60683977eb230d829cfe520f55d7977037a904ce548Andreas Huber if (mFlags & PREPARING) { 60783977eb230d829cfe520f55d7977037a904ce548Andreas Huber LOGV("cache has reached EOS, prepare is done."); 60883977eb230d829cfe520f55d7977037a904ce548Andreas Huber finishAsyncPrepare_l(); 60983977eb230d829cfe520f55d7977037a904ce548Andreas Huber } 6108650e1960905097f6f1d6aa462ccb1c93c656834Andreas Huber } else { 6117fbdb0903dfbf70b314a74e64e28fb880cdb9247Andreas Huber int64_t bitrate; 6127fbdb0903dfbf70b314a74e64e28fb880cdb9247Andreas Huber if (getBitrate(&bitrate)) { 6138650e1960905097f6f1d6aa462ccb1c93c656834Andreas Huber size_t cachedSize = mCachedSource->cachedSize(); 6148650e1960905097f6f1d6aa462ccb1c93c656834Andreas Huber int64_t cachedDurationUs = cachedSize * 8000000ll / bitrate; 615c9e894872c298b25fe9d74e68aa1e7287a541ac3Andreas Huber 6168650e1960905097f6f1d6aa462ccb1c93c656834Andreas Huber int percentage = 100.0 * (double)cachedDurationUs / mDurationUs; 6178650e1960905097f6f1d6aa462ccb1c93c656834Andreas Huber if (percentage > 100) { 6188650e1960905097f6f1d6aa462ccb1c93c656834Andreas Huber percentage = 100; 6198650e1960905097f6f1d6aa462ccb1c93c656834Andreas Huber } 620c9e894872c298b25fe9d74e68aa1e7287a541ac3Andreas Huber 6218650e1960905097f6f1d6aa462ccb1c93c656834Andreas Huber notifyListener_l(MEDIA_BUFFERING_UPDATE, percentage); 6228650e1960905097f6f1d6aa462ccb1c93c656834Andreas Huber } else { 6238650e1960905097f6f1d6aa462ccb1c93c656834Andreas Huber // We don't know the bitrate of the stream, use absolute size 6248650e1960905097f6f1d6aa462ccb1c93c656834Andreas Huber // limits to maintain the cache. 6258650e1960905097f6f1d6aa462ccb1c93c656834Andreas Huber 6268650e1960905097f6f1d6aa462ccb1c93c656834Andreas Huber if ((mFlags & PLAYING) && !eos 6278650e1960905097f6f1d6aa462ccb1c93c656834Andreas Huber && (cachedDataRemaining < kLowWaterMarkBytes)) { 6288650e1960905097f6f1d6aa462ccb1c93c656834Andreas Huber LOGI("cache is running low (< %d) , pausing.", 6298650e1960905097f6f1d6aa462ccb1c93c656834Andreas Huber kLowWaterMarkBytes); 6308650e1960905097f6f1d6aa462ccb1c93c656834Andreas Huber mFlags |= CACHE_UNDERRUN; 6318650e1960905097f6f1d6aa462ccb1c93c656834Andreas Huber pause_l(); 63234ef0f32c8fc0186236a27e07405328cc1f7c56dAndreas Huber ensureCacheIsFetching_l(); 6338650e1960905097f6f1d6aa462ccb1c93c656834Andreas Huber notifyListener_l(MEDIA_INFO, MEDIA_INFO_BUFFERING_START); 6348650e1960905097f6f1d6aa462ccb1c93c656834Andreas Huber } else if (eos || cachedDataRemaining > kHighWaterMarkBytes) { 6358650e1960905097f6f1d6aa462ccb1c93c656834Andreas Huber if (mFlags & CACHE_UNDERRUN) { 6368650e1960905097f6f1d6aa462ccb1c93c656834Andreas Huber LOGI("cache has filled up (> %d), resuming.", 6378650e1960905097f6f1d6aa462ccb1c93c656834Andreas Huber kHighWaterMarkBytes); 6388650e1960905097f6f1d6aa462ccb1c93c656834Andreas Huber mFlags &= ~CACHE_UNDERRUN; 6398650e1960905097f6f1d6aa462ccb1c93c656834Andreas Huber play_l(); 6408650e1960905097f6f1d6aa462ccb1c93c656834Andreas Huber notifyListener_l(MEDIA_INFO, MEDIA_INFO_BUFFERING_END); 6418650e1960905097f6f1d6aa462ccb1c93c656834Andreas Huber } else if (mFlags & PREPARING) { 6428650e1960905097f6f1d6aa462ccb1c93c656834Andreas Huber LOGV("cache has filled up (> %d), prepare is done", 6438650e1960905097f6f1d6aa462ccb1c93c656834Andreas Huber kHighWaterMarkBytes); 6448650e1960905097f6f1d6aa462ccb1c93c656834Andreas Huber finishAsyncPrepare_l(); 6458650e1960905097f6f1d6aa462ccb1c93c656834Andreas Huber } 6468650e1960905097f6f1d6aa462ccb1c93c656834Andreas Huber } 6478650e1960905097f6f1d6aa462ccb1c93c656834Andreas Huber } 6488650e1960905097f6f1d6aa462ccb1c93c656834Andreas Huber } 6492415ecb5bb4e1459024f6d6c8ae2d6e3dc4fbdc7Andreas Huber } 6502415ecb5bb4e1459024f6d6c8ae2d6e3dc4fbdc7Andreas Huber 6518650e1960905097f6f1d6aa462ccb1c93c656834Andreas Huber int64_t cachedDurationUs; 6522a4b49bd3863024884a694b454e2e452752e6ea0Andreas Huber bool eos; 6538650e1960905097f6f1d6aa462ccb1c93c656834Andreas Huber if (getCachedDuration_l(&cachedDurationUs, &eos)) { 65434ef0f32c8fc0186236a27e07405328cc1f7c56dAndreas Huber LOGV("cachedDurationUs = %.2f secs, eos=%d", 65534ef0f32c8fc0186236a27e07405328cc1f7c56dAndreas Huber cachedDurationUs / 1E6, eos); 65634ef0f32c8fc0186236a27e07405328cc1f7c56dAndreas Huber 657100a4408968b90e314526185d572c72ea4cc784aAndreas Huber int64_t highWaterMarkUs = 658100a4408968b90e314526185d572c72ea4cc784aAndreas Huber (mRTSPController != NULL) ? kHighWaterMarkRTSPUs : kHighWaterMarkUs; 659100a4408968b90e314526185d572c72ea4cc784aAndreas Huber 6608650e1960905097f6f1d6aa462ccb1c93c656834Andreas Huber if ((mFlags & PLAYING) && !eos 6618650e1960905097f6f1d6aa462ccb1c93c656834Andreas Huber && (cachedDurationUs < kLowWaterMarkUs)) { 6628650e1960905097f6f1d6aa462ccb1c93c656834Andreas Huber LOGI("cache is running low (%.2f secs) , pausing.", 6638650e1960905097f6f1d6aa462ccb1c93c656834Andreas Huber cachedDurationUs / 1E6); 6648650e1960905097f6f1d6aa462ccb1c93c656834Andreas Huber mFlags |= CACHE_UNDERRUN; 6658650e1960905097f6f1d6aa462ccb1c93c656834Andreas Huber pause_l(); 66634ef0f32c8fc0186236a27e07405328cc1f7c56dAndreas Huber ensureCacheIsFetching_l(); 6678650e1960905097f6f1d6aa462ccb1c93c656834Andreas Huber notifyListener_l(MEDIA_INFO, MEDIA_INFO_BUFFERING_START); 668100a4408968b90e314526185d572c72ea4cc784aAndreas Huber } else if (eos || cachedDurationUs > highWaterMarkUs) { 6698650e1960905097f6f1d6aa462ccb1c93c656834Andreas Huber if (mFlags & CACHE_UNDERRUN) { 6708650e1960905097f6f1d6aa462ccb1c93c656834Andreas Huber LOGI("cache has filled up (%.2f secs), resuming.", 6718650e1960905097f6f1d6aa462ccb1c93c656834Andreas Huber cachedDurationUs / 1E6); 6728650e1960905097f6f1d6aa462ccb1c93c656834Andreas Huber mFlags &= ~CACHE_UNDERRUN; 6738650e1960905097f6f1d6aa462ccb1c93c656834Andreas Huber play_l(); 6748650e1960905097f6f1d6aa462ccb1c93c656834Andreas Huber notifyListener_l(MEDIA_INFO, MEDIA_INFO_BUFFERING_END); 6758650e1960905097f6f1d6aa462ccb1c93c656834Andreas Huber } else if (mFlags & PREPARING) { 6768650e1960905097f6f1d6aa462ccb1c93c656834Andreas Huber LOGV("cache has filled up (%.2f secs), prepare is done", 6778650e1960905097f6f1d6aa462ccb1c93c656834Andreas Huber cachedDurationUs / 1E6); 6788650e1960905097f6f1d6aa462ccb1c93c656834Andreas Huber finishAsyncPrepare_l(); 6792a4b49bd3863024884a694b454e2e452752e6ea0Andreas Huber } 6802a4b49bd3863024884a694b454e2e452752e6ea0Andreas Huber } 6810a5baa9b411fe086013d2a5e9126ed63fbad046cAndreas Huber } 6820a5baa9b411fe086013d2a5e9126ed63fbad046cAndreas Huber 6830a5baa9b411fe086013d2a5e9126ed63fbad046cAndreas Huber postBufferingEvent_l(); 6840726045216f576e97672ebeefc265d39c4ebaaa5Andreas Huber} 6850726045216f576e97672ebeefc265d39c4ebaaa5Andreas Huber 686bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Hubervoid AwesomePlayer::onStreamDone() { 687bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber // Posted whenever any stream finishes playing. 688bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber 689bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber Mutex::Autolock autoLock(mLock); 690d29345dfa29cdcc650f3705e43950ef2500f6728Andreas Huber if (!mStreamDoneEventPending) { 691d29345dfa29cdcc650f3705e43950ef2500f6728Andreas Huber return; 692d29345dfa29cdcc650f3705e43950ef2500f6728Andreas Huber } 693bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber mStreamDoneEventPending = false; 694bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber 695ed8d14f6a934072cd012992c4ef16990a54baa9aAndreas Huber if (mStreamDoneStatus != ERROR_END_OF_STREAM) { 6965d2de4da54504836e4b772b3010ac28c19f667f0Andreas Huber LOGV("MEDIA_ERROR %d", mStreamDoneStatus); 6975d2de4da54504836e4b772b3010ac28c19f667f0Andreas Huber 6985d2de4da54504836e4b772b3010ac28c19f667f0Andreas Huber notifyListener_l( 6995d2de4da54504836e4b772b3010ac28c19f667f0Andreas Huber MEDIA_ERROR, MEDIA_ERROR_UNKNOWN, mStreamDoneStatus); 7005d2de4da54504836e4b772b3010ac28c19f667f0Andreas Huber 701b2e3954c94717e43b3dc9b880564f166cfbbc0a2Andreas Huber pause_l(true /* at eos */); 7025d2de4da54504836e4b772b3010ac28c19f667f0Andreas Huber 7035d2de4da54504836e4b772b3010ac28c19f667f0Andreas Huber mFlags |= AT_EOS; 7045d2de4da54504836e4b772b3010ac28c19f667f0Andreas Huber return; 7055d2de4da54504836e4b772b3010ac28c19f667f0Andreas Huber } 7065d2de4da54504836e4b772b3010ac28c19f667f0Andreas Huber 7075d2de4da54504836e4b772b3010ac28c19f667f0Andreas Huber const bool allDone = 7085d2de4da54504836e4b772b3010ac28c19f667f0Andreas Huber (mVideoSource == NULL || (mFlags & VIDEO_AT_EOS)) 7095d2de4da54504836e4b772b3010ac28c19f667f0Andreas Huber && (mAudioSource == NULL || (mFlags & AUDIO_AT_EOS)); 7105d2de4da54504836e4b772b3010ac28c19f667f0Andreas Huber 7115d2de4da54504836e4b772b3010ac28c19f667f0Andreas Huber if (!allDone) { 7125d2de4da54504836e4b772b3010ac28c19f667f0Andreas Huber return; 7135d2de4da54504836e4b772b3010ac28c19f667f0Andreas Huber } 7145d2de4da54504836e4b772b3010ac28c19f667f0Andreas Huber 7158ae49d87b98d57d6758b0c51b95e28a6581a79f1Andreas Huber if (mFlags & (LOOPING | AUTO_LOOPING)) { 716bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber seekTo_l(0); 717bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber 718a657f8deaf21acbe5faba7be1df9c6681d44d471Andreas Huber if (mVideoSource != NULL) { 719bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber postVideoEvent_l(); 720bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber } 721bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber } else { 7225d2de4da54504836e4b772b3010ac28c19f667f0Andreas Huber LOGV("MEDIA_PLAYBACK_COMPLETE"); 7235d2de4da54504836e4b772b3010ac28c19f667f0Andreas Huber notifyListener_l(MEDIA_PLAYBACK_COMPLETE); 724bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber 725b2e3954c94717e43b3dc9b880564f166cfbbc0a2Andreas Huber pause_l(true /* at eos */); 7262e8ffaf95bd35358ecd14ddf00cddaf3abefe0a9Andreas Huber 7272e8ffaf95bd35358ecd14ddf00cddaf3abefe0a9Andreas Huber mFlags |= AT_EOS; 728bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber } 729bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber} 730bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber 731bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huberstatus_t AwesomePlayer::play() { 732bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber Mutex::Autolock autoLock(mLock); 7330a5baa9b411fe086013d2a5e9126ed63fbad046cAndreas Huber 7340a5baa9b411fe086013d2a5e9126ed63fbad046cAndreas Huber mFlags &= ~CACHE_UNDERRUN; 7350a5baa9b411fe086013d2a5e9126ed63fbad046cAndreas Huber 7367b3396acc702451be9bafb19d7fe26d55d43a316Andreas Huber return play_l(); 7377b3396acc702451be9bafb19d7fe26d55d43a316Andreas Huber} 738bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber 7397b3396acc702451be9bafb19d7fe26d55d43a316Andreas Huberstatus_t AwesomePlayer::play_l() { 7402b1222f8938356669672f35e0e53e176c78c40efAndreas Huber mFlags &= ~SEEK_PREVIEW; 7412b1222f8938356669672f35e0e53e176c78c40efAndreas Huber 742bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber if (mFlags & PLAYING) { 743bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber return OK; 744bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber } 745bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber 746bd22c52280179b29eefac91ef7e7bbbc33d25904Andreas Huber if (!(mFlags & PREPARED)) { 747bd22c52280179b29eefac91ef7e7bbbc33d25904Andreas Huber status_t err = prepare_l(); 748bd22c52280179b29eefac91ef7e7bbbc33d25904Andreas Huber 749bd22c52280179b29eefac91ef7e7bbbc33d25904Andreas Huber if (err != OK) { 750bd22c52280179b29eefac91ef7e7bbbc33d25904Andreas Huber return err; 751bd22c52280179b29eefac91ef7e7bbbc33d25904Andreas Huber } 752bd22c52280179b29eefac91ef7e7bbbc33d25904Andreas Huber } 753bd22c52280179b29eefac91ef7e7bbbc33d25904Andreas Huber 754bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber mFlags |= PLAYING; 755bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber mFlags |= FIRST_FRAME; 756bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber 757c130b5bf563d049bd391ccd96985ac278ef8ff8dGloria Wang if (mDecryptHandle != NULL) { 758c130b5bf563d049bd391ccd96985ac278ef8ff8dGloria Wang int64_t position; 759c130b5bf563d049bd391ccd96985ac278ef8ff8dGloria Wang getPosition(&position); 760c130b5bf563d049bd391ccd96985ac278ef8ff8dGloria Wang mDrmManagerClient->setPlaybackStatus(mDecryptHandle, 761c130b5bf563d049bd391ccd96985ac278ef8ff8dGloria Wang Playback::START, position / 1000); 762c130b5bf563d049bd391ccd96985ac278ef8ff8dGloria Wang } 763c130b5bf563d049bd391ccd96985ac278ef8ff8dGloria Wang 764bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber if (mAudioSource != NULL) { 765bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber if (mAudioPlayer == NULL) { 766bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber if (mAudioSink != NULL) { 767ed54ad0f8619ae416b0968ade6248894cbfc4dbaAndreas Huber mAudioPlayer = new AudioPlayer(mAudioSink, this); 768bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber mAudioPlayer->setSource(mAudioSource); 769e7e3b785a0e7819db4c895a4f60e9a4dd755880cAndreas Huber 770f03034408506051f2f836e59305fcd5f662bf19aAndreas Huber mTimeSource = mAudioPlayer; 77188c030e0e0152791ff74f90249f55fce01371198Andreas Huber 772ae03031ab6af9505335e888b709ee661fe04ed83Andreas Huber // If there was a seek request before we ever started, 773ae03031ab6af9505335e888b709ee661fe04ed83Andreas Huber // honor the request now. 774ae03031ab6af9505335e888b709ee661fe04ed83Andreas Huber // Make sure to do this before starting the audio player 775ae03031ab6af9505335e888b709ee661fe04ed83Andreas Huber // to avoid a race condition. 776ae03031ab6af9505335e888b709ee661fe04ed83Andreas Huber seekAudioIfNecessary_l(); 777f03034408506051f2f836e59305fcd5f662bf19aAndreas Huber } 778f03034408506051f2f836e59305fcd5f662bf19aAndreas Huber } 77988c030e0e0152791ff74f90249f55fce01371198Andreas Huber 780f03034408506051f2f836e59305fcd5f662bf19aAndreas Huber CHECK(!(mFlags & AUDIO_RUNNING)); 781c130b5bf563d049bd391ccd96985ac278ef8ff8dGloria Wang 782f03034408506051f2f836e59305fcd5f662bf19aAndreas Huber if (mVideoSource == NULL) { 783f03034408506051f2f836e59305fcd5f662bf19aAndreas Huber status_t err = startAudioPlayer_l(); 784bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber 785f03034408506051f2f836e59305fcd5f662bf19aAndreas Huber if (err != OK) { 786f03034408506051f2f836e59305fcd5f662bf19aAndreas Huber delete mAudioPlayer; 787f03034408506051f2f836e59305fcd5f662bf19aAndreas Huber mAudioPlayer = NULL; 788bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber 789f03034408506051f2f836e59305fcd5f662bf19aAndreas Huber mFlags &= ~(PLAYING | FIRST_FRAME); 7901862a33b246249630b654182afb5914da3480d4cAndreas Huber 791f03034408506051f2f836e59305fcd5f662bf19aAndreas Huber if (mDecryptHandle != NULL) { 792f03034408506051f2f836e59305fcd5f662bf19aAndreas Huber mDrmManagerClient->setPlaybackStatus( 793f03034408506051f2f836e59305fcd5f662bf19aAndreas Huber mDecryptHandle, Playback::STOP, 0); 794f03034408506051f2f836e59305fcd5f662bf19aAndreas Huber } 795f03034408506051f2f836e59305fcd5f662bf19aAndreas Huber 796f03034408506051f2f836e59305fcd5f662bf19aAndreas Huber return err; 797bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber } 798bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber } 799bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber } 800bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber 801bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber if (mTimeSource == NULL && mAudioPlayer == NULL) { 8025d2de4da54504836e4b772b3010ac28c19f667f0Andreas Huber mTimeSource = &mSystemTimeSource; 803bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber } 804bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber 805bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber if (mVideoSource != NULL) { 806a657f8deaf21acbe5faba7be1df9c6681d44d471Andreas Huber // Kick off video playback 807a657f8deaf21acbe5faba7be1df9c6681d44d471Andreas Huber postVideoEvent_l(); 808145e68fc778275963189b02a1adcbe27cce4d769Andreas Huber 809145e68fc778275963189b02a1adcbe27cce4d769Andreas Huber if (mAudioSource != NULL && mVideoSource != NULL) { 810145e68fc778275963189b02a1adcbe27cce4d769Andreas Huber postVideoLagEvent_l(); 811145e68fc778275963189b02a1adcbe27cce4d769Andreas Huber } 812bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber } 813bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber 8142e8ffaf95bd35358ecd14ddf00cddaf3abefe0a9Andreas Huber if (mFlags & AT_EOS) { 8152e8ffaf95bd35358ecd14ddf00cddaf3abefe0a9Andreas Huber // Legacy behaviour, if a stream finishes playing and then 8162e8ffaf95bd35358ecd14ddf00cddaf3abefe0a9Andreas Huber // is started again, we play from the start... 8172e8ffaf95bd35358ecd14ddf00cddaf3abefe0a9Andreas Huber seekTo_l(0); 8182e8ffaf95bd35358ecd14ddf00cddaf3abefe0a9Andreas Huber } 8192e8ffaf95bd35358ecd14ddf00cddaf3abefe0a9Andreas Huber 8207cf180c9bff69e5cc4a2f4e53b432db45ebbebabGloria Wang uint32_t params = IMediaPlayerService::kBatteryDataCodecStarted 8217cf180c9bff69e5cc4a2f4e53b432db45ebbebabGloria Wang | IMediaPlayerService::kBatteryDataTrackDecoder; 8227cf180c9bff69e5cc4a2f4e53b432db45ebbebabGloria Wang if ((mAudioSource != NULL) && (mAudioSource != mAudioTrack)) { 8237cf180c9bff69e5cc4a2f4e53b432db45ebbebabGloria Wang params |= IMediaPlayerService::kBatteryDataTrackAudio; 8247cf180c9bff69e5cc4a2f4e53b432db45ebbebabGloria Wang } 8257cf180c9bff69e5cc4a2f4e53b432db45ebbebabGloria Wang if (mVideoSource != NULL) { 8267cf180c9bff69e5cc4a2f4e53b432db45ebbebabGloria Wang params |= IMediaPlayerService::kBatteryDataTrackVideo; 8277cf180c9bff69e5cc4a2f4e53b432db45ebbebabGloria Wang } 8287cf180c9bff69e5cc4a2f4e53b432db45ebbebabGloria Wang addBatteryData(params); 8297cf180c9bff69e5cc4a2f4e53b432db45ebbebabGloria Wang 830bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber return OK; 831bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber} 832bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber 833f03034408506051f2f836e59305fcd5f662bf19aAndreas Huberstatus_t AwesomePlayer::startAudioPlayer_l() { 834f03034408506051f2f836e59305fcd5f662bf19aAndreas Huber CHECK(!(mFlags & AUDIO_RUNNING)); 835f03034408506051f2f836e59305fcd5f662bf19aAndreas Huber 836f03034408506051f2f836e59305fcd5f662bf19aAndreas Huber if (mAudioSource == NULL || mAudioPlayer == NULL) { 837f03034408506051f2f836e59305fcd5f662bf19aAndreas Huber return OK; 838f03034408506051f2f836e59305fcd5f662bf19aAndreas Huber } 839f03034408506051f2f836e59305fcd5f662bf19aAndreas Huber 840f03034408506051f2f836e59305fcd5f662bf19aAndreas Huber if (!(mFlags & AUDIOPLAYER_STARTED)) { 841f03034408506051f2f836e59305fcd5f662bf19aAndreas Huber mFlags |= AUDIOPLAYER_STARTED; 842f03034408506051f2f836e59305fcd5f662bf19aAndreas Huber 843f03034408506051f2f836e59305fcd5f662bf19aAndreas Huber // We've already started the MediaSource in order to enable 844f03034408506051f2f836e59305fcd5f662bf19aAndreas Huber // the prefetcher to read its data. 845f03034408506051f2f836e59305fcd5f662bf19aAndreas Huber status_t err = mAudioPlayer->start( 846f03034408506051f2f836e59305fcd5f662bf19aAndreas Huber true /* sourceAlreadyStarted */); 847f03034408506051f2f836e59305fcd5f662bf19aAndreas Huber 848f03034408506051f2f836e59305fcd5f662bf19aAndreas Huber if (err != OK) { 849f03034408506051f2f836e59305fcd5f662bf19aAndreas Huber notifyListener_l(MEDIA_ERROR, MEDIA_ERROR_UNKNOWN, err); 850f03034408506051f2f836e59305fcd5f662bf19aAndreas Huber return err; 851f03034408506051f2f836e59305fcd5f662bf19aAndreas Huber } 852f03034408506051f2f836e59305fcd5f662bf19aAndreas Huber } else { 853f03034408506051f2f836e59305fcd5f662bf19aAndreas Huber mAudioPlayer->resume(); 854f03034408506051f2f836e59305fcd5f662bf19aAndreas Huber } 855f03034408506051f2f836e59305fcd5f662bf19aAndreas Huber 856f03034408506051f2f836e59305fcd5f662bf19aAndreas Huber mFlags |= AUDIO_RUNNING; 857f03034408506051f2f836e59305fcd5f662bf19aAndreas Huber 858f03034408506051f2f836e59305fcd5f662bf19aAndreas Huber mWatchForAudioEOS = true; 859f03034408506051f2f836e59305fcd5f662bf19aAndreas Huber 860f03034408506051f2f836e59305fcd5f662bf19aAndreas Huber return OK; 861f03034408506051f2f836e59305fcd5f662bf19aAndreas Huber} 862f03034408506051f2f836e59305fcd5f662bf19aAndreas Huber 8635daeb129a2c2ba3d14ccd94af283b5f561c783eaAndreas Hubervoid AwesomePlayer::notifyVideoSize_l() { 8645daeb129a2c2ba3d14ccd94af283b5f561c783eaAndreas Huber sp<MetaData> meta = mVideoSource->getFormat(); 8655daeb129a2c2ba3d14ccd94af283b5f561c783eaAndreas Huber 866f5ab57c2d5e02af7483c94eddb177e4f5c9e9892Andreas Huber int32_t cropLeft, cropTop, cropRight, cropBottom; 867f5ab57c2d5e02af7483c94eddb177e4f5c9e9892Andreas Huber if (!meta->findRect( 868f5ab57c2d5e02af7483c94eddb177e4f5c9e9892Andreas Huber kKeyCropRect, &cropLeft, &cropTop, &cropRight, &cropBottom)) { 869f5ab57c2d5e02af7483c94eddb177e4f5c9e9892Andreas Huber int32_t width, height; 870f5ab57c2d5e02af7483c94eddb177e4f5c9e9892Andreas Huber CHECK(meta->findInt32(kKeyWidth, &width)); 871f5ab57c2d5e02af7483c94eddb177e4f5c9e9892Andreas Huber CHECK(meta->findInt32(kKeyHeight, &height)); 872f5ab57c2d5e02af7483c94eddb177e4f5c9e9892Andreas Huber 873f5ab57c2d5e02af7483c94eddb177e4f5c9e9892Andreas Huber cropLeft = cropTop = 0; 874f5ab57c2d5e02af7483c94eddb177e4f5c9e9892Andreas Huber cropRight = width - 1; 875f5ab57c2d5e02af7483c94eddb177e4f5c9e9892Andreas Huber cropBottom = height - 1; 876f5ab57c2d5e02af7483c94eddb177e4f5c9e9892Andreas Huber 877f5ab57c2d5e02af7483c94eddb177e4f5c9e9892Andreas Huber LOGV("got dimensions only %d x %d", width, height); 878f5ab57c2d5e02af7483c94eddb177e4f5c9e9892Andreas Huber } else { 879f5ab57c2d5e02af7483c94eddb177e4f5c9e9892Andreas Huber LOGV("got crop rect %d, %d, %d, %d", 880f5ab57c2d5e02af7483c94eddb177e4f5c9e9892Andreas Huber cropLeft, cropTop, cropRight, cropBottom); 881f5ab57c2d5e02af7483c94eddb177e4f5c9e9892Andreas Huber } 882f5ab57c2d5e02af7483c94eddb177e4f5c9e9892Andreas Huber 883f5ab57c2d5e02af7483c94eddb177e4f5c9e9892Andreas Huber int32_t usableWidth = cropRight - cropLeft + 1; 884f5ab57c2d5e02af7483c94eddb177e4f5c9e9892Andreas Huber int32_t usableHeight = cropBottom - cropTop + 1; 885b45c01c2b8588ff431b511151666a55a39f0a6aeJames Dong if (mDisplayWidth != 0) { 886b45c01c2b8588ff431b511151666a55a39f0a6aeJames Dong usableWidth = mDisplayWidth; 887b45c01c2b8588ff431b511151666a55a39f0a6aeJames Dong } 888b45c01c2b8588ff431b511151666a55a39f0a6aeJames Dong if (mDisplayHeight != 0) { 889b45c01c2b8588ff431b511151666a55a39f0a6aeJames Dong usableHeight = mDisplayHeight; 890b45c01c2b8588ff431b511151666a55a39f0a6aeJames Dong } 8915daeb129a2c2ba3d14ccd94af283b5f561c783eaAndreas Huber 892ba529e486dde15fe75ea1b48570f9d60a4cf3c48Andreas Huber int32_t rotationDegrees; 893ba529e486dde15fe75ea1b48570f9d60a4cf3c48Andreas Huber if (!mVideoTrack->getFormat()->findInt32( 894ba529e486dde15fe75ea1b48570f9d60a4cf3c48Andreas Huber kKeyRotation, &rotationDegrees)) { 895ba529e486dde15fe75ea1b48570f9d60a4cf3c48Andreas Huber rotationDegrees = 0; 896ba529e486dde15fe75ea1b48570f9d60a4cf3c48Andreas Huber } 897ba529e486dde15fe75ea1b48570f9d60a4cf3c48Andreas Huber 898ba529e486dde15fe75ea1b48570f9d60a4cf3c48Andreas Huber if (rotationDegrees == 90 || rotationDegrees == 270) { 899ba529e486dde15fe75ea1b48570f9d60a4cf3c48Andreas Huber notifyListener_l( 900f5ab57c2d5e02af7483c94eddb177e4f5c9e9892Andreas Huber MEDIA_SET_VIDEO_SIZE, usableHeight, usableWidth); 901ba529e486dde15fe75ea1b48570f9d60a4cf3c48Andreas Huber } else { 902ba529e486dde15fe75ea1b48570f9d60a4cf3c48Andreas Huber notifyListener_l( 903f5ab57c2d5e02af7483c94eddb177e4f5c9e9892Andreas Huber MEDIA_SET_VIDEO_SIZE, usableWidth, usableHeight); 904ba529e486dde15fe75ea1b48570f9d60a4cf3c48Andreas Huber } 9055daeb129a2c2ba3d14ccd94af283b5f561c783eaAndreas Huber} 9065daeb129a2c2ba3d14ccd94af283b5f561c783eaAndreas Huber 907bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Hubervoid AwesomePlayer::initRenderer_l() { 9081173118eace0e9e347cb007f0da817cee87579edGlenn Kasten if (mNativeWindow == NULL) { 9090a5ca668c6f7d45706e9aec4a1dfec0aacc6d233Andreas Huber return; 9100a5ca668c6f7d45706e9aec4a1dfec0aacc6d233Andreas Huber } 911bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber 9120a5ca668c6f7d45706e9aec4a1dfec0aacc6d233Andreas Huber sp<MetaData> meta = mVideoSource->getFormat(); 913bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber 9140a5ca668c6f7d45706e9aec4a1dfec0aacc6d233Andreas Huber int32_t format; 9150a5ca668c6f7d45706e9aec4a1dfec0aacc6d233Andreas Huber const char *component; 9160a5ca668c6f7d45706e9aec4a1dfec0aacc6d233Andreas Huber int32_t decodedWidth, decodedHeight; 9170a5ca668c6f7d45706e9aec4a1dfec0aacc6d233Andreas Huber CHECK(meta->findInt32(kKeyColorFormat, &format)); 9180a5ca668c6f7d45706e9aec4a1dfec0aacc6d233Andreas Huber CHECK(meta->findCString(kKeyDecoderComponent, &component)); 9190a5ca668c6f7d45706e9aec4a1dfec0aacc6d233Andreas Huber CHECK(meta->findInt32(kKeyWidth, &decodedWidth)); 9200a5ca668c6f7d45706e9aec4a1dfec0aacc6d233Andreas Huber CHECK(meta->findInt32(kKeyHeight, &decodedHeight)); 9214844ac54e8b5997c3b03872dbafe8ebed4787517Andreas Huber 922ba529e486dde15fe75ea1b48570f9d60a4cf3c48Andreas Huber int32_t rotationDegrees; 923ba529e486dde15fe75ea1b48570f9d60a4cf3c48Andreas Huber if (!mVideoTrack->getFormat()->findInt32( 924ba529e486dde15fe75ea1b48570f9d60a4cf3c48Andreas Huber kKeyRotation, &rotationDegrees)) { 925ba529e486dde15fe75ea1b48570f9d60a4cf3c48Andreas Huber rotationDegrees = 0; 926ba529e486dde15fe75ea1b48570f9d60a4cf3c48Andreas Huber } 927ba529e486dde15fe75ea1b48570f9d60a4cf3c48Andreas Huber 9280a5ca668c6f7d45706e9aec4a1dfec0aacc6d233Andreas Huber mVideoRenderer.clear(); 9294844ac54e8b5997c3b03872dbafe8ebed4787517Andreas Huber 9300a5ca668c6f7d45706e9aec4a1dfec0aacc6d233Andreas Huber // Must ensure that mVideoRenderer's destructor is actually executed 9310a5ca668c6f7d45706e9aec4a1dfec0aacc6d233Andreas Huber // before creating a new one. 9320a5ca668c6f7d45706e9aec4a1dfec0aacc6d233Andreas Huber IPCThreadState::self()->flushCommands(); 9330a5ca668c6f7d45706e9aec4a1dfec0aacc6d233Andreas Huber 9340a5ca668c6f7d45706e9aec4a1dfec0aacc6d233Andreas Huber if (USE_SURFACE_ALLOC && strncmp(component, "OMX.", 4) == 0) { 9350a5ca668c6f7d45706e9aec4a1dfec0aacc6d233Andreas Huber // Hardware decoders avoid the CPU color conversion by decoding 9360a5ca668c6f7d45706e9aec4a1dfec0aacc6d233Andreas Huber // directly to ANativeBuffers, so we must use a renderer that 9370a5ca668c6f7d45706e9aec4a1dfec0aacc6d233Andreas Huber // just pushes those buffers to the ANativeWindow. 938ba529e486dde15fe75ea1b48570f9d60a4cf3c48Andreas Huber mVideoRenderer = 9391173118eace0e9e347cb007f0da817cee87579edGlenn Kasten new AwesomeNativeWindowRenderer(mNativeWindow, rotationDegrees); 9400a5ca668c6f7d45706e9aec4a1dfec0aacc6d233Andreas Huber } else { 9410a5ca668c6f7d45706e9aec4a1dfec0aacc6d233Andreas Huber // Other decoders are instantiated locally and as a consequence 9420a5ca668c6f7d45706e9aec4a1dfec0aacc6d233Andreas Huber // allocate their buffers in local address space. This renderer 9430a5ca668c6f7d45706e9aec4a1dfec0aacc6d233Andreas Huber // then performs a color conversion and copy to get the data 9440a5ca668c6f7d45706e9aec4a1dfec0aacc6d233Andreas Huber // into the ANativeBuffer. 9451173118eace0e9e347cb007f0da817cee87579edGlenn Kasten mVideoRenderer = new AwesomeLocalRenderer(mNativeWindow, meta); 946bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber } 947bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber} 948bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber 949bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huberstatus_t AwesomePlayer::pause() { 950bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber Mutex::Autolock autoLock(mLock); 9510a5baa9b411fe086013d2a5e9126ed63fbad046cAndreas Huber 9520a5baa9b411fe086013d2a5e9126ed63fbad046cAndreas Huber mFlags &= ~CACHE_UNDERRUN; 9530a5baa9b411fe086013d2a5e9126ed63fbad046cAndreas Huber 954bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber return pause_l(); 955bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber} 956bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber 957b2e3954c94717e43b3dc9b880564f166cfbbc0a2Andreas Huberstatus_t AwesomePlayer::pause_l(bool at_eos) { 958bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber if (!(mFlags & PLAYING)) { 959bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber return OK; 960bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber } 961bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber 96266b0a35c9a4136a84c3f73b1b25fcb5220138b95Andreas Huber cancelPlayerEvents(true /* keepBufferingGoing */); 963bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber 964f03034408506051f2f836e59305fcd5f662bf19aAndreas Huber if (mAudioPlayer != NULL && (mFlags & AUDIO_RUNNING)) { 965b2e3954c94717e43b3dc9b880564f166cfbbc0a2Andreas Huber if (at_eos) { 966b2e3954c94717e43b3dc9b880564f166cfbbc0a2Andreas Huber // If we played the audio stream to completion we 967b2e3954c94717e43b3dc9b880564f166cfbbc0a2Andreas Huber // want to make sure that all samples remaining in the audio 968b2e3954c94717e43b3dc9b880564f166cfbbc0a2Andreas Huber // track's queue are played out. 969b2e3954c94717e43b3dc9b880564f166cfbbc0a2Andreas Huber mAudioPlayer->pause(true /* playPendingSamples */); 970b2e3954c94717e43b3dc9b880564f166cfbbc0a2Andreas Huber } else { 971b2e3954c94717e43b3dc9b880564f166cfbbc0a2Andreas Huber mAudioPlayer->pause(); 972b2e3954c94717e43b3dc9b880564f166cfbbc0a2Andreas Huber } 973f03034408506051f2f836e59305fcd5f662bf19aAndreas Huber 974f03034408506051f2f836e59305fcd5f662bf19aAndreas Huber mFlags &= ~AUDIO_RUNNING; 975bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber } 976bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber 977bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber mFlags &= ~PLAYING; 978bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber 979dcd25efb46c41c8d24a0a9cf61fb57f84149709eGloria Wang if (mDecryptHandle != NULL) { 980dcd25efb46c41c8d24a0a9cf61fb57f84149709eGloria Wang mDrmManagerClient->setPlaybackStatus(mDecryptHandle, 981dcd25efb46c41c8d24a0a9cf61fb57f84149709eGloria Wang Playback::PAUSE, 0); 982dcd25efb46c41c8d24a0a9cf61fb57f84149709eGloria Wang } 983dcd25efb46c41c8d24a0a9cf61fb57f84149709eGloria Wang 9847cf180c9bff69e5cc4a2f4e53b432db45ebbebabGloria Wang uint32_t params = IMediaPlayerService::kBatteryDataTrackDecoder; 9857cf180c9bff69e5cc4a2f4e53b432db45ebbebabGloria Wang if ((mAudioSource != NULL) && (mAudioSource != mAudioTrack)) { 9867cf180c9bff69e5cc4a2f4e53b432db45ebbebabGloria Wang params |= IMediaPlayerService::kBatteryDataTrackAudio; 9877cf180c9bff69e5cc4a2f4e53b432db45ebbebabGloria Wang } 9887cf180c9bff69e5cc4a2f4e53b432db45ebbebabGloria Wang if (mVideoSource != NULL) { 9897cf180c9bff69e5cc4a2f4e53b432db45ebbebabGloria Wang params |= IMediaPlayerService::kBatteryDataTrackVideo; 9907cf180c9bff69e5cc4a2f4e53b432db45ebbebabGloria Wang } 9917cf180c9bff69e5cc4a2f4e53b432db45ebbebabGloria Wang 9927cf180c9bff69e5cc4a2f4e53b432db45ebbebabGloria Wang addBatteryData(params); 9937cf180c9bff69e5cc4a2f4e53b432db45ebbebabGloria Wang 994bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber return OK; 995bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber} 996bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber 997bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huberbool AwesomePlayer::isPlaying() const { 9980a5baa9b411fe086013d2a5e9126ed63fbad046cAndreas Huber return (mFlags & PLAYING) || (mFlags & CACHE_UNDERRUN); 999bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber} 1000bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber 10015daeb129a2c2ba3d14ccd94af283b5f561c783eaAndreas Hubervoid AwesomePlayer::setSurface(const sp<Surface> &surface) { 10025daeb129a2c2ba3d14ccd94af283b5f561c783eaAndreas Huber Mutex::Autolock autoLock(mLock); 10035daeb129a2c2ba3d14ccd94af283b5f561c783eaAndreas Huber 10045daeb129a2c2ba3d14ccd94af283b5f561c783eaAndreas Huber mSurface = surface; 10051173118eace0e9e347cb007f0da817cee87579edGlenn Kasten mNativeWindow = surface; 10061173118eace0e9e347cb007f0da817cee87579edGlenn Kasten} 10071173118eace0e9e347cb007f0da817cee87579edGlenn Kasten 10081173118eace0e9e347cb007f0da817cee87579edGlenn Kastenvoid AwesomePlayer::setSurfaceTexture(const sp<ISurfaceTexture> &surfaceTexture) { 10091173118eace0e9e347cb007f0da817cee87579edGlenn Kasten Mutex::Autolock autoLock(mLock); 10101173118eace0e9e347cb007f0da817cee87579edGlenn Kasten 10111173118eace0e9e347cb007f0da817cee87579edGlenn Kasten mSurface.clear(); 10121173118eace0e9e347cb007f0da817cee87579edGlenn Kasten if (surfaceTexture != NULL) { 10131173118eace0e9e347cb007f0da817cee87579edGlenn Kasten mNativeWindow = new SurfaceTextureClient(surfaceTexture); 10141173118eace0e9e347cb007f0da817cee87579edGlenn Kasten } 10151173118eace0e9e347cb007f0da817cee87579edGlenn Kasten 10165daeb129a2c2ba3d14ccd94af283b5f561c783eaAndreas Huber} 10175daeb129a2c2ba3d14ccd94af283b5f561c783eaAndreas Huber 1018bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Hubervoid AwesomePlayer::setAudioSink( 1019bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber const sp<MediaPlayerBase::AudioSink> &audioSink) { 1020bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber Mutex::Autolock autoLock(mLock); 1021bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber 1022bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber mAudioSink = audioSink; 1023bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber} 1024bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber 1025bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huberstatus_t AwesomePlayer::setLooping(bool shouldLoop) { 1026bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber Mutex::Autolock autoLock(mLock); 1027bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber 1028bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber mFlags = mFlags & ~LOOPING; 1029bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber 1030bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber if (shouldLoop) { 1031bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber mFlags |= LOOPING; 1032bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber } 1033bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber 1034bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber return OK; 1035bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber} 1036bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber 1037bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huberstatus_t AwesomePlayer::getDuration(int64_t *durationUs) { 10382415ecb5bb4e1459024f6d6c8ae2d6e3dc4fbdc7Andreas Huber Mutex::Autolock autoLock(mMiscStateLock); 1039bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber 1040bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber if (mDurationUs < 0) { 1041bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber return UNKNOWN_ERROR; 1042bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber } 1043bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber 1044bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber *durationUs = mDurationUs; 1045bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber 1046bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber return OK; 1047bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber} 1048bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber 1049bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huberstatus_t AwesomePlayer::getPosition(int64_t *positionUs) { 10508d342970108926c4ea355c90d26a2a353ec0fd47Andreas Huber if (mRTSPController != NULL) { 10518d342970108926c4ea355c90d26a2a353ec0fd47Andreas Huber *positionUs = mRTSPController->getNormalPlayTimeUs(); 10528d342970108926c4ea355c90d26a2a353ec0fd47Andreas Huber } 105364bb6983690bf994d904591145a3cdd6373bdbe6Andreas Huber else if (mSeeking != NO_SEEK) { 1054dac4ee72bac87388a1495e098f39d73168c8078fAndreas Huber *positionUs = mSeekTimeUs; 1055dac4ee72bac87388a1495e098f39d73168c8078fAndreas Huber } else if (mVideoSource != NULL) { 10562415ecb5bb4e1459024f6d6c8ae2d6e3dc4fbdc7Andreas Huber Mutex::Autolock autoLock(mMiscStateLock); 1057bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber *positionUs = mVideoTimeUs; 1058bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber } else if (mAudioPlayer != NULL) { 1059bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber *positionUs = mAudioPlayer->getMediaTimeUs(); 1060bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber } else { 1061bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber *positionUs = 0; 1062bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber } 1063bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber 1064bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber return OK; 1065bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber} 1066bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber 1067bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huberstatus_t AwesomePlayer::seekTo(int64_t timeUs) { 106870f521de2675ce6eedf4b22beed94ea1289b0f38Andreas Huber if (mExtractorFlags & MediaExtractor::CAN_SEEK) { 1069acdd9d0f59c3d8bdc3de80664a609527ec3d21e2Andreas Huber Mutex::Autolock autoLock(mLock); 1070acdd9d0f59c3d8bdc3de80664a609527ec3d21e2Andreas Huber return seekTo_l(timeUs); 1071acdd9d0f59c3d8bdc3de80664a609527ec3d21e2Andreas Huber } 1072acdd9d0f59c3d8bdc3de80664a609527ec3d21e2Andreas Huber 1073acdd9d0f59c3d8bdc3de80664a609527ec3d21e2Andreas Huber return OK; 1074bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber} 1075bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber 10760dcd837af4169bdb6fb2a0c384722dc4f57433c6Andreas Huber// static 10770dcd837af4169bdb6fb2a0c384722dc4f57433c6Andreas Hubervoid AwesomePlayer::OnRTSPSeekDoneWrapper(void *cookie) { 10780dcd837af4169bdb6fb2a0c384722dc4f57433c6Andreas Huber static_cast<AwesomePlayer *>(cookie)->onRTSPSeekDone(); 10790dcd837af4169bdb6fb2a0c384722dc4f57433c6Andreas Huber} 10800dcd837af4169bdb6fb2a0c384722dc4f57433c6Andreas Huber 10810dcd837af4169bdb6fb2a0c384722dc4f57433c6Andreas Hubervoid AwesomePlayer::onRTSPSeekDone() { 10820dcd837af4169bdb6fb2a0c384722dc4f57433c6Andreas Huber notifyListener_l(MEDIA_SEEK_COMPLETE); 10830dcd837af4169bdb6fb2a0c384722dc4f57433c6Andreas Huber mSeekNotificationSent = true; 10840dcd837af4169bdb6fb2a0c384722dc4f57433c6Andreas Huber} 10850dcd837af4169bdb6fb2a0c384722dc4f57433c6Andreas Huber 1086bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huberstatus_t AwesomePlayer::seekTo_l(int64_t timeUs) { 1087cce326fe43411855aca2f719e505b051bc4b61b3Andreas Huber if (mRTSPController != NULL) { 10880dcd837af4169bdb6fb2a0c384722dc4f57433c6Andreas Huber mRTSPController->seekAsync(timeUs, OnRTSPSeekDoneWrapper, this); 1089cce326fe43411855aca2f719e505b051bc4b61b3Andreas Huber return OK; 1090cce326fe43411855aca2f719e505b051bc4b61b3Andreas Huber } 1091cce326fe43411855aca2f719e505b051bc4b61b3Andreas Huber 10920a5baa9b411fe086013d2a5e9126ed63fbad046cAndreas Huber if (mFlags & CACHE_UNDERRUN) { 10930a5baa9b411fe086013d2a5e9126ed63fbad046cAndreas Huber mFlags &= ~CACHE_UNDERRUN; 10940a5baa9b411fe086013d2a5e9126ed63fbad046cAndreas Huber play_l(); 10950a5baa9b411fe086013d2a5e9126ed63fbad046cAndreas Huber } 10960a5baa9b411fe086013d2a5e9126ed63fbad046cAndreas Huber 109764bb6983690bf994d904591145a3cdd6373bdbe6Andreas Huber mSeeking = SEEK; 10981321fdd94d354431b930735e9f38f32ecd189a2dAndreas Huber mSeekNotificationSent = false; 1099bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber mSeekTimeUs = timeUs; 11005d2de4da54504836e4b772b3010ac28c19f667f0Andreas Huber mFlags &= ~(AT_EOS | AUDIO_AT_EOS | VIDEO_AT_EOS); 1101bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber 1102bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber seekAudioIfNecessary_l(); 1103bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber 11041321fdd94d354431b930735e9f38f32ecd189a2dAndreas Huber if (!(mFlags & PLAYING)) { 11051321fdd94d354431b930735e9f38f32ecd189a2dAndreas Huber LOGV("seeking while paused, sending SEEK_COMPLETE notification" 11061321fdd94d354431b930735e9f38f32ecd189a2dAndreas Huber " immediately."); 11071321fdd94d354431b930735e9f38f32ecd189a2dAndreas Huber 11081321fdd94d354431b930735e9f38f32ecd189a2dAndreas Huber notifyListener_l(MEDIA_SEEK_COMPLETE); 11091321fdd94d354431b930735e9f38f32ecd189a2dAndreas Huber mSeekNotificationSent = true; 11102b1222f8938356669672f35e0e53e176c78c40efAndreas Huber 11112b1222f8938356669672f35e0e53e176c78c40efAndreas Huber if ((mFlags & PREPARED) && mVideoSource != NULL) { 11122b1222f8938356669672f35e0e53e176c78c40efAndreas Huber mFlags |= SEEK_PREVIEW; 11132b1222f8938356669672f35e0e53e176c78c40efAndreas Huber postVideoEvent_l(); 11142b1222f8938356669672f35e0e53e176c78c40efAndreas Huber } 11151321fdd94d354431b930735e9f38f32ecd189a2dAndreas Huber } 11161321fdd94d354431b930735e9f38f32ecd189a2dAndreas Huber 1117bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber return OK; 1118bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber} 1119bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber 1120bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Hubervoid AwesomePlayer::seekAudioIfNecessary_l() { 112164bb6983690bf994d904591145a3cdd6373bdbe6Andreas Huber if (mSeeking != NO_SEEK && mVideoSource == NULL && mAudioPlayer != NULL) { 1122bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber mAudioPlayer->seekTo(mSeekTimeUs); 1123bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber 11241862a33b246249630b654182afb5914da3480d4cAndreas Huber mWatchForAudioSeekComplete = true; 11251862a33b246249630b654182afb5914da3480d4cAndreas Huber mWatchForAudioEOS = true; 11261321fdd94d354431b930735e9f38f32ecd189a2dAndreas Huber mSeekNotificationSent = false; 1127dcd25efb46c41c8d24a0a9cf61fb57f84149709eGloria Wang 1128dcd25efb46c41c8d24a0a9cf61fb57f84149709eGloria Wang if (mDecryptHandle != NULL) { 1129dcd25efb46c41c8d24a0a9cf61fb57f84149709eGloria Wang mDrmManagerClient->setPlaybackStatus(mDecryptHandle, 1130dcd25efb46c41c8d24a0a9cf61fb57f84149709eGloria Wang Playback::PAUSE, 0); 1131dcd25efb46c41c8d24a0a9cf61fb57f84149709eGloria Wang mDrmManagerClient->setPlaybackStatus(mDecryptHandle, 1132dcd25efb46c41c8d24a0a9cf61fb57f84149709eGloria Wang Playback::START, mSeekTimeUs / 1000); 1133dcd25efb46c41c8d24a0a9cf61fb57f84149709eGloria Wang } 1134bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber } 1135bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber} 1136bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber 113788d8a83de12592635248aa1a3bd6b9ea46108501Andreas Hubervoid AwesomePlayer::setAudioSource(sp<MediaSource> source) { 113888d8a83de12592635248aa1a3bd6b9ea46108501Andreas Huber CHECK(source != NULL); 1139bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber 114088d8a83de12592635248aa1a3bd6b9ea46108501Andreas Huber mAudioTrack = source; 114188d8a83de12592635248aa1a3bd6b9ea46108501Andreas Huber} 114288d8a83de12592635248aa1a3bd6b9ea46108501Andreas Huber 114388d8a83de12592635248aa1a3bd6b9ea46108501Andreas Huberstatus_t AwesomePlayer::initAudioDecoder() { 114488d8a83de12592635248aa1a3bd6b9ea46108501Andreas Huber sp<MetaData> meta = mAudioTrack->getFormat(); 1145717826ececd8d39596f62418677721d70776add1Andreas Huber 1146717826ececd8d39596f62418677721d70776add1Andreas Huber const char *mime; 1147717826ececd8d39596f62418677721d70776add1Andreas Huber CHECK(meta->findCString(kKeyMIMEType, &mime)); 1148717826ececd8d39596f62418677721d70776add1Andreas Huber 1149717826ececd8d39596f62418677721d70776add1Andreas Huber if (!strcasecmp(mime, MEDIA_MIMETYPE_AUDIO_RAW)) { 115088d8a83de12592635248aa1a3bd6b9ea46108501Andreas Huber mAudioSource = mAudioTrack; 1151717826ececd8d39596f62418677721d70776add1Andreas Huber } else { 1152717826ececd8d39596f62418677721d70776add1Andreas Huber mAudioSource = OMXCodec::Create( 115388d8a83de12592635248aa1a3bd6b9ea46108501Andreas Huber mClient.interface(), mAudioTrack->getFormat(), 1154717826ececd8d39596f62418677721d70776add1Andreas Huber false, // createEncoder 115588d8a83de12592635248aa1a3bd6b9ea46108501Andreas Huber mAudioTrack); 1156717826ececd8d39596f62418677721d70776add1Andreas Huber } 1157bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber 1158bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber if (mAudioSource != NULL) { 1159bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber int64_t durationUs; 116088d8a83de12592635248aa1a3bd6b9ea46108501Andreas Huber if (mAudioTrack->getFormat()->findInt64(kKeyDuration, &durationUs)) { 11612415ecb5bb4e1459024f6d6c8ae2d6e3dc4fbdc7Andreas Huber Mutex::Autolock autoLock(mMiscStateLock); 1162bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber if (mDurationUs < 0 || durationUs > mDurationUs) { 1163bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber mDurationUs = durationUs; 1164bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber } 1165bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber } 1166bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber 1167a945bfd91aa291fba4d9201ffcb38fce40eab7feAndreas Huber status_t err = mAudioSource->start(); 1168a945bfd91aa291fba4d9201ffcb38fce40eab7feAndreas Huber 1169a945bfd91aa291fba4d9201ffcb38fce40eab7feAndreas Huber if (err != OK) { 1170a945bfd91aa291fba4d9201ffcb38fce40eab7feAndreas Huber mAudioSource.clear(); 1171a945bfd91aa291fba4d9201ffcb38fce40eab7feAndreas Huber return err; 1172a945bfd91aa291fba4d9201ffcb38fce40eab7feAndreas Huber } 117381f82c32459029bf0744e28c73f95a7f18cab5acAndreas Huber } else if (!strcasecmp(mime, MEDIA_MIMETYPE_AUDIO_QCELP)) { 117481f82c32459029bf0744e28c73f95a7f18cab5acAndreas Huber // For legacy reasons we're simply going to ignore the absence 117581f82c32459029bf0744e28c73f95a7f18cab5acAndreas Huber // of an audio decoder for QCELP instead of aborting playback 117681f82c32459029bf0744e28c73f95a7f18cab5acAndreas Huber // altogether. 117781f82c32459029bf0744e28c73f95a7f18cab5acAndreas Huber return OK; 117881f82c32459029bf0744e28c73f95a7f18cab5acAndreas Huber } 1179e7e3b785a0e7819db4c895a4f60e9a4dd755880cAndreas Huber 1180bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber return mAudioSource != NULL ? OK : UNKNOWN_ERROR; 1181bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber} 1182bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber 118388d8a83de12592635248aa1a3bd6b9ea46108501Andreas Hubervoid AwesomePlayer::setVideoSource(sp<MediaSource> source) { 118488d8a83de12592635248aa1a3bd6b9ea46108501Andreas Huber CHECK(source != NULL); 1185bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber 118688d8a83de12592635248aa1a3bd6b9ea46108501Andreas Huber mVideoTrack = source; 118788d8a83de12592635248aa1a3bd6b9ea46108501Andreas Huber} 118888d8a83de12592635248aa1a3bd6b9ea46108501Andreas Huber 11892a4d22d79e927f2245537921e10fc5fda1c47a29Andreas Huberstatus_t AwesomePlayer::initVideoDecoder(uint32_t flags) { 11902eb62955eb84b97695e8a7e56e14310cbb86412bGlenn Kasten 11912eb62955eb84b97695e8a7e56e14310cbb86412bGlenn Kasten // Either the application or the DRM system can independently say 11922eb62955eb84b97695e8a7e56e14310cbb86412bGlenn Kasten // that there must be a hardware-protected path to an external video sink. 11932eb62955eb84b97695e8a7e56e14310cbb86412bGlenn Kasten // For now we always require a hardware-protected path to external video sink 11942eb62955eb84b97695e8a7e56e14310cbb86412bGlenn Kasten // if content is DRMed, but eventually this could be optional per DRM agent. 11952eb62955eb84b97695e8a7e56e14310cbb86412bGlenn Kasten // When the application wants protection, then 11962eb62955eb84b97695e8a7e56e14310cbb86412bGlenn Kasten // (USE_SURFACE_ALLOC && (mSurface != 0) && 11972eb62955eb84b97695e8a7e56e14310cbb86412bGlenn Kasten // (mSurface->getFlags() & ISurfaceComposer::eProtectedByApp)) 11982eb62955eb84b97695e8a7e56e14310cbb86412bGlenn Kasten // will be true, but that part is already handled by SurfaceFlinger. 1199eabd34665adc284525fe7337ad5c56a8b92964efGlenn Kasten 1200eabd34665adc284525fe7337ad5c56a8b92964efGlenn Kasten#ifdef DEBUG_HDCP 1201eabd34665adc284525fe7337ad5c56a8b92964efGlenn Kasten // For debugging, we allow a system property to control the protected usage. 1202eabd34665adc284525fe7337ad5c56a8b92964efGlenn Kasten // In case of uninitialized or unexpected property, we default to "DRM only". 1203eabd34665adc284525fe7337ad5c56a8b92964efGlenn Kasten bool setProtectionBit = false; 1204eabd34665adc284525fe7337ad5c56a8b92964efGlenn Kasten char value[PROPERTY_VALUE_MAX]; 1205eabd34665adc284525fe7337ad5c56a8b92964efGlenn Kasten if (property_get("persist.sys.hdcp_checking", value, NULL)) { 1206eabd34665adc284525fe7337ad5c56a8b92964efGlenn Kasten if (!strcmp(value, "never")) { 1207eabd34665adc284525fe7337ad5c56a8b92964efGlenn Kasten // nop 1208eabd34665adc284525fe7337ad5c56a8b92964efGlenn Kasten } else if (!strcmp(value, "always")) { 1209eabd34665adc284525fe7337ad5c56a8b92964efGlenn Kasten setProtectionBit = true; 1210eabd34665adc284525fe7337ad5c56a8b92964efGlenn Kasten } else if (!strcmp(value, "drm-only")) { 1211eabd34665adc284525fe7337ad5c56a8b92964efGlenn Kasten if (mDecryptHandle != NULL) { 1212eabd34665adc284525fe7337ad5c56a8b92964efGlenn Kasten setProtectionBit = true; 1213eabd34665adc284525fe7337ad5c56a8b92964efGlenn Kasten } 1214eabd34665adc284525fe7337ad5c56a8b92964efGlenn Kasten // property value is empty, or unexpected value 1215eabd34665adc284525fe7337ad5c56a8b92964efGlenn Kasten } else { 1216eabd34665adc284525fe7337ad5c56a8b92964efGlenn Kasten if (mDecryptHandle != NULL) { 1217eabd34665adc284525fe7337ad5c56a8b92964efGlenn Kasten setProtectionBit = true; 1218eabd34665adc284525fe7337ad5c56a8b92964efGlenn Kasten } 1219eabd34665adc284525fe7337ad5c56a8b92964efGlenn Kasten } 1220eabd34665adc284525fe7337ad5c56a8b92964efGlenn Kasten // can' read property value 1221eabd34665adc284525fe7337ad5c56a8b92964efGlenn Kasten } else { 1222eabd34665adc284525fe7337ad5c56a8b92964efGlenn Kasten if (mDecryptHandle != NULL) { 1223eabd34665adc284525fe7337ad5c56a8b92964efGlenn Kasten setProtectionBit = true; 1224eabd34665adc284525fe7337ad5c56a8b92964efGlenn Kasten } 1225eabd34665adc284525fe7337ad5c56a8b92964efGlenn Kasten } 1226eabd34665adc284525fe7337ad5c56a8b92964efGlenn Kasten // note that usage bit is already cleared, so no need to clear it in the "else" case 1227eabd34665adc284525fe7337ad5c56a8b92964efGlenn Kasten if (setProtectionBit) { 1228eabd34665adc284525fe7337ad5c56a8b92964efGlenn Kasten flags |= OMXCodec::kEnableGrallocUsageProtected; 1229eabd34665adc284525fe7337ad5c56a8b92964efGlenn Kasten } 1230eabd34665adc284525fe7337ad5c56a8b92964efGlenn Kasten#else 12312eb62955eb84b97695e8a7e56e14310cbb86412bGlenn Kasten if (mDecryptHandle != NULL) { 12322eb62955eb84b97695e8a7e56e14310cbb86412bGlenn Kasten flags |= OMXCodec::kEnableGrallocUsageProtected; 12332eb62955eb84b97695e8a7e56e14310cbb86412bGlenn Kasten } 1234eabd34665adc284525fe7337ad5c56a8b92964efGlenn Kasten#endif 12352eb62955eb84b97695e8a7e56e14310cbb86412bGlenn Kasten LOGV("initVideoDecoder flags=0x%x", flags); 1236bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber mVideoSource = OMXCodec::Create( 123788d8a83de12592635248aa1a3bd6b9ea46108501Andreas Huber mClient.interface(), mVideoTrack->getFormat(), 1238bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber false, // createEncoder 123939ddf8e0f18766f7ba1e3246b774aa6ebd93eea8Andreas Huber mVideoTrack, 12401173118eace0e9e347cb007f0da817cee87579edGlenn Kasten NULL, flags, USE_SURFACE_ALLOC ? mNativeWindow : NULL); 1241bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber 1242bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber if (mVideoSource != NULL) { 1243bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber int64_t durationUs; 124488d8a83de12592635248aa1a3bd6b9ea46108501Andreas Huber if (mVideoTrack->getFormat()->findInt64(kKeyDuration, &durationUs)) { 12452415ecb5bb4e1459024f6d6c8ae2d6e3dc4fbdc7Andreas Huber Mutex::Autolock autoLock(mMiscStateLock); 1246bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber if (mDurationUs < 0 || durationUs > mDurationUs) { 1247bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber mDurationUs = durationUs; 1248bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber } 1249bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber } 1250bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber 1251139a5d5bd33c9fc7708d0a79f11ee928f7796e6bAndreas Huber status_t err = mVideoSource->start(); 1252139a5d5bd33c9fc7708d0a79f11ee928f7796e6bAndreas Huber 1253139a5d5bd33c9fc7708d0a79f11ee928f7796e6bAndreas Huber if (err != OK) { 1254139a5d5bd33c9fc7708d0a79f11ee928f7796e6bAndreas Huber mVideoSource.clear(); 1255139a5d5bd33c9fc7708d0a79f11ee928f7796e6bAndreas Huber return err; 1256139a5d5bd33c9fc7708d0a79f11ee928f7796e6bAndreas Huber } 1257bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber } 1258bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber 1259bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber return mVideoSource != NULL ? OK : UNKNOWN_ERROR; 1260bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber} 1261bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber 12624769cc92740e3ab58e9263d42553c12bbf79e3beAndreas Hubervoid AwesomePlayer::finishSeekIfNecessary(int64_t videoTimeUs) { 126364bb6983690bf994d904591145a3cdd6373bdbe6Andreas Huber if (mSeeking == SEEK_VIDEO_ONLY) { 126464bb6983690bf994d904591145a3cdd6373bdbe6Andreas Huber mSeeking = NO_SEEK; 126564bb6983690bf994d904591145a3cdd6373bdbe6Andreas Huber return; 126664bb6983690bf994d904591145a3cdd6373bdbe6Andreas Huber } 126764bb6983690bf994d904591145a3cdd6373bdbe6Andreas Huber 126864bb6983690bf994d904591145a3cdd6373bdbe6Andreas Huber if (mSeeking == NO_SEEK || (mFlags & SEEK_PREVIEW)) { 12694769cc92740e3ab58e9263d42553c12bbf79e3beAndreas Huber return; 12704769cc92740e3ab58e9263d42553c12bbf79e3beAndreas Huber } 12714769cc92740e3ab58e9263d42553c12bbf79e3beAndreas Huber 12724769cc92740e3ab58e9263d42553c12bbf79e3beAndreas Huber if (mAudioPlayer != NULL) { 1273f83dd80384f70da1f6d36d60e831439ff7739ad7Jamie Gennis LOGV("seeking audio to %lld us (%.2f secs).", videoTimeUs, videoTimeUs / 1E6); 12744769cc92740e3ab58e9263d42553c12bbf79e3beAndreas Huber 12754769cc92740e3ab58e9263d42553c12bbf79e3beAndreas Huber // If we don't have a video time, seek audio to the originally 12764769cc92740e3ab58e9263d42553c12bbf79e3beAndreas Huber // requested seek time instead. 12774769cc92740e3ab58e9263d42553c12bbf79e3beAndreas Huber 12784769cc92740e3ab58e9263d42553c12bbf79e3beAndreas Huber mAudioPlayer->seekTo(videoTimeUs < 0 ? mSeekTimeUs : videoTimeUs); 12794769cc92740e3ab58e9263d42553c12bbf79e3beAndreas Huber mWatchForAudioSeekComplete = true; 12804769cc92740e3ab58e9263d42553c12bbf79e3beAndreas Huber } else if (!mSeekNotificationSent) { 12814769cc92740e3ab58e9263d42553c12bbf79e3beAndreas Huber // If we're playing video only, report seek complete now, 12824769cc92740e3ab58e9263d42553c12bbf79e3beAndreas Huber // otherwise audio player will notify us later. 12834769cc92740e3ab58e9263d42553c12bbf79e3beAndreas Huber notifyListener_l(MEDIA_SEEK_COMPLETE); 12844769cc92740e3ab58e9263d42553c12bbf79e3beAndreas Huber } 12854769cc92740e3ab58e9263d42553c12bbf79e3beAndreas Huber 12864769cc92740e3ab58e9263d42553c12bbf79e3beAndreas Huber mFlags |= FIRST_FRAME; 128764bb6983690bf994d904591145a3cdd6373bdbe6Andreas Huber mSeeking = NO_SEEK; 12884769cc92740e3ab58e9263d42553c12bbf79e3beAndreas Huber mSeekNotificationSent = false; 1289a89082944308805b0def7de87c67e370e74b8789Gloria Wang 1290a89082944308805b0def7de87c67e370e74b8789Gloria Wang if (mDecryptHandle != NULL) { 1291a89082944308805b0def7de87c67e370e74b8789Gloria Wang mDrmManagerClient->setPlaybackStatus(mDecryptHandle, 1292a89082944308805b0def7de87c67e370e74b8789Gloria Wang Playback::PAUSE, 0); 1293a89082944308805b0def7de87c67e370e74b8789Gloria Wang mDrmManagerClient->setPlaybackStatus(mDecryptHandle, 1294a89082944308805b0def7de87c67e370e74b8789Gloria Wang Playback::START, videoTimeUs / 1000); 1295a89082944308805b0def7de87c67e370e74b8789Gloria Wang } 12964769cc92740e3ab58e9263d42553c12bbf79e3beAndreas Huber} 12974769cc92740e3ab58e9263d42553c12bbf79e3beAndreas Huber 1298c23f12af0394aa2f6651968a3c8840f1af317aa1Andreas Hubervoid AwesomePlayer::onVideoEvent() { 1299bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber Mutex::Autolock autoLock(mLock); 13007b3396acc702451be9bafb19d7fe26d55d43a316Andreas Huber if (!mVideoEventPending) { 13017b3396acc702451be9bafb19d7fe26d55d43a316Andreas Huber // The event has been cancelled in reset_l() but had already 13027b3396acc702451be9bafb19d7fe26d55d43a316Andreas Huber // been scheduled for execution at that time. 13037b3396acc702451be9bafb19d7fe26d55d43a316Andreas Huber return; 13047b3396acc702451be9bafb19d7fe26d55d43a316Andreas Huber } 1305bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber mVideoEventPending = false; 1306bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber 130764bb6983690bf994d904591145a3cdd6373bdbe6Andreas Huber if (mSeeking != NO_SEEK) { 1308bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber if (mVideoBuffer) { 1309bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber mVideoBuffer->release(); 1310bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber mVideoBuffer = NULL; 1311bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber } 13120a5baa9b411fe086013d2a5e9126ed63fbad046cAndreas Huber 131364bb6983690bf994d904591145a3cdd6373bdbe6Andreas Huber if (mSeeking == SEEK && mCachedSource != NULL && mAudioSource != NULL 13142b1222f8938356669672f35e0e53e176c78c40efAndreas Huber && !(mFlags & SEEK_PREVIEW)) { 13150a5baa9b411fe086013d2a5e9126ed63fbad046cAndreas Huber // We're going to seek the video source first, followed by 13160a5baa9b411fe086013d2a5e9126ed63fbad046cAndreas Huber // the audio source. 13170a5baa9b411fe086013d2a5e9126ed63fbad046cAndreas Huber // In order to avoid jumps in the DataSource offset caused by 13180a5baa9b411fe086013d2a5e9126ed63fbad046cAndreas Huber // the audio codec prefetching data from the old locations 13190a5baa9b411fe086013d2a5e9126ed63fbad046cAndreas Huber // while the video codec is already reading data from the new 13200a5baa9b411fe086013d2a5e9126ed63fbad046cAndreas Huber // locations, we'll "pause" the audio source, causing it to 13210a5baa9b411fe086013d2a5e9126ed63fbad046cAndreas Huber // stop reading input data until a subsequent seek. 13220a5baa9b411fe086013d2a5e9126ed63fbad046cAndreas Huber 1323f03034408506051f2f836e59305fcd5f662bf19aAndreas Huber if (mAudioPlayer != NULL && (mFlags & AUDIO_RUNNING)) { 13240a5baa9b411fe086013d2a5e9126ed63fbad046cAndreas Huber mAudioPlayer->pause(); 1325f03034408506051f2f836e59305fcd5f662bf19aAndreas Huber 1326f03034408506051f2f836e59305fcd5f662bf19aAndreas Huber mFlags &= ~AUDIO_RUNNING; 13270a5baa9b411fe086013d2a5e9126ed63fbad046cAndreas Huber } 13280a5baa9b411fe086013d2a5e9126ed63fbad046cAndreas Huber mAudioSource->pause(); 13290a5baa9b411fe086013d2a5e9126ed63fbad046cAndreas Huber } 1330bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber } 1331bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber 1332bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber if (!mVideoBuffer) { 1333bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber MediaSource::ReadOptions options; 133464bb6983690bf994d904591145a3cdd6373bdbe6Andreas Huber if (mSeeking != NO_SEEK) { 1335bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber LOGV("seeking to %lld us (%.2f secs)", mSeekTimeUs, mSeekTimeUs / 1E6); 1336bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber 1337abd1f4f870925d6776dbe4b930b759a1ab6595caAndreas Huber options.setSeekTo( 133864bb6983690bf994d904591145a3cdd6373bdbe6Andreas Huber mSeekTimeUs, 133964bb6983690bf994d904591145a3cdd6373bdbe6Andreas Huber mSeeking == SEEK_VIDEO_ONLY 134064bb6983690bf994d904591145a3cdd6373bdbe6Andreas Huber ? MediaSource::ReadOptions::SEEK_NEXT_SYNC 134164bb6983690bf994d904591145a3cdd6373bdbe6Andreas Huber : MediaSource::ReadOptions::SEEK_CLOSEST_SYNC); 1342bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber } 1343bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber for (;;) { 1344bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber status_t err = mVideoSource->read(&mVideoBuffer, &options); 1345c1689e49ac867de33f2e81289449878ac2e536a0Andreas Huber options.clearSeekTo(); 1346bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber 1347bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber if (err != OK) { 1348e2b1028852120bcfded33b8f06f66b780437fe92Andreas Huber CHECK(mVideoBuffer == NULL); 1349bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber 1350bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber if (err == INFO_FORMAT_CHANGED) { 1351bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber LOGV("VideoSource signalled format change."); 1352bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber 13535daeb129a2c2ba3d14ccd94af283b5f561c783eaAndreas Huber notifyVideoSize_l(); 13545daeb129a2c2ba3d14ccd94af283b5f561c783eaAndreas Huber 1355a657f8deaf21acbe5faba7be1df9c6681d44d471Andreas Huber if (mVideoRenderer != NULL) { 1356fa090f541bb84a546af2ec834e91a032ff10e66eAndreas Huber mVideoRendererIsPreview = false; 1357a657f8deaf21acbe5faba7be1df9c6681d44d471Andreas Huber initRenderer_l(); 1358a657f8deaf21acbe5faba7be1df9c6681d44d471Andreas Huber } 1359bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber continue; 1360bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber } 1361bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber 13624769cc92740e3ab58e9263d42553c12bbf79e3beAndreas Huber // So video playback is complete, but we may still have 13634769cc92740e3ab58e9263d42553c12bbf79e3beAndreas Huber // a seek request pending that needs to be applied 13644769cc92740e3ab58e9263d42553c12bbf79e3beAndreas Huber // to the audio track. 136564bb6983690bf994d904591145a3cdd6373bdbe6Andreas Huber if (mSeeking != NO_SEEK) { 13664769cc92740e3ab58e9263d42553c12bbf79e3beAndreas Huber LOGV("video stream ended while seeking!"); 13674769cc92740e3ab58e9263d42553c12bbf79e3beAndreas Huber } 13684769cc92740e3ab58e9263d42553c12bbf79e3beAndreas Huber finishSeekIfNecessary(-1); 13694769cc92740e3ab58e9263d42553c12bbf79e3beAndreas Huber 13705d2de4da54504836e4b772b3010ac28c19f667f0Andreas Huber mFlags |= VIDEO_AT_EOS; 13715295c0c55d41a2906ea7f65a3f22e6278cb17d4bAndreas Huber postStreamDoneEvent_l(err); 1372bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber return; 1373bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber } 1374bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber 13754844ac54e8b5997c3b03872dbafe8ebed4787517Andreas Huber if (mVideoBuffer->range_length() == 0) { 137608411b75d4c30ce26180639f158e2f33d190eee8Andreas Huber // Some decoders, notably the PV AVC software decoder 137708411b75d4c30ce26180639f158e2f33d190eee8Andreas Huber // return spurious empty buffers that we just want to ignore. 137808411b75d4c30ce26180639f158e2f33d190eee8Andreas Huber 13794844ac54e8b5997c3b03872dbafe8ebed4787517Andreas Huber mVideoBuffer->release(); 13804844ac54e8b5997c3b03872dbafe8ebed4787517Andreas Huber mVideoBuffer = NULL; 13814844ac54e8b5997c3b03872dbafe8ebed4787517Andreas Huber continue; 13824844ac54e8b5997c3b03872dbafe8ebed4787517Andreas Huber } 13834844ac54e8b5997c3b03872dbafe8ebed4787517Andreas Huber 1384bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber break; 1385bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber } 1386bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber } 1387bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber 1388bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber int64_t timeUs; 1389bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber CHECK(mVideoBuffer->meta_data()->findInt64(kKeyTime, &timeUs)); 1390bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber 139164bb6983690bf994d904591145a3cdd6373bdbe6Andreas Huber if (mSeeking == SEEK_VIDEO_ONLY) { 139264bb6983690bf994d904591145a3cdd6373bdbe6Andreas Huber if (mSeekTimeUs > timeUs) { 139364bb6983690bf994d904591145a3cdd6373bdbe6Andreas Huber LOGI("XXX mSeekTimeUs = %lld us, timeUs = %lld us", 139464bb6983690bf994d904591145a3cdd6373bdbe6Andreas Huber mSeekTimeUs, timeUs); 139564bb6983690bf994d904591145a3cdd6373bdbe6Andreas Huber } 139664bb6983690bf994d904591145a3cdd6373bdbe6Andreas Huber } 139764bb6983690bf994d904591145a3cdd6373bdbe6Andreas Huber 13982415ecb5bb4e1459024f6d6c8ae2d6e3dc4fbdc7Andreas Huber { 13992415ecb5bb4e1459024f6d6c8ae2d6e3dc4fbdc7Andreas Huber Mutex::Autolock autoLock(mMiscStateLock); 14002415ecb5bb4e1459024f6d6c8ae2d6e3dc4fbdc7Andreas Huber mVideoTimeUs = timeUs; 14012415ecb5bb4e1459024f6d6c8ae2d6e3dc4fbdc7Andreas Huber } 1402bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber 140364bb6983690bf994d904591145a3cdd6373bdbe6Andreas Huber SeekType wasSeeking = mSeeking; 14044769cc92740e3ab58e9263d42553c12bbf79e3beAndreas Huber finishSeekIfNecessary(timeUs); 1405bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber 1406f03034408506051f2f836e59305fcd5f662bf19aAndreas Huber if (mAudioPlayer != NULL && !(mFlags & (AUDIO_RUNNING | SEEK_PREVIEW))) { 1407f03034408506051f2f836e59305fcd5f662bf19aAndreas Huber status_t err = startAudioPlayer_l(); 1408f03034408506051f2f836e59305fcd5f662bf19aAndreas Huber if (err != OK) { 1409f03034408506051f2f836e59305fcd5f662bf19aAndreas Huber LOGE("Startung the audio player failed w/ err %d", err); 1410f03034408506051f2f836e59305fcd5f662bf19aAndreas Huber return; 1411f03034408506051f2f836e59305fcd5f662bf19aAndreas Huber } 1412f03034408506051f2f836e59305fcd5f662bf19aAndreas Huber } 1413f03034408506051f2f836e59305fcd5f662bf19aAndreas Huber 14145d2de4da54504836e4b772b3010ac28c19f667f0Andreas Huber TimeSource *ts = (mFlags & AUDIO_AT_EOS) ? &mSystemTimeSource : mTimeSource; 14155d2de4da54504836e4b772b3010ac28c19f667f0Andreas Huber 1416bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber if (mFlags & FIRST_FRAME) { 1417bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber mFlags &= ~FIRST_FRAME; 1418aee6c07b3572bf2510cd9e7d29c454fcfedde31dpmehendale mSinceLastDropped = 0; 14195d2de4da54504836e4b772b3010ac28c19f667f0Andreas Huber mTimeSourceDeltaUs = ts->getRealTimeUs() - timeUs; 1420bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber } 1421bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber 1422bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber int64_t realTimeUs, mediaTimeUs; 14235d2de4da54504836e4b772b3010ac28c19f667f0Andreas Huber if (!(mFlags & AUDIO_AT_EOS) && mAudioPlayer != NULL 1424bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber && mAudioPlayer->getMediaTimeMapping(&realTimeUs, &mediaTimeUs)) { 1425bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber mTimeSourceDeltaUs = realTimeUs - mediaTimeUs; 1426bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber } 1427bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber 142864bb6983690bf994d904591145a3cdd6373bdbe6Andreas Huber if (wasSeeking == SEEK_VIDEO_ONLY) { 142964bb6983690bf994d904591145a3cdd6373bdbe6Andreas Huber int64_t nowUs = ts->getRealTimeUs() - mTimeSourceDeltaUs; 143064bb6983690bf994d904591145a3cdd6373bdbe6Andreas Huber 143164bb6983690bf994d904591145a3cdd6373bdbe6Andreas Huber int64_t latenessUs = nowUs - timeUs; 143264bb6983690bf994d904591145a3cdd6373bdbe6Andreas Huber 143364bb6983690bf994d904591145a3cdd6373bdbe6Andreas Huber if (latenessUs > 0) { 143464bb6983690bf994d904591145a3cdd6373bdbe6Andreas Huber LOGI("after SEEK_VIDEO_ONLY we're late by %.2f secs", latenessUs / 1E6); 143564bb6983690bf994d904591145a3cdd6373bdbe6Andreas Huber } 143664bb6983690bf994d904591145a3cdd6373bdbe6Andreas Huber } 143764bb6983690bf994d904591145a3cdd6373bdbe6Andreas Huber 143864bb6983690bf994d904591145a3cdd6373bdbe6Andreas Huber if (wasSeeking == NO_SEEK) { 143902a1db7dc1de2f2df306ec10bab992bc8bbaaca8Andreas Huber // Let's display the first frame after seeking right away. 1440f8ca90452ff3e252f20de38f1c3eee524c808c3eAndreas Huber 14412b1222f8938356669672f35e0e53e176c78c40efAndreas Huber int64_t nowUs = ts->getRealTimeUs() - mTimeSourceDeltaUs; 1442bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber 14432b1222f8938356669672f35e0e53e176c78c40efAndreas Huber int64_t latenessUs = nowUs - timeUs; 14442b1222f8938356669672f35e0e53e176c78c40efAndreas Huber 144564bb6983690bf994d904591145a3cdd6373bdbe6Andreas Huber if (latenessUs > 500000ll 144664bb6983690bf994d904591145a3cdd6373bdbe6Andreas Huber && mRTSPController == NULL 144764bb6983690bf994d904591145a3cdd6373bdbe6Andreas Huber && mAudioPlayer != NULL 144864bb6983690bf994d904591145a3cdd6373bdbe6Andreas Huber && mAudioPlayer->getMediaTimeMapping( 144964bb6983690bf994d904591145a3cdd6373bdbe6Andreas Huber &realTimeUs, &mediaTimeUs)) { 145064bb6983690bf994d904591145a3cdd6373bdbe6Andreas Huber LOGI("we're much too late (%.2f secs), video skipping ahead", 145164bb6983690bf994d904591145a3cdd6373bdbe6Andreas Huber latenessUs / 1E6); 145264bb6983690bf994d904591145a3cdd6373bdbe6Andreas Huber 145364bb6983690bf994d904591145a3cdd6373bdbe6Andreas Huber mVideoBuffer->release(); 145464bb6983690bf994d904591145a3cdd6373bdbe6Andreas Huber mVideoBuffer = NULL; 145564bb6983690bf994d904591145a3cdd6373bdbe6Andreas Huber 145664bb6983690bf994d904591145a3cdd6373bdbe6Andreas Huber mSeeking = SEEK_VIDEO_ONLY; 145764bb6983690bf994d904591145a3cdd6373bdbe6Andreas Huber mSeekTimeUs = mediaTimeUs; 145864bb6983690bf994d904591145a3cdd6373bdbe6Andreas Huber 145964bb6983690bf994d904591145a3cdd6373bdbe6Andreas Huber postVideoEvent_l(); 146064bb6983690bf994d904591145a3cdd6373bdbe6Andreas Huber return; 146164bb6983690bf994d904591145a3cdd6373bdbe6Andreas Huber } 146264bb6983690bf994d904591145a3cdd6373bdbe6Andreas Huber 14632b1222f8938356669672f35e0e53e176c78c40efAndreas Huber if (latenessUs > 40000) { 14642b1222f8938356669672f35e0e53e176c78c40efAndreas Huber // We're more than 40ms late. 14652b1222f8938356669672f35e0e53e176c78c40efAndreas Huber LOGV("we're late by %lld us (%.2f secs)", latenessUs, latenessUs / 1E6); 14662b1222f8938356669672f35e0e53e176c78c40efAndreas Huber if ( mSinceLastDropped > FRAME_DROP_FREQ) 14672b1222f8938356669672f35e0e53e176c78c40efAndreas Huber { 14682b1222f8938356669672f35e0e53e176c78c40efAndreas Huber LOGV("we're late by %lld us (%.2f secs) dropping one after %d frames", latenessUs, latenessUs / 1E6, mSinceLastDropped); 14692b1222f8938356669672f35e0e53e176c78c40efAndreas Huber mSinceLastDropped = 0; 14702b1222f8938356669672f35e0e53e176c78c40efAndreas Huber mVideoBuffer->release(); 14712b1222f8938356669672f35e0e53e176c78c40efAndreas Huber mVideoBuffer = NULL; 14722b1222f8938356669672f35e0e53e176c78c40efAndreas Huber 14732b1222f8938356669672f35e0e53e176c78c40efAndreas Huber postVideoEvent_l(); 14742b1222f8938356669672f35e0e53e176c78c40efAndreas Huber return; 14752b1222f8938356669672f35e0e53e176c78c40efAndreas Huber } 1476aee6c07b3572bf2510cd9e7d29c454fcfedde31dpmehendale } 1477bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber 14782b1222f8938356669672f35e0e53e176c78c40efAndreas Huber if (latenessUs < -10000) { 14792b1222f8938356669672f35e0e53e176c78c40efAndreas Huber // We're more than 10ms early. 1480bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber 14812b1222f8938356669672f35e0e53e176c78c40efAndreas Huber postVideoEvent_l(10000); 14822b1222f8938356669672f35e0e53e176c78c40efAndreas Huber return; 14832b1222f8938356669672f35e0e53e176c78c40efAndreas Huber } 1484bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber } 1485bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber 1486fa090f541bb84a546af2ec834e91a032ff10e66eAndreas Huber if (mVideoRendererIsPreview || mVideoRenderer == NULL) { 1487fa090f541bb84a546af2ec834e91a032ff10e66eAndreas Huber mVideoRendererIsPreview = false; 1488fa090f541bb84a546af2ec834e91a032ff10e66eAndreas Huber 1489a657f8deaf21acbe5faba7be1df9c6681d44d471Andreas Huber initRenderer_l(); 1490a657f8deaf21acbe5faba7be1df9c6681d44d471Andreas Huber } 1491a657f8deaf21acbe5faba7be1df9c6681d44d471Andreas Huber 1492a657f8deaf21acbe5faba7be1df9c6681d44d471Andreas Huber if (mVideoRenderer != NULL) { 1493aee6c07b3572bf2510cd9e7d29c454fcfedde31dpmehendale mSinceLastDropped++; 1494a657f8deaf21acbe5faba7be1df9c6681d44d471Andreas Huber mVideoRenderer->render(mVideoBuffer); 1495a657f8deaf21acbe5faba7be1df9c6681d44d471Andreas Huber } 1496bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber 1497f5ab57c2d5e02af7483c94eddb177e4f5c9e9892Andreas Huber mVideoBuffer->release(); 1498bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber mVideoBuffer = NULL; 1499bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber 150064bb6983690bf994d904591145a3cdd6373bdbe6Andreas Huber if (wasSeeking != NO_SEEK && (mFlags & SEEK_PREVIEW)) { 15012b1222f8938356669672f35e0e53e176c78c40efAndreas Huber mFlags &= ~SEEK_PREVIEW; 15022b1222f8938356669672f35e0e53e176c78c40efAndreas Huber return; 15032b1222f8938356669672f35e0e53e176c78c40efAndreas Huber } 15042b1222f8938356669672f35e0e53e176c78c40efAndreas Huber 1505bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber postVideoEvent_l(); 1506bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber} 1507bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber 1508bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Hubervoid AwesomePlayer::postVideoEvent_l(int64_t delayUs) { 1509bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber if (mVideoEventPending) { 1510bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber return; 1511bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber } 1512bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber 1513bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber mVideoEventPending = true; 1514bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber mQueue.postEventWithDelay(mVideoEvent, delayUs < 0 ? 10000 : delayUs); 1515bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber} 1516bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber 15175295c0c55d41a2906ea7f65a3f22e6278cb17d4bAndreas Hubervoid AwesomePlayer::postStreamDoneEvent_l(status_t status) { 1518bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber if (mStreamDoneEventPending) { 1519bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber return; 1520bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber } 1521bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber mStreamDoneEventPending = true; 15225295c0c55d41a2906ea7f65a3f22e6278cb17d4bAndreas Huber 15235295c0c55d41a2906ea7f65a3f22e6278cb17d4bAndreas Huber mStreamDoneStatus = status; 1524bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber mQueue.postEvent(mStreamDoneEvent); 1525bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber} 1526bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber 152766b0a35c9a4136a84c3f73b1b25fcb5220138b95Andreas Hubervoid AwesomePlayer::postBufferingEvent_l() { 152866b0a35c9a4136a84c3f73b1b25fcb5220138b95Andreas Huber if (mBufferingEventPending) { 152966b0a35c9a4136a84c3f73b1b25fcb5220138b95Andreas Huber return; 153066b0a35c9a4136a84c3f73b1b25fcb5220138b95Andreas Huber } 153166b0a35c9a4136a84c3f73b1b25fcb5220138b95Andreas Huber mBufferingEventPending = true; 153266b0a35c9a4136a84c3f73b1b25fcb5220138b95Andreas Huber mQueue.postEventWithDelay(mBufferingEvent, 1000000ll); 153366b0a35c9a4136a84c3f73b1b25fcb5220138b95Andreas Huber} 153466b0a35c9a4136a84c3f73b1b25fcb5220138b95Andreas Huber 1535145e68fc778275963189b02a1adcbe27cce4d769Andreas Hubervoid AwesomePlayer::postVideoLagEvent_l() { 1536145e68fc778275963189b02a1adcbe27cce4d769Andreas Huber if (mVideoLagEventPending) { 1537145e68fc778275963189b02a1adcbe27cce4d769Andreas Huber return; 1538145e68fc778275963189b02a1adcbe27cce4d769Andreas Huber } 1539145e68fc778275963189b02a1adcbe27cce4d769Andreas Huber mVideoLagEventPending = true; 1540145e68fc778275963189b02a1adcbe27cce4d769Andreas Huber mQueue.postEventWithDelay(mVideoLagEvent, 1000000ll); 1541145e68fc778275963189b02a1adcbe27cce4d769Andreas Huber} 1542145e68fc778275963189b02a1adcbe27cce4d769Andreas Huber 15431862a33b246249630b654182afb5914da3480d4cAndreas Hubervoid AwesomePlayer::postCheckAudioStatusEvent_l() { 15441862a33b246249630b654182afb5914da3480d4cAndreas Huber if (mAudioStatusEventPending) { 15451862a33b246249630b654182afb5914da3480d4cAndreas Huber return; 15461862a33b246249630b654182afb5914da3480d4cAndreas Huber } 15471862a33b246249630b654182afb5914da3480d4cAndreas Huber mAudioStatusEventPending = true; 1548ed54ad0f8619ae416b0968ade6248894cbfc4dbaAndreas Huber mQueue.postEvent(mCheckAudioStatusEvent); 15491862a33b246249630b654182afb5914da3480d4cAndreas Huber} 15501862a33b246249630b654182afb5914da3480d4cAndreas Huber 15511862a33b246249630b654182afb5914da3480d4cAndreas Hubervoid AwesomePlayer::onCheckAudioStatus() { 15521862a33b246249630b654182afb5914da3480d4cAndreas Huber Mutex::Autolock autoLock(mLock); 1553d29345dfa29cdcc650f3705e43950ef2500f6728Andreas Huber if (!mAudioStatusEventPending) { 1554d29345dfa29cdcc650f3705e43950ef2500f6728Andreas Huber // Event was dispatched and while we were blocking on the mutex, 1555d29345dfa29cdcc650f3705e43950ef2500f6728Andreas Huber // has already been cancelled. 1556d29345dfa29cdcc650f3705e43950ef2500f6728Andreas Huber return; 1557d29345dfa29cdcc650f3705e43950ef2500f6728Andreas Huber } 1558d29345dfa29cdcc650f3705e43950ef2500f6728Andreas Huber 15591862a33b246249630b654182afb5914da3480d4cAndreas Huber mAudioStatusEventPending = false; 15601862a33b246249630b654182afb5914da3480d4cAndreas Huber 15611862a33b246249630b654182afb5914da3480d4cAndreas Huber if (mWatchForAudioSeekComplete && !mAudioPlayer->isSeeking()) { 15621862a33b246249630b654182afb5914da3480d4cAndreas Huber mWatchForAudioSeekComplete = false; 15631321fdd94d354431b930735e9f38f32ecd189a2dAndreas Huber 15641321fdd94d354431b930735e9f38f32ecd189a2dAndreas Huber if (!mSeekNotificationSent) { 15651321fdd94d354431b930735e9f38f32ecd189a2dAndreas Huber notifyListener_l(MEDIA_SEEK_COMPLETE); 15661321fdd94d354431b930735e9f38f32ecd189a2dAndreas Huber mSeekNotificationSent = true; 15671321fdd94d354431b930735e9f38f32ecd189a2dAndreas Huber } 1568dac4ee72bac87388a1495e098f39d73168c8078fAndreas Huber 156964bb6983690bf994d904591145a3cdd6373bdbe6Andreas Huber mSeeking = NO_SEEK; 15701862a33b246249630b654182afb5914da3480d4cAndreas Huber } 15711862a33b246249630b654182afb5914da3480d4cAndreas Huber 15725295c0c55d41a2906ea7f65a3f22e6278cb17d4bAndreas Huber status_t finalStatus; 15735295c0c55d41a2906ea7f65a3f22e6278cb17d4bAndreas Huber if (mWatchForAudioEOS && mAudioPlayer->reachedEOS(&finalStatus)) { 15741862a33b246249630b654182afb5914da3480d4cAndreas Huber mWatchForAudioEOS = false; 15755d2de4da54504836e4b772b3010ac28c19f667f0Andreas Huber mFlags |= AUDIO_AT_EOS; 15765d2de4da54504836e4b772b3010ac28c19f667f0Andreas Huber mFlags |= FIRST_FRAME; 15775295c0c55d41a2906ea7f65a3f22e6278cb17d4bAndreas Huber postStreamDoneEvent_l(finalStatus); 15781862a33b246249630b654182afb5914da3480d4cAndreas Huber } 15791862a33b246249630b654182afb5914da3480d4cAndreas Huber} 15801862a33b246249630b654182afb5914da3480d4cAndreas Huber 1581c23f12af0394aa2f6651968a3c8840f1af317aa1Andreas Huberstatus_t AwesomePlayer::prepare() { 1582c23f12af0394aa2f6651968a3c8840f1af317aa1Andreas Huber Mutex::Autolock autoLock(mLock); 1583bd22c52280179b29eefac91ef7e7bbbc33d25904Andreas Huber return prepare_l(); 1584bd22c52280179b29eefac91ef7e7bbbc33d25904Andreas Huber} 1585c23f12af0394aa2f6651968a3c8840f1af317aa1Andreas Huber 1586bd22c52280179b29eefac91ef7e7bbbc33d25904Andreas Huberstatus_t AwesomePlayer::prepare_l() { 1587bd22c52280179b29eefac91ef7e7bbbc33d25904Andreas Huber if (mFlags & PREPARED) { 1588bd22c52280179b29eefac91ef7e7bbbc33d25904Andreas Huber return OK; 1589bd22c52280179b29eefac91ef7e7bbbc33d25904Andreas Huber } 1590bd22c52280179b29eefac91ef7e7bbbc33d25904Andreas Huber 1591bd22c52280179b29eefac91ef7e7bbbc33d25904Andreas Huber if (mFlags & PREPARING) { 1592bd22c52280179b29eefac91ef7e7bbbc33d25904Andreas Huber return UNKNOWN_ERROR; 1593bd22c52280179b29eefac91ef7e7bbbc33d25904Andreas Huber } 1594bd22c52280179b29eefac91ef7e7bbbc33d25904Andreas Huber 1595bd22c52280179b29eefac91ef7e7bbbc33d25904Andreas Huber mIsAsyncPrepare = false; 1596c23f12af0394aa2f6651968a3c8840f1af317aa1Andreas Huber status_t err = prepareAsync_l(); 1597c23f12af0394aa2f6651968a3c8840f1af317aa1Andreas Huber 1598c23f12af0394aa2f6651968a3c8840f1af317aa1Andreas Huber if (err != OK) { 1599c23f12af0394aa2f6651968a3c8840f1af317aa1Andreas Huber return err; 1600c23f12af0394aa2f6651968a3c8840f1af317aa1Andreas Huber } 1601c23f12af0394aa2f6651968a3c8840f1af317aa1Andreas Huber 1602bd22c52280179b29eefac91ef7e7bbbc33d25904Andreas Huber while (mFlags & PREPARING) { 1603c23f12af0394aa2f6651968a3c8840f1af317aa1Andreas Huber mPreparedCondition.wait(mLock); 1604c23f12af0394aa2f6651968a3c8840f1af317aa1Andreas Huber } 1605c23f12af0394aa2f6651968a3c8840f1af317aa1Andreas Huber 1606bd22c52280179b29eefac91ef7e7bbbc33d25904Andreas Huber return mPrepareResult; 1607c23f12af0394aa2f6651968a3c8840f1af317aa1Andreas Huber} 1608c23f12af0394aa2f6651968a3c8840f1af317aa1Andreas Huber 1609c23f12af0394aa2f6651968a3c8840f1af317aa1Andreas Huberstatus_t AwesomePlayer::prepareAsync() { 1610c23f12af0394aa2f6651968a3c8840f1af317aa1Andreas Huber Mutex::Autolock autoLock(mLock); 1611bd22c52280179b29eefac91ef7e7bbbc33d25904Andreas Huber 1612bd22c52280179b29eefac91ef7e7bbbc33d25904Andreas Huber if (mFlags & PREPARING) { 1613bd22c52280179b29eefac91ef7e7bbbc33d25904Andreas Huber return UNKNOWN_ERROR; // async prepare already pending 1614bd22c52280179b29eefac91ef7e7bbbc33d25904Andreas Huber } 1615bd22c52280179b29eefac91ef7e7bbbc33d25904Andreas Huber 1616bd22c52280179b29eefac91ef7e7bbbc33d25904Andreas Huber mIsAsyncPrepare = true; 1617c23f12af0394aa2f6651968a3c8840f1af317aa1Andreas Huber return prepareAsync_l(); 1618c23f12af0394aa2f6651968a3c8840f1af317aa1Andreas Huber} 1619c23f12af0394aa2f6651968a3c8840f1af317aa1Andreas Huber 1620c23f12af0394aa2f6651968a3c8840f1af317aa1Andreas Huberstatus_t AwesomePlayer::prepareAsync_l() { 1621bd22c52280179b29eefac91ef7e7bbbc33d25904Andreas Huber if (mFlags & PREPARING) { 1622bd22c52280179b29eefac91ef7e7bbbc33d25904Andreas Huber return UNKNOWN_ERROR; // async prepare already pending 1623c23f12af0394aa2f6651968a3c8840f1af317aa1Andreas Huber } 1624c23f12af0394aa2f6651968a3c8840f1af317aa1Andreas Huber 16252e8ffaf95bd35358ecd14ddf00cddaf3abefe0a9Andreas Huber if (!mQueueStarted) { 16262e8ffaf95bd35358ecd14ddf00cddaf3abefe0a9Andreas Huber mQueue.start(); 16272e8ffaf95bd35358ecd14ddf00cddaf3abefe0a9Andreas Huber mQueueStarted = true; 16282e8ffaf95bd35358ecd14ddf00cddaf3abefe0a9Andreas Huber } 16292e8ffaf95bd35358ecd14ddf00cddaf3abefe0a9Andreas Huber 1630bd22c52280179b29eefac91ef7e7bbbc33d25904Andreas Huber mFlags |= PREPARING; 1631c23f12af0394aa2f6651968a3c8840f1af317aa1Andreas Huber mAsyncPrepareEvent = new AwesomeEvent( 1632c23f12af0394aa2f6651968a3c8840f1af317aa1Andreas Huber this, &AwesomePlayer::onPrepareAsyncEvent); 1633c23f12af0394aa2f6651968a3c8840f1af317aa1Andreas Huber 1634c23f12af0394aa2f6651968a3c8840f1af317aa1Andreas Huber mQueue.postEvent(mAsyncPrepareEvent); 1635c23f12af0394aa2f6651968a3c8840f1af317aa1Andreas Huber 1636c23f12af0394aa2f6651968a3c8840f1af317aa1Andreas Huber return OK; 1637c23f12af0394aa2f6651968a3c8840f1af317aa1Andreas Huber} 1638c23f12af0394aa2f6651968a3c8840f1af317aa1Andreas Huber 1639bd22c52280179b29eefac91ef7e7bbbc33d25904Andreas Huberstatus_t AwesomePlayer::finishSetDataSource_l() { 1640e94bd14078d327ef2f800e69907efce641a13272Andreas Huber sp<DataSource> dataSource; 1641e94bd14078d327ef2f800e69907efce641a13272Andreas Huber 16428cb0c4168bf4b678e4a6edfcf409247016be20d5Andreas Huber if (!strncasecmp("http://", mUri.string(), 7) 16438cb0c4168bf4b678e4a6edfcf409247016be20d5Andreas Huber || !strncasecmp("https://", mUri.string(), 8)) { 16447314fa17093d514199fedcb55ac41136a1b31cb3Andreas Huber mConnectingDataSource = new NuHTTPDataSource( 16457314fa17093d514199fedcb55ac41136a1b31cb3Andreas Huber (mFlags & INCOGNITO) ? NuHTTPDataSource::kFlagIncognito : 0); 1646e94bd14078d327ef2f800e69907efce641a13272Andreas Huber 1647e94bd14078d327ef2f800e69907efce641a13272Andreas Huber mLock.unlock(); 164879f77ef3b0a37660ba8c5bcb2dfbfda3860f2135Andreas Huber status_t err = mConnectingDataSource->connect(mUri, &mUriHeaders); 1649e94bd14078d327ef2f800e69907efce641a13272Andreas Huber mLock.lock(); 1650e94bd14078d327ef2f800e69907efce641a13272Andreas Huber 1651e94bd14078d327ef2f800e69907efce641a13272Andreas Huber if (err != OK) { 1652e94bd14078d327ef2f800e69907efce641a13272Andreas Huber mConnectingDataSource.clear(); 1653e94bd14078d327ef2f800e69907efce641a13272Andreas Huber 1654e94bd14078d327ef2f800e69907efce641a13272Andreas Huber LOGI("mConnectingDataSource->connect() returned %d", err); 1655e94bd14078d327ef2f800e69907efce641a13272Andreas Huber return err; 1656e94bd14078d327ef2f800e69907efce641a13272Andreas Huber } 1657e94bd14078d327ef2f800e69907efce641a13272Andreas Huber 16580a5baa9b411fe086013d2a5e9126ed63fbad046cAndreas Huber#if 0 16590a5baa9b411fe086013d2a5e9126ed63fbad046cAndreas Huber mCachedSource = new NuCachedSource2( 16600a5baa9b411fe086013d2a5e9126ed63fbad046cAndreas Huber new ThrottledSource( 16610a5baa9b411fe086013d2a5e9126ed63fbad046cAndreas Huber mConnectingDataSource, 50 * 1024 /* bytes/sec */)); 16620a5baa9b411fe086013d2a5e9126ed63fbad046cAndreas Huber#else 16630a5baa9b411fe086013d2a5e9126ed63fbad046cAndreas Huber mCachedSource = new NuCachedSource2(mConnectingDataSource); 16640a5baa9b411fe086013d2a5e9126ed63fbad046cAndreas Huber#endif 1665e94bd14078d327ef2f800e69907efce641a13272Andreas Huber mConnectingDataSource.clear(); 16660a5baa9b411fe086013d2a5e9126ed63fbad046cAndreas Huber 16670a5baa9b411fe086013d2a5e9126ed63fbad046cAndreas Huber dataSource = mCachedSource; 1668ac05c317cd818701535c5d72ce90da98c4bae75bAndreas Huber 1669ac05c317cd818701535c5d72ce90da98c4bae75bAndreas Huber // We're going to prefill the cache before trying to instantiate 1670ac05c317cd818701535c5d72ce90da98c4bae75bAndreas Huber // the extractor below, as the latter is an operation that otherwise 1671ac05c317cd818701535c5d72ce90da98c4bae75bAndreas Huber // could block on the datasource for a significant amount of time. 1672ac05c317cd818701535c5d72ce90da98c4bae75bAndreas Huber // During that time we'd be unable to abort the preparation phase 1673ac05c317cd818701535c5d72ce90da98c4bae75bAndreas Huber // without this prefill. 1674ac05c317cd818701535c5d72ce90da98c4bae75bAndreas Huber 1675ac05c317cd818701535c5d72ce90da98c4bae75bAndreas Huber mLock.unlock(); 1676ac05c317cd818701535c5d72ce90da98c4bae75bAndreas Huber 1677ac05c317cd818701535c5d72ce90da98c4bae75bAndreas Huber for (;;) { 1678ac05c317cd818701535c5d72ce90da98c4bae75bAndreas Huber status_t finalStatus; 1679ac05c317cd818701535c5d72ce90da98c4bae75bAndreas Huber size_t cachedDataRemaining = 1680ac05c317cd818701535c5d72ce90da98c4bae75bAndreas Huber mCachedSource->approxDataRemaining(&finalStatus); 1681ac05c317cd818701535c5d72ce90da98c4bae75bAndreas Huber 1682ac05c317cd818701535c5d72ce90da98c4bae75bAndreas Huber if (finalStatus != OK || cachedDataRemaining >= kHighWaterMarkBytes 1683ac05c317cd818701535c5d72ce90da98c4bae75bAndreas Huber || (mFlags & PREPARE_CANCELLED)) { 1684ac05c317cd818701535c5d72ce90da98c4bae75bAndreas Huber break; 1685ac05c317cd818701535c5d72ce90da98c4bae75bAndreas Huber } 1686ac05c317cd818701535c5d72ce90da98c4bae75bAndreas Huber 1687ac05c317cd818701535c5d72ce90da98c4bae75bAndreas Huber usleep(200000); 1688ac05c317cd818701535c5d72ce90da98c4bae75bAndreas Huber } 1689ac05c317cd818701535c5d72ce90da98c4bae75bAndreas Huber 1690ac05c317cd818701535c5d72ce90da98c4bae75bAndreas Huber mLock.lock(); 1691ac05c317cd818701535c5d72ce90da98c4bae75bAndreas Huber 1692ac05c317cd818701535c5d72ce90da98c4bae75bAndreas Huber if (mFlags & PREPARE_CANCELLED) { 1693ac05c317cd818701535c5d72ce90da98c4bae75bAndreas Huber LOGI("Prepare cancelled while waiting for initial cache fill."); 1694ac05c317cd818701535c5d72ce90da98c4bae75bAndreas Huber return UNKNOWN_ERROR; 1695ac05c317cd818701535c5d72ce90da98c4bae75bAndreas Huber } 1696cf7b9c7aae758ac0b99833915053c63c2ac46e09Andreas Huber } else if (!strncasecmp("rtsp://", mUri.string(), 7)) { 1697cf7b9c7aae758ac0b99833915053c63c2ac46e09Andreas Huber if (mLooper == NULL) { 1698cf7b9c7aae758ac0b99833915053c63c2ac46e09Andreas Huber mLooper = new ALooper; 1699a814c1fdc2acf0ed2ee3b175110f6039be7c4873Andreas Huber mLooper->setName("rtsp"); 1700cf7b9c7aae758ac0b99833915053c63c2ac46e09Andreas Huber mLooper->start(); 1701cf7b9c7aae758ac0b99833915053c63c2ac46e09Andreas Huber } 1702cf7b9c7aae758ac0b99833915053c63c2ac46e09Andreas Huber mRTSPController = new ARTSPController(mLooper); 1703f1958f9442bc937e1f8c8d9175901500b944b021Andreas Huber mConnectingRTSPController = mRTSPController; 1704f1958f9442bc937e1f8c8d9175901500b944b021Andreas Huber 1705f1958f9442bc937e1f8c8d9175901500b944b021Andreas Huber mLock.unlock(); 1706cf7b9c7aae758ac0b99833915053c63c2ac46e09Andreas Huber status_t err = mRTSPController->connect(mUri.string()); 1707f1958f9442bc937e1f8c8d9175901500b944b021Andreas Huber mLock.lock(); 1708f1958f9442bc937e1f8c8d9175901500b944b021Andreas Huber 1709f1958f9442bc937e1f8c8d9175901500b944b021Andreas Huber mConnectingRTSPController.clear(); 1710cf7b9c7aae758ac0b99833915053c63c2ac46e09Andreas Huber 1711cf7b9c7aae758ac0b99833915053c63c2ac46e09Andreas Huber LOGI("ARTSPController::connect returned %d", err); 1712cf7b9c7aae758ac0b99833915053c63c2ac46e09Andreas Huber 1713cf7b9c7aae758ac0b99833915053c63c2ac46e09Andreas Huber if (err != OK) { 1714cf7b9c7aae758ac0b99833915053c63c2ac46e09Andreas Huber mRTSPController.clear(); 1715cf7b9c7aae758ac0b99833915053c63c2ac46e09Andreas Huber return err; 1716cf7b9c7aae758ac0b99833915053c63c2ac46e09Andreas Huber } 1717e71d10e7ad55ccbcb0756c007caef1c959090384Andreas Huber 1718cf7b9c7aae758ac0b99833915053c63c2ac46e09Andreas Huber sp<MediaExtractor> extractor = mRTSPController.get(); 1719e71d10e7ad55ccbcb0756c007caef1c959090384Andreas Huber return setDataSource_l(extractor); 1720e94bd14078d327ef2f800e69907efce641a13272Andreas Huber } else { 1721e94bd14078d327ef2f800e69907efce641a13272Andreas Huber dataSource = DataSource::CreateFromURI(mUri.string(), &mUriHeaders); 1722e94bd14078d327ef2f800e69907efce641a13272Andreas Huber } 1723bd22c52280179b29eefac91ef7e7bbbc33d25904Andreas Huber 1724bd22c52280179b29eefac91ef7e7bbbc33d25904Andreas Huber if (dataSource == NULL) { 1725bd22c52280179b29eefac91ef7e7bbbc33d25904Andreas Huber return UNKNOWN_ERROR; 1726bd22c52280179b29eefac91ef7e7bbbc33d25904Andreas Huber } 1727bd22c52280179b29eefac91ef7e7bbbc33d25904Andreas Huber 1728bd22c52280179b29eefac91ef7e7bbbc33d25904Andreas Huber sp<MediaExtractor> extractor = MediaExtractor::Create(dataSource); 1729bd22c52280179b29eefac91ef7e7bbbc33d25904Andreas Huber 1730bd22c52280179b29eefac91ef7e7bbbc33d25904Andreas Huber if (extractor == NULL) { 1731bd22c52280179b29eefac91ef7e7bbbc33d25904Andreas Huber return UNKNOWN_ERROR; 1732bd22c52280179b29eefac91ef7e7bbbc33d25904Andreas Huber } 1733bd22c52280179b29eefac91ef7e7bbbc33d25904Andreas Huber 1734dcd25efb46c41c8d24a0a9cf61fb57f84149709eGloria Wang dataSource->getDrmInfo(&mDecryptHandle, &mDrmManagerClient); 1735b371426ce4cf2fa6d8c3d1903b61322feb165d35Gloria Wang if (mDecryptHandle != NULL) { 17368f64134f749e4f7861a08a3063450fc714c4651dGloria Wang CHECK(mDrmManagerClient); 1737b371426ce4cf2fa6d8c3d1903b61322feb165d35Gloria Wang if (RightsStatus::RIGHTS_VALID == mDecryptHandle->status) { 1738b371426ce4cf2fa6d8c3d1903b61322feb165d35Gloria Wang if (DecryptApiType::WV_BASED == mDecryptHandle->decryptApiType) { 1739b371426ce4cf2fa6d8c3d1903b61322feb165d35Gloria Wang LOGD("Setting mCachedSource to NULL for WVM\n"); 1740b371426ce4cf2fa6d8c3d1903b61322feb165d35Gloria Wang mCachedSource.clear(); 1741b371426ce4cf2fa6d8c3d1903b61322feb165d35Gloria Wang } 1742b371426ce4cf2fa6d8c3d1903b61322feb165d35Gloria Wang } else { 1743b371426ce4cf2fa6d8c3d1903b61322feb165d35Gloria Wang notifyListener_l(MEDIA_ERROR, MEDIA_ERROR_UNKNOWN, ERROR_NO_LICENSE); 1744b371426ce4cf2fa6d8c3d1903b61322feb165d35Gloria Wang } 1745dcd25efb46c41c8d24a0a9cf61fb57f84149709eGloria Wang } 1746dcd25efb46c41c8d24a0a9cf61fb57f84149709eGloria Wang 1747bd22c52280179b29eefac91ef7e7bbbc33d25904Andreas Huber return setDataSource_l(extractor); 1748bd22c52280179b29eefac91ef7e7bbbc33d25904Andreas Huber} 1749bd22c52280179b29eefac91ef7e7bbbc33d25904Andreas Huber 175088d8a83de12592635248aa1a3bd6b9ea46108501Andreas Hubervoid AwesomePlayer::abortPrepare(status_t err) { 175188d8a83de12592635248aa1a3bd6b9ea46108501Andreas Huber CHECK(err != OK); 175288d8a83de12592635248aa1a3bd6b9ea46108501Andreas Huber 175388d8a83de12592635248aa1a3bd6b9ea46108501Andreas Huber if (mIsAsyncPrepare) { 175488d8a83de12592635248aa1a3bd6b9ea46108501Andreas Huber notifyListener_l(MEDIA_ERROR, MEDIA_ERROR_UNKNOWN, err); 175588d8a83de12592635248aa1a3bd6b9ea46108501Andreas Huber } 175688d8a83de12592635248aa1a3bd6b9ea46108501Andreas Huber 175788d8a83de12592635248aa1a3bd6b9ea46108501Andreas Huber mPrepareResult = err; 17586a05c9e912aeb8bfe1ef99516def91a177a481b6Andreas Huber mFlags &= ~(PREPARING|PREPARE_CANCELLED|PREPARING_CONNECTED); 175988d8a83de12592635248aa1a3bd6b9ea46108501Andreas Huber mAsyncPrepareEvent = NULL; 176088d8a83de12592635248aa1a3bd6b9ea46108501Andreas Huber mPreparedCondition.broadcast(); 176188d8a83de12592635248aa1a3bd6b9ea46108501Andreas Huber} 176288d8a83de12592635248aa1a3bd6b9ea46108501Andreas Huber 1763e966fb05c7e67a7f5dce65024de60aac83eb6f81Andreas Huber// static 1764e966fb05c7e67a7f5dce65024de60aac83eb6f81Andreas Huberbool AwesomePlayer::ContinuePreparation(void *cookie) { 1765e966fb05c7e67a7f5dce65024de60aac83eb6f81Andreas Huber AwesomePlayer *me = static_cast<AwesomePlayer *>(cookie); 1766e966fb05c7e67a7f5dce65024de60aac83eb6f81Andreas Huber 1767e966fb05c7e67a7f5dce65024de60aac83eb6f81Andreas Huber return (me->mFlags & PREPARE_CANCELLED) == 0; 1768e966fb05c7e67a7f5dce65024de60aac83eb6f81Andreas Huber} 1769e966fb05c7e67a7f5dce65024de60aac83eb6f81Andreas Huber 1770c23f12af0394aa2f6651968a3c8840f1af317aa1Andreas Hubervoid AwesomePlayer::onPrepareAsyncEvent() { 17718650e1960905097f6f1d6aa462ccb1c93c656834Andreas Huber Mutex::Autolock autoLock(mLock); 1772bd22c52280179b29eefac91ef7e7bbbc33d25904Andreas Huber 17738650e1960905097f6f1d6aa462ccb1c93c656834Andreas Huber if (mFlags & PREPARE_CANCELLED) { 17748650e1960905097f6f1d6aa462ccb1c93c656834Andreas Huber LOGI("prepare was cancelled before doing anything"); 17758650e1960905097f6f1d6aa462ccb1c93c656834Andreas Huber abortPrepare(UNKNOWN_ERROR); 17768650e1960905097f6f1d6aa462ccb1c93c656834Andreas Huber return; 17778650e1960905097f6f1d6aa462ccb1c93c656834Andreas Huber } 1778e94bd14078d327ef2f800e69907efce641a13272Andreas Huber 17798650e1960905097f6f1d6aa462ccb1c93c656834Andreas Huber if (mUri.size() > 0) { 17808650e1960905097f6f1d6aa462ccb1c93c656834Andreas Huber status_t err = finishSetDataSource_l(); 1781bd22c52280179b29eefac91ef7e7bbbc33d25904Andreas Huber 17828650e1960905097f6f1d6aa462ccb1c93c656834Andreas Huber if (err != OK) { 17838650e1960905097f6f1d6aa462ccb1c93c656834Andreas Huber abortPrepare(err); 17848650e1960905097f6f1d6aa462ccb1c93c656834Andreas Huber return; 1785bd22c52280179b29eefac91ef7e7bbbc33d25904Andreas Huber } 17868650e1960905097f6f1d6aa462ccb1c93c656834Andreas Huber } 1787bd22c52280179b29eefac91ef7e7bbbc33d25904Andreas Huber 17888650e1960905097f6f1d6aa462ccb1c93c656834Andreas Huber if (mVideoTrack != NULL && mVideoSource == NULL) { 17898650e1960905097f6f1d6aa462ccb1c93c656834Andreas Huber status_t err = initVideoDecoder(); 17901322e7ebc33e8e161fb73cd47e43dd93357608e4Andreas Huber 17918650e1960905097f6f1d6aa462ccb1c93c656834Andreas Huber if (err != OK) { 17928650e1960905097f6f1d6aa462ccb1c93c656834Andreas Huber abortPrepare(err); 17938650e1960905097f6f1d6aa462ccb1c93c656834Andreas Huber return; 17941322e7ebc33e8e161fb73cd47e43dd93357608e4Andreas Huber } 17958650e1960905097f6f1d6aa462ccb1c93c656834Andreas Huber } 17961322e7ebc33e8e161fb73cd47e43dd93357608e4Andreas Huber 17978650e1960905097f6f1d6aa462ccb1c93c656834Andreas Huber if (mAudioTrack != NULL && mAudioSource == NULL) { 17988650e1960905097f6f1d6aa462ccb1c93c656834Andreas Huber status_t err = initAudioDecoder(); 17991322e7ebc33e8e161fb73cd47e43dd93357608e4Andreas Huber 18008650e1960905097f6f1d6aa462ccb1c93c656834Andreas Huber if (err != OK) { 18018650e1960905097f6f1d6aa462ccb1c93c656834Andreas Huber abortPrepare(err); 18028650e1960905097f6f1d6aa462ccb1c93c656834Andreas Huber return; 18031322e7ebc33e8e161fb73cd47e43dd93357608e4Andreas Huber } 1804c23f12af0394aa2f6651968a3c8840f1af317aa1Andreas Huber } 1805c23f12af0394aa2f6651968a3c8840f1af317aa1Andreas Huber 18066a05c9e912aeb8bfe1ef99516def91a177a481b6Andreas Huber mFlags |= PREPARING_CONNECTED; 18076a05c9e912aeb8bfe1ef99516def91a177a481b6Andreas Huber 18088650e1960905097f6f1d6aa462ccb1c93c656834Andreas Huber if (mCachedSource != NULL || mRTSPController != NULL) { 18098650e1960905097f6f1d6aa462ccb1c93c656834Andreas Huber postBufferingEvent_l(); 18108650e1960905097f6f1d6aa462ccb1c93c656834Andreas Huber } else { 18118650e1960905097f6f1d6aa462ccb1c93c656834Andreas Huber finishAsyncPrepare_l(); 18128650e1960905097f6f1d6aa462ccb1c93c656834Andreas Huber } 18138650e1960905097f6f1d6aa462ccb1c93c656834Andreas Huber} 1814c23f12af0394aa2f6651968a3c8840f1af317aa1Andreas Huber 18158650e1960905097f6f1d6aa462ccb1c93c656834Andreas Hubervoid AwesomePlayer::finishAsyncPrepare_l() { 1816bd22c52280179b29eefac91ef7e7bbbc33d25904Andreas Huber if (mIsAsyncPrepare) { 18175daeb129a2c2ba3d14ccd94af283b5f561c783eaAndreas Huber if (mVideoSource == NULL) { 1818bd22c52280179b29eefac91ef7e7bbbc33d25904Andreas Huber notifyListener_l(MEDIA_SET_VIDEO_SIZE, 0, 0); 1819bd22c52280179b29eefac91ef7e7bbbc33d25904Andreas Huber } else { 18205daeb129a2c2ba3d14ccd94af283b5f561c783eaAndreas Huber notifyVideoSize_l(); 1821bd22c52280179b29eefac91ef7e7bbbc33d25904Andreas Huber } 1822c23f12af0394aa2f6651968a3c8840f1af317aa1Andreas Huber 1823bd22c52280179b29eefac91ef7e7bbbc33d25904Andreas Huber notifyListener_l(MEDIA_PREPARED); 1824bd22c52280179b29eefac91ef7e7bbbc33d25904Andreas Huber } 1825c23f12af0394aa2f6651968a3c8840f1af317aa1Andreas Huber 1826bd22c52280179b29eefac91ef7e7bbbc33d25904Andreas Huber mPrepareResult = OK; 18276a05c9e912aeb8bfe1ef99516def91a177a481b6Andreas Huber mFlags &= ~(PREPARING|PREPARE_CANCELLED|PREPARING_CONNECTED); 1828bd22c52280179b29eefac91ef7e7bbbc33d25904Andreas Huber mFlags |= PREPARED; 1829c23f12af0394aa2f6651968a3c8840f1af317aa1Andreas Huber mAsyncPrepareEvent = NULL; 1830bd22c52280179b29eefac91ef7e7bbbc33d25904Andreas Huber mPreparedCondition.broadcast(); 1831c23f12af0394aa2f6651968a3c8840f1af317aa1Andreas Huber} 1832c23f12af0394aa2f6651968a3c8840f1af317aa1Andreas Huber 1833acdd9d0f59c3d8bdc3de80664a609527ec3d21e2Andreas Huberuint32_t AwesomePlayer::flags() const { 1834acdd9d0f59c3d8bdc3de80664a609527ec3d21e2Andreas Huber return mExtractorFlags; 1835acdd9d0f59c3d8bdc3de80664a609527ec3d21e2Andreas Huber} 1836acdd9d0f59c3d8bdc3de80664a609527ec3d21e2Andreas Huber 1837ed54ad0f8619ae416b0968ade6248894cbfc4dbaAndreas Hubervoid AwesomePlayer::postAudioEOS() { 1838ed54ad0f8619ae416b0968ade6248894cbfc4dbaAndreas Huber postCheckAudioStatusEvent_l(); 1839ed54ad0f8619ae416b0968ade6248894cbfc4dbaAndreas Huber} 1840ed54ad0f8619ae416b0968ade6248894cbfc4dbaAndreas Huber 1841ed54ad0f8619ae416b0968ade6248894cbfc4dbaAndreas Hubervoid AwesomePlayer::postAudioSeekComplete() { 1842ed54ad0f8619ae416b0968ade6248894cbfc4dbaAndreas Huber postCheckAudioStatusEvent_l(); 1843ed54ad0f8619ae416b0968ade6248894cbfc4dbaAndreas Huber} 1844ed54ad0f8619ae416b0968ade6248894cbfc4dbaAndreas Huber 1845bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber} // namespace android 1846