amlv4l2dec: CB2 statistics of decoded error frames [1/1]

PD#SWPL-175658

Problem:
statistics of decoded error frames

Solution:
add property of decoding-error-frames
to statistics of decoded error frames

Verify:
ap222

Change-Id: Ibdb01eba31308f87b145d25003beabe06a44613d
Signed-off-by: fei.deng <fei.deng@amlogic.com>
diff --git a/src/aml_v4l2_calls.c b/src/aml_v4l2_calls.c
index 7f0411b..d54df73 100644
--- a/src/aml_v4l2_calls.c
+++ b/src/aml_v4l2_calls.c
@@ -179,16 +179,35 @@
     memset(&sub, 0, sizeof(struct v4l2_event_subscription));
     sub.type = V4L2_EVENT_SOURCE_CHANGE;
     if (v4l2object->ioctl(v4l2object->video_fd, VIDIOC_SUBSCRIBE_EVENT, &sub) < 0)
+    {
+        GST_WARNING_OBJECT(e, "Cannot subscribe V4L2_EVENT_SOURCE_CHANGE for device '%s'.",
+            v4l2object->videodev);
         goto failed;
+    }
 
     sub.type = V4L2_EVENT_EOS;
     if (v4l2object->ioctl(v4l2object->video_fd, VIDIOC_SUBSCRIBE_EVENT, &sub) < 0)
+    {
+        GST_WARNING_OBJECT(e, "Cannot subscribe V4L2_EVENT_EOS event for device '%s'.",
+            v4l2object->videodev);
         goto failed;
+    }
+
+    //subscribe decode frame error event
+    sub.type = V4L2_EVENT_PRIVATE_EXT_REPORT_ERROR_FRAME;
+    if (v4l2object->ioctl(v4l2object->video_fd, VIDIOC_SUBSCRIBE_EVENT, &sub) < 0)
+    {
+        GST_WARNING_OBJECT(e, "Cannot subscribe V4L2_EVENT_PRIVATE_EXT_REPORT_ERROR_FRAME"
+            "event for device '%s'.", v4l2object->videodev);
+    }
 
     sub.type = V4L2_EVENT_PRIVATE_EXT_REPORT_DECINFO;
     sub.id = AML_DECINFO_EVENT_CC;
     if (v4l2object->ioctl(v4l2object->video_fd, VIDIOC_SUBSCRIBE_EVENT, &sub) < 0)
-    goto failed;
+    {
+        GST_WARNING_OBJECT(e, "Cannot subscribe V4L2_EVENT_PRIVATE_EXT_REPORT_DECINFO"
+            "event for device '%s'.", v4l2object->videodev);
+    }
 
     v4l2object->can_wait_event = TRUE;
 
@@ -198,7 +217,7 @@
 failed:
 {
     GST_WARNING_OBJECT(e, "Cannot subscribe V4L2_EVENT_SOURCE_CHANGE or "
-                          "V4L2_EVENT_EOS or V4L2_EVENT_PRIVATE_EXT_REPORT_DECINFO event for device '%s'.",
+                          "V4L2_EVENT_EOS event for device '%s'.",
                        v4l2object->videodev);
     return TRUE;
 }
diff --git a/src/ext/videodev2.h b/src/ext/videodev2.h
index 15dfdfc..e7123d3 100644
--- a/src/ext/videodev2.h
+++ b/src/ext/videodev2.h
@@ -2323,6 +2323,7 @@
 #define V4L2_EVENT_MOTION_DET 6
 #define V4L2_EVENT_PRIVATE_START 0x08000000
 #define V4L2_EVENT_PRIVATE_EXT_VSC_BASE (V4L2_EVENT_PRIVATE_START + 0x2000)
+#define V4L2_EVENT_PRIVATE_EXT_REPORT_ERROR_FRAME (V4L2_EVENT_PRIVATE_EXT_VSC_BASE + 3)
 #define V4L2_EVENT_PRIVATE_EXT_REPORT_DECINFO (V4L2_EVENT_PRIVATE_EXT_VSC_BASE + 4)
 
 
diff --git a/src/gstamlv4l2bufferpool.c b/src/gstamlv4l2bufferpool.c
index a4f0716..b0a0a21 100644
--- a/src/gstamlv4l2bufferpool.c
+++ b/src/gstamlv4l2bufferpool.c
@@ -1611,6 +1611,15 @@
            return GST_AML_V4L2_FLOW_CC_DATA;
         }
         break;
+    case V4L2_EVENT_PRIVATE_EXT_REPORT_ERROR_FRAME:
+    {
+        guint64 pts = 0;
+        memcpy(&pts, &(evt.u.data[0]), sizeof(guint64));
+        v4l2object->num_error_frames += 1;
+        GST_WARNING_OBJECT (pool, "decoding video frame error,pts:%" GST_TIME_FORMAT ",total %d",
+            GST_TIME_ARGS(pts),v4l2object->num_error_frames);
+        return GST_AML_V4L2_FLOW_DECODING_ERROR;
+    } break;
     default:
         break;
     }
diff --git a/src/gstamlv4l2bufferpool.h b/src/gstamlv4l2bufferpool.h
index 8babf22..b2d5a13 100644
--- a/src/gstamlv4l2bufferpool.h
+++ b/src/gstamlv4l2bufferpool.h
@@ -49,9 +49,9 @@
  * resoltuion change has been found. This should normally only
  * occure for mem-2-mem devices. */
 #define GST_AML_V4L2_FLOW_SOURCE_CHANGE GST_FLOW_CUSTOM_SUCCESS_2
