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;