1be47966ced9cfbbd522f2d12dfca2dffd44394a9Dharmaray Kundargi/*
2be47966ced9cfbbd522f2d12dfca2dffd44394a9Dharmaray Kundargi * Copyright (C) 2011 The Android Open Source Project
3be47966ced9cfbbd522f2d12dfca2dffd44394a9Dharmaray Kundargi *
4be47966ced9cfbbd522f2d12dfca2dffd44394a9Dharmaray Kundargi * Licensed under the Apache License, Version 2.0 (the "License");
5be47966ced9cfbbd522f2d12dfca2dffd44394a9Dharmaray Kundargi * you may not use this file except in compliance with the License.
6be47966ced9cfbbd522f2d12dfca2dffd44394a9Dharmaray Kundargi * You may obtain a copy of the License at
7be47966ced9cfbbd522f2d12dfca2dffd44394a9Dharmaray Kundargi *
8be47966ced9cfbbd522f2d12dfca2dffd44394a9Dharmaray Kundargi *      http://www.apache.org/licenses/LICENSE-2.0
9be47966ced9cfbbd522f2d12dfca2dffd44394a9Dharmaray Kundargi *
10be47966ced9cfbbd522f2d12dfca2dffd44394a9Dharmaray Kundargi * Unless required by applicable law or agreed to in writing, software
11be47966ced9cfbbd522f2d12dfca2dffd44394a9Dharmaray Kundargi * distributed under the License is distributed on an "AS IS" BASIS,
12be47966ced9cfbbd522f2d12dfca2dffd44394a9Dharmaray Kundargi * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13be47966ced9cfbbd522f2d12dfca2dffd44394a9Dharmaray Kundargi * See the License for the specific language governing permissions and
14be47966ced9cfbbd522f2d12dfca2dffd44394a9Dharmaray Kundargi * limitations under the License.
15be47966ced9cfbbd522f2d12dfca2dffd44394a9Dharmaray Kundargi */
16be47966ced9cfbbd522f2d12dfca2dffd44394a9Dharmaray Kundargi
17be47966ced9cfbbd522f2d12dfca2dffd44394a9Dharmaray Kundargi#ifndef PREVIEW_PLAYER_H_
18be47966ced9cfbbd522f2d12dfca2dffd44394a9Dharmaray Kundargi
19be47966ced9cfbbd522f2d12dfca2dffd44394a9Dharmaray Kundargi#define PREVIEW_PLAYER_H_
20be47966ced9cfbbd522f2d12dfca2dffd44394a9Dharmaray Kundargi
21be47966ced9cfbbd522f2d12dfca2dffd44394a9Dharmaray Kundargi#include "TimedEventQueue.h"
22be47966ced9cfbbd522f2d12dfca2dffd44394a9Dharmaray Kundargi#include "VideoEditorAudioPlayer.h"
23be47966ced9cfbbd522f2d12dfca2dffd44394a9Dharmaray Kundargi
24be47966ced9cfbbd522f2d12dfca2dffd44394a9Dharmaray Kundargi#include <media/MediaPlayerInterface.h>
25be47966ced9cfbbd522f2d12dfca2dffd44394a9Dharmaray Kundargi#include <media/stagefright/DataSource.h>
26be47966ced9cfbbd522f2d12dfca2dffd44394a9Dharmaray Kundargi#include <media/stagefright/OMXClient.h>
27be47966ced9cfbbd522f2d12dfca2dffd44394a9Dharmaray Kundargi#include <media/stagefright/TimeSource.h>
28be47966ced9cfbbd522f2d12dfca2dffd44394a9Dharmaray Kundargi#include <utils/threads.h>
29d30f1bcd661eb469c92ceddaea15ae6fb07e7a92James Dong#include "PreviewPlayerBase.h"
30be47966ced9cfbbd522f2d12dfca2dffd44394a9Dharmaray Kundargi#include "VideoEditorPreviewController.h"
319133a10ed22acc8b2154ab187f301945bf51a1f9Chih-Chung Chang#include "NativeWindowRenderer.h"
32be47966ced9cfbbd522f2d12dfca2dffd44394a9Dharmaray Kundargi
33be47966ced9cfbbd522f2d12dfca2dffd44394a9Dharmaray Kundarginamespace android {
34be47966ced9cfbbd522f2d12dfca2dffd44394a9Dharmaray Kundargi
35d30f1bcd661eb469c92ceddaea15ae6fb07e7a92James Dongstruct AudioPlayerBase;
36be47966ced9cfbbd522f2d12dfca2dffd44394a9Dharmaray Kundargistruct DataSource;
37be47966ced9cfbbd522f2d12dfca2dffd44394a9Dharmaray Kundargistruct MediaBuffer;
38be47966ced9cfbbd522f2d12dfca2dffd44394a9Dharmaray Kundargistruct MediaExtractor;
39be47966ced9cfbbd522f2d12dfca2dffd44394a9Dharmaray Kundargistruct MediaSource;
40be47966ced9cfbbd522f2d12dfca2dffd44394a9Dharmaray Kundargi
41d30f1bcd661eb469c92ceddaea15ae6fb07e7a92James Dongstruct PreviewPlayer : public PreviewPlayerBase {
429133a10ed22acc8b2154ab187f301945bf51a1f9Chih-Chung Chang    PreviewPlayer(NativeWindowRenderer* renderer);
43be47966ced9cfbbd522f2d12dfca2dffd44394a9Dharmaray Kundargi    ~PreviewPlayer();
44be47966ced9cfbbd522f2d12dfca2dffd44394a9Dharmaray Kundargi
45be47966ced9cfbbd522f2d12dfca2dffd44394a9Dharmaray Kundargi    //Override baseclass methods
46be47966ced9cfbbd522f2d12dfca2dffd44394a9Dharmaray Kundargi    void reset();
47be47966ced9cfbbd522f2d12dfca2dffd44394a9Dharmaray Kundargi
48be47966ced9cfbbd522f2d12dfca2dffd44394a9Dharmaray Kundargi    status_t play();
49be47966ced9cfbbd522f2d12dfca2dffd44394a9Dharmaray Kundargi
50be47966ced9cfbbd522f2d12dfca2dffd44394a9Dharmaray Kundargi    status_t seekTo(int64_t timeUs);
51be47966ced9cfbbd522f2d12dfca2dffd44394a9Dharmaray Kundargi
52be47966ced9cfbbd522f2d12dfca2dffd44394a9Dharmaray Kundargi    status_t getVideoDimensions(int32_t *width, int32_t *height) const;
53be47966ced9cfbbd522f2d12dfca2dffd44394a9Dharmaray Kundargi
542d44979102ca85d5c4ee68d0388ee2fe37c4ec1aRaghavender Palla    void acquireLock();
552d44979102ca85d5c4ee68d0388ee2fe37c4ec1aRaghavender Palla    void releaseLock();
56be47966ced9cfbbd522f2d12dfca2dffd44394a9Dharmaray Kundargi
57be47966ced9cfbbd522f2d12dfca2dffd44394a9Dharmaray Kundargi    status_t prepare();
58be47966ced9cfbbd522f2d12dfca2dffd44394a9Dharmaray Kundargi    status_t setDataSource(
59be47966ced9cfbbd522f2d12dfca2dffd44394a9Dharmaray Kundargi        const char *uri, const KeyedVector<String8, String8> *headers);
60be47966ced9cfbbd522f2d12dfca2dffd44394a9Dharmaray Kundargi
61be47966ced9cfbbd522f2d12dfca2dffd44394a9Dharmaray Kundargi    //Added methods
62eb69601111ca9b14e58c4d1f6738bfde2db422afDharmaray Kundargi    status_t loadEffectsSettings(M4VSS3GPP_EffectSettings* pEffectSettings,
63be47966ced9cfbbd522f2d12dfca2dffd44394a9Dharmaray Kundargi                                 int nEffects);
64be47966ced9cfbbd522f2d12dfca2dffd44394a9Dharmaray Kundargi    status_t loadAudioMixSettings(M4xVSS_AudioMixingSettings* pAudioMixSettings);
65be47966ced9cfbbd522f2d12dfca2dffd44394a9Dharmaray Kundargi    status_t setAudioMixPCMFileHandle(M4OSA_Context pAudioMixPCMFileHandle);
66be47966ced9cfbbd522f2d12dfca2dffd44394a9Dharmaray Kundargi    status_t setAudioMixStoryBoardParam(M4OSA_UInt32 audioMixStoryBoardTS,
67be47966ced9cfbbd522f2d12dfca2dffd44394a9Dharmaray Kundargi                            M4OSA_UInt32 currentMediaBeginCutTime,
68be47966ced9cfbbd522f2d12dfca2dffd44394a9Dharmaray Kundargi                            M4OSA_UInt32 currentMediaVolumeVol);
69be47966ced9cfbbd522f2d12dfca2dffd44394a9Dharmaray Kundargi
70be47966ced9cfbbd522f2d12dfca2dffd44394a9Dharmaray Kundargi    status_t setPlaybackBeginTime(uint32_t msec);
71be47966ced9cfbbd522f2d12dfca2dffd44394a9Dharmaray Kundargi    status_t setPlaybackEndTime(uint32_t msec);
72be47966ced9cfbbd522f2d12dfca2dffd44394a9Dharmaray Kundargi    status_t setStoryboardStartTime(uint32_t msec);
73be47966ced9cfbbd522f2d12dfca2dffd44394a9Dharmaray Kundargi    status_t setProgressCallbackInterval(uint32_t cbInterval);
74be47966ced9cfbbd522f2d12dfca2dffd44394a9Dharmaray Kundargi    status_t setMediaRenderingMode(M4xVSS_MediaRendering mode,
75be47966ced9cfbbd522f2d12dfca2dffd44394a9Dharmaray Kundargi                            M4VIDEOEDITING_VideoFrameSize outputVideoSize);
76be47966ced9cfbbd522f2d12dfca2dffd44394a9Dharmaray Kundargi
77be47966ced9cfbbd522f2d12dfca2dffd44394a9Dharmaray Kundargi    status_t resetJniCallbackTimeStamp();
78be47966ced9cfbbd522f2d12dfca2dffd44394a9Dharmaray Kundargi    status_t setImageClipProperties(uint32_t width, uint32_t height);
79be47966ced9cfbbd522f2d12dfca2dffd44394a9Dharmaray Kundargi    status_t readFirstVideoFrame();
8074c3e29b43e088a08e12ddc9783c268af7c465b0Santosh Madhava    status_t getLastRenderedTimeMs(uint32_t *lastRenderedTimeMs);
81d30f1bcd661eb469c92ceddaea15ae6fb07e7a92James Dong    status_t setAudioPlayer(AudioPlayerBase *audioPlayer);
82be47966ced9cfbbd522f2d12dfca2dffd44394a9Dharmaray Kundargi
83be47966ced9cfbbd522f2d12dfca2dffd44394a9Dharmaray Kundargiprivate:
84be47966ced9cfbbd522f2d12dfca2dffd44394a9Dharmaray Kundargi    friend struct PreviewPlayerEvent;
85be47966ced9cfbbd522f2d12dfca2dffd44394a9Dharmaray Kundargi
86be47966ced9cfbbd522f2d12dfca2dffd44394a9Dharmaray Kundargi    enum {
87be47966ced9cfbbd522f2d12dfca2dffd44394a9Dharmaray Kundargi        PLAYING             = 1,
88be47966ced9cfbbd522f2d12dfca2dffd44394a9Dharmaray Kundargi        LOOPING             = 2,
89be47966ced9cfbbd522f2d12dfca2dffd44394a9Dharmaray Kundargi        FIRST_FRAME         = 4,
90be47966ced9cfbbd522f2d12dfca2dffd44394a9Dharmaray Kundargi        PREPARING           = 8,
91be47966ced9cfbbd522f2d12dfca2dffd44394a9Dharmaray Kundargi        PREPARED            = 16,
92be47966ced9cfbbd522f2d12dfca2dffd44394a9Dharmaray Kundargi        AT_EOS              = 32,
93be47966ced9cfbbd522f2d12dfca2dffd44394a9Dharmaray Kundargi        PREPARE_CANCELLED   = 64,
94be47966ced9cfbbd522f2d12dfca2dffd44394a9Dharmaray Kundargi        CACHE_UNDERRUN      = 128,
95be47966ced9cfbbd522f2d12dfca2dffd44394a9Dharmaray Kundargi        AUDIO_AT_EOS        = 256,
96be47966ced9cfbbd522f2d12dfca2dffd44394a9Dharmaray Kundargi        VIDEO_AT_EOS        = 512,
97be47966ced9cfbbd522f2d12dfca2dffd44394a9Dharmaray Kundargi        AUTO_LOOPING        = 1024,
9831195c759708e7e4889424bfe9bfd063f8a155d9Hong Teng        INFORMED_AV_EOS     = 2048,
99be47966ced9cfbbd522f2d12dfca2dffd44394a9Dharmaray Kundargi    };
100be47966ced9cfbbd522f2d12dfca2dffd44394a9Dharmaray Kundargi
101be47966ced9cfbbd522f2d12dfca2dffd44394a9Dharmaray Kundargi    void cancelPlayerEvents(bool keepBufferingGoing = false);
102be47966ced9cfbbd522f2d12dfca2dffd44394a9Dharmaray Kundargi    status_t setDataSource_l(const sp<MediaExtractor> &extractor);
103be47966ced9cfbbd522f2d12dfca2dffd44394a9Dharmaray Kundargi    status_t setDataSource_l(
104be47966ced9cfbbd522f2d12dfca2dffd44394a9Dharmaray Kundargi        const char *uri, const KeyedVector<String8, String8> *headers);
105be47966ced9cfbbd522f2d12dfca2dffd44394a9Dharmaray Kundargi    void reset_l();
106be47966ced9cfbbd522f2d12dfca2dffd44394a9Dharmaray Kundargi    status_t play_l();
107b70708552e0d20b007b815c60968e6e2f5d21ce5Santosh Madhava    status_t initRenderer_l();
108be47966ced9cfbbd522f2d12dfca2dffd44394a9Dharmaray Kundargi    status_t initAudioDecoder();
109be47966ced9cfbbd522f2d12dfca2dffd44394a9Dharmaray Kundargi    status_t initVideoDecoder(uint32_t flags = 0);
110be47966ced9cfbbd522f2d12dfca2dffd44394a9Dharmaray Kundargi    void onVideoEvent();
11176719ec141dfe877351b123fd7886971625d4ddcRajneesh Chowdury    void onStreamDone();
112be47966ced9cfbbd522f2d12dfca2dffd44394a9Dharmaray Kundargi    status_t finishSetDataSource_l();
113be47966ced9cfbbd522f2d12dfca2dffd44394a9Dharmaray Kundargi    static bool ContinuePreparation(void *cookie);
114be47966ced9cfbbd522f2d12dfca2dffd44394a9Dharmaray Kundargi    void onPrepareAsyncEvent();
115be47966ced9cfbbd522f2d12dfca2dffd44394a9Dharmaray Kundargi    void finishAsyncPrepare_l();
116799c0dd8e9f9a67de62345bced92f9f3681324ecDheeraj Sharma    status_t startAudioPlayer_l();
11776719ec141dfe877351b123fd7886971625d4ddcRajneesh Chowdury    bool mIsChangeSourceRequired;
118be47966ced9cfbbd522f2d12dfca2dffd44394a9Dharmaray Kundargi
1199133a10ed22acc8b2154ab187f301945bf51a1f9Chih-Chung Chang    NativeWindowRenderer *mNativeWindowRenderer;
1209133a10ed22acc8b2154ab187f301945bf51a1f9Chih-Chung Chang    RenderInput *mVideoRenderer;
121be47966ced9cfbbd522f2d12dfca2dffd44394a9Dharmaray Kundargi
122be47966ced9cfbbd522f2d12dfca2dffd44394a9Dharmaray Kundargi    int32_t mVideoWidth, mVideoHeight;
123be47966ced9cfbbd522f2d12dfca2dffd44394a9Dharmaray Kundargi
124be47966ced9cfbbd522f2d12dfca2dffd44394a9Dharmaray Kundargi    //Data structures used for audio and video effects
125be47966ced9cfbbd522f2d12dfca2dffd44394a9Dharmaray Kundargi    M4VSS3GPP_EffectSettings* mEffectsSettings;
126be47966ced9cfbbd522f2d12dfca2dffd44394a9Dharmaray Kundargi    M4xVSS_AudioMixingSettings* mPreviewPlayerAudioMixSettings;
127be47966ced9cfbbd522f2d12dfca2dffd44394a9Dharmaray Kundargi    M4OSA_Context mAudioMixPCMFileHandle;
128be47966ced9cfbbd522f2d12dfca2dffd44394a9Dharmaray Kundargi    M4OSA_UInt32 mAudioMixStoryBoardTS;
129be47966ced9cfbbd522f2d12dfca2dffd44394a9Dharmaray Kundargi    M4OSA_UInt32 mCurrentMediaBeginCutTime;
130be47966ced9cfbbd522f2d12dfca2dffd44394a9Dharmaray Kundargi    M4OSA_UInt32 mCurrentMediaVolumeValue;
131246108db97a5ebfbc7e555fc5c81f10476cd9fbbDharmaray Kundargi    M4OSA_UInt32 mCurrFramingEffectIndex;
132be47966ced9cfbbd522f2d12dfca2dffd44394a9Dharmaray Kundargi
133be47966ced9cfbbd522f2d12dfca2dffd44394a9Dharmaray Kundargi    uint32_t mNumberEffects;
134be47966ced9cfbbd522f2d12dfca2dffd44394a9Dharmaray Kundargi    uint32_t mPlayBeginTimeMsec;
135be47966ced9cfbbd522f2d12dfca2dffd44394a9Dharmaray Kundargi    uint32_t mPlayEndTimeMsec;
136be47966ced9cfbbd522f2d12dfca2dffd44394a9Dharmaray Kundargi    uint64_t mDecodedVideoTs; // timestamp of current decoded video frame buffer
137be47966ced9cfbbd522f2d12dfca2dffd44394a9Dharmaray Kundargi    uint64_t mDecVideoTsStoryBoard; // timestamp of frame relative to storyboard
138be47966ced9cfbbd522f2d12dfca2dffd44394a9Dharmaray Kundargi    uint32_t mCurrentVideoEffect;
139be47966ced9cfbbd522f2d12dfca2dffd44394a9Dharmaray Kundargi    uint32_t mProgressCbInterval;
140be47966ced9cfbbd522f2d12dfca2dffd44394a9Dharmaray Kundargi    uint32_t mNumberDecVideoFrames; // Counter of number of video frames decoded
141be47966ced9cfbbd522f2d12dfca2dffd44394a9Dharmaray Kundargi    sp<TimedEventQueue::Event> mProgressCbEvent;
142be47966ced9cfbbd522f2d12dfca2dffd44394a9Dharmaray Kundargi    bool mProgressCbEventPending;
143246108db97a5ebfbc7e555fc5c81f10476cd9fbbDharmaray Kundargi    sp<TimedEventQueue::Event> mOverlayUpdateEvent;
144246108db97a5ebfbc7e555fc5c81f10476cd9fbbDharmaray Kundargi    bool mOverlayUpdateEventPending;
145246108db97a5ebfbc7e555fc5c81f10476cd9fbbDharmaray Kundargi    bool mOverlayUpdateEventPosted;
146246108db97a5ebfbc7e555fc5c81f10476cd9fbbDharmaray Kundargi
147be47966ced9cfbbd522f2d12dfca2dffd44394a9Dharmaray Kundargi    M4xVSS_MediaRendering mRenderingMode;
148be47966ced9cfbbd522f2d12dfca2dffd44394a9Dharmaray Kundargi    uint32_t mOutputVideoWidth;
149be47966ced9cfbbd522f2d12dfca2dffd44394a9Dharmaray Kundargi    uint32_t mOutputVideoHeight;
150be47966ced9cfbbd522f2d12dfca2dffd44394a9Dharmaray Kundargi
151be47966ced9cfbbd522f2d12dfca2dffd44394a9Dharmaray Kundargi    uint32_t mStoryboardStartTimeMsec;
152be47966ced9cfbbd522f2d12dfca2dffd44394a9Dharmaray Kundargi
153be47966ced9cfbbd522f2d12dfca2dffd44394a9Dharmaray Kundargi    bool mIsVideoSourceJpg;
154be47966ced9cfbbd522f2d12dfca2dffd44394a9Dharmaray Kundargi    bool mIsFiftiesEffectStarted;
155be47966ced9cfbbd522f2d12dfca2dffd44394a9Dharmaray Kundargi    int64_t mImageFrameTimeUs;
156be47966ced9cfbbd522f2d12dfca2dffd44394a9Dharmaray Kundargi    bool mStartNextPlayer;
1572d44979102ca85d5c4ee68d0388ee2fe37c4ec1aRaghavender Palla    mutable Mutex mLockControl;
158be47966ced9cfbbd522f2d12dfca2dffd44394a9Dharmaray Kundargi
159be47966ced9cfbbd522f2d12dfca2dffd44394a9Dharmaray Kundargi    M4VIFI_UInt8*  mFrameRGBBuffer;
160be47966ced9cfbbd522f2d12dfca2dffd44394a9Dharmaray Kundargi    M4VIFI_UInt8*  mFrameYUVBuffer;
161be47966ced9cfbbd522f2d12dfca2dffd44394a9Dharmaray Kundargi
162be47966ced9cfbbd522f2d12dfca2dffd44394a9Dharmaray Kundargi    void setVideoPostProcessingNode(
163be47966ced9cfbbd522f2d12dfca2dffd44394a9Dharmaray Kundargi                    M4VSS3GPP_VideoEffectType type, M4OSA_Bool enable);
164be47966ced9cfbbd522f2d12dfca2dffd44394a9Dharmaray Kundargi    void postProgressCallbackEvent_l();
165be47966ced9cfbbd522f2d12dfca2dffd44394a9Dharmaray Kundargi    void onProgressCbEvent();
166be47966ced9cfbbd522f2d12dfca2dffd44394a9Dharmaray Kundargi
167246108db97a5ebfbc7e555fc5c81f10476cd9fbbDharmaray Kundargi    void postOverlayUpdateEvent_l();
168246108db97a5ebfbc7e555fc5c81f10476cd9fbbDharmaray Kundargi    void onUpdateOverlayEvent();
169246108db97a5ebfbc7e555fc5c81f10476cd9fbbDharmaray Kundargi
170be47966ced9cfbbd522f2d12dfca2dffd44394a9Dharmaray Kundargi    status_t setDataSource_l_jpg();
171be47966ced9cfbbd522f2d12dfca2dffd44394a9Dharmaray Kundargi
172be47966ced9cfbbd522f2d12dfca2dffd44394a9Dharmaray Kundargi    status_t prepare_l();
173be47966ced9cfbbd522f2d12dfca2dffd44394a9Dharmaray Kundargi    status_t prepareAsync_l();
174be47966ced9cfbbd522f2d12dfca2dffd44394a9Dharmaray Kundargi
1759133a10ed22acc8b2154ab187f301945bf51a1f9Chih-Chung Chang    void updateSizeToRender(sp<MetaData> meta);
1769133a10ed22acc8b2154ab187f301945bf51a1f9Chih-Chung Chang
177799c0dd8e9f9a67de62345bced92f9f3681324ecDheeraj Sharma    VideoEditorAudioPlayer  *mVeAudioPlayer;
178799c0dd8e9f9a67de62345bced92f9f3681324ecDheeraj Sharma
179be47966ced9cfbbd522f2d12dfca2dffd44394a9Dharmaray Kundargi    PreviewPlayer(const PreviewPlayer &);
180be47966ced9cfbbd522f2d12dfca2dffd44394a9Dharmaray Kundargi    PreviewPlayer &operator=(const PreviewPlayer &);
181be47966ced9cfbbd522f2d12dfca2dffd44394a9Dharmaray Kundargi};
182be47966ced9cfbbd522f2d12dfca2dffd44394a9Dharmaray Kundargi
183be47966ced9cfbbd522f2d12dfca2dffd44394a9Dharmaray Kundargi}  // namespace android
184be47966ced9cfbbd522f2d12dfca2dffd44394a9Dharmaray Kundargi
185be47966ced9cfbbd522f2d12dfca2dffd44394a9Dharmaray Kundargi#endif  // PREVIEW_PLAYER_H_
186be47966ced9cfbbd522f2d12dfca2dffd44394a9Dharmaray Kundargi
187