gst-plugin-aml-v4l2dec: CB1 add resulotion chagne for LGE [1/1]
PD#SWPL-81043
Problem:
When Gst cannot emit resulotion change,
the resource change event will stop buffer pool
Solution:
Ignore the resource chagne event after eos event from decoder
Verify:
AP212
Change-Id: Ica632cc2e7aa62ce4417709e81ba777fbc8ddedf
Signed-off-by: sheng.liu <sheng.liu@amlogic.com>
diff --git a/src/gstamlv4l2videodec.c b/src/gstamlv4l2videodec.c
index bf0fbde..3a022b7 100644
--- a/src/gstamlv4l2videodec.c
+++ b/src/gstamlv4l2videodec.c
@@ -685,6 +685,35 @@
}
static void
+gst_v4l2_drop_event (GstV4l2Object * v4l2object)
+{
+ struct v4l2_event evt;
+ gint ret;
+
+ memset (&evt, 0x00, sizeof (struct v4l2_event));
+ ret = v4l2object->ioctl (v4l2object->video_fd, VIDIOC_DQEVENT, &evt);
+ if (ret < 0)
+ {
+ GST_DEBUG_OBJECT (v4l2object, "dqevent failed");
+ return;
+ }
+
+ switch (evt.type)
+ {
+ case V4L2_EVENT_SOURCE_CHANGE:
+ GST_DEBUG_OBJECT (v4l2object, "Drop GST_V4L2_FLOW_SOURCE_CHANGE");
+ break;
+ case V4L2_EVENT_EOS:
+ GST_DEBUG_OBJECT (v4l2object, "Drop GST_V4L2_FLOW_LAST_BUFFER");
+ break;
+ default:
+ break;
+ }
+
+ return;
+}
+
+static void
gst_aml_v4l2_video_dec_loop(GstVideoDecoder *decoder)
{
GstAmlV4l2VideoDec *self = GST_AML_V4L2_VIDEO_DEC(decoder);
@@ -742,6 +771,13 @@
}
}
+ if (self->v4l2capture->need_drop_event)
+ {
+ // drop V4L2_EVENT_SOURCE_CHANGE
+ gst_v4l2_drop_event(self->v4l2capture);
+ self->v4l2capture->need_drop_event = FALSE;
+ }
+
if (!gst_aml_v4l2_object_acquire_format(self->v4l2capture, &info))
goto not_negotiated;
@@ -836,6 +872,12 @@
ret = gst_buffer_pool_acquire_buffer(pool, &buffer, NULL);
g_object_unref(pool);
+ if (ret == GST_V4L2_FLOW_LAST_BUFFER) {
+ GST_LOG_OBJECT(decoder, "Get GST_V4L2_FLOW_LAST_BUFFER");
+ self->v4l2capture->need_drop_event = TRUE;
+ goto beach;
+ }
+
if (ret == GST_AML_V4L2_FLOW_SOURCE_CHANGE)
{
GST_LOG_OBJECT(decoder, "Get GST_AML_V4L2_FLOW_SOURCE_CHANGE");
@@ -1299,6 +1341,7 @@
V4L2_BUF_TYPE_VIDEO_CAPTURE, klass->default_device,
gst_aml_v4l2_get_input, gst_aml_v4l2_set_input, NULL);
self->v4l2capture->need_wait_event = TRUE;
+ self->v4l2capture->need_drop_event = FALSE;
}
static void