static void __mmplayer_gst_caps_notify_cb(GstPad *pad, GParamSpec *unused, gpointer data);
static void __mmplayer_audio_stream_send_data(mmplayer_t *player, mmplayer_audio_stream_buff_t *a_buffer);
static void __mmplayer_initialize_storage_info(mmplayer_t *player, mmplayer_path_type_e path_type);
-static int __resource_release_cb(mm_resource_manager_h rm, mm_resource_manager_res_h res, void *user_data);
static gboolean __mmplayer_update_duration_value(mmplayer_t *player);
static gboolean __mmplayer_update_audio_attrs(mmplayer_t *player, MMHandleType attrs);
static gboolean __mmplayer_update_video_attrs(mmplayer_t *player, MMHandleType attrs);
return MM_ERROR_PLAYER_NO_OP;
}
+static int __mmplayer_acquire_hw_resource(mmplayer_t *player, mmplayer_resource_type_e type)
+{
+ int rm_ret = MM_RESOURCE_MANAGER_ERROR_NONE;
+ mm_resource_manager_res_type_e rm_res_type = MM_RESOURCE_MANAGER_RES_TYPE_MAX;
+
+ switch (type) {
+ case MMPLAYER_RESOURCE_TYPE_VIDEO_DECODER:
+ rm_res_type = MM_RESOURCE_MANAGER_RES_TYPE_VIDEO_DECODER;
+ break;
+ case MMPLAYER_RESOURCE_TYPE_VIDEO_OVERLAY:
+ rm_res_type = MM_RESOURCE_MANAGER_RES_TYPE_VIDEO_OVERLAY;
+ break;
+ default:
+ LOGE("invalid mmplayer resource type %d", type);
+ return MM_ERROR_PLAYER_INTERNAL;
+ }
+
+ if (player->hw_resource[type] != NULL) {
+ LOGD("[%d type] resource was already acquired", type);
+ return MM_ERROR_NONE;
+ }
+
+ LOGD("mark for acquire [%d type] resource", type);
+ rm_ret = mm_resource_manager_mark_for_acquire(player->resource_manager,
+ rm_res_type, MM_RESOURCE_MANAGER_RES_VOLUME_FULL, &player->hw_resource[type]);
+ if (rm_ret != MM_RESOURCE_MANAGER_ERROR_NONE) {
+ LOGE("failed to mark resource for acquire, ret(0x%x)", rm_ret);
+ return MM_ERROR_PLAYER_INTERNAL;
+ }
+
+ rm_ret = mm_resource_manager_commit(player->resource_manager);
+ if (rm_ret != MM_RESOURCE_MANAGER_ERROR_NONE) {
+ LOGE("failed to commit of resource, ret(0x%x)", rm_ret);
+ return MM_ERROR_PLAYER_INTERNAL;
+ }
+
+ MMPLAYER_FLEAVE();
+ return MM_ERROR_NONE;
+}
+
+static int __mmplayer_release_hw_resource(mmplayer_t *player, mmplayer_resource_type_e type)
+{
+ int rm_ret = MM_RESOURCE_MANAGER_ERROR_NONE;
+
+ MMPLAYER_FENTER();
+
+ if (player->hw_resource[type] == NULL) {
+ LOGD("there is no acquired [%d type] resource", type);
+ return MM_ERROR_NONE;
+ }
+
+ LOGD("mark for release [%d type] resource", type);
+ rm_ret = mm_resource_manager_mark_for_release(player->resource_manager, player->hw_resource[type]);
+ if (rm_ret != MM_RESOURCE_MANAGER_ERROR_NONE) {
+ LOGE("failed to mark resource for release, ret(0x%x)", rm_ret);
+ return MM_ERROR_PLAYER_INTERNAL;
+ }
+
+ player->hw_resource[type] = NULL;
+
+ rm_ret = mm_resource_manager_commit(player->resource_manager);
+ if (rm_ret != MM_RESOURCE_MANAGER_ERROR_NONE) {
+ LOGE("failed to commit of resource, ret(0x%x)", rm_ret);
+ return MM_ERROR_PLAYER_INTERNAL;
+ }
+
+ MMPLAYER_FLEAVE();
+ return MM_ERROR_NONE;
+}
+
static void
__mmplayer_initialize_gapless_play(mmplayer_t *player)
{
int i;
- int rm_ret = MM_RESOURCE_MANAGER_ERROR_NONE;
MMPLAYER_FENTER();
player->audio_decoders = NULL;
}
- /* release video decoder resource */
- if (player->video_decoder_resource != NULL) {
- rm_ret = mm_resource_manager_mark_for_release(player->resource_manager,
- player->video_decoder_resource);
- if (rm_ret != MM_RESOURCE_MANAGER_ERROR_NONE) {
- LOGE("failed to mark the video decoder resource for release, ret(0x%x)", rm_ret);
- return;
- }
- player->video_decoder_resource = NULL;
- }
-
- rm_ret = mm_resource_manager_commit(player->resource_manager);
- if (rm_ret != MM_RESOURCE_MANAGER_ERROR_NONE) {
- LOGE("failed to commit of resource, ret(0x%x)", rm_ret);
- return;
- }
+ __mmplayer_release_hw_resource(player, MMPLAYER_RESOURCE_TYPE_VIDEO_DECODER);
MMPLAYER_FLEAVE();
}
mm_attrs_get_int_by_name(player->attrs, "display_surface_type", &surface_type);
LOGD("display_surface_type (%d)", surface_type);
- if (surface_type == MM_DISPLAY_SURFACE_OVERLAY && player->video_overlay_resource == NULL) {
- LOGD("mark video overlay for acquire");
- if (mm_resource_manager_mark_for_acquire(player->resource_manager,
- MM_RESOURCE_MANAGER_RES_TYPE_VIDEO_OVERLAY,
- MM_RESOURCE_MANAGER_RES_VOLUME_FULL,
- &player->video_overlay_resource)
- != MM_RESOURCE_MANAGER_ERROR_NONE) {
- LOGE("could not mark video_overlay resource for acquire");
- goto ERROR;
- }
+ if ((surface_type == MM_DISPLAY_SURFACE_OVERLAY) &&
+ (__mmplayer_acquire_hw_resource(player, MMPLAYER_RESOURCE_TYPE_VIDEO_OVERLAY) != MM_ERROR_NONE)) {
+ LOGE("failed to acquire video overlay resource");
+ goto ERROR;
}
player->interrupted_by_resource = FALSE;
- if (mm_resource_manager_commit(player->resource_manager) !=
- MM_RESOURCE_MANAGER_ERROR_NONE) {
- LOGE("could not acquire resources for video playing");
- goto ERROR;
- }
-
if (__mmplayer_gst_create_video_sink_bin(player, caps, surface_type) != MM_ERROR_NONE) {
LOGE("failed to create videobin. continuing without video");
goto ERROR;
{
gboolean disable_overlay = FALSE;
mmplayer_t *player = (mmplayer_t *)hplayer;
- int ret = MM_ERROR_NONE;
MMPLAYER_FENTER();
MMPLAYER_RETURN_VAL_IF_FAIL(player && player->pipeline, MM_ERROR_PLAYER_NOT_INITIALIZED);
g_object_set(player->pipeline->videobin[MMPLAYER_V_SINK].gst, "disable-overlay", TRUE, NULL);
/* release overlay resource */
- if (player->video_overlay_resource != NULL) {
- ret = mm_resource_manager_mark_for_release(player->resource_manager,
- player->video_overlay_resource);
- if (ret != MM_RESOURCE_MANAGER_ERROR_NONE) {
- LOGE("failed to mark overlay resource for release, ret(0x%x)", ret);
- goto ERROR;
- }
- player->video_overlay_resource = NULL;
- }
-
- ret = mm_resource_manager_commit(player->resource_manager);
- if (ret != MM_RESOURCE_MANAGER_ERROR_NONE) {
- LOGE("failed to commit acquiring of overlay resource, ret(0x%x)", ret);
+ if (__mmplayer_release_hw_resource(player, MMPLAYER_RESOURCE_TYPE_VIDEO_OVERLAY) != MM_ERROR_NONE) {
+ LOGE("failed to release overlay resource");
goto ERROR;
}
} else {
- /* mark video overlay for acquire */
- if (player->video_overlay_resource == NULL) {
- ret = mm_resource_manager_mark_for_acquire(player->resource_manager,
- MM_RESOURCE_MANAGER_RES_TYPE_VIDEO_OVERLAY,
- MM_RESOURCE_MANAGER_RES_VOLUME_FULL,
- &player->video_overlay_resource);
- if (ret != MM_RESOURCE_MANAGER_ERROR_NONE) {
- LOGE("could not prepare for video_overlay resource");
- goto ERROR;
- }
- }
-
- player->interrupted_by_resource = FALSE;
- /* acquire resources for video overlay */
- ret = mm_resource_manager_commit(player->resource_manager);
- if (ret != MM_RESOURCE_MANAGER_ERROR_NONE) {
- LOGE("could not acquire resources for video playing");
+ if (__mmplayer_acquire_hw_resource(player, MMPLAYER_RESOURCE_TYPE_VIDEO_OVERLAY) != MM_ERROR_NONE) {
+ LOGE("failed to acquire video overlay resource");
goto ERROR;
}
+ player->interrupted_by_resource = FALSE;
LOGD("enable overlay");
__mmplayer_video_param_set_display_overlay(player);
FAILED: /* with CMD UNLOCKED */
return FALSE;
-INTERRUPT: /* with CMD LOCKED, released at mrp_resource_release_cb() */
+INTERRUPT: /* with CMD LOCKED, will do UNLOCK at __resource_release_cb() */
return TRUE;
}
void *user_data)
{
mmplayer_t *player = NULL;
+ MMMessageParamType msg = {0, };
+ gint64 pos = 0;
+ mmplayer_resource_type_e res_idx = MMPLAYER_RESOURCE_TYPE_MAX;
MMPLAYER_FENTER();
- if (user_data == NULL) {
- LOGE("- user_data is null");
+ if (!user_data) {
+ LOGE("user_data is null");
return FALSE;
}
player = (mmplayer_t *)user_data;
- /* do something to release resource here.
- * player stop and interrupt forwarding */
if (!__mmplayer_can_do_interrupt(player)) {
LOGW("no need to interrupt, so leave");
+ /* FIXME: there is no way to avoid releasing resource. */
+ return FALSE;
+ }
+
+ player->interrupted_by_resource = TRUE;
+
+ /* get last play position */
+ if (_mmplayer_gst_get_position(player, &pos) == MM_ERROR_NONE) {
+ msg.union_type = MM_MSG_UNION_TIME;
+ msg.time.elapsed = pos;
+ MMPLAYER_POST_MSG(player, MM_MESSAGE_PLAY_POSITION, &msg);
} else {
- MMMessageParamType msg = {0, };
- gint64 pos = 0;
+ LOGW("failed to get play position.");
+ }
- player->interrupted_by_resource = TRUE;
+ LOGD("video resource conflict so, resource will be freed by unrealizing");
+ if (_mmplayer_unrealize((MMHandleType)player) != MM_ERROR_NONE)
+ LOGE("failed to unrealize");
- /* get last play position */
- if (_mmplayer_gst_get_position(player, &pos) != MM_ERROR_NONE) {
- LOGW("failed to get play position.");
- } else {
- msg.union_type = MM_MSG_UNION_TIME;
- msg.time.elapsed = pos;
- MMPLAYER_POST_MSG(player, MM_MESSAGE_PLAY_POSITION, &msg);
- }
- LOGD("video resource conflict so, resource will be freed by unrealizing");
- if (_mmplayer_unrealize((MMHandleType)player))
- LOGW("failed to unrealize");
+ /* lock is called in __mmplayer_can_do_interrupt() */
+ MMPLAYER_CMD_UNLOCK(player);
- /* lock is called in __mmplayer_can_do_interrupt() */
- MMPLAYER_CMD_UNLOCK(player);
+ for (res_idx = MMPLAYER_RESOURCE_TYPE_VIDEO_DECODER; res_idx < MMPLAYER_RESOURCE_TYPE_MAX; res_idx++) {
+ player->hw_resource[res_idx] = NULL;
}
- if (res == player->video_overlay_resource)
- player->video_overlay_resource = FALSE;
- else
- player->video_decoder_resource = FALSE;
-
MMPLAYER_FLEAVE();
-
- return FALSE;
+ return TRUE; /* release all the resources */
}
static void
/* unrealize pipeline */
ret = __mmplayer_gst_unrealize(player);
- /* set asm stop if success */
- if (MM_ERROR_NONE == ret) {
- if (!player->interrupted_by_resource) {
- if (player->video_decoder_resource != NULL) {
- ret = mm_resource_manager_mark_for_release(player->resource_manager,
- player->video_decoder_resource);
- if (ret != MM_RESOURCE_MANAGER_ERROR_NONE)
- LOGE("failed to mark decoder resource for release, ret(0x%x)", ret);
- else
- player->video_decoder_resource = NULL;
- }
-
- if (player->video_overlay_resource != NULL) {
- ret = mm_resource_manager_mark_for_release(player->resource_manager,
- player->video_overlay_resource);
- if (ret != MM_RESOURCE_MANAGER_ERROR_NONE)
- LOGE("failed to mark overlay resource for release, ret(0x%x)", ret);
- else
- player->video_overlay_resource = NULL;
- }
-
- ret = mm_resource_manager_commit(player->resource_manager);
- if (ret != MM_RESOURCE_MANAGER_ERROR_NONE)
- LOGE("failed to commit resource releases, ret(0x%x)", ret);
- }
- } else
- LOGE("failed and don't change asm state to stop");
+ if (!player->interrupted_by_resource) {
+ if ((__mmplayer_release_hw_resource(player, MMPLAYER_RESOURCE_TYPE_VIDEO_DECODER) != MM_ERROR_NONE) ||
+ (__mmplayer_release_hw_resource(player, MMPLAYER_RESOURCE_TYPE_VIDEO_OVERLAY) != MM_ERROR_NONE))
+ LOGE("failed to release video resources");
+ }
MMPLAYER_FLEAVE();
-
return ret;
}
(g_strrstr(factory_name, player->ini.videocodec_element_hw))) {
/* mark video decoder for acquire */
- if (player->video_decoder_resource == NULL) {
- if (mm_resource_manager_mark_for_acquire(player->resource_manager,
- MM_RESOURCE_MANAGER_RES_TYPE_VIDEO_DECODER,
- MM_RESOURCE_MANAGER_RES_VOLUME_FULL,
- &player->video_decoder_resource)
- != MM_RESOURCE_MANAGER_ERROR_NONE) {
- LOGE("could not mark video_decoder resource for acquire");
- ret = GST_AUTOPLUG_SELECT_SKIP;
- goto DONE;
- }
- } else {
+ if (player->hw_resource[MMPLAYER_RESOURCE_TYPE_VIDEO_DECODER] != NULL) {
LOGW("video decoder resource is already acquired, skip it.");
ret = GST_AUTOPLUG_SELECT_SKIP;
goto DONE;
}
- player->interrupted_by_resource = FALSE;
- /* acquire resources for video playing */
- if (mm_resource_manager_commit(player->resource_manager)
- != MM_RESOURCE_MANAGER_ERROR_NONE) {
- LOGE("could not acquire resources for video decoding");
+ if (__mmplayer_acquire_hw_resource(player, MMPLAYER_RESOURCE_TYPE_VIDEO_DECODER) != MM_ERROR_NONE) {
+ LOGE("failed to acquire video decoder resource");
ret = GST_AUTOPLUG_SELECT_SKIP;
goto DONE;
}
+ player->interrupted_by_resource = FALSE;
}
/* update codec info */