diff --git a/gst-libs/gst/vaapi/gstvaapicodedbuffer.c b/gst-libs/gst/vaapi/gstvaapicodedbuffer.c
index 39e5ec8a81..5d5f3a2ea4 100644
--- a/gst-libs/gst/vaapi/gstvaapicodedbuffer.c
+++ b/gst-libs/gst/vaapi/gstvaapicodedbuffer.c
@@ -34,7 +34,7 @@ static gboolean
 coded_buffer_create (GstVaapiCodedBuffer * buf, guint buf_size,
     GstVaapiContext * context)
 {
-  GstVaapiDisplay *const display = GST_VAAPI_OBJECT_DISPLAY (buf);
+  GstVaapiDisplay *const display = GST_VAAPI_CODED_BUFFER_DISPLAY (buf);
   VABufferID buf_id;
   gboolean success;
 
@@ -47,56 +47,62 @@ coded_buffer_create (GstVaapiCodedBuffer * buf, guint buf_size,
     return FALSE;
 
   GST_DEBUG ("coded buffer %" GST_VAAPI_ID_FORMAT, GST_VAAPI_ID_ARGS (buf_id));
-  GST_VAAPI_OBJECT_ID (buf) = buf_id;
+  GST_VAAPI_CODED_BUFFER_ID (buf) = buf_id;
   return TRUE;
 }
 
 static void
-coded_buffer_destroy (GstVaapiCodedBuffer * buf)
+coded_buffer_free (GstVaapiCodedBuffer * buf)
 {
-  GstVaapiDisplay *const display = GST_VAAPI_OBJECT_DISPLAY (buf);
+  GstVaapiDisplay *const display = GST_VAAPI_CODED_BUFFER_DISPLAY (buf);
   VABufferID buf_id;
 
-  buf_id = GST_VAAPI_OBJECT_ID (buf);
+  buf_id = GST_VAAPI_CODED_BUFFER_ID (buf);
   GST_DEBUG ("coded buffer %" GST_VAAPI_ID_FORMAT, GST_VAAPI_ID_ARGS (buf_id));
 
   if (buf_id != VA_INVALID_ID) {
     GST_VAAPI_DISPLAY_LOCK (display);
     vaapi_destroy_buffer (GST_VAAPI_DISPLAY_VADISPLAY (display), &buf_id);
     GST_VAAPI_DISPLAY_UNLOCK (display);
-    GST_VAAPI_OBJECT_ID (buf) = VA_INVALID_ID;
+    GST_VAAPI_CODED_BUFFER_ID (buf) = VA_INVALID_ID;
   }
+
+  gst_vaapi_display_replace (&GST_VAAPI_CODED_BUFFER_DISPLAY (buf), NULL);
+
+  g_slice_free1 (sizeof (GstVaapiCodedBuffer), buf);
 }
 
 static gboolean
 coded_buffer_map (GstVaapiCodedBuffer * buf)
 {
+  GstVaapiDisplay *const display = GST_VAAPI_CODED_BUFFER_DISPLAY (buf);
+
   if (buf->segment_list)
     return TRUE;
 
-  GST_VAAPI_OBJECT_LOCK_DISPLAY (buf);
-  buf->segment_list = vaapi_map_buffer (GST_VAAPI_OBJECT_VADISPLAY (buf),
-      GST_VAAPI_OBJECT_ID (buf));
-  GST_VAAPI_OBJECT_UNLOCK_DISPLAY (buf);
+  GST_VAAPI_DISPLAY_LOCK (display);
+  buf->segment_list =
+      vaapi_map_buffer (GST_VAAPI_DISPLAY_VADISPLAY (display),
+      GST_VAAPI_CODED_BUFFER_ID (buf));
+  GST_VAAPI_DISPLAY_UNLOCK (display);
   return buf->segment_list != NULL;
 }
 
 static void
 coded_buffer_unmap (GstVaapiCodedBuffer * buf)
 {
+  GstVaapiDisplay *const display = GST_VAAPI_CODED_BUFFER_DISPLAY (buf);
+
   if (!buf->segment_list)
     return;
 
-  GST_VAAPI_OBJECT_LOCK_DISPLAY (buf);
-  vaapi_unmap_buffer (GST_VAAPI_OBJECT_VADISPLAY (buf),
-      GST_VAAPI_OBJECT_ID (buf), (void **) &buf->segment_list);
-  GST_VAAPI_OBJECT_UNLOCK_DISPLAY (buf);
+  GST_VAAPI_DISPLAY_LOCK (display);
+  vaapi_unmap_buffer (GST_VAAPI_DISPLAY_VADISPLAY (display),
+      GST_VAAPI_CODED_BUFFER_ID (buf), (void **) &buf->segment_list);
+  GST_VAAPI_DISPLAY_UNLOCK (display);
 }
 
-/* *INDENT-OFF* */
-#define gst_vaapi_coded_buffer_finalize coded_buffer_destroy
-GST_VAAPI_OBJECT_DEFINE_CLASS (GstVaapiCodedBuffer, gst_vaapi_coded_buffer)
-/* *INDENT-ON* */
+GST_DEFINE_MINI_OBJECT_TYPE (GstVaapiCodedBuffer, gst_vaapi_coded_buffer);
 
 /*
  * gst_vaapi_coded_buffer_new:
@@ -120,10 +126,18 @@ gst_vaapi_coded_buffer_new (GstVaapiContext * context, guint buf_size)
   display = GST_VAAPI_CONTEXT_DISPLAY (context);
   g_return_val_if_fail (display != NULL, NULL);
 
-  buf = gst_vaapi_object_new (gst_vaapi_coded_buffer_class (), display);
+  buf = g_slice_new (GstVaapiCodedBuffer);
   if (!buf)
     return NULL;
 
+  gst_mini_object_init (GST_MINI_OBJECT_CAST (buf), 0,
+      GST_TYPE_VAAPI_CODED_BUFFER, NULL, NULL,
+      (GstMiniObjectFreeFunction) coded_buffer_free);
+
+  GST_VAAPI_CODED_BUFFER_DISPLAY (buf) = gst_object_ref (display);
+  GST_VAAPI_CODED_BUFFER_ID (buf) = VA_INVALID_ID;
+  buf->segment_list = NULL;
+
   if (!coded_buffer_create (buf, buf_size, context))
     goto error;
   return buf;
@@ -131,7 +145,7 @@ gst_vaapi_coded_buffer_new (GstVaapiContext * context, guint buf_size)
   /* ERRORS */
 error:
   {
-    gst_vaapi_object_unref (buf);
+    gst_vaapi_coded_buffer_unref (buf);
     return NULL;
   }
 }
