basevideoencoder: provide proper upstream flow return handling
authorMark Nauwelaerts <mark.nauwelaerts@collabora.co.uk>
Thu, 24 Mar 2011 13:10:07 +0000 (14:10 +0100)
committerMark Nauwelaerts <mark.nauwelaerts@collabora.co.uk>
Mon, 16 May 2011 18:32:21 +0000 (20:32 +0200)
ext/dirac/gstdiracenc.cc
ext/vp8/gstvp8enc.c
gst-libs/gst/video/gstbasevideoencoder.c
gst-libs/gst/video/gstbasevideoencoder.h

index f9122ee..1c499d7 100644 (file)
@@ -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
index 11921a3..b65029f 100644 (file)
@@ -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
index 2073f63..7f8ec6e 100644 (file)
@@ -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
index 69abd76..e359370 100644 (file)
@@ -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);