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