basevideoencoder: Add ::reset vfunc and handle ::reset/::finish the same way as in...
authorSebastian Dröge <sebastian.droege@collabora.co.uk>
Wed, 20 Jul 2011 07:09:25 +0000 (09:09 +0200)
committerSebastian Dröge <sebastian.droege@collabora.co.uk>
Wed, 20 Jul 2011 09:08:18 +0000 (11:08 +0200)
omx/gstbasevideoencoder.c
omx/gstbasevideoencoder.h

index f2e7584..75e7a99 100644 (file)
@@ -239,9 +239,9 @@ gst_base_video_encoder_drain (GstBaseVideoEncoder * enc)
     return TRUE;
   }
 
-  if (enc_class->finish) {
+  if (enc_class->reset) {
     GST_DEBUG_OBJECT (enc, "requesting subclass to finish");
-    ret = enc_class->finish (enc);
+    ret = enc_class->reset (enc);
   }
   /* everything should be away now */
   if (codec->frames) {
@@ -366,13 +366,26 @@ static gboolean
 gst_base_video_encoder_sink_eventfunc (GstBaseVideoEncoder * base_video_encoder,
     GstEvent * event)
 {
+  GstBaseVideoEncoderClass *base_video_encoder_class;
   gboolean ret = FALSE;
 
+  base_video_encoder_class =
+      GST_BASE_VIDEO_ENCODER_GET_CLASS (base_video_encoder);
+
   switch (GST_EVENT_TYPE (event)) {
     case GST_EVENT_EOS:
     {
+      GstFlowReturn flow_ret;
+
       base_video_encoder->a.at_eos = TRUE;
-      gst_base_video_encoder_drain (base_video_encoder);
+
+      if (base_video_encoder_class->finish) {
+        flow_ret = base_video_encoder_class->finish (base_video_encoder);
+      } else {
+        flow_ret = GST_FLOW_OK;
+      }
+
+      ret = (flow_ret == GST_BASE_VIDEO_ENCODER_FLOW_DROPPED);
       break;
     }
     case GST_EVENT_NEWSEGMENT:
index 17df4a6..5eeb2e3 100644 (file)
@@ -58,6 +58,12 @@ G_BEGIN_DECLS
  */
 #define GST_BASE_VIDEO_ENCODER_SRC_NAME     "src"
 
+/**
+ * GST_BASE_VIDEO_ENCODER_FLOW_DROPPED:
+ *
+ * Returned when the event/buffer should be dropped.
+ */
+#define GST_BASE_VIDEO_ENCODER_FLOW_DROPPED GST_FLOW_CUSTOM_SUCCESS_1
 
 typedef struct _GstBaseVideoEncoder GstBaseVideoEncoder;
 typedef struct _GstBaseVideoEncoderClass GstBaseVideoEncoderClass;
@@ -148,7 +154,8 @@ struct _GstBaseVideoEncoderClass
   GstFlowReturn (*handle_frame)       (GstBaseVideoEncoder *coder,
                                        GstVideoFrame *frame);
 
-  gboolean      (*finish)             (GstBaseVideoEncoder *coder);
+  gboolean      (*reset)              (GstBaseVideoEncoder *coder);
+  GstFlowReturn (*finish)             (GstBaseVideoEncoder *coder);
 
   GstFlowReturn (*shape_output)       (GstBaseVideoEncoder *coder,
                                        GstVideoFrame *frame);