From 5e9dc94a3c7a42d77ab454b77e1350b6fa5d2c26 Mon Sep 17 00:00:00 2001 From: Andreas Huber Date: Fri, 21 Jan 2011 14:32:31 -0800 Subject: [PATCH] Properly rotate video that's marked as such and decoded to a surface. Change-Id: I1e9144db3447e58c99aac3f47702ad471678789c related-to-bug: 3378148 --- include/media/stagefright/OMXCodec.h | 2 ++ media/libstagefright/OMXCodec.cpp | 32 ++++++++++++++++++++++++++++ 2 files changed, 34 insertions(+) diff --git a/include/media/stagefright/OMXCodec.h b/include/media/stagefright/OMXCodec.h index f8daa4f03dcfb..3251c28d493be 100644 --- a/include/media/stagefright/OMXCodec.h +++ b/include/media/stagefright/OMXCodec.h @@ -305,6 +305,8 @@ private: void restorePatchedDataPointer(BufferInfo *info); + status_t applyRotation(); + OMXCodec(const OMXCodec &); OMXCodec &operator=(const OMXCodec &); }; diff --git a/media/libstagefright/OMXCodec.cpp b/media/libstagefright/OMXCodec.cpp index d842f65083c82..94694a3b74ff3 100644 --- a/media/libstagefright/OMXCodec.cpp +++ b/media/libstagefright/OMXCodec.cpp @@ -1680,6 +1680,33 @@ status_t OMXCodec::allocateBuffersOnPort(OMX_U32 portIndex) { return OK; } +status_t OMXCodec::applyRotation() { + sp meta = mSource->getFormat(); + + int32_t rotationDegrees; + if (!meta->findInt32(kKeyRotation, &rotationDegrees)) { + rotationDegrees = 0; + } + + uint32_t transform; + switch (rotationDegrees) { + case 0: transform = 0; break; + case 90: transform = HAL_TRANSFORM_ROT_90; break; + case 180: transform = HAL_TRANSFORM_ROT_180; break; + case 270: transform = HAL_TRANSFORM_ROT_270; break; + default: transform = 0; break; + } + + status_t err = OK; + + if (transform) { + err = native_window_set_buffers_transform( + mNativeWindow.get(), transform); + } + + return err; +} + status_t OMXCodec::allocateOutputBuffersFromNativeWindow() { // Get the number of buffers needed. OMX_PARAM_PORTDEFINITIONTYPE def; @@ -1713,6 +1740,11 @@ status_t OMXCodec::allocateOutputBuffersFromNativeWindow() { return err; } + err = applyRotation(); + if (err != OK) { + return err; + } + // Set up the native window. // XXX TODO: Get the gralloc usage flags from the OMX plugin! err = native_window_set_usage(