diff options
author | Clément Bœsch | 2018-04-21 21:42:19 +0200 |
---|---|---|
committer | Clément Bœsch | 2018-04-26 19:41:19 +0200 |
commit | 71fa82bed62f812d30aee26f3c6385e2ec890ebb (patch) | |
tree | c31086aa145158b69342c779a9e174dccb741e43 | |
parent | 02e4970bc9d3215f862a5d64ec48922d98eb17c1 (diff) |
lavu/threadmessage: add av_thread_message_queue_nb_elems()
-rw-r--r-- | doc/APIchanges | 3 | ||||
-rw-r--r-- | libavutil/threadmessage.c | 13 | ||||
-rw-r--r-- | libavutil/threadmessage.h | 8 | ||||
-rw-r--r-- | libavutil/version.h | 2 | ||||
-rw-r--r-- | tests/api/api-threadmessage-test.c | 4 |
5 files changed, 28 insertions, 2 deletions
diff --git a/doc/APIchanges b/doc/APIchanges index 4f6ac2a031..8d305d5867 100644 --- a/doc/APIchanges +++ b/doc/APIchanges @@ -15,6 +15,9 @@ libavutil: 2017-10-21 API changes, most recent first: +2018-04-xx - xxxxxxxxxx - lavu 56.16.100 - threadmessage.h + Add av_thread_message_queue_nb_elems(). + -------- 8< --------- FFmpeg 4.0 was cut here -------- 8< --------- 2018-04-03 - d6fc031caf - lavu 56.13.100 - pixdesc.h diff --git a/libavutil/threadmessage.c b/libavutil/threadmessage.c index 872e9392b1..764b7fb813 100644 --- a/libavutil/threadmessage.c +++ b/libavutil/threadmessage.c @@ -102,6 +102,19 @@ void av_thread_message_queue_free(AVThreadMessageQueue **mq) #endif } +int av_thread_message_queue_nb_elems(AVThreadMessageQueue *mq) +{ +#if HAVE_THREADS + int ret; + pthread_mutex_lock(&mq->lock); + ret = av_fifo_size(mq->fifo); + pthread_mutex_unlock(&mq->lock); + return ret / mq->elsize; +#else + return AVERROR(ENOSYS); +#endif +} + #if HAVE_THREADS static int av_thread_message_queue_send_locked(AVThreadMessageQueue *mq, diff --git a/libavutil/threadmessage.h b/libavutil/threadmessage.h index 8480a0a3db..42ce655f36 100644 --- a/libavutil/threadmessage.h +++ b/libavutil/threadmessage.h @@ -96,6 +96,14 @@ void av_thread_message_queue_set_free_func(AVThreadMessageQueue *mq, void (*free_func)(void *msg)); /** + * Return the current number of messages in the queue. + * + * @return the current number of messages or AVERROR(ENOSYS) if lavu was built + * without thread support + */ +int av_thread_message_queue_nb_elems(AVThreadMessageQueue *mq); + +/** * Flush the message queue * * This function is mostly equivalent to reading and free-ing every message diff --git a/libavutil/version.h b/libavutil/version.h index 387421775f..23567000a3 100644 --- a/libavutil/version.h +++ b/libavutil/version.h @@ -79,7 +79,7 @@ */ #define LIBAVUTIL_VERSION_MAJOR 56 -#define LIBAVUTIL_VERSION_MINOR 15 +#define LIBAVUTIL_VERSION_MINOR 16 #define LIBAVUTIL_VERSION_MICRO 100 #define LIBAVUTIL_VERSION_INT AV_VERSION_INT(LIBAVUTIL_VERSION_MAJOR, \ diff --git a/tests/api/api-threadmessage-test.c b/tests/api/api-threadmessage-test.c index 05a8062b8c..3c693a70d1 100644 --- a/tests/api/api-threadmessage-test.c +++ b/tests/api/api-threadmessage-test.c @@ -130,7 +130,9 @@ static void *receiver_thread(void *arg) for (i = 0; i < rd->workload; i++) { if (rand() % rd->workload < rd->workload / 10) { - av_log(NULL, AV_LOG_INFO, "receiver #%d: flushing the queue\n", rd->id); + av_log(NULL, AV_LOG_INFO, "receiver #%d: flushing the queue, " + "discarding %d message(s)\n", rd->id, + av_thread_message_queue_nb_elems(rd->queue)); av_thread_message_flush(rd->queue); } else { struct message msg; |