diff --git a/gst-libs/gst/vaapi/gstvaapicodedbuffer.h b/gst-libs/gst/vaapi/gstvaapicodedbuffer.h
index 4980e9c3b3..e84f57b88e 100644
--- a/gst-libs/gst/vaapi/gstvaapicodedbuffer.h
+++ b/gst-libs/gst/vaapi/gstvaapicodedbuffer.h
@@ -42,12 +42,33 @@ typedef struct _GstVaapiCodedBuffer             GstVaapiCodedBuffer;
 typedef struct _GstVaapiCodedBufferProxy        GstVaapiCodedBufferProxy;
 typedef struct _GstVaapiCodedBufferPool         GstVaapiCodedBufferPool;
 
+#define GST_TYPE_VAAPI_CODED_BUFFER (gst_vaapi_coded_buffer_get_type ())
+
+GType
+gst_vaapi_coded_buffer_get_type (void) G_GNUC_CONST;
+
+/**
+ * gst_vaapi_coded_buffer_unref: (skip)
+ * @buf: (transfer full): a #GstVaapiCodedBuffer.
+ *
+ * Decreases the refcount of @buf. If the refcount reaches 0, the
+ * @buf will be freed.
+ */
+static inline void gst_vaapi_coded_buffer_unref(GstVaapiCodedBuffer* buf);
+static inline void
+gst_vaapi_coded_buffer_unref (GstVaapiCodedBuffer * buf)
+{
+  gst_mini_object_unref (GST_MINI_OBJECT_CAST (buf));
+}
+
 gssize
 gst_vaapi_coded_buffer_get_size (GstVaapiCodedBuffer * buf);
 
 gboolean
 gst_vaapi_coded_buffer_copy_into (GstBuffer * dest, GstVaapiCodedBuffer * src);
 
+G_DEFINE_AUTOPTR_CLEANUP_FUNC(GstVaapiCodedBuffer, gst_vaapi_coded_buffer_unref)
+
 G_END_DECLS
 
 #endif /* GST_VAAPI_CODED_BUFFER_H */
