libvideorender: CF2 add video rotate for weston [1/1]

PD#SWPL-185785

Problem:
add video rotate for weston

Solution:
1.add video rotate for weston
2.modify wl_compositor version to weston version

Verify:
ap222

Change-Id: Id4778826e991dba6e5e5d2af0926cda9d529ac6b
Signed-off-by: fei.deng <fei.deng@amlogic.com>
diff --git a/render_plugin.h b/render_plugin.h
index 44ed981..a1656cc 100644
--- a/render_plugin.h
+++ b/render_plugin.h
@@ -51,6 +51,7 @@
     PLUGIN_KEY_VIDEO_FRAME_RATE, //set/get video frame rate,value type is RenderFraction
     PLUGIN_KEY_KEEP_LAST_FRAME_ON_FLUSH, //set/get keep last frame when seeking,value type is int, 0 not keep, 1 keep
     PLUGIN_KEY_ZORDER, //set/get zorder of video plane,value type is int
+    PLUGIN_KEY_ROTATE_VIDEO, //set/get video rotate,value type is int,rotate from 0 to 360
 } PluginKey;
 
 /**
diff --git a/weston/wayland_display.cpp b/weston/wayland_display.cpp
index 529e2c5..4e11a6c 100644
--- a/weston/wayland_display.cpp
+++ b/weston/wayland_display.cpp
@@ -518,7 +518,7 @@
     TRACE(self->mLogCategory,"registryHandleGlobal,name:%u,interface:%s,version:%d",name,interface,version);
 
     if (strcmp (interface, "wl_compositor") == 0) {
-        self->mCompositor = (struct wl_compositor *)wl_registry_bind (registry, name, &wl_compositor_interface, 1/*MIN (version, 3)*/);
+        self->mCompositor = (struct wl_compositor *)wl_registry_bind (registry, name, &wl_compositor_interface, version);
     } else if (strcmp (interface, "wl_subcompositor") == 0) {
         self->mSubCompositor = (struct wl_subcompositor *)wl_registry_bind (registry, name, &wl_subcompositor_interface, 1);
     } else if (strcmp (interface, "xdg_wm_base") == 0) {
@@ -675,6 +675,7 @@
     mToSendKeepLastFrame = false;
     mVideoPlaneZorder = -1;
     mVideoPlaneZorderChanged = false;
+    mVideoRotateDegree = -1;
 }
 
 WaylandDisplay::~WaylandDisplay()
@@ -1481,6 +1482,27 @@
             mFirstPtsAfterFlush = buf->pts;
         }
 
+        //doing video rotate if needed
+        if (mVideoRotateDegree >= 0) {
+            /*weston accept degree map: transfer value->degree, 0->0, 1->90,2->180,3->270
+            detail see: enum wl_output_transform or search WL_OUTPUT_TRANSFORM_xxx*/
+            int transform = 0;
+            switch (mVideoRotateDegree) {
+                case 90: {
+                    transform = 1;
+                } break;
+                case 180: {
+                    transform = 2;
+                } break;
+                case 270: {
+                    transform = 3;
+                } break;
+                default:
+                    transform = 0;
+            }
+            wl_surface_set_buffer_transform(mVideoSurfaceWrapper, transform);
+        }
+
         wl_surface_damage (mVideoSurfaceWrapper, 0, 0, mVideoRect.w, mVideoRect.h);
         wl_surface_commit (mVideoSurfaceWrapper);
         //insert this buffer to committed weston buffer manager
diff --git a/weston/wayland_display.h b/weston/wayland_display.h
index 41de0e6..a0ce673 100644
--- a/weston/wayland_display.h
+++ b/weston/wayland_display.h
@@ -182,6 +182,14 @@
     int  getVideoPlaneZorder() {
         return mVideoPlaneZorder;
     };
+    void setRotateVideo(int degree)
+    {
+        mVideoRotateDegree = degree;
+    };
+    int  getRotateVideo()
+    {
+        return mVideoRotateDegree;
+    };
 
     void handleBufferReleaseCallback(WaylandBuffer *buf);
     void handleFrameDisplayedCallback(WaylandBuffer *buf);
@@ -405,6 +413,9 @@
     //freeze frame detected
     int64_t mLastDisplayFramePts; //weston starts displaying frame pts
     int64_t mLastDisplayFrameTimeUs; //weston starts displaying frame system time us
+
+    //video rotate degree
+    int mVideoRotateDegree; //default is -1,we often set 0,90,180,270
 };
 
 #endif /*__WAYLAND_DISPLAY_H__*/
\ No newline at end of file
diff --git a/weston/wayland_plugin.cpp b/weston/wayland_plugin.cpp
index dbcfaf8..d8c0a70 100644
--- a/weston/wayland_plugin.cpp
+++ b/weston/wayland_plugin.cpp
@@ -279,6 +279,11 @@
             INFO(mLogCategory,"set video plane zorder:%d",zorder);
             mDisplay->setVideoPlaneZorder(zorder);
         } break;
+        case PLUGIN_KEY_ROTATE_VIDEO: {
+            int degree = *(int *)(value);
+            INFO(mLogCategory,"set rotate video to:%d",degree);
+            mDisplay->setRotateVideo(degree);
+        } break;
     }
     return 0;
 }