From 73ad39e7bec500798df70987a101dc971126c0f1 Mon Sep 17 00:00:00 2001 From: Gilbok Lee Date: Mon, 18 Jul 2016 16:49:03 +0900 Subject: [PATCH 01/16] Fix bug for read_sample function return buffer (when EOS state, read_sample retured garbage buffer) Change-Id: Ie8a598da01f8bb9ef36ebfc740be775538ac19ba --- packaging/capi-mediademuxer.spec | 2 +- src/port_gst/mediademuxer_port_gst.c | 18 ++++++++++++------ 2 files changed, 13 insertions(+), 7 deletions(-) diff --git a/packaging/capi-mediademuxer.spec b/packaging/capi-mediademuxer.spec index 3b40c83..471b8c7 100755 --- a/packaging/capi-mediademuxer.spec +++ b/packaging/capi-mediademuxer.spec @@ -1,6 +1,6 @@ Name: capi-mediademuxer Summary: A Media Demuxer library in Tizen Native API -Version: 0.1.3 +Version: 0.1.4 Release: 1 Group: Multimedia/API License: Apache-2.0 diff --git a/src/port_gst/mediademuxer_port_gst.c b/src/port_gst/mediademuxer_port_gst.c index 91fcc0e..31214ed 100755 --- a/src/port_gst/mediademuxer_port_gst.c +++ b/src/port_gst/mediademuxer_port_gst.c @@ -1277,12 +1277,6 @@ static int gst_demuxer_read_sample(MMHandleType pHandle, goto ERROR; } - if (media_packet_create_alloc(atrack->format, NULL, NULL, &mediabuf)) { - MD_E("media_packet_create_alloc failed\n"); - ret = MD_ERROR; - goto ERROR; - } - if (indx != track_indx) { MD_E("Invalid track Index\n"); ret = MD_ERROR_INVALID_ARGUMENT; @@ -1296,14 +1290,23 @@ static int gst_demuxer_read_sample(MMHandleType pHandle, if (gst_app_sink_is_eos((GstAppSink *) sink)) { MD_W("End of stream (EOS) reached, triggering the eos callback\n"); ret = MD_ERROR_NONE; + *outbuf = NULL; __gst_eos_callback(track_indx, demuxer); return ret; } else { MD_E("gst_demuxer_read_sample failed\n"); + *outbuf = NULL; ret = MD_ERROR_UNKNOWN; + return ret; } } + if (media_packet_create_alloc(atrack->format, NULL, NULL, &mediabuf)) { + MD_E("media_packet_create_alloc failed\n"); + ret = MD_ERROR; + goto ERROR; + } + GstBuffer *buffer = gst_sample_get_buffer(sample); if (buffer == NULL) { MD_E("gst_sample_get_buffer returned NULL pointer\n"); @@ -1337,6 +1340,9 @@ static int gst_demuxer_read_sample(MMHandleType pHandle, MEDIADEMUXER_FLEAVE(); return ret; ERROR: + if (mediabuf) + media_packet_destroy(mediabuf); + *outbuf = NULL; MEDIADEMUXER_FLEAVE(); return ret; } -- 2.7.4 From 89d36c3809e70211e921b1767c0e915c0862dbd9 Mon Sep 17 00:00:00 2001 From: Gilbok Lee Date: Fri, 29 Jul 2016 11:13:12 +0900 Subject: [PATCH 02/16] Add mpeg4video parser, because decoding has to be possible with the output packet. Change-Id: I3b9ecb2fe05e5a185866fa552599a04cb48989ad --- packaging/capi-mediademuxer.spec | 2 +- src/port_gst/mediademuxer_port_gst.c | 29 ++++++++++++++++++++++++++++- 2 files changed, 29 insertions(+), 2 deletions(-) diff --git a/packaging/capi-mediademuxer.spec b/packaging/capi-mediademuxer.spec index 471b8c7..d1a54db 100755 --- a/packaging/capi-mediademuxer.spec +++ b/packaging/capi-mediademuxer.spec @@ -1,6 +1,6 @@ Name: capi-mediademuxer Summary: A Media Demuxer library in Tizen Native API -Version: 0.1.4 +Version: 0.1.5 Release: 1 Group: Multimedia/API License: Apache-2.0 diff --git a/src/port_gst/mediademuxer_port_gst.c b/src/port_gst/mediademuxer_port_gst.c index 31214ed..2214f2d 100755 --- a/src/port_gst/mediademuxer_port_gst.c +++ b/src/port_gst/mediademuxer_port_gst.c @@ -291,7 +291,10 @@ int __gst_add_track_info(GstPad *pad, gchar *name, track **head, MD_E("factory not able to make h264parse"); goto ERROR; } - gst_bin_add_many(GST_BIN(pipeline), parse_element, NULL); + if (!gst_bin_add(GST_BIN(pipeline), parse_element)) { + MD_E("fail add h264parse in pipeline"); + goto ERROR; + } parse_sink_pad = gst_element_get_static_pad(parse_element, "sink"); if (!parse_sink_pad) { gst_object_unref(parse_element); @@ -307,6 +310,30 @@ int __gst_add_track_info(GstPad *pad, gchar *name, track **head, outcaps = gst_caps_new_simple("video/x-h264", "stream-format", G_TYPE_STRING, "byte-stream", NULL); gst_element_link_filtered(parse_element, temp->appsink, outcaps); gst_caps_unref(outcaps); + } else if (strstr(name, "video") && strstr(temp->caps_string, "mpeg")) { + parse_element = gst_element_factory_make("mpeg4videoparse", NULL); + if (!parse_element) { + MD_E("factory not able to make mpeg4videoparse"); + goto ERROR; + } + if (!gst_bin_add(GST_BIN(pipeline), parse_element)) { + MD_E("fail add mpeg4videoparse in pipeline"); + goto ERROR; + } + parse_sink_pad = gst_element_get_static_pad(parse_element, "sink"); + if (!parse_sink_pad) { + gst_object_unref(parse_element); + MD_E("sink pad of mpeg4videoparse not available"); + goto ERROR; + } + + g_object_set(G_OBJECT(parse_element), "config-interval", 1, NULL); + + MEDIADEMUXER_SET_STATE(parse_element, GST_STATE_PAUSED, ERROR); + + /* Link demuxer pad with sink pad of parse element */ + MEDIADEMUXER_LINK_PAD(queue_src_pad, parse_sink_pad, ERROR); + gst_element_link(parse_element, temp->appsink); } else { MEDIADEMUXER_LINK_PAD(queue_src_pad, apppad, ERROR); } -- 2.7.4 From 56c61052dc7608e12dd97e52499719b1ded82192 Mon Sep 17 00:00:00 2001 From: Gilbok Lee Date: Fri, 29 Jul 2016 19:13:32 +0900 Subject: [PATCH 03/16] Changed the function name to conflict of symbol link Change-Id: If4ee0e2b7ff960dd7b142b58fe2da14e1ea3005b --- packaging/capi-mediademuxer.spec | 2 +- src/mediademuxer_port.c | 18 +++++++++--------- src/port_custom/mediademuxer_port_custom.c | 2 +- src/port_ffmpeg/mediademuxer_port_ffmpeg.c | 2 +- src/port_gst/mediademuxer_port_gst.c | 2 +- 5 files changed, 13 insertions(+), 13 deletions(-) diff --git a/packaging/capi-mediademuxer.spec b/packaging/capi-mediademuxer.spec index d1a54db..d09180c 100755 --- a/packaging/capi-mediademuxer.spec +++ b/packaging/capi-mediademuxer.spec @@ -1,6 +1,6 @@ Name: capi-mediademuxer Summary: A Media Demuxer library in Tizen Native API -Version: 0.1.5 +Version: 0.1.6 Release: 1 Group: Multimedia/API License: Apache-2.0 diff --git a/src/mediademuxer_port.c b/src/mediademuxer_port.c index 409d94b..7abee84 100755 --- a/src/mediademuxer_port.c +++ b/src/mediademuxer_port.c @@ -36,9 +36,9 @@ #define MAX_ERR_LEN 256 /* function type */ -extern int gst_port_register(media_port_demuxer_ops *pOps); -extern int ffmpeg_port_register(media_port_demuxer_ops *pOps); -extern int custom_port_register(media_port_demuxer_ops *pOps); +extern int gst_mediademxer_port_register(media_port_demuxer_ops *pOps); +extern int ffmpeg_mediademxer_port_register(media_port_demuxer_ops *pOps); +extern int custom_mediademxer_port_register(media_port_demuxer_ops *pOps); int __md_util_exist_file_path(const char *file_path); bool __md_util_is_sdp_file(const char *path); mediademuxer_src_type __md_util_media_type(char **uri); @@ -48,11 +48,11 @@ int _md_util_parse(MMHandleType demuxer, const char *type); * Sequence of functions should be same as the port enumeration * "port_mode" in mm_demuxer_ini.h file */ -typedef int (*register_port)(media_port_demuxer_ops *); -register_port register_port_func[] = { - &gst_port_register, - &ffmpeg_port_register, - &custom_port_register +typedef int (*register_port_demuxer)(media_port_demuxer_ops *); +register_port_demuxer register_port_demuxer_func[] = { + &gst_mediademxer_port_register, + &ffmpeg_mediademxer_port_register, + &custom_mediademxer_port_register }; int md_create(MMHandleType *demuxer) @@ -82,7 +82,7 @@ int md_create(MMHandleType *demuxer) MEDIADEMUXER_CHECK_SET_AND_PRINT(result, MD_ERROR_NONE, result, MD_COURRPTED_INI, "can't load ini"); - register_port_func[new_demuxer->ini.port_type](pOps); + register_port_demuxer_func[new_demuxer->ini.port_type](pOps); result = pOps->init(&new_demuxer->mdport_handle); MEDIADEMUXER_CHECK_SET_AND_PRINT(result, MD_ERROR_NONE, result, MD_NOT_INITIALIZED, "md_create failed"); diff --git a/src/port_custom/mediademuxer_port_custom.c b/src/port_custom/mediademuxer_port_custom.c index 171d70c..78a6a7b 100755 --- a/src/port_custom/mediademuxer_port_custom.c +++ b/src/port_custom/mediademuxer_port_custom.c @@ -43,7 +43,7 @@ static media_port_demuxer_ops def_demux_ops = { .get_data = custom_demuxer_get_data, }; -int custom_port_register(media_port_demuxer_ops *pOps) +int custom_mediademxer_port_register(media_port_demuxer_ops *pOps) { int ret = MD_ERROR_NONE; MEDIADEMUXER_FENTER(); diff --git a/src/port_ffmpeg/mediademuxer_port_ffmpeg.c b/src/port_ffmpeg/mediademuxer_port_ffmpeg.c index 352c385..4405359 100755 --- a/src/port_ffmpeg/mediademuxer_port_ffmpeg.c +++ b/src/port_ffmpeg/mediademuxer_port_ffmpeg.c @@ -43,7 +43,7 @@ static media_port_demuxer_ops def_demux_ops = { .get_data = ffmpeg_demuxer_get_data, }; -int ffmpeg_port_register(media_port_demuxer_ops *pOps) +int ffmpeg_mediademxer_port_register(media_port_demuxer_ops *pOps) { int ret = MD_ERROR_NONE; MEDIADEMUXER_FENTER(); diff --git a/src/port_gst/mediademuxer_port_gst.c b/src/port_gst/mediademuxer_port_gst.c index 2214f2d..9205e35 100755 --- a/src/port_gst/mediademuxer_port_gst.c +++ b/src/port_gst/mediademuxer_port_gst.c @@ -66,7 +66,7 @@ static media_port_demuxer_ops def_demux_ops = { .set_eos_cb = gst_set_eos_cb, }; -int gst_port_register(media_port_demuxer_ops *pOps) +int gst_mediademxer_port_register(media_port_demuxer_ops *pOps) { MEDIADEMUXER_FENTER(); int ret = MD_ERROR_NONE; -- 2.7.4 From 87c5d3f8a784296651ae524487dbbb6e383cda0b Mon Sep 17 00:00:00 2001 From: Gilbok Lee Date: Wed, 10 Aug 2016 10:59:41 +0900 Subject: [PATCH 04/16] Change media_codec_data string to data Change-Id: I75da38c33aa70309833e02ac739c11050a459a9a Signed-off-by: Gilbok Lee --- packaging/capi-mediademuxer.spec | 2 +- src/port_gst/mediademuxer_port_gst.c | 42 +++++++++++++++++------------------- 2 files changed, 21 insertions(+), 23 deletions(-) diff --git a/packaging/capi-mediademuxer.spec b/packaging/capi-mediademuxer.spec index d09180c..d2fff33 100755 --- a/packaging/capi-mediademuxer.spec +++ b/packaging/capi-mediademuxer.spec @@ -1,6 +1,6 @@ Name: capi-mediademuxer Summary: A Media Demuxer library in Tizen Native API -Version: 0.1.6 +Version: 0.1.7 Release: 1 Group: Multimedia/API License: Apache-2.0 diff --git a/src/port_gst/mediademuxer_port_gst.c b/src/port_gst/mediademuxer_port_gst.c index 9205e35..6847a35 100755 --- a/src/port_gst/mediademuxer_port_gst.c +++ b/src/port_gst/mediademuxer_port_gst.c @@ -1197,7 +1197,7 @@ ERROR: } static int _gst_copy_buf_to_media_packet(media_packet_h out_pkt, - GstBuffer *buffer, char *codec_data) + GstBuffer *buffer, GstBuffer *codec_data) { MEDIADEMUXER_FENTER(); int ret = MD_ERROR_NONE; @@ -1252,12 +1252,22 @@ static int _gst_copy_buf_to_media_packet(media_packet_h out_pkt, ret = MD_ERROR_UNKNOWN; goto ERROR; } + /* set codec data into media packet */ if (codec_data) { - if (media_packet_set_codec_data(out_pkt, (void*) codec_data, strlen(codec_data))) { + GstMapInfo codec_data_map; + if (!gst_buffer_map(codec_data, &codec_data_map, GST_MAP_READ)) { + MD_E("codec data buffer map failed\n"); + ret = MD_ERROR_UNKNOWN; + goto ERROR; + } + if (media_packet_set_codec_data(out_pkt, (void*)codec_data_map.data, + (unsigned int)codec_data_map.size)) { MD_E("unable to set the codec data\n"); ret = MD_ERROR_UNKNOWN; + gst_buffer_unmap(codec_data, &codec_data_map); goto ERROR; } + gst_buffer_unmap(codec_data, &codec_data_map); } ERROR: gst_buffer_unmap(buffer, &map); @@ -1275,9 +1285,6 @@ static int gst_demuxer_read_sample(MMHandleType pHandle, media_packet_h mediabuf = NULL; int indx = 0; - char *codec_data = NULL; - char *temp_codec_data = NULL; - int index = 0; track *atrack = demuxer->info.head; if ((demuxer->selected_tracks)[track_indx] == false) { @@ -1342,27 +1349,18 @@ static int gst_demuxer_read_sample(MMHandleType pHandle, } /* Create the codec data and pass to _gst_copy_buf_to_media_packet() to add into the media packet */ - temp_codec_data = strstr(atrack->caps_string, "codec_data"); - if (temp_codec_data != NULL) { - while (*temp_codec_data != ')') - temp_codec_data++; - temp_codec_data++; /* to esacpe ')' */ - codec_data = (char*) malloc(sizeof(char)*strlen(temp_codec_data)); - if (codec_data != NULL) { - while (*temp_codec_data != ',') { - codec_data[index++] = *temp_codec_data; - temp_codec_data++; - } - codec_data[index] = '\0'; - } - } + GstStructure *structure = NULL; + const GValue *value = NULL; + GstBuffer *codec_data_buffer = NULL; + structure = gst_caps_get_structure(atrack->caps, 0); + value = gst_structure_get_value(structure, "codec_data"); + if (value) + codec_data_buffer = gst_value_get_buffer(value); /* Fill the media_packet with proper information */ - ret = _gst_copy_buf_to_media_packet(mediabuf, buffer, codec_data); + ret = _gst_copy_buf_to_media_packet(mediabuf, buffer, codec_data_buffer); gst_sample_unref(sample); *outbuf = mediabuf; - if (codec_data) - free(codec_data); MEDIADEMUXER_FLEAVE(); return ret; -- 2.7.4 From dfbd0e767096c5d7b57457a2266384219f3f3240 Mon Sep 17 00:00:00 2001 From: Gilbok Lee Date: Fri, 23 Sep 2016 17:21:06 +0900 Subject: [PATCH 05/16] Modify enumeration name about mediademuxer_state [Version] 0.1.8 [Profile] Common [Issue Type] Modify enumeration Change-Id: I851d705debeaac986e15ccc5645435858914098f --- include/mediademuxer.h | 12 +++---- packaging/capi-mediademuxer.spec | 2 +- src/mediademuxer.c | 76 ++++++++++++++++++++-------------------- test/mediademuxer_test.c | 8 ++--- 4 files changed, 49 insertions(+), 49 deletions(-) diff --git a/include/mediademuxer.h b/include/mediademuxer.h index b358bcc..6e08f4c 100755 --- a/include/mediademuxer.h +++ b/include/mediademuxer.h @@ -47,10 +47,10 @@ typedef struct mediademuxer_s *mediademuxer_h; * @since_tizen 3.0 */ typedef enum { - MEDIADEMUXER_NONE, /**< The mediademuxer is not created */ - MEDIADEMUXER_IDLE, /**< The mediademuxer is created, but not prepared */ - MEDIADEMUXER_READY, /**< The mediademuxer is ready to demux media */ - MEDIADEMUXER_DEMUXING /**< The mediademuxer is demuxing media */ + MEDIADEMUXER_STATE_NONE, /**< The mediademuxer is not created */ + MEDIADEMUXER_STATE_IDLE, /**< The mediademuxer is created, but not prepared */ + MEDIADEMUXER_STATE_READY, /**< The mediademuxer is ready to demux media */ + MEDIADEMUXER_STATE_DEMUXING /**< The mediademuxer is demuxing media */ } mediademuxer_state; /** @@ -58,7 +58,7 @@ typedef enum { * @since_tizen 3.0 */ typedef enum { - MEDIADEMUXER_ERROR_NONE = TIZEN_ERROR_NONE, /*< Successful */ + MEDIADEMUXER_ERROR_NONE = TIZEN_ERROR_NONE, /**< Successful */ MEDIADEMUXER_ERROR_OUT_OF_MEMORY = TIZEN_ERROR_OUT_OF_MEMORY, /**< Out of memory */ MEDIADEMUXER_ERROR_INVALID_PARAMETER = TIZEN_ERROR_INVALID_PARAMETER, /**< Invalid parameter */ MEDIADEMUXER_ERROR_INVALID_OPERATION = TIZEN_ERROR_INVALID_OPERATION, /**< Invalid operation */ @@ -295,7 +295,7 @@ int mediademuxer_unselect_track(mediademuxer_h demuxer, int track_index); * @retval #MEDIADEMUXER_ERROR_INVALID_STATE Invalid state * @retval #MEDIADEMUXER_ERROR_INVALID_OPERATION Invalid Operation * @pre The media demuxer state must be set to #MEDIADEMUXER_STATE_DEMUXING. - * @post The media demuxer state will be in #MEDIADEMUXER_READY. + * @post The media demuxer state will be in #MEDIADEMUXER_STATE_READY. * @see mediademuxer_start() * @see mediademuxer_unprepare() * */ diff --git a/packaging/capi-mediademuxer.spec b/packaging/capi-mediademuxer.spec index d2fff33..bea7234 100755 --- a/packaging/capi-mediademuxer.spec +++ b/packaging/capi-mediademuxer.spec @@ -1,6 +1,6 @@ Name: capi-mediademuxer Summary: A Media Demuxer library in Tizen Native API -Version: 0.1.7 +Version: 0.1.8 Release: 1 Group: Multimedia/API License: Apache-2.0 diff --git a/src/mediademuxer.c b/src/mediademuxer.c index e2c67c1..8545c6e 100755 --- a/src/mediademuxer.c +++ b/src/mediademuxer.c @@ -44,7 +44,7 @@ int mediademuxer_create(mediademuxer_h *demuxer) handle = (mediademuxer_s *) g_malloc(sizeof(mediademuxer_s)); if (handle != NULL) { memset(handle, 0, sizeof(mediademuxer_s)); - handle->demux_state = MEDIADEMUXER_NONE; + handle->demux_state = MEDIADEMUXER_STATE_NONE; } else { MD_E("[CoreAPI][%s] DEMUXER_ERROR_OUT_OF_MEMORY(0x%08x)", __FUNCTION__, MEDIADEMUXER_ERROR_OUT_OF_MEMORY); @@ -76,7 +76,7 @@ int mediademuxer_create(mediademuxer_h *demuxer) (mediademuxer_eos_cb) _mediademuxer_eos_cb, handle); - handle->demux_state = MEDIADEMUXER_IDLE; + handle->demux_state = MEDIADEMUXER_STATE_IDLE; return MEDIADEMUXER_ERROR_NONE; } @@ -87,7 +87,7 @@ int mediademuxer_set_data_source(mediademuxer_h demuxer, const char *path) DEMUXER_INSTANCE_CHECK(demuxer); mediademuxer_s *handle; handle = (mediademuxer_s *)(demuxer); - if (handle && path && handle->demux_state == MEDIADEMUXER_IDLE) { + if (handle && path && handle->demux_state == MEDIADEMUXER_STATE_IDLE) { ret = md_set_data_source((MMHandleType) (handle->md_handle), path); if (ret != MEDIADEMUXER_ERROR_NONE) { MD_E("[CoreAPI][%s] DEMUXER_ERROR_INVALID_OPERATION(0x%08x)", __FUNCTION__, @@ -100,7 +100,7 @@ int mediademuxer_set_data_source(mediademuxer_h demuxer, const char *path) __FUNCTION__, MEDIADEMUXER_ERROR_INVALID_PATH); return MEDIADEMUXER_ERROR_INVALID_PATH; } else { - if (handle->demux_state != MEDIADEMUXER_IDLE) + if (handle->demux_state != MEDIADEMUXER_STATE_IDLE) return MEDIADEMUXER_ERROR_INVALID_STATE; MD_E("[CoreAPI][%s] DEMUXER_ERROR_INVALID_OPERATION(0x%08x)", __FUNCTION__, MEDIADEMUXER_ERROR_INVALID_OPERATION); @@ -117,17 +117,17 @@ int mediademuxer_prepare(mediademuxer_h demuxer) DEMUXER_INSTANCE_CHECK(demuxer); mediademuxer_s *handle; handle = (mediademuxer_s *)(demuxer); - if (handle && handle->demux_state == MEDIADEMUXER_IDLE && handle->eos_cb != NULL) { + if (handle && handle->demux_state == MEDIADEMUXER_STATE_IDLE && handle->eos_cb != NULL) { ret = md_prepare((MMHandleType) (handle->md_handle)); if (ret != MEDIADEMUXER_ERROR_NONE) { MD_E("[CoreAPI][%s] DEMUXER_ERROR_INVALID_OPERATION(0x%08x)", __FUNCTION__, MEDIADEMUXER_ERROR_INVALID_OPERATION); return MEDIADEMUXER_ERROR_INVALID_OPERATION; } else { - handle->demux_state = MEDIADEMUXER_READY; + handle->demux_state = MEDIADEMUXER_STATE_READY; } } else { - if (handle->demux_state != MEDIADEMUXER_IDLE) + if (handle->demux_state != MEDIADEMUXER_STATE_IDLE) return MEDIADEMUXER_ERROR_INVALID_STATE; if (handle->eos_cb == NULL) MD_E("EOS callback is not set\n"); @@ -145,7 +145,7 @@ int mediademuxer_get_track_count(mediademuxer_h demuxer, int *count) DEMUXER_INSTANCE_CHECK(demuxer); mediademuxer_s *handle; handle = (mediademuxer_s *)(demuxer); - if (handle && handle->demux_state == MEDIADEMUXER_READY) { + if (handle && handle->demux_state == MEDIADEMUXER_STATE_READY) { ret = md_get_track_count((MMHandleType) (handle->md_handle), count); if (ret != MEDIADEMUXER_ERROR_NONE) { MD_E("[CoreAPI][%s] DEMUXER_ERROR_INVALID_OPERATION(0x%08x)", @@ -153,7 +153,7 @@ int mediademuxer_get_track_count(mediademuxer_h demuxer, int *count) return MEDIADEMUXER_ERROR_INVALID_OPERATION; } } else { - if (handle->demux_state != MEDIADEMUXER_READY) + if (handle->demux_state != MEDIADEMUXER_STATE_READY) return MEDIADEMUXER_ERROR_INVALID_STATE; MD_E("[CoreAPI][%s] DEMUXER_ERROR_INVALID_OPERATION(0x%08x)", __FUNCTION__, MEDIADEMUXER_ERROR_INVALID_OPERATION); @@ -169,7 +169,7 @@ int mediademuxer_select_track(mediademuxer_h demuxer, int track_index) DEMUXER_INSTANCE_CHECK(demuxer); mediademuxer_s *handle; handle = (mediademuxer_s *)(demuxer); - if (handle && handle->demux_state == MEDIADEMUXER_READY) { + if (handle && handle->demux_state == MEDIADEMUXER_STATE_READY) { ret = md_select_track((MMHandleType) (handle->md_handle), track_index); if (ret != MEDIADEMUXER_ERROR_NONE) { MD_E("[CoreAPI][%s] DEMUXER_ERROR_INVALID_OPERATION(0x%08x)", @@ -177,7 +177,7 @@ int mediademuxer_select_track(mediademuxer_h demuxer, int track_index) return MEDIADEMUXER_ERROR_INVALID_OPERATION; } } else { - if (handle->demux_state != MEDIADEMUXER_READY) + if (handle->demux_state != MEDIADEMUXER_STATE_READY) return MEDIADEMUXER_ERROR_INVALID_STATE; MD_E("[CoreAPI][%s] DEMUXER_ERROR_INVALID_OPERATION(0x%08x)", __FUNCTION__, MEDIADEMUXER_ERROR_INVALID_OPERATION); @@ -193,17 +193,17 @@ int mediademuxer_start(mediademuxer_h demuxer) DEMUXER_INSTANCE_CHECK(demuxer); mediademuxer_s *handle; handle = (mediademuxer_s *)(demuxer); - if (handle && handle->demux_state == MEDIADEMUXER_READY) { + if (handle && handle->demux_state == MEDIADEMUXER_STATE_READY) { ret = md_start((MMHandleType) (handle->md_handle)); if (ret != MEDIADEMUXER_ERROR_NONE) { MD_E("[CoreAPI][%s] DEMUXER_ERROR_INVALID_OPERATION(0x%08x)", __FUNCTION__, MEDIADEMUXER_ERROR_INVALID_OPERATION); return MEDIADEMUXER_ERROR_INVALID_OPERATION; } else { - handle->demux_state = MEDIADEMUXER_DEMUXING; + handle->demux_state = MEDIADEMUXER_STATE_DEMUXING; } } else { - if (handle->demux_state != MEDIADEMUXER_READY) + if (handle->demux_state != MEDIADEMUXER_STATE_READY) return MEDIADEMUXER_ERROR_INVALID_STATE; MD_E("[CoreAPI][%s] DEMUXER_ERROR_INVALID_OPERATION(0x%08x)", __FUNCTION__, MEDIADEMUXER_ERROR_INVALID_OPERATION); @@ -224,8 +224,8 @@ int mediademuxer_get_track_info(mediademuxer_h demuxer, int track_index, MD_E("Invalid input parameters\n"); return MEDIADEMUXER_ERROR_INVALID_PARAMETER; } - if (handle && (handle->demux_state == MEDIADEMUXER_READY - || handle->demux_state == MEDIADEMUXER_DEMUXING)) { + if (handle && (handle->demux_state == MEDIADEMUXER_STATE_READY + || handle->demux_state == MEDIADEMUXER_STATE_DEMUXING)) { ret = md_get_track_info((MMHandleType) (handle->md_handle), track_index, format); if (ret != MEDIADEMUXER_ERROR_NONE) { MD_E("[CoreAPI][%s] DEMUXER_ERROR_INVALID_OPERATION(0x%08x)", @@ -233,7 +233,7 @@ int mediademuxer_get_track_info(mediademuxer_h demuxer, int track_index, return MEDIADEMUXER_ERROR_INVALID_OPERATION; } } else { - if (handle->demux_state != MEDIADEMUXER_READY) + if (handle->demux_state != MEDIADEMUXER_STATE_READY) return MEDIADEMUXER_ERROR_INVALID_STATE; MD_E("[CoreAPI][%s] DEMUXER_ERROR_INVALID_OPERATION(0x%08x)", __FUNCTION__, MEDIADEMUXER_ERROR_INVALID_OPERATION); @@ -252,7 +252,7 @@ int mediademuxer_read_sample(mediademuxer_h demuxer, int track_index, handle = (mediademuxer_s *)(demuxer); if (outbuf == NULL || track_index < 0) return MEDIADEMUXER_ERROR_INVALID_PARAMETER; - if (handle && handle->demux_state == MEDIADEMUXER_DEMUXING) { + if (handle && handle->demux_state == MEDIADEMUXER_STATE_DEMUXING) { ret = md_read_sample((MMHandleType) (handle->md_handle), track_index, outbuf); if (ret != MEDIADEMUXER_ERROR_NONE) { MD_E("[CoreAPI][%s] DEMUXER_ERROR_INVALID_OPERATION(0x%08x)", @@ -260,7 +260,7 @@ int mediademuxer_read_sample(mediademuxer_h demuxer, int track_index, return MEDIADEMUXER_ERROR_INVALID_OPERATION; } } else { - if (handle->demux_state != MEDIADEMUXER_DEMUXING) + if (handle->demux_state != MEDIADEMUXER_STATE_DEMUXING) return MEDIADEMUXER_ERROR_INVALID_STATE; MD_E("[CoreAPI][%s] DEMUXER_ERROR_INVALID_OPERATION(0x%08x)", __FUNCTION__, MEDIADEMUXER_ERROR_INVALID_OPERATION); @@ -276,7 +276,7 @@ int mediademuxer_seek(mediademuxer_h demuxer, int64_t pos) DEMUXER_INSTANCE_CHECK(demuxer); mediademuxer_s *handle; handle = (mediademuxer_s *)(demuxer); - if (handle && handle->demux_state == MEDIADEMUXER_DEMUXING) { + if (handle && handle->demux_state == MEDIADEMUXER_STATE_DEMUXING) { ret = md_seek((MMHandleType) (handle->md_handle), pos); if (ret != MEDIADEMUXER_ERROR_NONE) { MD_E("[CoreAPI][%s] DEMUXER_ERROR_INVALID_OPERATION(0x%08x)", @@ -284,7 +284,7 @@ int mediademuxer_seek(mediademuxer_h demuxer, int64_t pos) return MEDIADEMUXER_ERROR_INVALID_OPERATION; } } else { - if (handle->demux_state != MEDIADEMUXER_DEMUXING) + if (handle->demux_state != MEDIADEMUXER_STATE_DEMUXING) return MEDIADEMUXER_ERROR_INVALID_STATE; MD_E("[CoreAPI][%s] DEMUXER_ERROR_INVALID_OPERATION(0x%08x)", __FUNCTION__, MEDIADEMUXER_ERROR_INVALID_OPERATION); @@ -300,8 +300,8 @@ int mediademuxer_unselect_track(mediademuxer_h demuxer, int track_index) DEMUXER_INSTANCE_CHECK(demuxer); mediademuxer_s *handle; handle = (mediademuxer_s *)(demuxer); - if (handle && (handle->demux_state == MEDIADEMUXER_READY - || handle->demux_state == MEDIADEMUXER_DEMUXING)) { + if (handle && (handle->demux_state == MEDIADEMUXER_STATE_READY + || handle->demux_state == MEDIADEMUXER_STATE_DEMUXING)) { ret = md_unselect_track((MMHandleType) (handle->md_handle), track_index); if (ret != MEDIADEMUXER_ERROR_NONE) { MD_E("[CoreAPI][%s] DEMUXER_ERROR_INVALID_OPERATION(0x%08x)", @@ -309,7 +309,7 @@ int mediademuxer_unselect_track(mediademuxer_h demuxer, int track_index) return MEDIADEMUXER_ERROR_INVALID_OPERATION; } } else { - if (handle->demux_state != MEDIADEMUXER_READY) + if (handle->demux_state != MEDIADEMUXER_STATE_READY) return MEDIADEMUXER_ERROR_INVALID_STATE; MD_E("[CoreAPI][%s] DEMUXER_ERROR_INVALID_OPERATION(0x%08x)", __FUNCTION__, MEDIADEMUXER_ERROR_INVALID_OPERATION); @@ -325,16 +325,16 @@ int mediademuxer_stop(mediademuxer_h demuxer) DEMUXER_INSTANCE_CHECK(demuxer); mediademuxer_s *handle; handle = (mediademuxer_s *)(demuxer); - if (handle && handle->demux_state == MEDIADEMUXER_DEMUXING) { + if (handle && handle->demux_state == MEDIADEMUXER_STATE_DEMUXING) { ret = md_stop((MMHandleType) (handle->md_handle)); if (ret != MEDIADEMUXER_ERROR_NONE) { MD_E("[CoreAPI][%s] DEMUXER_ERROR_INVALID_OPERATION(0x%08x)", __FUNCTION__, MEDIADEMUXER_ERROR_INVALID_OPERATION); return MEDIADEMUXER_ERROR_INVALID_OPERATION; } else - handle->demux_state = MEDIADEMUXER_READY; + handle->demux_state = MEDIADEMUXER_STATE_READY; } else { - if (handle->demux_state != MEDIADEMUXER_DEMUXING) + if (handle->demux_state != MEDIADEMUXER_STATE_DEMUXING) return MEDIADEMUXER_ERROR_INVALID_STATE; MD_E("[CoreAPI][%s] DEMUXER_ERROR_INVALID_OPERATION(0x%08x)", __FUNCTION__, MEDIADEMUXER_ERROR_INVALID_OPERATION); @@ -350,16 +350,16 @@ int mediademuxer_unprepare(mediademuxer_h demuxer) DEMUXER_INSTANCE_CHECK(demuxer); mediademuxer_s *handle; handle = (mediademuxer_s *)(demuxer); - if (handle && handle->demux_state == MEDIADEMUXER_READY) { + if (handle && handle->demux_state == MEDIADEMUXER_STATE_READY) { ret = md_unprepare((MMHandleType) (handle->md_handle)); if (ret != MEDIADEMUXER_ERROR_NONE) { MD_E("[CoreAPI][%s] DEMUXER_ERROR_INVALID_OPERATION(0x%08x)", __FUNCTION__, MEDIADEMUXER_ERROR_INVALID_OPERATION); return MEDIADEMUXER_ERROR_INVALID_OPERATION; } else - handle->demux_state = MEDIADEMUXER_IDLE; + handle->demux_state = MEDIADEMUXER_STATE_IDLE; } else { - if (handle->demux_state != MEDIADEMUXER_READY) + if (handle->demux_state != MEDIADEMUXER_STATE_READY) return MEDIADEMUXER_ERROR_INVALID_STATE; MD_E("[CoreAPI][%s] DEMUXER_ERROR_INVALID_OPERATION(0x%08x)", __FUNCTION__, MEDIADEMUXER_ERROR_INVALID_OPERATION); @@ -375,7 +375,7 @@ int mediademuxer_destroy(mediademuxer_h demuxer) DEMUXER_INSTANCE_CHECK(demuxer); mediademuxer_s *handle; handle = (mediademuxer_s *)(demuxer); - if (handle && handle->demux_state == MEDIADEMUXER_IDLE) { + if (handle && handle->demux_state == MEDIADEMUXER_STATE_IDLE) { ret = md_destroy(handle->md_handle); if (ret != MEDIADEMUXER_ERROR_NONE) { MD_E("[CoreAPI][%s] DEMUXER_ERROR_INVALID_OPERATION(0x%08x)", @@ -383,7 +383,7 @@ int mediademuxer_destroy(mediademuxer_h demuxer) return MEDIADEMUXER_ERROR_INVALID_OPERATION; } else { MD_E("[CoreAPI][%s] destroy handle : %p", __FUNCTION__, handle); - handle->demux_state = MEDIADEMUXER_NONE; + handle->demux_state = MEDIADEMUXER_STATE_NONE; g_free(handle); handle = NULL; } @@ -416,7 +416,7 @@ int mediademuxer_set_error_cb(mediademuxer_h demuxer, DEMUXER_INSTANCE_CHECK(demuxer); mediademuxer_s *handle; handle = (mediademuxer_s *)(demuxer); - if (handle->demux_state != MEDIADEMUXER_IDLE) + if (handle->demux_state != MEDIADEMUXER_STATE_IDLE) return MEDIADEMUXER_ERROR_INVALID_STATE; handle->error_cb = callback; handle->error_cb_userdata = user_data; @@ -429,7 +429,7 @@ int mediademuxer_unset_error_cb(mediademuxer_h demuxer) DEMUXER_INSTANCE_CHECK(demuxer); mediademuxer_s *handle; handle = (mediademuxer_s *)(demuxer); - if (handle->demux_state != MEDIADEMUXER_IDLE) + if (handle->demux_state != MEDIADEMUXER_STATE_IDLE) return MEDIADEMUXER_ERROR_INVALID_STATE; handle->error_cb = NULL; handle->error_cb_userdata = NULL; @@ -444,7 +444,7 @@ static gboolean _mediademuxer_error_cb(mediademuxer_error_e error, void *user_da return 0; } mediademuxer_s * handle = (mediademuxer_s *) user_data; - if (handle->demux_state != MEDIADEMUXER_IDLE) + if (handle->demux_state != MEDIADEMUXER_STATE_IDLE) return MEDIADEMUXER_ERROR_INVALID_STATE; if (handle->error_cb) ((mediademuxer_error_cb)handle->error_cb)(error, handle->error_cb_userdata); @@ -459,7 +459,7 @@ int mediademuxer_set_eos_cb(mediademuxer_h demuxer, DEMUXER_INSTANCE_CHECK(demuxer); mediademuxer_s *handle; handle = (mediademuxer_s *)(demuxer); - if (handle->demux_state != MEDIADEMUXER_IDLE) + if (handle->demux_state != MEDIADEMUXER_STATE_IDLE) return MEDIADEMUXER_ERROR_INVALID_STATE; handle->eos_cb = callback; handle->eos_cb_userdata = user_data; @@ -472,7 +472,7 @@ int mediademuxer_unset_eos_cb(mediademuxer_h demuxer) DEMUXER_INSTANCE_CHECK(demuxer); mediademuxer_s *handle; handle = (mediademuxer_s *)(demuxer); - if (handle->demux_state != MEDIADEMUXER_IDLE) + if (handle->demux_state != MEDIADEMUXER_STATE_IDLE) return MEDIADEMUXER_ERROR_INVALID_STATE; handle->eos_cb = NULL; handle->eos_cb_userdata = NULL; @@ -487,7 +487,7 @@ static gboolean _mediademuxer_eos_cb(int track_num, void *user_data) return 0; } mediademuxer_s *handle = (mediademuxer_s *)user_data; - if (handle->demux_state != MEDIADEMUXER_DEMUXING) + if (handle->demux_state != MEDIADEMUXER_STATE_DEMUXING) return MEDIADEMUXER_ERROR_INVALID_STATE; if (handle->eos_cb) ((mediademuxer_eos_cb)handle->eos_cb)(track_num, handle->eos_cb_userdata); diff --git a/test/mediademuxer_test.c b/test/mediademuxer_test.c index 6b10666..4b3f211 100755 --- a/test/mediademuxer_test.c +++ b/test/mediademuxer_test.c @@ -783,13 +783,13 @@ int test_mediademuxer_get_state() g_print("test_mediademuxer_get_state\n"); mediademuxer_state state; if (mediademuxer_get_state(demuxer, &state) == MEDIADEMUXER_ERROR_NONE) { - if (state == MEDIADEMUXER_NONE) + if (state == MEDIADEMUXER_STATE_NONE) g_print("Mediademuxer_state = NONE\n"); - else if (state == MEDIADEMUXER_IDLE) + else if (state == MEDIADEMUXER_STATE_IDLE) g_print("Mediademuxer_state = IDLE\n"); - else if (state == MEDIADEMUXER_READY) + else if (state == MEDIADEMUXER_STATE_READY) g_print("Mediademuxer_state = READY\n"); - else if (state == MEDIADEMUXER_DEMUXING) + else if (state == MEDIADEMUXER_STATE_DEMUXING) g_print("Mediademuxer_state = DEMUXING\n"); else g_print("Mediademuxer_state = NOT SUPPORT STATE\n"); -- 2.7.4 From 61f90349f9f820ef892736f002c0d0e996ce7421 Mon Sep 17 00:00:00 2001 From: Gilbok Lee Date: Fri, 25 Nov 2016 16:02:05 +0900 Subject: [PATCH 06/16] Fix seek bug (After seek mediademuxer push key frame) [Version] 0.1.9 [Profile] Common [Issue Type] Fix bugs Change-Id: I224db5119a0683a883c362fc0ea27cd46489d7f7 --- include/mediademuxer.h | 2 +- packaging/capi-mediademuxer.spec | 2 +- src/port_gst/mediademuxer_port_gst.c | 12 +++--------- 3 files changed, 5 insertions(+), 11 deletions(-) diff --git a/include/mediademuxer.h b/include/mediademuxer.h index 6e08f4c..2810d7f 100755 --- a/include/mediademuxer.h +++ b/include/mediademuxer.h @@ -252,7 +252,7 @@ int mediademuxer_get_track_info(mediademuxer_h demuxer, int track_index, media_f int mediademuxer_read_sample(mediademuxer_h demuxer, int track_index, media_packet_h *outbuf); /** - * @brief Seeks to a particular instance of time (in micro seconds). + * @brief Seeks to a particular instance of time (in milli seconds). * @since_tizen 3.0 * @param[in] demuxer The media demuxer handle * @param[in] pos The value of the new start position diff --git a/packaging/capi-mediademuxer.spec b/packaging/capi-mediademuxer.spec index bea7234..36eed02 100755 --- a/packaging/capi-mediademuxer.spec +++ b/packaging/capi-mediademuxer.spec @@ -1,6 +1,6 @@ Name: capi-mediademuxer Summary: A Media Demuxer library in Tizen Native API -Version: 0.1.8 +Version: 0.1.9 Release: 1 Group: Multimedia/API License: Apache-2.0 diff --git a/src/port_gst/mediademuxer_port_gst.c b/src/port_gst/mediademuxer_port_gst.c index 6847a35..e5aa061 100755 --- a/src/port_gst/mediademuxer_port_gst.c +++ b/src/port_gst/mediademuxer_port_gst.c @@ -1403,13 +1403,7 @@ static int gst_demuxer_seek(MMHandleType pHandle, gint64 pos1) } } - if (gst_element_query_position(gst_handle->pipeline, GST_FORMAT_TIME, &pos) && - gst_element_query_duration(gst_handle->pipeline, GST_FORMAT_TIME, &len)) { - MD_I("Time: %" GST_TIME_FORMAT " / %" GST_TIME_FORMAT "\r", - GST_TIME_ARGS(pos), - GST_TIME_ARGS(len)); - } - pos1 = pos + (pos1 * GST_SECOND); + pos = pos1 * GST_MSECOND; MD_I("\n\n"); MD_I("NEW Time: %" GST_TIME_FORMAT " / %" GST_TIME_FORMAT "\r", @@ -1420,8 +1414,8 @@ static int gst_demuxer_seek(MMHandleType pHandle, gint64 pos1) MD_I("Got one element %p\n", temp->appsink); if (gst_handle->selected_tracks[indx] == true) { if (!gst_element_seek(temp->appsink, rate, GST_FORMAT_TIME, - GST_SEEK_FLAG_FLUSH, GST_SEEK_TYPE_SET, pos1, - GST_SEEK_TYPE_NONE, GST_CLOCK_TIME_NONE)) { + GST_SEEK_FLAG_FLUSH | GST_SEEK_FLAG_KEY_UNIT | GST_SEEK_FLAG_SNAP_BEFORE, + GST_SEEK_TYPE_SET, pos, GST_SEEK_TYPE_NONE, GST_CLOCK_TIME_NONE)) { MD_E("Seek failed!\n"); goto ERROR; } else { -- 2.7.4 From 045eadea65e8a4e84b22d3d986bcbb4eb15f212c Mon Sep 17 00:00:00 2001 From: "juan82.liu" Date: Wed, 23 Nov 2016 07:23:34 +0800 Subject: [PATCH 07/16] Add audio parse element and EOS packet to return Change-Id: Id95b890213f079c2bfba0f4e81af756036a1a7ff --- include/mediademuxer.h | 3 +- include/port_gst/mediademuxer_port_gst.h | 1 + packaging/capi-mediademuxer.spec | 2 +- src/port_gst/mediademuxer_port_gst.c | 252 ++++++++++++++++++------------- 4 files changed, 152 insertions(+), 106 deletions(-) diff --git a/include/mediademuxer.h b/include/mediademuxer.h index 2810d7f..be38977 100755 --- a/include/mediademuxer.h +++ b/include/mediademuxer.h @@ -254,6 +254,7 @@ int mediademuxer_read_sample(mediademuxer_h demuxer, int track_index, media_pack /** * @brief Seeks to a particular instance of time (in milli seconds). * @since_tizen 3.0 + * @remark If mediademuxer_seek() is followed by mediademuxer_read_sample(), outbuf will be the key frame right before the seek position. * @param[in] demuxer The media demuxer handle * @param[in] pos The value of the new start position * @return @c 0 on success, otherwise a negative error value @@ -261,7 +262,7 @@ int mediademuxer_read_sample(mediademuxer_h demuxer, int track_index, media_pack * @retval #MEDIADEMUXER_ERROR_INVALID_PARAMETER Invalid parameter * @retval #MEDIADEMUXER_ERROR_INVALID_STATE Invalid state * @retval #MEDIADEMUXER_ERROR_INVALID_OPERATION Invalid Operation -* @pre The media demuxer state should be #MEDIADEMUXER_STATE_DEMUXING. + * @pre The media demuxer state should be #MEDIADEMUXER_STATE_DEMUXING. * @see mediademuxer_read_sample() * @see mediademuxer_stop() * */ diff --git a/include/port_gst/mediademuxer_port_gst.h b/include/port_gst/mediademuxer_port_gst.h index 8bda13a..80865ff 100755 --- a/include/port_gst/mediademuxer_port_gst.h +++ b/include/port_gst/mediademuxer_port_gst.h @@ -60,6 +60,7 @@ typedef enum { typedef struct track { GstPad *pad; GstCaps *caps; + bool need_codec_data; gchar *name; gchar *caps_string; GstElement *appsink; diff --git a/packaging/capi-mediademuxer.spec b/packaging/capi-mediademuxer.spec index 36eed02..1fdb02c 100755 --- a/packaging/capi-mediademuxer.spec +++ b/packaging/capi-mediademuxer.spec @@ -1,6 +1,6 @@ Name: capi-mediademuxer Summary: A Media Demuxer library in Tizen Native API -Version: 0.1.9 +Version: 0.1.10 Release: 1 Group: Multimedia/API License: Apache-2.0 diff --git a/src/port_gst/mediademuxer_port_gst.c b/src/port_gst/mediademuxer_port_gst.c index e5aa061..32ea0da 100755 --- a/src/port_gst/mediademuxer_port_gst.c +++ b/src/port_gst/mediademuxer_port_gst.c @@ -237,6 +237,7 @@ int __gst_add_track_info(GstPad *pad, gchar *name, track **head, temp->caps_string = gst_caps_to_string(temp->caps); temp->next = NULL; temp->format = NULL; + temp->need_codec_data = TRUE; /* Link demuxer - queue */ temp->queue = gst_element_factory_make("queue", NULL); @@ -285,54 +286,79 @@ int __gst_add_track_info(GstPad *pad, gchar *name, track **head, goto ERROR; } /* Check for type video and it should be h264 */ - if (strstr(name, "video") && strstr(temp->caps_string, "h264")) { - parse_element = gst_element_factory_make("h264parse", NULL); - if (!parse_element) { - MD_E("factory not able to make h264parse"); - goto ERROR; - } - if (!gst_bin_add(GST_BIN(pipeline), parse_element)) { - MD_E("fail add h264parse in pipeline"); - goto ERROR; - } - parse_sink_pad = gst_element_get_static_pad(parse_element, "sink"); - if (!parse_sink_pad) { - gst_object_unref(parse_element); - MD_E("sink pad of h264parse not available"); - goto ERROR; + if (strstr(name, "video")) { + if (strstr(temp->caps_string, "h264")) { + parse_element = gst_element_factory_make("h264parse", NULL); + if (!parse_element) { + MD_E("factory not able to make h264parse"); + goto ERROR; + } + } else if(strstr(temp->caps_string, "mpeg")) { + parse_element = gst_element_factory_make("mpeg4videoparse", NULL); + if (!parse_element) { + MD_E("factory not able to make h264parse"); + goto ERROR; + } + g_object_set(G_OBJECT(parse_element), "config-interval", 1, NULL); } - MEDIADEMUXER_SET_STATE(parse_element, GST_STATE_PAUSED, ERROR); - - /* Link demuxer pad with sink pad of parse element */ - MEDIADEMUXER_LINK_PAD(queue_src_pad, parse_sink_pad, ERROR); - - outcaps = gst_caps_new_simple("video/x-h264", "stream-format", G_TYPE_STRING, "byte-stream", NULL); - gst_element_link_filtered(parse_element, temp->appsink, outcaps); - gst_caps_unref(outcaps); - } else if (strstr(name, "video") && strstr(temp->caps_string, "mpeg")) { - parse_element = gst_element_factory_make("mpeg4videoparse", NULL); - if (!parse_element) { - MD_E("factory not able to make mpeg4videoparse"); - goto ERROR; + if(parse_element) { + gst_bin_add(GST_BIN(pipeline), parse_element); + parse_sink_pad = gst_element_get_static_pad(parse_element, "sink"); + if (!parse_sink_pad) { + gst_object_unref(parse_element); + MD_E("sink pad of h264parse not available"); + goto ERROR; + } + MEDIADEMUXER_SET_STATE(parse_element, GST_STATE_PAUSED, ERROR); + /* Link demuxer pad with sink pad of parse element */ + MEDIADEMUXER_LINK_PAD(queue_src_pad, parse_sink_pad, ERROR); + + if (strstr(temp->caps_string, "h264")) { + outcaps = gst_caps_new_simple("video/x-h264", "stream-format", G_TYPE_STRING, "byte-stream", NULL); + gst_element_link_filtered(parse_element, temp->appsink, outcaps); + gst_caps_unref(outcaps); + } else if (strstr(temp->caps_string, "mpeg")) { + gst_element_link(parse_element, temp->appsink); + } else { + MEDIADEMUXER_LINK_PAD(queue_src_pad, apppad, ERROR); + } } - if (!gst_bin_add(GST_BIN(pipeline), parse_element)) { - MD_E("fail add mpeg4videoparse in pipeline"); - goto ERROR; + } else if(strstr(name, "audio")) { + //Create Parse + if (strstr(temp->caps_string, "audio/mpeg")) { + int mpegversion = 0; + GstStructure *structure = NULL; + structure = gst_caps_get_structure(temp->caps, 0); + gst_structure_get_int (structure, "mpegversion", &mpegversion); + if(mpegversion == 2 || mpegversion == 4) + parse_element = gst_element_factory_make("aacparse", NULL); + else if(mpegversion == 1) + parse_element = gst_element_factory_make("mpegaudioparse", NULL); + } else if (strstr(temp->caps_string, "application/x-id3")) { + parse_element = gst_element_factory_make("mpegaudioparse", NULL); + } else if (strstr(temp->caps_string, "audio/x-amr-nb-sh") + || strstr(temp->caps_string, "audio/x-amr-wb-sh")) { + parse_element = gst_element_factory_make("amrparse", NULL); + } else if (strstr(temp->caps_string, "audio/x-wav")) { + parse_element = gst_element_factory_make("wavparse", NULL); + } else if (strstr(temp->caps_string, "audio/x-flac")) { + parse_element = gst_element_factory_make("flacparse", NULL); } + + gst_bin_add(GST_BIN(pipeline), parse_element); parse_sink_pad = gst_element_get_static_pad(parse_element, "sink"); if (!parse_sink_pad) { gst_object_unref(parse_element); - MD_E("sink pad of mpeg4videoparse not available"); + MD_E("sink pad of h264parse not available"); goto ERROR; } - - g_object_set(G_OBJECT(parse_element), "config-interval", 1, NULL); - MEDIADEMUXER_SET_STATE(parse_element, GST_STATE_PAUSED, ERROR); /* Link demuxer pad with sink pad of parse element */ MEDIADEMUXER_LINK_PAD(queue_src_pad, parse_sink_pad, ERROR); + + /* Link src pad with appSink element */ gst_element_link(parse_element, temp->appsink); } else { MEDIADEMUXER_LINK_PAD(queue_src_pad, apppad, ERROR); @@ -358,6 +384,8 @@ int __gst_add_track_info(GstPad *pad, gchar *name, track **head, return MD_ERROR_NONE; ERROR: + if (parse_element) + gst_object_unref(parse_element); if (temp->caps) gst_object_unref(temp->caps); if (temp->caps_string) @@ -428,18 +456,18 @@ static int __gst_create_audio_only_pipeline(gpointer data, GstCaps *caps) mdgst_handle_t *gst_handle = (mdgst_handle_t *) data; GstPad *pad = NULL; GstPad *aud_pad = NULL; - GstPad *queue_srcpad = NULL; - GstPad *queue_sinkpad = NULL; GstPad *aud_srcpad = NULL; GstPad *fake_pad = NULL; GstElement *id3tag = NULL; - GstElement *adif_queue = NULL; - gchar *name; - gchar *type; + gchar *name = NULL; + gchar *type = NULL; track_info *head_track = &(gst_handle->info); - track *trck; + track *trck = NULL; + gst_handle->is_valid_container = true; + type = gst_caps_to_string(caps); + if (strstr(type, "adts") || strstr(type, "adif")) { gst_handle->demux = gst_element_factory_make("aacparse", NULL); } else if (strstr(type, "audio/mpeg")) { @@ -468,6 +496,17 @@ static int __gst_create_audio_only_pipeline(gpointer data, GstCaps *caps) MD_E("fail to get typefind src pad.\n"); goto ERROR; } + + fake_pad = gst_element_get_static_pad(gst_handle->fakesink, "sink"); + if (!fake_pad) { + MD_E("fail to get fakesink sink pad.\n"); + goto ERROR; + } + gst_pad_unlink(pad, fake_pad); + + if (fake_pad) + gst_object_unref(fake_pad); + if (!id3tag) aud_pad = gst_element_get_static_pad(gst_handle->demux, "sink"); else @@ -476,33 +515,32 @@ static int __gst_create_audio_only_pipeline(gpointer data, GstCaps *caps) MD_E("fail to get audio parse sink pad.\n"); goto ERROR; } - fake_pad = gst_element_get_static_pad(gst_handle->fakesink, "sink"); - if (!fake_pad) { - MD_E("fail to get fakesink sink pad.\n"); - goto ERROR; - } - gst_pad_unlink(pad, fake_pad); + + MEDIADEMUXER_LINK_PAD(pad, aud_pad, ERROR); + if (pad) + gst_object_unref(pad); + if (aud_pad) + gst_object_unref(aud_pad); + if (!id3tag) { - MEDIADEMUXER_SET_STATE(gst_handle->demux, - GST_STATE_PAUSED, ERROR); + MEDIADEMUXER_SET_STATE(gst_handle->demux, GST_STATE_PAUSED, ERROR); } else { MEDIADEMUXER_SET_STATE(id3tag, GST_STATE_PAUSED, ERROR); - MEDIADEMUXER_SET_STATE(gst_handle->demux, - GST_STATE_PAUSED, ERROR); + MEDIADEMUXER_SET_STATE(gst_handle->demux, GST_STATE_PAUSED, ERROR); gst_element_link(id3tag, gst_handle->demux); } } - /* calling "on_pad_added" function to set the caps */ + gst_handle->total_tracks++; + aud_srcpad = gst_element_get_static_pad(gst_handle->demux, "src"); if (!aud_srcpad) { MD_E("fail to get audioparse source pad.\n"); goto ERROR; } - gst_handle->total_tracks++; + name = gst_pad_get_name(aud_srcpad); - if (__gst_add_track_info(aud_srcpad, name, &(head_track->head), gst_handle->pipeline) - != MD_ERROR_NONE) { + if (__gst_add_track_info(aud_srcpad, name, &(head_track->head), gst_handle->pipeline) != MD_ERROR_NONE) { MD_E("unable to added track info"); head_track->num_audio_track = 0; head_track->num_video_track = 0; @@ -511,33 +549,6 @@ static int __gst_create_audio_only_pipeline(gpointer data, GstCaps *caps) __gst_free_stuct(&(head_track->head)); goto ERROR; } - if (strstr(type, "adif")) { - adif_queue = gst_element_factory_make("queue", NULL); - if (!adif_queue) { - MD_E("factory not able to make queue in case of adif aac\n"); - goto ERROR; - } - /* Add this queue to the pipeline */ - gst_bin_add_many(GST_BIN(gst_handle->pipeline), adif_queue, NULL); - queue_srcpad = gst_element_get_static_pad(adif_queue, "src"); - if (!queue_srcpad) { - MD_E("fail to get queue src pad for adif aac.\n"); - goto ERROR; - } - queue_sinkpad = gst_element_get_static_pad(adif_queue, "sink"); - if (!queue_sinkpad) { - MD_E("fail to get queue sink pad for adif aac.\n"); - goto ERROR; - } - /* link typefind with queue */ - MEDIADEMUXER_LINK_PAD(pad, queue_sinkpad, ERROR); - /* link queue with aacparse */ - MEDIADEMUXER_LINK_PAD(queue_srcpad, aud_pad, ERROR); - } else { - MEDIADEMUXER_LINK_PAD(pad, aud_pad, ERROR); - } - if (adif_queue) - MEDIADEMUXER_SET_STATE(adif_queue, GST_STATE_PAUSED, ERROR); trck = head_track->head; while (trck != NULL && aud_srcpad != trck->pad) @@ -546,7 +557,7 @@ static int __gst_create_audio_only_pipeline(gpointer data, GstCaps *caps) if (trck != NULL) { if (trck->caps) gst_caps_unref(trck->caps); - trck->caps = caps; + trck->caps = gst_caps_copy(caps); if (trck->caps_string) g_free(trck->caps_string); trck->caps_string = gst_caps_to_string(trck->caps); @@ -556,19 +567,10 @@ static int __gst_create_audio_only_pipeline(gpointer data, GstCaps *caps) g_strlcpy(name, "audio", strlen(name)); trck->name = name; } + (head_track->num_audio_track)++; /* unref pads */ - if (pad) - gst_object_unref(pad); - if (aud_pad) - gst_object_unref(aud_pad); - if (fake_pad) - gst_object_unref(fake_pad); - if (queue_sinkpad) - gst_object_unref(queue_sinkpad); - if (queue_srcpad) - gst_object_unref(queue_srcpad); if (aud_srcpad) gst_object_unref(aud_srcpad); @@ -576,6 +578,7 @@ static int __gst_create_audio_only_pipeline(gpointer data, GstCaps *caps) g_free(type); MEDIADEMUXER_FLEAVE(); return MD_ERROR_NONE; + ERROR: gst_handle->is_valid_container = false; if (gst_handle->demux) @@ -588,10 +591,7 @@ ERROR: gst_object_unref(fake_pad); if (aud_srcpad) gst_object_unref(aud_srcpad); - if (queue_sinkpad) - gst_object_unref(queue_sinkpad); - if (queue_srcpad) - gst_object_unref(queue_srcpad); + g_free(type); MEDIADEMUXER_FLEAVE(); return MD_ERROR; @@ -1268,6 +1268,10 @@ static int _gst_copy_buf_to_media_packet(media_packet_h out_pkt, goto ERROR; } gst_buffer_unmap(codec_data, &codec_data_map); + + media_buffer_flags_e flags; + media_packet_get_flags(out_pkt, &flags); + media_packet_set_flags(out_pkt, flags | MEDIA_PACKET_CODEC_CONFIG); } ERROR: gst_buffer_unmap(buffer, &map); @@ -1275,6 +1279,36 @@ ERROR: return ret; } +static int _gst_demuxer_create_eos_packet(media_format_h fmt, media_packet_h *outbuf) +{ + media_packet_h mediabuf = NULL; + int ret = MD_ERROR_NONE; + + MEDIADEMUXER_FENTER(); + if (media_packet_create_alloc(fmt, NULL, NULL, &mediabuf)) { + MD_E("media_packet_create_alloc failed\n"); + ret = MD_ERROR; + goto ERROR; + } + + if (media_packet_set_flags(mediabuf, MEDIA_PACKET_END_OF_STREAM)) { + MD_E("unable to set EOS flag\n"); + ret = MD_ERROR_UNKNOWN; + goto ERROR; + } + + *outbuf = mediabuf; + MEDIADEMUXER_FLEAVE(); + + return ret; + ERROR: + if (mediabuf) + media_packet_destroy(mediabuf); + *outbuf = NULL; + MEDIADEMUXER_FLEAVE(); + return ret; +} + static int gst_demuxer_read_sample(MMHandleType pHandle, media_packet_h *outbuf, int track_indx) { @@ -1326,6 +1360,9 @@ static int gst_demuxer_read_sample(MMHandleType pHandle, ret = MD_ERROR_NONE; *outbuf = NULL; __gst_eos_callback(track_indx, demuxer); + + //Make EOS packet + _gst_demuxer_create_eos_packet(atrack->format, outbuf); return ret; } else { MD_E("gst_demuxer_read_sample failed\n"); @@ -1348,14 +1385,20 @@ static int gst_demuxer_read_sample(MMHandleType pHandle, goto ERROR; } - /* Create the codec data and pass to _gst_copy_buf_to_media_packet() to add into the media packet */ - GstStructure *structure = NULL; - const GValue *value = NULL; GstBuffer *codec_data_buffer = NULL; - structure = gst_caps_get_structure(atrack->caps, 0); - value = gst_structure_get_value(structure, "codec_data"); - if (value) - codec_data_buffer = gst_value_get_buffer(value); + /* Need to Check : Only the first frame need set codec_data, what about Resolution changed instance ...*/ + if (atrack->need_codec_data) { + atrack->need_codec_data = FALSE; + /* Create the codec data and pass to _gst_copy_buf_to_media_packet() to add into the media packet */ + GstStructure *structure = NULL; + const GValue *value = NULL; + + structure = gst_caps_get_structure(atrack->caps, 0); + /* get codec data from caps*/ + value = gst_structure_get_value(structure, "codec_data"); + if (value) + codec_data_buffer = gst_value_get_buffer(value); + } /* Fill the media_packet with proper information */ ret = _gst_copy_buf_to_media_packet(mediabuf, buffer, codec_data_buffer); @@ -1413,6 +1456,7 @@ static int gst_demuxer_seek(MMHandleType pHandle, gint64 pos1) while (temp) { MD_I("Got one element %p\n", temp->appsink); if (gst_handle->selected_tracks[indx] == true) { + temp->need_codec_data = TRUE; if (!gst_element_seek(temp->appsink, rate, GST_FORMAT_TIME, GST_SEEK_FLAG_FLUSH | GST_SEEK_FLAG_KEY_UNIT | GST_SEEK_FLAG_SNAP_BEFORE, GST_SEEK_TYPE_SET, pos, GST_SEEK_TYPE_NONE, GST_CLOCK_TIME_NONE)) { -- 2.7.4 From 9a04137e41e648c1423a94fb25c302af4f0a0920 Mon Sep 17 00:00:00 2001 From: Gilbok Lee Date: Tue, 29 Nov 2016 11:31:18 +0900 Subject: [PATCH 08/16] Fix svace issue (UNREACHABLE_CODE) [Version] 0.1.10 [Profile] Common, Mobile, Wearable, TV [Issue Type] Fix svace issue Change-Id: I89c59bd4f31d82812a0bd57fffe49bb9bae09b5d --- src/port_gst/mediademuxer_port_gst.c | 44 +++++++++++++----------------------- 1 file changed, 16 insertions(+), 28 deletions(-) diff --git a/src/port_gst/mediademuxer_port_gst.c b/src/port_gst/mediademuxer_port_gst.c index 32ea0da..09c696f 100755 --- a/src/port_gst/mediademuxer_port_gst.c +++ b/src/port_gst/mediademuxer_port_gst.c @@ -462,7 +462,7 @@ static int __gst_create_audio_only_pipeline(gpointer data, GstCaps *caps) gchar *name = NULL; gchar *type = NULL; track_info *head_track = &(gst_handle->info); - track *trck = NULL; + track *tmp_track = NULL; gst_handle->is_valid_container = true; @@ -550,22 +550,22 @@ static int __gst_create_audio_only_pipeline(gpointer data, GstCaps *caps) goto ERROR; } - trck = head_track->head; - while (trck != NULL && aud_srcpad != trck->pad) - trck = trck->next; - - if (trck != NULL) { - if (trck->caps) - gst_caps_unref(trck->caps); - trck->caps = gst_caps_copy(caps); - if (trck->caps_string) - g_free(trck->caps_string); - trck->caps_string = gst_caps_to_string(trck->caps); - MD_I("caps set to %s\n", trck->caps_string); - if (trck->name) - g_free(trck->name); + tmp_track = head_track->head; + while (tmp_track != NULL && aud_srcpad != tmp_track->pad) + tmp_track = tmp_track->next; + + if (tmp_track != NULL) { + if (tmp_track->caps) + gst_caps_unref(tmp_track->caps); + tmp_track->caps = gst_caps_copy(caps); + if (tmp_track->caps_string) + g_free(tmp_track->caps_string); + tmp_track->caps_string = gst_caps_to_string(tmp_track->caps); + MD_I("caps set to %s\n", tmp_track->caps_string); + if (tmp_track->name) + g_free(tmp_track->name); g_strlcpy(name, "audio", strlen(name)); - trck->name = name; + tmp_track->name = name; } (head_track->num_audio_track)++; @@ -1626,12 +1626,6 @@ int gst_set_error_cb(MMHandleType pHandle, MEDIADEMUXER_CHECK_NULL(pHandle); mdgst_handle_t *gst_handle = (mdgst_handle_t *) pHandle; - if (!gst_handle) { - MD_E("fail invaild param (gst_handle)\n"); - ret = MD_INVALID_ARG; - goto ERROR; - } - if (gst_handle->user_cb[_GST_EVENT_TYPE_ERROR]) { MD_E("Already set mediademuxer_error_cb\n"); ret = MD_ERROR_INVALID_ARGUMENT; @@ -1662,12 +1656,6 @@ int gst_set_eos_cb(MMHandleType pHandle, gst_eos_cb callback, void *user_data) MEDIADEMUXER_CHECK_NULL(pHandle); mdgst_handle_t *gst_handle = (mdgst_handle_t *) pHandle; - if (!gst_handle) { - MD_E("fail invaild param (gst_handle)\n"); - ret = MD_INVALID_ARG; - goto ERROR; - } - if (gst_handle->user_cb[_GST_EVENT_TYPE_EOS]) { MD_E("Already set mediademuxer_eos_cb\n"); ret = MD_ERROR_INVALID_ARGUMENT; -- 2.7.4 From c98a944c16fcf825108ff2739486ecdfee355458 Mon Sep 17 00:00:00 2001 From: Gilbok Lee Date: Tue, 29 Nov 2016 13:07:42 +0900 Subject: [PATCH 09/16] Update ini file path [Version] 0.1.10 [Profile] Common, Mobile, Wearable, TV [Issue Type] Fix bugs Change-Id: Id2f4d82eee37f4a6c4c5daa429b6d15536872da6 --- include/mediademuxer_ini.h | 2 +- packaging/capi-mediademuxer.spec | 1 + 2 files changed, 2 insertions(+), 1 deletion(-) diff --git a/include/mediademuxer_ini.h b/include/mediademuxer_ini.h index a8bb3bd..cc24adc 100755 --- a/include/mediademuxer_ini.h +++ b/include/mediademuxer_ini.h @@ -29,7 +29,7 @@ extern "C" { #endif -#define MEDIADEMUXER_INI_DEFAULT_PATH "/usr/etc/mmfw_mediademuxer.ini" +#define MEDIADEMUXER_INI_DEFAULT_PATH SYSCONFDIR"/multimedia/mmfw_mediademuxer.ini" #define MEDIADEMUXER_INI_MAX_STRLEN 100 #define DEFAULT_PORT "GST_PORT" diff --git a/packaging/capi-mediademuxer.spec b/packaging/capi-mediademuxer.spec index 1fdb02c..e171932 100755 --- a/packaging/capi-mediademuxer.spec +++ b/packaging/capi-mediademuxer.spec @@ -41,6 +41,7 @@ export FFLAGS="$FFLAGS -DTIZEN_DEBUG_ENABLE" %ifarch %{arm} export CFLAGS="$CFLAGS -DENABLE_FFMPEG_CODEC" %endif +export CFLAGS="$CFLAGS -DSYSCONFDIR=\\\"%{_sysconfdir}\\\" " MAJORVER=`echo %{version} | awk 'BEGIN {FS="."}{print $1}'` %cmake . -DCMAKE_INSTALL_PREFIX=%{_prefix} -DFULLVER=%{version} -DMAJORVER=${MAJORVER} -- 2.7.4 From e98b1220828f667b3d71c4171fe9f9d83ca210c4 Mon Sep 17 00:00:00 2001 From: Gilbok Lee Date: Mon, 5 Dec 2016 12:49:01 +0900 Subject: [PATCH 10/16] Support avi file format Apply tizen coding rule [Version] 0.1.11 [Profile] Common, Mobile, Wearable, TV [Issue Type] Add features Change-Id: I5da7d4dc269cf3a2934c5af7d16c9e6b30d83936 --- include/mediademuxer_port.h | 4 +- include/mediademuxer_util.h | 22 +++++---- packaging/capi-mediademuxer.spec | 2 +- src/mediademuxer.c | 68 ++++++++++++++-------------- src/mediademuxer_port.c | 36 +++++++-------- src/port_gst/mediademuxer_port_gst.c | 88 +++++++++++++++++------------------- test/mediademuxer_test.c | 6 +-- 7 files changed, 111 insertions(+), 115 deletions(-) diff --git a/include/mediademuxer_port.h b/include/mediademuxer_port.h index 1d671ce..34c805f 100755 --- a/include/mediademuxer_port.h +++ b/include/mediademuxer_port.h @@ -359,8 +359,8 @@ typedef struct _media_port_demuxer_ops { int (*stop)(MMHandleType pHandle); int (*unprepare)(MMHandleType pHandle); int (*destroy)(MMHandleType pHandle); - int (*set_error_cb)(MMHandleType demuxer, md_error_cb callback, void* user_data); - int (*set_eos_cb)(MMHandleType demuxer, md_eos_cb callback, void* user_data); + int (*set_error_cb)(MMHandleType demuxer, md_error_cb callback, void *user_data); + int (*set_eos_cb)(MMHandleType demuxer, md_eos_cb callback, void *user_data); int (*get_data)(MMHandleType pHandle, char *buffer); } media_port_demuxer_ops; diff --git a/include/mediademuxer_util.h b/include/mediademuxer_util.h index 7319515..01c0670 100755 --- a/include/mediademuxer_util.h +++ b/include/mediademuxer_util.h @@ -77,17 +77,21 @@ extern "C" { #endif #define MEDIADEMUXER_CHECK_NULL(x_var) \ - if (!x_var) { \ - MD_E("[%s] is NULL\n", #x_var); \ - return MD_ERROR_INVALID_ARGUMENT; \ - } + do { \ + if (!x_var) { \ + MD_E("[%s] is NULL\n", #x_var); \ + return MD_ERROR_INVALID_ARGUMENT; \ + } \ + } while (0) #define MEDIADEMUXER_CHECK_SET_AND_PRINT(x_var, x_cond, ret, ret_val, err_text) \ - if (x_var != x_cond) { \ - ret = ret_val; \ - MD_E("%s\n", #err_text); \ - goto ERROR; \ - } + do { \ + if (x_var != x_cond) { \ + ret = ret_val; \ + MD_E("%s\n", #err_text); \ + goto ERROR; \ + } \ + } while (0) #ifdef __cplusplus } diff --git a/packaging/capi-mediademuxer.spec b/packaging/capi-mediademuxer.spec index e171932..e0ed499 100755 --- a/packaging/capi-mediademuxer.spec +++ b/packaging/capi-mediademuxer.spec @@ -1,6 +1,6 @@ Name: capi-mediademuxer Summary: A Media Demuxer library in Tizen Native API -Version: 0.1.10 +Version: 0.1.11 Release: 1 Group: Multimedia/API License: Apache-2.0 diff --git a/src/mediademuxer.c b/src/mediademuxer.c index 8545c6e..35cbc15 100755 --- a/src/mediademuxer.c +++ b/src/mediademuxer.c @@ -64,17 +64,15 @@ int mediademuxer_create(mediademuxer_h *demuxer) handle = NULL; return MEDIADEMUXER_ERROR_INVALID_OPERATION; } else { - *demuxer = (mediademuxer_h) handle; + *demuxer = (mediademuxer_h)handle; handle->is_stopped = false; MD_I("[CoreAPI][%s] new handle : %p", __FUNCTION__, *demuxer); } /* set callback */ md_set_error_cb(handle->md_handle, - (mediademuxer_error_cb) _mediademuxer_error_cb, - handle); + (mediademuxer_error_cb)_mediademuxer_error_cb, handle); md_set_eos_cb(handle->md_handle, - (mediademuxer_eos_cb) _mediademuxer_eos_cb, - handle); + (mediademuxer_eos_cb)_mediademuxer_eos_cb, handle); handle->demux_state = MEDIADEMUXER_STATE_IDLE; return MEDIADEMUXER_ERROR_NONE; @@ -86,9 +84,9 @@ int mediademuxer_set_data_source(mediademuxer_h demuxer, const char *path) mediademuxer_error_e ret = MEDIADEMUXER_ERROR_NONE; DEMUXER_INSTANCE_CHECK(demuxer); mediademuxer_s *handle; - handle = (mediademuxer_s *)(demuxer); + handle = (mediademuxer_s *)demuxer; if (handle && path && handle->demux_state == MEDIADEMUXER_STATE_IDLE) { - ret = md_set_data_source((MMHandleType) (handle->md_handle), path); + ret = md_set_data_source((MMHandleType)handle->md_handle, path); if (ret != MEDIADEMUXER_ERROR_NONE) { MD_E("[CoreAPI][%s] DEMUXER_ERROR_INVALID_OPERATION(0x%08x)", __FUNCTION__, MEDIADEMUXER_ERROR_INVALID_PATH); @@ -116,9 +114,9 @@ int mediademuxer_prepare(mediademuxer_h demuxer) mediademuxer_error_e ret = MEDIADEMUXER_ERROR_NONE; DEMUXER_INSTANCE_CHECK(demuxer); mediademuxer_s *handle; - handle = (mediademuxer_s *)(demuxer); + handle = (mediademuxer_s *)demuxer; if (handle && handle->demux_state == MEDIADEMUXER_STATE_IDLE && handle->eos_cb != NULL) { - ret = md_prepare((MMHandleType) (handle->md_handle)); + ret = md_prepare((MMHandleType)handle->md_handle); if (ret != MEDIADEMUXER_ERROR_NONE) { MD_E("[CoreAPI][%s] DEMUXER_ERROR_INVALID_OPERATION(0x%08x)", __FUNCTION__, MEDIADEMUXER_ERROR_INVALID_OPERATION); @@ -144,9 +142,9 @@ int mediademuxer_get_track_count(mediademuxer_h demuxer, int *count) mediademuxer_error_e ret; DEMUXER_INSTANCE_CHECK(demuxer); mediademuxer_s *handle; - handle = (mediademuxer_s *)(demuxer); + handle = (mediademuxer_s *)demuxer; if (handle && handle->demux_state == MEDIADEMUXER_STATE_READY) { - ret = md_get_track_count((MMHandleType) (handle->md_handle), count); + ret = md_get_track_count((MMHandleType)handle->md_handle, count); if (ret != MEDIADEMUXER_ERROR_NONE) { MD_E("[CoreAPI][%s] DEMUXER_ERROR_INVALID_OPERATION(0x%08x)", __FUNCTION__, MEDIADEMUXER_ERROR_INVALID_OPERATION); @@ -168,9 +166,9 @@ int mediademuxer_select_track(mediademuxer_h demuxer, int track_index) mediademuxer_error_e ret; DEMUXER_INSTANCE_CHECK(demuxer); mediademuxer_s *handle; - handle = (mediademuxer_s *)(demuxer); + handle = (mediademuxer_s *)demuxer; if (handle && handle->demux_state == MEDIADEMUXER_STATE_READY) { - ret = md_select_track((MMHandleType) (handle->md_handle), track_index); + ret = md_select_track((MMHandleType)handle->md_handle, track_index); if (ret != MEDIADEMUXER_ERROR_NONE) { MD_E("[CoreAPI][%s] DEMUXER_ERROR_INVALID_OPERATION(0x%08x)", __FUNCTION__, MEDIADEMUXER_ERROR_INVALID_OPERATION); @@ -192,9 +190,9 @@ int mediademuxer_start(mediademuxer_h demuxer) mediademuxer_error_e ret; DEMUXER_INSTANCE_CHECK(demuxer); mediademuxer_s *handle; - handle = (mediademuxer_s *)(demuxer); + handle = (mediademuxer_s *)demuxer; if (handle && handle->demux_state == MEDIADEMUXER_STATE_READY) { - ret = md_start((MMHandleType) (handle->md_handle)); + ret = md_start((MMHandleType)handle->md_handle); if (ret != MEDIADEMUXER_ERROR_NONE) { MD_E("[CoreAPI][%s] DEMUXER_ERROR_INVALID_OPERATION(0x%08x)", __FUNCTION__, MEDIADEMUXER_ERROR_INVALID_OPERATION); @@ -219,14 +217,14 @@ int mediademuxer_get_track_info(mediademuxer_h demuxer, int track_index, mediademuxer_error_e ret; DEMUXER_INSTANCE_CHECK(demuxer); mediademuxer_s *handle; - handle = (mediademuxer_s *)(demuxer); + handle = (mediademuxer_s *)demuxer; if (track_index < 0 || format == NULL) { MD_E("Invalid input parameters\n"); return MEDIADEMUXER_ERROR_INVALID_PARAMETER; } if (handle && (handle->demux_state == MEDIADEMUXER_STATE_READY || handle->demux_state == MEDIADEMUXER_STATE_DEMUXING)) { - ret = md_get_track_info((MMHandleType) (handle->md_handle), track_index, format); + ret = md_get_track_info((MMHandleType)handle->md_handle, track_index, format); if (ret != MEDIADEMUXER_ERROR_NONE) { MD_E("[CoreAPI][%s] DEMUXER_ERROR_INVALID_OPERATION(0x%08x)", __FUNCTION__, MEDIADEMUXER_ERROR_INVALID_OPERATION); @@ -249,11 +247,11 @@ int mediademuxer_read_sample(mediademuxer_h demuxer, int track_index, mediademuxer_error_e ret; DEMUXER_INSTANCE_CHECK(demuxer); mediademuxer_s *handle; - handle = (mediademuxer_s *)(demuxer); + handle = (mediademuxer_s *)demuxer; if (outbuf == NULL || track_index < 0) return MEDIADEMUXER_ERROR_INVALID_PARAMETER; if (handle && handle->demux_state == MEDIADEMUXER_STATE_DEMUXING) { - ret = md_read_sample((MMHandleType) (handle->md_handle), track_index, outbuf); + ret = md_read_sample((MMHandleType)handle->md_handle, track_index, outbuf); if (ret != MEDIADEMUXER_ERROR_NONE) { MD_E("[CoreAPI][%s] DEMUXER_ERROR_INVALID_OPERATION(0x%08x)", __FUNCTION__, MEDIADEMUXER_ERROR_INVALID_OPERATION); @@ -275,9 +273,9 @@ int mediademuxer_seek(mediademuxer_h demuxer, int64_t pos) mediademuxer_error_e ret; DEMUXER_INSTANCE_CHECK(demuxer); mediademuxer_s *handle; - handle = (mediademuxer_s *)(demuxer); + handle = (mediademuxer_s *)demuxer; if (handle && handle->demux_state == MEDIADEMUXER_STATE_DEMUXING) { - ret = md_seek((MMHandleType) (handle->md_handle), pos); + ret = md_seek((MMHandleType)handle->md_handle, pos); if (ret != MEDIADEMUXER_ERROR_NONE) { MD_E("[CoreAPI][%s] DEMUXER_ERROR_INVALID_OPERATION(0x%08x)", __FUNCTION__, MEDIADEMUXER_ERROR_INVALID_OPERATION); @@ -299,10 +297,10 @@ int mediademuxer_unselect_track(mediademuxer_h demuxer, int track_index) mediademuxer_error_e ret; DEMUXER_INSTANCE_CHECK(demuxer); mediademuxer_s *handle; - handle = (mediademuxer_s *)(demuxer); + handle = (mediademuxer_s *)demuxer; if (handle && (handle->demux_state == MEDIADEMUXER_STATE_READY || handle->demux_state == MEDIADEMUXER_STATE_DEMUXING)) { - ret = md_unselect_track((MMHandleType) (handle->md_handle), track_index); + ret = md_unselect_track((MMHandleType)handle->md_handle, track_index); if (ret != MEDIADEMUXER_ERROR_NONE) { MD_E("[CoreAPI][%s] DEMUXER_ERROR_INVALID_OPERATION(0x%08x)", __FUNCTION__, MEDIADEMUXER_ERROR_INVALID_OPERATION); @@ -324,9 +322,9 @@ int mediademuxer_stop(mediademuxer_h demuxer) mediademuxer_error_e ret; DEMUXER_INSTANCE_CHECK(demuxer); mediademuxer_s *handle; - handle = (mediademuxer_s *)(demuxer); + handle = (mediademuxer_s *)demuxer; if (handle && handle->demux_state == MEDIADEMUXER_STATE_DEMUXING) { - ret = md_stop((MMHandleType) (handle->md_handle)); + ret = md_stop((MMHandleType)handle->md_handle); if (ret != MEDIADEMUXER_ERROR_NONE) { MD_E("[CoreAPI][%s] DEMUXER_ERROR_INVALID_OPERATION(0x%08x)", __FUNCTION__, MEDIADEMUXER_ERROR_INVALID_OPERATION); @@ -349,9 +347,9 @@ int mediademuxer_unprepare(mediademuxer_h demuxer) mediademuxer_error_e ret; DEMUXER_INSTANCE_CHECK(demuxer); mediademuxer_s *handle; - handle = (mediademuxer_s *)(demuxer); + handle = (mediademuxer_s *)demuxer; if (handle && handle->demux_state == MEDIADEMUXER_STATE_READY) { - ret = md_unprepare((MMHandleType) (handle->md_handle)); + ret = md_unprepare((MMHandleType)handle->md_handle); if (ret != MEDIADEMUXER_ERROR_NONE) { MD_E("[CoreAPI][%s] DEMUXER_ERROR_INVALID_OPERATION(0x%08x)", __FUNCTION__, MEDIADEMUXER_ERROR_INVALID_OPERATION); @@ -374,9 +372,9 @@ int mediademuxer_destroy(mediademuxer_h demuxer) mediademuxer_error_e ret; DEMUXER_INSTANCE_CHECK(demuxer); mediademuxer_s *handle; - handle = (mediademuxer_s *)(demuxer); + handle = (mediademuxer_s *)demuxer; if (handle && handle->demux_state == MEDIADEMUXER_STATE_IDLE) { - ret = md_destroy(handle->md_handle); + ret = md_destroy((MMHandleType)handle->md_handle); if (ret != MEDIADEMUXER_ERROR_NONE) { MD_E("[CoreAPI][%s] DEMUXER_ERROR_INVALID_OPERATION(0x%08x)", __FUNCTION__, MEDIADEMUXER_ERROR_INVALID_OPERATION); @@ -399,7 +397,7 @@ int mediademuxer_get_state(mediademuxer_h demuxer, mediademuxer_state *state) { mediademuxer_error_e ret = MEDIADEMUXER_ERROR_NONE; DEMUXER_INSTANCE_CHECK(demuxer); - mediademuxer_s *handle = (mediademuxer_s *)(demuxer); + mediademuxer_s *handle = (mediademuxer_s *)demuxer; if (state != NULL) { *state = handle->demux_state; } else { @@ -415,7 +413,7 @@ int mediademuxer_set_error_cb(mediademuxer_h demuxer, { DEMUXER_INSTANCE_CHECK(demuxer); mediademuxer_s *handle; - handle = (mediademuxer_s *)(demuxer); + handle = (mediademuxer_s *)demuxer; if (handle->demux_state != MEDIADEMUXER_STATE_IDLE) return MEDIADEMUXER_ERROR_INVALID_STATE; handle->error_cb = callback; @@ -428,7 +426,7 @@ int mediademuxer_unset_error_cb(mediademuxer_h demuxer) { DEMUXER_INSTANCE_CHECK(demuxer); mediademuxer_s *handle; - handle = (mediademuxer_s *)(demuxer); + handle = (mediademuxer_s *)demuxer; if (handle->demux_state != MEDIADEMUXER_STATE_IDLE) return MEDIADEMUXER_ERROR_INVALID_STATE; handle->error_cb = NULL; @@ -443,7 +441,7 @@ static gboolean _mediademuxer_error_cb(mediademuxer_error_e error, void *user_da MD_I("_mediademuxer_error_cb: ERROR %d to report. But call back is not set\n", error); return 0; } - mediademuxer_s * handle = (mediademuxer_s *) user_data; + mediademuxer_s * handle = (mediademuxer_s *)user_data; if (handle->demux_state != MEDIADEMUXER_STATE_IDLE) return MEDIADEMUXER_ERROR_INVALID_STATE; if (handle->error_cb) @@ -458,7 +456,7 @@ int mediademuxer_set_eos_cb(mediademuxer_h demuxer, { DEMUXER_INSTANCE_CHECK(demuxer); mediademuxer_s *handle; - handle = (mediademuxer_s *)(demuxer); + handle = (mediademuxer_s *)demuxer; if (handle->demux_state != MEDIADEMUXER_STATE_IDLE) return MEDIADEMUXER_ERROR_INVALID_STATE; handle->eos_cb = callback; @@ -471,7 +469,7 @@ int mediademuxer_unset_eos_cb(mediademuxer_h demuxer) { DEMUXER_INSTANCE_CHECK(demuxer); mediademuxer_s *handle; - handle = (mediademuxer_s *)(demuxer); + handle = (mediademuxer_s *)demuxer; if (handle->demux_state != MEDIADEMUXER_STATE_IDLE) return MEDIADEMUXER_ERROR_INVALID_STATE; handle->eos_cb = NULL; diff --git a/src/mediademuxer_port.c b/src/mediademuxer_port.c index 7abee84..2a503de 100755 --- a/src/mediademuxer_port.c +++ b/src/mediademuxer_port.c @@ -61,13 +61,13 @@ int md_create(MMHandleType *demuxer) media_port_demuxer_ops *pOps = NULL; md_handle_t *new_demuxer = NULL; MEDIADEMUXER_FENTER(); - new_demuxer = (md_handle_t *) g_malloc(sizeof(md_handle_t)); + new_demuxer = (md_handle_t *)g_malloc(sizeof(md_handle_t)); MD_I("md_create allocatiing new_demuxer %p:\n", new_demuxer); MEDIADEMUXER_CHECK_NULL(new_demuxer); memset(new_demuxer, 0, sizeof(md_handle_t)); /* alloc ops structure */ - pOps = (media_port_demuxer_ops *) g_malloc(sizeof(media_port_demuxer_ops)); + pOps = (media_port_demuxer_ops *)g_malloc(sizeof(media_port_demuxer_ops)); MEDIADEMUXER_CHECK_NULL(pOps); new_demuxer->demuxer_ops = pOps; @@ -86,11 +86,11 @@ int md_create(MMHandleType *demuxer) result = pOps->init(&new_demuxer->mdport_handle); MEDIADEMUXER_CHECK_SET_AND_PRINT(result, MD_ERROR_NONE, result, MD_NOT_INITIALIZED, "md_create failed"); - *demuxer = (MMHandleType) new_demuxer; + *demuxer = (MMHandleType)new_demuxer; MEDIADEMUXER_FLEAVE(); return result; ERROR: - *demuxer = (MMHandleType) 0; + *demuxer = (MMHandleType)0; if (pOps) g_free(pOps); if (new_demuxer) @@ -250,7 +250,7 @@ int _md_util_parse(MMHandleType demuxer, const char *type) md_handle_t *new_demuxer = NULL; MEDIADEMUXER_FENTER(); MEDIADEMUXER_CHECK_NULL(demuxer); - new_demuxer = (md_handle_t *) demuxer; + new_demuxer = (md_handle_t *)demuxer; lenght_string = strlen(type); media_type_string = (char *)g_malloc(sizeof(char) * (lenght_string + 1)); MEDIADEMUXER_CHECK_NULL(media_type_string); @@ -303,7 +303,7 @@ ERROR: int md_prepare(MMHandleType demuxer) { int result = MD_ERROR_NONE; - md_handle_t *md_handle = (md_handle_t *) demuxer; + md_handle_t *md_handle = (md_handle_t *)demuxer; MEDIADEMUXER_FENTER(); MEDIADEMUXER_CHECK_NULL(md_handle); media_port_demuxer_ops *pOps = md_handle->demuxer_ops; @@ -323,7 +323,7 @@ ERROR: int md_get_track_count(MMHandleType demuxer, int *count) { int result = MD_ERROR_NONE; - md_handle_t *md_handle = (md_handle_t *) demuxer; + md_handle_t *md_handle = (md_handle_t *)demuxer; MEDIADEMUXER_FENTER(); MEDIADEMUXER_CHECK_NULL(md_handle); media_port_demuxer_ops *pOps = md_handle->demuxer_ops; @@ -343,7 +343,7 @@ ERROR: int md_select_track(MMHandleType demuxer, int track) { int result = MD_ERROR_NONE; - md_handle_t *md_handle = (md_handle_t *) demuxer; + md_handle_t *md_handle = (md_handle_t *)demuxer; MEDIADEMUXER_FENTER(); MEDIADEMUXER_CHECK_NULL(md_handle); media_port_demuxer_ops *pOps = md_handle->demuxer_ops; @@ -362,7 +362,7 @@ ERROR: int md_start(MMHandleType demuxer) { int result = MD_ERROR_NONE; - md_handle_t *md_handle = (md_handle_t *) demuxer; + md_handle_t *md_handle = (md_handle_t *)demuxer; MEDIADEMUXER_FENTER(); MEDIADEMUXER_CHECK_NULL(md_handle); media_port_demuxer_ops *pOps = md_handle->demuxer_ops; @@ -381,7 +381,7 @@ ERROR: int md_get_track_info(MMHandleType demuxer, int track, media_format_h *format) { int result = MD_ERROR_NONE; - md_handle_t *md_handle = (md_handle_t *) demuxer; + md_handle_t *md_handle = (md_handle_t *)demuxer; MEDIADEMUXER_FENTER(); MEDIADEMUXER_CHECK_NULL(md_handle); media_port_demuxer_ops *pOps = md_handle->demuxer_ops; @@ -401,7 +401,7 @@ ERROR: int md_read_sample(MMHandleType demuxer, int track_indx, media_packet_h *outbuf) { int result = MD_ERROR_NONE; - md_handle_t *md_handle = (md_handle_t *) demuxer; + md_handle_t *md_handle = (md_handle_t *)demuxer; MEDIADEMUXER_FENTER(); MEDIADEMUXER_CHECK_NULL(md_handle); media_port_demuxer_ops *pOps = md_handle->demuxer_ops; @@ -423,7 +423,7 @@ ERROR: int md_seek(MMHandleType demuxer, int64_t pos) { int result = MD_ERROR_NONE; - md_handle_t *md_handle = (md_handle_t *) demuxer; + md_handle_t *md_handle = (md_handle_t *)demuxer; MEDIADEMUXER_FENTER(); MEDIADEMUXER_CHECK_NULL(md_handle); media_port_demuxer_ops *pOps = md_handle->demuxer_ops; @@ -442,7 +442,7 @@ ERROR: int md_unselect_track(MMHandleType demuxer, int track) { int result = MD_ERROR_NONE; - md_handle_t *md_handle = (md_handle_t *) demuxer; + md_handle_t *md_handle = (md_handle_t *)demuxer; MEDIADEMUXER_FENTER(); MEDIADEMUXER_CHECK_NULL(md_handle); media_port_demuxer_ops *pOps = md_handle->demuxer_ops; @@ -461,7 +461,7 @@ ERROR: int md_stop(MMHandleType demuxer) { int result = MD_ERROR_NONE; - md_handle_t *md_handle = (md_handle_t *) demuxer; + md_handle_t *md_handle = (md_handle_t *)demuxer; MEDIADEMUXER_FENTER(); MEDIADEMUXER_CHECK_NULL(md_handle); media_port_demuxer_ops *pOps = md_handle->demuxer_ops; @@ -480,7 +480,7 @@ ERROR: int md_unprepare(MMHandleType demuxer) { int result = MD_ERROR_NONE; - md_handle_t *md_handle = (md_handle_t *) demuxer; + md_handle_t *md_handle = (md_handle_t *)demuxer; MEDIADEMUXER_FENTER(); MEDIADEMUXER_CHECK_NULL(md_handle); media_port_demuxer_ops *pOps = md_handle->demuxer_ops; @@ -499,7 +499,7 @@ ERROR: int md_destroy(MMHandleType demuxer) { int result = MD_ERROR_NONE; - md_handle_t *md_handle = (md_handle_t *) demuxer; + md_handle_t *md_handle = (md_handle_t *)demuxer; MEDIADEMUXER_CHECK_NULL(md_handle); MEDIADEMUXER_FENTER(); media_port_demuxer_ops *pOps = md_handle->demuxer_ops; @@ -535,7 +535,7 @@ int md_set_error_cb(MMHandleType demuxer, { MEDIADEMUXER_FENTER(); int result = MD_ERROR_NONE; - md_handle_t *md_handle = (md_handle_t *) demuxer; + md_handle_t *md_handle = (md_handle_t *)demuxer; MEDIADEMUXER_CHECK_NULL(md_handle); media_port_demuxer_ops *pOps = md_handle->demuxer_ops; MEDIADEMUXER_CHECK_NULL(pOps); @@ -555,7 +555,7 @@ int md_set_eos_cb(MMHandleType demuxer, { MEDIADEMUXER_FENTER(); int result = MD_ERROR_NONE; - md_handle_t *md_handle = (md_handle_t *) demuxer; + md_handle_t *md_handle = (md_handle_t *)demuxer; MEDIADEMUXER_CHECK_NULL(md_handle); media_port_demuxer_ops *pOps = md_handle->demuxer_ops; MEDIADEMUXER_CHECK_NULL(pOps); diff --git a/src/port_gst/mediademuxer_port_gst.c b/src/port_gst/mediademuxer_port_gst.c index 09c696f..b9d9b4f 100755 --- a/src/port_gst/mediademuxer_port_gst.c +++ b/src/port_gst/mediademuxer_port_gst.c @@ -42,10 +42,10 @@ static int gst_demuxer_stop(MMHandleType pHandle); static int gst_demuxer_unprepare(MMHandleType pHandle); static int gst_demuxer_destroy(MMHandleType pHandle); static int gst_set_error_cb(MMHandleType pHandle, - gst_error_cb callback, void* user_data); + gst_error_cb callback, void *user_data); static int gst_set_eos_cb(MMHandleType pHandle, gst_eos_cb callback, void *user_data); -static int __gst_eos_callback(int track_num, void* user_data); +static int __gst_eos_callback(int track_num, void *user_data); /* Media Demuxer API common */ static media_port_demuxer_ops def_demux_ops = { @@ -86,7 +86,7 @@ static int gst_demuxer_init(MMHandleType *pHandle) MEDIADEMUXER_FENTER(); int ret = MD_ERROR_NONE; mdgst_handle_t *new_mediademuxer = NULL; - new_mediademuxer = (mdgst_handle_t *) g_malloc(sizeof(mdgst_handle_t)); + new_mediademuxer = (mdgst_handle_t *)g_malloc(sizeof(mdgst_handle_t)); MD_I("gst_demuxer_init allocating new_mediademuxer:%p\n", new_mediademuxer); if (!new_mediademuxer) { MD_E("Cannot allocate memory for demuxer\n"); @@ -100,7 +100,7 @@ static int gst_demuxer_init(MMHandleType *pHandle) (new_mediademuxer->info).num_subtitle_track = 0; (new_mediademuxer->info).num_other_track = 0; (new_mediademuxer->info).head = NULL; - *pHandle = (MMHandleType) new_mediademuxer; + *pHandle = (MMHandleType)new_mediademuxer; new_mediademuxer->total_tracks = 0; MEDIADEMUXER_FLEAVE(); return ret; @@ -139,7 +139,7 @@ gboolean __gst_bus_call(GstBus *bus, GstMessage *msg, gpointer data) static void __gst_no_more_pad(GstElement *element, gpointer data) { MEDIADEMUXER_FENTER(); - mdgst_handle_t *gst_handle = (mdgst_handle_t *) data; + mdgst_handle_t *gst_handle = (mdgst_handle_t *)data; int loop_track; track_info *head_track = &(gst_handle->info); track *head = head_track->head; @@ -293,7 +293,7 @@ int __gst_add_track_info(GstPad *pad, gchar *name, track **head, MD_E("factory not able to make h264parse"); goto ERROR; } - } else if(strstr(temp->caps_string, "mpeg")) { + } else if (strstr(temp->caps_string, "mpeg")) { parse_element = gst_element_factory_make("mpeg4videoparse", NULL); if (!parse_element) { MD_E("factory not able to make h264parse"); @@ -302,7 +302,7 @@ int __gst_add_track_info(GstPad *pad, gchar *name, track **head, g_object_set(G_OBJECT(parse_element), "config-interval", 1, NULL); } - if(parse_element) { + if (parse_element) { gst_bin_add(GST_BIN(pipeline), parse_element); parse_sink_pad = gst_element_get_static_pad(parse_element, "sink"); if (!parse_sink_pad) { @@ -324,16 +324,16 @@ int __gst_add_track_info(GstPad *pad, gchar *name, track **head, MEDIADEMUXER_LINK_PAD(queue_src_pad, apppad, ERROR); } } - } else if(strstr(name, "audio")) { + } else if (strstr(name, "audio")) { //Create Parse if (strstr(temp->caps_string, "audio/mpeg")) { int mpegversion = 0; GstStructure *structure = NULL; structure = gst_caps_get_structure(temp->caps, 0); gst_structure_get_int (structure, "mpegversion", &mpegversion); - if(mpegversion == 2 || mpegversion == 4) + if (mpegversion == 2 || mpegversion == 4) parse_element = gst_element_factory_make("aacparse", NULL); - else if(mpegversion == 1) + else if (mpegversion == 1) parse_element = gst_element_factory_make("mpegaudioparse", NULL); } else if (strstr(temp->caps_string, "application/x-id3")) { parse_element = gst_element_factory_make("mpegaudioparse", NULL); @@ -412,7 +412,7 @@ static void __gst_on_pad_added(GstElement *element, GstPad *pad, gpointer data) MEDIADEMUXER_FENTER(); MD_I("Dynamic pad created, linking demuxer/decoder\n"); track *tmp = NULL; - mdgst_handle_t *gst_handle = (mdgst_handle_t *) data; + mdgst_handle_t *gst_handle = (mdgst_handle_t *)data; track_info *head_track = &(gst_handle->info); gchar *name = gst_pad_get_name(pad); gst_handle->total_tracks++; @@ -453,7 +453,7 @@ static void __gst_on_pad_added(GstElement *element, GstPad *pad, gpointer data) static int __gst_create_audio_only_pipeline(gpointer data, GstCaps *caps) { MEDIADEMUXER_FENTER(); - mdgst_handle_t *gst_handle = (mdgst_handle_t *) data; + mdgst_handle_t *gst_handle = (mdgst_handle_t *)data; GstPad *pad = NULL; GstPad *aud_pad = NULL; GstPad *aud_srcpad = NULL; @@ -601,7 +601,7 @@ static void __gst_cb_typefind(GstElement *tf, guint probability, GstCaps *caps, gpointer data) { MEDIADEMUXER_FENTER(); - mdgst_handle_t *gst_handle = (mdgst_handle_t *) data; + mdgst_handle_t *gst_handle = (mdgst_handle_t *)data; GstPad *pad = NULL; GstPad *demuxer_pad = NULL; GstPad *fake_pad = NULL; @@ -610,12 +610,14 @@ static void __gst_cb_typefind(GstElement *tf, guint probability, if (type) { MD_I("Media type %s found, probability %d%%\n", type, probability); if (strstr(type, "quicktime") || (strstr(type, "audio/x-m4a")) || strstr(type, "x-3gp") - || strstr(type, "ogg") || strstr(type, "flv")) { + || strstr(type, "ogg") || strstr(type, "flv") || strstr(type, "x-msvideo")) { gst_handle->is_valid_container = true; if (strstr(type, "ogg")) gst_handle->demux = gst_element_factory_make("oggdemux", NULL); else if (strstr(type, "flv")) gst_handle->demux = gst_element_factory_make("flvdemux", NULL); + else if (strstr(type, "x-msvideo")) + gst_handle->demux = gst_element_factory_make("avidemux", NULL); else gst_handle->demux = gst_element_factory_make("qtdemux", NULL); @@ -787,7 +789,7 @@ static int gst_demuxer_prepare(MMHandleType pHandle, char *uri) MEDIADEMUXER_FENTER(); int ret = MD_ERROR_NONE; MEDIADEMUXER_CHECK_NULL(pHandle); - mdgst_handle_t *new_mediademuxer = (mdgst_handle_t *) pHandle; + mdgst_handle_t *new_mediademuxer = (mdgst_handle_t *)pHandle; MD_I("gst_demuxer_prepare Creating pipeline %p", new_mediademuxer); ret = _gst_create_pipeline(new_mediademuxer, uri); @@ -807,7 +809,7 @@ static int gst_demuxer_get_data_count(MMHandleType pHandle, int *count) MEDIADEMUXER_FENTER(); int ret = MD_ERROR_NONE; MEDIADEMUXER_CHECK_NULL(pHandle); - mdgst_handle_t *new_mediademuxer = (mdgst_handle_t *) pHandle; + mdgst_handle_t *new_mediademuxer = (mdgst_handle_t *)pHandle; *count = (new_mediademuxer->info).num_video_track + (new_mediademuxer->info).num_audio_track + @@ -838,7 +840,7 @@ static int gst_demuxer_set_track(MMHandleType pHandle, int track) MEDIADEMUXER_FENTER(); int ret = MD_ERROR_NONE; MEDIADEMUXER_CHECK_NULL(pHandle); - mdgst_handle_t *new_mediademuxer = (mdgst_handle_t *) pHandle; + mdgst_handle_t *new_mediademuxer = (mdgst_handle_t *)pHandle; MD_I("total_tracks (%d) :: selected track (%d)", new_mediademuxer->total_tracks, track); if (track >= new_mediademuxer->total_tracks || track < 0) { @@ -847,7 +849,7 @@ static int gst_demuxer_set_track(MMHandleType pHandle, int track) goto ERROR; } new_mediademuxer->selected_tracks[track] = true; - _gst_set_appsink((((mdgst_handle_t *) pHandle)->info).head, track, + _gst_set_appsink((((mdgst_handle_t *)pHandle)->info).head, track, new_mediademuxer->total_tracks); MEDIADEMUXER_FLEAVE(); return MD_ERROR_NONE; @@ -884,7 +886,7 @@ static int gst_demuxer_start(MMHandleType pHandle) MEDIADEMUXER_FENTER(); int ret = MD_ERROR_NONE; MEDIADEMUXER_CHECK_NULL(pHandle); - mdgst_handle_t *gst_handle = (mdgst_handle_t *) pHandle; + mdgst_handle_t *gst_handle = (mdgst_handle_t *)pHandle; int indx; for (indx = 0; indx < gst_handle->total_tracks; indx++) { @@ -895,7 +897,7 @@ static int gst_demuxer_start(MMHandleType pHandle) _gst_demuxer_unset(pHandle, indx); */ if (gst_handle->selected_tracks[indx] != true) { - if (_gst_unlink_unselected_track((((mdgst_handle_t *) pHandle)->info).head, indx) != MD_ERROR_NONE) { + if (_gst_unlink_unselected_track((((mdgst_handle_t *)pHandle)->info).head, indx) != MD_ERROR_NONE) { MD_E("Failed to unlink unselected tracks\n"); ret = MD_INTERNAL_ERROR; goto ERROR; @@ -978,13 +980,7 @@ int _set_mime_video(media_format_h format, track *head) goto ERROR; } if (gst_structure_has_name(struc, "video/x-h264")) { - const gchar *version = gst_structure_get_string(struc, "stream-format"); - if (strncmp(version, "avc", 3) == 0) { - mime_type = MEDIA_FORMAT_H264_SP; - } else { - MD_W("Video mime (%s) not supported so far\n", gst_structure_get_name(struc)); - goto ERROR; - } + mime_type = MEDIA_FORMAT_H264_SP; } else if (gst_structure_has_name(struc, "video/x-h263")) { mime_type = MEDIA_FORMAT_H263; } else if (gst_structure_has_name(struc, "video/mpeg")) { @@ -1117,7 +1113,7 @@ static int gst_demuxer_get_track_info(MMHandleType pHandle, MEDIADEMUXER_FENTER(); int ret = MD_ERROR_NONE; MEDIADEMUXER_CHECK_NULL(pHandle); - mdgst_handle_t *new_mediademuxer = (mdgst_handle_t *) pHandle; + mdgst_handle_t *new_mediademuxer = (mdgst_handle_t *)pHandle; track *temp = NULL; int loop; @@ -1260,7 +1256,7 @@ static int _gst_copy_buf_to_media_packet(media_packet_h out_pkt, ret = MD_ERROR_UNKNOWN; goto ERROR; } - if (media_packet_set_codec_data(out_pkt, (void*)codec_data_map.data, + if (media_packet_set_codec_data(out_pkt, (void *)codec_data_map.data, (unsigned int)codec_data_map.size)) { MD_E("unable to set the codec data\n"); ret = MD_ERROR_UNKNOWN; @@ -1301,7 +1297,7 @@ static int _gst_demuxer_create_eos_packet(media_format_h fmt, media_packet_h *ou MEDIADEMUXER_FLEAVE(); return ret; - ERROR: +ERROR: if (mediabuf) media_packet_destroy(mediabuf); *outbuf = NULL; @@ -1315,7 +1311,7 @@ static int gst_demuxer_read_sample(MMHandleType pHandle, MEDIADEMUXER_FENTER(); int ret = MD_ERROR_NONE; MEDIADEMUXER_CHECK_NULL(pHandle); - mdgst_handle_t *demuxer = (mdgst_handle_t *) pHandle; + mdgst_handle_t *demuxer = (mdgst_handle_t *)pHandle; media_packet_h mediabuf = NULL; int indx = 0; @@ -1419,9 +1415,9 @@ static int gst_demuxer_seek(MMHandleType pHandle, gint64 pos1) { MEDIADEMUXER_FENTER(); MEDIADEMUXER_CHECK_NULL(pHandle); - mdgst_handle_t *gst_handle = (mdgst_handle_t *) pHandle; + mdgst_handle_t *gst_handle = (mdgst_handle_t *)pHandle; - gint64 pos = 0, len = 0; + gint64 pos = 0; gdouble rate = 1; track_info *head_track = &(gst_handle->info); track *temp = head_track->head; @@ -1448,9 +1444,7 @@ static int gst_demuxer_seek(MMHandleType pHandle, gint64 pos1) pos = pos1 * GST_MSECOND; - MD_I("\n\n"); - MD_I("NEW Time: %" GST_TIME_FORMAT " / %" GST_TIME_FORMAT "\r", - GST_TIME_ARGS(pos1), GST_TIME_ARGS(len)); + MD_I("NEW Time: %" GST_TIME_FORMAT, GST_TIME_ARGS(pos)); indx = 0; while (temp) { @@ -1495,7 +1489,7 @@ int _gst_unset_appsink(track *temp, int index, int loop) temp = temp->next; count++; } - gst_app_sink_set_max_buffers((GstAppSink *)(temp->appsink), (guint) 0); + gst_app_sink_set_max_buffers((GstAppSink *)(temp->appsink), (guint)0); gst_app_sink_set_drop((GstAppSink *)(temp->appsink), true); MEDIADEMUXER_FLEAVE(); return ret; @@ -1506,7 +1500,7 @@ static int gst_demuxer_unset_track(MMHandleType pHandle, int track) MEDIADEMUXER_FENTER(); int ret = MD_ERROR_NONE; MEDIADEMUXER_CHECK_NULL(pHandle); - mdgst_handle_t *new_mediademuxer = (mdgst_handle_t *) pHandle; + mdgst_handle_t *new_mediademuxer = (mdgst_handle_t *)pHandle; if (track >= new_mediademuxer->total_tracks || track < 0) { MD_E("total tracks is less then unselected track, So not support this track"); @@ -1514,7 +1508,7 @@ static int gst_demuxer_unset_track(MMHandleType pHandle, int track) goto ERROR; } new_mediademuxer->selected_tracks[track] = false; - _gst_unset_appsink((((mdgst_handle_t *) pHandle)->info).head, track, + _gst_unset_appsink((((mdgst_handle_t *)pHandle)->info).head, track, new_mediademuxer->total_tracks); MEDIADEMUXER_FLEAVE(); return ret; @@ -1528,7 +1522,7 @@ static int gst_demuxer_stop(MMHandleType pHandle) MEDIADEMUXER_FENTER(); int ret = MD_ERROR_NONE; MEDIADEMUXER_CHECK_NULL(pHandle); - mdgst_handle_t *gst_handle = (mdgst_handle_t *) pHandle; + mdgst_handle_t *gst_handle = (mdgst_handle_t *)pHandle; MD_I("gst_demuxer_stop pipeine %p", gst_handle); if (gst_element_set_state(gst_handle->pipeline, GST_STATE_PAUSED) == @@ -1580,7 +1574,7 @@ static int gst_demuxer_unprepare(MMHandleType pHandle) MEDIADEMUXER_FENTER(); int ret = MD_ERROR_NONE; MEDIADEMUXER_CHECK_NULL(pHandle); - mdgst_handle_t *gst_handle = (mdgst_handle_t *) pHandle; + mdgst_handle_t *gst_handle = (mdgst_handle_t *)pHandle; _gst_clear_struct(gst_handle); if (gst_handle->bus_watch_id) { @@ -1609,7 +1603,7 @@ static int gst_demuxer_destroy(MMHandleType pHandle) MEDIADEMUXER_FENTER(); int ret = MD_ERROR_NONE; MEDIADEMUXER_CHECK_NULL(pHandle); - mdgst_handle_t *new_mediademuxer = (mdgst_handle_t *) pHandle; + mdgst_handle_t *new_mediademuxer = (mdgst_handle_t *)pHandle; MD_I("gst_demuxer_destroy deallocating new_mediademuxer:%p\n", new_mediademuxer); @@ -1624,7 +1618,7 @@ int gst_set_error_cb(MMHandleType pHandle, MEDIADEMUXER_FENTER(); int ret = MD_ERROR_NONE; MEDIADEMUXER_CHECK_NULL(pHandle); - mdgst_handle_t *gst_handle = (mdgst_handle_t *) pHandle; + mdgst_handle_t *gst_handle = (mdgst_handle_t *)pHandle; if (gst_handle->user_cb[_GST_EVENT_TYPE_ERROR]) { MD_E("Already set mediademuxer_error_cb\n"); @@ -1640,7 +1634,7 @@ int gst_set_error_cb(MMHandleType pHandle, MD_I("Set event handler callback(cb = %p, data = %p)\n", callback, user_data); - gst_handle->user_cb[_GST_EVENT_TYPE_ERROR] = (gst_error_cb) callback; + gst_handle->user_cb[_GST_EVENT_TYPE_ERROR] = (gst_error_cb)callback; gst_handle->user_data[_GST_EVENT_TYPE_ERROR] = user_data; MEDIADEMUXER_FLEAVE(); return MD_ERROR_NONE; @@ -1654,7 +1648,7 @@ int gst_set_eos_cb(MMHandleType pHandle, gst_eos_cb callback, void *user_data) MEDIADEMUXER_FENTER(); int ret = MD_ERROR_NONE; MEDIADEMUXER_CHECK_NULL(pHandle); - mdgst_handle_t *gst_handle = (mdgst_handle_t *) pHandle; + mdgst_handle_t *gst_handle = (mdgst_handle_t *)pHandle; if (gst_handle->user_cb[_GST_EVENT_TYPE_EOS]) { MD_E("Already set mediademuxer_eos_cb\n"); @@ -1669,7 +1663,7 @@ int gst_set_eos_cb(MMHandleType pHandle, gst_eos_cb callback, void *user_data) } MD_I("Set event handler callback(cb = %p, data = %p)\n", callback, user_data); - gst_handle->user_cb[_GST_EVENT_TYPE_EOS] = (gst_eos_cb) callback; + gst_handle->user_cb[_GST_EVENT_TYPE_EOS] = (gst_eos_cb)callback; gst_handle->user_data[_GST_EVENT_TYPE_EOS] = user_data; MEDIADEMUXER_FLEAVE(); return MD_ERROR_NONE; @@ -1684,7 +1678,7 @@ static int __gst_eos_callback(int track_num, void* user_data) MD_E("Invalid argument"); return MD_ERROR; } - mdgst_handle_t *gst_handle = (mdgst_handle_t *) user_data; + mdgst_handle_t *gst_handle = (mdgst_handle_t *)user_data; if (gst_handle->user_cb[_GST_EVENT_TYPE_EOS]) ((gst_eos_cb)gst_handle->user_cb[_GST_EVENT_TYPE_EOS])(track_num, gst_handle->user_data[_GST_EVENT_TYPE_EOS]); diff --git a/test/mediademuxer_test.c b/test/mediademuxer_test.c index 4b3f211..f24ec53 100755 --- a/test/mediademuxer_test.c +++ b/test/mediademuxer_test.c @@ -197,11 +197,11 @@ int test_mediademuxer_set_data_source(mediademuxer_h demuxer, const char *path) g_print("test_mediademuxer_set_data_source\n"); #if DEMUXER_OUTPUT_DUMP - fp_audio_out = fopen("/opt/usr/dump_audio.out", "wb"); + fp_audio_out = fopen("/tmp/dump_audio.out", "wb"); if (fp_audio_out != NULL) { validate_dump = true; - fp_video_out = fopen("/opt/usr/dump_video.out", "wb"); - fp_text_out = fopen("/opt/usr/dump_text.out", "wb"); + fp_video_out = fopen("/tmp/dump_video.out", "wb"); + fp_text_out = fopen("/tmp/dump_text.out", "wb"); } else { g_print("Error - Cannot open file for file dump, Please chek root\n"); } -- 2.7.4 From 4db063c37290c8912539b3135c22b2cf0e497072 Mon Sep 17 00:00:00 2001 From: Gilbok Lee Date: Tue, 6 Dec 2016 10:48:03 +0900 Subject: [PATCH 11/16] Link error callback (transform gstreamer error to mediademuxer error) Fix memory corruption [Version] 0.1.11 [Profile] Mobile, Wearable, TV [Issue Type] Fix bugs Change-Id: I16b0915437ec2c6b98b17f3c7c1a0cd165571df7 --- src/port_gst/mediademuxer_port_gst.c | 239 ++++++++++++++++++++++++++++++++--- test/mediademuxer_test.c | 4 +- 2 files changed, 224 insertions(+), 19 deletions(-) diff --git a/src/port_gst/mediademuxer_port_gst.c b/src/port_gst/mediademuxer_port_gst.c index b9d9b4f..b0ac330 100755 --- a/src/port_gst/mediademuxer_port_gst.c +++ b/src/port_gst/mediademuxer_port_gst.c @@ -47,6 +47,12 @@ static int gst_set_eos_cb(MMHandleType pHandle, gst_eos_cb callback, void *user_data); static int __gst_eos_callback(int track_num, void *user_data); +static gint __gst_handle_core_error(mdgst_handle_t *gst_handle, int code); +static gint __gst_handle_library_error(mdgst_handle_t *gst_handle, int code); +static gint __gst_handle_resource_error(mdgst_handle_t *gst_handle, int code); +static gint __gst_handle_stream_error(mdgst_handle_t *gst_handle, GError *error, GstMessage *message); +static gint __gst_transform_gsterror(mdgst_handle_t *gst_handle, GstMessage *message, GError *error); + /* Media Demuxer API common */ static media_port_demuxer_ops def_demux_ops = { .n_size = 0, @@ -66,6 +72,171 @@ static media_port_demuxer_ops def_demux_ops = { .set_eos_cb = gst_set_eos_cb, }; +static gint __gst_handle_core_error(mdgst_handle_t *gst_handle, int code) +{ + gint trans_err = MEDIADEMUXER_ERROR_NONE; + + MEDIADEMUXER_CHECK_NULL(gst_handle); + + switch (code) { + case GST_CORE_ERROR_MISSING_PLUGIN: + return MEDIADEMUXER_ERROR_NOT_SUPPORTED; + case GST_CORE_ERROR_STATE_CHANGE: + case GST_CORE_ERROR_SEEK: + case GST_CORE_ERROR_NOT_IMPLEMENTED: + case GST_CORE_ERROR_FAILED: + case GST_CORE_ERROR_TOO_LAZY: + case GST_CORE_ERROR_PAD: + case GST_CORE_ERROR_THREAD: + case GST_CORE_ERROR_NEGOTIATION: + case GST_CORE_ERROR_EVENT: + case GST_CORE_ERROR_CAPS: + case GST_CORE_ERROR_TAG: + case GST_CORE_ERROR_CLOCK: + case GST_CORE_ERROR_DISABLED: + default: + trans_err = MEDIADEMUXER_ERROR_INVALID_OPERATION; + break; + } + + return trans_err; +} + +static gint __gst_handle_library_error(mdgst_handle_t *gst_handle, int code) +{ + gint trans_err = MEDIADEMUXER_ERROR_NONE; + + MEDIADEMUXER_CHECK_NULL(gst_handle); + + switch (code) { + case GST_LIBRARY_ERROR_FAILED: + case GST_LIBRARY_ERROR_TOO_LAZY: + case GST_LIBRARY_ERROR_INIT: + case GST_LIBRARY_ERROR_SHUTDOWN: + case GST_LIBRARY_ERROR_SETTINGS: + case GST_LIBRARY_ERROR_ENCODE: + default: + trans_err = MEDIADEMUXER_ERROR_INVALID_OPERATION; + break; + } + + return trans_err; +} + + +static gint __gst_handle_resource_error(mdgst_handle_t *gst_handle, int code) +{ + gint trans_err = MEDIADEMUXER_ERROR_NONE; + + MEDIADEMUXER_CHECK_NULL(gst_handle); + + switch (code) { + case GST_RESOURCE_ERROR_NO_SPACE_LEFT: + trans_err = MEDIADEMUXER_ERROR_OUT_OF_MEMORY; + break; + case GST_RESOURCE_ERROR_WRITE: + case GST_RESOURCE_ERROR_FAILED: + case GST_RESOURCE_ERROR_SEEK: + case GST_RESOURCE_ERROR_TOO_LAZY: + case GST_RESOURCE_ERROR_BUSY: + case GST_RESOURCE_ERROR_OPEN_WRITE: + case GST_RESOURCE_ERROR_OPEN_READ_WRITE: + case GST_RESOURCE_ERROR_CLOSE: + case GST_RESOURCE_ERROR_SYNC: + case GST_RESOURCE_ERROR_SETTINGS: + default: + trans_err = MEDIADEMUXER_ERROR_RESOURCE_LIMIT; + break; + } + + return trans_err; +} + +static gint __gst_handle_stream_error(mdgst_handle_t *gst_handle, GError *error, GstMessage *message) +{ + gint trans_err = MEDIADEMUXER_ERROR_NONE; + + MEDIADEMUXER_CHECK_NULL(gst_handle); + MEDIADEMUXER_CHECK_NULL(error); + MEDIADEMUXER_CHECK_NULL(message); + + switch (error->code) { + case GST_STREAM_ERROR_FAILED: + case GST_STREAM_ERROR_TYPE_NOT_FOUND: + case GST_STREAM_ERROR_DECODE: + case GST_STREAM_ERROR_WRONG_TYPE: + case GST_STREAM_ERROR_DECRYPT: + case GST_STREAM_ERROR_DECRYPT_NOKEY: + case GST_STREAM_ERROR_CODEC_NOT_FOUND: + trans_err = __gst_transform_gsterror(gst_handle, message, error); + break; + + case GST_STREAM_ERROR_NOT_IMPLEMENTED: + case GST_STREAM_ERROR_TOO_LAZY: + case GST_STREAM_ERROR_ENCODE: + case GST_STREAM_ERROR_DEMUX: + case GST_STREAM_ERROR_MUX: + case GST_STREAM_ERROR_FORMAT: + default: + trans_err = MEDIADEMUXER_ERROR_INVALID_OPERATION; + break; + } + + return trans_err; +} + +static gint __gst_transform_gsterror(mdgst_handle_t *gst_handle, GstMessage *message, GError *error) +{ + gchar *src_element_name = NULL; + GstElement *src_element = NULL; + GstElementFactory *factory = NULL; + const gchar *klass = NULL; + + MEDIADEMUXER_CHECK_NULL(gst_handle); + + src_element = GST_ELEMENT_CAST(message->src); + if (!src_element) + goto INTERNAL_ERROR; + + src_element_name = GST_ELEMENT_NAME(src_element); + if (!src_element_name) + goto INTERNAL_ERROR; + + factory = gst_element_get_factory(src_element); + if (!factory) + goto INTERNAL_ERROR; + + klass = gst_element_factory_get_klass(factory); + if (!klass) + goto INTERNAL_ERROR; + + MD_I("error code=%d, msg=%s, src element=%s, class=%s\n", + error->code, error->message, src_element_name, klass); + + switch (error->code) { + case GST_STREAM_ERROR_DECODE: + case GST_STREAM_ERROR_FAILED: + return MEDIADEMUXER_ERROR_INVALID_PARAMETER; + break; + + case GST_STREAM_ERROR_CODEC_NOT_FOUND: + case GST_STREAM_ERROR_TYPE_NOT_FOUND: + case GST_STREAM_ERROR_WRONG_TYPE: + return MEDIADEMUXER_ERROR_NOT_SUPPORTED; + break; + + default: + return MEDIADEMUXER_ERROR_INVALID_PARAMETER; + break; + } + + return MEDIADEMUXER_ERROR_INVALID_PARAMETER; + +INTERNAL_ERROR: + return MEDIADEMUXER_ERROR_INVALID_PARAMETER; +} + + int gst_mediademxer_port_register(media_port_demuxer_ops *pOps) { MEDIADEMUXER_FENTER(); @@ -111,6 +282,7 @@ ERROR: gboolean __gst_bus_call(GstBus *bus, GstMessage *msg, gpointer data) { + mdgst_handle_t *gst_handle = (mdgst_handle_t *)data; MEDIADEMUXER_FENTER(); int ret = MD_ERROR_NONE; switch (GST_MESSAGE_TYPE(msg)) { @@ -125,6 +297,23 @@ gboolean __gst_bus_call(GstBus *bus, GstMessage *msg, gpointer data) MD_I("GST error message parsing failed"); break; } + + if (error->domain == GST_STREAM_ERROR) + ret = __gst_handle_stream_error(gst_handle, error, msg); + else if (error->domain == GST_RESOURCE_ERROR) + ret = __gst_handle_resource_error(gst_handle, error->code); + else if (error->domain == GST_LIBRARY_ERROR) + ret = __gst_handle_library_error(gst_handle, error->code); + else if (error->domain == GST_CORE_ERROR) + ret = __gst_handle_core_error(gst_handle, error->code); + else + MD_W("Unexpected error has occured"); + + if (gst_handle->user_cb[_GST_EVENT_TYPE_ERROR]) { + ((mediademuxer_error_cb)gst_handle->user_cb[_GST_EVENT_TYPE_ERROR]) + (ret, gst_handle->user_data[_GST_EVENT_TYPE_ERROR]); + MD_W("Error : (ox%08x)", ret); + } MD_E("Error: %s\n", error->message); g_error_free(error); } @@ -160,7 +349,7 @@ static void __gst_no_more_pad(GstElement *element, gpointer data) head_track->num_subtitle_track); MD_I("Number of other tracks are %d\n", head_track->num_other_track); while (head) { - MD_I("track caps[%s]\n", head->name); + MD_I("track caps[%s]\n", head->caps_string); head = head->next; } gst_handle->is_prepared = true; @@ -233,7 +422,10 @@ int __gst_add_track_info(GstPad *pad, gchar *name, track **head, } temp->pad = pad; temp->caps = gst_pad_get_current_caps(pad); - temp->name = name; + if (name) + temp->name = g_strndup(name, strlen(name)); + else + temp->name = NULL; temp->caps_string = gst_caps_to_string(temp->caps); temp->next = NULL; temp->format = NULL; @@ -286,7 +478,7 @@ int __gst_add_track_info(GstPad *pad, gchar *name, track **head, goto ERROR; } /* Check for type video and it should be h264 */ - if (strstr(name, "video")) { + if (temp->name && strstr(temp->name, "video")) { if (strstr(temp->caps_string, "h264")) { parse_element = gst_element_factory_make("h264parse", NULL); if (!parse_element) { @@ -323,8 +515,10 @@ int __gst_add_track_info(GstPad *pad, gchar *name, track **head, } else { MEDIADEMUXER_LINK_PAD(queue_src_pad, apppad, ERROR); } + } else { + MEDIADEMUXER_LINK_PAD(queue_src_pad, apppad, ERROR); } - } else if (strstr(name, "audio")) { + } else if (temp->name && strstr(temp->name, "audio")) { //Create Parse if (strstr(temp->caps_string, "audio/mpeg")) { int mpegversion = 0; @@ -346,20 +540,24 @@ int __gst_add_track_info(GstPad *pad, gchar *name, track **head, parse_element = gst_element_factory_make("flacparse", NULL); } - gst_bin_add(GST_BIN(pipeline), parse_element); - parse_sink_pad = gst_element_get_static_pad(parse_element, "sink"); - if (!parse_sink_pad) { - gst_object_unref(parse_element); - MD_E("sink pad of h264parse not available"); - goto ERROR; - } - MEDIADEMUXER_SET_STATE(parse_element, GST_STATE_PAUSED, ERROR); + if (parse_element) { + gst_bin_add(GST_BIN(pipeline), parse_element); + parse_sink_pad = gst_element_get_static_pad(parse_element, "sink"); + if (!parse_sink_pad) { + gst_object_unref(parse_element); + MD_E("sink pad of h264parse not available"); + goto ERROR; + } + MEDIADEMUXER_SET_STATE(parse_element, GST_STATE_PAUSED, ERROR); - /* Link demuxer pad with sink pad of parse element */ - MEDIADEMUXER_LINK_PAD(queue_src_pad, parse_sink_pad, ERROR); + /* Link demuxer pad with sink pad of parse element */ + MEDIADEMUXER_LINK_PAD(queue_src_pad, parse_sink_pad, ERROR); - /* Link src pad with appSink element */ - gst_element_link(parse_element, temp->appsink); + /* Link src pad with appSink element */ + gst_element_link(parse_element, temp->appsink); + } else { + MEDIADEMUXER_LINK_PAD(queue_src_pad, apppad, ERROR); + } } else { MEDIADEMUXER_LINK_PAD(queue_src_pad, apppad, ERROR); } @@ -564,8 +762,7 @@ static int __gst_create_audio_only_pipeline(gpointer data, GstCaps *caps) MD_I("caps set to %s\n", tmp_track->caps_string); if (tmp_track->name) g_free(tmp_track->name); - g_strlcpy(name, "audio", strlen(name)); - tmp_track->name = name; + tmp_track->name = g_strndup("audio", strlen("audio")); } (head_track->num_audio_track)++; @@ -576,6 +773,7 @@ static int __gst_create_audio_only_pipeline(gpointer data, GstCaps *caps) __gst_no_more_pad(gst_handle->demux, data); g_free(type); + g_free(name); MEDIADEMUXER_FLEAVE(); return MD_ERROR_NONE; @@ -593,6 +791,7 @@ ERROR: gst_object_unref(aud_srcpad); g_free(type); + g_free(name); MEDIADEMUXER_FLEAVE(); return MD_ERROR; } @@ -1041,11 +1240,15 @@ int _set_mime_audio(media_format_h format, track *head) gst_structure_get_int(struc, "mpegversion", &mpegversion); if (mpegversion == 4 || mpegversion == 2) { mime_type = MEDIA_FORMAT_AAC_LC; + if (media_format_set_audio_mime(format, mime_type)) + goto ERROR; stream_format = gst_structure_get_string(struc, "stream-format"); + if (strncmp(stream_format, "adts", 4) == 0) media_format_set_audio_aac_type(format, 1); else media_format_set_audio_aac_type(format, 0); + } else if (mpegversion == 1 || id3_flag) { gst_structure_get_int(struc, "layer", &layer); if ((layer == 3) || (id3_flag == 1)) { diff --git a/test/mediademuxer_test.c b/test/mediademuxer_test.c index f24ec53..b532d60 100755 --- a/test/mediademuxer_test.c +++ b/test/mediademuxer_test.c @@ -270,8 +270,10 @@ int test_mediademuxer_get_track_info() g_print("media_format_get_audio_info is sucess!\n"); g_print("\t\t[media_format_get_audio]mime:%x, channel :%d, samplerate :%d, bit :%d\n", a_mime, channel, samplerate, bit); - if (a_mime == MEDIA_FORMAT_AAC_LC) + if (a_mime == MEDIA_FORMAT_AAC_LC) { media_format_get_audio_aac_type(g_media_format, &is_adts); + g_print("\t\t[media_format_get_audio]is_adts:%d", is_adts); + } aud_track = track; } else if (media_format_get_text_info(g_media_format, &t_mime, &t_type) == MEDIA_FORMAT_ERROR_NONE) { g_print("media_format_get_text_info is sucess!\n"); -- 2.7.4 From a7cb8b29bf599844d190191459024e3a31a65615 Mon Sep 17 00:00:00 2001 From: Zhao Cancan Date: Wed, 7 Dec 2016 22:11:17 -0500 Subject: [PATCH 12/16] Fix to unify add track info function for audio only case Change-Id: I6aa20bce9db2e152fd3f65390c1f4cd31cba54be --- include/port_gst/mediademuxer_port_gst.h | 1 - packaging/capi-mediademuxer.spec | 2 +- src/port_gst/mediademuxer_port_gst.c | 283 ++++++++++++++----------------- 3 files changed, 131 insertions(+), 155 deletions(-) diff --git a/include/port_gst/mediademuxer_port_gst.h b/include/port_gst/mediademuxer_port_gst.h index 80865ff..9737be4 100755 --- a/include/port_gst/mediademuxer_port_gst.h +++ b/include/port_gst/mediademuxer_port_gst.h @@ -61,7 +61,6 @@ typedef struct track { GstPad *pad; GstCaps *caps; bool need_codec_data; - gchar *name; gchar *caps_string; GstElement *appsink; GstElement *fakesink; diff --git a/packaging/capi-mediademuxer.spec b/packaging/capi-mediademuxer.spec index e0ed499..0ab08d5 100755 --- a/packaging/capi-mediademuxer.spec +++ b/packaging/capi-mediademuxer.spec @@ -1,6 +1,6 @@ Name: capi-mediademuxer Summary: A Media Demuxer library in Tizen Native API -Version: 0.1.11 +Version: 0.1.12 Release: 1 Group: Multimedia/API License: Apache-2.0 diff --git a/src/port_gst/mediademuxer_port_gst.c b/src/port_gst/mediademuxer_port_gst.c index b0ac330..6f1dc88 100755 --- a/src/port_gst/mediademuxer_port_gst.c +++ b/src/port_gst/mediademuxer_port_gst.c @@ -366,17 +366,13 @@ void __gst_free_stuct(track **head) while (temp) { /* if (temp->pad) { - MD_I("deallocate GST_PAD %p\n", temp->pad); + MD_I("unref GST_PAD %p\n", temp->pad); gst_object_unref(temp->pad); } */ if (temp->caps) { - MD_I("deallocate GST_PAD caps_ %p\n", temp->caps); + MD_I("unref GST_PAD caps %p\n", temp->caps); gst_caps_unref(temp->caps); } - if (temp->name) { - MD_I("deallocate GST_PAD name %p\n", temp->name); - g_free(temp->name); - } if (temp->caps_string) { MD_I("deallocate GST_PAD caps_string %p\n", temp->caps_string); @@ -401,7 +397,7 @@ void __gst_free_stuct(track **head) MEDIADEMUXER_FLEAVE(); } -int __gst_add_track_info(GstPad *pad, gchar *name, track **head, +int __gst_add_track_info(GstPad *pad, GstCaps *caps, track **head, GstElement *pipeline) { MEDIADEMUXER_FENTER(); @@ -411,6 +407,9 @@ int __gst_add_track_info(GstPad *pad, gchar *name, track **head, GstCaps *outcaps = NULL; GstPad *parse_sink_pad = NULL; GstElement *parse_element = NULL; + GstElement *id3tag = NULL; + GstPad *id3_sinkpad = NULL; + GstPad *id3_srcpad = NULL; track *temp = NULL; temp = (track *)(g_malloc(sizeof(track))); @@ -421,16 +420,14 @@ int __gst_add_track_info(GstPad *pad, gchar *name, track **head, MD_I("allocate memory %p", temp); } temp->pad = pad; - temp->caps = gst_pad_get_current_caps(pad); - if (name) - temp->name = g_strndup(name, strlen(name)); - else - temp->name = NULL; - temp->caps_string = gst_caps_to_string(temp->caps); + temp->caps = gst_caps_ref(caps); + temp->caps_string = gst_caps_to_string(caps); temp->next = NULL; temp->format = NULL; temp->need_codec_data = TRUE; + MD_I("track caps(%s)", temp->caps_string ? temp->caps_string : "NULL"); + /* Link demuxer - queue */ temp->queue = gst_element_factory_make("queue", NULL); if (!temp->queue) { @@ -439,13 +436,15 @@ int __gst_add_track_info(GstPad *pad, gchar *name, track **head, } if (!gst_bin_add(GST_BIN(pipeline), temp->queue)) { + gst_object_unref(temp->queue); MD_E("fail add queue in pipeline"); goto ERROR; } + MD_I("added queue element in pipeline."); queue_sink_pad = gst_element_get_static_pad(temp->queue, "sink"); if (!queue_sink_pad) { - MD_E("queue_sink_pad of appsink not avaible"); + MD_E("sink pad of queue not avaible"); goto ERROR; } @@ -459,9 +458,11 @@ int __gst_add_track_info(GstPad *pad, gchar *name, track **head, } if (!gst_bin_add(GST_BIN(pipeline), temp->appsink)) { - MD_E("fail add queue in pipeline"); + gst_object_unref(temp->appsink); + MD_E("fail add appsink in pipeline"); goto ERROR; } + MD_I("added appsink element in pipeline."); gst_app_sink_set_max_buffers((GstAppSink *) temp->appsink, (guint) 0); gst_app_sink_set_drop((GstAppSink *) temp->appsink, true); @@ -469,7 +470,7 @@ int __gst_add_track_info(GstPad *pad, gchar *name, track **head, queue_src_pad = gst_element_get_static_pad(temp->queue, "src"); if (!queue_src_pad) { - MD_E("queue_src_pad of appsink not avaible"); + MD_E("src pad of queue not avaible"); goto ERROR; } apppad = gst_element_get_static_pad(temp->appsink, "sink"); @@ -478,7 +479,7 @@ int __gst_add_track_info(GstPad *pad, gchar *name, track **head, goto ERROR; } /* Check for type video and it should be h264 */ - if (temp->name && strstr(temp->name, "video")) { + if (temp->caps_string && strstr(temp->caps_string, "video")) { if (strstr(temp->caps_string, "h264")) { parse_element = gst_element_factory_make("h264parse", NULL); if (!parse_element) { @@ -495,11 +496,15 @@ int __gst_add_track_info(GstPad *pad, gchar *name, track **head, } if (parse_element) { - gst_bin_add(GST_BIN(pipeline), parse_element); + MD_I("add video parse element(%s).", GST_ELEMENT_NAME(parse_element)); + if (!gst_bin_add(GST_BIN(pipeline), parse_element)) { + gst_object_unref(parse_element); + MD_E("fail add video parse(%s) in pipeline", GST_ELEMENT_NAME(parse_element)); + goto ERROR; + } parse_sink_pad = gst_element_get_static_pad(parse_element, "sink"); if (!parse_sink_pad) { - gst_object_unref(parse_element); - MD_E("sink pad of h264parse not available"); + MD_E("sink pad of video parse(%s) not available", GST_ELEMENT_NAME(parse_element)); goto ERROR; } MEDIADEMUXER_SET_STATE(parse_element, GST_STATE_PAUSED, ERROR); @@ -518,40 +523,93 @@ int __gst_add_track_info(GstPad *pad, gchar *name, track **head, } else { MEDIADEMUXER_LINK_PAD(queue_src_pad, apppad, ERROR); } - } else if (temp->name && strstr(temp->name, "audio")) { - //Create Parse + } else if (temp->caps_string && (strstr(temp->caps_string, "audio") || strstr(temp->caps_string, "x-id3"))) { if (strstr(temp->caps_string, "audio/mpeg")) { int mpegversion = 0; GstStructure *structure = NULL; structure = gst_caps_get_structure(temp->caps, 0); gst_structure_get_int (structure, "mpegversion", &mpegversion); - if (mpegversion == 2 || mpegversion == 4) + if (mpegversion == 2 || mpegversion == 4) { parse_element = gst_element_factory_make("aacparse", NULL); - else if (mpegversion == 1) + if (!parse_element) { + MD_E("factory not able to make aacparse"); + goto ERROR; + } + } else if (mpegversion == 1) { parse_element = gst_element_factory_make("mpegaudioparse", NULL); + if (!parse_element) { + MD_E("factory not able to make mpegaudioparse"); + goto ERROR; + } + } } else if (strstr(temp->caps_string, "application/x-id3")) { + id3tag = gst_element_factory_make("id3demux", NULL); + if (!id3tag) { + MD_E("factory not able to make id3demux"); + goto ERROR; + } + if (!gst_bin_add(GST_BIN(pipeline), id3tag)) { + gst_object_unref(id3tag); + MD_E("fail add id3tag element in pipeline"); + goto ERROR; + } + id3_sinkpad = gst_element_get_static_pad(id3tag, "sink"); + if (!id3_sinkpad) { + MD_E("fail to get id3demux sink pad.\n"); + goto ERROR; + } + MEDIADEMUXER_LINK_PAD(queue_src_pad, id3_sinkpad, ERROR); + MEDIADEMUXER_SET_STATE(id3tag, GST_STATE_PAUSED, ERROR); + id3_srcpad = gst_element_get_static_pad(id3tag, "src"); + if (!id3_srcpad) { + MD_E("fail to get id3demux src pad.\n"); + goto ERROR; + } parse_element = gst_element_factory_make("mpegaudioparse", NULL); + if (!parse_element) { + MD_E("factory not able to make mpegaudioparse"); + goto ERROR; + } } else if (strstr(temp->caps_string, "audio/x-amr-nb-sh") || strstr(temp->caps_string, "audio/x-amr-wb-sh")) { parse_element = gst_element_factory_make("amrparse", NULL); + if (!parse_element) { + MD_E("factory not able to make amrparse"); + goto ERROR; + } } else if (strstr(temp->caps_string, "audio/x-wav")) { parse_element = gst_element_factory_make("wavparse", NULL); + if (!parse_element) { + MD_E("factory not able to make wavparse"); + goto ERROR; + } } else if (strstr(temp->caps_string, "audio/x-flac")) { parse_element = gst_element_factory_make("flacparse", NULL); + if (!parse_element) { + MD_E("factory not able to make flacparse"); + goto ERROR; + } } if (parse_element) { - gst_bin_add(GST_BIN(pipeline), parse_element); + MD_I("add audio parse element(%s).", GST_ELEMENT_NAME(parse_element)); + if (!gst_bin_add(GST_BIN(pipeline), parse_element)) { + gst_object_unref(parse_element); + MD_E("fail add audio parse(%s) in pipeline", GST_ELEMENT_NAME(parse_element)); + goto ERROR; + } parse_sink_pad = gst_element_get_static_pad(parse_element, "sink"); if (!parse_sink_pad) { - gst_object_unref(parse_element); - MD_E("sink pad of h264parse not available"); + MD_E("sink pad of audio parse(%s) not available", GST_ELEMENT_NAME(parse_element)); goto ERROR; } MEDIADEMUXER_SET_STATE(parse_element, GST_STATE_PAUSED, ERROR); /* Link demuxer pad with sink pad of parse element */ - MEDIADEMUXER_LINK_PAD(queue_src_pad, parse_sink_pad, ERROR); + if (id3tag) + MEDIADEMUXER_LINK_PAD(id3_srcpad, parse_sink_pad, ERROR); + else + MEDIADEMUXER_LINK_PAD(queue_src_pad, parse_sink_pad, ERROR); /* Link src pad with appSink element */ gst_element_link(parse_element, temp->appsink); @@ -578,20 +636,15 @@ int __gst_add_track_info(GstPad *pad, gchar *name, track **head, gst_object_unref(apppad); if (parse_sink_pad) gst_object_unref(parse_sink_pad); + if (id3_sinkpad) + gst_object_unref(id3_sinkpad); + if (id3_srcpad) + gst_object_unref(id3_srcpad); MEDIADEMUXER_FLEAVE(); return MD_ERROR_NONE; ERROR: - if (parse_element) - gst_object_unref(parse_element); - if (temp->caps) - gst_object_unref(temp->caps); - if (temp->caps_string) - g_free(temp->caps_string); - if (temp->queue) - gst_object_unref(temp->queue); - if (temp->appsink) - gst_object_unref(temp->appsink); + __gst_free_stuct(&temp); if (queue_sink_pad) gst_object_unref(queue_sink_pad); if (queue_src_pad) @@ -600,6 +653,10 @@ ERROR: gst_object_unref(apppad); if (parse_sink_pad) gst_object_unref(parse_sink_pad); + if (id3_sinkpad) + gst_object_unref(id3_sinkpad); + if (id3_srcpad) + gst_object_unref(id3_srcpad); __gst_free_stuct(head); MEDIADEMUXER_FLEAVE(); return MD_ERROR; @@ -612,18 +669,24 @@ static void __gst_on_pad_added(GstElement *element, GstPad *pad, gpointer data) track *tmp = NULL; mdgst_handle_t *gst_handle = (mdgst_handle_t *)data; track_info *head_track = &(gst_handle->info); - gchar *name = gst_pad_get_name(pad); + GstCaps *caps = gst_pad_get_current_caps(pad); + if (!caps) { + MD_E("caps is NULL"); + return; + } gst_handle->total_tracks++; - if (__gst_add_track_info(pad, name, &(head_track->head), gst_handle->pipeline) + if (__gst_add_track_info(pad, caps, &(head_track->head), gst_handle->pipeline) != MD_ERROR_NONE) { MD_E("unable to added track info"); head_track->num_audio_track = 0; head_track->num_video_track = 0; head_track->num_subtitle_track = 0; head_track->num_other_track = 0; + gst_caps_unref(caps); __gst_free_stuct(&(head_track->head)); return; } + gst_caps_unref(caps); tmp = head_track->head; while (tmp->next) tmp = tmp->next; @@ -642,7 +705,7 @@ static void __gst_on_pad_added(GstElement *element, GstPad *pad, gpointer data) MD_I("found subtitle(or Text) Pad\n"); (head_track->num_subtitle_track)++; } else { - MD_W("found Pad %s\n", name); + MD_W("found Pad, caps: %s\n", tmp->caps_string); (head_track->num_other_track)++; } MEDIADEMUXER_FLEAVE(); @@ -653,92 +716,18 @@ static int __gst_create_audio_only_pipeline(gpointer data, GstCaps *caps) MEDIADEMUXER_FENTER(); mdgst_handle_t *gst_handle = (mdgst_handle_t *)data; GstPad *pad = NULL; - GstPad *aud_pad = NULL; - GstPad *aud_srcpad = NULL; - GstPad *fake_pad = NULL; - GstElement *id3tag = NULL; - gchar *name = NULL; - gchar *type = NULL; track_info *head_track = &(gst_handle->info); - track *tmp_track = NULL; gst_handle->is_valid_container = true; - type = gst_caps_to_string(caps); - - if (strstr(type, "adts") || strstr(type, "adif")) { - gst_handle->demux = gst_element_factory_make("aacparse", NULL); - } else if (strstr(type, "audio/mpeg")) { - gst_handle->demux = gst_element_factory_make("mpegaudioparse", NULL); - } else if (strstr(type, "application/x-id3")) { - id3tag = gst_element_factory_make("id3demux", NULL); - gst_handle->demux = gst_element_factory_make("mpegaudioparse", NULL); - } else if (strstr(type, "audio/x-amr-nb-sh") - || strstr(type, "audio/x-amr-wb-sh")) { - gst_handle->demux = gst_element_factory_make("amrparse", NULL); - } else if (strstr(type, "audio/x-wav")) { - gst_handle->demux = gst_element_factory_make("wavparse", NULL); - } else if (strstr(type, "audio/x-flac")) { - gst_handle->demux = gst_element_factory_make("flacparse", NULL); - } - - if (!gst_handle->demux) { - gst_handle->is_valid_container = false; - MD_E("factory not able to create audio parse element\n"); + pad = gst_element_get_static_pad(gst_handle->typefind, "src"); + if (!pad) { + MD_E("fail to get typefind src pad.\n"); goto ERROR; - } else { - gst_bin_add_many(GST_BIN(gst_handle->pipeline), - gst_handle->demux, id3tag, NULL); - pad = gst_element_get_static_pad(gst_handle->typefind, "src"); - if (!pad) { - MD_E("fail to get typefind src pad.\n"); - goto ERROR; - } - - fake_pad = gst_element_get_static_pad(gst_handle->fakesink, "sink"); - if (!fake_pad) { - MD_E("fail to get fakesink sink pad.\n"); - goto ERROR; - } - gst_pad_unlink(pad, fake_pad); - - if (fake_pad) - gst_object_unref(fake_pad); - - if (!id3tag) - aud_pad = gst_element_get_static_pad(gst_handle->demux, "sink"); - else - aud_pad = gst_element_get_static_pad(id3tag, "sink"); - if (!aud_pad) { - MD_E("fail to get audio parse sink pad.\n"); - goto ERROR; - } - - MEDIADEMUXER_LINK_PAD(pad, aud_pad, ERROR); - if (pad) - gst_object_unref(pad); - if (aud_pad) - gst_object_unref(aud_pad); - - if (!id3tag) { - MEDIADEMUXER_SET_STATE(gst_handle->demux, GST_STATE_PAUSED, ERROR); - } else { - MEDIADEMUXER_SET_STATE(id3tag, GST_STATE_PAUSED, ERROR); - MEDIADEMUXER_SET_STATE(gst_handle->demux, GST_STATE_PAUSED, ERROR); - gst_element_link(id3tag, gst_handle->demux); - } } gst_handle->total_tracks++; - - aud_srcpad = gst_element_get_static_pad(gst_handle->demux, "src"); - if (!aud_srcpad) { - MD_E("fail to get audioparse source pad.\n"); - goto ERROR; - } - - name = gst_pad_get_name(aud_srcpad); - if (__gst_add_track_info(aud_srcpad, name, &(head_track->head), gst_handle->pipeline) != MD_ERROR_NONE) { + if (__gst_add_track_info(pad, caps, &(head_track->head), gst_handle->pipeline) != MD_ERROR_NONE) { MD_E("unable to added track info"); head_track->num_audio_track = 0; head_track->num_video_track = 0; @@ -748,50 +737,24 @@ static int __gst_create_audio_only_pipeline(gpointer data, GstCaps *caps) goto ERROR; } - tmp_track = head_track->head; - while (tmp_track != NULL && aud_srcpad != tmp_track->pad) - tmp_track = tmp_track->next; - - if (tmp_track != NULL) { - if (tmp_track->caps) - gst_caps_unref(tmp_track->caps); - tmp_track->caps = gst_caps_copy(caps); - if (tmp_track->caps_string) - g_free(tmp_track->caps_string); - tmp_track->caps_string = gst_caps_to_string(tmp_track->caps); - MD_I("caps set to %s\n", tmp_track->caps_string); - if (tmp_track->name) - g_free(tmp_track->name); - tmp_track->name = g_strndup("audio", strlen("audio")); - } - (head_track->num_audio_track)++; /* unref pads */ - if (aud_srcpad) - gst_object_unref(aud_srcpad); + if (pad) + gst_object_unref(pad); + + /* In the case of audio only, there is no gst_handle->demux. So we pass NULL */ + __gst_no_more_pad(NULL, data); - __gst_no_more_pad(gst_handle->demux, data); - g_free(type); - g_free(name); MEDIADEMUXER_FLEAVE(); return MD_ERROR_NONE; ERROR: gst_handle->is_valid_container = false; - if (gst_handle->demux) - gst_object_unref(gst_handle->demux); + if (pad) gst_object_unref(pad); - if (aud_pad) - gst_object_unref(aud_pad); - if (fake_pad) - gst_object_unref(fake_pad); - if (aud_srcpad) - gst_object_unref(aud_srcpad); - g_free(type); - g_free(name); MEDIADEMUXER_FLEAVE(); return MD_ERROR; } @@ -865,6 +828,22 @@ static void __gst_cb_typefind(GstElement *tf, guint probability, || (strstr(type, "audio/x-amr-nb-sh")) || (strstr(type, "audio/x-amr-wb-sh"))) { MD_I("Audio only format is found\n"); + pad = gst_element_get_static_pad(gst_handle->typefind, "src"); + if (!pad) { + MD_E("fail to get typefind src pad.\n"); + goto ERROR; + } + fake_pad = gst_element_get_static_pad(gst_handle->fakesink, "sink"); + if (!fake_pad) { + MD_E("fail to get fakesink sink pad.\n"); + goto ERROR; + } + gst_pad_unlink(pad, fake_pad); + if (pad) + gst_object_unref(pad); + if (fake_pad) + gst_object_unref(fake_pad); + __gst_create_audio_only_pipeline(data, caps); } else { gst_handle->is_valid_container = false; @@ -876,8 +855,6 @@ static void __gst_cb_typefind(GstElement *tf, guint probability, return; ERROR: gst_handle->is_valid_container = false; - if (gst_handle->demux) - gst_object_unref(gst_handle->demux); if (type) g_free(type); if (pad) -- 2.7.4 From d58337d0514858d9958f3255bf87d11f4b23ff36 Mon Sep 17 00:00:00 2001 From: Gilbok Lee Date: Tue, 20 Dec 2016 16:49:15 +0900 Subject: [PATCH 13/16] ref/unref pad for unlink(unselected track) [Version] 0.1.13 [Profile] Common, Mobile, Wearable, TV [Issue Type] Fix bugs Change-Id: Ied7b7433f6fe875ab0ca3a250cf1301312b6f116 --- packaging/capi-mediademuxer.spec | 2 +- src/port_gst/mediademuxer_port_gst.c | 8 +++++--- 2 files changed, 6 insertions(+), 4 deletions(-) diff --git a/packaging/capi-mediademuxer.spec b/packaging/capi-mediademuxer.spec index 0ab08d5..2d0a380 100755 --- a/packaging/capi-mediademuxer.spec +++ b/packaging/capi-mediademuxer.spec @@ -1,6 +1,6 @@ Name: capi-mediademuxer Summary: A Media Demuxer library in Tizen Native API -Version: 0.1.12 +Version: 0.1.13 Release: 1 Group: Multimedia/API License: Apache-2.0 diff --git a/src/port_gst/mediademuxer_port_gst.c b/src/port_gst/mediademuxer_port_gst.c index 6f1dc88..bcd2a80 100755 --- a/src/port_gst/mediademuxer_port_gst.c +++ b/src/port_gst/mediademuxer_port_gst.c @@ -364,11 +364,11 @@ void __gst_free_stuct(track **head) track *temp = NULL; temp = *head; while (temp) { - /* + if (temp->pad) { MD_I("unref GST_PAD %p\n", temp->pad); gst_object_unref(temp->pad); - } */ + } if (temp->caps) { MD_I("unref GST_PAD caps %p\n", temp->caps); gst_caps_unref(temp->caps); @@ -419,7 +419,9 @@ int __gst_add_track_info(GstPad *pad, GstCaps *caps, track **head, } else { MD_I("allocate memory %p", temp); } - temp->pad = pad; + memset(temp, 0x00, sizeof(track)); + + temp->pad = gst_object_ref(pad); temp->caps = gst_caps_ref(caps); temp->caps_string = gst_caps_to_string(caps); temp->next = NULL; -- 2.7.4 From b2b60b75165d8a7ed0c6a653abade415279bce2b Mon Sep 17 00:00:00 2001 From: Gilbok Lee Date: Thu, 22 Dec 2016 13:12:22 +0900 Subject: [PATCH 14/16] If the output buffer is keyframe, output media packet will set sync_frame flag There is a problem setting the gstbuffer frag in the media packet. [Version] 0.1.14 [Profile] Common(Mobile, Wearable, TV) [Issue Type] Fix bugs (Migration, Add features, Refactoring, Script etc.) Change-Id: Ifc2f85772614e3cf8010be84ef4eea078739eade --- packaging/capi-mediademuxer.spec | 2 +- src/port_gst/mediademuxer_port_gst.c | 10 ++++++---- 2 files changed, 7 insertions(+), 5 deletions(-) diff --git a/packaging/capi-mediademuxer.spec b/packaging/capi-mediademuxer.spec index 2d0a380..92f18b4 100755 --- a/packaging/capi-mediademuxer.spec +++ b/packaging/capi-mediademuxer.spec @@ -1,6 +1,6 @@ Name: capi-mediademuxer Summary: A Media Demuxer library in Tizen Native API -Version: 0.1.13 +Version: 0.1.14 Release: 1 Group: Multimedia/API License: Apache-2.0 diff --git a/src/port_gst/mediademuxer_port_gst.c b/src/port_gst/mediademuxer_port_gst.c index bcd2a80..38a3ac8 100755 --- a/src/port_gst/mediademuxer_port_gst.c +++ b/src/port_gst/mediademuxer_port_gst.c @@ -1425,10 +1425,12 @@ static int _gst_copy_buf_to_media_packet(media_packet_h out_pkt, ret = MD_ERROR_UNKNOWN; goto ERROR; } - if (media_packet_set_flags(out_pkt, GST_BUFFER_FLAGS(buffer))) { - MD_E("unable to set the buffer size\n"); - ret = MD_ERROR_UNKNOWN; - goto ERROR; + if (!GST_BUFFER_FLAG_IS_SET(buffer, GST_BUFFER_FLAG_DELTA_UNIT)) { + if (media_packet_set_flags(out_pkt, MEDIA_PACKET_SYNC_FRAME)) { + MD_E("unable to set the buffer flag\n"); + ret = MD_ERROR_UNKNOWN; + goto ERROR; + } } /* set codec data into media packet */ if (codec_data) { -- 2.7.4 From 0196ab2d12104c528a02bb0a5d1d7e910b0cf758 Mon Sep 17 00:00:00 2001 From: Gilbok Lee Date: Mon, 26 Dec 2016 15:10:33 +0900 Subject: [PATCH 15/16] Add TIZEN_FEATURE_STREAMING define didn't support streaming [Version] 0.1.15 [Profile] Common, Mobile, Wearable, TV [Issue Type] Add feature Change-Id: I382d81788c784ebf9b863d0bc73dfc522abd41e0 --- packaging/capi-mediademuxer.spec | 2 +- src/mediademuxer_port.c | 14 +++++++++++++- src/port_gst/mediademuxer_port_gst.c | 9 +++++++++ 3 files changed, 23 insertions(+), 2 deletions(-) diff --git a/packaging/capi-mediademuxer.spec b/packaging/capi-mediademuxer.spec index 92f18b4..c29c5c1 100755 --- a/packaging/capi-mediademuxer.spec +++ b/packaging/capi-mediademuxer.spec @@ -1,6 +1,6 @@ Name: capi-mediademuxer Summary: A Media Demuxer library in Tizen Native API -Version: 0.1.14 +Version: 0.1.15 Release: 1 Group: Multimedia/API License: Apache-2.0 diff --git a/src/mediademuxer_port.c b/src/mediademuxer_port.c index 2a503de..0d5dd63 100755 --- a/src/mediademuxer_port.c +++ b/src/mediademuxer_port.c @@ -177,8 +177,13 @@ mediademuxer_src_type __md_util_media_type(char **uri) file_stat = __md_util_exist_file_path(path + 7); if (file_stat == MD_ERROR_NONE) { if (__md_util_is_sdp_file(path)) { +#ifdef TIZEN_FEATURE_STREAMING MD_L("uri is actually a file but it's sdp file. giving it to rtspsrc\n"); return MEDIADEMUXER_SRC_RTSP; +#else + MD_L("uri is actually a file but it's sdp file. didn't support streaming uri"); + return MEDIADEMUXER_SRC_INVALID; +#endif } else { return MEDIADEMUXER_SRC_FILE; } @@ -187,6 +192,7 @@ mediademuxer_src_type __md_util_media_type(char **uri) MD_E("could not access %s.\n", path); goto ERROR; } +#ifdef TIZEN_FEATURE_STREAMING } else if ((path = strstr(*uri, "rtsp://"))) { if (strlen(path)) { if ((path = strstr(*uri, "/wfd1.0/"))) @@ -203,6 +209,7 @@ mediademuxer_src_type __md_util_media_type(char **uri) return (MEDIADEMUXER_SRC_HTTP); } } +#endif } else { int file_stat = MD_ERROR_NONE; file_stat = __md_util_exist_file_path(*uri); @@ -226,8 +233,13 @@ mediademuxer_src_type __md_util_media_type(char **uri) free(old_uristr); old_uristr = NULL; if (__md_util_is_sdp_file((char *)(*uri))) { +#ifdef TIZEN_FEATURE_STREAMING MD_L("uri is actually a file but it's sdp file. giving it to rtspsrc\n"); - return (MEDIADEMUXER_SRC_RTSP); + return MEDIADEMUXER_SRC_RTSP; +#else + MD_L("uri is actually a file but it's sdp file. didn't support streaming uri"); + return MEDIADEMUXER_SRC_INVALID; +#endif } else { return (MEDIADEMUXER_SRC_FILE); } diff --git a/src/port_gst/mediademuxer_port_gst.c b/src/port_gst/mediademuxer_port_gst.c index 38a3ac8..1cef964 100755 --- a/src/port_gst/mediademuxer_port_gst.c +++ b/src/port_gst/mediademuxer_port_gst.c @@ -875,7 +875,9 @@ static int _gst_create_pipeline(mdgst_handle_t *gst_handle, char *uri) int ret = MD_ERROR_NONE; GstBus *bus = NULL; char *path = NULL; +#ifdef TIZEN_FEATURE_STREAMING int remote_streaming = 0; +#endif /* Initialize GStreamer */ /* Note: Replace the arguments of gst_init to pass the command line args to GStreamer. */ gst_init(NULL, NULL); @@ -890,9 +892,14 @@ static int _gst_create_pipeline(mdgst_handle_t *gst_handle, char *uri) /* Create the elements */ if ((path = strstr(uri, "http://"))) { +#ifdef TIZEN_FEATURE_STREAMING gst_handle->filesrc = gst_element_factory_make("souphttpsrc", NULL); remote_streaming = 1; MD_I("Source is http stream. \n"); +#else + MD_I("Source is http stream. Didn't support streaming\n"); + goto ERROR; +#endif } else { gst_handle->filesrc = gst_element_factory_make("filesrc", NULL); MD_I("Source is file stream \n"); @@ -904,9 +911,11 @@ static int _gst_create_pipeline(mdgst_handle_t *gst_handle, char *uri) } /* Modify the source's properties */ +#ifdef TIZEN_FEATURE_STREAMING if (remote_streaming == 1) g_object_set(G_OBJECT(gst_handle->filesrc), "location", uri, NULL); else +#endif g_object_set(G_OBJECT(gst_handle->filesrc), "location", uri + 7, NULL); gst_handle->typefind = gst_element_factory_make("typefind", NULL); if (!gst_handle->typefind) { -- 2.7.4 From 76b5c53b98a170252cdc14f15252e99c269f9ce2 Mon Sep 17 00:00:00 2001 From: "juan82.liu" Date: Mon, 20 Feb 2017 09:05:22 +0800 Subject: [PATCH 16/16] not need codec_data when set caps as byte-stream format [Version] 0.1.16 [Profile] Common, Mobile, Wearable, TV [Issue Type] Fix bugs Change-Id: Ifb74bca33e89da826a94a769794636274848f8b1 --- packaging/capi-mediademuxer.spec | 2 +- src/port_gst/mediademuxer_port_gst.c | 1 + 2 files changed, 2 insertions(+), 1 deletion(-) diff --git a/packaging/capi-mediademuxer.spec b/packaging/capi-mediademuxer.spec index c29c5c1..4265b1d 100755 --- a/packaging/capi-mediademuxer.spec +++ b/packaging/capi-mediademuxer.spec @@ -1,6 +1,6 @@ Name: capi-mediademuxer Summary: A Media Demuxer library in Tizen Native API -Version: 0.1.15 +Version: 0.1.16 Release: 1 Group: Multimedia/API License: Apache-2.0 diff --git a/src/port_gst/mediademuxer_port_gst.c b/src/port_gst/mediademuxer_port_gst.c index 1cef964..54cc18a 100755 --- a/src/port_gst/mediademuxer_port_gst.c +++ b/src/port_gst/mediademuxer_port_gst.c @@ -517,6 +517,7 @@ int __gst_add_track_info(GstPad *pad, GstCaps *caps, track **head, outcaps = gst_caps_new_simple("video/x-h264", "stream-format", G_TYPE_STRING, "byte-stream", NULL); gst_element_link_filtered(parse_element, temp->appsink, outcaps); gst_caps_unref(outcaps); + temp->need_codec_data = FALSE; } else if (strstr(temp->caps_string, "mpeg")) { gst_element_link(parse_element, temp->appsink); } else { -- 2.7.4