blob: 74a09eba077b700166068b78943f1b715118b923 [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
Dharmaray Kundargi643290d2011-01-16 16:02:42 -080021#include "TimedEventQueue.h"
22#include "VideoEditorAudioPlayer.h"
23
24#include <media/MediaPlayerInterface.h>
25#include <media/stagefright/DataSource.h>
26#include <media/stagefright/OMXClient.h>
27#include <media/stagefright/TimeSource.h>
28#include <utils/threads.h>
James Dongc9dedc42011-05-01 12:36:22 -070029#include "PreviewPlayerBase.h"
Dharmaray Kundargi643290d2011-01-16 16:02:42 -080030#include "VideoEditorPreviewController.h"
31
32namespace android {
33
James Dongc9dedc42011-05-01 12:36:22 -070034struct AudioPlayerBase;
Dharmaray Kundargi643290d2011-01-16 16:02:42 -080035struct DataSource;
36struct MediaBuffer;
37struct MediaExtractor;
38struct MediaSource;
39
40struct PreviewPlayerRenderer : public RefBase {
41 PreviewPlayerRenderer() {}
42
43 virtual void render(MediaBuffer *buffer) = 0;
44 virtual void render() = 0;
45 virtual void getBuffer(uint8_t **data, size_t *stride) = 0;
46
47private:
48 PreviewPlayerRenderer(const PreviewPlayerRenderer &);
49 PreviewPlayerRenderer &operator=(const PreviewPlayerRenderer &);
50};
51
James Dongc9dedc42011-05-01 12:36:22 -070052struct PreviewPlayer : public PreviewPlayerBase {
Dharmaray Kundargi643290d2011-01-16 16:02:42 -080053 PreviewPlayer();
54 ~PreviewPlayer();
55
56 //Override baseclass methods
57 void reset();
58
59 status_t play();
60
Dharmaray Kundargi643290d2011-01-16 16:02:42 -080061 status_t seekTo(int64_t timeUs);
62
63 status_t getVideoDimensions(int32_t *width, int32_t *height) const;
64
65 status_t suspend();
66 status_t resume();
Raghavender Pallafa31daf2011-03-18 22:32:51 -070067 void acquireLock();
68 void releaseLock();
Dharmaray Kundargi643290d2011-01-16 16:02:42 -080069
70 status_t prepare();
71 status_t setDataSource(
72 const char *uri, const KeyedVector<String8, String8> *headers);
73
74 //Added methods
Dharmaray Kundargi35cb2de2011-01-19 19:09:27 -080075 status_t loadEffectsSettings(M4VSS3GPP_EffectSettings* pEffectSettings,
Dharmaray Kundargi643290d2011-01-16 16:02:42 -080076 int nEffects);
77 status_t loadAudioMixSettings(M4xVSS_AudioMixingSettings* pAudioMixSettings);
78 status_t setAudioMixPCMFileHandle(M4OSA_Context pAudioMixPCMFileHandle);
79 status_t setAudioMixStoryBoardParam(M4OSA_UInt32 audioMixStoryBoardTS,
80 M4OSA_UInt32 currentMediaBeginCutTime,
81 M4OSA_UInt32 currentMediaVolumeVol);
82
83 status_t setPlaybackBeginTime(uint32_t msec);
84 status_t setPlaybackEndTime(uint32_t msec);
85 status_t setStoryboardStartTime(uint32_t msec);
86 status_t setProgressCallbackInterval(uint32_t cbInterval);
87 status_t setMediaRenderingMode(M4xVSS_MediaRendering mode,
88 M4VIDEOEDITING_VideoFrameSize outputVideoSize);
89
90 status_t resetJniCallbackTimeStamp();
91 status_t setImageClipProperties(uint32_t width, uint32_t height);
92 status_t readFirstVideoFrame();
Santosh Madhavab2d6e0f2011-02-16 22:24:42 -080093 status_t getLastRenderedTimeMs(uint32_t *lastRenderedTimeMs);
James Dongc9dedc42011-05-01 12:36:22 -070094 status_t setAudioPlayer(AudioPlayerBase *audioPlayer);
Dharmaray Kundargi643290d2011-01-16 16:02:42 -080095
96private:
97 friend struct PreviewPlayerEvent;
98
99 enum {
100 PLAYING = 1,
101 LOOPING = 2,
102 FIRST_FRAME = 4,
103 PREPARING = 8,
104 PREPARED = 16,
105 AT_EOS = 32,
106 PREPARE_CANCELLED = 64,
107 CACHE_UNDERRUN = 128,
108 AUDIO_AT_EOS = 256,
109 VIDEO_AT_EOS = 512,
110 AUTO_LOOPING = 1024,
111 };
112
Dharmaray Kundargi643290d2011-01-16 16:02:42 -0800113 void cancelPlayerEvents(bool keepBufferingGoing = false);
114 status_t setDataSource_l(const sp<MediaExtractor> &extractor);
115 status_t setDataSource_l(
116 const char *uri, const KeyedVector<String8, String8> *headers);
117 void reset_l();
Dharmaray Kundargi643290d2011-01-16 16:02:42 -0800118 status_t play_l();
Santosh Madhavabfece172011-02-03 16:59:47 -0800119 status_t initRenderer_l();
Dharmaray Kundargi643290d2011-01-16 16:02:42 -0800120 status_t initAudioDecoder();
121 status_t initVideoDecoder(uint32_t flags = 0);
122 void onVideoEvent();
Rajneesh Chowdury1c97d9a2011-02-21 15:43:33 -0800123 void onStreamDone();
Dharmaray Kundargi643290d2011-01-16 16:02:42 -0800124 status_t finishSetDataSource_l();
125 static bool ContinuePreparation(void *cookie);
126 void onPrepareAsyncEvent();
127 void finishAsyncPrepare_l();
Dheeraj Sharma5bc7fb42011-02-13 20:31:27 -0800128 status_t startAudioPlayer_l();
Rajneesh Chowdury1c97d9a2011-02-21 15:43:33 -0800129 bool mIsChangeSourceRequired;
Dharmaray Kundargi643290d2011-01-16 16:02:42 -0800130
131 sp<PreviewPlayerRenderer> mVideoRenderer;
132
133 int32_t mVideoWidth, mVideoHeight;
134
135 MediaBuffer *mLastVideoBuffer;
136
137 struct SuspensionState {
138 String8 mUri;
139 KeyedVector<String8, String8> mUriHeaders;
140 sp<DataSource> mFileSource;
141
142 uint32_t mFlags;
143 int64_t mPositionUs;
144
145 void *mLastVideoFrame;
146 size_t mLastVideoFrameSize;
147 int32_t mColorFormat;
148 int32_t mVideoWidth, mVideoHeight;
149 int32_t mDecodedWidth, mDecodedHeight;
150
151 SuspensionState()
152 : mLastVideoFrame(NULL) {
153 }
154
155 ~SuspensionState() {
156 if (mLastVideoFrame) {
157 free(mLastVideoFrame);
158 mLastVideoFrame = NULL;
159 }
160 }
161 } *mSuspensionState;
162
163 //Data structures used for audio and video effects
164 M4VSS3GPP_EffectSettings* mEffectsSettings;
165 M4xVSS_AudioMixingSettings* mPreviewPlayerAudioMixSettings;
166 M4OSA_Context mAudioMixPCMFileHandle;
167 M4OSA_UInt32 mAudioMixStoryBoardTS;
168 M4OSA_UInt32 mCurrentMediaBeginCutTime;
169 M4OSA_UInt32 mCurrentMediaVolumeValue;
Dharmaray Kundargie6c07502011-01-21 16:58:31 -0800170 M4OSA_UInt32 mCurrFramingEffectIndex;
Dharmaray Kundargi643290d2011-01-16 16:02:42 -0800171
172 uint32_t mNumberEffects;
173 uint32_t mPlayBeginTimeMsec;
174 uint32_t mPlayEndTimeMsec;
175 uint64_t mDecodedVideoTs; // timestamp of current decoded video frame buffer
176 uint64_t mDecVideoTsStoryBoard; // timestamp of frame relative to storyboard
177 uint32_t mCurrentVideoEffect;
178 uint32_t mProgressCbInterval;
179 uint32_t mNumberDecVideoFrames; // Counter of number of video frames decoded
180 sp<TimedEventQueue::Event> mProgressCbEvent;
181 bool mProgressCbEventPending;
Dharmaray Kundargie6c07502011-01-21 16:58:31 -0800182 sp<TimedEventQueue::Event> mOverlayUpdateEvent;
183 bool mOverlayUpdateEventPending;
184 bool mOverlayUpdateEventPosted;
185
Dharmaray Kundargi643290d2011-01-16 16:02:42 -0800186 MediaBuffer *mResizedVideoBuffer;
187 bool mVideoResizedOrCropped;
188 M4xVSS_MediaRendering mRenderingMode;
189 uint32_t mOutputVideoWidth;
190 uint32_t mOutputVideoHeight;
191
Dharmaray Kundargi35cb2de2011-01-19 19:09:27 -0800192 int32_t mReportedWidth; //docoder reported width
193 int32_t mReportedHeight; //docoder reported height
194
Dharmaray Kundargi643290d2011-01-16 16:02:42 -0800195 uint32_t mStoryboardStartTimeMsec;
196
197 bool mIsVideoSourceJpg;
198 bool mIsFiftiesEffectStarted;
199 int64_t mImageFrameTimeUs;
200 bool mStartNextPlayer;
Raghavender Pallafa31daf2011-03-18 22:32:51 -0700201 mutable Mutex mLockControl;
Dharmaray Kundargi643290d2011-01-16 16:02:42 -0800202
203 M4VIFI_UInt8* mFrameRGBBuffer;
204 M4VIFI_UInt8* mFrameYUVBuffer;
205
206 void setVideoPostProcessingNode(
207 M4VSS3GPP_VideoEffectType type, M4OSA_Bool enable);
208 M4OSA_ERR doVideoPostProcessing();
209 M4OSA_ERR doMediaRendering();
210 void postProgressCallbackEvent_l();
211 void onProgressCbEvent();
212
Dharmaray Kundargie6c07502011-01-21 16:58:31 -0800213 void postOverlayUpdateEvent_l();
214 void onUpdateOverlayEvent();
215
Dharmaray Kundargi643290d2011-01-16 16:02:42 -0800216 status_t setDataSource_l_jpg();
217
218 status_t prepare_l();
219 status_t prepareAsync_l();
220
Dheeraj Sharma5bc7fb42011-02-13 20:31:27 -0800221 VideoEditorAudioPlayer *mVeAudioPlayer;
222
Dharmaray Kundargi643290d2011-01-16 16:02:42 -0800223 PreviewPlayer(const PreviewPlayer &);
224 PreviewPlayer &operator=(const PreviewPlayer &);
225};
226
227} // namespace android
228
229#endif // PREVIEW_PLAYER_H_
230