vpxdec: Unref frame in all code paths of handle_frame()

https://bugzilla.gnome.org/show_bug.cgi?id=760666
This commit is contained in:
Sebastian Dröge 2016-01-20 10:02:48 +02:00
parent 01f995b8dd
commit 7eee775d5f

View file

@ -564,12 +564,10 @@ gst_vpx_dec_open_codec (GstVPXDec * dec, GstVideoCodecFrame * frame)
if (status != VPX_CODEC_OK) { if (status != VPX_CODEC_OK) {
GST_WARNING_OBJECT (dec, "VPX preprocessing error: %s", GST_WARNING_OBJECT (dec, "VPX preprocessing error: %s",
gst_vpx_error_name (status)); gst_vpx_error_name (status));
gst_video_decoder_drop_frame (GST_VIDEO_DECODER (dec), frame);
return GST_FLOW_CUSTOM_SUCCESS_1; return GST_FLOW_CUSTOM_SUCCESS_1;
} }
if (!stream_info.is_kf) { if (!stream_info.is_kf) {
GST_WARNING_OBJECT (dec, "No keyframe, skipping"); GST_WARNING_OBJECT (dec, "No keyframe, skipping");
gst_video_decoder_drop_frame (GST_VIDEO_DECODER (dec), frame);
return GST_FLOW_CUSTOM_SUCCESS_1; return GST_FLOW_CUSTOM_SUCCESS_1;
} }
@ -644,10 +642,13 @@ gst_vpx_dec_handle_frame (GstVideoDecoder * decoder, GstVideoCodecFrame * frame)
if (!dec->decoder_inited) { if (!dec->decoder_inited) {
ret = vpxclass->open_codec (dec, frame); ret = vpxclass->open_codec (dec, frame);
if (ret == GST_FLOW_CUSTOM_SUCCESS_1) if (ret == GST_FLOW_CUSTOM_SUCCESS_1) {
gst_video_decoder_drop_frame (decoder, frame);
return GST_FLOW_OK; return GST_FLOW_OK;
else if (ret != GST_FLOW_OK) } else if (ret != GST_FLOW_OK) {
gst_video_codec_frame_unref (frame);
return ret; return ret;
}
} }
deadline = gst_video_decoder_get_max_decode_time (decoder, frame); deadline = gst_video_decoder_get_max_decode_time (decoder, frame);
@ -661,6 +662,7 @@ gst_vpx_dec_handle_frame (GstVideoDecoder * decoder, GstVideoCodecFrame * frame)
if (!gst_buffer_map (frame->input_buffer, &minfo, GST_MAP_READ)) { if (!gst_buffer_map (frame->input_buffer, &minfo, GST_MAP_READ)) {
GST_ERROR_OBJECT (dec, "Failed to map input buffer"); GST_ERROR_OBJECT (dec, "Failed to map input buffer");
gst_video_codec_frame_unref (frame);
return GST_FLOW_ERROR; return GST_FLOW_ERROR;
} }
@ -672,6 +674,7 @@ gst_vpx_dec_handle_frame (GstVideoDecoder * decoder, GstVideoCodecFrame * frame)
if (status) { if (status) {
GST_VIDEO_DECODER_ERROR (decoder, 1, LIBRARY, ENCODE, GST_VIDEO_DECODER_ERROR (decoder, 1, LIBRARY, ENCODE,
("Failed to decode frame"), ("%s", gst_vpx_error_name (status)), ret); ("Failed to decode frame"), ("%s", gst_vpx_error_name (status)), ret);
gst_video_codec_frame_unref (frame);
return ret; return ret;
} }
@ -682,6 +685,7 @@ gst_vpx_dec_handle_frame (GstVideoDecoder * decoder, GstVideoCodecFrame * frame)
GST_ELEMENT_ERROR (decoder, LIBRARY, ENCODE, GST_ELEMENT_ERROR (decoder, LIBRARY, ENCODE,
("Failed to decode frame"), ("Unsupported color format %d", ("Failed to decode frame"), ("Unsupported color format %d",
img->fmt)); img->fmt));
gst_video_codec_frame_unref (frame);
return GST_FLOW_ERROR; return GST_FLOW_ERROR;
} }