PreviewPlayer.cpp revision e018023b4844fef7880bf5e45f706afcb10c33b6
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 18643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi#define LOG_NDEBUG 1 19643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi#define LOG_TAG "PreviewPlayer" 20643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi#include <utils/Log.h> 21643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi 22643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi#include <dlfcn.h> 23643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi 24643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi#include "include/ARTSPController.h" 25643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi#include "PreviewPlayer.h" 26643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi#include "DummyAudioSource.h" 27643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi#include "DummyVideoSource.h" 28643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi#include "VideoEditorSRC.h" 29643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi#include "include/NuCachedSource2.h" 30643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi#include "include/ThrottledSource.h" 31643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi 32643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi 33643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi#include <binder/IPCThreadState.h> 34643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi#include <media/stagefright/DataSource.h> 35643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi#include <media/stagefright/FileSource.h> 36643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi#include <media/stagefright/MediaBuffer.h> 37643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi#include <media/stagefright/MediaDefs.h> 38643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi#include <media/stagefright/MediaExtractor.h> 39643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi#include <media/stagefright/MediaDebug.h> 40643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi#include <media/stagefright/MediaSource.h> 41643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi#include <media/stagefright/MetaData.h> 42643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi#include <media/stagefright/OMXCodec.h> 43643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi 44643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi#include <surfaceflinger/Surface.h> 45643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi#include <media/stagefright/foundation/ALooper.h> 46643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi 47643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundarginamespace android { 48643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi 49643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi 50643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargistruct PreviewPlayerEvent : public TimedEventQueue::Event { 51643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi PreviewPlayerEvent( 52643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi PreviewPlayer *player, 53643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi void (PreviewPlayer::*method)()) 54643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi : mPlayer(player), 55643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi mMethod(method) { 56643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi } 57643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi 58643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargiprotected: 59643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi virtual ~PreviewPlayerEvent() {} 60643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi 61643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi virtual void fire(TimedEventQueue *queue, int64_t /* now_us */) { 62643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi (mPlayer->*mMethod)(); 63643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi } 64643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi 65643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargiprivate: 66643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi PreviewPlayer *mPlayer; 67643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi void (PreviewPlayer::*mMethod)(); 68643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi 69643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi PreviewPlayerEvent(const PreviewPlayerEvent &); 70643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi PreviewPlayerEvent &operator=(const PreviewPlayerEvent &); 71643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi}; 72643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi 7343fcc396614a587851e2b7c4cea2876ec58b8648Chih-Chung ChangPreviewPlayer::PreviewPlayer(NativeWindowRenderer* renderer) 74c9dedc4e1d0c8343ab1029cb601253826cd67c81James Dong : PreviewPlayerBase(), 7543fcc396614a587851e2b7c4cea2876ec58b8648Chih-Chung Chang mNativeWindowRenderer(renderer), 7643fcc396614a587851e2b7c4cea2876ec58b8648Chih-Chung Chang mCurrFramingEffectIndex(0), 77408e25b2508d97f7ae0b39acf46ab42b7c223c44Basavapatna Dattaguru mFrameRGBBuffer(NULL), 7843fcc396614a587851e2b7c4cea2876ec58b8648Chih-Chung Chang mFrameYUVBuffer(NULL) { 79643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi 80643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi mVideoRenderer = NULL; 81643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi mEffectsSettings = NULL; 825bc7fb407ce1bab13d4a4a67d34a1a3192ee3186Dheeraj Sharma mVeAudioPlayer = NULL; 83643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi mAudioMixStoryBoardTS = 0; 84643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi mCurrentMediaBeginCutTime = 0; 85643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi mCurrentMediaVolumeValue = 0; 86643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi mNumberEffects = 0; 87643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi mDecodedVideoTs = 0; 88643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi mDecVideoTsStoryBoard = 0; 89643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi mCurrentVideoEffect = VIDEO_EFFECT_NONE; 90643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi mProgressCbInterval = 0; 91643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi mNumberDecVideoFrames = 0; 92e6c0750cd2927967f93a8811954f889d23fadb6eDharmaray Kundargi mOverlayUpdateEventPosted = false; 931c97d9ab52a288d24ea54499de435277cc1a3d68Rajneesh Chowdury mIsChangeSourceRequired = true; 94643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi 95643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi mVideoEvent = new PreviewPlayerEvent(this, &PreviewPlayer::onVideoEvent); 96643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi mVideoEventPending = false; 97643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi mStreamDoneEvent = new PreviewPlayerEvent(this, 981c97d9ab52a288d24ea54499de435277cc1a3d68Rajneesh Chowdury &PreviewPlayer::onStreamDone); 99643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi 100643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi mStreamDoneEventPending = false; 101643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi 102643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi mCheckAudioStatusEvent = new PreviewPlayerEvent( 103c9dedc4e1d0c8343ab1029cb601253826cd67c81James Dong this, &PreviewPlayerBase::onCheckAudioStatus); 104643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi 105643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi mAudioStatusEventPending = false; 106643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi 107643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi mProgressCbEvent = new PreviewPlayerEvent(this, 108e6c0750cd2927967f93a8811954f889d23fadb6eDharmaray Kundargi &PreviewPlayer::onProgressCbEvent); 109643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi 110e6c0750cd2927967f93a8811954f889d23fadb6eDharmaray Kundargi mOverlayUpdateEvent = new PreviewPlayerEvent(this, 111e6c0750cd2927967f93a8811954f889d23fadb6eDharmaray Kundargi &PreviewPlayer::onUpdateOverlayEvent); 112643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi mProgressCbEventPending = false; 113e6c0750cd2927967f93a8811954f889d23fadb6eDharmaray Kundargi 114e6c0750cd2927967f93a8811954f889d23fadb6eDharmaray Kundargi mOverlayUpdateEventPending = false; 115643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi mRenderingMode = (M4xVSS_MediaRendering)MEDIA_RENDERING_INVALID; 116643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi mIsFiftiesEffectStarted = false; 117643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi reset(); 118643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi} 119643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi 120643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray KundargiPreviewPlayer::~PreviewPlayer() { 121643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi 122643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi if (mQueueStarted) { 123643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi mQueue.stop(); 124643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi } 125643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi 126643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi reset(); 127643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi 12843fcc396614a587851e2b7c4cea2876ec58b8648Chih-Chung Chang if (mVideoRenderer) { 12943fcc396614a587851e2b7c4cea2876ec58b8648Chih-Chung Chang mNativeWindowRenderer->destroyRenderInput(mVideoRenderer); 130643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi } 131643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi} 132643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi 133643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargivoid PreviewPlayer::cancelPlayerEvents(bool keepBufferingGoing) { 134643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi mQueue.cancelEvent(mVideoEvent->eventID()); 135643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi mVideoEventPending = false; 136643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi mQueue.cancelEvent(mStreamDoneEvent->eventID()); 137643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi mStreamDoneEventPending = false; 138643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi mQueue.cancelEvent(mCheckAudioStatusEvent->eventID()); 139643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi mAudioStatusEventPending = false; 140643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi 141643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi mQueue.cancelEvent(mProgressCbEvent->eventID()); 142643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi mProgressCbEventPending = false; 143643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi} 144643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi 145643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargistatus_t PreviewPlayer::setDataSource( 146643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi const char *uri, const KeyedVector<String8, String8> *headers) { 147643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi Mutex::Autolock autoLock(mLock); 148643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi return setDataSource_l(uri, headers); 149643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi} 150643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi 151643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargistatus_t PreviewPlayer::setDataSource_l( 152643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi const char *uri, const KeyedVector<String8, String8> *headers) { 153643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi reset_l(); 154643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi 155643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi mUri = uri; 156643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi 157643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi if (headers) { 158643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi mUriHeaders = *headers; 159643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi } 160643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi 161643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi // The actual work will be done during preparation in the call to 162643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi // ::finishSetDataSource_l to avoid blocking the calling thread in 163643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi // setDataSource for any significant time. 164643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi return OK; 165643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi} 166643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi 167643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargistatus_t PreviewPlayer::setDataSource_l(const sp<MediaExtractor> &extractor) { 168643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi bool haveAudio = false; 169643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi bool haveVideo = false; 170643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi for (size_t i = 0; i < extractor->countTracks(); ++i) { 171643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi sp<MetaData> meta = extractor->getTrackMetaData(i); 172643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi 173643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi const char *mime; 174643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi CHECK(meta->findCString(kKeyMIMEType, &mime)); 175643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi 176643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi if (!haveVideo && !strncasecmp(mime, "video/", 6)) { 177643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi setVideoSource(extractor->getTrack(i)); 178643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi haveVideo = true; 179643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi } else if (!haveAudio && !strncasecmp(mime, "audio/", 6)) { 180643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi setAudioSource(extractor->getTrack(i)); 181643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi haveAudio = true; 182643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi 183643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi if (!strcasecmp(mime, MEDIA_MIMETYPE_AUDIO_VORBIS)) { 184643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi // Only do this for vorbis audio, none of the other audio 185643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi // formats even support this ringtone specific hack and 186643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi // retrieving the metadata on some extractors may turn out 187643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi // to be very expensive. 188643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi sp<MetaData> fileMeta = extractor->getMetaData(); 189643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi int32_t loop; 190643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi if (fileMeta != NULL 191643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi && fileMeta->findInt32(kKeyAutoLoop, &loop) 192643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi && loop != 0) { 193643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi mFlags |= AUTO_LOOPING; 194643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi } 195643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi } 196643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi } 197643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi 198643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi if (haveAudio && haveVideo) { 199643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi break; 200643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi } 201643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi } 202643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi 203643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi /* Add the support for Dummy audio*/ 204643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi if( !haveAudio ){ 205643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi LOGV("PreviewPlayer: setDataSource_l Dummyaudiocreation started"); 206643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi 207643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi mAudioTrack = DummyAudioSource::Create(32000, 2, 20000, 208ebf40154a222c864a0aaf807702fc4eb6b9cf40fRaghavender Palla ((mPlayEndTimeMsec)*1000LL)); 209643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi LOGV("PreviewPlayer: setDataSource_l Dummyauiosource created"); 210643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi if(mAudioTrack != NULL) { 211643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi haveAudio = true; 212643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi } 213643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi } 214643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi 215643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi if (!haveAudio && !haveVideo) { 216643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi return UNKNOWN_ERROR; 217643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi } 218643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi 219643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi mExtractorFlags = extractor->flags(); 220643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi return OK; 221643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi} 222643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi 223643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargistatus_t PreviewPlayer::setDataSource_l_jpg() { 224643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi M4OSA_ERR err = M4NO_ERROR; 225643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi LOGV("PreviewPlayer: setDataSource_l_jpg started"); 226643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi 227643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi mAudioSource = DummyAudioSource::Create(32000, 2, 20000, 228ebf40154a222c864a0aaf807702fc4eb6b9cf40fRaghavender Palla ((mPlayEndTimeMsec)*1000LL)); 229643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi LOGV("PreviewPlayer: setDataSource_l_jpg Dummyaudiosource created"); 230643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi if(mAudioSource != NULL) { 231643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi setAudioSource(mAudioSource); 232643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi } 233643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi status_t error = mAudioSource->start(); 234643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi if (error != OK) { 235643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi LOGV("Error starting dummy audio source"); 236643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi mAudioSource.clear(); 237643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi return err; 238643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi } 239643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi 240ebf40154a222c864a0aaf807702fc4eb6b9cf40fRaghavender Palla mDurationUs = (mPlayEndTimeMsec - mPlayBeginTimeMsec)*1000LL; 241643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi 242643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi mVideoSource = DummyVideoSource::Create(mVideoWidth, mVideoHeight, 243643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi mDurationUs, mUri); 24435cb2de64cb6482a08f446e80733e7d344a0dcacDharmaray Kundargi 24543fcc396614a587851e2b7c4cea2876ec58b8648Chih-Chung Chang updateSizeToRender(mVideoSource->getFormat()); 246643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi setVideoSource(mVideoSource); 247643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi status_t err1 = mVideoSource->start(); 248643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi if (err1 != OK) { 249643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi mVideoSource.clear(); 250643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi return err; 251643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi } 252643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi 253643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi mIsVideoSourceJpg = true; 254643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi return OK; 255643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi} 256643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi 257643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargivoid PreviewPlayer::reset() { 258643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi Mutex::Autolock autoLock(mLock); 259643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi reset_l(); 260643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi} 261643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi 262643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargivoid PreviewPlayer::reset_l() { 263643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi 264643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi if (mFlags & PREPARING) { 265643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi mFlags |= PREPARE_CANCELLED; 266643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi } 267643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi 268643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi while (mFlags & PREPARING) { 269643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi mPreparedCondition.wait(mLock); 270643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi } 271643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi 272643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi cancelPlayerEvents(); 273643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi mAudioTrack.clear(); 274643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi mVideoTrack.clear(); 275643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi 276643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi // Shutdown audio first, so that the respone to the reset request 277643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi // appears to happen instantaneously as far as the user is concerned 278643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi // If we did this later, audio would continue playing while we 279643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi // shutdown the video-related resources and the player appear to 280643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi // not be as responsive to a reset request. 281643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi if (mAudioPlayer == NULL && mAudioSource != NULL) { 282643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi // If we had an audio player, it would have effectively 283643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi // taken possession of the audio source and stopped it when 284643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi // _it_ is stopped. Otherwise this is still our responsibility. 285643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi mAudioSource->stop(); 286643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi } 287643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi mAudioSource.clear(); 288643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi 289643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi mTimeSource = NULL; 290643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi 2911c97d9ab52a288d24ea54499de435277cc1a3d68Rajneesh Chowdury //Single audio player instance used 2921c97d9ab52a288d24ea54499de435277cc1a3d68Rajneesh Chowdury //So donot delete it here 2931c97d9ab52a288d24ea54499de435277cc1a3d68Rajneesh Chowdury //It is deleted from PreviewController class 2941c97d9ab52a288d24ea54499de435277cc1a3d68Rajneesh Chowdury //delete mAudioPlayer; 295643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi mAudioPlayer = NULL; 296643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi 297643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi if (mVideoBuffer) { 298643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi mVideoBuffer->release(); 299643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi mVideoBuffer = NULL; 300643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi } 301643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi 302643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi if (mVideoSource != NULL) { 303643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi mVideoSource->stop(); 304643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi 305643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi // The following hack is necessary to ensure that the OMX 306643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi // component is completely released by the time we may try 307643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi // to instantiate it again. 308643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi wp<MediaSource> tmp = mVideoSource; 309643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi mVideoSource.clear(); 310643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi while (tmp.promote() != NULL) { 311643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi usleep(1000); 312643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi } 313643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi IPCThreadState::self()->flushCommands(); 314643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi } 315643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi 316643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi mDurationUs = -1; 317643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi mFlags = 0; 318643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi mExtractorFlags = 0; 319643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi mVideoWidth = mVideoHeight = -1; 320643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi mTimeSourceDeltaUs = 0; 321643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi mVideoTimeUs = 0; 322643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi 323a5872f770c50da1db555d53e062a9896ea4321d5Andreas Huber mSeeking = NO_SEEK; 324643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi mSeekNotificationSent = false; 325643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi mSeekTimeUs = 0; 326643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi 327643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi mUri.setTo(""); 328643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi mUriHeaders.clear(); 329643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi 330643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi mFileSource.clear(); 331643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi 332643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi mCurrentVideoEffect = VIDEO_EFFECT_NONE; 333643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi mIsVideoSourceJpg = false; 334643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi mFrameRGBBuffer = NULL; 335643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi if(mFrameYUVBuffer != NULL) { 336694816d7291f17364502ac5d3319684a0b180860Shyam Pallapothu free(mFrameYUVBuffer); 337643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi mFrameYUVBuffer = NULL; 338643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi } 339643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi} 340643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi 341643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargistatus_t PreviewPlayer::play() { 342643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi Mutex::Autolock autoLock(mLock); 343643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi 344643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi mFlags &= ~CACHE_UNDERRUN; 345e018023b4844fef7880bf5e45f706afcb10c33b6Hong Teng mFlags &= ~INFORMED_AV_EOS; 346643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi return play_l(); 347643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi} 348643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi 3495bc7fb407ce1bab13d4a4a67d34a1a3192ee3186Dheeraj Sharmastatus_t PreviewPlayer::startAudioPlayer_l() { 3505bc7fb407ce1bab13d4a4a67d34a1a3192ee3186Dheeraj Sharma CHECK(!(mFlags & AUDIO_RUNNING)); 3515bc7fb407ce1bab13d4a4a67d34a1a3192ee3186Dheeraj Sharma 3525bc7fb407ce1bab13d4a4a67d34a1a3192ee3186Dheeraj Sharma if (mAudioSource == NULL || mAudioPlayer == NULL) { 3535bc7fb407ce1bab13d4a4a67d34a1a3192ee3186Dheeraj Sharma return OK; 3545bc7fb407ce1bab13d4a4a67d34a1a3192ee3186Dheeraj Sharma } 3555bc7fb407ce1bab13d4a4a67d34a1a3192ee3186Dheeraj Sharma 3565bc7fb407ce1bab13d4a4a67d34a1a3192ee3186Dheeraj Sharma if (!(mFlags & AUDIOPLAYER_STARTED)) { 3575bc7fb407ce1bab13d4a4a67d34a1a3192ee3186Dheeraj Sharma mFlags |= AUDIOPLAYER_STARTED; 3585bc7fb407ce1bab13d4a4a67d34a1a3192ee3186Dheeraj Sharma 3595bc7fb407ce1bab13d4a4a67d34a1a3192ee3186Dheeraj Sharma // We've already started the MediaSource in order to enable 3605bc7fb407ce1bab13d4a4a67d34a1a3192ee3186Dheeraj Sharma // the prefetcher to read its data. 3615bc7fb407ce1bab13d4a4a67d34a1a3192ee3186Dheeraj Sharma status_t err = mVeAudioPlayer->start( 3625bc7fb407ce1bab13d4a4a67d34a1a3192ee3186Dheeraj Sharma true /* sourceAlreadyStarted */); 3635bc7fb407ce1bab13d4a4a67d34a1a3192ee3186Dheeraj Sharma 3645bc7fb407ce1bab13d4a4a67d34a1a3192ee3186Dheeraj Sharma if (err != OK) { 3655bc7fb407ce1bab13d4a4a67d34a1a3192ee3186Dheeraj Sharma notifyListener_l(MEDIA_ERROR, MEDIA_ERROR_UNKNOWN, err); 3665bc7fb407ce1bab13d4a4a67d34a1a3192ee3186Dheeraj Sharma return err; 3675bc7fb407ce1bab13d4a4a67d34a1a3192ee3186Dheeraj Sharma } 3685bc7fb407ce1bab13d4a4a67d34a1a3192ee3186Dheeraj Sharma } else { 3695bc7fb407ce1bab13d4a4a67d34a1a3192ee3186Dheeraj Sharma mVeAudioPlayer->resume(); 3705bc7fb407ce1bab13d4a4a67d34a1a3192ee3186Dheeraj Sharma } 3715bc7fb407ce1bab13d4a4a67d34a1a3192ee3186Dheeraj Sharma 3725bc7fb407ce1bab13d4a4a67d34a1a3192ee3186Dheeraj Sharma mFlags |= AUDIO_RUNNING; 3735bc7fb407ce1bab13d4a4a67d34a1a3192ee3186Dheeraj Sharma 3745bc7fb407ce1bab13d4a4a67d34a1a3192ee3186Dheeraj Sharma mWatchForAudioEOS = true; 3755bc7fb407ce1bab13d4a4a67d34a1a3192ee3186Dheeraj Sharma 3765bc7fb407ce1bab13d4a4a67d34a1a3192ee3186Dheeraj Sharma return OK; 3775bc7fb407ce1bab13d4a4a67d34a1a3192ee3186Dheeraj Sharma} 3785bc7fb407ce1bab13d4a4a67d34a1a3192ee3186Dheeraj Sharma 379c9dedc4e1d0c8343ab1029cb601253826cd67c81James Dongstatus_t PreviewPlayer::setAudioPlayer(AudioPlayerBase *audioPlayer) { 3801c97d9ab52a288d24ea54499de435277cc1a3d68Rajneesh Chowdury Mutex::Autolock autoLock(mLock); 3811c97d9ab52a288d24ea54499de435277cc1a3d68Rajneesh Chowdury CHECK(!(mFlags & PLAYING)); 3821c97d9ab52a288d24ea54499de435277cc1a3d68Rajneesh Chowdury mAudioPlayer = audioPlayer; 3831c97d9ab52a288d24ea54499de435277cc1a3d68Rajneesh Chowdury 3841c97d9ab52a288d24ea54499de435277cc1a3d68Rajneesh Chowdury LOGV("SetAudioPlayer"); 3851c97d9ab52a288d24ea54499de435277cc1a3d68Rajneesh Chowdury mIsChangeSourceRequired = true; 3861c97d9ab52a288d24ea54499de435277cc1a3d68Rajneesh Chowdury mVeAudioPlayer = 3871c97d9ab52a288d24ea54499de435277cc1a3d68Rajneesh Chowdury (VideoEditorAudioPlayer*)mAudioPlayer; 3881c97d9ab52a288d24ea54499de435277cc1a3d68Rajneesh Chowdury 3891c97d9ab52a288d24ea54499de435277cc1a3d68Rajneesh Chowdury // check if the new and old source are dummy 3901c97d9ab52a288d24ea54499de435277cc1a3d68Rajneesh Chowdury sp<MediaSource> anAudioSource = mVeAudioPlayer->getSource(); 3911c97d9ab52a288d24ea54499de435277cc1a3d68Rajneesh Chowdury if (anAudioSource == NULL) { 3921c97d9ab52a288d24ea54499de435277cc1a3d68Rajneesh Chowdury // Audio player does not have any source set. 3931c97d9ab52a288d24ea54499de435277cc1a3d68Rajneesh Chowdury LOGV("setAudioPlayer: Audio player does not have any source set"); 3941c97d9ab52a288d24ea54499de435277cc1a3d68Rajneesh Chowdury return OK; 3951c97d9ab52a288d24ea54499de435277cc1a3d68Rajneesh Chowdury } 3961c97d9ab52a288d24ea54499de435277cc1a3d68Rajneesh Chowdury 3979a8c9a848da5a4a06c5402d6716efa66b8818d37Rajneesh Chowdury // If new video source is not dummy, then always change source 3989a8c9a848da5a4a06c5402d6716efa66b8818d37Rajneesh Chowdury // Else audio player continues using old audio source and there are 3999a8c9a848da5a4a06c5402d6716efa66b8818d37Rajneesh Chowdury // frame drops to maintain AV sync 4009a8c9a848da5a4a06c5402d6716efa66b8818d37Rajneesh Chowdury sp<MetaData> meta; 4019a8c9a848da5a4a06c5402d6716efa66b8818d37Rajneesh Chowdury if (mVideoSource != NULL) { 4029a8c9a848da5a4a06c5402d6716efa66b8818d37Rajneesh Chowdury meta = mVideoSource->getFormat(); 4039a8c9a848da5a4a06c5402d6716efa66b8818d37Rajneesh Chowdury const char *pVidSrcType; 4049a8c9a848da5a4a06c5402d6716efa66b8818d37Rajneesh Chowdury if (meta->findCString(kKeyDecoderComponent, &pVidSrcType)) { 4059a8c9a848da5a4a06c5402d6716efa66b8818d37Rajneesh Chowdury if (strcmp(pVidSrcType, "DummyVideoSource") != 0) { 4069a8c9a848da5a4a06c5402d6716efa66b8818d37Rajneesh Chowdury LOGV(" Video clip with silent audio; need to change source"); 4079a8c9a848da5a4a06c5402d6716efa66b8818d37Rajneesh Chowdury return OK; 4089a8c9a848da5a4a06c5402d6716efa66b8818d37Rajneesh Chowdury } 4099a8c9a848da5a4a06c5402d6716efa66b8818d37Rajneesh Chowdury } 4109a8c9a848da5a4a06c5402d6716efa66b8818d37Rajneesh Chowdury } 4119a8c9a848da5a4a06c5402d6716efa66b8818d37Rajneesh Chowdury 4121c97d9ab52a288d24ea54499de435277cc1a3d68Rajneesh Chowdury const char *pSrcType1; 4131c97d9ab52a288d24ea54499de435277cc1a3d68Rajneesh Chowdury const char *pSrcType2; 4149a8c9a848da5a4a06c5402d6716efa66b8818d37Rajneesh Chowdury meta = anAudioSource->getFormat(); 4151c97d9ab52a288d24ea54499de435277cc1a3d68Rajneesh Chowdury 4161c97d9ab52a288d24ea54499de435277cc1a3d68Rajneesh Chowdury if (meta->findCString(kKeyDecoderComponent, &pSrcType1)) { 4171c97d9ab52a288d24ea54499de435277cc1a3d68Rajneesh Chowdury if (strcmp(pSrcType1, "DummyAudioSource") == 0) { 4181c97d9ab52a288d24ea54499de435277cc1a3d68Rajneesh Chowdury meta = mAudioSource->getFormat(); 4191c97d9ab52a288d24ea54499de435277cc1a3d68Rajneesh Chowdury if (meta->findCString(kKeyDecoderComponent, &pSrcType2)) { 4201c97d9ab52a288d24ea54499de435277cc1a3d68Rajneesh Chowdury if (strcmp(pSrcType2, "DummyAudioSource") == 0) { 4211c97d9ab52a288d24ea54499de435277cc1a3d68Rajneesh Chowdury mIsChangeSourceRequired = false; 4221c97d9ab52a288d24ea54499de435277cc1a3d68Rajneesh Chowdury // Just set the new play duration for the existing source 4231c97d9ab52a288d24ea54499de435277cc1a3d68Rajneesh Chowdury MediaSource *pMediaSrc = anAudioSource.get(); 4241c97d9ab52a288d24ea54499de435277cc1a3d68Rajneesh Chowdury DummyAudioSource *pDummyAudioSource = (DummyAudioSource*)pMediaSrc; 4251c97d9ab52a288d24ea54499de435277cc1a3d68Rajneesh Chowdury //Increment the duration of audio source 426ebf40154a222c864a0aaf807702fc4eb6b9cf40fRaghavender Palla pDummyAudioSource->setDuration( 427ebf40154a222c864a0aaf807702fc4eb6b9cf40fRaghavender Palla (int64_t)((mPlayEndTimeMsec)*1000LL)); 428b6e2b5cc5b71986b06cbd9c471b63eb5878a7aeaRajneesh Chowdury 429b6e2b5cc5b71986b06cbd9c471b63eb5878a7aeaRajneesh Chowdury // Stop the new audio source 430b6e2b5cc5b71986b06cbd9c471b63eb5878a7aeaRajneesh Chowdury // since we continue using old source 431b6e2b5cc5b71986b06cbd9c471b63eb5878a7aeaRajneesh Chowdury LOGV("setAudioPlayer: stop new audio source"); 432b6e2b5cc5b71986b06cbd9c471b63eb5878a7aeaRajneesh Chowdury mAudioSource->stop(); 4331c97d9ab52a288d24ea54499de435277cc1a3d68Rajneesh Chowdury } 4341c97d9ab52a288d24ea54499de435277cc1a3d68Rajneesh Chowdury } 4351c97d9ab52a288d24ea54499de435277cc1a3d68Rajneesh Chowdury } 4361c97d9ab52a288d24ea54499de435277cc1a3d68Rajneesh Chowdury } 4371c97d9ab52a288d24ea54499de435277cc1a3d68Rajneesh Chowdury 4381c97d9ab52a288d24ea54499de435277cc1a3d68Rajneesh Chowdury return OK; 4391c97d9ab52a288d24ea54499de435277cc1a3d68Rajneesh Chowdury} 4401c97d9ab52a288d24ea54499de435277cc1a3d68Rajneesh Chowdury 4411c97d9ab52a288d24ea54499de435277cc1a3d68Rajneesh Chowduryvoid PreviewPlayer::onStreamDone() { 4421c97d9ab52a288d24ea54499de435277cc1a3d68Rajneesh Chowdury // Posted whenever any stream finishes playing. 4431c97d9ab52a288d24ea54499de435277cc1a3d68Rajneesh Chowdury 4441c97d9ab52a288d24ea54499de435277cc1a3d68Rajneesh Chowdury Mutex::Autolock autoLock(mLock); 4451c97d9ab52a288d24ea54499de435277cc1a3d68Rajneesh Chowdury if (!mStreamDoneEventPending) { 4461c97d9ab52a288d24ea54499de435277cc1a3d68Rajneesh Chowdury return; 4471c97d9ab52a288d24ea54499de435277cc1a3d68Rajneesh Chowdury } 4481c97d9ab52a288d24ea54499de435277cc1a3d68Rajneesh Chowdury mStreamDoneEventPending = false; 4491c97d9ab52a288d24ea54499de435277cc1a3d68Rajneesh Chowdury 4501c97d9ab52a288d24ea54499de435277cc1a3d68Rajneesh Chowdury if (mStreamDoneStatus != ERROR_END_OF_STREAM) { 4511c97d9ab52a288d24ea54499de435277cc1a3d68Rajneesh Chowdury LOGV("MEDIA_ERROR %d", mStreamDoneStatus); 4521c97d9ab52a288d24ea54499de435277cc1a3d68Rajneesh Chowdury 4531c97d9ab52a288d24ea54499de435277cc1a3d68Rajneesh Chowdury notifyListener_l( 4541c97d9ab52a288d24ea54499de435277cc1a3d68Rajneesh Chowdury MEDIA_ERROR, MEDIA_ERROR_UNKNOWN, mStreamDoneStatus); 4551c97d9ab52a288d24ea54499de435277cc1a3d68Rajneesh Chowdury 4561c97d9ab52a288d24ea54499de435277cc1a3d68Rajneesh Chowdury pause_l(true /* at eos */); 4571c97d9ab52a288d24ea54499de435277cc1a3d68Rajneesh Chowdury 4581c97d9ab52a288d24ea54499de435277cc1a3d68Rajneesh Chowdury mFlags |= AT_EOS; 4591c97d9ab52a288d24ea54499de435277cc1a3d68Rajneesh Chowdury return; 4601c97d9ab52a288d24ea54499de435277cc1a3d68Rajneesh Chowdury } 4611c97d9ab52a288d24ea54499de435277cc1a3d68Rajneesh Chowdury 4621c97d9ab52a288d24ea54499de435277cc1a3d68Rajneesh Chowdury const bool allDone = 4631c97d9ab52a288d24ea54499de435277cc1a3d68Rajneesh Chowdury (mVideoSource == NULL || (mFlags & VIDEO_AT_EOS)) 4641c97d9ab52a288d24ea54499de435277cc1a3d68Rajneesh Chowdury && (mAudioSource == NULL || (mFlags & AUDIO_AT_EOS)); 4651c97d9ab52a288d24ea54499de435277cc1a3d68Rajneesh Chowdury 4661c97d9ab52a288d24ea54499de435277cc1a3d68Rajneesh Chowdury if (!allDone) { 4671c97d9ab52a288d24ea54499de435277cc1a3d68Rajneesh Chowdury return; 4681c97d9ab52a288d24ea54499de435277cc1a3d68Rajneesh Chowdury } 4691c97d9ab52a288d24ea54499de435277cc1a3d68Rajneesh Chowdury 4701c97d9ab52a288d24ea54499de435277cc1a3d68Rajneesh Chowdury if (mFlags & (LOOPING | AUTO_LOOPING)) { 4711c97d9ab52a288d24ea54499de435277cc1a3d68Rajneesh Chowdury seekTo_l(0); 4721c97d9ab52a288d24ea54499de435277cc1a3d68Rajneesh Chowdury 4731c97d9ab52a288d24ea54499de435277cc1a3d68Rajneesh Chowdury if (mVideoSource != NULL) { 4741c97d9ab52a288d24ea54499de435277cc1a3d68Rajneesh Chowdury postVideoEvent_l(); 4751c97d9ab52a288d24ea54499de435277cc1a3d68Rajneesh Chowdury } 4761c97d9ab52a288d24ea54499de435277cc1a3d68Rajneesh Chowdury } else { 4771c97d9ab52a288d24ea54499de435277cc1a3d68Rajneesh Chowdury LOGV("MEDIA_PLAYBACK_COMPLETE"); 4781c97d9ab52a288d24ea54499de435277cc1a3d68Rajneesh Chowdury //pause before sending event 4791c97d9ab52a288d24ea54499de435277cc1a3d68Rajneesh Chowdury pause_l(true /* at eos */); 480fa31daff175709d2c58d61d1354daa9495696631Raghavender Palla 481fa31daff175709d2c58d61d1354daa9495696631Raghavender Palla //This lock is used to syncronize onStreamDone() in PreviewPlayer and 482fa31daff175709d2c58d61d1354daa9495696631Raghavender Palla //stopPreview() in PreviewController 483fa31daff175709d2c58d61d1354daa9495696631Raghavender Palla Mutex::Autolock autoLock(mLockControl); 484e018023b4844fef7880bf5e45f706afcb10c33b6Hong Teng /* Make sure PreviewPlayer only notifies MEDIA_PLAYBACK_COMPLETE once for each clip! 485e018023b4844fef7880bf5e45f706afcb10c33b6Hong Teng * It happens twice in following scenario. 486e018023b4844fef7880bf5e45f706afcb10c33b6Hong Teng * To make the clips in preview storyboard are played and switched smoothly, 487e018023b4844fef7880bf5e45f706afcb10c33b6Hong Teng * PreviewController uses two PreviewPlayer instances and one AudioPlayer. 488e018023b4844fef7880bf5e45f706afcb10c33b6Hong Teng * The two PreviewPlayer use the same AudioPlayer to play the audio, 489e018023b4844fef7880bf5e45f706afcb10c33b6Hong Teng * and change the audio source of the AudioPlayer. 490e018023b4844fef7880bf5e45f706afcb10c33b6Hong Teng * If the audio source of current playing clip and next clip are dummy 491e018023b4844fef7880bf5e45f706afcb10c33b6Hong Teng * audio source(image or video without audio), it will not change the audio source 492e018023b4844fef7880bf5e45f706afcb10c33b6Hong Teng * to avoid the "audio glitch", and keep using the current audio source. 493e018023b4844fef7880bf5e45f706afcb10c33b6Hong Teng * When the video of current clip reached the EOS, PreviewPlayer will set EOS flag 494e018023b4844fef7880bf5e45f706afcb10c33b6Hong Teng * for video and audio, and it will notify MEDIA_PLAYBACK_COMPLETE. 495e018023b4844fef7880bf5e45f706afcb10c33b6Hong Teng * But the audio(dummy audio source) is still playing(for next clip), 496e018023b4844fef7880bf5e45f706afcb10c33b6Hong Teng * and when it reached the EOS, and video reached EOS, 497e018023b4844fef7880bf5e45f706afcb10c33b6Hong Teng * PreviewPlayer will notify MEDIA_PLAYBACK_COMPLETE again. */ 498e018023b4844fef7880bf5e45f706afcb10c33b6Hong Teng if (!(mFlags & INFORMED_AV_EOS)) { 499e018023b4844fef7880bf5e45f706afcb10c33b6Hong Teng notifyListener_l(MEDIA_PLAYBACK_COMPLETE); 500e018023b4844fef7880bf5e45f706afcb10c33b6Hong Teng mFlags |= INFORMED_AV_EOS; 501e018023b4844fef7880bf5e45f706afcb10c33b6Hong Teng } 5021c97d9ab52a288d24ea54499de435277cc1a3d68Rajneesh Chowdury mFlags |= AT_EOS; 503fa31daff175709d2c58d61d1354daa9495696631Raghavender Palla LOGV("onStreamDone end"); 504fa31daff175709d2c58d61d1354daa9495696631Raghavender Palla return; 5051c97d9ab52a288d24ea54499de435277cc1a3d68Rajneesh Chowdury } 5061c97d9ab52a288d24ea54499de435277cc1a3d68Rajneesh Chowdury} 5071c97d9ab52a288d24ea54499de435277cc1a3d68Rajneesh Chowdury 5081c97d9ab52a288d24ea54499de435277cc1a3d68Rajneesh Chowdury 509643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargistatus_t PreviewPlayer::play_l() { 5105bc7fb407ce1bab13d4a4a67d34a1a3192ee3186Dheeraj Sharma 5118b95de2c4d57a0a07d7f4c59f2ddd52a140a361eRajneesh Chowdury mFlags &= ~SEEK_PREVIEW; 5128b95de2c4d57a0a07d7f4c59f2ddd52a140a361eRajneesh Chowdury 513643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi if (mFlags & PLAYING) { 514643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi return OK; 515643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi } 516643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi mStartNextPlayer = false; 517643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi 518643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi if (!(mFlags & PREPARED)) { 519643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi status_t err = prepare_l(); 520643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi 521643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi if (err != OK) { 522643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi return err; 523643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi } 524643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi } 525643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi 526643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi mFlags |= PLAYING; 527643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi mFlags |= FIRST_FRAME; 528643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi 529643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi bool deferredAudioSeek = false; 530643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi 531643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi if (mAudioSource != NULL) { 532643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi if (mAudioPlayer == NULL) { 533643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi if (mAudioSink != NULL) { 534643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi 535643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi mAudioPlayer = new VideoEditorAudioPlayer(mAudioSink, this); 5365bc7fb407ce1bab13d4a4a67d34a1a3192ee3186Dheeraj Sharma mVeAudioPlayer = 537643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi (VideoEditorAudioPlayer*)mAudioPlayer; 538643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi 539643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi mAudioPlayer->setSource(mAudioSource); 540643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi 5415bc7fb407ce1bab13d4a4a67d34a1a3192ee3186Dheeraj Sharma mVeAudioPlayer->setAudioMixSettings( 542643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi mPreviewPlayerAudioMixSettings); 543643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi 5445bc7fb407ce1bab13d4a4a67d34a1a3192ee3186Dheeraj Sharma mVeAudioPlayer->setAudioMixPCMFileHandle( 545643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi mAudioMixPCMFileHandle); 546643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi 5475bc7fb407ce1bab13d4a4a67d34a1a3192ee3186Dheeraj Sharma mVeAudioPlayer->setAudioMixStoryBoardSkimTimeStamp( 548643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi mAudioMixStoryBoardTS, mCurrentMediaBeginCutTime, 549643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi mCurrentMediaVolumeValue); 550643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi 5511c97d9ab52a288d24ea54499de435277cc1a3d68Rajneesh Chowdury mFlags |= AUDIOPLAYER_STARTED; 5521c97d9ab52a288d24ea54499de435277cc1a3d68Rajneesh Chowdury // We've already started the MediaSource in order to enable 5531c97d9ab52a288d24ea54499de435277cc1a3d68Rajneesh Chowdury // the prefetcher to read its data. 5541c97d9ab52a288d24ea54499de435277cc1a3d68Rajneesh Chowdury status_t err = mVeAudioPlayer->start( 5551c97d9ab52a288d24ea54499de435277cc1a3d68Rajneesh Chowdury true /* sourceAlreadyStarted */); 556643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi 5571c97d9ab52a288d24ea54499de435277cc1a3d68Rajneesh Chowdury if (err != OK) { 5581c97d9ab52a288d24ea54499de435277cc1a3d68Rajneesh Chowdury //delete mAudioPlayer; 5591c97d9ab52a288d24ea54499de435277cc1a3d68Rajneesh Chowdury mAudioPlayer = NULL; 5601c97d9ab52a288d24ea54499de435277cc1a3d68Rajneesh Chowdury 5611c97d9ab52a288d24ea54499de435277cc1a3d68Rajneesh Chowdury mFlags &= ~(PLAYING | FIRST_FRAME); 5621c97d9ab52a288d24ea54499de435277cc1a3d68Rajneesh Chowdury return err; 5631c97d9ab52a288d24ea54499de435277cc1a3d68Rajneesh Chowdury } 5641c97d9ab52a288d24ea54499de435277cc1a3d68Rajneesh Chowdury 5651c97d9ab52a288d24ea54499de435277cc1a3d68Rajneesh Chowdury mTimeSource = mVeAudioPlayer; 5661c97d9ab52a288d24ea54499de435277cc1a3d68Rajneesh Chowdury mFlags |= AUDIO_RUNNING; 567643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi deferredAudioSeek = true; 568643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi mWatchForAudioSeekComplete = false; 569643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi mWatchForAudioEOS = true; 570643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi } 5711c97d9ab52a288d24ea54499de435277cc1a3d68Rajneesh Chowdury } else { 5721c97d9ab52a288d24ea54499de435277cc1a3d68Rajneesh Chowdury mVeAudioPlayer = (VideoEditorAudioPlayer*)mAudioPlayer; 5731c97d9ab52a288d24ea54499de435277cc1a3d68Rajneesh Chowdury bool isAudioPlayerStarted = mVeAudioPlayer->isStarted(); 5745bc7fb407ce1bab13d4a4a67d34a1a3192ee3186Dheeraj Sharma 5751c97d9ab52a288d24ea54499de435277cc1a3d68Rajneesh Chowdury if (mIsChangeSourceRequired == true) { 5761c97d9ab52a288d24ea54499de435277cc1a3d68Rajneesh Chowdury LOGV("play_l: Change audio source required"); 577643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi 5781c97d9ab52a288d24ea54499de435277cc1a3d68Rajneesh Chowdury if (isAudioPlayerStarted == true) { 5791c97d9ab52a288d24ea54499de435277cc1a3d68Rajneesh Chowdury mVeAudioPlayer->pause(); 5801c97d9ab52a288d24ea54499de435277cc1a3d68Rajneesh Chowdury } 5815bc7fb407ce1bab13d4a4a67d34a1a3192ee3186Dheeraj Sharma 5821c97d9ab52a288d24ea54499de435277cc1a3d68Rajneesh Chowdury mVeAudioPlayer->setSource(mAudioSource); 5831c97d9ab52a288d24ea54499de435277cc1a3d68Rajneesh Chowdury mVeAudioPlayer->setObserver(this); 5841c97d9ab52a288d24ea54499de435277cc1a3d68Rajneesh Chowdury 5851c97d9ab52a288d24ea54499de435277cc1a3d68Rajneesh Chowdury mVeAudioPlayer->setAudioMixSettings( 5861c97d9ab52a288d24ea54499de435277cc1a3d68Rajneesh Chowdury mPreviewPlayerAudioMixSettings); 5871c97d9ab52a288d24ea54499de435277cc1a3d68Rajneesh Chowdury 5881c97d9ab52a288d24ea54499de435277cc1a3d68Rajneesh Chowdury mVeAudioPlayer->setAudioMixStoryBoardSkimTimeStamp( 5891c97d9ab52a288d24ea54499de435277cc1a3d68Rajneesh Chowdury mAudioMixStoryBoardTS, mCurrentMediaBeginCutTime, 5901c97d9ab52a288d24ea54499de435277cc1a3d68Rajneesh Chowdury mCurrentMediaVolumeValue); 5911c97d9ab52a288d24ea54499de435277cc1a3d68Rajneesh Chowdury 5921c97d9ab52a288d24ea54499de435277cc1a3d68Rajneesh Chowdury if (isAudioPlayerStarted == true) { 5931c97d9ab52a288d24ea54499de435277cc1a3d68Rajneesh Chowdury mVeAudioPlayer->resume(); 5941c97d9ab52a288d24ea54499de435277cc1a3d68Rajneesh Chowdury } else { 5951c97d9ab52a288d24ea54499de435277cc1a3d68Rajneesh Chowdury status_t err = OK; 5961c97d9ab52a288d24ea54499de435277cc1a3d68Rajneesh Chowdury err = mVeAudioPlayer->start(true); 5971c97d9ab52a288d24ea54499de435277cc1a3d68Rajneesh Chowdury if (err != OK) { 5981c97d9ab52a288d24ea54499de435277cc1a3d68Rajneesh Chowdury mAudioPlayer = NULL; 5991c97d9ab52a288d24ea54499de435277cc1a3d68Rajneesh Chowdury mVeAudioPlayer = NULL; 6001c97d9ab52a288d24ea54499de435277cc1a3d68Rajneesh Chowdury 6011c97d9ab52a288d24ea54499de435277cc1a3d68Rajneesh Chowdury mFlags &= ~(PLAYING | FIRST_FRAME); 6021c97d9ab52a288d24ea54499de435277cc1a3d68Rajneesh Chowdury return err; 6031c97d9ab52a288d24ea54499de435277cc1a3d68Rajneesh Chowdury } 6041c97d9ab52a288d24ea54499de435277cc1a3d68Rajneesh Chowdury } 6051c97d9ab52a288d24ea54499de435277cc1a3d68Rajneesh Chowdury } else { 6061c97d9ab52a288d24ea54499de435277cc1a3d68Rajneesh Chowdury LOGV("play_l: No Source change required"); 6071c97d9ab52a288d24ea54499de435277cc1a3d68Rajneesh Chowdury mVeAudioPlayer->setAudioMixStoryBoardSkimTimeStamp( 6081c97d9ab52a288d24ea54499de435277cc1a3d68Rajneesh Chowdury mAudioMixStoryBoardTS, mCurrentMediaBeginCutTime, 6091c97d9ab52a288d24ea54499de435277cc1a3d68Rajneesh Chowdury mCurrentMediaVolumeValue); 6101c97d9ab52a288d24ea54499de435277cc1a3d68Rajneesh Chowdury 6111c97d9ab52a288d24ea54499de435277cc1a3d68Rajneesh Chowdury mVeAudioPlayer->resume(); 6125bc7fb407ce1bab13d4a4a67d34a1a3192ee3186Dheeraj Sharma } 6131c97d9ab52a288d24ea54499de435277cc1a3d68Rajneesh Chowdury 6141c97d9ab52a288d24ea54499de435277cc1a3d68Rajneesh Chowdury mFlags |= AUDIOPLAYER_STARTED; 6151c97d9ab52a288d24ea54499de435277cc1a3d68Rajneesh Chowdury mFlags |= AUDIO_RUNNING; 6161c97d9ab52a288d24ea54499de435277cc1a3d68Rajneesh Chowdury mTimeSource = mVeAudioPlayer; 6171c97d9ab52a288d24ea54499de435277cc1a3d68Rajneesh Chowdury deferredAudioSeek = true; 6181c97d9ab52a288d24ea54499de435277cc1a3d68Rajneesh Chowdury mWatchForAudioSeekComplete = false; 6191c97d9ab52a288d24ea54499de435277cc1a3d68Rajneesh Chowdury mWatchForAudioEOS = true; 6205bc7fb407ce1bab13d4a4a67d34a1a3192ee3186Dheeraj Sharma } 621643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi } 622643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi 623643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi if (mTimeSource == NULL && mAudioPlayer == NULL) { 624643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi mTimeSource = &mSystemTimeSource; 625643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi } 626643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi 62753c567c3355255ed12dd9f5d5a1c58f821770329Dharmaray Kundargi // Set the seek option for Image source files and read. 62853c567c3355255ed12dd9f5d5a1c58f821770329Dharmaray Kundargi // This resets the timestamping for image play 62953c567c3355255ed12dd9f5d5a1c58f821770329Dharmaray Kundargi if (mIsVideoSourceJpg) { 63053c567c3355255ed12dd9f5d5a1c58f821770329Dharmaray Kundargi MediaSource::ReadOptions options; 63153c567c3355255ed12dd9f5d5a1c58f821770329Dharmaray Kundargi MediaBuffer *aLocalBuffer; 63253c567c3355255ed12dd9f5d5a1c58f821770329Dharmaray Kundargi options.setSeekTo(mSeekTimeUs); 63353c567c3355255ed12dd9f5d5a1c58f821770329Dharmaray Kundargi mVideoSource->read(&aLocalBuffer, &options); 6344ca3e5df4b809210b240cd7d0489922017d87a6dSantosh Madhava aLocalBuffer->release(); 63553c567c3355255ed12dd9f5d5a1c58f821770329Dharmaray Kundargi } 63653c567c3355255ed12dd9f5d5a1c58f821770329Dharmaray Kundargi 637643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi if (mVideoSource != NULL) { 638643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi // Kick off video playback 639643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi postVideoEvent_l(); 640643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi } 641643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi 642643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi if (deferredAudioSeek) { 643643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi // If there was a seek request while we were paused 644643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi // and we're just starting up again, honor the request now. 645643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi seekAudioIfNecessary_l(); 646643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi } 647643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi 648643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi if (mFlags & AT_EOS) { 649643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi // Legacy behaviour, if a stream finishes playing and then 650643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi // is started again, we play from the start... 651643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi seekTo_l(0); 652643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi } 653643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi 654643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi return OK; 655643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi} 656643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi 657643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi 658bfece17c8f63de4d4b686da50f8ecac2f6f8ec53Santosh Madhavastatus_t PreviewPlayer::initRenderer_l() { 6596e2242974c109e85bac50550970fe84009c76f77Mathias Agopian if (mSurface != NULL) { 660643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi if(mVideoRenderer == NULL) { 66143fcc396614a587851e2b7c4cea2876ec58b8648Chih-Chung Chang mVideoRenderer = mNativeWindowRenderer->createRenderInput(); 66243fcc396614a587851e2b7c4cea2876ec58b8648Chih-Chung Chang if (mVideoSource != NULL) { 66343fcc396614a587851e2b7c4cea2876ec58b8648Chih-Chung Chang updateSizeToRender(mVideoSource->getFormat()); 664bfece17c8f63de4d4b686da50f8ecac2f6f8ec53Santosh Madhava } 665643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi } 666643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi } 667bfece17c8f63de4d4b686da50f8ecac2f6f8ec53Santosh Madhava return OK; 668643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi} 669643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi 670643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi 671643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargistatus_t PreviewPlayer::seekTo(int64_t timeUs) { 672643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi 673643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi if ((mExtractorFlags & MediaExtractor::CAN_SEEK) || (mIsVideoSourceJpg)) { 674643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi Mutex::Autolock autoLock(mLock); 675643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi return seekTo_l(timeUs); 676643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi } 677643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi 678643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi return OK; 679643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi} 680643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi 681643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi 682643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargistatus_t PreviewPlayer::getVideoDimensions( 683643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi int32_t *width, int32_t *height) const { 684643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi Mutex::Autolock autoLock(mLock); 685643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi 686643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi if (mVideoWidth < 0 || mVideoHeight < 0) { 687643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi return UNKNOWN_ERROR; 688643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi } 689643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi 690643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi *width = mVideoWidth; 691643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi *height = mVideoHeight; 692643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi 693643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi return OK; 694643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi} 695643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi 696643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi 697643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargistatus_t PreviewPlayer::initAudioDecoder() { 698643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi sp<MetaData> meta = mAudioTrack->getFormat(); 699643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi const char *mime; 700643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi CHECK(meta->findCString(kKeyMIMEType, &mime)); 701643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi 702643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi if (!strcasecmp(mime, MEDIA_MIMETYPE_AUDIO_RAW)) { 703643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi mAudioSource = mAudioTrack; 704643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi } else { 705643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi sp<MediaSource> aRawSource; 706643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi aRawSource = OMXCodec::Create( 707643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi mClient.interface(), mAudioTrack->getFormat(), 708643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi false, // createEncoder 709643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi mAudioTrack); 710643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi 711643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi if(aRawSource != NULL) { 712643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi LOGV("initAudioDecoder: new VideoEditorSRC"); 713643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi mAudioSource = new VideoEditorSRC(aRawSource); 714643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi } 715643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi } 716643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi 717643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi if (mAudioSource != NULL) { 718643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi int64_t durationUs; 719643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi if (mAudioTrack->getFormat()->findInt64(kKeyDuration, &durationUs)) { 720643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi Mutex::Autolock autoLock(mMiscStateLock); 721643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi if (mDurationUs < 0 || durationUs > mDurationUs) { 722643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi mDurationUs = durationUs; 723643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi } 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 741643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi 742643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargistatus_t PreviewPlayer::initVideoDecoder(uint32_t flags) { 743643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi 74443fcc396614a587851e2b7c4cea2876ec58b8648Chih-Chung Chang initRenderer_l(); 74543fcc396614a587851e2b7c4cea2876ec58b8648Chih-Chung Chang 74643fcc396614a587851e2b7c4cea2876ec58b8648Chih-Chung Chang if (mVideoRenderer == NULL) { 74743fcc396614a587851e2b7c4cea2876ec58b8648Chih-Chung Chang LOGE("Cannot create renderer"); 74843fcc396614a587851e2b7c4cea2876ec58b8648Chih-Chung Chang return UNKNOWN_ERROR; 74943fcc396614a587851e2b7c4cea2876ec58b8648Chih-Chung Chang } 75043fcc396614a587851e2b7c4cea2876ec58b8648Chih-Chung Chang 751643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi mVideoSource = OMXCodec::Create( 752643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi mClient.interface(), mVideoTrack->getFormat(), 753643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi false, 754643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi mVideoTrack, 75543fcc396614a587851e2b7c4cea2876ec58b8648Chih-Chung Chang NULL, flags, mVideoRenderer->getTargetWindow()); 756643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi 757643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi if (mVideoSource != NULL) { 758643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi int64_t durationUs; 759643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi if (mVideoTrack->getFormat()->findInt64(kKeyDuration, &durationUs)) { 760643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi Mutex::Autolock autoLock(mMiscStateLock); 761643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi if (mDurationUs < 0 || durationUs > mDurationUs) { 762643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi mDurationUs = durationUs; 763643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi } 764643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi } 765643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi 76643fcc396614a587851e2b7c4cea2876ec58b8648Chih-Chung Chang updateSizeToRender(mVideoTrack->getFormat()); 76735cb2de64cb6482a08f446e80733e7d344a0dcacDharmaray Kundargi 768643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi status_t err = mVideoSource->start(); 769643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi 770643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi if (err != OK) { 771643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi mVideoSource.clear(); 772643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi return err; 773643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi } 774643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi } 775643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi 776643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi return mVideoSource != NULL ? OK : UNKNOWN_ERROR; 777643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi} 778643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi 779643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi 780643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargivoid PreviewPlayer::onVideoEvent() { 781643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi uint32_t i=0; 782643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi M4OSA_ERR err1 = M4NO_ERROR; 783643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi int64_t imageFrameTimeUs = 0; 784643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi 785643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi Mutex::Autolock autoLock(mLock); 786643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi if (!mVideoEventPending) { 787643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi // The event has been cancelled in reset_l() but had already 788643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi // been scheduled for execution at that time. 789643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi return; 790643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi } 791643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi mVideoEventPending = false; 792643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi 7939e4c36a044e264c644d7fa9f9894659a6fc47a6fAndreas Huber if (mFlags & SEEK_PREVIEW) { 7949e4c36a044e264c644d7fa9f9894659a6fc47a6fAndreas Huber mFlags &= ~SEEK_PREVIEW; 7959e4c36a044e264c644d7fa9f9894659a6fc47a6fAndreas Huber return; 7969e4c36a044e264c644d7fa9f9894659a6fc47a6fAndreas Huber } 7979e4c36a044e264c644d7fa9f9894659a6fc47a6fAndreas Huber 798643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi TimeSource *ts_st = &mSystemTimeSource; 799643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi int64_t timeStartUs = ts_st->getRealTimeUs(); 800643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi 801a5872f770c50da1db555d53e062a9896ea4321d5Andreas Huber if (mSeeking != NO_SEEK) { 802643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi 803643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi if(mAudioSource != NULL) { 804643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi 805643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi // We're going to seek the video source first, followed by 806643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi // the audio source. 807643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi // In order to avoid jumps in the DataSource offset caused by 808643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi // the audio codec prefetching data from the old locations 809643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi // while the video codec is already reading data from the new 810643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi // locations, we'll "pause" the audio source, causing it to 811643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi // stop reading input data until a subsequent seek. 812643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi 8135bc7fb407ce1bab13d4a4a67d34a1a3192ee3186Dheeraj Sharma if (mAudioPlayer != NULL && (mFlags & AUDIO_RUNNING)) { 814643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi mAudioPlayer->pause(); 8155bc7fb407ce1bab13d4a4a67d34a1a3192ee3186Dheeraj Sharma mFlags &= ~AUDIO_RUNNING; 816643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi } 817643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi mAudioSource->pause(); 818643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi } 819643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi } 820643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi 821643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi if (!mVideoBuffer) { 822643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi MediaSource::ReadOptions options; 823a5872f770c50da1db555d53e062a9896ea4321d5Andreas Huber if (mSeeking != NO_SEEK) { 824643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi LOGV("LV PLAYER seeking to %lld us (%.2f secs)", mSeekTimeUs, 825643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi mSeekTimeUs / 1E6); 826643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi 827643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi options.setSeekTo( 828643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi mSeekTimeUs, MediaSource::ReadOptions::SEEK_CLOSEST); 829643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi } 830643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi for (;;) { 83143fcc396614a587851e2b7c4cea2876ec58b8648Chih-Chung Chang status_t err = mVideoSource->read(&mVideoBuffer, &options); 832643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi options.clearSeekTo(); 833643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi 834643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi if (err != OK) { 835643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi CHECK_EQ(mVideoBuffer, NULL); 836643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi 837643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi if (err == INFO_FORMAT_CHANGED) { 838643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi LOGV("LV PLAYER VideoSource signalled format change"); 839643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi notifyVideoSize_l(); 840643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi 841643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi if (mVideoRenderer != NULL) { 842643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi mVideoRendererIsPreview = false; 843bfece17c8f63de4d4b686da50f8ecac2f6f8ec53Santosh Madhava err = initRenderer_l(); 8444ca3e5df4b809210b240cd7d0489922017d87a6dSantosh Madhava if (err != OK) { 8454ca3e5df4b809210b240cd7d0489922017d87a6dSantosh Madhava postStreamDoneEvent_l(err); 8464ca3e5df4b809210b240cd7d0489922017d87a6dSantosh Madhava } 847bfece17c8f63de4d4b686da50f8ecac2f6f8ec53Santosh Madhava 848643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi } 84943fcc396614a587851e2b7c4cea2876ec58b8648Chih-Chung Chang 85043fcc396614a587851e2b7c4cea2876ec58b8648Chih-Chung Chang updateSizeToRender(mVideoSource->getFormat()); 851643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi continue; 852643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi } 853643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi // So video playback is complete, but we may still have 854342f932f6312be84a48512216b561ead42b53199Santosh Madhava // a seek request pending that needs to be applied to the audio track 855a5872f770c50da1db555d53e062a9896ea4321d5Andreas Huber if (mSeeking != NO_SEEK) { 856342f932f6312be84a48512216b561ead42b53199Santosh Madhava LOGV("video stream ended while seeking!"); 857342f932f6312be84a48512216b561ead42b53199Santosh Madhava } 858342f932f6312be84a48512216b561ead42b53199Santosh Madhava finishSeekIfNecessary(-1); 859643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi LOGV("PreviewPlayer: onVideoEvent EOS reached."); 860643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi mFlags |= VIDEO_AT_EOS; 8611c97d9ab52a288d24ea54499de435277cc1a3d68Rajneesh Chowdury mFlags |= AUDIO_AT_EOS; 8624f4efef8357f4d8b23ccfb1b29db34175bf72627Dheeraj Sharma mOverlayUpdateEventPosted = false; 863643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi postStreamDoneEvent_l(err); 864b2d6e0f74a12e5cce5b429e646172c63346346c3Santosh Madhava // Set the last decoded timestamp to duration 865ebf40154a222c864a0aaf807702fc4eb6b9cf40fRaghavender Palla mDecodedVideoTs = (mPlayEndTimeMsec*1000LL); 866643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi return; 867643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi } 868643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi 869643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi if (mVideoBuffer->range_length() == 0) { 870643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi // Some decoders, notably the PV AVC software decoder 871643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi // return spurious empty buffers that we just want to ignore. 872643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi 873643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi mVideoBuffer->release(); 874643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi mVideoBuffer = NULL; 875643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi continue; 876643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi } 877643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi 878643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi int64_t videoTimeUs; 879643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi CHECK(mVideoBuffer->meta_data()->findInt64(kKeyTime, &videoTimeUs)); 880643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi 881a5872f770c50da1db555d53e062a9896ea4321d5Andreas Huber if (mSeeking != NO_SEEK) { 882b2d6e0f74a12e5cce5b429e646172c63346346c3Santosh Madhava if (videoTimeUs < mSeekTimeUs) { 883b2d6e0f74a12e5cce5b429e646172c63346346c3Santosh Madhava // buffers are before seek time 884b2d6e0f74a12e5cce5b429e646172c63346346c3Santosh Madhava // ignore them 885b2d6e0f74a12e5cce5b429e646172c63346346c3Santosh Madhava mVideoBuffer->release(); 886b2d6e0f74a12e5cce5b429e646172c63346346c3Santosh Madhava mVideoBuffer = NULL; 887b2d6e0f74a12e5cce5b429e646172c63346346c3Santosh Madhava continue; 888b2d6e0f74a12e5cce5b429e646172c63346346c3Santosh Madhava } 889b2d6e0f74a12e5cce5b429e646172c63346346c3Santosh Madhava } else { 890b2d6e0f74a12e5cce5b429e646172c63346346c3Santosh Madhava if((videoTimeUs/1000) < mPlayBeginTimeMsec) { 891b2d6e0f74a12e5cce5b429e646172c63346346c3Santosh Madhava // Frames are before begin cut time 892b2d6e0f74a12e5cce5b429e646172c63346346c3Santosh Madhava // Donot render 893b2d6e0f74a12e5cce5b429e646172c63346346c3Santosh Madhava mVideoBuffer->release(); 894b2d6e0f74a12e5cce5b429e646172c63346346c3Santosh Madhava mVideoBuffer = NULL; 895b2d6e0f74a12e5cce5b429e646172c63346346c3Santosh Madhava continue; 896b2d6e0f74a12e5cce5b429e646172c63346346c3Santosh Madhava } 897643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi } 898643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi break; 899643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi } 900643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi } 901643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi 902643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi mNumberDecVideoFrames++; 903643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi 904643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi int64_t timeUs; 905643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi CHECK(mVideoBuffer->meta_data()->findInt64(kKeyTime, &timeUs)); 906643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi 907643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi { 908643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi Mutex::Autolock autoLock(mMiscStateLock); 909643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi mVideoTimeUs = timeUs; 910643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi } 911643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi 912643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi 913643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi if(!mStartNextPlayer) { 914ebf40154a222c864a0aaf807702fc4eb6b9cf40fRaghavender Palla int64_t playbackTimeRemaining = (mPlayEndTimeMsec*1000LL) - timeUs; 915643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi if(playbackTimeRemaining <= 1500000) { 916643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi //When less than 1.5 sec of playback left 917643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi // send notification to start next player 918643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi 919643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi mStartNextPlayer = true; 920643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi notifyListener_l(0xAAAAAAAA); 921643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi } 922643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi } 923643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi 924a5872f770c50da1db555d53e062a9896ea4321d5Andreas Huber SeekType wasSeeking = mSeeking; 925643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi finishSeekIfNecessary(timeUs); 9265bc7fb407ce1bab13d4a4a67d34a1a3192ee3186Dheeraj Sharma if (mAudioPlayer != NULL && !(mFlags & (AUDIO_RUNNING))) { 9275bc7fb407ce1bab13d4a4a67d34a1a3192ee3186Dheeraj Sharma status_t err = startAudioPlayer_l(); 9285bc7fb407ce1bab13d4a4a67d34a1a3192ee3186Dheeraj Sharma if (err != OK) { 9295bc7fb407ce1bab13d4a4a67d34a1a3192ee3186Dheeraj Sharma LOGE("Starting the audio player failed w/ err %d", err); 9305bc7fb407ce1bab13d4a4a67d34a1a3192ee3186Dheeraj Sharma return; 9315bc7fb407ce1bab13d4a4a67d34a1a3192ee3186Dheeraj Sharma } 9325bc7fb407ce1bab13d4a4a67d34a1a3192ee3186Dheeraj Sharma } 933643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi 934643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi TimeSource *ts = (mFlags & AUDIO_AT_EOS) ? &mSystemTimeSource : mTimeSource; 935643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi 936643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi if(ts == NULL) { 937643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi mVideoBuffer->release(); 938643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi mVideoBuffer = NULL; 939643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi return; 940643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi } 941643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi 942643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi if(!mIsVideoSourceJpg) { 943643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi if (mFlags & FIRST_FRAME) { 944643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi mFlags &= ~FIRST_FRAME; 945643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi 946643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi mTimeSourceDeltaUs = ts->getRealTimeUs() - timeUs; 947643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi } 948643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi 949643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi int64_t realTimeUs, mediaTimeUs; 950643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi if (!(mFlags & AUDIO_AT_EOS) && mAudioPlayer != NULL 951643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi && mAudioPlayer->getMediaTimeMapping(&realTimeUs, &mediaTimeUs)) { 952643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi mTimeSourceDeltaUs = realTimeUs - mediaTimeUs; 953643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi } 954643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi 955643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi int64_t nowUs = ts->getRealTimeUs() - mTimeSourceDeltaUs; 956643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi 957643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi int64_t latenessUs = nowUs - timeUs; 958643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi 959a5872f770c50da1db555d53e062a9896ea4321d5Andreas Huber if (wasSeeking != NO_SEEK) { 960342f932f6312be84a48512216b561ead42b53199Santosh Madhava // Let's display the first frame after seeking right away. 961342f932f6312be84a48512216b561ead42b53199Santosh Madhava latenessUs = 0; 962342f932f6312be84a48512216b561ead42b53199Santosh Madhava } 963643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi LOGV("Audio time stamp = %lld and video time stamp = %lld", 964643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi ts->getRealTimeUs(),timeUs); 965643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi if (latenessUs > 40000) { 966643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi // We're more than 40ms late. 967643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi 968643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi LOGV("LV PLAYER we're late by %lld us (%.2f secs)", 969643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi latenessUs, latenessUs / 1E6); 970643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi 971643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi mVideoBuffer->release(); 972643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi mVideoBuffer = NULL; 9734f155f0cffa2414545854e899dff4861187e1f68Dharmaray Kundargi postVideoEvent_l(0); 974643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi return; 975643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi } 976643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi 9774f155f0cffa2414545854e899dff4861187e1f68Dharmaray Kundargi if (latenessUs < -25000) { 9784f155f0cffa2414545854e899dff4861187e1f68Dharmaray Kundargi // We're more than 25ms early. 9794f155f0cffa2414545854e899dff4861187e1f68Dharmaray Kundargi LOGV("We're more than 25ms early, lateness %lld", latenessUs); 980643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi 9814f155f0cffa2414545854e899dff4861187e1f68Dharmaray Kundargi postVideoEvent_l(25000); 982643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi return; 983643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi } 984643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi } 985643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi 986643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi if (mVideoRendererIsPreview || mVideoRenderer == NULL) { 987643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi mVideoRendererIsPreview = false; 988643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi 989bfece17c8f63de4d4b686da50f8ecac2f6f8ec53Santosh Madhava status_t err = initRenderer_l(); 9904ca3e5df4b809210b240cd7d0489922017d87a6dSantosh Madhava if (err != OK) { 9914ca3e5df4b809210b240cd7d0489922017d87a6dSantosh Madhava postStreamDoneEvent_l(err); 9924ca3e5df4b809210b240cd7d0489922017d87a6dSantosh Madhava } 993643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi } 994643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi 995643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi // If timestamp exceeds endCutTime of clip, donot render 996643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi if((timeUs/1000) > mPlayEndTimeMsec) { 997cece4b32d340f0ca514160647b9883e3777bc376Chih-Chung Chang mVideoBuffer->release(); 998643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi mVideoBuffer = NULL; 999643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi mFlags |= VIDEO_AT_EOS; 1000643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi mFlags |= AUDIO_AT_EOS; 1001bfece17c8f63de4d4b686da50f8ecac2f6f8ec53Santosh Madhava LOGV("PreviewPlayer: onVideoEvent timeUs > mPlayEndTime; send EOS.."); 10024f4efef8357f4d8b23ccfb1b29db34175bf72627Dheeraj Sharma mOverlayUpdateEventPosted = false; 1003fe288aa71450ebe04eb74d06a3ea887c6009aacbSantosh Madhava // Set the last decoded timestamp to duration 1004ebf40154a222c864a0aaf807702fc4eb6b9cf40fRaghavender Palla mDecodedVideoTs = (mPlayEndTimeMsec*1000LL); 1005643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi postStreamDoneEvent_l(ERROR_END_OF_STREAM); 1006643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi return; 1007643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi } 1008b2d6e0f74a12e5cce5b429e646172c63346346c3Santosh Madhava // Capture the frame timestamp to be rendered 1009b2d6e0f74a12e5cce5b429e646172c63346346c3Santosh Madhava mDecodedVideoTs = timeUs; 1010643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi 1011643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi // Post processing to apply video effects 1012643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi for(i=0;i<mNumberEffects;i++) { 1013643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi // First check if effect starttime matches the clip being previewed 1014643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi if((mEffectsSettings[i].uiStartTime < (mDecVideoTsStoryBoard/1000)) || 1015643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi (mEffectsSettings[i].uiStartTime >= 1016643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi ((mDecVideoTsStoryBoard/1000) + mPlayEndTimeMsec - mPlayBeginTimeMsec))) 1017643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi { 1018643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi // This effect doesn't belong to this clip, check next one 1019643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi continue; 1020643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi } 1021643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi // Check if effect applies to this particular frame timestamp 1022643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi if((mEffectsSettings[i].uiStartTime <= 1023643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi (((timeUs+mDecVideoTsStoryBoard)/1000)-mPlayBeginTimeMsec)) && 1024643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi ((mEffectsSettings[i].uiStartTime+mEffectsSettings[i].uiDuration) >= 1025643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi (((timeUs+mDecVideoTsStoryBoard)/1000)-mPlayBeginTimeMsec)) 1026643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi && (mEffectsSettings[i].uiDuration != 0)) { 1027643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi setVideoPostProcessingNode( 1028643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi mEffectsSettings[i].VideoEffectType, TRUE); 1029643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi } 1030643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi else { 1031643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi setVideoPostProcessingNode( 1032643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi mEffectsSettings[i].VideoEffectType, FALSE); 1033643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi } 1034e6c0750cd2927967f93a8811954f889d23fadb6eDharmaray Kundargi } 1035643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi 1036e6c0750cd2927967f93a8811954f889d23fadb6eDharmaray Kundargi //Provide the overlay Update indication when there is an overlay effect 1037d01ef568f96253fe5859526bb67b13fc5e17b544Dharmaray Kundargi if (mCurrentVideoEffect & VIDEO_EFFECT_FRAMING) { 1038d01ef568f96253fe5859526bb67b13fc5e17b544Dharmaray Kundargi mCurrentVideoEffect &= ~VIDEO_EFFECT_FRAMING; //never apply framing here. 1039e6c0750cd2927967f93a8811954f889d23fadb6eDharmaray Kundargi if (!mOverlayUpdateEventPosted) { 1040e6c0750cd2927967f93a8811954f889d23fadb6eDharmaray Kundargi // Find the effect in effectSettings array 1041408e25b2508d97f7ae0b39acf46ab42b7c223c44Basavapatna Dattaguru M4OSA_UInt32 index; 1042e6c0750cd2927967f93a8811954f889d23fadb6eDharmaray Kundargi for (index = 0; index < mNumberEffects; index++) { 1043e6c0750cd2927967f93a8811954f889d23fadb6eDharmaray Kundargi M4OSA_UInt32 timeMs = mDecodedVideoTs/1000; 1044e6c0750cd2927967f93a8811954f889d23fadb6eDharmaray Kundargi M4OSA_UInt32 timeOffset = mDecVideoTsStoryBoard/1000; 1045e6c0750cd2927967f93a8811954f889d23fadb6eDharmaray Kundargi if(mEffectsSettings[index].VideoEffectType == 1046408e25b2508d97f7ae0b39acf46ab42b7c223c44Basavapatna Dattaguru (M4VSS3GPP_VideoEffectType)M4xVSS_kVideoEffectType_Framing) { 1047254c8dfe514fd45eef251763639f63615379570fDharmaray Kundargi if (((mEffectsSettings[index].uiStartTime + 1) <= 1048254c8dfe514fd45eef251763639f63615379570fDharmaray Kundargi timeMs + timeOffset - mPlayBeginTimeMsec) && 1049e6c0750cd2927967f93a8811954f889d23fadb6eDharmaray Kundargi ((mEffectsSettings[index].uiStartTime - 1 + 1050254c8dfe514fd45eef251763639f63615379570fDharmaray Kundargi mEffectsSettings[index].uiDuration) >= 1051254c8dfe514fd45eef251763639f63615379570fDharmaray Kundargi timeMs + timeOffset - mPlayBeginTimeMsec)) 1052e6c0750cd2927967f93a8811954f889d23fadb6eDharmaray Kundargi { 1053e6c0750cd2927967f93a8811954f889d23fadb6eDharmaray Kundargi break; 1054e6c0750cd2927967f93a8811954f889d23fadb6eDharmaray Kundargi } 1055e6c0750cd2927967f93a8811954f889d23fadb6eDharmaray Kundargi } 1056e6c0750cd2927967f93a8811954f889d23fadb6eDharmaray Kundargi } 1057e6c0750cd2927967f93a8811954f889d23fadb6eDharmaray Kundargi if (index < mNumberEffects) { 1058e6c0750cd2927967f93a8811954f889d23fadb6eDharmaray Kundargi mCurrFramingEffectIndex = index; 1059e6c0750cd2927967f93a8811954f889d23fadb6eDharmaray Kundargi mOverlayUpdateEventPosted = true; 1060e6c0750cd2927967f93a8811954f889d23fadb6eDharmaray Kundargi postOverlayUpdateEvent_l(); 1061e6c0750cd2927967f93a8811954f889d23fadb6eDharmaray Kundargi LOGV("Framing index = %d", mCurrFramingEffectIndex); 1062e6c0750cd2927967f93a8811954f889d23fadb6eDharmaray Kundargi } else { 1063e6c0750cd2927967f93a8811954f889d23fadb6eDharmaray Kundargi LOGV("No framing effects found"); 1064e6c0750cd2927967f93a8811954f889d23fadb6eDharmaray Kundargi } 1065e6c0750cd2927967f93a8811954f889d23fadb6eDharmaray Kundargi } 1066e6c0750cd2927967f93a8811954f889d23fadb6eDharmaray Kundargi 1067e6c0750cd2927967f93a8811954f889d23fadb6eDharmaray Kundargi } else if (mOverlayUpdateEventPosted) { 1068e6c0750cd2927967f93a8811954f889d23fadb6eDharmaray Kundargi //Post the event when the overlay is no more valid 1069e6c0750cd2927967f93a8811954f889d23fadb6eDharmaray Kundargi LOGV("Overlay is Done"); 1070e6c0750cd2927967f93a8811954f889d23fadb6eDharmaray Kundargi mOverlayUpdateEventPosted = false; 1071e6c0750cd2927967f93a8811954f889d23fadb6eDharmaray Kundargi postOverlayUpdateEvent_l(); 1072643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi } 1073643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi 1074643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi if (mVideoRenderer != NULL) { 107543fcc396614a587851e2b7c4cea2876ec58b8648Chih-Chung Chang mVideoRenderer->render(mVideoBuffer, mCurrentVideoEffect, 107643fcc396614a587851e2b7c4cea2876ec58b8648Chih-Chung Chang mRenderingMode, mIsVideoSourceJpg); 1077643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi } 1078643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi 1079cece4b32d340f0ca514160647b9883e3777bc376Chih-Chung Chang mVideoBuffer->release(); 1080643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi mVideoBuffer = NULL; 1081643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi 1082643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi // Post progress callback based on callback interval set 1083643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi if(mNumberDecVideoFrames >= mProgressCbInterval) { 1084643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi postProgressCallbackEvent_l(); 1085643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi mNumberDecVideoFrames = 0; // reset counter 1086643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi } 1087643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi 1088643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi // if reached EndCutTime of clip, post EOS event 1089643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi if((timeUs/1000) >= mPlayEndTimeMsec) { 1090643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi LOGV("PreviewPlayer: onVideoEvent EOS."); 1091643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi mFlags |= VIDEO_AT_EOS; 1092643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi mFlags |= AUDIO_AT_EOS; 10934f4efef8357f4d8b23ccfb1b29db34175bf72627Dheeraj Sharma mOverlayUpdateEventPosted = false; 1094fe288aa71450ebe04eb74d06a3ea887c6009aacbSantosh Madhava // Set the last decoded timestamp to duration 1095ebf40154a222c864a0aaf807702fc4eb6b9cf40fRaghavender Palla mDecodedVideoTs = (mPlayEndTimeMsec*1000LL); 1096643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi postStreamDoneEvent_l(ERROR_END_OF_STREAM); 1097643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi } 1098643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi else { 1099a5872f770c50da1db555d53e062a9896ea4321d5Andreas Huber if ((wasSeeking != NO_SEEK) && (mFlags & SEEK_PREVIEW)) { 11001c97d9ab52a288d24ea54499de435277cc1a3d68Rajneesh Chowdury mFlags &= ~SEEK_PREVIEW; 11011c97d9ab52a288d24ea54499de435277cc1a3d68Rajneesh Chowdury return; 11021c97d9ab52a288d24ea54499de435277cc1a3d68Rajneesh Chowdury } 11031c97d9ab52a288d24ea54499de435277cc1a3d68Rajneesh Chowdury 1104643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi if(!mIsVideoSourceJpg) { 11054f155f0cffa2414545854e899dff4861187e1f68Dharmaray Kundargi postVideoEvent_l(0); 1106643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi } 1107643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi else { 1108643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi postVideoEvent_l(33000); 1109643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi } 1110643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi } 1111643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi} 1112643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi 1113643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargistatus_t PreviewPlayer::prepare() { 1114643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi Mutex::Autolock autoLock(mLock); 1115643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi return prepare_l(); 1116643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi} 1117643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi 1118643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargistatus_t PreviewPlayer::prepare_l() { 1119643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi if (mFlags & PREPARED) { 1120643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi return OK; 1121643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi } 1122643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi 1123643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi if (mFlags & PREPARING) { 1124643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi return UNKNOWN_ERROR; 1125643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi } 1126643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi 1127643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi mIsAsyncPrepare = false; 1128643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi status_t err = prepareAsync_l(); 1129643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi 1130643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi if (err != OK) { 1131643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi return err; 1132643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi } 1133643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi 1134643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi while (mFlags & PREPARING) { 1135643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi mPreparedCondition.wait(mLock); 1136643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi } 1137643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi 1138643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi return mPrepareResult; 1139643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi} 1140643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi 1141643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargistatus_t PreviewPlayer::prepareAsync_l() { 1142643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi if (mFlags & PREPARING) { 1143643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi return UNKNOWN_ERROR; // async prepare already pending 1144643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi } 1145643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi 1146643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi if (!mQueueStarted) { 1147643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi mQueue.start(); 1148643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi mQueueStarted = true; 1149643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi } 1150643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi 1151643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi mFlags |= PREPARING; 1152643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi mAsyncPrepareEvent = new PreviewPlayerEvent( 1153643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi this, &PreviewPlayer::onPrepareAsyncEvent); 1154643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi 1155643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi mQueue.postEvent(mAsyncPrepareEvent); 1156643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi 1157643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi return OK; 1158643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi} 1159643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi 1160643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargistatus_t PreviewPlayer::finishSetDataSource_l() { 1161643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi sp<DataSource> dataSource; 1162643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi sp<MediaExtractor> extractor; 1163643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi 1164643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi dataSource = DataSource::CreateFromURI(mUri.string(), &mUriHeaders); 1165643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi 1166643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi if (dataSource == NULL) { 1167643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi return UNKNOWN_ERROR; 1168643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi } 1169643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi 1170643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi //If file type is .rgb, then no need to check for Extractor 1171643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi int uriLen = strlen(mUri); 1172643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi int startOffset = uriLen - 4; 1173643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi if(!strncasecmp(mUri+startOffset, ".rgb", 4)) { 1174643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi extractor = NULL; 1175643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi } 1176643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi else { 1177643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi extractor = MediaExtractor::Create(dataSource, 1178643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi MEDIA_MIMETYPE_CONTAINER_MPEG4); 1179643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi } 1180643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi 1181643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi if (extractor == NULL) { 1182643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi LOGV("PreviewPlayer::finishSetDataSource_l extractor == NULL"); 1183643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi return setDataSource_l_jpg(); 1184643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi } 1185643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi 1186643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi return setDataSource_l(extractor); 1187643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi} 1188643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi 1189643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi 1190643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi// static 1191643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargibool PreviewPlayer::ContinuePreparation(void *cookie) { 1192643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi PreviewPlayer *me = static_cast<PreviewPlayer *>(cookie); 1193643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi 1194643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi return (me->mFlags & PREPARE_CANCELLED) == 0; 1195643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi} 1196643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi 1197643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargivoid PreviewPlayer::onPrepareAsyncEvent() { 1198643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi Mutex::Autolock autoLock(mLock); 1199643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi LOGV("onPrepareAsyncEvent"); 1200643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi 1201643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi if (mFlags & PREPARE_CANCELLED) { 1202bfece17c8f63de4d4b686da50f8ecac2f6f8ec53Santosh Madhava LOGV("LV PLAYER prepare was cancelled before doing anything"); 1203643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi abortPrepare(UNKNOWN_ERROR); 1204643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi return; 1205643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi } 1206643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi 1207643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi if (mUri.size() > 0) { 1208643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi status_t err = finishSetDataSource_l(); 1209643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi 1210643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi if (err != OK) { 1211643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi abortPrepare(err); 1212643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi return; 1213643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi } 1214643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi } 1215643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi 1216643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi if (mVideoTrack != NULL && mVideoSource == NULL) { 1217643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi status_t err = initVideoDecoder(OMXCodec::kHardwareCodecsOnly); 1218643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi 1219643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi if (err != OK) { 1220643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi abortPrepare(err); 1221643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi return; 1222643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi } 1223643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi } 1224643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi 1225643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi if (mAudioTrack != NULL && mAudioSource == NULL) { 1226643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi status_t err = initAudioDecoder(); 1227643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi 1228643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi if (err != OK) { 1229643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi abortPrepare(err); 1230643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi return; 1231643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi } 1232643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi } 1233643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi finishAsyncPrepare_l(); 1234643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi 1235643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi} 1236643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi 1237643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargivoid PreviewPlayer::finishAsyncPrepare_l() { 1238643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi if (mIsAsyncPrepare) { 1239643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi if (mVideoSource == NULL) { 1240643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi LOGV("finishAsyncPrepare_l: MEDIA_SET_VIDEO_SIZE 0 0 "); 1241643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi notifyListener_l(MEDIA_SET_VIDEO_SIZE, 0, 0); 1242643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi } else { 1243643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi LOGV("finishAsyncPrepare_l: MEDIA_SET_VIDEO_SIZE"); 1244643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi notifyVideoSize_l(); 1245643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi } 1246643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi LOGV("finishAsyncPrepare_l: MEDIA_PREPARED"); 1247643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi notifyListener_l(MEDIA_PREPARED); 1248643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi } 1249643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi 1250643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi mPrepareResult = OK; 1251643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi mFlags &= ~(PREPARING|PREPARE_CANCELLED); 1252643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi mFlags |= PREPARED; 1253643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi mAsyncPrepareEvent = NULL; 1254643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi mPreparedCondition.broadcast(); 1255643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi} 1256643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi 1257fa31daff175709d2c58d61d1354daa9495696631Raghavender Pallavoid PreviewPlayer::acquireLock() { 1258fa31daff175709d2c58d61d1354daa9495696631Raghavender Palla LOGV("acquireLock"); 1259fa31daff175709d2c58d61d1354daa9495696631Raghavender Palla mLockControl.lock(); 1260fa31daff175709d2c58d61d1354daa9495696631Raghavender Palla} 1261fa31daff175709d2c58d61d1354daa9495696631Raghavender Palla 1262fa31daff175709d2c58d61d1354daa9495696631Raghavender Pallavoid PreviewPlayer::releaseLock() { 1263fa31daff175709d2c58d61d1354daa9495696631Raghavender Palla LOGV("releaseLock"); 1264fa31daff175709d2c58d61d1354daa9495696631Raghavender Palla mLockControl.unlock(); 1265fa31daff175709d2c58d61d1354daa9495696631Raghavender Palla} 1266fa31daff175709d2c58d61d1354daa9495696631Raghavender Palla 1267643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargistatus_t PreviewPlayer::loadEffectsSettings( 1268643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi M4VSS3GPP_EffectSettings* pEffectSettings, int nEffects) { 1269643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi M4OSA_UInt32 i = 0, rgbSize = 0; 1270643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi M4VIFI_UInt8 *tmp = M4OSA_NULL; 1271643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi 1272643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi mNumberEffects = nEffects; 1273643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi mEffectsSettings = pEffectSettings; 1274643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi return OK; 1275643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi} 1276643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi 1277643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargistatus_t PreviewPlayer::loadAudioMixSettings( 1278643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi M4xVSS_AudioMixingSettings* pAudioMixSettings) { 1279643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi 1280643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi LOGV("PreviewPlayer: loadAudioMixSettings: "); 1281643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi mPreviewPlayerAudioMixSettings = pAudioMixSettings; 1282643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi return OK; 1283643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi} 1284643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi 1285643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargistatus_t PreviewPlayer::setAudioMixPCMFileHandle( 1286643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi M4OSA_Context pAudioMixPCMFileHandle) { 1287643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi 1288643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi LOGV("PreviewPlayer: setAudioMixPCMFileHandle: "); 1289643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi mAudioMixPCMFileHandle = pAudioMixPCMFileHandle; 1290643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi return OK; 1291643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi} 1292643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi 1293643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargistatus_t PreviewPlayer::setAudioMixStoryBoardParam( 1294643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi M4OSA_UInt32 audioMixStoryBoardTS, 1295643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi M4OSA_UInt32 currentMediaBeginCutTime, 1296643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi M4OSA_UInt32 primaryTrackVolValue ) { 1297643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi 1298643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi mAudioMixStoryBoardTS = audioMixStoryBoardTS; 1299643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi mCurrentMediaBeginCutTime = currentMediaBeginCutTime; 1300643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi mCurrentMediaVolumeValue = primaryTrackVolValue; 1301643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi return OK; 1302643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi} 1303643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi 1304643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargistatus_t PreviewPlayer::setPlaybackBeginTime(uint32_t msec) { 1305643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi 1306643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi mPlayBeginTimeMsec = msec; 1307643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi return OK; 1308643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi} 1309643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi 1310643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargistatus_t PreviewPlayer::setPlaybackEndTime(uint32_t msec) { 1311643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi 1312643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi mPlayEndTimeMsec = msec; 1313643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi return OK; 1314643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi} 1315643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi 1316643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargistatus_t PreviewPlayer::setStoryboardStartTime(uint32_t msec) { 1317643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi 1318643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi mStoryboardStartTimeMsec = msec; 1319ebf40154a222c864a0aaf807702fc4eb6b9cf40fRaghavender Palla mDecVideoTsStoryBoard = mStoryboardStartTimeMsec*1000LL; 1320643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi return OK; 1321643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi} 1322643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi 1323643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargistatus_t PreviewPlayer::setProgressCallbackInterval(uint32_t cbInterval) { 1324643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi 1325643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi mProgressCbInterval = cbInterval; 1326643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi return OK; 1327643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi} 1328643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi 1329643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi 1330643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargistatus_t PreviewPlayer::setMediaRenderingMode( 1331643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi M4xVSS_MediaRendering mode, 1332643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi M4VIDEOEDITING_VideoFrameSize outputVideoSize) { 1333643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi 1334643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi mRenderingMode = mode; 1335643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi 13368806b706693c0992724f6603353af18aeb4a0f80Hong Teng status_t err = OK; 13378806b706693c0992724f6603353af18aeb4a0f80Hong Teng /* get the video width and height by resolution */ 13388806b706693c0992724f6603353af18aeb4a0f80Hong Teng err = getVideoSizeByResolution(outputVideoSize, 13398806b706693c0992724f6603353af18aeb4a0f80Hong Teng &mOutputVideoWidth, &mOutputVideoHeight); 1340643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi 13418806b706693c0992724f6603353af18aeb4a0f80Hong Teng return err; 1342643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi} 1343643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi 1344643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargistatus_t PreviewPlayer::resetJniCallbackTimeStamp() { 1345643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi 1346ebf40154a222c864a0aaf807702fc4eb6b9cf40fRaghavender Palla mDecVideoTsStoryBoard = mStoryboardStartTimeMsec*1000LL; 1347643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi return OK; 1348643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi} 1349643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi 1350643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargivoid PreviewPlayer::postProgressCallbackEvent_l() { 1351643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi if (mProgressCbEventPending) { 1352643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi return; 1353643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi } 1354643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi mProgressCbEventPending = true; 1355643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi 1356643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi mQueue.postEvent(mProgressCbEvent); 1357643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi} 1358643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi 1359e6c0750cd2927967f93a8811954f889d23fadb6eDharmaray Kundargi 1360643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargivoid PreviewPlayer::onProgressCbEvent() { 1361643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi Mutex::Autolock autoLock(mLock); 1362643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi if (!mProgressCbEventPending) { 1363643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi return; 1364643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi } 1365643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi mProgressCbEventPending = false; 1366643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi // If playback starts from previous I-frame, 1367643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi // then send frame storyboard duration 1368643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi if((mDecodedVideoTs/1000) < mPlayBeginTimeMsec) { 1369643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi notifyListener_l(MEDIA_INFO, 0, mDecVideoTsStoryBoard/1000); 1370643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi } 1371643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi else { 1372643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi notifyListener_l(MEDIA_INFO, 0, 1373643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi (((mDecodedVideoTs+mDecVideoTsStoryBoard)/1000)-mPlayBeginTimeMsec)); 1374643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi } 1375643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi} 1376643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi 1377e6c0750cd2927967f93a8811954f889d23fadb6eDharmaray Kundargivoid PreviewPlayer::postOverlayUpdateEvent_l() { 1378e6c0750cd2927967f93a8811954f889d23fadb6eDharmaray Kundargi if (mOverlayUpdateEventPending) { 1379e6c0750cd2927967f93a8811954f889d23fadb6eDharmaray Kundargi return; 1380e6c0750cd2927967f93a8811954f889d23fadb6eDharmaray Kundargi } 1381e6c0750cd2927967f93a8811954f889d23fadb6eDharmaray Kundargi mOverlayUpdateEventPending = true; 1382e6c0750cd2927967f93a8811954f889d23fadb6eDharmaray Kundargi mQueue.postEvent(mOverlayUpdateEvent); 1383e6c0750cd2927967f93a8811954f889d23fadb6eDharmaray Kundargi} 1384e6c0750cd2927967f93a8811954f889d23fadb6eDharmaray Kundargi 1385e6c0750cd2927967f93a8811954f889d23fadb6eDharmaray Kundargivoid PreviewPlayer::onUpdateOverlayEvent() { 1386e6c0750cd2927967f93a8811954f889d23fadb6eDharmaray Kundargi Mutex::Autolock autoLock(mLock); 1387e6c0750cd2927967f93a8811954f889d23fadb6eDharmaray Kundargi 1388e6c0750cd2927967f93a8811954f889d23fadb6eDharmaray Kundargi if (!mOverlayUpdateEventPending) { 1389e6c0750cd2927967f93a8811954f889d23fadb6eDharmaray Kundargi return; 1390e6c0750cd2927967f93a8811954f889d23fadb6eDharmaray Kundargi } 1391e6c0750cd2927967f93a8811954f889d23fadb6eDharmaray Kundargi mOverlayUpdateEventPending = false; 1392e6c0750cd2927967f93a8811954f889d23fadb6eDharmaray Kundargi 1393e6c0750cd2927967f93a8811954f889d23fadb6eDharmaray Kundargi int updateState; 1394e6c0750cd2927967f93a8811954f889d23fadb6eDharmaray Kundargi if (mOverlayUpdateEventPosted) { 1395e6c0750cd2927967f93a8811954f889d23fadb6eDharmaray Kundargi updateState = 1; 1396e6c0750cd2927967f93a8811954f889d23fadb6eDharmaray Kundargi } else { 1397e6c0750cd2927967f93a8811954f889d23fadb6eDharmaray Kundargi updateState = 0; 1398e6c0750cd2927967f93a8811954f889d23fadb6eDharmaray Kundargi } 1399e6c0750cd2927967f93a8811954f889d23fadb6eDharmaray Kundargi notifyListener_l(0xBBBBBBBB, updateState, mCurrFramingEffectIndex); 1400e6c0750cd2927967f93a8811954f889d23fadb6eDharmaray Kundargi} 1401e6c0750cd2927967f93a8811954f889d23fadb6eDharmaray Kundargi 1402e6c0750cd2927967f93a8811954f889d23fadb6eDharmaray Kundargi 1403643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargivoid PreviewPlayer::setVideoPostProcessingNode( 1404643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi M4VSS3GPP_VideoEffectType type, M4OSA_Bool enable) { 1405643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi 1406643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi uint32_t effect = VIDEO_EFFECT_NONE; 1407643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi 1408643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi //Map M4VSS3GPP_VideoEffectType to local enum 1409643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi switch(type) { 1410643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi case M4VSS3GPP_kVideoEffectType_FadeFromBlack: 1411643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi effect = VIDEO_EFFECT_FADEFROMBLACK; 1412643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi break; 1413643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi 1414643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi case M4VSS3GPP_kVideoEffectType_FadeToBlack: 1415643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi effect = VIDEO_EFFECT_FADETOBLACK; 1416643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi break; 1417643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi 1418643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi case M4xVSS_kVideoEffectType_BlackAndWhite: 1419643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi effect = VIDEO_EFFECT_BLACKANDWHITE; 1420643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi break; 1421643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi 1422643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi case M4xVSS_kVideoEffectType_Pink: 1423643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi effect = VIDEO_EFFECT_PINK; 1424643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi break; 1425643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi 1426643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi case M4xVSS_kVideoEffectType_Green: 1427643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi effect = VIDEO_EFFECT_GREEN; 1428643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi break; 1429643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi 1430643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi case M4xVSS_kVideoEffectType_Sepia: 1431643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi effect = VIDEO_EFFECT_SEPIA; 1432643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi break; 1433643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi 1434643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi case M4xVSS_kVideoEffectType_Negative: 1435643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi effect = VIDEO_EFFECT_NEGATIVE; 1436643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi break; 1437643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi 1438643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi case M4xVSS_kVideoEffectType_Framing: 1439643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi effect = VIDEO_EFFECT_FRAMING; 1440643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi break; 1441643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi 1442643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi case M4xVSS_kVideoEffectType_Fifties: 1443643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi effect = VIDEO_EFFECT_FIFTIES; 1444643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi break; 1445643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi 1446643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi case M4xVSS_kVideoEffectType_ColorRGB16: 1447643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi effect = VIDEO_EFFECT_COLOR_RGB16; 1448643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi break; 1449643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi 1450643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi case M4xVSS_kVideoEffectType_Gradient: 1451643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi effect = VIDEO_EFFECT_GRADIENT; 1452643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi break; 1453643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi 1454643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi default: 1455643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi effect = VIDEO_EFFECT_NONE; 1456643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi break; 1457643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi } 1458643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi 1459643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi if(enable == M4OSA_TRUE) { 1460643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi //If already set, then no need to set again 1461643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi if(!(mCurrentVideoEffect & effect)) { 1462643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi mCurrentVideoEffect |= effect; 1463643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi if(effect == VIDEO_EFFECT_FIFTIES) { 1464643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi mIsFiftiesEffectStarted = true; 1465643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi } 1466643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi } 1467643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi } 1468643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi else { 1469643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi //Reset only if already set 1470643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi if(mCurrentVideoEffect & effect) { 1471643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi mCurrentVideoEffect &= ~effect; 1472643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi } 1473643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi } 1474643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi} 1475643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi 1476643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargistatus_t PreviewPlayer::setImageClipProperties(uint32_t width,uint32_t height) { 1477643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi mVideoWidth = width; 1478643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi mVideoHeight = height; 1479643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi return OK; 1480643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi} 1481643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi 1482643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargistatus_t PreviewPlayer::readFirstVideoFrame() { 1483643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi LOGV("PreviewPlayer::readFirstVideoFrame"); 1484643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi 1485643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi if (!mVideoBuffer) { 1486643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi MediaSource::ReadOptions options; 1487a5872f770c50da1db555d53e062a9896ea4321d5Andreas Huber if (mSeeking != NO_SEEK) { 1488643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi LOGV("LV PLAYER seeking to %lld us (%.2f secs)", mSeekTimeUs, 1489643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi mSeekTimeUs / 1E6); 1490643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi 1491643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi options.setSeekTo( 1492643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi mSeekTimeUs, MediaSource::ReadOptions::SEEK_CLOSEST); 1493643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi } 1494643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi for (;;) { 149543fcc396614a587851e2b7c4cea2876ec58b8648Chih-Chung Chang status_t err = mVideoSource->read(&mVideoBuffer, &options); 1496643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi options.clearSeekTo(); 1497643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi 1498643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi if (err != OK) { 1499643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi CHECK_EQ(mVideoBuffer, NULL); 1500643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi 1501643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi if (err == INFO_FORMAT_CHANGED) { 1502643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi LOGV("LV PLAYER VideoSource signalled format change"); 1503643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi notifyVideoSize_l(); 1504643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi 1505643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi if (mVideoRenderer != NULL) { 1506643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi mVideoRendererIsPreview = false; 1507bfece17c8f63de4d4b686da50f8ecac2f6f8ec53Santosh Madhava err = initRenderer_l(); 15084ca3e5df4b809210b240cd7d0489922017d87a6dSantosh Madhava if (err != OK) { 15094ca3e5df4b809210b240cd7d0489922017d87a6dSantosh Madhava postStreamDoneEvent_l(err); 15104ca3e5df4b809210b240cd7d0489922017d87a6dSantosh Madhava } 1511643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi } 151243fcc396614a587851e2b7c4cea2876ec58b8648Chih-Chung Chang 151343fcc396614a587851e2b7c4cea2876ec58b8648Chih-Chung Chang updateSizeToRender(mVideoSource->getFormat()); 1514643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi continue; 1515643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi } 1516643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi LOGV("PreviewPlayer: onVideoEvent EOS reached."); 1517643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi mFlags |= VIDEO_AT_EOS; 15181c97d9ab52a288d24ea54499de435277cc1a3d68Rajneesh Chowdury mFlags |= AUDIO_AT_EOS; 1519643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi postStreamDoneEvent_l(err); 1520643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi return OK; 1521643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi } 1522643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi 1523643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi if (mVideoBuffer->range_length() == 0) { 1524643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi // Some decoders, notably the PV AVC software decoder 1525643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi // return spurious empty buffers that we just want to ignore. 1526643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi 1527643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi mVideoBuffer->release(); 1528643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi mVideoBuffer = NULL; 1529643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi continue; 1530643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi } 1531643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi 1532643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi int64_t videoTimeUs; 1533643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi CHECK(mVideoBuffer->meta_data()->findInt64(kKeyTime, &videoTimeUs)); 1534a5872f770c50da1db555d53e062a9896ea4321d5Andreas Huber if (mSeeking != NO_SEEK) { 1535b2d6e0f74a12e5cce5b429e646172c63346346c3Santosh Madhava if (videoTimeUs < mSeekTimeUs) { 1536b2d6e0f74a12e5cce5b429e646172c63346346c3Santosh Madhava // buffers are before seek time 1537b2d6e0f74a12e5cce5b429e646172c63346346c3Santosh Madhava // ignore them 1538b2d6e0f74a12e5cce5b429e646172c63346346c3Santosh Madhava mVideoBuffer->release(); 1539b2d6e0f74a12e5cce5b429e646172c63346346c3Santosh Madhava mVideoBuffer = NULL; 1540b2d6e0f74a12e5cce5b429e646172c63346346c3Santosh Madhava continue; 1541b2d6e0f74a12e5cce5b429e646172c63346346c3Santosh Madhava } 1542b2d6e0f74a12e5cce5b429e646172c63346346c3Santosh Madhava } else { 1543b2d6e0f74a12e5cce5b429e646172c63346346c3Santosh Madhava if((videoTimeUs/1000) < mPlayBeginTimeMsec) { 1544b2d6e0f74a12e5cce5b429e646172c63346346c3Santosh Madhava // buffers are before begin cut time 1545b2d6e0f74a12e5cce5b429e646172c63346346c3Santosh Madhava // ignore them 1546b2d6e0f74a12e5cce5b429e646172c63346346c3Santosh Madhava mVideoBuffer->release(); 1547b2d6e0f74a12e5cce5b429e646172c63346346c3Santosh Madhava mVideoBuffer = NULL; 1548b2d6e0f74a12e5cce5b429e646172c63346346c3Santosh Madhava continue; 1549b2d6e0f74a12e5cce5b429e646172c63346346c3Santosh Madhava } 1550643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi } 1551643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi break; 1552643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi } 1553643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi } 1554643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi 1555643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi int64_t timeUs; 1556643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi CHECK(mVideoBuffer->meta_data()->findInt64(kKeyTime, &timeUs)); 1557643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi 1558643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi { 1559643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi Mutex::Autolock autoLock(mMiscStateLock); 1560643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi mVideoTimeUs = timeUs; 1561643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi } 1562643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi 1563643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi mDecodedVideoTs = timeUs; 1564643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi 1565643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi return OK; 1566643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi 1567643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi} 1568643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi 1569b2d6e0f74a12e5cce5b429e646172c63346346c3Santosh Madhavastatus_t PreviewPlayer::getLastRenderedTimeMs(uint32_t *lastRenderedTimeMs) { 1570b2d6e0f74a12e5cce5b429e646172c63346346c3Santosh Madhava *lastRenderedTimeMs = (((mDecodedVideoTs+mDecVideoTsStoryBoard)/1000)-mPlayBeginTimeMsec); 1571b2d6e0f74a12e5cce5b429e646172c63346346c3Santosh Madhava return OK; 1572b2d6e0f74a12e5cce5b429e646172c63346346c3Santosh Madhava} 1573b2d6e0f74a12e5cce5b429e646172c63346346c3Santosh Madhava 157443fcc396614a587851e2b7c4cea2876ec58b8648Chih-Chung Changvoid PreviewPlayer::updateSizeToRender(sp<MetaData> meta) { 157543fcc396614a587851e2b7c4cea2876ec58b8648Chih-Chung Chang if (mVideoRenderer) { 157643fcc396614a587851e2b7c4cea2876ec58b8648Chih-Chung Chang mVideoRenderer->updateVideoSize(meta); 157743fcc396614a587851e2b7c4cea2876ec58b8648Chih-Chung Chang } 157843fcc396614a587851e2b7c4cea2876ec58b8648Chih-Chung Chang} 157943fcc396614a587851e2b7c4cea2876ec58b8648Chih-Chung Chang 1580643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi} // namespace android 1581