Make the sync point determination codec specific
authorVincent Penquerc'h <vincent.penquerch@collabora.co.uk>
Thu, 18 Oct 2012 16:12:57 +0000 (17:12 +0100)
committerVincent Penquerc'h <vincent.penquerch@collabora.co.uk>
Thu, 18 Oct 2012 16:12:57 +0000 (17:12 +0100)
This removes some H264 special casing code from the base class.

src/gstducatih264enc.c
src/gstducatividenc.c
src/gstducatividenc.h

index 05edc38ce39b1cb01c05d648afd6666d3f88a0b5..2852e1b06e003bc9045b6a3a5f018436d909fc05 100644 (file)
@@ -78,6 +78,8 @@ static gboolean gst_ducati_h264enc_allocate_params (GstDucatiVidEnc *
     self, gint params_sz, gint dynparams_sz, gint status_sz, gint inargs_sz,
     gint outargs_sz);
 static gboolean gst_ducati_h264enc_configure (GstDucatiVidEnc * self);
+static gboolean gst_ducati_h264enc_is_sync_point (GstDucatiVidEnc * enc,
+    int type);
 
 
 static GstStaticPadTemplate gst_ducati_h264enc_sink_template =
@@ -309,6 +311,7 @@ gst_ducati_h264enc_class_init (GstDucatiH264EncClass * klass)
 
   videnc_class->allocate_params = gst_ducati_h264enc_allocate_params;
   videnc_class->configure = gst_ducati_h264enc_configure;
+  videnc_class->is_sync_point = gst_ducati_h264enc_is_sync_point;
 
   g_object_class_install_property (gobject_class, PROP_PROFILE,
       g_param_spec_enum ("profile", "H.264 Profile", "H.264 Profile",
@@ -647,3 +650,9 @@ gst_ducati_h264enc_allocate_params (GstDucatiVidEnc *
 
   return ret;
 }
+
+static gboolean
+gst_ducati_h264enc_is_sync_point (GstDucatiVidEnc * enc, int type)
+{
+  return type == IVIDEO_IDR_FRAME;
+}
index 238081a8b1b0f58d91959641378d8f3029c524d1..71950315d832a2cc7c73c31bd2d5c785d867ebdf 100644 (file)
@@ -74,6 +74,8 @@ static GstFlowReturn gst_ducati_videnc_handle_frame (GstBaseVideoEncoder *
 static gboolean gst_ducati_videnc_allocate_params_default (GstDucatiVidEnc *
     self, gint params_sz, gint dynparams_sz, gint status_sz, gint inargs_sz,
     gint outargs_sz);
+static gboolean gst_ducati_videnc_is_sync_point_default (GstDucatiVidEnc * enc,
+    int type);
 static gboolean gst_ducati_videnc_configure_default (GstDucatiVidEnc * self);
 static gboolean gst_ducati_videnc_event (GstBaseVideoEncoder * enc,
     GstEvent * event);
@@ -152,6 +154,7 @@ gst_ducati_videnc_class_init (GstDucatiVidEncClass * klass)
 
   klass->allocate_params = gst_ducati_videnc_allocate_params_default;
   klass->configure = gst_ducati_videnc_configure_default;
+  klass->is_sync_point = gst_ducati_videnc_is_sync_point_default;
 
   g_object_class_install_property (gobject_class, PROP_BITRATE,
       g_param_spec_int ("bitrate", "Bitrate", "Bitrate in kbit/sec", -1,
@@ -645,13 +648,8 @@ have_inbuf:
     return GST_FLOW_ERROR;
   }
 
-  if (!strcmp (GST_DUCATIVIDENC_GET_CLASS (self)->codec_name, "ivahd_h264enc")) {
-    if (self->outArgs->encodedFrameType == IVIDEO_IDR_FRAME)
-      frame->is_sync_point = TRUE;
-  } else {
-    if (self->outArgs->encodedFrameType == IVIDEO_I_FRAME)
-      frame->is_sync_point = TRUE;
-  }
+  frame->is_sync_point = GST_DUCATIVIDENC_GET_CLASS (self)->is_sync_point (self,
+      self->outArgs->encodedFrameType);
   frame->src_buffer = gst_buffer_new_and_alloc (self->outArgs->bytesGenerated);
   memcpy (GST_BUFFER_DATA (frame->src_buffer),
       GST_BUFFER_DATA (outbuf), self->outArgs->bytesGenerated);
@@ -668,6 +666,12 @@ have_inbuf:
   return gst_base_video_encoder_finish_frame (base_video_encoder, frame);
 }
 
+static gboolean
+gst_ducati_videnc_is_sync_point_default (GstDucatiVidEnc * enc, int type)
+{
+  return type == IVIDEO_I_FRAME;
+}
+
 static gboolean
 gst_ducati_videnc_event (GstBaseVideoEncoder * enc, GstEvent * event)
 {
index d77304aa08603ab4c66c054f56eb10a17db6ecf2..e4059c1efde764bed9b2195bba9b8d988d4a7e0b 100644 (file)
@@ -89,6 +89,7 @@ struct _GstDucatiVidEncClass
   gboolean (*allocate_params) (GstDucatiVidEnc * self, gint params_sz,
       gint dynparams_sz, gint status_sz, gint inargs_sz, gint outargs_sz);
   gboolean (*configure) (GstDucatiVidEnc * self);
+  gboolean (*is_sync_point) (GstDucatiVidEnc * self, int type);
 };
 
 GType gst_ducati_videnc_get_type (void);