PreviewPlayer.cpp revision e018023b4844fef7880bf5e45f706afcb10c33b6
1643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi/*
2643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi * Copyright (C) 2011 The Android Open Source Project
3643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi *
4643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi * Licensed under the Apache License, Version 2.0 (the "License");
5643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi * you may not use this file except in compliance with the License.
6643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi * You may obtain a copy of the License at
7643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi *
8643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi *      http://www.apache.org/licenses/LICENSE-2.0
9643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi *
10643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi * Unless required by applicable law or agreed to in writing, software
11643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi * distributed under the License is distributed on an "AS IS" BASIS,
12643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi * See the License for the specific language governing permissions and
14643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi * limitations under the License.
15643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi */
16643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi
17bfece17c8f63de4d4b686da50f8ecac2f6f8ec53Santosh Madhava
18643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi#define LOG_NDEBUG 1
19643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi#define LOG_TAG "PreviewPlayer"
20643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi#include <utils/Log.h>
21643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi
22643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi#include <dlfcn.h>
23643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi
24643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi#include "include/ARTSPController.h"
25643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi#include "PreviewPlayer.h"
26643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi#include "DummyAudioSource.h"
27643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi#include "DummyVideoSource.h"
28643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi#include "VideoEditorSRC.h"
29643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi#include "include/NuCachedSource2.h"
30643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi#include "include/ThrottledSource.h"
31643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi
32643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi
33643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi#include <binder/IPCThreadState.h>
34643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi#include <media/stagefright/DataSource.h>
35643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi#include <media/stagefright/FileSource.h>
36643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi#include <media/stagefright/MediaBuffer.h>
37643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi#include <media/stagefright/MediaDefs.h>
38643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi#include <media/stagefright/MediaExtractor.h>
39643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi#include <media/stagefright/MediaDebug.h>
40643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi#include <media/stagefright/MediaSource.h>
41643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi#include <media/stagefright/MetaData.h>
42643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi#include <media/stagefright/OMXCodec.h>
43643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi
44643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi#include <surfaceflinger/Surface.h>
45643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi#include <media/stagefright/foundation/ALooper.h>
46643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi
47643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundarginamespace android {
48643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi
49643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi
50643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargistruct PreviewPlayerEvent : public TimedEventQueue::Event {
51643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi    PreviewPlayerEvent(
52643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi            PreviewPlayer *player,
53643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi            void (PreviewPlayer::*method)())
54643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi        : mPlayer(player),
55643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi          mMethod(method) {
56643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi    }
57643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi
58643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargiprotected:
59643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi    virtual ~PreviewPlayerEvent() {}
60643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi
61643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi    virtual void fire(TimedEventQueue *queue, int64_t /* now_us */) {
62643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi        (mPlayer->*mMethod)();
63643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi    }
64643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi
65643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargiprivate:
66643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi    PreviewPlayer *mPlayer;
67643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi    void (PreviewPlayer::*mMethod)();
68643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi
69643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi    PreviewPlayerEvent(const PreviewPlayerEvent &);
70643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi    PreviewPlayerEvent &operator=(const PreviewPlayerEvent &);
71643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi};
72643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi
7343fcc396614a587851e2b7c4cea2876ec58b8648Chih-Chung ChangPreviewPlayer::PreviewPlayer(NativeWindowRenderer* renderer)
74c9dedc4e1d0c8343ab1029cb601253826cd67c81James Dong    : PreviewPlayerBase(),
7543fcc396614a587851e2b7c4cea2876ec58b8648Chih-Chung Chang      mNativeWindowRenderer(renderer),
7643fcc396614a587851e2b7c4cea2876ec58b8648Chih-Chung Chang      mCurrFramingEffectIndex(0),
77408e25b2508d97f7ae0b39acf46ab42b7c223c44Basavapatna Dattaguru      mFrameRGBBuffer(NULL),
7843fcc396614a587851e2b7c4cea2876ec58b8648Chih-Chung Chang      mFrameYUVBuffer(NULL) {
79643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi
80643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi    mVideoRenderer = NULL;
81643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi    mEffectsSettings = NULL;
825bc7fb407ce1bab13d4a4a67d34a1a3192ee3186Dheeraj Sharma    mVeAudioPlayer = NULL;
83643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi    mAudioMixStoryBoardTS = 0;
84643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi    mCurrentMediaBeginCutTime = 0;
85643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi    mCurrentMediaVolumeValue = 0;
86643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi    mNumberEffects = 0;
87643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi    mDecodedVideoTs = 0;
88643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi    mDecVideoTsStoryBoard = 0;
89643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi    mCurrentVideoEffect = VIDEO_EFFECT_NONE;
90643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi    mProgressCbInterval = 0;
91643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi    mNumberDecVideoFrames = 0;
92e6c0750cd2927967f93a8811954f889d23fadb6eDharmaray Kundargi    mOverlayUpdateEventPosted = false;
931c97d9ab52a288d24ea54499de435277cc1a3d68Rajneesh Chowdury    mIsChangeSourceRequired = true;
94643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi
95643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi    mVideoEvent = new PreviewPlayerEvent(this, &PreviewPlayer::onVideoEvent);
96643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi    mVideoEventPending = false;
97643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi    mStreamDoneEvent = new PreviewPlayerEvent(this,
981c97d9ab52a288d24ea54499de435277cc1a3d68Rajneesh Chowdury         &PreviewPlayer::onStreamDone);
99643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi
100643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi    mStreamDoneEventPending = false;
101643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi
102643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi    mCheckAudioStatusEvent = new PreviewPlayerEvent(
103c9dedc4e1d0c8343ab1029cb601253826cd67c81James Dong        this, &PreviewPlayerBase::onCheckAudioStatus);
104643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi
105643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi    mAudioStatusEventPending = false;
106643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi
107643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi    mProgressCbEvent = new PreviewPlayerEvent(this,
108e6c0750cd2927967f93a8811954f889d23fadb6eDharmaray Kundargi         &PreviewPlayer::onProgressCbEvent);
109643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi
110e6c0750cd2927967f93a8811954f889d23fadb6eDharmaray Kundargi    mOverlayUpdateEvent = new PreviewPlayerEvent(this,
111e6c0750cd2927967f93a8811954f889d23fadb6eDharmaray Kundargi        &PreviewPlayer::onUpdateOverlayEvent);
112643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi    mProgressCbEventPending = false;
113e6c0750cd2927967f93a8811954f889d23fadb6eDharmaray Kundargi
114e6c0750cd2927967f93a8811954f889d23fadb6eDharmaray Kundargi    mOverlayUpdateEventPending = false;
115643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi    mRenderingMode = (M4xVSS_MediaRendering)MEDIA_RENDERING_INVALID;
116643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi    mIsFiftiesEffectStarted = false;
117643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi    reset();
118643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi}
119643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi
120643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray KundargiPreviewPlayer::~PreviewPlayer() {
121643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi
122643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi    if (mQueueStarted) {
123643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi        mQueue.stop();
124643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi    }
125643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi
126643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi    reset();
127643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi
12843fcc396614a587851e2b7c4cea2876ec58b8648Chih-Chung Chang    if (mVideoRenderer) {
12943fcc396614a587851e2b7c4cea2876ec58b8648Chih-Chung Chang        mNativeWindowRenderer->destroyRenderInput(mVideoRenderer);
130643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi    }
131643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi}
132643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi
133643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargivoid PreviewPlayer::cancelPlayerEvents(bool keepBufferingGoing) {
134643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi    mQueue.cancelEvent(mVideoEvent->eventID());
135643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi    mVideoEventPending = false;
136643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi    mQueue.cancelEvent(mStreamDoneEvent->eventID());
137643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi    mStreamDoneEventPending = false;
138643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi    mQueue.cancelEvent(mCheckAudioStatusEvent->eventID());
139643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi    mAudioStatusEventPending = false;
140643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi
141643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi    mQueue.cancelEvent(mProgressCbEvent->eventID());
142643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi    mProgressCbEventPending = false;
143643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi}
144643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi
145643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargistatus_t PreviewPlayer::setDataSource(
146643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi        const char *uri, const KeyedVector<String8, String8> *headers) {
147643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi    Mutex::Autolock autoLock(mLock);
148643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi    return setDataSource_l(uri, headers);
149643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi}
150643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi
151643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargistatus_t PreviewPlayer::setDataSource_l(
152643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi        const char *uri, const KeyedVector<String8, String8> *headers) {
153643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi    reset_l();
154643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi
155643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi    mUri = uri;
156643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi
157643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi    if (headers) {
158643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi        mUriHeaders = *headers;
159643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi    }
160643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi
161643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi    // The actual work will be done during preparation in the call to
162643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi    // ::finishSetDataSource_l to avoid blocking the calling thread in
163643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi    // setDataSource for any significant time.
164643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi    return OK;
165643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi}
166643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi
167643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargistatus_t PreviewPlayer::setDataSource_l(const sp<MediaExtractor> &extractor) {
168643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi    bool haveAudio = false;
169643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi    bool haveVideo = false;
170643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi    for (size_t i = 0; i < extractor->countTracks(); ++i) {
171643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi        sp<MetaData> meta = extractor->getTrackMetaData(i);
172643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi
173643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi        const char *mime;
174643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi        CHECK(meta->findCString(kKeyMIMEType, &mime));
175643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi
176643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi        if (!haveVideo && !strncasecmp(mime, "video/", 6)) {
177643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi            setVideoSource(extractor->getTrack(i));
178643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi            haveVideo = true;
179643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi        } else if (!haveAudio && !strncasecmp(mime, "audio/", 6)) {
180643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi            setAudioSource(extractor->getTrack(i));
181643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi            haveAudio = true;
182643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi
183643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi            if (!strcasecmp(mime, MEDIA_MIMETYPE_AUDIO_VORBIS)) {
184643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi                // Only do this for vorbis audio, none of the other audio
185643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi                // formats even support this ringtone specific hack and
186643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi                // retrieving the metadata on some extractors may turn out
187643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi                // to be very expensive.
188643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi                sp<MetaData> fileMeta = extractor->getMetaData();
189643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi                int32_t loop;
190643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi                if (fileMeta != NULL
191643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi                        && fileMeta->findInt32(kKeyAutoLoop, &loop)
192643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi                         && loop != 0) {
193643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi                    mFlags |= AUTO_LOOPING;
194643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi                }
195643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi            }
196643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi        }
197643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi
198643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi        if (haveAudio && haveVideo) {
199643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi            break;
200643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi        }
201643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi    }
202643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi
203643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi    /* Add the support for Dummy audio*/
204643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi    if( !haveAudio ){
205643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi        LOGV("PreviewPlayer: setDataSource_l Dummyaudiocreation started");
206643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi
207643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi        mAudioTrack = DummyAudioSource::Create(32000, 2, 20000,
208ebf40154a222c864a0aaf807702fc4eb6b9cf40fRaghavender Palla                                              ((mPlayEndTimeMsec)*1000LL));
209643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi        LOGV("PreviewPlayer: setDataSource_l Dummyauiosource created");
210643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi        if(mAudioTrack != NULL) {
211643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi            haveAudio = true;
212643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi        }
213643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi    }
214643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi
215643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi    if (!haveAudio && !haveVideo) {
216643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi        return UNKNOWN_ERROR;
217643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi    }
218643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi
219643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi    mExtractorFlags = extractor->flags();
220643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi    return OK;
221643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi}
222643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi
223643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargistatus_t PreviewPlayer::setDataSource_l_jpg() {
224643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi    M4OSA_ERR err = M4NO_ERROR;
225643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi    LOGV("PreviewPlayer: setDataSource_l_jpg started");
226643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi
227643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi    mAudioSource = DummyAudioSource::Create(32000, 2, 20000,
228ebf40154a222c864a0aaf807702fc4eb6b9cf40fRaghavender Palla                                          ((mPlayEndTimeMsec)*1000LL));
229643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi    LOGV("PreviewPlayer: setDataSource_l_jpg Dummyaudiosource created");
230643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi    if(mAudioSource != NULL) {
231643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi        setAudioSource(mAudioSource);
232643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi    }
233643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi    status_t error = mAudioSource->start();
234643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi    if (error != OK) {
235643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi        LOGV("Error starting dummy audio source");
236643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi        mAudioSource.clear();
237643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi        return err;
238643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi    }
239643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi
240ebf40154a222c864a0aaf807702fc4eb6b9cf40fRaghavender Palla    mDurationUs = (mPlayEndTimeMsec - mPlayBeginTimeMsec)*1000LL;
241643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi
242643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi    mVideoSource = DummyVideoSource::Create(mVideoWidth, mVideoHeight,
243643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi                                            mDurationUs, mUri);
24435cb2de64cb6482a08f446e80733e7d344a0dcacDharmaray Kundargi
24543fcc396614a587851e2b7c4cea2876ec58b8648Chih-Chung Chang    updateSizeToRender(mVideoSource->getFormat());
246643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi    setVideoSource(mVideoSource);
247643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi    status_t err1 = mVideoSource->start();
248643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi    if (err1 != OK) {
249643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi        mVideoSource.clear();
250643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi        return err;
251643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi    }
252643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi
253643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi    mIsVideoSourceJpg = true;
254643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi    return OK;
255643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi}
256643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi
257643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargivoid PreviewPlayer::reset() {
258643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi    Mutex::Autolock autoLock(mLock);
259643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi    reset_l();
260643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi}
261643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi
262643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargivoid PreviewPlayer::reset_l() {
263643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi
264643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi    if (mFlags & PREPARING) {
265643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi        mFlags |= PREPARE_CANCELLED;
266643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi    }
267643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi
268643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi    while (mFlags & PREPARING) {
269643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi        mPreparedCondition.wait(mLock);
270643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi    }
271643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi
272643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi    cancelPlayerEvents();
273643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi    mAudioTrack.clear();
274643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi    mVideoTrack.clear();
275643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi
276643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi    // Shutdown audio first, so that the respone to the reset request
277643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi    // appears to happen instantaneously as far as the user is concerned
278643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi    // If we did this later, audio would continue playing while we
279643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi    // shutdown the video-related resources and the player appear to
280643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi    // not be as responsive to a reset request.
281643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi    if (mAudioPlayer == NULL && mAudioSource != NULL) {
282643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi        // If we had an audio player, it would have effectively
283643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi        // taken possession of the audio source and stopped it when
284643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi        // _it_ is stopped. Otherwise this is still our responsibility.
285643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi        mAudioSource->stop();
286643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi    }
287643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi    mAudioSource.clear();
288643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi
289643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi    mTimeSource = NULL;
290643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi
2911c97d9ab52a288d24ea54499de435277cc1a3d68Rajneesh Chowdury    //Single audio player instance used
2921c97d9ab52a288d24ea54499de435277cc1a3d68Rajneesh Chowdury    //So donot delete it here
2931c97d9ab52a288d24ea54499de435277cc1a3d68Rajneesh Chowdury    //It is deleted from PreviewController class
2941c97d9ab52a288d24ea54499de435277cc1a3d68Rajneesh Chowdury    //delete mAudioPlayer;
295643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi    mAudioPlayer = NULL;
296643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi
297643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi    if (mVideoBuffer) {
298643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi        mVideoBuffer->release();
299643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi        mVideoBuffer = NULL;
300643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi    }
301643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi
302643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi    if (mVideoSource != NULL) {
303643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi        mVideoSource->stop();
304643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi
305643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi        // The following hack is necessary to ensure that the OMX
306643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi        // component is completely released by the time we may try
307643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi        // to instantiate it again.
308643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi        wp<MediaSource> tmp = mVideoSource;
309643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi        mVideoSource.clear();
310643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi        while (tmp.promote() != NULL) {
311643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi            usleep(1000);
312643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi        }
313643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi        IPCThreadState::self()->flushCommands();
314643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi    }
315643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi
316643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi    mDurationUs = -1;
317643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi    mFlags = 0;
318643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi    mExtractorFlags = 0;
319643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi    mVideoWidth = mVideoHeight = -1;
320643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi    mTimeSourceDeltaUs = 0;
321643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi    mVideoTimeUs = 0;
322643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi
323a5872f770c50da1db555d53e062a9896ea4321d5Andreas Huber    mSeeking = NO_SEEK;
324643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi    mSeekNotificationSent = false;
325643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi    mSeekTimeUs = 0;
326643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi
327643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi    mUri.setTo("");
328643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi    mUriHeaders.clear();
329643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi
330643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi    mFileSource.clear();
331643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi
332643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi    mCurrentVideoEffect = VIDEO_EFFECT_NONE;
333643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi    mIsVideoSourceJpg = false;
334643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi    mFrameRGBBuffer = NULL;
335643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi    if(mFrameYUVBuffer != NULL) {
336694816d7291f17364502ac5d3319684a0b180860Shyam Pallapothu        free(mFrameYUVBuffer);
337643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi        mFrameYUVBuffer = NULL;
338643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi    }
339643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi}
340643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi
341643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargistatus_t PreviewPlayer::play() {
342643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi    Mutex::Autolock autoLock(mLock);
343643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi
344643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi    mFlags &= ~CACHE_UNDERRUN;
345e018023b4844fef7880bf5e45f706afcb10c33b6Hong Teng    mFlags &= ~INFORMED_AV_EOS;
346643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi    return play_l();
347643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi}
348643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi
3495bc7fb407ce1bab13d4a4a67d34a1a3192ee3186Dheeraj Sharmastatus_t PreviewPlayer::startAudioPlayer_l() {
3505bc7fb407ce1bab13d4a4a67d34a1a3192ee3186Dheeraj Sharma    CHECK(!(mFlags & AUDIO_RUNNING));
3515bc7fb407ce1bab13d4a4a67d34a1a3192ee3186Dheeraj Sharma
3525bc7fb407ce1bab13d4a4a67d34a1a3192ee3186Dheeraj Sharma    if (mAudioSource == NULL || mAudioPlayer == NULL) {
3535bc7fb407ce1bab13d4a4a67d34a1a3192ee3186Dheeraj Sharma        return OK;
3545bc7fb407ce1bab13d4a4a67d34a1a3192ee3186Dheeraj Sharma    }
3555bc7fb407ce1bab13d4a4a67d34a1a3192ee3186Dheeraj Sharma
3565bc7fb407ce1bab13d4a4a67d34a1a3192ee3186Dheeraj Sharma    if (!(mFlags & AUDIOPLAYER_STARTED)) {
3575bc7fb407ce1bab13d4a4a67d34a1a3192ee3186Dheeraj Sharma        mFlags |= AUDIOPLAYER_STARTED;
3585bc7fb407ce1bab13d4a4a67d34a1a3192ee3186Dheeraj Sharma
3595bc7fb407ce1bab13d4a4a67d34a1a3192ee3186Dheeraj Sharma        // We've already started the MediaSource in order to enable
3605bc7fb407ce1bab13d4a4a67d34a1a3192ee3186Dheeraj Sharma        // the prefetcher to read its data.
3615bc7fb407ce1bab13d4a4a67d34a1a3192ee3186Dheeraj Sharma        status_t err = mVeAudioPlayer->start(
3625bc7fb407ce1bab13d4a4a67d34a1a3192ee3186Dheeraj Sharma                true /* sourceAlreadyStarted */);
3635bc7fb407ce1bab13d4a4a67d34a1a3192ee3186Dheeraj Sharma
3645bc7fb407ce1bab13d4a4a67d34a1a3192ee3186Dheeraj Sharma        if (err != OK) {
3655bc7fb407ce1bab13d4a4a67d34a1a3192ee3186Dheeraj Sharma            notifyListener_l(MEDIA_ERROR, MEDIA_ERROR_UNKNOWN, err);
3665bc7fb407ce1bab13d4a4a67d34a1a3192ee3186Dheeraj Sharma            return err;
3675bc7fb407ce1bab13d4a4a67d34a1a3192ee3186Dheeraj Sharma        }
3685bc7fb407ce1bab13d4a4a67d34a1a3192ee3186Dheeraj Sharma    } else {
3695bc7fb407ce1bab13d4a4a67d34a1a3192ee3186Dheeraj Sharma        mVeAudioPlayer->resume();
3705bc7fb407ce1bab13d4a4a67d34a1a3192ee3186Dheeraj Sharma    }
3715bc7fb407ce1bab13d4a4a67d34a1a3192ee3186Dheeraj Sharma
3725bc7fb407ce1bab13d4a4a67d34a1a3192ee3186Dheeraj Sharma    mFlags |= AUDIO_RUNNING;
3735bc7fb407ce1bab13d4a4a67d34a1a3192ee3186Dheeraj Sharma
3745bc7fb407ce1bab13d4a4a67d34a1a3192ee3186Dheeraj Sharma    mWatchForAudioEOS = true;
3755bc7fb407ce1bab13d4a4a67d34a1a3192ee3186Dheeraj Sharma
3765bc7fb407ce1bab13d4a4a67d34a1a3192ee3186Dheeraj Sharma    return OK;
3775bc7fb407ce1bab13d4a4a67d34a1a3192ee3186Dheeraj Sharma}
3785bc7fb407ce1bab13d4a4a67d34a1a3192ee3186Dheeraj Sharma
379c9dedc4e1d0c8343ab1029cb601253826cd67c81James Dongstatus_t PreviewPlayer::setAudioPlayer(AudioPlayerBase *audioPlayer) {
3801c97d9ab52a288d24ea54499de435277cc1a3d68Rajneesh Chowdury    Mutex::Autolock autoLock(mLock);
3811c97d9ab52a288d24ea54499de435277cc1a3d68Rajneesh Chowdury    CHECK(!(mFlags & PLAYING));
3821c97d9ab52a288d24ea54499de435277cc1a3d68Rajneesh Chowdury    mAudioPlayer = audioPlayer;
3831c97d9ab52a288d24ea54499de435277cc1a3d68Rajneesh Chowdury
3841c97d9ab52a288d24ea54499de435277cc1a3d68Rajneesh Chowdury    LOGV("SetAudioPlayer");
3851c97d9ab52a288d24ea54499de435277cc1a3d68Rajneesh Chowdury    mIsChangeSourceRequired = true;
3861c97d9ab52a288d24ea54499de435277cc1a3d68Rajneesh Chowdury    mVeAudioPlayer =
3871c97d9ab52a288d24ea54499de435277cc1a3d68Rajneesh Chowdury            (VideoEditorAudioPlayer*)mAudioPlayer;
3881c97d9ab52a288d24ea54499de435277cc1a3d68Rajneesh Chowdury
3891c97d9ab52a288d24ea54499de435277cc1a3d68Rajneesh Chowdury    // check if the new and old source are dummy
3901c97d9ab52a288d24ea54499de435277cc1a3d68Rajneesh Chowdury    sp<MediaSource> anAudioSource = mVeAudioPlayer->getSource();
3911c97d9ab52a288d24ea54499de435277cc1a3d68Rajneesh Chowdury    if (anAudioSource == NULL) {
3921c97d9ab52a288d24ea54499de435277cc1a3d68Rajneesh Chowdury        // Audio player does not have any source set.
3931c97d9ab52a288d24ea54499de435277cc1a3d68Rajneesh Chowdury        LOGV("setAudioPlayer: Audio player does not have any source set");
3941c97d9ab52a288d24ea54499de435277cc1a3d68Rajneesh Chowdury        return OK;
3951c97d9ab52a288d24ea54499de435277cc1a3d68Rajneesh Chowdury    }
3961c97d9ab52a288d24ea54499de435277cc1a3d68Rajneesh Chowdury
3979a8c9a848da5a4a06c5402d6716efa66b8818d37Rajneesh Chowdury    // If new video source is not dummy, then always change source
3989a8c9a848da5a4a06c5402d6716efa66b8818d37Rajneesh Chowdury    // Else audio player continues using old audio source and there are
3999a8c9a848da5a4a06c5402d6716efa66b8818d37Rajneesh Chowdury    // frame drops to maintain AV sync
4009a8c9a848da5a4a06c5402d6716efa66b8818d37Rajneesh Chowdury    sp<MetaData> meta;
4019a8c9a848da5a4a06c5402d6716efa66b8818d37Rajneesh Chowdury    if (mVideoSource != NULL) {
4029a8c9a848da5a4a06c5402d6716efa66b8818d37Rajneesh Chowdury        meta = mVideoSource->getFormat();
4039a8c9a848da5a4a06c5402d6716efa66b8818d37Rajneesh Chowdury        const char *pVidSrcType;
4049a8c9a848da5a4a06c5402d6716efa66b8818d37Rajneesh Chowdury        if (meta->findCString(kKeyDecoderComponent, &pVidSrcType)) {
4059a8c9a848da5a4a06c5402d6716efa66b8818d37Rajneesh Chowdury            if (strcmp(pVidSrcType, "DummyVideoSource") != 0) {
4069a8c9a848da5a4a06c5402d6716efa66b8818d37Rajneesh Chowdury                LOGV(" Video clip with silent audio; need to change source");
4079a8c9a848da5a4a06c5402d6716efa66b8818d37Rajneesh Chowdury                return OK;
4089a8c9a848da5a4a06c5402d6716efa66b8818d37Rajneesh Chowdury            }
4099a8c9a848da5a4a06c5402d6716efa66b8818d37Rajneesh Chowdury        }
4109a8c9a848da5a4a06c5402d6716efa66b8818d37Rajneesh Chowdury    }
4119a8c9a848da5a4a06c5402d6716efa66b8818d37Rajneesh Chowdury
4121c97d9ab52a288d24ea54499de435277cc1a3d68Rajneesh Chowdury    const char *pSrcType1;
4131c97d9ab52a288d24ea54499de435277cc1a3d68Rajneesh Chowdury    const char *pSrcType2;
4149a8c9a848da5a4a06c5402d6716efa66b8818d37Rajneesh Chowdury    meta = anAudioSource->getFormat();
4151c97d9ab52a288d24ea54499de435277cc1a3d68Rajneesh Chowdury
4161c97d9ab52a288d24ea54499de435277cc1a3d68Rajneesh Chowdury    if (meta->findCString(kKeyDecoderComponent, &pSrcType1)) {
4171c97d9ab52a288d24ea54499de435277cc1a3d68Rajneesh Chowdury        if (strcmp(pSrcType1, "DummyAudioSource") == 0) {
4181c97d9ab52a288d24ea54499de435277cc1a3d68Rajneesh Chowdury            meta = mAudioSource->getFormat();
4191c97d9ab52a288d24ea54499de435277cc1a3d68Rajneesh Chowdury            if (meta->findCString(kKeyDecoderComponent, &pSrcType2)) {
4201c97d9ab52a288d24ea54499de435277cc1a3d68Rajneesh Chowdury                if (strcmp(pSrcType2, "DummyAudioSource") == 0) {
4211c97d9ab52a288d24ea54499de435277cc1a3d68Rajneesh Chowdury                    mIsChangeSourceRequired = false;
4221c97d9ab52a288d24ea54499de435277cc1a3d68Rajneesh Chowdury                    // Just set the new play duration for the existing source
4231c97d9ab52a288d24ea54499de435277cc1a3d68Rajneesh Chowdury                    MediaSource *pMediaSrc = anAudioSource.get();
4241c97d9ab52a288d24ea54499de435277cc1a3d68Rajneesh Chowdury                    DummyAudioSource *pDummyAudioSource = (DummyAudioSource*)pMediaSrc;
4251c97d9ab52a288d24ea54499de435277cc1a3d68Rajneesh Chowdury                    //Increment the duration of audio source
426ebf40154a222c864a0aaf807702fc4eb6b9cf40fRaghavender Palla                    pDummyAudioSource->setDuration(
427ebf40154a222c864a0aaf807702fc4eb6b9cf40fRaghavender Palla                        (int64_t)((mPlayEndTimeMsec)*1000LL));
428b6e2b5cc5b71986b06cbd9c471b63eb5878a7aeaRajneesh Chowdury
429b6e2b5cc5b71986b06cbd9c471b63eb5878a7aeaRajneesh Chowdury                    // Stop the new audio source
430b6e2b5cc5b71986b06cbd9c471b63eb5878a7aeaRajneesh Chowdury                    // since we continue using old source
431b6e2b5cc5b71986b06cbd9c471b63eb5878a7aeaRajneesh Chowdury                    LOGV("setAudioPlayer: stop new audio source");
432b6e2b5cc5b71986b06cbd9c471b63eb5878a7aeaRajneesh Chowdury                    mAudioSource->stop();
4331c97d9ab52a288d24ea54499de435277cc1a3d68Rajneesh Chowdury                }
4341c97d9ab52a288d24ea54499de435277cc1a3d68Rajneesh Chowdury            }
4351c97d9ab52a288d24ea54499de435277cc1a3d68Rajneesh Chowdury        }
4361c97d9ab52a288d24ea54499de435277cc1a3d68Rajneesh Chowdury    }
4371c97d9ab52a288d24ea54499de435277cc1a3d68Rajneesh Chowdury
4381c97d9ab52a288d24ea54499de435277cc1a3d68Rajneesh Chowdury    return OK;
4391c97d9ab52a288d24ea54499de435277cc1a3d68Rajneesh Chowdury}
4401c97d9ab52a288d24ea54499de435277cc1a3d68Rajneesh Chowdury
4411c97d9ab52a288d24ea54499de435277cc1a3d68Rajneesh Chowduryvoid PreviewPlayer::onStreamDone() {
4421c97d9ab52a288d24ea54499de435277cc1a3d68Rajneesh Chowdury    // Posted whenever any stream finishes playing.
4431c97d9ab52a288d24ea54499de435277cc1a3d68Rajneesh Chowdury
4441c97d9ab52a288d24ea54499de435277cc1a3d68Rajneesh Chowdury    Mutex::Autolock autoLock(mLock);
4451c97d9ab52a288d24ea54499de435277cc1a3d68Rajneesh Chowdury    if (!mStreamDoneEventPending) {
4461c97d9ab52a288d24ea54499de435277cc1a3d68Rajneesh Chowdury        return;
4471c97d9ab52a288d24ea54499de435277cc1a3d68Rajneesh Chowdury    }
4481c97d9ab52a288d24ea54499de435277cc1a3d68Rajneesh Chowdury    mStreamDoneEventPending = false;
4491c97d9ab52a288d24ea54499de435277cc1a3d68Rajneesh Chowdury
4501c97d9ab52a288d24ea54499de435277cc1a3d68Rajneesh Chowdury    if (mStreamDoneStatus != ERROR_END_OF_STREAM) {
4511c97d9ab52a288d24ea54499de435277cc1a3d68Rajneesh Chowdury        LOGV("MEDIA_ERROR %d", mStreamDoneStatus);
4521c97d9ab52a288d24ea54499de435277cc1a3d68Rajneesh Chowdury
4531c97d9ab52a288d24ea54499de435277cc1a3d68Rajneesh Chowdury        notifyListener_l(
4541c97d9ab52a288d24ea54499de435277cc1a3d68Rajneesh Chowdury                MEDIA_ERROR, MEDIA_ERROR_UNKNOWN, mStreamDoneStatus);
4551c97d9ab52a288d24ea54499de435277cc1a3d68Rajneesh Chowdury
4561c97d9ab52a288d24ea54499de435277cc1a3d68Rajneesh Chowdury        pause_l(true /* at eos */);
4571c97d9ab52a288d24ea54499de435277cc1a3d68Rajneesh Chowdury
4581c97d9ab52a288d24ea54499de435277cc1a3d68Rajneesh Chowdury        mFlags |= AT_EOS;
4591c97d9ab52a288d24ea54499de435277cc1a3d68Rajneesh Chowdury        return;
4601c97d9ab52a288d24ea54499de435277cc1a3d68Rajneesh Chowdury    }
4611c97d9ab52a288d24ea54499de435277cc1a3d68Rajneesh Chowdury
4621c97d9ab52a288d24ea54499de435277cc1a3d68Rajneesh Chowdury    const bool allDone =
4631c97d9ab52a288d24ea54499de435277cc1a3d68Rajneesh Chowdury        (mVideoSource == NULL || (mFlags & VIDEO_AT_EOS))
4641c97d9ab52a288d24ea54499de435277cc1a3d68Rajneesh Chowdury            && (mAudioSource == NULL || (mFlags & AUDIO_AT_EOS));
4651c97d9ab52a288d24ea54499de435277cc1a3d68Rajneesh Chowdury
4661c97d9ab52a288d24ea54499de435277cc1a3d68Rajneesh Chowdury    if (!allDone) {
4671c97d9ab52a288d24ea54499de435277cc1a3d68Rajneesh Chowdury        return;
4681c97d9ab52a288d24ea54499de435277cc1a3d68Rajneesh Chowdury    }
4691c97d9ab52a288d24ea54499de435277cc1a3d68Rajneesh Chowdury
4701c97d9ab52a288d24ea54499de435277cc1a3d68Rajneesh Chowdury    if (mFlags & (LOOPING | AUTO_LOOPING)) {
4711c97d9ab52a288d24ea54499de435277cc1a3d68Rajneesh Chowdury        seekTo_l(0);
4721c97d9ab52a288d24ea54499de435277cc1a3d68Rajneesh Chowdury
4731c97d9ab52a288d24ea54499de435277cc1a3d68Rajneesh Chowdury        if (mVideoSource != NULL) {
4741c97d9ab52a288d24ea54499de435277cc1a3d68Rajneesh Chowdury            postVideoEvent_l();
4751c97d9ab52a288d24ea54499de435277cc1a3d68Rajneesh Chowdury        }
4761c97d9ab52a288d24ea54499de435277cc1a3d68Rajneesh Chowdury    } else {
4771c97d9ab52a288d24ea54499de435277cc1a3d68Rajneesh Chowdury        LOGV("MEDIA_PLAYBACK_COMPLETE");
4781c97d9ab52a288d24ea54499de435277cc1a3d68Rajneesh Chowdury        //pause before sending event
4791c97d9ab52a288d24ea54499de435277cc1a3d68Rajneesh Chowdury        pause_l(true /* at eos */);
480fa31daff175709d2c58d61d1354daa9495696631Raghavender Palla
481fa31daff175709d2c58d61d1354daa9495696631Raghavender Palla        //This lock is used to syncronize onStreamDone() in PreviewPlayer and
482fa31daff175709d2c58d61d1354daa9495696631Raghavender Palla        //stopPreview() in PreviewController
483fa31daff175709d2c58d61d1354daa9495696631Raghavender Palla        Mutex::Autolock autoLock(mLockControl);
484e018023b4844fef7880bf5e45f706afcb10c33b6Hong Teng        /* Make sure PreviewPlayer only notifies MEDIA_PLAYBACK_COMPLETE once for each clip!
485e018023b4844fef7880bf5e45f706afcb10c33b6Hong Teng         * It happens twice in following scenario.
486e018023b4844fef7880bf5e45f706afcb10c33b6Hong Teng         * To make the clips in preview storyboard are played and switched smoothly,
487e018023b4844fef7880bf5e45f706afcb10c33b6Hong Teng         * PreviewController uses two PreviewPlayer instances and one AudioPlayer.
488e018023b4844fef7880bf5e45f706afcb10c33b6Hong Teng         * The two PreviewPlayer use the same AudioPlayer to play the audio,
489e018023b4844fef7880bf5e45f706afcb10c33b6Hong Teng         * and change the audio source of the AudioPlayer.
490e018023b4844fef7880bf5e45f706afcb10c33b6Hong Teng         * If the audio source of current playing clip and next clip are dummy
491e018023b4844fef7880bf5e45f706afcb10c33b6Hong Teng         * audio source(image or video without audio), it will not change the audio source
492e018023b4844fef7880bf5e45f706afcb10c33b6Hong Teng         * to avoid the "audio glitch", and keep using the current audio source.
493e018023b4844fef7880bf5e45f706afcb10c33b6Hong Teng         * When the video of current clip reached the EOS, PreviewPlayer will set EOS flag
494e018023b4844fef7880bf5e45f706afcb10c33b6Hong Teng         * for video and audio, and it will notify MEDIA_PLAYBACK_COMPLETE.
495e018023b4844fef7880bf5e45f706afcb10c33b6Hong Teng         * But the audio(dummy audio source) is still playing(for next clip),
496e018023b4844fef7880bf5e45f706afcb10c33b6Hong Teng         * and when it reached the EOS, and video reached EOS,
497e018023b4844fef7880bf5e45f706afcb10c33b6Hong Teng         * PreviewPlayer will notify MEDIA_PLAYBACK_COMPLETE again. */
498e018023b4844fef7880bf5e45f706afcb10c33b6Hong Teng        if (!(mFlags & INFORMED_AV_EOS)) {
499e018023b4844fef7880bf5e45f706afcb10c33b6Hong Teng            notifyListener_l(MEDIA_PLAYBACK_COMPLETE);
500e018023b4844fef7880bf5e45f706afcb10c33b6Hong Teng            mFlags |= INFORMED_AV_EOS;
501e018023b4844fef7880bf5e45f706afcb10c33b6Hong Teng        }
5021c97d9ab52a288d24ea54499de435277cc1a3d68Rajneesh Chowdury        mFlags |= AT_EOS;
503fa31daff175709d2c58d61d1354daa9495696631Raghavender Palla        LOGV("onStreamDone end");
504fa31daff175709d2c58d61d1354daa9495696631Raghavender Palla        return;
5051c97d9ab52a288d24ea54499de435277cc1a3d68Rajneesh Chowdury    }
5061c97d9ab52a288d24ea54499de435277cc1a3d68Rajneesh Chowdury}
5071c97d9ab52a288d24ea54499de435277cc1a3d68Rajneesh Chowdury
5081c97d9ab52a288d24ea54499de435277cc1a3d68Rajneesh Chowdury
509643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargistatus_t PreviewPlayer::play_l() {
5105bc7fb407ce1bab13d4a4a67d34a1a3192ee3186Dheeraj Sharma
5118b95de2c4d57a0a07d7f4c59f2ddd52a140a361eRajneesh Chowdury    mFlags &= ~SEEK_PREVIEW;
5128b95de2c4d57a0a07d7f4c59f2ddd52a140a361eRajneesh Chowdury
513643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi    if (mFlags & PLAYING) {
514643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi        return OK;
515643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi    }
516643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi    mStartNextPlayer = false;
517643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi
518643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi    if (!(mFlags & PREPARED)) {
519643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi        status_t err = prepare_l();
520643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi
521643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi        if (err != OK) {
522643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi            return err;
523643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi        }
524643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi    }
525643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi
526643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi    mFlags |= PLAYING;
527643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi    mFlags |= FIRST_FRAME;
528643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi
529643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi    bool deferredAudioSeek = false;
530643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi
531643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi    if (mAudioSource != NULL) {
532643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi        if (mAudioPlayer == NULL) {
533643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi            if (mAudioSink != NULL) {
534643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi
535643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi                mAudioPlayer = new VideoEditorAudioPlayer(mAudioSink, this);
5365bc7fb407ce1bab13d4a4a67d34a1a3192ee3186Dheeraj Sharma                mVeAudioPlayer =
537643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi                          (VideoEditorAudioPlayer*)mAudioPlayer;
538643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi
539643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi                mAudioPlayer->setSource(mAudioSource);
540643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi
5415bc7fb407ce1bab13d4a4a67d34a1a3192ee3186Dheeraj Sharma                mVeAudioPlayer->setAudioMixSettings(
542643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi                 mPreviewPlayerAudioMixSettings);
543643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi
5445bc7fb407ce1bab13d4a4a67d34a1a3192ee3186Dheeraj Sharma                mVeAudioPlayer->setAudioMixPCMFileHandle(
545643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi                 mAudioMixPCMFileHandle);
546643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi
5475bc7fb407ce1bab13d4a4a67d34a1a3192ee3186Dheeraj Sharma                mVeAudioPlayer->setAudioMixStoryBoardSkimTimeStamp(
548643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi                 mAudioMixStoryBoardTS, mCurrentMediaBeginCutTime,
549643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi                 mCurrentMediaVolumeValue);
550643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi
5511c97d9ab52a288d24ea54499de435277cc1a3d68Rajneesh Chowdury                 mFlags |= AUDIOPLAYER_STARTED;
5521c97d9ab52a288d24ea54499de435277cc1a3d68Rajneesh Chowdury                // We've already started the MediaSource in order to enable
5531c97d9ab52a288d24ea54499de435277cc1a3d68Rajneesh Chowdury                // the prefetcher to read its data.
5541c97d9ab52a288d24ea54499de435277cc1a3d68Rajneesh Chowdury                status_t err = mVeAudioPlayer->start(
5551c97d9ab52a288d24ea54499de435277cc1a3d68Rajneesh Chowdury                        true /* sourceAlreadyStarted */);
556643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi
5571c97d9ab52a288d24ea54499de435277cc1a3d68Rajneesh Chowdury                if (err != OK) {
5581c97d9ab52a288d24ea54499de435277cc1a3d68Rajneesh Chowdury                    //delete mAudioPlayer;
5591c97d9ab52a288d24ea54499de435277cc1a3d68Rajneesh Chowdury                    mAudioPlayer = NULL;
5601c97d9ab52a288d24ea54499de435277cc1a3d68Rajneesh Chowdury
5611c97d9ab52a288d24ea54499de435277cc1a3d68Rajneesh Chowdury                    mFlags &= ~(PLAYING | FIRST_FRAME);
5621c97d9ab52a288d24ea54499de435277cc1a3d68Rajneesh Chowdury                    return err;
5631c97d9ab52a288d24ea54499de435277cc1a3d68Rajneesh Chowdury                }
5641c97d9ab52a288d24ea54499de435277cc1a3d68Rajneesh Chowdury
5651c97d9ab52a288d24ea54499de435277cc1a3d68Rajneesh Chowdury                mTimeSource = mVeAudioPlayer;
5661c97d9ab52a288d24ea54499de435277cc1a3d68Rajneesh Chowdury                mFlags |= AUDIO_RUNNING;
567643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi                deferredAudioSeek = true;
568643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi                mWatchForAudioSeekComplete = false;
569643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi                mWatchForAudioEOS = true;
570643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi            }
5711c97d9ab52a288d24ea54499de435277cc1a3d68Rajneesh Chowdury        } else {
5721c97d9ab52a288d24ea54499de435277cc1a3d68Rajneesh Chowdury            mVeAudioPlayer = (VideoEditorAudioPlayer*)mAudioPlayer;
5731c97d9ab52a288d24ea54499de435277cc1a3d68Rajneesh Chowdury            bool isAudioPlayerStarted = mVeAudioPlayer->isStarted();
5745bc7fb407ce1bab13d4a4a67d34a1a3192ee3186Dheeraj Sharma
5751c97d9ab52a288d24ea54499de435277cc1a3d68Rajneesh Chowdury            if (mIsChangeSourceRequired == true) {
5761c97d9ab52a288d24ea54499de435277cc1a3d68Rajneesh Chowdury                LOGV("play_l: Change audio source required");
577643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi
5781c97d9ab52a288d24ea54499de435277cc1a3d68Rajneesh Chowdury                if (isAudioPlayerStarted == true) {
5791c97d9ab52a288d24ea54499de435277cc1a3d68Rajneesh Chowdury                    mVeAudioPlayer->pause();
5801c97d9ab52a288d24ea54499de435277cc1a3d68Rajneesh Chowdury                }
5815bc7fb407ce1bab13d4a4a67d34a1a3192ee3186Dheeraj Sharma
5821c97d9ab52a288d24ea54499de435277cc1a3d68Rajneesh Chowdury                mVeAudioPlayer->setSource(mAudioSource);
5831c97d9ab52a288d24ea54499de435277cc1a3d68Rajneesh Chowdury                mVeAudioPlayer->setObserver(this);
5841c97d9ab52a288d24ea54499de435277cc1a3d68Rajneesh Chowdury
5851c97d9ab52a288d24ea54499de435277cc1a3d68Rajneesh Chowdury                mVeAudioPlayer->setAudioMixSettings(
5861c97d9ab52a288d24ea54499de435277cc1a3d68Rajneesh Chowdury                 mPreviewPlayerAudioMixSettings);
5871c97d9ab52a288d24ea54499de435277cc1a3d68Rajneesh Chowdury
5881c97d9ab52a288d24ea54499de435277cc1a3d68Rajneesh Chowdury                mVeAudioPlayer->setAudioMixStoryBoardSkimTimeStamp(
5891c97d9ab52a288d24ea54499de435277cc1a3d68Rajneesh Chowdury                    mAudioMixStoryBoardTS, mCurrentMediaBeginCutTime,
5901c97d9ab52a288d24ea54499de435277cc1a3d68Rajneesh Chowdury                    mCurrentMediaVolumeValue);
5911c97d9ab52a288d24ea54499de435277cc1a3d68Rajneesh Chowdury
5921c97d9ab52a288d24ea54499de435277cc1a3d68Rajneesh Chowdury                if (isAudioPlayerStarted == true) {
5931c97d9ab52a288d24ea54499de435277cc1a3d68Rajneesh Chowdury                    mVeAudioPlayer->resume();
5941c97d9ab52a288d24ea54499de435277cc1a3d68Rajneesh Chowdury                } else {
5951c97d9ab52a288d24ea54499de435277cc1a3d68Rajneesh Chowdury                    status_t err = OK;
5961c97d9ab52a288d24ea54499de435277cc1a3d68Rajneesh Chowdury                    err = mVeAudioPlayer->start(true);
5971c97d9ab52a288d24ea54499de435277cc1a3d68Rajneesh Chowdury                    if (err != OK) {
5981c97d9ab52a288d24ea54499de435277cc1a3d68Rajneesh Chowdury                        mAudioPlayer = NULL;
5991c97d9ab52a288d24ea54499de435277cc1a3d68Rajneesh Chowdury                        mVeAudioPlayer = NULL;
6001c97d9ab52a288d24ea54499de435277cc1a3d68Rajneesh Chowdury
6011c97d9ab52a288d24ea54499de435277cc1a3d68Rajneesh Chowdury                        mFlags &= ~(PLAYING | FIRST_FRAME);
6021c97d9ab52a288d24ea54499de435277cc1a3d68Rajneesh Chowdury                        return err;
6031c97d9ab52a288d24ea54499de435277cc1a3d68Rajneesh Chowdury                    }
6041c97d9ab52a288d24ea54499de435277cc1a3d68Rajneesh Chowdury                }
6051c97d9ab52a288d24ea54499de435277cc1a3d68Rajneesh Chowdury            } else {
6061c97d9ab52a288d24ea54499de435277cc1a3d68Rajneesh Chowdury                LOGV("play_l: No Source change required");
6071c97d9ab52a288d24ea54499de435277cc1a3d68Rajneesh Chowdury                mVeAudioPlayer->setAudioMixStoryBoardSkimTimeStamp(
6081c97d9ab52a288d24ea54499de435277cc1a3d68Rajneesh Chowdury                    mAudioMixStoryBoardTS, mCurrentMediaBeginCutTime,
6091c97d9ab52a288d24ea54499de435277cc1a3d68Rajneesh Chowdury                    mCurrentMediaVolumeValue);
6101c97d9ab52a288d24ea54499de435277cc1a3d68Rajneesh Chowdury
6111c97d9ab52a288d24ea54499de435277cc1a3d68Rajneesh Chowdury                mVeAudioPlayer->resume();
6125bc7fb407ce1bab13d4a4a67d34a1a3192ee3186Dheeraj Sharma            }
6131c97d9ab52a288d24ea54499de435277cc1a3d68Rajneesh Chowdury
6141c97d9ab52a288d24ea54499de435277cc1a3d68Rajneesh Chowdury            mFlags |= AUDIOPLAYER_STARTED;
6151c97d9ab52a288d24ea54499de435277cc1a3d68Rajneesh Chowdury            mFlags |= AUDIO_RUNNING;
6161c97d9ab52a288d24ea54499de435277cc1a3d68Rajneesh Chowdury            mTimeSource = mVeAudioPlayer;
6171c97d9ab52a288d24ea54499de435277cc1a3d68Rajneesh Chowdury            deferredAudioSeek = true;
6181c97d9ab52a288d24ea54499de435277cc1a3d68Rajneesh Chowdury            mWatchForAudioSeekComplete = false;
6191c97d9ab52a288d24ea54499de435277cc1a3d68Rajneesh Chowdury            mWatchForAudioEOS = true;
6205bc7fb407ce1bab13d4a4a67d34a1a3192ee3186Dheeraj Sharma        }
621643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi    }
622643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi
623643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi    if (mTimeSource == NULL && mAudioPlayer == NULL) {
624643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi        mTimeSource = &mSystemTimeSource;
625643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi    }
626643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi
62753c567c3355255ed12dd9f5d5a1c58f821770329Dharmaray Kundargi    // Set the seek option for Image source files and read.
62853c567c3355255ed12dd9f5d5a1c58f821770329Dharmaray Kundargi    // This resets the timestamping for image play
62953c567c3355255ed12dd9f5d5a1c58f821770329Dharmaray Kundargi    if (mIsVideoSourceJpg) {
63053c567c3355255ed12dd9f5d5a1c58f821770329Dharmaray Kundargi        MediaSource::ReadOptions options;
63153c567c3355255ed12dd9f5d5a1c58f821770329Dharmaray Kundargi        MediaBuffer *aLocalBuffer;
63253c567c3355255ed12dd9f5d5a1c58f821770329Dharmaray Kundargi        options.setSeekTo(mSeekTimeUs);
63353c567c3355255ed12dd9f5d5a1c58f821770329Dharmaray Kundargi        mVideoSource->read(&aLocalBuffer, &options);
6344ca3e5df4b809210b240cd7d0489922017d87a6dSantosh Madhava        aLocalBuffer->release();
63553c567c3355255ed12dd9f5d5a1c58f821770329Dharmaray Kundargi    }
63653c567c3355255ed12dd9f5d5a1c58f821770329Dharmaray Kundargi
637643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi    if (mVideoSource != NULL) {
638643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi        // Kick off video playback
639643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi        postVideoEvent_l();
640643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi    }
641643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi
642643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi    if (deferredAudioSeek) {
643643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi        // If there was a seek request while we were paused
644643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi        // and we're just starting up again, honor the request now.
645643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi        seekAudioIfNecessary_l();
646643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi    }
647643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi
648643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi    if (mFlags & AT_EOS) {
649643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi        // Legacy behaviour, if a stream finishes playing and then
650643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi        // is started again, we play from the start...
651643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi        seekTo_l(0);
652643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi    }
653643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi
654643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi    return OK;
655643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi}
656643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi
657643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi
658bfece17c8f63de4d4b686da50f8ecac2f6f8ec53Santosh Madhavastatus_t PreviewPlayer::initRenderer_l() {
6596e2242974c109e85bac50550970fe84009c76f77Mathias Agopian    if (mSurface != NULL) {
660643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi        if(mVideoRenderer == NULL) {
66143fcc396614a587851e2b7c4cea2876ec58b8648Chih-Chung Chang            mVideoRenderer = mNativeWindowRenderer->createRenderInput();
66243fcc396614a587851e2b7c4cea2876ec58b8648Chih-Chung Chang            if (mVideoSource != NULL) {
66343fcc396614a587851e2b7c4cea2876ec58b8648Chih-Chung Chang                updateSizeToRender(mVideoSource->getFormat());
664bfece17c8f63de4d4b686da50f8ecac2f6f8ec53Santosh Madhava            }
665643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi        }
666643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi    }
667bfece17c8f63de4d4b686da50f8ecac2f6f8ec53Santosh Madhava    return OK;
668643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi}
669643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi
670643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi
671643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargistatus_t PreviewPlayer::seekTo(int64_t timeUs) {
672643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi
673643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi    if ((mExtractorFlags & MediaExtractor::CAN_SEEK) || (mIsVideoSourceJpg)) {
674643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi        Mutex::Autolock autoLock(mLock);
675643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi        return seekTo_l(timeUs);
676643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi    }
677643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi
678643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi    return OK;
679643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi}
680643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi
681643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi
682643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargistatus_t PreviewPlayer::getVideoDimensions(
683643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi        int32_t *width, int32_t *height) const {
684643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi    Mutex::Autolock autoLock(mLock);
685643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi
686643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi    if (mVideoWidth < 0 || mVideoHeight < 0) {
687643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi        return UNKNOWN_ERROR;
688643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi    }
689643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi
690643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi    *width = mVideoWidth;
691643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi    *height = mVideoHeight;
692643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi
693643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi    return OK;
694643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi}
695643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi
696643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi
697643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargistatus_t PreviewPlayer::initAudioDecoder() {
698643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi    sp<MetaData> meta = mAudioTrack->getFormat();
699643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi    const char *mime;
700643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi    CHECK(meta->findCString(kKeyMIMEType, &mime));
701643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi
702643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi    if (!strcasecmp(mime, MEDIA_MIMETYPE_AUDIO_RAW)) {
703643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi        mAudioSource = mAudioTrack;
704643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi    } else {
705643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi        sp<MediaSource> aRawSource;
706643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi        aRawSource = OMXCodec::Create(
707643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi                mClient.interface(), mAudioTrack->getFormat(),
708643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi                false, // createEncoder
709643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi                mAudioTrack);
710643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi
711643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi        if(aRawSource != NULL) {
712643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi            LOGV("initAudioDecoder: new VideoEditorSRC");
713643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi            mAudioSource = new VideoEditorSRC(aRawSource);
714643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi        }
715643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi    }
716643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi
717643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi    if (mAudioSource != NULL) {
718643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi        int64_t durationUs;
719643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi        if (mAudioTrack->getFormat()->findInt64(kKeyDuration, &durationUs)) {
720643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi            Mutex::Autolock autoLock(mMiscStateLock);
721643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi            if (mDurationUs < 0 || durationUs > mDurationUs) {
722643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi                mDurationUs = durationUs;
723643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi            }
724643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi        }
725643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi        status_t err = mAudioSource->start();
726643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi
727643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi        if (err != OK) {
728643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi            mAudioSource.clear();
729643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi            return err;
730643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi        }
731643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi    } else if (!strcasecmp(mime, MEDIA_MIMETYPE_AUDIO_QCELP)) {
732643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi        // For legacy reasons we're simply going to ignore the absence
733643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi        // of an audio decoder for QCELP instead of aborting playback
734643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi        // altogether.
735643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi        return OK;
736643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi    }
737643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi
738643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi    return mAudioSource != NULL ? OK : UNKNOWN_ERROR;
739643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi}
740643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi
741643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi
742643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargistatus_t PreviewPlayer::initVideoDecoder(uint32_t flags) {
743643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi
74443fcc396614a587851e2b7c4cea2876ec58b8648Chih-Chung Chang    initRenderer_l();
74543fcc396614a587851e2b7c4cea2876ec58b8648Chih-Chung Chang
74643fcc396614a587851e2b7c4cea2876ec58b8648Chih-Chung Chang    if (mVideoRenderer == NULL) {
74743fcc396614a587851e2b7c4cea2876ec58b8648Chih-Chung Chang        LOGE("Cannot create renderer");
74843fcc396614a587851e2b7c4cea2876ec58b8648Chih-Chung Chang        return UNKNOWN_ERROR;
74943fcc396614a587851e2b7c4cea2876ec58b8648Chih-Chung Chang    }
75043fcc396614a587851e2b7c4cea2876ec58b8648Chih-Chung Chang
751643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi    mVideoSource = OMXCodec::Create(
752643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi            mClient.interface(), mVideoTrack->getFormat(),
753643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi            false,
754643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi            mVideoTrack,
75543fcc396614a587851e2b7c4cea2876ec58b8648Chih-Chung Chang            NULL, flags, mVideoRenderer->getTargetWindow());
756643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi
757643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi    if (mVideoSource != NULL) {
758643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi        int64_t durationUs;
759643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi        if (mVideoTrack->getFormat()->findInt64(kKeyDuration, &durationUs)) {
760643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi            Mutex::Autolock autoLock(mMiscStateLock);
761643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi            if (mDurationUs < 0 || durationUs > mDurationUs) {
762643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi                mDurationUs = durationUs;
763643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi            }
764643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi        }
765643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi
76643fcc396614a587851e2b7c4cea2876ec58b8648Chih-Chung Chang        updateSizeToRender(mVideoTrack->getFormat());
76735cb2de64cb6482a08f446e80733e7d344a0dcacDharmaray Kundargi
768643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi        status_t err = mVideoSource->start();
769643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi
770643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi        if (err != OK) {
771643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi            mVideoSource.clear();
772643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi            return err;
773643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi        }
774643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi    }
775643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi
776643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi    return mVideoSource != NULL ? OK : UNKNOWN_ERROR;
777643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi}
778643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi
779643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi
780643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargivoid PreviewPlayer::onVideoEvent() {
781643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi    uint32_t i=0;
782643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi    M4OSA_ERR err1 = M4NO_ERROR;
783643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi    int64_t imageFrameTimeUs = 0;
784643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi
785643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi    Mutex::Autolock autoLock(mLock);
786643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi    if (!mVideoEventPending) {
787643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi        // The event has been cancelled in reset_l() but had already
788643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi        // been scheduled for execution at that time.
789643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi        return;
790643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi    }
791643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi    mVideoEventPending = false;
792643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi
7939e4c36a044e264c644d7fa9f9894659a6fc47a6fAndreas Huber    if (mFlags & SEEK_PREVIEW) {
7949e4c36a044e264c644d7fa9f9894659a6fc47a6fAndreas Huber        mFlags &= ~SEEK_PREVIEW;
7959e4c36a044e264c644d7fa9f9894659a6fc47a6fAndreas Huber        return;
7969e4c36a044e264c644d7fa9f9894659a6fc47a6fAndreas Huber    }
7979e4c36a044e264c644d7fa9f9894659a6fc47a6fAndreas Huber
798643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi    TimeSource *ts_st =  &mSystemTimeSource;
799643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi    int64_t timeStartUs = ts_st->getRealTimeUs();
800643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi
801a5872f770c50da1db555d53e062a9896ea4321d5Andreas Huber    if (mSeeking != NO_SEEK) {
802643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi
803643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi        if(mAudioSource != NULL) {
804643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi
805643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi            // We're going to seek the video source first, followed by
806643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi            // the audio source.
807643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi            // In order to avoid jumps in the DataSource offset caused by
808643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi            // the audio codec prefetching data from the old locations
809643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi            // while the video codec is already reading data from the new
810643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi            // locations, we'll "pause" the audio source, causing it to
811643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi            // stop reading input data until a subsequent seek.
812643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi
8135bc7fb407ce1bab13d4a4a67d34a1a3192ee3186Dheeraj Sharma            if (mAudioPlayer != NULL && (mFlags & AUDIO_RUNNING)) {
814643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi                mAudioPlayer->pause();
8155bc7fb407ce1bab13d4a4a67d34a1a3192ee3186Dheeraj Sharma                mFlags &= ~AUDIO_RUNNING;
816643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi            }
817643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi            mAudioSource->pause();
818643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi        }
819643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi    }
820643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi
821643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi    if (!mVideoBuffer) {
822643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi        MediaSource::ReadOptions options;
823a5872f770c50da1db555d53e062a9896ea4321d5Andreas Huber        if (mSeeking != NO_SEEK) {
824643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi            LOGV("LV PLAYER seeking to %lld us (%.2f secs)", mSeekTimeUs,
825643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi                                                      mSeekTimeUs / 1E6);
826643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi
827643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi            options.setSeekTo(
828643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi                    mSeekTimeUs, MediaSource::ReadOptions::SEEK_CLOSEST);
829643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi        }
830643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi        for (;;) {
83143fcc396614a587851e2b7c4cea2876ec58b8648Chih-Chung Chang            status_t err = mVideoSource->read(&mVideoBuffer, &options);
832643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi            options.clearSeekTo();
833643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi
834643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi            if (err != OK) {
835643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi                CHECK_EQ(mVideoBuffer, NULL);
836643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi
837643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi                if (err == INFO_FORMAT_CHANGED) {
838643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi                    LOGV("LV PLAYER VideoSource signalled format change");
839643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi                    notifyVideoSize_l();
840643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi
841643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi                    if (mVideoRenderer != NULL) {
842643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi                        mVideoRendererIsPreview = false;
843bfece17c8f63de4d4b686da50f8ecac2f6f8ec53Santosh Madhava                        err = initRenderer_l();
8444ca3e5df4b809210b240cd7d0489922017d87a6dSantosh Madhava                        if (err != OK) {
8454ca3e5df4b809210b240cd7d0489922017d87a6dSantosh Madhava                            postStreamDoneEvent_l(err);
8464ca3e5df4b809210b240cd7d0489922017d87a6dSantosh Madhava                        }
847bfece17c8f63de4d4b686da50f8ecac2f6f8ec53Santosh Madhava
848643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi                    }
84943fcc396614a587851e2b7c4cea2876ec58b8648Chih-Chung Chang
85043fcc396614a587851e2b7c4cea2876ec58b8648Chih-Chung Chang                    updateSizeToRender(mVideoSource->getFormat());
851643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi                    continue;
852643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi                }
853643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi                // So video playback is complete, but we may still have
854342f932f6312be84a48512216b561ead42b53199Santosh Madhava                // a seek request pending that needs to be applied to the audio track
855a5872f770c50da1db555d53e062a9896ea4321d5Andreas Huber                if (mSeeking != NO_SEEK) {
856342f932f6312be84a48512216b561ead42b53199Santosh Madhava                    LOGV("video stream ended while seeking!");
857342f932f6312be84a48512216b561ead42b53199Santosh Madhava                }
858342f932f6312be84a48512216b561ead42b53199Santosh Madhava                finishSeekIfNecessary(-1);
859643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi                LOGV("PreviewPlayer: onVideoEvent EOS reached.");
860643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi                mFlags |= VIDEO_AT_EOS;
8611c97d9ab52a288d24ea54499de435277cc1a3d68Rajneesh Chowdury                mFlags |= AUDIO_AT_EOS;
8624f4efef8357f4d8b23ccfb1b29db34175bf72627Dheeraj Sharma                mOverlayUpdateEventPosted = false;
863643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi                postStreamDoneEvent_l(err);
864b2d6e0f74a12e5cce5b429e646172c63346346c3Santosh Madhava                // Set the last decoded timestamp to duration
865ebf40154a222c864a0aaf807702fc4eb6b9cf40fRaghavender Palla                mDecodedVideoTs = (mPlayEndTimeMsec*1000LL);
866643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi                return;
867643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi            }
868643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi
869643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi            if (mVideoBuffer->range_length() == 0) {
870643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi                // Some decoders, notably the PV AVC software decoder
871643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi                // return spurious empty buffers that we just want to ignore.
872643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi
873643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi                mVideoBuffer->release();
874643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi                mVideoBuffer = NULL;
875643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi                continue;
876643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi            }
877643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi
878643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi            int64_t videoTimeUs;
879643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi            CHECK(mVideoBuffer->meta_data()->findInt64(kKeyTime, &videoTimeUs));
880643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi
881a5872f770c50da1db555d53e062a9896ea4321d5Andreas Huber            if (mSeeking != NO_SEEK) {
882b2d6e0f74a12e5cce5b429e646172c63346346c3Santosh Madhava                if (videoTimeUs < mSeekTimeUs) {
883b2d6e0f74a12e5cce5b429e646172c63346346c3Santosh Madhava                    // buffers are before seek time
884b2d6e0f74a12e5cce5b429e646172c63346346c3Santosh Madhava                    // ignore them
885b2d6e0f74a12e5cce5b429e646172c63346346c3Santosh Madhava                    mVideoBuffer->release();
886b2d6e0f74a12e5cce5b429e646172c63346346c3Santosh Madhava                    mVideoBuffer = NULL;
887b2d6e0f74a12e5cce5b429e646172c63346346c3Santosh Madhava                    continue;
888b2d6e0f74a12e5cce5b429e646172c63346346c3Santosh Madhava                }
889b2d6e0f74a12e5cce5b429e646172c63346346c3Santosh Madhava            } else {
890b2d6e0f74a12e5cce5b429e646172c63346346c3Santosh Madhava                if((videoTimeUs/1000) < mPlayBeginTimeMsec) {
891b2d6e0f74a12e5cce5b429e646172c63346346c3Santosh Madhava                    // Frames are before begin cut time
892b2d6e0f74a12e5cce5b429e646172c63346346c3Santosh Madhava                    // Donot render
893b2d6e0f74a12e5cce5b429e646172c63346346c3Santosh Madhava                    mVideoBuffer->release();
894b2d6e0f74a12e5cce5b429e646172c63346346c3Santosh Madhava                    mVideoBuffer = NULL;
895b2d6e0f74a12e5cce5b429e646172c63346346c3Santosh Madhava                    continue;
896b2d6e0f74a12e5cce5b429e646172c63346346c3Santosh Madhava                }
897643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi            }
898643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi            break;
899643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi        }
900643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi    }
901643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi
902643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi    mNumberDecVideoFrames++;
903643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi
904643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi    int64_t timeUs;
905643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi    CHECK(mVideoBuffer->meta_data()->findInt64(kKeyTime, &timeUs));
906643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi
907643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi    {
908643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi        Mutex::Autolock autoLock(mMiscStateLock);
909643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi        mVideoTimeUs = timeUs;
910643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi    }
911643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi
912643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi
913643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi    if(!mStartNextPlayer) {
914ebf40154a222c864a0aaf807702fc4eb6b9cf40fRaghavender Palla        int64_t playbackTimeRemaining = (mPlayEndTimeMsec*1000LL) - timeUs;
915643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi        if(playbackTimeRemaining <= 1500000) {
916643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi            //When less than 1.5 sec of playback left
917643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi            // send notification to start next player
918643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi
919643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi            mStartNextPlayer = true;
920643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi            notifyListener_l(0xAAAAAAAA);
921643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi        }
922643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi    }
923643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi
924a5872f770c50da1db555d53e062a9896ea4321d5Andreas Huber    SeekType wasSeeking = mSeeking;
925643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi    finishSeekIfNecessary(timeUs);
9265bc7fb407ce1bab13d4a4a67d34a1a3192ee3186Dheeraj Sharma    if (mAudioPlayer != NULL && !(mFlags & (AUDIO_RUNNING))) {
9275bc7fb407ce1bab13d4a4a67d34a1a3192ee3186Dheeraj Sharma        status_t err = startAudioPlayer_l();
9285bc7fb407ce1bab13d4a4a67d34a1a3192ee3186Dheeraj Sharma        if (err != OK) {
9295bc7fb407ce1bab13d4a4a67d34a1a3192ee3186Dheeraj Sharma            LOGE("Starting the audio player failed w/ err %d", err);
9305bc7fb407ce1bab13d4a4a67d34a1a3192ee3186Dheeraj Sharma            return;
9315bc7fb407ce1bab13d4a4a67d34a1a3192ee3186Dheeraj Sharma        }
9325bc7fb407ce1bab13d4a4a67d34a1a3192ee3186Dheeraj Sharma    }
933643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi
934643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi    TimeSource *ts = (mFlags & AUDIO_AT_EOS) ? &mSystemTimeSource : mTimeSource;
935643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi
936643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi    if(ts == NULL) {
937643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi        mVideoBuffer->release();
938643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi        mVideoBuffer = NULL;
939643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi        return;
940643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi    }
941643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi
942643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi    if(!mIsVideoSourceJpg) {
943643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi        if (mFlags & FIRST_FRAME) {
944643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi            mFlags &= ~FIRST_FRAME;
945643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi
946643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi            mTimeSourceDeltaUs = ts->getRealTimeUs() - timeUs;
947643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi        }
948643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi
949643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi        int64_t realTimeUs, mediaTimeUs;
950643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi        if (!(mFlags & AUDIO_AT_EOS) && mAudioPlayer != NULL
951643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi            && mAudioPlayer->getMediaTimeMapping(&realTimeUs, &mediaTimeUs)) {
952643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi            mTimeSourceDeltaUs = realTimeUs - mediaTimeUs;
953643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi        }
954643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi
955643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi        int64_t nowUs = ts->getRealTimeUs() - mTimeSourceDeltaUs;
956643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi
957643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi        int64_t latenessUs = nowUs - timeUs;
958643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi
959a5872f770c50da1db555d53e062a9896ea4321d5Andreas Huber        if (wasSeeking != NO_SEEK) {
960342f932f6312be84a48512216b561ead42b53199Santosh Madhava            // Let's display the first frame after seeking right away.
961342f932f6312be84a48512216b561ead42b53199Santosh Madhava            latenessUs = 0;
962342f932f6312be84a48512216b561ead42b53199Santosh Madhava        }
963643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi        LOGV("Audio time stamp = %lld and video time stamp = %lld",
964643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi                                            ts->getRealTimeUs(),timeUs);
965643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi        if (latenessUs > 40000) {
966643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi            // We're more than 40ms late.
967643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi
968643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi            LOGV("LV PLAYER we're late by %lld us (%.2f secs)",
969643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi                                           latenessUs, latenessUs / 1E6);
970643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi
971643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi            mVideoBuffer->release();
972643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi            mVideoBuffer = NULL;
9734f155f0cffa2414545854e899dff4861187e1f68Dharmaray Kundargi            postVideoEvent_l(0);
974643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi            return;
975643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi        }
976643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi
9774f155f0cffa2414545854e899dff4861187e1f68Dharmaray Kundargi        if (latenessUs < -25000) {
9784f155f0cffa2414545854e899dff4861187e1f68Dharmaray Kundargi            // We're more than 25ms early.
9794f155f0cffa2414545854e899dff4861187e1f68Dharmaray Kundargi            LOGV("We're more than 25ms early, lateness %lld", latenessUs);
980643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi
9814f155f0cffa2414545854e899dff4861187e1f68Dharmaray Kundargi            postVideoEvent_l(25000);
982643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi            return;
983643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi        }
984643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi    }
985643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi
986643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi    if (mVideoRendererIsPreview || mVideoRenderer == NULL) {
987643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi        mVideoRendererIsPreview = false;
988643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi
989bfece17c8f63de4d4b686da50f8ecac2f6f8ec53Santosh Madhava        status_t err = initRenderer_l();
9904ca3e5df4b809210b240cd7d0489922017d87a6dSantosh Madhava        if (err != OK) {
9914ca3e5df4b809210b240cd7d0489922017d87a6dSantosh Madhava            postStreamDoneEvent_l(err);
9924ca3e5df4b809210b240cd7d0489922017d87a6dSantosh Madhava        }
993643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi    }
994643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi
995643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi    // If timestamp exceeds endCutTime of clip, donot render
996643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi    if((timeUs/1000) > mPlayEndTimeMsec) {
997cece4b32d340f0ca514160647b9883e3777bc376Chih-Chung Chang        mVideoBuffer->release();
998643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi        mVideoBuffer = NULL;
999643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi        mFlags |= VIDEO_AT_EOS;
1000643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi        mFlags |= AUDIO_AT_EOS;
1001bfece17c8f63de4d4b686da50f8ecac2f6f8ec53Santosh Madhava        LOGV("PreviewPlayer: onVideoEvent timeUs > mPlayEndTime; send EOS..");
10024f4efef8357f4d8b23ccfb1b29db34175bf72627Dheeraj Sharma        mOverlayUpdateEventPosted = false;
1003fe288aa71450ebe04eb74d06a3ea887c6009aacbSantosh Madhava        // Set the last decoded timestamp to duration
1004ebf40154a222c864a0aaf807702fc4eb6b9cf40fRaghavender Palla        mDecodedVideoTs = (mPlayEndTimeMsec*1000LL);
1005643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi        postStreamDoneEvent_l(ERROR_END_OF_STREAM);
1006643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi        return;
1007643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi    }
1008b2d6e0f74a12e5cce5b429e646172c63346346c3Santosh Madhava    // Capture the frame timestamp to be rendered
1009b2d6e0f74a12e5cce5b429e646172c63346346c3Santosh Madhava    mDecodedVideoTs = timeUs;
1010643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi
1011643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi    // Post processing to apply video effects
1012643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi    for(i=0;i<mNumberEffects;i++) {
1013643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi        // First check if effect starttime matches the clip being previewed
1014643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi        if((mEffectsSettings[i].uiStartTime < (mDecVideoTsStoryBoard/1000)) ||
1015643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi        (mEffectsSettings[i].uiStartTime >=
1016643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi         ((mDecVideoTsStoryBoard/1000) + mPlayEndTimeMsec - mPlayBeginTimeMsec)))
1017643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi        {
1018643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi            // This effect doesn't belong to this clip, check next one
1019643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi            continue;
1020643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi        }
1021643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi        // Check if effect applies to this particular frame timestamp
1022643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi        if((mEffectsSettings[i].uiStartTime <=
1023643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi         (((timeUs+mDecVideoTsStoryBoard)/1000)-mPlayBeginTimeMsec)) &&
1024643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi            ((mEffectsSettings[i].uiStartTime+mEffectsSettings[i].uiDuration) >=
1025643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi             (((timeUs+mDecVideoTsStoryBoard)/1000)-mPlayBeginTimeMsec))
1026643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi              && (mEffectsSettings[i].uiDuration != 0)) {
1027643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi            setVideoPostProcessingNode(
1028643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi             mEffectsSettings[i].VideoEffectType, TRUE);
1029643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi        }
1030643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi        else {
1031643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi            setVideoPostProcessingNode(
1032643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi             mEffectsSettings[i].VideoEffectType, FALSE);
1033643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi        }
1034e6c0750cd2927967f93a8811954f889d23fadb6eDharmaray Kundargi    }
1035643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi
1036e6c0750cd2927967f93a8811954f889d23fadb6eDharmaray Kundargi    //Provide the overlay Update indication when there is an overlay effect
1037d01ef568f96253fe5859526bb67b13fc5e17b544Dharmaray Kundargi    if (mCurrentVideoEffect & VIDEO_EFFECT_FRAMING) {
1038d01ef568f96253fe5859526bb67b13fc5e17b544Dharmaray Kundargi        mCurrentVideoEffect &= ~VIDEO_EFFECT_FRAMING; //never apply framing here.
1039e6c0750cd2927967f93a8811954f889d23fadb6eDharmaray Kundargi        if (!mOverlayUpdateEventPosted) {
1040e6c0750cd2927967f93a8811954f889d23fadb6eDharmaray Kundargi            // Find the effect in effectSettings array
1041408e25b2508d97f7ae0b39acf46ab42b7c223c44Basavapatna Dattaguru            M4OSA_UInt32 index;
1042e6c0750cd2927967f93a8811954f889d23fadb6eDharmaray Kundargi            for (index = 0; index < mNumberEffects; index++) {
1043e6c0750cd2927967f93a8811954f889d23fadb6eDharmaray Kundargi                M4OSA_UInt32 timeMs = mDecodedVideoTs/1000;
1044e6c0750cd2927967f93a8811954f889d23fadb6eDharmaray Kundargi                M4OSA_UInt32 timeOffset = mDecVideoTsStoryBoard/1000;
1045e6c0750cd2927967f93a8811954f889d23fadb6eDharmaray Kundargi                if(mEffectsSettings[index].VideoEffectType ==
1046408e25b2508d97f7ae0b39acf46ab42b7c223c44Basavapatna Dattaguru                    (M4VSS3GPP_VideoEffectType)M4xVSS_kVideoEffectType_Framing) {
1047254c8dfe514fd45eef251763639f63615379570fDharmaray Kundargi                    if (((mEffectsSettings[index].uiStartTime + 1) <=
1048254c8dfe514fd45eef251763639f63615379570fDharmaray Kundargi                        timeMs + timeOffset - mPlayBeginTimeMsec) &&
1049e6c0750cd2927967f93a8811954f889d23fadb6eDharmaray Kundargi                        ((mEffectsSettings[index].uiStartTime - 1 +
1050254c8dfe514fd45eef251763639f63615379570fDharmaray Kundargi                        mEffectsSettings[index].uiDuration) >=
1051254c8dfe514fd45eef251763639f63615379570fDharmaray Kundargi                        timeMs + timeOffset - mPlayBeginTimeMsec))
1052e6c0750cd2927967f93a8811954f889d23fadb6eDharmaray Kundargi                    {
1053e6c0750cd2927967f93a8811954f889d23fadb6eDharmaray Kundargi                        break;
1054e6c0750cd2927967f93a8811954f889d23fadb6eDharmaray Kundargi                    }
1055e6c0750cd2927967f93a8811954f889d23fadb6eDharmaray Kundargi                }
1056e6c0750cd2927967f93a8811954f889d23fadb6eDharmaray Kundargi            }
1057e6c0750cd2927967f93a8811954f889d23fadb6eDharmaray Kundargi            if (index < mNumberEffects) {
1058e6c0750cd2927967f93a8811954f889d23fadb6eDharmaray Kundargi                mCurrFramingEffectIndex = index;
1059e6c0750cd2927967f93a8811954f889d23fadb6eDharmaray Kundargi                mOverlayUpdateEventPosted = true;
1060e6c0750cd2927967f93a8811954f889d23fadb6eDharmaray Kundargi                postOverlayUpdateEvent_l();
1061e6c0750cd2927967f93a8811954f889d23fadb6eDharmaray Kundargi                LOGV("Framing index = %d", mCurrFramingEffectIndex);
1062e6c0750cd2927967f93a8811954f889d23fadb6eDharmaray Kundargi            } else {
1063e6c0750cd2927967f93a8811954f889d23fadb6eDharmaray Kundargi                LOGV("No framing effects found");
1064e6c0750cd2927967f93a8811954f889d23fadb6eDharmaray Kundargi            }
1065e6c0750cd2927967f93a8811954f889d23fadb6eDharmaray Kundargi        }
1066e6c0750cd2927967f93a8811954f889d23fadb6eDharmaray Kundargi
1067e6c0750cd2927967f93a8811954f889d23fadb6eDharmaray Kundargi    } else if (mOverlayUpdateEventPosted) {
1068e6c0750cd2927967f93a8811954f889d23fadb6eDharmaray Kundargi        //Post the event when the overlay is no more valid
1069e6c0750cd2927967f93a8811954f889d23fadb6eDharmaray Kundargi        LOGV("Overlay is Done");
1070e6c0750cd2927967f93a8811954f889d23fadb6eDharmaray Kundargi        mOverlayUpdateEventPosted = false;
1071e6c0750cd2927967f93a8811954f889d23fadb6eDharmaray Kundargi        postOverlayUpdateEvent_l();
1072643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi    }
1073643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi
1074643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi    if (mVideoRenderer != NULL) {
107543fcc396614a587851e2b7c4cea2876ec58b8648Chih-Chung Chang        mVideoRenderer->render(mVideoBuffer, mCurrentVideoEffect,
107643fcc396614a587851e2b7c4cea2876ec58b8648Chih-Chung Chang                mRenderingMode, mIsVideoSourceJpg);
1077643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi    }
1078643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi
1079cece4b32d340f0ca514160647b9883e3777bc376Chih-Chung Chang    mVideoBuffer->release();
1080643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi    mVideoBuffer = NULL;
1081643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi
1082643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi    // Post progress callback based on callback interval set
1083643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi    if(mNumberDecVideoFrames >= mProgressCbInterval) {
1084643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi        postProgressCallbackEvent_l();
1085643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi        mNumberDecVideoFrames = 0;  // reset counter
1086643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi    }
1087643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi
1088643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi    // if reached EndCutTime of clip, post EOS event
1089643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi    if((timeUs/1000) >= mPlayEndTimeMsec) {
1090643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi        LOGV("PreviewPlayer: onVideoEvent EOS.");
1091643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi        mFlags |= VIDEO_AT_EOS;
1092643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi        mFlags |= AUDIO_AT_EOS;
10934f4efef8357f4d8b23ccfb1b29db34175bf72627Dheeraj Sharma        mOverlayUpdateEventPosted = false;
1094fe288aa71450ebe04eb74d06a3ea887c6009aacbSantosh Madhava        // Set the last decoded timestamp to duration
1095ebf40154a222c864a0aaf807702fc4eb6b9cf40fRaghavender Palla        mDecodedVideoTs = (mPlayEndTimeMsec*1000LL);
1096643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi        postStreamDoneEvent_l(ERROR_END_OF_STREAM);
1097643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi    }
1098643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi    else {
1099a5872f770c50da1db555d53e062a9896ea4321d5Andreas Huber        if ((wasSeeking != NO_SEEK) && (mFlags & SEEK_PREVIEW)) {
11001c97d9ab52a288d24ea54499de435277cc1a3d68Rajneesh Chowdury            mFlags &= ~SEEK_PREVIEW;
11011c97d9ab52a288d24ea54499de435277cc1a3d68Rajneesh Chowdury            return;
11021c97d9ab52a288d24ea54499de435277cc1a3d68Rajneesh Chowdury        }
11031c97d9ab52a288d24ea54499de435277cc1a3d68Rajneesh Chowdury
1104643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi        if(!mIsVideoSourceJpg) {
11054f155f0cffa2414545854e899dff4861187e1f68Dharmaray Kundargi            postVideoEvent_l(0);
1106643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi        }
1107643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi        else {
1108643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi            postVideoEvent_l(33000);
1109643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi        }
1110643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi    }
1111643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi}
1112643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi
1113643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargistatus_t PreviewPlayer::prepare() {
1114643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi    Mutex::Autolock autoLock(mLock);
1115643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi    return prepare_l();
1116643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi}
1117643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi
1118643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargistatus_t PreviewPlayer::prepare_l() {
1119643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi    if (mFlags & PREPARED) {
1120643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi        return OK;
1121643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi    }
1122643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi
1123643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi    if (mFlags & PREPARING) {
1124643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi        return UNKNOWN_ERROR;
1125643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi    }
1126643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi
1127643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi    mIsAsyncPrepare = false;
1128643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi    status_t err = prepareAsync_l();
1129643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi
1130643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi    if (err != OK) {
1131643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi        return err;
1132643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi    }
1133643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi
1134643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi    while (mFlags & PREPARING) {
1135643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi        mPreparedCondition.wait(mLock);
1136643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi    }
1137643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi
1138643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi    return mPrepareResult;
1139643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi}
1140643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi
1141643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargistatus_t PreviewPlayer::prepareAsync_l() {
1142643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi    if (mFlags & PREPARING) {
1143643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi        return UNKNOWN_ERROR;  // async prepare already pending
1144643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi    }
1145643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi
1146643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi    if (!mQueueStarted) {
1147643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi        mQueue.start();
1148643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi        mQueueStarted = true;
1149643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi    }
1150643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi
1151643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi    mFlags |= PREPARING;
1152643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi    mAsyncPrepareEvent = new PreviewPlayerEvent(
1153643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi            this, &PreviewPlayer::onPrepareAsyncEvent);
1154643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi
1155643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi    mQueue.postEvent(mAsyncPrepareEvent);
1156643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi
1157643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi    return OK;
1158643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi}
1159643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi
1160643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargistatus_t PreviewPlayer::finishSetDataSource_l() {
1161643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi    sp<DataSource> dataSource;
1162643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi    sp<MediaExtractor> extractor;
1163643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi
1164643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi    dataSource = DataSource::CreateFromURI(mUri.string(), &mUriHeaders);
1165643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi
1166643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi    if (dataSource == NULL) {
1167643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi        return UNKNOWN_ERROR;
1168643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi    }
1169643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi
1170643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi    //If file type is .rgb, then no need to check for Extractor
1171643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi    int uriLen = strlen(mUri);
1172643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi    int startOffset = uriLen - 4;
1173643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi    if(!strncasecmp(mUri+startOffset, ".rgb", 4)) {
1174643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi        extractor = NULL;
1175643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi    }
1176643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi    else {
1177643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi        extractor = MediaExtractor::Create(dataSource,
1178643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi                                        MEDIA_MIMETYPE_CONTAINER_MPEG4);
1179643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi    }
1180643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi
1181643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi    if (extractor == NULL) {
1182643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi        LOGV("PreviewPlayer::finishSetDataSource_l  extractor == NULL");
1183643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi        return setDataSource_l_jpg();
1184643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi    }
1185643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi
1186643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi    return setDataSource_l(extractor);
1187643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi}
1188643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi
1189643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi
1190643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi// static
1191643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargibool PreviewPlayer::ContinuePreparation(void *cookie) {
1192643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi    PreviewPlayer *me = static_cast<PreviewPlayer *>(cookie);
1193643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi
1194643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi    return (me->mFlags & PREPARE_CANCELLED) == 0;
1195643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi}
1196643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi
1197643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargivoid PreviewPlayer::onPrepareAsyncEvent() {
1198643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi    Mutex::Autolock autoLock(mLock);
1199643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi    LOGV("onPrepareAsyncEvent");
1200643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi
1201643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi    if (mFlags & PREPARE_CANCELLED) {
1202bfece17c8f63de4d4b686da50f8ecac2f6f8ec53Santosh Madhava        LOGV("LV PLAYER prepare was cancelled before doing anything");
1203643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi        abortPrepare(UNKNOWN_ERROR);
1204643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi        return;
1205643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi    }
1206643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi
1207643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi    if (mUri.size() > 0) {
1208643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi        status_t err = finishSetDataSource_l();
1209643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi
1210643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi        if (err != OK) {
1211643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi            abortPrepare(err);
1212643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi            return;
1213643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi        }
1214643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi    }
1215643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi
1216643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi    if (mVideoTrack != NULL && mVideoSource == NULL) {
1217643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi        status_t err = initVideoDecoder(OMXCodec::kHardwareCodecsOnly);
1218643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi
1219643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi        if (err != OK) {
1220643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi            abortPrepare(err);
1221643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi            return;
1222643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi        }
1223643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi    }
1224643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi
1225643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi    if (mAudioTrack != NULL && mAudioSource == NULL) {
1226643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi        status_t err = initAudioDecoder();
1227643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi
1228643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi        if (err != OK) {
1229643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi            abortPrepare(err);
1230643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi            return;
1231643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi        }
1232643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi    }
1233643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi    finishAsyncPrepare_l();
1234643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi
1235643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi}
1236643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi
1237643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargivoid PreviewPlayer::finishAsyncPrepare_l() {
1238643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi    if (mIsAsyncPrepare) {
1239643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi        if (mVideoSource == NULL) {
1240643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi            LOGV("finishAsyncPrepare_l: MEDIA_SET_VIDEO_SIZE 0 0 ");
1241643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi            notifyListener_l(MEDIA_SET_VIDEO_SIZE, 0, 0);
1242643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi        } else {
1243643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi            LOGV("finishAsyncPrepare_l: MEDIA_SET_VIDEO_SIZE");
1244643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi            notifyVideoSize_l();
1245643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi        }
1246643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi        LOGV("finishAsyncPrepare_l: MEDIA_PREPARED");
1247643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi        notifyListener_l(MEDIA_PREPARED);
1248643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi    }
1249643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi
1250643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi    mPrepareResult = OK;
1251643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi    mFlags &= ~(PREPARING|PREPARE_CANCELLED);
1252643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi    mFlags |= PREPARED;
1253643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi    mAsyncPrepareEvent = NULL;
1254643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi    mPreparedCondition.broadcast();
1255643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi}
1256643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi
1257fa31daff175709d2c58d61d1354daa9495696631Raghavender Pallavoid PreviewPlayer::acquireLock() {
1258fa31daff175709d2c58d61d1354daa9495696631Raghavender Palla    LOGV("acquireLock");
1259fa31daff175709d2c58d61d1354daa9495696631Raghavender Palla    mLockControl.lock();
1260fa31daff175709d2c58d61d1354daa9495696631Raghavender Palla}
1261fa31daff175709d2c58d61d1354daa9495696631Raghavender Palla
1262fa31daff175709d2c58d61d1354daa9495696631Raghavender Pallavoid PreviewPlayer::releaseLock() {
1263fa31daff175709d2c58d61d1354daa9495696631Raghavender Palla    LOGV("releaseLock");
1264fa31daff175709d2c58d61d1354daa9495696631Raghavender Palla    mLockControl.unlock();
1265fa31daff175709d2c58d61d1354daa9495696631Raghavender Palla}
1266fa31daff175709d2c58d61d1354daa9495696631Raghavender Palla
1267643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargistatus_t PreviewPlayer::loadEffectsSettings(
1268643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi                    M4VSS3GPP_EffectSettings* pEffectSettings, int nEffects) {
1269643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi    M4OSA_UInt32 i = 0, rgbSize = 0;
1270643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi    M4VIFI_UInt8 *tmp = M4OSA_NULL;
1271643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi
1272643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi    mNumberEffects = nEffects;
1273643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi    mEffectsSettings = pEffectSettings;
1274643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi    return OK;
1275643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi}
1276643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi
1277643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargistatus_t PreviewPlayer::loadAudioMixSettings(
1278643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi                    M4xVSS_AudioMixingSettings* pAudioMixSettings) {
1279643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi
1280643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi    LOGV("PreviewPlayer: loadAudioMixSettings: ");
1281643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi    mPreviewPlayerAudioMixSettings = pAudioMixSettings;
1282643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi    return OK;
1283643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi}
1284643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi
1285643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargistatus_t PreviewPlayer::setAudioMixPCMFileHandle(
1286643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi                    M4OSA_Context pAudioMixPCMFileHandle) {
1287643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi
1288643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi    LOGV("PreviewPlayer: setAudioMixPCMFileHandle: ");
1289643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi    mAudioMixPCMFileHandle = pAudioMixPCMFileHandle;
1290643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi    return OK;
1291643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi}
1292643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi
1293643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargistatus_t PreviewPlayer::setAudioMixStoryBoardParam(
1294643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi                    M4OSA_UInt32 audioMixStoryBoardTS,
1295643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi                    M4OSA_UInt32 currentMediaBeginCutTime,
1296643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi                    M4OSA_UInt32 primaryTrackVolValue ) {
1297643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi
1298643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi    mAudioMixStoryBoardTS = audioMixStoryBoardTS;
1299643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi    mCurrentMediaBeginCutTime = currentMediaBeginCutTime;
1300643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi    mCurrentMediaVolumeValue = primaryTrackVolValue;
1301643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi    return OK;
1302643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi}
1303643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi
1304643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargistatus_t PreviewPlayer::setPlaybackBeginTime(uint32_t msec) {
1305643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi
1306643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi    mPlayBeginTimeMsec = msec;
1307643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi    return OK;
1308643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi}
1309643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi
1310643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargistatus_t PreviewPlayer::setPlaybackEndTime(uint32_t msec) {
1311643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi
1312643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi    mPlayEndTimeMsec = msec;
1313643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi    return OK;
1314643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi}
1315643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi
1316643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargistatus_t PreviewPlayer::setStoryboardStartTime(uint32_t msec) {
1317643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi
1318643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi    mStoryboardStartTimeMsec = msec;
1319ebf40154a222c864a0aaf807702fc4eb6b9cf40fRaghavender Palla    mDecVideoTsStoryBoard = mStoryboardStartTimeMsec*1000LL;
1320643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi    return OK;
1321643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi}
1322643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi
1323643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargistatus_t PreviewPlayer::setProgressCallbackInterval(uint32_t cbInterval) {
1324643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi
1325643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi    mProgressCbInterval = cbInterval;
1326643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi    return OK;
1327643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi}
1328643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi
1329643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi
1330643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargistatus_t PreviewPlayer::setMediaRenderingMode(
1331643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi        M4xVSS_MediaRendering mode,
1332643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi        M4VIDEOEDITING_VideoFrameSize outputVideoSize) {
1333643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi
1334643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi    mRenderingMode = mode;
1335643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi
13368806b706693c0992724f6603353af18aeb4a0f80Hong Teng    status_t err = OK;
13378806b706693c0992724f6603353af18aeb4a0f80Hong Teng    /* get the video width and height by resolution */
13388806b706693c0992724f6603353af18aeb4a0f80Hong Teng    err = getVideoSizeByResolution(outputVideoSize,
13398806b706693c0992724f6603353af18aeb4a0f80Hong Teng              &mOutputVideoWidth, &mOutputVideoHeight);
1340643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi
13418806b706693c0992724f6603353af18aeb4a0f80Hong Teng    return err;
1342643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi}
1343643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi
1344643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargistatus_t PreviewPlayer::resetJniCallbackTimeStamp() {
1345643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi
1346ebf40154a222c864a0aaf807702fc4eb6b9cf40fRaghavender Palla    mDecVideoTsStoryBoard = mStoryboardStartTimeMsec*1000LL;
1347643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi    return OK;
1348643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi}
1349643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi
1350643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargivoid PreviewPlayer::postProgressCallbackEvent_l() {
1351643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi    if (mProgressCbEventPending) {
1352643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi        return;
1353643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi    }
1354643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi    mProgressCbEventPending = true;
1355643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi
1356643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi    mQueue.postEvent(mProgressCbEvent);
1357643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi}
1358643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi
1359e6c0750cd2927967f93a8811954f889d23fadb6eDharmaray Kundargi
1360643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargivoid PreviewPlayer::onProgressCbEvent() {
1361643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi    Mutex::Autolock autoLock(mLock);
1362643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi    if (!mProgressCbEventPending) {
1363643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi        return;
1364643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi    }
1365643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi    mProgressCbEventPending = false;
1366643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi    // If playback starts from previous I-frame,
1367643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi    // then send frame storyboard duration
1368643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi    if((mDecodedVideoTs/1000) < mPlayBeginTimeMsec) {
1369643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi        notifyListener_l(MEDIA_INFO, 0, mDecVideoTsStoryBoard/1000);
1370643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi    }
1371643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi    else {
1372643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi        notifyListener_l(MEDIA_INFO, 0,
1373643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi        (((mDecodedVideoTs+mDecVideoTsStoryBoard)/1000)-mPlayBeginTimeMsec));
1374643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi    }
1375643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi}
1376643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi
1377e6c0750cd2927967f93a8811954f889d23fadb6eDharmaray Kundargivoid PreviewPlayer::postOverlayUpdateEvent_l() {
1378e6c0750cd2927967f93a8811954f889d23fadb6eDharmaray Kundargi    if (mOverlayUpdateEventPending) {
1379e6c0750cd2927967f93a8811954f889d23fadb6eDharmaray Kundargi        return;
1380e6c0750cd2927967f93a8811954f889d23fadb6eDharmaray Kundargi    }
1381e6c0750cd2927967f93a8811954f889d23fadb6eDharmaray Kundargi    mOverlayUpdateEventPending = true;
1382e6c0750cd2927967f93a8811954f889d23fadb6eDharmaray Kundargi    mQueue.postEvent(mOverlayUpdateEvent);
1383e6c0750cd2927967f93a8811954f889d23fadb6eDharmaray Kundargi}
1384e6c0750cd2927967f93a8811954f889d23fadb6eDharmaray Kundargi
1385e6c0750cd2927967f93a8811954f889d23fadb6eDharmaray Kundargivoid PreviewPlayer::onUpdateOverlayEvent() {
1386e6c0750cd2927967f93a8811954f889d23fadb6eDharmaray Kundargi    Mutex::Autolock autoLock(mLock);
1387e6c0750cd2927967f93a8811954f889d23fadb6eDharmaray Kundargi
1388e6c0750cd2927967f93a8811954f889d23fadb6eDharmaray Kundargi    if (!mOverlayUpdateEventPending) {
1389e6c0750cd2927967f93a8811954f889d23fadb6eDharmaray Kundargi        return;
1390e6c0750cd2927967f93a8811954f889d23fadb6eDharmaray Kundargi    }
1391e6c0750cd2927967f93a8811954f889d23fadb6eDharmaray Kundargi    mOverlayUpdateEventPending = false;
1392e6c0750cd2927967f93a8811954f889d23fadb6eDharmaray Kundargi
1393e6c0750cd2927967f93a8811954f889d23fadb6eDharmaray Kundargi    int updateState;
1394e6c0750cd2927967f93a8811954f889d23fadb6eDharmaray Kundargi    if (mOverlayUpdateEventPosted) {
1395e6c0750cd2927967f93a8811954f889d23fadb6eDharmaray Kundargi        updateState = 1;
1396e6c0750cd2927967f93a8811954f889d23fadb6eDharmaray Kundargi    } else {
1397e6c0750cd2927967f93a8811954f889d23fadb6eDharmaray Kundargi        updateState = 0;
1398e6c0750cd2927967f93a8811954f889d23fadb6eDharmaray Kundargi    }
1399e6c0750cd2927967f93a8811954f889d23fadb6eDharmaray Kundargi    notifyListener_l(0xBBBBBBBB, updateState, mCurrFramingEffectIndex);
1400e6c0750cd2927967f93a8811954f889d23fadb6eDharmaray Kundargi}
1401e6c0750cd2927967f93a8811954f889d23fadb6eDharmaray Kundargi
1402e6c0750cd2927967f93a8811954f889d23fadb6eDharmaray Kundargi
1403643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargivoid PreviewPlayer::setVideoPostProcessingNode(
1404643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi                    M4VSS3GPP_VideoEffectType type, M4OSA_Bool enable) {
1405643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi
1406643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi    uint32_t effect = VIDEO_EFFECT_NONE;
1407643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi
1408643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi    //Map M4VSS3GPP_VideoEffectType to local enum
1409643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi    switch(type) {
1410643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi        case M4VSS3GPP_kVideoEffectType_FadeFromBlack:
1411643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi            effect = VIDEO_EFFECT_FADEFROMBLACK;
1412643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi            break;
1413643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi
1414643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi        case M4VSS3GPP_kVideoEffectType_FadeToBlack:
1415643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi            effect = VIDEO_EFFECT_FADETOBLACK;
1416643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi            break;
1417643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi
1418643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi        case M4xVSS_kVideoEffectType_BlackAndWhite:
1419643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi            effect = VIDEO_EFFECT_BLACKANDWHITE;
1420643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi            break;
1421643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi
1422643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi        case M4xVSS_kVideoEffectType_Pink:
1423643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi            effect = VIDEO_EFFECT_PINK;
1424643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi            break;
1425643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi
1426643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi        case M4xVSS_kVideoEffectType_Green:
1427643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi            effect = VIDEO_EFFECT_GREEN;
1428643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi            break;
1429643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi
1430643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi        case M4xVSS_kVideoEffectType_Sepia:
1431643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi            effect = VIDEO_EFFECT_SEPIA;
1432643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi            break;
1433643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi
1434643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi        case M4xVSS_kVideoEffectType_Negative:
1435643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi            effect = VIDEO_EFFECT_NEGATIVE;
1436643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi            break;
1437643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi
1438643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi        case M4xVSS_kVideoEffectType_Framing:
1439643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi            effect = VIDEO_EFFECT_FRAMING;
1440643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi            break;
1441643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi
1442643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi        case M4xVSS_kVideoEffectType_Fifties:
1443643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi            effect = VIDEO_EFFECT_FIFTIES;
1444643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi            break;
1445643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi
1446643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi        case M4xVSS_kVideoEffectType_ColorRGB16:
1447643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi            effect = VIDEO_EFFECT_COLOR_RGB16;
1448643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi            break;
1449643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi
1450643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi        case M4xVSS_kVideoEffectType_Gradient:
1451643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi            effect = VIDEO_EFFECT_GRADIENT;
1452643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi            break;
1453643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi
1454643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi        default:
1455643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi            effect = VIDEO_EFFECT_NONE;
1456643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi            break;
1457643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi    }
1458643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi
1459643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi    if(enable == M4OSA_TRUE) {
1460643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi        //If already set, then no need to set again
1461643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi        if(!(mCurrentVideoEffect & effect)) {
1462643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi            mCurrentVideoEffect |= effect;
1463643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi            if(effect == VIDEO_EFFECT_FIFTIES) {
1464643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi                mIsFiftiesEffectStarted = true;
1465643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi            }
1466643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi        }
1467643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi    }
1468643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi    else  {
1469643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi        //Reset only if already set
1470643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi        if(mCurrentVideoEffect & effect) {
1471643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi            mCurrentVideoEffect &= ~effect;
1472643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi        }
1473643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi    }
1474643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi}
1475643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi
1476643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargistatus_t PreviewPlayer::setImageClipProperties(uint32_t width,uint32_t height) {
1477643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi    mVideoWidth = width;
1478643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi    mVideoHeight = height;
1479643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi    return OK;
1480643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi}
1481643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi
1482643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargistatus_t PreviewPlayer::readFirstVideoFrame() {
1483643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi    LOGV("PreviewPlayer::readFirstVideoFrame");
1484643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi
1485643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi    if (!mVideoBuffer) {
1486643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi        MediaSource::ReadOptions options;
1487a5872f770c50da1db555d53e062a9896ea4321d5Andreas Huber        if (mSeeking != NO_SEEK) {
1488643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi            LOGV("LV PLAYER seeking to %lld us (%.2f secs)", mSeekTimeUs,
1489643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi                    mSeekTimeUs / 1E6);
1490643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi
1491643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi            options.setSeekTo(
1492643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi                    mSeekTimeUs, MediaSource::ReadOptions::SEEK_CLOSEST);
1493643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi        }
1494643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi        for (;;) {
149543fcc396614a587851e2b7c4cea2876ec58b8648Chih-Chung Chang            status_t err = mVideoSource->read(&mVideoBuffer, &options);
1496643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi            options.clearSeekTo();
1497643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi
1498643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi            if (err != OK) {
1499643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi                CHECK_EQ(mVideoBuffer, NULL);
1500643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi
1501643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi                if (err == INFO_FORMAT_CHANGED) {
1502643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi                    LOGV("LV PLAYER VideoSource signalled format change");
1503643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi                    notifyVideoSize_l();
1504643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi
1505643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi                    if (mVideoRenderer != NULL) {
1506643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi                        mVideoRendererIsPreview = false;
1507bfece17c8f63de4d4b686da50f8ecac2f6f8ec53Santosh Madhava                        err = initRenderer_l();
15084ca3e5df4b809210b240cd7d0489922017d87a6dSantosh Madhava                        if (err != OK) {
15094ca3e5df4b809210b240cd7d0489922017d87a6dSantosh Madhava                            postStreamDoneEvent_l(err);
15104ca3e5df4b809210b240cd7d0489922017d87a6dSantosh Madhava                        }
1511643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi                    }
151243fcc396614a587851e2b7c4cea2876ec58b8648Chih-Chung Chang
151343fcc396614a587851e2b7c4cea2876ec58b8648Chih-Chung Chang                    updateSizeToRender(mVideoSource->getFormat());
1514643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi                    continue;
1515643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi                }
1516643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi                LOGV("PreviewPlayer: onVideoEvent EOS reached.");
1517643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi                mFlags |= VIDEO_AT_EOS;
15181c97d9ab52a288d24ea54499de435277cc1a3d68Rajneesh Chowdury                mFlags |= AUDIO_AT_EOS;
1519643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi                postStreamDoneEvent_l(err);
1520643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi                return OK;
1521643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi            }
1522643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi
1523643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi            if (mVideoBuffer->range_length() == 0) {
1524643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi                // Some decoders, notably the PV AVC software decoder
1525643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi                // return spurious empty buffers that we just want to ignore.
1526643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi
1527643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi                mVideoBuffer->release();
1528643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi                mVideoBuffer = NULL;
1529643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi                continue;
1530643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi            }
1531643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi
1532643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi            int64_t videoTimeUs;
1533643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi            CHECK(mVideoBuffer->meta_data()->findInt64(kKeyTime, &videoTimeUs));
1534a5872f770c50da1db555d53e062a9896ea4321d5Andreas Huber            if (mSeeking != NO_SEEK) {
1535b2d6e0f74a12e5cce5b429e646172c63346346c3Santosh Madhava                if (videoTimeUs < mSeekTimeUs) {
1536b2d6e0f74a12e5cce5b429e646172c63346346c3Santosh Madhava                    // buffers are before seek time
1537b2d6e0f74a12e5cce5b429e646172c63346346c3Santosh Madhava                    // ignore them
1538b2d6e0f74a12e5cce5b429e646172c63346346c3Santosh Madhava                    mVideoBuffer->release();
1539b2d6e0f74a12e5cce5b429e646172c63346346c3Santosh Madhava                    mVideoBuffer = NULL;
1540b2d6e0f74a12e5cce5b429e646172c63346346c3Santosh Madhava                    continue;
1541b2d6e0f74a12e5cce5b429e646172c63346346c3Santosh Madhava                }
1542b2d6e0f74a12e5cce5b429e646172c63346346c3Santosh Madhava            } else {
1543b2d6e0f74a12e5cce5b429e646172c63346346c3Santosh Madhava                if((videoTimeUs/1000) < mPlayBeginTimeMsec) {
1544b2d6e0f74a12e5cce5b429e646172c63346346c3Santosh Madhava                    // buffers are before begin cut time
1545b2d6e0f74a12e5cce5b429e646172c63346346c3Santosh Madhava                    // ignore them
1546b2d6e0f74a12e5cce5b429e646172c63346346c3Santosh Madhava                    mVideoBuffer->release();
1547b2d6e0f74a12e5cce5b429e646172c63346346c3Santosh Madhava                    mVideoBuffer = NULL;
1548b2d6e0f74a12e5cce5b429e646172c63346346c3Santosh Madhava                    continue;
1549b2d6e0f74a12e5cce5b429e646172c63346346c3Santosh Madhava                }
1550643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi            }
1551643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi            break;
1552643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi        }
1553643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi    }
1554643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi
1555643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi    int64_t timeUs;
1556643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi    CHECK(mVideoBuffer->meta_data()->findInt64(kKeyTime, &timeUs));
1557643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi
1558643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi    {
1559643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi        Mutex::Autolock autoLock(mMiscStateLock);
1560643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi        mVideoTimeUs = timeUs;
1561643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi    }
1562643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi
1563643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi    mDecodedVideoTs = timeUs;
1564643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi
1565643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi    return OK;
1566643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi
1567643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi}
1568643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi
1569b2d6e0f74a12e5cce5b429e646172c63346346c3Santosh Madhavastatus_t PreviewPlayer::getLastRenderedTimeMs(uint32_t *lastRenderedTimeMs) {
1570b2d6e0f74a12e5cce5b429e646172c63346346c3Santosh Madhava    *lastRenderedTimeMs = (((mDecodedVideoTs+mDecVideoTsStoryBoard)/1000)-mPlayBeginTimeMsec);
1571b2d6e0f74a12e5cce5b429e646172c63346346c3Santosh Madhava    return OK;
1572b2d6e0f74a12e5cce5b429e646172c63346346c3Santosh Madhava}
1573b2d6e0f74a12e5cce5b429e646172c63346346c3Santosh Madhava
157443fcc396614a587851e2b7c4cea2876ec58b8648Chih-Chung Changvoid PreviewPlayer::updateSizeToRender(sp<MetaData> meta) {
157543fcc396614a587851e2b7c4cea2876ec58b8648Chih-Chung Chang    if (mVideoRenderer) {
157643fcc396614a587851e2b7c4cea2876ec58b8648Chih-Chung Chang        mVideoRenderer->updateVideoSize(meta);
157743fcc396614a587851e2b7c4cea2876ec58b8648Chih-Chung Chang    }
157843fcc396614a587851e2b7c4cea2876ec58b8648Chih-Chung Chang}
157943fcc396614a587851e2b7c4cea2876ec58b8648Chih-Chung Chang
1580643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi}  // namespace android
1581