diff options
author | Guillaume Desmottes <guillaume.desmottes@collabora.co.uk> | 2015-05-04 19:26:14 +0200 |
---|---|---|
committer | Nicolas Dufresne <nicolas.dufresne@collabora.co.uk> | 2015-05-05 13:56:05 -0400 |
commit | 1421fc558e138c6e7c8ba4e3a835c12102e05946 (patch) | |
tree | 67a66629d8d867fd1851a163d45f90b105b00114 /ext | |
parent | 9865730cfa5b3a8b2560d082e7e56b350042d3d2 (diff) |
jpegdec: fix frame leaks in handle_frame() implementation
handle_frame() is supposed to consume @frame, so if we don't call
gst_video_decoder_drop_frame() or gst_video_decoder_finish_frame() we have to
release it manually.
https://bugzilla.gnome.org/show_bug.cgi?id=748909
Diffstat (limited to 'ext')
-rw-r--r-- | ext/jpeg/gstjpegdec.c | 6 |
1 files changed, 6 insertions, 0 deletions
diff --git a/ext/jpeg/gstjpegdec.c b/ext/jpeg/gstjpegdec.c index 25dfb0093..a1ba7c0c1 100644 --- a/ext/jpeg/gstjpegdec.c +++ b/ext/jpeg/gstjpegdec.c @@ -994,6 +994,7 @@ gst_jpeg_dec_handle_frame (GstVideoDecoder * bdec, GstVideoCodecFrame * frame) guint code, hdr_ok; gboolean need_unmap = TRUE; GstVideoCodecState *state = NULL; + gboolean release_frame = TRUE; dec->current_frame = frame; gst_buffer_map (frame->input_buffer, &dec->current_frame_map, GST_MAP_READ); @@ -1141,6 +1142,7 @@ gst_jpeg_dec_handle_frame (GstVideoDecoder * bdec, GstVideoCodecFrame * frame) gst_buffer_unmap (frame->input_buffer, &dec->current_frame_map); ret = gst_video_decoder_finish_frame (bdec, frame); + release_frame = FALSE; need_unmap = FALSE; done: @@ -1150,6 +1152,9 @@ exit: if (need_unmap) gst_buffer_unmap (frame->input_buffer, &dec->current_frame_map); + if (release_frame) + gst_video_decoder_release_frame (bdec, frame); + if (state) gst_video_codec_state_unref (state); @@ -1183,6 +1188,7 @@ decode_error: gst_buffer_unmap (frame->input_buffer, &dec->current_frame_map); gst_video_decoder_drop_frame (bdec, frame); + release_frame = FALSE; need_unmap = FALSE; jpeg_abort_decompress (&dec->cinfo); |