diff --git a/fftools/Makefile b/fftools/Makefile
index 8ac38e75d2..25b11deaff 100644
--- a/fftools/Makefile
+++ b/fftools/Makefile
@@ -16,7 +16,6 @@ OBJS-ffmpeg +=                  \
     fftools/ffmpeg_mux.o        \
     fftools/ffmpeg_mux_init.o   \
     fftools/ffmpeg_opt.o        \
-    fftools/objpool.o           \
     fftools/sync_queue.o        \
     fftools/thread_queue.o      \
 
diff --git a/fftools/ffmpeg_mux.c b/fftools/ffmpeg_mux.c
index 20524e5a28..8e4dd0facf 100644
--- a/fftools/ffmpeg_mux.c
+++ b/fftools/ffmpeg_mux.c
@@ -22,7 +22,6 @@
 
 #include "ffmpeg.h"
 #include "ffmpeg_mux.h"
-#include "objpool.h"
 #include "sync_queue.h"
 #include "thread_queue.h"
 
@@ -30,6 +29,7 @@
 #include "libavutil/intreadwrite.h"
 #include "libavutil/log.h"
 #include "libavutil/mem.h"
+#include "libavutil/objpool.h"
 #include "libavutil/timestamp.h"
 #include "libavutil/thread.h"
 
