19969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang/*
29969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang * Copyright (C) 2011 The Android Open Source Project
39969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang *
49969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang * Licensed under the Apache License, Version 2.0 (the "License");
59969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang * you may not use this file except in compliance with the License.
69969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang * You may obtain a copy of the License at
79969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang *
89969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang *      http://www.apache.org/licenses/LICENSE-2.0
99969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang *
109969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang * Unless required by applicable law or agreed to in writing, software
119969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang * distributed under the License is distributed on an "AS IS" BASIS,
129969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
139969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang * See the License for the specific language governing permissions and
149969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang * limitations under the License.
159969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang */
169969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang
179969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang#ifndef ANDROID_VE_PREVIEWCONTROLLER_H
189969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang#define ANDROID_VE_PREVIEWCONTROLLER_H
199969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang
209969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang#include "VideoEditorPlayer.h"
219969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang#include "VideoEditorTools.h"
229969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang
239969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Changnamespace android {
249969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang
259969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang// Callback mechanism from PreviewController to Jni  */
269969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Changtypedef void (*jni_progress_callback_fct)(void* cookie, M4OSA_UInt32 msgType, void *argc);
279969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang
283d2d40ac83acbda8c161cae675c372595efd640eJames Dongstruct Surface;
293d2d40ac83acbda8c161cae675c372595efd640eJames Dongstruct PreviewRenderer;
309969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang
319969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Changclass VideoEditorPreviewController {
329969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang
339969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Changpublic:
349969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang    VideoEditorPreviewController();
353d2d40ac83acbda8c161cae675c372595efd640eJames Dong    ~VideoEditorPreviewController();
369969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang
373d2d40ac83acbda8c161cae675c372595efd640eJames Dong    M4OSA_ERR loadEditSettings(
383d2d40ac83acbda8c161cae675c372595efd640eJames Dong            M4VSS3GPP_EditSettings* pSettings,
393d2d40ac83acbda8c161cae675c372595efd640eJames Dong            M4xVSS_AudioMixingSettings* bgmSettings);
409969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang
413d2d40ac83acbda8c161cae675c372595efd640eJames Dong    M4OSA_ERR setSurface(const sp<Surface>& surface);
429969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang
433d2d40ac83acbda8c161cae675c372595efd640eJames Dong    M4OSA_ERR startPreview(
443d2d40ac83acbda8c161cae675c372595efd640eJames Dong            M4OSA_UInt32 fromMS, M4OSA_Int32 toMs,
453d2d40ac83acbda8c161cae675c372595efd640eJames Dong            M4OSA_UInt16 callBackAfterFrameCount,
463d2d40ac83acbda8c161cae675c372595efd640eJames Dong            M4OSA_Bool loop) ;
479969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang
489969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang    M4OSA_UInt32 stopPreview();
499969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang
503d2d40ac83acbda8c161cae675c372595efd640eJames Dong    M4OSA_ERR renderPreviewFrame(
513d2d40ac83acbda8c161cae675c372595efd640eJames Dong            const sp<Surface>& surface,
523d2d40ac83acbda8c161cae675c372595efd640eJames Dong            VideoEditor_renderPreviewFrameStr* pFrameInfo,
533d2d40ac83acbda8c161cae675c372595efd640eJames Dong            VideoEditorCurretEditInfo *pCurrEditInfo);
549969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang
553d2d40ac83acbda8c161cae675c372595efd640eJames Dong    M4OSA_ERR clearSurface(
563d2d40ac83acbda8c161cae675c372595efd640eJames Dong            const sp<Surface>& surface,
573d2d40ac83acbda8c161cae675c372595efd640eJames Dong            VideoEditor_renderPreviewFrameStr* pFrameInfo);
589969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang
593d2d40ac83acbda8c161cae675c372595efd640eJames Dong    M4OSA_Void setJniCallback(
603d2d40ac83acbda8c161cae675c372595efd640eJames Dong            void* cookie,
613d2d40ac83acbda8c161cae675c372595efd640eJames Dong            jni_progress_callback_fct callbackFct);
629969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang
633d2d40ac83acbda8c161cae675c372595efd640eJames Dong    status_t setPreviewFrameRenderingMode(
643d2d40ac83acbda8c161cae675c372595efd640eJames Dong            M4xVSS_MediaRendering mode,
653d2d40ac83acbda8c161cae675c372595efd640eJames Dong            M4VIDEOEDITING_VideoFrameSize outputVideoSize);
669969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang
679969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Changprivate:
683d2d40ac83acbda8c161cae675c372595efd640eJames Dong    enum {
693d2d40ac83acbda8c161cae675c372595efd640eJames Dong        kTotalNumPlayerInstances = 2,
703d2d40ac83acbda8c161cae675c372595efd640eJames Dong        kPreviewThreadStackSize = 65536,
713d2d40ac83acbda8c161cae675c372595efd640eJames Dong    };
723d2d40ac83acbda8c161cae675c372595efd640eJames Dong
733d2d40ac83acbda8c161cae675c372595efd640eJames Dong    typedef enum {
743d2d40ac83acbda8c161cae675c372595efd640eJames Dong        VePlayerIdle = 0,
753d2d40ac83acbda8c161cae675c372595efd640eJames Dong        VePlayerBusy,
763d2d40ac83acbda8c161cae675c372595efd640eJames Dong        VePlayerAutoStop
773d2d40ac83acbda8c161cae675c372595efd640eJames Dong    } PlayerState;
783d2d40ac83acbda8c161cae675c372595efd640eJames Dong
793d2d40ac83acbda8c161cae675c372595efd640eJames Dong    typedef enum {
803d2d40ac83acbda8c161cae675c372595efd640eJames Dong        OVERLAY_UPDATE = 0,
813d2d40ac83acbda8c161cae675c372595efd640eJames Dong        OVERLAY_CLEAR
823d2d40ac83acbda8c161cae675c372595efd640eJames Dong    } OverlayState;
833d2d40ac83acbda8c161cae675c372595efd640eJames Dong
843d2d40ac83acbda8c161cae675c372595efd640eJames Dong    sp<VideoEditorPlayer> mVePlayer[kTotalNumPlayerInstances];
853d2d40ac83acbda8c161cae675c372595efd640eJames Dong    int mCurrentPlayer;  // player instance currently being used
869969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang    sp<Surface>  mSurface;
879969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang    mutable Mutex mLock;
889969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang    M4OSA_Context mThreadContext;
893d2d40ac83acbda8c161cae675c372595efd640eJames Dong    PlayerState mPlayerState;
909969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang    M4OSA_Bool    mPrepareReqest;
913d2d40ac83acbda8c161cae675c372595efd640eJames Dong    M4VSS3GPP_ClipSettings **mClipList;
929969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang    M4OSA_UInt32 mNumberClipsInStoryBoard;
939969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang    M4OSA_UInt32 mNumberClipsToPreview;
949969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang    M4OSA_UInt32 mStartingClipIndex;
959969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang    M4OSA_Bool mPreviewLooping;
969969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang    M4OSA_UInt32 mCallBackAfterFrameCnt;
979969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang    M4VSS3GPP_EffectSettings* mEffectsSettings;
989969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang    M4OSA_UInt32 mNumberEffects;
999969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang    M4OSA_Int32 mCurrentClipNumber;
1009969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang    M4OSA_UInt32 mClipTotalDuration;
1019969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang    M4OSA_UInt32 mCurrentVideoEffect;
1029969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang    M4xVSS_AudioMixingSettings* mBackgroundAudioSetting;
1039969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang    M4OSA_Context mAudioMixPCMFileHandle;
1049969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang    PreviewRenderer *mTarget;
1059969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang    M4OSA_Context mJniCookie;
1069969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang    jni_progress_callback_fct mJniCallback;
1079969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang    VideoEditor_renderPreviewFrameStr mFrameStr;
1089969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang    M4OSA_UInt32 mCurrentPlayedDuration;
1099969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang    M4OSA_UInt32 mCurrentClipDuration;
1109969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang    M4VIDEOEDITING_VideoFrameSize mOutputVideoSize;
1119969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang    M4OSA_UInt32 mFirstPreviewClipBeginTime;
1129969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang    M4OSA_UInt32 mLastPreviewClipEndTime;
1139969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang    M4OSA_UInt32 mVideoStoryBoardTimeMsUptoFirstPreviewClip;
1149969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang    OverlayState mOverlayState;
1159969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang    int mActivePlayerIndex;
1169969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang
1179969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang    M4xVSS_MediaRendering mRenderingMode;
1189969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang    uint32_t mOutputVideoWidth;
1199969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang    uint32_t mOutputVideoHeight;
1209969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang    bool bStopThreadInProgress;
1219969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang    M4OSA_Context mSemThreadWait;
1229969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang    bool mIsFiftiesEffectStarted;
1239969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang
1249969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang    sp<VideoEditorPlayer::VeAudioOutput> mVEAudioSink;
1259969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang    VideoEditorAudioPlayer *mVEAudioPlayer;
12643fcc396614a587851e2b7c4cea2876ec58b8648Chih-Chung Chang    NativeWindowRenderer* mNativeWindowRenderer;
1279969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang
1289969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang    M4VIFI_UInt8*  mFrameRGBBuffer;
1299969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang    M4VIFI_UInt8*  mFrameYUVBuffer;
1309969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang    mutable Mutex mLockSem;
1313d2d40ac83acbda8c161cae675c372595efd640eJames Dong
1323d2d40ac83acbda8c161cae675c372595efd640eJames Dong
1339969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang    static M4OSA_ERR preparePlayer(void* param, int playerInstance, int index);
1349969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang    static M4OSA_ERR threadProc(M4OSA_Void* param);
1359969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang    static void notify(void* cookie, int msg, int ext1, int ext2);
1369969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang
1379969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang    void setVideoEffectType(M4VSS3GPP_VideoEffectType type, M4OSA_Bool enable);
1389969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang
1393d2d40ac83acbda8c161cae675c372595efd640eJames Dong    M4OSA_ERR applyVideoEffect(
1403d2d40ac83acbda8c161cae675c372595efd640eJames Dong            M4OSA_Void * dataPtr, M4OSA_UInt32 colorFormat,
1413d2d40ac83acbda8c161cae675c372595efd640eJames Dong            M4OSA_UInt32 videoWidth, M4OSA_UInt32 videoHeight,
1423d2d40ac83acbda8c161cae675c372595efd640eJames Dong            M4OSA_UInt32 timeMs, M4OSA_Void* outPtr);
1439969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang
1443d2d40ac83acbda8c161cae675c372595efd640eJames Dong    M4OSA_ERR doImageRenderingMode(
1453d2d40ac83acbda8c161cae675c372595efd640eJames Dong            M4OSA_Void * dataPtr,
1463d2d40ac83acbda8c161cae675c372595efd640eJames Dong            M4OSA_UInt32 colorFormat, M4OSA_UInt32 videoWidth,
1473d2d40ac83acbda8c161cae675c372595efd640eJames Dong            M4OSA_UInt32 videoHeight, M4OSA_Void* outPtr);
1489969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang
1493d2d40ac83acbda8c161cae675c372595efd640eJames Dong    // Don't call me!
1509969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang    VideoEditorPreviewController(const VideoEditorPreviewController &);
1513d2d40ac83acbda8c161cae675c372595efd640eJames Dong    VideoEditorPreviewController &operator=(
1523d2d40ac83acbda8c161cae675c372595efd640eJames Dong            const VideoEditorPreviewController &);
1539969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang};
1549969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang
1559969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang}
1569969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang
1573d2d40ac83acbda8c161cae675c372595efd640eJames Dong#endif // ANDROID_VE_PREVIEWCONTROLLER_H
158