fix(gstreamer): fix buffer map memory leak (#9378)

This commit is contained in:
André Costa
2025-12-20 08:14:46 +01:00
committed by GitHub
parent 721029ac22
commit 3be24e3348
2 changed files with 18 additions and 6 deletions
+15 -5
View File
@@ -443,6 +443,17 @@ static void gstreamer_update_frame(lv_gstreamer_t * streamer)
GstBuffer * buffer = gst_sample_get_buffer(sample); GstBuffer * buffer = gst_sample_get_buffer(sample);
GstMapInfo map; GstMapInfo map;
if(buffer && gst_buffer_map(buffer, &map, GST_MAP_READ)) { if(buffer && gst_buffer_map(buffer, &map, GST_MAP_READ)) {
if(streamer->last_buffer) {
gst_buffer_unmap(streamer->last_buffer, &streamer->last_map_info);
}
if(streamer->last_sample) {
gst_sample_unref(streamer->last_sample);
}
streamer->last_buffer = buffer;
streamer->last_map_info = map;
streamer->last_sample = sample;
streamer->frame = (lv_image_dsc_t) { streamer->frame = (lv_image_dsc_t) {
.data = map.data, .data = map.data,
.data_size = map.size, .data_size = map.size,
@@ -462,10 +473,6 @@ static void gstreamer_update_frame(lv_gstreamer_t * streamer)
lv_obj_send_event((lv_obj_t *)streamer, LV_EVENT_READY, streamer); lv_obj_send_event((lv_obj_t *)streamer, LV_EVENT_READY, streamer);
} }
if(streamer->last_sample) {
gst_sample_unref(streamer->last_sample);
}
streamer->last_sample = sample;
} }
static void gstreamer_timer_cb(lv_timer_t * timer) static void gstreamer_timer_cb(lv_timer_t * timer)
{ {
@@ -488,10 +495,13 @@ static void lv_gstreamer_destructor(const lv_obj_class_t * class_p, lv_obj_t * o
gst_element_set_state(streamer->pipeline, GST_STATE_NULL); gst_element_set_state(streamer->pipeline, GST_STATE_NULL);
gst_object_unref(streamer->pipeline); gst_object_unref(streamer->pipeline);
} }
if(streamer->last_buffer) {
gst_buffer_unmap(streamer->last_buffer, &streamer->last_map_info);
}
if(streamer->last_sample) { if(streamer->last_sample) {
gst_sample_unref(streamer->last_sample); gst_sample_unref(streamer->last_sample);
} }
lv_timer_delete(streamer->gstreamer_timer);
g_async_queue_unref(streamer->frame_queue); g_async_queue_unref(streamer->frame_queue);
} }
+3 -1
View File
@@ -37,11 +37,13 @@ struct _lv_gstreamer_t {
lv_image_t image; lv_image_t image;
lv_image_dsc_t frame; lv_image_dsc_t frame;
GstVideoInfo video_info; GstVideoInfo video_info;
GstMapInfo last_map_info;
GstBuffer * last_buffer;
GstSample * last_sample;
GstElement * pipeline; GstElement * pipeline;
GstElement * audio_convert; GstElement * audio_convert;
GstElement * video_convert; GstElement * video_convert;
GstElement * audio_volume; GstElement * audio_volume;
GstSample * last_sample;
lv_timer_t * gstreamer_timer; lv_timer_t * gstreamer_timer;
GAsyncQueue * frame_queue; GAsyncQueue * frame_queue;
bool is_video_info_valid; bool is_video_info_valid;