diff options
author | Andreas Huber <andih@google.com> | 2013-09-10 19:10:50 +0000 |
---|---|---|
committer | Android (Google) Code Review <android-gerrit@google.com> | 2013-09-10 19:10:50 +0000 |
commit | c728c580fc512b50604f33f1c4581c500062b245 (patch) | |
tree | ad21347137a394b82325a2497a2c6d7cb655413f | |
parent | 7f9551f75eedb3e4e1fe8feaaba48d8080635fc4 (diff) | |
parent | e6d5794b2173ffe4e7509203a91778b19eafcebf (diff) | |
download | frameworks_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.cpp | 24 |
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"); |