diff --git a/gst-libs/gst/vaapi/gstvaapicodedbuffer_priv.h b/gst-libs/gst/vaapi/gstvaapicodedbuffer_priv.h
index 8d0de4d130..85a6193c52 100644
--- a/gst-libs/gst/vaapi/gstvaapicodedbuffer_priv.h
+++ b/gst-libs/gst/vaapi/gstvaapicodedbuffer_priv.h
@@ -26,15 +26,12 @@
 
 #include <gst/vaapi/gstvaapicontext.h>
 #include "gstvaapicodedbuffer.h"
-#include "gstvaapiobject_priv.h"
 
 G_BEGIN_DECLS
 
 #define GST_VAAPI_CODED_BUFFER_CAST(obj) \
     ((GstVaapiCodedBuffer *)(obj))
 
-typedef struct _GstVaapiCodedBufferClass        GstVaapiCodedBufferClass;
-
 /**
  * GstVaapiCodedBuffer:
  *
@@ -43,22 +40,32 @@ typedef struct _GstVaapiCodedBufferClass        GstVaapiCodedBufferClass;
 struct _GstVaapiCodedBuffer
 {
   /*< private >*/
-  GstVaapiObject parent_instance;
+  GstMiniObject         mini_object;
+  GstVaapiDisplay      *display;
+  GstVaapiID            object_id;
 
+  /*< public >*/
   GstVaapiContext      *context;
   VACodedBufferSegment *segment_list;
 };
 
 /**
- * GstVaapiCodedBufferClass:
+ * GST_VAAPI_CODED_BUFFER_DISPLAY:
+ * @buf: a #GstVaapiCodedBuffer
  *
- * A VA coded buffer object wrapper class.
+ * Macro that evaluates to the #GstVaapiDisplay of @buf
  */
-struct _GstVaapiCodedBufferClass
-{
-  /*< private >*/
-  GstVaapiObjectClass parent_class;
-};
+#undef GST_VAAPI_CODED_BUFFER_DISPLAY
+#define GST_VAAPI_CODED_BUFFER_DISPLAY(buf) (GST_VAAPI_CODED_BUFFER (buf)->display)
+
+/**
+ * GST_VAAPI_CODED_BUFFER_ID:
+ * @buf: a #GstVaapiCodedBuffer
+ *
+ * Macro that evaluates to the object ID of @buf
+ */
+#undef GST_VAAPI_CODED_BUFFER_ID
+#define GST_VAAPI_CODED_BUFFER_ID(buf) (GST_VAAPI_CODED_BUFFER (buf)->object_id)
 
 G_GNUC_INTERNAL
 GstVaapiCodedBuffer *
diff --git a/gst-libs/gst/vaapi/gstvaapicodedbufferproxy.c b/gst-libs/gst/vaapi/gstvaapicodedbufferproxy.c
index d28e7b645b..c0adfcbfa0 100644
--- a/gst-libs/gst/vaapi/gstvaapicodedbufferproxy.c
+++ b/gst-libs/gst/vaapi/gstvaapicodedbufferproxy.c
@@ -45,7 +45,7 @@ coded_buffer_proxy_finalize (GstVaapiCodedBufferProxy * proxy)
   if (proxy->buffer) {
     if (proxy->pool)
       gst_vaapi_video_pool_put_object (proxy->pool, proxy->buffer);
-    gst_vaapi_object_unref (proxy->buffer);
+    gst_vaapi_coded_buffer_unref (proxy->buffer);
     proxy->buffer = NULL;
   }
   gst_vaapi_video_pool_replace (&proxy->pool, NULL);
@@ -115,7 +115,7 @@ gst_vaapi_coded_buffer_proxy_new_from_pool (GstVaapiCodedBufferPool * pool)
 #endif
   if (!proxy->buffer)
     goto error;
-  gst_vaapi_object_ref (proxy->buffer);
+  gst_mini_object_ref (GST_MINI_OBJECT_CAST (proxy->buffer));
   return proxy;
 
   /* ERRORS */
