summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorEunhae Choi <eunhae1.choi@samsung.com>2016-10-19 19:12:30 +0900
committerEunhae Choi <eunhae1.choi@samsung.com>2016-10-19 19:15:52 +0900
commit4f905ba9db52bd2af5c6f950bfd70b4c9480f561 (patch)
treead282c1d44304d43a1ebceeb504785ccad7149fe
parent25da4a514bb7303df48187fd0c1b10d2a94c36a1 (diff)
downloadlibmm-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.spec2
-rw-r--r--src/mm_player_capture.c65
-rw-r--r--src/mm_player_priv.c14
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: