#include <mm_error.h>
#include "mm_player_priv.h"
#include "mm_player_360.h"
+#include "mm_player_utils.h"
#include <gst/gst.h>
#include <gst/gstutils.h>
#include <glib.h>
-int _mmplayer_360_set_enable(MMHandleType player, bool enable)
+static bool
+__mmplayer_check_video_360_used(mm_player_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) {
+ return true;
+}
+
+static bool
+__mmplayer_check_audio_sink(mm_player_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_set_enable(MMHandleType hplayer, bool enable)
+{
+ mm_player_t* player = (mm_player_t*) hplayer;
+ int ret = MM_ERROR_NONE;
+
+ 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 = enable;
+
+ 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),
+ g_object_set(G_OBJECT(player->pipeline->videobin[MMPLAYER_V_360].gst),
"passthrough", !enable, NULL);
+
return MM_ERROR_NONE;
}
- return ((mm_player_t*) player)->state < MM_PLAYER_STATE_READY ? MM_ERROR_NONE : MM_ERROR_PLAYER_INTERNAL;
+ if (player->state >= MM_PLAYER_STATE_READY) {
+ LOGE("the content is not for 360 playback.");
+ ret = MM_ERROR_PLAYER_INTERNAL;
+ }
+
+ MMPLAYER_FLEAVE();
+ return ret;
}
-int _mmplayer_360_is_enabled(MMHandleType player, bool *enabled)
+int _mmplayer_360_is_enabled(MMHandleType hplayer, bool *enabled)
{
- if (((mm_player_t*) player)->state < MM_PLAYER_STATE_READY) {
- *enabled = ((mm_player_t*) player)->is_video360_enabled;
+ mm_player_t* player = (mm_player_t*) hplayer;
+
+ 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->state < MM_PLAYER_STATE_READY) {
+ *enabled = player->is_video360_enabled;
return MM_ERROR_NONE;
}
- 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),
+ if (player->is_content_spherical && __mmplayer_check_video_360_used(player)) {
+ g_object_get(G_OBJECT(player->pipeline->videobin[MMPLAYER_V_360].gst),
"passthrough", enabled, NULL);
*enabled = !(*enabled);
return MM_ERROR_NONE;
}
+ LOGE("the content is not for 360 playback.");
+
+ MMPLAYER_FLEAVE();
return MM_ERROR_PLAYER_INTERNAL;
}
-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)
+ mm_player_t* player = (mm_player_t*) hplayer;
+ int ret = MM_ERROR_NONE;
+
+ MMPLAYER_FENTER();
+ MMPLAYER_RETURN_VAL_IF_FAIL(player, MM_ERROR_PLAYER_NOT_INITIALIZED);
+
+ if (yaw > M_PI || yaw < -M_PI || pitch > M_PI_2 || pitch < -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),
+ if (__mmplayer_check_video_360_used(player)) {
+ 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),
+ 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;
+ if (player->state >= MM_PLAYER_STATE_READY) {
+ LOGE("the content is not for 360 playback.");
+ ret = MM_ERROR_PLAYER_INTERNAL;
+ }
+
+ MMPLAYER_FLEAVE();
+ return ret;
}
-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;
+ mm_player_t* player = (mm_player_t*) hplayer;
+ int yaw_degrees = 0;
+ int pitch_degrees = 0;
+
+ MMPLAYER_FENTER();
+ MMPLAYER_RETURN_VAL_IF_FAIL(player, MM_ERROR_PLAYER_NOT_INITIALIZED);
+ MMPLAYER_RETURN_VAL_IF_FAIL(yaw && pitch, MM_ERROR_INVALID_ARGUMENT);
+
+ LOGD("state %s, spherical info %d",
+ MMPLAYER_STATE_GET_NAME(MMPLAYER_CURRENT_STATE(player)), player->is_content_spherical);
- 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;
+ if (player->state < MM_PLAYER_STATE_READY) {
+ *yaw = player->video360_yaw_radians;
+ *pitch = player->video360_pitch_radians;
return MM_ERROR_NONE;
}
- 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),
+ 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;
return MM_ERROR_NONE;
}
+ LOGE("the content is not for 360 playback.");
+
+ MMPLAYER_FLEAVE();
return MM_ERROR_PLAYER_INTERNAL;
}
-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)
+ mm_player_t* player = (mm_player_t*) hplayer;
+ int ret = MM_ERROR_NONE;
+
+ 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;
+ }
+
+ LOGD("state %s, spherical info %d",
+ MMPLAYER_STATE_GET_NAME(MMPLAYER_CURRENT_STATE(player)), player->is_content_spherical);
- ((mm_player_t*) player)->video360_zoom = level;
+ player->video360_zoom = level;
- 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),
+ 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;
+ if (player->state >= MM_PLAYER_STATE_READY) {
+ LOGE("the content is not for 360 playback.");
+ ret = MM_ERROR_PLAYER_INTERNAL;
+ }
+
+ MMPLAYER_FLEAVE();
+ return ret;
}
-int _mmplayer_360_get_zoom(MMHandleType player, float *level)
+int _mmplayer_360_get_zoom(MMHandleType hplayer, float *level)
{
- float current_zoom;
+ mm_player_t* player = (mm_player_t*) hplayer;
+ float current_zoom = 0.0;
+
+ MMPLAYER_FENTER();
+ MMPLAYER_RETURN_VAL_IF_FAIL(player, MM_ERROR_PLAYER_NOT_INITIALIZED);
+ MMPLAYER_RETURN_VAL_IF_FAIL(level, MM_ERROR_INVALID_ARGUMENT);
+
+ LOGD("state %s, spherical info %d",
+ MMPLAYER_STATE_GET_NAME(MMPLAYER_CURRENT_STATE(player)), player->is_content_spherical);
- if (((mm_player_t*) player)->state < MM_PLAYER_STATE_READY) {
- *level = ((mm_player_t*) player)->video360_zoom;
+ if (player->state < MM_PLAYER_STATE_READY) {
+ *level = player->video360_zoom;
return MM_ERROR_NONE;
}
- 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),
+ 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;
return MM_ERROR_NONE;
}
+ LOGE("the content is not for 360 playback.");
+
+ MMPLAYER_FLEAVE();
return MM_ERROR_PLAYER_INTERNAL;
}
-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)
+ mm_player_t* player = (mm_player_t*) hplayer;
+ int ret = MM_ERROR_NONE;
+
+ 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),
+ 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;
+ if (player->state >= MM_PLAYER_STATE_READY) {
+ LOGE("the content is not for 360 playback.");
+ ret = MM_ERROR_PLAYER_INTERNAL;
+ }
+
+ MMPLAYER_FLEAVE();
+ return ret;
}
-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;
+ mm_player_t* player = (mm_player_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);
+
+ 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) {
+ *horizontal_degrees = player->video360_horizontal_fov;
+ *vertical_degrees = player->video360_vertical_fov;
return MM_ERROR_NONE;
}
- 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),
+ 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);
return MM_ERROR_NONE;
}
+ LOGE("the content is not for 360 playback.");
+
+ MMPLAYER_FLEAVE();
return MM_ERROR_PLAYER_INTERNAL;
}