#define GST_TIME_TO_MSEC(t) (t == GST_CLOCK_TIME_NONE ? t : (int)(((GstClockTime)(t)) / GST_MSECOND))
-static int __ms_change_resources_state(media_streamer_s *ms_streamer, media_streamer_state_e state);
static int __ms_change_dpm_policy_state(media_streamer_s *ms_streamer, media_streamer_state_e state);
static gboolean __ms_resource_node_find(gpointer key, gpointer value, gpointer user_data);
static int __ms_resource_release_cb(mm_resource_manager_h rm,
mm_resource_manager_res_h resource_h, void *user_data);
+static int __ms_acquire_resources(media_streamer_s *ms_streamer);
+static int __ms_release_resources(media_streamer_s *ms_streamer);
int ms_set_state(media_streamer_s *ms_streamer, media_streamer_state_e state)
{
if (!ms_streamer->is_interrupted) {
ret = __ms_change_dpm_policy_state(ms_streamer, state);
if (MEDIA_STREAMER_ERROR_NONE != ret) {
- ms_error("Failed to change policy state for streamer %p", ms_streamer);
- return MEDIA_STREAMER_ERROR_INVALID_OPERATION;
- }
- ret = __ms_change_resources_state(ms_streamer, state);
- if (MEDIA_STREAMER_ERROR_NONE != ret) {
- ms_error("Failed to change resources state for streamer %p", ms_streamer);
+ ms_error("Failed to change DPM policy state for streamer %p", ms_streamer);
return MEDIA_STREAMER_ERROR_INVALID_OPERATION;
}
}
switch (state) {
case MEDIA_STREAMER_STATE_NONE:
- /*
- * Media streamer must be in IDLE state
- * Unlink and destroy all bins and elements.
- */
+ /* Media streamer must be in IDLE state
+ * Unlink and destroy all bins and elements. */
ret = ms_element_set_state(ms_streamer->pipeline, GST_STATE_NULL);
- ms_streamer->pend_state = 0;
+ ms_streamer->pend_state = MEDIA_STREAMER_STATE_NONE;
ms_streamer->state = state;
break;
- case MEDIA_STREAMER_STATE_IDLE:
- /*
- * Unlink all gst_elements, set pipeline into state NULL
- */
+ case MEDIA_STREAMER_STATE_IDLE: {
+ media_streamer_state_e prev_pend_state = ms_streamer->pend_state;
+ /* Unlink all gst_elements, set pipeline into state NULL. */
ret = ms_element_set_state(ms_streamer->pipeline, GST_STATE_NULL);
ms_bin_foreach_elements(GST_BIN(ms_streamer->sink_bin), ms_element_unlock_state, ms_streamer);
+
+ /* Release resources, use ms_pipeline_get_state() to ensure the state change finish. */
+ ms_pipeline_get_state(ms_streamer);
+ if (!ms_streamer->is_interrupted &&
+ (prev_pend_state == MEDIA_STREAMER_STATE_READY ||
+ prev_pend_state == MEDIA_STREAMER_STATE_PAUSED ||
+ prev_pend_state == MEDIA_STREAMER_STATE_PLAYING)) {
+ ret = __ms_release_resources(ms_streamer);
+ }
ms_streamer->pend_state = MEDIA_STREAMER_STATE_IDLE;
ms_streamer->state = state;
-
break;
+ }
case MEDIA_STREAMER_STATE_READY:
+ /* Acquire resources */
+ if (!ms_streamer->is_interrupted &&
+ ms_streamer->pend_state == MEDIA_STREAMER_STATE_IDLE) {
+ ret = __ms_acquire_resources(ms_streamer);
+ if (MEDIA_STREAMER_ERROR_NONE != ret) {
+ ms_error("Failed to change resources state for streamer %p", ms_streamer);
+ return MEDIA_STREAMER_ERROR_INVALID_OPERATION;
+ }
+ }
+
ret = ms_element_set_state(ms_streamer->pipeline, GST_STATE_PAUSED);
ms_streamer->pend_state = MEDIA_STREAMER_STATE_READY;
break;
return ret;
}
-int ms_acquire_resources(media_streamer_s *ms_streamer)
+static int __ms_acquire_resources(media_streamer_s *ms_streamer)
{
int ret = MEDIA_STREAMER_ERROR_NONE;
return MEDIA_STREAMER_ERROR_NONE;
}
-int ms_release_resources(media_streamer_s *ms_streamer)
+static int __ms_release_resources(media_streamer_s *ms_streamer)
{
int ret = MEDIA_STREAMER_ERROR_NONE;
return MEDIA_STREAMER_ERROR_NONE;
}
-static int __ms_change_resources_state(media_streamer_s *ms_streamer, media_streamer_state_e state)
-{
- int ret = MEDIA_STREAMER_ERROR_NONE;
-
- ms_debug_fenter();
-
- ms_retvm_if(ms_streamer == NULL, MEDIA_STREAMER_ERROR_INVALID_PARAMETER, "ms_streamer is NULL");
-
- /* According to state graph we need to handle only this two states
- * and different transitions into them */
- if (state == MEDIA_STREAMER_STATE_IDLE) {
- switch (ms_streamer->pend_state) {
- case MEDIA_STREAMER_STATE_READY:
- case MEDIA_STREAMER_STATE_PAUSED:
- case MEDIA_STREAMER_STATE_PLAYING:
- /* After unprepare function call */
- ret = ms_release_resources(ms_streamer);
- break;
- case MEDIA_STREAMER_STATE_NONE:
- case MEDIA_STREAMER_STATE_IDLE:
- /* We do not considering double unprepare */
- case MEDIA_STREAMER_STATE_SEEKING:
- default:
- break;
- }
- } else if (state == MEDIA_STREAMER_STATE_READY) {
- switch (ms_streamer->pend_state) {
- case MEDIA_STREAMER_STATE_IDLE:
- /* After prepare function */
- ret = ms_acquire_resources(ms_streamer);
- break;
- case MEDIA_STREAMER_STATE_PAUSED:
- case MEDIA_STREAMER_STATE_PLAYING:
- case MEDIA_STREAMER_STATE_NONE:
- case MEDIA_STREAMER_STATE_SEEKING:
- default:
- break;
- }
- } else {
- ms_debug("Ignoring state for resource managements");
- }
-
- ms_debug_fleave();
-
- return ret;
-}
-
//LCOV_EXCL_START
static gboolean __ms_resource_node_find(gpointer key, gpointer value, gpointer user_data)
{