JeffyCN / libv4l-rkmpp

A rockchip-mpp V4L2 wrapper plugin for chromium V4L2 VDA/VEA
GNU Lesser General Public License v2.1
79 stars 26 forks source link

video framerate is extramely low after commit f0d1d5364e30aa98f6d4cefd87f1e365ad5e205c #19

Closed amazingfate closed 4 months ago

amazingfate commented 4 months ago

My environment:

I encountered this issue before but at that moment I didn't configured all things right. Now I find this commit has caused the low fps issue.

JeffyCN commented 4 months ago

could not reproduce this issue...

the only part of this commit that might affect the decoding flow is in rkmpp_dqbuf(), but it looks fine

JeffyCN commented 4 months ago

maybe we can try to compare the v4l-rkmpp's verbose logs.

amazingfate commented 4 months ago

Here are the logs with env LIBV4L_RKMPP_LOG_LEVEL=7 rkmpp_fine.log.gz rkmpp_slow.log.gz

amazingfate commented 4 months ago

reverting changes to rkmpp_dqbuf would solve it.

diff --git a/src/libv4l-rkmpp.c b/src/libv4l-rkmpp.c
index 7ad4b53..9ddbf69 100644
--- a/src/libv4l-rkmpp.c
+++ b/src/libv4l-rkmpp.c
@@ -669,6 +669,7 @@ int rkmpp_dqbuf(struct rkmpp_context *ctx, struct v4l2_buffer *buffer)

        pthread_mutex_lock(&queue->queue_mutex);
        rkmpp_buffer = TAILQ_FIRST(&queue->avail_buffers);
+       TAILQ_REMOVE(&queue->avail_buffers, rkmpp_buffer, entry);
        pthread_mutex_unlock(&queue->queue_mutex);

        /* Update poll event after avail list changed */
@@ -680,10 +681,11 @@ int rkmpp_dqbuf(struct rkmpp_context *ctx, struct v4l2_buffer *buffer)
                RETURN_ERR(EINVAL, -1);
        }

-       pthread_mutex_lock(&queue->queue_mutex);
+       if (rkmpp_buffer_keyframe(rkmpp_buffer))
+               rkmpp_buffer_clr_keyframe(rkmpp_buffer);
+       if (rkmpp_buffer_error(rkmpp_buffer))
+               rkmpp_buffer_clr_error(rkmpp_buffer);
        rkmpp_buffer_clr_available(rkmpp_buffer);
-       TAILQ_REMOVE(&queue->avail_buffers, rkmpp_buffer, entry);
-       pthread_mutex_unlock(&queue->queue_mutex);

        rkmpp_buffer_clr_queued(rkmpp_buffer);
amazingfate commented 4 months ago

And a smaller patch to fix:

diff --git a/src/libv4l-rkmpp.c b/src/libv4l-rkmpp.c
index 7ad4b53..0179b92 100644
--- a/src/libv4l-rkmpp.c
+++ b/src/libv4l-rkmpp.c
@@ -669,6 +669,7 @@ int rkmpp_dqbuf(struct rkmpp_context *ctx, struct v4l2_buffer *buffer)

        pthread_mutex_lock(&queue->queue_mutex);
        rkmpp_buffer = TAILQ_FIRST(&queue->avail_buffers);
+       TAILQ_REMOVE(&queue->avail_buffers, rkmpp_buffer, entry);
        pthread_mutex_unlock(&queue->queue_mutex);

        /* Update poll event after avail list changed */
@@ -682,7 +683,6 @@ int rkmpp_dqbuf(struct rkmpp_context *ctx, struct v4l2_buffer *buffer)

        pthread_mutex_lock(&queue->queue_mutex);
        rkmpp_buffer_clr_available(rkmpp_buffer);
-       TAILQ_REMOVE(&queue->avail_buffers, rkmpp_buffer, entry);
        pthread_mutex_unlock(&queue->queue_mutex);

        rkmpp_buffer_clr_queued(rkmpp_buffer);
JeffyCN commented 4 months ago

huh, there's indeed a mistake around there, try:

--- a/src/libv4l-rkmpp.c
+++ b/src/libv4l-rkmpp.c
@@ -671,9 +671,6 @@ int rkmpp_dqbuf(struct rkmpp_context *ctx, struct v4l2_buffer *buffer)
        rkmpp_buffer = TAILQ_FIRST(&queue->avail_buffers);
        pthread_mutex_unlock(&queue->queue_mutex);

-       /* Update poll event after avail list changed */
-       rkmpp_update_poll_event(ctx);
-
        ret = rkmpp_to_v4l2_buffer(ctx, rkmpp_buffer, buffer);
        if (ret < 0) {
                LOGE("failed to convert buffer\n");
@@ -687,6 +684,9 @@ int rkmpp_dqbuf(struct rkmpp_context *ctx, struct v4l2_buffer *buffer)

        rkmpp_buffer_clr_queued(rkmpp_buffer);

+       /* Update poll event after avail list changed */
+       rkmpp_update_poll_event(ctx);
+
        LOGV(2, "dequeue buffer: %d(%" PRIu64 "), size: %d, type: %d\n",
             buffer->index, rkmpp_buffer->timestamp,
             rkmpp_buffer->bytesused, buffer->type);
amazingfate commented 4 months ago

Yes that does fix my issue!