amlv4l2dec: CB1 sync t3 branch to trunk [1/1]

PD#SWPL-119988

Problem:
sync code

Solution:
sync code:
1.reduce logs
2.don't probe /dev/vdiexx devices,only open /dev/video26
3.use import bufferpool mode default
4.add usleep to reduce cpu usage.

Verify:
ah212

Change-Id: I638d047157b359f2218b5dbe40cfef0fbead5ee4
Signed-off-by: fei.deng <fei.deng@amlogic.com>
diff --git a/src/aml-v4l2-utils.c b/src/aml-v4l2-utils.c
index b8f8ae4..06f3baa 100644
--- a/src/aml-v4l2-utils.c
+++ b/src/aml-v4l2-utils.c
@@ -111,6 +111,7 @@
     it->base_idx = 0;
     it->video_idx = -1;
     it->device = NULL;
+    it->parent.device_path = NULL;
 
     return (GstAmlV4l2Iterator *)it;
 }
@@ -122,8 +123,10 @@
     static const gchar *dev_base[] = {"/dev/video", "/dev/v4l2/video", NULL};
     gchar *device = NULL;
 
-    g_free((gchar *)it->parent.device_path);
-    it->parent.device_path = NULL;
+    if (it->parent.device_path) {
+        g_free((gchar *)it->parent.device_path);
+        it->parent.device_path = NULL;
+    }
 
     while (device == NULL)
     {
diff --git a/src/gstamlv4l2.c b/src/gstamlv4l2.c
index e8ae542..4417fe7 100644
--- a/src/gstamlv4l2.c
+++ b/src/gstamlv4l2.c
@@ -40,6 +40,7 @@
 /* used in gstamlv4l2object.c and aml_v4l2_calls.c */
 GST_DEBUG_CATEGORY(aml_v4l2_debug);
 #define GST_CAT_DEFAULT aml_v4l2_debug
+#define DEFAULT_DEVICE_NAME "/dev/video26"
 
 /* This is a minimalist probe, for speed, we only enumerate formats */
 static GstCaps *
@@ -102,114 +103,103 @@
 }
 
 static gboolean