diff --git a/gst-libs/gst/vaapi/gstvaapiencoder_h264.c b/gst-libs/gst/vaapi/gstvaapiencoder_h264.c
index 56f90dc119..f3dcc3df33 100644
--- a/gst-libs/gst/vaapi/gstvaapiencoder_h264.c
+++ b/gst-libs/gst/vaapi/gstvaapiencoder_h264.c
@@ -2236,7 +2236,7 @@ fill_picture (GstVaapiEncoderH264 * encoder, GstVaapiEncPicture * picture,
   for (; i < 16; ++i) {
     pic_param->ReferenceFrames[i].picture_id = VA_INVALID_ID;
   }
-  pic_param->coded_buf = GST_VAAPI_OBJECT_ID (codedbuf);
+  pic_param->coded_buf = GST_VAAPI_CODED_BUFFER_ID (codedbuf);
 
   pic_param->pic_parameter_set_id = encoder->view_idx;
   pic_param->seq_parameter_set_id = encoder->view_idx ? 1 : 0;
diff --git a/gst-libs/gst/vaapi/gstvaapiencoder_h264_fei.c b/gst-libs/gst/vaapi/gstvaapiencoder_h264_fei.c
index 92111e0b8a..04927450ca 100644
--- a/gst-libs/gst/vaapi/gstvaapiencoder_h264_fei.c
+++ b/gst-libs/gst/vaapi/gstvaapiencoder_h264_fei.c
@@ -2015,7 +2015,7 @@ fill_picture (GstVaapiEncoderH264Fei * encoder, GstVaapiEncPicture * picture,
   for (; i < 16; ++i) {
     pic_param->ReferenceFrames[i].picture_id = VA_INVALID_ID;
   }
-  pic_param->coded_buf = GST_VAAPI_OBJECT_ID (codedbuf);
+  pic_param->coded_buf = GST_VAAPI_CODED_BUFFER_ID (codedbuf);
 
   pic_param->pic_parameter_set_id = encoder->view_idx;
   pic_param->seq_parameter_set_id = encoder->view_idx ? 1 : 0;
diff --git a/gst-libs/gst/vaapi/gstvaapiencoder_h265.c b/gst-libs/gst/vaapi/gstvaapiencoder_h265.c
index 663c7681be..795075e308 100644
--- a/gst-libs/gst/vaapi/gstvaapiencoder_h265.c
+++ b/gst-libs/gst/vaapi/gstvaapiencoder_h265.c
@@ -1613,7 +1613,7 @@ fill_picture (GstVaapiEncoderH265 * encoder, GstVaapiEncPicture * picture,
     pic_param->reference_frames[i].picture_id = VA_INVALID_SURFACE;
     pic_param->reference_frames[i].flags = 0;
   }
-  pic_param->coded_buf = GST_VAAPI_OBJECT_ID (codedbuf);
+  pic_param->coded_buf = GST_VAAPI_CODED_BUFFER_ID (codedbuf);
 
   /* slice_temporal_mvp_enable_flag == FALSE */
   pic_param->collocated_ref_pic_index = 0xFF;
diff --git a/gst-libs/gst/vaapi/gstvaapiencoder_jpeg.c b/gst-libs/gst/vaapi/gstvaapiencoder_jpeg.c
index 82839081cb..5691087751 100644
--- a/gst-libs/gst/vaapi/gstvaapiencoder_jpeg.c
+++ b/gst-libs/gst/vaapi/gstvaapiencoder_jpeg.c
@@ -214,7 +214,7 @@ fill_picture (GstVaapiEncoderJpeg * encoder,
       GST_VAAPI_SURFACE_PROXY_SURFACE_ID (surface);
   pic_param->picture_width = GST_VAAPI_ENCODER_WIDTH (encoder);
   pic_param->picture_height = GST_VAAPI_ENCODER_HEIGHT (encoder);
-  pic_param->coded_buf = GST_VAAPI_OBJECT_ID (codedbuf);
+  pic_param->coded_buf = GST_VAAPI_CODED_BUFFER_ID (codedbuf);
 
   pic_param->pic_flags.bits.profile = 0;        /* Profile = Baseline */
   pic_param->pic_flags.bits.progressive = 0;    /* Sequential encoding */
diff --git a/gst-libs/gst/vaapi/gstvaapiencoder_mpeg2.c b/gst-libs/gst/vaapi/gstvaapiencoder_mpeg2.c
index 9574be0243..0aca23ba68 100644
--- a/gst-libs/gst/vaapi/gstvaapiencoder_mpeg2.c
+++ b/gst-libs/gst/vaapi/gstvaapiencoder_mpeg2.c
@@ -269,7 +269,7 @@ fill_picture (GstVaapiEncoderMpeg2 * encoder,
 
   pic_param->reconstructed_picture =
       GST_VAAPI_SURFACE_PROXY_SURFACE_ID (surface);
-  pic_param->coded_buf = GST_VAAPI_OBJECT_ID (codedbuf);
+  pic_param->coded_buf = GST_VAAPI_CODED_BUFFER_ID (codedbuf);
   pic_param->picture_type = get_va_enc_picture_type (picture->type);
   pic_param->temporal_reference = picture->frame_num & (1024 - 1);
   pic_param->vbv_delay = 0xFFFF;
diff --git a/gst-libs/gst/vaapi/gstvaapiencoder_vp8.c b/gst-libs/gst/vaapi/gstvaapiencoder_vp8.c
index 102b45a4c0..b91fa43517 100644
--- a/gst-libs/gst/vaapi/gstvaapiencoder_vp8.c
+++ b/gst-libs/gst/vaapi/gstvaapiencoder_vp8.c
@@ -304,7 +304,7 @@ fill_picture (GstVaapiEncoderVP8 * encoder,
   memset (pic_param, 0, sizeof (VAEncPictureParameterBufferVP8));
 
   pic_param->reconstructed_frame = GST_VAAPI_SURFACE_PROXY_SURFACE_ID (surface);
-  pic_param->coded_buf = GST_VAAPI_OBJECT_ID (codedbuf);
+  pic_param->coded_buf = GST_VAAPI_CODED_BUFFER_ID (codedbuf);
 
   if (picture->type == GST_VAAPI_PICTURE_TYPE_P) {
     pic_param->pic_flags.bits.frame_type = 1;
diff --git a/gst-libs/gst/vaapi/gstvaapiencoder_vp9.c b/gst-libs/gst/vaapi/gstvaapiencoder_vp9.c
index 6c8878b439..07c8154b87 100644
--- a/gst-libs/gst/vaapi/gstvaapiencoder_vp9.c
+++ b/gst-libs/gst/vaapi/gstvaapiencoder_vp9.c
@@ -344,7 +344,7 @@ fill_picture (GstVaapiEncoderVP9 * encoder,
   memset (pic_param, 0, sizeof (VAEncPictureParameterBufferVP9));
 
   pic_param->reconstructed_frame = GST_VAAPI_SURFACE_PROXY_SURFACE_ID (surface);
-  pic_param->coded_buf = GST_VAAPI_OBJECT_ID (codedbuf);
+  pic_param->coded_buf = GST_VAAPI_CODED_BUFFER_ID (codedbuf);
 
   /* Update Reference Frame list */
   if (picture->type == GST_VAAPI_PICTURE_TYPE_I)
diff --git a/gst-libs/gst/vaapi/gstvaapifeienc_h264.c b/gst-libs/gst/vaapi/gstvaapifeienc_h264.c
index 333744bcb7..60f08c412b 100644
--- a/gst-libs/gst/vaapi/gstvaapifeienc_h264.c
+++ b/gst-libs/gst/vaapi/gstvaapifeienc_h264.c
@@ -766,7 +766,7 @@ fill_picture (GstVaapiFeiEncH264 * feienc, GstVaapiEncPicture * picture,
     pic_param->ReferenceFrames[i].flags = VA_PICTURE_H264_INVALID;
   }
 
-  pic_param->coded_buf = GST_VAAPI_OBJECT_ID (codedbuf);
+  pic_param->coded_buf = GST_VAAPI_CODED_BUFFER_ID (codedbuf);
 
   pic_param->pic_parameter_set_id = feienc->view_idx;
   pic_param->seq_parameter_set_id = feienc->view_idx ? 1 : 0;
diff --git a/gst-libs/gst/vaapi/gstvaapifeipak_h264.c b/gst-libs/gst/vaapi/gstvaapifeipak_h264.c
index ceb821b256..575c4f9388 100644
--- a/gst-libs/gst/vaapi/gstvaapifeipak_h264.c
+++ b/gst-libs/gst/vaapi/gstvaapifeipak_h264.c
@@ -1342,7 +1342,7 @@ fill_picture (GstVaapiFEIPakH264 * feipak, GstVaapiEncPicture * picture,
     pic_param->ReferenceFrames[i].picture_id = VA_INVALID_ID;
     pic_param->ReferenceFrames[i].frame_idx = VA_PICTURE_H264_INVALID;
   }
-  pic_param->coded_buf = GST_VAAPI_OBJECT_ID (codedbuf);
+  pic_param->coded_buf = GST_VAAPI_CODED_BUFFER_ID (codedbuf);
 
   return TRUE;
 }
diff --git a/gst-libs/gst/vaapi/gstvaapivideopool.c b/gst-libs/gst/vaapi/gstvaapivideopool.c
index daeed76770..9e79b951ec 100644
--- a/gst-libs/gst/vaapi/gstvaapivideopool.c
+++ b/gst-libs/gst/vaapi/gstvaapivideopool.c
@@ -67,14 +67,16 @@ gst_vaapi_video_pool_init (GstVaapiVideoPool * pool, GstVaapiDisplay * display,
 void
 gst_vaapi_video_pool_finalize (GstVaapiVideoPool * pool)
 {
-  if (pool->object_type == GST_VAAPI_VIDEO_POOL_OBJECT_TYPE_IMAGE) {
+  if (pool->object_type == GST_VAAPI_VIDEO_POOL_OBJECT_TYPE_IMAGE
+      || pool->object_type == GST_VAAPI_VIDEO_POOL_OBJECT_TYPE_CODED_BUFFER) {
     g_list_free_full (pool->used_objects,
         (GDestroyNotify) gst_mini_object_unref);
   } else {
     g_list_free_full (pool->used_objects, gst_vaapi_object_unref);
   }
 
-  if (pool->object_type == GST_VAAPI_VIDEO_POOL_OBJECT_TYPE_IMAGE) {
+  if (pool->object_type == GST_VAAPI_VIDEO_POOL_OBJECT_TYPE_IMAGE
+      || pool->object_type == GST_VAAPI_VIDEO_POOL_OBJECT_TYPE_CODED_BUFFER) {
     g_queue_foreach (&pool->free_objects, (GFunc) gst_mini_object_unref, NULL);
   } else {
     g_queue_foreach (&pool->free_objects, (GFunc) gst_vaapi_object_unref, NULL);
@@ -195,10 +197,12 @@ gst_vaapi_video_pool_get_object_unlocked (GstVaapiVideoPool * pool)
   ++pool->used_count;
   pool->used_objects = g_list_prepend (pool->used_objects, object);
 
-  if (pool->object_type == GST_VAAPI_VIDEO_POOL_OBJECT_TYPE_IMAGE)
+  if (pool->object_type == GST_VAAPI_VIDEO_POOL_OBJECT_TYPE_IMAGE
+      || pool->object_type == GST_VAAPI_VIDEO_POOL_OBJECT_TYPE_CODED_BUFFER) {
     object = gst_mini_object_ref (GST_MINI_OBJECT_CAST (object));
-  else
+  } else {
     object = gst_vaapi_object_ref (object);
+  }
   return object;
 }
 
@@ -235,10 +239,12 @@ gst_vaapi_video_pool_put_object_unlocked (GstVaapiVideoPool * pool,
   if (!elem)
     return;
 
-  if (pool->object_type == GST_VAAPI_VIDEO_POOL_OBJECT_TYPE_IMAGE)
+  if (pool->object_type == GST_VAAPI_VIDEO_POOL_OBJECT_TYPE_IMAGE
+      || pool->object_type == GST_VAAPI_VIDEO_POOL_OBJECT_TYPE_CODED_BUFFER) {
     gst_mini_object_unref (GST_MINI_OBJECT_CAST (object));
-  else
+  } else {
     gst_vaapi_object_unref (object);
+  }
 
   --pool->used_count;
   pool->used_objects = g_list_delete_link (pool->used_objects, elem);
@@ -271,7 +277,8 @@ static inline gboolean
 gst_vaapi_video_pool_add_object_unlocked (GstVaapiVideoPool * pool,
     gpointer object)
 {
-  if (pool->object_type == GST_VAAPI_VIDEO_POOL_OBJECT_TYPE_IMAGE) {
+  if (pool->object_type == GST_VAAPI_VIDEO_POOL_OBJECT_TYPE_IMAGE
+      || pool->object_type == GST_VAAPI_VIDEO_POOL_OBJECT_TYPE_CODED_BUFFER) {
     g_queue_push_tail (&pool->free_objects,
         gst_mini_object_ref (GST_MINI_OBJECT_CAST (object)));
   } else {