PreviewPlayer.cpp revision ebf40154a222c864a0aaf807702fc4eb6b9cf40f
1643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi/* 2643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi * Copyright (C) 2011 NXP Software 3643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi * Copyright (C) 2011 The Android Open Source Project 4643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi * 5643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi * Licensed under the Apache License, Version 2.0 (the "License"); 6643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi * you may not use this file except in compliance with the License. 7643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi * You may obtain a copy of the License at 8643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi * 9643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi * http://www.apache.org/licenses/LICENSE-2.0 10643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi * 11643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi * Unless required by applicable law or agreed to in writing, software 12643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi * distributed under the License is distributed on an "AS IS" BASIS, 13643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 14643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi * See the License for the specific language governing permissions and 15643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi * limitations under the License. 16643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi */ 17643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi 18bfece17c8f63de4d4b686da50f8ecac2f6f8ec53Santosh Madhava 19643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi#define LOG_NDEBUG 1 20643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi#define LOG_TAG "PreviewPlayer" 21643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi#include <utils/Log.h> 22643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi 23643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi#include <dlfcn.h> 24643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi 25643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi#include "include/ARTSPController.h" 26643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi#include "PreviewPlayer.h" 27643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi#include "DummyAudioSource.h" 28643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi#include "DummyVideoSource.h" 29643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi#include "VideoEditorSRC.h" 30643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi#include "include/NuCachedSource2.h" 31643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi#include "include/ThrottledSource.h" 32643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi 33643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi 34643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi#include "PreviewRenderer.h" 35643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi 36643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi#include <binder/IPCThreadState.h> 37643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi#include <media/stagefright/DataSource.h> 38643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi#include <media/stagefright/FileSource.h> 39643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi#include <media/stagefright/MediaBuffer.h> 40643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi#include <media/stagefright/MediaDefs.h> 41643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi#include <media/stagefright/MediaExtractor.h> 42643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi#include <media/stagefright/MediaDebug.h> 43643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi#include <media/stagefright/MediaSource.h> 44643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi#include <media/stagefright/MetaData.h> 45643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi#include <media/stagefright/OMXCodec.h> 46643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi 47643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi#include <surfaceflinger/Surface.h> 48643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi#include <media/stagefright/foundation/ALooper.h> 49643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi 50643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundarginamespace android { 51643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi 52643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi 53643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargistruct PreviewPlayerEvent : public TimedEventQueue::Event { 54643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi PreviewPlayerEvent( 55643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi PreviewPlayer *player, 56643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi void (PreviewPlayer::*method)()) 57643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi : mPlayer(player), 58643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi mMethod(method) { 59643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi } 60643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi 61643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargiprotected: 62643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi virtual ~PreviewPlayerEvent() {} 63643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi 64643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi virtual void fire(TimedEventQueue *queue, int64_t /* now_us */) { 65643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi (mPlayer->*mMethod)(); 66643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi } 67643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi 68643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargiprivate: 69643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi PreviewPlayer *mPlayer; 70643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi void (PreviewPlayer::*mMethod)(); 71643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi 72643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi PreviewPlayerEvent(const PreviewPlayerEvent &); 73643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi PreviewPlayerEvent &operator=(const PreviewPlayerEvent &); 74643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi}; 75643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi 76643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi 77643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargistruct PreviewLocalRenderer : public PreviewPlayerRenderer { 78bfece17c8f63de4d4b686da50f8ecac2f6f8ec53Santosh Madhava 79bfece17c8f63de4d4b686da50f8ecac2f6f8ec53Santosh Madhava static PreviewLocalRenderer* initPreviewLocalRenderer ( 80643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi bool previewOnly, 81643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi OMX_COLOR_FORMATTYPE colorFormat, 82643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi const sp<Surface> &surface, 83643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi size_t displayWidth, size_t displayHeight, 84643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi size_t decodedWidth, size_t decodedHeight, 85643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi int32_t rotationDegrees = 0) 86bfece17c8f63de4d4b686da50f8ecac2f6f8ec53Santosh Madhava { 87bfece17c8f63de4d4b686da50f8ecac2f6f8ec53Santosh Madhava PreviewLocalRenderer* mLocalRenderer = new 88bfece17c8f63de4d4b686da50f8ecac2f6f8ec53Santosh Madhava PreviewLocalRenderer( 89bfece17c8f63de4d4b686da50f8ecac2f6f8ec53Santosh Madhava previewOnly, 90bfece17c8f63de4d4b686da50f8ecac2f6f8ec53Santosh Madhava colorFormat, 91bfece17c8f63de4d4b686da50f8ecac2f6f8ec53Santosh Madhava surface, 92bfece17c8f63de4d4b686da50f8ecac2f6f8ec53Santosh Madhava displayWidth, displayHeight, 93bfece17c8f63de4d4b686da50f8ecac2f6f8ec53Santosh Madhava decodedWidth, decodedHeight, 94bfece17c8f63de4d4b686da50f8ecac2f6f8ec53Santosh Madhava rotationDegrees); 95bfece17c8f63de4d4b686da50f8ecac2f6f8ec53Santosh Madhava 96bfece17c8f63de4d4b686da50f8ecac2f6f8ec53Santosh Madhava if ( mLocalRenderer->init(previewOnly, 97643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi colorFormat, surface, 98643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi displayWidth, displayHeight, 99643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi decodedWidth, decodedHeight, 100bfece17c8f63de4d4b686da50f8ecac2f6f8ec53Santosh Madhava rotationDegrees) != OK ) 101bfece17c8f63de4d4b686da50f8ecac2f6f8ec53Santosh Madhava { 102bfece17c8f63de4d4b686da50f8ecac2f6f8ec53Santosh Madhava delete mLocalRenderer; 103bfece17c8f63de4d4b686da50f8ecac2f6f8ec53Santosh Madhava return NULL; 104bfece17c8f63de4d4b686da50f8ecac2f6f8ec53Santosh Madhava } 105bfece17c8f63de4d4b686da50f8ecac2f6f8ec53Santosh Madhava return mLocalRenderer; 106643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi } 107643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi 108643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi virtual void render(MediaBuffer *buffer) { 109643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi render((const uint8_t *)buffer->data() + buffer->range_offset(), 110643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi buffer->range_length()); 111643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi } 112643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi 113643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi void render(const void *data, size_t size) { 114643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi mTarget->render(data, size, NULL); 115643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi } 116643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi void render() { 117643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi mTarget->renderYV12(); 118643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi } 119643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi void getBuffer(uint8_t **data, size_t *stride) { 120643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi mTarget->getBufferYV12(data, stride); 121643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi } 122643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi 123643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargiprotected: 124643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi virtual ~PreviewLocalRenderer() { 125643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi delete mTarget; 126643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi mTarget = NULL; 127643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi } 128643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi 129643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargiprivate: 130643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi PreviewRenderer *mTarget; 131643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi 132bfece17c8f63de4d4b686da50f8ecac2f6f8ec53Santosh Madhava PreviewLocalRenderer( 133bfece17c8f63de4d4b686da50f8ecac2f6f8ec53Santosh Madhava bool previewOnly, 134bfece17c8f63de4d4b686da50f8ecac2f6f8ec53Santosh Madhava OMX_COLOR_FORMATTYPE colorFormat, 135bfece17c8f63de4d4b686da50f8ecac2f6f8ec53Santosh Madhava const sp<Surface> &surface, 136bfece17c8f63de4d4b686da50f8ecac2f6f8ec53Santosh Madhava size_t displayWidth, size_t displayHeight, 137bfece17c8f63de4d4b686da50f8ecac2f6f8ec53Santosh Madhava size_t decodedWidth, size_t decodedHeight, 138bfece17c8f63de4d4b686da50f8ecac2f6f8ec53Santosh Madhava int32_t rotationDegrees = 0) 139bfece17c8f63de4d4b686da50f8ecac2f6f8ec53Santosh Madhava : mTarget(NULL) { 140bfece17c8f63de4d4b686da50f8ecac2f6f8ec53Santosh Madhava } 141bfece17c8f63de4d4b686da50f8ecac2f6f8ec53Santosh Madhava 142bfece17c8f63de4d4b686da50f8ecac2f6f8ec53Santosh Madhava 143bfece17c8f63de4d4b686da50f8ecac2f6f8ec53Santosh Madhava int init( 144643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi bool previewOnly, 145643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi OMX_COLOR_FORMATTYPE colorFormat, 146643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi const sp<Surface> &surface, 147643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi size_t displayWidth, size_t displayHeight, 148643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi size_t decodedWidth, size_t decodedHeight, 149643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi int32_t rotationDegrees = 0); 150643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi 151643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi PreviewLocalRenderer(const PreviewLocalRenderer &); 152643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi PreviewLocalRenderer &operator=(const PreviewLocalRenderer &);; 153643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi}; 154643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi 155bfece17c8f63de4d4b686da50f8ecac2f6f8ec53Santosh Madhavaint PreviewLocalRenderer::init( 156643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi bool previewOnly, 157643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi OMX_COLOR_FORMATTYPE colorFormat, 158643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi const sp<Surface> &surface, 159643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi size_t displayWidth, size_t displayHeight, 160643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi size_t decodedWidth, size_t decodedHeight, 161643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi int32_t rotationDegrees) { 162bfece17c8f63de4d4b686da50f8ecac2f6f8ec53Santosh Madhava 163bfece17c8f63de4d4b686da50f8ecac2f6f8ec53Santosh Madhava mTarget = PreviewRenderer::CreatePreviewRenderer ( 164643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi colorFormat, surface, displayWidth, displayHeight, 165643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi decodedWidth, decodedHeight, rotationDegrees); 166bfece17c8f63de4d4b686da50f8ecac2f6f8ec53Santosh Madhava if (mTarget == M4OSA_NULL) { 167bfece17c8f63de4d4b686da50f8ecac2f6f8ec53Santosh Madhava return UNKNOWN_ERROR; 168bfece17c8f63de4d4b686da50f8ecac2f6f8ec53Santosh Madhava } 169bfece17c8f63de4d4b686da50f8ecac2f6f8ec53Santosh Madhava return OK; 170643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi} 171643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi 172643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray KundargiPreviewPlayer::PreviewPlayer() 173643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi : AwesomePlayer(), 174408e25b2508d97f7ae0b39acf46ab42b7c223c44Basavapatna Dattaguru mCurrFramingEffectIndex(0) , 17535cb2de64cb6482a08f446e80733e7d344a0dcacDharmaray Kundargi mReportedWidth(0), 176e6c0750cd2927967f93a8811954f889d23fadb6eDharmaray Kundargi mReportedHeight(0), 177408e25b2508d97f7ae0b39acf46ab42b7c223c44Basavapatna Dattaguru mFrameRGBBuffer(NULL), 178408e25b2508d97f7ae0b39acf46ab42b7c223c44Basavapatna Dattaguru mFrameYUVBuffer(NULL){ 179643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi 180643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi mVideoRenderer = NULL; 181643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi mLastVideoBuffer = NULL; 182643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi mSuspensionState = NULL; 183643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi mEffectsSettings = NULL; 1845bc7fb407ce1bab13d4a4a67d34a1a3192ee3186Dheeraj Sharma mVeAudioPlayer = NULL; 185643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi mAudioMixStoryBoardTS = 0; 186643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi mCurrentMediaBeginCutTime = 0; 187643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi mCurrentMediaVolumeValue = 0; 188643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi mNumberEffects = 0; 189643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi mDecodedVideoTs = 0; 190643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi mDecVideoTsStoryBoard = 0; 191643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi mCurrentVideoEffect = VIDEO_EFFECT_NONE; 192643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi mProgressCbInterval = 0; 193643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi mNumberDecVideoFrames = 0; 194e6c0750cd2927967f93a8811954f889d23fadb6eDharmaray Kundargi mOverlayUpdateEventPosted = false; 1951c97d9ab52a288d24ea54499de435277cc1a3d68Rajneesh Chowdury mIsChangeSourceRequired = true; 196643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi 197643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi mVideoEvent = new PreviewPlayerEvent(this, &PreviewPlayer::onVideoEvent); 198643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi mVideoEventPending = false; 199643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi mStreamDoneEvent = new PreviewPlayerEvent(this, 2001c97d9ab52a288d24ea54499de435277cc1a3d68Rajneesh Chowdury &PreviewPlayer::onStreamDone); 201643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi 202643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi mStreamDoneEventPending = false; 203643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi 204643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi mCheckAudioStatusEvent = new PreviewPlayerEvent( 205e6c0750cd2927967f93a8811954f889d23fadb6eDharmaray Kundargi this, &AwesomePlayer::onCheckAudioStatus); 206643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi 207643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi mAudioStatusEventPending = false; 208643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi 209643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi mProgressCbEvent = new PreviewPlayerEvent(this, 210e6c0750cd2927967f93a8811954f889d23fadb6eDharmaray Kundargi &PreviewPlayer::onProgressCbEvent); 211643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi 212e6c0750cd2927967f93a8811954f889d23fadb6eDharmaray Kundargi mOverlayUpdateEvent = new PreviewPlayerEvent(this, 213e6c0750cd2927967f93a8811954f889d23fadb6eDharmaray Kundargi &PreviewPlayer::onUpdateOverlayEvent); 214643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi mProgressCbEventPending = false; 215e6c0750cd2927967f93a8811954f889d23fadb6eDharmaray Kundargi 216e6c0750cd2927967f93a8811954f889d23fadb6eDharmaray Kundargi mOverlayUpdateEventPending = false; 217643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi mResizedVideoBuffer = NULL; 218643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi mVideoResizedOrCropped = false; 219643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi mRenderingMode = (M4xVSS_MediaRendering)MEDIA_RENDERING_INVALID; 220643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi mIsFiftiesEffectStarted = false; 221643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi reset(); 222643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi} 223643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi 224643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray KundargiPreviewPlayer::~PreviewPlayer() { 225643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi 226643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi if (mQueueStarted) { 227643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi mQueue.stop(); 228643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi } 229643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi 230643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi reset(); 231643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi 232643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi if(mResizedVideoBuffer != NULL) { 233643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi M4OSA_free((M4OSA_MemAddr32)(mResizedVideoBuffer->data())); 234643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi mResizedVideoBuffer = NULL; 235643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi } 236643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi 237643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi mVideoRenderer.clear(); 238643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi mVideoRenderer = NULL; 239643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi} 240643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi 241643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargivoid PreviewPlayer::cancelPlayerEvents(bool keepBufferingGoing) { 242643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi mQueue.cancelEvent(mVideoEvent->eventID()); 243643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi mVideoEventPending = false; 244643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi mQueue.cancelEvent(mStreamDoneEvent->eventID()); 245643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi mStreamDoneEventPending = false; 246643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi mQueue.cancelEvent(mCheckAudioStatusEvent->eventID()); 247643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi mAudioStatusEventPending = false; 248643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi 249643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi mQueue.cancelEvent(mProgressCbEvent->eventID()); 250643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi mProgressCbEventPending = false; 251643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi} 252643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi 253643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargistatus_t PreviewPlayer::setDataSource( 254643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi const char *uri, const KeyedVector<String8, String8> *headers) { 255643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi Mutex::Autolock autoLock(mLock); 256643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi return setDataSource_l(uri, headers); 257643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi} 258643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi 259643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargistatus_t PreviewPlayer::setDataSource_l( 260643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi const char *uri, const KeyedVector<String8, String8> *headers) { 261643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi reset_l(); 262643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi 263643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi mUri = uri; 264643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi 265643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi if (headers) { 266643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi mUriHeaders = *headers; 267643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi } 268643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi 269643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi // The actual work will be done during preparation in the call to 270643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi // ::finishSetDataSource_l to avoid blocking the calling thread in 271643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi // setDataSource for any significant time. 272643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi return OK; 273643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi} 274643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi 275643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargistatus_t PreviewPlayer::setDataSource_l(const sp<MediaExtractor> &extractor) { 276643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi bool haveAudio = false; 277643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi bool haveVideo = false; 278643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi for (size_t i = 0; i < extractor->countTracks(); ++i) { 279643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi sp<MetaData> meta = extractor->getTrackMetaData(i); 280643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi 281643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi const char *mime; 282643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi CHECK(meta->findCString(kKeyMIMEType, &mime)); 283643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi 284643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi if (!haveVideo && !strncasecmp(mime, "video/", 6)) { 285643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi setVideoSource(extractor->getTrack(i)); 286643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi haveVideo = true; 287643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi } else if (!haveAudio && !strncasecmp(mime, "audio/", 6)) { 288643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi setAudioSource(extractor->getTrack(i)); 289643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi haveAudio = true; 290643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi 291643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi if (!strcasecmp(mime, MEDIA_MIMETYPE_AUDIO_VORBIS)) { 292643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi // Only do this for vorbis audio, none of the other audio 293643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi // formats even support this ringtone specific hack and 294643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi // retrieving the metadata on some extractors may turn out 295643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi // to be very expensive. 296643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi sp<MetaData> fileMeta = extractor->getMetaData(); 297643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi int32_t loop; 298643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi if (fileMeta != NULL 299643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi && fileMeta->findInt32(kKeyAutoLoop, &loop) 300643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi && loop != 0) { 301643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi mFlags |= AUTO_LOOPING; 302643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi } 303643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi } 304643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi } 305643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi 306643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi if (haveAudio && haveVideo) { 307643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi break; 308643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi } 309643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi } 310643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi 311643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi /* Add the support for Dummy audio*/ 312643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi if( !haveAudio ){ 313643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi LOGV("PreviewPlayer: setDataSource_l Dummyaudiocreation started"); 314643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi 315643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi mAudioTrack = DummyAudioSource::Create(32000, 2, 20000, 316ebf40154a222c864a0aaf807702fc4eb6b9cf40fRaghavender Palla ((mPlayEndTimeMsec)*1000LL)); 317643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi LOGV("PreviewPlayer: setDataSource_l Dummyauiosource created"); 318643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi if(mAudioTrack != NULL) { 319643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi haveAudio = true; 320643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi } 321643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi } 322643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi 323643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi if (!haveAudio && !haveVideo) { 324643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi return UNKNOWN_ERROR; 325643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi } 326643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi 327643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi mExtractorFlags = extractor->flags(); 328643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi return OK; 329643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi} 330643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi 331643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargistatus_t PreviewPlayer::setDataSource_l_jpg() { 332643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi M4OSA_ERR err = M4NO_ERROR; 333643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi LOGV("PreviewPlayer: setDataSource_l_jpg started"); 334643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi 335643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi mAudioSource = DummyAudioSource::Create(32000, 2, 20000, 336ebf40154a222c864a0aaf807702fc4eb6b9cf40fRaghavender Palla ((mPlayEndTimeMsec)*1000LL)); 337643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi LOGV("PreviewPlayer: setDataSource_l_jpg Dummyaudiosource created"); 338643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi if(mAudioSource != NULL) { 339643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi setAudioSource(mAudioSource); 340643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi } 341643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi status_t error = mAudioSource->start(); 342643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi if (error != OK) { 343643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi LOGV("Error starting dummy audio source"); 344643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi mAudioSource.clear(); 345643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi return err; 346643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi } 347643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi 348ebf40154a222c864a0aaf807702fc4eb6b9cf40fRaghavender Palla mDurationUs = (mPlayEndTimeMsec - mPlayBeginTimeMsec)*1000LL; 349643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi 350643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi mVideoSource = DummyVideoSource::Create(mVideoWidth, mVideoHeight, 351643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi mDurationUs, mUri); 35235cb2de64cb6482a08f446e80733e7d344a0dcacDharmaray Kundargi mReportedWidth = mVideoWidth; 35335cb2de64cb6482a08f446e80733e7d344a0dcacDharmaray Kundargi mReportedHeight = mVideoHeight; 35435cb2de64cb6482a08f446e80733e7d344a0dcacDharmaray Kundargi 355643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi setVideoSource(mVideoSource); 356643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi status_t err1 = mVideoSource->start(); 357643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi if (err1 != OK) { 358643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi mVideoSource.clear(); 359643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi return err; 360643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi } 361643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi 362643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi mIsVideoSourceJpg = true; 363643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi return OK; 364643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi} 365643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi 366643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargivoid PreviewPlayer::reset() { 367643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi Mutex::Autolock autoLock(mLock); 368643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi reset_l(); 369643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi} 370643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi 371643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargivoid PreviewPlayer::reset_l() { 372643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi 373643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi if (mFlags & PREPARING) { 374643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi mFlags |= PREPARE_CANCELLED; 375643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi } 376643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi 377643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi while (mFlags & PREPARING) { 378643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi mPreparedCondition.wait(mLock); 379643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi } 380643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi 381643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi cancelPlayerEvents(); 382643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi mAudioTrack.clear(); 383643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi mVideoTrack.clear(); 384643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi 385643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi // Shutdown audio first, so that the respone to the reset request 386643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi // appears to happen instantaneously as far as the user is concerned 387643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi // If we did this later, audio would continue playing while we 388643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi // shutdown the video-related resources and the player appear to 389643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi // not be as responsive to a reset request. 390643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi if (mAudioPlayer == NULL && mAudioSource != NULL) { 391643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi // If we had an audio player, it would have effectively 392643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi // taken possession of the audio source and stopped it when 393643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi // _it_ is stopped. Otherwise this is still our responsibility. 394643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi mAudioSource->stop(); 395643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi } 396643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi mAudioSource.clear(); 397643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi 398643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi mTimeSource = NULL; 399643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi 4001c97d9ab52a288d24ea54499de435277cc1a3d68Rajneesh Chowdury //Single audio player instance used 4011c97d9ab52a288d24ea54499de435277cc1a3d68Rajneesh Chowdury //So donot delete it here 4021c97d9ab52a288d24ea54499de435277cc1a3d68Rajneesh Chowdury //It is deleted from PreviewController class 4031c97d9ab52a288d24ea54499de435277cc1a3d68Rajneesh Chowdury //delete mAudioPlayer; 404643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi mAudioPlayer = NULL; 405643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi 406643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi if (mLastVideoBuffer) { 407643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi mLastVideoBuffer->release(); 408643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi mLastVideoBuffer = NULL; 409643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi } 410643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi 411643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi if (mVideoBuffer) { 412643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi mVideoBuffer->release(); 413643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi mVideoBuffer = NULL; 414643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi } 415643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi 416643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi if (mVideoSource != NULL) { 417643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi mVideoSource->stop(); 418643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi 419643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi // The following hack is necessary to ensure that the OMX 420643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi // component is completely released by the time we may try 421643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi // to instantiate it again. 422643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi wp<MediaSource> tmp = mVideoSource; 423643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi mVideoSource.clear(); 424643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi while (tmp.promote() != NULL) { 425643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi usleep(1000); 426643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi } 427643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi IPCThreadState::self()->flushCommands(); 428643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi } 429643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi 430643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi mDurationUs = -1; 431643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi mFlags = 0; 432643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi mExtractorFlags = 0; 433643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi mVideoWidth = mVideoHeight = -1; 434643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi mTimeSourceDeltaUs = 0; 435643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi mVideoTimeUs = 0; 436643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi 437a5872f770c50da1db555d53e062a9896ea4321d5Andreas Huber mSeeking = NO_SEEK; 438643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi mSeekNotificationSent = false; 439643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi mSeekTimeUs = 0; 440643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi 441643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi mUri.setTo(""); 442643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi mUriHeaders.clear(); 443643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi 444643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi mFileSource.clear(); 445643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi 446643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi delete mSuspensionState; 447643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi mSuspensionState = NULL; 448643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi 449643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi mCurrentVideoEffect = VIDEO_EFFECT_NONE; 450643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi mIsVideoSourceJpg = false; 451643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi mFrameRGBBuffer = NULL; 452643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi if(mFrameYUVBuffer != NULL) { 453643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi M4OSA_free((M4OSA_MemAddr32)mFrameYUVBuffer); 454643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi mFrameYUVBuffer = NULL; 455643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi } 456643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi} 457643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi 458643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargistatus_t PreviewPlayer::play() { 459643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi Mutex::Autolock autoLock(mLock); 460643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi 461643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi mFlags &= ~CACHE_UNDERRUN; 462643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi 463643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi return play_l(); 464643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi} 465643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi 4665bc7fb407ce1bab13d4a4a67d34a1a3192ee3186Dheeraj Sharmastatus_t PreviewPlayer::startAudioPlayer_l() { 4675bc7fb407ce1bab13d4a4a67d34a1a3192ee3186Dheeraj Sharma CHECK(!(mFlags & AUDIO_RUNNING)); 4685bc7fb407ce1bab13d4a4a67d34a1a3192ee3186Dheeraj Sharma 4695bc7fb407ce1bab13d4a4a67d34a1a3192ee3186Dheeraj Sharma if (mAudioSource == NULL || mAudioPlayer == NULL) { 4705bc7fb407ce1bab13d4a4a67d34a1a3192ee3186Dheeraj Sharma return OK; 4715bc7fb407ce1bab13d4a4a67d34a1a3192ee3186Dheeraj Sharma } 4725bc7fb407ce1bab13d4a4a67d34a1a3192ee3186Dheeraj Sharma 4735bc7fb407ce1bab13d4a4a67d34a1a3192ee3186Dheeraj Sharma if (!(mFlags & AUDIOPLAYER_STARTED)) { 4745bc7fb407ce1bab13d4a4a67d34a1a3192ee3186Dheeraj Sharma mFlags |= AUDIOPLAYER_STARTED; 4755bc7fb407ce1bab13d4a4a67d34a1a3192ee3186Dheeraj Sharma 4765bc7fb407ce1bab13d4a4a67d34a1a3192ee3186Dheeraj Sharma // We've already started the MediaSource in order to enable 4775bc7fb407ce1bab13d4a4a67d34a1a3192ee3186Dheeraj Sharma // the prefetcher to read its data. 4785bc7fb407ce1bab13d4a4a67d34a1a3192ee3186Dheeraj Sharma status_t err = mVeAudioPlayer->start( 4795bc7fb407ce1bab13d4a4a67d34a1a3192ee3186Dheeraj Sharma true /* sourceAlreadyStarted */); 4805bc7fb407ce1bab13d4a4a67d34a1a3192ee3186Dheeraj Sharma 4815bc7fb407ce1bab13d4a4a67d34a1a3192ee3186Dheeraj Sharma if (err != OK) { 4825bc7fb407ce1bab13d4a4a67d34a1a3192ee3186Dheeraj Sharma notifyListener_l(MEDIA_ERROR, MEDIA_ERROR_UNKNOWN, err); 4835bc7fb407ce1bab13d4a4a67d34a1a3192ee3186Dheeraj Sharma return err; 4845bc7fb407ce1bab13d4a4a67d34a1a3192ee3186Dheeraj Sharma } 4855bc7fb407ce1bab13d4a4a67d34a1a3192ee3186Dheeraj Sharma } else { 4865bc7fb407ce1bab13d4a4a67d34a1a3192ee3186Dheeraj Sharma mVeAudioPlayer->resume(); 4875bc7fb407ce1bab13d4a4a67d34a1a3192ee3186Dheeraj Sharma } 4885bc7fb407ce1bab13d4a4a67d34a1a3192ee3186Dheeraj Sharma 4895bc7fb407ce1bab13d4a4a67d34a1a3192ee3186Dheeraj Sharma mFlags |= AUDIO_RUNNING; 4905bc7fb407ce1bab13d4a4a67d34a1a3192ee3186Dheeraj Sharma 4915bc7fb407ce1bab13d4a4a67d34a1a3192ee3186Dheeraj Sharma mWatchForAudioEOS = true; 4925bc7fb407ce1bab13d4a4a67d34a1a3192ee3186Dheeraj Sharma 4935bc7fb407ce1bab13d4a4a67d34a1a3192ee3186Dheeraj Sharma return OK; 4945bc7fb407ce1bab13d4a4a67d34a1a3192ee3186Dheeraj Sharma} 4955bc7fb407ce1bab13d4a4a67d34a1a3192ee3186Dheeraj Sharma 4961c97d9ab52a288d24ea54499de435277cc1a3d68Rajneesh Chowdurystatus_t PreviewPlayer::setAudioPlayer(AudioPlayer *audioPlayer) { 4971c97d9ab52a288d24ea54499de435277cc1a3d68Rajneesh Chowdury Mutex::Autolock autoLock(mLock); 4981c97d9ab52a288d24ea54499de435277cc1a3d68Rajneesh Chowdury CHECK(!(mFlags & PLAYING)); 4991c97d9ab52a288d24ea54499de435277cc1a3d68Rajneesh Chowdury mAudioPlayer = audioPlayer; 5001c97d9ab52a288d24ea54499de435277cc1a3d68Rajneesh Chowdury 5011c97d9ab52a288d24ea54499de435277cc1a3d68Rajneesh Chowdury LOGV("SetAudioPlayer"); 5021c97d9ab52a288d24ea54499de435277cc1a3d68Rajneesh Chowdury mIsChangeSourceRequired = true; 5031c97d9ab52a288d24ea54499de435277cc1a3d68Rajneesh Chowdury mVeAudioPlayer = 5041c97d9ab52a288d24ea54499de435277cc1a3d68Rajneesh Chowdury (VideoEditorAudioPlayer*)mAudioPlayer; 5051c97d9ab52a288d24ea54499de435277cc1a3d68Rajneesh Chowdury 5061c97d9ab52a288d24ea54499de435277cc1a3d68Rajneesh Chowdury // check if the new and old source are dummy 5071c97d9ab52a288d24ea54499de435277cc1a3d68Rajneesh Chowdury sp<MediaSource> anAudioSource = mVeAudioPlayer->getSource(); 5081c97d9ab52a288d24ea54499de435277cc1a3d68Rajneesh Chowdury if (anAudioSource == NULL) { 5091c97d9ab52a288d24ea54499de435277cc1a3d68Rajneesh Chowdury // Audio player does not have any source set. 5101c97d9ab52a288d24ea54499de435277cc1a3d68Rajneesh Chowdury LOGV("setAudioPlayer: Audio player does not have any source set"); 5111c97d9ab52a288d24ea54499de435277cc1a3d68Rajneesh Chowdury return OK; 5121c97d9ab52a288d24ea54499de435277cc1a3d68Rajneesh Chowdury } 5131c97d9ab52a288d24ea54499de435277cc1a3d68Rajneesh Chowdury 5149a8c9a848da5a4a06c5402d6716efa66b8818d37Rajneesh Chowdury // If new video source is not dummy, then always change source 5159a8c9a848da5a4a06c5402d6716efa66b8818d37Rajneesh Chowdury // Else audio player continues using old audio source and there are 5169a8c9a848da5a4a06c5402d6716efa66b8818d37Rajneesh Chowdury // frame drops to maintain AV sync 5179a8c9a848da5a4a06c5402d6716efa66b8818d37Rajneesh Chowdury sp<MetaData> meta; 5189a8c9a848da5a4a06c5402d6716efa66b8818d37Rajneesh Chowdury if (mVideoSource != NULL) { 5199a8c9a848da5a4a06c5402d6716efa66b8818d37Rajneesh Chowdury meta = mVideoSource->getFormat(); 5209a8c9a848da5a4a06c5402d6716efa66b8818d37Rajneesh Chowdury const char *pVidSrcType; 5219a8c9a848da5a4a06c5402d6716efa66b8818d37Rajneesh Chowdury if (meta->findCString(kKeyDecoderComponent, &pVidSrcType)) { 5229a8c9a848da5a4a06c5402d6716efa66b8818d37Rajneesh Chowdury if (strcmp(pVidSrcType, "DummyVideoSource") != 0) { 5239a8c9a848da5a4a06c5402d6716efa66b8818d37Rajneesh Chowdury LOGV(" Video clip with silent audio; need to change source"); 5249a8c9a848da5a4a06c5402d6716efa66b8818d37Rajneesh Chowdury return OK; 5259a8c9a848da5a4a06c5402d6716efa66b8818d37Rajneesh Chowdury } 5269a8c9a848da5a4a06c5402d6716efa66b8818d37Rajneesh Chowdury } 5279a8c9a848da5a4a06c5402d6716efa66b8818d37Rajneesh Chowdury } 5289a8c9a848da5a4a06c5402d6716efa66b8818d37Rajneesh Chowdury 5291c97d9ab52a288d24ea54499de435277cc1a3d68Rajneesh Chowdury const char *pSrcType1; 5301c97d9ab52a288d24ea54499de435277cc1a3d68Rajneesh Chowdury const char *pSrcType2; 5319a8c9a848da5a4a06c5402d6716efa66b8818d37Rajneesh Chowdury meta = anAudioSource->getFormat(); 5321c97d9ab52a288d24ea54499de435277cc1a3d68Rajneesh Chowdury 5331c97d9ab52a288d24ea54499de435277cc1a3d68Rajneesh Chowdury if (meta->findCString(kKeyDecoderComponent, &pSrcType1)) { 5341c97d9ab52a288d24ea54499de435277cc1a3d68Rajneesh Chowdury if (strcmp(pSrcType1, "DummyAudioSource") == 0) { 5351c97d9ab52a288d24ea54499de435277cc1a3d68Rajneesh Chowdury meta = mAudioSource->getFormat(); 5361c97d9ab52a288d24ea54499de435277cc1a3d68Rajneesh Chowdury if (meta->findCString(kKeyDecoderComponent, &pSrcType2)) { 5371c97d9ab52a288d24ea54499de435277cc1a3d68Rajneesh Chowdury if (strcmp(pSrcType2, "DummyAudioSource") == 0) { 5381c97d9ab52a288d24ea54499de435277cc1a3d68Rajneesh Chowdury mIsChangeSourceRequired = false; 5391c97d9ab52a288d24ea54499de435277cc1a3d68Rajneesh Chowdury // Just set the new play duration for the existing source 5401c97d9ab52a288d24ea54499de435277cc1a3d68Rajneesh Chowdury MediaSource *pMediaSrc = anAudioSource.get(); 5411c97d9ab52a288d24ea54499de435277cc1a3d68Rajneesh Chowdury DummyAudioSource *pDummyAudioSource = (DummyAudioSource*)pMediaSrc; 5421c97d9ab52a288d24ea54499de435277cc1a3d68Rajneesh Chowdury //Increment the duration of audio source 543ebf40154a222c864a0aaf807702fc4eb6b9cf40fRaghavender Palla pDummyAudioSource->setDuration( 544ebf40154a222c864a0aaf807702fc4eb6b9cf40fRaghavender Palla (int64_t)((mPlayEndTimeMsec)*1000LL)); 545b6e2b5cc5b71986b06cbd9c471b63eb5878a7aeaRajneesh Chowdury 546b6e2b5cc5b71986b06cbd9c471b63eb5878a7aeaRajneesh Chowdury // Stop the new audio source 547b6e2b5cc5b71986b06cbd9c471b63eb5878a7aeaRajneesh Chowdury // since we continue using old source 548b6e2b5cc5b71986b06cbd9c471b63eb5878a7aeaRajneesh Chowdury LOGV("setAudioPlayer: stop new audio source"); 549b6e2b5cc5b71986b06cbd9c471b63eb5878a7aeaRajneesh Chowdury mAudioSource->stop(); 5501c97d9ab52a288d24ea54499de435277cc1a3d68Rajneesh Chowdury } 5511c97d9ab52a288d24ea54499de435277cc1a3d68Rajneesh Chowdury } 5521c97d9ab52a288d24ea54499de435277cc1a3d68Rajneesh Chowdury } 5531c97d9ab52a288d24ea54499de435277cc1a3d68Rajneesh Chowdury } 5541c97d9ab52a288d24ea54499de435277cc1a3d68Rajneesh Chowdury 5551c97d9ab52a288d24ea54499de435277cc1a3d68Rajneesh Chowdury return OK; 5561c97d9ab52a288d24ea54499de435277cc1a3d68Rajneesh Chowdury} 5571c97d9ab52a288d24ea54499de435277cc1a3d68Rajneesh Chowdury 5581c97d9ab52a288d24ea54499de435277cc1a3d68Rajneesh Chowduryvoid PreviewPlayer::onStreamDone() { 5591c97d9ab52a288d24ea54499de435277cc1a3d68Rajneesh Chowdury // Posted whenever any stream finishes playing. 5601c97d9ab52a288d24ea54499de435277cc1a3d68Rajneesh Chowdury 5611c97d9ab52a288d24ea54499de435277cc1a3d68Rajneesh Chowdury Mutex::Autolock autoLock(mLock); 5621c97d9ab52a288d24ea54499de435277cc1a3d68Rajneesh Chowdury if (!mStreamDoneEventPending) { 5631c97d9ab52a288d24ea54499de435277cc1a3d68Rajneesh Chowdury return; 5641c97d9ab52a288d24ea54499de435277cc1a3d68Rajneesh Chowdury } 5651c97d9ab52a288d24ea54499de435277cc1a3d68Rajneesh Chowdury mStreamDoneEventPending = false; 5661c97d9ab52a288d24ea54499de435277cc1a3d68Rajneesh Chowdury 5671c97d9ab52a288d24ea54499de435277cc1a3d68Rajneesh Chowdury if (mStreamDoneStatus != ERROR_END_OF_STREAM) { 5681c97d9ab52a288d24ea54499de435277cc1a3d68Rajneesh Chowdury LOGV("MEDIA_ERROR %d", mStreamDoneStatus); 5691c97d9ab52a288d24ea54499de435277cc1a3d68Rajneesh Chowdury 5701c97d9ab52a288d24ea54499de435277cc1a3d68Rajneesh Chowdury notifyListener_l( 5711c97d9ab52a288d24ea54499de435277cc1a3d68Rajneesh Chowdury MEDIA_ERROR, MEDIA_ERROR_UNKNOWN, mStreamDoneStatus); 5721c97d9ab52a288d24ea54499de435277cc1a3d68Rajneesh Chowdury 5731c97d9ab52a288d24ea54499de435277cc1a3d68Rajneesh Chowdury pause_l(true /* at eos */); 5741c97d9ab52a288d24ea54499de435277cc1a3d68Rajneesh Chowdury 5751c97d9ab52a288d24ea54499de435277cc1a3d68Rajneesh Chowdury mFlags |= AT_EOS; 5761c97d9ab52a288d24ea54499de435277cc1a3d68Rajneesh Chowdury return; 5771c97d9ab52a288d24ea54499de435277cc1a3d68Rajneesh Chowdury } 5781c97d9ab52a288d24ea54499de435277cc1a3d68Rajneesh Chowdury 5791c97d9ab52a288d24ea54499de435277cc1a3d68Rajneesh Chowdury const bool allDone = 5801c97d9ab52a288d24ea54499de435277cc1a3d68Rajneesh Chowdury (mVideoSource == NULL || (mFlags & VIDEO_AT_EOS)) 5811c97d9ab52a288d24ea54499de435277cc1a3d68Rajneesh Chowdury && (mAudioSource == NULL || (mFlags & AUDIO_AT_EOS)); 5821c97d9ab52a288d24ea54499de435277cc1a3d68Rajneesh Chowdury 5831c97d9ab52a288d24ea54499de435277cc1a3d68Rajneesh Chowdury if (!allDone) { 5841c97d9ab52a288d24ea54499de435277cc1a3d68Rajneesh Chowdury return; 5851c97d9ab52a288d24ea54499de435277cc1a3d68Rajneesh Chowdury } 5861c97d9ab52a288d24ea54499de435277cc1a3d68Rajneesh Chowdury 5871c97d9ab52a288d24ea54499de435277cc1a3d68Rajneesh Chowdury if (mFlags & (LOOPING | AUTO_LOOPING)) { 5881c97d9ab52a288d24ea54499de435277cc1a3d68Rajneesh Chowdury seekTo_l(0); 5891c97d9ab52a288d24ea54499de435277cc1a3d68Rajneesh Chowdury 5901c97d9ab52a288d24ea54499de435277cc1a3d68Rajneesh Chowdury if (mVideoSource != NULL) { 5911c97d9ab52a288d24ea54499de435277cc1a3d68Rajneesh Chowdury postVideoEvent_l(); 5921c97d9ab52a288d24ea54499de435277cc1a3d68Rajneesh Chowdury } 5931c97d9ab52a288d24ea54499de435277cc1a3d68Rajneesh Chowdury } else { 5941c97d9ab52a288d24ea54499de435277cc1a3d68Rajneesh Chowdury LOGV("MEDIA_PLAYBACK_COMPLETE"); 5951c97d9ab52a288d24ea54499de435277cc1a3d68Rajneesh Chowdury //pause before sending event 5961c97d9ab52a288d24ea54499de435277cc1a3d68Rajneesh Chowdury pause_l(true /* at eos */); 5971c97d9ab52a288d24ea54499de435277cc1a3d68Rajneesh Chowdury notifyListener_l(MEDIA_PLAYBACK_COMPLETE); 5981c97d9ab52a288d24ea54499de435277cc1a3d68Rajneesh Chowdury 5991c97d9ab52a288d24ea54499de435277cc1a3d68Rajneesh Chowdury mFlags |= AT_EOS; 6001c97d9ab52a288d24ea54499de435277cc1a3d68Rajneesh Chowdury } 6011c97d9ab52a288d24ea54499de435277cc1a3d68Rajneesh Chowdury} 6021c97d9ab52a288d24ea54499de435277cc1a3d68Rajneesh Chowdury 6031c97d9ab52a288d24ea54499de435277cc1a3d68Rajneesh Chowdury 604643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargistatus_t PreviewPlayer::play_l() { 6055bc7fb407ce1bab13d4a4a67d34a1a3192ee3186Dheeraj Sharma 6068b95de2c4d57a0a07d7f4c59f2ddd52a140a361eRajneesh Chowdury mFlags &= ~SEEK_PREVIEW; 6078b95de2c4d57a0a07d7f4c59f2ddd52a140a361eRajneesh Chowdury 608643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi if (mFlags & PLAYING) { 609643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi return OK; 610643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi } 611643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi mStartNextPlayer = false; 612643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi 613643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi if (!(mFlags & PREPARED)) { 614643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi status_t err = prepare_l(); 615643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi 616643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi if (err != OK) { 617643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi return err; 618643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi } 619643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi } 620643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi 621643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi mFlags |= PLAYING; 622643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi mFlags |= FIRST_FRAME; 623643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi 624643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi bool deferredAudioSeek = false; 625643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi 626643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi if (mAudioSource != NULL) { 627643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi if (mAudioPlayer == NULL) { 628643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi if (mAudioSink != NULL) { 629643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi 630643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi mAudioPlayer = new VideoEditorAudioPlayer(mAudioSink, this); 6315bc7fb407ce1bab13d4a4a67d34a1a3192ee3186Dheeraj Sharma mVeAudioPlayer = 632643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi (VideoEditorAudioPlayer*)mAudioPlayer; 633643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi 634643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi mAudioPlayer->setSource(mAudioSource); 635643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi 6365bc7fb407ce1bab13d4a4a67d34a1a3192ee3186Dheeraj Sharma mVeAudioPlayer->setAudioMixSettings( 637643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi mPreviewPlayerAudioMixSettings); 638643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi 6395bc7fb407ce1bab13d4a4a67d34a1a3192ee3186Dheeraj Sharma mVeAudioPlayer->setAudioMixPCMFileHandle( 640643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi mAudioMixPCMFileHandle); 641643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi 6425bc7fb407ce1bab13d4a4a67d34a1a3192ee3186Dheeraj Sharma mVeAudioPlayer->setAudioMixStoryBoardSkimTimeStamp( 643643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi mAudioMixStoryBoardTS, mCurrentMediaBeginCutTime, 644643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi mCurrentMediaVolumeValue); 645643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi 6461c97d9ab52a288d24ea54499de435277cc1a3d68Rajneesh Chowdury mFlags |= AUDIOPLAYER_STARTED; 6471c97d9ab52a288d24ea54499de435277cc1a3d68Rajneesh Chowdury // We've already started the MediaSource in order to enable 6481c97d9ab52a288d24ea54499de435277cc1a3d68Rajneesh Chowdury // the prefetcher to read its data. 6491c97d9ab52a288d24ea54499de435277cc1a3d68Rajneesh Chowdury status_t err = mVeAudioPlayer->start( 6501c97d9ab52a288d24ea54499de435277cc1a3d68Rajneesh Chowdury true /* sourceAlreadyStarted */); 651643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi 6521c97d9ab52a288d24ea54499de435277cc1a3d68Rajneesh Chowdury if (err != OK) { 6531c97d9ab52a288d24ea54499de435277cc1a3d68Rajneesh Chowdury //delete mAudioPlayer; 6541c97d9ab52a288d24ea54499de435277cc1a3d68Rajneesh Chowdury mAudioPlayer = NULL; 6551c97d9ab52a288d24ea54499de435277cc1a3d68Rajneesh Chowdury 6561c97d9ab52a288d24ea54499de435277cc1a3d68Rajneesh Chowdury mFlags &= ~(PLAYING | FIRST_FRAME); 6571c97d9ab52a288d24ea54499de435277cc1a3d68Rajneesh Chowdury return err; 6581c97d9ab52a288d24ea54499de435277cc1a3d68Rajneesh Chowdury } 6591c97d9ab52a288d24ea54499de435277cc1a3d68Rajneesh Chowdury 6601c97d9ab52a288d24ea54499de435277cc1a3d68Rajneesh Chowdury mTimeSource = mVeAudioPlayer; 6611c97d9ab52a288d24ea54499de435277cc1a3d68Rajneesh Chowdury mFlags |= AUDIO_RUNNING; 662643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi deferredAudioSeek = true; 663643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi mWatchForAudioSeekComplete = false; 664643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi mWatchForAudioEOS = true; 665643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi } 6661c97d9ab52a288d24ea54499de435277cc1a3d68Rajneesh Chowdury } else { 6671c97d9ab52a288d24ea54499de435277cc1a3d68Rajneesh Chowdury mVeAudioPlayer = (VideoEditorAudioPlayer*)mAudioPlayer; 6681c97d9ab52a288d24ea54499de435277cc1a3d68Rajneesh Chowdury bool isAudioPlayerStarted = mVeAudioPlayer->isStarted(); 6695bc7fb407ce1bab13d4a4a67d34a1a3192ee3186Dheeraj Sharma 6701c97d9ab52a288d24ea54499de435277cc1a3d68Rajneesh Chowdury if (mIsChangeSourceRequired == true) { 6711c97d9ab52a288d24ea54499de435277cc1a3d68Rajneesh Chowdury LOGV("play_l: Change audio source required"); 672643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi 6731c97d9ab52a288d24ea54499de435277cc1a3d68Rajneesh Chowdury if (isAudioPlayerStarted == true) { 6741c97d9ab52a288d24ea54499de435277cc1a3d68Rajneesh Chowdury mVeAudioPlayer->pause(); 6751c97d9ab52a288d24ea54499de435277cc1a3d68Rajneesh Chowdury } 6765bc7fb407ce1bab13d4a4a67d34a1a3192ee3186Dheeraj Sharma 6771c97d9ab52a288d24ea54499de435277cc1a3d68Rajneesh Chowdury mVeAudioPlayer->setSource(mAudioSource); 6781c97d9ab52a288d24ea54499de435277cc1a3d68Rajneesh Chowdury mVeAudioPlayer->setObserver(this); 6791c97d9ab52a288d24ea54499de435277cc1a3d68Rajneesh Chowdury 6801c97d9ab52a288d24ea54499de435277cc1a3d68Rajneesh Chowdury mVeAudioPlayer->setAudioMixSettings( 6811c97d9ab52a288d24ea54499de435277cc1a3d68Rajneesh Chowdury mPreviewPlayerAudioMixSettings); 6821c97d9ab52a288d24ea54499de435277cc1a3d68Rajneesh Chowdury 6831c97d9ab52a288d24ea54499de435277cc1a3d68Rajneesh Chowdury mVeAudioPlayer->setAudioMixStoryBoardSkimTimeStamp( 6841c97d9ab52a288d24ea54499de435277cc1a3d68Rajneesh Chowdury mAudioMixStoryBoardTS, mCurrentMediaBeginCutTime, 6851c97d9ab52a288d24ea54499de435277cc1a3d68Rajneesh Chowdury mCurrentMediaVolumeValue); 6861c97d9ab52a288d24ea54499de435277cc1a3d68Rajneesh Chowdury 6871c97d9ab52a288d24ea54499de435277cc1a3d68Rajneesh Chowdury if (isAudioPlayerStarted == true) { 6881c97d9ab52a288d24ea54499de435277cc1a3d68Rajneesh Chowdury mVeAudioPlayer->resume(); 6891c97d9ab52a288d24ea54499de435277cc1a3d68Rajneesh Chowdury } else { 6901c97d9ab52a288d24ea54499de435277cc1a3d68Rajneesh Chowdury status_t err = OK; 6911c97d9ab52a288d24ea54499de435277cc1a3d68Rajneesh Chowdury err = mVeAudioPlayer->start(true); 6921c97d9ab52a288d24ea54499de435277cc1a3d68Rajneesh Chowdury if (err != OK) { 6931c97d9ab52a288d24ea54499de435277cc1a3d68Rajneesh Chowdury mAudioPlayer = NULL; 6941c97d9ab52a288d24ea54499de435277cc1a3d68Rajneesh Chowdury mVeAudioPlayer = NULL; 6951c97d9ab52a288d24ea54499de435277cc1a3d68Rajneesh Chowdury 6961c97d9ab52a288d24ea54499de435277cc1a3d68Rajneesh Chowdury mFlags &= ~(PLAYING | FIRST_FRAME); 6971c97d9ab52a288d24ea54499de435277cc1a3d68Rajneesh Chowdury return err; 6981c97d9ab52a288d24ea54499de435277cc1a3d68Rajneesh Chowdury } 6991c97d9ab52a288d24ea54499de435277cc1a3d68Rajneesh Chowdury } 7001c97d9ab52a288d24ea54499de435277cc1a3d68Rajneesh Chowdury } else { 7011c97d9ab52a288d24ea54499de435277cc1a3d68Rajneesh Chowdury LOGV("play_l: No Source change required"); 7021c97d9ab52a288d24ea54499de435277cc1a3d68Rajneesh Chowdury mVeAudioPlayer->setAudioMixStoryBoardSkimTimeStamp( 7031c97d9ab52a288d24ea54499de435277cc1a3d68Rajneesh Chowdury mAudioMixStoryBoardTS, mCurrentMediaBeginCutTime, 7041c97d9ab52a288d24ea54499de435277cc1a3d68Rajneesh Chowdury mCurrentMediaVolumeValue); 7051c97d9ab52a288d24ea54499de435277cc1a3d68Rajneesh Chowdury 7061c97d9ab52a288d24ea54499de435277cc1a3d68Rajneesh Chowdury mVeAudioPlayer->resume(); 7075bc7fb407ce1bab13d4a4a67d34a1a3192ee3186Dheeraj Sharma } 7081c97d9ab52a288d24ea54499de435277cc1a3d68Rajneesh Chowdury 7091c97d9ab52a288d24ea54499de435277cc1a3d68Rajneesh Chowdury mFlags |= AUDIOPLAYER_STARTED; 7101c97d9ab52a288d24ea54499de435277cc1a3d68Rajneesh Chowdury mFlags |= AUDIO_RUNNING; 7111c97d9ab52a288d24ea54499de435277cc1a3d68Rajneesh Chowdury mTimeSource = mVeAudioPlayer; 7121c97d9ab52a288d24ea54499de435277cc1a3d68Rajneesh Chowdury deferredAudioSeek = true; 7131c97d9ab52a288d24ea54499de435277cc1a3d68Rajneesh Chowdury mWatchForAudioSeekComplete = false; 7141c97d9ab52a288d24ea54499de435277cc1a3d68Rajneesh Chowdury mWatchForAudioEOS = true; 7155bc7fb407ce1bab13d4a4a67d34a1a3192ee3186Dheeraj Sharma } 716643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi } 717643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi 718643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi if (mTimeSource == NULL && mAudioPlayer == NULL) { 719643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi mTimeSource = &mSystemTimeSource; 720643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi } 721643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi 72253c567c3355255ed12dd9f5d5a1c58f821770329Dharmaray Kundargi // Set the seek option for Image source files and read. 72353c567c3355255ed12dd9f5d5a1c58f821770329Dharmaray Kundargi // This resets the timestamping for image play 72453c567c3355255ed12dd9f5d5a1c58f821770329Dharmaray Kundargi if (mIsVideoSourceJpg) { 72553c567c3355255ed12dd9f5d5a1c58f821770329Dharmaray Kundargi MediaSource::ReadOptions options; 72653c567c3355255ed12dd9f5d5a1c58f821770329Dharmaray Kundargi MediaBuffer *aLocalBuffer; 72753c567c3355255ed12dd9f5d5a1c58f821770329Dharmaray Kundargi options.setSeekTo(mSeekTimeUs); 72853c567c3355255ed12dd9f5d5a1c58f821770329Dharmaray Kundargi mVideoSource->read(&aLocalBuffer, &options); 7294ca3e5df4b809210b240cd7d0489922017d87a6dSantosh Madhava aLocalBuffer->release(); 73053c567c3355255ed12dd9f5d5a1c58f821770329Dharmaray Kundargi } 73153c567c3355255ed12dd9f5d5a1c58f821770329Dharmaray Kundargi 732643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi if (mVideoSource != NULL) { 733643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi // Kick off video playback 734643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi postVideoEvent_l(); 735643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi } 736643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi 737643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi if (deferredAudioSeek) { 738643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi // If there was a seek request while we were paused 739643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi // and we're just starting up again, honor the request now. 740643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi seekAudioIfNecessary_l(); 741643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi } 742643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi 743643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi if (mFlags & AT_EOS) { 744643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi // Legacy behaviour, if a stream finishes playing and then 745643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi // is started again, we play from the start... 746643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi seekTo_l(0); 747643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi } 748643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi 749643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi return OK; 750643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi} 751643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi 752643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi 753bfece17c8f63de4d4b686da50f8ecac2f6f8ec53Santosh Madhavastatus_t PreviewPlayer::initRenderer_l() { 754643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi if (mSurface != NULL || mISurface != NULL) { 755643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi sp<MetaData> meta = mVideoSource->getFormat(); 756643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi 757643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi int32_t format; 758643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi const char *component; 759643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi int32_t decodedWidth, decodedHeight; 760643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi CHECK(meta->findInt32(kKeyColorFormat, &format)); 761643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi CHECK(meta->findCString(kKeyDecoderComponent, &component)); 762643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi CHECK(meta->findInt32(kKeyWidth, &decodedWidth)); 763643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi CHECK(meta->findInt32(kKeyHeight, &decodedHeight)); 764643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi 765643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi // Must ensure that mVideoRenderer's destructor is actually executed 766643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi // before creating a new one. 767643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi IPCThreadState::self()->flushCommands(); 768643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi 769643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi // always use localrenderer since decoded buffers are modified 770643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi // by postprocessing module 771643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi // Other decoders are instantiated locally and as a consequence 772643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi // allocate their buffers in local address space. 773643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi if(mVideoRenderer == NULL) { 774643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi 775bfece17c8f63de4d4b686da50f8ecac2f6f8ec53Santosh Madhava mVideoRenderer = PreviewLocalRenderer:: initPreviewLocalRenderer ( 776643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi false, // previewOnly 777643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi (OMX_COLOR_FORMATTYPE)format, 778643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi mSurface, 779643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi mOutputVideoWidth, mOutputVideoHeight, 780643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi mOutputVideoWidth, mOutputVideoHeight); 781bfece17c8f63de4d4b686da50f8ecac2f6f8ec53Santosh Madhava 782bfece17c8f63de4d4b686da50f8ecac2f6f8ec53Santosh Madhava if ( mVideoRenderer == NULL ) 783bfece17c8f63de4d4b686da50f8ecac2f6f8ec53Santosh Madhava { 784bfece17c8f63de4d4b686da50f8ecac2f6f8ec53Santosh Madhava return UNKNOWN_ERROR; 785bfece17c8f63de4d4b686da50f8ecac2f6f8ec53Santosh Madhava } 786bfece17c8f63de4d4b686da50f8ecac2f6f8ec53Santosh Madhava return OK; 787643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi } 788643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi } 789bfece17c8f63de4d4b686da50f8ecac2f6f8ec53Santosh Madhava return OK; 790643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi} 791643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi 792643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi 793643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargivoid PreviewPlayer::setISurface(const sp<ISurface> &isurface) { 794643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi Mutex::Autolock autoLock(mLock); 795643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi mISurface = isurface; 796643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi} 797643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi 798643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi 799643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargistatus_t PreviewPlayer::seekTo(int64_t timeUs) { 800643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi 801643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi if ((mExtractorFlags & MediaExtractor::CAN_SEEK) || (mIsVideoSourceJpg)) { 802643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi Mutex::Autolock autoLock(mLock); 803643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi return seekTo_l(timeUs); 804643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi } 805643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi 806643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi return OK; 807643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi} 808643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi 809643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi 810643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargistatus_t PreviewPlayer::getVideoDimensions( 811643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi int32_t *width, int32_t *height) const { 812643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi Mutex::Autolock autoLock(mLock); 813643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi 814643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi if (mVideoWidth < 0 || mVideoHeight < 0) { 815643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi return UNKNOWN_ERROR; 816643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi } 817643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi 818643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi *width = mVideoWidth; 819643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi *height = mVideoHeight; 820643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi 821643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi return OK; 822643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi} 823643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi 824643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi 825643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargistatus_t PreviewPlayer::initAudioDecoder() { 826643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi sp<MetaData> meta = mAudioTrack->getFormat(); 827643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi const char *mime; 828643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi CHECK(meta->findCString(kKeyMIMEType, &mime)); 829643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi 830643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi if (!strcasecmp(mime, MEDIA_MIMETYPE_AUDIO_RAW)) { 831643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi mAudioSource = mAudioTrack; 832643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi } else { 833643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi sp<MediaSource> aRawSource; 834643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi aRawSource = OMXCodec::Create( 835643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi mClient.interface(), mAudioTrack->getFormat(), 836643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi false, // createEncoder 837643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi mAudioTrack); 838643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi 839643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi if(aRawSource != NULL) { 840643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi LOGV("initAudioDecoder: new VideoEditorSRC"); 841643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi mAudioSource = new VideoEditorSRC(aRawSource); 842643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi } 843643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi } 844643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi 845643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi if (mAudioSource != NULL) { 846643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi int64_t durationUs; 847643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi if (mAudioTrack->getFormat()->findInt64(kKeyDuration, &durationUs)) { 848643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi Mutex::Autolock autoLock(mMiscStateLock); 849643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi if (mDurationUs < 0 || durationUs > mDurationUs) { 850643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi mDurationUs = durationUs; 851643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi } 852643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi } 853643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi status_t err = mAudioSource->start(); 854643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi 855643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi if (err != OK) { 856643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi mAudioSource.clear(); 857643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi return err; 858643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi } 859643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi } else if (!strcasecmp(mime, MEDIA_MIMETYPE_AUDIO_QCELP)) { 860643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi // For legacy reasons we're simply going to ignore the absence 861643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi // of an audio decoder for QCELP instead of aborting playback 862643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi // altogether. 863643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi return OK; 864643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi } 865643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi 866643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi return mAudioSource != NULL ? OK : UNKNOWN_ERROR; 867643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi} 868643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi 869643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi 870643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargistatus_t PreviewPlayer::initVideoDecoder(uint32_t flags) { 871643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi 872643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi mVideoSource = OMXCodec::Create( 873643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi mClient.interface(), mVideoTrack->getFormat(), 874643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi false, 875643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi mVideoTrack, 876643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi NULL, flags); 877643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi 878643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi if (mVideoSource != NULL) { 879643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi int64_t durationUs; 880643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi if (mVideoTrack->getFormat()->findInt64(kKeyDuration, &durationUs)) { 881643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi Mutex::Autolock autoLock(mMiscStateLock); 882643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi if (mDurationUs < 0 || durationUs > mDurationUs) { 883643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi mDurationUs = durationUs; 884643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi } 885643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi } 886643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi 887643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi CHECK(mVideoTrack->getFormat()->findInt32(kKeyWidth, &mVideoWidth)); 888643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi CHECK(mVideoTrack->getFormat()->findInt32(kKeyHeight, &mVideoHeight)); 889643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi 89035cb2de64cb6482a08f446e80733e7d344a0dcacDharmaray Kundargi mReportedWidth = mVideoWidth; 89135cb2de64cb6482a08f446e80733e7d344a0dcacDharmaray Kundargi mReportedHeight = mVideoHeight; 89235cb2de64cb6482a08f446e80733e7d344a0dcacDharmaray Kundargi 893643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi status_t err = mVideoSource->start(); 894643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi 895643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi if (err != OK) { 896643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi mVideoSource.clear(); 897643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi return err; 898643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi } 899643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi } 900643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi 901643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi return mVideoSource != NULL ? OK : UNKNOWN_ERROR; 902643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi} 903643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi 904643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi 905643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargivoid PreviewPlayer::onVideoEvent() { 906643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi uint32_t i=0; 907643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi bool bAppliedVideoEffect = false; 908643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi M4OSA_ERR err1 = M4NO_ERROR; 909643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi int64_t imageFrameTimeUs = 0; 910643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi 911643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi Mutex::Autolock autoLock(mLock); 912643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi if (!mVideoEventPending) { 913643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi // The event has been cancelled in reset_l() but had already 914643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi // been scheduled for execution at that time. 915643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi return; 916643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi } 917643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi mVideoEventPending = false; 918643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi 9199e4c36a044e264c644d7fa9f9894659a6fc47a6fAndreas Huber if (mFlags & SEEK_PREVIEW) { 9209e4c36a044e264c644d7fa9f9894659a6fc47a6fAndreas Huber mFlags &= ~SEEK_PREVIEW; 9219e4c36a044e264c644d7fa9f9894659a6fc47a6fAndreas Huber return; 9229e4c36a044e264c644d7fa9f9894659a6fc47a6fAndreas Huber } 9239e4c36a044e264c644d7fa9f9894659a6fc47a6fAndreas Huber 924643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi TimeSource *ts_st = &mSystemTimeSource; 925643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi int64_t timeStartUs = ts_st->getRealTimeUs(); 926643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi 927a5872f770c50da1db555d53e062a9896ea4321d5Andreas Huber if (mSeeking != NO_SEEK) { 928643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi if (mLastVideoBuffer) { 929643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi mLastVideoBuffer->release(); 930643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi mLastVideoBuffer = NULL; 931643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi } 932643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi 933643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi 934643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi if(mAudioSource != NULL) { 935643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi 936643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi // We're going to seek the video source first, followed by 937643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi // the audio source. 938643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi // In order to avoid jumps in the DataSource offset caused by 939643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi // the audio codec prefetching data from the old locations 940643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi // while the video codec is already reading data from the new 941643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi // locations, we'll "pause" the audio source, causing it to 942643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi // stop reading input data until a subsequent seek. 943643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi 9445bc7fb407ce1bab13d4a4a67d34a1a3192ee3186Dheeraj Sharma if (mAudioPlayer != NULL && (mFlags & AUDIO_RUNNING)) { 945643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi mAudioPlayer->pause(); 9465bc7fb407ce1bab13d4a4a67d34a1a3192ee3186Dheeraj Sharma mFlags &= ~AUDIO_RUNNING; 947643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi } 948643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi mAudioSource->pause(); 949643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi } 950643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi } 951643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi 952643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi if (!mVideoBuffer) { 953643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi MediaSource::ReadOptions options; 954a5872f770c50da1db555d53e062a9896ea4321d5Andreas Huber if (mSeeking != NO_SEEK) { 955643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi LOGV("LV PLAYER seeking to %lld us (%.2f secs)", mSeekTimeUs, 956643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi mSeekTimeUs / 1E6); 957643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi 958643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi options.setSeekTo( 959643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi mSeekTimeUs, MediaSource::ReadOptions::SEEK_CLOSEST); 960643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi } 961643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi for (;;) { 962643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi status_t err = mVideoSource->read(&mVideoBuffer, &options); 963643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi options.clearSeekTo(); 964643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi 965643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi if (err != OK) { 966643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi CHECK_EQ(mVideoBuffer, NULL); 967643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi 968643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi if (err == INFO_FORMAT_CHANGED) { 969643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi LOGV("LV PLAYER VideoSource signalled format change"); 970643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi notifyVideoSize_l(); 97135cb2de64cb6482a08f446e80733e7d344a0dcacDharmaray Kundargi sp<MetaData> meta = mVideoSource->getFormat(); 972643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi 97335cb2de64cb6482a08f446e80733e7d344a0dcacDharmaray Kundargi CHECK(meta->findInt32(kKeyWidth, &mReportedWidth)); 97435cb2de64cb6482a08f446e80733e7d344a0dcacDharmaray Kundargi CHECK(meta->findInt32(kKeyHeight, &mReportedHeight)); 975643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi if (mVideoRenderer != NULL) { 976643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi mVideoRendererIsPreview = false; 977bfece17c8f63de4d4b686da50f8ecac2f6f8ec53Santosh Madhava err = initRenderer_l(); 9784ca3e5df4b809210b240cd7d0489922017d87a6dSantosh Madhava if (err != OK) { 9794ca3e5df4b809210b240cd7d0489922017d87a6dSantosh Madhava postStreamDoneEvent_l(err); 9804ca3e5df4b809210b240cd7d0489922017d87a6dSantosh Madhava } 981bfece17c8f63de4d4b686da50f8ecac2f6f8ec53Santosh Madhava 982643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi } 983643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi continue; 984643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi } 985643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi // So video playback is complete, but we may still have 986342f932f6312be84a48512216b561ead42b53199Santosh Madhava // a seek request pending that needs to be applied to the audio track 987a5872f770c50da1db555d53e062a9896ea4321d5Andreas Huber if (mSeeking != NO_SEEK) { 988342f932f6312be84a48512216b561ead42b53199Santosh Madhava LOGV("video stream ended while seeking!"); 989342f932f6312be84a48512216b561ead42b53199Santosh Madhava } 990342f932f6312be84a48512216b561ead42b53199Santosh Madhava finishSeekIfNecessary(-1); 991643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi LOGV("PreviewPlayer: onVideoEvent EOS reached."); 992643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi mFlags |= VIDEO_AT_EOS; 9931c97d9ab52a288d24ea54499de435277cc1a3d68Rajneesh Chowdury mFlags |= AUDIO_AT_EOS; 9944f4efef8357f4d8b23ccfb1b29db34175bf72627Dheeraj Sharma mOverlayUpdateEventPosted = false; 995643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi postStreamDoneEvent_l(err); 996b2d6e0f74a12e5cce5b429e646172c63346346c3Santosh Madhava // Set the last decoded timestamp to duration 997ebf40154a222c864a0aaf807702fc4eb6b9cf40fRaghavender Palla mDecodedVideoTs = (mPlayEndTimeMsec*1000LL); 998643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi return; 999643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi } 1000643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi 1001643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi if (mVideoBuffer->range_length() == 0) { 1002643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi // Some decoders, notably the PV AVC software decoder 1003643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi // return spurious empty buffers that we just want to ignore. 1004643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi 1005643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi mVideoBuffer->release(); 1006643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi mVideoBuffer = NULL; 1007643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi continue; 1008643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi } 1009643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi 1010643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi int64_t videoTimeUs; 1011643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi CHECK(mVideoBuffer->meta_data()->findInt64(kKeyTime, &videoTimeUs)); 1012643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi 1013a5872f770c50da1db555d53e062a9896ea4321d5Andreas Huber if (mSeeking != NO_SEEK) { 1014b2d6e0f74a12e5cce5b429e646172c63346346c3Santosh Madhava if (videoTimeUs < mSeekTimeUs) { 1015b2d6e0f74a12e5cce5b429e646172c63346346c3Santosh Madhava // buffers are before seek time 1016b2d6e0f74a12e5cce5b429e646172c63346346c3Santosh Madhava // ignore them 1017b2d6e0f74a12e5cce5b429e646172c63346346c3Santosh Madhava mVideoBuffer->release(); 1018b2d6e0f74a12e5cce5b429e646172c63346346c3Santosh Madhava mVideoBuffer = NULL; 1019b2d6e0f74a12e5cce5b429e646172c63346346c3Santosh Madhava continue; 1020b2d6e0f74a12e5cce5b429e646172c63346346c3Santosh Madhava } 1021b2d6e0f74a12e5cce5b429e646172c63346346c3Santosh Madhava } else { 1022b2d6e0f74a12e5cce5b429e646172c63346346c3Santosh Madhava if((videoTimeUs/1000) < mPlayBeginTimeMsec) { 1023b2d6e0f74a12e5cce5b429e646172c63346346c3Santosh Madhava // Frames are before begin cut time 1024b2d6e0f74a12e5cce5b429e646172c63346346c3Santosh Madhava // Donot render 1025b2d6e0f74a12e5cce5b429e646172c63346346c3Santosh Madhava mVideoBuffer->release(); 1026b2d6e0f74a12e5cce5b429e646172c63346346c3Santosh Madhava mVideoBuffer = NULL; 1027b2d6e0f74a12e5cce5b429e646172c63346346c3Santosh Madhava continue; 1028b2d6e0f74a12e5cce5b429e646172c63346346c3Santosh Madhava } 1029643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi } 1030643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi break; 1031643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi } 1032643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi } 1033643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi 1034643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi mNumberDecVideoFrames++; 1035643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi 1036643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi int64_t timeUs; 1037643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi CHECK(mVideoBuffer->meta_data()->findInt64(kKeyTime, &timeUs)); 1038643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi 1039643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi { 1040643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi Mutex::Autolock autoLock(mMiscStateLock); 1041643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi mVideoTimeUs = timeUs; 1042643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi } 1043643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi 1044643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi 1045643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi if(!mStartNextPlayer) { 1046ebf40154a222c864a0aaf807702fc4eb6b9cf40fRaghavender Palla int64_t playbackTimeRemaining = (mPlayEndTimeMsec*1000LL) - timeUs; 1047643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi if(playbackTimeRemaining <= 1500000) { 1048643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi //When less than 1.5 sec of playback left 1049643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi // send notification to start next player 1050643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi 1051643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi mStartNextPlayer = true; 1052643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi notifyListener_l(0xAAAAAAAA); 1053643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi } 1054643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi } 1055643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi 1056a5872f770c50da1db555d53e062a9896ea4321d5Andreas Huber SeekType wasSeeking = mSeeking; 1057643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi finishSeekIfNecessary(timeUs); 10585bc7fb407ce1bab13d4a4a67d34a1a3192ee3186Dheeraj Sharma if (mAudioPlayer != NULL && !(mFlags & (AUDIO_RUNNING))) { 10595bc7fb407ce1bab13d4a4a67d34a1a3192ee3186Dheeraj Sharma status_t err = startAudioPlayer_l(); 10605bc7fb407ce1bab13d4a4a67d34a1a3192ee3186Dheeraj Sharma if (err != OK) { 10615bc7fb407ce1bab13d4a4a67d34a1a3192ee3186Dheeraj Sharma LOGE("Starting the audio player failed w/ err %d", err); 10625bc7fb407ce1bab13d4a4a67d34a1a3192ee3186Dheeraj Sharma return; 10635bc7fb407ce1bab13d4a4a67d34a1a3192ee3186Dheeraj Sharma } 10645bc7fb407ce1bab13d4a4a67d34a1a3192ee3186Dheeraj Sharma } 1065643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi 1066643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi TimeSource *ts = (mFlags & AUDIO_AT_EOS) ? &mSystemTimeSource : mTimeSource; 1067643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi 1068643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi if(ts == NULL) { 1069643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi mVideoBuffer->release(); 1070643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi mVideoBuffer = NULL; 1071643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi return; 1072643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi } 1073643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi 1074643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi if(!mIsVideoSourceJpg) { 1075643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi if (mFlags & FIRST_FRAME) { 1076643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi mFlags &= ~FIRST_FRAME; 1077643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi 1078643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi mTimeSourceDeltaUs = ts->getRealTimeUs() - timeUs; 1079643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi } 1080643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi 1081643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi int64_t realTimeUs, mediaTimeUs; 1082643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi if (!(mFlags & AUDIO_AT_EOS) && mAudioPlayer != NULL 1083643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi && mAudioPlayer->getMediaTimeMapping(&realTimeUs, &mediaTimeUs)) { 1084643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi mTimeSourceDeltaUs = realTimeUs - mediaTimeUs; 1085643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi } 1086643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi 1087643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi int64_t nowUs = ts->getRealTimeUs() - mTimeSourceDeltaUs; 1088643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi 1089643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi int64_t latenessUs = nowUs - timeUs; 1090643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi 1091a5872f770c50da1db555d53e062a9896ea4321d5Andreas Huber if (wasSeeking != NO_SEEK) { 1092342f932f6312be84a48512216b561ead42b53199Santosh Madhava // Let's display the first frame after seeking right away. 1093342f932f6312be84a48512216b561ead42b53199Santosh Madhava latenessUs = 0; 1094342f932f6312be84a48512216b561ead42b53199Santosh Madhava } 1095643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi LOGV("Audio time stamp = %lld and video time stamp = %lld", 1096643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi ts->getRealTimeUs(),timeUs); 1097643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi if (latenessUs > 40000) { 1098643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi // We're more than 40ms late. 1099643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi 1100643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi LOGV("LV PLAYER we're late by %lld us (%.2f secs)", 1101643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi latenessUs, latenessUs / 1E6); 1102643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi 1103643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi mVideoBuffer->release(); 1104643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi mVideoBuffer = NULL; 11054f155f0cffa2414545854e899dff4861187e1f68Dharmaray Kundargi postVideoEvent_l(0); 1106643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi return; 1107643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi } 1108643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi 11094f155f0cffa2414545854e899dff4861187e1f68Dharmaray Kundargi if (latenessUs < -25000) { 11104f155f0cffa2414545854e899dff4861187e1f68Dharmaray Kundargi // We're more than 25ms early. 11114f155f0cffa2414545854e899dff4861187e1f68Dharmaray Kundargi LOGV("We're more than 25ms early, lateness %lld", latenessUs); 1112643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi 11134f155f0cffa2414545854e899dff4861187e1f68Dharmaray Kundargi postVideoEvent_l(25000); 1114643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi return; 1115643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi } 1116643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi } 1117643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi 1118643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi if (mVideoRendererIsPreview || mVideoRenderer == NULL) { 1119643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi mVideoRendererIsPreview = false; 1120643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi 1121bfece17c8f63de4d4b686da50f8ecac2f6f8ec53Santosh Madhava status_t err = initRenderer_l(); 11224ca3e5df4b809210b240cd7d0489922017d87a6dSantosh Madhava if (err != OK) { 11234ca3e5df4b809210b240cd7d0489922017d87a6dSantosh Madhava postStreamDoneEvent_l(err); 11244ca3e5df4b809210b240cd7d0489922017d87a6dSantosh Madhava } 1125643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi } 1126643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi 1127643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi // If timestamp exceeds endCutTime of clip, donot render 1128643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi if((timeUs/1000) > mPlayEndTimeMsec) { 1129643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi if (mLastVideoBuffer) { 1130643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi mLastVideoBuffer->release(); 1131643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi mLastVideoBuffer = NULL; 1132643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi } 1133643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi mLastVideoBuffer = mVideoBuffer; 1134643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi mVideoBuffer = NULL; 1135643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi mFlags |= VIDEO_AT_EOS; 1136643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi mFlags |= AUDIO_AT_EOS; 1137bfece17c8f63de4d4b686da50f8ecac2f6f8ec53Santosh Madhava LOGV("PreviewPlayer: onVideoEvent timeUs > mPlayEndTime; send EOS.."); 11384f4efef8357f4d8b23ccfb1b29db34175bf72627Dheeraj Sharma mOverlayUpdateEventPosted = false; 1139fe288aa71450ebe04eb74d06a3ea887c6009aacbSantosh Madhava // Set the last decoded timestamp to duration 1140ebf40154a222c864a0aaf807702fc4eb6b9cf40fRaghavender Palla mDecodedVideoTs = (mPlayEndTimeMsec*1000LL); 1141643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi postStreamDoneEvent_l(ERROR_END_OF_STREAM); 1142643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi return; 1143643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi } 1144b2d6e0f74a12e5cce5b429e646172c63346346c3Santosh Madhava // Capture the frame timestamp to be rendered 1145b2d6e0f74a12e5cce5b429e646172c63346346c3Santosh Madhava mDecodedVideoTs = timeUs; 1146643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi 1147643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi // Post processing to apply video effects 1148643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi for(i=0;i<mNumberEffects;i++) { 1149643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi // First check if effect starttime matches the clip being previewed 1150643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi if((mEffectsSettings[i].uiStartTime < (mDecVideoTsStoryBoard/1000)) || 1151643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi (mEffectsSettings[i].uiStartTime >= 1152643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi ((mDecVideoTsStoryBoard/1000) + mPlayEndTimeMsec - mPlayBeginTimeMsec))) 1153643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi { 1154643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi // This effect doesn't belong to this clip, check next one 1155643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi continue; 1156643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi } 1157643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi // Check if effect applies to this particular frame timestamp 1158643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi if((mEffectsSettings[i].uiStartTime <= 1159643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi (((timeUs+mDecVideoTsStoryBoard)/1000)-mPlayBeginTimeMsec)) && 1160643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi ((mEffectsSettings[i].uiStartTime+mEffectsSettings[i].uiDuration) >= 1161643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi (((timeUs+mDecVideoTsStoryBoard)/1000)-mPlayBeginTimeMsec)) 1162643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi && (mEffectsSettings[i].uiDuration != 0)) { 1163643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi setVideoPostProcessingNode( 1164643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi mEffectsSettings[i].VideoEffectType, TRUE); 1165643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi } 1166643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi else { 1167643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi setVideoPostProcessingNode( 1168643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi mEffectsSettings[i].VideoEffectType, FALSE); 1169643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi } 1170e6c0750cd2927967f93a8811954f889d23fadb6eDharmaray Kundargi } 1171643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi 1172e6c0750cd2927967f93a8811954f889d23fadb6eDharmaray Kundargi //Provide the overlay Update indication when there is an overlay effect 1173d01ef568f96253fe5859526bb67b13fc5e17b544Dharmaray Kundargi if (mCurrentVideoEffect & VIDEO_EFFECT_FRAMING) { 1174d01ef568f96253fe5859526bb67b13fc5e17b544Dharmaray Kundargi mCurrentVideoEffect &= ~VIDEO_EFFECT_FRAMING; //never apply framing here. 1175e6c0750cd2927967f93a8811954f889d23fadb6eDharmaray Kundargi if (!mOverlayUpdateEventPosted) { 1176e6c0750cd2927967f93a8811954f889d23fadb6eDharmaray Kundargi // Find the effect in effectSettings array 1177408e25b2508d97f7ae0b39acf46ab42b7c223c44Basavapatna Dattaguru M4OSA_UInt32 index; 1178e6c0750cd2927967f93a8811954f889d23fadb6eDharmaray Kundargi for (index = 0; index < mNumberEffects; index++) { 1179e6c0750cd2927967f93a8811954f889d23fadb6eDharmaray Kundargi M4OSA_UInt32 timeMs = mDecodedVideoTs/1000; 1180e6c0750cd2927967f93a8811954f889d23fadb6eDharmaray Kundargi M4OSA_UInt32 timeOffset = mDecVideoTsStoryBoard/1000; 1181e6c0750cd2927967f93a8811954f889d23fadb6eDharmaray Kundargi if(mEffectsSettings[index].VideoEffectType == 1182408e25b2508d97f7ae0b39acf46ab42b7c223c44Basavapatna Dattaguru (M4VSS3GPP_VideoEffectType)M4xVSS_kVideoEffectType_Framing) { 1183254c8dfe514fd45eef251763639f63615379570fDharmaray Kundargi if (((mEffectsSettings[index].uiStartTime + 1) <= 1184254c8dfe514fd45eef251763639f63615379570fDharmaray Kundargi timeMs + timeOffset - mPlayBeginTimeMsec) && 1185e6c0750cd2927967f93a8811954f889d23fadb6eDharmaray Kundargi ((mEffectsSettings[index].uiStartTime - 1 + 1186254c8dfe514fd45eef251763639f63615379570fDharmaray Kundargi mEffectsSettings[index].uiDuration) >= 1187254c8dfe514fd45eef251763639f63615379570fDharmaray Kundargi timeMs + timeOffset - mPlayBeginTimeMsec)) 1188e6c0750cd2927967f93a8811954f889d23fadb6eDharmaray Kundargi { 1189e6c0750cd2927967f93a8811954f889d23fadb6eDharmaray Kundargi break; 1190e6c0750cd2927967f93a8811954f889d23fadb6eDharmaray Kundargi } 1191e6c0750cd2927967f93a8811954f889d23fadb6eDharmaray Kundargi } 1192e6c0750cd2927967f93a8811954f889d23fadb6eDharmaray Kundargi } 1193e6c0750cd2927967f93a8811954f889d23fadb6eDharmaray Kundargi if (index < mNumberEffects) { 1194e6c0750cd2927967f93a8811954f889d23fadb6eDharmaray Kundargi mCurrFramingEffectIndex = index; 1195e6c0750cd2927967f93a8811954f889d23fadb6eDharmaray Kundargi mOverlayUpdateEventPosted = true; 1196e6c0750cd2927967f93a8811954f889d23fadb6eDharmaray Kundargi postOverlayUpdateEvent_l(); 1197e6c0750cd2927967f93a8811954f889d23fadb6eDharmaray Kundargi LOGV("Framing index = %d", mCurrFramingEffectIndex); 1198e6c0750cd2927967f93a8811954f889d23fadb6eDharmaray Kundargi } else { 1199e6c0750cd2927967f93a8811954f889d23fadb6eDharmaray Kundargi LOGV("No framing effects found"); 1200e6c0750cd2927967f93a8811954f889d23fadb6eDharmaray Kundargi } 1201e6c0750cd2927967f93a8811954f889d23fadb6eDharmaray Kundargi } 1202e6c0750cd2927967f93a8811954f889d23fadb6eDharmaray Kundargi 1203e6c0750cd2927967f93a8811954f889d23fadb6eDharmaray Kundargi } else if (mOverlayUpdateEventPosted) { 1204e6c0750cd2927967f93a8811954f889d23fadb6eDharmaray Kundargi //Post the event when the overlay is no more valid 1205e6c0750cd2927967f93a8811954f889d23fadb6eDharmaray Kundargi LOGV("Overlay is Done"); 1206e6c0750cd2927967f93a8811954f889d23fadb6eDharmaray Kundargi mOverlayUpdateEventPosted = false; 1207e6c0750cd2927967f93a8811954f889d23fadb6eDharmaray Kundargi postOverlayUpdateEvent_l(); 1208643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi } 1209643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi 1210e6c0750cd2927967f93a8811954f889d23fadb6eDharmaray Kundargi 1211e6c0750cd2927967f93a8811954f889d23fadb6eDharmaray Kundargi if (mCurrentVideoEffect != VIDEO_EFFECT_NONE) { 1212643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi err1 = doVideoPostProcessing(); 1213643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi if(err1 != M4NO_ERROR) { 1214643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi LOGE("doVideoPostProcessing returned err"); 1215643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi bAppliedVideoEffect = false; 1216643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi } 1217643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi else { 1218643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi bAppliedVideoEffect = true; 1219643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi } 1220643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi } 1221643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi else { 1222643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi bAppliedVideoEffect = false; 1223643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi if(mRenderingMode != MEDIA_RENDERING_INVALID) { 1224643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi // No effects to be applied, but media rendering to be done 1225643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi err1 = doMediaRendering(); 1226643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi if(err1 != M4NO_ERROR) { 1227643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi LOGE("doMediaRendering returned err"); 1228643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi //Use original mVideoBuffer for rendering 1229643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi mVideoResizedOrCropped = false; 1230643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi } 1231643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi } 1232643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi } 1233643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi 1234643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi if (mVideoRenderer != NULL) { 1235643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi LOGV("mVideoRenderer CALL render()"); 1236643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi mVideoRenderer->render(); 1237643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi } 1238643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi 1239643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi if (mLastVideoBuffer) { 1240643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi mLastVideoBuffer->release(); 1241643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi mLastVideoBuffer = NULL; 1242643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi } 1243643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi 1244643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi mLastVideoBuffer = mVideoBuffer; 1245643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi mVideoBuffer = NULL; 1246643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi 1247643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi // Post progress callback based on callback interval set 1248643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi if(mNumberDecVideoFrames >= mProgressCbInterval) { 1249643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi postProgressCallbackEvent_l(); 1250643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi mNumberDecVideoFrames = 0; // reset counter 1251643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi } 1252643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi 1253643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi // if reached EndCutTime of clip, post EOS event 1254643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi if((timeUs/1000) >= mPlayEndTimeMsec) { 1255643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi LOGV("PreviewPlayer: onVideoEvent EOS."); 1256643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi mFlags |= VIDEO_AT_EOS; 1257643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi mFlags |= AUDIO_AT_EOS; 12584f4efef8357f4d8b23ccfb1b29db34175bf72627Dheeraj Sharma mOverlayUpdateEventPosted = false; 1259fe288aa71450ebe04eb74d06a3ea887c6009aacbSantosh Madhava // Set the last decoded timestamp to duration 1260ebf40154a222c864a0aaf807702fc4eb6b9cf40fRaghavender Palla mDecodedVideoTs = (mPlayEndTimeMsec*1000LL); 1261643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi postStreamDoneEvent_l(ERROR_END_OF_STREAM); 1262643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi } 1263643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi else { 1264a5872f770c50da1db555d53e062a9896ea4321d5Andreas Huber if ((wasSeeking != NO_SEEK) && (mFlags & SEEK_PREVIEW)) { 12651c97d9ab52a288d24ea54499de435277cc1a3d68Rajneesh Chowdury mFlags &= ~SEEK_PREVIEW; 12661c97d9ab52a288d24ea54499de435277cc1a3d68Rajneesh Chowdury return; 12671c97d9ab52a288d24ea54499de435277cc1a3d68Rajneesh Chowdury } 12681c97d9ab52a288d24ea54499de435277cc1a3d68Rajneesh Chowdury 1269643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi if(!mIsVideoSourceJpg) { 12704f155f0cffa2414545854e899dff4861187e1f68Dharmaray Kundargi postVideoEvent_l(0); 1271643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi } 1272643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi else { 1273643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi postVideoEvent_l(33000); 1274643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi } 1275643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi } 1276643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi} 1277643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi 1278643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargistatus_t PreviewPlayer::prepare() { 1279643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi Mutex::Autolock autoLock(mLock); 1280643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi return prepare_l(); 1281643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi} 1282643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi 1283643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargistatus_t PreviewPlayer::prepare_l() { 1284643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi if (mFlags & PREPARED) { 1285643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi return OK; 1286643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi } 1287643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi 1288643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi if (mFlags & PREPARING) { 1289643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi return UNKNOWN_ERROR; 1290643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi } 1291643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi 1292643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi mIsAsyncPrepare = false; 1293643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi status_t err = prepareAsync_l(); 1294643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi 1295643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi if (err != OK) { 1296643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi return err; 1297643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi } 1298643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi 1299643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi while (mFlags & PREPARING) { 1300643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi mPreparedCondition.wait(mLock); 1301643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi } 1302643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi 1303643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi return mPrepareResult; 1304643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi} 1305643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi 1306643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargistatus_t PreviewPlayer::prepareAsync_l() { 1307643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi if (mFlags & PREPARING) { 1308643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi return UNKNOWN_ERROR; // async prepare already pending 1309643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi } 1310643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi 1311643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi if (!mQueueStarted) { 1312643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi mQueue.start(); 1313643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi mQueueStarted = true; 1314643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi } 1315643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi 1316643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi mFlags |= PREPARING; 1317643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi mAsyncPrepareEvent = new PreviewPlayerEvent( 1318643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi this, &PreviewPlayer::onPrepareAsyncEvent); 1319643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi 1320643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi mQueue.postEvent(mAsyncPrepareEvent); 1321643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi 1322643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi return OK; 1323643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi} 1324643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi 1325643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargistatus_t PreviewPlayer::finishSetDataSource_l() { 1326643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi sp<DataSource> dataSource; 1327643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi sp<MediaExtractor> extractor; 1328643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi 1329643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi dataSource = DataSource::CreateFromURI(mUri.string(), &mUriHeaders); 1330643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi 1331643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi if (dataSource == NULL) { 1332643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi return UNKNOWN_ERROR; 1333643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi } 1334643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi 1335643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi //If file type is .rgb, then no need to check for Extractor 1336643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi int uriLen = strlen(mUri); 1337643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi int startOffset = uriLen - 4; 1338643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi if(!strncasecmp(mUri+startOffset, ".rgb", 4)) { 1339643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi extractor = NULL; 1340643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi } 1341643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi else { 1342643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi extractor = MediaExtractor::Create(dataSource, 1343643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi MEDIA_MIMETYPE_CONTAINER_MPEG4); 1344643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi } 1345643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi 1346643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi if (extractor == NULL) { 1347643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi LOGV("PreviewPlayer::finishSetDataSource_l extractor == NULL"); 1348643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi return setDataSource_l_jpg(); 1349643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi } 1350643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi 1351643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi return setDataSource_l(extractor); 1352643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi} 1353643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi 1354643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi 1355643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi// static 1356643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargibool PreviewPlayer::ContinuePreparation(void *cookie) { 1357643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi PreviewPlayer *me = static_cast<PreviewPlayer *>(cookie); 1358643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi 1359643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi return (me->mFlags & PREPARE_CANCELLED) == 0; 1360643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi} 1361643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi 1362643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargivoid PreviewPlayer::onPrepareAsyncEvent() { 1363643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi Mutex::Autolock autoLock(mLock); 1364643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi LOGV("onPrepareAsyncEvent"); 1365643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi 1366643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi if (mFlags & PREPARE_CANCELLED) { 1367bfece17c8f63de4d4b686da50f8ecac2f6f8ec53Santosh Madhava LOGV("LV PLAYER prepare was cancelled before doing anything"); 1368643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi abortPrepare(UNKNOWN_ERROR); 1369643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi return; 1370643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi } 1371643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi 1372643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi if (mUri.size() > 0) { 1373643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi status_t err = finishSetDataSource_l(); 1374643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi 1375643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi if (err != OK) { 1376643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi abortPrepare(err); 1377643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi return; 1378643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi } 1379643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi } 1380643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi 1381643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi if (mVideoTrack != NULL && mVideoSource == NULL) { 1382643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi status_t err = initVideoDecoder(OMXCodec::kHardwareCodecsOnly); 1383643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi 1384643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi if (err != OK) { 1385643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi abortPrepare(err); 1386643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi return; 1387643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi } 1388643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi } 1389643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi 1390643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi if (mAudioTrack != NULL && mAudioSource == NULL) { 1391643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi status_t err = initAudioDecoder(); 1392643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi 1393643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi if (err != OK) { 1394643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi abortPrepare(err); 1395643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi return; 1396643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi } 1397643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi } 1398643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi finishAsyncPrepare_l(); 1399643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi 1400643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi} 1401643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi 1402643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargivoid PreviewPlayer::finishAsyncPrepare_l() { 1403643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi if (mIsAsyncPrepare) { 1404643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi if (mVideoSource == NULL) { 1405643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi LOGV("finishAsyncPrepare_l: MEDIA_SET_VIDEO_SIZE 0 0 "); 1406643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi notifyListener_l(MEDIA_SET_VIDEO_SIZE, 0, 0); 1407643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi } else { 1408643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi LOGV("finishAsyncPrepare_l: MEDIA_SET_VIDEO_SIZE"); 1409643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi notifyVideoSize_l(); 1410643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi } 1411643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi LOGV("finishAsyncPrepare_l: MEDIA_PREPARED"); 1412643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi notifyListener_l(MEDIA_PREPARED); 1413643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi } 1414643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi 1415643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi mPrepareResult = OK; 1416643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi mFlags &= ~(PREPARING|PREPARE_CANCELLED); 1417643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi mFlags |= PREPARED; 1418643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi mAsyncPrepareEvent = NULL; 1419643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi mPreparedCondition.broadcast(); 1420643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi} 1421643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi 1422643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargistatus_t PreviewPlayer::suspend() { 1423643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi LOGV("suspend"); 1424643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi Mutex::Autolock autoLock(mLock); 1425643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi 1426643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi if (mSuspensionState != NULL) { 1427643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi if (mLastVideoBuffer == NULL) { 1428643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi //go into here if video is suspended again 1429643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi //after resuming without being played between 1430643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi //them 1431643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi SuspensionState *state = mSuspensionState; 1432643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi mSuspensionState = NULL; 1433643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi reset_l(); 1434643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi mSuspensionState = state; 1435643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi return OK; 1436643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi } 1437643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi 1438643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi delete mSuspensionState; 1439643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi mSuspensionState = NULL; 1440643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi } 1441643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi 1442643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi if (mFlags & PREPARING) { 1443643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi mFlags |= PREPARE_CANCELLED; 1444643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi } 1445643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi 1446643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi while (mFlags & PREPARING) { 1447643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi mPreparedCondition.wait(mLock); 1448643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi } 1449643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi 1450643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi SuspensionState *state = new SuspensionState; 1451643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi state->mUri = mUri; 1452643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi state->mUriHeaders = mUriHeaders; 1453643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi state->mFileSource = mFileSource; 1454643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi 1455643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi state->mFlags = mFlags & (PLAYING | AUTO_LOOPING | LOOPING | AT_EOS); 1456643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi getPosition(&state->mPositionUs); 1457643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi 1458643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi if (mLastVideoBuffer) { 1459643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi size_t size = mLastVideoBuffer->range_length(); 1460643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi if (size) { 1461643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi int32_t unreadable; 1462643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi if (!mLastVideoBuffer->meta_data()->findInt32( 1463643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi kKeyIsUnreadable, &unreadable) 1464643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi || unreadable == 0) { 1465643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi state->mLastVideoFrameSize = size; 1466643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi state->mLastVideoFrame = malloc(size); 1467643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi memcpy(state->mLastVideoFrame, 1468643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi (const uint8_t *)mLastVideoBuffer->data() 1469643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi + mLastVideoBuffer->range_offset(), 1470643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi size); 1471643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi 1472643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi state->mVideoWidth = mVideoWidth; 1473643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi state->mVideoHeight = mVideoHeight; 1474643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi 1475643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi sp<MetaData> meta = mVideoSource->getFormat(); 1476643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi CHECK(meta->findInt32(kKeyColorFormat, &state->mColorFormat)); 1477643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi CHECK(meta->findInt32(kKeyWidth, &state->mDecodedWidth)); 1478643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi CHECK(meta->findInt32(kKeyHeight, &state->mDecodedHeight)); 1479643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi } else { 1480643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi LOGV("Unable to save last video frame, we have no access to " 1481643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi "the decoded video data."); 1482643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi } 1483643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi } 1484643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi } 1485643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi 1486643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi reset_l(); 1487643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi 1488643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi mSuspensionState = state; 1489643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi 1490643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi return OK; 1491643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi} 1492643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi 1493643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargistatus_t PreviewPlayer::resume() { 1494643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi LOGV("resume"); 1495643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi Mutex::Autolock autoLock(mLock); 1496643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi 1497643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi if (mSuspensionState == NULL) { 1498643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi return INVALID_OPERATION; 1499643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi } 1500643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi 1501643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi SuspensionState *state = mSuspensionState; 1502643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi mSuspensionState = NULL; 1503643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi 1504643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi status_t err; 1505643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi if (state->mFileSource != NULL) { 1506643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi err = AwesomePlayer::setDataSource_l(state->mFileSource); 1507643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi 1508643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi if (err == OK) { 1509643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi mFileSource = state->mFileSource; 1510643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi } 1511643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi } else { 1512643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi err = AwesomePlayer::setDataSource_l(state->mUri, &state->mUriHeaders); 1513643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi } 1514643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi 1515643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi if (err != OK) { 1516643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi delete state; 1517643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi state = NULL; 1518643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi 1519643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi return err; 1520643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi } 1521643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi 1522643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi seekTo_l(state->mPositionUs); 1523643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi 1524643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi mFlags = state->mFlags & (AUTO_LOOPING | LOOPING | AT_EOS); 1525643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi 1526643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi if (state->mLastVideoFrame && (mSurface != NULL || mISurface != NULL)) { 1527643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi mVideoRenderer = 1528bfece17c8f63de4d4b686da50f8ecac2f6f8ec53Santosh Madhava PreviewLocalRenderer::initPreviewLocalRenderer( 1529643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi true, // previewOnly 1530643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi (OMX_COLOR_FORMATTYPE)state->mColorFormat, 1531643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi mSurface, 1532643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi state->mVideoWidth, 1533643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi state->mVideoHeight, 1534643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi state->mDecodedWidth, 1535643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi state->mDecodedHeight); 1536643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi 1537643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi mVideoRendererIsPreview = true; 1538643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi 1539643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi ((PreviewLocalRenderer *)mVideoRenderer.get())->render( 1540643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi state->mLastVideoFrame, state->mLastVideoFrameSize); 1541643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi } 1542643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi 1543643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi if (state->mFlags & PLAYING) { 1544643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi play_l(); 1545643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi } 1546643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi 1547643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi mSuspensionState = state; 1548643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi state = NULL; 1549643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi 1550643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi return OK; 1551643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi} 1552643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi 1553643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi 1554643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargistatus_t PreviewPlayer::loadEffectsSettings( 1555643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi M4VSS3GPP_EffectSettings* pEffectSettings, int nEffects) { 1556643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi M4OSA_UInt32 i = 0, rgbSize = 0; 1557643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi M4VIFI_UInt8 *tmp = M4OSA_NULL; 1558643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi 1559643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi mNumberEffects = nEffects; 1560643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi mEffectsSettings = pEffectSettings; 1561643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi return OK; 1562643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi} 1563643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi 1564643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargistatus_t PreviewPlayer::loadAudioMixSettings( 1565643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi M4xVSS_AudioMixingSettings* pAudioMixSettings) { 1566643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi 1567643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi LOGV("PreviewPlayer: loadAudioMixSettings: "); 1568643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi mPreviewPlayerAudioMixSettings = pAudioMixSettings; 1569643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi return OK; 1570643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi} 1571643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi 1572643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargistatus_t PreviewPlayer::setAudioMixPCMFileHandle( 1573643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi M4OSA_Context pAudioMixPCMFileHandle) { 1574643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi 1575643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi LOGV("PreviewPlayer: setAudioMixPCMFileHandle: "); 1576643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi mAudioMixPCMFileHandle = pAudioMixPCMFileHandle; 1577643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi return OK; 1578643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi} 1579643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi 1580643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargistatus_t PreviewPlayer::setAudioMixStoryBoardParam( 1581643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi M4OSA_UInt32 audioMixStoryBoardTS, 1582643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi M4OSA_UInt32 currentMediaBeginCutTime, 1583643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi M4OSA_UInt32 primaryTrackVolValue ) { 1584643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi 1585643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi mAudioMixStoryBoardTS = audioMixStoryBoardTS; 1586643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi mCurrentMediaBeginCutTime = currentMediaBeginCutTime; 1587643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi mCurrentMediaVolumeValue = primaryTrackVolValue; 1588643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi return OK; 1589643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi} 1590643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi 1591643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargistatus_t PreviewPlayer::setPlaybackBeginTime(uint32_t msec) { 1592643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi 1593643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi mPlayBeginTimeMsec = msec; 1594643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi return OK; 1595643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi} 1596643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi 1597643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargistatus_t PreviewPlayer::setPlaybackEndTime(uint32_t msec) { 1598643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi 1599643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi mPlayEndTimeMsec = msec; 1600643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi return OK; 1601643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi} 1602643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi 1603643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargistatus_t PreviewPlayer::setStoryboardStartTime(uint32_t msec) { 1604643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi 1605643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi mStoryboardStartTimeMsec = msec; 1606ebf40154a222c864a0aaf807702fc4eb6b9cf40fRaghavender Palla mDecVideoTsStoryBoard = mStoryboardStartTimeMsec*1000LL; 1607643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi return OK; 1608643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi} 1609643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi 1610643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargistatus_t PreviewPlayer::setProgressCallbackInterval(uint32_t cbInterval) { 1611643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi 1612643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi mProgressCbInterval = cbInterval; 1613643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi return OK; 1614643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi} 1615643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi 1616643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi 1617643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargistatus_t PreviewPlayer::setMediaRenderingMode( 1618643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi M4xVSS_MediaRendering mode, 1619643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi M4VIDEOEDITING_VideoFrameSize outputVideoSize) { 1620643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi 1621643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi mRenderingMode = mode; 1622643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi 1623643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi /* reset boolean for each clip*/ 1624643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi mVideoResizedOrCropped = false; 1625643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi 1626643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi switch(outputVideoSize) { 1627643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi case M4VIDEOEDITING_kSQCIF: 1628643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi mOutputVideoWidth = 128; 1629643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi mOutputVideoHeight = 96; 1630643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi break; 1631643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi 1632643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi case M4VIDEOEDITING_kQQVGA: 1633643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi mOutputVideoWidth = 160; 1634643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi mOutputVideoHeight = 120; 1635643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi break; 1636643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi 1637643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi case M4VIDEOEDITING_kQCIF: 1638643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi mOutputVideoWidth = 176; 1639643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi mOutputVideoHeight = 144; 1640643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi break; 1641643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi 1642643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi case M4VIDEOEDITING_kQVGA: 1643643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi mOutputVideoWidth = 320; 1644643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi mOutputVideoHeight = 240; 1645643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi break; 1646643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi 1647643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi case M4VIDEOEDITING_kCIF: 1648643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi mOutputVideoWidth = 352; 1649643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi mOutputVideoHeight = 288; 1650643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi break; 1651643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi 1652643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi case M4VIDEOEDITING_kVGA: 1653643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi mOutputVideoWidth = 640; 1654643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi mOutputVideoHeight = 480; 1655643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi break; 1656643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi 1657643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi case M4VIDEOEDITING_kWVGA: 1658643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi mOutputVideoWidth = 800; 1659643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi mOutputVideoHeight = 480; 1660643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi break; 1661643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi 1662643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi case M4VIDEOEDITING_kNTSC: 1663643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi mOutputVideoWidth = 720; 1664643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi mOutputVideoHeight = 480; 1665643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi break; 1666643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi 1667643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi case M4VIDEOEDITING_k640_360: 1668643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi mOutputVideoWidth = 640; 1669643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi mOutputVideoHeight = 360; 1670643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi break; 1671643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi 1672643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi case M4VIDEOEDITING_k854_480: 1673643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi mOutputVideoWidth = 854; 1674643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi mOutputVideoHeight = 480; 1675643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi break; 1676643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi 1677643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi case M4VIDEOEDITING_kHD1280: 1678643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi mOutputVideoWidth = 1280; 1679643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi mOutputVideoHeight = 720; 1680643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi break; 1681643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi 1682643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi case M4VIDEOEDITING_kHD1080: 1683643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi mOutputVideoWidth = 1080; 1684643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi mOutputVideoHeight = 720; 1685643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi break; 1686643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi 1687643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi case M4VIDEOEDITING_kHD960: 1688643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi mOutputVideoWidth = 960; 1689643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi mOutputVideoHeight = 720; 1690643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi break; 1691643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi 1692643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi default: 1693643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi LOGE("unsupported output video size set"); 1694643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi return BAD_VALUE; 1695643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi } 1696643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi 1697643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi return OK; 1698643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi} 1699643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi 1700643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray KundargiM4OSA_ERR PreviewPlayer::doMediaRendering() { 1701643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi M4OSA_ERR err = M4NO_ERROR; 1702643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi M4VIFI_ImagePlane planeIn[3], planeOut[3]; 1703643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi M4VIFI_UInt8 *inBuffer = M4OSA_NULL, *finalOutputBuffer = M4OSA_NULL; 1704643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi M4VIFI_UInt8 *tempOutputBuffer= M4OSA_NULL; 1705643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi size_t videoBufferSize = 0; 1706643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi M4OSA_UInt32 frameSize = 0, i=0, index =0, nFrameCount =0, bufferOffset =0; 1707643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi int32_t colorFormat = 0; 1708643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi 1709643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi if(!mIsVideoSourceJpg) { 1710643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi sp<MetaData> meta = mVideoSource->getFormat(); 1711643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi CHECK(meta->findInt32(kKeyColorFormat, &colorFormat)); 1712643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi } 1713643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi else { 1714643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi colorFormat = OMX_COLOR_FormatYUV420Planar; 1715643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi } 1716643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi 1717643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi videoBufferSize = mVideoBuffer->size(); 1718643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi frameSize = (mVideoWidth*mVideoHeight*3) >> 1; 1719643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi 1720643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi uint8_t* outBuffer; 1721643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi size_t outBufferStride = 0; 1722643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi 1723643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi mVideoRenderer->getBuffer(&outBuffer, &outBufferStride); 1724643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi 1725643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi bufferOffset = index*frameSize; 1726643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi inBuffer = (M4OSA_UInt8 *)mVideoBuffer->data()+ 1727643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi mVideoBuffer->range_offset()+bufferOffset; 1728643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi 1729643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi 1730643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi /* In plane*/ 1731643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi prepareYUV420ImagePlane(planeIn, mVideoWidth, 173235cb2de64cb6482a08f446e80733e7d344a0dcacDharmaray Kundargi mVideoHeight, (M4VIFI_UInt8 *)inBuffer, mReportedWidth, mReportedHeight); 1733643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi 1734643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi // Set the output YUV420 plane to be compatible with YV12 format 1735643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi // W & H even 1736643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi // YVU instead of YUV 1737643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi // align buffers on 32 bits 1738643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi 1739643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi //In YV12 format, sizes must be even 1740643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi M4OSA_UInt32 yv12PlaneWidth = ((mOutputVideoWidth +1)>>1)<<1; 1741643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi M4OSA_UInt32 yv12PlaneHeight = ((mOutputVideoHeight+1)>>1)<<1; 1742643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi 1743643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi prepareYV12ImagePlane(planeOut, yv12PlaneWidth, yv12PlaneHeight, 1744643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi (M4OSA_UInt32)outBufferStride, (M4VIFI_UInt8 *)outBuffer); 1745643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi 1746643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi 1747643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi err = applyRenderingMode(planeIn, planeOut, mRenderingMode); 1748643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi 1749643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi if(err != M4NO_ERROR) 1750643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi { 1751408e25b2508d97f7ae0b39acf46ab42b7c223c44Basavapatna Dattaguru LOGE("doMediaRendering: applyRenderingMode returned err=0x%x", (int)err); 1752643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi return err; 1753643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi } 1754643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi mVideoResizedOrCropped = true; 1755643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi 1756643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi return err; 1757643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi} 1758643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi 1759643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargistatus_t PreviewPlayer::resetJniCallbackTimeStamp() { 1760643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi 1761ebf40154a222c864a0aaf807702fc4eb6b9cf40fRaghavender Palla mDecVideoTsStoryBoard = mStoryboardStartTimeMsec*1000LL; 1762643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi return OK; 1763643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi} 1764643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi 1765643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargivoid PreviewPlayer::postProgressCallbackEvent_l() { 1766643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi if (mProgressCbEventPending) { 1767643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi return; 1768643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi } 1769643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi mProgressCbEventPending = true; 1770643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi 1771643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi mQueue.postEvent(mProgressCbEvent); 1772643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi} 1773643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi 1774e6c0750cd2927967f93a8811954f889d23fadb6eDharmaray Kundargi 1775643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargivoid PreviewPlayer::onProgressCbEvent() { 1776643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi Mutex::Autolock autoLock(mLock); 1777643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi if (!mProgressCbEventPending) { 1778643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi return; 1779643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi } 1780643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi mProgressCbEventPending = false; 1781643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi // If playback starts from previous I-frame, 1782643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi // then send frame storyboard duration 1783643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi if((mDecodedVideoTs/1000) < mPlayBeginTimeMsec) { 1784643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi notifyListener_l(MEDIA_INFO, 0, mDecVideoTsStoryBoard/1000); 1785643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi } 1786643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi else { 1787643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi notifyListener_l(MEDIA_INFO, 0, 1788643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi (((mDecodedVideoTs+mDecVideoTsStoryBoard)/1000)-mPlayBeginTimeMsec)); 1789643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi } 1790643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi} 1791643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi 1792e6c0750cd2927967f93a8811954f889d23fadb6eDharmaray Kundargivoid PreviewPlayer::postOverlayUpdateEvent_l() { 1793e6c0750cd2927967f93a8811954f889d23fadb6eDharmaray Kundargi if (mOverlayUpdateEventPending) { 1794e6c0750cd2927967f93a8811954f889d23fadb6eDharmaray Kundargi return; 1795e6c0750cd2927967f93a8811954f889d23fadb6eDharmaray Kundargi } 1796e6c0750cd2927967f93a8811954f889d23fadb6eDharmaray Kundargi mOverlayUpdateEventPending = true; 1797e6c0750cd2927967f93a8811954f889d23fadb6eDharmaray Kundargi mQueue.postEvent(mOverlayUpdateEvent); 1798e6c0750cd2927967f93a8811954f889d23fadb6eDharmaray Kundargi} 1799e6c0750cd2927967f93a8811954f889d23fadb6eDharmaray Kundargi 1800e6c0750cd2927967f93a8811954f889d23fadb6eDharmaray Kundargivoid PreviewPlayer::onUpdateOverlayEvent() { 1801e6c0750cd2927967f93a8811954f889d23fadb6eDharmaray Kundargi Mutex::Autolock autoLock(mLock); 1802e6c0750cd2927967f93a8811954f889d23fadb6eDharmaray Kundargi 1803e6c0750cd2927967f93a8811954f889d23fadb6eDharmaray Kundargi if (!mOverlayUpdateEventPending) { 1804e6c0750cd2927967f93a8811954f889d23fadb6eDharmaray Kundargi return; 1805e6c0750cd2927967f93a8811954f889d23fadb6eDharmaray Kundargi } 1806e6c0750cd2927967f93a8811954f889d23fadb6eDharmaray Kundargi mOverlayUpdateEventPending = false; 1807e6c0750cd2927967f93a8811954f889d23fadb6eDharmaray Kundargi 1808e6c0750cd2927967f93a8811954f889d23fadb6eDharmaray Kundargi int updateState; 1809e6c0750cd2927967f93a8811954f889d23fadb6eDharmaray Kundargi if (mOverlayUpdateEventPosted) { 1810e6c0750cd2927967f93a8811954f889d23fadb6eDharmaray Kundargi updateState = 1; 1811e6c0750cd2927967f93a8811954f889d23fadb6eDharmaray Kundargi } else { 1812e6c0750cd2927967f93a8811954f889d23fadb6eDharmaray Kundargi updateState = 0; 1813e6c0750cd2927967f93a8811954f889d23fadb6eDharmaray Kundargi } 1814e6c0750cd2927967f93a8811954f889d23fadb6eDharmaray Kundargi notifyListener_l(0xBBBBBBBB, updateState, mCurrFramingEffectIndex); 1815e6c0750cd2927967f93a8811954f889d23fadb6eDharmaray Kundargi} 1816e6c0750cd2927967f93a8811954f889d23fadb6eDharmaray Kundargi 1817e6c0750cd2927967f93a8811954f889d23fadb6eDharmaray Kundargi 1818643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargivoid PreviewPlayer::setVideoPostProcessingNode( 1819643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi M4VSS3GPP_VideoEffectType type, M4OSA_Bool enable) { 1820643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi 1821643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi uint32_t effect = VIDEO_EFFECT_NONE; 1822643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi 1823643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi //Map M4VSS3GPP_VideoEffectType to local enum 1824643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi switch(type) { 1825643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi case M4VSS3GPP_kVideoEffectType_FadeFromBlack: 1826643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi effect = VIDEO_EFFECT_FADEFROMBLACK; 1827643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi break; 1828643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi 1829643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi case M4VSS3GPP_kVideoEffectType_FadeToBlack: 1830643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi effect = VIDEO_EFFECT_FADETOBLACK; 1831643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi break; 1832643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi 1833643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi case M4VSS3GPP_kVideoEffectType_CurtainOpening: 1834643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi effect = VIDEO_EFFECT_CURTAINOPEN; 1835643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi break; 1836643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi 1837643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi case M4VSS3GPP_kVideoEffectType_CurtainClosing: 1838643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi effect = VIDEO_EFFECT_CURTAINCLOSE; 1839643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi break; 1840643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi 1841643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi case M4xVSS_kVideoEffectType_BlackAndWhite: 1842643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi effect = VIDEO_EFFECT_BLACKANDWHITE; 1843643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi break; 1844643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi 1845643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi case M4xVSS_kVideoEffectType_Pink: 1846643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi effect = VIDEO_EFFECT_PINK; 1847643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi break; 1848643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi 1849643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi case M4xVSS_kVideoEffectType_Green: 1850643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi effect = VIDEO_EFFECT_GREEN; 1851643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi break; 1852643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi 1853643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi case M4xVSS_kVideoEffectType_Sepia: 1854643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi effect = VIDEO_EFFECT_SEPIA; 1855643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi break; 1856643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi 1857643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi case M4xVSS_kVideoEffectType_Negative: 1858643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi effect = VIDEO_EFFECT_NEGATIVE; 1859643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi break; 1860643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi 1861643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi case M4xVSS_kVideoEffectType_Framing: 1862643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi effect = VIDEO_EFFECT_FRAMING; 1863643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi break; 1864643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi 1865643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi case M4xVSS_kVideoEffectType_Fifties: 1866643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi effect = VIDEO_EFFECT_FIFTIES; 1867643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi break; 1868643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi 1869643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi case M4xVSS_kVideoEffectType_ColorRGB16: 1870643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi effect = VIDEO_EFFECT_COLOR_RGB16; 1871643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi break; 1872643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi 1873643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi case M4xVSS_kVideoEffectType_Gradient: 1874643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi effect = VIDEO_EFFECT_GRADIENT; 1875643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi break; 1876643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi 1877643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi default: 1878643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi effect = VIDEO_EFFECT_NONE; 1879643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi break; 1880643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi } 1881643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi 1882643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi if(enable == M4OSA_TRUE) { 1883643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi //If already set, then no need to set again 1884643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi if(!(mCurrentVideoEffect & effect)) { 1885643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi mCurrentVideoEffect |= effect; 1886643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi if(effect == VIDEO_EFFECT_FIFTIES) { 1887643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi mIsFiftiesEffectStarted = true; 1888643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi } 1889643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi } 1890643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi } 1891643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi else { 1892643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi //Reset only if already set 1893643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi if(mCurrentVideoEffect & effect) { 1894643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi mCurrentVideoEffect &= ~effect; 1895643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi } 1896643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi } 1897643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi} 1898643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi 1899643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargistatus_t PreviewPlayer::setImageClipProperties(uint32_t width,uint32_t height) { 1900643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi mVideoWidth = width; 1901643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi mVideoHeight = height; 1902643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi return OK; 1903643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi} 1904643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi 1905643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi 1906643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray KundargiM4OSA_ERR PreviewPlayer::doVideoPostProcessing() { 1907643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi M4OSA_ERR err = M4NO_ERROR; 1908643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi vePostProcessParams postProcessParams; 1909643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi int32_t colorFormat = 0; 1910643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi 1911643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi 1912643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi if(!mIsVideoSourceJpg) { 1913643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi sp<MetaData> meta = mVideoSource->getFormat(); 1914643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi CHECK(meta->findInt32(kKeyColorFormat, &colorFormat)); 1915643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi } 1916643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi else { 1917643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi colorFormat = OMX_COLOR_FormatYUV420Planar; 1918643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi } 1919643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi 1920643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi if((colorFormat == OMX_COLOR_FormatYUV420SemiPlanar) || 1921643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi (colorFormat == 0x7FA30C00)) { 1922643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi LOGE("doVideoPostProcessing: colorFormat YUV420Sp not supported"); 1923643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi return M4ERR_UNSUPPORTED_MEDIA_TYPE; 1924643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi } 1925643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi 1926643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi postProcessParams.vidBuffer = (M4VIFI_UInt8*)mVideoBuffer->data() 1927643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi + mVideoBuffer->range_offset(); 1928643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi 1929643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi postProcessParams.videoWidth = mVideoWidth; 1930643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi postProcessParams.videoHeight = mVideoHeight; 1931643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi postProcessParams.timeMs = mDecodedVideoTs/1000; 1932643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi postProcessParams.timeOffset = mDecVideoTsStoryBoard/1000; 1933643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi postProcessParams.effectsSettings = mEffectsSettings; 1934643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi postProcessParams.numberEffects = mNumberEffects; 1935643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi postProcessParams.outVideoWidth = mOutputVideoWidth; 1936643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi postProcessParams.outVideoHeight = mOutputVideoHeight; 1937643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi postProcessParams.currentVideoEffect = mCurrentVideoEffect; 1938643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi postProcessParams.renderingMode = mRenderingMode; 1939643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi if(mIsFiftiesEffectStarted == M4OSA_TRUE) { 1940643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi postProcessParams.isFiftiesEffectStarted = M4OSA_TRUE; 1941643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi mIsFiftiesEffectStarted = M4OSA_FALSE; 1942643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi } 1943643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi else { 1944643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi postProcessParams.isFiftiesEffectStarted = M4OSA_FALSE; 1945643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi } 1946643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi 1947643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi postProcessParams.overlayFrameRGBBuffer = mFrameRGBBuffer; 1948643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi postProcessParams.overlayFrameYUVBuffer = mFrameYUVBuffer; 1949643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi mVideoRenderer->getBuffer(&(postProcessParams.pOutBuffer), &(postProcessParams.outBufferStride)); 195035cb2de64cb6482a08f446e80733e7d344a0dcacDharmaray Kundargi err = applyEffectsAndRenderingMode(&postProcessParams, mReportedWidth, mReportedHeight); 1951643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi 1952643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi return err; 1953643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi} 1954643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi 1955643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargistatus_t PreviewPlayer::readFirstVideoFrame() { 1956643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi LOGV("PreviewPlayer::readFirstVideoFrame"); 1957643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi 1958643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi if (!mVideoBuffer) { 1959643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi MediaSource::ReadOptions options; 1960a5872f770c50da1db555d53e062a9896ea4321d5Andreas Huber if (mSeeking != NO_SEEK) { 1961643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi LOGV("LV PLAYER seeking to %lld us (%.2f secs)", mSeekTimeUs, 1962643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi mSeekTimeUs / 1E6); 1963643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi 1964643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi options.setSeekTo( 1965643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi mSeekTimeUs, MediaSource::ReadOptions::SEEK_CLOSEST); 1966643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi } 1967643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi for (;;) { 1968643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi status_t err = mVideoSource->read(&mVideoBuffer, &options); 1969643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi options.clearSeekTo(); 1970643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi 1971643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi if (err != OK) { 1972643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi CHECK_EQ(mVideoBuffer, NULL); 1973643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi 1974643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi if (err == INFO_FORMAT_CHANGED) { 1975643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi LOGV("LV PLAYER VideoSource signalled format change"); 1976643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi notifyVideoSize_l(); 197735cb2de64cb6482a08f446e80733e7d344a0dcacDharmaray Kundargi sp<MetaData> meta = mVideoSource->getFormat(); 197835cb2de64cb6482a08f446e80733e7d344a0dcacDharmaray Kundargi 197935cb2de64cb6482a08f446e80733e7d344a0dcacDharmaray Kundargi CHECK(meta->findInt32(kKeyWidth, &mReportedWidth)); 198035cb2de64cb6482a08f446e80733e7d344a0dcacDharmaray Kundargi CHECK(meta->findInt32(kKeyHeight, &mReportedHeight)); 1981643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi 1982643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi if (mVideoRenderer != NULL) { 1983643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi mVideoRendererIsPreview = false; 1984bfece17c8f63de4d4b686da50f8ecac2f6f8ec53Santosh Madhava err = initRenderer_l(); 19854ca3e5df4b809210b240cd7d0489922017d87a6dSantosh Madhava if (err != OK) { 19864ca3e5df4b809210b240cd7d0489922017d87a6dSantosh Madhava postStreamDoneEvent_l(err); 19874ca3e5df4b809210b240cd7d0489922017d87a6dSantosh Madhava } 1988643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi } 1989643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi continue; 1990643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi } 1991643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi LOGV("PreviewPlayer: onVideoEvent EOS reached."); 1992643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi mFlags |= VIDEO_AT_EOS; 19931c97d9ab52a288d24ea54499de435277cc1a3d68Rajneesh Chowdury mFlags |= AUDIO_AT_EOS; 1994643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi postStreamDoneEvent_l(err); 1995643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi return OK; 1996643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi } 1997643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi 1998643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi if (mVideoBuffer->range_length() == 0) { 1999643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi // Some decoders, notably the PV AVC software decoder 2000643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi // return spurious empty buffers that we just want to ignore. 2001643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi 2002643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi mVideoBuffer->release(); 2003643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi mVideoBuffer = NULL; 2004643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi continue; 2005643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi } 2006643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi 2007643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi int64_t videoTimeUs; 2008643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi CHECK(mVideoBuffer->meta_data()->findInt64(kKeyTime, &videoTimeUs)); 2009a5872f770c50da1db555d53e062a9896ea4321d5Andreas Huber if (mSeeking != NO_SEEK) { 2010b2d6e0f74a12e5cce5b429e646172c63346346c3Santosh Madhava if (videoTimeUs < mSeekTimeUs) { 2011b2d6e0f74a12e5cce5b429e646172c63346346c3Santosh Madhava // buffers are before seek time 2012b2d6e0f74a12e5cce5b429e646172c63346346c3Santosh Madhava // ignore them 2013b2d6e0f74a12e5cce5b429e646172c63346346c3Santosh Madhava mVideoBuffer->release(); 2014b2d6e0f74a12e5cce5b429e646172c63346346c3Santosh Madhava mVideoBuffer = NULL; 2015b2d6e0f74a12e5cce5b429e646172c63346346c3Santosh Madhava continue; 2016b2d6e0f74a12e5cce5b429e646172c63346346c3Santosh Madhava } 2017b2d6e0f74a12e5cce5b429e646172c63346346c3Santosh Madhava } else { 2018b2d6e0f74a12e5cce5b429e646172c63346346c3Santosh Madhava if((videoTimeUs/1000) < mPlayBeginTimeMsec) { 2019b2d6e0f74a12e5cce5b429e646172c63346346c3Santosh Madhava // buffers are before begin cut time 2020b2d6e0f74a12e5cce5b429e646172c63346346c3Santosh Madhava // ignore them 2021b2d6e0f74a12e5cce5b429e646172c63346346c3Santosh Madhava mVideoBuffer->release(); 2022b2d6e0f74a12e5cce5b429e646172c63346346c3Santosh Madhava mVideoBuffer = NULL; 2023b2d6e0f74a12e5cce5b429e646172c63346346c3Santosh Madhava continue; 2024b2d6e0f74a12e5cce5b429e646172c63346346c3Santosh Madhava } 2025643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi } 2026643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi break; 2027643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi } 2028643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi } 2029643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi 2030643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi int64_t timeUs; 2031643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi CHECK(mVideoBuffer->meta_data()->findInt64(kKeyTime, &timeUs)); 2032643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi 2033643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi { 2034643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi Mutex::Autolock autoLock(mMiscStateLock); 2035643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi mVideoTimeUs = timeUs; 2036643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi } 2037643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi 2038643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi mDecodedVideoTs = timeUs; 2039643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi 2040643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi return OK; 2041643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi 2042643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi} 2043643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi 2044b2d6e0f74a12e5cce5b429e646172c63346346c3Santosh Madhavastatus_t PreviewPlayer::getLastRenderedTimeMs(uint32_t *lastRenderedTimeMs) { 2045b2d6e0f74a12e5cce5b429e646172c63346346c3Santosh Madhava *lastRenderedTimeMs = (((mDecodedVideoTs+mDecVideoTsStoryBoard)/1000)-mPlayBeginTimeMsec); 2046b2d6e0f74a12e5cce5b429e646172c63346346c3Santosh Madhava return OK; 2047b2d6e0f74a12e5cce5b429e646172c63346346c3Santosh Madhava} 2048b2d6e0f74a12e5cce5b429e646172c63346346c3Santosh Madhava 2049643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi} // namespace android 2050