diff options
| author | Yiwei Zhang <zzyiwei@google.com> | 2018-08-21 15:13:36 -0700 |
|---|---|---|
| committer | Yiwei Zhang <zzyiwei@google.com> | 2018-08-21 17:40:20 -0700 |
| commit | 5d2ca663c2144548f4236060732fe07eec6a0273 (patch) | |
| tree | 95b6d4d66b3ede7d3d987ae483e2b518b6168bbf /cmds | |
| parent | 3e49917579411b540b770d0edf3987944fb443da (diff) | |
| download | frameworks_av-5d2ca663c2144548f4236060732fe07eec6a0273.tar.gz frameworks_av-5d2ca663c2144548f4236060732fe07eec6a0273.tar.bz2 frameworks_av-5d2ca663c2144548f4236060732fe07eec6a0273.zip | |
Get screenrecord to exclude black cutout
Bug: b/112869712
Test: adb shell screenrecord
Change-Id: I69b497b81cfca93a8ad9ed46f25cdbb5dda81a89
Merged-In: I69b497b81cfca93a8ad9ed46f25cdbb5dda81a89
Diffstat (limited to 'cmds')
| -rw-r--r-- | cmds/screenrecord/screenrecord.cpp | 80 |
1 files changed, 48 insertions, 32 deletions
diff --git a/cmds/screenrecord/screenrecord.cpp b/cmds/screenrecord/screenrecord.cpp index 46035159ee..d1859d1422 100644 --- a/cmds/screenrecord/screenrecord.cpp +++ b/cmds/screenrecord/screenrecord.cpp @@ -140,14 +140,6 @@ static status_t configureSignals() { } /* - * Returns "true" if the device is rotated 90 degrees. - */ -static bool isDeviceRotated(int orientation) { - return orientation != DISPLAY_ORIENTATION_0 && - orientation != DISPLAY_ORIENTATION_180; -} - -/* * Configures and starts the MediaCodec encoder. Obtains an input surface * from the codec. */ @@ -242,22 +234,11 @@ static status_t setDisplayProjection( const DisplayInfo& mainDpyInfo) { // Set the region of the layer stack we're interested in, which in our - // case is "all of it". If the app is rotated (so that the width of the - // app is based on the height of the display), reverse width/height. - bool deviceRotated = isDeviceRotated(mainDpyInfo.orientation); - uint32_t sourceWidth, sourceHeight; - if (!deviceRotated) { - sourceWidth = mainDpyInfo.w; - sourceHeight = mainDpyInfo.h; - } else { - ALOGV("using rotated width/height"); - sourceHeight = mainDpyInfo.w; - sourceWidth = mainDpyInfo.h; - } - Rect layerStackRect(sourceWidth, sourceHeight); + // case is "all of it". + Rect layerStackRect(mainDpyInfo.w, mainDpyInfo.h); // We need to preserve the aspect ratio of the display. - float displayAspect = (float) sourceHeight / (float) sourceWidth; + float displayAspect = (float) mainDpyInfo.h / (float) mainDpyInfo.w; // Set the way we map the output onto the display surface (which will @@ -334,6 +315,22 @@ static status_t prepareVirtualDisplay(const DisplayInfo& mainDpyInfo, } /* + * Set the main display width and height to the actual width and height + */ +static status_t getActualDisplaySize(const sp<IBinder>& mainDpy, DisplayInfo* mainDpyInfo) { + Rect viewport; + status_t err = SurfaceComposerClient::getDisplayViewport(mainDpy, &viewport); + if (err != NO_ERROR) { + fprintf(stderr, "ERROR: unable to get display viewport\n"); + return err; + } + mainDpyInfo->w = viewport.width(); + mainDpyInfo->h = viewport.height(); + + return NO_ERROR; +} + +/* * Runs the MediaCodec encoder, sending the output to the MediaMuxer. The * input frames are coming from the virtual display as fast as SurfaceFlinger * wants to send them. @@ -403,14 +400,22 @@ static status_t runEncoder(const sp<MediaCodec>& encoder, // useful stuff is hard to get at without a Dalvik VM. err = SurfaceComposerClient::getDisplayInfo(mainDpy, &mainDpyInfo); - if (err != NO_ERROR) { + if (err == NO_ERROR) { + err = getActualDisplaySize(mainDpy, &mainDpyInfo); + if (err != NO_ERROR) { + fprintf(stderr, "ERROR: unable to set actual display size\n"); + return err; + } + + if (orientation != mainDpyInfo.orientation) { + ALOGD("orientation changed, now %d", mainDpyInfo.orientation); + SurfaceComposerClient::Transaction t; + setDisplayProjection(t, virtualDpy, mainDpyInfo); + t.apply(); + orientation = mainDpyInfo.orientation; + } + } else { ALOGW("getDisplayInfo(main) failed: %d", err); - } else if (orientation != mainDpyInfo.orientation) { - ALOGD("orientation changed, now %d", mainDpyInfo.orientation); - SurfaceComposerClient::Transaction t; - setDisplayProjection(t, virtualDpy, mainDpyInfo); - t.apply(); - orientation = mainDpyInfo.orientation; } } @@ -552,6 +557,10 @@ static FILE* prepareRawOutput(const char* fileName) { return rawFp; } +static inline uint32_t floorToEven(uint32_t num) { + return num & ~1; +} + /* * Main "do work" start point. * @@ -579,6 +588,13 @@ static status_t recordScreen(const char* fileName) { fprintf(stderr, "ERROR: unable to get display characteristics\n"); return err; } + + err = getActualDisplaySize(mainDpy, &mainDpyInfo); + if (err != NO_ERROR) { + fprintf(stderr, "ERROR: unable to set actual display size\n"); + return err; + } + if (gVerbose) { printf("Main display is %dx%d @%.2ffps (orientation=%u)\n", mainDpyInfo.w, mainDpyInfo.h, mainDpyInfo.fps, @@ -586,12 +602,12 @@ static status_t recordScreen(const char* fileName) { fflush(stdout); } - bool rotated = isDeviceRotated(mainDpyInfo.orientation); + // Encoder can't take odd number as config if (gVideoWidth == 0) { - gVideoWidth = rotated ? mainDpyInfo.h : mainDpyInfo.w; + gVideoWidth = floorToEven(mainDpyInfo.w); } if (gVideoHeight == 0) { - gVideoHeight = rotated ? mainDpyInfo.w : mainDpyInfo.h; + gVideoHeight = floorToEven(mainDpyInfo.h); } // Configure and start the encoder. |
