Fix for 3409334 Movie Studio "Force Close" after importing a 3gp video
Change-Id: I37949140a6c37a0c2d04221e220e7e267b6c7a02
diff --git a/libvideoeditor/lvpp/PreviewPlayer.cpp b/libvideoeditor/lvpp/PreviewPlayer.cpp
index 59e9bce..ca025d0 100644
--- a/libvideoeditor/lvpp/PreviewPlayer.cpp
+++ b/libvideoeditor/lvpp/PreviewPlayer.cpp
@@ -15,6 +15,7 @@
* limitations under the License.
*/
+
#define LOG_NDEBUG 1
#define LOG_TAG "PreviewPlayer"
#include <utils/Log.h>
@@ -75,19 +76,34 @@
struct PreviewLocalRenderer : public PreviewPlayerRenderer {
- PreviewLocalRenderer(
+
+ static PreviewLocalRenderer* initPreviewLocalRenderer (
bool previewOnly,
OMX_COLOR_FORMATTYPE colorFormat,
const sp<Surface> &surface,
size_t displayWidth, size_t displayHeight,
size_t decodedWidth, size_t decodedHeight,
int32_t rotationDegrees = 0)
- : mTarget(NULL) {
- init(previewOnly,
+ {
+ PreviewLocalRenderer* mLocalRenderer = new
+ PreviewLocalRenderer(
+ previewOnly,
+ colorFormat,
+ surface,
+ displayWidth, displayHeight,
+ decodedWidth, decodedHeight,
+ rotationDegrees);
+
+ if ( mLocalRenderer->init(previewOnly,
colorFormat, surface,
displayWidth, displayHeight,
decodedWidth, decodedHeight,
- rotationDegrees);
+ rotationDegrees) != OK )
+ {
+ delete mLocalRenderer;
+ return NULL;
+ }
+ return mLocalRenderer;
}
virtual void render(MediaBuffer *buffer) {
@@ -114,7 +130,18 @@
private:
PreviewRenderer *mTarget;
- void init(
+ PreviewLocalRenderer(
+ bool previewOnly,
+ OMX_COLOR_FORMATTYPE colorFormat,
+ const sp<Surface> &surface,
+ size_t displayWidth, size_t displayHeight,
+ size_t decodedWidth, size_t decodedHeight,
+ int32_t rotationDegrees = 0)
+ : mTarget(NULL) {
+ }
+
+
+ int init(
bool previewOnly,
OMX_COLOR_FORMATTYPE colorFormat,
const sp<Surface> &surface,
@@ -126,16 +153,21 @@
PreviewLocalRenderer &operator=(const PreviewLocalRenderer &);;
};
-void PreviewLocalRenderer::init(
+int PreviewLocalRenderer::init(
bool previewOnly,
OMX_COLOR_FORMATTYPE colorFormat,
const sp<Surface> &surface,
size_t displayWidth, size_t displayHeight,
size_t decodedWidth, size_t decodedHeight,
int32_t rotationDegrees) {
- mTarget = new PreviewRenderer(
+
+ mTarget = PreviewRenderer::CreatePreviewRenderer (
colorFormat, surface, displayWidth, displayHeight,
decodedWidth, decodedHeight, rotationDegrees);
+ if (mTarget == M4OSA_NULL) {
+ return UNKNOWN_ERROR;
+ }
+ return OK;
}
PreviewPlayer::PreviewPlayer()
@@ -538,7 +570,7 @@
}
-void PreviewPlayer::initRenderer_l() {
+status_t PreviewPlayer::initRenderer_l() {
if (mSurface != NULL || mISurface != NULL) {
sp<MetaData> meta = mVideoSource->getFormat();
@@ -560,14 +592,21 @@
// allocate their buffers in local address space.
if(mVideoRenderer == NULL) {
- mVideoRenderer = new PreviewLocalRenderer(
+ mVideoRenderer = PreviewLocalRenderer:: initPreviewLocalRenderer (
false, // previewOnly
(OMX_COLOR_FORMATTYPE)format,
mSurface,
mOutputVideoWidth, mOutputVideoHeight,
mOutputVideoWidth, mOutputVideoHeight);
+
+ if ( mVideoRenderer == NULL )
+ {
+ return UNKNOWN_ERROR;
+ }
+ return OK;
}
}
+ return OK;
}
@@ -749,7 +788,10 @@
CHECK(meta->findInt32(kKeyHeight, &mReportedHeight));
if (mVideoRenderer != NULL) {
mVideoRendererIsPreview = false;
- initRenderer_l();
+ err = initRenderer_l();
+ if ( err != OK )
+ postStreamDoneEvent_l(err); // santosh
+
}
continue;
}
@@ -874,7 +916,9 @@
if (mVideoRendererIsPreview || mVideoRenderer == NULL) {
mVideoRendererIsPreview = false;
- initRenderer_l();
+ status_t err = initRenderer_l();
+ if ( err != OK )
+ postStreamDoneEvent_l(err); // santosh
}
// If timestamp exceeds endCutTime of clip, donot render
@@ -887,7 +931,7 @@
mVideoBuffer = NULL;
mFlags |= VIDEO_AT_EOS;
mFlags |= AUDIO_AT_EOS;
- LOGI("PreviewPlayer: onVideoEvent timeUs > mPlayEndTime; send EOS..");
+ LOGV("PreviewPlayer: onVideoEvent timeUs > mPlayEndTime; send EOS..");
if (mOverlayUpdateEventPosted) {
mOverlayUpdateEventPosted = false;
postOverlayUpdateEvent_l();
@@ -1114,7 +1158,7 @@
LOGV("onPrepareAsyncEvent");
if (mFlags & PREPARE_CANCELLED) {
- LOGI("LV PLAYER prepare was cancelled before doing anything");
+ LOGV("LV PLAYER prepare was cancelled before doing anything");
abortPrepare(UNKNOWN_ERROR);
return;
}
@@ -1275,7 +1319,7 @@
if (state->mLastVideoFrame && (mSurface != NULL || mISurface != NULL)) {
mVideoRenderer =
- new PreviewLocalRenderer(
+ PreviewLocalRenderer::initPreviewLocalRenderer(
true, // previewOnly
(OMX_COLOR_FORMATTYPE)state->mColorFormat,
mSurface,
@@ -1731,7 +1775,9 @@
if (mVideoRenderer != NULL) {
mVideoRendererIsPreview = false;
- initRenderer_l();
+ err = initRenderer_l();
+ if ( err != OK )
+ postStreamDoneEvent_l(err); // santosh
}
continue;
}
@@ -1756,7 +1802,6 @@
if((videoTimeUs/1000) < mPlayBeginTimeMsec) {
// buffers are before begin cut time
// ignore them
- //LOGI("PreviewPlayer: Ignoring buffers before begin cut time");
mVideoBuffer->release();
mVideoBuffer = NULL;
continue;