diff options
Diffstat (limited to 'ext/vpx')
-rw-r--r-- | ext/vpx/gstvp8dec.c | 12 | ||||
-rw-r--r-- | ext/vpx/gstvp9dec.c | 12 |
2 files changed, 16 insertions, 8 deletions
diff --git a/ext/vpx/gstvp8dec.c b/ext/vpx/gstvp8dec.c index c86cc4c9d..7ed9fa15f 100644 --- a/ext/vpx/gstvp8dec.c +++ b/ext/vpx/gstvp8dec.c @@ -438,12 +438,10 @@ open_codec (GstVP8Dec * dec, GstVideoCodecFrame * frame) if (status != VPX_CODEC_OK) { GST_WARNING_OBJECT (dec, "VPX preprocessing error: %s", gst_vpx_error_name (status)); - gst_video_decoder_drop_frame (GST_VIDEO_DECODER (dec), frame); return GST_FLOW_CUSTOM_SUCCESS_1; } if (!stream_info.is_kf) { GST_WARNING_OBJECT (dec, "No keyframe, skipping"); - gst_video_decoder_drop_frame (GST_VIDEO_DECODER (dec), frame); return GST_FLOW_CUSTOM_SUCCESS_1; } @@ -516,10 +514,13 @@ gst_vp8_dec_handle_frame (GstVideoDecoder * decoder, GstVideoCodecFrame * frame) if (!dec->decoder_inited) { ret = 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; - else if (ret != GST_FLOW_OK) + } else if (ret != GST_FLOW_OK) { + gst_video_codec_frame_unref (frame); return ret; + } } deadline = gst_video_decoder_get_max_decode_time (decoder, frame); @@ -533,6 +534,7 @@ gst_vp8_dec_handle_frame (GstVideoDecoder * decoder, GstVideoCodecFrame * frame) if (!gst_buffer_map (frame->input_buffer, &minfo, GST_MAP_READ)) { GST_ERROR_OBJECT (dec, "Failed to map input buffer"); + gst_video_codec_frame_unref (frame); return GST_FLOW_ERROR; } @@ -544,6 +546,7 @@ gst_vp8_dec_handle_frame (GstVideoDecoder * decoder, GstVideoCodecFrame * frame) if (status) { GST_VIDEO_DECODER_ERROR (decoder, 1, LIBRARY, ENCODE, ("Failed to decode frame"), ("%s", gst_vpx_error_name (status)), ret); + gst_video_codec_frame_unref (frame); return ret; } @@ -554,6 +557,7 @@ gst_vp8_dec_handle_frame (GstVideoDecoder * decoder, GstVideoCodecFrame * frame) GST_ELEMENT_ERROR (decoder, LIBRARY, ENCODE, ("Failed to decode frame"), ("Unsupported color format %d", img->fmt)); + gst_video_codec_frame_unref (frame); return GST_FLOW_ERROR; } diff --git a/ext/vpx/gstvp9dec.c b/ext/vpx/gstvp9dec.c index 3de5a6412..3a057ca8e 100644 --- a/ext/vpx/gstvp9dec.c +++ b/ext/vpx/gstvp9dec.c @@ -434,12 +434,10 @@ open_codec (GstVP9Dec * dec, GstVideoCodecFrame * frame) if (status != VPX_CODEC_OK) { GST_WARNING_OBJECT (dec, "VPX preprocessing error: %s", gst_vpx_error_name (status)); - gst_video_decoder_drop_frame (GST_VIDEO_DECODER (dec), frame); return GST_FLOW_CUSTOM_SUCCESS_1; } if (!stream_info.is_kf) { GST_WARNING_OBJECT (dec, "No keyframe, skipping"); - gst_video_decoder_drop_frame (GST_VIDEO_DECODER (dec), frame); return GST_FLOW_CUSTOM_SUCCESS_1; } @@ -507,10 +505,13 @@ gst_vp9_dec_handle_frame (GstVideoDecoder * decoder, GstVideoCodecFrame * frame) if (!dec->decoder_inited) { ret = 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; - else if (ret != GST_FLOW_OK) + } else if (ret != GST_FLOW_OK) { + gst_video_codec_frame_unref (frame); return ret; + } } deadline = gst_video_decoder_get_max_decode_time (decoder, frame); @@ -524,6 +525,7 @@ gst_vp9_dec_handle_frame (GstVideoDecoder * decoder, GstVideoCodecFrame * frame) if (!gst_buffer_map (frame->input_buffer, &minfo, GST_MAP_READ)) { GST_ERROR_OBJECT (dec, "Failed to map input buffer"); + gst_video_codec_frame_unref (frame); return GST_FLOW_ERROR; } @@ -535,6 +537,7 @@ gst_vp9_dec_handle_frame (GstVideoDecoder * decoder, GstVideoCodecFrame * frame) if (status) { GST_VIDEO_DECODER_ERROR (decoder, 1, LIBRARY, ENCODE, ("Failed to decode frame"), ("%s", gst_vpx_error_name (status)), ret); + gst_video_codec_frame_unref (frame); return ret; } @@ -560,6 +563,7 @@ gst_vp9_dec_handle_frame (GstVideoDecoder * decoder, GstVideoCodecFrame * frame) GST_ELEMENT_ERROR (decoder, LIBRARY, ENCODE, ("Failed to decode frame"), ("Unsupported color format %d", img->fmt)); + gst_video_codec_frame_unref (frame); return GST_FLOW_ERROR; break; } |