guint num, den;
GError *error = NULL;
GstStructure *config;
- GstD3D11AllocationParams *d3d11_params;
gint i;
GST_DEBUG_OBJECT (self, "set caps %" GST_PTR_FORMAT, caps);
if (!gst_d3d11_window_prepare (self->window, GST_VIDEO_SINK_WIDTH (self),
GST_VIDEO_SINK_HEIGHT (self), video_par_n, video_par_d,
- caps, &error)) {
+ caps, &self->need_srv, &error)) {
GstMessage *error_msg;
GST_ERROR_OBJECT (self, "cannot create swapchain");
gst_buffer_pool_config_set_params (config,
caps, GST_VIDEO_INFO_SIZE (&self->info), 0, 2);
- d3d11_params = gst_buffer_pool_config_get_d3d11_allocation_params (config);
- if (!d3d11_params) {
- d3d11_params = gst_d3d11_allocation_params_new (&self->info,
- GST_D3D11_ALLOCATION_FLAG_USE_RESOURCE_FORMAT, D3D11_USAGE_DEFAULT,
- D3D11_BIND_SHADER_RESOURCE);
- } else {
- /* Set bind flag */
- for (i = 0; i < GST_VIDEO_INFO_N_PLANES (&self->info); i++) {
- d3d11_params->desc[i].BindFlags |= D3D11_BIND_SHADER_RESOURCE;
+ if (self->need_srv) {
+ GstD3D11AllocationParams *d3d11_params;
+
+ d3d11_params = gst_buffer_pool_config_get_d3d11_allocation_params (config);
+ if (!d3d11_params) {
+ d3d11_params = gst_d3d11_allocation_params_new (&self->info,
+ GST_D3D11_ALLOCATION_FLAG_USE_RESOURCE_FORMAT, D3D11_USAGE_DEFAULT,
+ D3D11_BIND_SHADER_RESOURCE);
+ } else {
+ /* Set bind flag */
+ for (i = 0; i < GST_VIDEO_INFO_N_PLANES (&self->info); i++) {
+ d3d11_params->desc[i].BindFlags |= D3D11_BIND_SHADER_RESOURCE;
+ }
}
+
+ gst_buffer_pool_config_set_d3d11_allocation_params (config, d3d11_params);
+ gst_d3d11_allocation_params_free (d3d11_params);
}
- gst_buffer_pool_config_set_d3d11_allocation_params (config, d3d11_params);
- gst_d3d11_allocation_params_free (d3d11_params);
gst_buffer_pool_set_config (self->fallback_pool, config);
return TRUE;
size = info.size;
if (need_pool) {
- GstD3D11AllocationParams *d3d11_params;
gint i;
+ GstCaps *render_caps;
GST_DEBUG_OBJECT (self, "create new pool");
gst_buffer_pool_config_set_params (config, caps, size, 2,
DXGI_MAX_SWAP_CHAIN_BUFFERS);
- d3d11_params = gst_buffer_pool_config_get_d3d11_allocation_params (config);
- if (!d3d11_params) {
- d3d11_params = gst_d3d11_allocation_params_new (&info,
- GST_D3D11_ALLOCATION_FLAG_USE_RESOURCE_FORMAT, D3D11_USAGE_DEFAULT,
- D3D11_BIND_SHADER_RESOURCE);
- } else {
- /* Set bind flag */
- for (i = 0; i < GST_VIDEO_INFO_N_PLANES (&info); i++) {
- d3d11_params->desc[i].BindFlags |= D3D11_BIND_SHADER_RESOURCE;
+ render_caps = gst_d3d11_device_get_supported_caps (self->device,
+ D3D11_FORMAT_SUPPORT_TEXTURE2D | D3D11_FORMAT_SUPPORT_DISPLAY);
+
+ /* if we need conversion, request shader resource view */
+ if (render_caps && !gst_caps_can_intersect (caps, render_caps)) {
+ GstD3D11AllocationParams *d3d11_params;
+
+ GST_DEBUG_OBJECT (self,
+ "upstream format %s is not display foramt, need shader resource",
+ gst_video_format_to_string (GST_VIDEO_INFO_FORMAT (&info)));
+
+ d3d11_params =
+ gst_buffer_pool_config_get_d3d11_allocation_params (config);
+ if (!d3d11_params) {
+ d3d11_params = gst_d3d11_allocation_params_new (&info,
+ GST_D3D11_ALLOCATION_FLAG_USE_RESOURCE_FORMAT, D3D11_USAGE_DEFAULT,
+ D3D11_BIND_SHADER_RESOURCE);
+ } else {
+ /* Set bind flag */
+ for (i = 0; i < GST_VIDEO_INFO_N_PLANES (&info); i++) {
+ d3d11_params->desc[i].BindFlags |= D3D11_BIND_SHADER_RESOURCE;
+ }
}
- }
- gst_buffer_pool_config_set_d3d11_allocation_params (config, d3d11_params);
- gst_d3d11_allocation_params_free (d3d11_params);
+ gst_buffer_pool_config_set_d3d11_allocation_params (config, d3d11_params);
+ gst_d3d11_allocation_params_free (d3d11_params);
+ }
+ gst_clear_caps (&render_caps);
if (!gst_buffer_pool_set_config (pool, config)) {
g_object_unref (pool);
break;
}
- if (!gst_d3d11_memory_ensure_shader_resource_view (mem)) {
+ if (self->need_srv && !gst_d3d11_memory_ensure_shader_resource_view (mem)) {
render_buf = NULL;
break;
}
gboolean
gst_d3d11_window_prepare (GstD3D11Window * window, guint width, guint height,
- guint aspect_ratio_n, guint aspect_ratio_d, GstCaps * caps, GError ** error)
+ guint aspect_ratio_n, guint aspect_ratio_d, GstCaps * caps,
+ gboolean * do_convert, GError ** error)
{
DXGI_SWAP_CHAIN_DESC desc = { 0, };
GstD3D11ThreadFuncData data;
g_return_val_if_fail (GST_IS_D3D11_WINDOW (window), FALSE);
g_return_val_if_fail (aspect_ratio_n > 0, FALSE);
g_return_val_if_fail (aspect_ratio_d > 0, FALSE);
+ g_return_val_if_fail (do_convert != NULL, FALSE);
GST_DEBUG_OBJECT (window, "Prepare window with %dx%d caps %" GST_PTR_FORMAT,
width, height, caps);
GST_DEBUG_OBJECT (window, "New swap chain 0x%p created", window->swap_chain);
+ *do_convert = ! !window->converter;
+
return TRUE;
}