AwesomePlayer.cpp revision eec46abb88dcc50621fd2d3f17a6b8d24fd07a19
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 25bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber#include "include/AwesomePlayer.h" 26681755fc0d0797506456f46a2a10555916d6be32Andreas Huber#include "include/DRMExtractor.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" 31681755fc0d0797506456f46a2a10555916d6be32Andreas Huber#include "include/WVMExtractor.h" 32bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber 334844ac54e8b5997c3b03872dbafe8ebed4787517Andreas Huber#include <binder/IPCThreadState.h> 347cf180c9bff69e5cc4a2f4e53b432db45ebbebabGloria Wang#include <binder/IServiceManager.h> 357cf180c9bff69e5cc4a2f4e53b432db45ebbebabGloria Wang#include <media/IMediaPlayerService.h> 36e2b1028852120bcfded33b8f06f66b780437fe92Andreas Huber#include <media/stagefright/foundation/hexdump.h> 37e2b1028852120bcfded33b8f06f66b780437fe92Andreas Huber#include <media/stagefright/foundation/ADebug.h> 383254b25e8b0f674ccc2226609e01dd86a600802eInsun Kang#include <media/stagefright/timedtext/TimedTextDriver.h> 39bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber#include <media/stagefright/AudioPlayer.h> 40bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber#include <media/stagefright/DataSource.h> 41bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber#include <media/stagefright/FileSource.h> 42bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber#include <media/stagefright/MediaBuffer.h> 43717826ececd8d39596f62418677721d70776add1Andreas Huber#include <media/stagefright/MediaDefs.h> 44bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber#include <media/stagefright/MediaExtractor.h> 45bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber#include <media/stagefright/MediaSource.h> 46bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber#include <media/stagefright/MetaData.h> 47bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber#include <media/stagefright/OMXCodec.h> 48717826ececd8d39596f62418677721d70776add1Andreas Huber 491173118eace0e9e347cb007f0da817cee87579edGlenn Kasten#include <gui/ISurfaceTexture.h> 501173118eace0e9e347cb007f0da817cee87579edGlenn Kasten#include <gui/SurfaceTextureClient.h> 513cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian 5214acc736e336cbd6026df781d4f411e908831815Andreas Huber#include <media/stagefright/foundation/AMessage.h> 53e71d10e7ad55ccbcb0756c007caef1c959090384Andreas Huber 54eabd34665adc284525fe7337ad5c56a8b92964efGlenn Kasten#include <cutils/properties.h> 55eabd34665adc284525fe7337ad5c56a8b92964efGlenn Kasten 56e332a9181cf6a3155ed1a0fd2afc212ccb1f2753Andreas Huber#define USE_SURFACE_ALLOC 1 5714f95746466fb6abdbbf33ee26d92ebf3fbef98fJames Dong#define FRAME_DROP_FREQ 0 58e332a9181cf6a3155ed1a0fd2afc212ccb1f2753Andreas Huber 59bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Hubernamespace android { 60bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber 618650e1960905097f6f1d6aa462ccb1c93c656834Andreas Huberstatic int64_t kLowWaterMarkUs = 2000000ll; // 2secs 6283ed9d41b5aea53a5f3f0ae2fa14e101c079a12aGloria Wangstatic int64_t kHighWaterMarkUs = 5000000ll; // 5secs 63ac05c317cd818701535c5d72ce90da98c4bae75bAndreas Huberstatic const size_t kLowWaterMarkBytes = 40000; 64ac05c317cd818701535c5d72ce90da98c4bae75bAndreas Huberstatic const size_t kHighWaterMarkBytes = 200000; 658650e1960905097f6f1d6aa462ccb1c93c656834Andreas Huber 66bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huberstruct AwesomeEvent : public TimedEventQueue::Event { 67c23f12af0394aa2f6651968a3c8840f1af317aa1Andreas Huber AwesomeEvent( 68c23f12af0394aa2f6651968a3c8840f1af317aa1Andreas Huber AwesomePlayer *player, 69c23f12af0394aa2f6651968a3c8840f1af317aa1Andreas Huber void (AwesomePlayer::*method)()) 70bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber : mPlayer(player), 71c23f12af0394aa2f6651968a3c8840f1af317aa1Andreas Huber mMethod(method) { 72bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber } 73bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber 74bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huberprotected: 75bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber virtual ~AwesomeEvent() {} 76bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber 77bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber virtual void fire(TimedEventQueue *queue, int64_t /* now_us */) { 78c23f12af0394aa2f6651968a3c8840f1af317aa1Andreas Huber (mPlayer->*mMethod)(); 79bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber } 80bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber 81bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huberprivate: 82bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber AwesomePlayer *mPlayer; 83c23f12af0394aa2f6651968a3c8840f1af317aa1Andreas Huber void (AwesomePlayer::*mMethod)(); 84bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber 85bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber AwesomeEvent(const AwesomeEvent &); 86bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber AwesomeEvent &operator=(const AwesomeEvent &); 87bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber}; 88bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber 89733b7729ea462fae9c6899456444e28fef1c757cAndreas Huberstruct AwesomeLocalRenderer : public AwesomeRenderer { 90733b7729ea462fae9c6899456444e28fef1c757cAndreas Huber AwesomeLocalRenderer( 911173118eace0e9e347cb007f0da817cee87579edGlenn Kasten const sp<ANativeWindow> &nativeWindow, const sp<MetaData> &meta) 921173118eace0e9e347cb007f0da817cee87579edGlenn Kasten : mTarget(new SoftwareRenderer(nativeWindow, meta)) { 93733b7729ea462fae9c6899456444e28fef1c757cAndreas Huber } 94733b7729ea462fae9c6899456444e28fef1c757cAndreas Huber 95733b7729ea462fae9c6899456444e28fef1c757cAndreas Huber virtual void render(MediaBuffer *buffer) { 96fa090f541bb84a546af2ec834e91a032ff10e66eAndreas Huber render((const uint8_t *)buffer->data() + buffer->range_offset(), 97fa090f541bb84a546af2ec834e91a032ff10e66eAndreas Huber buffer->range_length()); 98fa090f541bb84a546af2ec834e91a032ff10e66eAndreas Huber } 99fa090f541bb84a546af2ec834e91a032ff10e66eAndreas Huber 100fa090f541bb84a546af2ec834e91a032ff10e66eAndreas Huber void render(const void *data, size_t size) { 101fa090f541bb84a546af2ec834e91a032ff10e66eAndreas Huber mTarget->render(data, size, NULL); 102733b7729ea462fae9c6899456444e28fef1c757cAndreas Huber } 103733b7729ea462fae9c6899456444e28fef1c757cAndreas Huber 104733b7729ea462fae9c6899456444e28fef1c757cAndreas Huberprotected: 105733b7729ea462fae9c6899456444e28fef1c757cAndreas Huber virtual ~AwesomeLocalRenderer() { 106733b7729ea462fae9c6899456444e28fef1c757cAndreas Huber delete mTarget; 107733b7729ea462fae9c6899456444e28fef1c757cAndreas Huber mTarget = NULL; 108733b7729ea462fae9c6899456444e28fef1c757cAndreas Huber } 109733b7729ea462fae9c6899456444e28fef1c757cAndreas Huber 110733b7729ea462fae9c6899456444e28fef1c757cAndreas Huberprivate: 1110a5ca668c6f7d45706e9aec4a1dfec0aacc6d233Andreas Huber SoftwareRenderer *mTarget; 112988e3f0b2c74095deae580157c57935a98573052Andreas Huber 113733b7729ea462fae9c6899456444e28fef1c757cAndreas Huber AwesomeLocalRenderer(const AwesomeLocalRenderer &); 114733b7729ea462fae9c6899456444e28fef1c757cAndreas Huber AwesomeLocalRenderer &operator=(const AwesomeLocalRenderer &);; 115733b7729ea462fae9c6899456444e28fef1c757cAndreas Huber}; 116733b7729ea462fae9c6899456444e28fef1c757cAndreas Huber 1176a9da9fc558263548ebfbae2cbf177eb7454a41bJamie Gennisstruct AwesomeNativeWindowRenderer : public AwesomeRenderer { 118ba529e486dde15fe75ea1b48570f9d60a4cf3c48Andreas Huber AwesomeNativeWindowRenderer( 119ba529e486dde15fe75ea1b48570f9d60a4cf3c48Andreas Huber const sp<ANativeWindow> &nativeWindow, 120ba529e486dde15fe75ea1b48570f9d60a4cf3c48Andreas Huber int32_t rotationDegrees) 1216a9da9fc558263548ebfbae2cbf177eb7454a41bJamie Gennis : mNativeWindow(nativeWindow) { 122ba529e486dde15fe75ea1b48570f9d60a4cf3c48Andreas Huber applyRotation(rotationDegrees); 1236a9da9fc558263548ebfbae2cbf177eb7454a41bJamie Gennis } 1246a9da9fc558263548ebfbae2cbf177eb7454a41bJamie Gennis 1256a9da9fc558263548ebfbae2cbf177eb7454a41bJamie Gennis virtual void render(MediaBuffer *buffer) { 126593e2773f616a926af45e74359e21a898c89875fGlenn Kasten int64_t timeUs; 127593e2773f616a926af45e74359e21a898c89875fGlenn Kasten CHECK(buffer->meta_data()->findInt64(kKeyTime, &timeUs)); 128593e2773f616a926af45e74359e21a898c89875fGlenn Kasten native_window_set_buffers_timestamp(mNativeWindow.get(), timeUs * 1000); 1296a9da9fc558263548ebfbae2cbf177eb7454a41bJamie Gennis status_t err = mNativeWindow->queueBuffer( 1306a9da9fc558263548ebfbae2cbf177eb7454a41bJamie Gennis mNativeWindow.get(), buffer->graphicBuffer().get()); 1316a9da9fc558263548ebfbae2cbf177eb7454a41bJamie Gennis if (err != 0) { 13229357bc2c0dd7c43ad3bd0c8e3efa4e6fd9bfd47Steve Block ALOGE("queueBuffer failed with error %s (%d)", strerror(-err), 1336a9da9fc558263548ebfbae2cbf177eb7454a41bJamie Gennis -err); 1346a9da9fc558263548ebfbae2cbf177eb7454a41bJamie Gennis return; 1356a9da9fc558263548ebfbae2cbf177eb7454a41bJamie Gennis } 1366a9da9fc558263548ebfbae2cbf177eb7454a41bJamie Gennis 1376a9da9fc558263548ebfbae2cbf177eb7454a41bJamie Gennis sp<MetaData> metaData = buffer->meta_data(); 1386a9da9fc558263548ebfbae2cbf177eb7454a41bJamie Gennis metaData->setInt32(kKeyRendered, 1); 1396a9da9fc558263548ebfbae2cbf177eb7454a41bJamie Gennis } 1406a9da9fc558263548ebfbae2cbf177eb7454a41bJamie Gennis 1416a9da9fc558263548ebfbae2cbf177eb7454a41bJamie Gennisprotected: 1426a9da9fc558263548ebfbae2cbf177eb7454a41bJamie Gennis virtual ~AwesomeNativeWindowRenderer() {} 1436a9da9fc558263548ebfbae2cbf177eb7454a41bJamie Gennis 1446a9da9fc558263548ebfbae2cbf177eb7454a41bJamie Gennisprivate: 1456a9da9fc558263548ebfbae2cbf177eb7454a41bJamie Gennis sp<ANativeWindow> mNativeWindow; 1466a9da9fc558263548ebfbae2cbf177eb7454a41bJamie Gennis 147ba529e486dde15fe75ea1b48570f9d60a4cf3c48Andreas Huber void applyRotation(int32_t rotationDegrees) { 148ba529e486dde15fe75ea1b48570f9d60a4cf3c48Andreas Huber uint32_t transform; 149ba529e486dde15fe75ea1b48570f9d60a4cf3c48Andreas Huber switch (rotationDegrees) { 150ba529e486dde15fe75ea1b48570f9d60a4cf3c48Andreas Huber case 0: transform = 0; break; 151ba529e486dde15fe75ea1b48570f9d60a4cf3c48Andreas Huber case 90: transform = HAL_TRANSFORM_ROT_90; break; 152ba529e486dde15fe75ea1b48570f9d60a4cf3c48Andreas Huber case 180: transform = HAL_TRANSFORM_ROT_180; break; 153ba529e486dde15fe75ea1b48570f9d60a4cf3c48Andreas Huber case 270: transform = HAL_TRANSFORM_ROT_270; break; 154ba529e486dde15fe75ea1b48570f9d60a4cf3c48Andreas Huber default: transform = 0; break; 155ba529e486dde15fe75ea1b48570f9d60a4cf3c48Andreas Huber } 156ba529e486dde15fe75ea1b48570f9d60a4cf3c48Andreas Huber 157ba529e486dde15fe75ea1b48570f9d60a4cf3c48Andreas Huber if (transform) { 158ba529e486dde15fe75ea1b48570f9d60a4cf3c48Andreas Huber CHECK_EQ(0, native_window_set_buffers_transform( 159ba529e486dde15fe75ea1b48570f9d60a4cf3c48Andreas Huber mNativeWindow.get(), transform)); 160ba529e486dde15fe75ea1b48570f9d60a4cf3c48Andreas Huber } 161ba529e486dde15fe75ea1b48570f9d60a4cf3c48Andreas Huber } 162ba529e486dde15fe75ea1b48570f9d60a4cf3c48Andreas Huber 1636a9da9fc558263548ebfbae2cbf177eb7454a41bJamie Gennis AwesomeNativeWindowRenderer(const AwesomeNativeWindowRenderer &); 1646a9da9fc558263548ebfbae2cbf177eb7454a41bJamie Gennis AwesomeNativeWindowRenderer &operator=( 1656a9da9fc558263548ebfbae2cbf177eb7454a41bJamie Gennis const AwesomeNativeWindowRenderer &); 1666a9da9fc558263548ebfbae2cbf177eb7454a41bJamie Gennis}; 1676a9da9fc558263548ebfbae2cbf177eb7454a41bJamie Gennis 1687cf180c9bff69e5cc4a2f4e53b432db45ebbebabGloria Wang// To collect the decoder usage 1697cf180c9bff69e5cc4a2f4e53b432db45ebbebabGloria Wangvoid addBatteryData(uint32_t params) { 1707cf180c9bff69e5cc4a2f4e53b432db45ebbebabGloria Wang sp<IBinder> binder = 1717cf180c9bff69e5cc4a2f4e53b432db45ebbebabGloria Wang defaultServiceManager()->getService(String16("media.player")); 1727cf180c9bff69e5cc4a2f4e53b432db45ebbebabGloria Wang sp<IMediaPlayerService> service = interface_cast<IMediaPlayerService>(binder); 1737cf180c9bff69e5cc4a2f4e53b432db45ebbebabGloria Wang CHECK(service.get() != NULL); 1747cf180c9bff69e5cc4a2f4e53b432db45ebbebabGloria Wang 1757cf180c9bff69e5cc4a2f4e53b432db45ebbebabGloria Wang service->addBatteryData(params); 1767cf180c9bff69e5cc4a2f4e53b432db45ebbebabGloria Wang} 177e2b1028852120bcfded33b8f06f66b780437fe92Andreas Huber 1787cf180c9bff69e5cc4a2f4e53b432db45ebbebabGloria Wang//////////////////////////////////////////////////////////////////////////////// 179bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas HuberAwesomePlayer::AwesomePlayer() 1802e8ffaf95bd35358ecd14ddf00cddaf3abefe0a9Andreas Huber : mQueueStarted(false), 1819b80c2bdb205bc143104f54d0743b6eedd67b14eAndreas Huber mUIDValid(false), 1822e8ffaf95bd35358ecd14ddf00cddaf3abefe0a9Andreas Huber mTimeSource(NULL), 183fa090f541bb84a546af2ec834e91a032ff10e66eAndreas Huber mVideoRendererIsPreview(false), 184bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber mAudioPlayer(NULL), 185b45c01c2b8588ff431b511151666a55a39f0a6aeJames Dong mDisplayWidth(0), 186b45c01c2b8588ff431b511151666a55a39f0a6aeJames Dong mDisplayHeight(0), 187bd22c52280179b29eefac91ef7e7bbbc33d25904Andreas Huber mFlags(0), 188acdd9d0f59c3d8bdc3de80664a609527ec3d21e2Andreas Huber mExtractorFlags(0), 1897b3396acc702451be9bafb19d7fe26d55d43a316Andreas Huber mVideoBuffer(NULL), 190150694cda0842d38a9358fe8d1fcb4fb4a76599eAndreas Huber mDecryptHandle(NULL), 1917a1e3e81264189e23a1db2b174e1b5a5d4c7d1c3Gloria Wang mLastVideoTimeUs(-1), 1926655174826330afe66ef766258181ae8c11f3f6cInsun Kang mTextDriver(NULL) { 193e2b1028852120bcfded33b8f06f66b780437fe92Andreas Huber CHECK_EQ(mClient.connect(), (status_t)OK); 194bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber 195bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber DataSource::RegisterDefaultSniffers(); 196bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber 197c23f12af0394aa2f6651968a3c8840f1af317aa1Andreas Huber mVideoEvent = new AwesomeEvent(this, &AwesomePlayer::onVideoEvent); 198bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber mVideoEventPending = false; 199c23f12af0394aa2f6651968a3c8840f1af317aa1Andreas Huber mStreamDoneEvent = new AwesomeEvent(this, &AwesomePlayer::onStreamDone); 200bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber mStreamDoneEventPending = false; 201c23f12af0394aa2f6651968a3c8840f1af317aa1Andreas Huber mBufferingEvent = new AwesomeEvent(this, &AwesomePlayer::onBufferingUpdate); 20266b0a35c9a4136a84c3f73b1b25fcb5220138b95Andreas Huber mBufferingEventPending = false; 203145e68fc778275963189b02a1adcbe27cce4d769Andreas Huber mVideoLagEvent = new AwesomeEvent(this, &AwesomePlayer::onVideoLagUpdate); 204145e68fc778275963189b02a1adcbe27cce4d769Andreas Huber mVideoEventPending = false; 205c23f12af0394aa2f6651968a3c8840f1af317aa1Andreas Huber 206c23f12af0394aa2f6651968a3c8840f1af317aa1Andreas Huber mCheckAudioStatusEvent = new AwesomeEvent( 207c23f12af0394aa2f6651968a3c8840f1af317aa1Andreas Huber this, &AwesomePlayer::onCheckAudioStatus); 208c23f12af0394aa2f6651968a3c8840f1af317aa1Andreas Huber 2091862a33b246249630b654182afb5914da3480d4cAndreas Huber mAudioStatusEventPending = false; 210bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber 211bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber reset(); 212bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber} 213bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber 214bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas HuberAwesomePlayer::~AwesomePlayer() { 2152e8ffaf95bd35358ecd14ddf00cddaf3abefe0a9Andreas Huber if (mQueueStarted) { 2162e8ffaf95bd35358ecd14ddf00cddaf3abefe0a9Andreas Huber mQueue.stop(); 2172e8ffaf95bd35358ecd14ddf00cddaf3abefe0a9Andreas Huber } 218bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber 219bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber reset(); 220bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber 221bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber mClient.disconnect(); 222bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber} 223bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber 224c34233e673c9791e137456d0c427d58db184b690Andreas Hubervoid AwesomePlayer::cancelPlayerEvents(bool keepNotifications) { 225bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber mQueue.cancelEvent(mVideoEvent->eventID()); 226bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber mVideoEventPending = false; 227145e68fc778275963189b02a1adcbe27cce4d769Andreas Huber mQueue.cancelEvent(mVideoLagEvent->eventID()); 228145e68fc778275963189b02a1adcbe27cce4d769Andreas Huber mVideoLagEventPending = false; 22966b0a35c9a4136a84c3f73b1b25fcb5220138b95Andreas Huber 230c34233e673c9791e137456d0c427d58db184b690Andreas Huber if (!keepNotifications) { 231c34233e673c9791e137456d0c427d58db184b690Andreas Huber mQueue.cancelEvent(mStreamDoneEvent->eventID()); 232c34233e673c9791e137456d0c427d58db184b690Andreas Huber mStreamDoneEventPending = false; 233c34233e673c9791e137456d0c427d58db184b690Andreas Huber mQueue.cancelEvent(mCheckAudioStatusEvent->eventID()); 234c34233e673c9791e137456d0c427d58db184b690Andreas Huber mAudioStatusEventPending = false; 235c34233e673c9791e137456d0c427d58db184b690Andreas Huber 23666b0a35c9a4136a84c3f73b1b25fcb5220138b95Andreas Huber mQueue.cancelEvent(mBufferingEvent->eventID()); 23766b0a35c9a4136a84c3f73b1b25fcb5220138b95Andreas Huber mBufferingEventPending = false; 23866b0a35c9a4136a84c3f73b1b25fcb5220138b95Andreas Huber } 239bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber} 240bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber 2410726045216f576e97672ebeefc265d39c4ebaaa5Andreas Hubervoid AwesomePlayer::setListener(const wp<MediaPlayerBase> &listener) { 242bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber Mutex::Autolock autoLock(mLock); 243bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber mListener = listener; 244bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber} 245bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber 2469b80c2bdb205bc143104f54d0743b6eedd67b14eAndreas Hubervoid AwesomePlayer::setUID(uid_t uid) { 2473856b090cd04ba5dd4a59a12430ed724d5995909Steve Block ALOGV("AwesomePlayer running on behalf of uid %d", uid); 2489b80c2bdb205bc143104f54d0743b6eedd67b14eAndreas Huber 2499b80c2bdb205bc143104f54d0743b6eedd67b14eAndreas Huber mUID = uid; 2509b80c2bdb205bc143104f54d0743b6eedd67b14eAndreas Huber mUIDValid = true; 2519b80c2bdb205bc143104f54d0743b6eedd67b14eAndreas Huber} 2529b80c2bdb205bc143104f54d0743b6eedd67b14eAndreas Huber 2535561ccf4a8db88a2e44eac1b3ed13b4ff53a7f20Andreas Huberstatus_t AwesomePlayer::setDataSource( 2545561ccf4a8db88a2e44eac1b3ed13b4ff53a7f20Andreas Huber const char *uri, const KeyedVector<String8, String8> *headers) { 255bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber Mutex::Autolock autoLock(mLock); 2567b3396acc702451be9bafb19d7fe26d55d43a316Andreas Huber return setDataSource_l(uri, headers); 2577b3396acc702451be9bafb19d7fe26d55d43a316Andreas Huber} 258bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber 2597b3396acc702451be9bafb19d7fe26d55d43a316Andreas Huberstatus_t AwesomePlayer::setDataSource_l( 2607b3396acc702451be9bafb19d7fe26d55d43a316Andreas Huber const char *uri, const KeyedVector<String8, String8> *headers) { 261bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber reset_l(); 262bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber 263bd22c52280179b29eefac91ef7e7bbbc33d25904Andreas Huber mUri = uri; 26466b0a35c9a4136a84c3f73b1b25fcb5220138b95Andreas Huber 265bd22c52280179b29eefac91ef7e7bbbc33d25904Andreas Huber if (headers) { 266bd22c52280179b29eefac91ef7e7bbbc33d25904Andreas Huber mUriHeaders = *headers; 2677314fa17093d514199fedcb55ac41136a1b31cb3Andreas Huber 2687314fa17093d514199fedcb55ac41136a1b31cb3Andreas Huber ssize_t index = mUriHeaders.indexOfKey(String8("x-hide-urls-from-log")); 2697314fa17093d514199fedcb55ac41136a1b31cb3Andreas Huber if (index >= 0) { 2707314fa17093d514199fedcb55ac41136a1b31cb3Andreas Huber // Browser is in "incognito" mode, suppress logging URLs. 2717314fa17093d514199fedcb55ac41136a1b31cb3Andreas Huber 2727314fa17093d514199fedcb55ac41136a1b31cb3Andreas Huber // This isn't something that should be passed to the server. 2737314fa17093d514199fedcb55ac41136a1b31cb3Andreas Huber mUriHeaders.removeItemsAt(index); 2747314fa17093d514199fedcb55ac41136a1b31cb3Andreas Huber 275a0b1d4b161599c2bb2a47119e50c51e75bbe980eAndreas Huber modifyFlags(INCOGNITO, SET); 2767314fa17093d514199fedcb55ac41136a1b31cb3Andreas Huber } 2777314fa17093d514199fedcb55ac41136a1b31cb3Andreas Huber } 2787314fa17093d514199fedcb55ac41136a1b31cb3Andreas Huber 2797314fa17093d514199fedcb55ac41136a1b31cb3Andreas Huber if (!(mFlags & INCOGNITO)) { 280df64d15042bbd5e0e4933ac49bf3c177dd94752cSteve Block ALOGI("setDataSource_l('%s')", mUri.string()); 2817314fa17093d514199fedcb55ac41136a1b31cb3Andreas Huber } else { 282df64d15042bbd5e0e4933ac49bf3c177dd94752cSteve Block ALOGI("setDataSource_l(URL suppressed)"); 28366b0a35c9a4136a84c3f73b1b25fcb5220138b95Andreas Huber } 28466b0a35c9a4136a84c3f73b1b25fcb5220138b95Andreas Huber 285bd22c52280179b29eefac91ef7e7bbbc33d25904Andreas Huber // The actual work will be done during preparation in the call to 286bd22c52280179b29eefac91ef7e7bbbc33d25904Andreas Huber // ::finishSetDataSource_l to avoid blocking the calling thread in 287bd22c52280179b29eefac91ef7e7bbbc33d25904Andreas Huber // setDataSource for any significant time. 28866b0a35c9a4136a84c3f73b1b25fcb5220138b95Andreas Huber 289a0b1d4b161599c2bb2a47119e50c51e75bbe980eAndreas Huber { 290a0b1d4b161599c2bb2a47119e50c51e75bbe980eAndreas Huber Mutex::Autolock autoLock(mStatsLock); 291a0b1d4b161599c2bb2a47119e50c51e75bbe980eAndreas Huber mStats.mFd = -1; 292a0b1d4b161599c2bb2a47119e50c51e75bbe980eAndreas Huber mStats.mURI = mUri; 293a0b1d4b161599c2bb2a47119e50c51e75bbe980eAndreas Huber } 294a0b1d4b161599c2bb2a47119e50c51e75bbe980eAndreas Huber 295bd22c52280179b29eefac91ef7e7bbbc33d25904Andreas Huber return OK; 296bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber} 297bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber 298bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huberstatus_t AwesomePlayer::setDataSource( 299bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber int fd, int64_t offset, int64_t length) { 300bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber Mutex::Autolock autoLock(mLock); 301bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber 302bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber reset_l(); 303bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber 3047b3396acc702451be9bafb19d7fe26d55d43a316Andreas Huber sp<DataSource> dataSource = new FileSource(fd, offset, length); 305bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber 3067b3396acc702451be9bafb19d7fe26d55d43a316Andreas Huber status_t err = dataSource->initCheck(); 307bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber 308bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber if (err != OK) { 309bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber return err; 310bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber } 311bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber 3127b3396acc702451be9bafb19d7fe26d55d43a316Andreas Huber mFileSource = dataSource; 3137b3396acc702451be9bafb19d7fe26d55d43a316Andreas Huber 314a0b1d4b161599c2bb2a47119e50c51e75bbe980eAndreas Huber { 315a0b1d4b161599c2bb2a47119e50c51e75bbe980eAndreas Huber Mutex::Autolock autoLock(mStatsLock); 316a0b1d4b161599c2bb2a47119e50c51e75bbe980eAndreas Huber mStats.mFd = fd; 317a0b1d4b161599c2bb2a47119e50c51e75bbe980eAndreas Huber mStats.mURI = String8(); 318a0b1d4b161599c2bb2a47119e50c51e75bbe980eAndreas Huber } 319a0b1d4b161599c2bb2a47119e50c51e75bbe980eAndreas Huber 3207b3396acc702451be9bafb19d7fe26d55d43a316Andreas Huber return setDataSource_l(dataSource); 3217b3396acc702451be9bafb19d7fe26d55d43a316Andreas Huber} 3227b3396acc702451be9bafb19d7fe26d55d43a316Andreas Huber 323e2b1028852120bcfded33b8f06f66b780437fe92Andreas Huberstatus_t AwesomePlayer::setDataSource(const sp<IStreamSource> &source) { 32485704836f33a199d7e442a23db82abbd5620d35dAndreas Huber return INVALID_OPERATION; 325e2b1028852120bcfded33b8f06f66b780437fe92Andreas Huber} 326e2b1028852120bcfded33b8f06f66b780437fe92Andreas Huber 3277b3396acc702451be9bafb19d7fe26d55d43a316Andreas Huberstatus_t AwesomePlayer::setDataSource_l( 3287b3396acc702451be9bafb19d7fe26d55d43a316Andreas Huber const sp<DataSource> &dataSource) { 3297b3396acc702451be9bafb19d7fe26d55d43a316Andreas Huber sp<MediaExtractor> extractor = MediaExtractor::Create(dataSource); 330bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber 331bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber if (extractor == NULL) { 332bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber return UNKNOWN_ERROR; 333bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber } 334bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber 3359d2f386dd2885eaffa11fd494ae258bb09fe6397James Dong if (extractor->getDrmFlag()) { 3369d2f386dd2885eaffa11fd494ae258bb09fe6397James Dong checkDrmStatus(dataSource); 3379d2f386dd2885eaffa11fd494ae258bb09fe6397James Dong } 3389d2f386dd2885eaffa11fd494ae258bb09fe6397James Dong 3399d2f386dd2885eaffa11fd494ae258bb09fe6397James Dong return setDataSource_l(extractor); 3409d2f386dd2885eaffa11fd494ae258bb09fe6397James Dong} 3419d2f386dd2885eaffa11fd494ae258bb09fe6397James Dong 3429d2f386dd2885eaffa11fd494ae258bb09fe6397James Dongvoid AwesomePlayer::checkDrmStatus(const sp<DataSource>& dataSource) { 343785ee06d106cd7958e0c151ebc6b7174d9ba861eJames Dong dataSource->getDrmInfo(mDecryptHandle, &mDrmManagerClient); 344785ee06d106cd7958e0c151ebc6b7174d9ba861eJames Dong if (mDecryptHandle != NULL) { 345785ee06d106cd7958e0c151ebc6b7174d9ba861eJames Dong CHECK(mDrmManagerClient); 346785ee06d106cd7958e0c151ebc6b7174d9ba861eJames Dong if (RightsStatus::RIGHTS_VALID != mDecryptHandle->status) { 347785ee06d106cd7958e0c151ebc6b7174d9ba861eJames Dong notifyListener_l(MEDIA_ERROR, MEDIA_ERROR_UNKNOWN, ERROR_DRM_NO_LICENSE); 3488f64134f749e4f7861a08a3063450fc714c4651dGloria Wang } 349dcd25efb46c41c8d24a0a9cf61fb57f84149709eGloria Wang } 350bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber} 351bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber 352bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huberstatus_t AwesomePlayer::setDataSource_l(const sp<MediaExtractor> &extractor) { 3537fbdb0903dfbf70b314a74e64e28fb880cdb9247Andreas Huber // Attempt to approximate overall stream bitrate by summing all 3547fbdb0903dfbf70b314a74e64e28fb880cdb9247Andreas Huber // tracks' individual bitrates, if not all of them advertise bitrate, 3557fbdb0903dfbf70b314a74e64e28fb880cdb9247Andreas Huber // we have to fail. 3567fbdb0903dfbf70b314a74e64e28fb880cdb9247Andreas Huber 3577fbdb0903dfbf70b314a74e64e28fb880cdb9247Andreas Huber int64_t totalBitRate = 0; 3587fbdb0903dfbf70b314a74e64e28fb880cdb9247Andreas Huber 359eec46abb88dcc50621fd2d3f17a6b8d24fd07a19James Dong mExtractor = extractor; 3607fbdb0903dfbf70b314a74e64e28fb880cdb9247Andreas Huber for (size_t i = 0; i < extractor->countTracks(); ++i) { 3617fbdb0903dfbf70b314a74e64e28fb880cdb9247Andreas Huber sp<MetaData> meta = extractor->getTrackMetaData(i); 3627fbdb0903dfbf70b314a74e64e28fb880cdb9247Andreas Huber 3637fbdb0903dfbf70b314a74e64e28fb880cdb9247Andreas Huber int32_t bitrate; 3647fbdb0903dfbf70b314a74e64e28fb880cdb9247Andreas Huber if (!meta->findInt32(kKeyBitRate, &bitrate)) { 365a0b1d4b161599c2bb2a47119e50c51e75bbe980eAndreas Huber const char *mime; 366a0b1d4b161599c2bb2a47119e50c51e75bbe980eAndreas Huber CHECK(meta->findCString(kKeyMIMEType, &mime)); 3673856b090cd04ba5dd4a59a12430ed724d5995909Steve Block ALOGV("track of type '%s' does not publish bitrate", mime); 368a0b1d4b161599c2bb2a47119e50c51e75bbe980eAndreas Huber 3697fbdb0903dfbf70b314a74e64e28fb880cdb9247Andreas Huber totalBitRate = -1; 3707fbdb0903dfbf70b314a74e64e28fb880cdb9247Andreas Huber break; 3717fbdb0903dfbf70b314a74e64e28fb880cdb9247Andreas Huber } 3727fbdb0903dfbf70b314a74e64e28fb880cdb9247Andreas Huber 3737fbdb0903dfbf70b314a74e64e28fb880cdb9247Andreas Huber totalBitRate += bitrate; 3747fbdb0903dfbf70b314a74e64e28fb880cdb9247Andreas Huber } 3757fbdb0903dfbf70b314a74e64e28fb880cdb9247Andreas Huber 3767fbdb0903dfbf70b314a74e64e28fb880cdb9247Andreas Huber mBitrate = totalBitRate; 3777fbdb0903dfbf70b314a74e64e28fb880cdb9247Andreas Huber 3783856b090cd04ba5dd4a59a12430ed724d5995909Steve Block ALOGV("mBitrate = %lld bits/sec", mBitrate); 3797fbdb0903dfbf70b314a74e64e28fb880cdb9247Andreas Huber 380a0b1d4b161599c2bb2a47119e50c51e75bbe980eAndreas Huber { 381a0b1d4b161599c2bb2a47119e50c51e75bbe980eAndreas Huber Mutex::Autolock autoLock(mStatsLock); 382a0b1d4b161599c2bb2a47119e50c51e75bbe980eAndreas Huber mStats.mBitrate = mBitrate; 383a0b1d4b161599c2bb2a47119e50c51e75bbe980eAndreas Huber mStats.mTracks.clear(); 384a0b1d4b161599c2bb2a47119e50c51e75bbe980eAndreas Huber mStats.mAudioTrackIndex = -1; 385a0b1d4b161599c2bb2a47119e50c51e75bbe980eAndreas Huber mStats.mVideoTrackIndex = -1; 386a0b1d4b161599c2bb2a47119e50c51e75bbe980eAndreas Huber } 387a0b1d4b161599c2bb2a47119e50c51e75bbe980eAndreas Huber 388bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber bool haveAudio = false; 389bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber bool haveVideo = false; 390bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber for (size_t i = 0; i < extractor->countTracks(); ++i) { 391bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber sp<MetaData> meta = extractor->getTrackMetaData(i); 392bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber 39332bdfd5acb76a02e82e0059c8bd892bc1f73a7e3Andreas Huber const char *_mime; 39432bdfd5acb76a02e82e0059c8bd892bc1f73a7e3Andreas Huber CHECK(meta->findCString(kKeyMIMEType, &_mime)); 395bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber 39632bdfd5acb76a02e82e0059c8bd892bc1f73a7e3Andreas Huber String8 mime = String8(_mime); 39732bdfd5acb76a02e82e0059c8bd892bc1f73a7e3Andreas Huber 39832bdfd5acb76a02e82e0059c8bd892bc1f73a7e3Andreas Huber if (!haveVideo && !strncasecmp(mime.string(), "video/", 6)) { 39988d8a83de12592635248aa1a3bd6b9ea46108501Andreas Huber setVideoSource(extractor->getTrack(i)); 40088d8a83de12592635248aa1a3bd6b9ea46108501Andreas Huber haveVideo = true; 401b45c01c2b8588ff431b511151666a55a39f0a6aeJames Dong 402b45c01c2b8588ff431b511151666a55a39f0a6aeJames Dong // Set the presentation/display size 403b45c01c2b8588ff431b511151666a55a39f0a6aeJames Dong int32_t displayWidth, displayHeight; 404b45c01c2b8588ff431b511151666a55a39f0a6aeJames Dong bool success = meta->findInt32(kKeyDisplayWidth, &displayWidth); 405b45c01c2b8588ff431b511151666a55a39f0a6aeJames Dong if (success) { 406b45c01c2b8588ff431b511151666a55a39f0a6aeJames Dong success = meta->findInt32(kKeyDisplayHeight, &displayHeight); 407b45c01c2b8588ff431b511151666a55a39f0a6aeJames Dong } 408b45c01c2b8588ff431b511151666a55a39f0a6aeJames Dong if (success) { 409b45c01c2b8588ff431b511151666a55a39f0a6aeJames Dong mDisplayWidth = displayWidth; 410b45c01c2b8588ff431b511151666a55a39f0a6aeJames Dong mDisplayHeight = displayHeight; 411b45c01c2b8588ff431b511151666a55a39f0a6aeJames Dong } 412b45c01c2b8588ff431b511151666a55a39f0a6aeJames Dong 413a0b1d4b161599c2bb2a47119e50c51e75bbe980eAndreas Huber { 414a0b1d4b161599c2bb2a47119e50c51e75bbe980eAndreas Huber Mutex::Autolock autoLock(mStatsLock); 415a0b1d4b161599c2bb2a47119e50c51e75bbe980eAndreas Huber mStats.mVideoTrackIndex = mStats.mTracks.size(); 416a0b1d4b161599c2bb2a47119e50c51e75bbe980eAndreas Huber mStats.mTracks.push(); 417a0b1d4b161599c2bb2a47119e50c51e75bbe980eAndreas Huber TrackStat *stat = 418a0b1d4b161599c2bb2a47119e50c51e75bbe980eAndreas Huber &mStats.mTracks.editItemAt(mStats.mVideoTrackIndex); 41932bdfd5acb76a02e82e0059c8bd892bc1f73a7e3Andreas Huber stat->mMIME = mime.string(); 420a0b1d4b161599c2bb2a47119e50c51e75bbe980eAndreas Huber } 42132bdfd5acb76a02e82e0059c8bd892bc1f73a7e3Andreas Huber } else if (!haveAudio && !strncasecmp(mime.string(), "audio/", 6)) { 42288d8a83de12592635248aa1a3bd6b9ea46108501Andreas Huber setAudioSource(extractor->getTrack(i)); 42388d8a83de12592635248aa1a3bd6b9ea46108501Andreas Huber haveAudio = true; 4248ae49d87b98d57d6758b0c51b95e28a6581a79f1Andreas Huber 425a0b1d4b161599c2bb2a47119e50c51e75bbe980eAndreas Huber { 426a0b1d4b161599c2bb2a47119e50c51e75bbe980eAndreas Huber Mutex::Autolock autoLock(mStatsLock); 427a0b1d4b161599c2bb2a47119e50c51e75bbe980eAndreas Huber mStats.mAudioTrackIndex = mStats.mTracks.size(); 428a0b1d4b161599c2bb2a47119e50c51e75bbe980eAndreas Huber mStats.mTracks.push(); 429a0b1d4b161599c2bb2a47119e50c51e75bbe980eAndreas Huber TrackStat *stat = 430a0b1d4b161599c2bb2a47119e50c51e75bbe980eAndreas Huber &mStats.mTracks.editItemAt(mStats.mAudioTrackIndex); 43132bdfd5acb76a02e82e0059c8bd892bc1f73a7e3Andreas Huber stat->mMIME = mime.string(); 432a0b1d4b161599c2bb2a47119e50c51e75bbe980eAndreas Huber } 433a0b1d4b161599c2bb2a47119e50c51e75bbe980eAndreas Huber 43432bdfd5acb76a02e82e0059c8bd892bc1f73a7e3Andreas Huber if (!strcasecmp(mime.string(), MEDIA_MIMETYPE_AUDIO_VORBIS)) { 4356954535ba64374e4e941cd83019a7af53edfb098Andreas Huber // Only do this for vorbis audio, none of the other audio 4366954535ba64374e4e941cd83019a7af53edfb098Andreas Huber // formats even support this ringtone specific hack and 4376954535ba64374e4e941cd83019a7af53edfb098Andreas Huber // retrieving the metadata on some extractors may turn out 4386954535ba64374e4e941cd83019a7af53edfb098Andreas Huber // to be very expensive. 4396954535ba64374e4e941cd83019a7af53edfb098Andreas Huber sp<MetaData> fileMeta = extractor->getMetaData(); 4406954535ba64374e4e941cd83019a7af53edfb098Andreas Huber int32_t loop; 4416954535ba64374e4e941cd83019a7af53edfb098Andreas Huber if (fileMeta != NULL 4426954535ba64374e4e941cd83019a7af53edfb098Andreas Huber && fileMeta->findInt32(kKeyAutoLoop, &loop) && loop != 0) { 443a0b1d4b161599c2bb2a47119e50c51e75bbe980eAndreas Huber modifyFlags(AUTO_LOOPING, SET); 4446954535ba64374e4e941cd83019a7af53edfb098Andreas Huber } 4458ae49d87b98d57d6758b0c51b95e28a6581a79f1Andreas Huber } 44632bdfd5acb76a02e82e0059c8bd892bc1f73a7e3Andreas Huber } else if (!strcasecmp(mime.string(), MEDIA_MIMETYPE_TEXT_3GPP)) { 447eec46abb88dcc50621fd2d3f17a6b8d24fd07a19James Dong addTextSource(i, extractor->getTrack(i)); 448bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber } 449bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber } 450bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber 451acdd9d0f59c3d8bdc3de80664a609527ec3d21e2Andreas Huber if (!haveAudio && !haveVideo) { 452acdd9d0f59c3d8bdc3de80664a609527ec3d21e2Andreas Huber return UNKNOWN_ERROR; 453acdd9d0f59c3d8bdc3de80664a609527ec3d21e2Andreas Huber } 454acdd9d0f59c3d8bdc3de80664a609527ec3d21e2Andreas Huber 455acdd9d0f59c3d8bdc3de80664a609527ec3d21e2Andreas Huber mExtractorFlags = extractor->flags(); 456acdd9d0f59c3d8bdc3de80664a609527ec3d21e2Andreas Huber 457acdd9d0f59c3d8bdc3de80664a609527ec3d21e2Andreas Huber return OK; 458bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber} 459bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber 460bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Hubervoid AwesomePlayer::reset() { 461bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber Mutex::Autolock autoLock(mLock); 462bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber reset_l(); 463bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber} 464bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber 465bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Hubervoid AwesomePlayer::reset_l() { 466b45c01c2b8588ff431b511151666a55a39f0a6aeJames Dong mDisplayWidth = 0; 467b45c01c2b8588ff431b511151666a55a39f0a6aeJames Dong mDisplayHeight = 0; 46865a170e3ac593a29abd0c76e9aa531fabad7f56dAndreas Huber 469dcd25efb46c41c8d24a0a9cf61fb57f84149709eGloria Wang if (mDecryptHandle != NULL) { 470dcd25efb46c41c8d24a0a9cf61fb57f84149709eGloria Wang mDrmManagerClient->setPlaybackStatus(mDecryptHandle, 471dcd25efb46c41c8d24a0a9cf61fb57f84149709eGloria Wang Playback::STOP, 0); 472dcd25efb46c41c8d24a0a9cf61fb57f84149709eGloria Wang mDecryptHandle = NULL; 473dcd25efb46c41c8d24a0a9cf61fb57f84149709eGloria Wang mDrmManagerClient = NULL; 474dcd25efb46c41c8d24a0a9cf61fb57f84149709eGloria Wang } 475dcd25efb46c41c8d24a0a9cf61fb57f84149709eGloria Wang 4767cf180c9bff69e5cc4a2f4e53b432db45ebbebabGloria Wang if (mFlags & PLAYING) { 4777cf180c9bff69e5cc4a2f4e53b432db45ebbebabGloria Wang uint32_t params = IMediaPlayerService::kBatteryDataTrackDecoder; 4787cf180c9bff69e5cc4a2f4e53b432db45ebbebabGloria Wang if ((mAudioSource != NULL) && (mAudioSource != mAudioTrack)) { 4797cf180c9bff69e5cc4a2f4e53b432db45ebbebabGloria Wang params |= IMediaPlayerService::kBatteryDataTrackAudio; 4807cf180c9bff69e5cc4a2f4e53b432db45ebbebabGloria Wang } 4817cf180c9bff69e5cc4a2f4e53b432db45ebbebabGloria Wang if (mVideoSource != NULL) { 4827cf180c9bff69e5cc4a2f4e53b432db45ebbebabGloria Wang params |= IMediaPlayerService::kBatteryDataTrackVideo; 4837cf180c9bff69e5cc4a2f4e53b432db45ebbebabGloria Wang } 4847cf180c9bff69e5cc4a2f4e53b432db45ebbebabGloria Wang addBatteryData(params); 4857cf180c9bff69e5cc4a2f4e53b432db45ebbebabGloria Wang } 4867cf180c9bff69e5cc4a2f4e53b432db45ebbebabGloria Wang 487e94bd14078d327ef2f800e69907efce641a13272Andreas Huber if (mFlags & PREPARING) { 488a0b1d4b161599c2bb2a47119e50c51e75bbe980eAndreas Huber modifyFlags(PREPARE_CANCELLED, SET); 489e94bd14078d327ef2f800e69907efce641a13272Andreas Huber if (mConnectingDataSource != NULL) { 490df64d15042bbd5e0e4933ac49bf3c177dd94752cSteve Block ALOGI("interrupting the connection process"); 491e94bd14078d327ef2f800e69907efce641a13272Andreas Huber mConnectingDataSource->disconnect(); 492e94bd14078d327ef2f800e69907efce641a13272Andreas Huber } 4936a05c9e912aeb8bfe1ef99516def91a177a481b6Andreas Huber 4946a05c9e912aeb8bfe1ef99516def91a177a481b6Andreas Huber if (mFlags & PREPARING_CONNECTED) { 4956a05c9e912aeb8bfe1ef99516def91a177a481b6Andreas Huber // We are basically done preparing, we're just buffering 4966a05c9e912aeb8bfe1ef99516def91a177a481b6Andreas Huber // enough data to start playback, we can safely interrupt that. 4976a05c9e912aeb8bfe1ef99516def91a177a481b6Andreas Huber finishAsyncPrepare_l(); 4986a05c9e912aeb8bfe1ef99516def91a177a481b6Andreas Huber } 499e94bd14078d327ef2f800e69907efce641a13272Andreas Huber } 500e94bd14078d327ef2f800e69907efce641a13272Andreas Huber 501bd22c52280179b29eefac91ef7e7bbbc33d25904Andreas Huber while (mFlags & PREPARING) { 502bd22c52280179b29eefac91ef7e7bbbc33d25904Andreas Huber mPreparedCondition.wait(mLock); 503bd22c52280179b29eefac91ef7e7bbbc33d25904Andreas Huber } 504bd22c52280179b29eefac91ef7e7bbbc33d25904Andreas Huber 505bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber cancelPlayerEvents(); 506bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber 507681755fc0d0797506456f46a2a10555916d6be32Andreas Huber mWVMExtractor.clear(); 5080a5baa9b411fe086013d2a5e9126ed63fbad046cAndreas Huber mCachedSource.clear(); 50988d8a83de12592635248aa1a3bd6b9ea46108501Andreas Huber mAudioTrack.clear(); 51088d8a83de12592635248aa1a3bd6b9ea46108501Andreas Huber mVideoTrack.clear(); 511eec46abb88dcc50621fd2d3f17a6b8d24fd07a19James Dong mExtractor.clear(); 51288d8a83de12592635248aa1a3bd6b9ea46108501Andreas Huber 5137b3396acc702451be9bafb19d7fe26d55d43a316Andreas Huber // Shutdown audio first, so that the respone to the reset request 5147b3396acc702451be9bafb19d7fe26d55d43a316Andreas Huber // appears to happen instantaneously as far as the user is concerned 5157b3396acc702451be9bafb19d7fe26d55d43a316Andreas Huber // If we did this later, audio would continue playing while we 5167b3396acc702451be9bafb19d7fe26d55d43a316Andreas Huber // shutdown the video-related resources and the player appear to 5177b3396acc702451be9bafb19d7fe26d55d43a316Andreas Huber // not be as responsive to a reset request. 5185b75fdc8fbc026453888cbb2d3fe31345394618bGloria Wang if ((mAudioPlayer == NULL || !(mFlags & AUDIOPLAYER_STARTED)) 5195b75fdc8fbc026453888cbb2d3fe31345394618bGloria Wang && mAudioSource != NULL) { 520e94bd14078d327ef2f800e69907efce641a13272Andreas Huber // If we had an audio player, it would have effectively 521e94bd14078d327ef2f800e69907efce641a13272Andreas Huber // taken possession of the audio source and stopped it when 522e94bd14078d327ef2f800e69907efce641a13272Andreas Huber // _it_ is stopped. Otherwise this is still our responsibility. 523e94bd14078d327ef2f800e69907efce641a13272Andreas Huber mAudioSource->stop(); 524e94bd14078d327ef2f800e69907efce641a13272Andreas Huber } 5257b3396acc702451be9bafb19d7fe26d55d43a316Andreas Huber mAudioSource.clear(); 5267b3396acc702451be9bafb19d7fe26d55d43a316Andreas Huber 5277b3396acc702451be9bafb19d7fe26d55d43a316Andreas Huber mTimeSource = NULL; 5287b3396acc702451be9bafb19d7fe26d55d43a316Andreas Huber 5297b3396acc702451be9bafb19d7fe26d55d43a316Andreas Huber delete mAudioPlayer; 5307b3396acc702451be9bafb19d7fe26d55d43a316Andreas Huber mAudioPlayer = NULL; 5317b3396acc702451be9bafb19d7fe26d55d43a316Andreas Huber 5326655174826330afe66ef766258181ae8c11f3f6cInsun Kang if (mTextDriver != NULL) { 5336655174826330afe66ef766258181ae8c11f3f6cInsun Kang delete mTextDriver; 5346655174826330afe66ef766258181ae8c11f3f6cInsun Kang mTextDriver = NULL; 5357a1e3e81264189e23a1db2b174e1b5a5d4c7d1c3Gloria Wang } 5367a1e3e81264189e23a1db2b174e1b5a5d4c7d1c3Gloria Wang 537b9280d5c2313c41eb490f58198c4e59118e0e3e6Andreas Huber mVideoRenderer.clear(); 538b9280d5c2313c41eb490f58198c4e59118e0e3e6Andreas Huber 539bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber if (mVideoSource != NULL) { 540150694cda0842d38a9358fe8d1fcb4fb4a76599eAndreas Huber shutdownVideoDecoder_l(); 541bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber } 542bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber 543bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber mDurationUs = -1; 544a0b1d4b161599c2bb2a47119e50c51e75bbe980eAndreas Huber modifyFlags(0, ASSIGN); 545acdd9d0f59c3d8bdc3de80664a609527ec3d21e2Andreas Huber mExtractorFlags = 0; 546bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber mTimeSourceDeltaUs = 0; 547bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber mVideoTimeUs = 0; 548bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber 54964bb6983690bf994d904591145a3cdd6373bdbe6Andreas Huber mSeeking = NO_SEEK; 550af64a8a6ad89f52685e822dca30742a4132c9ae6Gloria Wang mSeekNotificationSent = true; 551bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber mSeekTimeUs = 0; 55266b0a35c9a4136a84c3f73b1b25fcb5220138b95Andreas Huber 553bd22c52280179b29eefac91ef7e7bbbc33d25904Andreas Huber mUri.setTo(""); 554bd22c52280179b29eefac91ef7e7bbbc33d25904Andreas Huber mUriHeaders.clear(); 5557b3396acc702451be9bafb19d7fe26d55d43a316Andreas Huber 5567b3396acc702451be9bafb19d7fe26d55d43a316Andreas Huber mFileSource.clear(); 5577b3396acc702451be9bafb19d7fe26d55d43a316Andreas Huber 5587fbdb0903dfbf70b314a74e64e28fb880cdb9247Andreas Huber mBitrate = -1; 559150694cda0842d38a9358fe8d1fcb4fb4a76599eAndreas Huber mLastVideoTimeUs = -1; 560a0b1d4b161599c2bb2a47119e50c51e75bbe980eAndreas Huber 561a0b1d4b161599c2bb2a47119e50c51e75bbe980eAndreas Huber { 562a0b1d4b161599c2bb2a47119e50c51e75bbe980eAndreas Huber Mutex::Autolock autoLock(mStatsLock); 563a0b1d4b161599c2bb2a47119e50c51e75bbe980eAndreas Huber mStats.mFd = -1; 564a0b1d4b161599c2bb2a47119e50c51e75bbe980eAndreas Huber mStats.mURI = String8(); 565a0b1d4b161599c2bb2a47119e50c51e75bbe980eAndreas Huber mStats.mBitrate = -1; 566a0b1d4b161599c2bb2a47119e50c51e75bbe980eAndreas Huber mStats.mAudioTrackIndex = -1; 567a0b1d4b161599c2bb2a47119e50c51e75bbe980eAndreas Huber mStats.mVideoTrackIndex = -1; 568a0b1d4b161599c2bb2a47119e50c51e75bbe980eAndreas Huber mStats.mNumVideoFramesDecoded = 0; 569a0b1d4b161599c2bb2a47119e50c51e75bbe980eAndreas Huber mStats.mNumVideoFramesDropped = 0; 570a0b1d4b161599c2bb2a47119e50c51e75bbe980eAndreas Huber mStats.mVideoWidth = -1; 571a0b1d4b161599c2bb2a47119e50c51e75bbe980eAndreas Huber mStats.mVideoHeight = -1; 572a0b1d4b161599c2bb2a47119e50c51e75bbe980eAndreas Huber mStats.mFlags = 0; 573a0b1d4b161599c2bb2a47119e50c51e75bbe980eAndreas Huber mStats.mTracks.clear(); 574a0b1d4b161599c2bb2a47119e50c51e75bbe980eAndreas Huber } 575a0b1d4b161599c2bb2a47119e50c51e75bbe980eAndreas Huber 57699590d29c9d3081cadfccd036842f5ce9a7debefAndreas Huber mWatchForAudioSeekComplete = false; 57799590d29c9d3081cadfccd036842f5ce9a7debefAndreas Huber mWatchForAudioEOS = false; 578bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber} 579bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber 580c23f12af0394aa2f6651968a3c8840f1af317aa1Andreas Hubervoid AwesomePlayer::notifyListener_l(int msg, int ext1, int ext2) { 5810726045216f576e97672ebeefc265d39c4ebaaa5Andreas Huber if (mListener != NULL) { 5820726045216f576e97672ebeefc265d39c4ebaaa5Andreas Huber sp<MediaPlayerBase> listener = mListener.promote(); 5830726045216f576e97672ebeefc265d39c4ebaaa5Andreas Huber 5840726045216f576e97672ebeefc265d39c4ebaaa5Andreas Huber if (listener != NULL) { 585c23f12af0394aa2f6651968a3c8840f1af317aa1Andreas Huber listener->sendEvent(msg, ext1, ext2); 58666b0a35c9a4136a84c3f73b1b25fcb5220138b95Andreas Huber } 58766b0a35c9a4136a84c3f73b1b25fcb5220138b95Andreas Huber } 58866b0a35c9a4136a84c3f73b1b25fcb5220138b95Andreas Huber} 58966b0a35c9a4136a84c3f73b1b25fcb5220138b95Andreas Huber 5907fbdb0903dfbf70b314a74e64e28fb880cdb9247Andreas Huberbool AwesomePlayer::getBitrate(int64_t *bitrate) { 591c7fc37a3dab9bd1f96713649f351b5990e6316ffJames Dong off64_t size; 5927fbdb0903dfbf70b314a74e64e28fb880cdb9247Andreas Huber if (mDurationUs >= 0 && mCachedSource != NULL 5937fbdb0903dfbf70b314a74e64e28fb880cdb9247Andreas Huber && mCachedSource->getSize(&size) == OK) { 5947fbdb0903dfbf70b314a74e64e28fb880cdb9247Andreas Huber *bitrate = size * 8000000ll / mDurationUs; // in bits/sec 5957fbdb0903dfbf70b314a74e64e28fb880cdb9247Andreas Huber return true; 5967fbdb0903dfbf70b314a74e64e28fb880cdb9247Andreas Huber } 5977fbdb0903dfbf70b314a74e64e28fb880cdb9247Andreas Huber 5987fbdb0903dfbf70b314a74e64e28fb880cdb9247Andreas Huber if (mBitrate >= 0) { 5997fbdb0903dfbf70b314a74e64e28fb880cdb9247Andreas Huber *bitrate = mBitrate; 6007fbdb0903dfbf70b314a74e64e28fb880cdb9247Andreas Huber return true; 6017fbdb0903dfbf70b314a74e64e28fb880cdb9247Andreas Huber } 6027fbdb0903dfbf70b314a74e64e28fb880cdb9247Andreas Huber 6037fbdb0903dfbf70b314a74e64e28fb880cdb9247Andreas Huber *bitrate = 0; 6047fbdb0903dfbf70b314a74e64e28fb880cdb9247Andreas Huber 6057fbdb0903dfbf70b314a74e64e28fb880cdb9247Andreas Huber return false; 6067fbdb0903dfbf70b314a74e64e28fb880cdb9247Andreas Huber} 6077fbdb0903dfbf70b314a74e64e28fb880cdb9247Andreas Huber 6088650e1960905097f6f1d6aa462ccb1c93c656834Andreas Huber// Returns true iff cached duration is available/applicable. 6098650e1960905097f6f1d6aa462ccb1c93c656834Andreas Huberbool AwesomePlayer::getCachedDuration_l(int64_t *durationUs, bool *eos) { 6107fbdb0903dfbf70b314a74e64e28fb880cdb9247Andreas Huber int64_t bitrate; 6118650e1960905097f6f1d6aa462ccb1c93c656834Andreas Huber 6122bfdd428c56c7524d1a11979f200a1762866032dAndreas Huber if (mCachedSource != NULL && getBitrate(&bitrate)) { 6131bd233ce7e1aa7730bc18d46ffd57791391738cdBryan Mawhinney status_t finalStatus; 6141bd233ce7e1aa7730bc18d46ffd57791391738cdBryan Mawhinney size_t cachedDataRemaining = mCachedSource->approxDataRemaining(&finalStatus); 6158650e1960905097f6f1d6aa462ccb1c93c656834Andreas Huber *durationUs = cachedDataRemaining * 8000000ll / bitrate; 6161bd233ce7e1aa7730bc18d46ffd57791391738cdBryan Mawhinney *eos = (finalStatus != OK); 6178650e1960905097f6f1d6aa462ccb1c93c656834Andreas Huber return true; 618681755fc0d0797506456f46a2a10555916d6be32Andreas Huber } else if (mWVMExtractor != NULL) { 619681755fc0d0797506456f46a2a10555916d6be32Andreas Huber status_t finalStatus; 620681755fc0d0797506456f46a2a10555916d6be32Andreas Huber *durationUs = mWVMExtractor->getCachedDurationUs(&finalStatus); 621681755fc0d0797506456f46a2a10555916d6be32Andreas Huber *eos = (finalStatus != OK); 622681755fc0d0797506456f46a2a10555916d6be32Andreas Huber return true; 6238650e1960905097f6f1d6aa462ccb1c93c656834Andreas Huber } 6248650e1960905097f6f1d6aa462ccb1c93c656834Andreas Huber 6258650e1960905097f6f1d6aa462ccb1c93c656834Andreas Huber return false; 6268650e1960905097f6f1d6aa462ccb1c93c656834Andreas Huber} 6278650e1960905097f6f1d6aa462ccb1c93c656834Andreas Huber 62834ef0f32c8fc0186236a27e07405328cc1f7c56dAndreas Hubervoid AwesomePlayer::ensureCacheIsFetching_l() { 62934ef0f32c8fc0186236a27e07405328cc1f7c56dAndreas Huber if (mCachedSource != NULL) { 63034ef0f32c8fc0186236a27e07405328cc1f7c56dAndreas Huber mCachedSource->resumeFetchingIfNecessary(); 63134ef0f32c8fc0186236a27e07405328cc1f7c56dAndreas Huber } 63234ef0f32c8fc0186236a27e07405328cc1f7c56dAndreas Huber} 63334ef0f32c8fc0186236a27e07405328cc1f7c56dAndreas Huber 634145e68fc778275963189b02a1adcbe27cce4d769Andreas Hubervoid AwesomePlayer::onVideoLagUpdate() { 635145e68fc778275963189b02a1adcbe27cce4d769Andreas Huber Mutex::Autolock autoLock(mLock); 636145e68fc778275963189b02a1adcbe27cce4d769Andreas Huber if (!mVideoLagEventPending) { 637145e68fc778275963189b02a1adcbe27cce4d769Andreas Huber return; 638145e68fc778275963189b02a1adcbe27cce4d769Andreas Huber } 639145e68fc778275963189b02a1adcbe27cce4d769Andreas Huber mVideoLagEventPending = false; 640145e68fc778275963189b02a1adcbe27cce4d769Andreas Huber 641145e68fc778275963189b02a1adcbe27cce4d769Andreas Huber int64_t audioTimeUs = mAudioPlayer->getMediaTimeUs(); 642145e68fc778275963189b02a1adcbe27cce4d769Andreas Huber int64_t videoLateByUs = audioTimeUs - mVideoTimeUs; 643145e68fc778275963189b02a1adcbe27cce4d769Andreas Huber 6445dac87b088556b8ed7f2a4f5546d31be0bb68680Andreas Huber if (!(mFlags & VIDEO_AT_EOS) && videoLateByUs > 300000ll) { 6453856b090cd04ba5dd4a59a12430ed724d5995909Steve Block ALOGV("video late by %lld ms.", videoLateByUs / 1000ll); 646145e68fc778275963189b02a1adcbe27cce4d769Andreas Huber 647145e68fc778275963189b02a1adcbe27cce4d769Andreas Huber notifyListener_l( 648145e68fc778275963189b02a1adcbe27cce4d769Andreas Huber MEDIA_INFO, 649145e68fc778275963189b02a1adcbe27cce4d769Andreas Huber MEDIA_INFO_VIDEO_TRACK_LAGGING, 650145e68fc778275963189b02a1adcbe27cce4d769Andreas Huber videoLateByUs / 1000ll); 651145e68fc778275963189b02a1adcbe27cce4d769Andreas Huber } 652145e68fc778275963189b02a1adcbe27cce4d769Andreas Huber 653145e68fc778275963189b02a1adcbe27cce4d769Andreas Huber postVideoLagEvent_l(); 654145e68fc778275963189b02a1adcbe27cce4d769Andreas Huber} 655145e68fc778275963189b02a1adcbe27cce4d769Andreas Huber 65666b0a35c9a4136a84c3f73b1b25fcb5220138b95Andreas Hubervoid AwesomePlayer::onBufferingUpdate() { 65766b0a35c9a4136a84c3f73b1b25fcb5220138b95Andreas Huber Mutex::Autolock autoLock(mLock); 658d29345dfa29cdcc650f3705e43950ef2500f6728Andreas Huber if (!mBufferingEventPending) { 659d29345dfa29cdcc650f3705e43950ef2500f6728Andreas Huber return; 660d29345dfa29cdcc650f3705e43950ef2500f6728Andreas Huber } 66166b0a35c9a4136a84c3f73b1b25fcb5220138b95Andreas Huber mBufferingEventPending = false; 66266b0a35c9a4136a84c3f73b1b25fcb5220138b95Andreas Huber 6638650e1960905097f6f1d6aa462ccb1c93c656834Andreas Huber if (mCachedSource != NULL) { 6641bd233ce7e1aa7730bc18d46ffd57791391738cdBryan Mawhinney status_t finalStatus; 6651bd233ce7e1aa7730bc18d46ffd57791391738cdBryan Mawhinney size_t cachedDataRemaining = mCachedSource->approxDataRemaining(&finalStatus); 6661bd233ce7e1aa7730bc18d46ffd57791391738cdBryan Mawhinney bool eos = (finalStatus != OK); 667c9e894872c298b25fe9d74e68aa1e7287a541ac3Andreas Huber 6688650e1960905097f6f1d6aa462ccb1c93c656834Andreas Huber if (eos) { 6691bd233ce7e1aa7730bc18d46ffd57791391738cdBryan Mawhinney if (finalStatus == ERROR_END_OF_STREAM) { 6701bd233ce7e1aa7730bc18d46ffd57791391738cdBryan Mawhinney notifyListener_l(MEDIA_BUFFERING_UPDATE, 100); 6711bd233ce7e1aa7730bc18d46ffd57791391738cdBryan Mawhinney } 67283977eb230d829cfe520f55d7977037a904ce548Andreas Huber if (mFlags & PREPARING) { 6733856b090cd04ba5dd4a59a12430ed724d5995909Steve Block ALOGV("cache has reached EOS, prepare is done."); 67483977eb230d829cfe520f55d7977037a904ce548Andreas Huber finishAsyncPrepare_l(); 67583977eb230d829cfe520f55d7977037a904ce548Andreas Huber } 6768650e1960905097f6f1d6aa462ccb1c93c656834Andreas Huber } else { 6777fbdb0903dfbf70b314a74e64e28fb880cdb9247Andreas Huber int64_t bitrate; 6787fbdb0903dfbf70b314a74e64e28fb880cdb9247Andreas Huber if (getBitrate(&bitrate)) { 6798650e1960905097f6f1d6aa462ccb1c93c656834Andreas Huber size_t cachedSize = mCachedSource->cachedSize(); 6808650e1960905097f6f1d6aa462ccb1c93c656834Andreas Huber int64_t cachedDurationUs = cachedSize * 8000000ll / bitrate; 681c9e894872c298b25fe9d74e68aa1e7287a541ac3Andreas Huber 6828650e1960905097f6f1d6aa462ccb1c93c656834Andreas Huber int percentage = 100.0 * (double)cachedDurationUs / mDurationUs; 6838650e1960905097f6f1d6aa462ccb1c93c656834Andreas Huber if (percentage > 100) { 6848650e1960905097f6f1d6aa462ccb1c93c656834Andreas Huber percentage = 100; 6858650e1960905097f6f1d6aa462ccb1c93c656834Andreas Huber } 686c9e894872c298b25fe9d74e68aa1e7287a541ac3Andreas Huber 6878650e1960905097f6f1d6aa462ccb1c93c656834Andreas Huber notifyListener_l(MEDIA_BUFFERING_UPDATE, percentage); 6888650e1960905097f6f1d6aa462ccb1c93c656834Andreas Huber } else { 6898650e1960905097f6f1d6aa462ccb1c93c656834Andreas Huber // We don't know the bitrate of the stream, use absolute size 6908650e1960905097f6f1d6aa462ccb1c93c656834Andreas Huber // limits to maintain the cache. 6918650e1960905097f6f1d6aa462ccb1c93c656834Andreas Huber 6928650e1960905097f6f1d6aa462ccb1c93c656834Andreas Huber if ((mFlags & PLAYING) && !eos 6938650e1960905097f6f1d6aa462ccb1c93c656834Andreas Huber && (cachedDataRemaining < kLowWaterMarkBytes)) { 694df64d15042bbd5e0e4933ac49bf3c177dd94752cSteve Block ALOGI("cache is running low (< %d) , pausing.", 6958650e1960905097f6f1d6aa462ccb1c93c656834Andreas Huber kLowWaterMarkBytes); 696a0b1d4b161599c2bb2a47119e50c51e75bbe980eAndreas Huber modifyFlags(CACHE_UNDERRUN, SET); 6978650e1960905097f6f1d6aa462ccb1c93c656834Andreas Huber pause_l(); 69834ef0f32c8fc0186236a27e07405328cc1f7c56dAndreas Huber ensureCacheIsFetching_l(); 6995b1b8a93a07326f1cbc627f09e02988375189e0aJames Dong sendCacheStats(); 7008650e1960905097f6f1d6aa462ccb1c93c656834Andreas Huber notifyListener_l(MEDIA_INFO, MEDIA_INFO_BUFFERING_START); 7018650e1960905097f6f1d6aa462ccb1c93c656834Andreas Huber } else if (eos || cachedDataRemaining > kHighWaterMarkBytes) { 7028650e1960905097f6f1d6aa462ccb1c93c656834Andreas Huber if (mFlags & CACHE_UNDERRUN) { 703df64d15042bbd5e0e4933ac49bf3c177dd94752cSteve Block ALOGI("cache has filled up (> %d), resuming.", 7048650e1960905097f6f1d6aa462ccb1c93c656834Andreas Huber kHighWaterMarkBytes); 705a0b1d4b161599c2bb2a47119e50c51e75bbe980eAndreas Huber modifyFlags(CACHE_UNDERRUN, CLEAR); 7068650e1960905097f6f1d6aa462ccb1c93c656834Andreas Huber play_l(); 7078650e1960905097f6f1d6aa462ccb1c93c656834Andreas Huber notifyListener_l(MEDIA_INFO, MEDIA_INFO_BUFFERING_END); 7088650e1960905097f6f1d6aa462ccb1c93c656834Andreas Huber } else if (mFlags & PREPARING) { 7093856b090cd04ba5dd4a59a12430ed724d5995909Steve Block ALOGV("cache has filled up (> %d), prepare is done", 7108650e1960905097f6f1d6aa462ccb1c93c656834Andreas Huber kHighWaterMarkBytes); 7118650e1960905097f6f1d6aa462ccb1c93c656834Andreas Huber finishAsyncPrepare_l(); 7128650e1960905097f6f1d6aa462ccb1c93c656834Andreas Huber } 7138650e1960905097f6f1d6aa462ccb1c93c656834Andreas Huber } 7148650e1960905097f6f1d6aa462ccb1c93c656834Andreas Huber } 7158650e1960905097f6f1d6aa462ccb1c93c656834Andreas Huber } 716681755fc0d0797506456f46a2a10555916d6be32Andreas Huber } else if (mWVMExtractor != NULL) { 717681755fc0d0797506456f46a2a10555916d6be32Andreas Huber status_t finalStatus; 718681755fc0d0797506456f46a2a10555916d6be32Andreas Huber 719681755fc0d0797506456f46a2a10555916d6be32Andreas Huber int64_t cachedDurationUs 720681755fc0d0797506456f46a2a10555916d6be32Andreas Huber = mWVMExtractor->getCachedDurationUs(&finalStatus); 721681755fc0d0797506456f46a2a10555916d6be32Andreas Huber 722681755fc0d0797506456f46a2a10555916d6be32Andreas Huber bool eos = (finalStatus != OK); 723681755fc0d0797506456f46a2a10555916d6be32Andreas Huber 724681755fc0d0797506456f46a2a10555916d6be32Andreas Huber if (eos) { 725681755fc0d0797506456f46a2a10555916d6be32Andreas Huber if (finalStatus == ERROR_END_OF_STREAM) { 726681755fc0d0797506456f46a2a10555916d6be32Andreas Huber notifyListener_l(MEDIA_BUFFERING_UPDATE, 100); 727681755fc0d0797506456f46a2a10555916d6be32Andreas Huber } 728681755fc0d0797506456f46a2a10555916d6be32Andreas Huber if (mFlags & PREPARING) { 7293856b090cd04ba5dd4a59a12430ed724d5995909Steve Block ALOGV("cache has reached EOS, prepare is done."); 730681755fc0d0797506456f46a2a10555916d6be32Andreas Huber finishAsyncPrepare_l(); 731681755fc0d0797506456f46a2a10555916d6be32Andreas Huber } 732681755fc0d0797506456f46a2a10555916d6be32Andreas Huber } else { 733681755fc0d0797506456f46a2a10555916d6be32Andreas Huber int percentage = 100.0 * (double)cachedDurationUs / mDurationUs; 734681755fc0d0797506456f46a2a10555916d6be32Andreas Huber if (percentage > 100) { 735681755fc0d0797506456f46a2a10555916d6be32Andreas Huber percentage = 100; 736681755fc0d0797506456f46a2a10555916d6be32Andreas Huber } 737681755fc0d0797506456f46a2a10555916d6be32Andreas Huber 738681755fc0d0797506456f46a2a10555916d6be32Andreas Huber notifyListener_l(MEDIA_BUFFERING_UPDATE, percentage); 739681755fc0d0797506456f46a2a10555916d6be32Andreas Huber } 7402415ecb5bb4e1459024f6d6c8ae2d6e3dc4fbdc7Andreas Huber } 7412415ecb5bb4e1459024f6d6c8ae2d6e3dc4fbdc7Andreas Huber 7428650e1960905097f6f1d6aa462ccb1c93c656834Andreas Huber int64_t cachedDurationUs; 7432a4b49bd3863024884a694b454e2e452752e6ea0Andreas Huber bool eos; 7448650e1960905097f6f1d6aa462ccb1c93c656834Andreas Huber if (getCachedDuration_l(&cachedDurationUs, &eos)) { 7453856b090cd04ba5dd4a59a12430ed724d5995909Steve Block ALOGV("cachedDurationUs = %.2f secs, eos=%d", 74634ef0f32c8fc0186236a27e07405328cc1f7c56dAndreas Huber cachedDurationUs / 1E6, eos); 74734ef0f32c8fc0186236a27e07405328cc1f7c56dAndreas Huber 7488650e1960905097f6f1d6aa462ccb1c93c656834Andreas Huber if ((mFlags & PLAYING) && !eos 7498650e1960905097f6f1d6aa462ccb1c93c656834Andreas Huber && (cachedDurationUs < kLowWaterMarkUs)) { 750df64d15042bbd5e0e4933ac49bf3c177dd94752cSteve Block ALOGI("cache is running low (%.2f secs) , pausing.", 7518650e1960905097f6f1d6aa462ccb1c93c656834Andreas Huber cachedDurationUs / 1E6); 752a0b1d4b161599c2bb2a47119e50c51e75bbe980eAndreas Huber modifyFlags(CACHE_UNDERRUN, SET); 7538650e1960905097f6f1d6aa462ccb1c93c656834Andreas Huber pause_l(); 75434ef0f32c8fc0186236a27e07405328cc1f7c56dAndreas Huber ensureCacheIsFetching_l(); 7555b1b8a93a07326f1cbc627f09e02988375189e0aJames Dong sendCacheStats(); 7568650e1960905097f6f1d6aa462ccb1c93c656834Andreas Huber notifyListener_l(MEDIA_INFO, MEDIA_INFO_BUFFERING_START); 7572bfdd428c56c7524d1a11979f200a1762866032dAndreas Huber } else if (eos || cachedDurationUs > kHighWaterMarkUs) { 7588650e1960905097f6f1d6aa462ccb1c93c656834Andreas Huber if (mFlags & CACHE_UNDERRUN) { 759df64d15042bbd5e0e4933ac49bf3c177dd94752cSteve Block ALOGI("cache has filled up (%.2f secs), resuming.", 7608650e1960905097f6f1d6aa462ccb1c93c656834Andreas Huber cachedDurationUs / 1E6); 761a0b1d4b161599c2bb2a47119e50c51e75bbe980eAndreas Huber modifyFlags(CACHE_UNDERRUN, CLEAR); 7628650e1960905097f6f1d6aa462ccb1c93c656834Andreas Huber play_l(); 7638650e1960905097f6f1d6aa462ccb1c93c656834Andreas Huber notifyListener_l(MEDIA_INFO, MEDIA_INFO_BUFFERING_END); 7648650e1960905097f6f1d6aa462ccb1c93c656834Andreas Huber } else if (mFlags & PREPARING) { 7653856b090cd04ba5dd4a59a12430ed724d5995909Steve Block ALOGV("cache has filled up (%.2f secs), prepare is done", 7668650e1960905097f6f1d6aa462ccb1c93c656834Andreas Huber cachedDurationUs / 1E6); 7678650e1960905097f6f1d6aa462ccb1c93c656834Andreas Huber finishAsyncPrepare_l(); 7682a4b49bd3863024884a694b454e2e452752e6ea0Andreas Huber } 7692a4b49bd3863024884a694b454e2e452752e6ea0Andreas Huber } 7700a5baa9b411fe086013d2a5e9126ed63fbad046cAndreas Huber } 7710a5baa9b411fe086013d2a5e9126ed63fbad046cAndreas Huber 7720a5baa9b411fe086013d2a5e9126ed63fbad046cAndreas Huber postBufferingEvent_l(); 7730726045216f576e97672ebeefc265d39c4ebaaa5Andreas Huber} 7740726045216f576e97672ebeefc265d39c4ebaaa5Andreas Huber 7755b1b8a93a07326f1cbc627f09e02988375189e0aJames Dongvoid AwesomePlayer::sendCacheStats() { 7765b1b8a93a07326f1cbc627f09e02988375189e0aJames Dong sp<MediaPlayerBase> listener = mListener.promote(); 777b33d2ac90cfce0fe6db8c3e979e7ae2bbfc28163James Dong if (listener != NULL && mCachedSource != NULL) { 7785b1b8a93a07326f1cbc627f09e02988375189e0aJames Dong int32_t kbps = 0; 7795b1b8a93a07326f1cbc627f09e02988375189e0aJames Dong status_t err = mCachedSource->getEstimatedBandwidthKbps(&kbps); 7805b1b8a93a07326f1cbc627f09e02988375189e0aJames Dong if (err == OK) { 7815b1b8a93a07326f1cbc627f09e02988375189e0aJames Dong listener->sendEvent( 7825b1b8a93a07326f1cbc627f09e02988375189e0aJames Dong MEDIA_INFO, MEDIA_INFO_NETWORK_BANDWIDTH, kbps); 7835b1b8a93a07326f1cbc627f09e02988375189e0aJames Dong } 7845b1b8a93a07326f1cbc627f09e02988375189e0aJames Dong } 7855b1b8a93a07326f1cbc627f09e02988375189e0aJames Dong} 7865b1b8a93a07326f1cbc627f09e02988375189e0aJames Dong 787bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Hubervoid AwesomePlayer::onStreamDone() { 788bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber // Posted whenever any stream finishes playing. 789bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber 790bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber Mutex::Autolock autoLock(mLock); 791d29345dfa29cdcc650f3705e43950ef2500f6728Andreas Huber if (!mStreamDoneEventPending) { 792d29345dfa29cdcc650f3705e43950ef2500f6728Andreas Huber return; 793d29345dfa29cdcc650f3705e43950ef2500f6728Andreas Huber } 794bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber mStreamDoneEventPending = false; 795bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber 796ed8d14f6a934072cd012992c4ef16990a54baa9aAndreas Huber if (mStreamDoneStatus != ERROR_END_OF_STREAM) { 7973856b090cd04ba5dd4a59a12430ed724d5995909Steve Block ALOGV("MEDIA_ERROR %d", mStreamDoneStatus); 7985d2de4da54504836e4b772b3010ac28c19f667f0Andreas Huber 7995d2de4da54504836e4b772b3010ac28c19f667f0Andreas Huber notifyListener_l( 8005d2de4da54504836e4b772b3010ac28c19f667f0Andreas Huber MEDIA_ERROR, MEDIA_ERROR_UNKNOWN, mStreamDoneStatus); 8015d2de4da54504836e4b772b3010ac28c19f667f0Andreas Huber 802b2e3954c94717e43b3dc9b880564f166cfbbc0a2Andreas Huber pause_l(true /* at eos */); 8035d2de4da54504836e4b772b3010ac28c19f667f0Andreas Huber 804a0b1d4b161599c2bb2a47119e50c51e75bbe980eAndreas Huber modifyFlags(AT_EOS, SET); 8055d2de4da54504836e4b772b3010ac28c19f667f0Andreas Huber return; 8065d2de4da54504836e4b772b3010ac28c19f667f0Andreas Huber } 8075d2de4da54504836e4b772b3010ac28c19f667f0Andreas Huber 8085d2de4da54504836e4b772b3010ac28c19f667f0Andreas Huber const bool allDone = 8095d2de4da54504836e4b772b3010ac28c19f667f0Andreas Huber (mVideoSource == NULL || (mFlags & VIDEO_AT_EOS)) 8105d2de4da54504836e4b772b3010ac28c19f667f0Andreas Huber && (mAudioSource == NULL || (mFlags & AUDIO_AT_EOS)); 8115d2de4da54504836e4b772b3010ac28c19f667f0Andreas Huber 8125d2de4da54504836e4b772b3010ac28c19f667f0Andreas Huber if (!allDone) { 8135d2de4da54504836e4b772b3010ac28c19f667f0Andreas Huber return; 8145d2de4da54504836e4b772b3010ac28c19f667f0Andreas Huber } 8155d2de4da54504836e4b772b3010ac28c19f667f0Andreas Huber 816cdef698dae0c6dd89755f6494cc3d4b163f410efAndreas Huber if ((mFlags & LOOPING) 817cdef698dae0c6dd89755f6494cc3d4b163f410efAndreas Huber || ((mFlags & AUTO_LOOPING) 818cdef698dae0c6dd89755f6494cc3d4b163f410efAndreas Huber && (mAudioSink == NULL || mAudioSink->realtime()))) { 819cdef698dae0c6dd89755f6494cc3d4b163f410efAndreas Huber // Don't AUTO_LOOP if we're being recorded, since that cannot be 820cdef698dae0c6dd89755f6494cc3d4b163f410efAndreas Huber // turned off and recording would go on indefinitely. 821cdef698dae0c6dd89755f6494cc3d4b163f410efAndreas Huber 822bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber seekTo_l(0); 823bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber 824a657f8deaf21acbe5faba7be1df9c6681d44d471Andreas Huber if (mVideoSource != NULL) { 825bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber postVideoEvent_l(); 826bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber } 827bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber } else { 8283856b090cd04ba5dd4a59a12430ed724d5995909Steve Block ALOGV("MEDIA_PLAYBACK_COMPLETE"); 8295d2de4da54504836e4b772b3010ac28c19f667f0Andreas Huber notifyListener_l(MEDIA_PLAYBACK_COMPLETE); 830bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber 831b2e3954c94717e43b3dc9b880564f166cfbbc0a2Andreas Huber pause_l(true /* at eos */); 8322e8ffaf95bd35358ecd14ddf00cddaf3abefe0a9Andreas Huber 833a0b1d4b161599c2bb2a47119e50c51e75bbe980eAndreas Huber modifyFlags(AT_EOS, SET); 834bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber } 835bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber} 836bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber 837bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huberstatus_t AwesomePlayer::play() { 838bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber Mutex::Autolock autoLock(mLock); 8390a5baa9b411fe086013d2a5e9126ed63fbad046cAndreas Huber 840a0b1d4b161599c2bb2a47119e50c51e75bbe980eAndreas Huber modifyFlags(CACHE_UNDERRUN, CLEAR); 8410a5baa9b411fe086013d2a5e9126ed63fbad046cAndreas Huber 8427b3396acc702451be9bafb19d7fe26d55d43a316Andreas Huber return play_l(); 8437b3396acc702451be9bafb19d7fe26d55d43a316Andreas Huber} 844bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber 8457b3396acc702451be9bafb19d7fe26d55d43a316Andreas Huberstatus_t AwesomePlayer::play_l() { 846a0b1d4b161599c2bb2a47119e50c51e75bbe980eAndreas Huber modifyFlags(SEEK_PREVIEW, CLEAR); 8472b1222f8938356669672f35e0e53e176c78c40efAndreas Huber 848bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber if (mFlags & PLAYING) { 849bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber return OK; 850bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber } 851bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber 852bd22c52280179b29eefac91ef7e7bbbc33d25904Andreas Huber if (!(mFlags & PREPARED)) { 853bd22c52280179b29eefac91ef7e7bbbc33d25904Andreas Huber status_t err = prepare_l(); 854bd22c52280179b29eefac91ef7e7bbbc33d25904Andreas Huber 855bd22c52280179b29eefac91ef7e7bbbc33d25904Andreas Huber if (err != OK) { 856bd22c52280179b29eefac91ef7e7bbbc33d25904Andreas Huber return err; 857bd22c52280179b29eefac91ef7e7bbbc33d25904Andreas Huber } 858bd22c52280179b29eefac91ef7e7bbbc33d25904Andreas Huber } 859bd22c52280179b29eefac91ef7e7bbbc33d25904Andreas Huber 860a0b1d4b161599c2bb2a47119e50c51e75bbe980eAndreas Huber modifyFlags(PLAYING, SET); 861a0b1d4b161599c2bb2a47119e50c51e75bbe980eAndreas Huber modifyFlags(FIRST_FRAME, SET); 862bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber 863c130b5bf563d049bd391ccd96985ac278ef8ff8dGloria Wang if (mDecryptHandle != NULL) { 864c130b5bf563d049bd391ccd96985ac278ef8ff8dGloria Wang int64_t position; 865c130b5bf563d049bd391ccd96985ac278ef8ff8dGloria Wang getPosition(&position); 866c130b5bf563d049bd391ccd96985ac278ef8ff8dGloria Wang mDrmManagerClient->setPlaybackStatus(mDecryptHandle, 867c130b5bf563d049bd391ccd96985ac278ef8ff8dGloria Wang Playback::START, position / 1000); 868c130b5bf563d049bd391ccd96985ac278ef8ff8dGloria Wang } 869c130b5bf563d049bd391ccd96985ac278ef8ff8dGloria Wang 870bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber if (mAudioSource != NULL) { 871bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber if (mAudioPlayer == NULL) { 872bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber if (mAudioSink != NULL) { 873ed54ad0f8619ae416b0968ade6248894cbfc4dbaAndreas Huber mAudioPlayer = new AudioPlayer(mAudioSink, this); 874bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber mAudioPlayer->setSource(mAudioSource); 875e7e3b785a0e7819db4c895a4f60e9a4dd755880cAndreas Huber 876f03034408506051f2f836e59305fcd5f662bf19aAndreas Huber mTimeSource = mAudioPlayer; 87788c030e0e0152791ff74f90249f55fce01371198Andreas Huber 878b874cd085bba63528c570f74c493bfea835190d9Andreas Huber // If there was a seek request before we ever started, 879b874cd085bba63528c570f74c493bfea835190d9Andreas Huber // honor the request now. 880b874cd085bba63528c570f74c493bfea835190d9Andreas Huber // Make sure to do this before starting the audio player 881b874cd085bba63528c570f74c493bfea835190d9Andreas Huber // to avoid a race condition. 882b874cd085bba63528c570f74c493bfea835190d9Andreas Huber seekAudioIfNecessary_l(); 883f03034408506051f2f836e59305fcd5f662bf19aAndreas Huber } 884f03034408506051f2f836e59305fcd5f662bf19aAndreas Huber } 88588c030e0e0152791ff74f90249f55fce01371198Andreas Huber 886f03034408506051f2f836e59305fcd5f662bf19aAndreas Huber CHECK(!(mFlags & AUDIO_RUNNING)); 887c130b5bf563d049bd391ccd96985ac278ef8ff8dGloria Wang 888f03034408506051f2f836e59305fcd5f662bf19aAndreas Huber if (mVideoSource == NULL) { 8895442cb59e8483e18b3a02400d431d167ea7074b3Andreas Huber // We don't want to post an error notification at this point, 8905442cb59e8483e18b3a02400d431d167ea7074b3Andreas Huber // the error returned from MediaPlayer::start() will suffice. 8915442cb59e8483e18b3a02400d431d167ea7074b3Andreas Huber 8925442cb59e8483e18b3a02400d431d167ea7074b3Andreas Huber status_t err = startAudioPlayer_l( 8935442cb59e8483e18b3a02400d431d167ea7074b3Andreas Huber false /* sendErrorNotification */); 894bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber 895f03034408506051f2f836e59305fcd5f662bf19aAndreas Huber if (err != OK) { 896f03034408506051f2f836e59305fcd5f662bf19aAndreas Huber delete mAudioPlayer; 897f03034408506051f2f836e59305fcd5f662bf19aAndreas Huber mAudioPlayer = NULL; 898bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber 899a0b1d4b161599c2bb2a47119e50c51e75bbe980eAndreas Huber modifyFlags((PLAYING | FIRST_FRAME), CLEAR); 9001862a33b246249630b654182afb5914da3480d4cAndreas Huber 901f03034408506051f2f836e59305fcd5f662bf19aAndreas Huber if (mDecryptHandle != NULL) { 902f03034408506051f2f836e59305fcd5f662bf19aAndreas Huber mDrmManagerClient->setPlaybackStatus( 903f03034408506051f2f836e59305fcd5f662bf19aAndreas Huber mDecryptHandle, Playback::STOP, 0); 904f03034408506051f2f836e59305fcd5f662bf19aAndreas Huber } 905f03034408506051f2f836e59305fcd5f662bf19aAndreas Huber 906f03034408506051f2f836e59305fcd5f662bf19aAndreas Huber return err; 907bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber } 908bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber } 909bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber } 910bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber 911bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber if (mTimeSource == NULL && mAudioPlayer == NULL) { 9125d2de4da54504836e4b772b3010ac28c19f667f0Andreas Huber mTimeSource = &mSystemTimeSource; 913bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber } 914bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber 915bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber if (mVideoSource != NULL) { 916a657f8deaf21acbe5faba7be1df9c6681d44d471Andreas Huber // Kick off video playback 917a657f8deaf21acbe5faba7be1df9c6681d44d471Andreas Huber postVideoEvent_l(); 918145e68fc778275963189b02a1adcbe27cce4d769Andreas Huber 919145e68fc778275963189b02a1adcbe27cce4d769Andreas Huber if (mAudioSource != NULL && mVideoSource != NULL) { 920145e68fc778275963189b02a1adcbe27cce4d769Andreas Huber postVideoLagEvent_l(); 921145e68fc778275963189b02a1adcbe27cce4d769Andreas Huber } 922bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber } 923bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber 9242e8ffaf95bd35358ecd14ddf00cddaf3abefe0a9Andreas Huber if (mFlags & AT_EOS) { 9252e8ffaf95bd35358ecd14ddf00cddaf3abefe0a9Andreas Huber // Legacy behaviour, if a stream finishes playing and then 9262e8ffaf95bd35358ecd14ddf00cddaf3abefe0a9Andreas Huber // is started again, we play from the start... 9272e8ffaf95bd35358ecd14ddf00cddaf3abefe0a9Andreas Huber seekTo_l(0); 9282e8ffaf95bd35358ecd14ddf00cddaf3abefe0a9Andreas Huber } 9292e8ffaf95bd35358ecd14ddf00cddaf3abefe0a9Andreas Huber 9307cf180c9bff69e5cc4a2f4e53b432db45ebbebabGloria Wang uint32_t params = IMediaPlayerService::kBatteryDataCodecStarted 9317cf180c9bff69e5cc4a2f4e53b432db45ebbebabGloria Wang | IMediaPlayerService::kBatteryDataTrackDecoder; 9327cf180c9bff69e5cc4a2f4e53b432db45ebbebabGloria Wang if ((mAudioSource != NULL) && (mAudioSource != mAudioTrack)) { 9337cf180c9bff69e5cc4a2f4e53b432db45ebbebabGloria Wang params |= IMediaPlayerService::kBatteryDataTrackAudio; 9347cf180c9bff69e5cc4a2f4e53b432db45ebbebabGloria Wang } 9357cf180c9bff69e5cc4a2f4e53b432db45ebbebabGloria Wang if (mVideoSource != NULL) { 9367cf180c9bff69e5cc4a2f4e53b432db45ebbebabGloria Wang params |= IMediaPlayerService::kBatteryDataTrackVideo; 9377cf180c9bff69e5cc4a2f4e53b432db45ebbebabGloria Wang } 9387cf180c9bff69e5cc4a2f4e53b432db45ebbebabGloria Wang addBatteryData(params); 9397cf180c9bff69e5cc4a2f4e53b432db45ebbebabGloria Wang 940bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber return OK; 941bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber} 942bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber 9435442cb59e8483e18b3a02400d431d167ea7074b3Andreas Huberstatus_t AwesomePlayer::startAudioPlayer_l(bool sendErrorNotification) { 944f03034408506051f2f836e59305fcd5f662bf19aAndreas Huber CHECK(!(mFlags & AUDIO_RUNNING)); 945f03034408506051f2f836e59305fcd5f662bf19aAndreas Huber 946f03034408506051f2f836e59305fcd5f662bf19aAndreas Huber if (mAudioSource == NULL || mAudioPlayer == NULL) { 947f03034408506051f2f836e59305fcd5f662bf19aAndreas Huber return OK; 948f03034408506051f2f836e59305fcd5f662bf19aAndreas Huber } 949f03034408506051f2f836e59305fcd5f662bf19aAndreas Huber 950f03034408506051f2f836e59305fcd5f662bf19aAndreas Huber if (!(mFlags & AUDIOPLAYER_STARTED)) { 951a0b1d4b161599c2bb2a47119e50c51e75bbe980eAndreas Huber modifyFlags(AUDIOPLAYER_STARTED, SET); 952f03034408506051f2f836e59305fcd5f662bf19aAndreas Huber 953c0dfc5b02d4179769bbdd25c10d430576ec09568Andreas Huber bool wasSeeking = mAudioPlayer->isSeeking(); 954c0dfc5b02d4179769bbdd25c10d430576ec09568Andreas Huber 955f03034408506051f2f836e59305fcd5f662bf19aAndreas Huber // We've already started the MediaSource in order to enable 956f03034408506051f2f836e59305fcd5f662bf19aAndreas Huber // the prefetcher to read its data. 957f03034408506051f2f836e59305fcd5f662bf19aAndreas Huber status_t err = mAudioPlayer->start( 958f03034408506051f2f836e59305fcd5f662bf19aAndreas Huber true /* sourceAlreadyStarted */); 959f03034408506051f2f836e59305fcd5f662bf19aAndreas Huber 960f03034408506051f2f836e59305fcd5f662bf19aAndreas Huber if (err != OK) { 9615442cb59e8483e18b3a02400d431d167ea7074b3Andreas Huber if (sendErrorNotification) { 9625442cb59e8483e18b3a02400d431d167ea7074b3Andreas Huber notifyListener_l(MEDIA_ERROR, MEDIA_ERROR_UNKNOWN, err); 9635442cb59e8483e18b3a02400d431d167ea7074b3Andreas Huber } 9645442cb59e8483e18b3a02400d431d167ea7074b3Andreas Huber 965f03034408506051f2f836e59305fcd5f662bf19aAndreas Huber return err; 966f03034408506051f2f836e59305fcd5f662bf19aAndreas Huber } 967c0dfc5b02d4179769bbdd25c10d430576ec09568Andreas Huber 968c0dfc5b02d4179769bbdd25c10d430576ec09568Andreas Huber if (wasSeeking) { 969c0dfc5b02d4179769bbdd25c10d430576ec09568Andreas Huber CHECK(!mAudioPlayer->isSeeking()); 970c0dfc5b02d4179769bbdd25c10d430576ec09568Andreas Huber 971c0dfc5b02d4179769bbdd25c10d430576ec09568Andreas Huber // We will have finished the seek while starting the audio player. 97202f6e988107bc13ebe4828b734ea0fc3d9d11ae0Andreas Huber postAudioSeekComplete(); 973c0dfc5b02d4179769bbdd25c10d430576ec09568Andreas Huber } 974f03034408506051f2f836e59305fcd5f662bf19aAndreas Huber } else { 975f03034408506051f2f836e59305fcd5f662bf19aAndreas Huber mAudioPlayer->resume(); 976f03034408506051f2f836e59305fcd5f662bf19aAndreas Huber } 977f03034408506051f2f836e59305fcd5f662bf19aAndreas Huber 978a0b1d4b161599c2bb2a47119e50c51e75bbe980eAndreas Huber modifyFlags(AUDIO_RUNNING, SET); 979f03034408506051f2f836e59305fcd5f662bf19aAndreas Huber 980f03034408506051f2f836e59305fcd5f662bf19aAndreas Huber mWatchForAudioEOS = true; 981f03034408506051f2f836e59305fcd5f662bf19aAndreas Huber 982f03034408506051f2f836e59305fcd5f662bf19aAndreas Huber return OK; 983f03034408506051f2f836e59305fcd5f662bf19aAndreas Huber} 984f03034408506051f2f836e59305fcd5f662bf19aAndreas Huber 9855daeb129a2c2ba3d14ccd94af283b5f561c783eaAndreas Hubervoid AwesomePlayer::notifyVideoSize_l() { 9865daeb129a2c2ba3d14ccd94af283b5f561c783eaAndreas Huber sp<MetaData> meta = mVideoSource->getFormat(); 9875daeb129a2c2ba3d14ccd94af283b5f561c783eaAndreas Huber 988f5ab57c2d5e02af7483c94eddb177e4f5c9e9892Andreas Huber int32_t cropLeft, cropTop, cropRight, cropBottom; 989f5ab57c2d5e02af7483c94eddb177e4f5c9e9892Andreas Huber if (!meta->findRect( 990f5ab57c2d5e02af7483c94eddb177e4f5c9e9892Andreas Huber kKeyCropRect, &cropLeft, &cropTop, &cropRight, &cropBottom)) { 991f5ab57c2d5e02af7483c94eddb177e4f5c9e9892Andreas Huber int32_t width, height; 992f5ab57c2d5e02af7483c94eddb177e4f5c9e9892Andreas Huber CHECK(meta->findInt32(kKeyWidth, &width)); 993f5ab57c2d5e02af7483c94eddb177e4f5c9e9892Andreas Huber CHECK(meta->findInt32(kKeyHeight, &height)); 994f5ab57c2d5e02af7483c94eddb177e4f5c9e9892Andreas Huber 995f5ab57c2d5e02af7483c94eddb177e4f5c9e9892Andreas Huber cropLeft = cropTop = 0; 996f5ab57c2d5e02af7483c94eddb177e4f5c9e9892Andreas Huber cropRight = width - 1; 997f5ab57c2d5e02af7483c94eddb177e4f5c9e9892Andreas Huber cropBottom = height - 1; 998f5ab57c2d5e02af7483c94eddb177e4f5c9e9892Andreas Huber 9993856b090cd04ba5dd4a59a12430ed724d5995909Steve Block ALOGV("got dimensions only %d x %d", width, height); 1000f5ab57c2d5e02af7483c94eddb177e4f5c9e9892Andreas Huber } else { 10013856b090cd04ba5dd4a59a12430ed724d5995909Steve Block ALOGV("got crop rect %d, %d, %d, %d", 1002f5ab57c2d5e02af7483c94eddb177e4f5c9e9892Andreas Huber cropLeft, cropTop, cropRight, cropBottom); 1003f5ab57c2d5e02af7483c94eddb177e4f5c9e9892Andreas Huber } 1004f5ab57c2d5e02af7483c94eddb177e4f5c9e9892Andreas Huber 10059cbb1a6f99003a9cd8765e11b9d7380e67839f82James Dong int32_t displayWidth; 10069cbb1a6f99003a9cd8765e11b9d7380e67839f82James Dong if (meta->findInt32(kKeyDisplayWidth, &displayWidth)) { 10073856b090cd04ba5dd4a59a12430ed724d5995909Steve Block ALOGV("Display width changed (%d=>%d)", mDisplayWidth, displayWidth); 10089cbb1a6f99003a9cd8765e11b9d7380e67839f82James Dong mDisplayWidth = displayWidth; 10099cbb1a6f99003a9cd8765e11b9d7380e67839f82James Dong } 10109cbb1a6f99003a9cd8765e11b9d7380e67839f82James Dong int32_t displayHeight; 10119cbb1a6f99003a9cd8765e11b9d7380e67839f82James Dong if (meta->findInt32(kKeyDisplayHeight, &displayHeight)) { 10123856b090cd04ba5dd4a59a12430ed724d5995909Steve Block ALOGV("Display height changed (%d=>%d)", mDisplayHeight, displayHeight); 10139cbb1a6f99003a9cd8765e11b9d7380e67839f82James Dong mDisplayHeight = displayHeight; 10149cbb1a6f99003a9cd8765e11b9d7380e67839f82James Dong } 10159cbb1a6f99003a9cd8765e11b9d7380e67839f82James Dong 1016f5ab57c2d5e02af7483c94eddb177e4f5c9e9892Andreas Huber int32_t usableWidth = cropRight - cropLeft + 1; 1017f5ab57c2d5e02af7483c94eddb177e4f5c9e9892Andreas Huber int32_t usableHeight = cropBottom - cropTop + 1; 1018b45c01c2b8588ff431b511151666a55a39f0a6aeJames Dong if (mDisplayWidth != 0) { 1019b45c01c2b8588ff431b511151666a55a39f0a6aeJames Dong usableWidth = mDisplayWidth; 1020b45c01c2b8588ff431b511151666a55a39f0a6aeJames Dong } 1021b45c01c2b8588ff431b511151666a55a39f0a6aeJames Dong if (mDisplayHeight != 0) { 1022b45c01c2b8588ff431b511151666a55a39f0a6aeJames Dong usableHeight = mDisplayHeight; 1023b45c01c2b8588ff431b511151666a55a39f0a6aeJames Dong } 10245daeb129a2c2ba3d14ccd94af283b5f561c783eaAndreas Huber 1025a0b1d4b161599c2bb2a47119e50c51e75bbe980eAndreas Huber { 1026a0b1d4b161599c2bb2a47119e50c51e75bbe980eAndreas Huber Mutex::Autolock autoLock(mStatsLock); 1027a0b1d4b161599c2bb2a47119e50c51e75bbe980eAndreas Huber mStats.mVideoWidth = usableWidth; 1028a0b1d4b161599c2bb2a47119e50c51e75bbe980eAndreas Huber mStats.mVideoHeight = usableHeight; 1029a0b1d4b161599c2bb2a47119e50c51e75bbe980eAndreas Huber } 1030a0b1d4b161599c2bb2a47119e50c51e75bbe980eAndreas Huber 1031ba529e486dde15fe75ea1b48570f9d60a4cf3c48Andreas Huber int32_t rotationDegrees; 1032ba529e486dde15fe75ea1b48570f9d60a4cf3c48Andreas Huber if (!mVideoTrack->getFormat()->findInt32( 1033ba529e486dde15fe75ea1b48570f9d60a4cf3c48Andreas Huber kKeyRotation, &rotationDegrees)) { 1034ba529e486dde15fe75ea1b48570f9d60a4cf3c48Andreas Huber rotationDegrees = 0; 1035ba529e486dde15fe75ea1b48570f9d60a4cf3c48Andreas Huber } 1036ba529e486dde15fe75ea1b48570f9d60a4cf3c48Andreas Huber 1037ba529e486dde15fe75ea1b48570f9d60a4cf3c48Andreas Huber if (rotationDegrees == 90 || rotationDegrees == 270) { 1038ba529e486dde15fe75ea1b48570f9d60a4cf3c48Andreas Huber notifyListener_l( 1039f5ab57c2d5e02af7483c94eddb177e4f5c9e9892Andreas Huber MEDIA_SET_VIDEO_SIZE, usableHeight, usableWidth); 1040ba529e486dde15fe75ea1b48570f9d60a4cf3c48Andreas Huber } else { 1041ba529e486dde15fe75ea1b48570f9d60a4cf3c48Andreas Huber notifyListener_l( 1042f5ab57c2d5e02af7483c94eddb177e4f5c9e9892Andreas Huber MEDIA_SET_VIDEO_SIZE, usableWidth, usableHeight); 1043ba529e486dde15fe75ea1b48570f9d60a4cf3c48Andreas Huber } 10445daeb129a2c2ba3d14ccd94af283b5f561c783eaAndreas Huber} 10455daeb129a2c2ba3d14ccd94af283b5f561c783eaAndreas Huber 1046bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Hubervoid AwesomePlayer::initRenderer_l() { 10471173118eace0e9e347cb007f0da817cee87579edGlenn Kasten if (mNativeWindow == NULL) { 10480a5ca668c6f7d45706e9aec4a1dfec0aacc6d233Andreas Huber return; 10490a5ca668c6f7d45706e9aec4a1dfec0aacc6d233Andreas Huber } 1050bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber 10510a5ca668c6f7d45706e9aec4a1dfec0aacc6d233Andreas Huber sp<MetaData> meta = mVideoSource->getFormat(); 1052bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber 10530a5ca668c6f7d45706e9aec4a1dfec0aacc6d233Andreas Huber int32_t format; 10540a5ca668c6f7d45706e9aec4a1dfec0aacc6d233Andreas Huber const char *component; 10550a5ca668c6f7d45706e9aec4a1dfec0aacc6d233Andreas Huber int32_t decodedWidth, decodedHeight; 10560a5ca668c6f7d45706e9aec4a1dfec0aacc6d233Andreas Huber CHECK(meta->findInt32(kKeyColorFormat, &format)); 10570a5ca668c6f7d45706e9aec4a1dfec0aacc6d233Andreas Huber CHECK(meta->findCString(kKeyDecoderComponent, &component)); 10580a5ca668c6f7d45706e9aec4a1dfec0aacc6d233Andreas Huber CHECK(meta->findInt32(kKeyWidth, &decodedWidth)); 10590a5ca668c6f7d45706e9aec4a1dfec0aacc6d233Andreas Huber CHECK(meta->findInt32(kKeyHeight, &decodedHeight)); 10604844ac54e8b5997c3b03872dbafe8ebed4787517Andreas Huber 1061ba529e486dde15fe75ea1b48570f9d60a4cf3c48Andreas Huber int32_t rotationDegrees; 1062ba529e486dde15fe75ea1b48570f9d60a4cf3c48Andreas Huber if (!mVideoTrack->getFormat()->findInt32( 1063ba529e486dde15fe75ea1b48570f9d60a4cf3c48Andreas Huber kKeyRotation, &rotationDegrees)) { 1064ba529e486dde15fe75ea1b48570f9d60a4cf3c48Andreas Huber rotationDegrees = 0; 1065ba529e486dde15fe75ea1b48570f9d60a4cf3c48Andreas Huber } 1066ba529e486dde15fe75ea1b48570f9d60a4cf3c48Andreas Huber 10670a5ca668c6f7d45706e9aec4a1dfec0aacc6d233Andreas Huber mVideoRenderer.clear(); 10684844ac54e8b5997c3b03872dbafe8ebed4787517Andreas Huber 10690a5ca668c6f7d45706e9aec4a1dfec0aacc6d233Andreas Huber // Must ensure that mVideoRenderer's destructor is actually executed 10700a5ca668c6f7d45706e9aec4a1dfec0aacc6d233Andreas Huber // before creating a new one. 10710a5ca668c6f7d45706e9aec4a1dfec0aacc6d233Andreas Huber IPCThreadState::self()->flushCommands(); 10720a5ca668c6f7d45706e9aec4a1dfec0aacc6d233Andreas Huber 1073bbba88cb1bdc34705d1477208990a06904c022e7Andreas Huber if (USE_SURFACE_ALLOC 1074bbba88cb1bdc34705d1477208990a06904c022e7Andreas Huber && !strncmp(component, "OMX.", 4) 10752944eca607304a095ea43ba2b8f0b9de61249f9fAndreas Huber && strncmp(component, "OMX.google.", 11) 10762944eca607304a095ea43ba2b8f0b9de61249f9fAndreas Huber && strcmp(component, "OMX.Nvidia.mpeg2v.decode")) { 10770a5ca668c6f7d45706e9aec4a1dfec0aacc6d233Andreas Huber // Hardware decoders avoid the CPU color conversion by decoding 10780a5ca668c6f7d45706e9aec4a1dfec0aacc6d233Andreas Huber // directly to ANativeBuffers, so we must use a renderer that 10790a5ca668c6f7d45706e9aec4a1dfec0aacc6d233Andreas Huber // just pushes those buffers to the ANativeWindow. 1080ba529e486dde15fe75ea1b48570f9d60a4cf3c48Andreas Huber mVideoRenderer = 10811173118eace0e9e347cb007f0da817cee87579edGlenn Kasten new AwesomeNativeWindowRenderer(mNativeWindow, rotationDegrees); 10820a5ca668c6f7d45706e9aec4a1dfec0aacc6d233Andreas Huber } else { 10830a5ca668c6f7d45706e9aec4a1dfec0aacc6d233Andreas Huber // Other decoders are instantiated locally and as a consequence 10840a5ca668c6f7d45706e9aec4a1dfec0aacc6d233Andreas Huber // allocate their buffers in local address space. This renderer 10850a5ca668c6f7d45706e9aec4a1dfec0aacc6d233Andreas Huber // then performs a color conversion and copy to get the data 10860a5ca668c6f7d45706e9aec4a1dfec0aacc6d233Andreas Huber // into the ANativeBuffer. 10871173118eace0e9e347cb007f0da817cee87579edGlenn Kasten mVideoRenderer = new AwesomeLocalRenderer(mNativeWindow, meta); 1088bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber } 1089bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber} 1090bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber 1091bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huberstatus_t AwesomePlayer::pause() { 1092bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber Mutex::Autolock autoLock(mLock); 10930a5baa9b411fe086013d2a5e9126ed63fbad046cAndreas Huber 1094a0b1d4b161599c2bb2a47119e50c51e75bbe980eAndreas Huber modifyFlags(CACHE_UNDERRUN, CLEAR); 10950a5baa9b411fe086013d2a5e9126ed63fbad046cAndreas Huber 1096bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber return pause_l(); 1097bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber} 1098bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber 1099b2e3954c94717e43b3dc9b880564f166cfbbc0a2Andreas Huberstatus_t AwesomePlayer::pause_l(bool at_eos) { 1100bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber if (!(mFlags & PLAYING)) { 1101bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber return OK; 1102bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber } 1103bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber 1104c34233e673c9791e137456d0c427d58db184b690Andreas Huber cancelPlayerEvents(true /* keepNotifications */); 1105bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber 1106f03034408506051f2f836e59305fcd5f662bf19aAndreas Huber if (mAudioPlayer != NULL && (mFlags & AUDIO_RUNNING)) { 1107b2e3954c94717e43b3dc9b880564f166cfbbc0a2Andreas Huber if (at_eos) { 1108b2e3954c94717e43b3dc9b880564f166cfbbc0a2Andreas Huber // If we played the audio stream to completion we 1109b2e3954c94717e43b3dc9b880564f166cfbbc0a2Andreas Huber // want to make sure that all samples remaining in the audio 1110b2e3954c94717e43b3dc9b880564f166cfbbc0a2Andreas Huber // track's queue are played out. 1111b2e3954c94717e43b3dc9b880564f166cfbbc0a2Andreas Huber mAudioPlayer->pause(true /* playPendingSamples */); 1112b2e3954c94717e43b3dc9b880564f166cfbbc0a2Andreas Huber } else { 1113b2e3954c94717e43b3dc9b880564f166cfbbc0a2Andreas Huber mAudioPlayer->pause(); 1114b2e3954c94717e43b3dc9b880564f166cfbbc0a2Andreas Huber } 1115f03034408506051f2f836e59305fcd5f662bf19aAndreas Huber 1116a0b1d4b161599c2bb2a47119e50c51e75bbe980eAndreas Huber modifyFlags(AUDIO_RUNNING, CLEAR); 1117bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber } 1118bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber 1119f9d660a5e0196240add5daf0199f128d471e592cInsun Kang if (mFlags & TEXTPLAYER_INITIALIZED) { 11206655174826330afe66ef766258181ae8c11f3f6cInsun Kang mTextDriver->pause(); 1121a0b1d4b161599c2bb2a47119e50c51e75bbe980eAndreas Huber modifyFlags(TEXT_RUNNING, CLEAR); 11227a1e3e81264189e23a1db2b174e1b5a5d4c7d1c3Gloria Wang } 11237a1e3e81264189e23a1db2b174e1b5a5d4c7d1c3Gloria Wang 1124a0b1d4b161599c2bb2a47119e50c51e75bbe980eAndreas Huber modifyFlags(PLAYING, CLEAR); 1125bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber 1126dcd25efb46c41c8d24a0a9cf61fb57f84149709eGloria Wang if (mDecryptHandle != NULL) { 1127dcd25efb46c41c8d24a0a9cf61fb57f84149709eGloria Wang mDrmManagerClient->setPlaybackStatus(mDecryptHandle, 1128dcd25efb46c41c8d24a0a9cf61fb57f84149709eGloria Wang Playback::PAUSE, 0); 1129dcd25efb46c41c8d24a0a9cf61fb57f84149709eGloria Wang } 1130dcd25efb46c41c8d24a0a9cf61fb57f84149709eGloria Wang 11317cf180c9bff69e5cc4a2f4e53b432db45ebbebabGloria Wang uint32_t params = IMediaPlayerService::kBatteryDataTrackDecoder; 11327cf180c9bff69e5cc4a2f4e53b432db45ebbebabGloria Wang if ((mAudioSource != NULL) && (mAudioSource != mAudioTrack)) { 11337cf180c9bff69e5cc4a2f4e53b432db45ebbebabGloria Wang params |= IMediaPlayerService::kBatteryDataTrackAudio; 11347cf180c9bff69e5cc4a2f4e53b432db45ebbebabGloria Wang } 11357cf180c9bff69e5cc4a2f4e53b432db45ebbebabGloria Wang if (mVideoSource != NULL) { 11367cf180c9bff69e5cc4a2f4e53b432db45ebbebabGloria Wang params |= IMediaPlayerService::kBatteryDataTrackVideo; 11377cf180c9bff69e5cc4a2f4e53b432db45ebbebabGloria Wang } 11387cf180c9bff69e5cc4a2f4e53b432db45ebbebabGloria Wang 11397cf180c9bff69e5cc4a2f4e53b432db45ebbebabGloria Wang addBatteryData(params); 11407cf180c9bff69e5cc4a2f4e53b432db45ebbebabGloria Wang 1141bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber return OK; 1142bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber} 1143bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber 1144bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huberbool AwesomePlayer::isPlaying() const { 11450a5baa9b411fe086013d2a5e9126ed63fbad046cAndreas Huber return (mFlags & PLAYING) || (mFlags & CACHE_UNDERRUN); 1146bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber} 1147bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber 114863970b42f101c87db7cfd26d43b0d300260b1582Andreas Huberstatus_t AwesomePlayer::setSurfaceTexture(const sp<ISurfaceTexture> &surfaceTexture) { 11491173118eace0e9e347cb007f0da817cee87579edGlenn Kasten Mutex::Autolock autoLock(mLock); 11501173118eace0e9e347cb007f0da817cee87579edGlenn Kasten 115163970b42f101c87db7cfd26d43b0d300260b1582Andreas Huber status_t err; 11521173118eace0e9e347cb007f0da817cee87579edGlenn Kasten if (surfaceTexture != NULL) { 115363970b42f101c87db7cfd26d43b0d300260b1582Andreas Huber err = setNativeWindow_l(new SurfaceTextureClient(surfaceTexture)); 115480ec929862bcfe8582984f3a28e7a4ca5f4f27bbGloria Wang } else { 115563970b42f101c87db7cfd26d43b0d300260b1582Andreas Huber err = setNativeWindow_l(NULL); 11561173118eace0e9e347cb007f0da817cee87579edGlenn Kasten } 115763970b42f101c87db7cfd26d43b0d300260b1582Andreas Huber 115863970b42f101c87db7cfd26d43b0d300260b1582Andreas Huber return err; 1159150694cda0842d38a9358fe8d1fcb4fb4a76599eAndreas Huber} 11601173118eace0e9e347cb007f0da817cee87579edGlenn Kasten 1161150694cda0842d38a9358fe8d1fcb4fb4a76599eAndreas Hubervoid AwesomePlayer::shutdownVideoDecoder_l() { 1162150694cda0842d38a9358fe8d1fcb4fb4a76599eAndreas Huber if (mVideoBuffer) { 1163150694cda0842d38a9358fe8d1fcb4fb4a76599eAndreas Huber mVideoBuffer->release(); 1164150694cda0842d38a9358fe8d1fcb4fb4a76599eAndreas Huber mVideoBuffer = NULL; 1165150694cda0842d38a9358fe8d1fcb4fb4a76599eAndreas Huber } 1166150694cda0842d38a9358fe8d1fcb4fb4a76599eAndreas Huber 1167150694cda0842d38a9358fe8d1fcb4fb4a76599eAndreas Huber mVideoSource->stop(); 1168150694cda0842d38a9358fe8d1fcb4fb4a76599eAndreas Huber 1169150694cda0842d38a9358fe8d1fcb4fb4a76599eAndreas Huber // The following hack is necessary to ensure that the OMX 1170150694cda0842d38a9358fe8d1fcb4fb4a76599eAndreas Huber // component is completely released by the time we may try 1171150694cda0842d38a9358fe8d1fcb4fb4a76599eAndreas Huber // to instantiate it again. 1172150694cda0842d38a9358fe8d1fcb4fb4a76599eAndreas Huber wp<MediaSource> tmp = mVideoSource; 1173150694cda0842d38a9358fe8d1fcb4fb4a76599eAndreas Huber mVideoSource.clear(); 1174150694cda0842d38a9358fe8d1fcb4fb4a76599eAndreas Huber while (tmp.promote() != NULL) { 1175150694cda0842d38a9358fe8d1fcb4fb4a76599eAndreas Huber usleep(1000); 1176150694cda0842d38a9358fe8d1fcb4fb4a76599eAndreas Huber } 1177150694cda0842d38a9358fe8d1fcb4fb4a76599eAndreas Huber IPCThreadState::self()->flushCommands(); 11783856b090cd04ba5dd4a59a12430ed724d5995909Steve Block ALOGV("video decoder shutdown completed"); 1179150694cda0842d38a9358fe8d1fcb4fb4a76599eAndreas Huber} 1180150694cda0842d38a9358fe8d1fcb4fb4a76599eAndreas Huber 118163970b42f101c87db7cfd26d43b0d300260b1582Andreas Huberstatus_t AwesomePlayer::setNativeWindow_l(const sp<ANativeWindow> &native) { 1182150694cda0842d38a9358fe8d1fcb4fb4a76599eAndreas Huber mNativeWindow = native; 1183150694cda0842d38a9358fe8d1fcb4fb4a76599eAndreas Huber 1184150694cda0842d38a9358fe8d1fcb4fb4a76599eAndreas Huber if (mVideoSource == NULL) { 118563970b42f101c87db7cfd26d43b0d300260b1582Andreas Huber return OK; 1186150694cda0842d38a9358fe8d1fcb4fb4a76599eAndreas Huber } 1187150694cda0842d38a9358fe8d1fcb4fb4a76599eAndreas Huber 11883856b090cd04ba5dd4a59a12430ed724d5995909Steve Block ALOGV("attempting to reconfigure to use new surface"); 1189150694cda0842d38a9358fe8d1fcb4fb4a76599eAndreas Huber 1190150694cda0842d38a9358fe8d1fcb4fb4a76599eAndreas Huber bool wasPlaying = (mFlags & PLAYING) != 0; 1191150694cda0842d38a9358fe8d1fcb4fb4a76599eAndreas Huber 1192150694cda0842d38a9358fe8d1fcb4fb4a76599eAndreas Huber pause_l(); 1193150694cda0842d38a9358fe8d1fcb4fb4a76599eAndreas Huber mVideoRenderer.clear(); 1194150694cda0842d38a9358fe8d1fcb4fb4a76599eAndreas Huber 1195150694cda0842d38a9358fe8d1fcb4fb4a76599eAndreas Huber shutdownVideoDecoder_l(); 1196150694cda0842d38a9358fe8d1fcb4fb4a76599eAndreas Huber 119763970b42f101c87db7cfd26d43b0d300260b1582Andreas Huber status_t err = initVideoDecoder(); 119863970b42f101c87db7cfd26d43b0d300260b1582Andreas Huber 119963970b42f101c87db7cfd26d43b0d300260b1582Andreas Huber if (err != OK) { 120029357bc2c0dd7c43ad3bd0c8e3efa4e6fd9bfd47Steve Block ALOGE("failed to reinstantiate video decoder after surface change."); 120163970b42f101c87db7cfd26d43b0d300260b1582Andreas Huber return err; 120263970b42f101c87db7cfd26d43b0d300260b1582Andreas Huber } 1203150694cda0842d38a9358fe8d1fcb4fb4a76599eAndreas Huber 1204150694cda0842d38a9358fe8d1fcb4fb4a76599eAndreas Huber if (mLastVideoTimeUs >= 0) { 1205150694cda0842d38a9358fe8d1fcb4fb4a76599eAndreas Huber mSeeking = SEEK; 1206150694cda0842d38a9358fe8d1fcb4fb4a76599eAndreas Huber mSeekTimeUs = mLastVideoTimeUs; 1207a0b1d4b161599c2bb2a47119e50c51e75bbe980eAndreas Huber modifyFlags((AT_EOS | AUDIO_AT_EOS | VIDEO_AT_EOS), CLEAR); 1208150694cda0842d38a9358fe8d1fcb4fb4a76599eAndreas Huber } 1209150694cda0842d38a9358fe8d1fcb4fb4a76599eAndreas Huber 1210150694cda0842d38a9358fe8d1fcb4fb4a76599eAndreas Huber if (wasPlaying) { 1211150694cda0842d38a9358fe8d1fcb4fb4a76599eAndreas Huber play_l(); 1212150694cda0842d38a9358fe8d1fcb4fb4a76599eAndreas Huber } 121363970b42f101c87db7cfd26d43b0d300260b1582Andreas Huber 121463970b42f101c87db7cfd26d43b0d300260b1582Andreas Huber return OK; 12155daeb129a2c2ba3d14ccd94af283b5f561c783eaAndreas Huber} 12165daeb129a2c2ba3d14ccd94af283b5f561c783eaAndreas Huber 1217bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Hubervoid AwesomePlayer::setAudioSink( 1218bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber const sp<MediaPlayerBase::AudioSink> &audioSink) { 1219bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber Mutex::Autolock autoLock(mLock); 1220bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber 1221bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber mAudioSink = audioSink; 1222bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber} 1223bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber 1224bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huberstatus_t AwesomePlayer::setLooping(bool shouldLoop) { 1225bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber Mutex::Autolock autoLock(mLock); 1226bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber 1227a0b1d4b161599c2bb2a47119e50c51e75bbe980eAndreas Huber modifyFlags(LOOPING, CLEAR); 1228bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber 1229bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber if (shouldLoop) { 1230a0b1d4b161599c2bb2a47119e50c51e75bbe980eAndreas Huber modifyFlags(LOOPING, SET); 1231bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber } 1232bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber 1233bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber return OK; 1234bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber} 1235bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber 1236bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huberstatus_t AwesomePlayer::getDuration(int64_t *durationUs) { 12372415ecb5bb4e1459024f6d6c8ae2d6e3dc4fbdc7Andreas Huber Mutex::Autolock autoLock(mMiscStateLock); 1238bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber 1239bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber if (mDurationUs < 0) { 1240bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber return UNKNOWN_ERROR; 1241bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber } 1242bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber 1243bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber *durationUs = mDurationUs; 1244bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber 1245bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber return OK; 1246bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber} 1247bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber 1248bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huberstatus_t AwesomePlayer::getPosition(int64_t *positionUs) { 12492bfdd428c56c7524d1a11979f200a1762866032dAndreas Huber if (mSeeking != NO_SEEK) { 1250dac4ee72bac87388a1495e098f39d73168c8078fAndreas Huber *positionUs = mSeekTimeUs; 12515dac87b088556b8ed7f2a4f5546d31be0bb68680Andreas Huber } else if (mVideoSource != NULL 12525dac87b088556b8ed7f2a4f5546d31be0bb68680Andreas Huber && (mAudioPlayer == NULL || !(mFlags & VIDEO_AT_EOS))) { 12532415ecb5bb4e1459024f6d6c8ae2d6e3dc4fbdc7Andreas Huber Mutex::Autolock autoLock(mMiscStateLock); 1254bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber *positionUs = mVideoTimeUs; 1255bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber } else if (mAudioPlayer != NULL) { 1256bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber *positionUs = mAudioPlayer->getMediaTimeUs(); 1257bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber } else { 1258bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber *positionUs = 0; 1259bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber } 1260bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber 1261bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber return OK; 1262bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber} 1263bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber 1264bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huberstatus_t AwesomePlayer::seekTo(int64_t timeUs) { 126570f521de2675ce6eedf4b22beed94ea1289b0f38Andreas Huber if (mExtractorFlags & MediaExtractor::CAN_SEEK) { 1266acdd9d0f59c3d8bdc3de80664a609527ec3d21e2Andreas Huber Mutex::Autolock autoLock(mLock); 1267acdd9d0f59c3d8bdc3de80664a609527ec3d21e2Andreas Huber return seekTo_l(timeUs); 1268acdd9d0f59c3d8bdc3de80664a609527ec3d21e2Andreas Huber } 1269acdd9d0f59c3d8bdc3de80664a609527ec3d21e2Andreas Huber 1270acdd9d0f59c3d8bdc3de80664a609527ec3d21e2Andreas Huber return OK; 1271bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber} 1272bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber 1273bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huberstatus_t AwesomePlayer::seekTo_l(int64_t timeUs) { 12740a5baa9b411fe086013d2a5e9126ed63fbad046cAndreas Huber if (mFlags & CACHE_UNDERRUN) { 1275a0b1d4b161599c2bb2a47119e50c51e75bbe980eAndreas Huber modifyFlags(CACHE_UNDERRUN, CLEAR); 12760a5baa9b411fe086013d2a5e9126ed63fbad046cAndreas Huber play_l(); 12770a5baa9b411fe086013d2a5e9126ed63fbad046cAndreas Huber } 12780a5baa9b411fe086013d2a5e9126ed63fbad046cAndreas Huber 12795dac87b088556b8ed7f2a4f5546d31be0bb68680Andreas Huber if ((mFlags & PLAYING) && mVideoSource != NULL && (mFlags & VIDEO_AT_EOS)) { 12805dac87b088556b8ed7f2a4f5546d31be0bb68680Andreas Huber // Video playback completed before, there's no pending 12815dac87b088556b8ed7f2a4f5546d31be0bb68680Andreas Huber // video event right now. In order for this new seek 12825dac87b088556b8ed7f2a4f5546d31be0bb68680Andreas Huber // to be honored, we need to post one. 12835dac87b088556b8ed7f2a4f5546d31be0bb68680Andreas Huber 12845dac87b088556b8ed7f2a4f5546d31be0bb68680Andreas Huber postVideoEvent_l(); 12855dac87b088556b8ed7f2a4f5546d31be0bb68680Andreas Huber } 12865dac87b088556b8ed7f2a4f5546d31be0bb68680Andreas Huber 128764bb6983690bf994d904591145a3cdd6373bdbe6Andreas Huber mSeeking = SEEK; 12881321fdd94d354431b930735e9f38f32ecd189a2dAndreas Huber mSeekNotificationSent = false; 1289bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber mSeekTimeUs = timeUs; 1290a0b1d4b161599c2bb2a47119e50c51e75bbe980eAndreas Huber modifyFlags((AT_EOS | AUDIO_AT_EOS | VIDEO_AT_EOS), CLEAR); 1291bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber 1292bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber seekAudioIfNecessary_l(); 1293bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber 1294f9d660a5e0196240add5daf0199f128d471e592cInsun Kang if (mFlags & TEXTPLAYER_INITIALIZED) { 12956655174826330afe66ef766258181ae8c11f3f6cInsun Kang mTextDriver->seekToAsync(mSeekTimeUs); 12967a1e3e81264189e23a1db2b174e1b5a5d4c7d1c3Gloria Wang } 12977a1e3e81264189e23a1db2b174e1b5a5d4c7d1c3Gloria Wang 12981321fdd94d354431b930735e9f38f32ecd189a2dAndreas Huber if (!(mFlags & PLAYING)) { 12993856b090cd04ba5dd4a59a12430ed724d5995909Steve Block ALOGV("seeking while paused, sending SEEK_COMPLETE notification" 13001321fdd94d354431b930735e9f38f32ecd189a2dAndreas Huber " immediately."); 13011321fdd94d354431b930735e9f38f32ecd189a2dAndreas Huber 13021321fdd94d354431b930735e9f38f32ecd189a2dAndreas Huber notifyListener_l(MEDIA_SEEK_COMPLETE); 13031321fdd94d354431b930735e9f38f32ecd189a2dAndreas Huber mSeekNotificationSent = true; 13042b1222f8938356669672f35e0e53e176c78c40efAndreas Huber 13052b1222f8938356669672f35e0e53e176c78c40efAndreas Huber if ((mFlags & PREPARED) && mVideoSource != NULL) { 1306a0b1d4b161599c2bb2a47119e50c51e75bbe980eAndreas Huber modifyFlags(SEEK_PREVIEW, SET); 13072b1222f8938356669672f35e0e53e176c78c40efAndreas Huber postVideoEvent_l(); 13082b1222f8938356669672f35e0e53e176c78c40efAndreas Huber } 13091321fdd94d354431b930735e9f38f32ecd189a2dAndreas Huber } 13101321fdd94d354431b930735e9f38f32ecd189a2dAndreas Huber 1311bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber return OK; 1312bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber} 1313bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber 1314bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Hubervoid AwesomePlayer::seekAudioIfNecessary_l() { 131564bb6983690bf994d904591145a3cdd6373bdbe6Andreas Huber if (mSeeking != NO_SEEK && mVideoSource == NULL && mAudioPlayer != NULL) { 1316bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber mAudioPlayer->seekTo(mSeekTimeUs); 1317bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber 13181862a33b246249630b654182afb5914da3480d4cAndreas Huber mWatchForAudioSeekComplete = true; 13191862a33b246249630b654182afb5914da3480d4cAndreas Huber mWatchForAudioEOS = true; 1320dcd25efb46c41c8d24a0a9cf61fb57f84149709eGloria Wang 1321dcd25efb46c41c8d24a0a9cf61fb57f84149709eGloria Wang if (mDecryptHandle != NULL) { 1322dcd25efb46c41c8d24a0a9cf61fb57f84149709eGloria Wang mDrmManagerClient->setPlaybackStatus(mDecryptHandle, 1323dcd25efb46c41c8d24a0a9cf61fb57f84149709eGloria Wang Playback::PAUSE, 0); 1324dcd25efb46c41c8d24a0a9cf61fb57f84149709eGloria Wang mDrmManagerClient->setPlaybackStatus(mDecryptHandle, 1325dcd25efb46c41c8d24a0a9cf61fb57f84149709eGloria Wang Playback::START, mSeekTimeUs / 1000); 1326dcd25efb46c41c8d24a0a9cf61fb57f84149709eGloria Wang } 1327bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber } 1328bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber} 1329bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber 133088d8a83de12592635248aa1a3bd6b9ea46108501Andreas Hubervoid AwesomePlayer::setAudioSource(sp<MediaSource> source) { 133188d8a83de12592635248aa1a3bd6b9ea46108501Andreas Huber CHECK(source != NULL); 1332bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber 133388d8a83de12592635248aa1a3bd6b9ea46108501Andreas Huber mAudioTrack = source; 133488d8a83de12592635248aa1a3bd6b9ea46108501Andreas Huber} 133588d8a83de12592635248aa1a3bd6b9ea46108501Andreas Huber 1336eec46abb88dcc50621fd2d3f17a6b8d24fd07a19James Dongvoid AwesomePlayer::addTextSource(size_t trackIndex, const sp<MediaSource>& source) { 1337965d08ba16ee82bc85f69546360c18e7da907406Gloria Wang Mutex::Autolock autoLock(mTimedTextLock); 13387a1e3e81264189e23a1db2b174e1b5a5d4c7d1c3Gloria Wang CHECK(source != NULL); 13397a1e3e81264189e23a1db2b174e1b5a5d4c7d1c3Gloria Wang 13406655174826330afe66ef766258181ae8c11f3f6cInsun Kang if (mTextDriver == NULL) { 13416655174826330afe66ef766258181ae8c11f3f6cInsun Kang mTextDriver = new TimedTextDriver(mListener); 13427a1e3e81264189e23a1db2b174e1b5a5d4c7d1c3Gloria Wang } 13437a1e3e81264189e23a1db2b174e1b5a5d4c7d1c3Gloria Wang 1344eec46abb88dcc50621fd2d3f17a6b8d24fd07a19James Dong mTextDriver->addInBandTextSource(trackIndex, source); 13457a1e3e81264189e23a1db2b174e1b5a5d4c7d1c3Gloria Wang} 13467a1e3e81264189e23a1db2b174e1b5a5d4c7d1c3Gloria Wang 134788d8a83de12592635248aa1a3bd6b9ea46108501Andreas Huberstatus_t AwesomePlayer::initAudioDecoder() { 134888d8a83de12592635248aa1a3bd6b9ea46108501Andreas Huber sp<MetaData> meta = mAudioTrack->getFormat(); 1349717826ececd8d39596f62418677721d70776add1Andreas Huber 1350717826ececd8d39596f62418677721d70776add1Andreas Huber const char *mime; 1351717826ececd8d39596f62418677721d70776add1Andreas Huber CHECK(meta->findCString(kKeyMIMEType, &mime)); 1352717826ececd8d39596f62418677721d70776add1Andreas Huber 1353717826ececd8d39596f62418677721d70776add1Andreas Huber if (!strcasecmp(mime, MEDIA_MIMETYPE_AUDIO_RAW)) { 135488d8a83de12592635248aa1a3bd6b9ea46108501Andreas Huber mAudioSource = mAudioTrack; 1355717826ececd8d39596f62418677721d70776add1Andreas Huber } else { 1356717826ececd8d39596f62418677721d70776add1Andreas Huber mAudioSource = OMXCodec::Create( 135788d8a83de12592635248aa1a3bd6b9ea46108501Andreas Huber mClient.interface(), mAudioTrack->getFormat(), 1358717826ececd8d39596f62418677721d70776add1Andreas Huber false, // createEncoder 135988d8a83de12592635248aa1a3bd6b9ea46108501Andreas Huber mAudioTrack); 1360717826ececd8d39596f62418677721d70776add1Andreas Huber } 1361bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber 1362bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber if (mAudioSource != NULL) { 1363bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber int64_t durationUs; 136488d8a83de12592635248aa1a3bd6b9ea46108501Andreas Huber if (mAudioTrack->getFormat()->findInt64(kKeyDuration, &durationUs)) { 13652415ecb5bb4e1459024f6d6c8ae2d6e3dc4fbdc7Andreas Huber Mutex::Autolock autoLock(mMiscStateLock); 1366bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber if (mDurationUs < 0 || durationUs > mDurationUs) { 1367bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber mDurationUs = durationUs; 1368bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber } 1369bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber } 1370bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber 1371a945bfd91aa291fba4d9201ffcb38fce40eab7feAndreas Huber status_t err = mAudioSource->start(); 1372a945bfd91aa291fba4d9201ffcb38fce40eab7feAndreas Huber 1373a945bfd91aa291fba4d9201ffcb38fce40eab7feAndreas Huber if (err != OK) { 1374a945bfd91aa291fba4d9201ffcb38fce40eab7feAndreas Huber mAudioSource.clear(); 1375a945bfd91aa291fba4d9201ffcb38fce40eab7feAndreas Huber return err; 1376a945bfd91aa291fba4d9201ffcb38fce40eab7feAndreas Huber } 137781f82c32459029bf0744e28c73f95a7f18cab5acAndreas Huber } else if (!strcasecmp(mime, MEDIA_MIMETYPE_AUDIO_QCELP)) { 137881f82c32459029bf0744e28c73f95a7f18cab5acAndreas Huber // For legacy reasons we're simply going to ignore the absence 137981f82c32459029bf0744e28c73f95a7f18cab5acAndreas Huber // of an audio decoder for QCELP instead of aborting playback 138081f82c32459029bf0744e28c73f95a7f18cab5acAndreas Huber // altogether. 138181f82c32459029bf0744e28c73f95a7f18cab5acAndreas Huber return OK; 138281f82c32459029bf0744e28c73f95a7f18cab5acAndreas Huber } 1383e7e3b785a0e7819db4c895a4f60e9a4dd755880cAndreas Huber 1384a0b1d4b161599c2bb2a47119e50c51e75bbe980eAndreas Huber if (mAudioSource != NULL) { 1385a0b1d4b161599c2bb2a47119e50c51e75bbe980eAndreas Huber Mutex::Autolock autoLock(mStatsLock); 1386a0b1d4b161599c2bb2a47119e50c51e75bbe980eAndreas Huber TrackStat *stat = &mStats.mTracks.editItemAt(mStats.mAudioTrackIndex); 1387a0b1d4b161599c2bb2a47119e50c51e75bbe980eAndreas Huber 1388a0b1d4b161599c2bb2a47119e50c51e75bbe980eAndreas Huber const char *component; 1389a0b1d4b161599c2bb2a47119e50c51e75bbe980eAndreas Huber if (!mAudioSource->getFormat() 1390a0b1d4b161599c2bb2a47119e50c51e75bbe980eAndreas Huber ->findCString(kKeyDecoderComponent, &component)) { 1391a0b1d4b161599c2bb2a47119e50c51e75bbe980eAndreas Huber component = "none"; 1392a0b1d4b161599c2bb2a47119e50c51e75bbe980eAndreas Huber } 1393a0b1d4b161599c2bb2a47119e50c51e75bbe980eAndreas Huber 1394a0b1d4b161599c2bb2a47119e50c51e75bbe980eAndreas Huber stat->mDecoderName = component; 1395a0b1d4b161599c2bb2a47119e50c51e75bbe980eAndreas Huber } 1396a0b1d4b161599c2bb2a47119e50c51e75bbe980eAndreas Huber 1397bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber return mAudioSource != NULL ? OK : UNKNOWN_ERROR; 1398bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber} 1399bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber 140088d8a83de12592635248aa1a3bd6b9ea46108501Andreas Hubervoid AwesomePlayer::setVideoSource(sp<MediaSource> source) { 140188d8a83de12592635248aa1a3bd6b9ea46108501Andreas Huber CHECK(source != NULL); 1402bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber 140388d8a83de12592635248aa1a3bd6b9ea46108501Andreas Huber mVideoTrack = source; 140488d8a83de12592635248aa1a3bd6b9ea46108501Andreas Huber} 140588d8a83de12592635248aa1a3bd6b9ea46108501Andreas Huber 14062a4d22d79e927f2245537921e10fc5fda1c47a29Andreas Huberstatus_t AwesomePlayer::initVideoDecoder(uint32_t flags) { 14072eb62955eb84b97695e8a7e56e14310cbb86412bGlenn Kasten 14082eb62955eb84b97695e8a7e56e14310cbb86412bGlenn Kasten // Either the application or the DRM system can independently say 14092eb62955eb84b97695e8a7e56e14310cbb86412bGlenn Kasten // that there must be a hardware-protected path to an external video sink. 14102eb62955eb84b97695e8a7e56e14310cbb86412bGlenn Kasten // For now we always require a hardware-protected path to external video sink 14112eb62955eb84b97695e8a7e56e14310cbb86412bGlenn Kasten // if content is DRMed, but eventually this could be optional per DRM agent. 14122eb62955eb84b97695e8a7e56e14310cbb86412bGlenn Kasten // When the application wants protection, then 14132eb62955eb84b97695e8a7e56e14310cbb86412bGlenn Kasten // (USE_SURFACE_ALLOC && (mSurface != 0) && 14142eb62955eb84b97695e8a7e56e14310cbb86412bGlenn Kasten // (mSurface->getFlags() & ISurfaceComposer::eProtectedByApp)) 14152eb62955eb84b97695e8a7e56e14310cbb86412bGlenn Kasten // will be true, but that part is already handled by SurfaceFlinger. 1416eabd34665adc284525fe7337ad5c56a8b92964efGlenn Kasten 1417eabd34665adc284525fe7337ad5c56a8b92964efGlenn Kasten#ifdef DEBUG_HDCP 1418eabd34665adc284525fe7337ad5c56a8b92964efGlenn Kasten // For debugging, we allow a system property to control the protected usage. 1419eabd34665adc284525fe7337ad5c56a8b92964efGlenn Kasten // In case of uninitialized or unexpected property, we default to "DRM only". 1420eabd34665adc284525fe7337ad5c56a8b92964efGlenn Kasten bool setProtectionBit = false; 1421eabd34665adc284525fe7337ad5c56a8b92964efGlenn Kasten char value[PROPERTY_VALUE_MAX]; 1422eabd34665adc284525fe7337ad5c56a8b92964efGlenn Kasten if (property_get("persist.sys.hdcp_checking", value, NULL)) { 1423eabd34665adc284525fe7337ad5c56a8b92964efGlenn Kasten if (!strcmp(value, "never")) { 1424eabd34665adc284525fe7337ad5c56a8b92964efGlenn Kasten // nop 1425eabd34665adc284525fe7337ad5c56a8b92964efGlenn Kasten } else if (!strcmp(value, "always")) { 1426eabd34665adc284525fe7337ad5c56a8b92964efGlenn Kasten setProtectionBit = true; 1427eabd34665adc284525fe7337ad5c56a8b92964efGlenn Kasten } else if (!strcmp(value, "drm-only")) { 1428eabd34665adc284525fe7337ad5c56a8b92964efGlenn Kasten if (mDecryptHandle != NULL) { 1429eabd34665adc284525fe7337ad5c56a8b92964efGlenn Kasten setProtectionBit = true; 1430eabd34665adc284525fe7337ad5c56a8b92964efGlenn Kasten } 1431eabd34665adc284525fe7337ad5c56a8b92964efGlenn Kasten // property value is empty, or unexpected value 1432eabd34665adc284525fe7337ad5c56a8b92964efGlenn Kasten } else { 1433eabd34665adc284525fe7337ad5c56a8b92964efGlenn Kasten if (mDecryptHandle != NULL) { 1434eabd34665adc284525fe7337ad5c56a8b92964efGlenn Kasten setProtectionBit = true; 1435eabd34665adc284525fe7337ad5c56a8b92964efGlenn Kasten } 1436eabd34665adc284525fe7337ad5c56a8b92964efGlenn Kasten } 1437eabd34665adc284525fe7337ad5c56a8b92964efGlenn Kasten // can' read property value 1438eabd34665adc284525fe7337ad5c56a8b92964efGlenn Kasten } else { 1439eabd34665adc284525fe7337ad5c56a8b92964efGlenn Kasten if (mDecryptHandle != NULL) { 1440eabd34665adc284525fe7337ad5c56a8b92964efGlenn Kasten setProtectionBit = true; 1441eabd34665adc284525fe7337ad5c56a8b92964efGlenn Kasten } 1442eabd34665adc284525fe7337ad5c56a8b92964efGlenn Kasten } 1443eabd34665adc284525fe7337ad5c56a8b92964efGlenn Kasten // note that usage bit is already cleared, so no need to clear it in the "else" case 1444eabd34665adc284525fe7337ad5c56a8b92964efGlenn Kasten if (setProtectionBit) { 1445eabd34665adc284525fe7337ad5c56a8b92964efGlenn Kasten flags |= OMXCodec::kEnableGrallocUsageProtected; 1446eabd34665adc284525fe7337ad5c56a8b92964efGlenn Kasten } 1447eabd34665adc284525fe7337ad5c56a8b92964efGlenn Kasten#else 14482eb62955eb84b97695e8a7e56e14310cbb86412bGlenn Kasten if (mDecryptHandle != NULL) { 14492eb62955eb84b97695e8a7e56e14310cbb86412bGlenn Kasten flags |= OMXCodec::kEnableGrallocUsageProtected; 14502eb62955eb84b97695e8a7e56e14310cbb86412bGlenn Kasten } 1451eabd34665adc284525fe7337ad5c56a8b92964efGlenn Kasten#endif 14523856b090cd04ba5dd4a59a12430ed724d5995909Steve Block ALOGV("initVideoDecoder flags=0x%x", flags); 1453bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber mVideoSource = OMXCodec::Create( 145488d8a83de12592635248aa1a3bd6b9ea46108501Andreas Huber mClient.interface(), mVideoTrack->getFormat(), 1455bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber false, // createEncoder 145639ddf8e0f18766f7ba1e3246b774aa6ebd93eea8Andreas Huber mVideoTrack, 14571173118eace0e9e347cb007f0da817cee87579edGlenn Kasten NULL, flags, USE_SURFACE_ALLOC ? mNativeWindow : NULL); 1458bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber 1459bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber if (mVideoSource != NULL) { 1460bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber int64_t durationUs; 146188d8a83de12592635248aa1a3bd6b9ea46108501Andreas Huber if (mVideoTrack->getFormat()->findInt64(kKeyDuration, &durationUs)) { 14622415ecb5bb4e1459024f6d6c8ae2d6e3dc4fbdc7Andreas Huber Mutex::Autolock autoLock(mMiscStateLock); 1463bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber if (mDurationUs < 0 || durationUs > mDurationUs) { 1464bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber mDurationUs = durationUs; 1465bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber } 1466bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber } 1467bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber 1468139a5d5bd33c9fc7708d0a79f11ee928f7796e6bAndreas Huber status_t err = mVideoSource->start(); 1469139a5d5bd33c9fc7708d0a79f11ee928f7796e6bAndreas Huber 1470139a5d5bd33c9fc7708d0a79f11ee928f7796e6bAndreas Huber if (err != OK) { 1471139a5d5bd33c9fc7708d0a79f11ee928f7796e6bAndreas Huber mVideoSource.clear(); 1472139a5d5bd33c9fc7708d0a79f11ee928f7796e6bAndreas Huber return err; 1473139a5d5bd33c9fc7708d0a79f11ee928f7796e6bAndreas Huber } 1474bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber } 1475bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber 1476a0b1d4b161599c2bb2a47119e50c51e75bbe980eAndreas Huber if (mVideoSource != NULL) { 147714f95746466fb6abdbbf33ee26d92ebf3fbef98fJames Dong const char *componentName; 1478a0b1d4b161599c2bb2a47119e50c51e75bbe980eAndreas Huber CHECK(mVideoSource->getFormat() 147914f95746466fb6abdbbf33ee26d92ebf3fbef98fJames Dong ->findCString(kKeyDecoderComponent, &componentName)); 1480a0b1d4b161599c2bb2a47119e50c51e75bbe980eAndreas Huber 148114f95746466fb6abdbbf33ee26d92ebf3fbef98fJames Dong { 148214f95746466fb6abdbbf33ee26d92ebf3fbef98fJames Dong Mutex::Autolock autoLock(mStatsLock); 148314f95746466fb6abdbbf33ee26d92ebf3fbef98fJames Dong TrackStat *stat = &mStats.mTracks.editItemAt(mStats.mVideoTrackIndex); 148414f95746466fb6abdbbf33ee26d92ebf3fbef98fJames Dong 148514f95746466fb6abdbbf33ee26d92ebf3fbef98fJames Dong stat->mDecoderName = componentName; 148614f95746466fb6abdbbf33ee26d92ebf3fbef98fJames Dong } 148714f95746466fb6abdbbf33ee26d92ebf3fbef98fJames Dong 148814f95746466fb6abdbbf33ee26d92ebf3fbef98fJames Dong static const char *kPrefix = "OMX.Nvidia."; 148914f95746466fb6abdbbf33ee26d92ebf3fbef98fJames Dong static const char *kSuffix = ".decode"; 149014f95746466fb6abdbbf33ee26d92ebf3fbef98fJames Dong static const size_t kSuffixLength = strlen(kSuffix); 149114f95746466fb6abdbbf33ee26d92ebf3fbef98fJames Dong 149214f95746466fb6abdbbf33ee26d92ebf3fbef98fJames Dong size_t componentNameLength = strlen(componentName); 149314f95746466fb6abdbbf33ee26d92ebf3fbef98fJames Dong 149414f95746466fb6abdbbf33ee26d92ebf3fbef98fJames Dong if (!strncmp(componentName, kPrefix, strlen(kPrefix)) 149514f95746466fb6abdbbf33ee26d92ebf3fbef98fJames Dong && componentNameLength >= kSuffixLength 149614f95746466fb6abdbbf33ee26d92ebf3fbef98fJames Dong && !strcmp(&componentName[ 149714f95746466fb6abdbbf33ee26d92ebf3fbef98fJames Dong componentNameLength - kSuffixLength], kSuffix)) { 149814f95746466fb6abdbbf33ee26d92ebf3fbef98fJames Dong modifyFlags(SLOW_DECODER_HACK, SET); 149914f95746466fb6abdbbf33ee26d92ebf3fbef98fJames Dong } 1500a0b1d4b161599c2bb2a47119e50c51e75bbe980eAndreas Huber } 1501a0b1d4b161599c2bb2a47119e50c51e75bbe980eAndreas Huber 1502bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber return mVideoSource != NULL ? OK : UNKNOWN_ERROR; 1503bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber} 1504bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber 15054769cc92740e3ab58e9263d42553c12bbf79e3beAndreas Hubervoid AwesomePlayer::finishSeekIfNecessary(int64_t videoTimeUs) { 150664bb6983690bf994d904591145a3cdd6373bdbe6Andreas Huber if (mSeeking == SEEK_VIDEO_ONLY) { 150764bb6983690bf994d904591145a3cdd6373bdbe6Andreas Huber mSeeking = NO_SEEK; 150864bb6983690bf994d904591145a3cdd6373bdbe6Andreas Huber return; 150964bb6983690bf994d904591145a3cdd6373bdbe6Andreas Huber } 151064bb6983690bf994d904591145a3cdd6373bdbe6Andreas Huber 151164bb6983690bf994d904591145a3cdd6373bdbe6Andreas Huber if (mSeeking == NO_SEEK || (mFlags & SEEK_PREVIEW)) { 15124769cc92740e3ab58e9263d42553c12bbf79e3beAndreas Huber return; 15134769cc92740e3ab58e9263d42553c12bbf79e3beAndreas Huber } 15144769cc92740e3ab58e9263d42553c12bbf79e3beAndreas Huber 15154769cc92740e3ab58e9263d42553c12bbf79e3beAndreas Huber if (mAudioPlayer != NULL) { 15163856b090cd04ba5dd4a59a12430ed724d5995909Steve Block ALOGV("seeking audio to %lld us (%.2f secs).", videoTimeUs, videoTimeUs / 1E6); 15174769cc92740e3ab58e9263d42553c12bbf79e3beAndreas Huber 15184769cc92740e3ab58e9263d42553c12bbf79e3beAndreas Huber // If we don't have a video time, seek audio to the originally 15194769cc92740e3ab58e9263d42553c12bbf79e3beAndreas Huber // requested seek time instead. 15204769cc92740e3ab58e9263d42553c12bbf79e3beAndreas Huber 15214769cc92740e3ab58e9263d42553c12bbf79e3beAndreas Huber mAudioPlayer->seekTo(videoTimeUs < 0 ? mSeekTimeUs : videoTimeUs); 15224769cc92740e3ab58e9263d42553c12bbf79e3beAndreas Huber mWatchForAudioSeekComplete = true; 15235dac87b088556b8ed7f2a4f5546d31be0bb68680Andreas Huber mWatchForAudioEOS = true; 15244769cc92740e3ab58e9263d42553c12bbf79e3beAndreas Huber } else if (!mSeekNotificationSent) { 15254769cc92740e3ab58e9263d42553c12bbf79e3beAndreas Huber // If we're playing video only, report seek complete now, 15264769cc92740e3ab58e9263d42553c12bbf79e3beAndreas Huber // otherwise audio player will notify us later. 15274769cc92740e3ab58e9263d42553c12bbf79e3beAndreas Huber notifyListener_l(MEDIA_SEEK_COMPLETE); 1528512895089f2035bc86d3f502255199809aca721bAndreas Huber mSeekNotificationSent = true; 15294769cc92740e3ab58e9263d42553c12bbf79e3beAndreas Huber } 15304769cc92740e3ab58e9263d42553c12bbf79e3beAndreas Huber 1531a0b1d4b161599c2bb2a47119e50c51e75bbe980eAndreas Huber modifyFlags(FIRST_FRAME, SET); 153264bb6983690bf994d904591145a3cdd6373bdbe6Andreas Huber mSeeking = NO_SEEK; 1533a89082944308805b0def7de87c67e370e74b8789Gloria Wang 1534a89082944308805b0def7de87c67e370e74b8789Gloria Wang if (mDecryptHandle != NULL) { 1535a89082944308805b0def7de87c67e370e74b8789Gloria Wang mDrmManagerClient->setPlaybackStatus(mDecryptHandle, 1536a89082944308805b0def7de87c67e370e74b8789Gloria Wang Playback::PAUSE, 0); 1537a89082944308805b0def7de87c67e370e74b8789Gloria Wang mDrmManagerClient->setPlaybackStatus(mDecryptHandle, 1538a89082944308805b0def7de87c67e370e74b8789Gloria Wang Playback::START, videoTimeUs / 1000); 1539a89082944308805b0def7de87c67e370e74b8789Gloria Wang } 15404769cc92740e3ab58e9263d42553c12bbf79e3beAndreas Huber} 15414769cc92740e3ab58e9263d42553c12bbf79e3beAndreas Huber 1542c23f12af0394aa2f6651968a3c8840f1af317aa1Andreas Hubervoid AwesomePlayer::onVideoEvent() { 1543bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber Mutex::Autolock autoLock(mLock); 15447b3396acc702451be9bafb19d7fe26d55d43a316Andreas Huber if (!mVideoEventPending) { 15457b3396acc702451be9bafb19d7fe26d55d43a316Andreas Huber // The event has been cancelled in reset_l() but had already 15467b3396acc702451be9bafb19d7fe26d55d43a316Andreas Huber // been scheduled for execution at that time. 15477b3396acc702451be9bafb19d7fe26d55d43a316Andreas Huber return; 15487b3396acc702451be9bafb19d7fe26d55d43a316Andreas Huber } 1549bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber mVideoEventPending = false; 1550bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber 155164bb6983690bf994d904591145a3cdd6373bdbe6Andreas Huber if (mSeeking != NO_SEEK) { 1552bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber if (mVideoBuffer) { 1553bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber mVideoBuffer->release(); 1554bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber mVideoBuffer = NULL; 1555bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber } 15560a5baa9b411fe086013d2a5e9126ed63fbad046cAndreas Huber 1557681755fc0d0797506456f46a2a10555916d6be32Andreas Huber if (mSeeking == SEEK && isStreamingHTTP() && mAudioSource != NULL 15582b1222f8938356669672f35e0e53e176c78c40efAndreas Huber && !(mFlags & SEEK_PREVIEW)) { 15590a5baa9b411fe086013d2a5e9126ed63fbad046cAndreas Huber // We're going to seek the video source first, followed by 15600a5baa9b411fe086013d2a5e9126ed63fbad046cAndreas Huber // the audio source. 15610a5baa9b411fe086013d2a5e9126ed63fbad046cAndreas Huber // In order to avoid jumps in the DataSource offset caused by 15620a5baa9b411fe086013d2a5e9126ed63fbad046cAndreas Huber // the audio codec prefetching data from the old locations 15630a5baa9b411fe086013d2a5e9126ed63fbad046cAndreas Huber // while the video codec is already reading data from the new 15640a5baa9b411fe086013d2a5e9126ed63fbad046cAndreas Huber // locations, we'll "pause" the audio source, causing it to 15650a5baa9b411fe086013d2a5e9126ed63fbad046cAndreas Huber // stop reading input data until a subsequent seek. 15660a5baa9b411fe086013d2a5e9126ed63fbad046cAndreas Huber 1567f03034408506051f2f836e59305fcd5f662bf19aAndreas Huber if (mAudioPlayer != NULL && (mFlags & AUDIO_RUNNING)) { 15680a5baa9b411fe086013d2a5e9126ed63fbad046cAndreas Huber mAudioPlayer->pause(); 1569f03034408506051f2f836e59305fcd5f662bf19aAndreas Huber 1570a0b1d4b161599c2bb2a47119e50c51e75bbe980eAndreas Huber modifyFlags(AUDIO_RUNNING, CLEAR); 15710a5baa9b411fe086013d2a5e9126ed63fbad046cAndreas Huber } 15720a5baa9b411fe086013d2a5e9126ed63fbad046cAndreas Huber mAudioSource->pause(); 15730a5baa9b411fe086013d2a5e9126ed63fbad046cAndreas Huber } 1574bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber } 1575bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber 1576bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber if (!mVideoBuffer) { 1577bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber MediaSource::ReadOptions options; 157864bb6983690bf994d904591145a3cdd6373bdbe6Andreas Huber if (mSeeking != NO_SEEK) { 15793856b090cd04ba5dd4a59a12430ed724d5995909Steve Block ALOGV("seeking to %lld us (%.2f secs)", mSeekTimeUs, mSeekTimeUs / 1E6); 1580bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber 1581abd1f4f870925d6776dbe4b930b759a1ab6595caAndreas Huber options.setSeekTo( 158264bb6983690bf994d904591145a3cdd6373bdbe6Andreas Huber mSeekTimeUs, 158364bb6983690bf994d904591145a3cdd6373bdbe6Andreas Huber mSeeking == SEEK_VIDEO_ONLY 158464bb6983690bf994d904591145a3cdd6373bdbe6Andreas Huber ? MediaSource::ReadOptions::SEEK_NEXT_SYNC 15855ec58d925520e6913fba3fc54413881af751c610Andreas Huber : MediaSource::ReadOptions::SEEK_CLOSEST); 1586bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber } 1587bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber for (;;) { 1588bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber status_t err = mVideoSource->read(&mVideoBuffer, &options); 1589c1689e49ac867de33f2e81289449878ac2e536a0Andreas Huber options.clearSeekTo(); 1590bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber 1591bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber if (err != OK) { 1592e2b1028852120bcfded33b8f06f66b780437fe92Andreas Huber CHECK(mVideoBuffer == NULL); 1593bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber 1594bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber if (err == INFO_FORMAT_CHANGED) { 15953856b090cd04ba5dd4a59a12430ed724d5995909Steve Block ALOGV("VideoSource signalled format change."); 1596bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber 15975daeb129a2c2ba3d14ccd94af283b5f561c783eaAndreas Huber notifyVideoSize_l(); 15985daeb129a2c2ba3d14ccd94af283b5f561c783eaAndreas Huber 1599a657f8deaf21acbe5faba7be1df9c6681d44d471Andreas Huber if (mVideoRenderer != NULL) { 1600fa090f541bb84a546af2ec834e91a032ff10e66eAndreas Huber mVideoRendererIsPreview = false; 1601a657f8deaf21acbe5faba7be1df9c6681d44d471Andreas Huber initRenderer_l(); 1602a657f8deaf21acbe5faba7be1df9c6681d44d471Andreas Huber } 1603bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber continue; 1604bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber } 1605bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber 16064769cc92740e3ab58e9263d42553c12bbf79e3beAndreas Huber // So video playback is complete, but we may still have 16074769cc92740e3ab58e9263d42553c12bbf79e3beAndreas Huber // a seek request pending that needs to be applied 16084769cc92740e3ab58e9263d42553c12bbf79e3beAndreas Huber // to the audio track. 160964bb6983690bf994d904591145a3cdd6373bdbe6Andreas Huber if (mSeeking != NO_SEEK) { 16103856b090cd04ba5dd4a59a12430ed724d5995909Steve Block ALOGV("video stream ended while seeking!"); 16114769cc92740e3ab58e9263d42553c12bbf79e3beAndreas Huber } 16124769cc92740e3ab58e9263d42553c12bbf79e3beAndreas Huber finishSeekIfNecessary(-1); 16134769cc92740e3ab58e9263d42553c12bbf79e3beAndreas Huber 16145dac87b088556b8ed7f2a4f5546d31be0bb68680Andreas Huber if (mAudioPlayer != NULL 16155dac87b088556b8ed7f2a4f5546d31be0bb68680Andreas Huber && !(mFlags & (AUDIO_RUNNING | SEEK_PREVIEW))) { 16165dac87b088556b8ed7f2a4f5546d31be0bb68680Andreas Huber startAudioPlayer_l(); 16175dac87b088556b8ed7f2a4f5546d31be0bb68680Andreas Huber } 16185dac87b088556b8ed7f2a4f5546d31be0bb68680Andreas Huber 1619a0b1d4b161599c2bb2a47119e50c51e75bbe980eAndreas Huber modifyFlags(VIDEO_AT_EOS, SET); 16205295c0c55d41a2906ea7f65a3f22e6278cb17d4bAndreas Huber postStreamDoneEvent_l(err); 1621bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber return; 1622bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber } 1623bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber 16244844ac54e8b5997c3b03872dbafe8ebed4787517Andreas Huber if (mVideoBuffer->range_length() == 0) { 162508411b75d4c30ce26180639f158e2f33d190eee8Andreas Huber // Some decoders, notably the PV AVC software decoder 162608411b75d4c30ce26180639f158e2f33d190eee8Andreas Huber // return spurious empty buffers that we just want to ignore. 162708411b75d4c30ce26180639f158e2f33d190eee8Andreas Huber 16284844ac54e8b5997c3b03872dbafe8ebed4787517Andreas Huber mVideoBuffer->release(); 16294844ac54e8b5997c3b03872dbafe8ebed4787517Andreas Huber mVideoBuffer = NULL; 16304844ac54e8b5997c3b03872dbafe8ebed4787517Andreas Huber continue; 16314844ac54e8b5997c3b03872dbafe8ebed4787517Andreas Huber } 16324844ac54e8b5997c3b03872dbafe8ebed4787517Andreas Huber 1633bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber break; 1634bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber } 1635a0b1d4b161599c2bb2a47119e50c51e75bbe980eAndreas Huber 1636a0b1d4b161599c2bb2a47119e50c51e75bbe980eAndreas Huber { 1637a0b1d4b161599c2bb2a47119e50c51e75bbe980eAndreas Huber Mutex::Autolock autoLock(mStatsLock); 1638a0b1d4b161599c2bb2a47119e50c51e75bbe980eAndreas Huber ++mStats.mNumVideoFramesDecoded; 1639a0b1d4b161599c2bb2a47119e50c51e75bbe980eAndreas Huber } 1640bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber } 1641bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber 1642bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber int64_t timeUs; 1643bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber CHECK(mVideoBuffer->meta_data()->findInt64(kKeyTime, &timeUs)); 1644bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber 1645150694cda0842d38a9358fe8d1fcb4fb4a76599eAndreas Huber mLastVideoTimeUs = timeUs; 1646150694cda0842d38a9358fe8d1fcb4fb4a76599eAndreas Huber 164764bb6983690bf994d904591145a3cdd6373bdbe6Andreas Huber if (mSeeking == SEEK_VIDEO_ONLY) { 164864bb6983690bf994d904591145a3cdd6373bdbe6Andreas Huber if (mSeekTimeUs > timeUs) { 1649df64d15042bbd5e0e4933ac49bf3c177dd94752cSteve Block ALOGI("XXX mSeekTimeUs = %lld us, timeUs = %lld us", 165064bb6983690bf994d904591145a3cdd6373bdbe6Andreas Huber mSeekTimeUs, timeUs); 165164bb6983690bf994d904591145a3cdd6373bdbe6Andreas Huber } 165264bb6983690bf994d904591145a3cdd6373bdbe6Andreas Huber } 165364bb6983690bf994d904591145a3cdd6373bdbe6Andreas Huber 16542415ecb5bb4e1459024f6d6c8ae2d6e3dc4fbdc7Andreas Huber { 16552415ecb5bb4e1459024f6d6c8ae2d6e3dc4fbdc7Andreas Huber Mutex::Autolock autoLock(mMiscStateLock); 16562415ecb5bb4e1459024f6d6c8ae2d6e3dc4fbdc7Andreas Huber mVideoTimeUs = timeUs; 16572415ecb5bb4e1459024f6d6c8ae2d6e3dc4fbdc7Andreas Huber } 1658bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber 165964bb6983690bf994d904591145a3cdd6373bdbe6Andreas Huber SeekType wasSeeking = mSeeking; 16604769cc92740e3ab58e9263d42553c12bbf79e3beAndreas Huber finishSeekIfNecessary(timeUs); 1661bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber 1662f03034408506051f2f836e59305fcd5f662bf19aAndreas Huber if (mAudioPlayer != NULL && !(mFlags & (AUDIO_RUNNING | SEEK_PREVIEW))) { 1663f03034408506051f2f836e59305fcd5f662bf19aAndreas Huber status_t err = startAudioPlayer_l(); 1664f03034408506051f2f836e59305fcd5f662bf19aAndreas Huber if (err != OK) { 166529357bc2c0dd7c43ad3bd0c8e3efa4e6fd9bfd47Steve Block ALOGE("Starting the audio player failed w/ err %d", err); 1666f03034408506051f2f836e59305fcd5f662bf19aAndreas Huber return; 1667f03034408506051f2f836e59305fcd5f662bf19aAndreas Huber } 1668f03034408506051f2f836e59305fcd5f662bf19aAndreas Huber } 1669f03034408506051f2f836e59305fcd5f662bf19aAndreas Huber 1670f9d660a5e0196240add5daf0199f128d471e592cInsun Kang if ((mFlags & TEXTPLAYER_INITIALIZED) && !(mFlags & (TEXT_RUNNING | SEEK_PREVIEW))) { 1671f9d660a5e0196240add5daf0199f128d471e592cInsun Kang mTextDriver->start(); 1672a0b1d4b161599c2bb2a47119e50c51e75bbe980eAndreas Huber modifyFlags(TEXT_RUNNING, SET); 16737a1e3e81264189e23a1db2b174e1b5a5d4c7d1c3Gloria Wang } 16747a1e3e81264189e23a1db2b174e1b5a5d4c7d1c3Gloria Wang 1675f7eade99250520f2c9c8366a20a9256c4b34abc1Andreas Huber TimeSource *ts = 1676f7eade99250520f2c9c8366a20a9256c4b34abc1Andreas Huber ((mFlags & AUDIO_AT_EOS) || !(mFlags & AUDIOPLAYER_STARTED)) 1677f7eade99250520f2c9c8366a20a9256c4b34abc1Andreas Huber ? &mSystemTimeSource : mTimeSource; 16785d2de4da54504836e4b772b3010ac28c19f667f0Andreas Huber 1679bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber if (mFlags & FIRST_FRAME) { 1680a0b1d4b161599c2bb2a47119e50c51e75bbe980eAndreas Huber modifyFlags(FIRST_FRAME, CLEAR); 168114f95746466fb6abdbbf33ee26d92ebf3fbef98fJames Dong mSinceLastDropped = 0; 16825d2de4da54504836e4b772b3010ac28c19f667f0Andreas Huber mTimeSourceDeltaUs = ts->getRealTimeUs() - timeUs; 1683bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber } 1684bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber 1685bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber int64_t realTimeUs, mediaTimeUs; 16865d2de4da54504836e4b772b3010ac28c19f667f0Andreas Huber if (!(mFlags & AUDIO_AT_EOS) && mAudioPlayer != NULL 1687bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber && mAudioPlayer->getMediaTimeMapping(&realTimeUs, &mediaTimeUs)) { 1688bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber mTimeSourceDeltaUs = realTimeUs - mediaTimeUs; 1689bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber } 1690bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber 169164bb6983690bf994d904591145a3cdd6373bdbe6Andreas Huber if (wasSeeking == SEEK_VIDEO_ONLY) { 169264bb6983690bf994d904591145a3cdd6373bdbe6Andreas Huber int64_t nowUs = ts->getRealTimeUs() - mTimeSourceDeltaUs; 169364bb6983690bf994d904591145a3cdd6373bdbe6Andreas Huber 169464bb6983690bf994d904591145a3cdd6373bdbe6Andreas Huber int64_t latenessUs = nowUs - timeUs; 169564bb6983690bf994d904591145a3cdd6373bdbe6Andreas Huber 169664bb6983690bf994d904591145a3cdd6373bdbe6Andreas Huber if (latenessUs > 0) { 1697df64d15042bbd5e0e4933ac49bf3c177dd94752cSteve Block ALOGI("after SEEK_VIDEO_ONLY we're late by %.2f secs", latenessUs / 1E6); 169864bb6983690bf994d904591145a3cdd6373bdbe6Andreas Huber } 169964bb6983690bf994d904591145a3cdd6373bdbe6Andreas Huber } 170064bb6983690bf994d904591145a3cdd6373bdbe6Andreas Huber 170164bb6983690bf994d904591145a3cdd6373bdbe6Andreas Huber if (wasSeeking == NO_SEEK) { 170202a1db7dc1de2f2df306ec10bab992bc8bbaaca8Andreas Huber // Let's display the first frame after seeking right away. 1703f8ca90452ff3e252f20de38f1c3eee524c808c3eAndreas Huber 17042b1222f8938356669672f35e0e53e176c78c40efAndreas Huber int64_t nowUs = ts->getRealTimeUs() - mTimeSourceDeltaUs; 1705bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber 17062b1222f8938356669672f35e0e53e176c78c40efAndreas Huber int64_t latenessUs = nowUs - timeUs; 17072b1222f8938356669672f35e0e53e176c78c40efAndreas Huber 170864bb6983690bf994d904591145a3cdd6373bdbe6Andreas Huber if (latenessUs > 500000ll 170964bb6983690bf994d904591145a3cdd6373bdbe6Andreas Huber && mAudioPlayer != NULL 171064bb6983690bf994d904591145a3cdd6373bdbe6Andreas Huber && mAudioPlayer->getMediaTimeMapping( 171164bb6983690bf994d904591145a3cdd6373bdbe6Andreas Huber &realTimeUs, &mediaTimeUs)) { 1712df64d15042bbd5e0e4933ac49bf3c177dd94752cSteve Block ALOGI("we're much too late (%.2f secs), video skipping ahead", 171364bb6983690bf994d904591145a3cdd6373bdbe6Andreas Huber latenessUs / 1E6); 171464bb6983690bf994d904591145a3cdd6373bdbe6Andreas Huber 171564bb6983690bf994d904591145a3cdd6373bdbe6Andreas Huber mVideoBuffer->release(); 171664bb6983690bf994d904591145a3cdd6373bdbe6Andreas Huber mVideoBuffer = NULL; 171764bb6983690bf994d904591145a3cdd6373bdbe6Andreas Huber 171864bb6983690bf994d904591145a3cdd6373bdbe6Andreas Huber mSeeking = SEEK_VIDEO_ONLY; 171964bb6983690bf994d904591145a3cdd6373bdbe6Andreas Huber mSeekTimeUs = mediaTimeUs; 172064bb6983690bf994d904591145a3cdd6373bdbe6Andreas Huber 172164bb6983690bf994d904591145a3cdd6373bdbe6Andreas Huber postVideoEvent_l(); 172264bb6983690bf994d904591145a3cdd6373bdbe6Andreas Huber return; 172364bb6983690bf994d904591145a3cdd6373bdbe6Andreas Huber } 172464bb6983690bf994d904591145a3cdd6373bdbe6Andreas Huber 17252b1222f8938356669672f35e0e53e176c78c40efAndreas Huber if (latenessUs > 40000) { 17262b1222f8938356669672f35e0e53e176c78c40efAndreas Huber // We're more than 40ms late. 17273856b090cd04ba5dd4a59a12430ed724d5995909Steve Block ALOGV("we're late by %lld us (%.2f secs)", 1728dab59b5a4956b7e9b1ffc64a0676e7990579934eAndreas Huber latenessUs, latenessUs / 1E6); 17292b1222f8938356669672f35e0e53e176c78c40efAndreas Huber 173014f95746466fb6abdbbf33ee26d92ebf3fbef98fJames Dong if (!(mFlags & SLOW_DECODER_HACK) 173114f95746466fb6abdbbf33ee26d92ebf3fbef98fJames Dong || mSinceLastDropped > FRAME_DROP_FREQ) 1732a0b1d4b161599c2bb2a47119e50c51e75bbe980eAndreas Huber { 17333856b090cd04ba5dd4a59a12430ed724d5995909Steve Block ALOGV("we're late by %lld us (%.2f secs) dropping " 173414f95746466fb6abdbbf33ee26d92ebf3fbef98fJames Dong "one after %d frames", 173514f95746466fb6abdbbf33ee26d92ebf3fbef98fJames Dong latenessUs, latenessUs / 1E6, mSinceLastDropped); 1736a0b1d4b161599c2bb2a47119e50c51e75bbe980eAndreas Huber 173714f95746466fb6abdbbf33ee26d92ebf3fbef98fJames Dong mSinceLastDropped = 0; 173814f95746466fb6abdbbf33ee26d92ebf3fbef98fJames Dong mVideoBuffer->release(); 173914f95746466fb6abdbbf33ee26d92ebf3fbef98fJames Dong mVideoBuffer = NULL; 174014f95746466fb6abdbbf33ee26d92ebf3fbef98fJames Dong 174114f95746466fb6abdbbf33ee26d92ebf3fbef98fJames Dong { 174214f95746466fb6abdbbf33ee26d92ebf3fbef98fJames Dong Mutex::Autolock autoLock(mStatsLock); 174314f95746466fb6abdbbf33ee26d92ebf3fbef98fJames Dong ++mStats.mNumVideoFramesDropped; 174414f95746466fb6abdbbf33ee26d92ebf3fbef98fJames Dong } 174514f95746466fb6abdbbf33ee26d92ebf3fbef98fJames Dong 174614f95746466fb6abdbbf33ee26d92ebf3fbef98fJames Dong postVideoEvent_l(); 174714f95746466fb6abdbbf33ee26d92ebf3fbef98fJames Dong return; 174814f95746466fb6abdbbf33ee26d92ebf3fbef98fJames Dong } 1749aee6c07b3572bf2510cd9e7d29c454fcfedde31dpmehendale } 1750bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber 17512b1222f8938356669672f35e0e53e176c78c40efAndreas Huber if (latenessUs < -10000) { 17522b1222f8938356669672f35e0e53e176c78c40efAndreas Huber // We're more than 10ms early. 1753bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber 17542b1222f8938356669672f35e0e53e176c78c40efAndreas Huber postVideoEvent_l(10000); 17552b1222f8938356669672f35e0e53e176c78c40efAndreas Huber return; 17562b1222f8938356669672f35e0e53e176c78c40efAndreas Huber } 1757bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber } 1758bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber 175980ec929862bcfe8582984f3a28e7a4ca5f4f27bbGloria Wang if ((mNativeWindow != NULL) 176080ec929862bcfe8582984f3a28e7a4ca5f4f27bbGloria Wang && (mVideoRendererIsPreview || mVideoRenderer == NULL)) { 1761fa090f541bb84a546af2ec834e91a032ff10e66eAndreas Huber mVideoRendererIsPreview = false; 1762fa090f541bb84a546af2ec834e91a032ff10e66eAndreas Huber 1763a657f8deaf21acbe5faba7be1df9c6681d44d471Andreas Huber initRenderer_l(); 1764a657f8deaf21acbe5faba7be1df9c6681d44d471Andreas Huber } 1765a657f8deaf21acbe5faba7be1df9c6681d44d471Andreas Huber 1766a657f8deaf21acbe5faba7be1df9c6681d44d471Andreas Huber if (mVideoRenderer != NULL) { 176714f95746466fb6abdbbf33ee26d92ebf3fbef98fJames Dong mSinceLastDropped++; 1768a657f8deaf21acbe5faba7be1df9c6681d44d471Andreas Huber mVideoRenderer->render(mVideoBuffer); 1769a657f8deaf21acbe5faba7be1df9c6681d44d471Andreas Huber } 1770bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber 1771f5ab57c2d5e02af7483c94eddb177e4f5c9e9892Andreas Huber mVideoBuffer->release(); 1772bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber mVideoBuffer = NULL; 1773bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber 177464bb6983690bf994d904591145a3cdd6373bdbe6Andreas Huber if (wasSeeking != NO_SEEK && (mFlags & SEEK_PREVIEW)) { 1775a0b1d4b161599c2bb2a47119e50c51e75bbe980eAndreas Huber modifyFlags(SEEK_PREVIEW, CLEAR); 17762b1222f8938356669672f35e0e53e176c78c40efAndreas Huber return; 17772b1222f8938356669672f35e0e53e176c78c40efAndreas Huber } 17782b1222f8938356669672f35e0e53e176c78c40efAndreas Huber 1779bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber postVideoEvent_l(); 1780bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber} 1781bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber 1782bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Hubervoid AwesomePlayer::postVideoEvent_l(int64_t delayUs) { 1783bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber if (mVideoEventPending) { 1784bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber return; 1785bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber } 1786bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber 1787bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber mVideoEventPending = true; 1788bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber mQueue.postEventWithDelay(mVideoEvent, delayUs < 0 ? 10000 : delayUs); 1789bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber} 1790bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber 17915295c0c55d41a2906ea7f65a3f22e6278cb17d4bAndreas Hubervoid AwesomePlayer::postStreamDoneEvent_l(status_t status) { 1792bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber if (mStreamDoneEventPending) { 1793bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber return; 1794bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber } 1795bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber mStreamDoneEventPending = true; 17965295c0c55d41a2906ea7f65a3f22e6278cb17d4bAndreas Huber 17975295c0c55d41a2906ea7f65a3f22e6278cb17d4bAndreas Huber mStreamDoneStatus = status; 1798bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber mQueue.postEvent(mStreamDoneEvent); 1799bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber} 1800bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber 180166b0a35c9a4136a84c3f73b1b25fcb5220138b95Andreas Hubervoid AwesomePlayer::postBufferingEvent_l() { 180266b0a35c9a4136a84c3f73b1b25fcb5220138b95Andreas Huber if (mBufferingEventPending) { 180366b0a35c9a4136a84c3f73b1b25fcb5220138b95Andreas Huber return; 180466b0a35c9a4136a84c3f73b1b25fcb5220138b95Andreas Huber } 180566b0a35c9a4136a84c3f73b1b25fcb5220138b95Andreas Huber mBufferingEventPending = true; 180666b0a35c9a4136a84c3f73b1b25fcb5220138b95Andreas Huber mQueue.postEventWithDelay(mBufferingEvent, 1000000ll); 180766b0a35c9a4136a84c3f73b1b25fcb5220138b95Andreas Huber} 180866b0a35c9a4136a84c3f73b1b25fcb5220138b95Andreas Huber 1809145e68fc778275963189b02a1adcbe27cce4d769Andreas Hubervoid AwesomePlayer::postVideoLagEvent_l() { 1810145e68fc778275963189b02a1adcbe27cce4d769Andreas Huber if (mVideoLagEventPending) { 1811145e68fc778275963189b02a1adcbe27cce4d769Andreas Huber return; 1812145e68fc778275963189b02a1adcbe27cce4d769Andreas Huber } 1813145e68fc778275963189b02a1adcbe27cce4d769Andreas Huber mVideoLagEventPending = true; 1814145e68fc778275963189b02a1adcbe27cce4d769Andreas Huber mQueue.postEventWithDelay(mVideoLagEvent, 1000000ll); 1815145e68fc778275963189b02a1adcbe27cce4d769Andreas Huber} 1816145e68fc778275963189b02a1adcbe27cce4d769Andreas Huber 181702f6e988107bc13ebe4828b734ea0fc3d9d11ae0Andreas Hubervoid AwesomePlayer::postCheckAudioStatusEvent(int64_t delayUs) { 181802f6e988107bc13ebe4828b734ea0fc3d9d11ae0Andreas Huber Mutex::Autolock autoLock(mAudioLock); 18191862a33b246249630b654182afb5914da3480d4cAndreas Huber if (mAudioStatusEventPending) { 18201862a33b246249630b654182afb5914da3480d4cAndreas Huber return; 18211862a33b246249630b654182afb5914da3480d4cAndreas Huber } 18221862a33b246249630b654182afb5914da3480d4cAndreas Huber mAudioStatusEventPending = true; 182386d24aa35adf82512d341d9aaebd62b36b0a0847Eric Laurent // Do not honor delay when looping in order to limit audio gap 182486d24aa35adf82512d341d9aaebd62b36b0a0847Eric Laurent if (mFlags & (LOOPING | AUTO_LOOPING)) { 182586d24aa35adf82512d341d9aaebd62b36b0a0847Eric Laurent delayUs = 0; 182686d24aa35adf82512d341d9aaebd62b36b0a0847Eric Laurent } 182784b343f29063fbfa2ee61b2e3d37ba059ca507d4Andreas Huber mQueue.postEventWithDelay(mCheckAudioStatusEvent, delayUs); 18281862a33b246249630b654182afb5914da3480d4cAndreas Huber} 18291862a33b246249630b654182afb5914da3480d4cAndreas Huber 18301862a33b246249630b654182afb5914da3480d4cAndreas Hubervoid AwesomePlayer::onCheckAudioStatus() { 183102f6e988107bc13ebe4828b734ea0fc3d9d11ae0Andreas Huber { 183202f6e988107bc13ebe4828b734ea0fc3d9d11ae0Andreas Huber Mutex::Autolock autoLock(mAudioLock); 183302f6e988107bc13ebe4828b734ea0fc3d9d11ae0Andreas Huber if (!mAudioStatusEventPending) { 183402f6e988107bc13ebe4828b734ea0fc3d9d11ae0Andreas Huber // Event was dispatched and while we were blocking on the mutex, 183502f6e988107bc13ebe4828b734ea0fc3d9d11ae0Andreas Huber // has already been cancelled. 183602f6e988107bc13ebe4828b734ea0fc3d9d11ae0Andreas Huber return; 183702f6e988107bc13ebe4828b734ea0fc3d9d11ae0Andreas Huber } 183802f6e988107bc13ebe4828b734ea0fc3d9d11ae0Andreas Huber 183902f6e988107bc13ebe4828b734ea0fc3d9d11ae0Andreas Huber mAudioStatusEventPending = false; 1840d29345dfa29cdcc650f3705e43950ef2500f6728Andreas Huber } 1841d29345dfa29cdcc650f3705e43950ef2500f6728Andreas Huber 184202f6e988107bc13ebe4828b734ea0fc3d9d11ae0Andreas Huber Mutex::Autolock autoLock(mLock); 18431862a33b246249630b654182afb5914da3480d4cAndreas Huber 18441862a33b246249630b654182afb5914da3480d4cAndreas Huber if (mWatchForAudioSeekComplete && !mAudioPlayer->isSeeking()) { 18451862a33b246249630b654182afb5914da3480d4cAndreas Huber mWatchForAudioSeekComplete = false; 18461321fdd94d354431b930735e9f38f32ecd189a2dAndreas Huber 18471321fdd94d354431b930735e9f38f32ecd189a2dAndreas Huber if (!mSeekNotificationSent) { 18481321fdd94d354431b930735e9f38f32ecd189a2dAndreas Huber notifyListener_l(MEDIA_SEEK_COMPLETE); 18491321fdd94d354431b930735e9f38f32ecd189a2dAndreas Huber mSeekNotificationSent = true; 18501321fdd94d354431b930735e9f38f32ecd189a2dAndreas Huber } 1851dac4ee72bac87388a1495e098f39d73168c8078fAndreas Huber 185264bb6983690bf994d904591145a3cdd6373bdbe6Andreas Huber mSeeking = NO_SEEK; 18531862a33b246249630b654182afb5914da3480d4cAndreas Huber } 18541862a33b246249630b654182afb5914da3480d4cAndreas Huber 18555295c0c55d41a2906ea7f65a3f22e6278cb17d4bAndreas Huber status_t finalStatus; 18565295c0c55d41a2906ea7f65a3f22e6278cb17d4bAndreas Huber if (mWatchForAudioEOS && mAudioPlayer->reachedEOS(&finalStatus)) { 18571862a33b246249630b654182afb5914da3480d4cAndreas Huber mWatchForAudioEOS = false; 1858a0b1d4b161599c2bb2a47119e50c51e75bbe980eAndreas Huber modifyFlags(AUDIO_AT_EOS, SET); 1859a0b1d4b161599c2bb2a47119e50c51e75bbe980eAndreas Huber modifyFlags(FIRST_FRAME, SET); 18605295c0c55d41a2906ea7f65a3f22e6278cb17d4bAndreas Huber postStreamDoneEvent_l(finalStatus); 18611862a33b246249630b654182afb5914da3480d4cAndreas Huber } 18621862a33b246249630b654182afb5914da3480d4cAndreas Huber} 18631862a33b246249630b654182afb5914da3480d4cAndreas Huber 1864c23f12af0394aa2f6651968a3c8840f1af317aa1Andreas Huberstatus_t AwesomePlayer::prepare() { 1865c23f12af0394aa2f6651968a3c8840f1af317aa1Andreas Huber Mutex::Autolock autoLock(mLock); 1866bd22c52280179b29eefac91ef7e7bbbc33d25904Andreas Huber return prepare_l(); 1867bd22c52280179b29eefac91ef7e7bbbc33d25904Andreas Huber} 1868c23f12af0394aa2f6651968a3c8840f1af317aa1Andreas Huber 1869bd22c52280179b29eefac91ef7e7bbbc33d25904Andreas Huberstatus_t AwesomePlayer::prepare_l() { 1870bd22c52280179b29eefac91ef7e7bbbc33d25904Andreas Huber if (mFlags & PREPARED) { 1871bd22c52280179b29eefac91ef7e7bbbc33d25904Andreas Huber return OK; 1872bd22c52280179b29eefac91ef7e7bbbc33d25904Andreas Huber } 1873bd22c52280179b29eefac91ef7e7bbbc33d25904Andreas Huber 1874bd22c52280179b29eefac91ef7e7bbbc33d25904Andreas Huber if (mFlags & PREPARING) { 1875bd22c52280179b29eefac91ef7e7bbbc33d25904Andreas Huber return UNKNOWN_ERROR; 1876bd22c52280179b29eefac91ef7e7bbbc33d25904Andreas Huber } 1877bd22c52280179b29eefac91ef7e7bbbc33d25904Andreas Huber 1878bd22c52280179b29eefac91ef7e7bbbc33d25904Andreas Huber mIsAsyncPrepare = false; 1879c23f12af0394aa2f6651968a3c8840f1af317aa1Andreas Huber status_t err = prepareAsync_l(); 1880c23f12af0394aa2f6651968a3c8840f1af317aa1Andreas Huber 1881c23f12af0394aa2f6651968a3c8840f1af317aa1Andreas Huber if (err != OK) { 1882c23f12af0394aa2f6651968a3c8840f1af317aa1Andreas Huber return err; 1883c23f12af0394aa2f6651968a3c8840f1af317aa1Andreas Huber } 1884c23f12af0394aa2f6651968a3c8840f1af317aa1Andreas Huber 1885bd22c52280179b29eefac91ef7e7bbbc33d25904Andreas Huber while (mFlags & PREPARING) { 1886c23f12af0394aa2f6651968a3c8840f1af317aa1Andreas Huber mPreparedCondition.wait(mLock); 1887c23f12af0394aa2f6651968a3c8840f1af317aa1Andreas Huber } 1888c23f12af0394aa2f6651968a3c8840f1af317aa1Andreas Huber 1889bd22c52280179b29eefac91ef7e7bbbc33d25904Andreas Huber return mPrepareResult; 1890c23f12af0394aa2f6651968a3c8840f1af317aa1Andreas Huber} 1891c23f12af0394aa2f6651968a3c8840f1af317aa1Andreas Huber 1892c23f12af0394aa2f6651968a3c8840f1af317aa1Andreas Huberstatus_t AwesomePlayer::prepareAsync() { 1893c23f12af0394aa2f6651968a3c8840f1af317aa1Andreas Huber Mutex::Autolock autoLock(mLock); 1894bd22c52280179b29eefac91ef7e7bbbc33d25904Andreas Huber 1895bd22c52280179b29eefac91ef7e7bbbc33d25904Andreas Huber if (mFlags & PREPARING) { 1896bd22c52280179b29eefac91ef7e7bbbc33d25904Andreas Huber return UNKNOWN_ERROR; // async prepare already pending 1897bd22c52280179b29eefac91ef7e7bbbc33d25904Andreas Huber } 1898bd22c52280179b29eefac91ef7e7bbbc33d25904Andreas Huber 1899bd22c52280179b29eefac91ef7e7bbbc33d25904Andreas Huber mIsAsyncPrepare = true; 1900c23f12af0394aa2f6651968a3c8840f1af317aa1Andreas Huber return prepareAsync_l(); 1901c23f12af0394aa2f6651968a3c8840f1af317aa1Andreas Huber} 1902c23f12af0394aa2f6651968a3c8840f1af317aa1Andreas Huber 1903c23f12af0394aa2f6651968a3c8840f1af317aa1Andreas Huberstatus_t AwesomePlayer::prepareAsync_l() { 1904bd22c52280179b29eefac91ef7e7bbbc33d25904Andreas Huber if (mFlags & PREPARING) { 1905bd22c52280179b29eefac91ef7e7bbbc33d25904Andreas Huber return UNKNOWN_ERROR; // async prepare already pending 1906c23f12af0394aa2f6651968a3c8840f1af317aa1Andreas Huber } 1907c23f12af0394aa2f6651968a3c8840f1af317aa1Andreas Huber 19082e8ffaf95bd35358ecd14ddf00cddaf3abefe0a9Andreas Huber if (!mQueueStarted) { 19092e8ffaf95bd35358ecd14ddf00cddaf3abefe0a9Andreas Huber mQueue.start(); 19102e8ffaf95bd35358ecd14ddf00cddaf3abefe0a9Andreas Huber mQueueStarted = true; 19112e8ffaf95bd35358ecd14ddf00cddaf3abefe0a9Andreas Huber } 19122e8ffaf95bd35358ecd14ddf00cddaf3abefe0a9Andreas Huber 1913a0b1d4b161599c2bb2a47119e50c51e75bbe980eAndreas Huber modifyFlags(PREPARING, SET); 1914c23f12af0394aa2f6651968a3c8840f1af317aa1Andreas Huber mAsyncPrepareEvent = new AwesomeEvent( 1915c23f12af0394aa2f6651968a3c8840f1af317aa1Andreas Huber this, &AwesomePlayer::onPrepareAsyncEvent); 1916c23f12af0394aa2f6651968a3c8840f1af317aa1Andreas Huber 1917c23f12af0394aa2f6651968a3c8840f1af317aa1Andreas Huber mQueue.postEvent(mAsyncPrepareEvent); 1918c23f12af0394aa2f6651968a3c8840f1af317aa1Andreas Huber 1919c23f12af0394aa2f6651968a3c8840f1af317aa1Andreas Huber return OK; 1920c23f12af0394aa2f6651968a3c8840f1af317aa1Andreas Huber} 1921c23f12af0394aa2f6651968a3c8840f1af317aa1Andreas Huber 1922bd22c52280179b29eefac91ef7e7bbbc33d25904Andreas Huberstatus_t AwesomePlayer::finishSetDataSource_l() { 1923e94bd14078d327ef2f800e69907efce641a13272Andreas Huber sp<DataSource> dataSource; 1924e94bd14078d327ef2f800e69907efce641a13272Andreas Huber 1925681755fc0d0797506456f46a2a10555916d6be32Andreas Huber bool isWidevineStreaming = false; 1926681755fc0d0797506456f46a2a10555916d6be32Andreas Huber if (!strncasecmp("widevine://", mUri.string(), 11)) { 1927681755fc0d0797506456f46a2a10555916d6be32Andreas Huber isWidevineStreaming = true; 1928681755fc0d0797506456f46a2a10555916d6be32Andreas Huber 1929681755fc0d0797506456f46a2a10555916d6be32Andreas Huber String8 newURI = String8("http://"); 1930681755fc0d0797506456f46a2a10555916d6be32Andreas Huber newURI.append(mUri.string() + 11); 1931681755fc0d0797506456f46a2a10555916d6be32Andreas Huber 1932681755fc0d0797506456f46a2a10555916d6be32Andreas Huber mUri = newURI; 1933681755fc0d0797506456f46a2a10555916d6be32Andreas Huber } 1934681755fc0d0797506456f46a2a10555916d6be32Andreas Huber 1935a0f2bf56e30f580535229fa6a58e7d48b762727cAndreas Huber AString sniffedMIME; 1936a0f2bf56e30f580535229fa6a58e7d48b762727cAndreas Huber 19378cb0c4168bf4b678e4a6edfcf409247016be20d5Andreas Huber if (!strncasecmp("http://", mUri.string(), 7) 1938681755fc0d0797506456f46a2a10555916d6be32Andreas Huber || !strncasecmp("https://", mUri.string(), 8) 1939681755fc0d0797506456f46a2a10555916d6be32Andreas Huber || isWidevineStreaming) { 19401156dc913a5ba7b2bc86489468d4914430f03d14Andreas Huber mConnectingDataSource = HTTPBase::Create( 19411156dc913a5ba7b2bc86489468d4914430f03d14Andreas Huber (mFlags & INCOGNITO) 19421156dc913a5ba7b2bc86489468d4914430f03d14Andreas Huber ? HTTPBase::kFlagIncognito 19431156dc913a5ba7b2bc86489468d4914430f03d14Andreas Huber : 0); 1944e94bd14078d327ef2f800e69907efce641a13272Andreas Huber 19459b80c2bdb205bc143104f54d0743b6eedd67b14eAndreas Huber if (mUIDValid) { 19469b80c2bdb205bc143104f54d0743b6eedd67b14eAndreas Huber mConnectingDataSource->setUID(mUID); 19479b80c2bdb205bc143104f54d0743b6eedd67b14eAndreas Huber } 19489b80c2bdb205bc143104f54d0743b6eedd67b14eAndreas Huber 194949c59815369616b0fd5451ccabd377e8fe1dc3faAndreas Huber String8 cacheConfig; 195049c59815369616b0fd5451ccabd377e8fe1dc3faAndreas Huber bool disconnectAtHighwatermark; 195149c59815369616b0fd5451ccabd377e8fe1dc3faAndreas Huber NuCachedSource2::RemoveCacheSpecificHeaders( 195249c59815369616b0fd5451ccabd377e8fe1dc3faAndreas Huber &mUriHeaders, &cacheConfig, &disconnectAtHighwatermark); 195349c59815369616b0fd5451ccabd377e8fe1dc3faAndreas Huber 1954e94bd14078d327ef2f800e69907efce641a13272Andreas Huber mLock.unlock(); 195579f77ef3b0a37660ba8c5bcb2dfbfda3860f2135Andreas Huber status_t err = mConnectingDataSource->connect(mUri, &mUriHeaders); 1956e94bd14078d327ef2f800e69907efce641a13272Andreas Huber mLock.lock(); 1957e94bd14078d327ef2f800e69907efce641a13272Andreas Huber 1958e94bd14078d327ef2f800e69907efce641a13272Andreas Huber if (err != OK) { 1959e94bd14078d327ef2f800e69907efce641a13272Andreas Huber mConnectingDataSource.clear(); 1960e94bd14078d327ef2f800e69907efce641a13272Andreas Huber 1961df64d15042bbd5e0e4933ac49bf3c177dd94752cSteve Block ALOGI("mConnectingDataSource->connect() returned %d", err); 1962e94bd14078d327ef2f800e69907efce641a13272Andreas Huber return err; 1963e94bd14078d327ef2f800e69907efce641a13272Andreas Huber } 1964e94bd14078d327ef2f800e69907efce641a13272Andreas Huber 1965681755fc0d0797506456f46a2a10555916d6be32Andreas Huber if (!isWidevineStreaming) { 1966681755fc0d0797506456f46a2a10555916d6be32Andreas Huber // The widevine extractor does its own caching. 1967681755fc0d0797506456f46a2a10555916d6be32Andreas Huber 19680a5baa9b411fe086013d2a5e9126ed63fbad046cAndreas Huber#if 0 1969681755fc0d0797506456f46a2a10555916d6be32Andreas Huber mCachedSource = new NuCachedSource2( 1970681755fc0d0797506456f46a2a10555916d6be32Andreas Huber new ThrottledSource( 1971681755fc0d0797506456f46a2a10555916d6be32Andreas Huber mConnectingDataSource, 50 * 1024 /* bytes/sec */)); 19720a5baa9b411fe086013d2a5e9126ed63fbad046cAndreas Huber#else 197349c59815369616b0fd5451ccabd377e8fe1dc3faAndreas Huber mCachedSource = new NuCachedSource2( 197449c59815369616b0fd5451ccabd377e8fe1dc3faAndreas Huber mConnectingDataSource, 197549c59815369616b0fd5451ccabd377e8fe1dc3faAndreas Huber cacheConfig.isEmpty() ? NULL : cacheConfig.string(), 197649c59815369616b0fd5451ccabd377e8fe1dc3faAndreas Huber disconnectAtHighwatermark); 19770a5baa9b411fe086013d2a5e9126ed63fbad046cAndreas Huber#endif 1978681755fc0d0797506456f46a2a10555916d6be32Andreas Huber 1979681755fc0d0797506456f46a2a10555916d6be32Andreas Huber dataSource = mCachedSource; 1980681755fc0d0797506456f46a2a10555916d6be32Andreas Huber } else { 1981681755fc0d0797506456f46a2a10555916d6be32Andreas Huber dataSource = mConnectingDataSource; 1982681755fc0d0797506456f46a2a10555916d6be32Andreas Huber } 1983681755fc0d0797506456f46a2a10555916d6be32Andreas Huber 1984e94bd14078d327ef2f800e69907efce641a13272Andreas Huber mConnectingDataSource.clear(); 19850a5baa9b411fe086013d2a5e9126ed63fbad046cAndreas Huber 19866511c9755c3a3360ba869772600c7aae048a7ffcAndreas Huber String8 contentType = dataSource->getMIMEType(); 1987ac05c317cd818701535c5d72ce90da98c4bae75bAndreas Huber 19886511c9755c3a3360ba869772600c7aae048a7ffcAndreas Huber if (strncasecmp(contentType.string(), "audio/", 6)) { 19896511c9755c3a3360ba869772600c7aae048a7ffcAndreas Huber // We're not doing this for streams that appear to be audio-only 19906511c9755c3a3360ba869772600c7aae048a7ffcAndreas Huber // streams to ensure that even low bandwidth streams start 19916511c9755c3a3360ba869772600c7aae048a7ffcAndreas Huber // playing back fairly instantly. 1992ac05c317cd818701535c5d72ce90da98c4bae75bAndreas Huber 19936511c9755c3a3360ba869772600c7aae048a7ffcAndreas Huber // We're going to prefill the cache before trying to instantiate 19946511c9755c3a3360ba869772600c7aae048a7ffcAndreas Huber // the extractor below, as the latter is an operation that otherwise 19956511c9755c3a3360ba869772600c7aae048a7ffcAndreas Huber // could block on the datasource for a significant amount of time. 19966511c9755c3a3360ba869772600c7aae048a7ffcAndreas Huber // During that time we'd be unable to abort the preparation phase 19976511c9755c3a3360ba869772600c7aae048a7ffcAndreas Huber // without this prefill. 1998e39350924f4e743ec04cc9640526e06990c8cbdaJames Dong if (mCachedSource != NULL) { 1999e39350924f4e743ec04cc9640526e06990c8cbdaJames Dong // We're going to prefill the cache before trying to instantiate 2000e39350924f4e743ec04cc9640526e06990c8cbdaJames Dong // the extractor below, as the latter is an operation that otherwise 2001e39350924f4e743ec04cc9640526e06990c8cbdaJames Dong // could block on the datasource for a significant amount of time. 2002e39350924f4e743ec04cc9640526e06990c8cbdaJames Dong // During that time we'd be unable to abort the preparation phase 2003e39350924f4e743ec04cc9640526e06990c8cbdaJames Dong // without this prefill. 2004e39350924f4e743ec04cc9640526e06990c8cbdaJames Dong 2005e39350924f4e743ec04cc9640526e06990c8cbdaJames Dong mLock.unlock(); 2006e39350924f4e743ec04cc9640526e06990c8cbdaJames Dong 2007bab412099ab1bd3e9e942453cbb42c87ea9a59ecAndreas Huber // Initially make sure we have at least 192 KB for the sniff 2008a0f2bf56e30f580535229fa6a58e7d48b762727cAndreas Huber // to complete without blocking. 2009bab412099ab1bd3e9e942453cbb42c87ea9a59ecAndreas Huber static const size_t kMinBytesForSniffing = 192 * 1024; 2010a0f2bf56e30f580535229fa6a58e7d48b762727cAndreas Huber 2011a0f2bf56e30f580535229fa6a58e7d48b762727cAndreas Huber off64_t metaDataSize = -1ll; 2012e39350924f4e743ec04cc9640526e06990c8cbdaJames Dong for (;;) { 2013e39350924f4e743ec04cc9640526e06990c8cbdaJames Dong status_t finalStatus; 2014e39350924f4e743ec04cc9640526e06990c8cbdaJames Dong size_t cachedDataRemaining = 2015e39350924f4e743ec04cc9640526e06990c8cbdaJames Dong mCachedSource->approxDataRemaining(&finalStatus); 2016e39350924f4e743ec04cc9640526e06990c8cbdaJames Dong 2017a0f2bf56e30f580535229fa6a58e7d48b762727cAndreas Huber if (finalStatus != OK 2018a0f2bf56e30f580535229fa6a58e7d48b762727cAndreas Huber || (metaDataSize >= 0 2019a0f2bf56e30f580535229fa6a58e7d48b762727cAndreas Huber && cachedDataRemaining >= metaDataSize) 2020e39350924f4e743ec04cc9640526e06990c8cbdaJames Dong || (mFlags & PREPARE_CANCELLED)) { 2021e39350924f4e743ec04cc9640526e06990c8cbdaJames Dong break; 2022e39350924f4e743ec04cc9640526e06990c8cbdaJames Dong } 20236511c9755c3a3360ba869772600c7aae048a7ffcAndreas Huber 2024456caf3f5f0af673dc120c17c23635f40d8f5ac2Andreas Huber ALOGV("now cached %d bytes of data", cachedDataRemaining); 2025a0f2bf56e30f580535229fa6a58e7d48b762727cAndreas Huber 2026a0f2bf56e30f580535229fa6a58e7d48b762727cAndreas Huber if (metaDataSize < 0 2027a0f2bf56e30f580535229fa6a58e7d48b762727cAndreas Huber && cachedDataRemaining >= kMinBytesForSniffing) { 2028a0f2bf56e30f580535229fa6a58e7d48b762727cAndreas Huber String8 tmp; 2029a0f2bf56e30f580535229fa6a58e7d48b762727cAndreas Huber float confidence; 2030a0f2bf56e30f580535229fa6a58e7d48b762727cAndreas Huber sp<AMessage> meta; 2031a0f2bf56e30f580535229fa6a58e7d48b762727cAndreas Huber if (!dataSource->sniff(&tmp, &confidence, &meta)) { 2032a0f2bf56e30f580535229fa6a58e7d48b762727cAndreas Huber mLock.lock(); 2033a0f2bf56e30f580535229fa6a58e7d48b762727cAndreas Huber return UNKNOWN_ERROR; 2034a0f2bf56e30f580535229fa6a58e7d48b762727cAndreas Huber } 2035a0f2bf56e30f580535229fa6a58e7d48b762727cAndreas Huber 2036a0f2bf56e30f580535229fa6a58e7d48b762727cAndreas Huber // We successfully identified the file's extractor to 2037a0f2bf56e30f580535229fa6a58e7d48b762727cAndreas Huber // be, remember this mime type so we don't have to 2038a0f2bf56e30f580535229fa6a58e7d48b762727cAndreas Huber // sniff it again when we call MediaExtractor::Create() 2039a0f2bf56e30f580535229fa6a58e7d48b762727cAndreas Huber // below. 2040a0f2bf56e30f580535229fa6a58e7d48b762727cAndreas Huber sniffedMIME = tmp.string(); 2041a0f2bf56e30f580535229fa6a58e7d48b762727cAndreas Huber 2042a0f2bf56e30f580535229fa6a58e7d48b762727cAndreas Huber if (meta == NULL 2043a0f2bf56e30f580535229fa6a58e7d48b762727cAndreas Huber || !meta->findInt64( 2044a0f2bf56e30f580535229fa6a58e7d48b762727cAndreas Huber "meta-data-size", &metaDataSize)) { 2045a0f2bf56e30f580535229fa6a58e7d48b762727cAndreas Huber metaDataSize = kHighWaterMarkBytes; 2046a0f2bf56e30f580535229fa6a58e7d48b762727cAndreas Huber } 2047a0f2bf56e30f580535229fa6a58e7d48b762727cAndreas Huber 2048a0f2bf56e30f580535229fa6a58e7d48b762727cAndreas Huber CHECK_GE(metaDataSize, 0ll); 2049456caf3f5f0af673dc120c17c23635f40d8f5ac2Andreas Huber ALOGV("metaDataSize = %lld bytes", metaDataSize); 2050a0f2bf56e30f580535229fa6a58e7d48b762727cAndreas Huber } 2051a0f2bf56e30f580535229fa6a58e7d48b762727cAndreas Huber 2052e39350924f4e743ec04cc9640526e06990c8cbdaJames Dong usleep(200000); 20536511c9755c3a3360ba869772600c7aae048a7ffcAndreas Huber } 20546511c9755c3a3360ba869772600c7aae048a7ffcAndreas Huber 2055e39350924f4e743ec04cc9640526e06990c8cbdaJames Dong mLock.lock(); 2056ac05c317cd818701535c5d72ce90da98c4bae75bAndreas Huber } 2057ac05c317cd818701535c5d72ce90da98c4bae75bAndreas Huber 2058e39350924f4e743ec04cc9640526e06990c8cbdaJames Dong if (mFlags & PREPARE_CANCELLED) { 2059df64d15042bbd5e0e4933ac49bf3c177dd94752cSteve Block ALOGI("Prepare cancelled while waiting for initial cache fill."); 2060e39350924f4e743ec04cc9640526e06990c8cbdaJames Dong return UNKNOWN_ERROR; 2061e39350924f4e743ec04cc9640526e06990c8cbdaJames Dong } 2062ac05c317cd818701535c5d72ce90da98c4bae75bAndreas Huber } 2063e94bd14078d327ef2f800e69907efce641a13272Andreas Huber } else { 2064e94bd14078d327ef2f800e69907efce641a13272Andreas Huber dataSource = DataSource::CreateFromURI(mUri.string(), &mUriHeaders); 2065e94bd14078d327ef2f800e69907efce641a13272Andreas Huber } 2066bd22c52280179b29eefac91ef7e7bbbc33d25904Andreas Huber 2067bd22c52280179b29eefac91ef7e7bbbc33d25904Andreas Huber if (dataSource == NULL) { 2068bd22c52280179b29eefac91ef7e7bbbc33d25904Andreas Huber return UNKNOWN_ERROR; 2069bd22c52280179b29eefac91ef7e7bbbc33d25904Andreas Huber } 2070bd22c52280179b29eefac91ef7e7bbbc33d25904Andreas Huber 2071681755fc0d0797506456f46a2a10555916d6be32Andreas Huber sp<MediaExtractor> extractor; 2072bd22c52280179b29eefac91ef7e7bbbc33d25904Andreas Huber 2073681755fc0d0797506456f46a2a10555916d6be32Andreas Huber if (isWidevineStreaming) { 2074681755fc0d0797506456f46a2a10555916d6be32Andreas Huber String8 mimeType; 2075681755fc0d0797506456f46a2a10555916d6be32Andreas Huber float confidence; 2076681755fc0d0797506456f46a2a10555916d6be32Andreas Huber sp<AMessage> dummy; 20779d2f386dd2885eaffa11fd494ae258bb09fe6397James Dong bool success = SniffWVM(dataSource, &mimeType, &confidence, &dummy); 2078681755fc0d0797506456f46a2a10555916d6be32Andreas Huber 2079681755fc0d0797506456f46a2a10555916d6be32Andreas Huber if (!success 2080681755fc0d0797506456f46a2a10555916d6be32Andreas Huber || strcasecmp( 2081681755fc0d0797506456f46a2a10555916d6be32Andreas Huber mimeType.string(), MEDIA_MIMETYPE_CONTAINER_WVM)) { 2082681755fc0d0797506456f46a2a10555916d6be32Andreas Huber return ERROR_UNSUPPORTED; 2083681755fc0d0797506456f46a2a10555916d6be32Andreas Huber } 2084681755fc0d0797506456f46a2a10555916d6be32Andreas Huber 2085681755fc0d0797506456f46a2a10555916d6be32Andreas Huber mWVMExtractor = new WVMExtractor(dataSource); 2086681755fc0d0797506456f46a2a10555916d6be32Andreas Huber mWVMExtractor->setAdaptiveStreamingMode(true); 2087dce4161f7d4d39498f69591e876f5fecdde95833Jeff Tinker if (mUIDValid) 2088dce4161f7d4d39498f69591e876f5fecdde95833Jeff Tinker mWVMExtractor->setUID(mUID); 2089681755fc0d0797506456f46a2a10555916d6be32Andreas Huber extractor = mWVMExtractor; 2090681755fc0d0797506456f46a2a10555916d6be32Andreas Huber } else { 2091a0f2bf56e30f580535229fa6a58e7d48b762727cAndreas Huber extractor = MediaExtractor::Create( 2092a0f2bf56e30f580535229fa6a58e7d48b762727cAndreas Huber dataSource, sniffedMIME.empty() ? NULL : sniffedMIME.c_str()); 2093681755fc0d0797506456f46a2a10555916d6be32Andreas Huber 2094681755fc0d0797506456f46a2a10555916d6be32Andreas Huber if (extractor == NULL) { 2095681755fc0d0797506456f46a2a10555916d6be32Andreas Huber return UNKNOWN_ERROR; 2096681755fc0d0797506456f46a2a10555916d6be32Andreas Huber } 2097bd22c52280179b29eefac91ef7e7bbbc33d25904Andreas Huber } 2098bd22c52280179b29eefac91ef7e7bbbc33d25904Andreas Huber 20999d2f386dd2885eaffa11fd494ae258bb09fe6397James Dong if (extractor->getDrmFlag()) { 21009d2f386dd2885eaffa11fd494ae258bb09fe6397James Dong checkDrmStatus(dataSource); 2101dcd25efb46c41c8d24a0a9cf61fb57f84149709eGloria Wang } 2102dcd25efb46c41c8d24a0a9cf61fb57f84149709eGloria Wang 2103681755fc0d0797506456f46a2a10555916d6be32Andreas Huber status_t err = setDataSource_l(extractor); 2104681755fc0d0797506456f46a2a10555916d6be32Andreas Huber 2105681755fc0d0797506456f46a2a10555916d6be32Andreas Huber if (err != OK) { 2106681755fc0d0797506456f46a2a10555916d6be32Andreas Huber mWVMExtractor.clear(); 2107681755fc0d0797506456f46a2a10555916d6be32Andreas Huber 2108681755fc0d0797506456f46a2a10555916d6be32Andreas Huber return err; 2109681755fc0d0797506456f46a2a10555916d6be32Andreas Huber } 2110681755fc0d0797506456f46a2a10555916d6be32Andreas Huber 2111681755fc0d0797506456f46a2a10555916d6be32Andreas Huber return OK; 2112bd22c52280179b29eefac91ef7e7bbbc33d25904Andreas Huber} 2113bd22c52280179b29eefac91ef7e7bbbc33d25904Andreas Huber 211488d8a83de12592635248aa1a3bd6b9ea46108501Andreas Hubervoid AwesomePlayer::abortPrepare(status_t err) { 211588d8a83de12592635248aa1a3bd6b9ea46108501Andreas Huber CHECK(err != OK); 211688d8a83de12592635248aa1a3bd6b9ea46108501Andreas Huber 211788d8a83de12592635248aa1a3bd6b9ea46108501Andreas Huber if (mIsAsyncPrepare) { 211888d8a83de12592635248aa1a3bd6b9ea46108501Andreas Huber notifyListener_l(MEDIA_ERROR, MEDIA_ERROR_UNKNOWN, err); 211988d8a83de12592635248aa1a3bd6b9ea46108501Andreas Huber } 212088d8a83de12592635248aa1a3bd6b9ea46108501Andreas Huber 212188d8a83de12592635248aa1a3bd6b9ea46108501Andreas Huber mPrepareResult = err; 2122a0b1d4b161599c2bb2a47119e50c51e75bbe980eAndreas Huber modifyFlags((PREPARING|PREPARE_CANCELLED|PREPARING_CONNECTED), CLEAR); 212388d8a83de12592635248aa1a3bd6b9ea46108501Andreas Huber mAsyncPrepareEvent = NULL; 212488d8a83de12592635248aa1a3bd6b9ea46108501Andreas Huber mPreparedCondition.broadcast(); 212588d8a83de12592635248aa1a3bd6b9ea46108501Andreas Huber} 212688d8a83de12592635248aa1a3bd6b9ea46108501Andreas Huber 2127e966fb05c7e67a7f5dce65024de60aac83eb6f81Andreas Huber// static 2128e966fb05c7e67a7f5dce65024de60aac83eb6f81Andreas Huberbool AwesomePlayer::ContinuePreparation(void *cookie) { 2129e966fb05c7e67a7f5dce65024de60aac83eb6f81Andreas Huber AwesomePlayer *me = static_cast<AwesomePlayer *>(cookie); 2130e966fb05c7e67a7f5dce65024de60aac83eb6f81Andreas Huber 2131e966fb05c7e67a7f5dce65024de60aac83eb6f81Andreas Huber return (me->mFlags & PREPARE_CANCELLED) == 0; 2132e966fb05c7e67a7f5dce65024de60aac83eb6f81Andreas Huber} 2133e966fb05c7e67a7f5dce65024de60aac83eb6f81Andreas Huber 2134c23f12af0394aa2f6651968a3c8840f1af317aa1Andreas Hubervoid AwesomePlayer::onPrepareAsyncEvent() { 21358650e1960905097f6f1d6aa462ccb1c93c656834Andreas Huber Mutex::Autolock autoLock(mLock); 2136bd22c52280179b29eefac91ef7e7bbbc33d25904Andreas Huber 21378650e1960905097f6f1d6aa462ccb1c93c656834Andreas Huber if (mFlags & PREPARE_CANCELLED) { 2138df64d15042bbd5e0e4933ac49bf3c177dd94752cSteve Block ALOGI("prepare was cancelled before doing anything"); 21398650e1960905097f6f1d6aa462ccb1c93c656834Andreas Huber abortPrepare(UNKNOWN_ERROR); 21408650e1960905097f6f1d6aa462ccb1c93c656834Andreas Huber return; 21418650e1960905097f6f1d6aa462ccb1c93c656834Andreas Huber } 2142e94bd14078d327ef2f800e69907efce641a13272Andreas Huber 21438650e1960905097f6f1d6aa462ccb1c93c656834Andreas Huber if (mUri.size() > 0) { 21448650e1960905097f6f1d6aa462ccb1c93c656834Andreas Huber status_t err = finishSetDataSource_l(); 2145bd22c52280179b29eefac91ef7e7bbbc33d25904Andreas Huber 21468650e1960905097f6f1d6aa462ccb1c93c656834Andreas Huber if (err != OK) { 21478650e1960905097f6f1d6aa462ccb1c93c656834Andreas Huber abortPrepare(err); 21488650e1960905097f6f1d6aa462ccb1c93c656834Andreas Huber return; 2149bd22c52280179b29eefac91ef7e7bbbc33d25904Andreas Huber } 21508650e1960905097f6f1d6aa462ccb1c93c656834Andreas Huber } 2151bd22c52280179b29eefac91ef7e7bbbc33d25904Andreas Huber 21528650e1960905097f6f1d6aa462ccb1c93c656834Andreas Huber if (mVideoTrack != NULL && mVideoSource == NULL) { 21538650e1960905097f6f1d6aa462ccb1c93c656834Andreas Huber status_t err = initVideoDecoder(); 21541322e7ebc33e8e161fb73cd47e43dd93357608e4Andreas Huber 21558650e1960905097f6f1d6aa462ccb1c93c656834Andreas Huber if (err != OK) { 21568650e1960905097f6f1d6aa462ccb1c93c656834Andreas Huber abortPrepare(err); 21578650e1960905097f6f1d6aa462ccb1c93c656834Andreas Huber return; 21581322e7ebc33e8e161fb73cd47e43dd93357608e4Andreas Huber } 21598650e1960905097f6f1d6aa462ccb1c93c656834Andreas Huber } 21601322e7ebc33e8e161fb73cd47e43dd93357608e4Andreas Huber 21618650e1960905097f6f1d6aa462ccb1c93c656834Andreas Huber if (mAudioTrack != NULL && mAudioSource == NULL) { 21628650e1960905097f6f1d6aa462ccb1c93c656834Andreas Huber status_t err = initAudioDecoder(); 21631322e7ebc33e8e161fb73cd47e43dd93357608e4Andreas Huber 21648650e1960905097f6f1d6aa462ccb1c93c656834Andreas Huber if (err != OK) { 21658650e1960905097f6f1d6aa462ccb1c93c656834Andreas Huber abortPrepare(err); 21668650e1960905097f6f1d6aa462ccb1c93c656834Andreas Huber return; 21671322e7ebc33e8e161fb73cd47e43dd93357608e4Andreas Huber } 2168c23f12af0394aa2f6651968a3c8840f1af317aa1Andreas Huber } 2169c23f12af0394aa2f6651968a3c8840f1af317aa1Andreas Huber 2170a0b1d4b161599c2bb2a47119e50c51e75bbe980eAndreas Huber modifyFlags(PREPARING_CONNECTED, SET); 21716a05c9e912aeb8bfe1ef99516def91a177a481b6Andreas Huber 21722bfdd428c56c7524d1a11979f200a1762866032dAndreas Huber if (isStreamingHTTP()) { 21738650e1960905097f6f1d6aa462ccb1c93c656834Andreas Huber postBufferingEvent_l(); 21748650e1960905097f6f1d6aa462ccb1c93c656834Andreas Huber } else { 21758650e1960905097f6f1d6aa462ccb1c93c656834Andreas Huber finishAsyncPrepare_l(); 21768650e1960905097f6f1d6aa462ccb1c93c656834Andreas Huber } 21778650e1960905097f6f1d6aa462ccb1c93c656834Andreas Huber} 2178c23f12af0394aa2f6651968a3c8840f1af317aa1Andreas Huber 21798650e1960905097f6f1d6aa462ccb1c93c656834Andreas Hubervoid AwesomePlayer::finishAsyncPrepare_l() { 2180bd22c52280179b29eefac91ef7e7bbbc33d25904Andreas Huber if (mIsAsyncPrepare) { 21815daeb129a2c2ba3d14ccd94af283b5f561c783eaAndreas Huber if (mVideoSource == NULL) { 2182bd22c52280179b29eefac91ef7e7bbbc33d25904Andreas Huber notifyListener_l(MEDIA_SET_VIDEO_SIZE, 0, 0); 2183bd22c52280179b29eefac91ef7e7bbbc33d25904Andreas Huber } else { 21845daeb129a2c2ba3d14ccd94af283b5f561c783eaAndreas Huber notifyVideoSize_l(); 2185bd22c52280179b29eefac91ef7e7bbbc33d25904Andreas Huber } 2186c23f12af0394aa2f6651968a3c8840f1af317aa1Andreas Huber 2187bd22c52280179b29eefac91ef7e7bbbc33d25904Andreas Huber notifyListener_l(MEDIA_PREPARED); 2188bd22c52280179b29eefac91ef7e7bbbc33d25904Andreas Huber } 2189c23f12af0394aa2f6651968a3c8840f1af317aa1Andreas Huber 2190bd22c52280179b29eefac91ef7e7bbbc33d25904Andreas Huber mPrepareResult = OK; 2191a0b1d4b161599c2bb2a47119e50c51e75bbe980eAndreas Huber modifyFlags((PREPARING|PREPARE_CANCELLED|PREPARING_CONNECTED), CLEAR); 2192a0b1d4b161599c2bb2a47119e50c51e75bbe980eAndreas Huber modifyFlags(PREPARED, SET); 2193c23f12af0394aa2f6651968a3c8840f1af317aa1Andreas Huber mAsyncPrepareEvent = NULL; 2194bd22c52280179b29eefac91ef7e7bbbc33d25904Andreas Huber mPreparedCondition.broadcast(); 2195c23f12af0394aa2f6651968a3c8840f1af317aa1Andreas Huber} 2196c23f12af0394aa2f6651968a3c8840f1af317aa1Andreas Huber 2197acdd9d0f59c3d8bdc3de80664a609527ec3d21e2Andreas Huberuint32_t AwesomePlayer::flags() const { 2198acdd9d0f59c3d8bdc3de80664a609527ec3d21e2Andreas Huber return mExtractorFlags; 2199acdd9d0f59c3d8bdc3de80664a609527ec3d21e2Andreas Huber} 2200acdd9d0f59c3d8bdc3de80664a609527ec3d21e2Andreas Huber 220184b343f29063fbfa2ee61b2e3d37ba059ca507d4Andreas Hubervoid AwesomePlayer::postAudioEOS(int64_t delayUs) { 220202f6e988107bc13ebe4828b734ea0fc3d9d11ae0Andreas Huber postCheckAudioStatusEvent(delayUs); 2203ed54ad0f8619ae416b0968ade6248894cbfc4dbaAndreas Huber} 2204ed54ad0f8619ae416b0968ade6248894cbfc4dbaAndreas Huber 2205ed54ad0f8619ae416b0968ade6248894cbfc4dbaAndreas Hubervoid AwesomePlayer::postAudioSeekComplete() { 220602f6e988107bc13ebe4828b734ea0fc3d9d11ae0Andreas Huber postCheckAudioStatusEvent(0); 2207ed54ad0f8619ae416b0968ade6248894cbfc4dbaAndreas Huber} 2208ed54ad0f8619ae416b0968ade6248894cbfc4dbaAndreas Huber 22094f9e47f2c03ce36261c4717cd7e131d7940bb068Gloria Wangstatus_t AwesomePlayer::setParameter(int key, const Parcel &request) { 2210965d08ba16ee82bc85f69546360c18e7da907406Gloria Wang switch (key) { 22115b1b8a93a07326f1cbc627f09e02988375189e0aJames Dong case KEY_PARAMETER_CACHE_STAT_COLLECT_FREQ_MS: 22125b1b8a93a07326f1cbc627f09e02988375189e0aJames Dong { 22135b1b8a93a07326f1cbc627f09e02988375189e0aJames Dong return setCacheStatCollectFreq(request); 22145b1b8a93a07326f1cbc627f09e02988375189e0aJames Dong } 22157a8b0ed6419e57dd8b41d3806893d63d3df91aabJean-Michel Trivi case KEY_PARAMETER_PLAYBACK_RATE_PERMILLE: 22167a8b0ed6419e57dd8b41d3806893d63d3df91aabJean-Michel Trivi { 22177a8b0ed6419e57dd8b41d3806893d63d3df91aabJean-Michel Trivi if (mAudioPlayer != NULL) { 22187a8b0ed6419e57dd8b41d3806893d63d3df91aabJean-Michel Trivi return mAudioPlayer->setPlaybackRatePermille(request.readInt32()); 22197a8b0ed6419e57dd8b41d3806893d63d3df91aabJean-Michel Trivi } else { 22207a8b0ed6419e57dd8b41d3806893d63d3df91aabJean-Michel Trivi return NO_INIT; 22217a8b0ed6419e57dd8b41d3806893d63d3df91aabJean-Michel Trivi } 22227a8b0ed6419e57dd8b41d3806893d63d3df91aabJean-Michel Trivi } 2223965d08ba16ee82bc85f69546360c18e7da907406Gloria Wang default: 2224965d08ba16ee82bc85f69546360c18e7da907406Gloria Wang { 2225965d08ba16ee82bc85f69546360c18e7da907406Gloria Wang return ERROR_UNSUPPORTED; 2226965d08ba16ee82bc85f69546360c18e7da907406Gloria Wang } 22277a1e3e81264189e23a1db2b174e1b5a5d4c7d1c3Gloria Wang } 22284f9e47f2c03ce36261c4717cd7e131d7940bb068Gloria Wang} 22294f9e47f2c03ce36261c4717cd7e131d7940bb068Gloria Wang 22305b1b8a93a07326f1cbc627f09e02988375189e0aJames Dongstatus_t AwesomePlayer::setCacheStatCollectFreq(const Parcel &request) { 22315b1b8a93a07326f1cbc627f09e02988375189e0aJames Dong if (mCachedSource != NULL) { 22325b1b8a93a07326f1cbc627f09e02988375189e0aJames Dong int32_t freqMs = request.readInt32(); 2233b8a805261bf0282e992d3608035e47d05a898710Steve Block ALOGD("Request to keep cache stats in the past %d ms", 22345b1b8a93a07326f1cbc627f09e02988375189e0aJames Dong freqMs); 22355b1b8a93a07326f1cbc627f09e02988375189e0aJames Dong return mCachedSource->setCacheStatCollectFreq(freqMs); 22365b1b8a93a07326f1cbc627f09e02988375189e0aJames Dong } 22375b1b8a93a07326f1cbc627f09e02988375189e0aJames Dong return ERROR_UNSUPPORTED; 22385b1b8a93a07326f1cbc627f09e02988375189e0aJames Dong} 22395b1b8a93a07326f1cbc627f09e02988375189e0aJames Dong 22404f9e47f2c03ce36261c4717cd7e131d7940bb068Gloria Wangstatus_t AwesomePlayer::getParameter(int key, Parcel *reply) { 2241cd25fed09742235fac10953b9d4b77268c695063Glenn Kasten switch (key) { 2242cd25fed09742235fac10953b9d4b77268c695063Glenn Kasten case KEY_PARAMETER_AUDIO_CHANNEL_COUNT: 2243cd25fed09742235fac10953b9d4b77268c695063Glenn Kasten { 2244cd25fed09742235fac10953b9d4b77268c695063Glenn Kasten int32_t channelCount; 2245cd25fed09742235fac10953b9d4b77268c695063Glenn Kasten if (mAudioTrack == 0 || 2246cd25fed09742235fac10953b9d4b77268c695063Glenn Kasten !mAudioTrack->getFormat()->findInt32(kKeyChannelCount, &channelCount)) { 2247cd25fed09742235fac10953b9d4b77268c695063Glenn Kasten channelCount = 0; 2248cd25fed09742235fac10953b9d4b77268c695063Glenn Kasten } 2249cd25fed09742235fac10953b9d4b77268c695063Glenn Kasten reply->writeInt32(channelCount); 2250cd25fed09742235fac10953b9d4b77268c695063Glenn Kasten } 2251cd25fed09742235fac10953b9d4b77268c695063Glenn Kasten return OK; 2252cd25fed09742235fac10953b9d4b77268c695063Glenn Kasten default: 2253cd25fed09742235fac10953b9d4b77268c695063Glenn Kasten { 2254cd25fed09742235fac10953b9d4b77268c695063Glenn Kasten return ERROR_UNSUPPORTED; 2255cd25fed09742235fac10953b9d4b77268c695063Glenn Kasten } 2256cd25fed09742235fac10953b9d4b77268c695063Glenn Kasten } 22574f9e47f2c03ce36261c4717cd7e131d7940bb068Gloria Wang} 2258ed54ad0f8619ae416b0968ade6248894cbfc4dbaAndreas Huber 2259eec46abb88dcc50621fd2d3f17a6b8d24fd07a19James Dongstatus_t AwesomePlayer::getTrackInfo(Parcel *reply) const { 2260eec46abb88dcc50621fd2d3f17a6b8d24fd07a19James Dong Mutex::Autolock autoLock(mTimedTextLock); 2261eec46abb88dcc50621fd2d3f17a6b8d24fd07a19James Dong if (mTextDriver == NULL) { 2262eec46abb88dcc50621fd2d3f17a6b8d24fd07a19James Dong return INVALID_OPERATION; 2263eec46abb88dcc50621fd2d3f17a6b8d24fd07a19James Dong } 2264eec46abb88dcc50621fd2d3f17a6b8d24fd07a19James Dong 2265eec46abb88dcc50621fd2d3f17a6b8d24fd07a19James Dong reply->writeInt32(mTextDriver->countExternalTracks() + 2266eec46abb88dcc50621fd2d3f17a6b8d24fd07a19James Dong mExtractor->countTracks()); 2267eec46abb88dcc50621fd2d3f17a6b8d24fd07a19James Dong for (size_t i = 0; i < mExtractor->countTracks(); ++i) { 2268eec46abb88dcc50621fd2d3f17a6b8d24fd07a19James Dong sp<MetaData> meta = mExtractor->getTrackMetaData(i); 2269eec46abb88dcc50621fd2d3f17a6b8d24fd07a19James Dong 2270eec46abb88dcc50621fd2d3f17a6b8d24fd07a19James Dong const char *_mime; 2271eec46abb88dcc50621fd2d3f17a6b8d24fd07a19James Dong CHECK(meta->findCString(kKeyMIMEType, &_mime)); 2272eec46abb88dcc50621fd2d3f17a6b8d24fd07a19James Dong 2273eec46abb88dcc50621fd2d3f17a6b8d24fd07a19James Dong String8 mime = String8(_mime); 2274eec46abb88dcc50621fd2d3f17a6b8d24fd07a19James Dong 2275eec46abb88dcc50621fd2d3f17a6b8d24fd07a19James Dong reply->writeInt32(2); // 2 fields 2276eec46abb88dcc50621fd2d3f17a6b8d24fd07a19James Dong 2277eec46abb88dcc50621fd2d3f17a6b8d24fd07a19James Dong if (!strncasecmp(mime.string(), "video/", 6)) { 2278eec46abb88dcc50621fd2d3f17a6b8d24fd07a19James Dong reply->writeInt32(MEDIA_TRACK_TYPE_VIDEO); 2279eec46abb88dcc50621fd2d3f17a6b8d24fd07a19James Dong } else if (!strncasecmp(mime.string(), "audio/", 6)) { 2280eec46abb88dcc50621fd2d3f17a6b8d24fd07a19James Dong reply->writeInt32(MEDIA_TRACK_TYPE_AUDIO); 2281eec46abb88dcc50621fd2d3f17a6b8d24fd07a19James Dong } else if (!strcasecmp(mime.string(), MEDIA_MIMETYPE_TEXT_3GPP)) { 2282eec46abb88dcc50621fd2d3f17a6b8d24fd07a19James Dong reply->writeInt32(MEDIA_TRACK_TYPE_TIMEDTEXT); 2283eec46abb88dcc50621fd2d3f17a6b8d24fd07a19James Dong } else { 2284eec46abb88dcc50621fd2d3f17a6b8d24fd07a19James Dong reply->writeInt32(MEDIA_TRACK_TYPE_UNKNOWN); 2285eec46abb88dcc50621fd2d3f17a6b8d24fd07a19James Dong } 2286eec46abb88dcc50621fd2d3f17a6b8d24fd07a19James Dong 2287eec46abb88dcc50621fd2d3f17a6b8d24fd07a19James Dong const char *lang; 2288eec46abb88dcc50621fd2d3f17a6b8d24fd07a19James Dong if (meta->findCString(kKeyMediaLanguage, &lang)) { 2289eec46abb88dcc50621fd2d3f17a6b8d24fd07a19James Dong reply->writeString16(String16(lang)); 2290eec46abb88dcc50621fd2d3f17a6b8d24fd07a19James Dong } else { 2291eec46abb88dcc50621fd2d3f17a6b8d24fd07a19James Dong reply->writeString16(String16("")); 2292eec46abb88dcc50621fd2d3f17a6b8d24fd07a19James Dong } 2293eec46abb88dcc50621fd2d3f17a6b8d24fd07a19James Dong } 2294eec46abb88dcc50621fd2d3f17a6b8d24fd07a19James Dong 2295eec46abb88dcc50621fd2d3f17a6b8d24fd07a19James Dong mTextDriver->getExternalTrackInfo(reply); 2296eec46abb88dcc50621fd2d3f17a6b8d24fd07a19James Dong return OK; 2297eec46abb88dcc50621fd2d3f17a6b8d24fd07a19James Dong} 2298eec46abb88dcc50621fd2d3f17a6b8d24fd07a19James Dong 2299eec46abb88dcc50621fd2d3f17a6b8d24fd07a19James Dong// FIXME: 2300eec46abb88dcc50621fd2d3f17a6b8d24fd07a19James Dong// At present, only timed text track is able to be selected or unselected. 2301eec46abb88dcc50621fd2d3f17a6b8d24fd07a19James Dongstatus_t AwesomePlayer::selectTrack(size_t trackIndex, bool select) { 2302eec46abb88dcc50621fd2d3f17a6b8d24fd07a19James Dong Mutex::Autolock autoLock(mTimedTextLock); 2303eec46abb88dcc50621fd2d3f17a6b8d24fd07a19James Dong if (mTextDriver == NULL) { 2304eec46abb88dcc50621fd2d3f17a6b8d24fd07a19James Dong return INVALID_OPERATION; 2305eec46abb88dcc50621fd2d3f17a6b8d24fd07a19James Dong } 2306eec46abb88dcc50621fd2d3f17a6b8d24fd07a19James Dong 2307eec46abb88dcc50621fd2d3f17a6b8d24fd07a19James Dong if (trackIndex >= mExtractor->countTracks() 2308eec46abb88dcc50621fd2d3f17a6b8d24fd07a19James Dong + mTextDriver->countExternalTracks()) { 2309eec46abb88dcc50621fd2d3f17a6b8d24fd07a19James Dong return BAD_VALUE; 2310eec46abb88dcc50621fd2d3f17a6b8d24fd07a19James Dong } 2311eec46abb88dcc50621fd2d3f17a6b8d24fd07a19James Dong 2312eec46abb88dcc50621fd2d3f17a6b8d24fd07a19James Dong if (trackIndex < mExtractor->countTracks()) { 2313eec46abb88dcc50621fd2d3f17a6b8d24fd07a19James Dong sp<MetaData> meta = mExtractor->getTrackMetaData(trackIndex); 2314eec46abb88dcc50621fd2d3f17a6b8d24fd07a19James Dong const char *_mime; 2315eec46abb88dcc50621fd2d3f17a6b8d24fd07a19James Dong CHECK(meta->findCString(kKeyMIMEType, &_mime)); 2316eec46abb88dcc50621fd2d3f17a6b8d24fd07a19James Dong String8 mime = String8(_mime); 2317eec46abb88dcc50621fd2d3f17a6b8d24fd07a19James Dong 2318eec46abb88dcc50621fd2d3f17a6b8d24fd07a19James Dong if (strcasecmp(mime.string(), MEDIA_MIMETYPE_TEXT_3GPP)) { 2319eec46abb88dcc50621fd2d3f17a6b8d24fd07a19James Dong return ERROR_UNSUPPORTED; 2320eec46abb88dcc50621fd2d3f17a6b8d24fd07a19James Dong } 2321eec46abb88dcc50621fd2d3f17a6b8d24fd07a19James Dong } 2322eec46abb88dcc50621fd2d3f17a6b8d24fd07a19James Dong 2323eec46abb88dcc50621fd2d3f17a6b8d24fd07a19James Dong status_t err = OK; 2324eec46abb88dcc50621fd2d3f17a6b8d24fd07a19James Dong if (select) { 2325eec46abb88dcc50621fd2d3f17a6b8d24fd07a19James Dong err = mTextDriver->selectTrack(trackIndex); 2326eec46abb88dcc50621fd2d3f17a6b8d24fd07a19James Dong if (err == OK) { 2327eec46abb88dcc50621fd2d3f17a6b8d24fd07a19James Dong modifyFlags(TEXTPLAYER_INITIALIZED, SET); 2328eec46abb88dcc50621fd2d3f17a6b8d24fd07a19James Dong if (mFlags & PLAYING && !(mFlags & TEXT_RUNNING)) { 2329eec46abb88dcc50621fd2d3f17a6b8d24fd07a19James Dong mTextDriver->start(); 2330eec46abb88dcc50621fd2d3f17a6b8d24fd07a19James Dong modifyFlags(TEXT_RUNNING, SET); 2331eec46abb88dcc50621fd2d3f17a6b8d24fd07a19James Dong } 2332eec46abb88dcc50621fd2d3f17a6b8d24fd07a19James Dong } 2333eec46abb88dcc50621fd2d3f17a6b8d24fd07a19James Dong } else { 2334eec46abb88dcc50621fd2d3f17a6b8d24fd07a19James Dong err = mTextDriver->unselectTrack(trackIndex); 2335eec46abb88dcc50621fd2d3f17a6b8d24fd07a19James Dong if (err == OK) { 2336eec46abb88dcc50621fd2d3f17a6b8d24fd07a19James Dong modifyFlags(TEXTPLAYER_INITIALIZED, CLEAR); 2337eec46abb88dcc50621fd2d3f17a6b8d24fd07a19James Dong modifyFlags(TEXT_RUNNING, CLEAR); 2338eec46abb88dcc50621fd2d3f17a6b8d24fd07a19James Dong } 2339eec46abb88dcc50621fd2d3f17a6b8d24fd07a19James Dong } 2340eec46abb88dcc50621fd2d3f17a6b8d24fd07a19James Dong return err; 2341eec46abb88dcc50621fd2d3f17a6b8d24fd07a19James Dong} 2342eec46abb88dcc50621fd2d3f17a6b8d24fd07a19James Dong 2343eec46abb88dcc50621fd2d3f17a6b8d24fd07a19James Dongsize_t AwesomePlayer::countTracks() const { 2344eec46abb88dcc50621fd2d3f17a6b8d24fd07a19James Dong return mExtractor->countTracks() + mTextDriver->countExternalTracks(); 2345eec46abb88dcc50621fd2d3f17a6b8d24fd07a19James Dong} 2346eec46abb88dcc50621fd2d3f17a6b8d24fd07a19James Dong 2347f9d660a5e0196240add5daf0199f128d471e592cInsun Kangstatus_t AwesomePlayer::invoke(const Parcel &request, Parcel *reply) { 2348f9d660a5e0196240add5daf0199f128d471e592cInsun Kang if (NULL == reply) { 2349f9d660a5e0196240add5daf0199f128d471e592cInsun Kang return android::BAD_VALUE; 2350f9d660a5e0196240add5daf0199f128d471e592cInsun Kang } 2351f9d660a5e0196240add5daf0199f128d471e592cInsun Kang int32_t methodId; 2352f9d660a5e0196240add5daf0199f128d471e592cInsun Kang status_t ret = request.readInt32(&methodId); 2353f9d660a5e0196240add5daf0199f128d471e592cInsun Kang if (ret != android::OK) { 2354f9d660a5e0196240add5daf0199f128d471e592cInsun Kang return ret; 2355f9d660a5e0196240add5daf0199f128d471e592cInsun Kang } 2356f9d660a5e0196240add5daf0199f128d471e592cInsun Kang switch(methodId) { 2357f9d660a5e0196240add5daf0199f128d471e592cInsun Kang case INVOKE_ID_GET_TRACK_INFO: 2358f9d660a5e0196240add5daf0199f128d471e592cInsun Kang { 2359eec46abb88dcc50621fd2d3f17a6b8d24fd07a19James Dong return getTrackInfo(reply); 2360f9d660a5e0196240add5daf0199f128d471e592cInsun Kang } 2361f9d660a5e0196240add5daf0199f128d471e592cInsun Kang case INVOKE_ID_ADD_EXTERNAL_SOURCE: 2362f9d660a5e0196240add5daf0199f128d471e592cInsun Kang { 2363f9d660a5e0196240add5daf0199f128d471e592cInsun Kang Mutex::Autolock autoLock(mTimedTextLock); 2364f9d660a5e0196240add5daf0199f128d471e592cInsun Kang if (mTextDriver == NULL) { 2365f9d660a5e0196240add5daf0199f128d471e592cInsun Kang mTextDriver = new TimedTextDriver(mListener); 2366f9d660a5e0196240add5daf0199f128d471e592cInsun Kang } 2367f9d660a5e0196240add5daf0199f128d471e592cInsun Kang // String values written in Parcel are UTF-16 values. 23687c5afe93c9ca2f9f3958663bc3fa9649ec2f5331Insun Kang String8 uri(request.readString16()); 23697c5afe93c9ca2f9f3958663bc3fa9649ec2f5331Insun Kang String8 mimeType(request.readString16()); 2370eec46abb88dcc50621fd2d3f17a6b8d24fd07a19James Dong size_t nTracks = countTracks(); 2371eec46abb88dcc50621fd2d3f17a6b8d24fd07a19James Dong return mTextDriver->addOutOfBandTextSource(nTracks, uri, mimeType); 2372f9d660a5e0196240add5daf0199f128d471e592cInsun Kang } 2373f9d660a5e0196240add5daf0199f128d471e592cInsun Kang case INVOKE_ID_ADD_EXTERNAL_SOURCE_FD: 2374f9d660a5e0196240add5daf0199f128d471e592cInsun Kang { 2375f9d660a5e0196240add5daf0199f128d471e592cInsun Kang Mutex::Autolock autoLock(mTimedTextLock); 2376f9d660a5e0196240add5daf0199f128d471e592cInsun Kang if (mTextDriver == NULL) { 2377f9d660a5e0196240add5daf0199f128d471e592cInsun Kang mTextDriver = new TimedTextDriver(mListener); 2378f9d660a5e0196240add5daf0199f128d471e592cInsun Kang } 2379f9d660a5e0196240add5daf0199f128d471e592cInsun Kang int fd = request.readFileDescriptor(); 2380f9d660a5e0196240add5daf0199f128d471e592cInsun Kang off64_t offset = request.readInt64(); 2381613c8ae1b7a2b4f43b33a72dc2fff0bc8b7d4c6fJames Dong off64_t length = request.readInt64(); 23827c5afe93c9ca2f9f3958663bc3fa9649ec2f5331Insun Kang String8 mimeType(request.readString16()); 2383eec46abb88dcc50621fd2d3f17a6b8d24fd07a19James Dong size_t nTracks = countTracks(); 2384f9d660a5e0196240add5daf0199f128d471e592cInsun Kang return mTextDriver->addOutOfBandTextSource( 2385eec46abb88dcc50621fd2d3f17a6b8d24fd07a19James Dong nTracks, fd, offset, length, mimeType); 2386f9d660a5e0196240add5daf0199f128d471e592cInsun Kang } 2387f9d660a5e0196240add5daf0199f128d471e592cInsun Kang case INVOKE_ID_SELECT_TRACK: 2388f9d660a5e0196240add5daf0199f128d471e592cInsun Kang { 2389eec46abb88dcc50621fd2d3f17a6b8d24fd07a19James Dong int trackIndex = request.readInt32(); 2390eec46abb88dcc50621fd2d3f17a6b8d24fd07a19James Dong return selectTrack(trackIndex, true); 2391f9d660a5e0196240add5daf0199f128d471e592cInsun Kang } 2392f9d660a5e0196240add5daf0199f128d471e592cInsun Kang case INVOKE_ID_UNSELECT_TRACK: 2393f9d660a5e0196240add5daf0199f128d471e592cInsun Kang { 2394eec46abb88dcc50621fd2d3f17a6b8d24fd07a19James Dong int trackIndex = request.readInt32(); 2395eec46abb88dcc50621fd2d3f17a6b8d24fd07a19James Dong return selectTrack(trackIndex, false); 2396f9d660a5e0196240add5daf0199f128d471e592cInsun Kang } 2397f9d660a5e0196240add5daf0199f128d471e592cInsun Kang default: 2398f9d660a5e0196240add5daf0199f128d471e592cInsun Kang { 2399f9d660a5e0196240add5daf0199f128d471e592cInsun Kang return ERROR_UNSUPPORTED; 2400f9d660a5e0196240add5daf0199f128d471e592cInsun Kang } 2401f9d660a5e0196240add5daf0199f128d471e592cInsun Kang } 2402f9d660a5e0196240add5daf0199f128d471e592cInsun Kang // It will not reach here. 2403f9d660a5e0196240add5daf0199f128d471e592cInsun Kang return OK; 2404f9d660a5e0196240add5daf0199f128d471e592cInsun Kang} 2405f9d660a5e0196240add5daf0199f128d471e592cInsun Kang 2406681755fc0d0797506456f46a2a10555916d6be32Andreas Huberbool AwesomePlayer::isStreamingHTTP() const { 2407681755fc0d0797506456f46a2a10555916d6be32Andreas Huber return mCachedSource != NULL || mWVMExtractor != NULL; 2408681755fc0d0797506456f46a2a10555916d6be32Andreas Huber} 2409681755fc0d0797506456f46a2a10555916d6be32Andreas Huber 2410a0b1d4b161599c2bb2a47119e50c51e75bbe980eAndreas Huberstatus_t AwesomePlayer::dump(int fd, const Vector<String16> &args) const { 2411a0b1d4b161599c2bb2a47119e50c51e75bbe980eAndreas Huber Mutex::Autolock autoLock(mStatsLock); 2412a0b1d4b161599c2bb2a47119e50c51e75bbe980eAndreas Huber 2413a0b1d4b161599c2bb2a47119e50c51e75bbe980eAndreas Huber FILE *out = fdopen(dup(fd), "w"); 2414a0b1d4b161599c2bb2a47119e50c51e75bbe980eAndreas Huber 2415a0b1d4b161599c2bb2a47119e50c51e75bbe980eAndreas Huber fprintf(out, " AwesomePlayer\n"); 2416a0b1d4b161599c2bb2a47119e50c51e75bbe980eAndreas Huber if (mStats.mFd < 0) { 2417a0b1d4b161599c2bb2a47119e50c51e75bbe980eAndreas Huber fprintf(out, " URI(%s)", mStats.mURI.string()); 2418a0b1d4b161599c2bb2a47119e50c51e75bbe980eAndreas Huber } else { 2419a0b1d4b161599c2bb2a47119e50c51e75bbe980eAndreas Huber fprintf(out, " fd(%d)", mStats.mFd); 2420a0b1d4b161599c2bb2a47119e50c51e75bbe980eAndreas Huber } 2421a0b1d4b161599c2bb2a47119e50c51e75bbe980eAndreas Huber 2422a0b1d4b161599c2bb2a47119e50c51e75bbe980eAndreas Huber fprintf(out, ", flags(0x%08x)", mStats.mFlags); 2423a0b1d4b161599c2bb2a47119e50c51e75bbe980eAndreas Huber 2424a0b1d4b161599c2bb2a47119e50c51e75bbe980eAndreas Huber if (mStats.mBitrate >= 0) { 2425a0b1d4b161599c2bb2a47119e50c51e75bbe980eAndreas Huber fprintf(out, ", bitrate(%lld bps)", mStats.mBitrate); 2426a0b1d4b161599c2bb2a47119e50c51e75bbe980eAndreas Huber } 2427a0b1d4b161599c2bb2a47119e50c51e75bbe980eAndreas Huber 2428a0b1d4b161599c2bb2a47119e50c51e75bbe980eAndreas Huber fprintf(out, "\n"); 2429a0b1d4b161599c2bb2a47119e50c51e75bbe980eAndreas Huber 2430a0b1d4b161599c2bb2a47119e50c51e75bbe980eAndreas Huber for (size_t i = 0; i < mStats.mTracks.size(); ++i) { 2431a0b1d4b161599c2bb2a47119e50c51e75bbe980eAndreas Huber const TrackStat &stat = mStats.mTracks.itemAt(i); 2432a0b1d4b161599c2bb2a47119e50c51e75bbe980eAndreas Huber 2433a0b1d4b161599c2bb2a47119e50c51e75bbe980eAndreas Huber fprintf(out, " Track %d\n", i + 1); 2434a0b1d4b161599c2bb2a47119e50c51e75bbe980eAndreas Huber fprintf(out, " MIME(%s)", stat.mMIME.string()); 2435a0b1d4b161599c2bb2a47119e50c51e75bbe980eAndreas Huber 2436a0b1d4b161599c2bb2a47119e50c51e75bbe980eAndreas Huber if (!stat.mDecoderName.isEmpty()) { 2437a0b1d4b161599c2bb2a47119e50c51e75bbe980eAndreas Huber fprintf(out, ", decoder(%s)", stat.mDecoderName.string()); 2438a0b1d4b161599c2bb2a47119e50c51e75bbe980eAndreas Huber } 2439a0b1d4b161599c2bb2a47119e50c51e75bbe980eAndreas Huber 2440a0b1d4b161599c2bb2a47119e50c51e75bbe980eAndreas Huber fprintf(out, "\n"); 2441a0b1d4b161599c2bb2a47119e50c51e75bbe980eAndreas Huber 2442a0b1d4b161599c2bb2a47119e50c51e75bbe980eAndreas Huber if ((ssize_t)i == mStats.mVideoTrackIndex) { 2443a0b1d4b161599c2bb2a47119e50c51e75bbe980eAndreas Huber fprintf(out, 2444a0b1d4b161599c2bb2a47119e50c51e75bbe980eAndreas Huber " videoDimensions(%d x %d), " 2445a0b1d4b161599c2bb2a47119e50c51e75bbe980eAndreas Huber "numVideoFramesDecoded(%lld), " 2446a0b1d4b161599c2bb2a47119e50c51e75bbe980eAndreas Huber "numVideoFramesDropped(%lld)\n", 2447a0b1d4b161599c2bb2a47119e50c51e75bbe980eAndreas Huber mStats.mVideoWidth, 2448a0b1d4b161599c2bb2a47119e50c51e75bbe980eAndreas Huber mStats.mVideoHeight, 2449a0b1d4b161599c2bb2a47119e50c51e75bbe980eAndreas Huber mStats.mNumVideoFramesDecoded, 2450a0b1d4b161599c2bb2a47119e50c51e75bbe980eAndreas Huber mStats.mNumVideoFramesDropped); 2451a0b1d4b161599c2bb2a47119e50c51e75bbe980eAndreas Huber } 2452a0b1d4b161599c2bb2a47119e50c51e75bbe980eAndreas Huber } 2453a0b1d4b161599c2bb2a47119e50c51e75bbe980eAndreas Huber 2454a0b1d4b161599c2bb2a47119e50c51e75bbe980eAndreas Huber fclose(out); 2455a0b1d4b161599c2bb2a47119e50c51e75bbe980eAndreas Huber out = NULL; 2456a0b1d4b161599c2bb2a47119e50c51e75bbe980eAndreas Huber 2457a0b1d4b161599c2bb2a47119e50c51e75bbe980eAndreas Huber return OK; 2458a0b1d4b161599c2bb2a47119e50c51e75bbe980eAndreas Huber} 2459a0b1d4b161599c2bb2a47119e50c51e75bbe980eAndreas Huber 2460a0b1d4b161599c2bb2a47119e50c51e75bbe980eAndreas Hubervoid AwesomePlayer::modifyFlags(unsigned value, FlagMode mode) { 2461a0b1d4b161599c2bb2a47119e50c51e75bbe980eAndreas Huber switch (mode) { 2462a0b1d4b161599c2bb2a47119e50c51e75bbe980eAndreas Huber case SET: 2463a0b1d4b161599c2bb2a47119e50c51e75bbe980eAndreas Huber mFlags |= value; 2464a0b1d4b161599c2bb2a47119e50c51e75bbe980eAndreas Huber break; 2465a0b1d4b161599c2bb2a47119e50c51e75bbe980eAndreas Huber case CLEAR: 2466a0b1d4b161599c2bb2a47119e50c51e75bbe980eAndreas Huber mFlags &= ~value; 2467a0b1d4b161599c2bb2a47119e50c51e75bbe980eAndreas Huber break; 2468a0b1d4b161599c2bb2a47119e50c51e75bbe980eAndreas Huber case ASSIGN: 2469a0b1d4b161599c2bb2a47119e50c51e75bbe980eAndreas Huber mFlags = value; 2470a0b1d4b161599c2bb2a47119e50c51e75bbe980eAndreas Huber break; 2471a0b1d4b161599c2bb2a47119e50c51e75bbe980eAndreas Huber default: 2472a0b1d4b161599c2bb2a47119e50c51e75bbe980eAndreas Huber TRESPASS(); 2473a0b1d4b161599c2bb2a47119e50c51e75bbe980eAndreas Huber } 2474a0b1d4b161599c2bb2a47119e50c51e75bbe980eAndreas Huber 2475a0b1d4b161599c2bb2a47119e50c51e75bbe980eAndreas Huber { 2476a0b1d4b161599c2bb2a47119e50c51e75bbe980eAndreas Huber Mutex::Autolock autoLock(mStatsLock); 2477a0b1d4b161599c2bb2a47119e50c51e75bbe980eAndreas Huber mStats.mFlags = mFlags; 2478a0b1d4b161599c2bb2a47119e50c51e75bbe980eAndreas Huber } 2479a0b1d4b161599c2bb2a47119e50c51e75bbe980eAndreas Huber} 2480a0b1d4b161599c2bb2a47119e50c51e75bbe980eAndreas Huber 2481bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber} // namespace android 2482