basevideoencoder: add event virtual method to allow subclass event handling
authorMark Nauwelaerts <mark.nauwelaerts@collabora.co.uk>
Wed, 23 Mar 2011 07:49:48 +0000 (08:49 +0100)
committerMark Nauwelaerts <mark.nauwelaerts@collabora.co.uk>
Mon, 16 May 2011 18:32:19 +0000 (20:32 +0200)
gst-libs/gst/video/gstbasevideoencoder.c
gst-libs/gst/video/gstbasevideoencoder.h

index d6f32e7..e2f9f85 100644 (file)
@@ -176,19 +176,15 @@ gst_base_video_encoder_finalize (GObject * object)
 }
 
 static gboolean
-gst_base_video_encoder_sink_event (GstPad * pad, GstEvent * event)
+gst_base_video_encoder_sink_eventfunc (GstBaseVideoEncoder * base_video_encoder,
+    GstEvent * event)
 {
-  GstBaseVideoEncoder *base_video_encoder;
   GstBaseVideoEncoderClass *base_video_encoder_class;
   gboolean ret = FALSE;
 
-  base_video_encoder = GST_BASE_VIDEO_ENCODER (gst_pad_get_parent (pad));
   base_video_encoder_class =
       GST_BASE_VIDEO_ENCODER_GET_CLASS (base_video_encoder);
 
-  GST_LOG_OBJECT (base_video_encoder, "handling event: %" GST_PTR_FORMAT,
-      event);
-
   switch (GST_EVENT_TYPE (event)) {
     case GST_EVENT_EOS:
     {
@@ -196,12 +192,8 @@ gst_base_video_encoder_sink_event (GstPad * pad, GstEvent * event)
       if (base_video_encoder_class->finish) {
         base_video_encoder_class->finish (base_video_encoder);
       }
-
-      ret =
-          gst_pad_push_event (GST_BASE_VIDEO_CODEC_SRC_PAD (base_video_encoder),
-          event);
-    }
       break;
+    }
     case GST_EVENT_NEWSEGMENT:
     {
       gboolean update;
@@ -221,20 +213,18 @@ gst_base_video_encoder_sink_event (GstPad * pad, GstEvent * event)
           GST_TIME_ARGS (start), GST_TIME_ARGS (stop),
           GST_TIME_ARGS (position));
 
-      if (format != GST_FORMAT_TIME)
-        goto newseg_wrong_format;
+      if (format != GST_FORMAT_TIME) {
+        GST_DEBUG_OBJECT (base_video_encoder, "received non TIME newsegment");
+        break;
+      }
 
       base_video_encoder->a.at_eos = FALSE;
 
       gst_segment_set_newsegment_full (&GST_BASE_VIDEO_CODEC
           (base_video_encoder)->segment, update, rate, applied_rate, format,
           start, stop, position);
-
-      ret =
-          gst_pad_push_event (GST_BASE_VIDEO_CODEC_SRC_PAD (base_video_encoder),
-          event);
-    }
       break;
+    }
     case GST_EVENT_CUSTOM_DOWNSTREAM:
     {
       const GstStructure *s;
@@ -249,32 +239,44 @@ gst_base_video_encoder_sink_event (GstPad * pad, GstEvent * event)
         base_video_encoder->force_keyunit_event = gst_event_copy (event);
         GST_OBJECT_UNLOCK (base_video_encoder);
         gst_event_unref (event);
-        ret = GST_FLOW_OK;
-      } else {
-        ret =
-            gst_pad_push_event (GST_BASE_VIDEO_CODEC_SRC_PAD
-            (base_video_encoder), event);
+        ret = TRUE;
       }
       break;
     }
     default:
-      /* FIXME this changes the order of events */
-      ret =
-          gst_pad_push_event (GST_BASE_VIDEO_CODEC_SRC_PAD (base_video_encoder),
-          event);
       break;
   }
 
-done:
-  gst_object_unref (base_video_encoder);
   return ret;
+}
 
-newseg_wrong_format:
-  {
-    GST_DEBUG_OBJECT (base_video_encoder, "received non TIME newsegment");
-    gst_event_unref (event);
-    goto done;
-  }
+static gboolean
+gst_base_video_encoder_sink_event (GstPad * pad, GstEvent * event)
+{
+  GstBaseVideoEncoder *enc;
+  GstBaseVideoEncoderClass *klass;
+  gboolean handled = FALSE;
+  gboolean ret = TRUE;
+
+  enc = GST_BASE_VIDEO_ENCODER (gst_pad_get_parent (pad));
+  klass = GST_BASE_VIDEO_ENCODER_GET_CLASS (enc);
+
+  GST_DEBUG_OBJECT (enc, "received event %d, %s", GST_EVENT_TYPE (event),
+      GST_EVENT_TYPE_NAME (event));
+
+  if (klass->event)
+    handled = klass->event (enc, event);
+
+  if (!handled)
+    handled = gst_base_video_encoder_sink_eventfunc (enc, event);
+
+  if (!handled)
+    ret = gst_pad_event_default (pad, event);
+
+  GST_DEBUG_OBJECT (enc, "event handled");
+
+  gst_object_unref (enc);
+  return ret;
 }
 
 static gboolean
index e9cbceb..e53b606 100644 (file)
@@ -96,6 +96,7 @@ struct _GstBaseVideoEncoderClass
   gboolean (*finish) (GstBaseVideoEncoder *coder);
   gboolean (*handle_frame) (GstBaseVideoEncoder *coder, GstVideoFrame *frame);
   GstFlowReturn (*shape_output) (GstBaseVideoEncoder *coder, GstVideoFrame *frame);
+  gboolean (*event) (GstBaseVideoEncoder *coder, GstEvent *event);
   GstCaps *(*get_caps) (GstBaseVideoEncoder *coder);
 
   /* FIXME before moving to base */