PreviewPlayer.cpp revision 35cb2de64cb6482a08f446e80733e7d344a0dcac
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 18643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi#define LOG_NDEBUG 1 19643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi#define LOG_TAG "PreviewPlayer" 20643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi#include <utils/Log.h> 21643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi 22643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi#include <dlfcn.h> 23643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi 24643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi#include "include/ARTSPController.h" 25643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi#include "PreviewPlayer.h" 26643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi#include "DummyAudioSource.h" 27643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi#include "DummyVideoSource.h" 28643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi#include "VideoEditorSRC.h" 29643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi#include "include/LiveSession.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 { 78643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi PreviewLocalRenderer( 79643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi bool previewOnly, 80643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi OMX_COLOR_FORMATTYPE colorFormat, 81643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi const sp<Surface> &surface, 82643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi size_t displayWidth, size_t displayHeight, 83643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi size_t decodedWidth, size_t decodedHeight, 84643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi int32_t rotationDegrees = 0) 85643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi : mTarget(NULL) { 86643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi init(previewOnly, 87643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi colorFormat, surface, 88643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi displayWidth, displayHeight, 89643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi decodedWidth, decodedHeight, 90643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi rotationDegrees); 91643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi } 92643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi 93643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi virtual void render(MediaBuffer *buffer) { 94643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi render((const uint8_t *)buffer->data() + buffer->range_offset(), 95643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi buffer->range_length()); 96643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi } 97643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi 98643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi void render(const void *data, size_t size) { 99643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi mTarget->render(data, size, NULL); 100643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi } 101643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi void render() { 102643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi mTarget->renderYV12(); 103643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi } 104643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi void getBuffer(uint8_t **data, size_t *stride) { 105643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi mTarget->getBufferYV12(data, stride); 106643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi } 107643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi 108643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargiprotected: 109643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi virtual ~PreviewLocalRenderer() { 110643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi delete mTarget; 111643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi mTarget = NULL; 112643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi } 113643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi 114643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargiprivate: 115643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi PreviewRenderer *mTarget; 116643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi 117643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi void init( 118643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi bool previewOnly, 119643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi OMX_COLOR_FORMATTYPE colorFormat, 120643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi const sp<Surface> &surface, 121643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi size_t displayWidth, size_t displayHeight, 122643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi size_t decodedWidth, size_t decodedHeight, 123643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi int32_t rotationDegrees = 0); 124643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi 125643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi PreviewLocalRenderer(const PreviewLocalRenderer &); 126643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi PreviewLocalRenderer &operator=(const PreviewLocalRenderer &);; 127643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi}; 128643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi 129643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargivoid PreviewLocalRenderer::init( 130643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi bool previewOnly, 131643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi OMX_COLOR_FORMATTYPE colorFormat, 132643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi const sp<Surface> &surface, 133643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi size_t displayWidth, size_t displayHeight, 134643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi size_t decodedWidth, size_t decodedHeight, 135643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi int32_t rotationDegrees) { 136643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi mTarget = new PreviewRenderer( 137643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi colorFormat, surface, displayWidth, displayHeight, 138643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi decodedWidth, decodedHeight, rotationDegrees); 139643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi} 140643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi 141643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray KundargiPreviewPlayer::PreviewPlayer() 142643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi : AwesomePlayer(), 143643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi mFrameRGBBuffer(NULL), 14435cb2de64cb6482a08f446e80733e7d344a0dcacDharmaray Kundargi mFrameYUVBuffer(NULL), 14535cb2de64cb6482a08f446e80733e7d344a0dcacDharmaray Kundargi mReportedWidth(0), 14635cb2de64cb6482a08f446e80733e7d344a0dcacDharmaray Kundargi mReportedHeight(0) { 147643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi 148643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi mVideoRenderer = NULL; 149643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi mLastVideoBuffer = NULL; 150643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi mSuspensionState = NULL; 151643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi mEffectsSettings = NULL; 152643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi mAudioMixStoryBoardTS = 0; 153643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi mCurrentMediaBeginCutTime = 0; 154643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi mCurrentMediaVolumeValue = 0; 155643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi mNumberEffects = 0; 156643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi mDecodedVideoTs = 0; 157643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi mDecVideoTsStoryBoard = 0; 158643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi mCurrentVideoEffect = VIDEO_EFFECT_NONE; 159643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi mProgressCbInterval = 0; 160643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi mNumberDecVideoFrames = 0; 161643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi 162643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi mVideoEvent = new PreviewPlayerEvent(this, &PreviewPlayer::onVideoEvent); 163643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi mVideoEventPending = false; 164643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi mStreamDoneEvent = new PreviewPlayerEvent(this, 165643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi &AwesomePlayer::onStreamDone); 166643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi 167643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi mStreamDoneEventPending = false; 168643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi 169643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi mCheckAudioStatusEvent = new PreviewPlayerEvent( 170643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi this, &AwesomePlayer::onCheckAudioStatus); 171643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi 172643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi mAudioStatusEventPending = false; 173643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi 174643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi mProgressCbEvent = new PreviewPlayerEvent(this, 175643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi &PreviewPlayer::onProgressCbEvent); 176643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi 177643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi mProgressCbEventPending = false; 178643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi mResizedVideoBuffer = NULL; 179643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi mVideoResizedOrCropped = false; 180643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi mRenderingMode = (M4xVSS_MediaRendering)MEDIA_RENDERING_INVALID; 181643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi mIsFiftiesEffectStarted = false; 182643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi reset(); 183643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi} 184643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi 185643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray KundargiPreviewPlayer::~PreviewPlayer() { 186643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi 187643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi if (mQueueStarted) { 188643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi mQueue.stop(); 189643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi } 190643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi 191643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi reset(); 192643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi 193643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi if(mResizedVideoBuffer != NULL) { 194643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi M4OSA_free((M4OSA_MemAddr32)(mResizedVideoBuffer->data())); 195643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi mResizedVideoBuffer = NULL; 196643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi } 197643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi 198643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi mVideoRenderer.clear(); 199643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi mVideoRenderer = NULL; 200643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi} 201643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi 202643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargivoid PreviewPlayer::cancelPlayerEvents(bool keepBufferingGoing) { 203643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi mQueue.cancelEvent(mVideoEvent->eventID()); 204643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi mVideoEventPending = false; 205643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi mQueue.cancelEvent(mStreamDoneEvent->eventID()); 206643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi mStreamDoneEventPending = false; 207643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi mQueue.cancelEvent(mCheckAudioStatusEvent->eventID()); 208643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi mAudioStatusEventPending = false; 209643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi 210643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi mQueue.cancelEvent(mProgressCbEvent->eventID()); 211643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi mProgressCbEventPending = false; 212643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi} 213643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi 214643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargistatus_t PreviewPlayer::setDataSource( 215643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi const char *uri, const KeyedVector<String8, String8> *headers) { 216643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi Mutex::Autolock autoLock(mLock); 217643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi return setDataSource_l(uri, headers); 218643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi} 219643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi 220643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargistatus_t PreviewPlayer::setDataSource_l( 221643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi const char *uri, const KeyedVector<String8, String8> *headers) { 222643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi reset_l(); 223643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi 224643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi mUri = uri; 225643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi 226643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi if (headers) { 227643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi mUriHeaders = *headers; 228643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi } 229643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi 230643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi // The actual work will be done during preparation in the call to 231643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi // ::finishSetDataSource_l to avoid blocking the calling thread in 232643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi // setDataSource for any significant time. 233643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi return OK; 234643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi} 235643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi 236643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargistatus_t PreviewPlayer::setDataSource_l(const sp<MediaExtractor> &extractor) { 237643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi bool haveAudio = false; 238643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi bool haveVideo = false; 239643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi for (size_t i = 0; i < extractor->countTracks(); ++i) { 240643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi sp<MetaData> meta = extractor->getTrackMetaData(i); 241643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi 242643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi const char *mime; 243643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi CHECK(meta->findCString(kKeyMIMEType, &mime)); 244643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi 245643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi if (!haveVideo && !strncasecmp(mime, "video/", 6)) { 246643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi setVideoSource(extractor->getTrack(i)); 247643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi haveVideo = true; 248643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi } else if (!haveAudio && !strncasecmp(mime, "audio/", 6)) { 249643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi setAudioSource(extractor->getTrack(i)); 250643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi haveAudio = true; 251643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi 252643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi if (!strcasecmp(mime, MEDIA_MIMETYPE_AUDIO_VORBIS)) { 253643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi // Only do this for vorbis audio, none of the other audio 254643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi // formats even support this ringtone specific hack and 255643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi // retrieving the metadata on some extractors may turn out 256643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi // to be very expensive. 257643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi sp<MetaData> fileMeta = extractor->getMetaData(); 258643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi int32_t loop; 259643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi if (fileMeta != NULL 260643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi && fileMeta->findInt32(kKeyAutoLoop, &loop) 261643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi && loop != 0) { 262643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi mFlags |= AUTO_LOOPING; 263643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi } 264643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi } 265643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi } 266643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi 267643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi if (haveAudio && haveVideo) { 268643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi break; 269643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi } 270643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi } 271643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi 272643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi /* Add the support for Dummy audio*/ 273643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi if( !haveAudio ){ 274643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi LOGV("PreviewPlayer: setDataSource_l Dummyaudiocreation started"); 275643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi 276643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi mAudioTrack = DummyAudioSource::Create(32000, 2, 20000, 277643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi ((mPlayEndTimeMsec)*1000)); 278643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi LOGV("PreviewPlayer: setDataSource_l Dummyauiosource created"); 279643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi if(mAudioTrack != NULL) { 280643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi haveAudio = true; 281643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi } 282643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi } 283643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi 284643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi if (!haveAudio && !haveVideo) { 285643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi return UNKNOWN_ERROR; 286643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi } 287643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi 288643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi mExtractorFlags = extractor->flags(); 289643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi return OK; 290643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi} 291643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi 292643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargistatus_t PreviewPlayer::setDataSource_l_jpg() { 293643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi M4OSA_ERR err = M4NO_ERROR; 294643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi LOGV("PreviewPlayer: setDataSource_l_jpg started"); 295643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi 296643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi mAudioSource = DummyAudioSource::Create(32000, 2, 20000, 297643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi ((mPlayEndTimeMsec)*1000)); 298643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi LOGV("PreviewPlayer: setDataSource_l_jpg Dummyaudiosource created"); 299643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi if(mAudioSource != NULL) { 300643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi setAudioSource(mAudioSource); 301643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi } 302643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi status_t error = mAudioSource->start(); 303643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi if (error != OK) { 304643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi LOGV("Error starting dummy audio source"); 305643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi mAudioSource.clear(); 306643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi return err; 307643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi } 308643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi 309643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi mDurationUs = (mPlayEndTimeMsec - mPlayBeginTimeMsec)*1000; 310643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi 311643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi mVideoSource = DummyVideoSource::Create(mVideoWidth, mVideoHeight, 312643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi mDurationUs, mUri); 31335cb2de64cb6482a08f446e80733e7d344a0dcacDharmaray Kundargi mReportedWidth = mVideoWidth; 31435cb2de64cb6482a08f446e80733e7d344a0dcacDharmaray Kundargi mReportedHeight = mVideoHeight; 31535cb2de64cb6482a08f446e80733e7d344a0dcacDharmaray Kundargi 316643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi setVideoSource(mVideoSource); 317643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi status_t err1 = mVideoSource->start(); 318643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi if (err1 != OK) { 319643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi mVideoSource.clear(); 320643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi return err; 321643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi } 322643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi 323643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi mIsVideoSourceJpg = true; 324643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi return OK; 325643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi} 326643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi 327643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargivoid PreviewPlayer::reset() { 328643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi Mutex::Autolock autoLock(mLock); 329643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi reset_l(); 330643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi} 331643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi 332643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargivoid PreviewPlayer::reset_l() { 333643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi 334643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi if (mFlags & PREPARING) { 335643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi mFlags |= PREPARE_CANCELLED; 336643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi } 337643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi 338643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi while (mFlags & PREPARING) { 339643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi mPreparedCondition.wait(mLock); 340643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi } 341643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi 342643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi cancelPlayerEvents(); 343643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi mAudioTrack.clear(); 344643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi mVideoTrack.clear(); 345643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi 346643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi // Shutdown audio first, so that the respone to the reset request 347643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi // appears to happen instantaneously as far as the user is concerned 348643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi // If we did this later, audio would continue playing while we 349643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi // shutdown the video-related resources and the player appear to 350643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi // not be as responsive to a reset request. 351643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi if (mAudioPlayer == NULL && mAudioSource != NULL) { 352643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi // If we had an audio player, it would have effectively 353643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi // taken possession of the audio source and stopped it when 354643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi // _it_ is stopped. Otherwise this is still our responsibility. 355643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi mAudioSource->stop(); 356643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi } 357643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi mAudioSource.clear(); 358643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi 359643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi mTimeSource = NULL; 360643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi 361643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi delete mAudioPlayer; 362643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi mAudioPlayer = NULL; 363643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi 364643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi if (mLastVideoBuffer) { 365643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi mLastVideoBuffer->release(); 366643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi mLastVideoBuffer = NULL; 367643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi } 368643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi 369643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi if (mVideoBuffer) { 370643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi mVideoBuffer->release(); 371643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi mVideoBuffer = NULL; 372643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi } 373643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi 374643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi if (mVideoSource != NULL) { 375643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi mVideoSource->stop(); 376643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi 377643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi // The following hack is necessary to ensure that the OMX 378643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi // component is completely released by the time we may try 379643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi // to instantiate it again. 380643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi wp<MediaSource> tmp = mVideoSource; 381643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi mVideoSource.clear(); 382643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi while (tmp.promote() != NULL) { 383643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi usleep(1000); 384643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi } 385643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi IPCThreadState::self()->flushCommands(); 386643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi } 387643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi 388643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi mDurationUs = -1; 389643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi mFlags = 0; 390643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi mExtractorFlags = 0; 391643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi mVideoWidth = mVideoHeight = -1; 392643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi mTimeSourceDeltaUs = 0; 393643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi mVideoTimeUs = 0; 394643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi 395643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi mSeeking = false; 396643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi mSeekNotificationSent = false; 397643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi mSeekTimeUs = 0; 398643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi 399643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi mUri.setTo(""); 400643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi mUriHeaders.clear(); 401643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi 402643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi mFileSource.clear(); 403643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi 404643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi delete mSuspensionState; 405643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi mSuspensionState = NULL; 406643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi 407643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi mCurrentVideoEffect = VIDEO_EFFECT_NONE; 408643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi mIsVideoSourceJpg = false; 409643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi mFrameRGBBuffer = NULL; 410643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi if(mFrameYUVBuffer != NULL) { 411643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi M4OSA_free((M4OSA_MemAddr32)mFrameYUVBuffer); 412643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi mFrameYUVBuffer = NULL; 413643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi } 414643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi} 415643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi 416643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargivoid PreviewPlayer::partial_reset_l() { 417643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi 418643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi if (mLastVideoBuffer) { 419643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi mLastVideoBuffer->release(); 420643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi mLastVideoBuffer = NULL; 421643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi } 422643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi 423643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi /* call base struct */ 424643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi AwesomePlayer::partial_reset_l(); 425643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi 426643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi} 427643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi 428643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargistatus_t PreviewPlayer::play() { 429643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi Mutex::Autolock autoLock(mLock); 430643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi 431643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi mFlags &= ~CACHE_UNDERRUN; 432643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi 433643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi return play_l(); 434643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi} 435643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi 436643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargistatus_t PreviewPlayer::play_l() { 437643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray KundargiVideoEditorAudioPlayer *mVePlayer; 438643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi if (mFlags & PLAYING) { 439643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi return OK; 440643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi } 441643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi mStartNextPlayer = false; 442643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi 443643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi if (!(mFlags & PREPARED)) { 444643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi status_t err = prepare_l(); 445643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi 446643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi if (err != OK) { 447643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi return err; 448643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi } 449643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi } 450643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi 451643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi mFlags |= PLAYING; 452643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi mFlags |= FIRST_FRAME; 453643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi 454643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi bool deferredAudioSeek = false; 455643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi 456643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi if (mAudioSource != NULL) { 457643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi if (mAudioPlayer == NULL) { 458643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi if (mAudioSink != NULL) { 459643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi 460643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi mAudioPlayer = new VideoEditorAudioPlayer(mAudioSink, this); 461643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi mVePlayer = 462643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi (VideoEditorAudioPlayer*)mAudioPlayer; 463643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi 464643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi mAudioPlayer->setSource(mAudioSource); 465643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi 466643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi mVePlayer->setAudioMixSettings( 467643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi mPreviewPlayerAudioMixSettings); 468643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi 469643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi mVePlayer->setAudioMixPCMFileHandle( 470643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi mAudioMixPCMFileHandle); 471643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi 472643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi mVePlayer->setAudioMixStoryBoardSkimTimeStamp( 473643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi mAudioMixStoryBoardTS, mCurrentMediaBeginCutTime, 474643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi mCurrentMediaVolumeValue); 475643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi 476643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi // We've already started the MediaSource in order to enable 477643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi // the prefetcher to read its data. 478643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi status_t err = mVePlayer->start( 479643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi true /* sourceAlreadyStarted */); 480643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi 481643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi if (err != OK) { 482643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi delete mAudioPlayer; 483643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi mAudioPlayer = NULL; 484643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi 485643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi mFlags &= ~(PLAYING | FIRST_FRAME); 486643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi return err; 487643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi } 488643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi 489643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi mTimeSource = mVePlayer; //mAudioPlayer; 490643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi 491643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi deferredAudioSeek = true; 492643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi mWatchForAudioSeekComplete = false; 493643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi mWatchForAudioEOS = true; 494643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi } 495643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi } else { 496643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi mVePlayer->resume(); 497643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi } 498643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi 499643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi } 500643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi 501643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi if (mTimeSource == NULL && mAudioPlayer == NULL) { 502643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi mTimeSource = &mSystemTimeSource; 503643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi } 504643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi 505643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi if (mVideoSource != NULL) { 506643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi // Kick off video playback 507643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi postVideoEvent_l(); 508643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi } 509643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi 510643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi if (deferredAudioSeek) { 511643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi // If there was a seek request while we were paused 512643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi // and we're just starting up again, honor the request now. 513643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi seekAudioIfNecessary_l(); 514643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi } 515643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi 516643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi if (mFlags & AT_EOS) { 517643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi // Legacy behaviour, if a stream finishes playing and then 518643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi // is started again, we play from the start... 519643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi seekTo_l(0); 520643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi } 521643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi 522643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi return OK; 523643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi} 524643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi 525643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi 526643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargivoid PreviewPlayer::initRenderer_l() { 527643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi if (mSurface != NULL || mISurface != NULL) { 528643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi sp<MetaData> meta = mVideoSource->getFormat(); 529643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi 530643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi int32_t format; 531643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi const char *component; 532643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi int32_t decodedWidth, decodedHeight; 533643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi CHECK(meta->findInt32(kKeyColorFormat, &format)); 534643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi CHECK(meta->findCString(kKeyDecoderComponent, &component)); 535643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi CHECK(meta->findInt32(kKeyWidth, &decodedWidth)); 536643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi CHECK(meta->findInt32(kKeyHeight, &decodedHeight)); 537643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi 538643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi // Must ensure that mVideoRenderer's destructor is actually executed 539643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi // before creating a new one. 540643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi IPCThreadState::self()->flushCommands(); 541643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi 542643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi // always use localrenderer since decoded buffers are modified 543643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi // by postprocessing module 544643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi // Other decoders are instantiated locally and as a consequence 545643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi // allocate their buffers in local address space. 546643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi if(mVideoRenderer == NULL) { 547643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi 548643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi mVideoRenderer = new PreviewLocalRenderer( 549643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi false, // previewOnly 550643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi (OMX_COLOR_FORMATTYPE)format, 551643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi mSurface, 552643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi mOutputVideoWidth, mOutputVideoHeight, 553643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi mOutputVideoWidth, mOutputVideoHeight); 554643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi } 555643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi } 556643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi} 557643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi 558643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi 559643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargivoid PreviewPlayer::setISurface(const sp<ISurface> &isurface) { 560643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi Mutex::Autolock autoLock(mLock); 561643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi mISurface = isurface; 562643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi} 563643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi 564643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi 565643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargistatus_t PreviewPlayer::seekTo(int64_t timeUs) { 566643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi 567643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi if ((mExtractorFlags & MediaExtractor::CAN_SEEK) || (mIsVideoSourceJpg)) { 568643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi Mutex::Autolock autoLock(mLock); 569643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi return seekTo_l(timeUs); 570643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi } 571643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi 572643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi return OK; 573643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi} 574643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi 575643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi 576643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargistatus_t PreviewPlayer::getVideoDimensions( 577643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi int32_t *width, int32_t *height) const { 578643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi Mutex::Autolock autoLock(mLock); 579643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi 580643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi if (mVideoWidth < 0 || mVideoHeight < 0) { 581643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi return UNKNOWN_ERROR; 582643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi } 583643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi 584643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi *width = mVideoWidth; 585643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi *height = mVideoHeight; 586643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi 587643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi return OK; 588643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi} 589643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi 590643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi 591643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargistatus_t PreviewPlayer::initAudioDecoder() { 592643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi sp<MetaData> meta = mAudioTrack->getFormat(); 593643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi const char *mime; 594643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi CHECK(meta->findCString(kKeyMIMEType, &mime)); 595643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi 596643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi if (!strcasecmp(mime, MEDIA_MIMETYPE_AUDIO_RAW)) { 597643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi mAudioSource = mAudioTrack; 598643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi } else { 599643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi sp<MediaSource> aRawSource; 600643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi aRawSource = OMXCodec::Create( 601643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi mClient.interface(), mAudioTrack->getFormat(), 602643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi false, // createEncoder 603643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi mAudioTrack); 604643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi 605643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi if(aRawSource != NULL) { 606643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi LOGV("initAudioDecoder: new VideoEditorSRC"); 607643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi mAudioSource = new VideoEditorSRC(aRawSource); 608643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi } 609643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi } 610643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi 611643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi if (mAudioSource != NULL) { 612643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi int64_t durationUs; 613643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi if (mAudioTrack->getFormat()->findInt64(kKeyDuration, &durationUs)) { 614643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi Mutex::Autolock autoLock(mMiscStateLock); 615643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi if (mDurationUs < 0 || durationUs > mDurationUs) { 616643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi mDurationUs = durationUs; 617643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi } 618643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi } 619643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi status_t err = mAudioSource->start(); 620643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi 621643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi if (err != OK) { 622643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi mAudioSource.clear(); 623643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi return err; 624643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi } 625643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi } else if (!strcasecmp(mime, MEDIA_MIMETYPE_AUDIO_QCELP)) { 626643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi // For legacy reasons we're simply going to ignore the absence 627643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi // of an audio decoder for QCELP instead of aborting playback 628643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi // altogether. 629643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi return OK; 630643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi } 631643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi 632643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi return mAudioSource != NULL ? OK : UNKNOWN_ERROR; 633643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi} 634643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi 635643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi 636643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargistatus_t PreviewPlayer::initVideoDecoder(uint32_t flags) { 637643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi 638643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi mVideoSource = OMXCodec::Create( 639643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi mClient.interface(), mVideoTrack->getFormat(), 640643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi false, 641643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi mVideoTrack, 642643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi NULL, flags); 643643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi 644643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi if (mVideoSource != NULL) { 645643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi int64_t durationUs; 646643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi if (mVideoTrack->getFormat()->findInt64(kKeyDuration, &durationUs)) { 647643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi Mutex::Autolock autoLock(mMiscStateLock); 648643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi if (mDurationUs < 0 || durationUs > mDurationUs) { 649643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi mDurationUs = durationUs; 650643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi } 651643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi } 652643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi 653643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi CHECK(mVideoTrack->getFormat()->findInt32(kKeyWidth, &mVideoWidth)); 654643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi CHECK(mVideoTrack->getFormat()->findInt32(kKeyHeight, &mVideoHeight)); 655643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi 65635cb2de64cb6482a08f446e80733e7d344a0dcacDharmaray Kundargi mReportedWidth = mVideoWidth; 65735cb2de64cb6482a08f446e80733e7d344a0dcacDharmaray Kundargi mReportedHeight = mVideoHeight; 65835cb2de64cb6482a08f446e80733e7d344a0dcacDharmaray Kundargi 659643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi status_t err = mVideoSource->start(); 660643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi 661643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi if (err != OK) { 662643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi mVideoSource.clear(); 663643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi return err; 664643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi } 665643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi } 666643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi 667643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi return mVideoSource != NULL ? OK : UNKNOWN_ERROR; 668643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi} 669643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi 670643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi 671643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargivoid PreviewPlayer::onVideoEvent() { 672643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi uint32_t i=0; 673643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi bool bAppliedVideoEffect = false; 674643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi M4OSA_ERR err1 = M4NO_ERROR; 675643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi int64_t imageFrameTimeUs = 0; 676643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi 677643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi Mutex::Autolock autoLock(mLock); 678643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi if (!mVideoEventPending) { 679643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi // The event has been cancelled in reset_l() but had already 680643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi // been scheduled for execution at that time. 681643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi return; 682643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi } 683643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi mVideoEventPending = false; 684643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi 685643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi TimeSource *ts_st = &mSystemTimeSource; 686643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi int64_t timeStartUs = ts_st->getRealTimeUs(); 687643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi 688643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi if (mSeeking) { 689643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi if (mLastVideoBuffer) { 690643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi mLastVideoBuffer->release(); 691643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi mLastVideoBuffer = NULL; 692643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi } 693643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi 694643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi 695643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi if(mAudioSource != NULL) { 696643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi 697643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi // We're going to seek the video source first, followed by 698643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi // the audio source. 699643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi // In order to avoid jumps in the DataSource offset caused by 700643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi // the audio codec prefetching data from the old locations 701643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi // while the video codec is already reading data from the new 702643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi // locations, we'll "pause" the audio source, causing it to 703643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi // stop reading input data until a subsequent seek. 704643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi 705643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi if (mAudioPlayer != NULL) { 706643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi mAudioPlayer->pause(); 707643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi } 708643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi mAudioSource->pause(); 709643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi } 710643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi } 711643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi 712643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi if (!mVideoBuffer) { 713643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi MediaSource::ReadOptions options; 714643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi if (mSeeking) { 715643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi LOGV("LV PLAYER seeking to %lld us (%.2f secs)", mSeekTimeUs, 716643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi mSeekTimeUs / 1E6); 717643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi 718643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi options.setSeekTo( 719643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi mSeekTimeUs, MediaSource::ReadOptions::SEEK_CLOSEST); 720643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi } 721643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi for (;;) { 722643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi status_t err = mVideoSource->read(&mVideoBuffer, &options); 723643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi options.clearSeekTo(); 724643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi 725643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi if (err != OK) { 726643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi CHECK_EQ(mVideoBuffer, NULL); 727643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi 728643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi if (err == INFO_FORMAT_CHANGED) { 729643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi LOGV("LV PLAYER VideoSource signalled format change"); 730643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi notifyVideoSize_l(); 73135cb2de64cb6482a08f446e80733e7d344a0dcacDharmaray Kundargi sp<MetaData> meta = mVideoSource->getFormat(); 732643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi 73335cb2de64cb6482a08f446e80733e7d344a0dcacDharmaray Kundargi CHECK(meta->findInt32(kKeyWidth, &mReportedWidth)); 73435cb2de64cb6482a08f446e80733e7d344a0dcacDharmaray Kundargi CHECK(meta->findInt32(kKeyHeight, &mReportedHeight)); 735643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi if (mVideoRenderer != NULL) { 736643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi mVideoRendererIsPreview = false; 737643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi initRenderer_l(); 738643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi } 739643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi continue; 740643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi } 741643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi // So video playback is complete, but we may still have 742643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi // a seek request pending that needs to be applied 743ifmSeeking) { // to the audio track. 744LOG"video stream ended while seeking!"); if (mSeeking) { 745finishSeekIfNecessar- LOGV("video stream ended while seeking!"); 746643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi } 747643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi finishSeekIfNecessary(-1); 748643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi LOGV("PreviewPlayer: onVideoEvent EOS reached."); 749643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi mFlags |= VIDEO_AT_EOS; 750643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi postStreamDoneEvent_l(err); 751643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi return; 752643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi } 753643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi 754643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi if (mVideoBuffer->range_length() == 0) { 755643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi // Some decoders, notably the PV AVC software decoder 756643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi // return spurious empty buffers that we just want to ignore. 757643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi 758643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi mVideoBuffer->release(); 759643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi mVideoBuffer = NULL; 760643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi continue; 761643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi } 762643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi 763643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi int64_t videoTimeUs; 764643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi CHECK(mVideoBuffer->meta_data()->findInt64(kKeyTime, &videoTimeUs)); 765643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi 766643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi if((videoTimeUs/1000) < mPlayBeginTimeMsec) { 767643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi // Frames are before begin cut time 768643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi // Donot render 769643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi mVideoBuffer->release(); 770643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi mVideoBuffer = NULL; 771643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi continue; 772643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi } 773643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi 774643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi break; 775643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi } 776643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi } 777643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi 778643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi mNumberDecVideoFrames++; 779643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi 780643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi int64_t timeUs; 781643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi CHECK(mVideoBuffer->meta_data()->findInt64(kKeyTime, &timeUs)); 782643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi 783643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi { 784643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi Mutex::Autolock autoLock(mMiscStateLock); 785643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi mVideoTimeUs = timeUs; 786643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi } 787643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi 788643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi mDecodedVideoTs = timeUs; 789643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi 790643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi if(!mStartNextPlayer) { 791643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi int64_t playbackTimeRemaining = (mPlayEndTimeMsec*1000) - timeUs; 792643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi if(playbackTimeRemaining <= 1500000) { 793643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi //When less than 1.5 sec of playback left 794643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi // send notification to start next player 795643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi 796643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi mStartNextPlayer = true; 797643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi notifyListener_l(0xAAAAAAAA); 798643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi } 799643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi } 800643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi 801643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi bool wasSeeking = mSeeking; 802643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi finishSeekIfNecessary(timeUs); 803643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi 804643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi TimeSource *ts = (mFlags & AUDIO_AT_EOS) ? &mSystemTimeSource : mTimeSource; 805643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi 806643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi if(ts == NULL) { 807643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi mVideoBuffer->release(); 808643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi mVideoBuffer = NULL; 809643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi return; 810643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi } 811643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi 812643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi if(!mIsVideoSourceJpg) { 813643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi if (mFlags & FIRST_FRAME) { 814643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi mFlags &= ~FIRST_FRAME; 815643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi 816643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi mTimeSourceDeltaUs = ts->getRealTimeUs() - timeUs; 817643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi } 818643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi 819643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi int64_t realTimeUs, mediaTimeUs; 820643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi if (!(mFlags & AUDIO_AT_EOS) && mAudioPlayer != NULL 821643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi && mAudioPlayer->getMediaTimeMapping(&realTimeUs, &mediaTimeUs)) { 822643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi mTimeSourceDeltaUs = realTimeUs - mediaTimeUs; 823643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi } 824643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi 825643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi int64_t nowUs = ts->getRealTimeUs() - mTimeSourceDeltaUs; 826643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi 827643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi int64_t latenessUs = nowUs - timeUs; 828643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi 829643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi if (wasSeeking) { 830643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi // Let's display the first frame after seeking right away. 831643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi latenessUs = 0; 832643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi } 833643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi LOGV("Audio time stamp = %lld and video time stamp = %lld", 834643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi ts->getRealTimeUs(),timeUs); 835643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi if (latenessUs > 40000) { 836643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi // We're more than 40ms late. 837643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi 838643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi LOGV("LV PLAYER we're late by %lld us (%.2f secs)", 839643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi latenessUs, latenessUs / 1E6); 840643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi 841643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi mVideoBuffer->release(); 842643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi mVideoBuffer = NULL; 843643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi 844643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi postVideoEvent_l(); 845643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi return; 846643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi } 847643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi 848643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi if (latenessUs < -10000) { 849643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi // We're more than 10ms early. 850643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi LOGV("We're more than 10ms early, lateness %lld", latenessUs); 851643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi 852643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi postVideoEvent_l(10000); 853643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi return; 854643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi } 855643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi } 856643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi 857643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi if (mVideoRendererIsPreview || mVideoRenderer == NULL) { 858643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi mVideoRendererIsPreview = false; 859643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi 860643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi initRenderer_l(); 861643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi } 862643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi 863643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi // If timestamp exceeds endCutTime of clip, donot render 864643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi if((timeUs/1000) > mPlayEndTimeMsec) { 865643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi if (mLastVideoBuffer) { 866643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi mLastVideoBuffer->release(); 867643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi mLastVideoBuffer = NULL; 868643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi } 869643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi mLastVideoBuffer = mVideoBuffer; 870643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi mVideoBuffer = NULL; 871643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi mFlags |= VIDEO_AT_EOS; 872643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi mFlags |= AUDIO_AT_EOS; 873643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi LOGI("PreviewPlayer: onVideoEvent timeUs > mPlayEndTime; send EOS.."); 874643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi postStreamDoneEvent_l(ERROR_END_OF_STREAM); 875643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi return; 876643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi } 877643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi 878643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi // Post processing to apply video effects 879643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi for(i=0;i<mNumberEffects;i++) { 880643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi // First check if effect starttime matches the clip being previewed 881643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi if((mEffectsSettings[i].uiStartTime < (mDecVideoTsStoryBoard/1000)) || 882643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi (mEffectsSettings[i].uiStartTime >= 883643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi ((mDecVideoTsStoryBoard/1000) + mPlayEndTimeMsec - mPlayBeginTimeMsec))) 884643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi { 885643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi // This effect doesn't belong to this clip, check next one 886643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi continue; 887643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi } 888643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi // Check if effect applies to this particular frame timestamp 889643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi if((mEffectsSettings[i].uiStartTime <= 890643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi (((timeUs+mDecVideoTsStoryBoard)/1000)-mPlayBeginTimeMsec)) && 891643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi ((mEffectsSettings[i].uiStartTime+mEffectsSettings[i].uiDuration) >= 892643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi (((timeUs+mDecVideoTsStoryBoard)/1000)-mPlayBeginTimeMsec)) 893643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi && (mEffectsSettings[i].uiDuration != 0)) { 894643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi 895643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi setVideoPostProcessingNode( 896643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi mEffectsSettings[i].VideoEffectType, TRUE); 897643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi } 898643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi else { 899643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi setVideoPostProcessingNode( 900643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi mEffectsSettings[i].VideoEffectType, FALSE); 901643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi } 902643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi 903643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi } 904643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi 905643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi if(mCurrentVideoEffect != VIDEO_EFFECT_NONE) { 906643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi err1 = doVideoPostProcessing(); 907643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi if(err1 != M4NO_ERROR) { 908643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi LOGE("doVideoPostProcessing returned err"); 909643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi bAppliedVideoEffect = false; 910643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi } 911643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi else { 912643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi bAppliedVideoEffect = true; 913643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi } 914643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi } 915643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi else { 916643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi bAppliedVideoEffect = false; 917643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi if(mRenderingMode != MEDIA_RENDERING_INVALID) { 918643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi // No effects to be applied, but media rendering to be done 919643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi err1 = doMediaRendering(); 920643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi if(err1 != M4NO_ERROR) { 921643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi LOGE("doMediaRendering returned err"); 922643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi //Use original mVideoBuffer for rendering 923643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi mVideoResizedOrCropped = false; 924643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi } 925643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi } 926643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi } 927643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi 928643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi if (mVideoRenderer != NULL) { 929643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi LOGV("mVideoRenderer CALL render()"); 930643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi mVideoRenderer->render(); 931643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi } 932643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi 933643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi if (mLastVideoBuffer) { 934643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi mLastVideoBuffer->release(); 935643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi mLastVideoBuffer = NULL; 936643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi } 937643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi 938643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi mLastVideoBuffer = mVideoBuffer; 939643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi mVideoBuffer = NULL; 940643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi 941643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi // Post progress callback based on callback interval set 942643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi if(mNumberDecVideoFrames >= mProgressCbInterval) { 943643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi postProgressCallbackEvent_l(); 944643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi mNumberDecVideoFrames = 0; // reset counter 945643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi } 946643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi 947643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi // if reached EndCutTime of clip, post EOS event 948643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi if((timeUs/1000) >= mPlayEndTimeMsec) { 949643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi LOGV("PreviewPlayer: onVideoEvent EOS."); 950643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi mFlags |= VIDEO_AT_EOS; 951643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi mFlags |= AUDIO_AT_EOS; 952643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi postStreamDoneEvent_l(ERROR_END_OF_STREAM); 953643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi } 954643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi else { 955643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi if(!mIsVideoSourceJpg) { 956643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi postVideoEvent_l(); 957643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi } 958643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi else { 959643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi postVideoEvent_l(33000); 960643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi } 961643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi } 962643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi} 963643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi 964643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargistatus_t PreviewPlayer::prepare() { 965643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi Mutex::Autolock autoLock(mLock); 966643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi return prepare_l(); 967643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi} 968643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi 969643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargistatus_t PreviewPlayer::prepare_l() { 970643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi if (mFlags & PREPARED) { 971643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi return OK; 972643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi } 973643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi 974643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi if (mFlags & PREPARING) { 975643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi return UNKNOWN_ERROR; 976643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi } 977643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi 978643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi mIsAsyncPrepare = false; 979643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi status_t err = prepareAsync_l(); 980643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi 981643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi if (err != OK) { 982643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi return err; 983643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi } 984643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi 985643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi while (mFlags & PREPARING) { 986643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi mPreparedCondition.wait(mLock); 987643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi } 988643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi 989643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi return mPrepareResult; 990643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi} 991643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi 992643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargistatus_t PreviewPlayer::prepareAsync_l() { 993643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi if (mFlags & PREPARING) { 994643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi return UNKNOWN_ERROR; // async prepare already pending 995643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi } 996643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi 997643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi if (!mQueueStarted) { 998643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi mQueue.start(); 999643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi mQueueStarted = true; 1000643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi } 1001643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi 1002643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi mFlags |= PREPARING; 1003643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi mAsyncPrepareEvent = new PreviewPlayerEvent( 1004643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi this, &PreviewPlayer::onPrepareAsyncEvent); 1005643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi 1006643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi mQueue.postEvent(mAsyncPrepareEvent); 1007643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi 1008643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi return OK; 1009643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi} 1010643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi 1011643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargistatus_t PreviewPlayer::finishSetDataSource_l() { 1012643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi sp<DataSource> dataSource; 1013643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi sp<MediaExtractor> extractor; 1014643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi 1015643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi dataSource = DataSource::CreateFromURI(mUri.string(), &mUriHeaders); 1016643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi 1017643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi if (dataSource == NULL) { 1018643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi return UNKNOWN_ERROR; 1019643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi } 1020643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi 1021643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi //If file type is .rgb, then no need to check for Extractor 1022643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi int uriLen = strlen(mUri); 1023643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi int startOffset = uriLen - 4; 1024643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi if(!strncasecmp(mUri+startOffset, ".rgb", 4)) { 1025643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi extractor = NULL; 1026643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi } 1027643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi else { 1028643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi extractor = MediaExtractor::Create(dataSource, 1029643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi MEDIA_MIMETYPE_CONTAINER_MPEG4); 1030643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi } 1031643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi 1032643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi if (extractor == NULL) { 1033643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi LOGV("PreviewPlayer::finishSetDataSource_l extractor == NULL"); 1034643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi return setDataSource_l_jpg(); 1035643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi } 1036643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi 1037643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi return setDataSource_l(extractor); 1038643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi} 1039643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi 1040643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi 1041643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi// static 1042643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargibool PreviewPlayer::ContinuePreparation(void *cookie) { 1043643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi PreviewPlayer *me = static_cast<PreviewPlayer *>(cookie); 1044643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi 1045643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi return (me->mFlags & PREPARE_CANCELLED) == 0; 1046643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi} 1047643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi 1048643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargivoid PreviewPlayer::onPrepareAsyncEvent() { 1049643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi Mutex::Autolock autoLock(mLock); 1050643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi LOGV("onPrepareAsyncEvent"); 1051643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi 1052643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi if (mFlags & PREPARE_CANCELLED) { 1053643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi LOGI("LV PLAYER prepare was cancelled before doing anything"); 1054643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi abortPrepare(UNKNOWN_ERROR); 1055643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi return; 1056643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi } 1057643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi 1058643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi if (mUri.size() > 0) { 1059643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi status_t err = finishSetDataSource_l(); 1060643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi 1061643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi if (err != OK) { 1062643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi abortPrepare(err); 1063643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi return; 1064643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi } 1065643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi } 1066643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi 1067643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi if (mVideoTrack != NULL && mVideoSource == NULL) { 1068643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi status_t err = initVideoDecoder(OMXCodec::kHardwareCodecsOnly); 1069643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi 1070643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi if (err != OK) { 1071643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi abortPrepare(err); 1072643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi return; 1073643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi } 1074643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi } 1075643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi 1076643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi if (mAudioTrack != NULL && mAudioSource == NULL) { 1077643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi status_t err = initAudioDecoder(); 1078643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi 1079643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi if (err != OK) { 1080643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi abortPrepare(err); 1081643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi return; 1082643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi } 1083643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi } 1084643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi finishAsyncPrepare_l(); 1085643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi 1086643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi} 1087643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi 1088643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargivoid PreviewPlayer::finishAsyncPrepare_l() { 1089643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi if (mIsAsyncPrepare) { 1090643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi if (mVideoSource == NULL) { 1091643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi LOGV("finishAsyncPrepare_l: MEDIA_SET_VIDEO_SIZE 0 0 "); 1092643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi notifyListener_l(MEDIA_SET_VIDEO_SIZE, 0, 0); 1093643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi } else { 1094643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi LOGV("finishAsyncPrepare_l: MEDIA_SET_VIDEO_SIZE"); 1095643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi notifyVideoSize_l(); 1096643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi } 1097643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi LOGV("finishAsyncPrepare_l: MEDIA_PREPARED"); 1098643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi notifyListener_l(MEDIA_PREPARED); 1099643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi } 1100643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi 1101643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi mPrepareResult = OK; 1102643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi mFlags &= ~(PREPARING|PREPARE_CANCELLED); 1103643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi mFlags |= PREPARED; 1104643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi mAsyncPrepareEvent = NULL; 1105643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi mPreparedCondition.broadcast(); 1106643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi} 1107643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi 1108643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargistatus_t PreviewPlayer::suspend() { 1109643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi LOGV("suspend"); 1110643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi Mutex::Autolock autoLock(mLock); 1111643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi 1112643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi if (mSuspensionState != NULL) { 1113643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi if (mLastVideoBuffer == NULL) { 1114643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi //go into here if video is suspended again 1115643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi //after resuming without being played between 1116643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi //them 1117643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi SuspensionState *state = mSuspensionState; 1118643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi mSuspensionState = NULL; 1119643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi reset_l(); 1120643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi mSuspensionState = state; 1121643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi return OK; 1122643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi } 1123643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi 1124643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi delete mSuspensionState; 1125643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi mSuspensionState = NULL; 1126643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi } 1127643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi 1128643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi if (mFlags & PREPARING) { 1129643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi mFlags |= PREPARE_CANCELLED; 1130643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi } 1131643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi 1132643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi while (mFlags & PREPARING) { 1133643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi mPreparedCondition.wait(mLock); 1134643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi } 1135643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi 1136643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi SuspensionState *state = new SuspensionState; 1137643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi state->mUri = mUri; 1138643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi state->mUriHeaders = mUriHeaders; 1139643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi state->mFileSource = mFileSource; 1140643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi 1141643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi state->mFlags = mFlags & (PLAYING | AUTO_LOOPING | LOOPING | AT_EOS); 1142643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi getPosition(&state->mPositionUs); 1143643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi 1144643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi if (mLastVideoBuffer) { 1145643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi size_t size = mLastVideoBuffer->range_length(); 1146643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi if (size) { 1147643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi int32_t unreadable; 1148643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi if (!mLastVideoBuffer->meta_data()->findInt32( 1149643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi kKeyIsUnreadable, &unreadable) 1150643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi || unreadable == 0) { 1151643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi state->mLastVideoFrameSize = size; 1152643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi state->mLastVideoFrame = malloc(size); 1153643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi memcpy(state->mLastVideoFrame, 1154643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi (const uint8_t *)mLastVideoBuffer->data() 1155643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi + mLastVideoBuffer->range_offset(), 1156643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi size); 1157643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi 1158643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi state->mVideoWidth = mVideoWidth; 1159643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi state->mVideoHeight = mVideoHeight; 1160643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi 1161643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi sp<MetaData> meta = mVideoSource->getFormat(); 1162643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi CHECK(meta->findInt32(kKeyColorFormat, &state->mColorFormat)); 1163643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi CHECK(meta->findInt32(kKeyWidth, &state->mDecodedWidth)); 1164643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi CHECK(meta->findInt32(kKeyHeight, &state->mDecodedHeight)); 1165643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi } else { 1166643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi LOGV("Unable to save last video frame, we have no access to " 1167643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi "the decoded video data."); 1168643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi } 1169643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi } 1170643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi } 1171643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi 1172643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi reset_l(); 1173643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi 1174643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi mSuspensionState = state; 1175643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi 1176643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi return OK; 1177643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi} 1178643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi 1179643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargistatus_t PreviewPlayer::resume() { 1180643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi LOGV("resume"); 1181643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi Mutex::Autolock autoLock(mLock); 1182643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi 1183643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi if (mSuspensionState == NULL) { 1184643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi return INVALID_OPERATION; 1185643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi } 1186643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi 1187643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi SuspensionState *state = mSuspensionState; 1188643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi mSuspensionState = NULL; 1189643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi 1190643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi status_t err; 1191643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi if (state->mFileSource != NULL) { 1192643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi err = AwesomePlayer::setDataSource_l(state->mFileSource); 1193643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi 1194643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi if (err == OK) { 1195643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi mFileSource = state->mFileSource; 1196643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi } 1197643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi } else { 1198643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi err = AwesomePlayer::setDataSource_l(state->mUri, &state->mUriHeaders); 1199643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi } 1200643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi 1201643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi if (err != OK) { 1202643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi delete state; 1203643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi state = NULL; 1204643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi 1205643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi return err; 1206643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi } 1207643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi 1208643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi seekTo_l(state->mPositionUs); 1209643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi 1210643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi mFlags = state->mFlags & (AUTO_LOOPING | LOOPING | AT_EOS); 1211643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi 1212643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi if (state->mLastVideoFrame && (mSurface != NULL || mISurface != NULL)) { 1213643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi mVideoRenderer = 1214643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi new PreviewLocalRenderer( 1215643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi true, // previewOnly 1216643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi (OMX_COLOR_FORMATTYPE)state->mColorFormat, 1217643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi mSurface, 1218643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi state->mVideoWidth, 1219643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi state->mVideoHeight, 1220643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi state->mDecodedWidth, 1221643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi state->mDecodedHeight); 1222643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi 1223643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi mVideoRendererIsPreview = true; 1224643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi 1225643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi ((PreviewLocalRenderer *)mVideoRenderer.get())->render( 1226643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi state->mLastVideoFrame, state->mLastVideoFrameSize); 1227643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi } 1228643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi 1229643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi if (state->mFlags & PLAYING) { 1230643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi play_l(); 1231643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi } 1232643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi 1233643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi mSuspensionState = state; 1234643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi state = NULL; 1235643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi 1236643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi return OK; 1237643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi} 1238643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi 1239643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi 1240643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargistatus_t PreviewPlayer::loadEffectsSettings( 1241643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi M4VSS3GPP_EffectSettings* pEffectSettings, int nEffects) { 1242643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi M4OSA_UInt32 i = 0, rgbSize = 0; 1243643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi M4VIFI_UInt8 *tmp = M4OSA_NULL; 1244643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi 1245643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi mNumberEffects = nEffects; 1246643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi mEffectsSettings = pEffectSettings; 1247643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi return OK; 1248643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi} 1249643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi 1250643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargistatus_t PreviewPlayer::loadAudioMixSettings( 1251643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi M4xVSS_AudioMixingSettings* pAudioMixSettings) { 1252643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi 1253643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi LOGV("PreviewPlayer: loadAudioMixSettings: "); 1254643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi mPreviewPlayerAudioMixSettings = pAudioMixSettings; 1255643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi return OK; 1256643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi} 1257643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi 1258643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargistatus_t PreviewPlayer::setAudioMixPCMFileHandle( 1259643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi M4OSA_Context pAudioMixPCMFileHandle) { 1260643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi 1261643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi LOGV("PreviewPlayer: setAudioMixPCMFileHandle: "); 1262643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi mAudioMixPCMFileHandle = pAudioMixPCMFileHandle; 1263643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi return OK; 1264643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi} 1265643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi 1266643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargistatus_t PreviewPlayer::setAudioMixStoryBoardParam( 1267643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi M4OSA_UInt32 audioMixStoryBoardTS, 1268643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi M4OSA_UInt32 currentMediaBeginCutTime, 1269643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi M4OSA_UInt32 primaryTrackVolValue ) { 1270643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi 1271643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi mAudioMixStoryBoardTS = audioMixStoryBoardTS; 1272643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi mCurrentMediaBeginCutTime = currentMediaBeginCutTime; 1273643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi mCurrentMediaVolumeValue = primaryTrackVolValue; 1274643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi return OK; 1275643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi} 1276643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi 1277643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargistatus_t PreviewPlayer::setPlaybackBeginTime(uint32_t msec) { 1278643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi 1279643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi mPlayBeginTimeMsec = msec; 1280643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi return OK; 1281643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi} 1282643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi 1283643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargistatus_t PreviewPlayer::setPlaybackEndTime(uint32_t msec) { 1284643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi 1285643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi mPlayEndTimeMsec = msec; 1286643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi return OK; 1287643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi} 1288643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi 1289643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargistatus_t PreviewPlayer::setStoryboardStartTime(uint32_t msec) { 1290643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi 1291643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi mStoryboardStartTimeMsec = msec; 1292643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi mDecVideoTsStoryBoard = mStoryboardStartTimeMsec*1000; 1293643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi return OK; 1294643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi} 1295643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi 1296643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargistatus_t PreviewPlayer::setProgressCallbackInterval(uint32_t cbInterval) { 1297643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi 1298643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi mProgressCbInterval = cbInterval; 1299643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi return OK; 1300643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi} 1301643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi 1302643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi 1303643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargistatus_t PreviewPlayer::setMediaRenderingMode( 1304643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi M4xVSS_MediaRendering mode, 1305643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi M4VIDEOEDITING_VideoFrameSize outputVideoSize) { 1306643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi 1307643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi mRenderingMode = mode; 1308643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi 1309643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi /* reset boolean for each clip*/ 1310643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi mVideoResizedOrCropped = false; 1311643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi 1312643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi switch(outputVideoSize) { 1313643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi case M4VIDEOEDITING_kSQCIF: 1314643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi mOutputVideoWidth = 128; 1315643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi mOutputVideoHeight = 96; 1316643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi break; 1317643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi 1318643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi case M4VIDEOEDITING_kQQVGA: 1319643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi mOutputVideoWidth = 160; 1320643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi mOutputVideoHeight = 120; 1321643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi break; 1322643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi 1323643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi case M4VIDEOEDITING_kQCIF: 1324643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi mOutputVideoWidth = 176; 1325643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi mOutputVideoHeight = 144; 1326643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi break; 1327643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi 1328643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi case M4VIDEOEDITING_kQVGA: 1329643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi mOutputVideoWidth = 320; 1330643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi mOutputVideoHeight = 240; 1331643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi break; 1332643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi 1333643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi case M4VIDEOEDITING_kCIF: 1334643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi mOutputVideoWidth = 352; 1335643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi mOutputVideoHeight = 288; 1336643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi break; 1337643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi 1338643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi case M4VIDEOEDITING_kVGA: 1339643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi mOutputVideoWidth = 640; 1340643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi mOutputVideoHeight = 480; 1341643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi break; 1342643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi 1343643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi case M4VIDEOEDITING_kWVGA: 1344643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi mOutputVideoWidth = 800; 1345643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi mOutputVideoHeight = 480; 1346643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi break; 1347643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi 1348643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi case M4VIDEOEDITING_kNTSC: 1349643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi mOutputVideoWidth = 720; 1350643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi mOutputVideoHeight = 480; 1351643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi break; 1352643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi 1353643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi case M4VIDEOEDITING_k640_360: 1354643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi mOutputVideoWidth = 640; 1355643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi mOutputVideoHeight = 360; 1356643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi break; 1357643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi 1358643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi case M4VIDEOEDITING_k854_480: 1359643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi mOutputVideoWidth = 854; 1360643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi mOutputVideoHeight = 480; 1361643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi break; 1362643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi 1363643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi case M4VIDEOEDITING_kHD1280: 1364643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi mOutputVideoWidth = 1280; 1365643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi mOutputVideoHeight = 720; 1366643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi break; 1367643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi 1368643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi case M4VIDEOEDITING_kHD1080: 1369643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi mOutputVideoWidth = 1080; 1370643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi mOutputVideoHeight = 720; 1371643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi break; 1372643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi 1373643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi case M4VIDEOEDITING_kHD960: 1374643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi mOutputVideoWidth = 960; 1375643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi mOutputVideoHeight = 720; 1376643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi break; 1377643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi 1378643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi default: 1379643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi LOGE("unsupported output video size set"); 1380643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi return BAD_VALUE; 1381643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi } 1382643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi 1383643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi return OK; 1384643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi} 1385643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi 1386643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray KundargiM4OSA_ERR PreviewPlayer::doMediaRendering() { 1387643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi M4OSA_ERR err = M4NO_ERROR; 1388643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi M4VIFI_ImagePlane planeIn[3], planeOut[3]; 1389643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi M4VIFI_UInt8 *inBuffer = M4OSA_NULL, *finalOutputBuffer = M4OSA_NULL; 1390643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi M4VIFI_UInt8 *tempOutputBuffer= M4OSA_NULL; 1391643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi size_t videoBufferSize = 0; 1392643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi M4OSA_UInt32 frameSize = 0, i=0, index =0, nFrameCount =0, bufferOffset =0; 1393643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi int32_t colorFormat = 0; 1394643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi 1395643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi if(!mIsVideoSourceJpg) { 1396643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi sp<MetaData> meta = mVideoSource->getFormat(); 1397643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi CHECK(meta->findInt32(kKeyColorFormat, &colorFormat)); 1398643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi } 1399643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi else { 1400643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi colorFormat = OMX_COLOR_FormatYUV420Planar; 1401643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi } 1402643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi 1403643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi videoBufferSize = mVideoBuffer->size(); 1404643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi frameSize = (mVideoWidth*mVideoHeight*3) >> 1; 1405643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi 1406643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi uint8_t* outBuffer; 1407643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi size_t outBufferStride = 0; 1408643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi 1409643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi mVideoRenderer->getBuffer(&outBuffer, &outBufferStride); 1410643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi 1411643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi bufferOffset = index*frameSize; 1412643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi inBuffer = (M4OSA_UInt8 *)mVideoBuffer->data()+ 1413643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi mVideoBuffer->range_offset()+bufferOffset; 141435cb2de64cb6482a08f446e80733e7d344a0dcacDharmaray Kundargi 1415643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi 1416643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi /* In plane*/ 1417643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi prepareYUV420ImagePlane(planeIn, mVideoWidth, 1418643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi mVideoHeight, (M4VIFI_UInt8 *)inBuffer, mReportedWidth, mReportedHeight); 1419643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi 1420643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi // Set the output YUV420 plane to be compatible with YV12 format 1421643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi // W & H even 1422643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi // YVU instead of YUV 1423643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi // align buffers on 32 bits 1424643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi 1425643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi //In YV12 format, sizes must be even 1426643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi M4OSA_UInt32 yv12PlaneWidth = ((mOutputVideoWidth +1)>>1)<<1; 1427643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi M4OSA_UInt32 yv12PlaneHeight = ((mOutputVideoHeight+1)>>1)<<1; 1428643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi 1429643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi prepareYV12ImagePlane(planeOut, yv12PlaneWidth, yv12PlaneHeight, 1430643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi (M4OSA_UInt32)outBufferStride, (M4VIFI_UInt8 *)outBuffer); 1431643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi 1432643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi 1433643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi err = applyRenderingMode(planeIn, planeOut, mRenderingMode); 1434643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi 1435643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi if(err != M4NO_ERROR) 1436643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi { 1437643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi LOGE("doMediaRendering: applyRenderingMode returned err=0x%x", err); 1438643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi return err; 1439643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi } 1440643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi mVideoResizedOrCropped = true; 1441643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi 1442643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi return err; 1443643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi} 1444643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi 1445643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargistatus_t PreviewPlayer::resetJniCallbackTimeStamp() { 1446643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi 1447643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi mDecVideoTsStoryBoard = mStoryboardStartTimeMsec*1000; 1448643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi return OK; 1449643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi} 1450643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi 1451643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargivoid PreviewPlayer::postProgressCallbackEvent_l() { 1452643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi if (mProgressCbEventPending) { 1453643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi return; 1454643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi } 1455643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi mProgressCbEventPending = true; 1456643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi 1457643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi mQueue.postEvent(mProgressCbEvent); 1458643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi} 1459643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi 1460643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargivoid PreviewPlayer::onProgressCbEvent() { 1461643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi Mutex::Autolock autoLock(mLock); 1462643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi if (!mProgressCbEventPending) { 1463643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi return; 1464643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi } 1465643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi mProgressCbEventPending = false; 1466643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi // If playback starts from previous I-frame, 1467643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi // then send frame storyboard duration 1468643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi if((mDecodedVideoTs/1000) < mPlayBeginTimeMsec) { 1469643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi notifyListener_l(MEDIA_INFO, 0, mDecVideoTsStoryBoard/1000); 1470643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi } 1471643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi else { 1472643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi notifyListener_l(MEDIA_INFO, 0, 1473643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi (((mDecodedVideoTs+mDecVideoTsStoryBoard)/1000)-mPlayBeginTimeMsec)); 1474643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi } 1475643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi} 1476643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi 1477643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargivoid PreviewPlayer::setVideoPostProcessingNode( 1478643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi M4VSS3GPP_VideoEffectType type, M4OSA_Bool enable) { 1479643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi 1480643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi uint32_t effect = VIDEO_EFFECT_NONE; 1481643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi 1482643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi //Map M4VSS3GPP_VideoEffectType to local enum 1483643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi switch(type) { 1484643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi case M4VSS3GPP_kVideoEffectType_FadeFromBlack: 1485643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi effect = VIDEO_EFFECT_FADEFROMBLACK; 1486643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi break; 1487643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi 1488643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi case M4VSS3GPP_kVideoEffectType_FadeToBlack: 1489643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi effect = VIDEO_EFFECT_FADETOBLACK; 1490643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi break; 1491643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi 1492643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi case M4VSS3GPP_kVideoEffectType_CurtainOpening: 1493643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi effect = VIDEO_EFFECT_CURTAINOPEN; 1494643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi break; 1495643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi 1496643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi case M4VSS3GPP_kVideoEffectType_CurtainClosing: 1497643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi effect = VIDEO_EFFECT_CURTAINCLOSE; 1498643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi break; 1499643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi 1500643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi case M4xVSS_kVideoEffectType_BlackAndWhite: 1501643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi effect = VIDEO_EFFECT_BLACKANDWHITE; 1502643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi break; 1503643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi 1504643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi case M4xVSS_kVideoEffectType_Pink: 1505643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi effect = VIDEO_EFFECT_PINK; 1506643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi break; 1507643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi 1508643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi case M4xVSS_kVideoEffectType_Green: 1509643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi effect = VIDEO_EFFECT_GREEN; 1510643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi break; 1511643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi 1512643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi case M4xVSS_kVideoEffectType_Sepia: 1513643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi effect = VIDEO_EFFECT_SEPIA; 1514643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi break; 1515643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi 1516643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi case M4xVSS_kVideoEffectType_Negative: 1517643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi effect = VIDEO_EFFECT_NEGATIVE; 1518643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi break; 1519643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi 1520643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi case M4xVSS_kVideoEffectType_Framing: 1521643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi effect = VIDEO_EFFECT_FRAMING; 1522643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi break; 1523643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi 1524643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi case M4xVSS_kVideoEffectType_Fifties: 1525643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi effect = VIDEO_EFFECT_FIFTIES; 1526643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi break; 1527643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi 1528643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi case M4xVSS_kVideoEffectType_ColorRGB16: 1529643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi effect = VIDEO_EFFECT_COLOR_RGB16; 1530643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi break; 1531643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi 1532643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi case M4xVSS_kVideoEffectType_Gradient: 1533643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi effect = VIDEO_EFFECT_GRADIENT; 1534643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi break; 1535643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi 1536643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi default: 1537643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi effect = VIDEO_EFFECT_NONE; 1538643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi break; 1539643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi } 1540643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi 1541643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi if(enable == M4OSA_TRUE) { 1542643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi //If already set, then no need to set again 1543643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi if(!(mCurrentVideoEffect & effect)) { 1544643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi mCurrentVideoEffect |= effect; 1545643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi if(effect == VIDEO_EFFECT_FIFTIES) { 1546643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi mIsFiftiesEffectStarted = true; 1547643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi } 1548643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi } 1549643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi } 1550643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi else { 1551643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi //Reset only if already set 1552643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi if(mCurrentVideoEffect & effect) { 1553643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi mCurrentVideoEffect &= ~effect; 1554643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi } 1555643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi } 1556643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi} 1557643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi 1558643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargistatus_t PreviewPlayer::setImageClipProperties(uint32_t width,uint32_t height) { 1559643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi mVideoWidth = width; 1560643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi mVideoHeight = height; 1561643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi return OK; 1562643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi} 1563643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi 1564643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi 1565643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray KundargiM4OSA_ERR PreviewPlayer::doVideoPostProcessing() { 1566643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi M4OSA_ERR err = M4NO_ERROR; 1567643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi vePostProcessParams postProcessParams; 1568643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi int32_t colorFormat = 0; 1569643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi 1570643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi 1571643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi if(!mIsVideoSourceJpg) { 1572643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi sp<MetaData> meta = mVideoSource->getFormat(); 1573643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi CHECK(meta->findInt32(kKeyColorFormat, &colorFormat)); 1574643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi } 1575643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi else { 1576643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi colorFormat = OMX_COLOR_FormatYUV420Planar; 1577643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi } 1578643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi 1579643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi if((colorFormat == OMX_COLOR_FormatYUV420SemiPlanar) || 1580643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi (colorFormat == 0x7FA30C00)) { 1581643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi LOGE("doVideoPostProcessing: colorFormat YUV420Sp not supported"); 1582643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi return M4ERR_UNSUPPORTED_MEDIA_TYPE; 1583643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi } 1584643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi 1585643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi postProcessParams.vidBuffer = (M4VIFI_UInt8*)mVideoBuffer->data() 1586643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi + mVideoBuffer->range_offset(); 1587643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi 1588643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi postProcessParams.videoWidth = mVideoWidth; 1589643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi postProcessParams.videoHeight = mVideoHeight; 1590643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi postProcessParams.timeMs = mDecodedVideoTs/1000; 1591643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi postProcessParams.timeOffset = mDecVideoTsStoryBoard/1000; 1592643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi postProcessParams.effectsSettings = mEffectsSettings; 1593643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi postProcessParams.numberEffects = mNumberEffects; 1594643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi postProcessParams.outVideoWidth = mOutputVideoWidth; 1595643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi postProcessParams.outVideoHeight = mOutputVideoHeight; 1596643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi postProcessParams.currentVideoEffect = mCurrentVideoEffect; 1597643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi postProcessParams.renderingMode = mRenderingMode; 1598643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi if(mIsFiftiesEffectStarted == M4OSA_TRUE) { 1599643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi postProcessParams.isFiftiesEffectStarted = M4OSA_TRUE; 1600643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi mIsFiftiesEffectStarted = M4OSA_FALSE; 1601643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi } 1602643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi else { 1603643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi postProcessParams.isFiftiesEffectStarted = M4OSA_FALSE; 1604643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi } 160535cb2de64cb6482a08f446e80733e7d344a0dcacDharmaray Kundargi 1606643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi postProcessParams.overlayFrameRGBBuffer = mFrameRGBBuffer; 1607643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi postProcessParams.overlayFrameYUVBuffer = mFrameYUVBuffer; 1608643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi mVideoRenderer->getBuffer(&(postProcessParams.pOutBuffer), &(postProcessParams.outBufferStride)); 1609643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi err = applyEffectsAndRenderingMode(&postProcessParams, mReportedWidth, mReportedHeight); 1610643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi 1611643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi return err; 1612643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi} 1613643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi 1614643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargistatus_t PreviewPlayer::readFirstVideoFrame() { 1615643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi LOGV("PreviewPlayer::readFirstVideoFrame"); 1616643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi 1617643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi if (!mVideoBuffer) { 1618643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi MediaSource::ReadOptions options; 1619643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi if (mSeeking) { 1620643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi LOGV("LV PLAYER seeking to %lld us (%.2f secs)", mSeekTimeUs, 1621643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi mSeekTimeUs / 1E6); 1622643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi 1623643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi options.setSeekTo( 1624643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi mSeekTimeUs, MediaSource::ReadOptions::SEEK_CLOSEST); 1625643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi } 1626643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi for (;;) { 1627643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi status_t err = mVideoSource->read(&mVideoBuffer, &options); 1628643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi options.clearSeekTo(); 1629643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi 1630643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi if (err != OK) { 1631643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi CHECK_EQ(mVideoBuffer, NULL); 163235cb2de64cb6482a08f446e80733e7d344a0dcacDharmaray Kundargi 163335cb2de64cb6482a08f446e80733e7d344a0dcacDharmaray Kundargi if (err == INFO_FORMAT_CHANGED) { 163435cb2de64cb6482a08f446e80733e7d344a0dcacDharmaray Kundargi LOGV("LV PLAYER VideoSource signalled format change"); 163535cb2de64cb6482a08f446e80733e7d344a0dcacDharmaray Kundargi notifyVideoSize_l(); 1636643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi sp<MetaData> meta = mVideoSource->getFormat(); 1637643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi 1638643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi CHECK(meta->findInt32(kKeyWidth, &mReportedWidth)); 1639643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi CHECK(meta->findInt32(kKeyHeight, &mReportedHeight)); 1640643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi 1641643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi if (mVideoRenderer != NULL) { 1642643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi mVideoRendererIsPreview = false; 1643643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi initRenderer_l(); 1644643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi } 1645643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi continue; 1646643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi } 1647643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi LOGV("PreviewPlayer: onVideoEvent EOS reached."); 1648643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi mFlags |= VIDEO_AT_EOS; 1649643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi postStreamDoneEvent_l(err); 1650643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi return OK; 1651643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi } 1652643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi 1653643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi if (mVideoBuffer->range_length() == 0) { 1654643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi // Some decoders, notably the PV AVC software decoder 1655643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi // return spurious empty buffers that we just want to ignore. 1656643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi 1657643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi mVideoBuffer->release(); 1658643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi mVideoBuffer = NULL; 1659643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi continue; 1660643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi } 1661643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi 1662643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi int64_t videoTimeUs; 1663643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi CHECK(mVideoBuffer->meta_data()->findInt64(kKeyTime, &videoTimeUs)); 1664643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi 1665643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi if((videoTimeUs/1000) < mPlayBeginTimeMsec) { 1666643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi // buffers are before begin cut time 1667643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi // ignore them 1668643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi //LOGI("PreviewPlayer: Ignoring buffers before begin cut time"); 1669643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi mVideoBuffer->release(); 1670643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi mVideoBuffer = NULL; 1671643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi continue; 1672643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi } 1673643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi 1674643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi break; 1675643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi } 1676643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi } 1677643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi 1678643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi int64_t timeUs; 1679643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi CHECK(mVideoBuffer->meta_data()->findInt64(kKeyTime, &timeUs)); 1680643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi 1681643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi { 1682643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi Mutex::Autolock autoLock(mMiscStateLock); 1683643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi mVideoTimeUs = timeUs; 1684643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi } 1685643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi 1686643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi mDecodedVideoTs = timeUs; 1687643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi 1688643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi return OK; 1689 1690} 1691 1692} // namespace android 1693