AwesomePlayer.cpp revision 7340743ce30766af6334bbd9acf813eb66dd5a60
1bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber/* 2bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber * Copyright (C) 2009 The Android Open Source Project 3bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber * 4bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber * Licensed under the Apache License, Version 2.0 (the "License"); 5bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber * you may not use this file except in compliance with the License. 6bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber * You may obtain a copy of the License at 7bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber * 8bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber * http://www.apache.org/licenses/LICENSE-2.0 9bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber * 10bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber * Unless required by applicable law or agreed to in writing, software 11bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber * distributed under the License is distributed on an "AS IS" BASIS, 12bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber * See the License for the specific language governing permissions and 14bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber * limitations under the License. 15bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber */ 16bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber 176c00983982d167bdb348c437f0480a480f38696cGlenn Kasten#undef DEBUG_HDCP 18eabd34665adc284525fe7337ad5c56a8b92964efGlenn Kasten 19bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber//#define LOG_NDEBUG 0 20bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber#define LOG_TAG "AwesomePlayer" 21bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber#include <utils/Log.h> 22bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber 23988e3f0b2c74095deae580157c57935a98573052Andreas Huber#include <dlfcn.h> 24988e3f0b2c74095deae580157c57935a98573052Andreas Huber 25cf7b9c7aae758ac0b99833915053c63c2ac46e09Andreas Huber#include "include/ARTSPController.h" 26bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber#include "include/AwesomePlayer.h" 27733b7729ea462fae9c6899456444e28fef1c757cAndreas Huber#include "include/SoftwareRenderer.h" 280a5baa9b411fe086013d2a5e9126ed63fbad046cAndreas Huber#include "include/NuCachedSource2.h" 290a5baa9b411fe086013d2a5e9126ed63fbad046cAndreas Huber#include "include/ThrottledSource.h" 30bff07d0b22a5ee2d9f044f6cb5e4be1532017ab0Andreas Huber#include "include/MPEG2TSExtractor.h" 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 58e332a9181cf6a3155ed1a0fd2afc212ccb1f2753Andreas Huber 59bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Hubernamespace android { 60bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber 618650e1960905097f6f1d6aa462ccb1c93c656834Andreas Huberstatic int64_t kLowWaterMarkUs = 2000000ll; // 2secs 628650e1960905097f6f1d6aa462ccb1c93c656834Andreas Huberstatic int64_t kHighWaterMarkUs = 10000000ll; // 10secs 63100a4408968b90e314526185d572c72ea4cc784aAndreas Huberstatic int64_t kHighWaterMarkRTSPUs = 4000000ll; // 4secs 64ac05c317cd818701535c5d72ce90da98c4bae75bAndreas Huberstatic const size_t kLowWaterMarkBytes = 40000; 65ac05c317cd818701535c5d72ce90da98c4bae75bAndreas Huberstatic const size_t kHighWaterMarkBytes = 200000; 668650e1960905097f6f1d6aa462ccb1c93c656834Andreas Huber 67bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huberstruct AwesomeEvent : public TimedEventQueue::Event { 68c23f12af0394aa2f6651968a3c8840f1af317aa1Andreas Huber AwesomeEvent( 69c23f12af0394aa2f6651968a3c8840f1af317aa1Andreas Huber AwesomePlayer *player, 70c23f12af0394aa2f6651968a3c8840f1af317aa1Andreas Huber void (AwesomePlayer::*method)()) 71bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber : mPlayer(player), 72c23f12af0394aa2f6651968a3c8840f1af317aa1Andreas Huber mMethod(method) { 73bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber } 74bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber 75bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huberprotected: 76bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber virtual ~AwesomeEvent() {} 77bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber 78bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber virtual void fire(TimedEventQueue *queue, int64_t /* now_us */) { 79c23f12af0394aa2f6651968a3c8840f1af317aa1Andreas Huber (mPlayer->*mMethod)(); 80bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber } 81bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber 82bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huberprivate: 83bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber AwesomePlayer *mPlayer; 84c23f12af0394aa2f6651968a3c8840f1af317aa1Andreas Huber void (AwesomePlayer::*mMethod)(); 85bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber 86bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber AwesomeEvent(const AwesomeEvent &); 87bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber AwesomeEvent &operator=(const AwesomeEvent &); 88bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber}; 89bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber 90733b7729ea462fae9c6899456444e28fef1c757cAndreas Huberstruct AwesomeLocalRenderer : public AwesomeRenderer { 91733b7729ea462fae9c6899456444e28fef1c757cAndreas Huber AwesomeLocalRenderer( 921173118eace0e9e347cb007f0da817cee87579edGlenn Kasten const sp<ANativeWindow> &nativeWindow, const sp<MetaData> &meta) 931173118eace0e9e347cb007f0da817cee87579edGlenn Kasten : mTarget(new SoftwareRenderer(nativeWindow, meta)) { 94733b7729ea462fae9c6899456444e28fef1c757cAndreas Huber } 95733b7729ea462fae9c6899456444e28fef1c757cAndreas Huber 96733b7729ea462fae9c6899456444e28fef1c757cAndreas Huber virtual void render(MediaBuffer *buffer) { 97fa090f541bb84a546af2ec834e91a032ff10e66eAndreas Huber render((const uint8_t *)buffer->data() + buffer->range_offset(), 98fa090f541bb84a546af2ec834e91a032ff10e66eAndreas Huber buffer->range_length()); 99fa090f541bb84a546af2ec834e91a032ff10e66eAndreas Huber } 100fa090f541bb84a546af2ec834e91a032ff10e66eAndreas Huber 101fa090f541bb84a546af2ec834e91a032ff10e66eAndreas Huber void render(const void *data, size_t size) { 102fa090f541bb84a546af2ec834e91a032ff10e66eAndreas Huber mTarget->render(data, size, NULL); 103733b7729ea462fae9c6899456444e28fef1c757cAndreas Huber } 104733b7729ea462fae9c6899456444e28fef1c757cAndreas Huber 105733b7729ea462fae9c6899456444e28fef1c757cAndreas Huberprotected: 106733b7729ea462fae9c6899456444e28fef1c757cAndreas Huber virtual ~AwesomeLocalRenderer() { 107733b7729ea462fae9c6899456444e28fef1c757cAndreas Huber delete mTarget; 108733b7729ea462fae9c6899456444e28fef1c757cAndreas Huber mTarget = NULL; 109733b7729ea462fae9c6899456444e28fef1c757cAndreas Huber } 110733b7729ea462fae9c6899456444e28fef1c757cAndreas Huber 111733b7729ea462fae9c6899456444e28fef1c757cAndreas Huberprivate: 1120a5ca668c6f7d45706e9aec4a1dfec0aacc6d233Andreas Huber SoftwareRenderer *mTarget; 113988e3f0b2c74095deae580157c57935a98573052Andreas Huber 114733b7729ea462fae9c6899456444e28fef1c757cAndreas Huber AwesomeLocalRenderer(const AwesomeLocalRenderer &); 115733b7729ea462fae9c6899456444e28fef1c757cAndreas Huber AwesomeLocalRenderer &operator=(const AwesomeLocalRenderer &);; 116733b7729ea462fae9c6899456444e28fef1c757cAndreas Huber}; 117733b7729ea462fae9c6899456444e28fef1c757cAndreas Huber 1186a9da9fc558263548ebfbae2cbf177eb7454a41bJamie Gennisstruct AwesomeNativeWindowRenderer : public AwesomeRenderer { 119ba529e486dde15fe75ea1b48570f9d60a4cf3c48Andreas Huber AwesomeNativeWindowRenderer( 120ba529e486dde15fe75ea1b48570f9d60a4cf3c48Andreas Huber const sp<ANativeWindow> &nativeWindow, 121ba529e486dde15fe75ea1b48570f9d60a4cf3c48Andreas Huber int32_t rotationDegrees) 1226a9da9fc558263548ebfbae2cbf177eb7454a41bJamie Gennis : mNativeWindow(nativeWindow) { 123ba529e486dde15fe75ea1b48570f9d60a4cf3c48Andreas Huber applyRotation(rotationDegrees); 1246a9da9fc558263548ebfbae2cbf177eb7454a41bJamie Gennis } 1256a9da9fc558263548ebfbae2cbf177eb7454a41bJamie Gennis 1266a9da9fc558263548ebfbae2cbf177eb7454a41bJamie Gennis virtual void render(MediaBuffer *buffer) { 1276a9da9fc558263548ebfbae2cbf177eb7454a41bJamie Gennis status_t err = mNativeWindow->queueBuffer( 1286a9da9fc558263548ebfbae2cbf177eb7454a41bJamie Gennis mNativeWindow.get(), buffer->graphicBuffer().get()); 1296a9da9fc558263548ebfbae2cbf177eb7454a41bJamie Gennis if (err != 0) { 1306a9da9fc558263548ebfbae2cbf177eb7454a41bJamie Gennis LOGE("queueBuffer failed with error %s (%d)", strerror(-err), 1316a9da9fc558263548ebfbae2cbf177eb7454a41bJamie Gennis -err); 1326a9da9fc558263548ebfbae2cbf177eb7454a41bJamie Gennis return; 1336a9da9fc558263548ebfbae2cbf177eb7454a41bJamie Gennis } 1346a9da9fc558263548ebfbae2cbf177eb7454a41bJamie Gennis 1356a9da9fc558263548ebfbae2cbf177eb7454a41bJamie Gennis sp<MetaData> metaData = buffer->meta_data(); 1366a9da9fc558263548ebfbae2cbf177eb7454a41bJamie Gennis metaData->setInt32(kKeyRendered, 1); 1376a9da9fc558263548ebfbae2cbf177eb7454a41bJamie Gennis } 1386a9da9fc558263548ebfbae2cbf177eb7454a41bJamie Gennis 1396a9da9fc558263548ebfbae2cbf177eb7454a41bJamie Gennisprotected: 1406a9da9fc558263548ebfbae2cbf177eb7454a41bJamie Gennis virtual ~AwesomeNativeWindowRenderer() {} 1416a9da9fc558263548ebfbae2cbf177eb7454a41bJamie Gennis 1426a9da9fc558263548ebfbae2cbf177eb7454a41bJamie Gennisprivate: 1436a9da9fc558263548ebfbae2cbf177eb7454a41bJamie Gennis sp<ANativeWindow> mNativeWindow; 1446a9da9fc558263548ebfbae2cbf177eb7454a41bJamie Gennis 145ba529e486dde15fe75ea1b48570f9d60a4cf3c48Andreas Huber void applyRotation(int32_t rotationDegrees) { 146ba529e486dde15fe75ea1b48570f9d60a4cf3c48Andreas Huber uint32_t transform; 147ba529e486dde15fe75ea1b48570f9d60a4cf3c48Andreas Huber switch (rotationDegrees) { 148ba529e486dde15fe75ea1b48570f9d60a4cf3c48Andreas Huber case 0: transform = 0; break; 149ba529e486dde15fe75ea1b48570f9d60a4cf3c48Andreas Huber case 90: transform = HAL_TRANSFORM_ROT_90; break; 150ba529e486dde15fe75ea1b48570f9d60a4cf3c48Andreas Huber case 180: transform = HAL_TRANSFORM_ROT_180; break; 151ba529e486dde15fe75ea1b48570f9d60a4cf3c48Andreas Huber case 270: transform = HAL_TRANSFORM_ROT_270; break; 152ba529e486dde15fe75ea1b48570f9d60a4cf3c48Andreas Huber default: transform = 0; break; 153ba529e486dde15fe75ea1b48570f9d60a4cf3c48Andreas Huber } 154ba529e486dde15fe75ea1b48570f9d60a4cf3c48Andreas Huber 155ba529e486dde15fe75ea1b48570f9d60a4cf3c48Andreas Huber if (transform) { 156ba529e486dde15fe75ea1b48570f9d60a4cf3c48Andreas Huber CHECK_EQ(0, native_window_set_buffers_transform( 157ba529e486dde15fe75ea1b48570f9d60a4cf3c48Andreas Huber mNativeWindow.get(), transform)); 158ba529e486dde15fe75ea1b48570f9d60a4cf3c48Andreas Huber } 159ba529e486dde15fe75ea1b48570f9d60a4cf3c48Andreas Huber } 160ba529e486dde15fe75ea1b48570f9d60a4cf3c48Andreas Huber 1616a9da9fc558263548ebfbae2cbf177eb7454a41bJamie Gennis AwesomeNativeWindowRenderer(const AwesomeNativeWindowRenderer &); 1626a9da9fc558263548ebfbae2cbf177eb7454a41bJamie Gennis AwesomeNativeWindowRenderer &operator=( 1636a9da9fc558263548ebfbae2cbf177eb7454a41bJamie Gennis const AwesomeNativeWindowRenderer &); 1646a9da9fc558263548ebfbae2cbf177eb7454a41bJamie Gennis}; 1656a9da9fc558263548ebfbae2cbf177eb7454a41bJamie Gennis 1667cf180c9bff69e5cc4a2f4e53b432db45ebbebabGloria Wang// To collect the decoder usage 1677cf180c9bff69e5cc4a2f4e53b432db45ebbebabGloria Wangvoid addBatteryData(uint32_t params) { 1687cf180c9bff69e5cc4a2f4e53b432db45ebbebabGloria Wang sp<IBinder> binder = 1697cf180c9bff69e5cc4a2f4e53b432db45ebbebabGloria Wang defaultServiceManager()->getService(String16("media.player")); 1707cf180c9bff69e5cc4a2f4e53b432db45ebbebabGloria Wang sp<IMediaPlayerService> service = interface_cast<IMediaPlayerService>(binder); 1717cf180c9bff69e5cc4a2f4e53b432db45ebbebabGloria Wang CHECK(service.get() != NULL); 1727cf180c9bff69e5cc4a2f4e53b432db45ebbebabGloria Wang 1737cf180c9bff69e5cc4a2f4e53b432db45ebbebabGloria Wang service->addBatteryData(params); 1747cf180c9bff69e5cc4a2f4e53b432db45ebbebabGloria Wang} 175e2b1028852120bcfded33b8f06f66b780437fe92Andreas Huber 1767cf180c9bff69e5cc4a2f4e53b432db45ebbebabGloria Wang//////////////////////////////////////////////////////////////////////////////// 177bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas HuberAwesomePlayer::AwesomePlayer() 1782e8ffaf95bd35358ecd14ddf00cddaf3abefe0a9Andreas Huber : mQueueStarted(false), 1792e8ffaf95bd35358ecd14ddf00cddaf3abefe0a9Andreas Huber mTimeSource(NULL), 180fa090f541bb84a546af2ec834e91a032ff10e66eAndreas Huber mVideoRendererIsPreview(false), 181bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber mAudioPlayer(NULL), 182b45c01c2b8588ff431b511151666a55a39f0a6aeJames Dong mDisplayWidth(0), 183b45c01c2b8588ff431b511151666a55a39f0a6aeJames Dong mDisplayHeight(0), 184bd22c52280179b29eefac91ef7e7bbbc33d25904Andreas Huber mFlags(0), 185acdd9d0f59c3d8bdc3de80664a609527ec3d21e2Andreas Huber mExtractorFlags(0), 1867b3396acc702451be9bafb19d7fe26d55d43a316Andreas Huber mVideoBuffer(NULL), 187150694cda0842d38a9358fe8d1fcb4fb4a76599eAndreas Huber mDecryptHandle(NULL), 188150694cda0842d38a9358fe8d1fcb4fb4a76599eAndreas Huber mLastVideoTimeUs(-1) { 189e2b1028852120bcfded33b8f06f66b780437fe92Andreas Huber CHECK_EQ(mClient.connect(), (status_t)OK); 190bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber 191bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber DataSource::RegisterDefaultSniffers(); 192bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber 193c23f12af0394aa2f6651968a3c8840f1af317aa1Andreas Huber mVideoEvent = new AwesomeEvent(this, &AwesomePlayer::onVideoEvent); 194bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber mVideoEventPending = false; 195c23f12af0394aa2f6651968a3c8840f1af317aa1Andreas Huber mStreamDoneEvent = new AwesomeEvent(this, &AwesomePlayer::onStreamDone); 196bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber mStreamDoneEventPending = false; 197c23f12af0394aa2f6651968a3c8840f1af317aa1Andreas Huber mBufferingEvent = new AwesomeEvent(this, &AwesomePlayer::onBufferingUpdate); 19866b0a35c9a4136a84c3f73b1b25fcb5220138b95Andreas Huber mBufferingEventPending = false; 199145e68fc778275963189b02a1adcbe27cce4d769Andreas Huber mVideoLagEvent = new AwesomeEvent(this, &AwesomePlayer::onVideoLagUpdate); 200145e68fc778275963189b02a1adcbe27cce4d769Andreas Huber mVideoEventPending = false; 201c23f12af0394aa2f6651968a3c8840f1af317aa1Andreas Huber 202c23f12af0394aa2f6651968a3c8840f1af317aa1Andreas Huber mCheckAudioStatusEvent = new AwesomeEvent( 203c23f12af0394aa2f6651968a3c8840f1af317aa1Andreas Huber this, &AwesomePlayer::onCheckAudioStatus); 204c23f12af0394aa2f6651968a3c8840f1af317aa1Andreas Huber 2051862a33b246249630b654182afb5914da3480d4cAndreas Huber mAudioStatusEventPending = false; 206bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber 207bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber reset(); 208bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber} 209bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber 210bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas HuberAwesomePlayer::~AwesomePlayer() { 2112e8ffaf95bd35358ecd14ddf00cddaf3abefe0a9Andreas Huber if (mQueueStarted) { 2122e8ffaf95bd35358ecd14ddf00cddaf3abefe0a9Andreas Huber mQueue.stop(); 2132e8ffaf95bd35358ecd14ddf00cddaf3abefe0a9Andreas Huber } 214bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber 215bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber reset(); 216bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber 217bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber mClient.disconnect(); 218bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber} 219bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber 22066b0a35c9a4136a84c3f73b1b25fcb5220138b95Andreas Hubervoid AwesomePlayer::cancelPlayerEvents(bool keepBufferingGoing) { 221bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber mQueue.cancelEvent(mVideoEvent->eventID()); 222bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber mVideoEventPending = false; 223bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber mQueue.cancelEvent(mStreamDoneEvent->eventID()); 224bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber mStreamDoneEventPending = false; 2251862a33b246249630b654182afb5914da3480d4cAndreas Huber mQueue.cancelEvent(mCheckAudioStatusEvent->eventID()); 2261862a33b246249630b654182afb5914da3480d4cAndreas Huber mAudioStatusEventPending = false; 227145e68fc778275963189b02a1adcbe27cce4d769Andreas Huber mQueue.cancelEvent(mVideoLagEvent->eventID()); 228145e68fc778275963189b02a1adcbe27cce4d769Andreas Huber mVideoLagEventPending = false; 22966b0a35c9a4136a84c3f73b1b25fcb5220138b95Andreas Huber 23066b0a35c9a4136a84c3f73b1b25fcb5220138b95Andreas Huber if (!keepBufferingGoing) { 23166b0a35c9a4136a84c3f73b1b25fcb5220138b95Andreas Huber mQueue.cancelEvent(mBufferingEvent->eventID()); 23266b0a35c9a4136a84c3f73b1b25fcb5220138b95Andreas Huber mBufferingEventPending = false; 23366b0a35c9a4136a84c3f73b1b25fcb5220138b95Andreas Huber } 234bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber} 235bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber 2360726045216f576e97672ebeefc265d39c4ebaaa5Andreas Hubervoid AwesomePlayer::setListener(const wp<MediaPlayerBase> &listener) { 237bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber Mutex::Autolock autoLock(mLock); 238bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber mListener = listener; 239bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber} 240bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber 2415561ccf4a8db88a2e44eac1b3ed13b4ff53a7f20Andreas Huberstatus_t AwesomePlayer::setDataSource( 2425561ccf4a8db88a2e44eac1b3ed13b4ff53a7f20Andreas Huber const char *uri, const KeyedVector<String8, String8> *headers) { 243bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber Mutex::Autolock autoLock(mLock); 2447b3396acc702451be9bafb19d7fe26d55d43a316Andreas Huber return setDataSource_l(uri, headers); 2457b3396acc702451be9bafb19d7fe26d55d43a316Andreas Huber} 246bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber 2477b3396acc702451be9bafb19d7fe26d55d43a316Andreas Huberstatus_t AwesomePlayer::setDataSource_l( 2487b3396acc702451be9bafb19d7fe26d55d43a316Andreas Huber const char *uri, const KeyedVector<String8, String8> *headers) { 249bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber reset_l(); 250bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber 251bd22c52280179b29eefac91ef7e7bbbc33d25904Andreas Huber mUri = uri; 25266b0a35c9a4136a84c3f73b1b25fcb5220138b95Andreas Huber 253bd22c52280179b29eefac91ef7e7bbbc33d25904Andreas Huber if (headers) { 254bd22c52280179b29eefac91ef7e7bbbc33d25904Andreas Huber mUriHeaders = *headers; 2557314fa17093d514199fedcb55ac41136a1b31cb3Andreas Huber 2567314fa17093d514199fedcb55ac41136a1b31cb3Andreas Huber ssize_t index = mUriHeaders.indexOfKey(String8("x-hide-urls-from-log")); 2577314fa17093d514199fedcb55ac41136a1b31cb3Andreas Huber if (index >= 0) { 2587314fa17093d514199fedcb55ac41136a1b31cb3Andreas Huber // Browser is in "incognito" mode, suppress logging URLs. 2597314fa17093d514199fedcb55ac41136a1b31cb3Andreas Huber 2607314fa17093d514199fedcb55ac41136a1b31cb3Andreas Huber // This isn't something that should be passed to the server. 2617314fa17093d514199fedcb55ac41136a1b31cb3Andreas Huber mUriHeaders.removeItemsAt(index); 2627314fa17093d514199fedcb55ac41136a1b31cb3Andreas Huber 2637314fa17093d514199fedcb55ac41136a1b31cb3Andreas Huber mFlags |= INCOGNITO; 2647314fa17093d514199fedcb55ac41136a1b31cb3Andreas Huber } 2657314fa17093d514199fedcb55ac41136a1b31cb3Andreas Huber } 2667314fa17093d514199fedcb55ac41136a1b31cb3Andreas Huber 2677314fa17093d514199fedcb55ac41136a1b31cb3Andreas Huber if (!(mFlags & INCOGNITO)) { 2687314fa17093d514199fedcb55ac41136a1b31cb3Andreas Huber LOGI("setDataSource_l('%s')", mUri.string()); 2697314fa17093d514199fedcb55ac41136a1b31cb3Andreas Huber } else { 2707314fa17093d514199fedcb55ac41136a1b31cb3Andreas Huber LOGI("setDataSource_l(URL suppressed)"); 27166b0a35c9a4136a84c3f73b1b25fcb5220138b95Andreas Huber } 27266b0a35c9a4136a84c3f73b1b25fcb5220138b95Andreas Huber 273bd22c52280179b29eefac91ef7e7bbbc33d25904Andreas Huber // The actual work will be done during preparation in the call to 274bd22c52280179b29eefac91ef7e7bbbc33d25904Andreas Huber // ::finishSetDataSource_l to avoid blocking the calling thread in 275bd22c52280179b29eefac91ef7e7bbbc33d25904Andreas Huber // setDataSource for any significant time. 27666b0a35c9a4136a84c3f73b1b25fcb5220138b95Andreas Huber 277bd22c52280179b29eefac91ef7e7bbbc33d25904Andreas Huber return OK; 278bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber} 279bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber 280bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huberstatus_t AwesomePlayer::setDataSource( 281bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber int fd, int64_t offset, int64_t length) { 282bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber Mutex::Autolock autoLock(mLock); 283bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber 284bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber reset_l(); 285bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber 2867b3396acc702451be9bafb19d7fe26d55d43a316Andreas Huber sp<DataSource> dataSource = new FileSource(fd, offset, length); 287bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber 2887b3396acc702451be9bafb19d7fe26d55d43a316Andreas Huber status_t err = dataSource->initCheck(); 289bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber 290bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber if (err != OK) { 291bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber return err; 292bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber } 293bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber 2947b3396acc702451be9bafb19d7fe26d55d43a316Andreas Huber mFileSource = dataSource; 2957b3396acc702451be9bafb19d7fe26d55d43a316Andreas Huber 2967b3396acc702451be9bafb19d7fe26d55d43a316Andreas Huber return setDataSource_l(dataSource); 2977b3396acc702451be9bafb19d7fe26d55d43a316Andreas Huber} 2987b3396acc702451be9bafb19d7fe26d55d43a316Andreas Huber 299e2b1028852120bcfded33b8f06f66b780437fe92Andreas Huberstatus_t AwesomePlayer::setDataSource(const sp<IStreamSource> &source) { 30085704836f33a199d7e442a23db82abbd5620d35dAndreas Huber return INVALID_OPERATION; 301e2b1028852120bcfded33b8f06f66b780437fe92Andreas Huber} 302e2b1028852120bcfded33b8f06f66b780437fe92Andreas Huber 3037b3396acc702451be9bafb19d7fe26d55d43a316Andreas Huberstatus_t AwesomePlayer::setDataSource_l( 3047b3396acc702451be9bafb19d7fe26d55d43a316Andreas Huber const sp<DataSource> &dataSource) { 3057b3396acc702451be9bafb19d7fe26d55d43a316Andreas Huber sp<MediaExtractor> extractor = MediaExtractor::Create(dataSource); 306bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber 307bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber if (extractor == NULL) { 308bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber return UNKNOWN_ERROR; 309bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber } 310bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber 311b5ce361d19e69fe156f7188c9ee0f4734b259874Gloria Wang dataSource->getDrmInfo(mDecryptHandle, &mDrmManagerClient); 3128f64134f749e4f7861a08a3063450fc714c4651dGloria Wang if (mDecryptHandle != NULL) { 3138f64134f749e4f7861a08a3063450fc714c4651dGloria Wang CHECK(mDrmManagerClient); 3148f64134f749e4f7861a08a3063450fc714c4651dGloria Wang if (RightsStatus::RIGHTS_VALID != mDecryptHandle->status) { 3157340743ce30766af6334bbd9acf813eb66dd5a60Gloria Wang notifyListener_l(MEDIA_ERROR, MEDIA_ERROR_UNKNOWN, ERROR_DRM_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 474cce326fe43411855aca2f719e505b051bc4b61b3Andreas Huber if (mRTSPController != NULL) { 475cce326fe43411855aca2f719e505b051bc4b61b3Andreas Huber mRTSPController->disconnect(); 476cce326fe43411855aca2f719e505b051bc4b61b3Andreas Huber mRTSPController.clear(); 477cce326fe43411855aca2f719e505b051bc4b61b3Andreas Huber } 478cce326fe43411855aca2f719e505b051bc4b61b3Andreas Huber 479bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber if (mVideoSource != NULL) { 480150694cda0842d38a9358fe8d1fcb4fb4a76599eAndreas Huber shutdownVideoDecoder_l(); 481bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber } 482bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber 483bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber mDurationUs = -1; 484bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber mFlags = 0; 485acdd9d0f59c3d8bdc3de80664a609527ec3d21e2Andreas Huber mExtractorFlags = 0; 486bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber mTimeSourceDeltaUs = 0; 487bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber mVideoTimeUs = 0; 488bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber 48964bb6983690bf994d904591145a3cdd6373bdbe6Andreas Huber mSeeking = NO_SEEK; 4901321fdd94d354431b930735e9f38f32ecd189a2dAndreas Huber mSeekNotificationSent = false; 491bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber mSeekTimeUs = 0; 49266b0a35c9a4136a84c3f73b1b25fcb5220138b95Andreas Huber 493bd22c52280179b29eefac91ef7e7bbbc33d25904Andreas Huber mUri.setTo(""); 494bd22c52280179b29eefac91ef7e7bbbc33d25904Andreas Huber mUriHeaders.clear(); 4957b3396acc702451be9bafb19d7fe26d55d43a316Andreas Huber 4967b3396acc702451be9bafb19d7fe26d55d43a316Andreas Huber mFileSource.clear(); 4977b3396acc702451be9bafb19d7fe26d55d43a316Andreas Huber 4987fbdb0903dfbf70b314a74e64e28fb880cdb9247Andreas Huber mBitrate = -1; 499150694cda0842d38a9358fe8d1fcb4fb4a76599eAndreas Huber mLastVideoTimeUs = -1; 500bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber} 501bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber 502c23f12af0394aa2f6651968a3c8840f1af317aa1Andreas Hubervoid AwesomePlayer::notifyListener_l(int msg, int ext1, int ext2) { 5030726045216f576e97672ebeefc265d39c4ebaaa5Andreas Huber if (mListener != NULL) { 5040726045216f576e97672ebeefc265d39c4ebaaa5Andreas Huber sp<MediaPlayerBase> listener = mListener.promote(); 5050726045216f576e97672ebeefc265d39c4ebaaa5Andreas Huber 5060726045216f576e97672ebeefc265d39c4ebaaa5Andreas Huber if (listener != NULL) { 507c23f12af0394aa2f6651968a3c8840f1af317aa1Andreas Huber listener->sendEvent(msg, ext1, ext2); 50866b0a35c9a4136a84c3f73b1b25fcb5220138b95Andreas Huber } 50966b0a35c9a4136a84c3f73b1b25fcb5220138b95Andreas Huber } 51066b0a35c9a4136a84c3f73b1b25fcb5220138b95Andreas Huber} 51166b0a35c9a4136a84c3f73b1b25fcb5220138b95Andreas Huber 5127fbdb0903dfbf70b314a74e64e28fb880cdb9247Andreas Huberbool AwesomePlayer::getBitrate(int64_t *bitrate) { 513c7fc37a3dab9bd1f96713649f351b5990e6316ffJames Dong off64_t size; 5147fbdb0903dfbf70b314a74e64e28fb880cdb9247Andreas Huber if (mDurationUs >= 0 && mCachedSource != NULL 5157fbdb0903dfbf70b314a74e64e28fb880cdb9247Andreas Huber && mCachedSource->getSize(&size) == OK) { 5167fbdb0903dfbf70b314a74e64e28fb880cdb9247Andreas Huber *bitrate = size * 8000000ll / mDurationUs; // in bits/sec 5177fbdb0903dfbf70b314a74e64e28fb880cdb9247Andreas Huber return true; 5187fbdb0903dfbf70b314a74e64e28fb880cdb9247Andreas Huber } 5197fbdb0903dfbf70b314a74e64e28fb880cdb9247Andreas Huber 5207fbdb0903dfbf70b314a74e64e28fb880cdb9247Andreas Huber if (mBitrate >= 0) { 5217fbdb0903dfbf70b314a74e64e28fb880cdb9247Andreas Huber *bitrate = mBitrate; 5227fbdb0903dfbf70b314a74e64e28fb880cdb9247Andreas Huber return true; 5237fbdb0903dfbf70b314a74e64e28fb880cdb9247Andreas Huber } 5247fbdb0903dfbf70b314a74e64e28fb880cdb9247Andreas Huber 5257fbdb0903dfbf70b314a74e64e28fb880cdb9247Andreas Huber *bitrate = 0; 5267fbdb0903dfbf70b314a74e64e28fb880cdb9247Andreas Huber 5277fbdb0903dfbf70b314a74e64e28fb880cdb9247Andreas Huber return false; 5287fbdb0903dfbf70b314a74e64e28fb880cdb9247Andreas Huber} 5297fbdb0903dfbf70b314a74e64e28fb880cdb9247Andreas Huber 5308650e1960905097f6f1d6aa462ccb1c93c656834Andreas Huber// Returns true iff cached duration is available/applicable. 5318650e1960905097f6f1d6aa462ccb1c93c656834Andreas Huberbool AwesomePlayer::getCachedDuration_l(int64_t *durationUs, bool *eos) { 5327fbdb0903dfbf70b314a74e64e28fb880cdb9247Andreas Huber int64_t bitrate; 5338650e1960905097f6f1d6aa462ccb1c93c656834Andreas Huber 5348650e1960905097f6f1d6aa462ccb1c93c656834Andreas Huber if (mRTSPController != NULL) { 5358650e1960905097f6f1d6aa462ccb1c93c656834Andreas Huber *durationUs = mRTSPController->getQueueDurationUs(eos); 5368650e1960905097f6f1d6aa462ccb1c93c656834Andreas Huber return true; 5377fbdb0903dfbf70b314a74e64e28fb880cdb9247Andreas Huber } else if (mCachedSource != NULL && getBitrate(&bitrate)) { 5381bd233ce7e1aa7730bc18d46ffd57791391738cdBryan Mawhinney status_t finalStatus; 5391bd233ce7e1aa7730bc18d46ffd57791391738cdBryan Mawhinney size_t cachedDataRemaining = mCachedSource->approxDataRemaining(&finalStatus); 5408650e1960905097f6f1d6aa462ccb1c93c656834Andreas Huber *durationUs = cachedDataRemaining * 8000000ll / bitrate; 5411bd233ce7e1aa7730bc18d46ffd57791391738cdBryan Mawhinney *eos = (finalStatus != OK); 5428650e1960905097f6f1d6aa462ccb1c93c656834Andreas Huber return true; 5438650e1960905097f6f1d6aa462ccb1c93c656834Andreas Huber } 5448650e1960905097f6f1d6aa462ccb1c93c656834Andreas Huber 5458650e1960905097f6f1d6aa462ccb1c93c656834Andreas Huber return false; 5468650e1960905097f6f1d6aa462ccb1c93c656834Andreas Huber} 5478650e1960905097f6f1d6aa462ccb1c93c656834Andreas Huber 54834ef0f32c8fc0186236a27e07405328cc1f7c56dAndreas Hubervoid AwesomePlayer::ensureCacheIsFetching_l() { 54934ef0f32c8fc0186236a27e07405328cc1f7c56dAndreas Huber if (mCachedSource != NULL) { 55034ef0f32c8fc0186236a27e07405328cc1f7c56dAndreas Huber mCachedSource->resumeFetchingIfNecessary(); 55134ef0f32c8fc0186236a27e07405328cc1f7c56dAndreas Huber } 55234ef0f32c8fc0186236a27e07405328cc1f7c56dAndreas Huber} 55334ef0f32c8fc0186236a27e07405328cc1f7c56dAndreas Huber 554145e68fc778275963189b02a1adcbe27cce4d769Andreas Hubervoid AwesomePlayer::onVideoLagUpdate() { 555145e68fc778275963189b02a1adcbe27cce4d769Andreas Huber Mutex::Autolock autoLock(mLock); 556145e68fc778275963189b02a1adcbe27cce4d769Andreas Huber if (!mVideoLagEventPending) { 557145e68fc778275963189b02a1adcbe27cce4d769Andreas Huber return; 558145e68fc778275963189b02a1adcbe27cce4d769Andreas Huber } 559145e68fc778275963189b02a1adcbe27cce4d769Andreas Huber mVideoLagEventPending = false; 560145e68fc778275963189b02a1adcbe27cce4d769Andreas Huber 561145e68fc778275963189b02a1adcbe27cce4d769Andreas Huber int64_t audioTimeUs = mAudioPlayer->getMediaTimeUs(); 562145e68fc778275963189b02a1adcbe27cce4d769Andreas Huber int64_t videoLateByUs = audioTimeUs - mVideoTimeUs; 563145e68fc778275963189b02a1adcbe27cce4d769Andreas Huber 5645dac87b088556b8ed7f2a4f5546d31be0bb68680Andreas Huber if (!(mFlags & VIDEO_AT_EOS) && videoLateByUs > 300000ll) { 565145e68fc778275963189b02a1adcbe27cce4d769Andreas Huber LOGV("video late by %lld ms.", videoLateByUs / 1000ll); 566145e68fc778275963189b02a1adcbe27cce4d769Andreas Huber 567145e68fc778275963189b02a1adcbe27cce4d769Andreas Huber notifyListener_l( 568145e68fc778275963189b02a1adcbe27cce4d769Andreas Huber MEDIA_INFO, 569145e68fc778275963189b02a1adcbe27cce4d769Andreas Huber MEDIA_INFO_VIDEO_TRACK_LAGGING, 570145e68fc778275963189b02a1adcbe27cce4d769Andreas Huber videoLateByUs / 1000ll); 571145e68fc778275963189b02a1adcbe27cce4d769Andreas Huber } 572145e68fc778275963189b02a1adcbe27cce4d769Andreas Huber 573145e68fc778275963189b02a1adcbe27cce4d769Andreas Huber postVideoLagEvent_l(); 574145e68fc778275963189b02a1adcbe27cce4d769Andreas Huber} 575145e68fc778275963189b02a1adcbe27cce4d769Andreas Huber 57666b0a35c9a4136a84c3f73b1b25fcb5220138b95Andreas Hubervoid AwesomePlayer::onBufferingUpdate() { 57766b0a35c9a4136a84c3f73b1b25fcb5220138b95Andreas Huber Mutex::Autolock autoLock(mLock); 578d29345dfa29cdcc650f3705e43950ef2500f6728Andreas Huber if (!mBufferingEventPending) { 579d29345dfa29cdcc650f3705e43950ef2500f6728Andreas Huber return; 580d29345dfa29cdcc650f3705e43950ef2500f6728Andreas Huber } 58166b0a35c9a4136a84c3f73b1b25fcb5220138b95Andreas Huber mBufferingEventPending = false; 58266b0a35c9a4136a84c3f73b1b25fcb5220138b95Andreas Huber 5838650e1960905097f6f1d6aa462ccb1c93c656834Andreas Huber if (mCachedSource != NULL) { 5841bd233ce7e1aa7730bc18d46ffd57791391738cdBryan Mawhinney status_t finalStatus; 5851bd233ce7e1aa7730bc18d46ffd57791391738cdBryan Mawhinney size_t cachedDataRemaining = mCachedSource->approxDataRemaining(&finalStatus); 5861bd233ce7e1aa7730bc18d46ffd57791391738cdBryan Mawhinney bool eos = (finalStatus != OK); 587c9e894872c298b25fe9d74e68aa1e7287a541ac3Andreas Huber 5888650e1960905097f6f1d6aa462ccb1c93c656834Andreas Huber if (eos) { 5891bd233ce7e1aa7730bc18d46ffd57791391738cdBryan Mawhinney if (finalStatus == ERROR_END_OF_STREAM) { 5901bd233ce7e1aa7730bc18d46ffd57791391738cdBryan Mawhinney notifyListener_l(MEDIA_BUFFERING_UPDATE, 100); 5911bd233ce7e1aa7730bc18d46ffd57791391738cdBryan Mawhinney } 59283977eb230d829cfe520f55d7977037a904ce548Andreas Huber if (mFlags & PREPARING) { 59383977eb230d829cfe520f55d7977037a904ce548Andreas Huber LOGV("cache has reached EOS, prepare is done."); 59483977eb230d829cfe520f55d7977037a904ce548Andreas Huber finishAsyncPrepare_l(); 59583977eb230d829cfe520f55d7977037a904ce548Andreas Huber } 5968650e1960905097f6f1d6aa462ccb1c93c656834Andreas Huber } else { 5977fbdb0903dfbf70b314a74e64e28fb880cdb9247Andreas Huber int64_t bitrate; 5987fbdb0903dfbf70b314a74e64e28fb880cdb9247Andreas Huber if (getBitrate(&bitrate)) { 5998650e1960905097f6f1d6aa462ccb1c93c656834Andreas Huber size_t cachedSize = mCachedSource->cachedSize(); 6008650e1960905097f6f1d6aa462ccb1c93c656834Andreas Huber int64_t cachedDurationUs = cachedSize * 8000000ll / bitrate; 601c9e894872c298b25fe9d74e68aa1e7287a541ac3Andreas Huber 6028650e1960905097f6f1d6aa462ccb1c93c656834Andreas Huber int percentage = 100.0 * (double)cachedDurationUs / mDurationUs; 6038650e1960905097f6f1d6aa462ccb1c93c656834Andreas Huber if (percentage > 100) { 6048650e1960905097f6f1d6aa462ccb1c93c656834Andreas Huber percentage = 100; 6058650e1960905097f6f1d6aa462ccb1c93c656834Andreas Huber } 606c9e894872c298b25fe9d74e68aa1e7287a541ac3Andreas Huber 6078650e1960905097f6f1d6aa462ccb1c93c656834Andreas Huber notifyListener_l(MEDIA_BUFFERING_UPDATE, percentage); 6088650e1960905097f6f1d6aa462ccb1c93c656834Andreas Huber } else { 6098650e1960905097f6f1d6aa462ccb1c93c656834Andreas Huber // We don't know the bitrate of the stream, use absolute size 6108650e1960905097f6f1d6aa462ccb1c93c656834Andreas Huber // limits to maintain the cache. 6118650e1960905097f6f1d6aa462ccb1c93c656834Andreas Huber 6128650e1960905097f6f1d6aa462ccb1c93c656834Andreas Huber if ((mFlags & PLAYING) && !eos 6138650e1960905097f6f1d6aa462ccb1c93c656834Andreas Huber && (cachedDataRemaining < kLowWaterMarkBytes)) { 6148650e1960905097f6f1d6aa462ccb1c93c656834Andreas Huber LOGI("cache is running low (< %d) , pausing.", 6158650e1960905097f6f1d6aa462ccb1c93c656834Andreas Huber kLowWaterMarkBytes); 6168650e1960905097f6f1d6aa462ccb1c93c656834Andreas Huber mFlags |= CACHE_UNDERRUN; 6178650e1960905097f6f1d6aa462ccb1c93c656834Andreas Huber pause_l(); 61834ef0f32c8fc0186236a27e07405328cc1f7c56dAndreas Huber ensureCacheIsFetching_l(); 6198650e1960905097f6f1d6aa462ccb1c93c656834Andreas Huber notifyListener_l(MEDIA_INFO, MEDIA_INFO_BUFFERING_START); 6208650e1960905097f6f1d6aa462ccb1c93c656834Andreas Huber } else if (eos || cachedDataRemaining > kHighWaterMarkBytes) { 6218650e1960905097f6f1d6aa462ccb1c93c656834Andreas Huber if (mFlags & CACHE_UNDERRUN) { 6228650e1960905097f6f1d6aa462ccb1c93c656834Andreas Huber LOGI("cache has filled up (> %d), resuming.", 6238650e1960905097f6f1d6aa462ccb1c93c656834Andreas Huber kHighWaterMarkBytes); 6248650e1960905097f6f1d6aa462ccb1c93c656834Andreas Huber mFlags &= ~CACHE_UNDERRUN; 6258650e1960905097f6f1d6aa462ccb1c93c656834Andreas Huber play_l(); 6268650e1960905097f6f1d6aa462ccb1c93c656834Andreas Huber notifyListener_l(MEDIA_INFO, MEDIA_INFO_BUFFERING_END); 6278650e1960905097f6f1d6aa462ccb1c93c656834Andreas Huber } else if (mFlags & PREPARING) { 6288650e1960905097f6f1d6aa462ccb1c93c656834Andreas Huber LOGV("cache has filled up (> %d), prepare is done", 6298650e1960905097f6f1d6aa462ccb1c93c656834Andreas Huber kHighWaterMarkBytes); 6308650e1960905097f6f1d6aa462ccb1c93c656834Andreas Huber finishAsyncPrepare_l(); 6318650e1960905097f6f1d6aa462ccb1c93c656834Andreas Huber } 6328650e1960905097f6f1d6aa462ccb1c93c656834Andreas Huber } 6338650e1960905097f6f1d6aa462ccb1c93c656834Andreas Huber } 6348650e1960905097f6f1d6aa462ccb1c93c656834Andreas Huber } 6352415ecb5bb4e1459024f6d6c8ae2d6e3dc4fbdc7Andreas Huber } 6362415ecb5bb4e1459024f6d6c8ae2d6e3dc4fbdc7Andreas Huber 6378650e1960905097f6f1d6aa462ccb1c93c656834Andreas Huber int64_t cachedDurationUs; 6382a4b49bd3863024884a694b454e2e452752e6ea0Andreas Huber bool eos; 6398650e1960905097f6f1d6aa462ccb1c93c656834Andreas Huber if (getCachedDuration_l(&cachedDurationUs, &eos)) { 64034ef0f32c8fc0186236a27e07405328cc1f7c56dAndreas Huber LOGV("cachedDurationUs = %.2f secs, eos=%d", 64134ef0f32c8fc0186236a27e07405328cc1f7c56dAndreas Huber cachedDurationUs / 1E6, eos); 64234ef0f32c8fc0186236a27e07405328cc1f7c56dAndreas Huber 643100a4408968b90e314526185d572c72ea4cc784aAndreas Huber int64_t highWaterMarkUs = 644100a4408968b90e314526185d572c72ea4cc784aAndreas Huber (mRTSPController != NULL) ? kHighWaterMarkRTSPUs : kHighWaterMarkUs; 645100a4408968b90e314526185d572c72ea4cc784aAndreas Huber 6468650e1960905097f6f1d6aa462ccb1c93c656834Andreas Huber if ((mFlags & PLAYING) && !eos 6478650e1960905097f6f1d6aa462ccb1c93c656834Andreas Huber && (cachedDurationUs < kLowWaterMarkUs)) { 6488650e1960905097f6f1d6aa462ccb1c93c656834Andreas Huber LOGI("cache is running low (%.2f secs) , pausing.", 6498650e1960905097f6f1d6aa462ccb1c93c656834Andreas Huber cachedDurationUs / 1E6); 6508650e1960905097f6f1d6aa462ccb1c93c656834Andreas Huber mFlags |= CACHE_UNDERRUN; 6518650e1960905097f6f1d6aa462ccb1c93c656834Andreas Huber pause_l(); 65234ef0f32c8fc0186236a27e07405328cc1f7c56dAndreas Huber ensureCacheIsFetching_l(); 6538650e1960905097f6f1d6aa462ccb1c93c656834Andreas Huber notifyListener_l(MEDIA_INFO, MEDIA_INFO_BUFFERING_START); 654100a4408968b90e314526185d572c72ea4cc784aAndreas Huber } else if (eos || cachedDurationUs > highWaterMarkUs) { 6558650e1960905097f6f1d6aa462ccb1c93c656834Andreas Huber if (mFlags & CACHE_UNDERRUN) { 6568650e1960905097f6f1d6aa462ccb1c93c656834Andreas Huber LOGI("cache has filled up (%.2f secs), resuming.", 6578650e1960905097f6f1d6aa462ccb1c93c656834Andreas Huber cachedDurationUs / 1E6); 6588650e1960905097f6f1d6aa462ccb1c93c656834Andreas Huber mFlags &= ~CACHE_UNDERRUN; 6598650e1960905097f6f1d6aa462ccb1c93c656834Andreas Huber play_l(); 6608650e1960905097f6f1d6aa462ccb1c93c656834Andreas Huber notifyListener_l(MEDIA_INFO, MEDIA_INFO_BUFFERING_END); 6618650e1960905097f6f1d6aa462ccb1c93c656834Andreas Huber } else if (mFlags & PREPARING) { 6628650e1960905097f6f1d6aa462ccb1c93c656834Andreas Huber LOGV("cache has filled up (%.2f secs), prepare is done", 6638650e1960905097f6f1d6aa462ccb1c93c656834Andreas Huber cachedDurationUs / 1E6); 6648650e1960905097f6f1d6aa462ccb1c93c656834Andreas Huber finishAsyncPrepare_l(); 6652a4b49bd3863024884a694b454e2e452752e6ea0Andreas Huber } 6662a4b49bd3863024884a694b454e2e452752e6ea0Andreas Huber } 6670a5baa9b411fe086013d2a5e9126ed63fbad046cAndreas Huber } 6680a5baa9b411fe086013d2a5e9126ed63fbad046cAndreas Huber 6690a5baa9b411fe086013d2a5e9126ed63fbad046cAndreas Huber postBufferingEvent_l(); 6700726045216f576e97672ebeefc265d39c4ebaaa5Andreas Huber} 6710726045216f576e97672ebeefc265d39c4ebaaa5Andreas Huber 672bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Hubervoid AwesomePlayer::onStreamDone() { 673bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber // Posted whenever any stream finishes playing. 674bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber 675bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber Mutex::Autolock autoLock(mLock); 676d29345dfa29cdcc650f3705e43950ef2500f6728Andreas Huber if (!mStreamDoneEventPending) { 677d29345dfa29cdcc650f3705e43950ef2500f6728Andreas Huber return; 678d29345dfa29cdcc650f3705e43950ef2500f6728Andreas Huber } 679bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber mStreamDoneEventPending = false; 680bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber 681ed8d14f6a934072cd012992c4ef16990a54baa9aAndreas Huber if (mStreamDoneStatus != ERROR_END_OF_STREAM) { 6825d2de4da54504836e4b772b3010ac28c19f667f0Andreas Huber LOGV("MEDIA_ERROR %d", mStreamDoneStatus); 6835d2de4da54504836e4b772b3010ac28c19f667f0Andreas Huber 6845d2de4da54504836e4b772b3010ac28c19f667f0Andreas Huber notifyListener_l( 6855d2de4da54504836e4b772b3010ac28c19f667f0Andreas Huber MEDIA_ERROR, MEDIA_ERROR_UNKNOWN, mStreamDoneStatus); 6865d2de4da54504836e4b772b3010ac28c19f667f0Andreas Huber 687b2e3954c94717e43b3dc9b880564f166cfbbc0a2Andreas Huber pause_l(true /* at eos */); 6885d2de4da54504836e4b772b3010ac28c19f667f0Andreas Huber 6895d2de4da54504836e4b772b3010ac28c19f667f0Andreas Huber mFlags |= AT_EOS; 6905d2de4da54504836e4b772b3010ac28c19f667f0Andreas Huber return; 6915d2de4da54504836e4b772b3010ac28c19f667f0Andreas Huber } 6925d2de4da54504836e4b772b3010ac28c19f667f0Andreas Huber 6935d2de4da54504836e4b772b3010ac28c19f667f0Andreas Huber const bool allDone = 6945d2de4da54504836e4b772b3010ac28c19f667f0Andreas Huber (mVideoSource == NULL || (mFlags & VIDEO_AT_EOS)) 6955d2de4da54504836e4b772b3010ac28c19f667f0Andreas Huber && (mAudioSource == NULL || (mFlags & AUDIO_AT_EOS)); 6965d2de4da54504836e4b772b3010ac28c19f667f0Andreas Huber 6975d2de4da54504836e4b772b3010ac28c19f667f0Andreas Huber if (!allDone) { 6985d2de4da54504836e4b772b3010ac28c19f667f0Andreas Huber return; 6995d2de4da54504836e4b772b3010ac28c19f667f0Andreas Huber } 7005d2de4da54504836e4b772b3010ac28c19f667f0Andreas Huber 7018ae49d87b98d57d6758b0c51b95e28a6581a79f1Andreas Huber if (mFlags & (LOOPING | AUTO_LOOPING)) { 702bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber seekTo_l(0); 703bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber 704a657f8deaf21acbe5faba7be1df9c6681d44d471Andreas Huber if (mVideoSource != NULL) { 705bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber postVideoEvent_l(); 706bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber } 707bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber } else { 7085d2de4da54504836e4b772b3010ac28c19f667f0Andreas Huber LOGV("MEDIA_PLAYBACK_COMPLETE"); 7095d2de4da54504836e4b772b3010ac28c19f667f0Andreas Huber notifyListener_l(MEDIA_PLAYBACK_COMPLETE); 710bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber 711b2e3954c94717e43b3dc9b880564f166cfbbc0a2Andreas Huber pause_l(true /* at eos */); 7122e8ffaf95bd35358ecd14ddf00cddaf3abefe0a9Andreas Huber 7132e8ffaf95bd35358ecd14ddf00cddaf3abefe0a9Andreas Huber mFlags |= AT_EOS; 714bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber } 715bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber} 716bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber 717bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huberstatus_t AwesomePlayer::play() { 718bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber Mutex::Autolock autoLock(mLock); 7190a5baa9b411fe086013d2a5e9126ed63fbad046cAndreas Huber 7200a5baa9b411fe086013d2a5e9126ed63fbad046cAndreas Huber mFlags &= ~CACHE_UNDERRUN; 7210a5baa9b411fe086013d2a5e9126ed63fbad046cAndreas Huber 7227b3396acc702451be9bafb19d7fe26d55d43a316Andreas Huber return play_l(); 7237b3396acc702451be9bafb19d7fe26d55d43a316Andreas Huber} 724bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber 7257b3396acc702451be9bafb19d7fe26d55d43a316Andreas Huberstatus_t AwesomePlayer::play_l() { 7262b1222f8938356669672f35e0e53e176c78c40efAndreas Huber mFlags &= ~SEEK_PREVIEW; 7272b1222f8938356669672f35e0e53e176c78c40efAndreas Huber 728bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber if (mFlags & PLAYING) { 729bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber return OK; 730bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber } 731bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber 732bd22c52280179b29eefac91ef7e7bbbc33d25904Andreas Huber if (!(mFlags & PREPARED)) { 733bd22c52280179b29eefac91ef7e7bbbc33d25904Andreas Huber status_t err = prepare_l(); 734bd22c52280179b29eefac91ef7e7bbbc33d25904Andreas Huber 735bd22c52280179b29eefac91ef7e7bbbc33d25904Andreas Huber if (err != OK) { 736bd22c52280179b29eefac91ef7e7bbbc33d25904Andreas Huber return err; 737bd22c52280179b29eefac91ef7e7bbbc33d25904Andreas Huber } 738bd22c52280179b29eefac91ef7e7bbbc33d25904Andreas Huber } 739bd22c52280179b29eefac91ef7e7bbbc33d25904Andreas Huber 740bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber mFlags |= PLAYING; 741bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber mFlags |= FIRST_FRAME; 742bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber 743c130b5bf563d049bd391ccd96985ac278ef8ff8dGloria Wang if (mDecryptHandle != NULL) { 744c130b5bf563d049bd391ccd96985ac278ef8ff8dGloria Wang int64_t position; 745c130b5bf563d049bd391ccd96985ac278ef8ff8dGloria Wang getPosition(&position); 746c130b5bf563d049bd391ccd96985ac278ef8ff8dGloria Wang mDrmManagerClient->setPlaybackStatus(mDecryptHandle, 747c130b5bf563d049bd391ccd96985ac278ef8ff8dGloria Wang Playback::START, position / 1000); 748c130b5bf563d049bd391ccd96985ac278ef8ff8dGloria Wang } 749c130b5bf563d049bd391ccd96985ac278ef8ff8dGloria Wang 750bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber if (mAudioSource != NULL) { 751bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber if (mAudioPlayer == NULL) { 752bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber if (mAudioSink != NULL) { 753ed54ad0f8619ae416b0968ade6248894cbfc4dbaAndreas Huber mAudioPlayer = new AudioPlayer(mAudioSink, this); 754bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber mAudioPlayer->setSource(mAudioSource); 755e7e3b785a0e7819db4c895a4f60e9a4dd755880cAndreas Huber 756f03034408506051f2f836e59305fcd5f662bf19aAndreas Huber mTimeSource = mAudioPlayer; 75788c030e0e0152791ff74f90249f55fce01371198Andreas Huber 758b874cd085bba63528c570f74c493bfea835190d9Andreas Huber // If there was a seek request before we ever started, 759b874cd085bba63528c570f74c493bfea835190d9Andreas Huber // honor the request now. 760b874cd085bba63528c570f74c493bfea835190d9Andreas Huber // Make sure to do this before starting the audio player 761b874cd085bba63528c570f74c493bfea835190d9Andreas Huber // to avoid a race condition. 762b874cd085bba63528c570f74c493bfea835190d9Andreas Huber seekAudioIfNecessary_l(); 763f03034408506051f2f836e59305fcd5f662bf19aAndreas Huber } 764f03034408506051f2f836e59305fcd5f662bf19aAndreas Huber } 76588c030e0e0152791ff74f90249f55fce01371198Andreas Huber 766f03034408506051f2f836e59305fcd5f662bf19aAndreas Huber CHECK(!(mFlags & AUDIO_RUNNING)); 767c130b5bf563d049bd391ccd96985ac278ef8ff8dGloria Wang 768f03034408506051f2f836e59305fcd5f662bf19aAndreas Huber if (mVideoSource == NULL) { 769f03034408506051f2f836e59305fcd5f662bf19aAndreas Huber status_t err = startAudioPlayer_l(); 770bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber 771f03034408506051f2f836e59305fcd5f662bf19aAndreas Huber if (err != OK) { 772f03034408506051f2f836e59305fcd5f662bf19aAndreas Huber delete mAudioPlayer; 773f03034408506051f2f836e59305fcd5f662bf19aAndreas Huber mAudioPlayer = NULL; 774bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber 775f03034408506051f2f836e59305fcd5f662bf19aAndreas Huber mFlags &= ~(PLAYING | FIRST_FRAME); 7761862a33b246249630b654182afb5914da3480d4cAndreas Huber 777f03034408506051f2f836e59305fcd5f662bf19aAndreas Huber if (mDecryptHandle != NULL) { 778f03034408506051f2f836e59305fcd5f662bf19aAndreas Huber mDrmManagerClient->setPlaybackStatus( 779f03034408506051f2f836e59305fcd5f662bf19aAndreas Huber mDecryptHandle, Playback::STOP, 0); 780f03034408506051f2f836e59305fcd5f662bf19aAndreas Huber } 781f03034408506051f2f836e59305fcd5f662bf19aAndreas Huber 782f03034408506051f2f836e59305fcd5f662bf19aAndreas Huber return err; 783bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber } 784bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber } 785bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber } 786bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber 787bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber if (mTimeSource == NULL && mAudioPlayer == NULL) { 7885d2de4da54504836e4b772b3010ac28c19f667f0Andreas Huber mTimeSource = &mSystemTimeSource; 789bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber } 790bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber 791bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber if (mVideoSource != NULL) { 792a657f8deaf21acbe5faba7be1df9c6681d44d471Andreas Huber // Kick off video playback 793a657f8deaf21acbe5faba7be1df9c6681d44d471Andreas Huber postVideoEvent_l(); 794145e68fc778275963189b02a1adcbe27cce4d769Andreas Huber 795145e68fc778275963189b02a1adcbe27cce4d769Andreas Huber if (mAudioSource != NULL && mVideoSource != NULL) { 796145e68fc778275963189b02a1adcbe27cce4d769Andreas Huber postVideoLagEvent_l(); 797145e68fc778275963189b02a1adcbe27cce4d769Andreas Huber } 798bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber } 799bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber 8002e8ffaf95bd35358ecd14ddf00cddaf3abefe0a9Andreas Huber if (mFlags & AT_EOS) { 8012e8ffaf95bd35358ecd14ddf00cddaf3abefe0a9Andreas Huber // Legacy behaviour, if a stream finishes playing and then 8022e8ffaf95bd35358ecd14ddf00cddaf3abefe0a9Andreas Huber // is started again, we play from the start... 8032e8ffaf95bd35358ecd14ddf00cddaf3abefe0a9Andreas Huber seekTo_l(0); 8042e8ffaf95bd35358ecd14ddf00cddaf3abefe0a9Andreas Huber } 8052e8ffaf95bd35358ecd14ddf00cddaf3abefe0a9Andreas Huber 8067cf180c9bff69e5cc4a2f4e53b432db45ebbebabGloria Wang uint32_t params = IMediaPlayerService::kBatteryDataCodecStarted 8077cf180c9bff69e5cc4a2f4e53b432db45ebbebabGloria Wang | IMediaPlayerService::kBatteryDataTrackDecoder; 8087cf180c9bff69e5cc4a2f4e53b432db45ebbebabGloria Wang if ((mAudioSource != NULL) && (mAudioSource != mAudioTrack)) { 8097cf180c9bff69e5cc4a2f4e53b432db45ebbebabGloria Wang params |= IMediaPlayerService::kBatteryDataTrackAudio; 8107cf180c9bff69e5cc4a2f4e53b432db45ebbebabGloria Wang } 8117cf180c9bff69e5cc4a2f4e53b432db45ebbebabGloria Wang if (mVideoSource != NULL) { 8127cf180c9bff69e5cc4a2f4e53b432db45ebbebabGloria Wang params |= IMediaPlayerService::kBatteryDataTrackVideo; 8137cf180c9bff69e5cc4a2f4e53b432db45ebbebabGloria Wang } 8147cf180c9bff69e5cc4a2f4e53b432db45ebbebabGloria Wang addBatteryData(params); 8157cf180c9bff69e5cc4a2f4e53b432db45ebbebabGloria Wang 816bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber return OK; 817bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber} 818bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber 819f03034408506051f2f836e59305fcd5f662bf19aAndreas Huberstatus_t AwesomePlayer::startAudioPlayer_l() { 820f03034408506051f2f836e59305fcd5f662bf19aAndreas Huber CHECK(!(mFlags & AUDIO_RUNNING)); 821f03034408506051f2f836e59305fcd5f662bf19aAndreas Huber 822f03034408506051f2f836e59305fcd5f662bf19aAndreas Huber if (mAudioSource == NULL || mAudioPlayer == NULL) { 823f03034408506051f2f836e59305fcd5f662bf19aAndreas Huber return OK; 824f03034408506051f2f836e59305fcd5f662bf19aAndreas Huber } 825f03034408506051f2f836e59305fcd5f662bf19aAndreas Huber 826f03034408506051f2f836e59305fcd5f662bf19aAndreas Huber if (!(mFlags & AUDIOPLAYER_STARTED)) { 827f03034408506051f2f836e59305fcd5f662bf19aAndreas Huber mFlags |= AUDIOPLAYER_STARTED; 828f03034408506051f2f836e59305fcd5f662bf19aAndreas Huber 829f03034408506051f2f836e59305fcd5f662bf19aAndreas Huber // We've already started the MediaSource in order to enable 830f03034408506051f2f836e59305fcd5f662bf19aAndreas Huber // the prefetcher to read its data. 831f03034408506051f2f836e59305fcd5f662bf19aAndreas Huber status_t err = mAudioPlayer->start( 832f03034408506051f2f836e59305fcd5f662bf19aAndreas Huber true /* sourceAlreadyStarted */); 833f03034408506051f2f836e59305fcd5f662bf19aAndreas Huber 834f03034408506051f2f836e59305fcd5f662bf19aAndreas Huber if (err != OK) { 835f03034408506051f2f836e59305fcd5f662bf19aAndreas Huber notifyListener_l(MEDIA_ERROR, MEDIA_ERROR_UNKNOWN, err); 836f03034408506051f2f836e59305fcd5f662bf19aAndreas Huber return err; 837f03034408506051f2f836e59305fcd5f662bf19aAndreas Huber } 838f03034408506051f2f836e59305fcd5f662bf19aAndreas Huber } else { 839f03034408506051f2f836e59305fcd5f662bf19aAndreas Huber mAudioPlayer->resume(); 840f03034408506051f2f836e59305fcd5f662bf19aAndreas Huber } 841f03034408506051f2f836e59305fcd5f662bf19aAndreas Huber 842f03034408506051f2f836e59305fcd5f662bf19aAndreas Huber mFlags |= AUDIO_RUNNING; 843f03034408506051f2f836e59305fcd5f662bf19aAndreas Huber 844f03034408506051f2f836e59305fcd5f662bf19aAndreas Huber mWatchForAudioEOS = true; 845f03034408506051f2f836e59305fcd5f662bf19aAndreas Huber 846f03034408506051f2f836e59305fcd5f662bf19aAndreas Huber return OK; 847f03034408506051f2f836e59305fcd5f662bf19aAndreas Huber} 848f03034408506051f2f836e59305fcd5f662bf19aAndreas Huber 8495daeb129a2c2ba3d14ccd94af283b5f561c783eaAndreas Hubervoid AwesomePlayer::notifyVideoSize_l() { 8505daeb129a2c2ba3d14ccd94af283b5f561c783eaAndreas Huber sp<MetaData> meta = mVideoSource->getFormat(); 8515daeb129a2c2ba3d14ccd94af283b5f561c783eaAndreas Huber 852f5ab57c2d5e02af7483c94eddb177e4f5c9e9892Andreas Huber int32_t cropLeft, cropTop, cropRight, cropBottom; 853f5ab57c2d5e02af7483c94eddb177e4f5c9e9892Andreas Huber if (!meta->findRect( 854f5ab57c2d5e02af7483c94eddb177e4f5c9e9892Andreas Huber kKeyCropRect, &cropLeft, &cropTop, &cropRight, &cropBottom)) { 855f5ab57c2d5e02af7483c94eddb177e4f5c9e9892Andreas Huber int32_t width, height; 856f5ab57c2d5e02af7483c94eddb177e4f5c9e9892Andreas Huber CHECK(meta->findInt32(kKeyWidth, &width)); 857f5ab57c2d5e02af7483c94eddb177e4f5c9e9892Andreas Huber CHECK(meta->findInt32(kKeyHeight, &height)); 858f5ab57c2d5e02af7483c94eddb177e4f5c9e9892Andreas Huber 859f5ab57c2d5e02af7483c94eddb177e4f5c9e9892Andreas Huber cropLeft = cropTop = 0; 860f5ab57c2d5e02af7483c94eddb177e4f5c9e9892Andreas Huber cropRight = width - 1; 861f5ab57c2d5e02af7483c94eddb177e4f5c9e9892Andreas Huber cropBottom = height - 1; 862f5ab57c2d5e02af7483c94eddb177e4f5c9e9892Andreas Huber 863f5ab57c2d5e02af7483c94eddb177e4f5c9e9892Andreas Huber LOGV("got dimensions only %d x %d", width, height); 864f5ab57c2d5e02af7483c94eddb177e4f5c9e9892Andreas Huber } else { 865f5ab57c2d5e02af7483c94eddb177e4f5c9e9892Andreas Huber LOGV("got crop rect %d, %d, %d, %d", 866f5ab57c2d5e02af7483c94eddb177e4f5c9e9892Andreas Huber cropLeft, cropTop, cropRight, cropBottom); 867f5ab57c2d5e02af7483c94eddb177e4f5c9e9892Andreas Huber } 868f5ab57c2d5e02af7483c94eddb177e4f5c9e9892Andreas Huber 8699cbb1a6f99003a9cd8765e11b9d7380e67839f82James Dong int32_t displayWidth; 8709cbb1a6f99003a9cd8765e11b9d7380e67839f82James Dong if (meta->findInt32(kKeyDisplayWidth, &displayWidth)) { 8719cbb1a6f99003a9cd8765e11b9d7380e67839f82James Dong LOGV("Display width changed (%d=>%d)", mDisplayWidth, displayWidth); 8729cbb1a6f99003a9cd8765e11b9d7380e67839f82James Dong mDisplayWidth = displayWidth; 8739cbb1a6f99003a9cd8765e11b9d7380e67839f82James Dong } 8749cbb1a6f99003a9cd8765e11b9d7380e67839f82James Dong int32_t displayHeight; 8759cbb1a6f99003a9cd8765e11b9d7380e67839f82James Dong if (meta->findInt32(kKeyDisplayHeight, &displayHeight)) { 8769cbb1a6f99003a9cd8765e11b9d7380e67839f82James Dong LOGV("Display height changed (%d=>%d)", mDisplayHeight, displayHeight); 8779cbb1a6f99003a9cd8765e11b9d7380e67839f82James Dong mDisplayHeight = displayHeight; 8789cbb1a6f99003a9cd8765e11b9d7380e67839f82James Dong } 8799cbb1a6f99003a9cd8765e11b9d7380e67839f82James Dong 880f5ab57c2d5e02af7483c94eddb177e4f5c9e9892Andreas Huber int32_t usableWidth = cropRight - cropLeft + 1; 881f5ab57c2d5e02af7483c94eddb177e4f5c9e9892Andreas Huber int32_t usableHeight = cropBottom - cropTop + 1; 882b45c01c2b8588ff431b511151666a55a39f0a6aeJames Dong if (mDisplayWidth != 0) { 883b45c01c2b8588ff431b511151666a55a39f0a6aeJames Dong usableWidth = mDisplayWidth; 884b45c01c2b8588ff431b511151666a55a39f0a6aeJames Dong } 885b45c01c2b8588ff431b511151666a55a39f0a6aeJames Dong if (mDisplayHeight != 0) { 886b45c01c2b8588ff431b511151666a55a39f0a6aeJames Dong usableHeight = mDisplayHeight; 887b45c01c2b8588ff431b511151666a55a39f0a6aeJames Dong } 8885daeb129a2c2ba3d14ccd94af283b5f561c783eaAndreas Huber 889ba529e486dde15fe75ea1b48570f9d60a4cf3c48Andreas Huber int32_t rotationDegrees; 890ba529e486dde15fe75ea1b48570f9d60a4cf3c48Andreas Huber if (!mVideoTrack->getFormat()->findInt32( 891ba529e486dde15fe75ea1b48570f9d60a4cf3c48Andreas Huber kKeyRotation, &rotationDegrees)) { 892ba529e486dde15fe75ea1b48570f9d60a4cf3c48Andreas Huber rotationDegrees = 0; 893ba529e486dde15fe75ea1b48570f9d60a4cf3c48Andreas Huber } 894ba529e486dde15fe75ea1b48570f9d60a4cf3c48Andreas Huber 895ba529e486dde15fe75ea1b48570f9d60a4cf3c48Andreas Huber if (rotationDegrees == 90 || rotationDegrees == 270) { 896ba529e486dde15fe75ea1b48570f9d60a4cf3c48Andreas Huber notifyListener_l( 897f5ab57c2d5e02af7483c94eddb177e4f5c9e9892Andreas Huber MEDIA_SET_VIDEO_SIZE, usableHeight, usableWidth); 898ba529e486dde15fe75ea1b48570f9d60a4cf3c48Andreas Huber } else { 899ba529e486dde15fe75ea1b48570f9d60a4cf3c48Andreas Huber notifyListener_l( 900f5ab57c2d5e02af7483c94eddb177e4f5c9e9892Andreas Huber MEDIA_SET_VIDEO_SIZE, usableWidth, usableHeight); 901ba529e486dde15fe75ea1b48570f9d60a4cf3c48Andreas Huber } 9025daeb129a2c2ba3d14ccd94af283b5f561c783eaAndreas Huber} 9035daeb129a2c2ba3d14ccd94af283b5f561c783eaAndreas Huber 904bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Hubervoid AwesomePlayer::initRenderer_l() { 9051173118eace0e9e347cb007f0da817cee87579edGlenn Kasten if (mNativeWindow == NULL) { 9060a5ca668c6f7d45706e9aec4a1dfec0aacc6d233Andreas Huber return; 9070a5ca668c6f7d45706e9aec4a1dfec0aacc6d233Andreas Huber } 908bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber 9090a5ca668c6f7d45706e9aec4a1dfec0aacc6d233Andreas Huber sp<MetaData> meta = mVideoSource->getFormat(); 910bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber 9110a5ca668c6f7d45706e9aec4a1dfec0aacc6d233Andreas Huber int32_t format; 9120a5ca668c6f7d45706e9aec4a1dfec0aacc6d233Andreas Huber const char *component; 9130a5ca668c6f7d45706e9aec4a1dfec0aacc6d233Andreas Huber int32_t decodedWidth, decodedHeight; 9140a5ca668c6f7d45706e9aec4a1dfec0aacc6d233Andreas Huber CHECK(meta->findInt32(kKeyColorFormat, &format)); 9150a5ca668c6f7d45706e9aec4a1dfec0aacc6d233Andreas Huber CHECK(meta->findCString(kKeyDecoderComponent, &component)); 9160a5ca668c6f7d45706e9aec4a1dfec0aacc6d233Andreas Huber CHECK(meta->findInt32(kKeyWidth, &decodedWidth)); 9170a5ca668c6f7d45706e9aec4a1dfec0aacc6d233Andreas Huber CHECK(meta->findInt32(kKeyHeight, &decodedHeight)); 9184844ac54e8b5997c3b03872dbafe8ebed4787517Andreas Huber 919ba529e486dde15fe75ea1b48570f9d60a4cf3c48Andreas Huber int32_t rotationDegrees; 920ba529e486dde15fe75ea1b48570f9d60a4cf3c48Andreas Huber if (!mVideoTrack->getFormat()->findInt32( 921ba529e486dde15fe75ea1b48570f9d60a4cf3c48Andreas Huber kKeyRotation, &rotationDegrees)) { 922ba529e486dde15fe75ea1b48570f9d60a4cf3c48Andreas Huber rotationDegrees = 0; 923ba529e486dde15fe75ea1b48570f9d60a4cf3c48Andreas Huber } 924ba529e486dde15fe75ea1b48570f9d60a4cf3c48Andreas Huber 9250a5ca668c6f7d45706e9aec4a1dfec0aacc6d233Andreas Huber mVideoRenderer.clear(); 9264844ac54e8b5997c3b03872dbafe8ebed4787517Andreas Huber 9270a5ca668c6f7d45706e9aec4a1dfec0aacc6d233Andreas Huber // Must ensure that mVideoRenderer's destructor is actually executed 9280a5ca668c6f7d45706e9aec4a1dfec0aacc6d233Andreas Huber // before creating a new one. 9290a5ca668c6f7d45706e9aec4a1dfec0aacc6d233Andreas Huber IPCThreadState::self()->flushCommands(); 9300a5ca668c6f7d45706e9aec4a1dfec0aacc6d233Andreas Huber 9310a5ca668c6f7d45706e9aec4a1dfec0aacc6d233Andreas Huber if (USE_SURFACE_ALLOC && strncmp(component, "OMX.", 4) == 0) { 9320a5ca668c6f7d45706e9aec4a1dfec0aacc6d233Andreas Huber // Hardware decoders avoid the CPU color conversion by decoding 9330a5ca668c6f7d45706e9aec4a1dfec0aacc6d233Andreas Huber // directly to ANativeBuffers, so we must use a renderer that 9340a5ca668c6f7d45706e9aec4a1dfec0aacc6d233Andreas Huber // just pushes those buffers to the ANativeWindow. 935ba529e486dde15fe75ea1b48570f9d60a4cf3c48Andreas Huber mVideoRenderer = 9361173118eace0e9e347cb007f0da817cee87579edGlenn Kasten new AwesomeNativeWindowRenderer(mNativeWindow, rotationDegrees); 9370a5ca668c6f7d45706e9aec4a1dfec0aacc6d233Andreas Huber } else { 9380a5ca668c6f7d45706e9aec4a1dfec0aacc6d233Andreas Huber // Other decoders are instantiated locally and as a consequence 9390a5ca668c6f7d45706e9aec4a1dfec0aacc6d233Andreas Huber // allocate their buffers in local address space. This renderer 9400a5ca668c6f7d45706e9aec4a1dfec0aacc6d233Andreas Huber // then performs a color conversion and copy to get the data 9410a5ca668c6f7d45706e9aec4a1dfec0aacc6d233Andreas Huber // into the ANativeBuffer. 9421173118eace0e9e347cb007f0da817cee87579edGlenn Kasten mVideoRenderer = new AwesomeLocalRenderer(mNativeWindow, meta); 943bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber } 944bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber} 945bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber 946bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huberstatus_t AwesomePlayer::pause() { 947bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber Mutex::Autolock autoLock(mLock); 9480a5baa9b411fe086013d2a5e9126ed63fbad046cAndreas Huber 9490a5baa9b411fe086013d2a5e9126ed63fbad046cAndreas Huber mFlags &= ~CACHE_UNDERRUN; 9500a5baa9b411fe086013d2a5e9126ed63fbad046cAndreas Huber 951bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber return pause_l(); 952bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber} 953bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber 954b2e3954c94717e43b3dc9b880564f166cfbbc0a2Andreas Huberstatus_t AwesomePlayer::pause_l(bool at_eos) { 955bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber if (!(mFlags & PLAYING)) { 956bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber return OK; 957bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber } 958bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber 95966b0a35c9a4136a84c3f73b1b25fcb5220138b95Andreas Huber cancelPlayerEvents(true /* keepBufferingGoing */); 960bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber 961f03034408506051f2f836e59305fcd5f662bf19aAndreas Huber if (mAudioPlayer != NULL && (mFlags & AUDIO_RUNNING)) { 962b2e3954c94717e43b3dc9b880564f166cfbbc0a2Andreas Huber if (at_eos) { 963b2e3954c94717e43b3dc9b880564f166cfbbc0a2Andreas Huber // If we played the audio stream to completion we 964b2e3954c94717e43b3dc9b880564f166cfbbc0a2Andreas Huber // want to make sure that all samples remaining in the audio 965b2e3954c94717e43b3dc9b880564f166cfbbc0a2Andreas Huber // track's queue are played out. 966b2e3954c94717e43b3dc9b880564f166cfbbc0a2Andreas Huber mAudioPlayer->pause(true /* playPendingSamples */); 967b2e3954c94717e43b3dc9b880564f166cfbbc0a2Andreas Huber } else { 968b2e3954c94717e43b3dc9b880564f166cfbbc0a2Andreas Huber mAudioPlayer->pause(); 969b2e3954c94717e43b3dc9b880564f166cfbbc0a2Andreas Huber } 970f03034408506051f2f836e59305fcd5f662bf19aAndreas Huber 971f03034408506051f2f836e59305fcd5f662bf19aAndreas Huber mFlags &= ~AUDIO_RUNNING; 972bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber } 973bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber 974bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber mFlags &= ~PLAYING; 975bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber 976dcd25efb46c41c8d24a0a9cf61fb57f84149709eGloria Wang if (mDecryptHandle != NULL) { 977dcd25efb46c41c8d24a0a9cf61fb57f84149709eGloria Wang mDrmManagerClient->setPlaybackStatus(mDecryptHandle, 978dcd25efb46c41c8d24a0a9cf61fb57f84149709eGloria Wang Playback::PAUSE, 0); 979dcd25efb46c41c8d24a0a9cf61fb57f84149709eGloria Wang } 980dcd25efb46c41c8d24a0a9cf61fb57f84149709eGloria Wang 9817cf180c9bff69e5cc4a2f4e53b432db45ebbebabGloria Wang uint32_t params = IMediaPlayerService::kBatteryDataTrackDecoder; 9827cf180c9bff69e5cc4a2f4e53b432db45ebbebabGloria Wang if ((mAudioSource != NULL) && (mAudioSource != mAudioTrack)) { 9837cf180c9bff69e5cc4a2f4e53b432db45ebbebabGloria Wang params |= IMediaPlayerService::kBatteryDataTrackAudio; 9847cf180c9bff69e5cc4a2f4e53b432db45ebbebabGloria Wang } 9857cf180c9bff69e5cc4a2f4e53b432db45ebbebabGloria Wang if (mVideoSource != NULL) { 9867cf180c9bff69e5cc4a2f4e53b432db45ebbebabGloria Wang params |= IMediaPlayerService::kBatteryDataTrackVideo; 9877cf180c9bff69e5cc4a2f4e53b432db45ebbebabGloria Wang } 9887cf180c9bff69e5cc4a2f4e53b432db45ebbebabGloria Wang 9897cf180c9bff69e5cc4a2f4e53b432db45ebbebabGloria Wang addBatteryData(params); 9907cf180c9bff69e5cc4a2f4e53b432db45ebbebabGloria Wang 991bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber return OK; 992bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber} 993bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber 994bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huberbool AwesomePlayer::isPlaying() const { 9950a5baa9b411fe086013d2a5e9126ed63fbad046cAndreas Huber return (mFlags & PLAYING) || (mFlags & CACHE_UNDERRUN); 996bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber} 997bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber 9985daeb129a2c2ba3d14ccd94af283b5f561c783eaAndreas Hubervoid AwesomePlayer::setSurface(const sp<Surface> &surface) { 9995daeb129a2c2ba3d14ccd94af283b5f561c783eaAndreas Huber Mutex::Autolock autoLock(mLock); 10005daeb129a2c2ba3d14ccd94af283b5f561c783eaAndreas Huber 10015daeb129a2c2ba3d14ccd94af283b5f561c783eaAndreas Huber mSurface = surface; 1002150694cda0842d38a9358fe8d1fcb4fb4a76599eAndreas Huber setNativeWindow_l(surface); 10031173118eace0e9e347cb007f0da817cee87579edGlenn Kasten} 10041173118eace0e9e347cb007f0da817cee87579edGlenn Kasten 10051173118eace0e9e347cb007f0da817cee87579edGlenn Kastenvoid AwesomePlayer::setSurfaceTexture(const sp<ISurfaceTexture> &surfaceTexture) { 10061173118eace0e9e347cb007f0da817cee87579edGlenn Kasten Mutex::Autolock autoLock(mLock); 10071173118eace0e9e347cb007f0da817cee87579edGlenn Kasten 10081173118eace0e9e347cb007f0da817cee87579edGlenn Kasten mSurface.clear(); 10091173118eace0e9e347cb007f0da817cee87579edGlenn Kasten if (surfaceTexture != NULL) { 1010150694cda0842d38a9358fe8d1fcb4fb4a76599eAndreas Huber setNativeWindow_l(new SurfaceTextureClient(surfaceTexture)); 10111173118eace0e9e347cb007f0da817cee87579edGlenn Kasten } 1012150694cda0842d38a9358fe8d1fcb4fb4a76599eAndreas Huber} 10131173118eace0e9e347cb007f0da817cee87579edGlenn Kasten 1014150694cda0842d38a9358fe8d1fcb4fb4a76599eAndreas Hubervoid AwesomePlayer::shutdownVideoDecoder_l() { 1015150694cda0842d38a9358fe8d1fcb4fb4a76599eAndreas Huber if (mVideoBuffer) { 1016150694cda0842d38a9358fe8d1fcb4fb4a76599eAndreas Huber mVideoBuffer->release(); 1017150694cda0842d38a9358fe8d1fcb4fb4a76599eAndreas Huber mVideoBuffer = NULL; 1018150694cda0842d38a9358fe8d1fcb4fb4a76599eAndreas Huber } 1019150694cda0842d38a9358fe8d1fcb4fb4a76599eAndreas Huber 1020150694cda0842d38a9358fe8d1fcb4fb4a76599eAndreas Huber mVideoSource->stop(); 1021150694cda0842d38a9358fe8d1fcb4fb4a76599eAndreas Huber 1022150694cda0842d38a9358fe8d1fcb4fb4a76599eAndreas Huber // The following hack is necessary to ensure that the OMX 1023150694cda0842d38a9358fe8d1fcb4fb4a76599eAndreas Huber // component is completely released by the time we may try 1024150694cda0842d38a9358fe8d1fcb4fb4a76599eAndreas Huber // to instantiate it again. 1025150694cda0842d38a9358fe8d1fcb4fb4a76599eAndreas Huber wp<MediaSource> tmp = mVideoSource; 1026150694cda0842d38a9358fe8d1fcb4fb4a76599eAndreas Huber mVideoSource.clear(); 1027150694cda0842d38a9358fe8d1fcb4fb4a76599eAndreas Huber while (tmp.promote() != NULL) { 1028150694cda0842d38a9358fe8d1fcb4fb4a76599eAndreas Huber usleep(1000); 1029150694cda0842d38a9358fe8d1fcb4fb4a76599eAndreas Huber } 1030150694cda0842d38a9358fe8d1fcb4fb4a76599eAndreas Huber IPCThreadState::self()->flushCommands(); 1031150694cda0842d38a9358fe8d1fcb4fb4a76599eAndreas Huber} 1032150694cda0842d38a9358fe8d1fcb4fb4a76599eAndreas Huber 1033150694cda0842d38a9358fe8d1fcb4fb4a76599eAndreas Hubervoid AwesomePlayer::setNativeWindow_l(const sp<ANativeWindow> &native) { 1034150694cda0842d38a9358fe8d1fcb4fb4a76599eAndreas Huber mNativeWindow = native; 1035150694cda0842d38a9358fe8d1fcb4fb4a76599eAndreas Huber 1036150694cda0842d38a9358fe8d1fcb4fb4a76599eAndreas Huber if (mVideoSource == NULL) { 1037150694cda0842d38a9358fe8d1fcb4fb4a76599eAndreas Huber return; 1038150694cda0842d38a9358fe8d1fcb4fb4a76599eAndreas Huber } 1039150694cda0842d38a9358fe8d1fcb4fb4a76599eAndreas Huber 1040150694cda0842d38a9358fe8d1fcb4fb4a76599eAndreas Huber LOGI("attempting to reconfigure to use new surface"); 1041150694cda0842d38a9358fe8d1fcb4fb4a76599eAndreas Huber 1042150694cda0842d38a9358fe8d1fcb4fb4a76599eAndreas Huber bool wasPlaying = (mFlags & PLAYING) != 0; 1043150694cda0842d38a9358fe8d1fcb4fb4a76599eAndreas Huber 1044150694cda0842d38a9358fe8d1fcb4fb4a76599eAndreas Huber pause_l(); 1045150694cda0842d38a9358fe8d1fcb4fb4a76599eAndreas Huber mVideoRenderer.clear(); 1046150694cda0842d38a9358fe8d1fcb4fb4a76599eAndreas Huber 1047150694cda0842d38a9358fe8d1fcb4fb4a76599eAndreas Huber shutdownVideoDecoder_l(); 1048150694cda0842d38a9358fe8d1fcb4fb4a76599eAndreas Huber 1049150694cda0842d38a9358fe8d1fcb4fb4a76599eAndreas Huber CHECK_EQ(initVideoDecoder(), (status_t)OK); 1050150694cda0842d38a9358fe8d1fcb4fb4a76599eAndreas Huber 1051150694cda0842d38a9358fe8d1fcb4fb4a76599eAndreas Huber if (mLastVideoTimeUs >= 0) { 1052150694cda0842d38a9358fe8d1fcb4fb4a76599eAndreas Huber mSeeking = SEEK; 1053150694cda0842d38a9358fe8d1fcb4fb4a76599eAndreas Huber mSeekNotificationSent = true; 1054150694cda0842d38a9358fe8d1fcb4fb4a76599eAndreas Huber mSeekTimeUs = mLastVideoTimeUs; 1055150694cda0842d38a9358fe8d1fcb4fb4a76599eAndreas Huber mFlags &= ~(AT_EOS | AUDIO_AT_EOS | VIDEO_AT_EOS); 1056150694cda0842d38a9358fe8d1fcb4fb4a76599eAndreas Huber } 1057150694cda0842d38a9358fe8d1fcb4fb4a76599eAndreas Huber 1058150694cda0842d38a9358fe8d1fcb4fb4a76599eAndreas Huber if (wasPlaying) { 1059150694cda0842d38a9358fe8d1fcb4fb4a76599eAndreas Huber play_l(); 1060150694cda0842d38a9358fe8d1fcb4fb4a76599eAndreas Huber } 10615daeb129a2c2ba3d14ccd94af283b5f561c783eaAndreas Huber} 10625daeb129a2c2ba3d14ccd94af283b5f561c783eaAndreas Huber 1063bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Hubervoid AwesomePlayer::setAudioSink( 1064bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber const sp<MediaPlayerBase::AudioSink> &audioSink) { 1065bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber Mutex::Autolock autoLock(mLock); 1066bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber 1067bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber mAudioSink = audioSink; 1068bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber} 1069bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber 1070bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huberstatus_t AwesomePlayer::setLooping(bool shouldLoop) { 1071bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber Mutex::Autolock autoLock(mLock); 1072bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber 1073bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber mFlags = mFlags & ~LOOPING; 1074bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber 1075bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber if (shouldLoop) { 1076bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber mFlags |= LOOPING; 1077bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber } 1078bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber 1079bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber return OK; 1080bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber} 1081bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber 1082bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huberstatus_t AwesomePlayer::getDuration(int64_t *durationUs) { 10832415ecb5bb4e1459024f6d6c8ae2d6e3dc4fbdc7Andreas Huber Mutex::Autolock autoLock(mMiscStateLock); 1084bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber 1085bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber if (mDurationUs < 0) { 1086bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber return UNKNOWN_ERROR; 1087bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber } 1088bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber 1089bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber *durationUs = mDurationUs; 1090bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber 1091bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber return OK; 1092bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber} 1093bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber 1094bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huberstatus_t AwesomePlayer::getPosition(int64_t *positionUs) { 10958d342970108926c4ea355c90d26a2a353ec0fd47Andreas Huber if (mRTSPController != NULL) { 10968d342970108926c4ea355c90d26a2a353ec0fd47Andreas Huber *positionUs = mRTSPController->getNormalPlayTimeUs(); 10978d342970108926c4ea355c90d26a2a353ec0fd47Andreas Huber } 109864bb6983690bf994d904591145a3cdd6373bdbe6Andreas Huber else if (mSeeking != NO_SEEK) { 1099dac4ee72bac87388a1495e098f39d73168c8078fAndreas Huber *positionUs = mSeekTimeUs; 11005dac87b088556b8ed7f2a4f5546d31be0bb68680Andreas Huber } else if (mVideoSource != NULL 11015dac87b088556b8ed7f2a4f5546d31be0bb68680Andreas Huber && (mAudioPlayer == NULL || !(mFlags & VIDEO_AT_EOS))) { 11022415ecb5bb4e1459024f6d6c8ae2d6e3dc4fbdc7Andreas Huber Mutex::Autolock autoLock(mMiscStateLock); 1103bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber *positionUs = mVideoTimeUs; 1104bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber } else if (mAudioPlayer != NULL) { 1105bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber *positionUs = mAudioPlayer->getMediaTimeUs(); 1106bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber } else { 1107bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber *positionUs = 0; 1108bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber } 1109bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber 1110bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber return OK; 1111bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber} 1112bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber 1113bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huberstatus_t AwesomePlayer::seekTo(int64_t timeUs) { 111470f521de2675ce6eedf4b22beed94ea1289b0f38Andreas Huber if (mExtractorFlags & MediaExtractor::CAN_SEEK) { 1115acdd9d0f59c3d8bdc3de80664a609527ec3d21e2Andreas Huber Mutex::Autolock autoLock(mLock); 1116acdd9d0f59c3d8bdc3de80664a609527ec3d21e2Andreas Huber return seekTo_l(timeUs); 1117acdd9d0f59c3d8bdc3de80664a609527ec3d21e2Andreas Huber } 1118acdd9d0f59c3d8bdc3de80664a609527ec3d21e2Andreas Huber 1119acdd9d0f59c3d8bdc3de80664a609527ec3d21e2Andreas Huber return OK; 1120bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber} 1121bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber 11220dcd837af4169bdb6fb2a0c384722dc4f57433c6Andreas Huber// static 11230dcd837af4169bdb6fb2a0c384722dc4f57433c6Andreas Hubervoid AwesomePlayer::OnRTSPSeekDoneWrapper(void *cookie) { 11240dcd837af4169bdb6fb2a0c384722dc4f57433c6Andreas Huber static_cast<AwesomePlayer *>(cookie)->onRTSPSeekDone(); 11250dcd837af4169bdb6fb2a0c384722dc4f57433c6Andreas Huber} 11260dcd837af4169bdb6fb2a0c384722dc4f57433c6Andreas Huber 11270dcd837af4169bdb6fb2a0c384722dc4f57433c6Andreas Hubervoid AwesomePlayer::onRTSPSeekDone() { 11280dcd837af4169bdb6fb2a0c384722dc4f57433c6Andreas Huber notifyListener_l(MEDIA_SEEK_COMPLETE); 11290dcd837af4169bdb6fb2a0c384722dc4f57433c6Andreas Huber mSeekNotificationSent = true; 11300dcd837af4169bdb6fb2a0c384722dc4f57433c6Andreas Huber} 11310dcd837af4169bdb6fb2a0c384722dc4f57433c6Andreas Huber 1132bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huberstatus_t AwesomePlayer::seekTo_l(int64_t timeUs) { 1133cce326fe43411855aca2f719e505b051bc4b61b3Andreas Huber if (mRTSPController != NULL) { 11340dcd837af4169bdb6fb2a0c384722dc4f57433c6Andreas Huber mRTSPController->seekAsync(timeUs, OnRTSPSeekDoneWrapper, this); 1135cce326fe43411855aca2f719e505b051bc4b61b3Andreas Huber return OK; 1136cce326fe43411855aca2f719e505b051bc4b61b3Andreas Huber } 1137cce326fe43411855aca2f719e505b051bc4b61b3Andreas Huber 11380a5baa9b411fe086013d2a5e9126ed63fbad046cAndreas Huber if (mFlags & CACHE_UNDERRUN) { 11390a5baa9b411fe086013d2a5e9126ed63fbad046cAndreas Huber mFlags &= ~CACHE_UNDERRUN; 11400a5baa9b411fe086013d2a5e9126ed63fbad046cAndreas Huber play_l(); 11410a5baa9b411fe086013d2a5e9126ed63fbad046cAndreas Huber } 11420a5baa9b411fe086013d2a5e9126ed63fbad046cAndreas Huber 11435dac87b088556b8ed7f2a4f5546d31be0bb68680Andreas Huber if ((mFlags & PLAYING) && mVideoSource != NULL && (mFlags & VIDEO_AT_EOS)) { 11445dac87b088556b8ed7f2a4f5546d31be0bb68680Andreas Huber // Video playback completed before, there's no pending 11455dac87b088556b8ed7f2a4f5546d31be0bb68680Andreas Huber // video event right now. In order for this new seek 11465dac87b088556b8ed7f2a4f5546d31be0bb68680Andreas Huber // to be honored, we need to post one. 11475dac87b088556b8ed7f2a4f5546d31be0bb68680Andreas Huber 11485dac87b088556b8ed7f2a4f5546d31be0bb68680Andreas Huber postVideoEvent_l(); 11495dac87b088556b8ed7f2a4f5546d31be0bb68680Andreas Huber } 11505dac87b088556b8ed7f2a4f5546d31be0bb68680Andreas Huber 115164bb6983690bf994d904591145a3cdd6373bdbe6Andreas Huber mSeeking = SEEK; 11521321fdd94d354431b930735e9f38f32ecd189a2dAndreas Huber mSeekNotificationSent = false; 1153bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber mSeekTimeUs = timeUs; 11545d2de4da54504836e4b772b3010ac28c19f667f0Andreas Huber mFlags &= ~(AT_EOS | AUDIO_AT_EOS | VIDEO_AT_EOS); 1155bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber 1156bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber seekAudioIfNecessary_l(); 1157bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber 11581321fdd94d354431b930735e9f38f32ecd189a2dAndreas Huber if (!(mFlags & PLAYING)) { 11591321fdd94d354431b930735e9f38f32ecd189a2dAndreas Huber LOGV("seeking while paused, sending SEEK_COMPLETE notification" 11601321fdd94d354431b930735e9f38f32ecd189a2dAndreas Huber " immediately."); 11611321fdd94d354431b930735e9f38f32ecd189a2dAndreas Huber 11621321fdd94d354431b930735e9f38f32ecd189a2dAndreas Huber notifyListener_l(MEDIA_SEEK_COMPLETE); 11631321fdd94d354431b930735e9f38f32ecd189a2dAndreas Huber mSeekNotificationSent = true; 11642b1222f8938356669672f35e0e53e176c78c40efAndreas Huber 11652b1222f8938356669672f35e0e53e176c78c40efAndreas Huber if ((mFlags & PREPARED) && mVideoSource != NULL) { 11662b1222f8938356669672f35e0e53e176c78c40efAndreas Huber mFlags |= SEEK_PREVIEW; 11672b1222f8938356669672f35e0e53e176c78c40efAndreas Huber postVideoEvent_l(); 11682b1222f8938356669672f35e0e53e176c78c40efAndreas Huber } 11691321fdd94d354431b930735e9f38f32ecd189a2dAndreas Huber } 11701321fdd94d354431b930735e9f38f32ecd189a2dAndreas Huber 1171bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber return OK; 1172bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber} 1173bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber 1174bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Hubervoid AwesomePlayer::seekAudioIfNecessary_l() { 117564bb6983690bf994d904591145a3cdd6373bdbe6Andreas Huber if (mSeeking != NO_SEEK && mVideoSource == NULL && mAudioPlayer != NULL) { 1176bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber mAudioPlayer->seekTo(mSeekTimeUs); 1177bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber 11781862a33b246249630b654182afb5914da3480d4cAndreas Huber mWatchForAudioSeekComplete = true; 11791862a33b246249630b654182afb5914da3480d4cAndreas Huber mWatchForAudioEOS = true; 1180dcd25efb46c41c8d24a0a9cf61fb57f84149709eGloria Wang 1181dcd25efb46c41c8d24a0a9cf61fb57f84149709eGloria Wang if (mDecryptHandle != NULL) { 1182dcd25efb46c41c8d24a0a9cf61fb57f84149709eGloria Wang mDrmManagerClient->setPlaybackStatus(mDecryptHandle, 1183dcd25efb46c41c8d24a0a9cf61fb57f84149709eGloria Wang Playback::PAUSE, 0); 1184dcd25efb46c41c8d24a0a9cf61fb57f84149709eGloria Wang mDrmManagerClient->setPlaybackStatus(mDecryptHandle, 1185dcd25efb46c41c8d24a0a9cf61fb57f84149709eGloria Wang Playback::START, mSeekTimeUs / 1000); 1186dcd25efb46c41c8d24a0a9cf61fb57f84149709eGloria Wang } 1187bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber } 1188bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber} 1189bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber 119088d8a83de12592635248aa1a3bd6b9ea46108501Andreas Hubervoid AwesomePlayer::setAudioSource(sp<MediaSource> source) { 119188d8a83de12592635248aa1a3bd6b9ea46108501Andreas Huber CHECK(source != NULL); 1192bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber 119388d8a83de12592635248aa1a3bd6b9ea46108501Andreas Huber mAudioTrack = source; 119488d8a83de12592635248aa1a3bd6b9ea46108501Andreas Huber} 119588d8a83de12592635248aa1a3bd6b9ea46108501Andreas Huber 119688d8a83de12592635248aa1a3bd6b9ea46108501Andreas Huberstatus_t AwesomePlayer::initAudioDecoder() { 119788d8a83de12592635248aa1a3bd6b9ea46108501Andreas Huber sp<MetaData> meta = mAudioTrack->getFormat(); 1198717826ececd8d39596f62418677721d70776add1Andreas Huber 1199717826ececd8d39596f62418677721d70776add1Andreas Huber const char *mime; 1200717826ececd8d39596f62418677721d70776add1Andreas Huber CHECK(meta->findCString(kKeyMIMEType, &mime)); 1201717826ececd8d39596f62418677721d70776add1Andreas Huber 1202717826ececd8d39596f62418677721d70776add1Andreas Huber if (!strcasecmp(mime, MEDIA_MIMETYPE_AUDIO_RAW)) { 120388d8a83de12592635248aa1a3bd6b9ea46108501Andreas Huber mAudioSource = mAudioTrack; 1204717826ececd8d39596f62418677721d70776add1Andreas Huber } else { 1205717826ececd8d39596f62418677721d70776add1Andreas Huber mAudioSource = OMXCodec::Create( 120688d8a83de12592635248aa1a3bd6b9ea46108501Andreas Huber mClient.interface(), mAudioTrack->getFormat(), 1207717826ececd8d39596f62418677721d70776add1Andreas Huber false, // createEncoder 120888d8a83de12592635248aa1a3bd6b9ea46108501Andreas Huber mAudioTrack); 1209717826ececd8d39596f62418677721d70776add1Andreas Huber } 1210bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber 1211bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber if (mAudioSource != NULL) { 1212bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber int64_t durationUs; 121388d8a83de12592635248aa1a3bd6b9ea46108501Andreas Huber if (mAudioTrack->getFormat()->findInt64(kKeyDuration, &durationUs)) { 12142415ecb5bb4e1459024f6d6c8ae2d6e3dc4fbdc7Andreas Huber Mutex::Autolock autoLock(mMiscStateLock); 1215bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber if (mDurationUs < 0 || durationUs > mDurationUs) { 1216bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber mDurationUs = durationUs; 1217bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber } 1218bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber } 1219bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber 1220a945bfd91aa291fba4d9201ffcb38fce40eab7feAndreas Huber status_t err = mAudioSource->start(); 1221a945bfd91aa291fba4d9201ffcb38fce40eab7feAndreas Huber 1222a945bfd91aa291fba4d9201ffcb38fce40eab7feAndreas Huber if (err != OK) { 1223a945bfd91aa291fba4d9201ffcb38fce40eab7feAndreas Huber mAudioSource.clear(); 1224a945bfd91aa291fba4d9201ffcb38fce40eab7feAndreas Huber return err; 1225a945bfd91aa291fba4d9201ffcb38fce40eab7feAndreas Huber } 122681f82c32459029bf0744e28c73f95a7f18cab5acAndreas Huber } else if (!strcasecmp(mime, MEDIA_MIMETYPE_AUDIO_QCELP)) { 122781f82c32459029bf0744e28c73f95a7f18cab5acAndreas Huber // For legacy reasons we're simply going to ignore the absence 122881f82c32459029bf0744e28c73f95a7f18cab5acAndreas Huber // of an audio decoder for QCELP instead of aborting playback 122981f82c32459029bf0744e28c73f95a7f18cab5acAndreas Huber // altogether. 123081f82c32459029bf0744e28c73f95a7f18cab5acAndreas Huber return OK; 123181f82c32459029bf0744e28c73f95a7f18cab5acAndreas Huber } 1232e7e3b785a0e7819db4c895a4f60e9a4dd755880cAndreas Huber 1233bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber return mAudioSource != NULL ? OK : UNKNOWN_ERROR; 1234bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber} 1235bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber 123688d8a83de12592635248aa1a3bd6b9ea46108501Andreas Hubervoid AwesomePlayer::setVideoSource(sp<MediaSource> source) { 123788d8a83de12592635248aa1a3bd6b9ea46108501Andreas Huber CHECK(source != NULL); 1238bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber 123988d8a83de12592635248aa1a3bd6b9ea46108501Andreas Huber mVideoTrack = source; 124088d8a83de12592635248aa1a3bd6b9ea46108501Andreas Huber} 124188d8a83de12592635248aa1a3bd6b9ea46108501Andreas Huber 12422a4d22d79e927f2245537921e10fc5fda1c47a29Andreas Huberstatus_t AwesomePlayer::initVideoDecoder(uint32_t flags) { 12432eb62955eb84b97695e8a7e56e14310cbb86412bGlenn Kasten 12442eb62955eb84b97695e8a7e56e14310cbb86412bGlenn Kasten // Either the application or the DRM system can independently say 12452eb62955eb84b97695e8a7e56e14310cbb86412bGlenn Kasten // that there must be a hardware-protected path to an external video sink. 12462eb62955eb84b97695e8a7e56e14310cbb86412bGlenn Kasten // For now we always require a hardware-protected path to external video sink 12472eb62955eb84b97695e8a7e56e14310cbb86412bGlenn Kasten // if content is DRMed, but eventually this could be optional per DRM agent. 12482eb62955eb84b97695e8a7e56e14310cbb86412bGlenn Kasten // When the application wants protection, then 12492eb62955eb84b97695e8a7e56e14310cbb86412bGlenn Kasten // (USE_SURFACE_ALLOC && (mSurface != 0) && 12502eb62955eb84b97695e8a7e56e14310cbb86412bGlenn Kasten // (mSurface->getFlags() & ISurfaceComposer::eProtectedByApp)) 12512eb62955eb84b97695e8a7e56e14310cbb86412bGlenn Kasten // will be true, but that part is already handled by SurfaceFlinger. 1252eabd34665adc284525fe7337ad5c56a8b92964efGlenn Kasten 1253eabd34665adc284525fe7337ad5c56a8b92964efGlenn Kasten#ifdef DEBUG_HDCP 1254eabd34665adc284525fe7337ad5c56a8b92964efGlenn Kasten // For debugging, we allow a system property to control the protected usage. 1255eabd34665adc284525fe7337ad5c56a8b92964efGlenn Kasten // In case of uninitialized or unexpected property, we default to "DRM only". 1256eabd34665adc284525fe7337ad5c56a8b92964efGlenn Kasten bool setProtectionBit = false; 1257eabd34665adc284525fe7337ad5c56a8b92964efGlenn Kasten char value[PROPERTY_VALUE_MAX]; 1258eabd34665adc284525fe7337ad5c56a8b92964efGlenn Kasten if (property_get("persist.sys.hdcp_checking", value, NULL)) { 1259eabd34665adc284525fe7337ad5c56a8b92964efGlenn Kasten if (!strcmp(value, "never")) { 1260eabd34665adc284525fe7337ad5c56a8b92964efGlenn Kasten // nop 1261eabd34665adc284525fe7337ad5c56a8b92964efGlenn Kasten } else if (!strcmp(value, "always")) { 1262eabd34665adc284525fe7337ad5c56a8b92964efGlenn Kasten setProtectionBit = true; 1263eabd34665adc284525fe7337ad5c56a8b92964efGlenn Kasten } else if (!strcmp(value, "drm-only")) { 1264eabd34665adc284525fe7337ad5c56a8b92964efGlenn Kasten if (mDecryptHandle != NULL) { 1265eabd34665adc284525fe7337ad5c56a8b92964efGlenn Kasten setProtectionBit = true; 1266eabd34665adc284525fe7337ad5c56a8b92964efGlenn Kasten } 1267eabd34665adc284525fe7337ad5c56a8b92964efGlenn Kasten // property value is empty, or unexpected value 1268eabd34665adc284525fe7337ad5c56a8b92964efGlenn Kasten } else { 1269eabd34665adc284525fe7337ad5c56a8b92964efGlenn Kasten if (mDecryptHandle != NULL) { 1270eabd34665adc284525fe7337ad5c56a8b92964efGlenn Kasten setProtectionBit = true; 1271eabd34665adc284525fe7337ad5c56a8b92964efGlenn Kasten } 1272eabd34665adc284525fe7337ad5c56a8b92964efGlenn Kasten } 1273eabd34665adc284525fe7337ad5c56a8b92964efGlenn Kasten // can' read property value 1274eabd34665adc284525fe7337ad5c56a8b92964efGlenn Kasten } else { 1275eabd34665adc284525fe7337ad5c56a8b92964efGlenn Kasten if (mDecryptHandle != NULL) { 1276eabd34665adc284525fe7337ad5c56a8b92964efGlenn Kasten setProtectionBit = true; 1277eabd34665adc284525fe7337ad5c56a8b92964efGlenn Kasten } 1278eabd34665adc284525fe7337ad5c56a8b92964efGlenn Kasten } 1279eabd34665adc284525fe7337ad5c56a8b92964efGlenn Kasten // note that usage bit is already cleared, so no need to clear it in the "else" case 1280eabd34665adc284525fe7337ad5c56a8b92964efGlenn Kasten if (setProtectionBit) { 1281eabd34665adc284525fe7337ad5c56a8b92964efGlenn Kasten flags |= OMXCodec::kEnableGrallocUsageProtected; 1282eabd34665adc284525fe7337ad5c56a8b92964efGlenn Kasten } 1283eabd34665adc284525fe7337ad5c56a8b92964efGlenn Kasten#else 12842eb62955eb84b97695e8a7e56e14310cbb86412bGlenn Kasten if (mDecryptHandle != NULL) { 12852eb62955eb84b97695e8a7e56e14310cbb86412bGlenn Kasten flags |= OMXCodec::kEnableGrallocUsageProtected; 12862eb62955eb84b97695e8a7e56e14310cbb86412bGlenn Kasten } 1287eabd34665adc284525fe7337ad5c56a8b92964efGlenn Kasten#endif 12882eb62955eb84b97695e8a7e56e14310cbb86412bGlenn Kasten LOGV("initVideoDecoder flags=0x%x", flags); 1289bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber mVideoSource = OMXCodec::Create( 129088d8a83de12592635248aa1a3bd6b9ea46108501Andreas Huber mClient.interface(), mVideoTrack->getFormat(), 1291bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber false, // createEncoder 129239ddf8e0f18766f7ba1e3246b774aa6ebd93eea8Andreas Huber mVideoTrack, 12931173118eace0e9e347cb007f0da817cee87579edGlenn Kasten NULL, flags, USE_SURFACE_ALLOC ? mNativeWindow : NULL); 1294bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber 1295bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber if (mVideoSource != NULL) { 1296bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber int64_t durationUs; 129788d8a83de12592635248aa1a3bd6b9ea46108501Andreas Huber if (mVideoTrack->getFormat()->findInt64(kKeyDuration, &durationUs)) { 12982415ecb5bb4e1459024f6d6c8ae2d6e3dc4fbdc7Andreas Huber Mutex::Autolock autoLock(mMiscStateLock); 1299bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber if (mDurationUs < 0 || durationUs > mDurationUs) { 1300bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber mDurationUs = durationUs; 1301bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber } 1302bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber } 1303bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber 1304139a5d5bd33c9fc7708d0a79f11ee928f7796e6bAndreas Huber status_t err = mVideoSource->start(); 1305139a5d5bd33c9fc7708d0a79f11ee928f7796e6bAndreas Huber 1306139a5d5bd33c9fc7708d0a79f11ee928f7796e6bAndreas Huber if (err != OK) { 1307139a5d5bd33c9fc7708d0a79f11ee928f7796e6bAndreas Huber mVideoSource.clear(); 1308139a5d5bd33c9fc7708d0a79f11ee928f7796e6bAndreas Huber return err; 1309139a5d5bd33c9fc7708d0a79f11ee928f7796e6bAndreas Huber } 1310bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber } 1311bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber 1312bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber return mVideoSource != NULL ? OK : UNKNOWN_ERROR; 1313bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber} 1314bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber 13154769cc92740e3ab58e9263d42553c12bbf79e3beAndreas Hubervoid AwesomePlayer::finishSeekIfNecessary(int64_t videoTimeUs) { 131664bb6983690bf994d904591145a3cdd6373bdbe6Andreas Huber if (mSeeking == SEEK_VIDEO_ONLY) { 131764bb6983690bf994d904591145a3cdd6373bdbe6Andreas Huber mSeeking = NO_SEEK; 131864bb6983690bf994d904591145a3cdd6373bdbe6Andreas Huber return; 131964bb6983690bf994d904591145a3cdd6373bdbe6Andreas Huber } 132064bb6983690bf994d904591145a3cdd6373bdbe6Andreas Huber 132164bb6983690bf994d904591145a3cdd6373bdbe6Andreas Huber if (mSeeking == NO_SEEK || (mFlags & SEEK_PREVIEW)) { 13224769cc92740e3ab58e9263d42553c12bbf79e3beAndreas Huber return; 13234769cc92740e3ab58e9263d42553c12bbf79e3beAndreas Huber } 13244769cc92740e3ab58e9263d42553c12bbf79e3beAndreas Huber 13254769cc92740e3ab58e9263d42553c12bbf79e3beAndreas Huber if (mAudioPlayer != NULL) { 1326f83dd80384f70da1f6d36d60e831439ff7739ad7Jamie Gennis LOGV("seeking audio to %lld us (%.2f secs).", videoTimeUs, videoTimeUs / 1E6); 13274769cc92740e3ab58e9263d42553c12bbf79e3beAndreas Huber 13284769cc92740e3ab58e9263d42553c12bbf79e3beAndreas Huber // If we don't have a video time, seek audio to the originally 13294769cc92740e3ab58e9263d42553c12bbf79e3beAndreas Huber // requested seek time instead. 13304769cc92740e3ab58e9263d42553c12bbf79e3beAndreas Huber 13314769cc92740e3ab58e9263d42553c12bbf79e3beAndreas Huber mAudioPlayer->seekTo(videoTimeUs < 0 ? mSeekTimeUs : videoTimeUs); 13324769cc92740e3ab58e9263d42553c12bbf79e3beAndreas Huber mWatchForAudioSeekComplete = true; 13335dac87b088556b8ed7f2a4f5546d31be0bb68680Andreas Huber mWatchForAudioEOS = true; 13344769cc92740e3ab58e9263d42553c12bbf79e3beAndreas Huber } else if (!mSeekNotificationSent) { 13354769cc92740e3ab58e9263d42553c12bbf79e3beAndreas Huber // If we're playing video only, report seek complete now, 13364769cc92740e3ab58e9263d42553c12bbf79e3beAndreas Huber // otherwise audio player will notify us later. 13374769cc92740e3ab58e9263d42553c12bbf79e3beAndreas Huber notifyListener_l(MEDIA_SEEK_COMPLETE); 1338512895089f2035bc86d3f502255199809aca721bAndreas Huber mSeekNotificationSent = true; 13394769cc92740e3ab58e9263d42553c12bbf79e3beAndreas Huber } 13404769cc92740e3ab58e9263d42553c12bbf79e3beAndreas Huber 13414769cc92740e3ab58e9263d42553c12bbf79e3beAndreas Huber mFlags |= FIRST_FRAME; 134264bb6983690bf994d904591145a3cdd6373bdbe6Andreas Huber mSeeking = NO_SEEK; 1343a89082944308805b0def7de87c67e370e74b8789Gloria Wang 1344a89082944308805b0def7de87c67e370e74b8789Gloria Wang if (mDecryptHandle != NULL) { 1345a89082944308805b0def7de87c67e370e74b8789Gloria Wang mDrmManagerClient->setPlaybackStatus(mDecryptHandle, 1346a89082944308805b0def7de87c67e370e74b8789Gloria Wang Playback::PAUSE, 0); 1347a89082944308805b0def7de87c67e370e74b8789Gloria Wang mDrmManagerClient->setPlaybackStatus(mDecryptHandle, 1348a89082944308805b0def7de87c67e370e74b8789Gloria Wang Playback::START, videoTimeUs / 1000); 1349a89082944308805b0def7de87c67e370e74b8789Gloria Wang } 13504769cc92740e3ab58e9263d42553c12bbf79e3beAndreas Huber} 13514769cc92740e3ab58e9263d42553c12bbf79e3beAndreas Huber 1352c23f12af0394aa2f6651968a3c8840f1af317aa1Andreas Hubervoid AwesomePlayer::onVideoEvent() { 1353bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber Mutex::Autolock autoLock(mLock); 13547b3396acc702451be9bafb19d7fe26d55d43a316Andreas Huber if (!mVideoEventPending) { 13557b3396acc702451be9bafb19d7fe26d55d43a316Andreas Huber // The event has been cancelled in reset_l() but had already 13567b3396acc702451be9bafb19d7fe26d55d43a316Andreas Huber // been scheduled for execution at that time. 13577b3396acc702451be9bafb19d7fe26d55d43a316Andreas Huber return; 13587b3396acc702451be9bafb19d7fe26d55d43a316Andreas Huber } 1359bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber mVideoEventPending = false; 1360bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber 136164bb6983690bf994d904591145a3cdd6373bdbe6Andreas Huber if (mSeeking != NO_SEEK) { 1362bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber if (mVideoBuffer) { 1363bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber mVideoBuffer->release(); 1364bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber mVideoBuffer = NULL; 1365bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber } 13660a5baa9b411fe086013d2a5e9126ed63fbad046cAndreas Huber 136764bb6983690bf994d904591145a3cdd6373bdbe6Andreas Huber if (mSeeking == SEEK && mCachedSource != NULL && mAudioSource != NULL 13682b1222f8938356669672f35e0e53e176c78c40efAndreas Huber && !(mFlags & SEEK_PREVIEW)) { 13690a5baa9b411fe086013d2a5e9126ed63fbad046cAndreas Huber // We're going to seek the video source first, followed by 13700a5baa9b411fe086013d2a5e9126ed63fbad046cAndreas Huber // the audio source. 13710a5baa9b411fe086013d2a5e9126ed63fbad046cAndreas Huber // In order to avoid jumps in the DataSource offset caused by 13720a5baa9b411fe086013d2a5e9126ed63fbad046cAndreas Huber // the audio codec prefetching data from the old locations 13730a5baa9b411fe086013d2a5e9126ed63fbad046cAndreas Huber // while the video codec is already reading data from the new 13740a5baa9b411fe086013d2a5e9126ed63fbad046cAndreas Huber // locations, we'll "pause" the audio source, causing it to 13750a5baa9b411fe086013d2a5e9126ed63fbad046cAndreas Huber // stop reading input data until a subsequent seek. 13760a5baa9b411fe086013d2a5e9126ed63fbad046cAndreas Huber 1377f03034408506051f2f836e59305fcd5f662bf19aAndreas Huber if (mAudioPlayer != NULL && (mFlags & AUDIO_RUNNING)) { 13780a5baa9b411fe086013d2a5e9126ed63fbad046cAndreas Huber mAudioPlayer->pause(); 1379f03034408506051f2f836e59305fcd5f662bf19aAndreas Huber 1380f03034408506051f2f836e59305fcd5f662bf19aAndreas Huber mFlags &= ~AUDIO_RUNNING; 13810a5baa9b411fe086013d2a5e9126ed63fbad046cAndreas Huber } 13820a5baa9b411fe086013d2a5e9126ed63fbad046cAndreas Huber mAudioSource->pause(); 13830a5baa9b411fe086013d2a5e9126ed63fbad046cAndreas Huber } 1384bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber } 1385bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber 1386bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber if (!mVideoBuffer) { 1387bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber MediaSource::ReadOptions options; 138864bb6983690bf994d904591145a3cdd6373bdbe6Andreas Huber if (mSeeking != NO_SEEK) { 1389bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber LOGV("seeking to %lld us (%.2f secs)", mSeekTimeUs, mSeekTimeUs / 1E6); 1390bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber 1391abd1f4f870925d6776dbe4b930b759a1ab6595caAndreas Huber options.setSeekTo( 139264bb6983690bf994d904591145a3cdd6373bdbe6Andreas Huber mSeekTimeUs, 139364bb6983690bf994d904591145a3cdd6373bdbe6Andreas Huber mSeeking == SEEK_VIDEO_ONLY 139464bb6983690bf994d904591145a3cdd6373bdbe6Andreas Huber ? MediaSource::ReadOptions::SEEK_NEXT_SYNC 139564bb6983690bf994d904591145a3cdd6373bdbe6Andreas Huber : MediaSource::ReadOptions::SEEK_CLOSEST_SYNC); 1396bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber } 1397bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber for (;;) { 1398bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber status_t err = mVideoSource->read(&mVideoBuffer, &options); 1399c1689e49ac867de33f2e81289449878ac2e536a0Andreas Huber options.clearSeekTo(); 1400bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber 1401bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber if (err != OK) { 1402e2b1028852120bcfded33b8f06f66b780437fe92Andreas Huber CHECK(mVideoBuffer == NULL); 1403bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber 1404bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber if (err == INFO_FORMAT_CHANGED) { 1405bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber LOGV("VideoSource signalled format change."); 1406bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber 14075daeb129a2c2ba3d14ccd94af283b5f561c783eaAndreas Huber notifyVideoSize_l(); 14085daeb129a2c2ba3d14ccd94af283b5f561c783eaAndreas Huber 1409a657f8deaf21acbe5faba7be1df9c6681d44d471Andreas Huber if (mVideoRenderer != NULL) { 1410fa090f541bb84a546af2ec834e91a032ff10e66eAndreas Huber mVideoRendererIsPreview = false; 1411a657f8deaf21acbe5faba7be1df9c6681d44d471Andreas Huber initRenderer_l(); 1412a657f8deaf21acbe5faba7be1df9c6681d44d471Andreas Huber } 1413bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber continue; 1414bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber } 1415bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber 14164769cc92740e3ab58e9263d42553c12bbf79e3beAndreas Huber // So video playback is complete, but we may still have 14174769cc92740e3ab58e9263d42553c12bbf79e3beAndreas Huber // a seek request pending that needs to be applied 14184769cc92740e3ab58e9263d42553c12bbf79e3beAndreas Huber // to the audio track. 141964bb6983690bf994d904591145a3cdd6373bdbe6Andreas Huber if (mSeeking != NO_SEEK) { 14204769cc92740e3ab58e9263d42553c12bbf79e3beAndreas Huber LOGV("video stream ended while seeking!"); 14214769cc92740e3ab58e9263d42553c12bbf79e3beAndreas Huber } 14224769cc92740e3ab58e9263d42553c12bbf79e3beAndreas Huber finishSeekIfNecessary(-1); 14234769cc92740e3ab58e9263d42553c12bbf79e3beAndreas Huber 14245dac87b088556b8ed7f2a4f5546d31be0bb68680Andreas Huber if (mAudioPlayer != NULL 14255dac87b088556b8ed7f2a4f5546d31be0bb68680Andreas Huber && !(mFlags & (AUDIO_RUNNING | SEEK_PREVIEW))) { 14265dac87b088556b8ed7f2a4f5546d31be0bb68680Andreas Huber startAudioPlayer_l(); 14275dac87b088556b8ed7f2a4f5546d31be0bb68680Andreas Huber } 14285dac87b088556b8ed7f2a4f5546d31be0bb68680Andreas Huber 14295d2de4da54504836e4b772b3010ac28c19f667f0Andreas Huber mFlags |= VIDEO_AT_EOS; 14305295c0c55d41a2906ea7f65a3f22e6278cb17d4bAndreas Huber postStreamDoneEvent_l(err); 1431bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber return; 1432bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber } 1433bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber 14344844ac54e8b5997c3b03872dbafe8ebed4787517Andreas Huber if (mVideoBuffer->range_length() == 0) { 143508411b75d4c30ce26180639f158e2f33d190eee8Andreas Huber // Some decoders, notably the PV AVC software decoder 143608411b75d4c30ce26180639f158e2f33d190eee8Andreas Huber // return spurious empty buffers that we just want to ignore. 143708411b75d4c30ce26180639f158e2f33d190eee8Andreas Huber 14384844ac54e8b5997c3b03872dbafe8ebed4787517Andreas Huber mVideoBuffer->release(); 14394844ac54e8b5997c3b03872dbafe8ebed4787517Andreas Huber mVideoBuffer = NULL; 14404844ac54e8b5997c3b03872dbafe8ebed4787517Andreas Huber continue; 14414844ac54e8b5997c3b03872dbafe8ebed4787517Andreas Huber } 14424844ac54e8b5997c3b03872dbafe8ebed4787517Andreas Huber 1443bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber break; 1444bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber } 1445bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber } 1446bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber 1447bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber int64_t timeUs; 1448bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber CHECK(mVideoBuffer->meta_data()->findInt64(kKeyTime, &timeUs)); 1449bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber 1450150694cda0842d38a9358fe8d1fcb4fb4a76599eAndreas Huber mLastVideoTimeUs = timeUs; 1451150694cda0842d38a9358fe8d1fcb4fb4a76599eAndreas Huber 145264bb6983690bf994d904591145a3cdd6373bdbe6Andreas Huber if (mSeeking == SEEK_VIDEO_ONLY) { 145364bb6983690bf994d904591145a3cdd6373bdbe6Andreas Huber if (mSeekTimeUs > timeUs) { 145464bb6983690bf994d904591145a3cdd6373bdbe6Andreas Huber LOGI("XXX mSeekTimeUs = %lld us, timeUs = %lld us", 145564bb6983690bf994d904591145a3cdd6373bdbe6Andreas Huber mSeekTimeUs, timeUs); 145664bb6983690bf994d904591145a3cdd6373bdbe6Andreas Huber } 145764bb6983690bf994d904591145a3cdd6373bdbe6Andreas Huber } 145864bb6983690bf994d904591145a3cdd6373bdbe6Andreas Huber 14592415ecb5bb4e1459024f6d6c8ae2d6e3dc4fbdc7Andreas Huber { 14602415ecb5bb4e1459024f6d6c8ae2d6e3dc4fbdc7Andreas Huber Mutex::Autolock autoLock(mMiscStateLock); 14612415ecb5bb4e1459024f6d6c8ae2d6e3dc4fbdc7Andreas Huber mVideoTimeUs = timeUs; 14622415ecb5bb4e1459024f6d6c8ae2d6e3dc4fbdc7Andreas Huber } 1463bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber 146464bb6983690bf994d904591145a3cdd6373bdbe6Andreas Huber SeekType wasSeeking = mSeeking; 14654769cc92740e3ab58e9263d42553c12bbf79e3beAndreas Huber finishSeekIfNecessary(timeUs); 1466bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber 1467f03034408506051f2f836e59305fcd5f662bf19aAndreas Huber if (mAudioPlayer != NULL && !(mFlags & (AUDIO_RUNNING | SEEK_PREVIEW))) { 1468f03034408506051f2f836e59305fcd5f662bf19aAndreas Huber status_t err = startAudioPlayer_l(); 1469f03034408506051f2f836e59305fcd5f662bf19aAndreas Huber if (err != OK) { 1470f03034408506051f2f836e59305fcd5f662bf19aAndreas Huber LOGE("Startung the audio player failed w/ err %d", err); 1471f03034408506051f2f836e59305fcd5f662bf19aAndreas Huber return; 1472f03034408506051f2f836e59305fcd5f662bf19aAndreas Huber } 1473f03034408506051f2f836e59305fcd5f662bf19aAndreas Huber } 1474f03034408506051f2f836e59305fcd5f662bf19aAndreas Huber 14755d2de4da54504836e4b772b3010ac28c19f667f0Andreas Huber TimeSource *ts = (mFlags & AUDIO_AT_EOS) ? &mSystemTimeSource : mTimeSource; 14765d2de4da54504836e4b772b3010ac28c19f667f0Andreas Huber 1477bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber if (mFlags & FIRST_FRAME) { 1478bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber mFlags &= ~FIRST_FRAME; 14795d2de4da54504836e4b772b3010ac28c19f667f0Andreas Huber mTimeSourceDeltaUs = ts->getRealTimeUs() - timeUs; 1480bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber } 1481bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber 1482bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber int64_t realTimeUs, mediaTimeUs; 14835d2de4da54504836e4b772b3010ac28c19f667f0Andreas Huber if (!(mFlags & AUDIO_AT_EOS) && mAudioPlayer != NULL 1484bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber && mAudioPlayer->getMediaTimeMapping(&realTimeUs, &mediaTimeUs)) { 1485bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber mTimeSourceDeltaUs = realTimeUs - mediaTimeUs; 1486bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber } 1487bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber 148864bb6983690bf994d904591145a3cdd6373bdbe6Andreas Huber if (wasSeeking == SEEK_VIDEO_ONLY) { 148964bb6983690bf994d904591145a3cdd6373bdbe6Andreas Huber int64_t nowUs = ts->getRealTimeUs() - mTimeSourceDeltaUs; 149064bb6983690bf994d904591145a3cdd6373bdbe6Andreas Huber 149164bb6983690bf994d904591145a3cdd6373bdbe6Andreas Huber int64_t latenessUs = nowUs - timeUs; 149264bb6983690bf994d904591145a3cdd6373bdbe6Andreas Huber 149364bb6983690bf994d904591145a3cdd6373bdbe6Andreas Huber if (latenessUs > 0) { 149464bb6983690bf994d904591145a3cdd6373bdbe6Andreas Huber LOGI("after SEEK_VIDEO_ONLY we're late by %.2f secs", latenessUs / 1E6); 149564bb6983690bf994d904591145a3cdd6373bdbe6Andreas Huber } 149664bb6983690bf994d904591145a3cdd6373bdbe6Andreas Huber } 149764bb6983690bf994d904591145a3cdd6373bdbe6Andreas Huber 149864bb6983690bf994d904591145a3cdd6373bdbe6Andreas Huber if (wasSeeking == NO_SEEK) { 149902a1db7dc1de2f2df306ec10bab992bc8bbaaca8Andreas Huber // Let's display the first frame after seeking right away. 1500f8ca90452ff3e252f20de38f1c3eee524c808c3eAndreas Huber 15012b1222f8938356669672f35e0e53e176c78c40efAndreas Huber int64_t nowUs = ts->getRealTimeUs() - mTimeSourceDeltaUs; 1502bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber 15032b1222f8938356669672f35e0e53e176c78c40efAndreas Huber int64_t latenessUs = nowUs - timeUs; 15042b1222f8938356669672f35e0e53e176c78c40efAndreas Huber 150564bb6983690bf994d904591145a3cdd6373bdbe6Andreas Huber if (latenessUs > 500000ll 150664bb6983690bf994d904591145a3cdd6373bdbe6Andreas Huber && mRTSPController == NULL 150764bb6983690bf994d904591145a3cdd6373bdbe6Andreas Huber && mAudioPlayer != NULL 150864bb6983690bf994d904591145a3cdd6373bdbe6Andreas Huber && mAudioPlayer->getMediaTimeMapping( 150964bb6983690bf994d904591145a3cdd6373bdbe6Andreas Huber &realTimeUs, &mediaTimeUs)) { 151064bb6983690bf994d904591145a3cdd6373bdbe6Andreas Huber LOGI("we're much too late (%.2f secs), video skipping ahead", 151164bb6983690bf994d904591145a3cdd6373bdbe6Andreas Huber latenessUs / 1E6); 151264bb6983690bf994d904591145a3cdd6373bdbe6Andreas Huber 151364bb6983690bf994d904591145a3cdd6373bdbe6Andreas Huber mVideoBuffer->release(); 151464bb6983690bf994d904591145a3cdd6373bdbe6Andreas Huber mVideoBuffer = NULL; 151564bb6983690bf994d904591145a3cdd6373bdbe6Andreas Huber 151664bb6983690bf994d904591145a3cdd6373bdbe6Andreas Huber mSeeking = SEEK_VIDEO_ONLY; 151764bb6983690bf994d904591145a3cdd6373bdbe6Andreas Huber mSeekTimeUs = mediaTimeUs; 151864bb6983690bf994d904591145a3cdd6373bdbe6Andreas Huber 151964bb6983690bf994d904591145a3cdd6373bdbe6Andreas Huber postVideoEvent_l(); 152064bb6983690bf994d904591145a3cdd6373bdbe6Andreas Huber return; 152164bb6983690bf994d904591145a3cdd6373bdbe6Andreas Huber } 152264bb6983690bf994d904591145a3cdd6373bdbe6Andreas Huber 15232b1222f8938356669672f35e0e53e176c78c40efAndreas Huber if (latenessUs > 40000) { 15242b1222f8938356669672f35e0e53e176c78c40efAndreas Huber // We're more than 40ms late. 1525dab59b5a4956b7e9b1ffc64a0676e7990579934eAndreas Huber LOGV("we're late by %lld us (%.2f secs), dropping frame", 1526dab59b5a4956b7e9b1ffc64a0676e7990579934eAndreas Huber latenessUs, latenessUs / 1E6); 1527dab59b5a4956b7e9b1ffc64a0676e7990579934eAndreas Huber mVideoBuffer->release(); 1528dab59b5a4956b7e9b1ffc64a0676e7990579934eAndreas Huber mVideoBuffer = NULL; 15292b1222f8938356669672f35e0e53e176c78c40efAndreas Huber 1530dab59b5a4956b7e9b1ffc64a0676e7990579934eAndreas Huber postVideoEvent_l(); 1531dab59b5a4956b7e9b1ffc64a0676e7990579934eAndreas Huber return; 1532aee6c07b3572bf2510cd9e7d29c454fcfedde31dpmehendale } 1533bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber 15342b1222f8938356669672f35e0e53e176c78c40efAndreas Huber if (latenessUs < -10000) { 15352b1222f8938356669672f35e0e53e176c78c40efAndreas Huber // We're more than 10ms early. 1536bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber 15372b1222f8938356669672f35e0e53e176c78c40efAndreas Huber postVideoEvent_l(10000); 15382b1222f8938356669672f35e0e53e176c78c40efAndreas Huber return; 15392b1222f8938356669672f35e0e53e176c78c40efAndreas Huber } 1540bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber } 1541bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber 1542fa090f541bb84a546af2ec834e91a032ff10e66eAndreas Huber if (mVideoRendererIsPreview || mVideoRenderer == NULL) { 1543fa090f541bb84a546af2ec834e91a032ff10e66eAndreas Huber mVideoRendererIsPreview = false; 1544fa090f541bb84a546af2ec834e91a032ff10e66eAndreas Huber 1545a657f8deaf21acbe5faba7be1df9c6681d44d471Andreas Huber initRenderer_l(); 1546a657f8deaf21acbe5faba7be1df9c6681d44d471Andreas Huber } 1547a657f8deaf21acbe5faba7be1df9c6681d44d471Andreas Huber 1548a657f8deaf21acbe5faba7be1df9c6681d44d471Andreas Huber if (mVideoRenderer != NULL) { 1549a657f8deaf21acbe5faba7be1df9c6681d44d471Andreas Huber mVideoRenderer->render(mVideoBuffer); 1550a657f8deaf21acbe5faba7be1df9c6681d44d471Andreas Huber } 1551bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber 1552f5ab57c2d5e02af7483c94eddb177e4f5c9e9892Andreas Huber mVideoBuffer->release(); 1553bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber mVideoBuffer = NULL; 1554bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber 155564bb6983690bf994d904591145a3cdd6373bdbe6Andreas Huber if (wasSeeking != NO_SEEK && (mFlags & SEEK_PREVIEW)) { 15562b1222f8938356669672f35e0e53e176c78c40efAndreas Huber mFlags &= ~SEEK_PREVIEW; 15572b1222f8938356669672f35e0e53e176c78c40efAndreas Huber return; 15582b1222f8938356669672f35e0e53e176c78c40efAndreas Huber } 15592b1222f8938356669672f35e0e53e176c78c40efAndreas Huber 1560bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber postVideoEvent_l(); 1561bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber} 1562bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber 1563bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Hubervoid AwesomePlayer::postVideoEvent_l(int64_t delayUs) { 1564bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber if (mVideoEventPending) { 1565bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber return; 1566bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber } 1567bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber 1568bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber mVideoEventPending = true; 1569bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber mQueue.postEventWithDelay(mVideoEvent, delayUs < 0 ? 10000 : delayUs); 1570bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber} 1571bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber 15725295c0c55d41a2906ea7f65a3f22e6278cb17d4bAndreas Hubervoid AwesomePlayer::postStreamDoneEvent_l(status_t status) { 1573bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber if (mStreamDoneEventPending) { 1574bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber return; 1575bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber } 1576bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber mStreamDoneEventPending = true; 15775295c0c55d41a2906ea7f65a3f22e6278cb17d4bAndreas Huber 15785295c0c55d41a2906ea7f65a3f22e6278cb17d4bAndreas Huber mStreamDoneStatus = status; 1579bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber mQueue.postEvent(mStreamDoneEvent); 1580bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber} 1581bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber 158266b0a35c9a4136a84c3f73b1b25fcb5220138b95Andreas Hubervoid AwesomePlayer::postBufferingEvent_l() { 158366b0a35c9a4136a84c3f73b1b25fcb5220138b95Andreas Huber if (mBufferingEventPending) { 158466b0a35c9a4136a84c3f73b1b25fcb5220138b95Andreas Huber return; 158566b0a35c9a4136a84c3f73b1b25fcb5220138b95Andreas Huber } 158666b0a35c9a4136a84c3f73b1b25fcb5220138b95Andreas Huber mBufferingEventPending = true; 158766b0a35c9a4136a84c3f73b1b25fcb5220138b95Andreas Huber mQueue.postEventWithDelay(mBufferingEvent, 1000000ll); 158866b0a35c9a4136a84c3f73b1b25fcb5220138b95Andreas Huber} 158966b0a35c9a4136a84c3f73b1b25fcb5220138b95Andreas Huber 1590145e68fc778275963189b02a1adcbe27cce4d769Andreas Hubervoid AwesomePlayer::postVideoLagEvent_l() { 1591145e68fc778275963189b02a1adcbe27cce4d769Andreas Huber if (mVideoLagEventPending) { 1592145e68fc778275963189b02a1adcbe27cce4d769Andreas Huber return; 1593145e68fc778275963189b02a1adcbe27cce4d769Andreas Huber } 1594145e68fc778275963189b02a1adcbe27cce4d769Andreas Huber mVideoLagEventPending = true; 1595145e68fc778275963189b02a1adcbe27cce4d769Andreas Huber mQueue.postEventWithDelay(mVideoLagEvent, 1000000ll); 1596145e68fc778275963189b02a1adcbe27cce4d769Andreas Huber} 1597145e68fc778275963189b02a1adcbe27cce4d769Andreas Huber 159884b343f29063fbfa2ee61b2e3d37ba059ca507d4Andreas Hubervoid AwesomePlayer::postCheckAudioStatusEvent_l(int64_t delayUs) { 15991862a33b246249630b654182afb5914da3480d4cAndreas Huber if (mAudioStatusEventPending) { 16001862a33b246249630b654182afb5914da3480d4cAndreas Huber return; 16011862a33b246249630b654182afb5914da3480d4cAndreas Huber } 16021862a33b246249630b654182afb5914da3480d4cAndreas Huber mAudioStatusEventPending = true; 160384b343f29063fbfa2ee61b2e3d37ba059ca507d4Andreas Huber mQueue.postEventWithDelay(mCheckAudioStatusEvent, delayUs); 16041862a33b246249630b654182afb5914da3480d4cAndreas Huber} 16051862a33b246249630b654182afb5914da3480d4cAndreas Huber 16061862a33b246249630b654182afb5914da3480d4cAndreas Hubervoid AwesomePlayer::onCheckAudioStatus() { 16071862a33b246249630b654182afb5914da3480d4cAndreas Huber Mutex::Autolock autoLock(mLock); 1608d29345dfa29cdcc650f3705e43950ef2500f6728Andreas Huber if (!mAudioStatusEventPending) { 1609d29345dfa29cdcc650f3705e43950ef2500f6728Andreas Huber // Event was dispatched and while we were blocking on the mutex, 1610d29345dfa29cdcc650f3705e43950ef2500f6728Andreas Huber // has already been cancelled. 1611d29345dfa29cdcc650f3705e43950ef2500f6728Andreas Huber return; 1612d29345dfa29cdcc650f3705e43950ef2500f6728Andreas Huber } 1613d29345dfa29cdcc650f3705e43950ef2500f6728Andreas Huber 16141862a33b246249630b654182afb5914da3480d4cAndreas Huber mAudioStatusEventPending = false; 16151862a33b246249630b654182afb5914da3480d4cAndreas Huber 16161862a33b246249630b654182afb5914da3480d4cAndreas Huber if (mWatchForAudioSeekComplete && !mAudioPlayer->isSeeking()) { 16171862a33b246249630b654182afb5914da3480d4cAndreas Huber mWatchForAudioSeekComplete = false; 16181321fdd94d354431b930735e9f38f32ecd189a2dAndreas Huber 16191321fdd94d354431b930735e9f38f32ecd189a2dAndreas Huber if (!mSeekNotificationSent) { 16201321fdd94d354431b930735e9f38f32ecd189a2dAndreas Huber notifyListener_l(MEDIA_SEEK_COMPLETE); 16211321fdd94d354431b930735e9f38f32ecd189a2dAndreas Huber mSeekNotificationSent = true; 16221321fdd94d354431b930735e9f38f32ecd189a2dAndreas Huber } 1623dac4ee72bac87388a1495e098f39d73168c8078fAndreas Huber 162464bb6983690bf994d904591145a3cdd6373bdbe6Andreas Huber mSeeking = NO_SEEK; 16251862a33b246249630b654182afb5914da3480d4cAndreas Huber } 16261862a33b246249630b654182afb5914da3480d4cAndreas Huber 16275295c0c55d41a2906ea7f65a3f22e6278cb17d4bAndreas Huber status_t finalStatus; 16285295c0c55d41a2906ea7f65a3f22e6278cb17d4bAndreas Huber if (mWatchForAudioEOS && mAudioPlayer->reachedEOS(&finalStatus)) { 16291862a33b246249630b654182afb5914da3480d4cAndreas Huber mWatchForAudioEOS = false; 16305d2de4da54504836e4b772b3010ac28c19f667f0Andreas Huber mFlags |= AUDIO_AT_EOS; 16315d2de4da54504836e4b772b3010ac28c19f667f0Andreas Huber mFlags |= FIRST_FRAME; 16325295c0c55d41a2906ea7f65a3f22e6278cb17d4bAndreas Huber postStreamDoneEvent_l(finalStatus); 16331862a33b246249630b654182afb5914da3480d4cAndreas Huber } 16341862a33b246249630b654182afb5914da3480d4cAndreas Huber} 16351862a33b246249630b654182afb5914da3480d4cAndreas Huber 1636c23f12af0394aa2f6651968a3c8840f1af317aa1Andreas Huberstatus_t AwesomePlayer::prepare() { 1637c23f12af0394aa2f6651968a3c8840f1af317aa1Andreas Huber Mutex::Autolock autoLock(mLock); 1638bd22c52280179b29eefac91ef7e7bbbc33d25904Andreas Huber return prepare_l(); 1639bd22c52280179b29eefac91ef7e7bbbc33d25904Andreas Huber} 1640c23f12af0394aa2f6651968a3c8840f1af317aa1Andreas Huber 1641bd22c52280179b29eefac91ef7e7bbbc33d25904Andreas Huberstatus_t AwesomePlayer::prepare_l() { 1642bd22c52280179b29eefac91ef7e7bbbc33d25904Andreas Huber if (mFlags & PREPARED) { 1643bd22c52280179b29eefac91ef7e7bbbc33d25904Andreas Huber return OK; 1644bd22c52280179b29eefac91ef7e7bbbc33d25904Andreas Huber } 1645bd22c52280179b29eefac91ef7e7bbbc33d25904Andreas Huber 1646bd22c52280179b29eefac91ef7e7bbbc33d25904Andreas Huber if (mFlags & PREPARING) { 1647bd22c52280179b29eefac91ef7e7bbbc33d25904Andreas Huber return UNKNOWN_ERROR; 1648bd22c52280179b29eefac91ef7e7bbbc33d25904Andreas Huber } 1649bd22c52280179b29eefac91ef7e7bbbc33d25904Andreas Huber 1650bd22c52280179b29eefac91ef7e7bbbc33d25904Andreas Huber mIsAsyncPrepare = false; 1651c23f12af0394aa2f6651968a3c8840f1af317aa1Andreas Huber status_t err = prepareAsync_l(); 1652c23f12af0394aa2f6651968a3c8840f1af317aa1Andreas Huber 1653c23f12af0394aa2f6651968a3c8840f1af317aa1Andreas Huber if (err != OK) { 1654c23f12af0394aa2f6651968a3c8840f1af317aa1Andreas Huber return err; 1655c23f12af0394aa2f6651968a3c8840f1af317aa1Andreas Huber } 1656c23f12af0394aa2f6651968a3c8840f1af317aa1Andreas Huber 1657bd22c52280179b29eefac91ef7e7bbbc33d25904Andreas Huber while (mFlags & PREPARING) { 1658c23f12af0394aa2f6651968a3c8840f1af317aa1Andreas Huber mPreparedCondition.wait(mLock); 1659c23f12af0394aa2f6651968a3c8840f1af317aa1Andreas Huber } 1660c23f12af0394aa2f6651968a3c8840f1af317aa1Andreas Huber 1661bd22c52280179b29eefac91ef7e7bbbc33d25904Andreas Huber return mPrepareResult; 1662c23f12af0394aa2f6651968a3c8840f1af317aa1Andreas Huber} 1663c23f12af0394aa2f6651968a3c8840f1af317aa1Andreas Huber 1664c23f12af0394aa2f6651968a3c8840f1af317aa1Andreas Huberstatus_t AwesomePlayer::prepareAsync() { 1665c23f12af0394aa2f6651968a3c8840f1af317aa1Andreas Huber Mutex::Autolock autoLock(mLock); 1666bd22c52280179b29eefac91ef7e7bbbc33d25904Andreas Huber 1667bd22c52280179b29eefac91ef7e7bbbc33d25904Andreas Huber if (mFlags & PREPARING) { 1668bd22c52280179b29eefac91ef7e7bbbc33d25904Andreas Huber return UNKNOWN_ERROR; // async prepare already pending 1669bd22c52280179b29eefac91ef7e7bbbc33d25904Andreas Huber } 1670bd22c52280179b29eefac91ef7e7bbbc33d25904Andreas Huber 1671bd22c52280179b29eefac91ef7e7bbbc33d25904Andreas Huber mIsAsyncPrepare = true; 1672c23f12af0394aa2f6651968a3c8840f1af317aa1Andreas Huber return prepareAsync_l(); 1673c23f12af0394aa2f6651968a3c8840f1af317aa1Andreas Huber} 1674c23f12af0394aa2f6651968a3c8840f1af317aa1Andreas Huber 1675c23f12af0394aa2f6651968a3c8840f1af317aa1Andreas Huberstatus_t AwesomePlayer::prepareAsync_l() { 1676bd22c52280179b29eefac91ef7e7bbbc33d25904Andreas Huber if (mFlags & PREPARING) { 1677bd22c52280179b29eefac91ef7e7bbbc33d25904Andreas Huber return UNKNOWN_ERROR; // async prepare already pending 1678c23f12af0394aa2f6651968a3c8840f1af317aa1Andreas Huber } 1679c23f12af0394aa2f6651968a3c8840f1af317aa1Andreas Huber 16802e8ffaf95bd35358ecd14ddf00cddaf3abefe0a9Andreas Huber if (!mQueueStarted) { 16812e8ffaf95bd35358ecd14ddf00cddaf3abefe0a9Andreas Huber mQueue.start(); 16822e8ffaf95bd35358ecd14ddf00cddaf3abefe0a9Andreas Huber mQueueStarted = true; 16832e8ffaf95bd35358ecd14ddf00cddaf3abefe0a9Andreas Huber } 16842e8ffaf95bd35358ecd14ddf00cddaf3abefe0a9Andreas Huber 1685bd22c52280179b29eefac91ef7e7bbbc33d25904Andreas Huber mFlags |= PREPARING; 1686c23f12af0394aa2f6651968a3c8840f1af317aa1Andreas Huber mAsyncPrepareEvent = new AwesomeEvent( 1687c23f12af0394aa2f6651968a3c8840f1af317aa1Andreas Huber this, &AwesomePlayer::onPrepareAsyncEvent); 1688c23f12af0394aa2f6651968a3c8840f1af317aa1Andreas Huber 1689c23f12af0394aa2f6651968a3c8840f1af317aa1Andreas Huber mQueue.postEvent(mAsyncPrepareEvent); 1690c23f12af0394aa2f6651968a3c8840f1af317aa1Andreas Huber 1691c23f12af0394aa2f6651968a3c8840f1af317aa1Andreas Huber return OK; 1692c23f12af0394aa2f6651968a3c8840f1af317aa1Andreas Huber} 1693c23f12af0394aa2f6651968a3c8840f1af317aa1Andreas Huber 1694bd22c52280179b29eefac91ef7e7bbbc33d25904Andreas Huberstatus_t AwesomePlayer::finishSetDataSource_l() { 1695e94bd14078d327ef2f800e69907efce641a13272Andreas Huber sp<DataSource> dataSource; 1696e94bd14078d327ef2f800e69907efce641a13272Andreas Huber 16978cb0c4168bf4b678e4a6edfcf409247016be20d5Andreas Huber if (!strncasecmp("http://", mUri.string(), 7) 16988cb0c4168bf4b678e4a6edfcf409247016be20d5Andreas Huber || !strncasecmp("https://", mUri.string(), 8)) { 16991156dc913a5ba7b2bc86489468d4914430f03d14Andreas Huber mConnectingDataSource = HTTPBase::Create( 17001156dc913a5ba7b2bc86489468d4914430f03d14Andreas Huber (mFlags & INCOGNITO) 17011156dc913a5ba7b2bc86489468d4914430f03d14Andreas Huber ? HTTPBase::kFlagIncognito 17021156dc913a5ba7b2bc86489468d4914430f03d14Andreas Huber : 0); 1703e94bd14078d327ef2f800e69907efce641a13272Andreas Huber 1704e94bd14078d327ef2f800e69907efce641a13272Andreas Huber mLock.unlock(); 170579f77ef3b0a37660ba8c5bcb2dfbfda3860f2135Andreas Huber status_t err = mConnectingDataSource->connect(mUri, &mUriHeaders); 1706e94bd14078d327ef2f800e69907efce641a13272Andreas Huber mLock.lock(); 1707e94bd14078d327ef2f800e69907efce641a13272Andreas Huber 1708e94bd14078d327ef2f800e69907efce641a13272Andreas Huber if (err != OK) { 1709e94bd14078d327ef2f800e69907efce641a13272Andreas Huber mConnectingDataSource.clear(); 1710e94bd14078d327ef2f800e69907efce641a13272Andreas Huber 1711e94bd14078d327ef2f800e69907efce641a13272Andreas Huber LOGI("mConnectingDataSource->connect() returned %d", err); 1712e94bd14078d327ef2f800e69907efce641a13272Andreas Huber return err; 1713e94bd14078d327ef2f800e69907efce641a13272Andreas Huber } 1714e94bd14078d327ef2f800e69907efce641a13272Andreas Huber 17150a5baa9b411fe086013d2a5e9126ed63fbad046cAndreas Huber#if 0 17160a5baa9b411fe086013d2a5e9126ed63fbad046cAndreas Huber mCachedSource = new NuCachedSource2( 17170a5baa9b411fe086013d2a5e9126ed63fbad046cAndreas Huber new ThrottledSource( 17180a5baa9b411fe086013d2a5e9126ed63fbad046cAndreas Huber mConnectingDataSource, 50 * 1024 /* bytes/sec */)); 17190a5baa9b411fe086013d2a5e9126ed63fbad046cAndreas Huber#else 17200a5baa9b411fe086013d2a5e9126ed63fbad046cAndreas Huber mCachedSource = new NuCachedSource2(mConnectingDataSource); 17210a5baa9b411fe086013d2a5e9126ed63fbad046cAndreas Huber#endif 1722e94bd14078d327ef2f800e69907efce641a13272Andreas Huber mConnectingDataSource.clear(); 17230a5baa9b411fe086013d2a5e9126ed63fbad046cAndreas Huber 17240a5baa9b411fe086013d2a5e9126ed63fbad046cAndreas Huber dataSource = mCachedSource; 1725ac05c317cd818701535c5d72ce90da98c4bae75bAndreas Huber 17266511c9755c3a3360ba869772600c7aae048a7ffcAndreas Huber String8 contentType = dataSource->getMIMEType(); 1727ac05c317cd818701535c5d72ce90da98c4bae75bAndreas Huber 17286511c9755c3a3360ba869772600c7aae048a7ffcAndreas Huber if (strncasecmp(contentType.string(), "audio/", 6)) { 17296511c9755c3a3360ba869772600c7aae048a7ffcAndreas Huber // We're not doing this for streams that appear to be audio-only 17306511c9755c3a3360ba869772600c7aae048a7ffcAndreas Huber // streams to ensure that even low bandwidth streams start 17316511c9755c3a3360ba869772600c7aae048a7ffcAndreas Huber // playing back fairly instantly. 1732ac05c317cd818701535c5d72ce90da98c4bae75bAndreas Huber 17336511c9755c3a3360ba869772600c7aae048a7ffcAndreas Huber // We're going to prefill the cache before trying to instantiate 17346511c9755c3a3360ba869772600c7aae048a7ffcAndreas Huber // the extractor below, as the latter is an operation that otherwise 17356511c9755c3a3360ba869772600c7aae048a7ffcAndreas Huber // could block on the datasource for a significant amount of time. 17366511c9755c3a3360ba869772600c7aae048a7ffcAndreas Huber // During that time we'd be unable to abort the preparation phase 17376511c9755c3a3360ba869772600c7aae048a7ffcAndreas Huber // without this prefill. 17386511c9755c3a3360ba869772600c7aae048a7ffcAndreas Huber 17396511c9755c3a3360ba869772600c7aae048a7ffcAndreas Huber mLock.unlock(); 17406511c9755c3a3360ba869772600c7aae048a7ffcAndreas Huber 17416511c9755c3a3360ba869772600c7aae048a7ffcAndreas Huber for (;;) { 17426511c9755c3a3360ba869772600c7aae048a7ffcAndreas Huber status_t finalStatus; 17436511c9755c3a3360ba869772600c7aae048a7ffcAndreas Huber size_t cachedDataRemaining = 17446511c9755c3a3360ba869772600c7aae048a7ffcAndreas Huber mCachedSource->approxDataRemaining(&finalStatus); 1745ac05c317cd818701535c5d72ce90da98c4bae75bAndreas Huber 17466511c9755c3a3360ba869772600c7aae048a7ffcAndreas Huber if (finalStatus != OK || cachedDataRemaining >= kHighWaterMarkBytes 17476511c9755c3a3360ba869772600c7aae048a7ffcAndreas Huber || (mFlags & PREPARE_CANCELLED)) { 17486511c9755c3a3360ba869772600c7aae048a7ffcAndreas Huber break; 17496511c9755c3a3360ba869772600c7aae048a7ffcAndreas Huber } 17506511c9755c3a3360ba869772600c7aae048a7ffcAndreas Huber 17516511c9755c3a3360ba869772600c7aae048a7ffcAndreas Huber usleep(200000); 1752ac05c317cd818701535c5d72ce90da98c4bae75bAndreas Huber } 1753ac05c317cd818701535c5d72ce90da98c4bae75bAndreas Huber 17546511c9755c3a3360ba869772600c7aae048a7ffcAndreas Huber mLock.lock(); 1755ac05c317cd818701535c5d72ce90da98c4bae75bAndreas Huber } 1756ac05c317cd818701535c5d72ce90da98c4bae75bAndreas Huber 1757ac05c317cd818701535c5d72ce90da98c4bae75bAndreas Huber if (mFlags & PREPARE_CANCELLED) { 1758ac05c317cd818701535c5d72ce90da98c4bae75bAndreas Huber LOGI("Prepare cancelled while waiting for initial cache fill."); 1759ac05c317cd818701535c5d72ce90da98c4bae75bAndreas Huber return UNKNOWN_ERROR; 1760ac05c317cd818701535c5d72ce90da98c4bae75bAndreas Huber } 1761cf7b9c7aae758ac0b99833915053c63c2ac46e09Andreas Huber } else if (!strncasecmp("rtsp://", mUri.string(), 7)) { 1762cf7b9c7aae758ac0b99833915053c63c2ac46e09Andreas Huber if (mLooper == NULL) { 1763cf7b9c7aae758ac0b99833915053c63c2ac46e09Andreas Huber mLooper = new ALooper; 1764a814c1fdc2acf0ed2ee3b175110f6039be7c4873Andreas Huber mLooper->setName("rtsp"); 1765cf7b9c7aae758ac0b99833915053c63c2ac46e09Andreas Huber mLooper->start(); 1766cf7b9c7aae758ac0b99833915053c63c2ac46e09Andreas Huber } 1767cf7b9c7aae758ac0b99833915053c63c2ac46e09Andreas Huber mRTSPController = new ARTSPController(mLooper); 1768f1958f9442bc937e1f8c8d9175901500b944b021Andreas Huber mConnectingRTSPController = mRTSPController; 1769f1958f9442bc937e1f8c8d9175901500b944b021Andreas Huber 1770f1958f9442bc937e1f8c8d9175901500b944b021Andreas Huber mLock.unlock(); 1771cf7b9c7aae758ac0b99833915053c63c2ac46e09Andreas Huber status_t err = mRTSPController->connect(mUri.string()); 1772f1958f9442bc937e1f8c8d9175901500b944b021Andreas Huber mLock.lock(); 1773f1958f9442bc937e1f8c8d9175901500b944b021Andreas Huber 1774f1958f9442bc937e1f8c8d9175901500b944b021Andreas Huber mConnectingRTSPController.clear(); 1775cf7b9c7aae758ac0b99833915053c63c2ac46e09Andreas Huber 1776cf7b9c7aae758ac0b99833915053c63c2ac46e09Andreas Huber LOGI("ARTSPController::connect returned %d", err); 1777cf7b9c7aae758ac0b99833915053c63c2ac46e09Andreas Huber 1778cf7b9c7aae758ac0b99833915053c63c2ac46e09Andreas Huber if (err != OK) { 1779cf7b9c7aae758ac0b99833915053c63c2ac46e09Andreas Huber mRTSPController.clear(); 1780cf7b9c7aae758ac0b99833915053c63c2ac46e09Andreas Huber return err; 1781cf7b9c7aae758ac0b99833915053c63c2ac46e09Andreas Huber } 1782e71d10e7ad55ccbcb0756c007caef1c959090384Andreas Huber 1783cf7b9c7aae758ac0b99833915053c63c2ac46e09Andreas Huber sp<MediaExtractor> extractor = mRTSPController.get(); 1784e71d10e7ad55ccbcb0756c007caef1c959090384Andreas Huber return setDataSource_l(extractor); 1785e94bd14078d327ef2f800e69907efce641a13272Andreas Huber } else { 1786e94bd14078d327ef2f800e69907efce641a13272Andreas Huber dataSource = DataSource::CreateFromURI(mUri.string(), &mUriHeaders); 1787e94bd14078d327ef2f800e69907efce641a13272Andreas Huber } 1788bd22c52280179b29eefac91ef7e7bbbc33d25904Andreas Huber 1789bd22c52280179b29eefac91ef7e7bbbc33d25904Andreas Huber if (dataSource == NULL) { 1790bd22c52280179b29eefac91ef7e7bbbc33d25904Andreas Huber return UNKNOWN_ERROR; 1791bd22c52280179b29eefac91ef7e7bbbc33d25904Andreas Huber } 1792bd22c52280179b29eefac91ef7e7bbbc33d25904Andreas Huber 1793bd22c52280179b29eefac91ef7e7bbbc33d25904Andreas Huber sp<MediaExtractor> extractor = MediaExtractor::Create(dataSource); 1794bd22c52280179b29eefac91ef7e7bbbc33d25904Andreas Huber 1795bd22c52280179b29eefac91ef7e7bbbc33d25904Andreas Huber if (extractor == NULL) { 1796bd22c52280179b29eefac91ef7e7bbbc33d25904Andreas Huber return UNKNOWN_ERROR; 1797bd22c52280179b29eefac91ef7e7bbbc33d25904Andreas Huber } 1798bd22c52280179b29eefac91ef7e7bbbc33d25904Andreas Huber 1799b5ce361d19e69fe156f7188c9ee0f4734b259874Gloria Wang dataSource->getDrmInfo(mDecryptHandle, &mDrmManagerClient); 1800b5ce361d19e69fe156f7188c9ee0f4734b259874Gloria Wang 1801b371426ce4cf2fa6d8c3d1903b61322feb165d35Gloria Wang if (mDecryptHandle != NULL) { 18028f64134f749e4f7861a08a3063450fc714c4651dGloria Wang CHECK(mDrmManagerClient); 18033318523222e31fb4a7fcc345ddb4ec845d30ef96James Dong if (RightsStatus::RIGHTS_VALID != mDecryptHandle->status) { 18047340743ce30766af6334bbd9acf813eb66dd5a60Gloria Wang notifyListener_l(MEDIA_ERROR, MEDIA_ERROR_UNKNOWN, ERROR_DRM_NO_LICENSE); 1805b371426ce4cf2fa6d8c3d1903b61322feb165d35Gloria Wang } 1806dcd25efb46c41c8d24a0a9cf61fb57f84149709eGloria Wang } 1807dcd25efb46c41c8d24a0a9cf61fb57f84149709eGloria Wang 1808bd22c52280179b29eefac91ef7e7bbbc33d25904Andreas Huber return setDataSource_l(extractor); 1809bd22c52280179b29eefac91ef7e7bbbc33d25904Andreas Huber} 1810bd22c52280179b29eefac91ef7e7bbbc33d25904Andreas Huber 181188d8a83de12592635248aa1a3bd6b9ea46108501Andreas Hubervoid AwesomePlayer::abortPrepare(status_t err) { 181288d8a83de12592635248aa1a3bd6b9ea46108501Andreas Huber CHECK(err != OK); 181388d8a83de12592635248aa1a3bd6b9ea46108501Andreas Huber 181488d8a83de12592635248aa1a3bd6b9ea46108501Andreas Huber if (mIsAsyncPrepare) { 181588d8a83de12592635248aa1a3bd6b9ea46108501Andreas Huber notifyListener_l(MEDIA_ERROR, MEDIA_ERROR_UNKNOWN, err); 181688d8a83de12592635248aa1a3bd6b9ea46108501Andreas Huber } 181788d8a83de12592635248aa1a3bd6b9ea46108501Andreas Huber 181888d8a83de12592635248aa1a3bd6b9ea46108501Andreas Huber mPrepareResult = err; 18196a05c9e912aeb8bfe1ef99516def91a177a481b6Andreas Huber mFlags &= ~(PREPARING|PREPARE_CANCELLED|PREPARING_CONNECTED); 182088d8a83de12592635248aa1a3bd6b9ea46108501Andreas Huber mAsyncPrepareEvent = NULL; 182188d8a83de12592635248aa1a3bd6b9ea46108501Andreas Huber mPreparedCondition.broadcast(); 182288d8a83de12592635248aa1a3bd6b9ea46108501Andreas Huber} 182388d8a83de12592635248aa1a3bd6b9ea46108501Andreas Huber 1824e966fb05c7e67a7f5dce65024de60aac83eb6f81Andreas Huber// static 1825e966fb05c7e67a7f5dce65024de60aac83eb6f81Andreas Huberbool AwesomePlayer::ContinuePreparation(void *cookie) { 1826e966fb05c7e67a7f5dce65024de60aac83eb6f81Andreas Huber AwesomePlayer *me = static_cast<AwesomePlayer *>(cookie); 1827e966fb05c7e67a7f5dce65024de60aac83eb6f81Andreas Huber 1828e966fb05c7e67a7f5dce65024de60aac83eb6f81Andreas Huber return (me->mFlags & PREPARE_CANCELLED) == 0; 1829e966fb05c7e67a7f5dce65024de60aac83eb6f81Andreas Huber} 1830e966fb05c7e67a7f5dce65024de60aac83eb6f81Andreas Huber 1831c23f12af0394aa2f6651968a3c8840f1af317aa1Andreas Hubervoid AwesomePlayer::onPrepareAsyncEvent() { 18328650e1960905097f6f1d6aa462ccb1c93c656834Andreas Huber Mutex::Autolock autoLock(mLock); 1833bd22c52280179b29eefac91ef7e7bbbc33d25904Andreas Huber 18348650e1960905097f6f1d6aa462ccb1c93c656834Andreas Huber if (mFlags & PREPARE_CANCELLED) { 18358650e1960905097f6f1d6aa462ccb1c93c656834Andreas Huber LOGI("prepare was cancelled before doing anything"); 18368650e1960905097f6f1d6aa462ccb1c93c656834Andreas Huber abortPrepare(UNKNOWN_ERROR); 18378650e1960905097f6f1d6aa462ccb1c93c656834Andreas Huber return; 18388650e1960905097f6f1d6aa462ccb1c93c656834Andreas Huber } 1839e94bd14078d327ef2f800e69907efce641a13272Andreas Huber 18408650e1960905097f6f1d6aa462ccb1c93c656834Andreas Huber if (mUri.size() > 0) { 18418650e1960905097f6f1d6aa462ccb1c93c656834Andreas Huber status_t err = finishSetDataSource_l(); 1842bd22c52280179b29eefac91ef7e7bbbc33d25904Andreas Huber 18438650e1960905097f6f1d6aa462ccb1c93c656834Andreas Huber if (err != OK) { 18448650e1960905097f6f1d6aa462ccb1c93c656834Andreas Huber abortPrepare(err); 18458650e1960905097f6f1d6aa462ccb1c93c656834Andreas Huber return; 1846bd22c52280179b29eefac91ef7e7bbbc33d25904Andreas Huber } 18478650e1960905097f6f1d6aa462ccb1c93c656834Andreas Huber } 1848bd22c52280179b29eefac91ef7e7bbbc33d25904Andreas Huber 18498650e1960905097f6f1d6aa462ccb1c93c656834Andreas Huber if (mVideoTrack != NULL && mVideoSource == NULL) { 18508650e1960905097f6f1d6aa462ccb1c93c656834Andreas Huber status_t err = initVideoDecoder(); 18511322e7ebc33e8e161fb73cd47e43dd93357608e4Andreas Huber 18528650e1960905097f6f1d6aa462ccb1c93c656834Andreas Huber if (err != OK) { 18538650e1960905097f6f1d6aa462ccb1c93c656834Andreas Huber abortPrepare(err); 18548650e1960905097f6f1d6aa462ccb1c93c656834Andreas Huber return; 18551322e7ebc33e8e161fb73cd47e43dd93357608e4Andreas Huber } 18568650e1960905097f6f1d6aa462ccb1c93c656834Andreas Huber } 18571322e7ebc33e8e161fb73cd47e43dd93357608e4Andreas Huber 18588650e1960905097f6f1d6aa462ccb1c93c656834Andreas Huber if (mAudioTrack != NULL && mAudioSource == NULL) { 18598650e1960905097f6f1d6aa462ccb1c93c656834Andreas Huber status_t err = initAudioDecoder(); 18601322e7ebc33e8e161fb73cd47e43dd93357608e4Andreas Huber 18618650e1960905097f6f1d6aa462ccb1c93c656834Andreas Huber if (err != OK) { 18628650e1960905097f6f1d6aa462ccb1c93c656834Andreas Huber abortPrepare(err); 18638650e1960905097f6f1d6aa462ccb1c93c656834Andreas Huber return; 18641322e7ebc33e8e161fb73cd47e43dd93357608e4Andreas Huber } 1865c23f12af0394aa2f6651968a3c8840f1af317aa1Andreas Huber } 1866c23f12af0394aa2f6651968a3c8840f1af317aa1Andreas Huber 18676a05c9e912aeb8bfe1ef99516def91a177a481b6Andreas Huber mFlags |= PREPARING_CONNECTED; 18686a05c9e912aeb8bfe1ef99516def91a177a481b6Andreas Huber 18698650e1960905097f6f1d6aa462ccb1c93c656834Andreas Huber if (mCachedSource != NULL || mRTSPController != NULL) { 18708650e1960905097f6f1d6aa462ccb1c93c656834Andreas Huber postBufferingEvent_l(); 18718650e1960905097f6f1d6aa462ccb1c93c656834Andreas Huber } else { 18728650e1960905097f6f1d6aa462ccb1c93c656834Andreas Huber finishAsyncPrepare_l(); 18738650e1960905097f6f1d6aa462ccb1c93c656834Andreas Huber } 18748650e1960905097f6f1d6aa462ccb1c93c656834Andreas Huber} 1875c23f12af0394aa2f6651968a3c8840f1af317aa1Andreas Huber 18768650e1960905097f6f1d6aa462ccb1c93c656834Andreas Hubervoid AwesomePlayer::finishAsyncPrepare_l() { 1877bd22c52280179b29eefac91ef7e7bbbc33d25904Andreas Huber if (mIsAsyncPrepare) { 18785daeb129a2c2ba3d14ccd94af283b5f561c783eaAndreas Huber if (mVideoSource == NULL) { 1879bd22c52280179b29eefac91ef7e7bbbc33d25904Andreas Huber notifyListener_l(MEDIA_SET_VIDEO_SIZE, 0, 0); 1880bd22c52280179b29eefac91ef7e7bbbc33d25904Andreas Huber } else { 18815daeb129a2c2ba3d14ccd94af283b5f561c783eaAndreas Huber notifyVideoSize_l(); 1882bd22c52280179b29eefac91ef7e7bbbc33d25904Andreas Huber } 1883c23f12af0394aa2f6651968a3c8840f1af317aa1Andreas Huber 1884bd22c52280179b29eefac91ef7e7bbbc33d25904Andreas Huber notifyListener_l(MEDIA_PREPARED); 1885bd22c52280179b29eefac91ef7e7bbbc33d25904Andreas Huber } 1886c23f12af0394aa2f6651968a3c8840f1af317aa1Andreas Huber 1887bd22c52280179b29eefac91ef7e7bbbc33d25904Andreas Huber mPrepareResult = OK; 18886a05c9e912aeb8bfe1ef99516def91a177a481b6Andreas Huber mFlags &= ~(PREPARING|PREPARE_CANCELLED|PREPARING_CONNECTED); 1889bd22c52280179b29eefac91ef7e7bbbc33d25904Andreas Huber mFlags |= PREPARED; 1890c23f12af0394aa2f6651968a3c8840f1af317aa1Andreas Huber mAsyncPrepareEvent = NULL; 1891bd22c52280179b29eefac91ef7e7bbbc33d25904Andreas Huber mPreparedCondition.broadcast(); 1892c23f12af0394aa2f6651968a3c8840f1af317aa1Andreas Huber} 1893c23f12af0394aa2f6651968a3c8840f1af317aa1Andreas Huber 1894acdd9d0f59c3d8bdc3de80664a609527ec3d21e2Andreas Huberuint32_t AwesomePlayer::flags() const { 1895acdd9d0f59c3d8bdc3de80664a609527ec3d21e2Andreas Huber return mExtractorFlags; 1896acdd9d0f59c3d8bdc3de80664a609527ec3d21e2Andreas Huber} 1897acdd9d0f59c3d8bdc3de80664a609527ec3d21e2Andreas Huber 189884b343f29063fbfa2ee61b2e3d37ba059ca507d4Andreas Hubervoid AwesomePlayer::postAudioEOS(int64_t delayUs) { 1899bd7b7177f88ae6e83bd7bb8bfd9b7018be923931Andreas Huber Mutex::Autolock autoLock(mLock); 190084b343f29063fbfa2ee61b2e3d37ba059ca507d4Andreas Huber postCheckAudioStatusEvent_l(delayUs); 1901ed54ad0f8619ae416b0968ade6248894cbfc4dbaAndreas Huber} 1902ed54ad0f8619ae416b0968ade6248894cbfc4dbaAndreas Huber 1903ed54ad0f8619ae416b0968ade6248894cbfc4dbaAndreas Hubervoid AwesomePlayer::postAudioSeekComplete() { 1904bd7b7177f88ae6e83bd7bb8bfd9b7018be923931Andreas Huber Mutex::Autolock autoLock(mLock); 190584b343f29063fbfa2ee61b2e3d37ba059ca507d4Andreas Huber postCheckAudioStatusEvent_l(0 /* delayUs */); 1906ed54ad0f8619ae416b0968ade6248894cbfc4dbaAndreas Huber} 1907ed54ad0f8619ae416b0968ade6248894cbfc4dbaAndreas Huber 1908bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber} // namespace android 1909