diff --git a/sys/v4l2codecs/gstv4l2codech264dec.c b/sys/v4l2codecs/gstv4l2codech264dec.c index 3af80c1d11..ca3662d3d0 100644 --- a/sys/v4l2codecs/gstv4l2codech264dec.c +++ b/sys/v4l2codecs/gstv4l2codech264dec.c @@ -836,10 +836,7 @@ gst_v4l2_codec_h264_dec_output_picture (GstH264Decoder * decoder, GST_DEBUG_OBJECT (self, "Output picture %u", picture->system_frame_number); - if (gst_v4l2_request_is_done (request)) - goto finish_frame; - - ret = gst_v4l2_request_poll (request, GST_SECOND); + ret = gst_v4l2_request_set_done (request); if (ret == 0) { GST_ELEMENT_ERROR (self, STREAM, DECODE, ("Decoding frame %u took too long", picture->system_frame_number), @@ -850,11 +847,8 @@ gst_v4l2_codec_h264_dec_output_picture (GstH264Decoder * decoder, ("Decoding request failed: %s", g_strerror (errno)), (NULL)); goto error; } - - gst_v4l2_request_set_done (request); g_return_val_if_fail (frame->output_buffer, GST_FLOW_ERROR); -finish_frame: if (gst_v4l2_request_failed (request)) { GST_ELEMENT_ERROR (self, STREAM, DECODE, ("Failed to decode frame %u", picture->system_frame_number), (NULL)); diff --git a/sys/v4l2codecs/gstv4l2codecvp8dec.c b/sys/v4l2codecs/gstv4l2codecvp8dec.c index 078331341c..cbad24da9c 100644 --- a/sys/v4l2codecs/gstv4l2codecvp8dec.c +++ b/sys/v4l2codecs/gstv4l2codecvp8dec.c @@ -653,11 +653,7 @@ gst_v4l2_codec_vp8_dec_output_picture (GstVp8Decoder * decoder, GST_DEBUG_OBJECT (self, "Output picture %u", picture->system_frame_number); - /* Unlikely, but it would not break this decoding flow */ - if (gst_v4l2_request_is_done (request)) - goto finish_frame; - - ret = gst_v4l2_request_poll (request, GST_SECOND); + ret = gst_v4l2_request_set_done (request); if (ret == 0) { GST_ELEMENT_ERROR (self, STREAM, DECODE, ("Decoding frame took too long"), (NULL)); @@ -668,10 +664,8 @@ gst_v4l2_codec_vp8_dec_output_picture (GstVp8Decoder * decoder, goto error; } - gst_v4l2_request_set_done (request); g_return_val_if_fail (frame->output_buffer, GST_FLOW_ERROR); -finish_frame: if (gst_v4l2_request_failed (request)) { GST_ELEMENT_ERROR (self, STREAM, DECODE, ("Failed to decode frame %u", picture->system_frame_number), (NULL)); diff --git a/sys/v4l2codecs/gstv4l2decoder.c b/sys/v4l2codecs/gstv4l2decoder.c index 5a585e3ac8..ac04e2de80 100644 --- a/sys/v4l2codecs/gstv4l2decoder.c +++ b/sys/v4l2codecs/gstv4l2decoder.c @@ -1021,28 +1021,25 @@ gst_v4l2_request_queue (GstV4l2Request * request, guint flags) GstV4l2Request *pending_req; pending_req = gst_queue_array_peek_head (decoder->pending_requests); - ret = gst_v4l2_request_poll (pending_req, GST_SECOND); - if (ret > 0) - gst_v4l2_request_set_done (pending_req); + gst_v4l2_request_set_done (pending_req); } return TRUE; } gint -gst_v4l2_request_poll (GstV4l2Request * request, GstClockTime timeout) -{ - return gst_poll_wait (request->poll, timeout); -} - -void gst_v4l2_request_set_done (GstV4l2Request * request) { GstV4l2Decoder *decoder = request->decoder; GstV4l2Request *pending_req = NULL; + gint ret; if (!request->pending) - return; + return 1; + + ret = gst_poll_wait (request->poll, GST_SECOND); + if (ret <= 0) + return ret; while ((pending_req = gst_queue_array_pop_head (decoder->pending_requests))) { gst_v4l2_decoder_dequeue_sink (decoder); @@ -1071,12 +1068,8 @@ gst_v4l2_request_set_done (GstV4l2Request * request) /* Pending request must be in the pending request list */ g_assert (pending_req == request); -} -gboolean -gst_v4l2_request_is_done (GstV4l2Request * request) -{ - return !request->pending; + return ret; } gboolean diff --git a/sys/v4l2codecs/gstv4l2decoder.h b/sys/v4l2codecs/gstv4l2decoder.h index e83ed38793..bb3451014d 100644 --- a/sys/v4l2codecs/gstv4l2decoder.h +++ b/sys/v4l2codecs/gstv4l2decoder.h @@ -118,9 +118,7 @@ gboolean gst_v4l2_request_queue (GstV4l2Request * request, gint gst_v4l2_request_poll (GstV4l2Request * request, GstClockTime timeout); -void gst_v4l2_request_set_done (GstV4l2Request * request); - -gboolean gst_v4l2_request_is_done (GstV4l2Request * request); +gint gst_v4l2_request_set_done (GstV4l2Request * request); gboolean gst_v4l2_request_failed (GstV4l2Request * request);