d3d11bufferpool: Hide buffer_size field from header
authorSeungha Yang <seungha@centricular.com>
Sat, 21 Aug 2021 15:33:58 +0000 (00:33 +0900)
committerSeungha Yang <seungha@centricular.com>
Sat, 21 Aug 2021 15:46:19 +0000 (00:46 +0900)
User can get the required buffer size by using buffer pool config.
Since d3d11 implementation is a candidate for public library in the future,
we need to hide everything from header as much as possible.

Note that the total size of allocated d3d11 texture memory by GPU is not
controllable factor. It depends on hardware specific alignment/padding
requirement. So, GstD3D11 implementation updates actual buffer size
by allocating D3D11 texture, since there's no way to get CPU accessible
memory size without allocating real D3D11 texture.

Part-of: <https://gitlab.freedesktop.org/gstreamer/gst-plugins-bad/-/merge_requests/2482>

gst-libs/gst/d3d11/gstd3d11bufferpool.cpp
gst-libs/gst/d3d11/gstd3d11bufferpool.h
sys/d3d11/gstd3d11compositor.cpp
sys/d3d11/gstd3d11convert.cpp
sys/d3d11/gstd3d11decoder.cpp
sys/d3d11/gstd3d11deinterlace.cpp
sys/d3d11/gstd3d11desktopdupsrc.cpp
sys/d3d11/gstd3d11download.cpp
sys/d3d11/gstd3d11upload.cpp
sys/d3d11/gstd3d11videosink.cpp
sys/mediafoundation/gstmfvideoenc.cpp

index 903fb17fd521d5d4ae063f95ffbb3248f3c58f96..64336a14ce3dd4d23d04cd8010770d725b291a30 100644 (file)
@@ -307,10 +307,8 @@ gst_d3d11_buffer_pool_set_config (GstBufferPool * pool, GstStructure * config)
     priv->offset[1] = priv->stride[0] * desc[0].Height;
   }
 
-  self->buffer_size = offset;
-
   gst_buffer_pool_config_set_params (config,
-      caps, self->buffer_size, min_buffers, max_buffers);
+      caps, offset, min_buffers, max_buffers);
 
   return GST_BUFFER_POOL_CLASS (parent_class)->set_config (pool, config) && ret;
 
index e809000ea74bd6402fbc0b795901556112b7b34e..114288ccf0fcf11e6225b3b08ec0b8d866f0fc63 100644 (file)
@@ -41,9 +41,6 @@ struct _GstD3D11BufferPool
 
   GstD3D11Device *device;
 
-  /* re-calculated buffer size based on d3d11 pitch and stride */
-  guint buffer_size;
-
   /*< private >*/
   GstD3D11BufferPoolPrivate *priv;
 
