PreviewPlayer.h revision 43fcc396614a587851e2b7c4cea2876ec58b8648
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
17643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi#ifndef PREVIEW_PLAYER_H_
18643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi
19643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi#define PREVIEW_PLAYER_H_
20643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi
21643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi#include "TimedEventQueue.h"
22643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi#include "VideoEditorAudioPlayer.h"
23643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi
24643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi#include <media/MediaPlayerInterface.h>
25643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi#include <media/stagefright/DataSource.h>
26643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi#include <media/stagefright/OMXClient.h>
27643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi#include <media/stagefright/TimeSource.h>
28643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi#include <utils/threads.h>
29c9dedc4e1d0c8343ab1029cb601253826cd67c81James Dong#include "PreviewPlayerBase.h"
30643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi#include "VideoEditorPreviewController.h"
3143fcc396614a587851e2b7c4cea2876ec58b8648Chih-Chung Chang#include "NativeWindowRenderer.h"
32643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi
33643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundarginamespace android {
34643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi
35c9dedc4e1d0c8343ab1029cb601253826cd67c81James Dongstruct AudioPlayerBase;
36643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargistruct DataSource;
37643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargistruct MediaBuffer;
38643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargistruct MediaExtractor;
39643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargistruct MediaSource;
40643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi
41c9dedc4e1d0c8343ab1029cb601253826cd67c81James Dongstruct PreviewPlayer : public PreviewPlayerBase {
4243fcc396614a587851e2b7c4cea2876ec58b8648Chih-Chung Chang    PreviewPlayer(NativeWindowRenderer* renderer);
43643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi    ~PreviewPlayer();
44643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi
45643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi    //Override baseclass methods
46643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi    void reset();
47643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi
48643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi    status_t play();
49643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi
50643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi    status_t seekTo(int64_t timeUs);
51643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi
52643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi    status_t getVideoDimensions(int32_t *width, int32_t *height) const;
53643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi
54fa31daff175709d2c58d61d1354daa9495696631Raghavender Palla    void acquireLock();
55fa31daff175709d2c58d61d1354daa9495696631Raghavender Palla    void releaseLock();
56643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi
57643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi    status_t prepare();
58643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi    status_t setDataSource(
59643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi        const char *uri, const KeyedVector<String8, String8> *headers);
60643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi
61643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi    //Added methods
6235cb2de64cb6482a08f446e80733e7d344a0dcacDharmaray Kundargi    status_t loadEffectsSettings(M4VSS3GPP_EffectSettings* pEffectSettings,
63643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi                                 int nEffects);
64643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi    status_t loadAudioMixSettings(M4xVSS_AudioMixingSettings* pAudioMixSettings);
65643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi    status_t setAudioMixPCMFileHandle(M4OSA_Context pAudioMixPCMFileHandle);
66643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi    status_t setAudioMixStoryBoardParam(M4OSA_UInt32 audioMixStoryBoardTS,
67643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi                            M4OSA_UInt32 currentMediaBeginCutTime,
68643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi                            M4OSA_UInt32 currentMediaVolumeVol);
69643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi
70643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi    status_t setPlaybackBeginTime(uint32_t msec);
71643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi    status_t setPlaybackEndTime(uint32_t msec);
72643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi    status_t setStoryboardStartTime(uint32_t msec);
73643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi    status_t setProgressCallbackInterval(uint32_t cbInterval);
74643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi    status_t setMediaRenderingMode(M4xVSS_MediaRendering mode,
75643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi                            M4VIDEOEDITING_VideoFrameSize outputVideoSize);
76643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi
77643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi    status_t resetJniCallbackTimeStamp();
78643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi    status_t setImageClipProperties(uint32_t width, uint32_t height);
79643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi    status_t readFirstVideoFrame();
80b2d6e0f74a12e5cce5b429e646172c63346346c3Santosh Madhava    status_t getLastRenderedTimeMs(uint32_t *lastRenderedTimeMs);
81c9dedc4e1d0c8343ab1029cb601253826cd67c81James Dong    status_t setAudioPlayer(AudioPlayerBase *audioPlayer);
82643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi
83643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargiprivate:
84643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi    friend struct PreviewPlayerEvent;
85643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi
86643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi    enum {
87643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi        PLAYING             = 1,
88643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi        LOOPING             = 2,
89643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi        FIRST_FRAME         = 4,
90643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi        PREPARING           = 8,
91643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi        PREPARED            = 16,
92643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi        AT_EOS              = 32,
93643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi        PREPARE_CANCELLED   = 64,
94643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi        CACHE_UNDERRUN      = 128,
95643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi        AUDIO_AT_EOS        = 256,
96643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi        VIDEO_AT_EOS        = 512,
97643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi        AUTO_LOOPING        = 1024,
98643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi    };
99643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi
100643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi    void cancelPlayerEvents(bool keepBufferingGoing = false);
101643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi    status_t setDataSource_l(const sp<MediaExtractor> &extractor);
102643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi    status_t setDataSource_l(
103643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi        const char *uri, const KeyedVector<String8, String8> *headers);
104643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi    void reset_l();
105643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi    status_t play_l();
106bfece17c8f63de4d4b686da50f8ecac2f6f8ec53Santosh Madhava    status_t initRenderer_l();
107643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi    status_t initAudioDecoder();
108643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi    status_t initVideoDecoder(uint32_t flags = 0);
109643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi    void onVideoEvent();
1101c97d9ab52a288d24ea54499de435277cc1a3d68Rajneesh Chowdury    void onStreamDone();
111643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi    status_t finishSetDataSource_l();
112643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi    static bool ContinuePreparation(void *cookie);
113643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi    void onPrepareAsyncEvent();
114643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi    void finishAsyncPrepare_l();
1155bc7fb407ce1bab13d4a4a67d34a1a3192ee3186Dheeraj Sharma    status_t startAudioPlayer_l();
1161c97d9ab52a288d24ea54499de435277cc1a3d68Rajneesh Chowdury    bool mIsChangeSourceRequired;
117643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi
11843fcc396614a587851e2b7c4cea2876ec58b8648Chih-Chung Chang    NativeWindowRenderer *mNativeWindowRenderer;
11943fcc396614a587851e2b7c4cea2876ec58b8648Chih-Chung Chang    RenderInput *mVideoRenderer;
120643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi
121643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi    int32_t mVideoWidth, mVideoHeight;
122643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi
123643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi    //Data structures used for audio and video effects
124643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi    M4VSS3GPP_EffectSettings* mEffectsSettings;
125643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi    M4xVSS_AudioMixingSettings* mPreviewPlayerAudioMixSettings;
126643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi    M4OSA_Context mAudioMixPCMFileHandle;
127643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi    M4OSA_UInt32 mAudioMixStoryBoardTS;
128643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi    M4OSA_UInt32 mCurrentMediaBeginCutTime;
129643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi    M4OSA_UInt32 mCurrentMediaVolumeValue;
130e6c0750cd2927967f93a8811954f889d23fadb6eDharmaray Kundargi    M4OSA_UInt32 mCurrFramingEffectIndex;
131643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi
132643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi    uint32_t mNumberEffects;
133643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi    uint32_t mPlayBeginTimeMsec;
134643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi    uint32_t mPlayEndTimeMsec;
135643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi    uint64_t mDecodedVideoTs; // timestamp of current decoded video frame buffer
136643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi    uint64_t mDecVideoTsStoryBoard; // timestamp of frame relative to storyboard
137643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi    uint32_t mCurrentVideoEffect;
138643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi    uint32_t mProgressCbInterval;
139643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi    uint32_t mNumberDecVideoFrames; // Counter of number of video frames decoded
140643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi    sp<TimedEventQueue::Event> mProgressCbEvent;
141643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi    bool mProgressCbEventPending;
142e6c0750cd2927967f93a8811954f889d23fadb6eDharmaray Kundargi    sp<TimedEventQueue::Event> mOverlayUpdateEvent;
143e6c0750cd2927967f93a8811954f889d23fadb6eDharmaray Kundargi    bool mOverlayUpdateEventPending;
144e6c0750cd2927967f93a8811954f889d23fadb6eDharmaray Kundargi    bool mOverlayUpdateEventPosted;
145e6c0750cd2927967f93a8811954f889d23fadb6eDharmaray Kundargi
146643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi    M4xVSS_MediaRendering mRenderingMode;
147643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi    uint32_t mOutputVideoWidth;
148643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi    uint32_t mOutputVideoHeight;
149643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi
150643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi    uint32_t mStoryboardStartTimeMsec;
151643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi
152643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi    bool mIsVideoSourceJpg;
153643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi    bool mIsFiftiesEffectStarted;
154643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi    int64_t mImageFrameTimeUs;
155643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi    bool mStartNextPlayer;
156fa31daff175709d2c58d61d1354daa9495696631Raghavender Palla    mutable Mutex mLockControl;
157643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi
158643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi    M4VIFI_UInt8*  mFrameRGBBuffer;
159643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi    M4VIFI_UInt8*  mFrameYUVBuffer;
160643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi
161643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi    void setVideoPostProcessingNode(
162643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi                    M4VSS3GPP_VideoEffectType type, M4OSA_Bool enable);
163643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi    void postProgressCallbackEvent_l();
164643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi    void onProgressCbEvent();
165643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi
166e6c0750cd2927967f93a8811954f889d23fadb6eDharmaray Kundargi    void postOverlayUpdateEvent_l();
167e6c0750cd2927967f93a8811954f889d23fadb6eDharmaray Kundargi    void onUpdateOverlayEvent();
168e6c0750cd2927967f93a8811954f889d23fadb6eDharmaray Kundargi
169643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi    status_t setDataSource_l_jpg();
170643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi
171643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi    status_t prepare_l();
172643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi    status_t prepareAsync_l();
173643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi
17443fcc396614a587851e2b7c4cea2876ec58b8648Chih-Chung Chang    void updateSizeToRender(sp<MetaData> meta);
17543fcc396614a587851e2b7c4cea2876ec58b8648Chih-Chung Chang
1765bc7fb407ce1bab13d4a4a67d34a1a3192ee3186Dheeraj Sharma    VideoEditorAudioPlayer  *mVeAudioPlayer;
1775bc7fb407ce1bab13d4a4a67d34a1a3192ee3186Dheeraj Sharma
178643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi    PreviewPlayer(const PreviewPlayer &);
179643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi    PreviewPlayer &operator=(const PreviewPlayer &);
180643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi};
181643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi
182643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi}  // namespace android
183643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi
184643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi#endif  // PREVIEW_PLAYER_H_
185643290dc4c83da23b1b8ff4ed71118203274bb15Dharmaray Kundargi
186