amlv4l2: CF1 add private event and signal [2/2]

PD#SWPL-128446

Problem:
add private custom upstream event and private signal
amldemux will detect private event and connect private signal
amlv4l2 will emit the latest decoded pts
amldemux will using the latest decoded pts for flow rate control

Solution:
(detail info)

Verify:
(detail info)

Change-Id: Ifa2d1cbbabbf1fe7fc258efacff306733686a7dd
Signed-off-by: xuesong.jiang <xuesong.jiang@amlogic.com>
diff --git a/src/gstamlv4l2videodec.c b/src/gstamlv4l2videodec.c
index 70d3ba6..671a1d5 100644
--- a/src/gstamlv4l2videodec.c
+++ b/src/gstamlv4l2videodec.c
@@ -104,6 +104,14 @@
 #endif
 };
 
+enum
+{
+  SIGNAL_DECODED_PTS,
+  MAX_SIGNAL
+};
+
+static guint g_signals[MAX_SIGNAL]= {0};
+
 #define gst_aml_v4l2_video_dec_parent_class parent_class
 G_DEFINE_ABSTRACT_TYPE(GstAmlV4l2VideoDec, gst_aml_v4l2_video_dec,
                        GST_TYPE_VIDEO_DECODER);
@@ -1015,6 +1023,10 @@
 
         GST_LOG_OBJECT(decoder, "Process output buffer (switching flow outstanding num:%d)", self->v4l2capture->outstanding_buf_num);
         ret = gst_aml_v4l2_buffer_pool_process(v4l2_pool, &buffer);
+
+        GST_DEBUG_OBJECT(decoder, "send pts:%lld - %" GST_TIME_FORMAT, GST_BUFFER_PTS(buffer), GST_TIME_ARGS(GST_BUFFER_PTS(buffer)));
+        g_signal_emit (self, g_signals[SIGNAL_DECODED_PTS], 0, GST_BUFFER_PTS(buffer));
+
         if (ret == GST_AML_V4L2_FLOW_SOURCE_CHANGE)
         {
             gst_aml_v4l2_object_stop(self->v4l2capture);
@@ -1376,6 +1388,18 @@
 
     switch (type)
     {
+    case GST_EVENT_STREAM_START:
+    {
+        GstStructure *s;
+        GstEvent *event;
+        GST_DEBUG_OBJECT(self, "new private event");
+        s = gst_structure_new("private_signal", "obj_ptr", G_TYPE_POINTER, self, "sig_name", G_TYPE_STRING, "decoded-pts", NULL);
+        event = gst_event_new_custom (GST_EVENT_CUSTOM_UPSTREAM, s);
+        GST_DEBUG_OBJECT(self, "before Send private_signal Event :%p", event);
+        gst_pad_push_event (decoder->sinkpad, event);
+        GST_DEBUG_OBJECT(self, "after Send private_signal Event :%p", event);
+        break;
+    }
     case GST_EVENT_FLUSH_START:
         GST_DEBUG_OBJECT(self, "flush start");
 
@@ -1555,6 +1579,17 @@
     element_class->change_state =
         GST_DEBUG_FUNCPTR(gst_aml_v4l2_video_dec_change_state);
 
+  g_signals[SIGNAL_DECODED_PTS] = g_signal_new ("decoded-pts",
+        G_TYPE_FROM_CLASS(GST_ELEMENT_CLASS(klass)),
+        G_SIGNAL_RUN_LAST,
+        0,    /* class offset */
+        NULL, /* accumulator */
+        NULL, /* accu data */
+        g_cclosure_marshal_generic,
+        G_TYPE_NONE,
+        1,
+        G_TYPE_UINT64);
+
     gst_aml_v4l2_object_install_m2m_properties_helper(gobject_class);
 #if GST_IMPORT_LGE_PROP
     gst_aml_v4l2_video_dec_install_lge_properties_helper(gobject_class);