index ce7b1dcb13eb20c1efb87f8489febbc6b35c131a..1f9198705c10fb258a7bd0a49153f0a87a93980f 100644 (file)
@@ -1955,6 +1955,7 @@ gst_d3d11_compositor_propose_allocation (GstAggregator * aggregator,
 
   if (gst_query_get_n_allocation_pools (query) == 0) {
     GstD3D11AllocationParams *d3d11_params;
+    GstStructure *config;
 
     d3d11_params = gst_d3d11_allocation_params_new (self->device, &info,
         (GstD3D11AllocationFlags) 0, D3D11_BIND_SHADER_RESOURCE);
@@ -1968,8 +1969,12 @@ gst_d3d11_compositor_propose_allocation (GstAggregator * aggregator,
       return FALSE;
     }
 
-    /* d3d11 buffer pool might update buffer size by self */
-    size = GST_D3D11_BUFFER_POOL (pool)->buffer_size;
+    /* d3d11 buffer pool will update buffer size based on allocated texture,
+     * get size from config again */
+    config = gst_buffer_pool_get_config (pool);
+    gst_buffer_pool_config_get_params (config,
+        nullptr, &size, nullptr, nullptr);
+    gst_structure_free (config);
 
     gst_query_add_allocation_pool (query, pool, size, 0, 0);
     gst_object_unref (pool);
@@ -2042,8 +2047,12 @@ gst_d3d11_compositor_decide_allocation (GstAggregator * aggregator,
   gst_d3d11_allocation_params_free (d3d11_params);
 
   gst_buffer_pool_set_config (pool, config);
-  /* d3d11 buffer pool might update buffer size by self */
-  size = GST_D3D11_BUFFER_POOL (pool)->buffer_size;
+
+  /* d3d11 buffer pool will update buffer size based on allocated texture,
+   * get size from config again */
+  config = gst_buffer_pool_get_config (pool);
+  gst_buffer_pool_config_get_params (config, nullptr, &size, nullptr, nullptr);
+  gst_structure_free (config);
 
   if (n > 0)
     gst_query_set_nth_allocation_pool (query, 0, pool, size, min, max);
index 4ce213ff04013a355521503ea47ebd3ec134eddb..058b8e9bba2336b2df90b7308c3c61fb9263c21a 100644 (file)
@@ -1252,7 +1252,12 @@ gst_d3d11_base_convert_propose_allocation (GstBaseTransform * trans,
   gst_query_add_allocation_meta (query,
       GST_VIDEO_OVERLAY_COMPOSITION_META_API_TYPE, NULL);
 
-  size = GST_D3D11_BUFFER_POOL (pool)->buffer_size;
+  /* d3d11 buffer pool will update buffer size based on allocated texture,
+   * get size from config again */
+  config = gst_buffer_pool_get_config (pool);
+  gst_buffer_pool_config_get_params (config, nullptr, &size, nullptr, nullptr);
+  gst_structure_free (config);
+
   gst_query_add_allocation_pool (query, pool, size, 0, 0);
 
   gst_object_unref (pool);
@@ -1359,7 +1364,11 @@ gst_d3d11_base_convert_decide_allocation (GstBaseTransform * trans,
   gst_buffer_pool_config_set_params (config, outcaps, size, min, max);
   gst_buffer_pool_set_config (pool, config);
 
-  size = GST_D3D11_BUFFER_POOL (pool)->buffer_size;
+  /* d3d11 buffer pool will update buffer size based on allocated texture,
+   * get size from config again */
+  config = gst_buffer_pool_get_config (pool);
+  gst_buffer_pool_config_get_params (config, nullptr, &size, nullptr, nullptr);
+  gst_structure_free (config);
 
   if (update_pool)
     gst_query_set_nth_allocation_pool (query, 0, pool, size, min, max);
index b06f260469653c75a9f11dcb36a9b5539361efaa..3ae416bdaca5fdbe8b3576a34d50e033e5e72025 100644 (file)
@@ -1702,8 +1702,14 @@ gst_d3d11_decoder_decide_allocation (GstD3D11Decoder * decoder,
   }
 
   gst_buffer_pool_set_config (pool, config);
-  if (use_d3d11_pool)
-    size = GST_D3D11_BUFFER_POOL (pool)->buffer_size;
+  if (use_d3d11_pool) {
+    /* d3d11 buffer pool will update buffer size based on allocated texture,
+     * get size from config again */
+    config = gst_buffer_pool_get_config (pool);
+    gst_buffer_pool_config_get_params (config,
+        nullptr, &size, nullptr, nullptr);
+    gst_structure_free (config);
+  }
 
   if (n > 0)
     gst_query_set_nth_allocation_pool (query, 0, pool, size, min, max);
index 64e04b47ee90dc57ed06bf38015cc2c68deb1ca8..b961cf043ebec64122cefe51cffd3d71ec798354 100644 (file)
@@ -948,7 +948,12 @@ gst_d3d11_deinterlace_propose_allocation (GstBaseTransform * trans,
   gst_query_add_allocation_meta (query,
       GST_VIDEO_OVERLAY_COMPOSITION_META_API_TYPE, NULL);
 
-  size = GST_D3D11_BUFFER_POOL (pool)->buffer_size;
+  /* d3d11 buffer pool will update buffer size based on allocated texture,
+   * get size from config again */
+  config = gst_buffer_pool_get_config (pool);
+  gst_buffer_pool_config_get_params (config, nullptr, &size, nullptr, nullptr);
+  gst_structure_free (config);
+
   gst_query_add_allocation_pool (query, pool, size, min_buffers, 0);
 
   gst_object_unref (pool);
@@ -1022,7 +1027,11 @@ gst_d3d11_deinterlace_decide_allocation (GstBaseTransform * trans,
   gst_buffer_pool_config_set_params (config, outcaps, size, min, max);
   gst_buffer_pool_set_config (pool, config);
 
-  size = GST_D3D11_BUFFER_POOL (pool)->buffer_size;
+  /* d3d11 buffer pool will update buffer size based on allocated texture,
+   * get size from config again */
+  config = gst_buffer_pool_get_config (pool);
+  gst_buffer_pool_config_get_params (config, nullptr, &size, nullptr, nullptr);
+  gst_structure_free (config);
 
   if (update_pool)
     gst_query_set_nth_allocation_pool (query, 0, pool, size, min, max);
index a01ef16b1e91ae84fcca9bdaae5ce5b2b7ff3be4..39ec4cde7b858d6fd9b30d4d64f21addd0d497e5 100644 (file)
@@ -378,9 +378,11 @@ gst_d3d11_desktop_dup_src_decide_allocation (GstBaseSrc * bsrc,
 
   gst_buffer_pool_set_config (pool, config);
 
-  /* buffer size might be recalculated by pool depending on
-   * device's stride/padding constraints */
-  size = GST_D3D11_BUFFER_POOL (pool)->buffer_size;
+  /* d3d11 buffer pool will update buffer size based on allocated texture,
+   * get size from config again */
+  config = gst_buffer_pool_get_config (pool);
+  gst_buffer_pool_config_get_params (config, nullptr, &size, nullptr, nullptr);
+  gst_structure_free (config);
 
   if (update_pool)
     gst_query_set_nth_allocation_pool (query, 0, pool, size, min, max);
index b0b5695419812a1a8c723f5d4b7f87bc70d84340..1cf096d9b159a547088c26ddddf82b9c7a431621 100644 (file)
@@ -295,9 +295,13 @@ gst_d3d11_download_propose_allocation (GstBaseTransform * trans,
 
     gst_query_add_allocation_meta (query, GST_VIDEO_META_API_TYPE, NULL);
 
-    /* d3d11 buffer pool might update buffer size by self */
     if (is_d3d11) {
-      size = GST_D3D11_BUFFER_POOL (pool)->buffer_size;
+      /* d3d11 buffer pool will update buffer size based on allocated texture,
+       * get size from config again */
+      config = gst_buffer_pool_get_config (pool);
+      gst_buffer_pool_config_get_params (config, nullptr, &size, nullptr,
+          nullptr);
+      gst_structure_free (config);
     }
 
     gst_query_add_allocation_pool (query, pool, size, 0, 0);
index a0bce4c195a2a74c496df5affdd9db53e17f2e8b..758268416b3ee39fc0b05c0bc5b3c5d4557555a1 100644 (file)
@@ -326,9 +326,14 @@ gst_d3d11_upload_propose_allocation (GstBaseTransform * trans,
     if (!gst_buffer_pool_set_config (pool, config))
       goto config_failed;
 
-    /* d3d11 buffer pool might update buffer size by self */
-    if (is_d3d11)
-      size = GST_D3D11_BUFFER_POOL (pool)->buffer_size;
+    /* d3d11 buffer pool will update buffer size based on allocated texture,
+     * get size from config again */
+    if (is_d3d11) {
+      config = gst_buffer_pool_get_config (pool);
+      gst_buffer_pool_config_get_params (config,
+          nullptr, &size, nullptr, nullptr);
+      gst_structure_free (config);
+    }
 
     gst_query_add_allocation_pool (query, pool, size, 0, 0);
     gst_object_unref (pool);
@@ -446,8 +451,11 @@ gst_d3d11_upload_decide_allocation (GstBaseTransform * trans, GstQuery * query)
 
   gst_buffer_pool_set_config (pool, config);
 
-  /* update size with calculated one */
-  size = GST_D3D11_BUFFER_POOL (pool)->buffer_size;
+  /* d3d11 buffer pool will update buffer size based on allocated texture,
+   * get size from config again */
+  config = gst_buffer_pool_get_config (pool);
+  gst_buffer_pool_config_get_params (config, nullptr, &size, nullptr, nullptr);
+  gst_structure_free (config);
 
   if (update_pool)
     gst_query_set_nth_allocation_pool (query, 0, pool, size, min, max);
index 9dacfe7da49a71a15a2ad0c7485c9720480cc484..9b6db1348d68e4551b5351db6461decdfb4a623b 100644 (file)
@@ -885,8 +885,14 @@ gst_d3d11_video_sink_propose_allocation (GstBaseSink * sink, GstQuery * query)
       return FALSE;
     }
 
-    if (is_d3d11)
-      size = GST_D3D11_BUFFER_POOL (pool)->buffer_size;
+    if (is_d3d11) {
+      /* d3d11 buffer pool will update buffer size based on allocated texture,
+       * get size from config again */
+      config = gst_buffer_pool_get_config (pool);
+      gst_buffer_pool_config_get_params (config, nullptr, &size, nullptr,
+          nullptr);
+      gst_structure_free (config);
+    }
   }
 
   /* We need at least 2 buffers because we hold on to the last one for redrawing
index f03edfb43c04128e4d33e223c3c81820303713b4..312bb8ec2f736554babab59eb33508b8df8d68c7 100644 (file)
@@ -1360,9 +1360,14 @@ gst_mf_video_enc_propose_allocation (GstVideoEncoder * enc, GstQuery * query)
     if (!gst_buffer_pool_set_config (pool, config))
       goto config_failed;
 
-    /* d3d11 buffer pool might update buffer size by self */
-    if (is_d3d11)
-      size = GST_D3D11_BUFFER_POOL (pool)->buffer_size;
+    /* d3d11 buffer pool will update buffer size based on allocated texture,
+     * get size from config again */
+    if (is_d3d11) {
+      config = gst_buffer_pool_get_config (pool);
+      gst_buffer_pool_config_get_params (config,
+          nullptr, &size, nullptr, nullptr);
+      gst_structure_free (config);
+    }
 
     gst_query_add_allocation_pool (query, pool, size, 0, 0);
     gst_object_unref (pool);