Apply video rotate considering orientation of content 86/189686/2 accepted/tizen/unified/20180927.174430 submit/tizen/20180921.075623 submit/tizen/20180927.044812
authorHyunil <hyunil46.park@samsung.com>
Thu, 20 Sep 2018 00:22:54 +0000 (09:22 +0900)
committerHyunil <hyunil46.park@samsung.com>
Thu, 20 Sep 2018 07:24:42 +0000 (16:24 +0900)
Change-Id: I2306434fde08dc2423c833fb19d8f0498aad5694
Signed-off-by: Hyunil <hyunil46.park@samsung.com>
packaging/libmm-evas-renderer.spec
src/include/mm_evas_renderer_private.h
src/mm_evas_renderer.c

index 48222d23fe1d5d22fdba9389fbf8193876c5bb0e..bc1d2aac4c0693ab0561f6083c489442b9252c8b 100644 (file)
@@ -1,6 +1,6 @@
 Name:       libmm-evas-renderer
 Summary:    Multimedia Framework Evas Renderer Library
-Version:    0.0.21
+Version:    0.0.22
 Release:    0
 Group:      Multimedia/Libraries
 License:    Apache-2.0
index d2716ab3a6d7fc5a9988223330249c5c53995634..93cddecb3d209322f752b3cc47d334ee62450ecc 100644 (file)
@@ -99,6 +99,7 @@ typedef struct {
        rect_info dst_roi;
        rect_info result;
        float ratio; /* need to set original ratio, not swap */
+       guint rotate;
        guint rotate_angle;
        guint display_geometry_method;
        guint pre_display_geometry_method;
index 133e29904c175c1eb3f559a6ad8bd808f552fe20..f5eacd5f3fe4a18a168a696f0d98c8118c99a4d1 100644 (file)
@@ -109,6 +109,8 @@ static void _mm_evas_renderer_update_geometry(mm_evas_info *evas_info);
 static int _mm_evas_renderer_retrieve_all_packets(mm_evas_info *evas_info, bool keep_screen);
 static int _mm_evas_renderer_make_flush_buffer(mm_evas_info *evas_info);
 static void _mm_evas_renderer_release_flush_buffer(mm_evas_info *evas_info);
+static void _mm_evas_renderer_get_video_angle(mm_evas_info *evas_info, int *rotate_angle, int *orientation);
+static void _mm_evas_renderer_update_rotate_angle(mm_evas_info *evas_info);
 static void _mm_evas_renderer_set_callback(mm_evas_info *evas_info);
 static void _mm_evas_renderer_unset_callback(mm_evas_info *evas_info);
 static void _mm_evas_renderer_set_evas_object_size(mm_evas_info *evas_info);
@@ -885,6 +887,9 @@ static void _mm_evas_renderer_update_geometry(mm_evas_info *evas_info)
        MMEVAS_RETURN_IF_FAIL(evas_info);
        MMEVAS_RETURN_IF_FAIL(evas_info->eo); //need to check evas object
 
+       /* get rotate angle with content orientaion */
+       _mm_evas_renderer_update_rotate_angle(evas_info);
+
        result.x = 0;
        result.y = 0;
        video_width = evas_info->w;
@@ -1180,6 +1185,113 @@ static void _mm_evas_renderer_release_flush_buffer(mm_evas_info *evas_info)
        return;
 }
 
