From e6d5794b2173ffe4e7509203a91778b19eafcebf Mon Sep 17 00:00:00 2001 From: Andreas Huber Date: Fri, 6 Sep 2013 12:03:26 -0700 Subject: Make sure the encoder instance is safely release()'d before its reference count drops to 0. Change-Id: I6601226e2754f17e964125cacf02dc02cfbf6231 related-to-bug: 10150263 --- cmds/screenrecord/screenrecord.cpp | 24 ++++++++++++++++++++++-- 1 file changed, 22 insertions(+), 2 deletions(-) (limited to 'cmds') 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* 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* pCodec, sp 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* 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 encoder; sp 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 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 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"); -- cgit v1.1