summaryrefslogtreecommitdiff
authortimyao <tim.yao@amlogic.com>2012-05-04 03:59:20 (GMT)
committer timyao <tim.yao@amlogic.com>2012-05-04 04:01:53 (GMT)
commit2839e202eef6130b219bfda18867abd9115fcc8a (patch)
treef34959e7ce1e3ee160bcfb8b8fcea80d2800cfd4
parent9fdf0d9fc7539b507d440d1100c11b4d1162bd17 (diff)
downloadhwcomposer-2839e202eef6130b219bfda18867abd9115fcc8a.zip
hwcomposer-2839e202eef6130b219bfda18867abd9115fcc8a.tar.gz
hwcomposer-2839e202eef6130b219bfda18867abd9115fcc8a.tar.bz2
Add video overlay composing
Diffstat
-rw-r--r--Android.mk7
-rw-r--r--hwcomposer.cpp49
2 files changed, 51 insertions, 5 deletions
diff --git a/Android.mk b/Android.mk
index ca49683..2054a3d 100644
--- a/Android.mk
+++ b/Android.mk
@@ -8,8 +8,13 @@ LOCAL_PATH := $(call my-dir)
# /system/lib/hw/hwcomposer.amlogic.so
include $(CLEAR_VARS)
LOCAL_MODULE_PATH := $(TARGET_OUT_SHARED_LIBRARIES)/hw
-LOCAL_SHARED_LIBRARIES := liblog libEGL
+LOCAL_SHARED_LIBRARIES := liblog libEGL libamavutils
LOCAL_SRC_FILES := hwcomposer.cpp
+
+AMPLAYER_APK_DIR=$(TOP)/packages/amlogic/LibPlayer/
+LOCAL_C_INCLUDES +=\
+ $(AMPLAYER_APK_DIR)/amavutils/include
+
LOCAL_MODULE := hwcomposer.amlogic
LOCAL_CFLAGS:= -DLOG_TAG=\"hwcomposer\"
LOCAL_MODULE_TAGS := optional
diff --git a/hwcomposer.cpp b/hwcomposer.cpp
index 1a5e64c..6775bd4 100644
--- a/hwcomposer.cpp
+++ b/hwcomposer.cpp
@@ -28,9 +28,12 @@
#include <EGL/egl.h>
-// for private_handle_t and PRIV_FLAGS_VIDEO_HOLE
+// for private_handle_t
#include "../../libhardware/modules/gralloc/gralloc_priv.h"
+#include <Amavutils.h>
+#include <system/graphics.h>
+
/*****************************************************************************/
struct hwc_context_t {
@@ -61,6 +64,32 @@ hwc_module_t HAL_MODULE_INFO_SYM = {
/*****************************************************************************/
+static void hwc_overlay_compose(hwc_layer_t const* l) {
+ int angle;
+ switch (l->transform) {
+ case 0:
+ angle = 0;
+ break;
+ case HAL_TRANSFORM_ROT_90:
+ angle = 90;
+ break;
+ case HAL_TRANSFORM_ROT_180:
+ angle = 180;
+ break;
+ case HAL_TRANSFORM_ROT_270:
+ angle = 270;
+ break;
+ default:
+ return;
+ }
+
+ amvideo_utils_set_virtual_position(l->displayFrame.left,
+ l->displayFrame.top,
+ l->displayFrame.right - l->displayFrame.left + 1,
+ l->displayFrame.bottom - l->displayFrame.top + 1,
+ angle);
+}
+
static void dump_layer(hwc_layer_t const* l) {
LOGD("\ttype=%d, flags=%08x, handle=%p, tr=%02x, blend=%04x, {%d,%d,%d,%d}, {%d,%d,%d,%d}",
l->compositionType, l->flags, l->handle, l->transform, l->blending,
@@ -79,6 +108,14 @@ static int hwc_prepare(hwc_composer_device_t *dev, hwc_layer_list_t* list) {
for (size_t i=0 ; i<list->numHwLayers ; i++) {
hwc_layer_t* l = &list->hwLayers[i];
//dump_layer(l);
+ if (l->handle) {
+ private_handle_t const* hnd = reinterpret_cast<private_handle_t const*>(l->handle);
+ if (hnd->flags & private_handle_t::PRIV_FLAGS_VIDEO_OVERLAY) {
+ l->hints = HWC_HINT_CLEAR_FB;
+ l->compositionType = HWC_OVERLAY;
+ continue;
+ }
+ }
l->compositionType = HWC_FRAMEBUFFER;
}
}
@@ -90,9 +127,13 @@ static int hwc_set(hwc_composer_device_t *dev,
hwc_surface_t sur,
hwc_layer_list_t* list)
{
- //for (size_t i=0 ; i<list->numHwLayers ; i++) {
- // dump_layer(&list->hwLayers[i]);
- //}
+ for (size_t i=0 ; i<list->numHwLayers ; i++) {
+ hwc_layer_t* l = &list->hwLayers[i];
+ if (l->compositionType == HWC_OVERLAY) {
+ dump_layer(l);
+ hwc_overlay_compose(l);
+ }
+ }
EGLBoolean sucess = eglSwapBuffers((EGLDisplay)dpy, (EGLSurface)sur);
if (!sucess) {