summaryrefslogtreecommitdiffstats
path: root/cmds
diff options
context:
space:
mode:
authorAndreas Huber <andih@google.com>2013-09-06 12:03:26 -0700
committerAndreas Huber <andih@google.com>2013-09-06 12:03:26 -0700
commite6d5794b2173ffe4e7509203a91778b19eafcebf (patch)
treea2f6d729e72a7386220b8c38099f47fe54e0c21c /cmds
parent36a8b33a23dca49c9617e97e22e5d67f7d25c268 (diff)
downloadframeworks_av-e6d5794b2173ffe4e7509203a91778b19eafcebf.zip
frameworks_av-e6d5794b2173ffe4e7509203a91778b19eafcebf.tar.gz
frameworks_av-e6d5794b2173ffe4e7509203a91778b19eafcebf.tar.bz2
Make sure the encoder instance is safely release()'d before its
reference count drops to 0. Change-Id: I6601226e2754f17e964125cacf02dc02cfbf6231 related-to-bug: 10150263
Diffstat (limited to 'cmds')
-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");