@@ -398,16 +398,16 @@ static void pkt_move(void *dst, void *src)
 static int thread_start(Muxer *mux)
 {
     AVFormatContext *fc = mux->fc;
-    ObjPool *op;
+    AVObjPool *op;
     int ret;
 
-    op = objpool_alloc_packets();
+    op = av_objpool_alloc_packets();
     if (!op)
         return AVERROR(ENOMEM);
 
     mux->tq = tq_alloc(fc->nb_streams, mux->thread_queue_size, op, pkt_move);
     if (!mux->tq) {
-        objpool_free(&op);
+        av_objpool_free(&op);
         return AVERROR(ENOMEM);
     }
 
diff --git a/fftools/sync_queue.c b/fftools/sync_queue.c
index c2b23ee4f5..bfa91bc129 100644
--- a/fftools/sync_queue.c
+++ b/fftools/sync_queue.c
@@ -24,8 +24,8 @@
 #include "libavutil/fifo.h"
 #include "libavutil/mathematics.h"
 #include "libavutil/mem.h"
+#include "libavutil/objpool.h"
 
-#include "objpool.h"
 #include "sync_queue.h"
 
 typedef struct SyncQueueStream {
@@ -60,7 +60,7 @@ struct SyncQueue {
     unsigned int  nb_streams;
 
     // pool of preallocated frames to avoid constant allocations
-    ObjPool *pool;
+    AVObjPool *pool;
 };
 
 static void frame_move(const SyncQueue *sq, SyncQueueFrame dst,
@@ -250,7 +250,7 @@ int sq_send(SyncQueue *sq, unsigned int stream_idx, SyncQueueFrame frame)
     if (st->finished)
         return AVERROR_EOF;
 
-    ret = objpool_get(sq->pool, (void**)&dst);
+    ret = av_objpool_get(sq->pool, (void**)&dst);
     if (ret < 0)
         return ret;
 
@@ -261,7 +261,7 @@ int sq_send(SyncQueue *sq, unsigned int stream_idx, SyncQueueFrame frame)
     ret = av_fifo_write(st->fifo, &dst, 1);
     if (ret < 0) {
         frame_move(sq, frame, dst);
-        objpool_release(sq->pool, (void**)&dst);
+        av_objpool_release(sq->pool, (void**)&dst);
         return ret;
     }
 
@@ -302,7 +302,7 @@ static int receive_for_stream(SyncQueue *sq, unsigned int stream_idx,
          */
         if (cmp <= 0 || ts == AV_NOPTS_VALUE) {
             frame_move(sq, frame, peek);
-            objpool_release(sq->pool, (void**)&peek);
+            av_objpool_release(sq->pool, (void**)&peek);
             av_fifo_drain2(st->fifo, 1);
             return 0;
         }
@@ -415,8 +415,8 @@ SyncQueue *sq_alloc(enum SyncQueueType type, int64_t buf_size_us)
     sq->head_stream          = -1;
     sq->head_finished_stream = -1;
 
-    sq->pool = (type == SYNC_QUEUE_PACKETS) ? objpool_alloc_packets() :
-                                              objpool_alloc_frames();
+    sq->pool = (type == SYNC_QUEUE_PACKETS) ? av_objpool_alloc_packets() :
+                                              av_objpool_alloc_frames();
     if (!sq->pool) {
         av_freep(&sq);
         return NULL;
@@ -435,14 +435,14 @@ void sq_free(SyncQueue **psq)
     for (unsigned int i = 0; i < sq->nb_streams; i++) {
         SyncQueueFrame frame;
         while (av_fifo_read(sq->streams[i].fifo, &frame, 1) >= 0)
-            objpool_release(sq->pool, (void**)&frame);
+            av_objpool_release(sq->pool, (void**)&frame);
 
         av_fifo_freep2(&sq->streams[i].fifo);
     }
 
     av_freep(&sq->streams);
 
-    objpool_free(&sq->pool);
+    av_objpool_free(&sq->pool);
 
     av_freep(psq);
 }
diff --git a/fftools/thread_queue.c b/fftools/thread_queue.c
index a1ab4ce92e..514d12bb6a 100644
--- a/fftools/thread_queue.c
+++ b/fftools/thread_queue.c
@@ -24,9 +24,9 @@
 #include "libavutil/fifo.h"
 #include "libavutil/intreadwrite.h"
 #include "libavutil/mem.h"
+#include "libavutil/objpool.h"
 #include "libavutil/thread.h"
 
-#include "objpool.h"
 #include "thread_queue.h"
 
 enum {
@@ -45,7 +45,7 @@ struct ThreadQueue {
 
     AVFifo  *fifo;
 
-    ObjPool *obj_pool;
+    AVObjPool *obj_pool;
     void   (*obj_move)(void *dst, void *src);
 
     pthread_mutex_t lock;
@@ -62,11 +62,11 @@ void tq_free(ThreadQueue **ptq)
     if (tq->fifo) {
         FifoElem elem;
         while (av_fifo_read(tq->fifo, &elem, 1) >= 0)
-            objpool_release(tq->obj_pool, &elem.obj);
+          av_objpool_release(tq->obj_pool, &elem.obj);
     }
     av_fifo_freep2(&tq->fifo);
 
-    objpool_free(&tq->obj_pool);
+    av_objpool_free(&tq->obj_pool);
 
     av_freep(&tq->finished);
 
@@ -77,7 +77,7 @@ void tq_free(ThreadQueue **ptq)
 }
 
 ThreadQueue *tq_alloc(unsigned int nb_streams, size_t queue_size,
-                      ObjPool *obj_pool, void (*obj_move)(void *dst, void *src))
+                      AVObjPool *obj_pool, void (*obj_move)(void *dst, void *src))
 {
     ThreadQueue *tq;
     int ret;
@@ -141,7 +141,7 @@ int tq_send(ThreadQueue *tq, unsigned int stream_idx, void *data)
     } else {
         FifoElem elem = { .stream_idx = stream_idx };
 
-        ret = objpool_get(tq->obj_pool, &elem.obj);
+        ret = av_objpool_get(tq->obj_pool, &elem.obj);
         if (ret < 0)
             goto finish;
 
@@ -166,7 +166,7 @@ static int receive_locked(ThreadQueue *tq, int *stream_idx,
 
     if (av_fifo_read(tq->fifo, &elem, 1) >= 0) {
         tq->obj_move(data, elem.obj);
-        objpool_release(tq->obj_pool, &elem.obj);
+        av_objpool_release(tq->obj_pool, &elem.obj);
         *stream_idx = elem.stream_idx;
         return 0;
     }
diff --git a/fftools/thread_queue.h b/fftools/thread_queue.h
index 0cc8c71ebd..e61260687f 100644
--- a/fftools/thread_queue.h
+++ b/fftools/thread_queue.h
@@ -21,7 +21,7 @@
 
 #include <string.h>
 
-#include "objpool.h"
+#include "libavutil/objpool.h"
 
 typedef struct ThreadQueue ThreadQueue;
 
@@ -37,7 +37,7 @@ typedef struct ThreadQueue ThreadQueue;
  * @param callback that moves the contents between two data pointers
  */
 ThreadQueue *tq_alloc(unsigned int nb_streams, size_t queue_size,
-                      ObjPool *obj_pool, void (*obj_move)(void *dst, void *src));
+                      AVObjPool *obj_pool, void (*obj_move)(void *dst, void *src));
 void         tq_free(ThreadQueue **tq);
 
 /**
diff --git a/libavutil/Makefile b/libavutil/Makefile
index 3d9c07aea8..bd9ac28335 100644
--- a/libavutil/Makefile
+++ b/libavutil/Makefile
@@ -62,6 +62,7 @@ HEADERS = adler32.h                                                     \
           mem.h                                                         \
           motion_vector.h                                               \
           murmur3.h                                                     \
+          objpool.h                                                     \
           opt.h                                                         \
           parseutils.h                                                  \
           pixdesc.h                                                     \
@@ -149,6 +150,7 @@ OBJS = adler32.o                                                        \
        md5.o                                                            \
        mem.o                                                            \
        murmur3.o                                                        \
+       objpool.o                                                        \
        opt.o                                                            \
        parseutils.o                                                     \
        pixdesc.o                                                        \
diff --git a/fftools/objpool.c b/libavutil/objpool.c
similarity index 77%
rename from fftools/objpool.c
rename to libavutil/objpool.c
index 87237cf724..2309afb5b2 100644
--- a/fftools/objpool.c
+++ b/libavutil/objpool.c
@@ -27,19 +27,21 @@
 
 #include "objpool.h"
 
-struct ObjPool {
+struct AVObjPool {
     void        *pool[32];
     unsigned int pool_count;
 
-    ObjPoolCBAlloc alloc;
-    ObjPoolCBReset reset;
-    ObjPoolCBFree  free;
+    AVObjPoolCBAlloc alloc;
+    AVObjPoolCBReset reset;
+    AVObjPoolCBFree  free;
 };
 
-ObjPool *objpool_alloc(ObjPoolCBAlloc cb_alloc, ObjPoolCBReset cb_reset,
-                       ObjPoolCBFree cb_free)
+AVObjPool *av_objpool_alloc(
+    AVObjPoolCBAlloc cb_alloc,
+    AVObjPoolCBReset cb_reset,
+    AVObjPoolCBFree cb_free)
 {
-    ObjPool *op = av_mallocz(sizeof(*op));
+    AVObjPool *op = av_mallocz(sizeof(*op));
 
     if (!op)
         return NULL;
@@ -51,9 +53,9 @@ ObjPool *objpool_alloc(ObjPoolCBAlloc cb_alloc, ObjPoolCBReset cb_reset,
     return op;
 }
 
-void objpool_free(ObjPool **pop)
+void av_objpool_free(AVObjPool **pop)
 {
-    ObjPool *op = *pop;
+    AVObjPool *op = *pop;
 
     if (!op)
         return;
@@ -64,7 +66,7 @@ void objpool_free(ObjPool **pop)
     av_freep(pop);
 }
 
-int  objpool_get(ObjPool *op, void **obj)
+int  av_objpool_get(AVObjPool *op, void **obj)
 {
     if (op->pool_count) {
         *obj = op->pool[--op->pool_count];
@@ -75,7 +77,7 @@ int  objpool_get(ObjPool *op, void **obj)
     return *obj ? 0 : AVERROR(ENOMEM);
 }
 
-void objpool_release(ObjPool *op, void **obj)
+void av_objpool_release(AVObjPool *op, void **obj)
 {
     if (!*obj)
         return;
@@ -121,11 +123,11 @@ static void free_frame(void **obj)
     *obj = NULL;
 }
 
-ObjPool *objpool_alloc_packets(void)
+AVObjPool *av_objpool_alloc_packets(void)
 {
-    return objpool_alloc(alloc_packet, reset_packet, free_packet);
+    return av_objpool_alloc(alloc_packet, reset_packet, free_packet);
 }
-ObjPool *objpool_alloc_frames(void)
+AVObjPool *av_objpool_alloc_frames(void)
 {
-    return objpool_alloc(alloc_frame, reset_frame, free_frame);
+    return av_objpool_alloc(alloc_frame, reset_frame, free_frame);
 }
diff --git a/fftools/objpool.h b/libavutil/objpool.h
similarity index 62%
rename from fftools/objpool.h
rename to libavutil/objpool.h
index 1b2aea6aca..9dcdc999a4 100644
--- a/fftools/objpool.h
+++ b/libavutil/objpool.h
@@ -19,19 +19,21 @@
 #ifndef FFTOOLS_OBJPOOL_H
 #define FFTOOLS_OBJPOOL_H
 
-typedef struct ObjPool ObjPool;
+typedef struct AVObjPool AVObjPool;
 
-typedef void* (*ObjPoolCBAlloc)(void);
-typedef void  (*ObjPoolCBReset)(void *);
-typedef void  (*ObjPoolCBFree)(void **);
+typedef void* (*AVObjPoolCBAlloc)(void);
+typedef void  (*AVObjPoolCBReset)(void *);
+typedef void  (*AVObjPoolCBFree)(void **);
 
-void     objpool_free(ObjPool **op);
-ObjPool *objpool_alloc(ObjPoolCBAlloc cb_alloc, ObjPoolCBReset cb_reset,
-                       ObjPoolCBFree cb_free);
-ObjPool *objpool_alloc_packets(void);
-ObjPool *objpool_alloc_frames(void);
+void     av_objpool_free(AVObjPool **op);
+AVObjPool *av_objpool_alloc(
+    AVObjPoolCBAlloc cb_alloc,
+    AVObjPoolCBReset cb_reset,
+    AVObjPoolCBFree cb_free);
+AVObjPool *av_objpool_alloc_packets(void);
+AVObjPool *av_objpool_alloc_frames(void);
 
-int  objpool_get(ObjPool *op, void **obj);
-void objpool_release(ObjPool *op, void **obj);
+int  av_objpool_get(AVObjPool *op, void **obj);
+void av_objpool_release(AVObjPool *op, void **obj);
 
 #endif // FFTOOLS_OBJPOOL_H
