static gboolean gst_d3d11_color_convert_set_info (GstD3D11BaseFilter * filter,
GstCaps * incaps, GstVideoInfo * in_info, GstCaps * outcaps,
GstVideoInfo * out_info);
-static gboolean gst_d3d11_color_convert_query (GstBaseTransform * trans,
- GstPadDirection direction, GstQuery * query);
/* copies the given caps */
static GstCaps *
GST_DEBUG_FUNCPTR (gst_d3d11_color_convert_decide_allocation);
trans_class->transform =
GST_DEBUG_FUNCPTR (gst_d3d11_color_convert_transform);
- trans_class->query = GST_DEBUG_FUNCPTR (gst_d3d11_color_convert_query);
bfilter_class->set_info =
GST_DEBUG_FUNCPTR (gst_d3d11_color_convert_set_info);
}
static gboolean
-gst_d3d11_color_convert_query (GstBaseTransform * trans,
- GstPadDirection direction, GstQuery * query)
-{
- if (gst_query_is_d3d11_usage (query) && direction == GST_PAD_SINK) {
- D3D11_USAGE usage = D3D11_USAGE_DEFAULT;
-
- gst_query_parse_d3d11_usage (query, &usage);
- if (usage == D3D11_USAGE_DEFAULT || usage == D3D11_USAGE_DYNAMIC)
- gst_query_set_d3d11_usage_result (query, TRUE);
- else
- gst_query_set_d3d11_usage_result (query, FALSE);
-
- return TRUE;
- }
-
- return GST_BASE_TRANSFORM_CLASS (parent_class)->query (trans, direction,
- query);
-}
-
-static gboolean
create_shader_input_resource (GstD3D11ColorConvert * self,
GstD3D11Device * device, const GstD3D11Format * format, GstVideoInfo * info)
{
#include "gstd3d11memory.h"
#include "gstd3d11device.h"
#include "gstd3d11bufferpool.h"
+#include "gstd3d11utils.h"
GST_DEBUG_CATEGORY_STATIC (gst_d3d11_download_debug);
#define GST_CAT_DEFAULT gst_d3d11_download_debug
GstQuery * query);
static GstFlowReturn gst_d3d11_download_transform (GstBaseTransform * trans,
GstBuffer * inbuf, GstBuffer * outbuf);
+static gboolean gst_d3d11_download_query (GstBaseTransform * trans,
+ GstPadDirection direction, GstQuery * query);
static void
gst_d3d11_download_class_init (GstD3D11DownloadClass * klass)
trans_class->decide_allocation =
GST_DEBUG_FUNCPTR (gst_d3d11_download_decide_allocation);
trans_class->transform = GST_DEBUG_FUNCPTR (gst_d3d11_download_transform);
+ trans_class->query = GST_DEBUG_FUNCPTR (gst_d3d11_download_query);
GST_DEBUG_CATEGORY_INIT (gst_d3d11_download_debug,
"d3d11download", 0, "d3d11download Element");
return GST_FLOW_ERROR;
}
}
+
+static gboolean
+gst_d3d11_download_query (GstBaseTransform * trans, GstPadDirection direction,
+ GstQuery * query)
+{
+ if (gst_query_is_d3d11_usage (query) && direction == GST_PAD_SINK) {
+ GstD3D11BaseFilter *filter = GST_D3D11_BASE_FILTER (trans);
+ D3D11_USAGE usage = D3D11_USAGE_DEFAULT;
+ GstD3D11Device *device;
+
+ gst_query_parse_d3d11_usage (query, &device, &usage);
+ if (filter->device == device && usage == D3D11_USAGE_DEFAULT) {
+ gst_query_set_d3d11_usage_result (query, TRUE);
+ gst_object_unref (device);
+ } else {
+ gst_query_set_d3d11_usage_result (query, FALSE);
+ gst_object_unref (device);
+
+ return TRUE;
+ }
+ }
+
+ return GST_BASE_TRANSFORM_CLASS (parent_class)->query (trans, direction,
+ query);
+}
GstQuery *usage_query;
gboolean can_dynamic = FALSE;
- usage_query = gst_query_new_d3d11_usage (D3D11_USAGE_DYNAMIC);
+ usage_query =
+ gst_query_new_d3d11_usage (filter->device, D3D11_USAGE_DYNAMIC);
gst_pad_peer_query (GST_BASE_TRANSFORM_SRC_PAD (trans), usage_query);
gst_query_parse_d3d11_usage_result (usage_query, &can_dynamic);
gst_query_unref (usage_query);
}
GstQuery *
-gst_query_new_d3d11_usage (D3D11_USAGE usage)
+gst_query_new_d3d11_usage (GstD3D11Device * device, D3D11_USAGE usage)
{
GstQuery *query;
GstStructure *structure;
+ g_return_val_if_fail (GST_IS_D3D11_DEVICE (device), NULL);
+
structure = gst_structure_new ("GstQueryD3D11Usage",
+ "device", GST_TYPE_D3D11_DEVICE, device,
"usage", G_TYPE_INT, usage, "result", G_TYPE_BOOLEAN, FALSE, NULL);
query = gst_query_new_custom (GST_QUERY_CUSTOM, structure);
}
void
-gst_query_parse_d3d11_usage (GstQuery * query, D3D11_USAGE * usage)
+gst_query_parse_d3d11_usage (GstQuery * query, GstD3D11Device ** device,
+ D3D11_USAGE * usage)
{
const GstStructure *structure;
structure = gst_query_get_structure (query);
- gst_structure_get (structure, "usage", G_TYPE_INT, usage, NULL);
+ gst_structure_get (structure, "device", GST_TYPE_D3D11_DEVICE, device,
+ "usage", G_TYPE_INT, usage, NULL);
}
void
gboolean gst_d3d11_is_windows_8_or_greater (void);
-GstQuery * gst_query_new_d3d11_usage (D3D11_USAGE usage);
+GstQuery * gst_query_new_d3d11_usage (GstD3D11Device * device,
+ D3D11_USAGE usage);
void gst_query_parse_d3d11_usage (GstQuery * query,
+ GstD3D11Device ** device,
D3D11_USAGE *usage);
void gst_query_set_d3d11_usage_result (GstQuery * query,
case GST_QUERY_CUSTOM:
if (gst_query_is_d3d11_usage (query)) {
D3D11_USAGE usage = D3D11_USAGE_DEFAULT;
+ GstD3D11Device *device;
- gst_query_parse_d3d11_usage (query, &usage);
- if (usage == D3D11_USAGE_DEFAULT || usage == D3D11_USAGE_DYNAMIC)
+ gst_query_parse_d3d11_usage (query, &device, &usage);
+ if (device == self->device &&
+ (usage == D3D11_USAGE_DEFAULT || usage == D3D11_USAGE_DYNAMIC)) {
gst_query_set_d3d11_usage_result (query, TRUE);
- else
+ gst_object_unref (device);
+ } else {
gst_query_set_d3d11_usage_result (query, FALSE);
+ gst_object_unref (device);
- return TRUE;
+ return TRUE;
+ }
}
break;
default: