PreviewPlayer.cpp revision 4ca3e5df4b809210b240cd7d0489922017d87a6d
113837cf3f7be0eb8b1a9552bd99a89f98c987720Jean-Michel Trivi/* 213837cf3f7be0eb8b1a9552bd99a89f98c987720Jean-Michel Trivi * Copyright (C) 2011 NXP Software 313837cf3f7be0eb8b1a9552bd99a89f98c987720Jean-Michel Trivi * Copyright (C) 2011 The Android Open Source Project 413837cf3f7be0eb8b1a9552bd99a89f98c987720Jean-Michel Trivi * 513837cf3f7be0eb8b1a9552bd99a89f98c987720Jean-Michel Trivi * Licensed under the Apache License, Version 2.0 (the "License"); 613837cf3f7be0eb8b1a9552bd99a89f98c987720Jean-Michel Trivi * you may not use this file except in compliance with the License. 713837cf3f7be0eb8b1a9552bd99a89f98c987720Jean-Michel Trivi * You may obtain a copy of the License at 813837cf3f7be0eb8b1a9552bd99a89f98c987720Jean-Michel Trivi * 913837cf3f7be0eb8b1a9552bd99a89f98c987720Jean-Michel Trivi * http://www.apache.org/licenses/LICENSE-2.0 1013837cf3f7be0eb8b1a9552bd99a89f98c987720Jean-Michel Trivi * 1113837cf3f7be0eb8b1a9552bd99a89f98c987720Jean-Michel Trivi * Unless required by applicable law or agreed to in writing, software 1213837cf3f7be0eb8b1a9552bd99a89f98c987720Jean-Michel Trivi * distributed under the License is distributed on an "AS IS" BASIS, 1313837cf3f7be0eb8b1a9552bd99a89f98c987720Jean-Michel Trivi * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 1413837cf3f7be0eb8b1a9552bd99a89f98c987720Jean-Michel Trivi * See the License for the specific language governing permissions and 1513837cf3f7be0eb8b1a9552bd99a89f98c987720Jean-Michel Trivi * limitations under the License. 1613837cf3f7be0eb8b1a9552bd99a89f98c987720Jean-Michel Trivi */ 1713837cf3f7be0eb8b1a9552bd99a89f98c987720Jean-Michel Trivi 1813837cf3f7be0eb8b1a9552bd99a89f98c987720Jean-Michel Trivi 1913837cf3f7be0eb8b1a9552bd99a89f98c987720Jean-Michel Trivi#define LOG_NDEBUG 1 2013837cf3f7be0eb8b1a9552bd99a89f98c987720Jean-Michel Trivi#define LOG_TAG "PreviewPlayer" 214ee246c55533bdab8ab5fa0f0581744fe58e7c91Jean-Michel Trivi#include <utils/Log.h> 224ee246c55533bdab8ab5fa0f0581744fe58e7c91Jean-Michel Trivi 234ee246c55533bdab8ab5fa0f0581744fe58e7c91Jean-Michel Trivi#include <dlfcn.h> 2413837cf3f7be0eb8b1a9552bd99a89f98c987720Jean-Michel Trivi 2513837cf3f7be0eb8b1a9552bd99a89f98c987720Jean-Michel Trivi#include "include/ARTSPController.h" 2613837cf3f7be0eb8b1a9552bd99a89f98c987720Jean-Michel Trivi#include "PreviewPlayer.h" 2713837cf3f7be0eb8b1a9552bd99a89f98c987720Jean-Michel Trivi#include "DummyAudioSource.h" 2813837cf3f7be0eb8b1a9552bd99a89f98c987720Jean-Michel Trivi#include "DummyVideoSource.h" 2913837cf3f7be0eb8b1a9552bd99a89f98c987720Jean-Michel Trivi#include "VideoEditorSRC.h" 3013837cf3f7be0eb8b1a9552bd99a89f98c987720Jean-Michel Trivi#include "include/LiveSession.h" 3113837cf3f7be0eb8b1a9552bd99a89f98c987720Jean-Michel Trivi#include "include/NuCachedSource2.h" 3237dc2fccf3f122b79ebd554de209d0a3c94ae161Jean-Michel Trivi#include "include/ThrottledSource.h" 331a9c2615d0933d183fcb1b9e34ec8f0da2a85153Glenn Kasten 344ee246c55533bdab8ab5fa0f0581744fe58e7c91Jean-Michel Trivi 351a9c2615d0933d183fcb1b9e34ec8f0da2a85153Glenn Kasten#include "PreviewRenderer.h" 364ee246c55533bdab8ab5fa0f0581744fe58e7c91Jean-Michel Trivi 374ee246c55533bdab8ab5fa0f0581744fe58e7c91Jean-Michel Trivi#include <binder/IPCThreadState.h> 384ee246c55533bdab8ab5fa0f0581744fe58e7c91Jean-Michel Trivi#include <media/stagefright/DataSource.h> 395933f3d5e532aaac31ce0e6551c59f0197c0ae3cGlenn Kasten#include <media/stagefright/FileSource.h> 405933f3d5e532aaac31ce0e6551c59f0197c0ae3cGlenn Kasten#include <media/stagefright/MediaBuffer.h> 415933f3d5e532aaac31ce0e6551c59f0197c0ae3cGlenn Kasten#include <media/stagefright/MediaDefs.h> 425933f3d5e532aaac31ce0e6551c59f0197c0ae3cGlenn Kasten#include <media/stagefright/MediaExtractor.h> 435933f3d5e532aaac31ce0e6551c59f0197c0ae3cGlenn Kasten#include <media/stagefright/MediaDebug.h> 445933f3d5e532aaac31ce0e6551c59f0197c0ae3cGlenn Kasten#include <media/stagefright/MediaSource.h> 455933f3d5e532aaac31ce0e6551c59f0197c0ae3cGlenn Kasten#include <media/stagefright/MetaData.h> 4613837cf3f7be0eb8b1a9552bd99a89f98c987720Jean-Michel Trivi#include <media/stagefright/OMXCodec.h> 47e9236d046fdb5cac0696c42e03443a2439188146Jean-Michel Trivi 4813837cf3f7be0eb8b1a9552bd99a89f98c987720Jean-Michel Trivi#include <surfaceflinger/Surface.h> 4913837cf3f7be0eb8b1a9552bd99a89f98c987720Jean-Michel Trivi#include <media/stagefright/foundation/ALooper.h> 5013837cf3f7be0eb8b1a9552bd99a89f98c987720Jean-Michel Trivi 5137dc2fccf3f122b79ebd554de209d0a3c94ae161Jean-Michel Trivinamespace android { 5237dc2fccf3f122b79ebd554de209d0a3c94ae161Jean-Michel Trivi 5313837cf3f7be0eb8b1a9552bd99a89f98c987720Jean-Michel Trivi 5413837cf3f7be0eb8b1a9552bd99a89f98c987720Jean-Michel Trivistruct PreviewPlayerEvent : public TimedEventQueue::Event { 5513837cf3f7be0eb8b1a9552bd99a89f98c987720Jean-Michel Trivi PreviewPlayerEvent( 5613837cf3f7be0eb8b1a9552bd99a89f98c987720Jean-Michel Trivi PreviewPlayer *player, 57e31a69fcbe27894a597176d05a08e04c06092021Glenn Kasten void (PreviewPlayer::*method)()) 5813837cf3f7be0eb8b1a9552bd99a89f98c987720Jean-Michel Trivi : mPlayer(player), 59833251ab9e5e59a6ea5ac325122cf3abdf7cd944Glenn Kasten mMethod(method) { 6013837cf3f7be0eb8b1a9552bd99a89f98c987720Jean-Michel Trivi } 6113837cf3f7be0eb8b1a9552bd99a89f98c987720Jean-Michel Trivi 6213837cf3f7be0eb8b1a9552bd99a89f98c987720Jean-Michel Triviprotected: 6313837cf3f7be0eb8b1a9552bd99a89f98c987720Jean-Michel Trivi virtual ~PreviewPlayerEvent() {} 64e9236d046fdb5cac0696c42e03443a2439188146Jean-Michel Trivi 6513837cf3f7be0eb8b1a9552bd99a89f98c987720Jean-Michel Trivi virtual void fire(TimedEventQueue *queue, int64_t /* now_us */) { 66e6ded5c61944a87fa9e472dec3a6929855d42aebJean-Michel Trivi (mPlayer->*mMethod)(); 67e6ded5c61944a87fa9e472dec3a6929855d42aebJean-Michel Trivi } 68e6ded5c61944a87fa9e472dec3a6929855d42aebJean-Michel Trivi 69e6ded5c61944a87fa9e472dec3a6929855d42aebJean-Michel Triviprivate: 70e6ded5c61944a87fa9e472dec3a6929855d42aebJean-Michel Trivi PreviewPlayer *mPlayer; 7113837cf3f7be0eb8b1a9552bd99a89f98c987720Jean-Michel Trivi void (PreviewPlayer::*mMethod)(); 7213837cf3f7be0eb8b1a9552bd99a89f98c987720Jean-Michel Trivi 733ac5dcc05fe321e4f01918aef2e3e54e22c9a5c1Glenn Kasten PreviewPlayerEvent(const PreviewPlayerEvent &); 7413837cf3f7be0eb8b1a9552bd99a89f98c987720Jean-Michel Trivi PreviewPlayerEvent &operator=(const PreviewPlayerEvent &); 7513837cf3f7be0eb8b1a9552bd99a89f98c987720Jean-Michel Trivi}; 7613837cf3f7be0eb8b1a9552bd99a89f98c987720Jean-Michel Trivi 77e6ded5c61944a87fa9e472dec3a6929855d42aebJean-Michel Trivi 78e6ded5c61944a87fa9e472dec3a6929855d42aebJean-Michel Trivistruct PreviewLocalRenderer : public PreviewPlayerRenderer { 79e6ded5c61944a87fa9e472dec3a6929855d42aebJean-Michel Trivi 80e6ded5c61944a87fa9e472dec3a6929855d42aebJean-Michel Trivi static PreviewLocalRenderer* initPreviewLocalRenderer ( 81e6ded5c61944a87fa9e472dec3a6929855d42aebJean-Michel Trivi bool previewOnly, 82e6ded5c61944a87fa9e472dec3a6929855d42aebJean-Michel Trivi OMX_COLOR_FORMATTYPE colorFormat, 83e6ded5c61944a87fa9e472dec3a6929855d42aebJean-Michel Trivi const sp<Surface> &surface, 84e6ded5c61944a87fa9e472dec3a6929855d42aebJean-Michel Trivi size_t displayWidth, size_t displayHeight, 85e6ded5c61944a87fa9e472dec3a6929855d42aebJean-Michel Trivi size_t decodedWidth, size_t decodedHeight, 86e6ded5c61944a87fa9e472dec3a6929855d42aebJean-Michel Trivi int32_t rotationDegrees = 0) 87e6ded5c61944a87fa9e472dec3a6929855d42aebJean-Michel Trivi { 88e6ded5c61944a87fa9e472dec3a6929855d42aebJean-Michel Trivi PreviewLocalRenderer* mLocalRenderer = new 89e6ded5c61944a87fa9e472dec3a6929855d42aebJean-Michel Trivi PreviewLocalRenderer( 9013837cf3f7be0eb8b1a9552bd99a89f98c987720Jean-Michel Trivi previewOnly, 91b2549c73290f1955f3a7731bf98446a45f295dfaGlenn Kasten colorFormat, 9213837cf3f7be0eb8b1a9552bd99a89f98c987720Jean-Michel Trivi surface, 9313837cf3f7be0eb8b1a9552bd99a89f98c987720Jean-Michel Trivi displayWidth, displayHeight, 9413837cf3f7be0eb8b1a9552bd99a89f98c987720Jean-Michel Trivi decodedWidth, decodedHeight, 9513837cf3f7be0eb8b1a9552bd99a89f98c987720Jean-Michel Trivi rotationDegrees); 9613837cf3f7be0eb8b1a9552bd99a89f98c987720Jean-Michel Trivi 9713837cf3f7be0eb8b1a9552bd99a89f98c987720Jean-Michel Trivi if ( mLocalRenderer->init(previewOnly, 9813837cf3f7be0eb8b1a9552bd99a89f98c987720Jean-Michel Trivi colorFormat, surface, 9913837cf3f7be0eb8b1a9552bd99a89f98c987720Jean-Michel Trivi displayWidth, displayHeight, 100833251ab9e5e59a6ea5ac325122cf3abdf7cd944Glenn Kasten decodedWidth, decodedHeight, 101833251ab9e5e59a6ea5ac325122cf3abdf7cd944Glenn Kasten rotationDegrees) != OK ) 102833251ab9e5e59a6ea5ac325122cf3abdf7cd944Glenn Kasten { 10313837cf3f7be0eb8b1a9552bd99a89f98c987720Jean-Michel Trivi delete mLocalRenderer; 10413837cf3f7be0eb8b1a9552bd99a89f98c987720Jean-Michel Trivi return NULL; 10513837cf3f7be0eb8b1a9552bd99a89f98c987720Jean-Michel Trivi } 10613837cf3f7be0eb8b1a9552bd99a89f98c987720Jean-Michel Trivi return mLocalRenderer; 10713837cf3f7be0eb8b1a9552bd99a89f98c987720Jean-Michel Trivi } 10813837cf3f7be0eb8b1a9552bd99a89f98c987720Jean-Michel Trivi 10913837cf3f7be0eb8b1a9552bd99a89f98c987720Jean-Michel Trivi virtual void render(MediaBuffer *buffer) { 11013837cf3f7be0eb8b1a9552bd99a89f98c987720Jean-Michel Trivi render((const uint8_t *)buffer->data() + buffer->range_offset(), 11113837cf3f7be0eb8b1a9552bd99a89f98c987720Jean-Michel Trivi buffer->range_length()); 11213837cf3f7be0eb8b1a9552bd99a89f98c987720Jean-Michel Trivi } 11313837cf3f7be0eb8b1a9552bd99a89f98c987720Jean-Michel Trivi 11413837cf3f7be0eb8b1a9552bd99a89f98c987720Jean-Michel Trivi void render(const void *data, size_t size) { 11513837cf3f7be0eb8b1a9552bd99a89f98c987720Jean-Michel Trivi mTarget->render(data, size, NULL); 11613837cf3f7be0eb8b1a9552bd99a89f98c987720Jean-Michel Trivi } 11713837cf3f7be0eb8b1a9552bd99a89f98c987720Jean-Michel Trivi void render() { 11813837cf3f7be0eb8b1a9552bd99a89f98c987720Jean-Michel Trivi mTarget->renderYV12(); 11913837cf3f7be0eb8b1a9552bd99a89f98c987720Jean-Michel Trivi } 12013837cf3f7be0eb8b1a9552bd99a89f98c987720Jean-Michel Trivi void getBuffer(uint8_t **data, size_t *stride) { 12113837cf3f7be0eb8b1a9552bd99a89f98c987720Jean-Michel Trivi mTarget->getBufferYV12(data, stride); 12213837cf3f7be0eb8b1a9552bd99a89f98c987720Jean-Michel Trivi } 12313837cf3f7be0eb8b1a9552bd99a89f98c987720Jean-Michel Trivi 12413837cf3f7be0eb8b1a9552bd99a89f98c987720Jean-Michel Triviprotected: 12513837cf3f7be0eb8b1a9552bd99a89f98c987720Jean-Michel Trivi virtual ~PreviewLocalRenderer() { 12613837cf3f7be0eb8b1a9552bd99a89f98c987720Jean-Michel Trivi delete mTarget; 12713837cf3f7be0eb8b1a9552bd99a89f98c987720Jean-Michel Trivi mTarget = NULL; 128833251ab9e5e59a6ea5ac325122cf3abdf7cd944Glenn Kasten } 129833251ab9e5e59a6ea5ac325122cf3abdf7cd944Glenn Kasten 13013837cf3f7be0eb8b1a9552bd99a89f98c987720Jean-Michel Triviprivate: 13113837cf3f7be0eb8b1a9552bd99a89f98c987720Jean-Michel Trivi PreviewRenderer *mTarget; 13213837cf3f7be0eb8b1a9552bd99a89f98c987720Jean-Michel Trivi 13313837cf3f7be0eb8b1a9552bd99a89f98c987720Jean-Michel Trivi PreviewLocalRenderer( 13413837cf3f7be0eb8b1a9552bd99a89f98c987720Jean-Michel Trivi bool previewOnly, 135e9236d046fdb5cac0696c42e03443a2439188146Jean-Michel Trivi OMX_COLOR_FORMATTYPE colorFormat, 13685edd878a30caa535b0267d8d6e61b4ccc0d5fd0Glenn Kasten const sp<Surface> &surface, 13785edd878a30caa535b0267d8d6e61b4ccc0d5fd0Glenn Kasten size_t displayWidth, size_t displayHeight, 13885edd878a30caa535b0267d8d6e61b4ccc0d5fd0Glenn Kasten size_t decodedWidth, size_t decodedHeight, 13985edd878a30caa535b0267d8d6e61b4ccc0d5fd0Glenn Kasten int32_t rotationDegrees = 0) 14085edd878a30caa535b0267d8d6e61b4ccc0d5fd0Glenn Kasten : mTarget(NULL) { 14113837cf3f7be0eb8b1a9552bd99a89f98c987720Jean-Michel Trivi } 14213837cf3f7be0eb8b1a9552bd99a89f98c987720Jean-Michel Trivi 14313837cf3f7be0eb8b1a9552bd99a89f98c987720Jean-Michel Trivi 14413837cf3f7be0eb8b1a9552bd99a89f98c987720Jean-Michel Trivi int init( 145e9236d046fdb5cac0696c42e03443a2439188146Jean-Michel Trivi bool previewOnly, 14613837cf3f7be0eb8b1a9552bd99a89f98c987720Jean-Michel Trivi OMX_COLOR_FORMATTYPE colorFormat, 14713837cf3f7be0eb8b1a9552bd99a89f98c987720Jean-Michel Trivi const sp<Surface> &surface, 14813837cf3f7be0eb8b1a9552bd99a89f98c987720Jean-Michel Trivi size_t displayWidth, size_t displayHeight, 14913837cf3f7be0eb8b1a9552bd99a89f98c987720Jean-Michel Trivi size_t decodedWidth, size_t decodedHeight, 15013837cf3f7be0eb8b1a9552bd99a89f98c987720Jean-Michel Trivi int32_t rotationDegrees = 0); 15113837cf3f7be0eb8b1a9552bd99a89f98c987720Jean-Michel Trivi 152e9236d046fdb5cac0696c42e03443a2439188146Jean-Michel Trivi PreviewLocalRenderer(const PreviewLocalRenderer &); 15313837cf3f7be0eb8b1a9552bd99a89f98c987720Jean-Michel Trivi PreviewLocalRenderer &operator=(const PreviewLocalRenderer &);; 15413837cf3f7be0eb8b1a9552bd99a89f98c987720Jean-Michel Trivi}; 15513837cf3f7be0eb8b1a9552bd99a89f98c987720Jean-Michel Trivi 15613837cf3f7be0eb8b1a9552bd99a89f98c987720Jean-Michel Triviint PreviewLocalRenderer::init( 15713837cf3f7be0eb8b1a9552bd99a89f98c987720Jean-Michel Trivi bool previewOnly, 15813837cf3f7be0eb8b1a9552bd99a89f98c987720Jean-Michel Trivi OMX_COLOR_FORMATTYPE colorFormat, 159e9236d046fdb5cac0696c42e03443a2439188146Jean-Michel Trivi const sp<Surface> &surface, 16013837cf3f7be0eb8b1a9552bd99a89f98c987720Jean-Michel Trivi size_t displayWidth, size_t displayHeight, 16113837cf3f7be0eb8b1a9552bd99a89f98c987720Jean-Michel Trivi size_t decodedWidth, size_t decodedHeight, 16213837cf3f7be0eb8b1a9552bd99a89f98c987720Jean-Michel Trivi int32_t rotationDegrees) { 16313837cf3f7be0eb8b1a9552bd99a89f98c987720Jean-Michel Trivi 16413837cf3f7be0eb8b1a9552bd99a89f98c987720Jean-Michel Trivi mTarget = PreviewRenderer::CreatePreviewRenderer ( 16513837cf3f7be0eb8b1a9552bd99a89f98c987720Jean-Michel Trivi colorFormat, surface, displayWidth, displayHeight, 16613837cf3f7be0eb8b1a9552bd99a89f98c987720Jean-Michel Trivi decodedWidth, decodedHeight, rotationDegrees); 16713837cf3f7be0eb8b1a9552bd99a89f98c987720Jean-Michel Trivi if (mTarget == M4OSA_NULL) { 16813837cf3f7be0eb8b1a9552bd99a89f98c987720Jean-Michel Trivi return UNKNOWN_ERROR; 169a9f22e6f5f53e90daa779e38b22f88e4faa35c95Glenn Kasten } 1707ef5526a7bd12eccfa777cc8bc167794634f405aJean-Michel Trivi return OK; 1717ef5526a7bd12eccfa777cc8bc167794634f405aJean-Michel Trivi} 1727ef5526a7bd12eccfa777cc8bc167794634f405aJean-Michel Trivi 17313837cf3f7be0eb8b1a9552bd99a89f98c987720Jean-Michel TriviPreviewPlayer::PreviewPlayer() 17413837cf3f7be0eb8b1a9552bd99a89f98c987720Jean-Michel Trivi : AwesomePlayer(), 17513837cf3f7be0eb8b1a9552bd99a89f98c987720Jean-Michel Trivi mFrameRGBBuffer(NULL), 17613837cf3f7be0eb8b1a9552bd99a89f98c987720Jean-Michel Trivi mFrameYUVBuffer(NULL), 17713837cf3f7be0eb8b1a9552bd99a89f98c987720Jean-Michel Trivi mReportedWidth(0), 17813837cf3f7be0eb8b1a9552bd99a89f98c987720Jean-Michel Trivi mReportedHeight(0), 17913837cf3f7be0eb8b1a9552bd99a89f98c987720Jean-Michel Trivi mCurrFramingEffectIndex(0) { 180b2549c73290f1955f3a7731bf98446a45f295dfaGlenn Kasten 18113837cf3f7be0eb8b1a9552bd99a89f98c987720Jean-Michel Trivi mVideoRenderer = NULL; 18213837cf3f7be0eb8b1a9552bd99a89f98c987720Jean-Michel Trivi mLastVideoBuffer = NULL; 18313837cf3f7be0eb8b1a9552bd99a89f98c987720Jean-Michel Trivi mSuspensionState = NULL; 18413837cf3f7be0eb8b1a9552bd99a89f98c987720Jean-Michel Trivi mEffectsSettings = NULL; 18513837cf3f7be0eb8b1a9552bd99a89f98c987720Jean-Michel Trivi mVeAudioPlayer = NULL; 18613837cf3f7be0eb8b1a9552bd99a89f98c987720Jean-Michel Trivi mAudioMixStoryBoardTS = 0; 1874ee246c55533bdab8ab5fa0f0581744fe58e7c91Jean-Michel Trivi mCurrentMediaBeginCutTime = 0; 188b2549c73290f1955f3a7731bf98446a45f295dfaGlenn Kasten mCurrentMediaVolumeValue = 0; 1894ee246c55533bdab8ab5fa0f0581744fe58e7c91Jean-Michel Trivi mNumberEffects = 0; 1904ee246c55533bdab8ab5fa0f0581744fe58e7c91Jean-Michel Trivi mDecodedVideoTs = 0; 1914ee246c55533bdab8ab5fa0f0581744fe58e7c91Jean-Michel Trivi mDecVideoTsStoryBoard = 0; 1924ee246c55533bdab8ab5fa0f0581744fe58e7c91Jean-Michel Trivi mCurrentVideoEffect = VIDEO_EFFECT_NONE; 1934ee246c55533bdab8ab5fa0f0581744fe58e7c91Jean-Michel Trivi mProgressCbInterval = 0; 1944ee246c55533bdab8ab5fa0f0581744fe58e7c91Jean-Michel Trivi mNumberDecVideoFrames = 0; 19513837cf3f7be0eb8b1a9552bd99a89f98c987720Jean-Michel Trivi mOverlayUpdateEventPosted = false; 19670c49ae2867094072a4365423417ea452bf82231Jean-Michel Trivi 1974ee246c55533bdab8ab5fa0f0581744fe58e7c91Jean-Michel Trivi mVideoEvent = new PreviewPlayerEvent(this, &PreviewPlayer::onVideoEvent); 1984ee246c55533bdab8ab5fa0f0581744fe58e7c91Jean-Michel Trivi mVideoEventPending = false; 1994ee246c55533bdab8ab5fa0f0581744fe58e7c91Jean-Michel Trivi mStreamDoneEvent = new PreviewPlayerEvent(this, 2007f5cc1afe49395fefaad9b2bbd728a45d1bfda6aJean-Michel Trivi &AwesomePlayer::onStreamDone); 2017f5cc1afe49395fefaad9b2bbd728a45d1bfda6aJean-Michel Trivi 2027f5cc1afe49395fefaad9b2bbd728a45d1bfda6aJean-Michel Trivi mStreamDoneEventPending = false; 2037f5cc1afe49395fefaad9b2bbd728a45d1bfda6aJean-Michel Trivi 20437dc2fccf3f122b79ebd554de209d0a3c94ae161Jean-Michel Trivi mCheckAudioStatusEvent = new PreviewPlayerEvent( 205fa2bd93c3a9852a1f879663eeff598d13cf8fa81Glenn Kasten this, &AwesomePlayer::onCheckAudioStatus); 206fa2bd93c3a9852a1f879663eeff598d13cf8fa81Glenn Kasten 20737dc2fccf3f122b79ebd554de209d0a3c94ae161Jean-Michel Trivi mAudioStatusEventPending = false; 20837dc2fccf3f122b79ebd554de209d0a3c94ae161Jean-Michel Trivi 20937dc2fccf3f122b79ebd554de209d0a3c94ae161Jean-Michel Trivi mProgressCbEvent = new PreviewPlayerEvent(this, 21037dc2fccf3f122b79ebd554de209d0a3c94ae161Jean-Michel Trivi &PreviewPlayer::onProgressCbEvent); 21137dc2fccf3f122b79ebd554de209d0a3c94ae161Jean-Michel Trivi 21237dc2fccf3f122b79ebd554de209d0a3c94ae161Jean-Michel Trivi mOverlayUpdateEvent = new PreviewPlayerEvent(this, 21337dc2fccf3f122b79ebd554de209d0a3c94ae161Jean-Michel Trivi &PreviewPlayer::onUpdateOverlayEvent); 21437dc2fccf3f122b79ebd554de209d0a3c94ae161Jean-Michel Trivi mProgressCbEventPending = false; 21537dc2fccf3f122b79ebd554de209d0a3c94ae161Jean-Michel Trivi 21670c49ae2867094072a4365423417ea452bf82231Jean-Michel Trivi mOverlayUpdateEventPending = false; 21770c49ae2867094072a4365423417ea452bf82231Jean-Michel Trivi mResizedVideoBuffer = NULL; 2183610785fa93586ce84a27a27530feb77b8035229Glenn Kasten mVideoResizedOrCropped = false; 2193610785fa93586ce84a27a27530feb77b8035229Glenn Kasten mRenderingMode = (M4xVSS_MediaRendering)MEDIA_RENDERING_INVALID; 2203610785fa93586ce84a27a27530feb77b8035229Glenn Kasten mIsFiftiesEffectStarted = false; 2213610785fa93586ce84a27a27530feb77b8035229Glenn Kasten reset(); 2223610785fa93586ce84a27a27530feb77b8035229Glenn Kasten} 2233610785fa93586ce84a27a27530feb77b8035229Glenn Kasten 2243610785fa93586ce84a27a27530feb77b8035229Glenn KastenPreviewPlayer::~PreviewPlayer() { 2253610785fa93586ce84a27a27530feb77b8035229Glenn Kasten 2263610785fa93586ce84a27a27530feb77b8035229Glenn Kasten if (mQueueStarted) { 2273610785fa93586ce84a27a27530feb77b8035229Glenn Kasten mQueue.stop(); 2283610785fa93586ce84a27a27530feb77b8035229Glenn Kasten } 2293610785fa93586ce84a27a27530feb77b8035229Glenn Kasten 2303610785fa93586ce84a27a27530feb77b8035229Glenn Kasten reset(); 2313610785fa93586ce84a27a27530feb77b8035229Glenn Kasten 2323610785fa93586ce84a27a27530feb77b8035229Glenn Kasten if(mResizedVideoBuffer != NULL) { 2333610785fa93586ce84a27a27530feb77b8035229Glenn Kasten M4OSA_free((M4OSA_MemAddr32)(mResizedVideoBuffer->data())); 2343610785fa93586ce84a27a27530feb77b8035229Glenn Kasten mResizedVideoBuffer = NULL; 2353610785fa93586ce84a27a27530feb77b8035229Glenn Kasten } 2363610785fa93586ce84a27a27530feb77b8035229Glenn Kasten 2373610785fa93586ce84a27a27530feb77b8035229Glenn Kasten mVideoRenderer.clear(); 2385933f3d5e532aaac31ce0e6551c59f0197c0ae3cGlenn Kasten mVideoRenderer = NULL; 2395933f3d5e532aaac31ce0e6551c59f0197c0ae3cGlenn Kasten} 2405933f3d5e532aaac31ce0e6551c59f0197c0ae3cGlenn Kasten 2415933f3d5e532aaac31ce0e6551c59f0197c0ae3cGlenn Kastenvoid PreviewPlayer::cancelPlayerEvents(bool keepBufferingGoing) { 2425933f3d5e532aaac31ce0e6551c59f0197c0ae3cGlenn Kasten mQueue.cancelEvent(mVideoEvent->eventID()); 2435933f3d5e532aaac31ce0e6551c59f0197c0ae3cGlenn Kasten mVideoEventPending = false; 2445933f3d5e532aaac31ce0e6551c59f0197c0ae3cGlenn Kasten mQueue.cancelEvent(mStreamDoneEvent->eventID()); 2455933f3d5e532aaac31ce0e6551c59f0197c0ae3cGlenn Kasten mStreamDoneEventPending = false; 2465933f3d5e532aaac31ce0e6551c59f0197c0ae3cGlenn Kasten mQueue.cancelEvent(mCheckAudioStatusEvent->eventID()); 2475933f3d5e532aaac31ce0e6551c59f0197c0ae3cGlenn Kasten mAudioStatusEventPending = false; 2485933f3d5e532aaac31ce0e6551c59f0197c0ae3cGlenn Kasten 2495933f3d5e532aaac31ce0e6551c59f0197c0ae3cGlenn Kasten mQueue.cancelEvent(mProgressCbEvent->eventID()); 2505933f3d5e532aaac31ce0e6551c59f0197c0ae3cGlenn Kasten mProgressCbEventPending = false; 2515933f3d5e532aaac31ce0e6551c59f0197c0ae3cGlenn Kasten} 2525933f3d5e532aaac31ce0e6551c59f0197c0ae3cGlenn Kasten 2535933f3d5e532aaac31ce0e6551c59f0197c0ae3cGlenn Kastenstatus_t PreviewPlayer::setDataSource( 2545933f3d5e532aaac31ce0e6551c59f0197c0ae3cGlenn Kasten const char *uri, const KeyedVector<String8, String8> *headers) { 2555933f3d5e532aaac31ce0e6551c59f0197c0ae3cGlenn Kasten Mutex::Autolock autoLock(mLock); 2565933f3d5e532aaac31ce0e6551c59f0197c0ae3cGlenn Kasten return setDataSource_l(uri, headers); 2575933f3d5e532aaac31ce0e6551c59f0197c0ae3cGlenn Kasten} 2585933f3d5e532aaac31ce0e6551c59f0197c0ae3cGlenn Kasten 2595933f3d5e532aaac31ce0e6551c59f0197c0ae3cGlenn Kastenstatus_t PreviewPlayer::setDataSource_l( 2605933f3d5e532aaac31ce0e6551c59f0197c0ae3cGlenn Kasten const char *uri, const KeyedVector<String8, String8> *headers) { 2615933f3d5e532aaac31ce0e6551c59f0197c0ae3cGlenn Kasten reset_l(); 26213837cf3f7be0eb8b1a9552bd99a89f98c987720Jean-Michel Trivi 26313837cf3f7be0eb8b1a9552bd99a89f98c987720Jean-Michel Trivi mUri = uri; 26413837cf3f7be0eb8b1a9552bd99a89f98c987720Jean-Michel Trivi 26513837cf3f7be0eb8b1a9552bd99a89f98c987720Jean-Michel Trivi if (headers) { 26613837cf3f7be0eb8b1a9552bd99a89f98c987720Jean-Michel Trivi mUriHeaders = *headers; 267b2549c73290f1955f3a7731bf98446a45f295dfaGlenn Kasten } 268833251ab9e5e59a6ea5ac325122cf3abdf7cd944Glenn Kasten 269833251ab9e5e59a6ea5ac325122cf3abdf7cd944Glenn Kasten // The actual work will be done during preparation in the call to 270833251ab9e5e59a6ea5ac325122cf3abdf7cd944Glenn Kasten // ::finishSetDataSource_l to avoid blocking the calling thread in 271833251ab9e5e59a6ea5ac325122cf3abdf7cd944Glenn Kasten // setDataSource for any significant time. 272833251ab9e5e59a6ea5ac325122cf3abdf7cd944Glenn Kasten return OK; 273833251ab9e5e59a6ea5ac325122cf3abdf7cd944Glenn Kasten} 27413837cf3f7be0eb8b1a9552bd99a89f98c987720Jean-Michel Trivi 27513837cf3f7be0eb8b1a9552bd99a89f98c987720Jean-Michel Trivistatus_t PreviewPlayer::setDataSource_l(const sp<MediaExtractor> &extractor) { 27613837cf3f7be0eb8b1a9552bd99a89f98c987720Jean-Michel Trivi bool haveAudio = false; 27713837cf3f7be0eb8b1a9552bd99a89f98c987720Jean-Michel Trivi bool haveVideo = false; 27813837cf3f7be0eb8b1a9552bd99a89f98c987720Jean-Michel Trivi for (size_t i = 0; i < extractor->countTracks(); ++i) { 279b2549c73290f1955f3a7731bf98446a45f295dfaGlenn Kasten sp<MetaData> meta = extractor->getTrackMetaData(i); 280b2549c73290f1955f3a7731bf98446a45f295dfaGlenn Kasten 28113837cf3f7be0eb8b1a9552bd99a89f98c987720Jean-Michel Trivi const char *mime; 28213837cf3f7be0eb8b1a9552bd99a89f98c987720Jean-Michel Trivi CHECK(meta->findCString(kKeyMIMEType, &mime)); 28313837cf3f7be0eb8b1a9552bd99a89f98c987720Jean-Michel Trivi 28413837cf3f7be0eb8b1a9552bd99a89f98c987720Jean-Michel Trivi if (!haveVideo && !strncasecmp(mime, "video/", 6)) { 28513837cf3f7be0eb8b1a9552bd99a89f98c987720Jean-Michel Trivi setVideoSource(extractor->getTrack(i)); 28613837cf3f7be0eb8b1a9552bd99a89f98c987720Jean-Michel Trivi haveVideo = true; 28713837cf3f7be0eb8b1a9552bd99a89f98c987720Jean-Michel Trivi } else if (!haveAudio && !strncasecmp(mime, "audio/", 6)) { 28813837cf3f7be0eb8b1a9552bd99a89f98c987720Jean-Michel Trivi setAudioSource(extractor->getTrack(i)); 28913837cf3f7be0eb8b1a9552bd99a89f98c987720Jean-Michel Trivi haveAudio = true; 29013837cf3f7be0eb8b1a9552bd99a89f98c987720Jean-Michel Trivi 29137dc2fccf3f122b79ebd554de209d0a3c94ae161Jean-Michel Trivi if (!strcasecmp(mime, MEDIA_MIMETYPE_AUDIO_VORBIS)) { 292b2549c73290f1955f3a7731bf98446a45f295dfaGlenn Kasten // Only do this for vorbis audio, none of the other audio 293b2549c73290f1955f3a7731bf98446a45f295dfaGlenn Kasten // formats even support this ringtone specific hack and 29437dc2fccf3f122b79ebd554de209d0a3c94ae161Jean-Michel Trivi // retrieving the metadata on some extractors may turn out 29537dc2fccf3f122b79ebd554de209d0a3c94ae161Jean-Michel Trivi // to be very expensive. 29637dc2fccf3f122b79ebd554de209d0a3c94ae161Jean-Michel Trivi sp<MetaData> fileMeta = extractor->getMetaData(); 29737dc2fccf3f122b79ebd554de209d0a3c94ae161Jean-Michel Trivi int32_t loop; 29837dc2fccf3f122b79ebd554de209d0a3c94ae161Jean-Michel Trivi if (fileMeta != NULL 29937dc2fccf3f122b79ebd554de209d0a3c94ae161Jean-Michel Trivi && fileMeta->findInt32(kKeyAutoLoop, &loop) 30037dc2fccf3f122b79ebd554de209d0a3c94ae161Jean-Michel Trivi && loop != 0) { 30137dc2fccf3f122b79ebd554de209d0a3c94ae161Jean-Michel Trivi mFlags |= AUTO_LOOPING; 30237dc2fccf3f122b79ebd554de209d0a3c94ae161Jean-Michel Trivi } 30337dc2fccf3f122b79ebd554de209d0a3c94ae161Jean-Michel Trivi } 30413837cf3f7be0eb8b1a9552bd99a89f98c987720Jean-Michel Trivi } 30513837cf3f7be0eb8b1a9552bd99a89f98c987720Jean-Michel Trivi 30613837cf3f7be0eb8b1a9552bd99a89f98c987720Jean-Michel Trivi if (haveAudio && haveVideo) { 307b2549c73290f1955f3a7731bf98446a45f295dfaGlenn Kasten break; 30813837cf3f7be0eb8b1a9552bd99a89f98c987720Jean-Michel Trivi } 30913837cf3f7be0eb8b1a9552bd99a89f98c987720Jean-Michel Trivi } 310fa2bd93c3a9852a1f879663eeff598d13cf8fa81Glenn Kasten 31113837cf3f7be0eb8b1a9552bd99a89f98c987720Jean-Michel Trivi /* Add the support for Dummy audio*/ 31213837cf3f7be0eb8b1a9552bd99a89f98c987720Jean-Michel Trivi if( !haveAudio ){ 31313837cf3f7be0eb8b1a9552bd99a89f98c987720Jean-Michel Trivi LOGV("PreviewPlayer: setDataSource_l Dummyaudiocreation started"); 31413837cf3f7be0eb8b1a9552bd99a89f98c987720Jean-Michel Trivi 315fa2bd93c3a9852a1f879663eeff598d13cf8fa81Glenn Kasten mAudioTrack = DummyAudioSource::Create(32000, 2, 20000, 31613837cf3f7be0eb8b1a9552bd99a89f98c987720Jean-Michel Trivi ((mPlayEndTimeMsec)*1000)); 31713837cf3f7be0eb8b1a9552bd99a89f98c987720Jean-Michel Trivi LOGV("PreviewPlayer: setDataSource_l Dummyauiosource created"); 31813837cf3f7be0eb8b1a9552bd99a89f98c987720Jean-Michel Trivi if(mAudioTrack != NULL) { 31913837cf3f7be0eb8b1a9552bd99a89f98c987720Jean-Michel Trivi haveAudio = true; 320b2549c73290f1955f3a7731bf98446a45f295dfaGlenn Kasten } 32113837cf3f7be0eb8b1a9552bd99a89f98c987720Jean-Michel Trivi } 32213837cf3f7be0eb8b1a9552bd99a89f98c987720Jean-Michel Trivi 32313837cf3f7be0eb8b1a9552bd99a89f98c987720Jean-Michel Trivi if (!haveAudio && !haveVideo) { 32413837cf3f7be0eb8b1a9552bd99a89f98c987720Jean-Michel Trivi return UNKNOWN_ERROR; 325b2549c73290f1955f3a7731bf98446a45f295dfaGlenn Kasten } 32613837cf3f7be0eb8b1a9552bd99a89f98c987720Jean-Michel Trivi 32713837cf3f7be0eb8b1a9552bd99a89f98c987720Jean-Michel Trivi mExtractorFlags = extractor->flags(); 32813837cf3f7be0eb8b1a9552bd99a89f98c987720Jean-Michel Trivi return OK; 32913837cf3f7be0eb8b1a9552bd99a89f98c987720Jean-Michel Trivi} 330b2549c73290f1955f3a7731bf98446a45f295dfaGlenn Kasten 33113837cf3f7be0eb8b1a9552bd99a89f98c987720Jean-Michel Trivistatus_t PreviewPlayer::setDataSource_l_jpg() { 33213837cf3f7be0eb8b1a9552bd99a89f98c987720Jean-Michel Trivi M4OSA_ERR err = M4NO_ERROR; 33313837cf3f7be0eb8b1a9552bd99a89f98c987720Jean-Michel Trivi LOGV("PreviewPlayer: setDataSource_l_jpg started"); 33413837cf3f7be0eb8b1a9552bd99a89f98c987720Jean-Michel Trivi 335b2549c73290f1955f3a7731bf98446a45f295dfaGlenn Kasten mAudioSource = DummyAudioSource::Create(32000, 2, 20000, 33613837cf3f7be0eb8b1a9552bd99a89f98c987720Jean-Michel Trivi ((mPlayEndTimeMsec)*1000)); 33713837cf3f7be0eb8b1a9552bd99a89f98c987720Jean-Michel Trivi LOGV("PreviewPlayer: setDataSource_l_jpg Dummyaudiosource created"); 33813837cf3f7be0eb8b1a9552bd99a89f98c987720Jean-Michel Trivi if(mAudioSource != NULL) { 33937dc2fccf3f122b79ebd554de209d0a3c94ae161Jean-Michel Trivi setAudioSource(mAudioSource); 340b2549c73290f1955f3a7731bf98446a45f295dfaGlenn Kasten } 34137dc2fccf3f122b79ebd554de209d0a3c94ae161Jean-Michel Trivi status_t error = mAudioSource->start(); 34237dc2fccf3f122b79ebd554de209d0a3c94ae161Jean-Michel Trivi if (error != OK) { 34337dc2fccf3f122b79ebd554de209d0a3c94ae161Jean-Michel Trivi LOGV("Error starting dummy audio source"); 3444ee246c55533bdab8ab5fa0f0581744fe58e7c91Jean-Michel Trivi mAudioSource.clear(); 345b2549c73290f1955f3a7731bf98446a45f295dfaGlenn Kasten return err; 3464ee246c55533bdab8ab5fa0f0581744fe58e7c91Jean-Michel Trivi } 3474ee246c55533bdab8ab5fa0f0581744fe58e7c91Jean-Michel Trivi 3484ee246c55533bdab8ab5fa0f0581744fe58e7c91Jean-Michel Trivi mDurationUs = (mPlayEndTimeMsec - mPlayBeginTimeMsec)*1000; 3494ee246c55533bdab8ab5fa0f0581744fe58e7c91Jean-Michel Trivi 350b2549c73290f1955f3a7731bf98446a45f295dfaGlenn Kasten mVideoSource = DummyVideoSource::Create(mVideoWidth, mVideoHeight, 3514ee246c55533bdab8ab5fa0f0581744fe58e7c91Jean-Michel Trivi mDurationUs, mUri); 3524ee246c55533bdab8ab5fa0f0581744fe58e7c91Jean-Michel Trivi mReportedWidth = mVideoWidth; 3534ee246c55533bdab8ab5fa0f0581744fe58e7c91Jean-Michel Trivi mReportedHeight = mVideoHeight; 3544ee246c55533bdab8ab5fa0f0581744fe58e7c91Jean-Michel Trivi 355b2549c73290f1955f3a7731bf98446a45f295dfaGlenn Kasten setVideoSource(mVideoSource); 3564ee246c55533bdab8ab5fa0f0581744fe58e7c91Jean-Michel Trivi status_t err1 = mVideoSource->start(); 3574ee246c55533bdab8ab5fa0f0581744fe58e7c91Jean-Michel Trivi if (err1 != OK) { 3584ee246c55533bdab8ab5fa0f0581744fe58e7c91Jean-Michel Trivi mVideoSource.clear(); 3593610785fa93586ce84a27a27530feb77b8035229Glenn Kasten return err; 3603610785fa93586ce84a27a27530feb77b8035229Glenn Kasten } 3613610785fa93586ce84a27a27530feb77b8035229Glenn Kasten 3623610785fa93586ce84a27a27530feb77b8035229Glenn Kasten mIsVideoSourceJpg = true; 3633610785fa93586ce84a27a27530feb77b8035229Glenn Kasten return OK; 3643610785fa93586ce84a27a27530feb77b8035229Glenn Kasten} 3653610785fa93586ce84a27a27530feb77b8035229Glenn Kasten 3663610785fa93586ce84a27a27530feb77b8035229Glenn Kastenvoid PreviewPlayer::reset() { 3673610785fa93586ce84a27a27530feb77b8035229Glenn Kasten Mutex::Autolock autoLock(mLock); 3683610785fa93586ce84a27a27530feb77b8035229Glenn Kasten reset_l(); 3695933f3d5e532aaac31ce0e6551c59f0197c0ae3cGlenn Kasten} 3705933f3d5e532aaac31ce0e6551c59f0197c0ae3cGlenn Kasten 3715933f3d5e532aaac31ce0e6551c59f0197c0ae3cGlenn Kastenvoid PreviewPlayer::reset_l() { 3725933f3d5e532aaac31ce0e6551c59f0197c0ae3cGlenn Kasten 3735933f3d5e532aaac31ce0e6551c59f0197c0ae3cGlenn Kasten if (mFlags & PREPARING) { 3745933f3d5e532aaac31ce0e6551c59f0197c0ae3cGlenn Kasten mFlags |= PREPARE_CANCELLED; 3755933f3d5e532aaac31ce0e6551c59f0197c0ae3cGlenn Kasten } 3765933f3d5e532aaac31ce0e6551c59f0197c0ae3cGlenn Kasten 3775933f3d5e532aaac31ce0e6551c59f0197c0ae3cGlenn Kasten while (mFlags & PREPARING) { 3785933f3d5e532aaac31ce0e6551c59f0197c0ae3cGlenn Kasten mPreparedCondition.wait(mLock); 37913837cf3f7be0eb8b1a9552bd99a89f98c987720Jean-Michel Trivi } 3805933f3d5e532aaac31ce0e6551c59f0197c0ae3cGlenn Kasten 38113837cf3f7be0eb8b1a9552bd99a89f98c987720Jean-Michel Trivi cancelPlayerEvents(); 38213837cf3f7be0eb8b1a9552bd99a89f98c987720Jean-Michel Trivi mAudioTrack.clear(); 38313837cf3f7be0eb8b1a9552bd99a89f98c987720Jean-Michel Trivi mVideoTrack.clear(); 38413837cf3f7be0eb8b1a9552bd99a89f98c987720Jean-Michel Trivi 38513837cf3f7be0eb8b1a9552bd99a89f98c987720Jean-Michel Trivi // Shutdown audio first, so that the respone to the reset request 38613837cf3f7be0eb8b1a9552bd99a89f98c987720Jean-Michel Trivi // appears to happen instantaneously as far as the user is concerned 38713837cf3f7be0eb8b1a9552bd99a89f98c987720Jean-Michel Trivi // If we did this later, audio would continue playing while we 3884ee246c55533bdab8ab5fa0f0581744fe58e7c91Jean-Michel Trivi // shutdown the video-related resources and the player appear to 3894ee246c55533bdab8ab5fa0f0581744fe58e7c91Jean-Michel Trivi // not be as responsive to a reset request. 39013837cf3f7be0eb8b1a9552bd99a89f98c987720Jean-Michel Trivi if (mAudioPlayer == NULL && mAudioSource != NULL) { 391fa2bd93c3a9852a1f879663eeff598d13cf8fa81Glenn Kasten // If we had an audio player, it would have effectively 39249935c51fddcd0caa0030e2aac0c3a7ba3339e3dGlenn Kasten // taken possession of the audio source and stopped it when 39349935c51fddcd0caa0030e2aac0c3a7ba3339e3dGlenn Kasten // _it_ is stopped. Otherwise this is still our responsibility. 39449935c51fddcd0caa0030e2aac0c3a7ba3339e3dGlenn Kasten mAudioSource->stop(); 39549935c51fddcd0caa0030e2aac0c3a7ba3339e3dGlenn Kasten } 396d6be802c5267a3c8599c11af2c38ead666f74a72Glenn Kasten mAudioSource.clear(); 397e9236d046fdb5cac0696c42e03443a2439188146Jean-Michel Trivi 39813837cf3f7be0eb8b1a9552bd99a89f98c987720Jean-Michel Trivi mTimeSource = NULL; 39913837cf3f7be0eb8b1a9552bd99a89f98c987720Jean-Michel Trivi 40013837cf3f7be0eb8b1a9552bd99a89f98c987720Jean-Michel Trivi delete mAudioPlayer; 40113837cf3f7be0eb8b1a9552bd99a89f98c987720Jean-Michel Trivi mAudioPlayer = NULL; 402b2549c73290f1955f3a7731bf98446a45f295dfaGlenn Kasten 403e6ded5c61944a87fa9e472dec3a6929855d42aebJean-Michel Trivi if (mLastVideoBuffer) { 404e6ded5c61944a87fa9e472dec3a6929855d42aebJean-Michel Trivi mLastVideoBuffer->release(); 405e6ded5c61944a87fa9e472dec3a6929855d42aebJean-Michel Trivi mLastVideoBuffer = NULL; 406e6ded5c61944a87fa9e472dec3a6929855d42aebJean-Michel Trivi } 407e6ded5c61944a87fa9e472dec3a6929855d42aebJean-Michel Trivi 408e6ded5c61944a87fa9e472dec3a6929855d42aebJean-Michel Trivi if (mVideoBuffer) { 409e6ded5c61944a87fa9e472dec3a6929855d42aebJean-Michel Trivi mVideoBuffer->release(); 410e6ded5c61944a87fa9e472dec3a6929855d42aebJean-Michel Trivi mVideoBuffer = NULL; 411e6ded5c61944a87fa9e472dec3a6929855d42aebJean-Michel Trivi } 412e6ded5c61944a87fa9e472dec3a6929855d42aebJean-Michel Trivi 41313837cf3f7be0eb8b1a9552bd99a89f98c987720Jean-Michel Trivi if (mVideoSource != NULL) { 41413837cf3f7be0eb8b1a9552bd99a89f98c987720Jean-Michel Trivi mVideoSource->stop(); 41537dc2fccf3f122b79ebd554de209d0a3c94ae161Jean-Michel Trivi 4164ee246c55533bdab8ab5fa0f0581744fe58e7c91Jean-Michel Trivi // The following hack is necessary to ensure that the OMX 4174ee246c55533bdab8ab5fa0f0581744fe58e7c91Jean-Michel Trivi // component is completely released by the time we may try 418e6ded5c61944a87fa9e472dec3a6929855d42aebJean-Michel Trivi // to instantiate it again. 4194ee246c55533bdab8ab5fa0f0581744fe58e7c91Jean-Michel Trivi wp<MediaSource> tmp = mVideoSource; 4204ee246c55533bdab8ab5fa0f0581744fe58e7c91Jean-Michel Trivi mVideoSource.clear(); 421e6ded5c61944a87fa9e472dec3a6929855d42aebJean-Michel Trivi while (tmp.promote() != NULL) { 4224ee246c55533bdab8ab5fa0f0581744fe58e7c91Jean-Michel Trivi usleep(1000); 4234ee246c55533bdab8ab5fa0f0581744fe58e7c91Jean-Michel Trivi } 424e6ded5c61944a87fa9e472dec3a6929855d42aebJean-Michel Trivi IPCThreadState::self()->flushCommands(); 4254ee246c55533bdab8ab5fa0f0581744fe58e7c91Jean-Michel Trivi } 42637dc2fccf3f122b79ebd554de209d0a3c94ae161Jean-Michel Trivi 427e6ded5c61944a87fa9e472dec3a6929855d42aebJean-Michel Trivi mDurationUs = -1; 428fa2bd93c3a9852a1f879663eeff598d13cf8fa81Glenn Kasten mFlags = 0; 429fa2bd93c3a9852a1f879663eeff598d13cf8fa81Glenn Kasten mExtractorFlags = 0; 430fa2bd93c3a9852a1f879663eeff598d13cf8fa81Glenn Kasten mVideoWidth = mVideoHeight = -1; 43137dc2fccf3f122b79ebd554de209d0a3c94ae161Jean-Michel Trivi mTimeSourceDeltaUs = 0; 4324ee246c55533bdab8ab5fa0f0581744fe58e7c91Jean-Michel Trivi mVideoTimeUs = 0; 433e6ded5c61944a87fa9e472dec3a6929855d42aebJean-Michel Trivi 4345933f3d5e532aaac31ce0e6551c59f0197c0ae3cGlenn Kasten mSeeking = false; 4355933f3d5e532aaac31ce0e6551c59f0197c0ae3cGlenn Kasten mSeekNotificationSent = false; 4365933f3d5e532aaac31ce0e6551c59f0197c0ae3cGlenn Kasten mSeekTimeUs = 0; 437b2549c73290f1955f3a7731bf98446a45f295dfaGlenn Kasten 438b2549c73290f1955f3a7731bf98446a45f295dfaGlenn Kasten mUri.setTo(""); 43913837cf3f7be0eb8b1a9552bd99a89f98c987720Jean-Michel Trivi mUriHeaders.clear(); 44013837cf3f7be0eb8b1a9552bd99a89f98c987720Jean-Michel Trivi 44113837cf3f7be0eb8b1a9552bd99a89f98c987720Jean-Michel Trivi mFileSource.clear(); 44213837cf3f7be0eb8b1a9552bd99a89f98c987720Jean-Michel Trivi 44313837cf3f7be0eb8b1a9552bd99a89f98c987720Jean-Michel Trivi delete mSuspensionState; 444e9236d046fdb5cac0696c42e03443a2439188146Jean-Michel Trivi mSuspensionState = NULL; 4455933f3d5e532aaac31ce0e6551c59f0197c0ae3cGlenn Kasten 446e9236d046fdb5cac0696c42e03443a2439188146Jean-Michel Trivi mCurrentVideoEffect = VIDEO_EFFECT_NONE; 44713837cf3f7be0eb8b1a9552bd99a89f98c987720Jean-Michel Trivi mIsVideoSourceJpg = false; 4485933f3d5e532aaac31ce0e6551c59f0197c0ae3cGlenn Kasten mFrameRGBBuffer = NULL; 44913837cf3f7be0eb8b1a9552bd99a89f98c987720Jean-Michel Trivi if(mFrameYUVBuffer != NULL) { 45013837cf3f7be0eb8b1a9552bd99a89f98c987720Jean-Michel Trivi M4OSA_free((M4OSA_MemAddr32)mFrameYUVBuffer); 45113837cf3f7be0eb8b1a9552bd99a89f98c987720Jean-Michel Trivi mFrameYUVBuffer = NULL; 45213837cf3f7be0eb8b1a9552bd99a89f98c987720Jean-Michel Trivi } 45313837cf3f7be0eb8b1a9552bd99a89f98c987720Jean-Michel Trivi} 454e9236d046fdb5cac0696c42e03443a2439188146Jean-Michel Trivi 4555933f3d5e532aaac31ce0e6551c59f0197c0ae3cGlenn Kastenvoid PreviewPlayer::partial_reset_l() { 4565933f3d5e532aaac31ce0e6551c59f0197c0ae3cGlenn Kasten 45713837cf3f7be0eb8b1a9552bd99a89f98c987720Jean-Michel Trivi if (mLastVideoBuffer) { 4585933f3d5e532aaac31ce0e6551c59f0197c0ae3cGlenn Kasten mLastVideoBuffer->release(); 45913837cf3f7be0eb8b1a9552bd99a89f98c987720Jean-Michel Trivi mLastVideoBuffer = NULL; 46013837cf3f7be0eb8b1a9552bd99a89f98c987720Jean-Michel Trivi } 46113837cf3f7be0eb8b1a9552bd99a89f98c987720Jean-Michel Trivi 46213837cf3f7be0eb8b1a9552bd99a89f98c987720Jean-Michel Trivi /* call base struct */ 46313837cf3f7be0eb8b1a9552bd99a89f98c987720Jean-Michel Trivi AwesomePlayer::partial_reset_l(); 46413837cf3f7be0eb8b1a9552bd99a89f98c987720Jean-Michel Trivi 46513837cf3f7be0eb8b1a9552bd99a89f98c987720Jean-Michel Trivi} 46613837cf3f7be0eb8b1a9552bd99a89f98c987720Jean-Michel Trivi 46713837cf3f7be0eb8b1a9552bd99a89f98c987720Jean-Michel Trivistatus_t PreviewPlayer::play() { 46813837cf3f7be0eb8b1a9552bd99a89f98c987720Jean-Michel Trivi Mutex::Autolock autoLock(mLock); 46913837cf3f7be0eb8b1a9552bd99a89f98c987720Jean-Michel Trivi 47013837cf3f7be0eb8b1a9552bd99a89f98c987720Jean-Michel Trivi mFlags &= ~CACHE_UNDERRUN; 47113837cf3f7be0eb8b1a9552bd99a89f98c987720Jean-Michel Trivi 47237dc2fccf3f122b79ebd554de209d0a3c94ae161Jean-Michel Trivi return play_l(); 47337dc2fccf3f122b79ebd554de209d0a3c94ae161Jean-Michel Trivi} 474b2549c73290f1955f3a7731bf98446a45f295dfaGlenn Kasten 47537dc2fccf3f122b79ebd554de209d0a3c94ae161Jean-Michel Trivistatus_t PreviewPlayer::startAudioPlayer_l() { 47637dc2fccf3f122b79ebd554de209d0a3c94ae161Jean-Michel Trivi CHECK(!(mFlags & AUDIO_RUNNING)); 4774ee246c55533bdab8ab5fa0f0581744fe58e7c91Jean-Michel Trivi 4784ee246c55533bdab8ab5fa0f0581744fe58e7c91Jean-Michel Trivi if (mAudioSource == NULL || mAudioPlayer == NULL) { 4794ee246c55533bdab8ab5fa0f0581744fe58e7c91Jean-Michel Trivi return OK; 4804ee246c55533bdab8ab5fa0f0581744fe58e7c91Jean-Michel Trivi } 4815933f3d5e532aaac31ce0e6551c59f0197c0ae3cGlenn Kasten 4825933f3d5e532aaac31ce0e6551c59f0197c0ae3cGlenn Kasten if (!(mFlags & AUDIOPLAYER_STARTED)) { 4835933f3d5e532aaac31ce0e6551c59f0197c0ae3cGlenn Kasten mFlags |= AUDIOPLAYER_STARTED; 4845933f3d5e532aaac31ce0e6551c59f0197c0ae3cGlenn Kasten 4854ee246c55533bdab8ab5fa0f0581744fe58e7c91Jean-Michel Trivi // We've already started the MediaSource in order to enable 4864ee246c55533bdab8ab5fa0f0581744fe58e7c91Jean-Michel Trivi // the prefetcher to read its data. 4874ee246c55533bdab8ab5fa0f0581744fe58e7c91Jean-Michel Trivi status_t err = mVeAudioPlayer->start( 4884ee246c55533bdab8ab5fa0f0581744fe58e7c91Jean-Michel Trivi true /* sourceAlreadyStarted */); 489b2549c73290f1955f3a7731bf98446a45f295dfaGlenn Kasten 4904ee246c55533bdab8ab5fa0f0581744fe58e7c91Jean-Michel Trivi if (err != OK) { 4914ee246c55533bdab8ab5fa0f0581744fe58e7c91Jean-Michel Trivi notifyListener_l(MEDIA_ERROR, MEDIA_ERROR_UNKNOWN, err); 4924ee246c55533bdab8ab5fa0f0581744fe58e7c91Jean-Michel Trivi return err; 4934ee246c55533bdab8ab5fa0f0581744fe58e7c91Jean-Michel Trivi } 494b2549c73290f1955f3a7731bf98446a45f295dfaGlenn Kasten } else { 4954ee246c55533bdab8ab5fa0f0581744fe58e7c91Jean-Michel Trivi mVeAudioPlayer->resume(); 4964ee246c55533bdab8ab5fa0f0581744fe58e7c91Jean-Michel Trivi } 4974ee246c55533bdab8ab5fa0f0581744fe58e7c91Jean-Michel Trivi 4984ee246c55533bdab8ab5fa0f0581744fe58e7c91Jean-Michel Trivi mFlags |= AUDIO_RUNNING; 4994ee246c55533bdab8ab5fa0f0581744fe58e7c91Jean-Michel Trivi 5004ee246c55533bdab8ab5fa0f0581744fe58e7c91Jean-Michel Trivi mWatchForAudioEOS = true; 5014ee246c55533bdab8ab5fa0f0581744fe58e7c91Jean-Michel Trivi 5024ee246c55533bdab8ab5fa0f0581744fe58e7c91Jean-Michel Trivi return OK; 5033610785fa93586ce84a27a27530feb77b8035229Glenn Kasten} 5043610785fa93586ce84a27a27530feb77b8035229Glenn Kasten 5053610785fa93586ce84a27a27530feb77b8035229Glenn Kastenstatus_t PreviewPlayer::play_l() { 5063610785fa93586ce84a27a27530feb77b8035229Glenn Kasten 5073610785fa93586ce84a27a27530feb77b8035229Glenn Kasten if (mFlags & PLAYING) { 5083610785fa93586ce84a27a27530feb77b8035229Glenn Kasten return OK; 5093610785fa93586ce84a27a27530feb77b8035229Glenn Kasten } 5103610785fa93586ce84a27a27530feb77b8035229Glenn Kasten mStartNextPlayer = false; 5113610785fa93586ce84a27a27530feb77b8035229Glenn Kasten 5123610785fa93586ce84a27a27530feb77b8035229Glenn Kasten if (!(mFlags & PREPARED)) { 5135933f3d5e532aaac31ce0e6551c59f0197c0ae3cGlenn Kasten status_t err = prepare_l(); 5145933f3d5e532aaac31ce0e6551c59f0197c0ae3cGlenn Kasten 5155933f3d5e532aaac31ce0e6551c59f0197c0ae3cGlenn Kasten if (err != OK) { 5165933f3d5e532aaac31ce0e6551c59f0197c0ae3cGlenn Kasten return err; 5175933f3d5e532aaac31ce0e6551c59f0197c0ae3cGlenn Kasten } 5185933f3d5e532aaac31ce0e6551c59f0197c0ae3cGlenn Kasten } 5195933f3d5e532aaac31ce0e6551c59f0197c0ae3cGlenn Kasten 5205933f3d5e532aaac31ce0e6551c59f0197c0ae3cGlenn Kasten mFlags |= PLAYING; 5215933f3d5e532aaac31ce0e6551c59f0197c0ae3cGlenn Kasten mFlags |= FIRST_FRAME; 5225933f3d5e532aaac31ce0e6551c59f0197c0ae3cGlenn Kasten 5235933f3d5e532aaac31ce0e6551c59f0197c0ae3cGlenn Kasten bool deferredAudioSeek = false; 5245933f3d5e532aaac31ce0e6551c59f0197c0ae3cGlenn Kasten 5255933f3d5e532aaac31ce0e6551c59f0197c0ae3cGlenn Kasten if (mAudioSource != NULL) { 5265933f3d5e532aaac31ce0e6551c59f0197c0ae3cGlenn Kasten if (mAudioPlayer == NULL) { 5275933f3d5e532aaac31ce0e6551c59f0197c0ae3cGlenn Kasten if (mAudioSink != NULL) { 5285933f3d5e532aaac31ce0e6551c59f0197c0ae3cGlenn Kasten 5295933f3d5e532aaac31ce0e6551c59f0197c0ae3cGlenn Kasten mAudioPlayer = new VideoEditorAudioPlayer(mAudioSink, this); 5305933f3d5e532aaac31ce0e6551c59f0197c0ae3cGlenn Kasten mVeAudioPlayer = 5315933f3d5e532aaac31ce0e6551c59f0197c0ae3cGlenn Kasten (VideoEditorAudioPlayer*)mAudioPlayer; 5325933f3d5e532aaac31ce0e6551c59f0197c0ae3cGlenn Kasten 5335933f3d5e532aaac31ce0e6551c59f0197c0ae3cGlenn Kasten mAudioPlayer->setSource(mAudioSource); 5345933f3d5e532aaac31ce0e6551c59f0197c0ae3cGlenn Kasten 5355933f3d5e532aaac31ce0e6551c59f0197c0ae3cGlenn Kasten mVeAudioPlayer->setAudioMixSettings( 5365933f3d5e532aaac31ce0e6551c59f0197c0ae3cGlenn Kasten mPreviewPlayerAudioMixSettings); 5375933f3d5e532aaac31ce0e6551c59f0197c0ae3cGlenn Kasten 5385933f3d5e532aaac31ce0e6551c59f0197c0ae3cGlenn Kasten mVeAudioPlayer->setAudioMixPCMFileHandle( 5395933f3d5e532aaac31ce0e6551c59f0197c0ae3cGlenn Kasten mAudioMixPCMFileHandle); 5405933f3d5e532aaac31ce0e6551c59f0197c0ae3cGlenn Kasten 5414ee246c55533bdab8ab5fa0f0581744fe58e7c91Jean-Michel Trivi mVeAudioPlayer->setAudioMixStoryBoardSkimTimeStamp( 5424ee246c55533bdab8ab5fa0f0581744fe58e7c91Jean-Michel Trivi mAudioMixStoryBoardTS, mCurrentMediaBeginCutTime, 543b2549c73290f1955f3a7731bf98446a45f295dfaGlenn Kasten mCurrentMediaVolumeValue); 5444ee246c55533bdab8ab5fa0f0581744fe58e7c91Jean-Michel Trivi 5454ee246c55533bdab8ab5fa0f0581744fe58e7c91Jean-Michel Trivi mTimeSource = mVeAudioPlayer; //mAudioPlayer; 5464ee246c55533bdab8ab5fa0f0581744fe58e7c91Jean-Michel Trivi 5474ee246c55533bdab8ab5fa0f0581744fe58e7c91Jean-Michel Trivi deferredAudioSeek = true; 5484ee246c55533bdab8ab5fa0f0581744fe58e7c91Jean-Michel Trivi mWatchForAudioSeekComplete = false; 549b2549c73290f1955f3a7731bf98446a45f295dfaGlenn Kasten mWatchForAudioEOS = true; 5504ee246c55533bdab8ab5fa0f0581744fe58e7c91Jean-Michel Trivi } 5514ee246c55533bdab8ab5fa0f0581744fe58e7c91Jean-Michel Trivi } 5524ee246c55533bdab8ab5fa0f0581744fe58e7c91Jean-Michel Trivi 5534ee246c55533bdab8ab5fa0f0581744fe58e7c91Jean-Michel Trivi CHECK(!(mFlags & AUDIO_RUNNING)); 5544ee246c55533bdab8ab5fa0f0581744fe58e7c91Jean-Michel Trivi 5554ee246c55533bdab8ab5fa0f0581744fe58e7c91Jean-Michel Trivi if (mVideoSource == NULL) { 556b2549c73290f1955f3a7731bf98446a45f295dfaGlenn Kasten status_t err = startAudioPlayer_l(); 5574ee246c55533bdab8ab5fa0f0581744fe58e7c91Jean-Michel Trivi 5584ee246c55533bdab8ab5fa0f0581744fe58e7c91Jean-Michel Trivi if (err != OK) { 5594ee246c55533bdab8ab5fa0f0581744fe58e7c91Jean-Michel Trivi delete mAudioPlayer; 5604ee246c55533bdab8ab5fa0f0581744fe58e7c91Jean-Michel Trivi mAudioPlayer = NULL; 5614ee246c55533bdab8ab5fa0f0581744fe58e7c91Jean-Michel Trivi mFlags &= ~(PLAYING | FIRST_FRAME); 5624ee246c55533bdab8ab5fa0f0581744fe58e7c91Jean-Michel Trivi return err; 563b2549c73290f1955f3a7731bf98446a45f295dfaGlenn Kasten } 5644ee246c55533bdab8ab5fa0f0581744fe58e7c91Jean-Michel Trivi } 5654ee246c55533bdab8ab5fa0f0581744fe58e7c91Jean-Michel Trivi } 5664ee246c55533bdab8ab5fa0f0581744fe58e7c91Jean-Michel Trivi 5674ee246c55533bdab8ab5fa0f0581744fe58e7c91Jean-Michel Trivi if (mTimeSource == NULL && mAudioPlayer == NULL) { 5684ee246c55533bdab8ab5fa0f0581744fe58e7c91Jean-Michel Trivi mTimeSource = &mSystemTimeSource; 5695933f3d5e532aaac31ce0e6551c59f0197c0ae3cGlenn Kasten } 5705933f3d5e532aaac31ce0e6551c59f0197c0ae3cGlenn Kasten 5715933f3d5e532aaac31ce0e6551c59f0197c0ae3cGlenn Kasten // Set the seek option for Image source files and read. 5725933f3d5e532aaac31ce0e6551c59f0197c0ae3cGlenn Kasten // This resets the timestamping for image play 5735933f3d5e532aaac31ce0e6551c59f0197c0ae3cGlenn Kasten if (mIsVideoSourceJpg) { 5745933f3d5e532aaac31ce0e6551c59f0197c0ae3cGlenn Kasten MediaSource::ReadOptions options; 5755933f3d5e532aaac31ce0e6551c59f0197c0ae3cGlenn Kasten MediaBuffer *aLocalBuffer; 5765933f3d5e532aaac31ce0e6551c59f0197c0ae3cGlenn Kasten options.setSeekTo(mSeekTimeUs); 5775933f3d5e532aaac31ce0e6551c59f0197c0ae3cGlenn Kasten mVideoSource->read(&aLocalBuffer, &options); 5785933f3d5e532aaac31ce0e6551c59f0197c0ae3cGlenn Kasten aLocalBuffer->release(); 5795933f3d5e532aaac31ce0e6551c59f0197c0ae3cGlenn Kasten } 5805933f3d5e532aaac31ce0e6551c59f0197c0ae3cGlenn Kasten 5815933f3d5e532aaac31ce0e6551c59f0197c0ae3cGlenn Kasten if (mVideoSource != NULL) { 5825933f3d5e532aaac31ce0e6551c59f0197c0ae3cGlenn Kasten // Kick off video playback 5835933f3d5e532aaac31ce0e6551c59f0197c0ae3cGlenn Kasten postVideoEvent_l(); 5845933f3d5e532aaac31ce0e6551c59f0197c0ae3cGlenn Kasten } 5855933f3d5e532aaac31ce0e6551c59f0197c0ae3cGlenn Kasten 5865933f3d5e532aaac31ce0e6551c59f0197c0ae3cGlenn Kasten if (deferredAudioSeek) { 5875933f3d5e532aaac31ce0e6551c59f0197c0ae3cGlenn Kasten // If there was a seek request while we were paused 5885933f3d5e532aaac31ce0e6551c59f0197c0ae3cGlenn Kasten // and we're just starting up again, honor the request now. 5895933f3d5e532aaac31ce0e6551c59f0197c0ae3cGlenn Kasten seekAudioIfNecessary_l(); 5905933f3d5e532aaac31ce0e6551c59f0197c0ae3cGlenn Kasten } 5915933f3d5e532aaac31ce0e6551c59f0197c0ae3cGlenn Kasten 5925933f3d5e532aaac31ce0e6551c59f0197c0ae3cGlenn Kasten if (mFlags & AT_EOS) { 5935933f3d5e532aaac31ce0e6551c59f0197c0ae3cGlenn Kasten // Legacy behaviour, if a stream finishes playing and then 5945933f3d5e532aaac31ce0e6551c59f0197c0ae3cGlenn Kasten // is started again, we play from the start... 5955933f3d5e532aaac31ce0e6551c59f0197c0ae3cGlenn Kasten seekTo_l(0); 5965933f3d5e532aaac31ce0e6551c59f0197c0ae3cGlenn Kasten } 5975933f3d5e532aaac31ce0e6551c59f0197c0ae3cGlenn Kasten 5985933f3d5e532aaac31ce0e6551c59f0197c0ae3cGlenn Kasten return OK; 599ddaf8fec2c6362785f8f27e59e30bf6bfe858f3bGlenn Kasten} 600ddaf8fec2c6362785f8f27e59e30bf6bfe858f3bGlenn Kasten 6015933f3d5e532aaac31ce0e6551c59f0197c0ae3cGlenn Kasten 6025933f3d5e532aaac31ce0e6551c59f0197c0ae3cGlenn Kastenstatus_t PreviewPlayer::initRenderer_l() { 6035933f3d5e532aaac31ce0e6551c59f0197c0ae3cGlenn Kasten if (mSurface != NULL || mISurface != NULL) { 6045933f3d5e532aaac31ce0e6551c59f0197c0ae3cGlenn Kasten sp<MetaData> meta = mVideoSource->getFormat(); 605ddaf8fec2c6362785f8f27e59e30bf6bfe858f3bGlenn Kasten 606ddaf8fec2c6362785f8f27e59e30bf6bfe858f3bGlenn Kasten int32_t format; 6075933f3d5e532aaac31ce0e6551c59f0197c0ae3cGlenn Kasten const char *component; 608ddaf8fec2c6362785f8f27e59e30bf6bfe858f3bGlenn Kasten int32_t decodedWidth, decodedHeight; 6095933f3d5e532aaac31ce0e6551c59f0197c0ae3cGlenn Kasten CHECK(meta->findInt32(kKeyColorFormat, &format)); 6105933f3d5e532aaac31ce0e6551c59f0197c0ae3cGlenn Kasten CHECK(meta->findCString(kKeyDecoderComponent, &component)); 6115933f3d5e532aaac31ce0e6551c59f0197c0ae3cGlenn Kasten CHECK(meta->findInt32(kKeyWidth, &decodedWidth)); 6125933f3d5e532aaac31ce0e6551c59f0197c0ae3cGlenn Kasten CHECK(meta->findInt32(kKeyHeight, &decodedHeight)); 6135933f3d5e532aaac31ce0e6551c59f0197c0ae3cGlenn Kasten 6145933f3d5e532aaac31ce0e6551c59f0197c0ae3cGlenn Kasten // Must ensure that mVideoRenderer's destructor is actually executed 6155933f3d5e532aaac31ce0e6551c59f0197c0ae3cGlenn Kasten // before creating a new one. 6165933f3d5e532aaac31ce0e6551c59f0197c0ae3cGlenn Kasten IPCThreadState::self()->flushCommands(); 6175933f3d5e532aaac31ce0e6551c59f0197c0ae3cGlenn Kasten 618ddaf8fec2c6362785f8f27e59e30bf6bfe858f3bGlenn Kasten // always use localrenderer since decoded buffers are modified 6195933f3d5e532aaac31ce0e6551c59f0197c0ae3cGlenn Kasten // by postprocessing module 6205933f3d5e532aaac31ce0e6551c59f0197c0ae3cGlenn Kasten // Other decoders are instantiated locally and as a consequence 6215933f3d5e532aaac31ce0e6551c59f0197c0ae3cGlenn Kasten // allocate their buffers in local address space. 6225933f3d5e532aaac31ce0e6551c59f0197c0ae3cGlenn Kasten if(mVideoRenderer == NULL) { 6235933f3d5e532aaac31ce0e6551c59f0197c0ae3cGlenn Kasten 6245933f3d5e532aaac31ce0e6551c59f0197c0ae3cGlenn Kasten mVideoRenderer = PreviewLocalRenderer:: initPreviewLocalRenderer ( 6255933f3d5e532aaac31ce0e6551c59f0197c0ae3cGlenn Kasten false, // previewOnly 6265933f3d5e532aaac31ce0e6551c59f0197c0ae3cGlenn Kasten (OMX_COLOR_FORMATTYPE)format, 6275933f3d5e532aaac31ce0e6551c59f0197c0ae3cGlenn Kasten mSurface, 6285933f3d5e532aaac31ce0e6551c59f0197c0ae3cGlenn Kasten mOutputVideoWidth, mOutputVideoHeight, 629ddaf8fec2c6362785f8f27e59e30bf6bfe858f3bGlenn Kasten mOutputVideoWidth, mOutputVideoHeight); 630ddaf8fec2c6362785f8f27e59e30bf6bfe858f3bGlenn Kasten 6315933f3d5e532aaac31ce0e6551c59f0197c0ae3cGlenn Kasten if ( mVideoRenderer == NULL ) 6325933f3d5e532aaac31ce0e6551c59f0197c0ae3cGlenn Kasten { 633ddaf8fec2c6362785f8f27e59e30bf6bfe858f3bGlenn Kasten return UNKNOWN_ERROR; 634ddaf8fec2c6362785f8f27e59e30bf6bfe858f3bGlenn Kasten } 6355933f3d5e532aaac31ce0e6551c59f0197c0ae3cGlenn Kasten return OK; 636ddaf8fec2c6362785f8f27e59e30bf6bfe858f3bGlenn Kasten } 637ddaf8fec2c6362785f8f27e59e30bf6bfe858f3bGlenn Kasten } 6385933f3d5e532aaac31ce0e6551c59f0197c0ae3cGlenn Kasten return OK; 639ddaf8fec2c6362785f8f27e59e30bf6bfe858f3bGlenn Kasten} 6405933f3d5e532aaac31ce0e6551c59f0197c0ae3cGlenn Kasten 641ddaf8fec2c6362785f8f27e59e30bf6bfe858f3bGlenn Kasten 6425933f3d5e532aaac31ce0e6551c59f0197c0ae3cGlenn Kastenvoid PreviewPlayer::setISurface(const sp<ISurface> &isurface) { 643ddaf8fec2c6362785f8f27e59e30bf6bfe858f3bGlenn Kasten Mutex::Autolock autoLock(mLock); 644ddaf8fec2c6362785f8f27e59e30bf6bfe858f3bGlenn Kasten mISurface = isurface; 645ddaf8fec2c6362785f8f27e59e30bf6bfe858f3bGlenn Kasten} 646ddaf8fec2c6362785f8f27e59e30bf6bfe858f3bGlenn Kasten 647ddaf8fec2c6362785f8f27e59e30bf6bfe858f3bGlenn Kasten 648ddaf8fec2c6362785f8f27e59e30bf6bfe858f3bGlenn Kastenstatus_t PreviewPlayer::seekTo(int64_t timeUs) { 6495933f3d5e532aaac31ce0e6551c59f0197c0ae3cGlenn Kasten 6505933f3d5e532aaac31ce0e6551c59f0197c0ae3cGlenn Kasten if ((mExtractorFlags & MediaExtractor::CAN_SEEK) || (mIsVideoSourceJpg)) { 651ddaf8fec2c6362785f8f27e59e30bf6bfe858f3bGlenn Kasten Mutex::Autolock autoLock(mLock); 652ddaf8fec2c6362785f8f27e59e30bf6bfe858f3bGlenn Kasten return seekTo_l(timeUs); 653ddaf8fec2c6362785f8f27e59e30bf6bfe858f3bGlenn Kasten } 6545933f3d5e532aaac31ce0e6551c59f0197c0ae3cGlenn Kasten 655ddaf8fec2c6362785f8f27e59e30bf6bfe858f3bGlenn Kasten return OK; 656ddaf8fec2c6362785f8f27e59e30bf6bfe858f3bGlenn Kasten} 6575933f3d5e532aaac31ce0e6551c59f0197c0ae3cGlenn Kasten 658ddaf8fec2c6362785f8f27e59e30bf6bfe858f3bGlenn Kasten 6595933f3d5e532aaac31ce0e6551c59f0197c0ae3cGlenn Kastenstatus_t PreviewPlayer::getVideoDimensions( 6605933f3d5e532aaac31ce0e6551c59f0197c0ae3cGlenn Kasten int32_t *width, int32_t *height) const { 6615933f3d5e532aaac31ce0e6551c59f0197c0ae3cGlenn Kasten Mutex::Autolock autoLock(mLock); 6625933f3d5e532aaac31ce0e6551c59f0197c0ae3cGlenn Kasten 6635933f3d5e532aaac31ce0e6551c59f0197c0ae3cGlenn Kasten if (mVideoWidth < 0 || mVideoHeight < 0) { 6645933f3d5e532aaac31ce0e6551c59f0197c0ae3cGlenn Kasten return UNKNOWN_ERROR; 6655933f3d5e532aaac31ce0e6551c59f0197c0ae3cGlenn Kasten } 6665933f3d5e532aaac31ce0e6551c59f0197c0ae3cGlenn Kasten 6675933f3d5e532aaac31ce0e6551c59f0197c0ae3cGlenn Kasten *width = mVideoWidth; 6685933f3d5e532aaac31ce0e6551c59f0197c0ae3cGlenn Kasten *height = mVideoHeight; 6697349b2e742b2cedc6d149fac62ed661ad7d47decGlenn Kasten 6705933f3d5e532aaac31ce0e6551c59f0197c0ae3cGlenn Kasten return OK; 6715933f3d5e532aaac31ce0e6551c59f0197c0ae3cGlenn Kasten} 6725933f3d5e532aaac31ce0e6551c59f0197c0ae3cGlenn Kasten 6735933f3d5e532aaac31ce0e6551c59f0197c0ae3cGlenn Kasten 6745933f3d5e532aaac31ce0e6551c59f0197c0ae3cGlenn Kastenstatus_t PreviewPlayer::initAudioDecoder() { 6755933f3d5e532aaac31ce0e6551c59f0197c0ae3cGlenn Kasten sp<MetaData> meta = mAudioTrack->getFormat(); 6765933f3d5e532aaac31ce0e6551c59f0197c0ae3cGlenn Kasten const char *mime; 6775933f3d5e532aaac31ce0e6551c59f0197c0ae3cGlenn Kasten CHECK(meta->findCString(kKeyMIMEType, &mime)); 6785933f3d5e532aaac31ce0e6551c59f0197c0ae3cGlenn Kasten 6795933f3d5e532aaac31ce0e6551c59f0197c0ae3cGlenn Kasten if (!strcasecmp(mime, MEDIA_MIMETYPE_AUDIO_RAW)) { 6805933f3d5e532aaac31ce0e6551c59f0197c0ae3cGlenn Kasten mAudioSource = mAudioTrack; 6815933f3d5e532aaac31ce0e6551c59f0197c0ae3cGlenn Kasten } else { 6825933f3d5e532aaac31ce0e6551c59f0197c0ae3cGlenn Kasten sp<MediaSource> aRawSource; 6835933f3d5e532aaac31ce0e6551c59f0197c0ae3cGlenn Kasten aRawSource = OMXCodec::Create( 6845933f3d5e532aaac31ce0e6551c59f0197c0ae3cGlenn Kasten mClient.interface(), mAudioTrack->getFormat(), 6855933f3d5e532aaac31ce0e6551c59f0197c0ae3cGlenn Kasten false, // createEncoder 68613837cf3f7be0eb8b1a9552bd99a89f98c987720Jean-Michel Trivi mAudioTrack); 687 688 if(aRawSource != NULL) { 689 LOGV("initAudioDecoder: new VideoEditorSRC"); 690 mAudioSource = new VideoEditorSRC(aRawSource); 691 } 692 } 693 694 if (mAudioSource != NULL) { 695 int64_t durationUs; 696 if (mAudioTrack->getFormat()->findInt64(kKeyDuration, &durationUs)) { 697 Mutex::Autolock autoLock(mMiscStateLock); 698 if (mDurationUs < 0 || durationUs > mDurationUs) { 699 mDurationUs = durationUs; 700 } 701 } 702 status_t err = mAudioSource->start(); 703 704 if (err != OK) { 705 mAudioSource.clear(); 706 return err; 707 } 708 } else if (!strcasecmp(mime, MEDIA_MIMETYPE_AUDIO_QCELP)) { 709 // For legacy reasons we're simply going to ignore the absence 710 // of an audio decoder for QCELP instead of aborting playback 711 // altogether. 712 return OK; 713 } 714 715 return mAudioSource != NULL ? OK : UNKNOWN_ERROR; 716} 717 718 719status_t PreviewPlayer::initVideoDecoder(uint32_t flags) { 720 721 mVideoSource = OMXCodec::Create( 722 mClient.interface(), mVideoTrack->getFormat(), 723 false, 724 mVideoTrack, 725 NULL, flags); 726 727 if (mVideoSource != NULL) { 728 int64_t durationUs; 729 if (mVideoTrack->getFormat()->findInt64(kKeyDuration, &durationUs)) { 730 Mutex::Autolock autoLock(mMiscStateLock); 731 if (mDurationUs < 0 || durationUs > mDurationUs) { 732 mDurationUs = durationUs; 733 } 734 } 735 736 CHECK(mVideoTrack->getFormat()->findInt32(kKeyWidth, &mVideoWidth)); 737 CHECK(mVideoTrack->getFormat()->findInt32(kKeyHeight, &mVideoHeight)); 738 739 mReportedWidth = mVideoWidth; 740 mReportedHeight = mVideoHeight; 741 742 status_t err = mVideoSource->start(); 743 744 if (err != OK) { 745 mVideoSource.clear(); 746 return err; 747 } 748 } 749 750 return mVideoSource != NULL ? OK : UNKNOWN_ERROR; 751} 752 753 754void PreviewPlayer::onVideoEvent() { 755 uint32_t i=0; 756 bool bAppliedVideoEffect = false; 757 M4OSA_ERR err1 = M4NO_ERROR; 758 int64_t imageFrameTimeUs = 0; 759 760 Mutex::Autolock autoLock(mLock); 761 if (!mVideoEventPending) { 762 // The event has been cancelled in reset_l() but had already 763 // been scheduled for execution at that time. 764 return; 765 } 766 mVideoEventPending = false; 767 768 if (mFlags & SEEK_PREVIEW) { 769 mFlags &= ~SEEK_PREVIEW; 770 return; 771 } 772 773 TimeSource *ts_st = &mSystemTimeSource; 774 int64_t timeStartUs = ts_st->getRealTimeUs(); 775 776 if (mSeeking) { 777 if (mLastVideoBuffer) { 778 mLastVideoBuffer->release(); 779 mLastVideoBuffer = NULL; 780 } 781 782 783 if(mAudioSource != NULL) { 784 785 // We're going to seek the video source first, followed by 786 // the audio source. 787 // In order to avoid jumps in the DataSource offset caused by 788 // the audio codec prefetching data from the old locations 789 // while the video codec is already reading data from the new 790 // locations, we'll "pause" the audio source, causing it to 791 // stop reading input data until a subsequent seek. 792 793 if (mAudioPlayer != NULL && (mFlags & AUDIO_RUNNING)) { 794 mAudioPlayer->pause(); 795 mFlags &= ~AUDIO_RUNNING; 796 } 797 mAudioSource->pause(); 798 } 799 } 800 801 if (!mVideoBuffer) { 802 MediaSource::ReadOptions options; 803 if (mSeeking) { 804 LOGV("LV PLAYER seeking to %lld us (%.2f secs)", mSeekTimeUs, 805 mSeekTimeUs / 1E6); 806 807 options.setSeekTo( 808 mSeekTimeUs, MediaSource::ReadOptions::SEEK_CLOSEST); 809 } 810 for (;;) { 811 status_t err = mVideoSource->read(&mVideoBuffer, &options); 812 options.clearSeekTo(); 813 814 if (err != OK) { 815 CHECK_EQ(mVideoBuffer, NULL); 816 817 if (err == INFO_FORMAT_CHANGED) { 818 LOGV("LV PLAYER VideoSource signalled format change"); 819 notifyVideoSize_l(); 820 sp<MetaData> meta = mVideoSource->getFormat(); 821 822 CHECK(meta->findInt32(kKeyWidth, &mReportedWidth)); 823 CHECK(meta->findInt32(kKeyHeight, &mReportedHeight)); 824 if (mVideoRenderer != NULL) { 825 mVideoRendererIsPreview = false; 826 err = initRenderer_l(); 827 if (err != OK) { 828 postStreamDoneEvent_l(err); 829 } 830 831 } 832 continue; 833 } 834 // So video playback is complete, but we may still have 835 // a seek request pending that needs to be applied to the audio track 836 if (mSeeking) { 837 LOGV("video stream ended while seeking!"); 838 } 839 finishSeekIfNecessary(-1); 840 LOGV("PreviewPlayer: onVideoEvent EOS reached."); 841 mFlags |= VIDEO_AT_EOS; 842 mOverlayUpdateEventPosted = false; 843 postStreamDoneEvent_l(err); 844 return; 845 } 846 847 if (mVideoBuffer->range_length() == 0) { 848 // Some decoders, notably the PV AVC software decoder 849 // return spurious empty buffers that we just want to ignore. 850 851 mVideoBuffer->release(); 852 mVideoBuffer = NULL; 853 continue; 854 } 855 856 int64_t videoTimeUs; 857 CHECK(mVideoBuffer->meta_data()->findInt64(kKeyTime, &videoTimeUs)); 858 859 if((videoTimeUs/1000) < mPlayBeginTimeMsec) { 860 // Frames are before begin cut time 861 // Donot render 862 mVideoBuffer->release(); 863 mVideoBuffer = NULL; 864 continue; 865 } 866 867 break; 868 } 869 } 870 871 mNumberDecVideoFrames++; 872 873 int64_t timeUs; 874 CHECK(mVideoBuffer->meta_data()->findInt64(kKeyTime, &timeUs)); 875 876 { 877 Mutex::Autolock autoLock(mMiscStateLock); 878 mVideoTimeUs = timeUs; 879 } 880 881 mDecodedVideoTs = timeUs; 882 883 if(!mStartNextPlayer) { 884 int64_t playbackTimeRemaining = (mPlayEndTimeMsec*1000) - timeUs; 885 if(playbackTimeRemaining <= 1500000) { 886 //When less than 1.5 sec of playback left 887 // send notification to start next player 888 889 mStartNextPlayer = true; 890 notifyListener_l(0xAAAAAAAA); 891 } 892 } 893 894 bool wasSeeking = mSeeking; 895 finishSeekIfNecessary(timeUs); 896 if (mAudioPlayer != NULL && !(mFlags & (AUDIO_RUNNING))) { 897 status_t err = startAudioPlayer_l(); 898 if (err != OK) { 899 LOGE("Starting the audio player failed w/ err %d", err); 900 return; 901 } 902 } 903 904 TimeSource *ts = (mFlags & AUDIO_AT_EOS) ? &mSystemTimeSource : mTimeSource; 905 906 if(ts == NULL) { 907 mVideoBuffer->release(); 908 mVideoBuffer = NULL; 909 return; 910 } 911 912 if(!mIsVideoSourceJpg) { 913 if (mFlags & FIRST_FRAME) { 914 mFlags &= ~FIRST_FRAME; 915 916 mTimeSourceDeltaUs = ts->getRealTimeUs() - timeUs; 917 } 918 919 int64_t realTimeUs, mediaTimeUs; 920 if (!(mFlags & AUDIO_AT_EOS) && mAudioPlayer != NULL 921 && mAudioPlayer->getMediaTimeMapping(&realTimeUs, &mediaTimeUs)) { 922 mTimeSourceDeltaUs = realTimeUs - mediaTimeUs; 923 } 924 925 int64_t nowUs = ts->getRealTimeUs() - mTimeSourceDeltaUs; 926 927 int64_t latenessUs = nowUs - timeUs; 928 929 if (wasSeeking) { 930 // Let's display the first frame after seeking right away. 931 latenessUs = 0; 932 } 933 LOGV("Audio time stamp = %lld and video time stamp = %lld", 934 ts->getRealTimeUs(),timeUs); 935 if (latenessUs > 40000) { 936 // We're more than 40ms late. 937 938 LOGV("LV PLAYER we're late by %lld us (%.2f secs)", 939 latenessUs, latenessUs / 1E6); 940 941 mVideoBuffer->release(); 942 mVideoBuffer = NULL; 943 postVideoEvent_l(0); 944 return; 945 } 946 947 if (latenessUs < -25000) { 948 // We're more than 25ms early. 949 LOGV("We're more than 25ms early, lateness %lld", latenessUs); 950 951 postVideoEvent_l(25000); 952 return; 953 } 954 } 955 956 if (mVideoRendererIsPreview || mVideoRenderer == NULL) { 957 mVideoRendererIsPreview = false; 958 959 status_t err = initRenderer_l(); 960 if (err != OK) { 961 postStreamDoneEvent_l(err); 962 } 963 } 964 965 // If timestamp exceeds endCutTime of clip, donot render 966 if((timeUs/1000) > mPlayEndTimeMsec) { 967 if (mLastVideoBuffer) { 968 mLastVideoBuffer->release(); 969 mLastVideoBuffer = NULL; 970 } 971 mLastVideoBuffer = mVideoBuffer; 972 mVideoBuffer = NULL; 973 mFlags |= VIDEO_AT_EOS; 974 mFlags |= AUDIO_AT_EOS; 975 LOGV("PreviewPlayer: onVideoEvent timeUs > mPlayEndTime; send EOS.."); 976 mOverlayUpdateEventPosted = false; 977 postStreamDoneEvent_l(ERROR_END_OF_STREAM); 978 return; 979 } 980 981 // Post processing to apply video effects 982 for(i=0;i<mNumberEffects;i++) { 983 // First check if effect starttime matches the clip being previewed 984 if((mEffectsSettings[i].uiStartTime < (mDecVideoTsStoryBoard/1000)) || 985 (mEffectsSettings[i].uiStartTime >= 986 ((mDecVideoTsStoryBoard/1000) + mPlayEndTimeMsec - mPlayBeginTimeMsec))) 987 { 988 // This effect doesn't belong to this clip, check next one 989 continue; 990 } 991 // Check if effect applies to this particular frame timestamp 992 if((mEffectsSettings[i].uiStartTime <= 993 (((timeUs+mDecVideoTsStoryBoard)/1000)-mPlayBeginTimeMsec)) && 994 ((mEffectsSettings[i].uiStartTime+mEffectsSettings[i].uiDuration) >= 995 (((timeUs+mDecVideoTsStoryBoard)/1000)-mPlayBeginTimeMsec)) 996 && (mEffectsSettings[i].uiDuration != 0)) { 997 setVideoPostProcessingNode( 998 mEffectsSettings[i].VideoEffectType, TRUE); 999 } 1000 else { 1001 setVideoPostProcessingNode( 1002 mEffectsSettings[i].VideoEffectType, FALSE); 1003 } 1004 } 1005 1006 //Provide the overlay Update indication when there is an overlay effect 1007 if (mCurrentVideoEffect & VIDEO_EFFECT_FRAMING) { 1008 mCurrentVideoEffect &= ~VIDEO_EFFECT_FRAMING; //never apply framing here. 1009 if (!mOverlayUpdateEventPosted) { 1010 // Find the effect in effectSettings array 1011 int index; 1012 for (index = 0; index < mNumberEffects; index++) { 1013 M4OSA_UInt32 timeMs = mDecodedVideoTs/1000; 1014 M4OSA_UInt32 timeOffset = mDecVideoTsStoryBoard/1000; 1015 if(mEffectsSettings[index].VideoEffectType == 1016 M4xVSS_kVideoEffectType_Framing) { 1017 if (((mEffectsSettings[index].uiStartTime + 1) <= 1018 timeMs + timeOffset - mPlayBeginTimeMsec) && 1019 ((mEffectsSettings[index].uiStartTime - 1 + 1020 mEffectsSettings[index].uiDuration) >= 1021 timeMs + timeOffset - mPlayBeginTimeMsec)) 1022 { 1023 break; 1024 } 1025 } 1026 } 1027 if (index < mNumberEffects) { 1028 mCurrFramingEffectIndex = index; 1029 mOverlayUpdateEventPosted = true; 1030 postOverlayUpdateEvent_l(); 1031 LOGV("Framing index = %d", mCurrFramingEffectIndex); 1032 } else { 1033 LOGV("No framing effects found"); 1034 } 1035 } 1036 1037 } else if (mOverlayUpdateEventPosted) { 1038 //Post the event when the overlay is no more valid 1039 LOGV("Overlay is Done"); 1040 mOverlayUpdateEventPosted = false; 1041 postOverlayUpdateEvent_l(); 1042 } 1043 1044 1045 if (mCurrentVideoEffect != VIDEO_EFFECT_NONE) { 1046 err1 = doVideoPostProcessing(); 1047 if(err1 != M4NO_ERROR) { 1048 LOGE("doVideoPostProcessing returned err"); 1049 bAppliedVideoEffect = false; 1050 } 1051 else { 1052 bAppliedVideoEffect = true; 1053 } 1054 } 1055 else { 1056 bAppliedVideoEffect = false; 1057 if(mRenderingMode != MEDIA_RENDERING_INVALID) { 1058 // No effects to be applied, but media rendering to be done 1059 err1 = doMediaRendering(); 1060 if(err1 != M4NO_ERROR) { 1061 LOGE("doMediaRendering returned err"); 1062 //Use original mVideoBuffer for rendering 1063 mVideoResizedOrCropped = false; 1064 } 1065 } 1066 } 1067 1068 if (mVideoRenderer != NULL) { 1069 LOGV("mVideoRenderer CALL render()"); 1070 mVideoRenderer->render(); 1071 } 1072 1073 if (mLastVideoBuffer) { 1074 mLastVideoBuffer->release(); 1075 mLastVideoBuffer = NULL; 1076 } 1077 1078 mLastVideoBuffer = mVideoBuffer; 1079 mVideoBuffer = NULL; 1080 1081 // Post progress callback based on callback interval set 1082 if(mNumberDecVideoFrames >= mProgressCbInterval) { 1083 postProgressCallbackEvent_l(); 1084 mNumberDecVideoFrames = 0; // reset counter 1085 } 1086 1087 // if reached EndCutTime of clip, post EOS event 1088 if((timeUs/1000) >= mPlayEndTimeMsec) { 1089 LOGV("PreviewPlayer: onVideoEvent EOS."); 1090 mFlags |= VIDEO_AT_EOS; 1091 mFlags |= AUDIO_AT_EOS; 1092 mOverlayUpdateEventPosted = false; 1093 postStreamDoneEvent_l(ERROR_END_OF_STREAM); 1094 } 1095 else { 1096 if(!mIsVideoSourceJpg) { 1097 postVideoEvent_l(0); 1098 } 1099 else { 1100 postVideoEvent_l(33000); 1101 } 1102 } 1103} 1104 1105status_t PreviewPlayer::prepare() { 1106 Mutex::Autolock autoLock(mLock); 1107 return prepare_l(); 1108} 1109 1110status_t PreviewPlayer::prepare_l() { 1111 if (mFlags & PREPARED) { 1112 return OK; 1113 } 1114 1115 if (mFlags & PREPARING) { 1116 return UNKNOWN_ERROR; 1117 } 1118 1119 mIsAsyncPrepare = false; 1120 status_t err = prepareAsync_l(); 1121 1122 if (err != OK) { 1123 return err; 1124 } 1125 1126 while (mFlags & PREPARING) { 1127 mPreparedCondition.wait(mLock); 1128 } 1129 1130 return mPrepareResult; 1131} 1132 1133status_t PreviewPlayer::prepareAsync_l() { 1134 if (mFlags & PREPARING) { 1135 return UNKNOWN_ERROR; // async prepare already pending 1136 } 1137 1138 if (!mQueueStarted) { 1139 mQueue.start(); 1140 mQueueStarted = true; 1141 } 1142 1143 mFlags |= PREPARING; 1144 mAsyncPrepareEvent = new PreviewPlayerEvent( 1145 this, &PreviewPlayer::onPrepareAsyncEvent); 1146 1147 mQueue.postEvent(mAsyncPrepareEvent); 1148 1149 return OK; 1150} 1151 1152status_t PreviewPlayer::finishSetDataSource_l() { 1153 sp<DataSource> dataSource; 1154 sp<MediaExtractor> extractor; 1155 1156 dataSource = DataSource::CreateFromURI(mUri.string(), &mUriHeaders); 1157 1158 if (dataSource == NULL) { 1159 return UNKNOWN_ERROR; 1160 } 1161 1162 //If file type is .rgb, then no need to check for Extractor 1163 int uriLen = strlen(mUri); 1164 int startOffset = uriLen - 4; 1165 if(!strncasecmp(mUri+startOffset, ".rgb", 4)) { 1166 extractor = NULL; 1167 } 1168 else { 1169 extractor = MediaExtractor::Create(dataSource, 1170 MEDIA_MIMETYPE_CONTAINER_MPEG4); 1171 } 1172 1173 if (extractor == NULL) { 1174 LOGV("PreviewPlayer::finishSetDataSource_l extractor == NULL"); 1175 return setDataSource_l_jpg(); 1176 } 1177 1178 return setDataSource_l(extractor); 1179} 1180 1181 1182// static 1183bool PreviewPlayer::ContinuePreparation(void *cookie) { 1184 PreviewPlayer *me = static_cast<PreviewPlayer *>(cookie); 1185 1186 return (me->mFlags & PREPARE_CANCELLED) == 0; 1187} 1188 1189void PreviewPlayer::onPrepareAsyncEvent() { 1190 Mutex::Autolock autoLock(mLock); 1191 LOGV("onPrepareAsyncEvent"); 1192 1193 if (mFlags & PREPARE_CANCELLED) { 1194 LOGV("LV PLAYER prepare was cancelled before doing anything"); 1195 abortPrepare(UNKNOWN_ERROR); 1196 return; 1197 } 1198 1199 if (mUri.size() > 0) { 1200 status_t err = finishSetDataSource_l(); 1201 1202 if (err != OK) { 1203 abortPrepare(err); 1204 return; 1205 } 1206 } 1207 1208 if (mVideoTrack != NULL && mVideoSource == NULL) { 1209 status_t err = initVideoDecoder(OMXCodec::kHardwareCodecsOnly); 1210 1211 if (err != OK) { 1212 abortPrepare(err); 1213 return; 1214 } 1215 } 1216 1217 if (mAudioTrack != NULL && mAudioSource == NULL) { 1218 status_t err = initAudioDecoder(); 1219 1220 if (err != OK) { 1221 abortPrepare(err); 1222 return; 1223 } 1224 } 1225 finishAsyncPrepare_l(); 1226 1227} 1228 1229void PreviewPlayer::finishAsyncPrepare_l() { 1230 if (mIsAsyncPrepare) { 1231 if (mVideoSource == NULL) { 1232 LOGV("finishAsyncPrepare_l: MEDIA_SET_VIDEO_SIZE 0 0 "); 1233 notifyListener_l(MEDIA_SET_VIDEO_SIZE, 0, 0); 1234 } else { 1235 LOGV("finishAsyncPrepare_l: MEDIA_SET_VIDEO_SIZE"); 1236 notifyVideoSize_l(); 1237 } 1238 LOGV("finishAsyncPrepare_l: MEDIA_PREPARED"); 1239 notifyListener_l(MEDIA_PREPARED); 1240 } 1241 1242 mPrepareResult = OK; 1243 mFlags &= ~(PREPARING|PREPARE_CANCELLED); 1244 mFlags |= PREPARED; 1245 mAsyncPrepareEvent = NULL; 1246 mPreparedCondition.broadcast(); 1247} 1248 1249status_t PreviewPlayer::suspend() { 1250 LOGV("suspend"); 1251 Mutex::Autolock autoLock(mLock); 1252 1253 if (mSuspensionState != NULL) { 1254 if (mLastVideoBuffer == NULL) { 1255 //go into here if video is suspended again 1256 //after resuming without being played between 1257 //them 1258 SuspensionState *state = mSuspensionState; 1259 mSuspensionState = NULL; 1260 reset_l(); 1261 mSuspensionState = state; 1262 return OK; 1263 } 1264 1265 delete mSuspensionState; 1266 mSuspensionState = NULL; 1267 } 1268 1269 if (mFlags & PREPARING) { 1270 mFlags |= PREPARE_CANCELLED; 1271 } 1272 1273 while (mFlags & PREPARING) { 1274 mPreparedCondition.wait(mLock); 1275 } 1276 1277 SuspensionState *state = new SuspensionState; 1278 state->mUri = mUri; 1279 state->mUriHeaders = mUriHeaders; 1280 state->mFileSource = mFileSource; 1281 1282 state->mFlags = mFlags & (PLAYING | AUTO_LOOPING | LOOPING | AT_EOS); 1283 getPosition(&state->mPositionUs); 1284 1285 if (mLastVideoBuffer) { 1286 size_t size = mLastVideoBuffer->range_length(); 1287 if (size) { 1288 int32_t unreadable; 1289 if (!mLastVideoBuffer->meta_data()->findInt32( 1290 kKeyIsUnreadable, &unreadable) 1291 || unreadable == 0) { 1292 state->mLastVideoFrameSize = size; 1293 state->mLastVideoFrame = malloc(size); 1294 memcpy(state->mLastVideoFrame, 1295 (const uint8_t *)mLastVideoBuffer->data() 1296 + mLastVideoBuffer->range_offset(), 1297 size); 1298 1299 state->mVideoWidth = mVideoWidth; 1300 state->mVideoHeight = mVideoHeight; 1301 1302 sp<MetaData> meta = mVideoSource->getFormat(); 1303 CHECK(meta->findInt32(kKeyColorFormat, &state->mColorFormat)); 1304 CHECK(meta->findInt32(kKeyWidth, &state->mDecodedWidth)); 1305 CHECK(meta->findInt32(kKeyHeight, &state->mDecodedHeight)); 1306 } else { 1307 LOGV("Unable to save last video frame, we have no access to " 1308 "the decoded video data."); 1309 } 1310 } 1311 } 1312 1313 reset_l(); 1314 1315 mSuspensionState = state; 1316 1317 return OK; 1318} 1319 1320status_t PreviewPlayer::resume() { 1321 LOGV("resume"); 1322 Mutex::Autolock autoLock(mLock); 1323 1324 if (mSuspensionState == NULL) { 1325 return INVALID_OPERATION; 1326 } 1327 1328 SuspensionState *state = mSuspensionState; 1329 mSuspensionState = NULL; 1330 1331 status_t err; 1332 if (state->mFileSource != NULL) { 1333 err = AwesomePlayer::setDataSource_l(state->mFileSource); 1334 1335 if (err == OK) { 1336 mFileSource = state->mFileSource; 1337 } 1338 } else { 1339 err = AwesomePlayer::setDataSource_l(state->mUri, &state->mUriHeaders); 1340 } 1341 1342 if (err != OK) { 1343 delete state; 1344 state = NULL; 1345 1346 return err; 1347 } 1348 1349 seekTo_l(state->mPositionUs); 1350 1351 mFlags = state->mFlags & (AUTO_LOOPING | LOOPING | AT_EOS); 1352 1353 if (state->mLastVideoFrame && (mSurface != NULL || mISurface != NULL)) { 1354 mVideoRenderer = 1355 PreviewLocalRenderer::initPreviewLocalRenderer( 1356 true, // previewOnly 1357 (OMX_COLOR_FORMATTYPE)state->mColorFormat, 1358 mSurface, 1359 state->mVideoWidth, 1360 state->mVideoHeight, 1361 state->mDecodedWidth, 1362 state->mDecodedHeight); 1363 1364 mVideoRendererIsPreview = true; 1365 1366 ((PreviewLocalRenderer *)mVideoRenderer.get())->render( 1367 state->mLastVideoFrame, state->mLastVideoFrameSize); 1368 } 1369 1370 if (state->mFlags & PLAYING) { 1371 play_l(); 1372 } 1373 1374 mSuspensionState = state; 1375 state = NULL; 1376 1377 return OK; 1378} 1379 1380 1381status_t PreviewPlayer::loadEffectsSettings( 1382 M4VSS3GPP_EffectSettings* pEffectSettings, int nEffects) { 1383 M4OSA_UInt32 i = 0, rgbSize = 0; 1384 M4VIFI_UInt8 *tmp = M4OSA_NULL; 1385 1386 mNumberEffects = nEffects; 1387 mEffectsSettings = pEffectSettings; 1388 return OK; 1389} 1390 1391status_t PreviewPlayer::loadAudioMixSettings( 1392 M4xVSS_AudioMixingSettings* pAudioMixSettings) { 1393 1394 LOGV("PreviewPlayer: loadAudioMixSettings: "); 1395 mPreviewPlayerAudioMixSettings = pAudioMixSettings; 1396 return OK; 1397} 1398 1399status_t PreviewPlayer::setAudioMixPCMFileHandle( 1400 M4OSA_Context pAudioMixPCMFileHandle) { 1401 1402 LOGV("PreviewPlayer: setAudioMixPCMFileHandle: "); 1403 mAudioMixPCMFileHandle = pAudioMixPCMFileHandle; 1404 return OK; 1405} 1406 1407status_t PreviewPlayer::setAudioMixStoryBoardParam( 1408 M4OSA_UInt32 audioMixStoryBoardTS, 1409 M4OSA_UInt32 currentMediaBeginCutTime, 1410 M4OSA_UInt32 primaryTrackVolValue ) { 1411 1412 mAudioMixStoryBoardTS = audioMixStoryBoardTS; 1413 mCurrentMediaBeginCutTime = currentMediaBeginCutTime; 1414 mCurrentMediaVolumeValue = primaryTrackVolValue; 1415 return OK; 1416} 1417 1418status_t PreviewPlayer::setPlaybackBeginTime(uint32_t msec) { 1419 1420 mPlayBeginTimeMsec = msec; 1421 return OK; 1422} 1423 1424status_t PreviewPlayer::setPlaybackEndTime(uint32_t msec) { 1425 1426 mPlayEndTimeMsec = msec; 1427 return OK; 1428} 1429 1430status_t PreviewPlayer::setStoryboardStartTime(uint32_t msec) { 1431 1432 mStoryboardStartTimeMsec = msec; 1433 mDecVideoTsStoryBoard = mStoryboardStartTimeMsec*1000; 1434 return OK; 1435} 1436 1437status_t PreviewPlayer::setProgressCallbackInterval(uint32_t cbInterval) { 1438 1439 mProgressCbInterval = cbInterval; 1440 return OK; 1441} 1442 1443 1444status_t PreviewPlayer::setMediaRenderingMode( 1445 M4xVSS_MediaRendering mode, 1446 M4VIDEOEDITING_VideoFrameSize outputVideoSize) { 1447 1448 mRenderingMode = mode; 1449 1450 /* reset boolean for each clip*/ 1451 mVideoResizedOrCropped = false; 1452 1453 switch(outputVideoSize) { 1454 case M4VIDEOEDITING_kSQCIF: 1455 mOutputVideoWidth = 128; 1456 mOutputVideoHeight = 96; 1457 break; 1458 1459 case M4VIDEOEDITING_kQQVGA: 1460 mOutputVideoWidth = 160; 1461 mOutputVideoHeight = 120; 1462 break; 1463 1464 case M4VIDEOEDITING_kQCIF: 1465 mOutputVideoWidth = 176; 1466 mOutputVideoHeight = 144; 1467 break; 1468 1469 case M4VIDEOEDITING_kQVGA: 1470 mOutputVideoWidth = 320; 1471 mOutputVideoHeight = 240; 1472 break; 1473 1474 case M4VIDEOEDITING_kCIF: 1475 mOutputVideoWidth = 352; 1476 mOutputVideoHeight = 288; 1477 break; 1478 1479 case M4VIDEOEDITING_kVGA: 1480 mOutputVideoWidth = 640; 1481 mOutputVideoHeight = 480; 1482 break; 1483 1484 case M4VIDEOEDITING_kWVGA: 1485 mOutputVideoWidth = 800; 1486 mOutputVideoHeight = 480; 1487 break; 1488 1489 case M4VIDEOEDITING_kNTSC: 1490 mOutputVideoWidth = 720; 1491 mOutputVideoHeight = 480; 1492 break; 1493 1494 case M4VIDEOEDITING_k640_360: 1495 mOutputVideoWidth = 640; 1496 mOutputVideoHeight = 360; 1497 break; 1498 1499 case M4VIDEOEDITING_k854_480: 1500 mOutputVideoWidth = 854; 1501 mOutputVideoHeight = 480; 1502 break; 1503 1504 case M4VIDEOEDITING_kHD1280: 1505 mOutputVideoWidth = 1280; 1506 mOutputVideoHeight = 720; 1507 break; 1508 1509 case M4VIDEOEDITING_kHD1080: 1510 mOutputVideoWidth = 1080; 1511 mOutputVideoHeight = 720; 1512 break; 1513 1514 case M4VIDEOEDITING_kHD960: 1515 mOutputVideoWidth = 960; 1516 mOutputVideoHeight = 720; 1517 break; 1518 1519 default: 1520 LOGE("unsupported output video size set"); 1521 return BAD_VALUE; 1522 } 1523 1524 return OK; 1525} 1526 1527M4OSA_ERR PreviewPlayer::doMediaRendering() { 1528 M4OSA_ERR err = M4NO_ERROR; 1529 M4VIFI_ImagePlane planeIn[3], planeOut[3]; 1530 M4VIFI_UInt8 *inBuffer = M4OSA_NULL, *finalOutputBuffer = M4OSA_NULL; 1531 M4VIFI_UInt8 *tempOutputBuffer= M4OSA_NULL; 1532 size_t videoBufferSize = 0; 1533 M4OSA_UInt32 frameSize = 0, i=0, index =0, nFrameCount =0, bufferOffset =0; 1534 int32_t colorFormat = 0; 1535 1536 if(!mIsVideoSourceJpg) { 1537 sp<MetaData> meta = mVideoSource->getFormat(); 1538 CHECK(meta->findInt32(kKeyColorFormat, &colorFormat)); 1539 } 1540 else { 1541 colorFormat = OMX_COLOR_FormatYUV420Planar; 1542 } 1543 1544 videoBufferSize = mVideoBuffer->size(); 1545 frameSize = (mVideoWidth*mVideoHeight*3) >> 1; 1546 1547 uint8_t* outBuffer; 1548 size_t outBufferStride = 0; 1549 1550 mVideoRenderer->getBuffer(&outBuffer, &outBufferStride); 1551 1552 bufferOffset = index*frameSize; 1553 inBuffer = (M4OSA_UInt8 *)mVideoBuffer->data()+ 1554 mVideoBuffer->range_offset()+bufferOffset; 1555 1556 1557 /* In plane*/ 1558 prepareYUV420ImagePlane(planeIn, mVideoWidth, 1559 mVideoHeight, (M4VIFI_UInt8 *)inBuffer, mReportedWidth, mReportedHeight); 1560 1561 // Set the output YUV420 plane to be compatible with YV12 format 1562 // W & H even 1563 // YVU instead of YUV 1564 // align buffers on 32 bits 1565 1566 //In YV12 format, sizes must be even 1567 M4OSA_UInt32 yv12PlaneWidth = ((mOutputVideoWidth +1)>>1)<<1; 1568 M4OSA_UInt32 yv12PlaneHeight = ((mOutputVideoHeight+1)>>1)<<1; 1569 1570 prepareYV12ImagePlane(planeOut, yv12PlaneWidth, yv12PlaneHeight, 1571 (M4OSA_UInt32)outBufferStride, (M4VIFI_UInt8 *)outBuffer); 1572 1573 1574 err = applyRenderingMode(planeIn, planeOut, mRenderingMode); 1575 1576 if(err != M4NO_ERROR) 1577 { 1578 LOGE("doMediaRendering: applyRenderingMode returned err=0x%x", err); 1579 return err; 1580 } 1581 mVideoResizedOrCropped = true; 1582 1583 return err; 1584} 1585 1586status_t PreviewPlayer::resetJniCallbackTimeStamp() { 1587 1588 mDecVideoTsStoryBoard = mStoryboardStartTimeMsec*1000; 1589 return OK; 1590} 1591 1592void PreviewPlayer::postProgressCallbackEvent_l() { 1593 if (mProgressCbEventPending) { 1594 return; 1595 } 1596 mProgressCbEventPending = true; 1597 1598 mQueue.postEvent(mProgressCbEvent); 1599} 1600 1601 1602void PreviewPlayer::onProgressCbEvent() { 1603 Mutex::Autolock autoLock(mLock); 1604 if (!mProgressCbEventPending) { 1605 return; 1606 } 1607 mProgressCbEventPending = false; 1608 // If playback starts from previous I-frame, 1609 // then send frame storyboard duration 1610 if((mDecodedVideoTs/1000) < mPlayBeginTimeMsec) { 1611 notifyListener_l(MEDIA_INFO, 0, mDecVideoTsStoryBoard/1000); 1612 } 1613 else { 1614 notifyListener_l(MEDIA_INFO, 0, 1615 (((mDecodedVideoTs+mDecVideoTsStoryBoard)/1000)-mPlayBeginTimeMsec)); 1616 } 1617} 1618 1619void PreviewPlayer::postOverlayUpdateEvent_l() { 1620 if (mOverlayUpdateEventPending) { 1621 return; 1622 } 1623 mOverlayUpdateEventPending = true; 1624 mQueue.postEvent(mOverlayUpdateEvent); 1625} 1626 1627void PreviewPlayer::onUpdateOverlayEvent() { 1628 Mutex::Autolock autoLock(mLock); 1629 1630 if (!mOverlayUpdateEventPending) { 1631 return; 1632 } 1633 mOverlayUpdateEventPending = false; 1634 1635 int updateState; 1636 if (mOverlayUpdateEventPosted) { 1637 updateState = 1; 1638 } else { 1639 updateState = 0; 1640 } 1641 notifyListener_l(0xBBBBBBBB, updateState, mCurrFramingEffectIndex); 1642} 1643 1644 1645void PreviewPlayer::setVideoPostProcessingNode( 1646 M4VSS3GPP_VideoEffectType type, M4OSA_Bool enable) { 1647 1648 uint32_t effect = VIDEO_EFFECT_NONE; 1649 1650 //Map M4VSS3GPP_VideoEffectType to local enum 1651 switch(type) { 1652 case M4VSS3GPP_kVideoEffectType_FadeFromBlack: 1653 effect = VIDEO_EFFECT_FADEFROMBLACK; 1654 break; 1655 1656 case M4VSS3GPP_kVideoEffectType_FadeToBlack: 1657 effect = VIDEO_EFFECT_FADETOBLACK; 1658 break; 1659 1660 case M4VSS3GPP_kVideoEffectType_CurtainOpening: 1661 effect = VIDEO_EFFECT_CURTAINOPEN; 1662 break; 1663 1664 case M4VSS3GPP_kVideoEffectType_CurtainClosing: 1665 effect = VIDEO_EFFECT_CURTAINCLOSE; 1666 break; 1667 1668 case M4xVSS_kVideoEffectType_BlackAndWhite: 1669 effect = VIDEO_EFFECT_BLACKANDWHITE; 1670 break; 1671 1672 case M4xVSS_kVideoEffectType_Pink: 1673 effect = VIDEO_EFFECT_PINK; 1674 break; 1675 1676 case M4xVSS_kVideoEffectType_Green: 1677 effect = VIDEO_EFFECT_GREEN; 1678 break; 1679 1680 case M4xVSS_kVideoEffectType_Sepia: 1681 effect = VIDEO_EFFECT_SEPIA; 1682 break; 1683 1684 case M4xVSS_kVideoEffectType_Negative: 1685 effect = VIDEO_EFFECT_NEGATIVE; 1686 break; 1687 1688 case M4xVSS_kVideoEffectType_Framing: 1689 effect = VIDEO_EFFECT_FRAMING; 1690 break; 1691 1692 case M4xVSS_kVideoEffectType_Fifties: 1693 effect = VIDEO_EFFECT_FIFTIES; 1694 break; 1695 1696 case M4xVSS_kVideoEffectType_ColorRGB16: 1697 effect = VIDEO_EFFECT_COLOR_RGB16; 1698 break; 1699 1700 case M4xVSS_kVideoEffectType_Gradient: 1701 effect = VIDEO_EFFECT_GRADIENT; 1702 break; 1703 1704 default: 1705 effect = VIDEO_EFFECT_NONE; 1706 break; 1707 } 1708 1709 if(enable == M4OSA_TRUE) { 1710 //If already set, then no need to set again 1711 if(!(mCurrentVideoEffect & effect)) { 1712 mCurrentVideoEffect |= effect; 1713 if(effect == VIDEO_EFFECT_FIFTIES) { 1714 mIsFiftiesEffectStarted = true; 1715 } 1716 } 1717 } 1718 else { 1719 //Reset only if already set 1720 if(mCurrentVideoEffect & effect) { 1721 mCurrentVideoEffect &= ~effect; 1722 } 1723 } 1724} 1725 1726status_t PreviewPlayer::setImageClipProperties(uint32_t width,uint32_t height) { 1727 mVideoWidth = width; 1728 mVideoHeight = height; 1729 return OK; 1730} 1731 1732 1733M4OSA_ERR PreviewPlayer::doVideoPostProcessing() { 1734 M4OSA_ERR err = M4NO_ERROR; 1735 vePostProcessParams postProcessParams; 1736 int32_t colorFormat = 0; 1737 1738 1739 if(!mIsVideoSourceJpg) { 1740 sp<MetaData> meta = mVideoSource->getFormat(); 1741 CHECK(meta->findInt32(kKeyColorFormat, &colorFormat)); 1742 } 1743 else { 1744 colorFormat = OMX_COLOR_FormatYUV420Planar; 1745 } 1746 1747 if((colorFormat == OMX_COLOR_FormatYUV420SemiPlanar) || 1748 (colorFormat == 0x7FA30C00)) { 1749 LOGE("doVideoPostProcessing: colorFormat YUV420Sp not supported"); 1750 return M4ERR_UNSUPPORTED_MEDIA_TYPE; 1751 } 1752 1753 postProcessParams.vidBuffer = (M4VIFI_UInt8*)mVideoBuffer->data() 1754 + mVideoBuffer->range_offset(); 1755 1756 postProcessParams.videoWidth = mVideoWidth; 1757 postProcessParams.videoHeight = mVideoHeight; 1758 postProcessParams.timeMs = mDecodedVideoTs/1000; 1759 postProcessParams.timeOffset = mDecVideoTsStoryBoard/1000; 1760 postProcessParams.effectsSettings = mEffectsSettings; 1761 postProcessParams.numberEffects = mNumberEffects; 1762 postProcessParams.outVideoWidth = mOutputVideoWidth; 1763 postProcessParams.outVideoHeight = mOutputVideoHeight; 1764 postProcessParams.currentVideoEffect = mCurrentVideoEffect; 1765 postProcessParams.renderingMode = mRenderingMode; 1766 if(mIsFiftiesEffectStarted == M4OSA_TRUE) { 1767 postProcessParams.isFiftiesEffectStarted = M4OSA_TRUE; 1768 mIsFiftiesEffectStarted = M4OSA_FALSE; 1769 } 1770 else { 1771 postProcessParams.isFiftiesEffectStarted = M4OSA_FALSE; 1772 } 1773 1774 postProcessParams.overlayFrameRGBBuffer = mFrameRGBBuffer; 1775 postProcessParams.overlayFrameYUVBuffer = mFrameYUVBuffer; 1776 mVideoRenderer->getBuffer(&(postProcessParams.pOutBuffer), &(postProcessParams.outBufferStride)); 1777 err = applyEffectsAndRenderingMode(&postProcessParams, mReportedWidth, mReportedHeight); 1778 1779 return err; 1780} 1781 1782status_t PreviewPlayer::readFirstVideoFrame() { 1783 LOGV("PreviewPlayer::readFirstVideoFrame"); 1784 1785 if (mFlags & SEEK_PREVIEW) { 1786 mFlags &= ~SEEK_PREVIEW; 1787 return OK; 1788 } 1789 1790 if (!mVideoBuffer) { 1791 MediaSource::ReadOptions options; 1792 if (mSeeking) { 1793 LOGV("LV PLAYER seeking to %lld us (%.2f secs)", mSeekTimeUs, 1794 mSeekTimeUs / 1E6); 1795 1796 options.setSeekTo( 1797 mSeekTimeUs, MediaSource::ReadOptions::SEEK_CLOSEST); 1798 } 1799 for (;;) { 1800 status_t err = mVideoSource->read(&mVideoBuffer, &options); 1801 options.clearSeekTo(); 1802 1803 if (err != OK) { 1804 CHECK_EQ(mVideoBuffer, NULL); 1805 1806 if (err == INFO_FORMAT_CHANGED) { 1807 LOGV("LV PLAYER VideoSource signalled format change"); 1808 notifyVideoSize_l(); 1809 sp<MetaData> meta = mVideoSource->getFormat(); 1810 1811 CHECK(meta->findInt32(kKeyWidth, &mReportedWidth)); 1812 CHECK(meta->findInt32(kKeyHeight, &mReportedHeight)); 1813 1814 if (mVideoRenderer != NULL) { 1815 mVideoRendererIsPreview = false; 1816 err = initRenderer_l(); 1817 if (err != OK) { 1818 postStreamDoneEvent_l(err); 1819 } 1820 } 1821 continue; 1822 } 1823 LOGV("PreviewPlayer: onVideoEvent EOS reached."); 1824 mFlags |= VIDEO_AT_EOS; 1825 postStreamDoneEvent_l(err); 1826 return OK; 1827 } 1828 1829 if (mVideoBuffer->range_length() == 0) { 1830 // Some decoders, notably the PV AVC software decoder 1831 // return spurious empty buffers that we just want to ignore. 1832 1833 mVideoBuffer->release(); 1834 mVideoBuffer = NULL; 1835 continue; 1836 } 1837 1838 int64_t videoTimeUs; 1839 CHECK(mVideoBuffer->meta_data()->findInt64(kKeyTime, &videoTimeUs)); 1840 1841 if((videoTimeUs/1000) < mPlayBeginTimeMsec) { 1842 // buffers are before begin cut time 1843 // ignore them 1844 mVideoBuffer->release(); 1845 mVideoBuffer = NULL; 1846 continue; 1847 } 1848 1849 break; 1850 } 1851 } 1852 1853 int64_t timeUs; 1854 CHECK(mVideoBuffer->meta_data()->findInt64(kKeyTime, &timeUs)); 1855 1856 { 1857 Mutex::Autolock autoLock(mMiscStateLock); 1858 mVideoTimeUs = timeUs; 1859 } 1860 1861 mDecodedVideoTs = timeUs; 1862 1863 return OK; 1864 1865} 1866 1867} // namespace android 1868