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