-gst_aml_v4l2_probe_and_register(GstPlugin *plugin)
+gst_aml_v4l2_register(GstPlugin *plugin)
 {
-    GstAmlV4l2Iterator *it;
     gint video_fd = -1;
     struct v4l2_capability vcap;
     guint32 device_caps;
+    GstCaps *src_caps, *sink_caps;
+    gchar *basename;
 
-    GST_DEBUG("Probing devices");
+    GST_DEBUG("regist aml v4l2 device");
 
-    it = gst_aml_v4l2_iterator_new();
+    GST_DEBUG("open: %s", DEFAULT_DEVICE_NAME);
+    video_fd = open(DEFAULT_DEVICE_NAME, O_RDWR | O_CLOEXEC);
 
-    while (gst_aml_v4l2_iterator_next(it))
+    if (video_fd == -1)
     {
-        GstCaps *src_caps, *sink_caps;
-        gchar *basename;
+        GST_DEBUG("Failed to open %s: %s", DEFAULT_DEVICE_NAME, g_strerror(errno));
+        goto error_tag;
+    }
 
-        if (video_fd >= 0)
-            close(video_fd);
+    memset(&vcap, 0, sizeof(vcap));
 
-        video_fd = open(it->device_path, O_RDWR | O_CLOEXEC);
+    if (ioctl(video_fd, VIDIOC_QUERYCAP, &vcap) < 0)
+    {
+        GST_DEBUG("Failed to get device capabilities: %s", g_strerror(errno));
+        goto error_tag;
+    }
 
-        if (video_fd == -1)
-        {
-            GST_DEBUG("Failed to open %s: %s", it->device_path, g_strerror(errno));
-            continue;
-        }
+    if (vcap.capabilities & V4L2_CAP_DEVICE_CAPS)
+        device_caps = vcap.device_caps;
+    else
+        device_caps = vcap.capabilities;
 
-        memset(&vcap, 0, sizeof(vcap));
+    if (!GST_AML_V4L2_IS_M2M(device_caps)) {
+        goto error_tag;
+    }
 
-        if (ioctl(video_fd, VIDIOC_QUERYCAP, &vcap) < 0)
-        {
-            GST_DEBUG("Failed to get device capabilities: %s", g_strerror(errno));
-            continue;
-        }
 
-        if (vcap.capabilities & V4L2_CAP_DEVICE_CAPS)
-            device_caps = vcap.device_caps;
-        else
-            device_caps = vcap.capabilities;
+    /* get sink supported format (no MPLANE for codec) */
+    sink_caps = gst_caps_merge(gst_aml_v4l2_probe_template_caps(DEFAULT_DEVICE_NAME,
+                                                                video_fd, V4L2_BUF_TYPE_VIDEO_OUTPUT),
+                                gst_aml_v4l2_probe_template_caps(DEFAULT_DEVICE_NAME, video_fd,
+                                                                V4L2_BUF_TYPE_VIDEO_OUTPUT_MPLANE));
+    GST_DEBUG ("prob sink_caps %" GST_PTR_FORMAT, sink_caps);
 
-        if (!GST_AML_V4L2_IS_M2M(device_caps))
-            continue;
-
-        GST_DEBUG("Probing '%s' located at '%s'",
-                  it->device_name ? it->device_name : (const gchar *)vcap.driver,
-                  it->device_path);
-
-        /* get sink supported format (no MPLANE for codec) */
-        sink_caps = gst_caps_merge(gst_aml_v4l2_probe_template_caps(it->device_path,
-                                                                    video_fd, V4L2_BUF_TYPE_VIDEO_OUTPUT),
-                                   gst_aml_v4l2_probe_template_caps(it->device_path, video_fd,
-                                                                    V4L2_BUF_TYPE_VIDEO_OUTPUT_MPLANE));
-        GST_DEBUG ("prob sink_caps %" GST_PTR_FORMAT, sink_caps);
-
-        /* get src supported format */
-        src_caps = gst_caps_merge(gst_aml_v4l2_probe_template_caps(it->device_path,
+    /* get src supported format */
+    src_caps = gst_caps_merge(gst_aml_v4l2_probe_template_caps(DEFAULT_DEVICE_NAME,
                                                                    video_fd, V4L2_BUF_TYPE_VIDEO_CAPTURE),
-                                  gst_aml_v4l2_probe_template_caps(it->device_path, video_fd,
+                                  gst_aml_v4l2_probe_template_caps(DEFAULT_DEVICE_NAME, video_fd,
                                                                    V4L2_BUF_TYPE_VIDEO_CAPTURE_MPLANE));
-        GST_DEBUG ("prob src_caps %" GST_PTR_FORMAT, src_caps);
+    GST_DEBUG ("prob src_caps %" GST_PTR_FORMAT, src_caps);
 
-        /* Skip devices without any supported formats */
-        if (gst_caps_is_empty(sink_caps) || gst_caps_is_empty(src_caps))
-        {
-            gst_caps_unref(sink_caps);
-            gst_caps_unref(src_caps);
-            continue;
-        }
-
-        basename = g_path_get_basename(it->device_path);
-
-        /* Caps won't be freed if the subclass is not instantiated */
-        GST_MINI_OBJECT_FLAG_SET(sink_caps, GST_MINI_OBJECT_FLAG_MAY_BE_LEAKED);
-        GST_MINI_OBJECT_FLAG_SET(src_caps, GST_MINI_OBJECT_FLAG_MAY_BE_LEAKED);
-
-        if (gst_aml_v4l2_is_video_dec(sink_caps, src_caps))
-        {
-            gst_aml_v4l2_video_dec_register(plugin, basename, it->device_path,
-                                            sink_caps, src_caps);
-        }
-
+    /* Skip devices without any supported formats */
+    if (gst_caps_is_empty(sink_caps) || gst_caps_is_empty(src_caps))
+    {
         gst_caps_unref(sink_caps);
         gst_caps_unref(src_caps);
-        g_free(basename);
+        goto error_tag;
     }
 
+    /* Caps won't be freed if the subclass is not instantiated */
+    GST_MINI_OBJECT_FLAG_SET(sink_caps, GST_MINI_OBJECT_FLAG_MAY_BE_LEAKED);
+    GST_MINI_OBJECT_FLAG_SET(src_caps, GST_MINI_OBJECT_FLAG_MAY_BE_LEAKED);
+
+    if (gst_aml_v4l2_is_video_dec(sink_caps, src_caps))
+    {
+        gst_aml_v4l2_video_dec_register(plugin, DEFAULT_DEVICE_NAME, DEFAULT_DEVICE_NAME,
+                                            sink_caps, src_caps);
+    }
+
+    gst_caps_unref(sink_caps);
+    gst_caps_unref(src_caps);
+
+
     if (video_fd >= 0)
         close(video_fd);
 
-    gst_aml_v4l2_iterator_free(it);
-
     return TRUE;
+error_tag:
+    if (video_fd >= 0)
+        close(video_fd);
+    return FALSE;
 }
 
 static gboolean
 plugin_init(GstPlugin *plugin)
 {
-    const gchar *paths[] = {"/dev", "/dev/v4l2", NULL};
-    const gchar *names[] = {"video", NULL};
+    //const gchar *paths[] = {"/dev", "/dev/v4l2", NULL};
+    //const gchar *names[] = {"video", NULL};
 
     GST_DEBUG_CATEGORY_INIT(aml_v4l2_debug, "amlv4l2", 0, "aml V4L2 API calls");
 
     /* Add some depedency, so the dynamic features get updated upon changes in
      * /dev/video* */
-    gst_plugin_add_dependency(plugin,
-                              NULL, paths, names, GST_PLUGIN_DEPENDENCY_FLAG_FILE_NAME_IS_PREFIX);
+    //gst_plugin_add_dependency(plugin,
+    //                          NULL, paths, names, GST_PLUGIN_DEPENDENCY_FLAG_FILE_NAME_IS_PREFIX);
 
-    if (!gst_aml_v4l2_probe_and_register(plugin))
+    if (!gst_aml_v4l2_register(plugin))
         return FALSE;
 
     return TRUE;
diff --git a/src/gstamlv4l2bufferpool.c b/src/gstamlv4l2bufferpool.c
index b4433ee..7f7fec6 100644
--- a/src/gstamlv4l2bufferpool.c
+++ b/src/gstamlv4l2bufferpool.c
@@ -1168,7 +1168,7 @@
     if ((pool->obj->type == V4L2_BUF_TYPE_VIDEO_CAPTURE || pool->obj->type == V4L2_BUF_TYPE_VIDEO_CAPTURE_MPLANE) &&
         pool->obj->mode == GST_V4L2_IO_DMABUF_IMPORT)
     {
-        GST_LOG_OBJECT(pool, "CAPTURE DMA don't quit when empty buf");
+        GST_TRACE_OBJECT(pool, "CAPTURE DMA don't quit when empty buf");
     }
     else
     {
@@ -1197,12 +1197,12 @@
             goto no_buffers;
     }
 
-    GST_LOG_OBJECT(pool, "polling device");
+    GST_TRACE_OBJECT(pool, "polling device");
 
 again:
     ret = gst_poll_wait(pool->poll, timeout);
 #ifdef GST_AML_SPEC_FLOW_FOR_VBP
-    GST_DEBUG_OBJECT(pool, "amlmodbuf poll timeout:%lld, ret:%d, errno:%d", timeout, ret, errno);
+    GST_TRACE_OBJECT(pool, "amlmodbuf poll timeout:%lld, ret:%d, errno:%d", timeout, ret, errno);
 #endif
     if (G_UNLIKELY(ret < 0))
     {
@@ -1233,9 +1233,10 @@
         if ((pool->obj->type == V4L2_BUF_TYPE_VIDEO_CAPTURE || pool->obj->type == V4L2_BUF_TYPE_VIDEO_CAPTURE_MPLANE) &&
             pool->obj->mode == GST_V4L2_IO_DMABUF_IMPORT)
         {
-            GST_DEBUG_OBJECT(pool, "amlmodbuf can't get buffer in capture obj dmaimport mode, try release buf from other pool");
+            GST_TRACE_OBJECT(pool, "amlmodbuf can't get buffer in capture obj dmaimport mode, try release buf from other pool");
             gst_aml_v4l2_buffer_pool_dump_stat(pool, GST_DUMP_CAPTURE_BP_STAT_FILENAME, try_num++);
             gst_aml_v4l2_buffer_pool_release_buffer_aml_patch((GstBufferPool *)pool);
+            g_usleep(1000);
             goto again;
         }
         else
@@ -1870,12 +1871,12 @@
 
         memset(&params, 0, sizeof(GstBufferPoolAcquireParams));
         params.flags = GST_BUFFER_POOL_ACQUIRE_FLAG_DONTWAIT;
-        GST_DEBUG_OBJECT(pool, "amlmodbuf trace in aml release buf flow ready_to_free_buf_num:%d", pool->ready_to_free_buf_num);
+        GST_TRACE_OBJECT(pool, "amlmodbuf trace in aml release buf flow ready_to_free_buf_num:%d", pool->ready_to_free_buf_num);
         while (pool->ready_to_free_buf_num && gst_buffer_pool_acquire_buffer(pool->other_pool, &src, &params) != GST_FLOW_ERROR && src != NULL)
         {
             gint i = 0;
 
-            GST_DEBUG_OBJECT(pool, "amlmodbuf acquire buf:%p form other pool", src);
+            GST_TRACE_OBJECT(pool, "amlmodbuf acquire buf:%p form other pool", src);
             for (; i < VIDEO_MAX_FRAME; i++)
             {
                 GST_DEBUG_OBJECT(pool, "amlmodbuf check index:%d", i);
@@ -1884,15 +1885,15 @@
                     GstBuffer *bind_drm_buf = gst_mini_object_get_qdata(GST_MINI_OBJECT(pool->read_to_free_bufs[i]), GST_AML_V4L2_IMPORT_QUARK);
                     if (bind_drm_buf == NULL)
                     {
-                        GST_DEBUG_OBJECT(pool, "init flow, bind v4l2 capture buf[%d]:%p with drm buf:%p", i, pool->read_to_free_bufs[i], src);
+                        GST_TRACE_OBJECT(pool, "init flow, bind v4l2 capture buf[%d]:%p with drm buf:%p", i, pool->read_to_free_bufs[i], src);
                     }
                     else if (src != bind_drm_buf)
                     {
-                        GST_DEBUG_OBJECT(pool, "v4l2 capture buf[%d]:%p bind drm buf:%p, not this one:%p, continue match", i, pool->read_to_free_bufs[i], bind_drm_buf, src);
+                        GST_TRACE_OBJECT(pool, "v4l2 capture buf[%d]:%p bind drm buf:%p, not this one:%p, continue match", i, pool->read_to_free_bufs[i], bind_drm_buf, src);
                         continue;
                     }
 
-                    GST_DEBUG_OBJECT(pool, "v4l2 capture buf[%d]:%p found bind drm buf:%p", i, pool->read_to_free_bufs[i], src);
+                    GST_TRACE_OBJECT(pool, "v4l2 capture buf[%d]:%p found bind drm buf:%p", i, pool->read_to_free_bufs[i], src);
                     GstFlowReturn isvalid = GST_FLOW_OK;
                     GstAmlV4l2MemoryGroup *tmp_group = NULL;
 
@@ -1903,12 +1904,12 @@
                     isvalid = gst_aml_v4l2_is_buffer_valid(pool->read_to_free_bufs[i], &tmp_group);
                     if ((ret != GST_FLOW_OK && isvalid) || gst_aml_v4l2_buffer_pool_qbuf(pool, pool->read_to_free_bufs[i], tmp_group) != GST_FLOW_OK)
                     {
-                        GST_DEBUG_OBJECT(pool, "amlmodbuf go into error flow");
+                        GST_TRACE_OBJECT(pool, "amlmodbuf go into error flow");
                         pclass->release_buffer(bpool, pool->read_to_free_bufs[i]);
                     }
                     pool->read_to_free_bufs[i] = NULL;
                     pool->ready_to_free_buf_num--;
-                    GST_DEBUG_OBJECT(pool, "amlmodbuf queued buf:%d, into v4l2 bp", i);
+                    GST_TRACE_OBJECT(pool, "amlmodbuf queued buf:%d, into v4l2 bp", i);
                     break;
                 }
             }
@@ -1920,7 +1921,7 @@
                 return FALSE;
             }
         }
-        GST_DEBUG_OBJECT(pool, "update all free drm buf into v4l2 capture buf pool, now ready_to_free_buf_num:%d", pool->ready_to_free_buf_num);
+        GST_TRACE_OBJECT(pool, "update all free drm buf into v4l2 capture buf pool, now ready_to_free_buf_num:%d", pool->ready_to_free_buf_num);
         return TRUE;
     }
     return FALSE;
diff --git a/src/gstamlv4l2object.c b/src/gstamlv4l2object.c
index 7937136..ceede9a 100644
--- a/src/gstamlv4l2object.c
+++ b/src/gstamlv4l2object.c
@@ -439,6 +439,7 @@
     {
         const char *default_mode = getenv("GST_DEFAULT_V4L2_BUF_MODE");
         GST_DEBUG("amlmodbuf GST_AML_DEFAULT_V4L2_BUF_MODE:%s", default_mode);
+        //v4l2object->req_mode = GST_V4L2_IO_DMABUF_IMPORT;
         if (default_mode)
         {
             if (strcmp(default_mode, "DMA_BUF_IMPORT") == 0)
@@ -1647,6 +1648,8 @@
     const gchar *mimetype;
     struct v4l2_fmtdesc *fmt = NULL;
 
+    GST_DEBUG_OBJECT(v4l2object, "got caps: %" GST_PTR_FORMAT, caps);
+
     structure = gst_caps_get_structure(caps, 0);
 
     mimetype = gst_structure_get_name(structure);
@@ -4563,6 +4566,7 @@
 
     memset(&fmt, 0x00, sizeof(struct v4l2_format));
     fmt.type = v4l2object->type;
+    GST_DEBUG_OBJECT(v4l2object->dbg_obj, "fmt.type:%d", fmt.type);
     if (v4l2object->ioctl(v4l2object->video_fd, VIDIOC_G_FMT, &fmt) < 0)
         goto get_fmt_failed;
 
diff --git a/src/gstamlv4l2videodec.c b/src/gstamlv4l2videodec.c
index bba4bf0..06f297a 100644
--- a/src/gstamlv4l2videodec.c
+++ b/src/gstamlv4l2videodec.c
@@ -41,9 +41,9 @@
 #undef GST_VIDEO_DECODER_STREAM_LOCK
 #define GST_VIDEO_DECODER_STREAM_LOCK(decoder)                      \
     {                                                               \
-        GST_INFO("aml v4l2 dec locking");                           \
+        GST_TRACE("aml v4l2 dec locking");                           \
         g_rec_mutex_lock(&GST_VIDEO_DECODER(decoder)->stream_lock); \
-        GST_INFO("aml v4l2 dec locked");                            \
+        GST_TRACE("aml v4l2 dec locked");                            \
     }
 #endif
 
@@ -51,9 +51,9 @@
 #undef GST_VIDEO_DECODER_STREAM_UNLOCK
 #define GST_VIDEO_DECODER_STREAM_UNLOCK(decoder)                      \
     {                                                                 \
-        GST_INFO("aml v4l2 dec unlocking");                           \
+        GST_TRACE("aml v4l2 dec unlocking");                           \
         g_rec_mutex_unlock(&GST_VIDEO_DECODER(decoder)->stream_lock); \
-        GST_INFO("aml v4l2 dec unlocked");                            \
+        GST_TRACE("aml v4l2 dec unlocked");                            \
     }
 #endif
 
@@ -641,9 +641,9 @@
     for (l = frames; l != NULL; l = l->next)
     {
         GstVideoCodecFrame *f = l->data;
+
         if (GST_CLOCK_TIME_IS_VALID(pts) && (ABSDIFF(f->pts,pts)) < 1000) {
             frame = f;
-            break;
         } else {
             if (!frame || (GST_CLOCK_TIME_IS_VALID(frame->pts) && GST_CLOCK_TIME_IS_VALID(f->pts) && (frame->pts > f->pts)))
                 frame = f;