X-Git-Url: http://review.tizen.org/git/?a=blobdiff_plain;f=src%2Fmm_player_360.c;h=6dfb03aff8acd5012d758f17b0ae2509dd1293dc;hb=431d06ac5a185fa17e2e7621dbff3ed2c142ffcd;hp=e9f230ae4847aa528702dc6ab8a836907184f56e;hpb=346c33317b293b8ec924fdd6526d98eba514b835;p=platform%2Fcore%2Fmultimedia%2Flibmm-player.git diff --git a/src/mm_player_360.c b/src/mm_player_360.c index e9f230a..6dfb03a 100644 --- a/src/mm_player_360.c +++ b/src/mm_player_360.c @@ -21,162 +21,293 @@ #include #include "mm_player_priv.h" #include "mm_player_360.h" +#include "mm_player_utils.h" #include #include #include -int _mmplayer_360_set_enable(MMHandleType player, bool enable) +static bool +__mmplayer_check_video_360_used(mmplayer_t *player) { - ((mm_player_t*) player)->is_video360_enabled = enable; + /* check video 360 plugin is created */ + MMPLAYER_RETURN_VAL_IF_FAIL(player && + player->pipeline && + player->pipeline->videobin && + player->pipeline->videobin[MMPLAYER_V_BIN].gst && + player->pipeline->videobin[MMPLAYER_V_360].gst, + false); - if (((mm_player_t*) player)->is_content_spherical && - ((mm_player_t*) player)->is_video360_plugin_used) { - /* We will get here if player is pending ready or ready and above */ - g_object_set(G_OBJECT(((mm_player_t*) player)->pipeline->videobin[MMPLAYER_V_360].gst), - "passthrough", !enable, NULL); - return MM_ERROR_NONE; + return true; +} + +static bool +__mmplayer_check_audio_sink(mmplayer_t *player) +{ + /* check audio sink is created */ + MMPLAYER_RETURN_VAL_IF_FAIL(player && + player->pipeline && + player->pipeline->videobin && + player->pipeline->videobin[MMPLAYER_A_BIN].gst && + player->pipeline->videobin[MMPLAYER_A_SINK].gst, + false); + + return true; +} + +int +_mmplayer_360_is_content_spherical(MMHandleType hplayer, bool *is_spherical) +{ + mmplayer_t *player = (mmplayer_t *)hplayer; + + MMPLAYER_FENTER(); + MMPLAYER_RETURN_VAL_IF_FAIL(player && player->pipeline, MM_ERROR_PLAYER_NOT_INITIALIZED); + MMPLAYER_RETURN_VAL_IF_FAIL(is_spherical, MM_ERROR_INVALID_ARGUMENT); + + LOGD("state %s, spherical info %d", + MMPLAYER_STATE_GET_NAME(MMPLAYER_CURRENT_STATE(player)), player->is_content_spherical); + + if (player->state < MM_PLAYER_STATE_READY) { + *is_spherical = false; + return MM_ERROR_PLAYER_INVALID_STATE; } - return ((mm_player_t*) player)->state < MM_PLAYER_STATE_READY ? MM_ERROR_NONE : MM_ERROR_PLAYER_INTERNAL; + *is_spherical = (bool)player->is_content_spherical; + + MMPLAYER_FLEAVE(); + return MM_ERROR_NONE; } -int _mmplayer_360_is_enabled(MMHandleType player, bool *enabled) +int +_mmplayer_360_set_enabled(MMHandleType hplayer, bool enabled) { - if (((mm_player_t*) player)->state < MM_PLAYER_STATE_READY) { - *enabled = ((mm_player_t*) player)->is_video360_enabled; - return MM_ERROR_NONE; + mmplayer_t *player = (mmplayer_t *)hplayer; + + MMPLAYER_FENTER(); + MMPLAYER_RETURN_VAL_IF_FAIL(player, MM_ERROR_PLAYER_NOT_INITIALIZED); + + LOGD("state %s, spherical info %d", + MMPLAYER_STATE_GET_NAME(MMPLAYER_CURRENT_STATE(player)), player->is_content_spherical); + + player->is_video360_enabled = (gboolean)enabled; + + if (player->is_content_spherical && __mmplayer_check_video_360_used(player)) { + /* We will get here if player is pending ready or ready and above */ + LOGD("set enabled %d", player->is_video360_enabled); + g_object_set(G_OBJECT(player->pipeline->videobin[MMPLAYER_V_360].gst), + "passthrough", !player->is_video360_enabled, NULL); } - if (((mm_player_t*) player)->is_content_spherical && - ((mm_player_t*) player)->is_video360_plugin_used) { - g_object_get(G_OBJECT(((mm_player_t*) player)->pipeline->videobin[MMPLAYER_V_360].gst), - "passthrough", enabled, NULL); - *enabled = !(*enabled); - return MM_ERROR_NONE; + MMPLAYER_FLEAVE(); + return MM_ERROR_NONE; +} + +int +_mmplayer_360_is_enabled(MMHandleType hplayer, bool *enabled) +{ + mmplayer_t *player = (mmplayer_t *)hplayer; + gboolean is_enabled; + + MMPLAYER_FENTER(); + MMPLAYER_RETURN_VAL_IF_FAIL(player, MM_ERROR_PLAYER_NOT_INITIALIZED); + MMPLAYER_RETURN_VAL_IF_FAIL(enabled, MM_ERROR_INVALID_ARGUMENT); + + LOGD("state %s, spherical info %d", + MMPLAYER_STATE_GET_NAME(MMPLAYER_CURRENT_STATE(player)), player->is_content_spherical); + + if (player->is_content_spherical && __mmplayer_check_video_360_used(player)) { + g_object_get(G_OBJECT(player->pipeline->videobin[MMPLAYER_V_360].gst), + "passthrough", &is_enabled, NULL); + *enabled = !((bool)is_enabled); + } else { + *enabled = (bool)player->is_video360_enabled; } - return MM_ERROR_PLAYER_INTERNAL; + LOGD("get enabled %d", *enabled); + + MMPLAYER_FLEAVE(); + return MM_ERROR_NONE; } -int _mmplayer_360_set_direction_of_view(MMHandleType player, float yaw, float pitch) +int +_mmplayer_360_set_direction_of_view(MMHandleType hplayer, float yaw, float pitch) { - if (yaw > M_PI || yaw < -M_PI || pitch > M_PI_2 || pitch < -M_PI_2) + mmplayer_t *player = (mmplayer_t *)hplayer; + + MMPLAYER_FENTER(); + MMPLAYER_RETURN_VAL_IF_FAIL(player, MM_ERROR_PLAYER_NOT_INITIALIZED); + + if (yaw > (float)(M_PI) || yaw < (float)(-M_PI) || pitch > (float)(M_PI_2) || pitch < (float)(-M_PI_2)) { + LOGE("invalid argument %f, %f", yaw, pitch); return MM_ERROR_INVALID_ARGUMENT; + } - ((mm_player_t*) player)->video360_yaw_radians = yaw; - ((mm_player_t*) player)->video360_pitch_radians = pitch; + LOGD("state %s, spherical info %d", + MMPLAYER_STATE_GET_NAME(MMPLAYER_CURRENT_STATE(player)), player->is_content_spherical); - if (((mm_player_t*) player)->is_content_spherical) { + player->video360_yaw_radians = yaw; + player->video360_pitch_radians = pitch; + + if (player->is_content_spherical) { /* We will get here if player is pending ready or ready and above */ - if (((mm_player_t*) player)->is_video360_plugin_used) { - g_object_set(G_OBJECT(((mm_player_t*) player)->pipeline->videobin[MMPLAYER_V_360].gst), - "pose-yaw", (int) (yaw * 180.0f / M_PI), - "pose-pitch", (int) (pitch * 180.0f / M_PI), NULL); + if (__mmplayer_check_video_360_used(player)) { + LOGD("set yaw %f, pitch %f for video", yaw, pitch); + g_object_set(G_OBJECT(player->pipeline->videobin[MMPLAYER_V_360].gst), + "pose-yaw", (int)(yaw * 180.0f / M_PI), + "pose-pitch", (int)(pitch * 180.0f / M_PI), NULL); } - if (((mm_player_t*) player)->is_openal_plugin_used) { - g_object_set(G_OBJECT(((mm_player_t*) player)->pipeline->audiobin[MMPLAYER_A_SINK].gst), - "source-orientation-y", (int) (yaw * 180.0f / M_PI), - "source-orientation-x", (int) (pitch * 180.0f / M_PI), NULL); + if (player->is_openal_plugin_used && __mmplayer_check_audio_sink(player)) { + g_object_set(G_OBJECT(player->pipeline->audiobin[MMPLAYER_A_SINK].gst), + "source-orientation-y", (int)(yaw * 180.0f / M_PI), + "source-orientation-x", (int)(pitch * 180.0f / M_PI), NULL); } - return MM_ERROR_NONE; } - return ((mm_player_t*) player)->state < MM_PLAYER_STATE_READY ? MM_ERROR_NONE : MM_ERROR_PLAYER_INTERNAL; + MMPLAYER_FLEAVE(); + return MM_ERROR_NONE; } -int _mmplayer_360_get_direction_of_view(MMHandleType player, float *yaw, float *pitch) +int +_mmplayer_360_get_direction_of_view(MMHandleType hplayer, float *yaw, float *pitch) { - int yaw_degrees, pitch_degrees; + mmplayer_t *player = (mmplayer_t *)hplayer; + int yaw_degrees = 0; + int pitch_degrees = 0; - if (((mm_player_t*) player)->state < MM_PLAYER_STATE_READY) { - *yaw = ((mm_player_t*) player)->video360_yaw_radians; - *pitch = ((mm_player_t*) player)->video360_pitch_radians; - return MM_ERROR_NONE; - } + MMPLAYER_FENTER(); + MMPLAYER_RETURN_VAL_IF_FAIL(player, MM_ERROR_PLAYER_NOT_INITIALIZED); + MMPLAYER_RETURN_VAL_IF_FAIL(yaw && pitch, MM_ERROR_INVALID_ARGUMENT); - if (((mm_player_t*) player)->is_content_spherical && - ((mm_player_t*) player)->is_video360_plugin_used) { - g_object_get(G_OBJECT(((mm_player_t*) player)->pipeline->videobin[MMPLAYER_V_360].gst), + LOGD("state %s, spherical info %d", + MMPLAYER_STATE_GET_NAME(MMPLAYER_CURRENT_STATE(player)), player->is_content_spherical); + + if (player->is_content_spherical && __mmplayer_check_video_360_used(player)) { + g_object_get(G_OBJECT(player->pipeline->videobin[MMPLAYER_V_360].gst), "pose-yaw", &yaw_degrees, "pose-pitch", &pitch_degrees, NULL); *yaw = M_PI * yaw_degrees / 180.0f; *pitch = M_PI * pitch_degrees / 180.0f; + + LOGD("get yaw %f, pitch %f", *yaw, *pitch); return MM_ERROR_NONE; } - return MM_ERROR_PLAYER_INTERNAL; + *yaw = player->video360_yaw_radians; + *pitch = player->video360_pitch_radians; + + MMPLAYER_FLEAVE(); + return MM_ERROR_NONE; } -int _mmplayer_360_set_zoom(MMHandleType player, float level) +int +_mmplayer_360_set_zoom(MMHandleType hplayer, float level) { - if (level < 1.0f || level > VIDEO360_MAX_ZOOM) + mmplayer_t *player = (mmplayer_t *)hplayer; + + MMPLAYER_FENTER(); + MMPLAYER_RETURN_VAL_IF_FAIL(player, MM_ERROR_PLAYER_NOT_INITIALIZED); + + if (level < 1.0f || level > VIDEO360_MAX_ZOOM) { + LOGE("invalid argument %f", level); return MM_ERROR_INVALID_ARGUMENT; + } - ((mm_player_t*) player)->video360_zoom = 1.0f / level; + LOGD("state %s, spherical info %d", + MMPLAYER_STATE_GET_NAME(MMPLAYER_CURRENT_STATE(player)), player->is_content_spherical); - if (((mm_player_t*) player)->is_content_spherical && - ((mm_player_t*) player)->is_video360_plugin_used) { + player->video360_zoom = level; + + if (player->is_content_spherical && __mmplayer_check_video_360_used(player)) { /* We will get here if player is pending ready or ready and above */ - g_object_set(G_OBJECT(((mm_player_t*) player)->pipeline->videobin[MMPLAYER_V_360].gst), + + LOGD("set level %f", level); + g_object_set(G_OBJECT(player->pipeline->videobin[MMPLAYER_V_360].gst), "zoom", 1.0f / level, NULL); - return MM_ERROR_NONE; } - return ((mm_player_t*) player)->state < MM_PLAYER_STATE_READY ? MM_ERROR_NONE : MM_ERROR_PLAYER_INTERNAL; + MMPLAYER_FLEAVE(); + return MM_ERROR_NONE; } -int _mmplayer_360_get_zoom(MMHandleType player, float *level) +int +_mmplayer_360_get_zoom(MMHandleType hplayer, float *level) { - float current_zoom; + mmplayer_t *player = (mmplayer_t *)hplayer; + float current_zoom = 0.0; - if (((mm_player_t*) player)->state < MM_PLAYER_STATE_READY) { - *level = 1.0f / ((mm_player_t*) player)->video360_zoom; - return MM_ERROR_NONE; - } + MMPLAYER_FENTER(); + MMPLAYER_RETURN_VAL_IF_FAIL(player, MM_ERROR_PLAYER_NOT_INITIALIZED); + MMPLAYER_RETURN_VAL_IF_FAIL(level, MM_ERROR_INVALID_ARGUMENT); - if (((mm_player_t*) player)->is_content_spherical && - ((mm_player_t*) player)->is_video360_plugin_used) { - g_object_get(G_OBJECT(((mm_player_t*) player)->pipeline->videobin[MMPLAYER_V_360].gst), + LOGD("state %s, spherical info %d", + MMPLAYER_STATE_GET_NAME(MMPLAYER_CURRENT_STATE(player)), player->is_content_spherical); + + if (player->is_content_spherical && __mmplayer_check_video_360_used(player)) { + g_object_get(G_OBJECT(player->pipeline->videobin[MMPLAYER_V_360].gst), "zoom", ¤t_zoom, NULL); *level = 1.0f / current_zoom; + + LOGD("get level %f", *level); return MM_ERROR_NONE; } - return MM_ERROR_PLAYER_INTERNAL; + *level = player->video360_zoom; + + MMPLAYER_FLEAVE(); + return MM_ERROR_NONE; } -int _mmplayer_360_set_field_of_view(MMHandleType player, int horizontal_degrees, int vertical_degrees) +int +_mmplayer_360_set_field_of_view(MMHandleType hplayer, int horizontal_degrees, int vertical_degrees) { - if (horizontal_degrees < 1 || horizontal_degrees > 360 || vertical_degrees < 1 || vertical_degrees > 180) + mmplayer_t *player = (mmplayer_t *)hplayer; + + MMPLAYER_FENTER(); + MMPLAYER_RETURN_VAL_IF_FAIL(player, MM_ERROR_PLAYER_NOT_INITIALIZED); + + if (horizontal_degrees < 1 || horizontal_degrees > 360 || vertical_degrees < 1 || vertical_degrees > 180) { + LOGE("invalid argument %d, %d", horizontal_degrees, vertical_degrees); return MM_ERROR_INVALID_ARGUMENT; + } + + LOGD("state %s, spherical info %d", + MMPLAYER_STATE_GET_NAME(MMPLAYER_CURRENT_STATE(player)), player->is_content_spherical); - ((mm_player_t*) player)->video360_horizontal_fov = horizontal_degrees; - ((mm_player_t*) player)->video360_vertical_fov = vertical_degrees; + player->video360_horizontal_fov = horizontal_degrees; + player->video360_vertical_fov = vertical_degrees; - if (((mm_player_t*) player)->is_content_spherical && - ((mm_player_t*) player)->is_video360_plugin_used) { + if (player->is_content_spherical && __mmplayer_check_video_360_used(player)) { /* We will get here if player is pending ready or ready and above */ - g_object_set(G_OBJECT(((mm_player_t*) player)->pipeline->videobin[MMPLAYER_V_360].gst), + LOGD("set h-fov %d, v-fov %d", horizontal_degrees, vertical_degrees); + g_object_set(G_OBJECT(player->pipeline->videobin[MMPLAYER_V_360].gst), "horizontal-fov", horizontal_degrees, "vertical-fov", vertical_degrees, NULL); - return MM_ERROR_NONE; } - return ((mm_player_t*) player)->state < MM_PLAYER_STATE_READY ? MM_ERROR_NONE : MM_ERROR_PLAYER_INTERNAL; + MMPLAYER_FLEAVE(); + return MM_ERROR_NONE; } -int _mmplayer_360_get_field_of_view(MMHandleType player, int *horizontal_degrees, int *vertical_degrees) +int +_mmplayer_360_get_field_of_view(MMHandleType hplayer, int *horizontal_degrees, int *vertical_degrees) { - if (((mm_player_t*) player)->state < MM_PLAYER_STATE_READY) { - *horizontal_degrees = ((mm_player_t*) player)->video360_horizontal_fov; - *vertical_degrees = ((mm_player_t*) player)->video360_vertical_fov; - return MM_ERROR_NONE; - } + mmplayer_t *player = (mmplayer_t *)hplayer; + + MMPLAYER_FENTER(); + MMPLAYER_RETURN_VAL_IF_FAIL(player, MM_ERROR_PLAYER_NOT_INITIALIZED); + MMPLAYER_RETURN_VAL_IF_FAIL(horizontal_degrees && vertical_degrees, MM_ERROR_INVALID_ARGUMENT); - if (((mm_player_t*) player)->is_content_spherical && - ((mm_player_t*) player)->is_video360_plugin_used) { - g_object_get(G_OBJECT(((mm_player_t*) player)->pipeline->videobin[MMPLAYER_V_360].gst), + LOGD("state %s, spherical info %d", + MMPLAYER_STATE_GET_NAME(MMPLAYER_CURRENT_STATE(player)), player->is_content_spherical); + + if (player->is_content_spherical && __mmplayer_check_video_360_used(player)) { + g_object_get(G_OBJECT(player->pipeline->videobin[MMPLAYER_V_360].gst), "horizontal-fov", horizontal_degrees, "vertical-fov", vertical_degrees, NULL); + + LOGD("get h-fov %d, v-fov %d", *horizontal_degrees, *vertical_degrees); return MM_ERROR_NONE; } - return MM_ERROR_PLAYER_INTERNAL; + *horizontal_degrees = player->video360_horizontal_fov; + *vertical_degrees = player->video360_vertical_fov; + + MMPLAYER_FLEAVE(); + return MM_ERROR_NONE; }