blob: 55a825916d58c00673193316cfed33e5332b342b [file] [log] [blame]
Dharmaray Kundargi643290d2011-01-16 16:02:42 -08001/*
Dharmaray Kundargi643290d2011-01-16 16:02:42 -08002 * Copyright (C) 2011 The Android Open Source Project
3 *
4 * Licensed under the Apache License, Version 2.0 (the "License");
5 * you may not use this file except in compliance with the License.
6 * You may obtain a copy of the License at
7 *
8 * http://www.apache.org/licenses/LICENSE-2.0
9 *
10 * Unless required by applicable law or agreed to in writing, software
11 * distributed under the License is distributed on an "AS IS" BASIS,
12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13 * See the License for the specific language governing permissions and
14 * limitations under the License.
15 */
16
17#ifndef PREVIEW_PLAYER_H_
18
19#define PREVIEW_PLAYER_H_
20
21#include "NuHTTPDataSource.h"
22#include "TimedEventQueue.h"
23#include "VideoEditorAudioPlayer.h"
24
25#include <media/MediaPlayerInterface.h>
26#include <media/stagefright/DataSource.h>
27#include <media/stagefright/OMXClient.h>
28#include <media/stagefright/TimeSource.h>
29#include <utils/threads.h>
James Dongc9dedc42011-05-01 12:36:22 -070030#include "PreviewPlayerBase.h"
Dharmaray Kundargi643290d2011-01-16 16:02:42 -080031#include "VideoEditorPreviewController.h"
32
33namespace android {
34
James Dongc9dedc42011-05-01 12:36:22 -070035struct AudioPlayerBase;
Dharmaray Kundargi643290d2011-01-16 16:02:42 -080036struct DataSource;
37struct MediaBuffer;
38struct MediaExtractor;
39struct MediaSource;
40
41struct PreviewPlayerRenderer : public RefBase {
42 PreviewPlayerRenderer() {}
43
44 virtual void render(MediaBuffer *buffer) = 0;
45 virtual void render() = 0;
46 virtual void getBuffer(uint8_t **data, size_t *stride) = 0;
47
48private:
49 PreviewPlayerRenderer(const PreviewPlayerRenderer &);
50 PreviewPlayerRenderer &operator=(const PreviewPlayerRenderer &);
51};
52
James Dongc9dedc42011-05-01 12:36:22 -070053struct PreviewPlayer : public PreviewPlayerBase {
Dharmaray Kundargi643290d2011-01-16 16:02:42 -080054 PreviewPlayer();
55 ~PreviewPlayer();
56
57 //Override baseclass methods
58 void reset();
59
60 status_t play();
61
Dharmaray Kundargi643290d2011-01-16 16:02:42 -080062 status_t seekTo(int64_t timeUs);
63
64 status_t getVideoDimensions(int32_t *width, int32_t *height) const;
65
66 status_t suspend();
67 status_t resume();
Raghavender Pallafa31daf2011-03-18 22:32:51 -070068 void acquireLock();
69 void releaseLock();
Dharmaray Kundargi643290d2011-01-16 16:02:42 -080070
71 status_t prepare();
72 status_t setDataSource(
73 const char *uri, const KeyedVector<String8, String8> *headers);
74
75 //Added methods
Dharmaray Kundargi35cb2de2011-01-19 19:09:27 -080076 status_t loadEffectsSettings(M4VSS3GPP_EffectSettings* pEffectSettings,
Dharmaray Kundargi643290d2011-01-16 16:02:42 -080077 int nEffects);
78 status_t loadAudioMixSettings(M4xVSS_AudioMixingSettings* pAudioMixSettings);
79 status_t setAudioMixPCMFileHandle(M4OSA_Context pAudioMixPCMFileHandle);
80 status_t setAudioMixStoryBoardParam(M4OSA_UInt32 audioMixStoryBoardTS,
81 M4OSA_UInt32 currentMediaBeginCutTime,
82 M4OSA_UInt32 currentMediaVolumeVol);
83
84 status_t setPlaybackBeginTime(uint32_t msec);
85 status_t setPlaybackEndTime(uint32_t msec);
86 status_t setStoryboardStartTime(uint32_t msec);
87 status_t setProgressCallbackInterval(uint32_t cbInterval);
88 status_t setMediaRenderingMode(M4xVSS_MediaRendering mode,
89 M4VIDEOEDITING_VideoFrameSize outputVideoSize);
90
91 status_t resetJniCallbackTimeStamp();
92 status_t setImageClipProperties(uint32_t width, uint32_t height);
93 status_t readFirstVideoFrame();
Santosh Madhavab2d6e0f2011-02-16 22:24:42 -080094 status_t getLastRenderedTimeMs(uint32_t *lastRenderedTimeMs);
James Dongc9dedc42011-05-01 12:36:22 -070095 status_t setAudioPlayer(AudioPlayerBase *audioPlayer);
Dharmaray Kundargi643290d2011-01-16 16:02:42 -080096
97private:
98 friend struct PreviewPlayerEvent;
99
100 enum {
101 PLAYING = 1,
102 LOOPING = 2,
103 FIRST_FRAME = 4,
104 PREPARING = 8,
105 PREPARED = 16,
106 AT_EOS = 32,
107 PREPARE_CANCELLED = 64,
108 CACHE_UNDERRUN = 128,
109 AUDIO_AT_EOS = 256,
110 VIDEO_AT_EOS = 512,
111 AUTO_LOOPING = 1024,
112 };
113
Dharmaray Kundargi643290d2011-01-16 16:02:42 -0800114 void cancelPlayerEvents(bool keepBufferingGoing = false);
115 status_t setDataSource_l(const sp<MediaExtractor> &extractor);
116 status_t setDataSource_l(
117 const char *uri, const KeyedVector<String8, String8> *headers);
118 void reset_l();
Dharmaray Kundargi643290d2011-01-16 16:02:42 -0800119 status_t play_l();
Santosh Madhavabfece172011-02-03 16:59:47 -0800120 status_t initRenderer_l();
Dharmaray Kundargi643290d2011-01-16 16:02:42 -0800121 status_t initAudioDecoder();
122 status_t initVideoDecoder(uint32_t flags = 0);
123 void onVideoEvent();
Rajneesh Chowdury1c97d9a2011-02-21 15:43:33 -0800124 void onStreamDone();
Dharmaray Kundargi643290d2011-01-16 16:02:42 -0800125 status_t finishSetDataSource_l();
126 static bool ContinuePreparation(void *cookie);
127 void onPrepareAsyncEvent();
128 void finishAsyncPrepare_l();
Dheeraj Sharma5bc7fb42011-02-13 20:31:27 -0800129 status_t startAudioPlayer_l();
Rajneesh Chowdury1c97d9a2011-02-21 15:43:33 -0800130 bool mIsChangeSourceRequired;
Dharmaray Kundargi643290d2011-01-16 16:02:42 -0800131
132 sp<PreviewPlayerRenderer> mVideoRenderer;
133
134 int32_t mVideoWidth, mVideoHeight;
135
136 MediaBuffer *mLastVideoBuffer;
137
138 struct SuspensionState {
139 String8 mUri;
140 KeyedVector<String8, String8> mUriHeaders;
141 sp<DataSource> mFileSource;
142
143 uint32_t mFlags;
144 int64_t mPositionUs;
145
146 void *mLastVideoFrame;
147 size_t mLastVideoFrameSize;
148 int32_t mColorFormat;
149 int32_t mVideoWidth, mVideoHeight;
150 int32_t mDecodedWidth, mDecodedHeight;
151
152 SuspensionState()
153 : mLastVideoFrame(NULL) {
154 }
155
156 ~SuspensionState() {
157 if (mLastVideoFrame) {
158 free(mLastVideoFrame);
159 mLastVideoFrame = NULL;
160 }
161 }
162 } *mSuspensionState;
163
164 //Data structures used for audio and video effects
165 M4VSS3GPP_EffectSettings* mEffectsSettings;
166 M4xVSS_AudioMixingSettings* mPreviewPlayerAudioMixSettings;
167 M4OSA_Context mAudioMixPCMFileHandle;
168 M4OSA_UInt32 mAudioMixStoryBoardTS;
169 M4OSA_UInt32 mCurrentMediaBeginCutTime;
170 M4OSA_UInt32 mCurrentMediaVolumeValue;
Dharmaray Kundargie6c07502011-01-21 16:58:31 -0800171 M4OSA_UInt32 mCurrFramingEffectIndex;
Dharmaray Kundargi643290d2011-01-16 16:02:42 -0800172
173 uint32_t mNumberEffects;
174 uint32_t mPlayBeginTimeMsec;
175 uint32_t mPlayEndTimeMsec;
176 uint64_t mDecodedVideoTs; // timestamp of current decoded video frame buffer
177 uint64_t mDecVideoTsStoryBoard; // timestamp of frame relative to storyboard
178 uint32_t mCurrentVideoEffect;
179 uint32_t mProgressCbInterval;
180 uint32_t mNumberDecVideoFrames; // Counter of number of video frames decoded
181 sp<TimedEventQueue::Event> mProgressCbEvent;
182 bool mProgressCbEventPending;
Dharmaray Kundargie6c07502011-01-21 16:58:31 -0800183 sp<TimedEventQueue::Event> mOverlayUpdateEvent;
184 bool mOverlayUpdateEventPending;
185 bool mOverlayUpdateEventPosted;
186
Dharmaray Kundargi643290d2011-01-16 16:02:42 -0800187 MediaBuffer *mResizedVideoBuffer;
188 bool mVideoResizedOrCropped;
189 M4xVSS_MediaRendering mRenderingMode;
190 uint32_t mOutputVideoWidth;
191 uint32_t mOutputVideoHeight;
192
Dharmaray Kundargi35cb2de2011-01-19 19:09:27 -0800193 int32_t mReportedWidth; //docoder reported width
194 int32_t mReportedHeight; //docoder reported height
195
Dharmaray Kundargi643290d2011-01-16 16:02:42 -0800196 uint32_t mStoryboardStartTimeMsec;
197
198 bool mIsVideoSourceJpg;
199 bool mIsFiftiesEffectStarted;
200 int64_t mImageFrameTimeUs;
201 bool mStartNextPlayer;
Raghavender Pallafa31daf2011-03-18 22:32:51 -0700202 mutable Mutex mLockControl;
Dharmaray Kundargi643290d2011-01-16 16:02:42 -0800203
204 M4VIFI_UInt8* mFrameRGBBuffer;
205 M4VIFI_UInt8* mFrameYUVBuffer;
206
207 void setVideoPostProcessingNode(
208 M4VSS3GPP_VideoEffectType type, M4OSA_Bool enable);
209 M4OSA_ERR doVideoPostProcessing();
210 M4OSA_ERR doMediaRendering();
211 void postProgressCallbackEvent_l();
212 void onProgressCbEvent();
213
Dharmaray Kundargie6c07502011-01-21 16:58:31 -0800214 void postOverlayUpdateEvent_l();
215 void onUpdateOverlayEvent();
216
Dharmaray Kundargi643290d2011-01-16 16:02:42 -0800217 status_t setDataSource_l_jpg();
218
219 status_t prepare_l();
220 status_t prepareAsync_l();
221
Dheeraj Sharma5bc7fb42011-02-13 20:31:27 -0800222 VideoEditorAudioPlayer *mVeAudioPlayer;
223
Dharmaray Kundargi643290d2011-01-16 16:02:42 -0800224 PreviewPlayer(const PreviewPlayer &);
225 PreviewPlayer &operator=(const PreviewPlayer &);
226};
227
228} // namespace android
229
230#endif // PREVIEW_PLAYER_H_
231