diff options
author | Andreas Huber <andih@google.com> | 2013-09-06 12:03:26 -0700 |
---|---|---|
committer | Andreas Huber <andih@google.com> | 2013-09-06 12:03:26 -0700 |
commit | e6d5794b2173ffe4e7509203a91778b19eafcebf (patch) | |
tree | a2f6d729e72a7386220b8c38099f47fe54e0c21c /cmds/screenrecord/screenrecord.cpp | |
parent | 36a8b33a23dca49c9617e97e22e5d67f7d25c268 (diff) | |
download | frameworks_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/screenrecord/screenrecord.cpp')
-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"); |