PreviewPlayer.cpp revision 90b6191067990a7a3ee947d7ce08c64f780f0de7
1643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi/* 2643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi * Copyright (C) 2011 The Android Open Source Project 3643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi * 4643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi * Licensed under the Apache License, Version 2.0 (the "License"); 5643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi * you may not use this file except in compliance with the License. 6643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi * You may obtain a copy of the License at 7643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi * 8643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi * http://www.apache.org/licenses/LICENSE-2.0 9643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi * 10643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi * Unless required by applicable law or agreed to in writing, software 11643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi * distributed under the License is distributed on an "AS IS" BASIS, 12643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi * See the License for the specific language governing permissions and 14643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi * limitations under the License. 15643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi */ 16643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi 17bfece17c8f63de4d4b686da50f8ecac2f6f8ec53Santosh Madhava 1800f742c087d92e5452d29be1fb668022b5f8a6c7James Dong// #define LOG_NDEBUG 0 19643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi#define LOG_TAG "PreviewPlayer" 20643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi#include <utils/Log.h> 21643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi 22643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi#include <binder/IPCThreadState.h> 2300f742c087d92e5452d29be1fb668022b5f8a6c7James Dong#include <binder/IServiceManager.h> 2400f742c087d92e5452d29be1fb668022b5f8a6c7James Dong#include <media/IMediaPlayerService.h> 25643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi#include <media/stagefright/DataSource.h> 26643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi#include <media/stagefright/MediaBuffer.h> 27643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi#include <media/stagefright/MediaDefs.h> 28643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi#include <media/stagefright/MediaExtractor.h> 29643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi#include <media/stagefright/MediaSource.h> 30643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi#include <media/stagefright/MetaData.h> 31643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi#include <media/stagefright/OMXCodec.h> 3200f742c087d92e5452d29be1fb668022b5f8a6c7James Dong#include <media/stagefright/foundation/ADebug.h> 3390b6191067990a7a3ee947d7ce08c64f780f0de7Mathias Agopian#include <gui/Surface.h> 3400f742c087d92e5452d29be1fb668022b5f8a6c7James Dong#include <gui/ISurfaceTexture.h> 3500f742c087d92e5452d29be1fb668022b5f8a6c7James Dong#include <gui/SurfaceTextureClient.h> 3600f742c087d92e5452d29be1fb668022b5f8a6c7James Dong 3700f742c087d92e5452d29be1fb668022b5f8a6c7James Dong#include "VideoEditorPreviewController.h" 3800f742c087d92e5452d29be1fb668022b5f8a6c7James Dong#include "DummyAudioSource.h" 3900f742c087d92e5452d29be1fb668022b5f8a6c7James Dong#include "DummyVideoSource.h" 4000f742c087d92e5452d29be1fb668022b5f8a6c7James Dong#include "VideoEditorSRC.h" 4100f742c087d92e5452d29be1fb668022b5f8a6c7James Dong#include "PreviewPlayer.h" 42643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi 43643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundarginamespace android { 44643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi 45643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi 4600f742c087d92e5452d29be1fb668022b5f8a6c7James Dongvoid addBatteryData(uint32_t params) { 4700f742c087d92e5452d29be1fb668022b5f8a6c7James Dong sp<IBinder> binder = 4800f742c087d92e5452d29be1fb668022b5f8a6c7James Dong defaultServiceManager()->getService(String16("media.player")); 4900f742c087d92e5452d29be1fb668022b5f8a6c7James Dong sp<IMediaPlayerService> service = interface_cast<IMediaPlayerService>(binder); 5000f742c087d92e5452d29be1fb668022b5f8a6c7James Dong CHECK(service.get() != NULL); 5100f742c087d92e5452d29be1fb668022b5f8a6c7James Dong 5200f742c087d92e5452d29be1fb668022b5f8a6c7James Dong service->addBatteryData(params); 5300f742c087d92e5452d29be1fb668022b5f8a6c7James Dong} 5400f742c087d92e5452d29be1fb668022b5f8a6c7James Dong 55643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargistruct PreviewPlayerEvent : public TimedEventQueue::Event { 56643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi PreviewPlayerEvent( 57643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi PreviewPlayer *player, 58643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi void (PreviewPlayer::*method)()) 59643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi : mPlayer(player), 60643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi mMethod(method) { 61643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi } 62643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi 63643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargiprotected: 64643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi virtual ~PreviewPlayerEvent() {} 65643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi 66643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi virtual void fire(TimedEventQueue *queue, int64_t /* now_us */) { 67643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi (mPlayer->*mMethod)(); 68643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi } 69643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi 70643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargiprivate: 71643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi PreviewPlayer *mPlayer; 72643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi void (PreviewPlayer::*mMethod)(); 73643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi 74643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi PreviewPlayerEvent(const PreviewPlayerEvent &); 75643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi PreviewPlayerEvent &operator=(const PreviewPlayerEvent &); 76643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi}; 77643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi 7843fcc396614a587851e2b7c4cea2876ec58b8648Chih-Chung ChangPreviewPlayer::PreviewPlayer(NativeWindowRenderer* renderer) 7900f742c087d92e5452d29be1fb668022b5f8a6c7James Dong : mQueueStarted(false), 8000f742c087d92e5452d29be1fb668022b5f8a6c7James Dong mTimeSource(NULL), 8100f742c087d92e5452d29be1fb668022b5f8a6c7James Dong mVideoRendererIsPreview(false), 8200f742c087d92e5452d29be1fb668022b5f8a6c7James Dong mAudioPlayer(NULL), 8300f742c087d92e5452d29be1fb668022b5f8a6c7James Dong mDisplayWidth(0), 8400f742c087d92e5452d29be1fb668022b5f8a6c7James Dong mDisplayHeight(0), 8500f742c087d92e5452d29be1fb668022b5f8a6c7James Dong mFlags(0), 8600f742c087d92e5452d29be1fb668022b5f8a6c7James Dong mExtractorFlags(0), 8700f742c087d92e5452d29be1fb668022b5f8a6c7James Dong mVideoBuffer(NULL), 8800f742c087d92e5452d29be1fb668022b5f8a6c7James Dong mLastVideoTimeUs(-1), 8943fcc396614a587851e2b7c4cea2876ec58b8648Chih-Chung Chang mNativeWindowRenderer(renderer), 9043fcc396614a587851e2b7c4cea2876ec58b8648Chih-Chung Chang mCurrFramingEffectIndex(0), 91408e25b2508d97f7ae0b39acf46ab42b7c223c44Basavapatna Dattaguru mFrameRGBBuffer(NULL), 9243fcc396614a587851e2b7c4cea2876ec58b8648Chih-Chung Chang mFrameYUVBuffer(NULL) { 93643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi 9400f742c087d92e5452d29be1fb668022b5f8a6c7James Dong CHECK_EQ(mClient.connect(), (status_t)OK); 9500f742c087d92e5452d29be1fb668022b5f8a6c7James Dong DataSource::RegisterDefaultSniffers(); 9600f742c087d92e5452d29be1fb668022b5f8a6c7James Dong 9700f742c087d92e5452d29be1fb668022b5f8a6c7James Dong 98643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi mVideoRenderer = NULL; 99643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi mEffectsSettings = NULL; 100727f9e1e8e1306af761765e480ac5499224db646James Dong mAudioPlayer = NULL; 101643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi mAudioMixStoryBoardTS = 0; 102643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi mCurrentMediaBeginCutTime = 0; 103643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi mCurrentMediaVolumeValue = 0; 104643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi mNumberEffects = 0; 105643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi mDecodedVideoTs = 0; 106643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi mDecVideoTsStoryBoard = 0; 107643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi mCurrentVideoEffect = VIDEO_EFFECT_NONE; 108643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi mProgressCbInterval = 0; 109643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi mNumberDecVideoFrames = 0; 110e6c0750cd2927967f93a8811954f889d23fadb6eDharmaray Kundargi mOverlayUpdateEventPosted = false; 1111c97d9ab52a288d24ea54499de435277cc1a3d68Rajneesh Chowdury mIsChangeSourceRequired = true; 112643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi 113643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi mVideoEvent = new PreviewPlayerEvent(this, &PreviewPlayer::onVideoEvent); 114643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi mVideoEventPending = false; 11500f742c087d92e5452d29be1fb668022b5f8a6c7James Dong mVideoLagEvent = new PreviewPlayerEvent(this, &PreviewPlayer::onVideoLagUpdate); 11600f742c087d92e5452d29be1fb668022b5f8a6c7James Dong mVideoEventPending = false; 117643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi mCheckAudioStatusEvent = new PreviewPlayerEvent( 11800f742c087d92e5452d29be1fb668022b5f8a6c7James Dong this, &PreviewPlayer::onCheckAudioStatus); 119643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi mAudioStatusEventPending = false; 12000f742c087d92e5452d29be1fb668022b5f8a6c7James Dong mStreamDoneEvent = new PreviewPlayerEvent( 12100f742c087d92e5452d29be1fb668022b5f8a6c7James Dong this, &PreviewPlayer::onStreamDone); 12200f742c087d92e5452d29be1fb668022b5f8a6c7James Dong mStreamDoneEventPending = false; 123643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi mProgressCbEvent = new PreviewPlayerEvent(this, 124e6c0750cd2927967f93a8811954f889d23fadb6eDharmaray Kundargi &PreviewPlayer::onProgressCbEvent); 125643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi 126e6c0750cd2927967f93a8811954f889d23fadb6eDharmaray Kundargi mOverlayUpdateEvent = new PreviewPlayerEvent(this, 127e6c0750cd2927967f93a8811954f889d23fadb6eDharmaray Kundargi &PreviewPlayer::onUpdateOverlayEvent); 128643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi mProgressCbEventPending = false; 129e6c0750cd2927967f93a8811954f889d23fadb6eDharmaray Kundargi 130e6c0750cd2927967f93a8811954f889d23fadb6eDharmaray Kundargi mOverlayUpdateEventPending = false; 131643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi mRenderingMode = (M4xVSS_MediaRendering)MEDIA_RENDERING_INVALID; 132643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi mIsFiftiesEffectStarted = false; 133643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi reset(); 134643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi} 135643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi 136643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray KundargiPreviewPlayer::~PreviewPlayer() { 137643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi 138643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi if (mQueueStarted) { 139643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi mQueue.stop(); 140643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi } 141643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi 142643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi reset(); 143643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi 14443fcc396614a587851e2b7c4cea2876ec58b8648Chih-Chung Chang if (mVideoRenderer) { 14543fcc396614a587851e2b7c4cea2876ec58b8648Chih-Chung Chang mNativeWindowRenderer->destroyRenderInput(mVideoRenderer); 146643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi } 14700f742c087d92e5452d29be1fb668022b5f8a6c7James Dong 14800f742c087d92e5452d29be1fb668022b5f8a6c7James Dong Mutex::Autolock lock(mLock); 14900f742c087d92e5452d29be1fb668022b5f8a6c7James Dong clear_l(); 15000f742c087d92e5452d29be1fb668022b5f8a6c7James Dong mClient.disconnect(); 151643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi} 152643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi 15300f742c087d92e5452d29be1fb668022b5f8a6c7James Dongvoid PreviewPlayer::cancelPlayerEvents_l(bool updateProgressCb) { 154643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi mQueue.cancelEvent(mVideoEvent->eventID()); 155643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi mVideoEventPending = false; 156643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi mQueue.cancelEvent(mStreamDoneEvent->eventID()); 157643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi mStreamDoneEventPending = false; 158643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi mQueue.cancelEvent(mCheckAudioStatusEvent->eventID()); 159643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi mAudioStatusEventPending = false; 16000f742c087d92e5452d29be1fb668022b5f8a6c7James Dong mQueue.cancelEvent(mVideoLagEvent->eventID()); 16100f742c087d92e5452d29be1fb668022b5f8a6c7James Dong mVideoLagEventPending = false; 16200f742c087d92e5452d29be1fb668022b5f8a6c7James Dong if (updateProgressCb) { 16300f742c087d92e5452d29be1fb668022b5f8a6c7James Dong mQueue.cancelEvent(mProgressCbEvent->eventID()); 16400f742c087d92e5452d29be1fb668022b5f8a6c7James Dong mProgressCbEventPending = false; 16500f742c087d92e5452d29be1fb668022b5f8a6c7James Dong } 166643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi} 167643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi 168daeb5b33861147fda0096f9c794be6f341d884c2James Dongstatus_t PreviewPlayer::setDataSource(const char *path) { 169643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi Mutex::Autolock autoLock(mLock); 170daeb5b33861147fda0096f9c794be6f341d884c2James Dong return setDataSource_l(path); 171643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi} 172643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi 173daeb5b33861147fda0096f9c794be6f341d884c2James Dongstatus_t PreviewPlayer::setDataSource_l(const char *path) { 174643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi reset_l(); 175643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi 176daeb5b33861147fda0096f9c794be6f341d884c2James Dong mUri = path; 177643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi 178643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi // The actual work will be done during preparation in the call to 179643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi // ::finishSetDataSource_l to avoid blocking the calling thread in 180643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi // setDataSource for any significant time. 181643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi return OK; 182643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi} 183643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi 184643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargistatus_t PreviewPlayer::setDataSource_l(const sp<MediaExtractor> &extractor) { 185643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi bool haveAudio = false; 186643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi bool haveVideo = false; 187643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi for (size_t i = 0; i < extractor->countTracks(); ++i) { 188643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi sp<MetaData> meta = extractor->getTrackMetaData(i); 189643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi 190643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi const char *mime; 191643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi CHECK(meta->findCString(kKeyMIMEType, &mime)); 192643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi 193643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi if (!haveVideo && !strncasecmp(mime, "video/", 6)) { 194643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi setVideoSource(extractor->getTrack(i)); 195643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi haveVideo = true; 196643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi } else if (!haveAudio && !strncasecmp(mime, "audio/", 6)) { 197643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi setAudioSource(extractor->getTrack(i)); 198643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi haveAudio = true; 199643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi 200643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi if (!strcasecmp(mime, MEDIA_MIMETYPE_AUDIO_VORBIS)) { 201643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi // Only do this for vorbis audio, none of the other audio 202643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi // formats even support this ringtone specific hack and 203643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi // retrieving the metadata on some extractors may turn out 204643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi // to be very expensive. 205643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi sp<MetaData> fileMeta = extractor->getMetaData(); 206643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi int32_t loop; 207643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi if (fileMeta != NULL 208643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi && fileMeta->findInt32(kKeyAutoLoop, &loop) 209643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi && loop != 0) { 210643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi mFlags |= AUTO_LOOPING; 211643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi } 212643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi } 213643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi } 214643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi 215643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi if (haveAudio && haveVideo) { 216643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi break; 217643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi } 218643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi } 219643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi 220643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi /* Add the support for Dummy audio*/ 221643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi if( !haveAudio ){ 222643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi mAudioTrack = DummyAudioSource::Create(32000, 2, 20000, 223ebf40154a222c864a0aaf807702fc4eb6b9cf40fRaghavender Palla ((mPlayEndTimeMsec)*1000LL)); 224643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi if(mAudioTrack != NULL) { 225643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi haveAudio = true; 226643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi } 227643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi } 228643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi 229643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi if (!haveAudio && !haveVideo) { 230643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi return UNKNOWN_ERROR; 231643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi } 232643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi 233643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi mExtractorFlags = extractor->flags(); 234643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi return OK; 235643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi} 236643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi 237643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargistatus_t PreviewPlayer::setDataSource_l_jpg() { 23800f742c087d92e5452d29be1fb668022b5f8a6c7James Dong ALOGV("setDataSource_l_jpg"); 23900f742c087d92e5452d29be1fb668022b5f8a6c7James Dong 240643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi M4OSA_ERR err = M4NO_ERROR; 241643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi 242643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi mAudioSource = DummyAudioSource::Create(32000, 2, 20000, 243ebf40154a222c864a0aaf807702fc4eb6b9cf40fRaghavender Palla ((mPlayEndTimeMsec)*1000LL)); 244643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi if(mAudioSource != NULL) { 245643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi setAudioSource(mAudioSource); 246643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi } 247643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi status_t error = mAudioSource->start(); 248643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi if (error != OK) { 24900f742c087d92e5452d29be1fb668022b5f8a6c7James Dong ALOGE("Error starting dummy audio source"); 250643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi mAudioSource.clear(); 251643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi return err; 252643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi } 253643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi 254ebf40154a222c864a0aaf807702fc4eb6b9cf40fRaghavender Palla mDurationUs = (mPlayEndTimeMsec - mPlayBeginTimeMsec)*1000LL; 255643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi 256643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi mVideoSource = DummyVideoSource::Create(mVideoWidth, mVideoHeight, 257643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi mDurationUs, mUri); 25835cb2de64cb6482a08f446e80733e7d344a0dcacDharmaray Kundargi 25943fcc396614a587851e2b7c4cea2876ec58b8648Chih-Chung Chang updateSizeToRender(mVideoSource->getFormat()); 260643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi setVideoSource(mVideoSource); 261643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi status_t err1 = mVideoSource->start(); 262643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi if (err1 != OK) { 263643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi mVideoSource.clear(); 264643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi return err; 265643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi } 266643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi 267643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi mIsVideoSourceJpg = true; 268643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi return OK; 269643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi} 270643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi 271643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargivoid PreviewPlayer::reset_l() { 272643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi 273643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi if (mFlags & PREPARING) { 274643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi mFlags |= PREPARE_CANCELLED; 275643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi } 276643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi 277643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi while (mFlags & PREPARING) { 278643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi mPreparedCondition.wait(mLock); 279643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi } 280643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi 28100f742c087d92e5452d29be1fb668022b5f8a6c7James Dong cancelPlayerEvents_l(); 282643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi mAudioTrack.clear(); 283643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi mVideoTrack.clear(); 284643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi 285643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi // Shutdown audio first, so that the respone to the reset request 286643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi // appears to happen instantaneously as far as the user is concerned 287643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi // If we did this later, audio would continue playing while we 288643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi // shutdown the video-related resources and the player appear to 289643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi // not be as responsive to a reset request. 290643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi if (mAudioPlayer == NULL && mAudioSource != NULL) { 291643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi // If we had an audio player, it would have effectively 292643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi // taken possession of the audio source and stopped it when 293643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi // _it_ is stopped. Otherwise this is still our responsibility. 294643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi mAudioSource->stop(); 295643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi } 296643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi mAudioSource.clear(); 297643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi 298643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi mTimeSource = NULL; 299643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi 3001c97d9ab52a288d24ea54499de435277cc1a3d68Rajneesh Chowdury //Single audio player instance used 3011c97d9ab52a288d24ea54499de435277cc1a3d68Rajneesh Chowdury //So donot delete it here 3021c97d9ab52a288d24ea54499de435277cc1a3d68Rajneesh Chowdury //It is deleted from PreviewController class 3031c97d9ab52a288d24ea54499de435277cc1a3d68Rajneesh Chowdury //delete mAudioPlayer; 304643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi mAudioPlayer = NULL; 305643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi 306643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi if (mVideoBuffer) { 307643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi mVideoBuffer->release(); 308643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi mVideoBuffer = NULL; 309643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi } 310643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi 311643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi if (mVideoSource != NULL) { 312643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi mVideoSource->stop(); 313643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi 314643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi // The following hack is necessary to ensure that the OMX 315643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi // component is completely released by the time we may try 316643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi // to instantiate it again. 317643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi wp<MediaSource> tmp = mVideoSource; 318643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi mVideoSource.clear(); 319643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi while (tmp.promote() != NULL) { 320643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi usleep(1000); 321643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi } 322643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi IPCThreadState::self()->flushCommands(); 323643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi } 324643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi 325643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi mDurationUs = -1; 326643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi mFlags = 0; 327643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi mExtractorFlags = 0; 328643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi mVideoWidth = mVideoHeight = -1; 329643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi mTimeSourceDeltaUs = 0; 330643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi mVideoTimeUs = 0; 331643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi 332a5872f770c50da1db555d53e062a9896ea4321d5Andreas Huber mSeeking = NO_SEEK; 333643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi mSeekNotificationSent = false; 334643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi mSeekTimeUs = 0; 335643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi 336643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi mUri.setTo(""); 337643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi 338643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi mCurrentVideoEffect = VIDEO_EFFECT_NONE; 339643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi mIsVideoSourceJpg = false; 340643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi mFrameRGBBuffer = NULL; 341643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi if(mFrameYUVBuffer != NULL) { 342694816d7291f17364502ac5d3319684a0b180860Shyam Pallapothu free(mFrameYUVBuffer); 343643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi mFrameYUVBuffer = NULL; 344643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi } 345643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi} 346643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi 347643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargistatus_t PreviewPlayer::play() { 34800f742c087d92e5452d29be1fb668022b5f8a6c7James Dong ALOGV("play"); 349643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi Mutex::Autolock autoLock(mLock); 350643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi 351643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi mFlags &= ~CACHE_UNDERRUN; 352e018023b4844fef7880bf5e45f706afcb10c33b6Hong Teng mFlags &= ~INFORMED_AV_EOS; 353643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi return play_l(); 354643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi} 355643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi 3565bc7fb407ce1bab13d4a4a67d34a1a3192ee3186Dheeraj Sharmastatus_t PreviewPlayer::startAudioPlayer_l() { 35700f742c087d92e5452d29be1fb668022b5f8a6c7James Dong ALOGV("startAudioPlayer_l"); 3585bc7fb407ce1bab13d4a4a67d34a1a3192ee3186Dheeraj Sharma CHECK(!(mFlags & AUDIO_RUNNING)); 3595bc7fb407ce1bab13d4a4a67d34a1a3192ee3186Dheeraj Sharma 3605bc7fb407ce1bab13d4a4a67d34a1a3192ee3186Dheeraj Sharma if (mAudioSource == NULL || mAudioPlayer == NULL) { 3615bc7fb407ce1bab13d4a4a67d34a1a3192ee3186Dheeraj Sharma return OK; 3625bc7fb407ce1bab13d4a4a67d34a1a3192ee3186Dheeraj Sharma } 3635bc7fb407ce1bab13d4a4a67d34a1a3192ee3186Dheeraj Sharma 3645bc7fb407ce1bab13d4a4a67d34a1a3192ee3186Dheeraj Sharma if (!(mFlags & AUDIOPLAYER_STARTED)) { 3655bc7fb407ce1bab13d4a4a67d34a1a3192ee3186Dheeraj Sharma mFlags |= AUDIOPLAYER_STARTED; 3665bc7fb407ce1bab13d4a4a67d34a1a3192ee3186Dheeraj Sharma 3675bc7fb407ce1bab13d4a4a67d34a1a3192ee3186Dheeraj Sharma // We've already started the MediaSource in order to enable 3685bc7fb407ce1bab13d4a4a67d34a1a3192ee3186Dheeraj Sharma // the prefetcher to read its data. 369727f9e1e8e1306af761765e480ac5499224db646James Dong status_t err = mAudioPlayer->start( 3705bc7fb407ce1bab13d4a4a67d34a1a3192ee3186Dheeraj Sharma true /* sourceAlreadyStarted */); 3715bc7fb407ce1bab13d4a4a67d34a1a3192ee3186Dheeraj Sharma 3725bc7fb407ce1bab13d4a4a67d34a1a3192ee3186Dheeraj Sharma if (err != OK) { 3735bc7fb407ce1bab13d4a4a67d34a1a3192ee3186Dheeraj Sharma notifyListener_l(MEDIA_ERROR, MEDIA_ERROR_UNKNOWN, err); 3745bc7fb407ce1bab13d4a4a67d34a1a3192ee3186Dheeraj Sharma return err; 3755bc7fb407ce1bab13d4a4a67d34a1a3192ee3186Dheeraj Sharma } 3765bc7fb407ce1bab13d4a4a67d34a1a3192ee3186Dheeraj Sharma } else { 377727f9e1e8e1306af761765e480ac5499224db646James Dong mAudioPlayer->resume(); 3785bc7fb407ce1bab13d4a4a67d34a1a3192ee3186Dheeraj Sharma } 3795bc7fb407ce1bab13d4a4a67d34a1a3192ee3186Dheeraj Sharma 3805bc7fb407ce1bab13d4a4a67d34a1a3192ee3186Dheeraj Sharma mFlags |= AUDIO_RUNNING; 3815bc7fb407ce1bab13d4a4a67d34a1a3192ee3186Dheeraj Sharma 3825bc7fb407ce1bab13d4a4a67d34a1a3192ee3186Dheeraj Sharma mWatchForAudioEOS = true; 3835bc7fb407ce1bab13d4a4a67d34a1a3192ee3186Dheeraj Sharma 3845bc7fb407ce1bab13d4a4a67d34a1a3192ee3186Dheeraj Sharma return OK; 3855bc7fb407ce1bab13d4a4a67d34a1a3192ee3186Dheeraj Sharma} 3865bc7fb407ce1bab13d4a4a67d34a1a3192ee3186Dheeraj Sharma 387727f9e1e8e1306af761765e480ac5499224db646James Dongstatus_t PreviewPlayer::setAudioPlayer(VideoEditorAudioPlayer *audioPlayer) { 38800f742c087d92e5452d29be1fb668022b5f8a6c7James Dong ALOGV("setAudioPlayer"); 3891c97d9ab52a288d24ea54499de435277cc1a3d68Rajneesh Chowdury Mutex::Autolock autoLock(mLock); 3901c97d9ab52a288d24ea54499de435277cc1a3d68Rajneesh Chowdury CHECK(!(mFlags & PLAYING)); 3911c97d9ab52a288d24ea54499de435277cc1a3d68Rajneesh Chowdury mAudioPlayer = audioPlayer; 3921c97d9ab52a288d24ea54499de435277cc1a3d68Rajneesh Chowdury 3932703f23af496c13cfa39cc7e157fa12d1cb4c169Steve Block ALOGV("SetAudioPlayer"); 3941c97d9ab52a288d24ea54499de435277cc1a3d68Rajneesh Chowdury mIsChangeSourceRequired = true; 3951c97d9ab52a288d24ea54499de435277cc1a3d68Rajneesh Chowdury 3961c97d9ab52a288d24ea54499de435277cc1a3d68Rajneesh Chowdury // check if the new and old source are dummy 397727f9e1e8e1306af761765e480ac5499224db646James Dong sp<MediaSource> anAudioSource = mAudioPlayer->getSource(); 3981c97d9ab52a288d24ea54499de435277cc1a3d68Rajneesh Chowdury if (anAudioSource == NULL) { 3991c97d9ab52a288d24ea54499de435277cc1a3d68Rajneesh Chowdury // Audio player does not have any source set. 4002703f23af496c13cfa39cc7e157fa12d1cb4c169Steve Block ALOGV("setAudioPlayer: Audio player does not have any source set"); 4011c97d9ab52a288d24ea54499de435277cc1a3d68Rajneesh Chowdury return OK; 4021c97d9ab52a288d24ea54499de435277cc1a3d68Rajneesh Chowdury } 4031c97d9ab52a288d24ea54499de435277cc1a3d68Rajneesh Chowdury 4049a8c9a848da5a4a06c5402d6716efa66b8818d37Rajneesh Chowdury // If new video source is not dummy, then always change source 4059a8c9a848da5a4a06c5402d6716efa66b8818d37Rajneesh Chowdury // Else audio player continues using old audio source and there are 4069a8c9a848da5a4a06c5402d6716efa66b8818d37Rajneesh Chowdury // frame drops to maintain AV sync 4079a8c9a848da5a4a06c5402d6716efa66b8818d37Rajneesh Chowdury sp<MetaData> meta; 4089a8c9a848da5a4a06c5402d6716efa66b8818d37Rajneesh Chowdury if (mVideoSource != NULL) { 4099a8c9a848da5a4a06c5402d6716efa66b8818d37Rajneesh Chowdury meta = mVideoSource->getFormat(); 4109a8c9a848da5a4a06c5402d6716efa66b8818d37Rajneesh Chowdury const char *pVidSrcType; 4119a8c9a848da5a4a06c5402d6716efa66b8818d37Rajneesh Chowdury if (meta->findCString(kKeyDecoderComponent, &pVidSrcType)) { 4129a8c9a848da5a4a06c5402d6716efa66b8818d37Rajneesh Chowdury if (strcmp(pVidSrcType, "DummyVideoSource") != 0) { 4132703f23af496c13cfa39cc7e157fa12d1cb4c169Steve Block ALOGV(" Video clip with silent audio; need to change source"); 4149a8c9a848da5a4a06c5402d6716efa66b8818d37Rajneesh Chowdury return OK; 4159a8c9a848da5a4a06c5402d6716efa66b8818d37Rajneesh Chowdury } 4169a8c9a848da5a4a06c5402d6716efa66b8818d37Rajneesh Chowdury } 4179a8c9a848da5a4a06c5402d6716efa66b8818d37Rajneesh Chowdury } 4189a8c9a848da5a4a06c5402d6716efa66b8818d37Rajneesh Chowdury 4191c97d9ab52a288d24ea54499de435277cc1a3d68Rajneesh Chowdury const char *pSrcType1; 4201c97d9ab52a288d24ea54499de435277cc1a3d68Rajneesh Chowdury const char *pSrcType2; 4219a8c9a848da5a4a06c5402d6716efa66b8818d37Rajneesh Chowdury meta = anAudioSource->getFormat(); 4221c97d9ab52a288d24ea54499de435277cc1a3d68Rajneesh Chowdury 4231c97d9ab52a288d24ea54499de435277cc1a3d68Rajneesh Chowdury if (meta->findCString(kKeyDecoderComponent, &pSrcType1)) { 4241c97d9ab52a288d24ea54499de435277cc1a3d68Rajneesh Chowdury if (strcmp(pSrcType1, "DummyAudioSource") == 0) { 4251c97d9ab52a288d24ea54499de435277cc1a3d68Rajneesh Chowdury meta = mAudioSource->getFormat(); 4261c97d9ab52a288d24ea54499de435277cc1a3d68Rajneesh Chowdury if (meta->findCString(kKeyDecoderComponent, &pSrcType2)) { 4271c97d9ab52a288d24ea54499de435277cc1a3d68Rajneesh Chowdury if (strcmp(pSrcType2, "DummyAudioSource") == 0) { 4281c97d9ab52a288d24ea54499de435277cc1a3d68Rajneesh Chowdury mIsChangeSourceRequired = false; 4291c97d9ab52a288d24ea54499de435277cc1a3d68Rajneesh Chowdury // Just set the new play duration for the existing source 4301c97d9ab52a288d24ea54499de435277cc1a3d68Rajneesh Chowdury MediaSource *pMediaSrc = anAudioSource.get(); 4311c97d9ab52a288d24ea54499de435277cc1a3d68Rajneesh Chowdury DummyAudioSource *pDummyAudioSource = (DummyAudioSource*)pMediaSrc; 4321c97d9ab52a288d24ea54499de435277cc1a3d68Rajneesh Chowdury //Increment the duration of audio source 433ebf40154a222c864a0aaf807702fc4eb6b9cf40fRaghavender Palla pDummyAudioSource->setDuration( 434ebf40154a222c864a0aaf807702fc4eb6b9cf40fRaghavender Palla (int64_t)((mPlayEndTimeMsec)*1000LL)); 435b6e2b5cc5b71986b06cbd9c471b63eb5878a7aeaRajneesh Chowdury 436b6e2b5cc5b71986b06cbd9c471b63eb5878a7aeaRajneesh Chowdury // Stop the new audio source 437b6e2b5cc5b71986b06cbd9c471b63eb5878a7aeaRajneesh Chowdury // since we continue using old source 4382703f23af496c13cfa39cc7e157fa12d1cb4c169Steve Block ALOGV("setAudioPlayer: stop new audio source"); 439b6e2b5cc5b71986b06cbd9c471b63eb5878a7aeaRajneesh Chowdury mAudioSource->stop(); 4401c97d9ab52a288d24ea54499de435277cc1a3d68Rajneesh Chowdury } 4411c97d9ab52a288d24ea54499de435277cc1a3d68Rajneesh Chowdury } 4421c97d9ab52a288d24ea54499de435277cc1a3d68Rajneesh Chowdury } 4431c97d9ab52a288d24ea54499de435277cc1a3d68Rajneesh Chowdury } 4441c97d9ab52a288d24ea54499de435277cc1a3d68Rajneesh Chowdury 4451c97d9ab52a288d24ea54499de435277cc1a3d68Rajneesh Chowdury return OK; 4461c97d9ab52a288d24ea54499de435277cc1a3d68Rajneesh Chowdury} 4471c97d9ab52a288d24ea54499de435277cc1a3d68Rajneesh Chowdury 4481c97d9ab52a288d24ea54499de435277cc1a3d68Rajneesh Chowduryvoid PreviewPlayer::onStreamDone() { 44900f742c087d92e5452d29be1fb668022b5f8a6c7James Dong ALOGV("onStreamDone"); 4501c97d9ab52a288d24ea54499de435277cc1a3d68Rajneesh Chowdury // Posted whenever any stream finishes playing. 4511c97d9ab52a288d24ea54499de435277cc1a3d68Rajneesh Chowdury 4521c97d9ab52a288d24ea54499de435277cc1a3d68Rajneesh Chowdury Mutex::Autolock autoLock(mLock); 4531c97d9ab52a288d24ea54499de435277cc1a3d68Rajneesh Chowdury if (!mStreamDoneEventPending) { 4541c97d9ab52a288d24ea54499de435277cc1a3d68Rajneesh Chowdury return; 4551c97d9ab52a288d24ea54499de435277cc1a3d68Rajneesh Chowdury } 4561c97d9ab52a288d24ea54499de435277cc1a3d68Rajneesh Chowdury mStreamDoneEventPending = false; 4571c97d9ab52a288d24ea54499de435277cc1a3d68Rajneesh Chowdury 4581c97d9ab52a288d24ea54499de435277cc1a3d68Rajneesh Chowdury if (mStreamDoneStatus != ERROR_END_OF_STREAM) { 4592703f23af496c13cfa39cc7e157fa12d1cb4c169Steve Block ALOGV("MEDIA_ERROR %d", mStreamDoneStatus); 4601c97d9ab52a288d24ea54499de435277cc1a3d68Rajneesh Chowdury 4611c97d9ab52a288d24ea54499de435277cc1a3d68Rajneesh Chowdury notifyListener_l( 4621c97d9ab52a288d24ea54499de435277cc1a3d68Rajneesh Chowdury MEDIA_ERROR, MEDIA_ERROR_UNKNOWN, mStreamDoneStatus); 4631c97d9ab52a288d24ea54499de435277cc1a3d68Rajneesh Chowdury 4641c97d9ab52a288d24ea54499de435277cc1a3d68Rajneesh Chowdury pause_l(true /* at eos */); 4651c97d9ab52a288d24ea54499de435277cc1a3d68Rajneesh Chowdury 4661c97d9ab52a288d24ea54499de435277cc1a3d68Rajneesh Chowdury mFlags |= AT_EOS; 4671c97d9ab52a288d24ea54499de435277cc1a3d68Rajneesh Chowdury return; 4681c97d9ab52a288d24ea54499de435277cc1a3d68Rajneesh Chowdury } 4691c97d9ab52a288d24ea54499de435277cc1a3d68Rajneesh Chowdury 4701c97d9ab52a288d24ea54499de435277cc1a3d68Rajneesh Chowdury const bool allDone = 4711c97d9ab52a288d24ea54499de435277cc1a3d68Rajneesh Chowdury (mVideoSource == NULL || (mFlags & VIDEO_AT_EOS)) 4721c97d9ab52a288d24ea54499de435277cc1a3d68Rajneesh Chowdury && (mAudioSource == NULL || (mFlags & AUDIO_AT_EOS)); 4731c97d9ab52a288d24ea54499de435277cc1a3d68Rajneesh Chowdury 4741c97d9ab52a288d24ea54499de435277cc1a3d68Rajneesh Chowdury if (!allDone) { 4751c97d9ab52a288d24ea54499de435277cc1a3d68Rajneesh Chowdury return; 4761c97d9ab52a288d24ea54499de435277cc1a3d68Rajneesh Chowdury } 4771c97d9ab52a288d24ea54499de435277cc1a3d68Rajneesh Chowdury 4781c97d9ab52a288d24ea54499de435277cc1a3d68Rajneesh Chowdury if (mFlags & (LOOPING | AUTO_LOOPING)) { 4791c97d9ab52a288d24ea54499de435277cc1a3d68Rajneesh Chowdury seekTo_l(0); 4801c97d9ab52a288d24ea54499de435277cc1a3d68Rajneesh Chowdury 4811c97d9ab52a288d24ea54499de435277cc1a3d68Rajneesh Chowdury if (mVideoSource != NULL) { 4821c97d9ab52a288d24ea54499de435277cc1a3d68Rajneesh Chowdury postVideoEvent_l(); 4831c97d9ab52a288d24ea54499de435277cc1a3d68Rajneesh Chowdury } 4841c97d9ab52a288d24ea54499de435277cc1a3d68Rajneesh Chowdury } else { 4852703f23af496c13cfa39cc7e157fa12d1cb4c169Steve Block ALOGV("MEDIA_PLAYBACK_COMPLETE"); 4861c97d9ab52a288d24ea54499de435277cc1a3d68Rajneesh Chowdury //pause before sending event 4871c97d9ab52a288d24ea54499de435277cc1a3d68Rajneesh Chowdury pause_l(true /* at eos */); 488fa31daff175709d2c58d61d1354daa9495696631Raghavender Palla 489fa31daff175709d2c58d61d1354daa9495696631Raghavender Palla //This lock is used to syncronize onStreamDone() in PreviewPlayer and 490fa31daff175709d2c58d61d1354daa9495696631Raghavender Palla //stopPreview() in PreviewController 491fa31daff175709d2c58d61d1354daa9495696631Raghavender Palla Mutex::Autolock autoLock(mLockControl); 492e018023b4844fef7880bf5e45f706afcb10c33b6Hong Teng /* Make sure PreviewPlayer only notifies MEDIA_PLAYBACK_COMPLETE once for each clip! 493e018023b4844fef7880bf5e45f706afcb10c33b6Hong Teng * It happens twice in following scenario. 494e018023b4844fef7880bf5e45f706afcb10c33b6Hong Teng * To make the clips in preview storyboard are played and switched smoothly, 495e018023b4844fef7880bf5e45f706afcb10c33b6Hong Teng * PreviewController uses two PreviewPlayer instances and one AudioPlayer. 496e018023b4844fef7880bf5e45f706afcb10c33b6Hong Teng * The two PreviewPlayer use the same AudioPlayer to play the audio, 497e018023b4844fef7880bf5e45f706afcb10c33b6Hong Teng * and change the audio source of the AudioPlayer. 498e018023b4844fef7880bf5e45f706afcb10c33b6Hong Teng * If the audio source of current playing clip and next clip are dummy 499e018023b4844fef7880bf5e45f706afcb10c33b6Hong Teng * audio source(image or video without audio), it will not change the audio source 500e018023b4844fef7880bf5e45f706afcb10c33b6Hong Teng * to avoid the "audio glitch", and keep using the current audio source. 501e018023b4844fef7880bf5e45f706afcb10c33b6Hong Teng * When the video of current clip reached the EOS, PreviewPlayer will set EOS flag 502e018023b4844fef7880bf5e45f706afcb10c33b6Hong Teng * for video and audio, and it will notify MEDIA_PLAYBACK_COMPLETE. 503e018023b4844fef7880bf5e45f706afcb10c33b6Hong Teng * But the audio(dummy audio source) is still playing(for next clip), 504e018023b4844fef7880bf5e45f706afcb10c33b6Hong Teng * and when it reached the EOS, and video reached EOS, 505e018023b4844fef7880bf5e45f706afcb10c33b6Hong Teng * PreviewPlayer will notify MEDIA_PLAYBACK_COMPLETE again. */ 506e018023b4844fef7880bf5e45f706afcb10c33b6Hong Teng if (!(mFlags & INFORMED_AV_EOS)) { 507e018023b4844fef7880bf5e45f706afcb10c33b6Hong Teng notifyListener_l(MEDIA_PLAYBACK_COMPLETE); 508e018023b4844fef7880bf5e45f706afcb10c33b6Hong Teng mFlags |= INFORMED_AV_EOS; 509e018023b4844fef7880bf5e45f706afcb10c33b6Hong Teng } 5101c97d9ab52a288d24ea54499de435277cc1a3d68Rajneesh Chowdury mFlags |= AT_EOS; 5112703f23af496c13cfa39cc7e157fa12d1cb4c169Steve Block ALOGV("onStreamDone end"); 512fa31daff175709d2c58d61d1354daa9495696631Raghavender Palla return; 5131c97d9ab52a288d24ea54499de435277cc1a3d68Rajneesh Chowdury } 5141c97d9ab52a288d24ea54499de435277cc1a3d68Rajneesh Chowdury} 5151c97d9ab52a288d24ea54499de435277cc1a3d68Rajneesh Chowdury 5161c97d9ab52a288d24ea54499de435277cc1a3d68Rajneesh Chowdury 517643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargistatus_t PreviewPlayer::play_l() { 51800f742c087d92e5452d29be1fb668022b5f8a6c7James Dong ALOGV("play_l"); 5195bc7fb407ce1bab13d4a4a67d34a1a3192ee3186Dheeraj Sharma 5208b95de2c4d57a0a07d7f4c59f2ddd52a140a361eRajneesh Chowdury mFlags &= ~SEEK_PREVIEW; 5218b95de2c4d57a0a07d7f4c59f2ddd52a140a361eRajneesh Chowdury 522643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi if (mFlags & PLAYING) { 523643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi return OK; 524643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi } 525643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi mStartNextPlayer = false; 526643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi 527643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi if (!(mFlags & PREPARED)) { 528643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi status_t err = prepare_l(); 529643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi 530643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi if (err != OK) { 531643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi return err; 532643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi } 533643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi } 534643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi 535643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi mFlags |= PLAYING; 536643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi mFlags |= FIRST_FRAME; 537643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi 538643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi bool deferredAudioSeek = false; 539643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi 540643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi if (mAudioSource != NULL) { 541643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi if (mAudioPlayer == NULL) { 542643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi if (mAudioSink != NULL) { 543643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi 544643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi mAudioPlayer = new VideoEditorAudioPlayer(mAudioSink, this); 545643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi mAudioPlayer->setSource(mAudioSource); 546643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi 547727f9e1e8e1306af761765e480ac5499224db646James Dong mAudioPlayer->setAudioMixSettings( 548643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi mPreviewPlayerAudioMixSettings); 549643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi 550727f9e1e8e1306af761765e480ac5499224db646James Dong mAudioPlayer->setAudioMixPCMFileHandle( 551643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi mAudioMixPCMFileHandle); 552643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi 553727f9e1e8e1306af761765e480ac5499224db646James Dong mAudioPlayer->setAudioMixStoryBoardSkimTimeStamp( 554643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi mAudioMixStoryBoardTS, mCurrentMediaBeginCutTime, 555643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi mCurrentMediaVolumeValue); 556643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi 5571c97d9ab52a288d24ea54499de435277cc1a3d68Rajneesh Chowdury mFlags |= AUDIOPLAYER_STARTED; 5581c97d9ab52a288d24ea54499de435277cc1a3d68Rajneesh Chowdury // We've already started the MediaSource in order to enable 5591c97d9ab52a288d24ea54499de435277cc1a3d68Rajneesh Chowdury // the prefetcher to read its data. 560727f9e1e8e1306af761765e480ac5499224db646James Dong status_t err = mAudioPlayer->start( 5611c97d9ab52a288d24ea54499de435277cc1a3d68Rajneesh Chowdury true /* sourceAlreadyStarted */); 562643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi 5631c97d9ab52a288d24ea54499de435277cc1a3d68Rajneesh Chowdury if (err != OK) { 5641c97d9ab52a288d24ea54499de435277cc1a3d68Rajneesh Chowdury //delete mAudioPlayer; 5651c97d9ab52a288d24ea54499de435277cc1a3d68Rajneesh Chowdury mAudioPlayer = NULL; 5661c97d9ab52a288d24ea54499de435277cc1a3d68Rajneesh Chowdury 5671c97d9ab52a288d24ea54499de435277cc1a3d68Rajneesh Chowdury mFlags &= ~(PLAYING | FIRST_FRAME); 5681c97d9ab52a288d24ea54499de435277cc1a3d68Rajneesh Chowdury return err; 5691c97d9ab52a288d24ea54499de435277cc1a3d68Rajneesh Chowdury } 5701c97d9ab52a288d24ea54499de435277cc1a3d68Rajneesh Chowdury 571727f9e1e8e1306af761765e480ac5499224db646James Dong mTimeSource = mAudioPlayer; 5721c97d9ab52a288d24ea54499de435277cc1a3d68Rajneesh Chowdury mFlags |= AUDIO_RUNNING; 573643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi deferredAudioSeek = true; 574643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi mWatchForAudioSeekComplete = false; 575643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi mWatchForAudioEOS = true; 576643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi } 5771c97d9ab52a288d24ea54499de435277cc1a3d68Rajneesh Chowdury } else { 578727f9e1e8e1306af761765e480ac5499224db646James Dong bool isAudioPlayerStarted = mAudioPlayer->isStarted(); 5795bc7fb407ce1bab13d4a4a67d34a1a3192ee3186Dheeraj Sharma 5801c97d9ab52a288d24ea54499de435277cc1a3d68Rajneesh Chowdury if (mIsChangeSourceRequired == true) { 5812703f23af496c13cfa39cc7e157fa12d1cb4c169Steve Block ALOGV("play_l: Change audio source required"); 582643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi 5831c97d9ab52a288d24ea54499de435277cc1a3d68Rajneesh Chowdury if (isAudioPlayerStarted == true) { 584727f9e1e8e1306af761765e480ac5499224db646James Dong mAudioPlayer->pause(); 5851c97d9ab52a288d24ea54499de435277cc1a3d68Rajneesh Chowdury } 5865bc7fb407ce1bab13d4a4a67d34a1a3192ee3186Dheeraj Sharma 587727f9e1e8e1306af761765e480ac5499224db646James Dong mAudioPlayer->setSource(mAudioSource); 588727f9e1e8e1306af761765e480ac5499224db646James Dong mAudioPlayer->setObserver(this); 5891c97d9ab52a288d24ea54499de435277cc1a3d68Rajneesh Chowdury 590727f9e1e8e1306af761765e480ac5499224db646James Dong mAudioPlayer->setAudioMixSettings( 5911c97d9ab52a288d24ea54499de435277cc1a3d68Rajneesh Chowdury mPreviewPlayerAudioMixSettings); 5921c97d9ab52a288d24ea54499de435277cc1a3d68Rajneesh Chowdury 593727f9e1e8e1306af761765e480ac5499224db646James Dong mAudioPlayer->setAudioMixStoryBoardSkimTimeStamp( 5941c97d9ab52a288d24ea54499de435277cc1a3d68Rajneesh Chowdury mAudioMixStoryBoardTS, mCurrentMediaBeginCutTime, 5951c97d9ab52a288d24ea54499de435277cc1a3d68Rajneesh Chowdury mCurrentMediaVolumeValue); 5961c97d9ab52a288d24ea54499de435277cc1a3d68Rajneesh Chowdury 5971c97d9ab52a288d24ea54499de435277cc1a3d68Rajneesh Chowdury if (isAudioPlayerStarted == true) { 598727f9e1e8e1306af761765e480ac5499224db646James Dong mAudioPlayer->resume(); 5991c97d9ab52a288d24ea54499de435277cc1a3d68Rajneesh Chowdury } else { 6001c97d9ab52a288d24ea54499de435277cc1a3d68Rajneesh Chowdury status_t err = OK; 601727f9e1e8e1306af761765e480ac5499224db646James Dong err = mAudioPlayer->start(true); 6021c97d9ab52a288d24ea54499de435277cc1a3d68Rajneesh Chowdury if (err != OK) { 6031c97d9ab52a288d24ea54499de435277cc1a3d68Rajneesh Chowdury mAudioPlayer = NULL; 604727f9e1e8e1306af761765e480ac5499224db646James Dong mAudioPlayer = NULL; 6051c97d9ab52a288d24ea54499de435277cc1a3d68Rajneesh Chowdury 6061c97d9ab52a288d24ea54499de435277cc1a3d68Rajneesh Chowdury mFlags &= ~(PLAYING | FIRST_FRAME); 6071c97d9ab52a288d24ea54499de435277cc1a3d68Rajneesh Chowdury return err; 6081c97d9ab52a288d24ea54499de435277cc1a3d68Rajneesh Chowdury } 6091c97d9ab52a288d24ea54499de435277cc1a3d68Rajneesh Chowdury } 6101c97d9ab52a288d24ea54499de435277cc1a3d68Rajneesh Chowdury } else { 6112703f23af496c13cfa39cc7e157fa12d1cb4c169Steve Block ALOGV("play_l: No Source change required"); 612727f9e1e8e1306af761765e480ac5499224db646James Dong mAudioPlayer->setAudioMixStoryBoardSkimTimeStamp( 6131c97d9ab52a288d24ea54499de435277cc1a3d68Rajneesh Chowdury mAudioMixStoryBoardTS, mCurrentMediaBeginCutTime, 6141c97d9ab52a288d24ea54499de435277cc1a3d68Rajneesh Chowdury mCurrentMediaVolumeValue); 6151c97d9ab52a288d24ea54499de435277cc1a3d68Rajneesh Chowdury 616727f9e1e8e1306af761765e480ac5499224db646James Dong mAudioPlayer->resume(); 6175bc7fb407ce1bab13d4a4a67d34a1a3192ee3186Dheeraj Sharma } 6181c97d9ab52a288d24ea54499de435277cc1a3d68Rajneesh Chowdury 6191c97d9ab52a288d24ea54499de435277cc1a3d68Rajneesh Chowdury mFlags |= AUDIOPLAYER_STARTED; 6201c97d9ab52a288d24ea54499de435277cc1a3d68Rajneesh Chowdury mFlags |= AUDIO_RUNNING; 621727f9e1e8e1306af761765e480ac5499224db646James Dong mTimeSource = mAudioPlayer; 6221c97d9ab52a288d24ea54499de435277cc1a3d68Rajneesh Chowdury deferredAudioSeek = true; 6231c97d9ab52a288d24ea54499de435277cc1a3d68Rajneesh Chowdury mWatchForAudioSeekComplete = false; 6241c97d9ab52a288d24ea54499de435277cc1a3d68Rajneesh Chowdury mWatchForAudioEOS = true; 6255bc7fb407ce1bab13d4a4a67d34a1a3192ee3186Dheeraj Sharma } 626643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi } 627643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi 628643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi if (mTimeSource == NULL && mAudioPlayer == NULL) { 629643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi mTimeSource = &mSystemTimeSource; 630643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi } 631643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi 63253c567c3355255ed12dd9f5d5a1c58f821770329Dharmaray Kundargi // Set the seek option for Image source files and read. 63353c567c3355255ed12dd9f5d5a1c58f821770329Dharmaray Kundargi // This resets the timestamping for image play 63453c567c3355255ed12dd9f5d5a1c58f821770329Dharmaray Kundargi if (mIsVideoSourceJpg) { 63553c567c3355255ed12dd9f5d5a1c58f821770329Dharmaray Kundargi MediaSource::ReadOptions options; 63653c567c3355255ed12dd9f5d5a1c58f821770329Dharmaray Kundargi MediaBuffer *aLocalBuffer; 63753c567c3355255ed12dd9f5d5a1c58f821770329Dharmaray Kundargi options.setSeekTo(mSeekTimeUs); 63853c567c3355255ed12dd9f5d5a1c58f821770329Dharmaray Kundargi mVideoSource->read(&aLocalBuffer, &options); 6394ca3e5df4b809210b240cd7d0489922017d87a6dSantosh Madhava aLocalBuffer->release(); 64053c567c3355255ed12dd9f5d5a1c58f821770329Dharmaray Kundargi } 64153c567c3355255ed12dd9f5d5a1c58f821770329Dharmaray Kundargi 642643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi if (mVideoSource != NULL) { 643643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi // Kick off video playback 644643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi postVideoEvent_l(); 645643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi } 646643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi 647643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi if (deferredAudioSeek) { 648643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi // If there was a seek request while we were paused 649643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi // and we're just starting up again, honor the request now. 650643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi seekAudioIfNecessary_l(); 651643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi } 652643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi 653643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi if (mFlags & AT_EOS) { 654643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi // Legacy behaviour, if a stream finishes playing and then 655643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi // is started again, we play from the start... 656643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi seekTo_l(0); 657643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi } 658643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi 659643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi return OK; 660643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi} 661643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi 662643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi 663bfece17c8f63de4d4b686da50f8ecac2f6f8ec53Santosh Madhavastatus_t PreviewPlayer::initRenderer_l() { 6646e2242974c109e85bac50550970fe84009c76f77Mathias Agopian if (mSurface != NULL) { 665643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi if(mVideoRenderer == NULL) { 66643fcc396614a587851e2b7c4cea2876ec58b8648Chih-Chung Chang mVideoRenderer = mNativeWindowRenderer->createRenderInput(); 66743fcc396614a587851e2b7c4cea2876ec58b8648Chih-Chung Chang if (mVideoSource != NULL) { 66843fcc396614a587851e2b7c4cea2876ec58b8648Chih-Chung Chang updateSizeToRender(mVideoSource->getFormat()); 669bfece17c8f63de4d4b686da50f8ecac2f6f8ec53Santosh Madhava } 670643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi } 671643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi } 672bfece17c8f63de4d4b686da50f8ecac2f6f8ec53Santosh Madhava return OK; 673643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi} 674643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi 675643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi 676643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargistatus_t PreviewPlayer::seekTo(int64_t timeUs) { 67700f742c087d92e5452d29be1fb668022b5f8a6c7James Dong Mutex::Autolock autoLock(mLock); 678643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi if ((mExtractorFlags & MediaExtractor::CAN_SEEK) || (mIsVideoSourceJpg)) { 679643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi return seekTo_l(timeUs); 680643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi } 681643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi 682643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi return OK; 683643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi} 684643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi 685643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi 686643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargistatus_t PreviewPlayer::getVideoDimensions( 687643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi int32_t *width, int32_t *height) const { 688643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi Mutex::Autolock autoLock(mLock); 689643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi 690643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi if (mVideoWidth < 0 || mVideoHeight < 0) { 691643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi return UNKNOWN_ERROR; 692643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi } 693643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi 694643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi *width = mVideoWidth; 695643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi *height = mVideoHeight; 696643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi 697643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi return OK; 698643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi} 699643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi 700643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi 70100f742c087d92e5452d29be1fb668022b5f8a6c7James Dongstatus_t PreviewPlayer::initAudioDecoder_l() { 702643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi sp<MetaData> meta = mAudioTrack->getFormat(); 703643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi const char *mime; 704643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi CHECK(meta->findCString(kKeyMIMEType, &mime)); 705643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi 706643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi if (!strcasecmp(mime, MEDIA_MIMETYPE_AUDIO_RAW)) { 707643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi mAudioSource = mAudioTrack; 708643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi } else { 709643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi sp<MediaSource> aRawSource; 710643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi aRawSource = OMXCodec::Create( 711643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi mClient.interface(), mAudioTrack->getFormat(), 712643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi false, // createEncoder 713643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi mAudioTrack); 714643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi 715643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi if(aRawSource != NULL) { 716643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi mAudioSource = new VideoEditorSRC(aRawSource); 717643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi } 718643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi } 719643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi 720643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi if (mAudioSource != NULL) { 721643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi int64_t durationUs; 722643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi if (mAudioTrack->getFormat()->findInt64(kKeyDuration, &durationUs)) { 72300f742c087d92e5452d29be1fb668022b5f8a6c7James Dong setDuration_l(durationUs); 724643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi } 725643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi status_t err = mAudioSource->start(); 726643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi 727643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi if (err != OK) { 728643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi mAudioSource.clear(); 729643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi return err; 730643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi } 731643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi } else if (!strcasecmp(mime, MEDIA_MIMETYPE_AUDIO_QCELP)) { 732643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi // For legacy reasons we're simply going to ignore the absence 733643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi // of an audio decoder for QCELP instead of aborting playback 734643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi // altogether. 735643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi return OK; 736643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi } 737643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi 738643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi return mAudioSource != NULL ? OK : UNKNOWN_ERROR; 739643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi} 740643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi 74100f742c087d92e5452d29be1fb668022b5f8a6c7James Dongstatus_t PreviewPlayer::initVideoDecoder_l(uint32_t flags) { 74243fcc396614a587851e2b7c4cea2876ec58b8648Chih-Chung Chang initRenderer_l(); 74343fcc396614a587851e2b7c4cea2876ec58b8648Chih-Chung Chang 74443fcc396614a587851e2b7c4cea2876ec58b8648Chih-Chung Chang if (mVideoRenderer == NULL) { 745f8bd29c66308c820d579b3efb0942a53a277e2c5Steve Block ALOGE("Cannot create renderer"); 74643fcc396614a587851e2b7c4cea2876ec58b8648Chih-Chung Chang return UNKNOWN_ERROR; 74743fcc396614a587851e2b7c4cea2876ec58b8648Chih-Chung Chang } 74843fcc396614a587851e2b7c4cea2876ec58b8648Chih-Chung Chang 749643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi mVideoSource = OMXCodec::Create( 750643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi mClient.interface(), mVideoTrack->getFormat(), 751643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi false, 752643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi mVideoTrack, 75343fcc396614a587851e2b7c4cea2876ec58b8648Chih-Chung Chang NULL, flags, mVideoRenderer->getTargetWindow()); 754643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi 755643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi if (mVideoSource != NULL) { 756643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi int64_t durationUs; 757643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi if (mVideoTrack->getFormat()->findInt64(kKeyDuration, &durationUs)) { 75800f742c087d92e5452d29be1fb668022b5f8a6c7James Dong setDuration_l(durationUs); 759643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi } 760643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi 76143fcc396614a587851e2b7c4cea2876ec58b8648Chih-Chung Chang updateSizeToRender(mVideoTrack->getFormat()); 76235cb2de64cb6482a08f446e80733e7d344a0dcacDharmaray Kundargi 763643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi status_t err = mVideoSource->start(); 764643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi 765643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi if (err != OK) { 766643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi mVideoSource.clear(); 767643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi return err; 768643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi } 769643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi } 770643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi 771643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi return mVideoSource != NULL ? OK : UNKNOWN_ERROR; 772643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi} 773643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi 774643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi 775643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargivoid PreviewPlayer::onVideoEvent() { 776643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi uint32_t i=0; 777643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi M4OSA_ERR err1 = M4NO_ERROR; 778643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi int64_t imageFrameTimeUs = 0; 779643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi 780643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi Mutex::Autolock autoLock(mLock); 781643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi if (!mVideoEventPending) { 782643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi // The event has been cancelled in reset_l() but had already 783643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi // been scheduled for execution at that time. 784643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi return; 785643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi } 786643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi mVideoEventPending = false; 787643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi 7889e4c36a044e264c644d7fa9f9894659a6fc47a6fAndreas Huber if (mFlags & SEEK_PREVIEW) { 7899e4c36a044e264c644d7fa9f9894659a6fc47a6fAndreas Huber mFlags &= ~SEEK_PREVIEW; 7909e4c36a044e264c644d7fa9f9894659a6fc47a6fAndreas Huber return; 7919e4c36a044e264c644d7fa9f9894659a6fc47a6fAndreas Huber } 7929e4c36a044e264c644d7fa9f9894659a6fc47a6fAndreas Huber 793643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi TimeSource *ts_st = &mSystemTimeSource; 794643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi int64_t timeStartUs = ts_st->getRealTimeUs(); 795643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi 796a5872f770c50da1db555d53e062a9896ea4321d5Andreas Huber if (mSeeking != NO_SEEK) { 797643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi 798643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi if(mAudioSource != NULL) { 799643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi 800643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi // We're going to seek the video source first, followed by 801643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi // the audio source. 802643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi // In order to avoid jumps in the DataSource offset caused by 803643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi // the audio codec prefetching data from the old locations 804643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi // while the video codec is already reading data from the new 805643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi // locations, we'll "pause" the audio source, causing it to 806643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi // stop reading input data until a subsequent seek. 807643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi 8085bc7fb407ce1bab13d4a4a67d34a1a3192ee3186Dheeraj Sharma if (mAudioPlayer != NULL && (mFlags & AUDIO_RUNNING)) { 809643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi mAudioPlayer->pause(); 8105bc7fb407ce1bab13d4a4a67d34a1a3192ee3186Dheeraj Sharma mFlags &= ~AUDIO_RUNNING; 811643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi } 812643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi mAudioSource->pause(); 813643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi } 814643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi } 815643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi 816643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi if (!mVideoBuffer) { 817643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi MediaSource::ReadOptions options; 818a5872f770c50da1db555d53e062a9896ea4321d5Andreas Huber if (mSeeking != NO_SEEK) { 8192703f23af496c13cfa39cc7e157fa12d1cb4c169Steve Block ALOGV("LV PLAYER seeking to %lld us (%.2f secs)", mSeekTimeUs, 820643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi mSeekTimeUs / 1E6); 821643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi 822643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi options.setSeekTo( 823643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi mSeekTimeUs, MediaSource::ReadOptions::SEEK_CLOSEST); 824643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi } 825643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi for (;;) { 82643fcc396614a587851e2b7c4cea2876ec58b8648Chih-Chung Chang status_t err = mVideoSource->read(&mVideoBuffer, &options); 827643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi options.clearSeekTo(); 828643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi 829643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi if (err != OK) { 83000f742c087d92e5452d29be1fb668022b5f8a6c7James Dong CHECK(!mVideoBuffer); 831643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi 832643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi if (err == INFO_FORMAT_CHANGED) { 8332703f23af496c13cfa39cc7e157fa12d1cb4c169Steve Block ALOGV("LV PLAYER VideoSource signalled format change"); 834643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi notifyVideoSize_l(); 835643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi 836643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi if (mVideoRenderer != NULL) { 837643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi mVideoRendererIsPreview = false; 838bfece17c8f63de4d4b686da50f8ecac2f6f8ec53Santosh Madhava err = initRenderer_l(); 8394ca3e5df4b809210b240cd7d0489922017d87a6dSantosh Madhava if (err != OK) { 8404ca3e5df4b809210b240cd7d0489922017d87a6dSantosh Madhava postStreamDoneEvent_l(err); 8414ca3e5df4b809210b240cd7d0489922017d87a6dSantosh Madhava } 842bfece17c8f63de4d4b686da50f8ecac2f6f8ec53Santosh Madhava 843643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi } 84443fcc396614a587851e2b7c4cea2876ec58b8648Chih-Chung Chang 84543fcc396614a587851e2b7c4cea2876ec58b8648Chih-Chung Chang updateSizeToRender(mVideoSource->getFormat()); 846643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi continue; 847643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi } 848643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi // So video playback is complete, but we may still have 849342f932f6312be84a48512216b561ead42b53199Santosh Madhava // a seek request pending that needs to be applied to the audio track 850a5872f770c50da1db555d53e062a9896ea4321d5Andreas Huber if (mSeeking != NO_SEEK) { 8512703f23af496c13cfa39cc7e157fa12d1cb4c169Steve Block ALOGV("video stream ended while seeking!"); 852342f932f6312be84a48512216b561ead42b53199Santosh Madhava } 853342f932f6312be84a48512216b561ead42b53199Santosh Madhava finishSeekIfNecessary(-1); 8542703f23af496c13cfa39cc7e157fa12d1cb4c169Steve Block ALOGV("PreviewPlayer: onVideoEvent EOS reached."); 855643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi mFlags |= VIDEO_AT_EOS; 8561c97d9ab52a288d24ea54499de435277cc1a3d68Rajneesh Chowdury mFlags |= AUDIO_AT_EOS; 8574f4efef8357f4d8b23ccfb1b29db34175bf72627Dheeraj Sharma mOverlayUpdateEventPosted = false; 858643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi postStreamDoneEvent_l(err); 859b2d6e0f74a12e5cce5b429e646172c63346346c3Santosh Madhava // Set the last decoded timestamp to duration 860ebf40154a222c864a0aaf807702fc4eb6b9cf40fRaghavender Palla mDecodedVideoTs = (mPlayEndTimeMsec*1000LL); 861643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi return; 862643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi } 863643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi 864643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi if (mVideoBuffer->range_length() == 0) { 865643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi // Some decoders, notably the PV AVC software decoder 866643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi // return spurious empty buffers that we just want to ignore. 867643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi 868643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi mVideoBuffer->release(); 869643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi mVideoBuffer = NULL; 870643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi continue; 871643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi } 872643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi 873643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi int64_t videoTimeUs; 874643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi CHECK(mVideoBuffer->meta_data()->findInt64(kKeyTime, &videoTimeUs)); 875643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi 876a5872f770c50da1db555d53e062a9896ea4321d5Andreas Huber if (mSeeking != NO_SEEK) { 877b2d6e0f74a12e5cce5b429e646172c63346346c3Santosh Madhava if (videoTimeUs < mSeekTimeUs) { 878b2d6e0f74a12e5cce5b429e646172c63346346c3Santosh Madhava // buffers are before seek time 879b2d6e0f74a12e5cce5b429e646172c63346346c3Santosh Madhava // ignore them 880b2d6e0f74a12e5cce5b429e646172c63346346c3Santosh Madhava mVideoBuffer->release(); 881b2d6e0f74a12e5cce5b429e646172c63346346c3Santosh Madhava mVideoBuffer = NULL; 882b2d6e0f74a12e5cce5b429e646172c63346346c3Santosh Madhava continue; 883b2d6e0f74a12e5cce5b429e646172c63346346c3Santosh Madhava } 884b2d6e0f74a12e5cce5b429e646172c63346346c3Santosh Madhava } else { 885b2d6e0f74a12e5cce5b429e646172c63346346c3Santosh Madhava if((videoTimeUs/1000) < mPlayBeginTimeMsec) { 886b2d6e0f74a12e5cce5b429e646172c63346346c3Santosh Madhava // Frames are before begin cut time 887b2d6e0f74a12e5cce5b429e646172c63346346c3Santosh Madhava // Donot render 888b2d6e0f74a12e5cce5b429e646172c63346346c3Santosh Madhava mVideoBuffer->release(); 889b2d6e0f74a12e5cce5b429e646172c63346346c3Santosh Madhava mVideoBuffer = NULL; 890b2d6e0f74a12e5cce5b429e646172c63346346c3Santosh Madhava continue; 891b2d6e0f74a12e5cce5b429e646172c63346346c3Santosh Madhava } 892643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi } 893643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi break; 894643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi } 895643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi } 896643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi 897643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi mNumberDecVideoFrames++; 898643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi 899643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi int64_t timeUs; 900643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi CHECK(mVideoBuffer->meta_data()->findInt64(kKeyTime, &timeUs)); 90100f742c087d92e5452d29be1fb668022b5f8a6c7James Dong setPosition_l(timeUs); 902643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi 90300f742c087d92e5452d29be1fb668022b5f8a6c7James Dong if (!mStartNextPlayer) { 90400f742c087d92e5452d29be1fb668022b5f8a6c7James Dong int64_t playbackTimeRemaining = (mPlayEndTimeMsec * 1000LL) - timeUs; 90500f742c087d92e5452d29be1fb668022b5f8a6c7James Dong if (playbackTimeRemaining <= 1500000) { 906643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi //When less than 1.5 sec of playback left 907643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi // send notification to start next player 908643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi 909643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi mStartNextPlayer = true; 910643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi notifyListener_l(0xAAAAAAAA); 911643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi } 912643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi } 913643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi 914a5872f770c50da1db555d53e062a9896ea4321d5Andreas Huber SeekType wasSeeking = mSeeking; 915643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi finishSeekIfNecessary(timeUs); 9165bc7fb407ce1bab13d4a4a67d34a1a3192ee3186Dheeraj Sharma if (mAudioPlayer != NULL && !(mFlags & (AUDIO_RUNNING))) { 9175bc7fb407ce1bab13d4a4a67d34a1a3192ee3186Dheeraj Sharma status_t err = startAudioPlayer_l(); 9185bc7fb407ce1bab13d4a4a67d34a1a3192ee3186Dheeraj Sharma if (err != OK) { 919f8bd29c66308c820d579b3efb0942a53a277e2c5Steve Block ALOGE("Starting the audio player failed w/ err %d", err); 9205bc7fb407ce1bab13d4a4a67d34a1a3192ee3186Dheeraj Sharma return; 9215bc7fb407ce1bab13d4a4a67d34a1a3192ee3186Dheeraj Sharma } 9225bc7fb407ce1bab13d4a4a67d34a1a3192ee3186Dheeraj Sharma } 923643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi 924643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi TimeSource *ts = (mFlags & AUDIO_AT_EOS) ? &mSystemTimeSource : mTimeSource; 925643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi 926643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi if(ts == NULL) { 927643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi mVideoBuffer->release(); 928643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi mVideoBuffer = NULL; 929643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi return; 930643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi } 931643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi 932643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi if(!mIsVideoSourceJpg) { 933643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi if (mFlags & FIRST_FRAME) { 934643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi mFlags &= ~FIRST_FRAME; 935643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi 936643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi mTimeSourceDeltaUs = ts->getRealTimeUs() - timeUs; 937643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi } 938643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi 939643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi int64_t realTimeUs, mediaTimeUs; 940643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi if (!(mFlags & AUDIO_AT_EOS) && mAudioPlayer != NULL 941643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi && mAudioPlayer->getMediaTimeMapping(&realTimeUs, &mediaTimeUs)) { 942643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi mTimeSourceDeltaUs = realTimeUs - mediaTimeUs; 943643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi } 944643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi 945643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi int64_t nowUs = ts->getRealTimeUs() - mTimeSourceDeltaUs; 946643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi 947643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi int64_t latenessUs = nowUs - timeUs; 948643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi 949a5872f770c50da1db555d53e062a9896ea4321d5Andreas Huber if (wasSeeking != NO_SEEK) { 950342f932f6312be84a48512216b561ead42b53199Santosh Madhava // Let's display the first frame after seeking right away. 951342f932f6312be84a48512216b561ead42b53199Santosh Madhava latenessUs = 0; 952342f932f6312be84a48512216b561ead42b53199Santosh Madhava } 9532703f23af496c13cfa39cc7e157fa12d1cb4c169Steve Block ALOGV("Audio time stamp = %lld and video time stamp = %lld", 954643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi ts->getRealTimeUs(),timeUs); 955643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi if (latenessUs > 40000) { 956643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi // We're more than 40ms late. 957643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi 9582703f23af496c13cfa39cc7e157fa12d1cb4c169Steve Block ALOGV("LV PLAYER we're late by %lld us (%.2f secs)", 959643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi latenessUs, latenessUs / 1E6); 960643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi 961643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi mVideoBuffer->release(); 962643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi mVideoBuffer = NULL; 9634f155f0cffa2414545854e899dff4861187e1f68Dharmaray Kundargi postVideoEvent_l(0); 964643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi return; 965643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi } 966643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi 9674f155f0cffa2414545854e899dff4861187e1f68Dharmaray Kundargi if (latenessUs < -25000) { 9684f155f0cffa2414545854e899dff4861187e1f68Dharmaray Kundargi // We're more than 25ms early. 9692703f23af496c13cfa39cc7e157fa12d1cb4c169Steve Block ALOGV("We're more than 25ms early, lateness %lld", latenessUs); 970643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi 9714f155f0cffa2414545854e899dff4861187e1f68Dharmaray Kundargi postVideoEvent_l(25000); 972643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi return; 973643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi } 974643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi } 975643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi 976643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi if (mVideoRendererIsPreview || mVideoRenderer == NULL) { 977643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi mVideoRendererIsPreview = false; 978643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi 979bfece17c8f63de4d4b686da50f8ecac2f6f8ec53Santosh Madhava status_t err = initRenderer_l(); 9804ca3e5df4b809210b240cd7d0489922017d87a6dSantosh Madhava if (err != OK) { 9814ca3e5df4b809210b240cd7d0489922017d87a6dSantosh Madhava postStreamDoneEvent_l(err); 9824ca3e5df4b809210b240cd7d0489922017d87a6dSantosh Madhava } 983643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi } 984643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi 985643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi // If timestamp exceeds endCutTime of clip, donot render 986643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi if((timeUs/1000) > mPlayEndTimeMsec) { 987cece4b32d340f0ca514160647b9883e3777bc376Chih-Chung Chang mVideoBuffer->release(); 988643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi mVideoBuffer = NULL; 989643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi mFlags |= VIDEO_AT_EOS; 990643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi mFlags |= AUDIO_AT_EOS; 9912703f23af496c13cfa39cc7e157fa12d1cb4c169Steve Block ALOGV("PreviewPlayer: onVideoEvent timeUs > mPlayEndTime; send EOS.."); 9924f4efef8357f4d8b23ccfb1b29db34175bf72627Dheeraj Sharma mOverlayUpdateEventPosted = false; 993fe288aa71450ebe04eb74d06a3ea887c6009aacbSantosh Madhava // Set the last decoded timestamp to duration 994ebf40154a222c864a0aaf807702fc4eb6b9cf40fRaghavender Palla mDecodedVideoTs = (mPlayEndTimeMsec*1000LL); 995643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi postStreamDoneEvent_l(ERROR_END_OF_STREAM); 996643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi return; 997643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi } 998b2d6e0f74a12e5cce5b429e646172c63346346c3Santosh Madhava // Capture the frame timestamp to be rendered 999b2d6e0f74a12e5cce5b429e646172c63346346c3Santosh Madhava mDecodedVideoTs = timeUs; 1000643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi 1001643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi // Post processing to apply video effects 1002643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi for(i=0;i<mNumberEffects;i++) { 1003643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi // First check if effect starttime matches the clip being previewed 1004643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi if((mEffectsSettings[i].uiStartTime < (mDecVideoTsStoryBoard/1000)) || 1005643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi (mEffectsSettings[i].uiStartTime >= 1006643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi ((mDecVideoTsStoryBoard/1000) + mPlayEndTimeMsec - mPlayBeginTimeMsec))) 1007643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi { 1008643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi // This effect doesn't belong to this clip, check next one 1009643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi continue; 1010643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi } 1011643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi // Check if effect applies to this particular frame timestamp 1012643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi if((mEffectsSettings[i].uiStartTime <= 1013643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi (((timeUs+mDecVideoTsStoryBoard)/1000)-mPlayBeginTimeMsec)) && 1014643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi ((mEffectsSettings[i].uiStartTime+mEffectsSettings[i].uiDuration) >= 1015643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi (((timeUs+mDecVideoTsStoryBoard)/1000)-mPlayBeginTimeMsec)) 1016643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi && (mEffectsSettings[i].uiDuration != 0)) { 1017643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi setVideoPostProcessingNode( 1018643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi mEffectsSettings[i].VideoEffectType, TRUE); 1019643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi } 1020643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi else { 1021643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi setVideoPostProcessingNode( 1022643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi mEffectsSettings[i].VideoEffectType, FALSE); 1023643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi } 1024e6c0750cd2927967f93a8811954f889d23fadb6eDharmaray Kundargi } 1025643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi 1026e6c0750cd2927967f93a8811954f889d23fadb6eDharmaray Kundargi //Provide the overlay Update indication when there is an overlay effect 1027d01ef568f96253fe5859526bb67b13fc5e17b544Dharmaray Kundargi if (mCurrentVideoEffect & VIDEO_EFFECT_FRAMING) { 1028d01ef568f96253fe5859526bb67b13fc5e17b544Dharmaray Kundargi mCurrentVideoEffect &= ~VIDEO_EFFECT_FRAMING; //never apply framing here. 1029e6c0750cd2927967f93a8811954f889d23fadb6eDharmaray Kundargi if (!mOverlayUpdateEventPosted) { 1030e6c0750cd2927967f93a8811954f889d23fadb6eDharmaray Kundargi // Find the effect in effectSettings array 1031408e25b2508d97f7ae0b39acf46ab42b7c223c44Basavapatna Dattaguru M4OSA_UInt32 index; 1032e6c0750cd2927967f93a8811954f889d23fadb6eDharmaray Kundargi for (index = 0; index < mNumberEffects; index++) { 1033e6c0750cd2927967f93a8811954f889d23fadb6eDharmaray Kundargi M4OSA_UInt32 timeMs = mDecodedVideoTs/1000; 1034e6c0750cd2927967f93a8811954f889d23fadb6eDharmaray Kundargi M4OSA_UInt32 timeOffset = mDecVideoTsStoryBoard/1000; 1035e6c0750cd2927967f93a8811954f889d23fadb6eDharmaray Kundargi if(mEffectsSettings[index].VideoEffectType == 1036408e25b2508d97f7ae0b39acf46ab42b7c223c44Basavapatna Dattaguru (M4VSS3GPP_VideoEffectType)M4xVSS_kVideoEffectType_Framing) { 1037254c8dfe514fd45eef251763639f63615379570fDharmaray Kundargi if (((mEffectsSettings[index].uiStartTime + 1) <= 1038254c8dfe514fd45eef251763639f63615379570fDharmaray Kundargi timeMs + timeOffset - mPlayBeginTimeMsec) && 1039e6c0750cd2927967f93a8811954f889d23fadb6eDharmaray Kundargi ((mEffectsSettings[index].uiStartTime - 1 + 1040254c8dfe514fd45eef251763639f63615379570fDharmaray Kundargi mEffectsSettings[index].uiDuration) >= 1041254c8dfe514fd45eef251763639f63615379570fDharmaray Kundargi timeMs + timeOffset - mPlayBeginTimeMsec)) 1042e6c0750cd2927967f93a8811954f889d23fadb6eDharmaray Kundargi { 1043e6c0750cd2927967f93a8811954f889d23fadb6eDharmaray Kundargi break; 1044e6c0750cd2927967f93a8811954f889d23fadb6eDharmaray Kundargi } 1045e6c0750cd2927967f93a8811954f889d23fadb6eDharmaray Kundargi } 1046e6c0750cd2927967f93a8811954f889d23fadb6eDharmaray Kundargi } 1047e6c0750cd2927967f93a8811954f889d23fadb6eDharmaray Kundargi if (index < mNumberEffects) { 1048e6c0750cd2927967f93a8811954f889d23fadb6eDharmaray Kundargi mCurrFramingEffectIndex = index; 1049e6c0750cd2927967f93a8811954f889d23fadb6eDharmaray Kundargi mOverlayUpdateEventPosted = true; 1050e6c0750cd2927967f93a8811954f889d23fadb6eDharmaray Kundargi postOverlayUpdateEvent_l(); 105100f742c087d92e5452d29be1fb668022b5f8a6c7James Dong ALOGV("Framing index = %ld", mCurrFramingEffectIndex); 1052e6c0750cd2927967f93a8811954f889d23fadb6eDharmaray Kundargi } else { 10532703f23af496c13cfa39cc7e157fa12d1cb4c169Steve Block ALOGV("No framing effects found"); 1054e6c0750cd2927967f93a8811954f889d23fadb6eDharmaray Kundargi } 1055e6c0750cd2927967f93a8811954f889d23fadb6eDharmaray Kundargi } 1056e6c0750cd2927967f93a8811954f889d23fadb6eDharmaray Kundargi 1057e6c0750cd2927967f93a8811954f889d23fadb6eDharmaray Kundargi } else if (mOverlayUpdateEventPosted) { 1058e6c0750cd2927967f93a8811954f889d23fadb6eDharmaray Kundargi //Post the event when the overlay is no more valid 10592703f23af496c13cfa39cc7e157fa12d1cb4c169Steve Block ALOGV("Overlay is Done"); 1060e6c0750cd2927967f93a8811954f889d23fadb6eDharmaray Kundargi mOverlayUpdateEventPosted = false; 1061e6c0750cd2927967f93a8811954f889d23fadb6eDharmaray Kundargi postOverlayUpdateEvent_l(); 1062643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi } 1063643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi 1064643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi if (mVideoRenderer != NULL) { 106543fcc396614a587851e2b7c4cea2876ec58b8648Chih-Chung Chang mVideoRenderer->render(mVideoBuffer, mCurrentVideoEffect, 106643fcc396614a587851e2b7c4cea2876ec58b8648Chih-Chung Chang mRenderingMode, mIsVideoSourceJpg); 1067643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi } 1068643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi 1069cece4b32d340f0ca514160647b9883e3777bc376Chih-Chung Chang mVideoBuffer->release(); 1070643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi mVideoBuffer = NULL; 1071643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi 1072643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi // Post progress callback based on callback interval set 1073643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi if(mNumberDecVideoFrames >= mProgressCbInterval) { 1074643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi postProgressCallbackEvent_l(); 1075643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi mNumberDecVideoFrames = 0; // reset counter 1076643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi } 1077643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi 1078643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi // if reached EndCutTime of clip, post EOS event 1079643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi if((timeUs/1000) >= mPlayEndTimeMsec) { 10802703f23af496c13cfa39cc7e157fa12d1cb4c169Steve Block ALOGV("PreviewPlayer: onVideoEvent EOS."); 1081643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi mFlags |= VIDEO_AT_EOS; 1082643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi mFlags |= AUDIO_AT_EOS; 10834f4efef8357f4d8b23ccfb1b29db34175bf72627Dheeraj Sharma mOverlayUpdateEventPosted = false; 1084fe288aa71450ebe04eb74d06a3ea887c6009aacbSantosh Madhava // Set the last decoded timestamp to duration 1085ebf40154a222c864a0aaf807702fc4eb6b9cf40fRaghavender Palla mDecodedVideoTs = (mPlayEndTimeMsec*1000LL); 1086643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi postStreamDoneEvent_l(ERROR_END_OF_STREAM); 1087643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi } 1088643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi else { 1089a5872f770c50da1db555d53e062a9896ea4321d5Andreas Huber if ((wasSeeking != NO_SEEK) && (mFlags & SEEK_PREVIEW)) { 10901c97d9ab52a288d24ea54499de435277cc1a3d68Rajneesh Chowdury mFlags &= ~SEEK_PREVIEW; 10911c97d9ab52a288d24ea54499de435277cc1a3d68Rajneesh Chowdury return; 10921c97d9ab52a288d24ea54499de435277cc1a3d68Rajneesh Chowdury } 10931c97d9ab52a288d24ea54499de435277cc1a3d68Rajneesh Chowdury 1094643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi if(!mIsVideoSourceJpg) { 10954f155f0cffa2414545854e899dff4861187e1f68Dharmaray Kundargi postVideoEvent_l(0); 1096643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi } 1097643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi else { 1098643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi postVideoEvent_l(33000); 1099643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi } 1100643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi } 1101643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi} 1102643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi 1103643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargistatus_t PreviewPlayer::prepare() { 110400f742c087d92e5452d29be1fb668022b5f8a6c7James Dong ALOGV("prepare"); 1105643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi Mutex::Autolock autoLock(mLock); 1106643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi return prepare_l(); 1107643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi} 1108643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi 1109643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargistatus_t PreviewPlayer::prepare_l() { 111000f742c087d92e5452d29be1fb668022b5f8a6c7James Dong ALOGV("prepare_l"); 1111643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi if (mFlags & PREPARED) { 1112643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi return OK; 1113643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi } 1114643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi 1115643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi if (mFlags & PREPARING) { 1116643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi return UNKNOWN_ERROR; 1117643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi } 1118643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi 1119643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi mIsAsyncPrepare = false; 1120643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi status_t err = prepareAsync_l(); 1121643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi 1122643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi if (err != OK) { 1123643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi return err; 1124643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi } 1125643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi 1126643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi while (mFlags & PREPARING) { 1127643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi mPreparedCondition.wait(mLock); 1128643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi } 1129643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi 1130643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi return mPrepareResult; 1131643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi} 1132643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi 113300f742c087d92e5452d29be1fb668022b5f8a6c7James Dongstatus_t PreviewPlayer::prepareAsync() { 113400f742c087d92e5452d29be1fb668022b5f8a6c7James Dong ALOGV("prepareAsync"); 113500f742c087d92e5452d29be1fb668022b5f8a6c7James Dong Mutex::Autolock autoLock(mLock); 113600f742c087d92e5452d29be1fb668022b5f8a6c7James Dong return prepareAsync_l(); 113700f742c087d92e5452d29be1fb668022b5f8a6c7James Dong} 113800f742c087d92e5452d29be1fb668022b5f8a6c7James Dong 1139643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargistatus_t PreviewPlayer::prepareAsync_l() { 114000f742c087d92e5452d29be1fb668022b5f8a6c7James Dong ALOGV("prepareAsync_l"); 1141643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi if (mFlags & PREPARING) { 1142643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi return UNKNOWN_ERROR; // async prepare already pending 1143643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi } 1144643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi 1145643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi if (!mQueueStarted) { 1146643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi mQueue.start(); 1147643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi mQueueStarted = true; 1148643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi } 1149643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi 1150643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi mFlags |= PREPARING; 1151643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi mAsyncPrepareEvent = new PreviewPlayerEvent( 1152643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi this, &PreviewPlayer::onPrepareAsyncEvent); 1153643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi 1154643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi mQueue.postEvent(mAsyncPrepareEvent); 1155643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi 1156643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi return OK; 1157643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi} 1158643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi 1159643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargistatus_t PreviewPlayer::finishSetDataSource_l() { 1160643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi sp<DataSource> dataSource; 1161643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi sp<MediaExtractor> extractor; 1162643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi 1163daeb5b33861147fda0096f9c794be6f341d884c2James Dong dataSource = DataSource::CreateFromURI(mUri.string(), NULL); 1164643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi 1165643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi if (dataSource == NULL) { 1166643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi return UNKNOWN_ERROR; 1167643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi } 1168643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi 1169643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi //If file type is .rgb, then no need to check for Extractor 1170643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi int uriLen = strlen(mUri); 1171643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi int startOffset = uriLen - 4; 1172643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi if(!strncasecmp(mUri+startOffset, ".rgb", 4)) { 1173643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi extractor = NULL; 1174643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi } 1175643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi else { 1176643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi extractor = MediaExtractor::Create(dataSource, 1177643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi MEDIA_MIMETYPE_CONTAINER_MPEG4); 1178643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi } 1179643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi 1180643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi if (extractor == NULL) { 118100f742c087d92e5452d29be1fb668022b5f8a6c7James Dong ALOGV("finishSetDataSource_l: failed to create extractor"); 1182643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi return setDataSource_l_jpg(); 1183643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi } 1184643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi 1185643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi return setDataSource_l(extractor); 1186643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi} 1187643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi 1188643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargivoid PreviewPlayer::onPrepareAsyncEvent() { 1189643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi Mutex::Autolock autoLock(mLock); 11902703f23af496c13cfa39cc7e157fa12d1cb4c169Steve Block ALOGV("onPrepareAsyncEvent"); 1191643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi 1192643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi if (mFlags & PREPARE_CANCELLED) { 119300f742c087d92e5452d29be1fb668022b5f8a6c7James Dong ALOGV("prepare was cancelled before doing anything"); 1194643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi abortPrepare(UNKNOWN_ERROR); 1195643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi return; 1196643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi } 1197643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi 1198643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi if (mUri.size() > 0) { 1199643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi status_t err = finishSetDataSource_l(); 1200643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi 1201643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi if (err != OK) { 1202643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi abortPrepare(err); 1203643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi return; 1204643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi } 1205643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi } 1206643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi 1207643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi if (mVideoTrack != NULL && mVideoSource == NULL) { 120800f742c087d92e5452d29be1fb668022b5f8a6c7James Dong status_t err = initVideoDecoder_l(OMXCodec::kHardwareCodecsOnly); 1209643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi 1210643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi if (err != OK) { 1211643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi abortPrepare(err); 1212643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi return; 1213643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi } 1214643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi } 1215643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi 1216643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi if (mAudioTrack != NULL && mAudioSource == NULL) { 121700f742c087d92e5452d29be1fb668022b5f8a6c7James Dong status_t err = initAudioDecoder_l(); 1218643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi 1219643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi if (err != OK) { 1220643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi abortPrepare(err); 1221643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi return; 1222643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi } 1223643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi } 1224643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi finishAsyncPrepare_l(); 1225643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi 1226643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi} 1227643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi 1228643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargivoid PreviewPlayer::finishAsyncPrepare_l() { 122900f742c087d92e5452d29be1fb668022b5f8a6c7James Dong ALOGV("finishAsyncPrepare_l"); 1230643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi if (mIsAsyncPrepare) { 1231643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi if (mVideoSource == NULL) { 1232643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi notifyListener_l(MEDIA_SET_VIDEO_SIZE, 0, 0); 1233643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi } else { 1234643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi notifyVideoSize_l(); 1235643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi } 1236643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi notifyListener_l(MEDIA_PREPARED); 1237643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi } 1238643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi 1239643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi mPrepareResult = OK; 1240643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi mFlags &= ~(PREPARING|PREPARE_CANCELLED); 1241643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi mFlags |= PREPARED; 1242643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi mAsyncPrepareEvent = NULL; 1243643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi mPreparedCondition.broadcast(); 1244643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi} 1245643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi 1246fa31daff175709d2c58d61d1354daa9495696631Raghavender Pallavoid PreviewPlayer::acquireLock() { 12472703f23af496c13cfa39cc7e157fa12d1cb4c169Steve Block ALOGV("acquireLock"); 1248fa31daff175709d2c58d61d1354daa9495696631Raghavender Palla mLockControl.lock(); 1249fa31daff175709d2c58d61d1354daa9495696631Raghavender Palla} 1250fa31daff175709d2c58d61d1354daa9495696631Raghavender Palla 1251fa31daff175709d2c58d61d1354daa9495696631Raghavender Pallavoid PreviewPlayer::releaseLock() { 12522703f23af496c13cfa39cc7e157fa12d1cb4c169Steve Block ALOGV("releaseLock"); 1253fa31daff175709d2c58d61d1354daa9495696631Raghavender Palla mLockControl.unlock(); 1254fa31daff175709d2c58d61d1354daa9495696631Raghavender Palla} 1255fa31daff175709d2c58d61d1354daa9495696631Raghavender Palla 1256643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargistatus_t PreviewPlayer::loadEffectsSettings( 125700f742c087d92e5452d29be1fb668022b5f8a6c7James Dong M4VSS3GPP_EffectSettings* pEffectSettings, int nEffects) { 1258643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi 125900f742c087d92e5452d29be1fb668022b5f8a6c7James Dong ALOGV("loadEffectsSettings"); 1260643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi mNumberEffects = nEffects; 1261643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi mEffectsSettings = pEffectSettings; 1262643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi return OK; 1263643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi} 1264643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi 1265643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargistatus_t PreviewPlayer::loadAudioMixSettings( 126600f742c087d92e5452d29be1fb668022b5f8a6c7James Dong M4xVSS_AudioMixingSettings* pAudioMixSettings) { 1267643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi 126800f742c087d92e5452d29be1fb668022b5f8a6c7James Dong ALOGV("loadAudioMixSettings"); 1269643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi mPreviewPlayerAudioMixSettings = pAudioMixSettings; 1270643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi return OK; 1271643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi} 1272643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi 1273643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargistatus_t PreviewPlayer::setAudioMixPCMFileHandle( 127400f742c087d92e5452d29be1fb668022b5f8a6c7James Dong M4OSA_Context pAudioMixPCMFileHandle) { 1275643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi 127600f742c087d92e5452d29be1fb668022b5f8a6c7James Dong ALOGV("setAudioMixPCMFileHandle"); 1277643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi mAudioMixPCMFileHandle = pAudioMixPCMFileHandle; 1278643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi return OK; 1279643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi} 1280643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi 1281643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargistatus_t PreviewPlayer::setAudioMixStoryBoardParam( 128200f742c087d92e5452d29be1fb668022b5f8a6c7James Dong M4OSA_UInt32 audioMixStoryBoardTS, 128300f742c087d92e5452d29be1fb668022b5f8a6c7James Dong M4OSA_UInt32 currentMediaBeginCutTime, 128400f742c087d92e5452d29be1fb668022b5f8a6c7James Dong M4OSA_UInt32 primaryTrackVolValue ) { 1285643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi 128600f742c087d92e5452d29be1fb668022b5f8a6c7James Dong ALOGV("setAudioMixStoryBoardParam"); 1287643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi mAudioMixStoryBoardTS = audioMixStoryBoardTS; 1288643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi mCurrentMediaBeginCutTime = currentMediaBeginCutTime; 1289643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi mCurrentMediaVolumeValue = primaryTrackVolValue; 1290643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi return OK; 1291643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi} 1292643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi 1293643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargistatus_t PreviewPlayer::setPlaybackBeginTime(uint32_t msec) { 1294643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi 1295643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi mPlayBeginTimeMsec = msec; 1296643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi return OK; 1297643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi} 1298643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi 1299643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargistatus_t PreviewPlayer::setPlaybackEndTime(uint32_t msec) { 1300643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi 1301643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi mPlayEndTimeMsec = msec; 1302643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi return OK; 1303643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi} 1304643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi 1305643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargistatus_t PreviewPlayer::setStoryboardStartTime(uint32_t msec) { 1306643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi 1307643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi mStoryboardStartTimeMsec = msec; 130800f742c087d92e5452d29be1fb668022b5f8a6c7James Dong mDecVideoTsStoryBoard = mStoryboardStartTimeMsec * 1000LL; 1309643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi return OK; 1310643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi} 1311643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi 1312643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargistatus_t PreviewPlayer::setProgressCallbackInterval(uint32_t cbInterval) { 1313643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi 1314643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi mProgressCbInterval = cbInterval; 1315643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi return OK; 1316643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi} 1317643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi 1318643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi 1319643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargistatus_t PreviewPlayer::setMediaRenderingMode( 1320643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi M4xVSS_MediaRendering mode, 1321643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi M4VIDEOEDITING_VideoFrameSize outputVideoSize) { 1322643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi 1323643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi mRenderingMode = mode; 1324643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi 13258806b706693c0992724f6603353af18aeb4a0f80Hong Teng /* get the video width and height by resolution */ 132600f742c087d92e5452d29be1fb668022b5f8a6c7James Dong return getVideoSizeByResolution( 132700f742c087d92e5452d29be1fb668022b5f8a6c7James Dong outputVideoSize, 132800f742c087d92e5452d29be1fb668022b5f8a6c7James Dong &mOutputVideoWidth, &mOutputVideoHeight); 1329643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi 1330643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi} 1331643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi 1332643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargistatus_t PreviewPlayer::resetJniCallbackTimeStamp() { 1333643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi 133400f742c087d92e5452d29be1fb668022b5f8a6c7James Dong mDecVideoTsStoryBoard = mStoryboardStartTimeMsec * 1000LL; 1335643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi return OK; 1336643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi} 1337643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi 1338643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargivoid PreviewPlayer::postProgressCallbackEvent_l() { 1339643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi if (mProgressCbEventPending) { 1340643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi return; 1341643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi } 1342643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi mProgressCbEventPending = true; 1343643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi 1344643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi mQueue.postEvent(mProgressCbEvent); 1345643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi} 1346643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi 1347e6c0750cd2927967f93a8811954f889d23fadb6eDharmaray Kundargi 1348643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargivoid PreviewPlayer::onProgressCbEvent() { 1349643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi Mutex::Autolock autoLock(mLock); 1350643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi if (!mProgressCbEventPending) { 1351643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi return; 1352643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi } 1353643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi mProgressCbEventPending = false; 1354643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi // If playback starts from previous I-frame, 1355643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi // then send frame storyboard duration 135600f742c087d92e5452d29be1fb668022b5f8a6c7James Dong if ((mDecodedVideoTs/1000) < mPlayBeginTimeMsec) { 1357643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi notifyListener_l(MEDIA_INFO, 0, mDecVideoTsStoryBoard/1000); 135800f742c087d92e5452d29be1fb668022b5f8a6c7James Dong } else { 1359643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi notifyListener_l(MEDIA_INFO, 0, 1360643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi (((mDecodedVideoTs+mDecVideoTsStoryBoard)/1000)-mPlayBeginTimeMsec)); 1361643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi } 1362643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi} 1363643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi 1364e6c0750cd2927967f93a8811954f889d23fadb6eDharmaray Kundargivoid PreviewPlayer::postOverlayUpdateEvent_l() { 1365e6c0750cd2927967f93a8811954f889d23fadb6eDharmaray Kundargi if (mOverlayUpdateEventPending) { 1366e6c0750cd2927967f93a8811954f889d23fadb6eDharmaray Kundargi return; 1367e6c0750cd2927967f93a8811954f889d23fadb6eDharmaray Kundargi } 1368e6c0750cd2927967f93a8811954f889d23fadb6eDharmaray Kundargi mOverlayUpdateEventPending = true; 1369e6c0750cd2927967f93a8811954f889d23fadb6eDharmaray Kundargi mQueue.postEvent(mOverlayUpdateEvent); 1370e6c0750cd2927967f93a8811954f889d23fadb6eDharmaray Kundargi} 1371e6c0750cd2927967f93a8811954f889d23fadb6eDharmaray Kundargi 1372e6c0750cd2927967f93a8811954f889d23fadb6eDharmaray Kundargivoid PreviewPlayer::onUpdateOverlayEvent() { 1373e6c0750cd2927967f93a8811954f889d23fadb6eDharmaray Kundargi Mutex::Autolock autoLock(mLock); 1374e6c0750cd2927967f93a8811954f889d23fadb6eDharmaray Kundargi 1375e6c0750cd2927967f93a8811954f889d23fadb6eDharmaray Kundargi if (!mOverlayUpdateEventPending) { 1376e6c0750cd2927967f93a8811954f889d23fadb6eDharmaray Kundargi return; 1377e6c0750cd2927967f93a8811954f889d23fadb6eDharmaray Kundargi } 1378e6c0750cd2927967f93a8811954f889d23fadb6eDharmaray Kundargi mOverlayUpdateEventPending = false; 1379e6c0750cd2927967f93a8811954f889d23fadb6eDharmaray Kundargi 138000f742c087d92e5452d29be1fb668022b5f8a6c7James Dong int updateState = mOverlayUpdateEventPosted? 1: 0; 1381e6c0750cd2927967f93a8811954f889d23fadb6eDharmaray Kundargi notifyListener_l(0xBBBBBBBB, updateState, mCurrFramingEffectIndex); 1382e6c0750cd2927967f93a8811954f889d23fadb6eDharmaray Kundargi} 1383e6c0750cd2927967f93a8811954f889d23fadb6eDharmaray Kundargi 1384e6c0750cd2927967f93a8811954f889d23fadb6eDharmaray Kundargi 1385643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargivoid PreviewPlayer::setVideoPostProcessingNode( 138600f742c087d92e5452d29be1fb668022b5f8a6c7James Dong M4VSS3GPP_VideoEffectType type, M4OSA_Bool enable) { 1387643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi 1388643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi uint32_t effect = VIDEO_EFFECT_NONE; 1389643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi 1390643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi //Map M4VSS3GPP_VideoEffectType to local enum 1391643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi switch(type) { 1392643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi case M4VSS3GPP_kVideoEffectType_FadeFromBlack: 1393643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi effect = VIDEO_EFFECT_FADEFROMBLACK; 1394643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi break; 1395643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi 1396643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi case M4VSS3GPP_kVideoEffectType_FadeToBlack: 1397643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi effect = VIDEO_EFFECT_FADETOBLACK; 1398643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi break; 1399643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi 1400643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi case M4xVSS_kVideoEffectType_BlackAndWhite: 1401643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi effect = VIDEO_EFFECT_BLACKANDWHITE; 1402643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi break; 1403643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi 1404643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi case M4xVSS_kVideoEffectType_Pink: 1405643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi effect = VIDEO_EFFECT_PINK; 1406643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi break; 1407643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi 1408643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi case M4xVSS_kVideoEffectType_Green: 1409643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi effect = VIDEO_EFFECT_GREEN; 1410643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi break; 1411643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi 1412643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi case M4xVSS_kVideoEffectType_Sepia: 1413643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi effect = VIDEO_EFFECT_SEPIA; 1414643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi break; 1415643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi 1416643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi case M4xVSS_kVideoEffectType_Negative: 1417643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi effect = VIDEO_EFFECT_NEGATIVE; 1418643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi break; 1419643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi 1420643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi case M4xVSS_kVideoEffectType_Framing: 1421643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi effect = VIDEO_EFFECT_FRAMING; 1422643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi break; 1423643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi 1424643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi case M4xVSS_kVideoEffectType_Fifties: 1425643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi effect = VIDEO_EFFECT_FIFTIES; 1426643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi break; 1427643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi 1428643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi case M4xVSS_kVideoEffectType_ColorRGB16: 1429643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi effect = VIDEO_EFFECT_COLOR_RGB16; 1430643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi break; 1431643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi 1432643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi case M4xVSS_kVideoEffectType_Gradient: 1433643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi effect = VIDEO_EFFECT_GRADIENT; 1434643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi break; 1435643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi 1436643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi default: 1437643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi effect = VIDEO_EFFECT_NONE; 1438643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi break; 1439643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi } 1440643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi 144100f742c087d92e5452d29be1fb668022b5f8a6c7James Dong if (enable == M4OSA_TRUE) { 1442643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi //If already set, then no need to set again 144300f742c087d92e5452d29be1fb668022b5f8a6c7James Dong if (!(mCurrentVideoEffect & effect)) { 1444643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi mCurrentVideoEffect |= effect; 144500f742c087d92e5452d29be1fb668022b5f8a6c7James Dong if (effect == VIDEO_EFFECT_FIFTIES) { 1446643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi mIsFiftiesEffectStarted = true; 1447643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi } 1448643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi } 144900f742c087d92e5452d29be1fb668022b5f8a6c7James Dong } else { 1450643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi //Reset only if already set 145100f742c087d92e5452d29be1fb668022b5f8a6c7James Dong if (mCurrentVideoEffect & effect) { 1452643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi mCurrentVideoEffect &= ~effect; 1453643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi } 1454643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi } 1455643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi} 1456643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi 1457643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargistatus_t PreviewPlayer::setImageClipProperties(uint32_t width,uint32_t height) { 1458643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi mVideoWidth = width; 1459643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi mVideoHeight = height; 1460643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi return OK; 1461643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi} 1462643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi 1463643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargistatus_t PreviewPlayer::readFirstVideoFrame() { 146400f742c087d92e5452d29be1fb668022b5f8a6c7James Dong ALOGV("readFirstVideoFrame"); 1465643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi 1466643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi if (!mVideoBuffer) { 1467643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi MediaSource::ReadOptions options; 1468a5872f770c50da1db555d53e062a9896ea4321d5Andreas Huber if (mSeeking != NO_SEEK) { 146900f742c087d92e5452d29be1fb668022b5f8a6c7James Dong ALOGV("seeking to %lld us (%.2f secs)", mSeekTimeUs, 1470643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi mSeekTimeUs / 1E6); 1471643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi 1472643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi options.setSeekTo( 1473643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi mSeekTimeUs, MediaSource::ReadOptions::SEEK_CLOSEST); 1474643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi } 1475643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi for (;;) { 147643fcc396614a587851e2b7c4cea2876ec58b8648Chih-Chung Chang status_t err = mVideoSource->read(&mVideoBuffer, &options); 1477643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi options.clearSeekTo(); 1478643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi 1479643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi if (err != OK) { 148000f742c087d92e5452d29be1fb668022b5f8a6c7James Dong CHECK(!mVideoBuffer); 1481643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi 1482643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi if (err == INFO_FORMAT_CHANGED) { 148300f742c087d92e5452d29be1fb668022b5f8a6c7James Dong ALOGV("VideoSource signalled format change"); 1484643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi notifyVideoSize_l(); 1485643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi 1486643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi if (mVideoRenderer != NULL) { 1487643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi mVideoRendererIsPreview = false; 1488bfece17c8f63de4d4b686da50f8ecac2f6f8ec53Santosh Madhava err = initRenderer_l(); 14894ca3e5df4b809210b240cd7d0489922017d87a6dSantosh Madhava if (err != OK) { 14904ca3e5df4b809210b240cd7d0489922017d87a6dSantosh Madhava postStreamDoneEvent_l(err); 14914ca3e5df4b809210b240cd7d0489922017d87a6dSantosh Madhava } 1492643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi } 149343fcc396614a587851e2b7c4cea2876ec58b8648Chih-Chung Chang 149443fcc396614a587851e2b7c4cea2876ec58b8648Chih-Chung Chang updateSizeToRender(mVideoSource->getFormat()); 1495643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi continue; 1496643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi } 149700f742c087d92e5452d29be1fb668022b5f8a6c7James Dong ALOGV("EOS reached."); 1498643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi mFlags |= VIDEO_AT_EOS; 14991c97d9ab52a288d24ea54499de435277cc1a3d68Rajneesh Chowdury mFlags |= AUDIO_AT_EOS; 1500643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi postStreamDoneEvent_l(err); 1501643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi return OK; 1502643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi } 1503643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi 1504643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi if (mVideoBuffer->range_length() == 0) { 1505643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi // Some decoders, notably the PV AVC software decoder 1506643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi // return spurious empty buffers that we just want to ignore. 1507643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi 1508643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi mVideoBuffer->release(); 1509643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi mVideoBuffer = NULL; 1510643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi continue; 1511643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi } 1512643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi 1513643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi int64_t videoTimeUs; 1514643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi CHECK(mVideoBuffer->meta_data()->findInt64(kKeyTime, &videoTimeUs)); 1515a5872f770c50da1db555d53e062a9896ea4321d5Andreas Huber if (mSeeking != NO_SEEK) { 1516b2d6e0f74a12e5cce5b429e646172c63346346c3Santosh Madhava if (videoTimeUs < mSeekTimeUs) { 1517b2d6e0f74a12e5cce5b429e646172c63346346c3Santosh Madhava // buffers are before seek time 1518b2d6e0f74a12e5cce5b429e646172c63346346c3Santosh Madhava // ignore them 1519b2d6e0f74a12e5cce5b429e646172c63346346c3Santosh Madhava mVideoBuffer->release(); 1520b2d6e0f74a12e5cce5b429e646172c63346346c3Santosh Madhava mVideoBuffer = NULL; 1521b2d6e0f74a12e5cce5b429e646172c63346346c3Santosh Madhava continue; 1522b2d6e0f74a12e5cce5b429e646172c63346346c3Santosh Madhava } 1523b2d6e0f74a12e5cce5b429e646172c63346346c3Santosh Madhava } else { 152400f742c087d92e5452d29be1fb668022b5f8a6c7James Dong if ((videoTimeUs/1000) < mPlayBeginTimeMsec) { 1525b2d6e0f74a12e5cce5b429e646172c63346346c3Santosh Madhava // buffers are before begin cut time 1526b2d6e0f74a12e5cce5b429e646172c63346346c3Santosh Madhava // ignore them 1527b2d6e0f74a12e5cce5b429e646172c63346346c3Santosh Madhava mVideoBuffer->release(); 1528b2d6e0f74a12e5cce5b429e646172c63346346c3Santosh Madhava mVideoBuffer = NULL; 1529b2d6e0f74a12e5cce5b429e646172c63346346c3Santosh Madhava continue; 1530b2d6e0f74a12e5cce5b429e646172c63346346c3Santosh Madhava } 1531643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi } 1532643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi break; 1533643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi } 1534643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi } 1535643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi 1536643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi int64_t timeUs; 1537643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi CHECK(mVideoBuffer->meta_data()->findInt64(kKeyTime, &timeUs)); 153800f742c087d92e5452d29be1fb668022b5f8a6c7James Dong setPosition_l(timeUs); 1539643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi 1540643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi mDecodedVideoTs = timeUs; 1541643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi 1542643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi return OK; 1543643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi 1544643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi} 1545643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi 1546b2d6e0f74a12e5cce5b429e646172c63346346c3Santosh Madhavastatus_t PreviewPlayer::getLastRenderedTimeMs(uint32_t *lastRenderedTimeMs) { 1547b2d6e0f74a12e5cce5b429e646172c63346346c3Santosh Madhava *lastRenderedTimeMs = (((mDecodedVideoTs+mDecVideoTsStoryBoard)/1000)-mPlayBeginTimeMsec); 1548b2d6e0f74a12e5cce5b429e646172c63346346c3Santosh Madhava return OK; 1549b2d6e0f74a12e5cce5b429e646172c63346346c3Santosh Madhava} 1550b2d6e0f74a12e5cce5b429e646172c63346346c3Santosh Madhava 155143fcc396614a587851e2b7c4cea2876ec58b8648Chih-Chung Changvoid PreviewPlayer::updateSizeToRender(sp<MetaData> meta) { 155243fcc396614a587851e2b7c4cea2876ec58b8648Chih-Chung Chang if (mVideoRenderer) { 155343fcc396614a587851e2b7c4cea2876ec58b8648Chih-Chung Chang mVideoRenderer->updateVideoSize(meta); 155443fcc396614a587851e2b7c4cea2876ec58b8648Chih-Chung Chang } 155543fcc396614a587851e2b7c4cea2876ec58b8648Chih-Chung Chang} 155643fcc396614a587851e2b7c4cea2876ec58b8648Chih-Chung Chang 155700f742c087d92e5452d29be1fb668022b5f8a6c7James Dongvoid PreviewPlayer::setListener(const wp<MediaPlayerBase> &listener) { 155800f742c087d92e5452d29be1fb668022b5f8a6c7James Dong Mutex::Autolock autoLock(mLock); 155900f742c087d92e5452d29be1fb668022b5f8a6c7James Dong mListener = listener; 156000f742c087d92e5452d29be1fb668022b5f8a6c7James Dong} 156100f742c087d92e5452d29be1fb668022b5f8a6c7James Dong 156200f742c087d92e5452d29be1fb668022b5f8a6c7James Dongstatus_t PreviewPlayer::setDataSource(const sp<IStreamSource> &source) { 156300f742c087d92e5452d29be1fb668022b5f8a6c7James Dong return INVALID_OPERATION; 156400f742c087d92e5452d29be1fb668022b5f8a6c7James Dong} 156500f742c087d92e5452d29be1fb668022b5f8a6c7James Dong 156600f742c087d92e5452d29be1fb668022b5f8a6c7James Dongvoid PreviewPlayer::reset() { 156700f742c087d92e5452d29be1fb668022b5f8a6c7James Dong Mutex::Autolock autoLock(mLock); 156800f742c087d92e5452d29be1fb668022b5f8a6c7James Dong reset_l(); 156900f742c087d92e5452d29be1fb668022b5f8a6c7James Dong} 157000f742c087d92e5452d29be1fb668022b5f8a6c7James Dong 157100f742c087d92e5452d29be1fb668022b5f8a6c7James Dongvoid PreviewPlayer::clear_l() { 157200f742c087d92e5452d29be1fb668022b5f8a6c7James Dong mDisplayWidth = 0; 157300f742c087d92e5452d29be1fb668022b5f8a6c7James Dong mDisplayHeight = 0; 157400f742c087d92e5452d29be1fb668022b5f8a6c7James Dong 157500f742c087d92e5452d29be1fb668022b5f8a6c7James Dong if (mFlags & PLAYING) { 157600f742c087d92e5452d29be1fb668022b5f8a6c7James Dong updateBatteryUsage_l(); 157700f742c087d92e5452d29be1fb668022b5f8a6c7James Dong } 157800f742c087d92e5452d29be1fb668022b5f8a6c7James Dong 157900f742c087d92e5452d29be1fb668022b5f8a6c7James Dong if (mFlags & PREPARING) { 158000f742c087d92e5452d29be1fb668022b5f8a6c7James Dong mFlags |= PREPARE_CANCELLED; 158100f742c087d92e5452d29be1fb668022b5f8a6c7James Dong 158200f742c087d92e5452d29be1fb668022b5f8a6c7James Dong if (mFlags & PREPARING_CONNECTED) { 158300f742c087d92e5452d29be1fb668022b5f8a6c7James Dong // We are basically done preparing, we're just buffering 158400f742c087d92e5452d29be1fb668022b5f8a6c7James Dong // enough data to start playback, we can safely interrupt that. 158500f742c087d92e5452d29be1fb668022b5f8a6c7James Dong finishAsyncPrepare_l(); 158600f742c087d92e5452d29be1fb668022b5f8a6c7James Dong } 158700f742c087d92e5452d29be1fb668022b5f8a6c7James Dong } 158800f742c087d92e5452d29be1fb668022b5f8a6c7James Dong 158900f742c087d92e5452d29be1fb668022b5f8a6c7James Dong while (mFlags & PREPARING) { 159000f742c087d92e5452d29be1fb668022b5f8a6c7James Dong mPreparedCondition.wait(mLock); 159100f742c087d92e5452d29be1fb668022b5f8a6c7James Dong } 159200f742c087d92e5452d29be1fb668022b5f8a6c7James Dong 159300f742c087d92e5452d29be1fb668022b5f8a6c7James Dong cancelPlayerEvents_l(true); 159400f742c087d92e5452d29be1fb668022b5f8a6c7James Dong 159500f742c087d92e5452d29be1fb668022b5f8a6c7James Dong mAudioTrack.clear(); 159600f742c087d92e5452d29be1fb668022b5f8a6c7James Dong mVideoTrack.clear(); 159700f742c087d92e5452d29be1fb668022b5f8a6c7James Dong 159800f742c087d92e5452d29be1fb668022b5f8a6c7James Dong // Shutdown audio first, so that the respone to the reset request 159900f742c087d92e5452d29be1fb668022b5f8a6c7James Dong // appears to happen instantaneously as far as the user is concerned 160000f742c087d92e5452d29be1fb668022b5f8a6c7James Dong // If we did this later, audio would continue playing while we 160100f742c087d92e5452d29be1fb668022b5f8a6c7James Dong // shutdown the video-related resources and the player appear to 160200f742c087d92e5452d29be1fb668022b5f8a6c7James Dong // not be as responsive to a reset request. 160300f742c087d92e5452d29be1fb668022b5f8a6c7James Dong if (mAudioPlayer == NULL && mAudioSource != NULL) { 160400f742c087d92e5452d29be1fb668022b5f8a6c7James Dong // If we had an audio player, it would have effectively 160500f742c087d92e5452d29be1fb668022b5f8a6c7James Dong // taken possession of the audio source and stopped it when 160600f742c087d92e5452d29be1fb668022b5f8a6c7James Dong // _it_ is stopped. Otherwise this is still our responsibility. 160700f742c087d92e5452d29be1fb668022b5f8a6c7James Dong mAudioSource->stop(); 160800f742c087d92e5452d29be1fb668022b5f8a6c7James Dong } 160900f742c087d92e5452d29be1fb668022b5f8a6c7James Dong mAudioSource.clear(); 161000f742c087d92e5452d29be1fb668022b5f8a6c7James Dong 161100f742c087d92e5452d29be1fb668022b5f8a6c7James Dong mTimeSource = NULL; 161200f742c087d92e5452d29be1fb668022b5f8a6c7James Dong 161300f742c087d92e5452d29be1fb668022b5f8a6c7James Dong delete mAudioPlayer; 161400f742c087d92e5452d29be1fb668022b5f8a6c7James Dong mAudioPlayer = NULL; 161500f742c087d92e5452d29be1fb668022b5f8a6c7James Dong 161600f742c087d92e5452d29be1fb668022b5f8a6c7James Dong if (mVideoSource != NULL) { 161700f742c087d92e5452d29be1fb668022b5f8a6c7James Dong shutdownVideoDecoder_l(); 161800f742c087d92e5452d29be1fb668022b5f8a6c7James Dong } 161900f742c087d92e5452d29be1fb668022b5f8a6c7James Dong 162000f742c087d92e5452d29be1fb668022b5f8a6c7James Dong mDurationUs = -1; 162100f742c087d92e5452d29be1fb668022b5f8a6c7James Dong mFlags = 0; 162200f742c087d92e5452d29be1fb668022b5f8a6c7James Dong mExtractorFlags = 0; 162300f742c087d92e5452d29be1fb668022b5f8a6c7James Dong mTimeSourceDeltaUs = 0; 162400f742c087d92e5452d29be1fb668022b5f8a6c7James Dong mVideoTimeUs = 0; 162500f742c087d92e5452d29be1fb668022b5f8a6c7James Dong 162600f742c087d92e5452d29be1fb668022b5f8a6c7James Dong mSeeking = NO_SEEK; 162700f742c087d92e5452d29be1fb668022b5f8a6c7James Dong mSeekNotificationSent = false; 162800f742c087d92e5452d29be1fb668022b5f8a6c7James Dong mSeekTimeUs = 0; 162900f742c087d92e5452d29be1fb668022b5f8a6c7James Dong 163000f742c087d92e5452d29be1fb668022b5f8a6c7James Dong mUri.setTo(""); 163100f742c087d92e5452d29be1fb668022b5f8a6c7James Dong 163200f742c087d92e5452d29be1fb668022b5f8a6c7James Dong mBitrate = -1; 163300f742c087d92e5452d29be1fb668022b5f8a6c7James Dong mLastVideoTimeUs = -1; 163400f742c087d92e5452d29be1fb668022b5f8a6c7James Dong} 163500f742c087d92e5452d29be1fb668022b5f8a6c7James Dong 163600f742c087d92e5452d29be1fb668022b5f8a6c7James Dongvoid PreviewPlayer::notifyListener_l(int msg, int ext1, int ext2) { 163700f742c087d92e5452d29be1fb668022b5f8a6c7James Dong if (mListener != NULL) { 163800f742c087d92e5452d29be1fb668022b5f8a6c7James Dong sp<MediaPlayerBase> listener = mListener.promote(); 163900f742c087d92e5452d29be1fb668022b5f8a6c7James Dong 164000f742c087d92e5452d29be1fb668022b5f8a6c7James Dong if (listener != NULL) { 164100f742c087d92e5452d29be1fb668022b5f8a6c7James Dong listener->sendEvent(msg, ext1, ext2); 164200f742c087d92e5452d29be1fb668022b5f8a6c7James Dong } 164300f742c087d92e5452d29be1fb668022b5f8a6c7James Dong } 164400f742c087d92e5452d29be1fb668022b5f8a6c7James Dong} 164500f742c087d92e5452d29be1fb668022b5f8a6c7James Dong 164600f742c087d92e5452d29be1fb668022b5f8a6c7James Dongvoid PreviewPlayer::onVideoLagUpdate() { 164700f742c087d92e5452d29be1fb668022b5f8a6c7James Dong Mutex::Autolock autoLock(mLock); 164800f742c087d92e5452d29be1fb668022b5f8a6c7James Dong if (!mVideoLagEventPending) { 164900f742c087d92e5452d29be1fb668022b5f8a6c7James Dong return; 165000f742c087d92e5452d29be1fb668022b5f8a6c7James Dong } 165100f742c087d92e5452d29be1fb668022b5f8a6c7James Dong mVideoLagEventPending = false; 165200f742c087d92e5452d29be1fb668022b5f8a6c7James Dong 165300f742c087d92e5452d29be1fb668022b5f8a6c7James Dong int64_t audioTimeUs = mAudioPlayer->getMediaTimeUs(); 165400f742c087d92e5452d29be1fb668022b5f8a6c7James Dong int64_t videoLateByUs = audioTimeUs - mVideoTimeUs; 165500f742c087d92e5452d29be1fb668022b5f8a6c7James Dong 165600f742c087d92e5452d29be1fb668022b5f8a6c7James Dong if (!(mFlags & VIDEO_AT_EOS) && videoLateByUs > 300000ll) { 165700f742c087d92e5452d29be1fb668022b5f8a6c7James Dong ALOGV("video late by %lld ms.", videoLateByUs / 1000ll); 165800f742c087d92e5452d29be1fb668022b5f8a6c7James Dong 165900f742c087d92e5452d29be1fb668022b5f8a6c7James Dong notifyListener_l( 166000f742c087d92e5452d29be1fb668022b5f8a6c7James Dong MEDIA_INFO, 166100f742c087d92e5452d29be1fb668022b5f8a6c7James Dong MEDIA_INFO_VIDEO_TRACK_LAGGING, 166200f742c087d92e5452d29be1fb668022b5f8a6c7James Dong videoLateByUs / 1000ll); 166300f742c087d92e5452d29be1fb668022b5f8a6c7James Dong } 166400f742c087d92e5452d29be1fb668022b5f8a6c7James Dong 166500f742c087d92e5452d29be1fb668022b5f8a6c7James Dong postVideoLagEvent_l(); 166600f742c087d92e5452d29be1fb668022b5f8a6c7James Dong} 166700f742c087d92e5452d29be1fb668022b5f8a6c7James Dong 166800f742c087d92e5452d29be1fb668022b5f8a6c7James Dongvoid PreviewPlayer::notifyVideoSize_l() { 166900f742c087d92e5452d29be1fb668022b5f8a6c7James Dong sp<MetaData> meta = mVideoSource->getFormat(); 167000f742c087d92e5452d29be1fb668022b5f8a6c7James Dong 167100f742c087d92e5452d29be1fb668022b5f8a6c7James Dong int32_t vWidth, vHeight; 167200f742c087d92e5452d29be1fb668022b5f8a6c7James Dong int32_t cropLeft, cropTop, cropRight, cropBottom; 167300f742c087d92e5452d29be1fb668022b5f8a6c7James Dong 167400f742c087d92e5452d29be1fb668022b5f8a6c7James Dong CHECK(meta->findInt32(kKeyWidth, &vWidth)); 167500f742c087d92e5452d29be1fb668022b5f8a6c7James Dong CHECK(meta->findInt32(kKeyHeight, &vHeight)); 167600f742c087d92e5452d29be1fb668022b5f8a6c7James Dong 167700f742c087d92e5452d29be1fb668022b5f8a6c7James Dong mGivenWidth = vWidth; 167800f742c087d92e5452d29be1fb668022b5f8a6c7James Dong mGivenHeight = vHeight; 167900f742c087d92e5452d29be1fb668022b5f8a6c7James Dong 168000f742c087d92e5452d29be1fb668022b5f8a6c7James Dong if (!meta->findRect( 168100f742c087d92e5452d29be1fb668022b5f8a6c7James Dong kKeyCropRect, &cropLeft, &cropTop, &cropRight, &cropBottom)) { 168200f742c087d92e5452d29be1fb668022b5f8a6c7James Dong 168300f742c087d92e5452d29be1fb668022b5f8a6c7James Dong cropLeft = cropTop = 0; 168400f742c087d92e5452d29be1fb668022b5f8a6c7James Dong cropRight = vWidth - 1; 168500f742c087d92e5452d29be1fb668022b5f8a6c7James Dong cropBottom = vHeight - 1; 168600f742c087d92e5452d29be1fb668022b5f8a6c7James Dong 168700f742c087d92e5452d29be1fb668022b5f8a6c7James Dong ALOGD("got dimensions only %d x %d", vWidth, vHeight); 168800f742c087d92e5452d29be1fb668022b5f8a6c7James Dong } else { 168900f742c087d92e5452d29be1fb668022b5f8a6c7James Dong ALOGD("got crop rect %d, %d, %d, %d", 169000f742c087d92e5452d29be1fb668022b5f8a6c7James Dong cropLeft, cropTop, cropRight, cropBottom); 169100f742c087d92e5452d29be1fb668022b5f8a6c7James Dong } 169200f742c087d92e5452d29be1fb668022b5f8a6c7James Dong 169300f742c087d92e5452d29be1fb668022b5f8a6c7James Dong mCropRect.left = cropLeft; 169400f742c087d92e5452d29be1fb668022b5f8a6c7James Dong mCropRect.right = cropRight; 169500f742c087d92e5452d29be1fb668022b5f8a6c7James Dong mCropRect.top = cropTop; 169600f742c087d92e5452d29be1fb668022b5f8a6c7James Dong mCropRect.bottom = cropBottom; 169700f742c087d92e5452d29be1fb668022b5f8a6c7James Dong 169800f742c087d92e5452d29be1fb668022b5f8a6c7James Dong int32_t displayWidth; 169900f742c087d92e5452d29be1fb668022b5f8a6c7James Dong if (meta->findInt32(kKeyDisplayWidth, &displayWidth)) { 170000f742c087d92e5452d29be1fb668022b5f8a6c7James Dong ALOGV("Display width changed (%d=>%d)", mDisplayWidth, displayWidth); 170100f742c087d92e5452d29be1fb668022b5f8a6c7James Dong mDisplayWidth = displayWidth; 170200f742c087d92e5452d29be1fb668022b5f8a6c7James Dong } 170300f742c087d92e5452d29be1fb668022b5f8a6c7James Dong int32_t displayHeight; 170400f742c087d92e5452d29be1fb668022b5f8a6c7James Dong if (meta->findInt32(kKeyDisplayHeight, &displayHeight)) { 170500f742c087d92e5452d29be1fb668022b5f8a6c7James Dong ALOGV("Display height changed (%d=>%d)", mDisplayHeight, displayHeight); 170600f742c087d92e5452d29be1fb668022b5f8a6c7James Dong mDisplayHeight = displayHeight; 170700f742c087d92e5452d29be1fb668022b5f8a6c7James Dong } 170800f742c087d92e5452d29be1fb668022b5f8a6c7James Dong 170900f742c087d92e5452d29be1fb668022b5f8a6c7James Dong int32_t usableWidth = cropRight - cropLeft + 1; 171000f742c087d92e5452d29be1fb668022b5f8a6c7James Dong int32_t usableHeight = cropBottom - cropTop + 1; 171100f742c087d92e5452d29be1fb668022b5f8a6c7James Dong if (mDisplayWidth != 0) { 171200f742c087d92e5452d29be1fb668022b5f8a6c7James Dong usableWidth = mDisplayWidth; 171300f742c087d92e5452d29be1fb668022b5f8a6c7James Dong } 171400f742c087d92e5452d29be1fb668022b5f8a6c7James Dong if (mDisplayHeight != 0) { 171500f742c087d92e5452d29be1fb668022b5f8a6c7James Dong usableHeight = mDisplayHeight; 171600f742c087d92e5452d29be1fb668022b5f8a6c7James Dong } 171700f742c087d92e5452d29be1fb668022b5f8a6c7James Dong 171800f742c087d92e5452d29be1fb668022b5f8a6c7James Dong int32_t rotationDegrees; 171900f742c087d92e5452d29be1fb668022b5f8a6c7James Dong if (!mVideoTrack->getFormat()->findInt32( 172000f742c087d92e5452d29be1fb668022b5f8a6c7James Dong kKeyRotation, &rotationDegrees)) { 172100f742c087d92e5452d29be1fb668022b5f8a6c7James Dong rotationDegrees = 0; 172200f742c087d92e5452d29be1fb668022b5f8a6c7James Dong } 172300f742c087d92e5452d29be1fb668022b5f8a6c7James Dong 172400f742c087d92e5452d29be1fb668022b5f8a6c7James Dong if (rotationDegrees == 90 || rotationDegrees == 270) { 172500f742c087d92e5452d29be1fb668022b5f8a6c7James Dong notifyListener_l( 172600f742c087d92e5452d29be1fb668022b5f8a6c7James Dong MEDIA_SET_VIDEO_SIZE, usableHeight, usableWidth); 172700f742c087d92e5452d29be1fb668022b5f8a6c7James Dong } else { 172800f742c087d92e5452d29be1fb668022b5f8a6c7James Dong notifyListener_l( 172900f742c087d92e5452d29be1fb668022b5f8a6c7James Dong MEDIA_SET_VIDEO_SIZE, usableWidth, usableHeight); 173000f742c087d92e5452d29be1fb668022b5f8a6c7James Dong } 173100f742c087d92e5452d29be1fb668022b5f8a6c7James Dong} 173200f742c087d92e5452d29be1fb668022b5f8a6c7James Dong 173300f742c087d92e5452d29be1fb668022b5f8a6c7James Dongstatus_t PreviewPlayer::pause() { 173400f742c087d92e5452d29be1fb668022b5f8a6c7James Dong Mutex::Autolock autoLock(mLock); 173500f742c087d92e5452d29be1fb668022b5f8a6c7James Dong 173600f742c087d92e5452d29be1fb668022b5f8a6c7James Dong mFlags &= ~CACHE_UNDERRUN; 173700f742c087d92e5452d29be1fb668022b5f8a6c7James Dong 173800f742c087d92e5452d29be1fb668022b5f8a6c7James Dong return pause_l(); 173900f742c087d92e5452d29be1fb668022b5f8a6c7James Dong} 174000f742c087d92e5452d29be1fb668022b5f8a6c7James Dong 174100f742c087d92e5452d29be1fb668022b5f8a6c7James Dongstatus_t PreviewPlayer::pause_l(bool at_eos) { 174200f742c087d92e5452d29be1fb668022b5f8a6c7James Dong if (!(mFlags & PLAYING)) { 174300f742c087d92e5452d29be1fb668022b5f8a6c7James Dong return OK; 174400f742c087d92e5452d29be1fb668022b5f8a6c7James Dong } 174500f742c087d92e5452d29be1fb668022b5f8a6c7James Dong 174600f742c087d92e5452d29be1fb668022b5f8a6c7James Dong cancelPlayerEvents_l(); 174700f742c087d92e5452d29be1fb668022b5f8a6c7James Dong 174800f742c087d92e5452d29be1fb668022b5f8a6c7James Dong if (mAudioPlayer != NULL && (mFlags & AUDIO_RUNNING)) { 174900f742c087d92e5452d29be1fb668022b5f8a6c7James Dong if (at_eos) { 175000f742c087d92e5452d29be1fb668022b5f8a6c7James Dong // If we played the audio stream to completion we 175100f742c087d92e5452d29be1fb668022b5f8a6c7James Dong // want to make sure that all samples remaining in the audio 175200f742c087d92e5452d29be1fb668022b5f8a6c7James Dong // track's queue are played out. 175300f742c087d92e5452d29be1fb668022b5f8a6c7James Dong mAudioPlayer->pause(true /* playPendingSamples */); 175400f742c087d92e5452d29be1fb668022b5f8a6c7James Dong } else { 175500f742c087d92e5452d29be1fb668022b5f8a6c7James Dong mAudioPlayer->pause(); 175600f742c087d92e5452d29be1fb668022b5f8a6c7James Dong } 175700f742c087d92e5452d29be1fb668022b5f8a6c7James Dong 175800f742c087d92e5452d29be1fb668022b5f8a6c7James Dong mFlags &= ~AUDIO_RUNNING; 175900f742c087d92e5452d29be1fb668022b5f8a6c7James Dong } 176000f742c087d92e5452d29be1fb668022b5f8a6c7James Dong 176100f742c087d92e5452d29be1fb668022b5f8a6c7James Dong mFlags &= ~PLAYING; 176200f742c087d92e5452d29be1fb668022b5f8a6c7James Dong updateBatteryUsage_l(); 176300f742c087d92e5452d29be1fb668022b5f8a6c7James Dong 176400f742c087d92e5452d29be1fb668022b5f8a6c7James Dong return OK; 176500f742c087d92e5452d29be1fb668022b5f8a6c7James Dong} 176600f742c087d92e5452d29be1fb668022b5f8a6c7James Dong 176700f742c087d92e5452d29be1fb668022b5f8a6c7James Dongbool PreviewPlayer::isPlaying() const { 176800f742c087d92e5452d29be1fb668022b5f8a6c7James Dong return (mFlags & PLAYING) || (mFlags & CACHE_UNDERRUN); 176900f742c087d92e5452d29be1fb668022b5f8a6c7James Dong} 177000f742c087d92e5452d29be1fb668022b5f8a6c7James Dong 177100f742c087d92e5452d29be1fb668022b5f8a6c7James Dongvoid PreviewPlayer::setSurface(const sp<Surface> &surface) { 177200f742c087d92e5452d29be1fb668022b5f8a6c7James Dong Mutex::Autolock autoLock(mLock); 177300f742c087d92e5452d29be1fb668022b5f8a6c7James Dong 177400f742c087d92e5452d29be1fb668022b5f8a6c7James Dong mSurface = surface; 177500f742c087d92e5452d29be1fb668022b5f8a6c7James Dong setNativeWindow_l(surface); 177600f742c087d92e5452d29be1fb668022b5f8a6c7James Dong} 177700f742c087d92e5452d29be1fb668022b5f8a6c7James Dong 177800f742c087d92e5452d29be1fb668022b5f8a6c7James Dongvoid PreviewPlayer::setSurfaceTexture(const sp<ISurfaceTexture> &surfaceTexture) { 177900f742c087d92e5452d29be1fb668022b5f8a6c7James Dong Mutex::Autolock autoLock(mLock); 178000f742c087d92e5452d29be1fb668022b5f8a6c7James Dong 178100f742c087d92e5452d29be1fb668022b5f8a6c7James Dong mSurface.clear(); 178200f742c087d92e5452d29be1fb668022b5f8a6c7James Dong if (surfaceTexture != NULL) { 178300f742c087d92e5452d29be1fb668022b5f8a6c7James Dong setNativeWindow_l(new SurfaceTextureClient(surfaceTexture)); 178400f742c087d92e5452d29be1fb668022b5f8a6c7James Dong } 178500f742c087d92e5452d29be1fb668022b5f8a6c7James Dong} 178600f742c087d92e5452d29be1fb668022b5f8a6c7James Dong 178700f742c087d92e5452d29be1fb668022b5f8a6c7James Dongvoid PreviewPlayer::shutdownVideoDecoder_l() { 178800f742c087d92e5452d29be1fb668022b5f8a6c7James Dong if (mVideoBuffer) { 178900f742c087d92e5452d29be1fb668022b5f8a6c7James Dong mVideoBuffer->release(); 179000f742c087d92e5452d29be1fb668022b5f8a6c7James Dong mVideoBuffer = NULL; 179100f742c087d92e5452d29be1fb668022b5f8a6c7James Dong } 179200f742c087d92e5452d29be1fb668022b5f8a6c7James Dong 179300f742c087d92e5452d29be1fb668022b5f8a6c7James Dong mVideoSource->stop(); 179400f742c087d92e5452d29be1fb668022b5f8a6c7James Dong 179500f742c087d92e5452d29be1fb668022b5f8a6c7James Dong // The following hack is necessary to ensure that the OMX 179600f742c087d92e5452d29be1fb668022b5f8a6c7James Dong // component is completely released by the time we may try 179700f742c087d92e5452d29be1fb668022b5f8a6c7James Dong // to instantiate it again. 179800f742c087d92e5452d29be1fb668022b5f8a6c7James Dong wp<MediaSource> tmp = mVideoSource; 179900f742c087d92e5452d29be1fb668022b5f8a6c7James Dong mVideoSource.clear(); 180000f742c087d92e5452d29be1fb668022b5f8a6c7James Dong while (tmp.promote() != NULL) { 180100f742c087d92e5452d29be1fb668022b5f8a6c7James Dong usleep(1000); 180200f742c087d92e5452d29be1fb668022b5f8a6c7James Dong } 180300f742c087d92e5452d29be1fb668022b5f8a6c7James Dong IPCThreadState::self()->flushCommands(); 180400f742c087d92e5452d29be1fb668022b5f8a6c7James Dong} 180500f742c087d92e5452d29be1fb668022b5f8a6c7James Dong 180600f742c087d92e5452d29be1fb668022b5f8a6c7James Dongvoid PreviewPlayer::setNativeWindow_l(const sp<ANativeWindow> &native) { 180700f742c087d92e5452d29be1fb668022b5f8a6c7James Dong mNativeWindow = native; 180800f742c087d92e5452d29be1fb668022b5f8a6c7James Dong 180900f742c087d92e5452d29be1fb668022b5f8a6c7James Dong if (mVideoSource == NULL) { 181000f742c087d92e5452d29be1fb668022b5f8a6c7James Dong return; 181100f742c087d92e5452d29be1fb668022b5f8a6c7James Dong } 181200f742c087d92e5452d29be1fb668022b5f8a6c7James Dong 181300f742c087d92e5452d29be1fb668022b5f8a6c7James Dong ALOGI("attempting to reconfigure to use new surface"); 181400f742c087d92e5452d29be1fb668022b5f8a6c7James Dong 181500f742c087d92e5452d29be1fb668022b5f8a6c7James Dong bool wasPlaying = (mFlags & PLAYING) != 0; 181600f742c087d92e5452d29be1fb668022b5f8a6c7James Dong 181700f742c087d92e5452d29be1fb668022b5f8a6c7James Dong pause_l(); 181800f742c087d92e5452d29be1fb668022b5f8a6c7James Dong 181900f742c087d92e5452d29be1fb668022b5f8a6c7James Dong shutdownVideoDecoder_l(); 182000f742c087d92e5452d29be1fb668022b5f8a6c7James Dong 182100f742c087d92e5452d29be1fb668022b5f8a6c7James Dong CHECK_EQ(initVideoDecoder_l(), (status_t)OK); 182200f742c087d92e5452d29be1fb668022b5f8a6c7James Dong 182300f742c087d92e5452d29be1fb668022b5f8a6c7James Dong if (mLastVideoTimeUs >= 0) { 182400f742c087d92e5452d29be1fb668022b5f8a6c7James Dong mSeeking = SEEK; 182500f742c087d92e5452d29be1fb668022b5f8a6c7James Dong mSeekNotificationSent = true; 182600f742c087d92e5452d29be1fb668022b5f8a6c7James Dong mSeekTimeUs = mLastVideoTimeUs; 182700f742c087d92e5452d29be1fb668022b5f8a6c7James Dong mFlags &= ~(AT_EOS | AUDIO_AT_EOS | VIDEO_AT_EOS); 182800f742c087d92e5452d29be1fb668022b5f8a6c7James Dong } 182900f742c087d92e5452d29be1fb668022b5f8a6c7James Dong 183000f742c087d92e5452d29be1fb668022b5f8a6c7James Dong if (wasPlaying) { 183100f742c087d92e5452d29be1fb668022b5f8a6c7James Dong play_l(); 183200f742c087d92e5452d29be1fb668022b5f8a6c7James Dong } 183300f742c087d92e5452d29be1fb668022b5f8a6c7James Dong} 183400f742c087d92e5452d29be1fb668022b5f8a6c7James Dong 183500f742c087d92e5452d29be1fb668022b5f8a6c7James Dongvoid PreviewPlayer::setAudioSink( 183600f742c087d92e5452d29be1fb668022b5f8a6c7James Dong const sp<MediaPlayerBase::AudioSink> &audioSink) { 183700f742c087d92e5452d29be1fb668022b5f8a6c7James Dong Mutex::Autolock autoLock(mLock); 183800f742c087d92e5452d29be1fb668022b5f8a6c7James Dong 183900f742c087d92e5452d29be1fb668022b5f8a6c7James Dong mAudioSink = audioSink; 184000f742c087d92e5452d29be1fb668022b5f8a6c7James Dong} 184100f742c087d92e5452d29be1fb668022b5f8a6c7James Dong 184200f742c087d92e5452d29be1fb668022b5f8a6c7James Dongstatus_t PreviewPlayer::setLooping(bool shouldLoop) { 184300f742c087d92e5452d29be1fb668022b5f8a6c7James Dong Mutex::Autolock autoLock(mLock); 184400f742c087d92e5452d29be1fb668022b5f8a6c7James Dong 184500f742c087d92e5452d29be1fb668022b5f8a6c7James Dong mFlags = mFlags & ~LOOPING; 184600f742c087d92e5452d29be1fb668022b5f8a6c7James Dong 184700f742c087d92e5452d29be1fb668022b5f8a6c7James Dong if (shouldLoop) { 184800f742c087d92e5452d29be1fb668022b5f8a6c7James Dong mFlags |= LOOPING; 184900f742c087d92e5452d29be1fb668022b5f8a6c7James Dong } 185000f742c087d92e5452d29be1fb668022b5f8a6c7James Dong 185100f742c087d92e5452d29be1fb668022b5f8a6c7James Dong return OK; 185200f742c087d92e5452d29be1fb668022b5f8a6c7James Dong} 185300f742c087d92e5452d29be1fb668022b5f8a6c7James Dong 185400f742c087d92e5452d29be1fb668022b5f8a6c7James Dongvoid PreviewPlayer::setDuration_l(int64_t durationUs) { 185500f742c087d92e5452d29be1fb668022b5f8a6c7James Dong if (mDurationUs < 0 || durationUs > mDurationUs) { 185600f742c087d92e5452d29be1fb668022b5f8a6c7James Dong mDurationUs = durationUs; 185700f742c087d92e5452d29be1fb668022b5f8a6c7James Dong } 185800f742c087d92e5452d29be1fb668022b5f8a6c7James Dong} 185900f742c087d92e5452d29be1fb668022b5f8a6c7James Dong 186000f742c087d92e5452d29be1fb668022b5f8a6c7James Dongstatus_t PreviewPlayer::getDuration(int64_t *durationUs) { 186100f742c087d92e5452d29be1fb668022b5f8a6c7James Dong Mutex::Autolock autoLock(mLock); 186200f742c087d92e5452d29be1fb668022b5f8a6c7James Dong if (mDurationUs < 0) { 186300f742c087d92e5452d29be1fb668022b5f8a6c7James Dong return UNKNOWN_ERROR; 186400f742c087d92e5452d29be1fb668022b5f8a6c7James Dong } 186500f742c087d92e5452d29be1fb668022b5f8a6c7James Dong 186600f742c087d92e5452d29be1fb668022b5f8a6c7James Dong *durationUs = mDurationUs; 186700f742c087d92e5452d29be1fb668022b5f8a6c7James Dong return OK; 186800f742c087d92e5452d29be1fb668022b5f8a6c7James Dong} 186900f742c087d92e5452d29be1fb668022b5f8a6c7James Dong 187000f742c087d92e5452d29be1fb668022b5f8a6c7James Dongstatus_t PreviewPlayer::getPosition(int64_t *positionUs) { 187100f742c087d92e5452d29be1fb668022b5f8a6c7James Dong Mutex::Autolock autoLock(mLock); 187200f742c087d92e5452d29be1fb668022b5f8a6c7James Dong 187300f742c087d92e5452d29be1fb668022b5f8a6c7James Dong if (mSeeking != NO_SEEK) { 187400f742c087d92e5452d29be1fb668022b5f8a6c7James Dong *positionUs = mSeekTimeUs; 187500f742c087d92e5452d29be1fb668022b5f8a6c7James Dong } else if (mVideoSource != NULL 187600f742c087d92e5452d29be1fb668022b5f8a6c7James Dong && (mAudioPlayer == NULL || !(mFlags & VIDEO_AT_EOS))) { 187700f742c087d92e5452d29be1fb668022b5f8a6c7James Dong *positionUs = mVideoTimeUs; 187800f742c087d92e5452d29be1fb668022b5f8a6c7James Dong } else if (mAudioPlayer != NULL) { 187900f742c087d92e5452d29be1fb668022b5f8a6c7James Dong *positionUs = mAudioPlayer->getMediaTimeUs(); 188000f742c087d92e5452d29be1fb668022b5f8a6c7James Dong } else { 188100f742c087d92e5452d29be1fb668022b5f8a6c7James Dong *positionUs = 0; 188200f742c087d92e5452d29be1fb668022b5f8a6c7James Dong } 188300f742c087d92e5452d29be1fb668022b5f8a6c7James Dong 188400f742c087d92e5452d29be1fb668022b5f8a6c7James Dong return OK; 188500f742c087d92e5452d29be1fb668022b5f8a6c7James Dong} 188600f742c087d92e5452d29be1fb668022b5f8a6c7James Dong 188700f742c087d92e5452d29be1fb668022b5f8a6c7James Dongvoid PreviewPlayer::setPosition_l(int64_t timeUs) { 188800f742c087d92e5452d29be1fb668022b5f8a6c7James Dong mVideoTimeUs = timeUs; 188900f742c087d92e5452d29be1fb668022b5f8a6c7James Dong} 189000f742c087d92e5452d29be1fb668022b5f8a6c7James Dong 189100f742c087d92e5452d29be1fb668022b5f8a6c7James Dongstatus_t PreviewPlayer::seekTo_l(int64_t timeUs) { 189200f742c087d92e5452d29be1fb668022b5f8a6c7James Dong ALOGV("seekTo_l"); 189300f742c087d92e5452d29be1fb668022b5f8a6c7James Dong if (mFlags & CACHE_UNDERRUN) { 189400f742c087d92e5452d29be1fb668022b5f8a6c7James Dong mFlags &= ~CACHE_UNDERRUN; 189500f742c087d92e5452d29be1fb668022b5f8a6c7James Dong play_l(); 189600f742c087d92e5452d29be1fb668022b5f8a6c7James Dong } 189700f742c087d92e5452d29be1fb668022b5f8a6c7James Dong 189800f742c087d92e5452d29be1fb668022b5f8a6c7James Dong if ((mFlags & PLAYING) && mVideoSource != NULL && (mFlags & VIDEO_AT_EOS)) { 189900f742c087d92e5452d29be1fb668022b5f8a6c7James Dong // Video playback completed before, there's no pending 190000f742c087d92e5452d29be1fb668022b5f8a6c7James Dong // video event right now. In order for this new seek 190100f742c087d92e5452d29be1fb668022b5f8a6c7James Dong // to be honored, we need to post one. 190200f742c087d92e5452d29be1fb668022b5f8a6c7James Dong 190300f742c087d92e5452d29be1fb668022b5f8a6c7James Dong postVideoEvent_l(); 190400f742c087d92e5452d29be1fb668022b5f8a6c7James Dong } 190500f742c087d92e5452d29be1fb668022b5f8a6c7James Dong 190600f742c087d92e5452d29be1fb668022b5f8a6c7James Dong mSeeking = SEEK; 190700f742c087d92e5452d29be1fb668022b5f8a6c7James Dong mSeekNotificationSent = false; 190800f742c087d92e5452d29be1fb668022b5f8a6c7James Dong mSeekTimeUs = timeUs; 190900f742c087d92e5452d29be1fb668022b5f8a6c7James Dong mFlags &= ~(AT_EOS | AUDIO_AT_EOS | VIDEO_AT_EOS); 191000f742c087d92e5452d29be1fb668022b5f8a6c7James Dong 191100f742c087d92e5452d29be1fb668022b5f8a6c7James Dong seekAudioIfNecessary_l(); 191200f742c087d92e5452d29be1fb668022b5f8a6c7James Dong 191300f742c087d92e5452d29be1fb668022b5f8a6c7James Dong if (!(mFlags & PLAYING)) { 191400f742c087d92e5452d29be1fb668022b5f8a6c7James Dong ALOGV("seeking while paused, sending SEEK_COMPLETE notification" 191500f742c087d92e5452d29be1fb668022b5f8a6c7James Dong " immediately."); 191600f742c087d92e5452d29be1fb668022b5f8a6c7James Dong 191700f742c087d92e5452d29be1fb668022b5f8a6c7James Dong notifyListener_l(MEDIA_SEEK_COMPLETE); 191800f742c087d92e5452d29be1fb668022b5f8a6c7James Dong mSeekNotificationSent = true; 191900f742c087d92e5452d29be1fb668022b5f8a6c7James Dong 192000f742c087d92e5452d29be1fb668022b5f8a6c7James Dong if ((mFlags & PREPARED) && mVideoSource != NULL) { 192100f742c087d92e5452d29be1fb668022b5f8a6c7James Dong mFlags |= SEEK_PREVIEW; 192200f742c087d92e5452d29be1fb668022b5f8a6c7James Dong postVideoEvent_l(); 192300f742c087d92e5452d29be1fb668022b5f8a6c7James Dong } 192400f742c087d92e5452d29be1fb668022b5f8a6c7James Dong } 192500f742c087d92e5452d29be1fb668022b5f8a6c7James Dong 192600f742c087d92e5452d29be1fb668022b5f8a6c7James Dong return OK; 192700f742c087d92e5452d29be1fb668022b5f8a6c7James Dong} 192800f742c087d92e5452d29be1fb668022b5f8a6c7James Dong 192900f742c087d92e5452d29be1fb668022b5f8a6c7James Dongvoid PreviewPlayer::seekAudioIfNecessary_l() { 193000f742c087d92e5452d29be1fb668022b5f8a6c7James Dong if (mSeeking != NO_SEEK && mVideoSource == NULL && mAudioPlayer != NULL) { 193100f742c087d92e5452d29be1fb668022b5f8a6c7James Dong mAudioPlayer->seekTo(mSeekTimeUs); 193200f742c087d92e5452d29be1fb668022b5f8a6c7James Dong 193300f742c087d92e5452d29be1fb668022b5f8a6c7James Dong mWatchForAudioSeekComplete = true; 193400f742c087d92e5452d29be1fb668022b5f8a6c7James Dong mWatchForAudioEOS = true; 193500f742c087d92e5452d29be1fb668022b5f8a6c7James Dong } 193600f742c087d92e5452d29be1fb668022b5f8a6c7James Dong} 193700f742c087d92e5452d29be1fb668022b5f8a6c7James Dong 193800f742c087d92e5452d29be1fb668022b5f8a6c7James Dongvoid PreviewPlayer::setAudioSource(const sp<MediaSource>& source) { 193900f742c087d92e5452d29be1fb668022b5f8a6c7James Dong CHECK(source != NULL); 194000f742c087d92e5452d29be1fb668022b5f8a6c7James Dong mAudioTrack = source; 194100f742c087d92e5452d29be1fb668022b5f8a6c7James Dong} 194200f742c087d92e5452d29be1fb668022b5f8a6c7James Dong 194300f742c087d92e5452d29be1fb668022b5f8a6c7James Dongvoid PreviewPlayer::setVideoSource(const sp<MediaSource>& source) { 194400f742c087d92e5452d29be1fb668022b5f8a6c7James Dong CHECK(source != NULL); 194500f742c087d92e5452d29be1fb668022b5f8a6c7James Dong mVideoTrack = source; 194600f742c087d92e5452d29be1fb668022b5f8a6c7James Dong} 194700f742c087d92e5452d29be1fb668022b5f8a6c7James Dong 194800f742c087d92e5452d29be1fb668022b5f8a6c7James Dongvoid PreviewPlayer::finishSeekIfNecessary(int64_t videoTimeUs) { 194900f742c087d92e5452d29be1fb668022b5f8a6c7James Dong if (mSeeking == SEEK_VIDEO_ONLY) { 195000f742c087d92e5452d29be1fb668022b5f8a6c7James Dong mSeeking = NO_SEEK; 195100f742c087d92e5452d29be1fb668022b5f8a6c7James Dong return; 195200f742c087d92e5452d29be1fb668022b5f8a6c7James Dong } 195300f742c087d92e5452d29be1fb668022b5f8a6c7James Dong 195400f742c087d92e5452d29be1fb668022b5f8a6c7James Dong if (mSeeking == NO_SEEK || (mFlags & SEEK_PREVIEW)) { 195500f742c087d92e5452d29be1fb668022b5f8a6c7James Dong return; 195600f742c087d92e5452d29be1fb668022b5f8a6c7James Dong } 195700f742c087d92e5452d29be1fb668022b5f8a6c7James Dong 195800f742c087d92e5452d29be1fb668022b5f8a6c7James Dong if (mAudioPlayer != NULL) { 195900f742c087d92e5452d29be1fb668022b5f8a6c7James Dong ALOGV("seeking audio to %lld us (%.2f secs).", videoTimeUs, videoTimeUs / 1E6); 196000f742c087d92e5452d29be1fb668022b5f8a6c7James Dong 196100f742c087d92e5452d29be1fb668022b5f8a6c7James Dong // If we don't have a video time, seek audio to the originally 196200f742c087d92e5452d29be1fb668022b5f8a6c7James Dong // requested seek time instead. 196300f742c087d92e5452d29be1fb668022b5f8a6c7James Dong 196400f742c087d92e5452d29be1fb668022b5f8a6c7James Dong mAudioPlayer->seekTo(videoTimeUs < 0 ? mSeekTimeUs : videoTimeUs); 196500f742c087d92e5452d29be1fb668022b5f8a6c7James Dong mWatchForAudioSeekComplete = true; 196600f742c087d92e5452d29be1fb668022b5f8a6c7James Dong mWatchForAudioEOS = true; 196700f742c087d92e5452d29be1fb668022b5f8a6c7James Dong } else if (!mSeekNotificationSent) { 196800f742c087d92e5452d29be1fb668022b5f8a6c7James Dong // If we're playing video only, report seek complete now, 196900f742c087d92e5452d29be1fb668022b5f8a6c7James Dong // otherwise audio player will notify us later. 197000f742c087d92e5452d29be1fb668022b5f8a6c7James Dong notifyListener_l(MEDIA_SEEK_COMPLETE); 197100f742c087d92e5452d29be1fb668022b5f8a6c7James Dong mSeekNotificationSent = true; 197200f742c087d92e5452d29be1fb668022b5f8a6c7James Dong } 197300f742c087d92e5452d29be1fb668022b5f8a6c7James Dong 197400f742c087d92e5452d29be1fb668022b5f8a6c7James Dong mFlags |= FIRST_FRAME; 197500f742c087d92e5452d29be1fb668022b5f8a6c7James Dong mSeeking = NO_SEEK; 197600f742c087d92e5452d29be1fb668022b5f8a6c7James Dong} 197700f742c087d92e5452d29be1fb668022b5f8a6c7James Dong 197800f742c087d92e5452d29be1fb668022b5f8a6c7James Dongvoid PreviewPlayer::onCheckAudioStatus() { 197900f742c087d92e5452d29be1fb668022b5f8a6c7James Dong Mutex::Autolock autoLock(mLock); 198000f742c087d92e5452d29be1fb668022b5f8a6c7James Dong if (!mAudioStatusEventPending) { 198100f742c087d92e5452d29be1fb668022b5f8a6c7James Dong // Event was dispatched and while we were blocking on the mutex, 198200f742c087d92e5452d29be1fb668022b5f8a6c7James Dong // has already been cancelled. 198300f742c087d92e5452d29be1fb668022b5f8a6c7James Dong return; 198400f742c087d92e5452d29be1fb668022b5f8a6c7James Dong } 198500f742c087d92e5452d29be1fb668022b5f8a6c7James Dong 198600f742c087d92e5452d29be1fb668022b5f8a6c7James Dong mAudioStatusEventPending = false; 198700f742c087d92e5452d29be1fb668022b5f8a6c7James Dong 198800f742c087d92e5452d29be1fb668022b5f8a6c7James Dong if (mWatchForAudioSeekComplete && !mAudioPlayer->isSeeking()) { 198900f742c087d92e5452d29be1fb668022b5f8a6c7James Dong mWatchForAudioSeekComplete = false; 199000f742c087d92e5452d29be1fb668022b5f8a6c7James Dong 199100f742c087d92e5452d29be1fb668022b5f8a6c7James Dong if (!mSeekNotificationSent) { 199200f742c087d92e5452d29be1fb668022b5f8a6c7James Dong notifyListener_l(MEDIA_SEEK_COMPLETE); 199300f742c087d92e5452d29be1fb668022b5f8a6c7James Dong mSeekNotificationSent = true; 199400f742c087d92e5452d29be1fb668022b5f8a6c7James Dong } 199500f742c087d92e5452d29be1fb668022b5f8a6c7James Dong 199600f742c087d92e5452d29be1fb668022b5f8a6c7James Dong mSeeking = NO_SEEK; 199700f742c087d92e5452d29be1fb668022b5f8a6c7James Dong } 199800f742c087d92e5452d29be1fb668022b5f8a6c7James Dong 199900f742c087d92e5452d29be1fb668022b5f8a6c7James Dong status_t finalStatus; 200000f742c087d92e5452d29be1fb668022b5f8a6c7James Dong if (mWatchForAudioEOS && mAudioPlayer->reachedEOS(&finalStatus)) { 200100f742c087d92e5452d29be1fb668022b5f8a6c7James Dong mWatchForAudioEOS = false; 200200f742c087d92e5452d29be1fb668022b5f8a6c7James Dong mFlags |= AUDIO_AT_EOS; 200300f742c087d92e5452d29be1fb668022b5f8a6c7James Dong mFlags |= FIRST_FRAME; 200400f742c087d92e5452d29be1fb668022b5f8a6c7James Dong postStreamDoneEvent_l(finalStatus); 200500f742c087d92e5452d29be1fb668022b5f8a6c7James Dong } 200600f742c087d92e5452d29be1fb668022b5f8a6c7James Dong} 200700f742c087d92e5452d29be1fb668022b5f8a6c7James Dong 200800f742c087d92e5452d29be1fb668022b5f8a6c7James Dongvoid PreviewPlayer::postVideoEvent_l(int64_t delayUs) { 200900f742c087d92e5452d29be1fb668022b5f8a6c7James Dong if (mVideoEventPending) { 201000f742c087d92e5452d29be1fb668022b5f8a6c7James Dong return; 201100f742c087d92e5452d29be1fb668022b5f8a6c7James Dong } 201200f742c087d92e5452d29be1fb668022b5f8a6c7James Dong 201300f742c087d92e5452d29be1fb668022b5f8a6c7James Dong mVideoEventPending = true; 201400f742c087d92e5452d29be1fb668022b5f8a6c7James Dong mQueue.postEventWithDelay(mVideoEvent, delayUs < 0 ? 10000 : delayUs); 201500f742c087d92e5452d29be1fb668022b5f8a6c7James Dong} 201600f742c087d92e5452d29be1fb668022b5f8a6c7James Dong 201700f742c087d92e5452d29be1fb668022b5f8a6c7James Dongvoid PreviewPlayer::postStreamDoneEvent_l(status_t status) { 201800f742c087d92e5452d29be1fb668022b5f8a6c7James Dong if (mStreamDoneEventPending) { 201900f742c087d92e5452d29be1fb668022b5f8a6c7James Dong return; 202000f742c087d92e5452d29be1fb668022b5f8a6c7James Dong } 202100f742c087d92e5452d29be1fb668022b5f8a6c7James Dong mStreamDoneEventPending = true; 202200f742c087d92e5452d29be1fb668022b5f8a6c7James Dong 202300f742c087d92e5452d29be1fb668022b5f8a6c7James Dong mStreamDoneStatus = status; 202400f742c087d92e5452d29be1fb668022b5f8a6c7James Dong mQueue.postEvent(mStreamDoneEvent); 202500f742c087d92e5452d29be1fb668022b5f8a6c7James Dong} 202600f742c087d92e5452d29be1fb668022b5f8a6c7James Dong 202700f742c087d92e5452d29be1fb668022b5f8a6c7James Dongvoid PreviewPlayer::postVideoLagEvent_l() { 202800f742c087d92e5452d29be1fb668022b5f8a6c7James Dong if (mVideoLagEventPending) { 202900f742c087d92e5452d29be1fb668022b5f8a6c7James Dong return; 203000f742c087d92e5452d29be1fb668022b5f8a6c7James Dong } 203100f742c087d92e5452d29be1fb668022b5f8a6c7James Dong mVideoLagEventPending = true; 203200f742c087d92e5452d29be1fb668022b5f8a6c7James Dong mQueue.postEventWithDelay(mVideoLagEvent, 1000000ll); 203300f742c087d92e5452d29be1fb668022b5f8a6c7James Dong} 203400f742c087d92e5452d29be1fb668022b5f8a6c7James Dong 203500f742c087d92e5452d29be1fb668022b5f8a6c7James Dongvoid PreviewPlayer::postCheckAudioStatusEvent_l(int64_t delayUs) { 203600f742c087d92e5452d29be1fb668022b5f8a6c7James Dong if (mAudioStatusEventPending) { 203700f742c087d92e5452d29be1fb668022b5f8a6c7James Dong return; 203800f742c087d92e5452d29be1fb668022b5f8a6c7James Dong } 203900f742c087d92e5452d29be1fb668022b5f8a6c7James Dong mAudioStatusEventPending = true; 204000f742c087d92e5452d29be1fb668022b5f8a6c7James Dong mQueue.postEventWithDelay(mCheckAudioStatusEvent, delayUs); 204100f742c087d92e5452d29be1fb668022b5f8a6c7James Dong} 204200f742c087d92e5452d29be1fb668022b5f8a6c7James Dong 204300f742c087d92e5452d29be1fb668022b5f8a6c7James Dongvoid PreviewPlayer::abortPrepare(status_t err) { 204400f742c087d92e5452d29be1fb668022b5f8a6c7James Dong CHECK(err != OK); 204500f742c087d92e5452d29be1fb668022b5f8a6c7James Dong 204600f742c087d92e5452d29be1fb668022b5f8a6c7James Dong if (mIsAsyncPrepare) { 204700f742c087d92e5452d29be1fb668022b5f8a6c7James Dong notifyListener_l(MEDIA_ERROR, MEDIA_ERROR_UNKNOWN, err); 204800f742c087d92e5452d29be1fb668022b5f8a6c7James Dong } 204900f742c087d92e5452d29be1fb668022b5f8a6c7James Dong 205000f742c087d92e5452d29be1fb668022b5f8a6c7James Dong mPrepareResult = err; 205100f742c087d92e5452d29be1fb668022b5f8a6c7James Dong mFlags &= ~(PREPARING|PREPARE_CANCELLED|PREPARING_CONNECTED); 205200f742c087d92e5452d29be1fb668022b5f8a6c7James Dong mAsyncPrepareEvent = NULL; 205300f742c087d92e5452d29be1fb668022b5f8a6c7James Dong mPreparedCondition.broadcast(); 205400f742c087d92e5452d29be1fb668022b5f8a6c7James Dong} 205500f742c087d92e5452d29be1fb668022b5f8a6c7James Dong 205600f742c087d92e5452d29be1fb668022b5f8a6c7James Donguint32_t PreviewPlayer::getSourceSeekFlags() const { 205700f742c087d92e5452d29be1fb668022b5f8a6c7James Dong Mutex::Autolock lock(mLock); 205800f742c087d92e5452d29be1fb668022b5f8a6c7James Dong return mExtractorFlags; 205900f742c087d92e5452d29be1fb668022b5f8a6c7James Dong} 206000f742c087d92e5452d29be1fb668022b5f8a6c7James Dong 206100f742c087d92e5452d29be1fb668022b5f8a6c7James Dongvoid PreviewPlayer::postAudioEOS(int64_t delayUs) { 206200f742c087d92e5452d29be1fb668022b5f8a6c7James Dong Mutex::Autolock autoLock(mLock); 206300f742c087d92e5452d29be1fb668022b5f8a6c7James Dong postCheckAudioStatusEvent_l(delayUs); 206400f742c087d92e5452d29be1fb668022b5f8a6c7James Dong} 206500f742c087d92e5452d29be1fb668022b5f8a6c7James Dong 206600f742c087d92e5452d29be1fb668022b5f8a6c7James Dongvoid PreviewPlayer::postAudioSeekComplete() { 206700f742c087d92e5452d29be1fb668022b5f8a6c7James Dong Mutex::Autolock autoLock(mLock); 206800f742c087d92e5452d29be1fb668022b5f8a6c7James Dong postCheckAudioStatusEvent_l(0 /* delayUs */); 206900f742c087d92e5452d29be1fb668022b5f8a6c7James Dong} 207000f742c087d92e5452d29be1fb668022b5f8a6c7James Dong 207100f742c087d92e5452d29be1fb668022b5f8a6c7James Dongvoid PreviewPlayer::updateBatteryUsage_l() { 207200f742c087d92e5452d29be1fb668022b5f8a6c7James Dong uint32_t params = IMediaPlayerService::kBatteryDataTrackDecoder; 207300f742c087d92e5452d29be1fb668022b5f8a6c7James Dong if ((mAudioSource != NULL) && (mAudioSource != mAudioTrack)) { 207400f742c087d92e5452d29be1fb668022b5f8a6c7James Dong params |= IMediaPlayerService::kBatteryDataTrackAudio; 207500f742c087d92e5452d29be1fb668022b5f8a6c7James Dong } 207600f742c087d92e5452d29be1fb668022b5f8a6c7James Dong if (mVideoSource != NULL) { 207700f742c087d92e5452d29be1fb668022b5f8a6c7James Dong params |= IMediaPlayerService::kBatteryDataTrackVideo; 207800f742c087d92e5452d29be1fb668022b5f8a6c7James Dong } 207900f742c087d92e5452d29be1fb668022b5f8a6c7James Dong addBatteryData(params); 208000f742c087d92e5452d29be1fb668022b5f8a6c7James Dong} 208100f742c087d92e5452d29be1fb668022b5f8a6c7James Dong 2082643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi} // namespace android 2083