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(¶ms, 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, ¶ms) != 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;