diff options
author | Eunhae Choi <eunhae1.choi@samsung.com> | 2016-10-19 19:12:30 +0900 |
---|---|---|
committer | Eunhae Choi <eunhae1.choi@samsung.com> | 2016-10-19 19:15:52 +0900 |
commit | 4f905ba9db52bd2af5c6f950bfd70b4c9480f561 (patch) | |
tree | ad282c1d44304d43a1ebceeb504785ccad7149fe | |
parent | 25da4a514bb7303df48187fd0c1b10d2a94c36a1 (diff) | |
download | libmm-player-4f905ba9db52bd2af5c6f950bfd70b4c9480f561.tar.gz libmm-player-4f905ba9db52bd2af5c6f950bfd70b4c9480f561.tar.bz2 libmm-player-4f905ba9db52bd2af5c6f950bfd70b4c9480f561.zip |
[v0.6.5] remove mem leak in capture funct
Change-Id: I17405ab3c757ddfcfc6c2083f489a2af764ce632
-rw-r--r-- | packaging/libmm-player.spec | 2 | ||||
-rw-r--r-- | src/mm_player_capture.c | 65 | ||||
-rw-r--r-- | src/mm_player_priv.c | 14 |
3 files changed, 53 insertions, 28 deletions
diff --git a/packaging/libmm-player.spec b/packaging/libmm-player.spec index b5ab6de..4afa617 100644 --- a/packaging/libmm-player.spec +++ b/packaging/libmm-player.spec @@ -1,6 +1,6 @@ Name: libmm-player Summary: Multimedia Framework Player Library -Version: 0.6.4 +Version: 0.6.5 Release: 0 Group: Multimedia/Libraries License: Apache-2.0 diff --git a/src/mm_player_capture.c b/src/mm_player_capture.c index 5fed7c5..af6f117 100644 --- a/src/mm_player_capture.c +++ b/src/mm_player_capture.c @@ -155,11 +155,12 @@ _mmplayer_do_video_capture(MMHandleType hplayer) if (sample) { GstBuffer *buf = NULL; buf = gst_sample_get_buffer(sample); - - if (buf) - ret = __mmplayer_get_video_frame_from_buffer(player, pad, buf); - else + if (buf) { + if (__mmplayer_get_video_frame_from_buffer(player, pad, buf) != MM_ERROR_NONE) + ret = MM_ERROR_PLAYER_INTERNAL; + } else { LOGW("failed to get video frame"); + } gst_sample_unref(sample); } return ret; @@ -468,6 +469,7 @@ EXIT: static int __mmplayer_get_video_frame_from_buffer(mm_player_t* player, GstPad *pad, GstBuffer *buffer) { + int ret = MM_ERROR_NONE; gint yplane_size = 0; gint uvplane_size = 0; gint src_width = 0; @@ -491,8 +493,11 @@ __mmplayer_get_video_frame_from_buffer(mm_player_t* player, GstPad *pad, GstBuff MMPLAYER_LOG_GST_CAPS_TYPE(caps); structure = gst_caps_get_structure(caps, 0); - - MMPLAYER_RETURN_VAL_IF_FAIL(structure != NULL, MM_ERROR_PLAYER_INTERNAL); + if (!structure) { + LOGE("cannot get structure from caps.\n"); + ret = MM_ERROR_PLAYER_INTERNAL; + goto ERROR; + } /* init capture image buffer */ memset(&player->capture, 0x00, sizeof(MMPlayerVideoCapture)); @@ -522,7 +527,8 @@ __mmplayer_get_video_frame_from_buffer(mm_player_t* player, GstPad *pad, GstBuff if (!proved || !proved->data[0] || !proved->data[1]) { LOGE("fail to gst_memory_map"); - return MM_ERROR_PLAYER_INTERNAL; + ret = MM_ERROR_PLAYER_INTERNAL; + goto ERROR; } memcpy(&player->captured, proved, sizeof(MMVideoBuffer)); @@ -534,7 +540,9 @@ __mmplayer_get_video_frame_from_buffer(mm_player_t* player, GstPad *pad, GstBuff player->captured.data[0] = g_try_malloc(yplane_size); if (!player->captured.data[0]) { gst_memory_unmap(memory, &mapinfo); - return MM_ERROR_SOUND_NO_FREE_SPACE; + LOGE("no free space\n"); + ret = MM_ERROR_PLAYER_NO_FREE_SPACE; + goto ERROR; } /* FIXME */ @@ -544,12 +552,17 @@ __mmplayer_get_video_frame_from_buffer(mm_player_t* player, GstPad *pad, GstBuff if (uvplane_size < proved->stride_width[1] * proved->stride_height[1]) { player->captured.data[1] = g_try_malloc(proved->stride_width[1] * proved->stride_height[1]); - } else + uvplane_size = proved->stride_width[1] * proved->stride_height[1]; + } else { player->captured.data[1] = g_try_malloc(uvplane_size); + } #endif if (!player->captured.data[1]) { + LOGE("no free space\n"); + MMPLAYER_FREEIF(player->captured.data[0]); gst_memory_unmap(memory, &mapinfo); - return MM_ERROR_SOUND_NO_FREE_SPACE; + ret = MM_ERROR_PLAYER_NO_FREE_SPACE; + goto ERROR; } LOGD("Buffer type %d", proved->type); @@ -566,10 +579,16 @@ __mmplayer_get_video_frame_from_buffer(mm_player_t* player, GstPad *pad, GstBuff tbm_bo_unref(proved->handle.bo[0]); tbm_bo_unref(proved->handle.bo[1]); + } else { + LOGE("Not support video buffer type %d", proved->type); + MMPLAYER_FREEIF(player->captured.data[0]); + MMPLAYER_FREEIF(player->captured.data[1]); + gst_memory_unmap(memory, &mapinfo); + ret = MM_ERROR_PLAYER_INTERNAL; + goto ERROR; } gst_memory_unmap(memory, &mapinfo); - goto DONE; } else { GstVideoInfo format_info; @@ -586,12 +605,17 @@ __mmplayer_get_video_frame_from_buffer(mm_player_t* player, GstPad *pad, GstBuff src_fmt = MM_UTIL_IMG_FMT_BGRX8888; break; default: - goto UNKNOWN; + LOGE("unknown format to capture\n"); + ret = MM_ERROR_PLAYER_INTERNAL; + goto ERROR; break; } } - } else - goto UNKNOWN; + } else { + LOGE("unknown format to capture\n"); + ret = MM_ERROR_PLAYER_INTERNAL; + goto ERROR; + } gst_buffer_map(buffer, &mapinfo, GST_MAP_READ); __mm_player_convert_colorspace(player, mapinfo.data, src_fmt, src_width, src_height, dst_fmt); @@ -601,13 +625,14 @@ DONE: /* do convert colorspace */ MMPLAYER_CAPTURE_THREAD_SIGNAL(player); - MMPLAYER_FLEAVE(); - - return MM_ERROR_NONE; +ERROR: + if (caps) { + gst_caps_unref(caps); + caps = NULL; + } -UNKNOWN: - LOGE("unknown format to capture\n"); - return MM_ERROR_PLAYER_INTERNAL; + MMPLAYER_FLEAVE(); + return ret; } static GstPadProbeReturn diff --git a/src/mm_player_priv.c b/src/mm_player_priv.c index ec4a648..d69b435 100644 --- a/src/mm_player_priv.c +++ b/src/mm_player_priv.c @@ -2278,12 +2278,10 @@ __mmplayer_gst_selector_event_probe(GstPad * pad, GstPadProbeInfo * info, gpoint gint64 position = 0; gint idx = 0; - LOGD("[%d] GST_EVENT_STREAM_START", stream_type); - for (idx = MM_PLAYER_TRACK_TYPE_AUDIO; idx < MM_PLAYER_TRACK_TYPE_TEXT; idx++) { if ((player->gapless.update_segment[idx] == TRUE) || !(player->selector[idx].event_probe_id)) { - LOGW("[%d] skip", idx); + /* LOGW("[%d] skip", idx); */ continue; } @@ -2315,11 +2313,13 @@ __mmplayer_gst_selector_event_probe(GstPad * pad, GstPadProbeInfo * info, gpoint position = MAX(position, position_running_time); } - LOGD("start_time from %" GST_TIME_FORMAT " to %" GST_TIME_FORMAT, - GST_TIME_ARGS(player->gapless.start_time[stream_type]), - GST_TIME_ARGS(player->gapless.start_time[stream_type] + position)); + if (position != 0) { + LOGD("[%d]GST_EVENT_STREAM_START: start_time from %" GST_TIME_FORMAT " to %" GST_TIME_FORMAT, + stream_type, GST_TIME_ARGS(player->gapless.start_time[stream_type]), + GST_TIME_ARGS(player->gapless.start_time[stream_type] + position)); - player->gapless.start_time[stream_type] += position; + player->gapless.start_time[stream_type] += position; + } break; } case GST_EVENT_FLUSH_STOP: |