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;
}