-
 #define GST_AML_V4L2_FLOW_CC_DATA (GST_FLOW_CUSTOM_SUCCESS_2+1)
-
+/*decoding error happened*/
+#define GST_AML_V4L2_FLOW_DECODING_ERROR (GST_FLOW_CUSTOM_ERROR_1)
 #define GST_AML_SPEC_FLOW_FOR_VBP 1
 
 struct _GstAmlV4l2BufferPool
diff --git a/src/gstamlv4l2object.c b/src/gstamlv4l2object.c
index 10cda33..792752e 100644
--- a/src/gstamlv4l2object.c
+++ b/src/gstamlv4l2object.c
@@ -429,6 +429,11 @@
                                     g_param_spec_boolean ("enable-nr",
                                                           "enable nr in di",
                                                           "0: disable; 1: enable", FALSE, G_PARAM_READWRITE));
+
+    g_object_class_install_property(gobject_class, PROP_DECODING_ERROR_FRAMES,
+                                    g_param_spec_int("decoding-error-frames", "decoding error frames",
+                                                         "get number of decoding error frames",
+                                                         0, G_MAXINT32, 0, G_PARAM_READABLE));
 }
 
 /* Support for 32bit off_t, this wrapper is casting off_t to gint64 */
@@ -539,6 +544,7 @@
     v4l2object->old_other_pool = NULL;
     v4l2object->old_old_other_pool = NULL;
     v4l2object->outstanding_buf_num = 0;
+    v4l2object->num_error_frames = 0;
     return v4l2object;
 }
 
@@ -826,6 +832,9 @@
     case PROP_LOW_LATENCY_MODE:
         g_value_set_boolean(value, v4l2object->low_latency_mode);
         break;
+    case PROP_DECODING_ERROR_FRAMES:
+        g_value_set_int(value, v4l2object->num_error_frames);
+        break;
     default:
         return FALSE;
         break;
diff --git a/src/gstamlv4l2object.h b/src/gstamlv4l2object.h
index c7e37b9..c47b23c 100644
--- a/src/gstamlv4l2object.h
+++ b/src/gstamlv4l2object.h
@@ -240,6 +240,9 @@
 
     /* the file to store dumped decoder frames */
     char *dumpframefile;
+
+    /*number of frames those decoded error*/
+    gint num_error_frames;
 };
 
 struct _GstAmlV4l2ObjectClassHelper
@@ -269,7 +272,8 @@
         PROP_STREAM_MODE, \
         PROP_LOW_LATENCY_MODE, \
         PROP_CC_DATA, \
-        PROP_ENABLE_NR
+        PROP_ENABLE_NR, \
+        PROP_DECODING_ERROR_FRAMES
 
 /* create/destroy */
 GstAmlV4l2Object *gst_aml_v4l2_object_new(GstElement *element,
diff --git a/src/gstamlv4l2videodec.c b/src/gstamlv4l2videodec.c
index b528334..1df101c 100644
--- a/src/gstamlv4l2videodec.c
+++ b/src/gstamlv4l2videodec.c
@@ -132,19 +132,7 @@
     switch (prop_id)
     {
     case PROP_CAPTURE_IO_MODE:
-        if (!gst_aml_v4l2_object_set_property_helper(self->v4l2capture,
-                                                     prop_id, value, pspec))
-        {
-            G_OBJECT_WARN_INVALID_PROPERTY_ID(object, prop_id, pspec);
-        }
-        break;
     case PROP_DUMP_FRAME_LOCATION:
-        if (!gst_aml_v4l2_object_set_property_helper(self->v4l2capture,
-                                                     prop_id, value, pspec))
-        {
-            G_OBJECT_WARN_INVALID_PROPERTY_ID(object, prop_id, pspec);
-        }
-        break;
     case PROP_CC_DATA:
         if (!gst_aml_v4l2_object_set_property_helper(self->v4l2capture,
                                                      prop_id, value, pspec))
@@ -213,13 +201,8 @@
     switch (prop_id)
     {
     case PROP_CAPTURE_IO_MODE:
-        if (!gst_aml_v4l2_object_get_property_helper(self->v4l2capture,
-                                                     prop_id, value, pspec))
-        {
-            G_OBJECT_WARN_INVALID_PROPERTY_ID(object, prop_id, pspec);
-        }
-        break;
     case PROP_CC_DATA:
+    case PROP_DECODING_ERROR_FRAMES:
         if (!gst_aml_v4l2_object_get_property_helper(self->v4l2capture,
                                                      prop_id, value, pspec))
         {
@@ -1228,6 +1211,11 @@
             g_mutex_unlock (&self->res_chg_lock);
             return;
         }
+        //decoding error happened
+        if (ret == GST_AML_V4L2_FLOW_DECODING_ERROR)
+        {
+            continue;
+        }
 
         if (ret != GST_FLOW_OK) {
             GST_WARNING_OBJECT(decoder, "gst_buffer_pool_acquire_buffer goto beach ret:%d",ret);
@@ -1246,7 +1234,9 @@
             return;
         }
 
-    } while ((ret == GST_AML_V4L2_FLOW_CORRUPTED_BUFFER) || (ret == GST_AML_V4L2_FLOW_CC_DATA));
+    } while ((ret == GST_AML_V4L2_FLOW_CORRUPTED_BUFFER) ||
+        (ret == GST_AML_V4L2_FLOW_CC_DATA) ||
+        (ret == GST_AML_V4L2_FLOW_DECODING_ERROR));
 
     if (ret != GST_FLOW_OK)
         goto beach;