+static void _mm_evas_renderer_get_video_angle(mm_evas_info *evas_info, int *rotate_angle, int *orientation)
+{
+       int rotate = 0;
+       media_packet_h packet = NULL;
+       media_packet_rotate_method_e org_orient = 0;
+
+       MMER_FENTER();
+
+       MMEVAS_RETURN_IF_FAIL(evas_info);
+       MMEVAS_RETURN_IF_FAIL(rotate_angle);
+       MMEVAS_RETURN_IF_FAIL(orientation);
+
+       rotate = evas_info->rotate;
+       LOGD("current rotate value: %d", rotate);
+
+       /* Counter clockwise */
+       switch (rotate) {
+       case EVAS_IMAGE_ORIENT_0: //0
+               *rotate_angle = 0;
+               break;
+       case EVAS_IMAGE_ORIENT_90: //1
+               *rotate_angle = 90;
+               break;
+       case EVAS_IMAGE_ORIENT_180: //2
+               *rotate_angle = 180;
+               break;
+       case EVAS_IMAGE_ORIENT_270: //3
+               *rotate_angle = 270;
+               break;
+       default:
+               LOGW("wrong angle type : %d", rotate);
+               break;
+       }
+       LOGD("check display angle: %d", *rotate_angle);
+
+       /* get content orientation */
+       packet = evas_info->pkt_info[evas_info->cur_idx].packet;
+       MMEVAS_RETURN_IF_FAIL(packet);
+
+       media_packet_get_rotate_method(packet, &org_orient);
+       LOGE("get content orientation : %d", org_orient);
+
+       /* Counter clockwise */
+       switch (org_orient) {
+       case MEDIA_PACKET_ROTATE_IDENTITY: //0
+               *orientation = 0;
+               break;
+       case MEDIA_PACKET_ROTATE_90: //1
+               *orientation = 90;
+               break;
+       case MEDIA_PACKET_ROTATE_180: //2
+               *orientation = 180;
+               break;
+       case MEDIA_PACKET_ROTATE_270: //3
+               *orientation = 270;
+               break;
+       default:
+               LOGW("wrong angle type : %d", org_orient);
+               break;
+       }
+       LOGD("check orientation: %d", *orientation);
+
+       return;
+}
+
+static void _mm_evas_renderer_update_rotate_angle(mm_evas_info *evas_info)
+{
+
+       int required_angle = 0; /* Angle required for straight view */
+       int rotate_angle = 0;
+       int orientation = 0;
+
+       MMER_FENTER();
+
+       MMEVAS_RETURN_IF_FAIL(evas_info);
+
+       _mm_evas_renderer_get_video_angle(evas_info, &rotate_angle, &orientation);
+
+       required_angle = 360 - orientation;
+       rotate_angle = (rotate_angle + required_angle) % 360;
+
+       /* chech if supported or not */
+       if (rotate_angle % 90) {
+               LOGD("not supported rotation angle = %d", rotate_angle);
+               return;
+       }
+
+       switch (rotate_angle) {
+       case 0:
+               evas_info->rotate_angle = EVAS_IMAGE_ORIENT_0;
+               break;
+       case 90:
+               evas_info->rotate_angle = EVAS_IMAGE_ORIENT_90;
+               break;
+       case 180:
+               evas_info->rotate_angle = EVAS_IMAGE_ORIENT_180;
+               break;
+       case 270:
+               evas_info->rotate_angle = EVAS_IMAGE_ORIENT_270;
+               break;
+       }
+
+       LOGD("setting rotation angle : %d", evas_info->rotate_angle);
+
+       return;
+}
+
 void mm_evas_renderer_write(media_packet_h packet, void *data)
 {
        MMER_FENTER();
@@ -1390,9 +1502,9 @@ int mm_evas_renderer_set_rotation(MMHandleType handle, int rotate)
                return MM_ERROR_EVASRENDER_INVALID_ARGUMENT;
        }
 
-       if (evas_info->rotate_angle != value) {
+       if (evas_info->rotate != value) {
                evas_info->update_needed = TRUE;
-               evas_info->rotate_angle = value;
+               evas_info->rotate = value;
        }
        evas_info->rendering_info_changed = TRUE;
 
@@ -1411,7 +1523,7 @@ int mm_evas_renderer_get_rotation(MMHandleType handle, int *rotate)
 
        MMEVAS_RETURN_VAL_IF_FAIL(evas_info, MM_ERROR_EVASRENDER_NOT_INITIALIZED);
 
-       switch (evas_info->rotate_angle) {
+       switch (evas_info->rotate) {
        case EVAS_IMAGE_ORIENT_0:
                *rotate = DEGREE_0;
                break;