summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorAndreas Huber <andih@google.com>2013-09-10 19:10:50 +0000
committerAndroid (Google) Code Review <android-gerrit@google.com>2013-09-10 19:10:50 +0000
commitc728c580fc512b50604f33f1c4581c500062b245 (patch)
treead21347137a394b82325a2497a2c6d7cb655413f
parent7f9551f75eedb3e4e1fe8feaaba48d8080635fc4 (diff)
parente6d5794b2173ffe4e7509203a91778b19eafcebf (diff)
downloadframeworks_av-c728c580fc512b50604f33f1c4581c500062b245.zip
frameworks_av-c728c580fc512b50604f33f1c4581c500062b245.tar.gz
frameworks_av-c728c580fc512b50604f33f1c4581c500062b245.tar.bz2
Merge "Make sure the encoder instance is safely release()'d before its" into klp-dev
-rw-r--r--cmds/screenrecord/screenrecord.cpp24
1 files changed, 22 insertions, 2 deletions
diff --git a/cmds/screenrecord/screenrecord.cpp b/cmds/screenrecord/screenrecord.cpp
index 94c626a..68289a5 100644
--- a/cmds/screenrecord/screenrecord.cpp
+++ b/cmds/screenrecord/screenrecord.cpp
@@ -159,6 +159,9 @@ static status_t prepareEncoder(float displayFps, sp<MediaCodec>* pCodec,
err = codec->configure(format, NULL, NULL,
MediaCodec::CONFIGURE_FLAG_ENCODE);
if (err != NO_ERROR) {
+ codec->release();
+ codec.clear();
+
fprintf(stderr, "ERROR: unable to configure codec (err=%d)\n", err);
return err;
}
@@ -167,6 +170,9 @@ static status_t prepareEncoder(float displayFps, sp<MediaCodec>* pCodec,
sp<IGraphicBufferProducer> bufferProducer;
err = codec->createInputSurface(&bufferProducer);
if (err != NO_ERROR) {
+ codec->release();
+ codec.clear();
+
fprintf(stderr,
"ERROR: unable to create encoder input surface (err=%d)\n", err);
return err;
@@ -175,6 +181,9 @@ static status_t prepareEncoder(float displayFps, sp<MediaCodec>* pCodec,
ALOGV("Starting codec");
err = codec->start();
if (err != NO_ERROR) {
+ codec->release();
+ codec.clear();
+
fprintf(stderr, "ERROR: unable to start codec (err=%d)\n", err);
return err;
}
@@ -453,6 +462,7 @@ static status_t recordScreen(const char* fileName) {
sp<MediaCodec> encoder;
sp<IGraphicBufferProducer> bufferProducer;
err = prepareEncoder(mainDpyInfo.fps, &encoder, &bufferProducer);
+
if (err != NO_ERROR && !gSizeSpecified) {
if (gVideoWidth != kFallbackWidth && gVideoHeight != kFallbackHeight) {
ALOGV("Retrying with 720p");
@@ -470,7 +480,12 @@ static status_t recordScreen(const char* fileName) {
// Configure virtual display.
sp<IBinder> dpy;
err = prepareVirtualDisplay(mainDpyInfo, bufferProducer, &dpy);
- if (err != NO_ERROR) return err;
+ if (err != NO_ERROR) {
+ encoder->release();
+ encoder.clear();
+
+ return err;
+ }
// Configure, but do not start, muxer.
sp<MediaMuxer> muxer = new MediaMuxer(fileName,
@@ -481,7 +496,12 @@ static status_t recordScreen(const char* fileName) {
// Main encoder loop.
err = runEncoder(encoder, muxer);
- if (err != NO_ERROR) return err;
+ if (err != NO_ERROR) {
+ encoder->release();
+ encoder.clear();
+
+ return err;
+ }
if (gVerbose) {
printf("Stopping encoder and muxer\n");