From d15b8c7ad359a84884a36a7786966e48f748d7c6 Mon Sep 17 00:00:00 2001 From: Mark Nauwelaerts Date: Thu, 24 Mar 2011 14:10:07 +0100 Subject: [PATCH] basevideoencoder: provide proper upstream flow return handling --- ext/dirac/gstdiracenc.cc | 10 +++++----- ext/vp8/gstvp8enc.c | 15 ++++++++------- gst-libs/gst/video/gstbasevideoencoder.c | 5 +++-- gst-libs/gst/video/gstbasevideoencoder.h | 2 +- 4 files changed, 17 insertions(+), 15 deletions(-) diff --git a/ext/dirac/gstdiracenc.cc b/ext/dirac/gstdiracenc.cc index f9122ee..1c499d7 100644 --- a/ext/dirac/gstdiracenc.cc +++ b/ext/dirac/gstdiracenc.cc @@ -150,7 +150,7 @@ static gboolean gst_dirac_enc_set_format (GstBaseVideoEncoder * static gboolean gst_dirac_enc_start (GstBaseVideoEncoder * base_video_encoder); static gboolean gst_dirac_enc_stop (GstBaseVideoEncoder * base_video_encoder); static gboolean gst_dirac_enc_finish (GstBaseVideoEncoder * base_video_encoder); -static gboolean gst_dirac_enc_handle_frame (GstBaseVideoEncoder * +static GstFlowReturn gst_dirac_enc_handle_frame (GstBaseVideoEncoder * base_video_encoder, GstVideoFrame * frame); static GstFlowReturn gst_dirac_enc_shape_output (GstBaseVideoEncoder * base_video_encoder, GstVideoFrame * frame); @@ -855,12 +855,12 @@ gst_dirac_enc_finish (GstBaseVideoEncoder * base_video_encoder) return TRUE; } -static gboolean +static GstFlowReturn gst_dirac_enc_handle_frame (GstBaseVideoEncoder * base_video_encoder, GstVideoFrame * frame) { GstDiracEnc *dirac_enc = GST_DIRAC_ENC (base_video_encoder); - gboolean ret; + GstFlowReturn ret; int r; const GstVideoState *state; uint8_t *data; @@ -963,7 +963,7 @@ gst_dirac_enc_handle_frame (GstBaseVideoEncoder * base_video_encoder, } if (r != (int) GST_BUFFER_SIZE (frame->sink_buffer)) { GST_ERROR ("failed to push picture"); - return FALSE; + return GST_FLOW_ERROR; } GST_DEBUG ("handle frame"); @@ -976,7 +976,7 @@ gst_dirac_enc_handle_frame (GstBaseVideoEncoder * base_video_encoder, ret = gst_dirac_enc_process (dirac_enc, FALSE); - return (ret == GST_FLOW_OK); + return ret; } #if 0 diff --git a/ext/vp8/gstvp8enc.c b/ext/vp8/gstvp8enc.c index 11921a3..b65029f 100644 --- a/ext/vp8/gstvp8enc.c +++ b/ext/vp8/gstvp8enc.c @@ -149,7 +149,7 @@ static gboolean gst_vp8_enc_stop (GstBaseVideoEncoder * encoder); static gboolean gst_vp8_enc_set_format (GstBaseVideoEncoder * base_video_encoder, GstVideoState * state); static gboolean gst_vp8_enc_finish (GstBaseVideoEncoder * base_video_encoder); -static gboolean gst_vp8_enc_handle_frame (GstBaseVideoEncoder * +static GstFlowReturn gst_vp8_enc_handle_frame (GstBaseVideoEncoder * base_video_encoder, GstVideoFrame * frame); static GstFlowReturn gst_vp8_enc_shape_output (GstBaseVideoEncoder * encoder, GstVideoFrame * frame); @@ -672,7 +672,7 @@ gst_vp8_enc_get_caps (GstBaseVideoEncoder * base_video_encoder) return caps; } -static void +static GstFlowReturn gst_vp8_enc_process (GstVP8Enc * encoder) { vpx_codec_iter_t iter = NULL; @@ -680,6 +680,7 @@ gst_vp8_enc_process (GstVP8Enc * encoder) GstBaseVideoEncoder *base_video_encoder; GstVP8EncCoderHook *hook; GstVideoFrame *frame; + GstFlowReturn ret = GST_FLOW_OK; base_video_encoder = GST_BASE_VIDEO_ENCODER (encoder); @@ -732,11 +733,13 @@ gst_vp8_enc_process (GstVP8Enc * encoder) hook->invisible = g_list_append (hook->invisible, buffer); } else { frame->src_buffer = buffer; - gst_base_video_encoder_finish_frame (base_video_encoder, frame); + ret = gst_base_video_encoder_finish_frame (base_video_encoder, frame); } pkt = vpx_codec_get_cx_data (&encoder->encoder, &iter); } + + return ret; } static gboolean @@ -803,7 +806,7 @@ static const int speed_table[] = { VPX_DL_REALTIME, }; -static gboolean +static GstFlowReturn gst_vp8_enc_handle_frame (GstBaseVideoEncoder * base_video_encoder, GstVideoFrame * frame) { @@ -845,9 +848,7 @@ gst_vp8_enc_handle_frame (GstBaseVideoEncoder * base_video_encoder, return FALSE; } - gst_vp8_enc_process (encoder); - - return TRUE; + return gst_vp8_enc_process (encoder); } static guint64 diff --git a/gst-libs/gst/video/gstbasevideoencoder.c b/gst-libs/gst/video/gstbasevideoencoder.c index 2073f63..7f8ec6e 100644 --- a/gst-libs/gst/video/gstbasevideoencoder.c +++ b/gst-libs/gst/video/gstbasevideoencoder.c @@ -492,6 +492,7 @@ gst_base_video_encoder_chain (GstPad * pad, GstBuffer * buf) GstBaseVideoEncoder *base_video_encoder; GstBaseVideoEncoderClass *klass; GstVideoFrame *frame; + GstFlowReturn ret = GST_FLOW_OK; base_video_encoder = GST_BASE_VIDEO_ENCODER (gst_pad_get_parent (pad)); klass = GST_BASE_VIDEO_ENCODER_GET_CLASS (base_video_encoder); @@ -547,12 +548,12 @@ gst_base_video_encoder_chain (GstPad * pad, GstBuffer * buf) GST_LOG_OBJECT (base_video_encoder, "passing frame pfn %d to subclass", frame->presentation_frame_number); - klass->handle_frame (base_video_encoder, frame); + ret = klass->handle_frame (base_video_encoder, frame); done: g_object_unref (base_video_encoder); - return GST_FLOW_OK; + return ret; } static GstStateChangeReturn diff --git a/gst-libs/gst/video/gstbasevideoencoder.h b/gst-libs/gst/video/gstbasevideoencoder.h index 69abd76..e359370 100644 --- a/gst-libs/gst/video/gstbasevideoencoder.h +++ b/gst-libs/gst/video/gstbasevideoencoder.h @@ -98,7 +98,7 @@ struct _GstBaseVideoEncoderClass gboolean (*start) (GstBaseVideoEncoder *coder); gboolean (*stop) (GstBaseVideoEncoder *coder); gboolean (*finish) (GstBaseVideoEncoder *coder); - gboolean (*handle_frame) (GstBaseVideoEncoder *coder, GstVideoFrame *frame); + GstFlowReturn (*handle_frame) (GstBaseVideoEncoder *coder, GstVideoFrame *frame); GstFlowReturn (*shape_output) (GstBaseVideoEncoder *coder, GstVideoFrame *frame); gboolean (*event) (GstBaseVideoEncoder *coder, GstEvent *event); GstCaps *(*get_caps) (GstBaseVideoEncoder *coder); -- 2.7.4