From 6c64b0ced04f6956a6f78334974970a98954213b Mon Sep 17 00:00:00 2001 From: Gilbok Lee Date: Mon, 12 Dec 2016 19:12:31 +0900 Subject: [PATCH] Release signal before state change. [Version] 0.10.2 [Profile] Common, Mobile, TV [Issue Type] Fix bugs Change-Id: I62032d7d4abf084ea40ff1ac25e636c375c486f0 --- packaging/libmm-transcode.spec | 3 +- transcode/include/mm_transcode_internal.h | 1 + transcode/mm_transcode.c | 7 ++ transcode/mm_transcode_pipeline.c | 169 +++++++++++++++++------------- 4 files changed, 107 insertions(+), 73 deletions(-) diff --git a/packaging/libmm-transcode.spec b/packaging/libmm-transcode.spec index 058b8fc..c810332 100644 --- a/packaging/libmm-transcode.spec +++ b/packaging/libmm-transcode.spec @@ -1,6 +1,6 @@ Name: libmm-transcode Summary: Multimedia Framework Video Transcode Library -Version: 0.10.1 +Version: 0.10.2 Release: 0 Group: System/Libraries License: Apache-2.0 @@ -68,7 +68,6 @@ rm -rf %{buildroot} %files %manifest %{name}.manifest /usr/share/license/%{name} -%manifest libmm-transcode.manifest %defattr(-,root,root,-) %{_libdir}/*.so* diff --git a/transcode/include/mm_transcode_internal.h b/transcode/include/mm_transcode_internal.h index 7365842..e5b4ba1 100644 --- a/transcode/include/mm_transcode_internal.h +++ b/transcode/include/mm_transcode_internal.h @@ -246,6 +246,7 @@ gboolean _mm_cb_print_position(handle_s *handle); gboolean _mm_cb_transcode_bus(GstBus * bus, GstMessage * message, gpointer userdata); const gchar* _mm_check_media_type(GstCaps *caps); int _mm_cleanup_encodebin(handle_s *handle); +int _mm_cleanup_signal(handle_s *handle); int _mm_cleanup_pipeline(handle_s *handle); int _mm_decodesrcbin_create(handle_s *handle); int _mm_decodesrcbin_link(handle_s *handle); diff --git a/transcode/mm_transcode.c b/transcode/mm_transcode.c index 8070a89..f09caaf 100755 --- a/transcode/mm_transcode.c +++ b/transcode/mm_transcode.c @@ -370,6 +370,13 @@ int mm_transcode_destroy(MMHandleType MMHandle) debug_error("Fail to create Last Queue"); return MM_ERROR_INVALID_ARGUMENT; } + ret = _mm_cleanup_signal(handle); + if (ret == MM_ERROR_NONE) { + debug_log("Success - CleanUp Signal"); + } else { + debug_error("ERROR - CleanUp Signal"); + return ret; + } ret = _mm_transcode_state_change(handle, GST_STATE_NULL); if (ret != MM_ERROR_NONE) { diff --git a/transcode/mm_transcode_pipeline.c b/transcode/mm_transcode_pipeline.c index 3c2969c..a6ece61 100755 --- a/transcode/mm_transcode_pipeline.c +++ b/transcode/mm_transcode_pipeline.c @@ -81,7 +81,7 @@ int _mm_cleanup_encodebin(handle_s *handle) return ret; } -int _mm_cleanup_pipeline(handle_s *handle) +int _mm_cleanup_signal(handle_s *handle) { int ret = MM_ERROR_NONE; @@ -90,11 +90,64 @@ int _mm_cleanup_pipeline(handle_s *handle) return MM_ERROR_INVALID_ARGUMENT; } - if (!handle->decoder_vidp) { - debug_error("[ERROR] - handle decoder video process bin"); + if (!handle->property) { + debug_error("[ERROR] - handle property"); return MM_ERROR_TRANSCODE_INTERNAL; } + if (handle->property->progress_cb) { + handle->property->progress_cb = NULL; + handle->property->progress_cb_param = NULL; + } + + if (handle->property->completed_cb) { + handle->property->completed_cb = NULL; + handle->property->completed_cb_param= NULL; + } + + if (handle->property->audio_cb_probe_id) { + g_source_remove(handle->property->audio_cb_probe_id); + handle->property->audio_cb_probe_id = 0; + debug_log("g_source_remove (audio_cb_probe_id)"); + } + + if (handle->property->video_cb_probe_id) { + g_source_remove(handle->property->video_cb_probe_id); + handle->property->video_cb_probe_id = 0; + debug_log("g_source_remove (video_cb_probe_id)"); + } + + if (handle->property->progrss_event_id) { + g_source_remove(handle->property->progrss_event_id); + handle->property->progrss_event_id = 0; + debug_log("g_source_remove (progrss_event_id)"); + } + + if (handle->encodebin->audio_event_probe_id) { + g_source_remove(handle->encodebin->audio_event_probe_id); + handle->encodebin->audio_event_probe_id = 0; + debug_log("g_source_remove (audio_event_probe_id)"); + } + + if (handle->encodebin->video_event_probe_id) { + g_source_remove(handle->encodebin->video_event_probe_id); + handle->encodebin->video_event_probe_id = 0; + debug_log("g_source_remove (video_event_probe_id)"); + } + + return ret; +} + + +int _mm_cleanup_pipeline(handle_s *handle) +{ + int ret = MM_ERROR_NONE; + + if (!handle) { + debug_error("[ERROR] - handle"); + return MM_ERROR_INVALID_ARGUMENT; + } + if (!handle->property) { debug_error("[ERROR] - handle property"); return MM_ERROR_TRANSCODE_INTERNAL; @@ -144,53 +197,57 @@ int _mm_cleanup_pipeline(handle_s *handle) } /* release videopad */ - if (handle->decoder_vidp->decvideosinkpad) { - gst_object_unref(GST_OBJECT(handle->decoder_vidp->decvideosinkpad)); - handle->decoder_vidp->decvideosinkpad = NULL; - debug_log("Success - gt_object_unref (decvideosinkpad)"); - } + if (handle->decoder_vidp) { + if (handle->decoder_vidp->decvideosinkpad) { + gst_object_unref(GST_OBJECT(handle->decoder_vidp->decvideosinkpad)); + handle->decoder_vidp->decvideosinkpad = NULL; + debug_log("Success - gt_object_unref (decvideosinkpad)"); + } - if (handle->decoder_vidp->decvideosrcpad) { - gst_object_unref(GST_OBJECT(handle->decoder_vidp->decvideosrcpad)); - handle->decoder_vidp->decvideosrcpad = NULL; - debug_log("Success - gst_object_unref (decvideosrcpad)"); - } + if (handle->decoder_vidp->decvideosrcpad) { + gst_object_unref(GST_OBJECT(handle->decoder_vidp->decvideosrcpad)); + handle->decoder_vidp->decvideosrcpad = NULL; + debug_log("Success - gst_object_unref (decvideosrcpad)"); + } - if (handle->decoder_vidp->srcdecvideopad) { - gst_object_unref(GST_OBJECT(handle->decoder_vidp->srcdecvideopad)); - handle->decoder_vidp->srcdecvideopad = NULL; - debug_log("Success - gst_object_unref (srcdecvideopad)"); - } + if (handle->decoder_vidp->srcdecvideopad) { + gst_object_unref(GST_OBJECT(handle->decoder_vidp->srcdecvideopad)); + handle->decoder_vidp->srcdecvideopad = NULL; + debug_log("Success - gst_object_unref (srcdecvideopad)"); + } - if (handle->decoder_vidp->sinkdecvideopad) { - gst_object_unref(GST_OBJECT(handle->decoder_vidp->sinkdecvideopad)); - handle->decoder_vidp->sinkdecvideopad = NULL; - debug_log("Success - gst_object_unref (sinkdecvideopad)"); + if (handle->decoder_vidp->sinkdecvideopad) { + gst_object_unref(GST_OBJECT(handle->decoder_vidp->sinkdecvideopad)); + handle->decoder_vidp->sinkdecvideopad = NULL; + debug_log("Success - gst_object_unref (sinkdecvideopad)"); + } } /* release audiopad */ - if (handle->decoder_audp->decaudiosinkpad) { - gst_object_unref(GST_OBJECT(handle->decoder_audp->decaudiosinkpad)); - handle->decoder_audp->decaudiosinkpad = NULL; - debug_log("Success - gst_object_unref (decaudiosinkpad)"); - } + if (handle->decoder_audp) { + if (handle->decoder_audp->decaudiosinkpad) { + gst_object_unref(GST_OBJECT(handle->decoder_audp->decaudiosinkpad)); + handle->decoder_audp->decaudiosinkpad = NULL; + debug_log("Success - gst_object_unref (decaudiosinkpad)"); + } - if (handle->decoder_audp->decaudiosrcpad) { - gst_object_unref(GST_OBJECT(handle->decoder_audp->decaudiosrcpad)); - handle->decoder_audp->decaudiosrcpad = NULL; - debug_log("Success - gst_object_unref (decaudiosrcpad)"); - } + if (handle->decoder_audp->decaudiosrcpad) { + gst_object_unref(GST_OBJECT(handle->decoder_audp->decaudiosrcpad)); + handle->decoder_audp->decaudiosrcpad = NULL; + debug_log("Success - gst_object_unref (decaudiosrcpad)"); + } - if (handle->decoder_audp->srcdecaudiopad) { - gst_object_unref(GST_OBJECT(handle->decoder_audp->srcdecaudiopad)); - handle->decoder_audp->srcdecaudiopad = NULL; - debug_log("Success - gst_object_unref (srcdecaudiopad)"); - } + if (handle->decoder_audp->srcdecaudiopad) { + gst_object_unref(GST_OBJECT(handle->decoder_audp->srcdecaudiopad)); + handle->decoder_audp->srcdecaudiopad = NULL; + debug_log("Success - gst_object_unref (srcdecaudiopad)"); + } - if (handle->decoder_audp->sinkdecaudiopad) { - gst_object_unref(GST_OBJECT(handle->decoder_audp->sinkdecaudiopad)); - handle->decoder_audp->sinkdecaudiopad = NULL; - debug_log("Success - gst_object_unref (sinkdecaudiopad)"); + if (handle->decoder_audp->sinkdecaudiopad) { + gst_object_unref(GST_OBJECT(handle->decoder_audp->sinkdecaudiopad)); + handle->decoder_audp->sinkdecaudiopad = NULL; + debug_log("Success - gst_object_unref (sinkdecaudiopad)"); + } } if (_mm_cleanup_encodebin(handle) != MM_ERROR_NONE) { @@ -212,36 +269,6 @@ int _mm_cleanup_pipeline(handle_s *handle) debug_log("Success - gst_object_unref (pipeline)"); } - if (handle->property->audio_cb_probe_id) { - g_source_remove(handle->property->audio_cb_probe_id); - handle->property->audio_cb_probe_id = 0; - debug_log("g_source_remove (audio_cb_probe_id)"); - } - - if (handle->property->video_cb_probe_id) { - g_source_remove(handle->property->video_cb_probe_id); - handle->property->video_cb_probe_id = 0; - debug_log("g_source_remove (video_cb_probe_id)"); - } - - if (handle->property->progrss_event_id) { - g_source_remove(handle->property->progrss_event_id); - handle->property->progrss_event_id = 0; - debug_log("g_source_remove (progrss_event_id)"); - } - - if (handle->encodebin->audio_event_probe_id) { - g_source_remove(handle->encodebin->audio_event_probe_id); - handle->encodebin->audio_event_probe_id = 0; - debug_log("g_source_remove (audio_event_probe_id)"); - } - - if (handle->encodebin->video_event_probe_id) { - g_source_remove(handle->encodebin->video_event_probe_id); - handle->encodebin->video_event_probe_id = 0; - debug_log("g_source_remove (video_event_probe_id)"); - } - TRANSCODE_FREE(handle->property->mux); TRANSCODE_FREE(handle->property->venc); TRANSCODE_FREE(handle->property->aenc); -- 2.7.4