mFrameRGBBuffer(NULL),
mFrameYUVBuffer(NULL),
mReportedWidth(0),
- mReportedHeight(0) {
+ mReportedHeight(0),
+ mCurrFramingEffectIndex(0) {
mVideoRenderer = NULL;
mLastVideoBuffer = NULL;
mCurrentVideoEffect = VIDEO_EFFECT_NONE;
mProgressCbInterval = 0;
mNumberDecVideoFrames = 0;
+ mOverlayUpdateEventPosted = false;
mVideoEvent = new PreviewPlayerEvent(this, &PreviewPlayer::onVideoEvent);
mVideoEventPending = false;
mStreamDoneEvent = new PreviewPlayerEvent(this,
- &AwesomePlayer::onStreamDone);
+ &AwesomePlayer::onStreamDone);
mStreamDoneEventPending = false;
mCheckAudioStatusEvent = new PreviewPlayerEvent(
- this, &AwesomePlayer::onCheckAudioStatus);
+ this, &AwesomePlayer::onCheckAudioStatus);
mAudioStatusEventPending = false;
mProgressCbEvent = new PreviewPlayerEvent(this,
- &PreviewPlayer::onProgressCbEvent);
+ &PreviewPlayer::onProgressCbEvent);
+ mOverlayUpdateEvent = new PreviewPlayerEvent(this,
+ &PreviewPlayer::onUpdateOverlayEvent);
mProgressCbEventPending = false;
+
+ mOverlayUpdateEventPending = false;
mResizedVideoBuffer = NULL;
mVideoResizedOrCropped = false;
mRenderingMode = (M4xVSS_MediaRendering)MEDIA_RENDERING_INVALID;
mFlags |= VIDEO_AT_EOS;
mFlags |= AUDIO_AT_EOS;
LOGI("PreviewPlayer: onVideoEvent timeUs > mPlayEndTime; send EOS..");
+ if (mOverlayUpdateEventPosted) {
+ mOverlayUpdateEventPosted = false;
+ postOverlayUpdateEvent_l();
+ }
postStreamDoneEvent_l(ERROR_END_OF_STREAM);
return;
}
setVideoPostProcessingNode(
mEffectsSettings[i].VideoEffectType, FALSE);
}
+ }
+ //Provide the overlay Update indication when there is an overlay effect
+ if (mCurrentVideoEffect == VIDEO_EFFECT_FRAMING) {
+ mCurrentVideoEffect = VIDEO_EFFECT_NONE; //never apply framing here.
+ if (!mOverlayUpdateEventPosted) {
+
+ // Find the effect in effectSettings array
+ int index;
+ for (index = 0; index < mNumberEffects; index++) {
+ M4OSA_UInt32 timeMs = mDecodedVideoTs/1000;
+ M4OSA_UInt32 timeOffset = mDecVideoTsStoryBoard/1000;
+ if(mEffectsSettings[index].VideoEffectType ==
+ M4xVSS_kVideoEffectType_Framing) {
+ if (((mEffectsSettings[index].uiStartTime + 1) <= timeMs + timeOffset) &&
+ ((mEffectsSettings[index].uiStartTime - 1 +
+ mEffectsSettings[index].uiDuration) >= timeMs + timeOffset))
+ {
+ break;
+ }
+ }
+ }
+ if (index < mNumberEffects) {
+ mCurrFramingEffectIndex = index;
+ mOverlayUpdateEventPosted = true;
+ postOverlayUpdateEvent_l();
+ LOGV("Framing index = %d", mCurrFramingEffectIndex);
+ } else {
+ LOGV("No framing effects found");
+ }
+ }
+
+ } else if (mOverlayUpdateEventPosted) {
+ //Post the event when the overlay is no more valid
+ LOGV("Overlay is Done");
+ mOverlayUpdateEventPosted = false;
+ postOverlayUpdateEvent_l();
}
- if(mCurrentVideoEffect != VIDEO_EFFECT_NONE) {
+
+ if (mCurrentVideoEffect != VIDEO_EFFECT_NONE) {
err1 = doVideoPostProcessing();
if(err1 != M4NO_ERROR) {
LOGE("doVideoPostProcessing returned err");
mQueue.postEvent(mProgressCbEvent);
}
+
void PreviewPlayer::onProgressCbEvent() {
Mutex::Autolock autoLock(mLock);
if (!mProgressCbEventPending) {
}
}
+void PreviewPlayer::postOverlayUpdateEvent_l() {
+ if (mOverlayUpdateEventPending) {
+ return;
+ }
+ mOverlayUpdateEventPending = true;
+ mQueue.postEvent(mOverlayUpdateEvent);
+}
+
+void PreviewPlayer::onUpdateOverlayEvent() {
+ Mutex::Autolock autoLock(mLock);
+
+ if (!mOverlayUpdateEventPending) {
+ return;
+ }
+ mOverlayUpdateEventPending = false;
+
+ int updateState;
+ if (mOverlayUpdateEventPosted) {
+ updateState = 1;
+ } else {
+ updateState = 0;
+ }
+ notifyListener_l(0xBBBBBBBB, updateState, mCurrFramingEffectIndex);
+}
+
+
void PreviewPlayer::setVideoPostProcessingNode(
M4VSS3GPP_VideoEffectType type, M4OSA_Bool enable) {
M4OSA_UInt32 mAudioMixStoryBoardTS;
M4OSA_UInt32 mCurrentMediaBeginCutTime;
M4OSA_UInt32 mCurrentMediaVolumeValue;
+ M4OSA_UInt32 mCurrFramingEffectIndex;
uint32_t mNumberEffects;
uint32_t mPlayBeginTimeMsec;
uint32_t mNumberDecVideoFrames; // Counter of number of video frames decoded
sp<TimedEventQueue::Event> mProgressCbEvent;
bool mProgressCbEventPending;
+ sp<TimedEventQueue::Event> mOverlayUpdateEvent;
+ bool mOverlayUpdateEventPending;
+ bool mOverlayUpdateEventPosted;
+
MediaBuffer *mResizedVideoBuffer;
bool mVideoResizedOrCropped;
M4xVSS_MediaRendering mRenderingMode;
void postProgressCallbackEvent_l();
void onProgressCbEvent();
+ void postOverlayUpdateEvent_l();
+ void onUpdateOverlayEvent();
+
status_t setDataSource_l_jpg();
status_t prepare_l();
#include "VideoEditorPreviewController.h"\r
\r
namespace android {\r
-\r
+ \r
#define PREVIEW_THREAD_STACK_SIZE (65536)\r
\r
VideoEditorPreviewController::VideoEditorPreviewController()\r
}\r
\r
M4OSA_ERR VideoEditorPreviewController::renderPreviewFrame(\r
- const sp<Surface> &surface, VideoEditor_renderPreviewFrameStr* pFrameInfo) {\r
+ const sp<Surface> &surface,\r
+ VideoEditor_renderPreviewFrameStr* pFrameInfo,\r
+ VideoEditorCurretEditInfo *pCurrEditInfo) {\r
\r
M4OSA_ERR err = M4NO_ERROR;\r
M4OSA_UInt32 i = 0, iIncrementedDuration = 0, tnTimeMs=0, framesize =0;\r
\r
// Get the Isurface to be passed to renderer\r
mISurface = surface->getISurface();\r
-\r
+ if (pCurrEditInfo != NULL) {\r
+ pCurrEditInfo->overlaySettingsIndex = -1;\r
+ }\r
// Delete previous renderer instance\r
if(mTarget != NULL) {\r
delete mTarget;\r
}\r
}\r
\r
+ //Provide the overlay Update indication when there is an overlay effect\r
+ if (mCurrentVideoEffect == VIDEO_EFFECT_FRAMING) {\r
+ int index;\r
+ mCurrentVideoEffect = VIDEO_EFFECT_NONE; //never apply framing here.\r
+\r
+ // Find the effect in effectSettings array\r
+ for (index = 0; index < mNumberEffects; index++) {\r
+ if(mEffectsSettings[index].VideoEffectType ==\r
+ M4xVSS_kVideoEffectType_Framing) {\r
+\r
+ if((mEffectsSettings[index].uiStartTime <= pFrameInfo->timeMs) &&\r
+ ((mEffectsSettings[index].uiStartTime+\r
+ mEffectsSettings[index].uiDuration) >= pFrameInfo->timeMs))\r
+ {\r
+ break;\r
+ }\r
+ }\r
+ }\r
+ if ((index < mNumberEffects) && (pCurrEditInfo != NULL)) {\r
+ pCurrEditInfo->overlaySettingsIndex = index;\r
+ LOGV("Framing index = %d", index);\r
+ } else {\r
+ LOGV("No framing effects found");\r
+ }\r
+ }\r
+\r
if(mCurrentVideoEffect != VIDEO_EFFECT_NONE) {\r
err = applyVideoEffect((M4OSA_Void *)pFrameStr->pBuffer,\r
OMX_COLOR_FormatYUV420Planar, pFrameStr->uiFrameWidth,\r
}\r
}\r
else {\r
+ M4OSA_UInt32 endArgs = 0;\r
if(pController->mJniCallback != NULL) {\r
pController->mJniCallback(\r
- pController->mJniCookie, MSG_TYPE_PREVIEW_END, 0);\r
+ pController->mJniCookie, MSG_TYPE_PREVIEW_END, &endArgs);\r
}\r
pController->mPlayerState = VePlayerAutoStop;\r
\r
LOGV("MEDIA_PREPARED");\r
break;\r
case MEDIA_PLAYBACK_COMPLETE:\r
+ {\r
LOGV("notify:MEDIA_PLAYBACK_COMPLETE");\r
pController->mPlayerState = VePlayerIdle;\r
\r
pController->mClipList[pController->mCurrentClipNumber]->uiEndCutTime\r
- pController->mClipList[pController->mCurrentClipNumber]->uiBeginCutTime;\r
}\r
+\r
+ M4OSA_UInt32 playedDuration = clipDuration+pController->mCurrentPlayedDuration;\r
pController->mJniCallback(\r
- pController->mJniCookie, MSG_TYPE_PROGRESS_INDICATION,\r
- (clipDuration+pController->mCurrentPlayedDuration));\r
+ pController->mJniCookie, MSG_TYPE_PROGRESS_INDICATION,\r
+ &playedDuration);\r
\r
M4OSA_semaphorePost(pController->mSemThreadWait);\r
break;\r
- case MEDIA_ERROR:\r
+ }\r
+ case MEDIA_ERROR:\r
+ {\r
+ int err_val = ext1;\r
// Always log errors.\r
// ext1: Media framework error code.\r
// ext2: Implementation dependant error code.\r
LOGE("MEDIA_ERROR; error (%d, %d)", ext1, ext2);\r
if(pController->mJniCallback != NULL) {\r
pController->mJniCallback(pController->mJniCookie,\r
- MSG_TYPE_PLAYER_ERROR, ext1);\r
+ MSG_TYPE_PLAYER_ERROR, &err_val);\r
}\r
break;\r
+ }\r
case MEDIA_INFO:\r
+ {\r
+ int info_val = ext2;\r
// ext1: Media framework error code.\r
// ext2: Implementation dependant error code.\r
//LOGW("MEDIA_INFO; info/warning (%d, %d)", ext1, ext2);\r
if(pController->mJniCallback != NULL) {\r
pController->mJniCallback(pController->mJniCookie,\r
- MSG_TYPE_PROGRESS_INDICATION, ext2);\r
+ MSG_TYPE_PROGRESS_INDICATION, &info_val);\r
}\r
break;\r
+ }\r
case MEDIA_SEEK_COMPLETE:\r
LOGV("MEDIA_SEEK_COMPLETE; Received seek complete");\r
break;\r
pController->mCurrentClipNumber+1);\r
}\r
break;\r
+ case 0xBBBBBBBB:\r
+ {\r
+ LOGV("VIDEO PLAYBACK, Update Overlay");\r
+ int overlayIndex = ext2;\r
+ VideoEditorCurretEditInfo *pEditInfo =\r
+ (VideoEditorCurretEditInfo*)M4OSA_malloc(sizeof(VideoEditorCurretEditInfo),\r
+ M4VS, (M4OSA_Char*)"Current Edit info");\r
+ //ext1 = 1; start the overlay display\r
+ // = 2; Clear the overlay.\r
+ pEditInfo->overlaySettingsIndex = ext2;\r
+ pEditInfo->clipIndex = pController->mCurrentClipNumber;\r
+ LOGV("pController->mCurrentClipNumber = %d",pController->mCurrentClipNumber);\r
+ if (pController->mJniCallback != NULL) {\r
+ if (ext1 == 1) {\r
+ pController->mJniCallback(pController->mJniCookie,\r
+ MSG_TYPE_OVERLAY_UPDATE, pEditInfo);\r
+ } else {\r
+ pController->mJniCallback(pController->mJniCookie,\r
+ MSG_TYPE_OVERLAY_CLEAR, pEditInfo);\r
+ }\r
+ }\r
+ M4OSA_free((M4OSA_MemAddr32)pEditInfo);\r
+ break;\r
+ }\r
default:\r
LOGV("unrecognized message: (%d, %d, %d)", msg, ext1, ext2);\r
break;\r
\r
\r
// Callback mechanism from PreviewController to Jni */\r
-typedef void (*jni_progress_callback_fct)(void* cookie, M4OSA_UInt32 msgType, M4OSA_UInt32 argc);\r
+typedef void (*jni_progress_callback_fct)(void* cookie, M4OSA_UInt32 msgType, void *argc);\r
+\r
\r
class VideoEditorPreviewController {\r
\r
virtual ~VideoEditorPreviewController();\r
\r
M4OSA_ERR loadEditSettings(M4VSS3GPP_EditSettings* pSettings,\r
- M4xVSS_AudioMixingSettings* bgmSettings);\r
+ M4xVSS_AudioMixingSettings* bgmSettings);\r
\r
M4OSA_ERR setSurface(const sp<Surface> &surface);\r
\r
M4OSA_ERR startPreview(M4OSA_UInt32 fromMS, M4OSA_Int32 toMs,\r
- M4OSA_UInt16 callBackAfterFrameCount, M4OSA_Bool loop) ;\r
+ M4OSA_UInt16 callBackAfterFrameCount, M4OSA_Bool loop) ;\r
\r
M4OSA_ERR stopPreview();\r
\r
M4OSA_ERR renderPreviewFrame(const sp<Surface> &surface,\r
- VideoEditor_renderPreviewFrameStr* pFrameInfo);\r
+ VideoEditor_renderPreviewFrameStr* pFrameInfo,\r
+ VideoEditorCurretEditInfo *pCurrEditInfo);\r
\r
M4OSA_ERR clearSurface(const sp<Surface> &surface,\r
VideoEditor_renderPreviewFrameStr* pFrameInfo);\r
\r
M4OSA_Void setJniCallback(void* cookie,\r
- jni_progress_callback_fct callbackFct);\r
+ jni_progress_callback_fct callbackFct);\r
\r
M4OSA_ERR setPreviewFrameRenderingMode(M4xVSS_MediaRendering mode,\r
- M4VIDEOEDITING_VideoFrameSize outputVideoSize);\r
+ M4VIDEOEDITING_VideoFrameSize outputVideoSize);\r
\r
private:\r
sp<VideoEditorPlayer> mVePlayer[NBPLAYER_INSTANCES];\r