From 0afb670106f70d28ec07b98d260d7899ea114760 Mon Sep 17 00:00:00 2001 From: Hyunil Date: Thu, 20 Sep 2018 09:22:54 +0900 Subject: Apply video rotate considering orientation of content Change-Id: I2306434fde08dc2423c833fb19d8f0498aad5694 Signed-off-by: Hyunil --- src/mm_evas_renderer.c | 118 +++++++++++++++++++++++++++++++++++++++++++++++-- 1 file changed, 115 insertions(+), 3 deletions(-) (limited to 'src/mm_evas_renderer.c') diff --git a/src/mm_evas_renderer.c b/src/mm_evas_renderer.c index 133e299..f5eacd5 100644 --- a/src/mm_evas_renderer.c +++ b/src/mm_evas_renderer.c @@ -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; -- cgit v1.2.3