guint num_render_target_views;
ID3D11VideoDecoderOutputView *decoder_output_view;
+ ID3D11VideoDecoder *decoder_handle;
+
ID3D11VideoProcessorInputView *processor_input_view;
ID3D11VideoProcessorOutputView *processor_output_view;
static gboolean
gst_d3d11_memory_ensure_decoder_output_view (GstD3D11Memory * mem,
- ID3D11VideoDevice * video_device, GUID * decoder_profile)
+ ID3D11VideoDevice * video_device, ID3D11VideoDecoder * decoder,
+ const GUID * decoder_profile)
{
GstD3D11MemoryPrivate *dmem_priv = mem->priv;
GstD3D11Allocator *allocator;
GST_D3D11_MEMORY_LOCK (mem);
if (dmem_priv->decoder_output_view) {
dmem_priv->decoder_output_view->GetDesc (&desc);
- if (IsEqualGUID (desc.DecodeProfile, *decoder_profile)) {
+ if (IsEqualGUID (desc.DecodeProfile, *decoder_profile) &&
+ dmem_priv->decoder_handle == decoder) {
goto succeeded;
} else {
/* Shouldn't happen, but try again anyway */
GST_WARNING_OBJECT (allocator,
"Existing view has different decoder profile");
GST_D3D11_CLEAR_COM (dmem_priv->decoder_output_view);
+ GST_D3D11_CLEAR_COM (dmem_priv->decoder_handle);
}
}
goto done;
}
+ /* XXX: decoder output view is bound to video device, not decoder handle
+ * from API point of view. But some driver seems to be unhappy
+ * when decoder handle is released while there are outstanding view objects */
+ dmem_priv->decoder_handle = decoder;
+ decoder->AddRef ();
+
succeeded:
ret = TRUE;
/**
* gst_d3d11_memory_get_decoder_output_view:
* @mem: a #GstD3D11Memory
+ * @video_device: (transfer none): a ID3D11VideoDevice handle
+ * @decoder: (transfer none): a ID3D11VideoDecoder handle
+ * @decoder_profile: a DXVA decoder profile GUID
*
* Returns: (transfer none) (nullable): a pointer to the
* ID3D11VideoDecoderOutputView or %NULL if ID3D11VideoDecoderOutputView is
*/
ID3D11VideoDecoderOutputView *
gst_d3d11_memory_get_decoder_output_view (GstD3D11Memory * mem,
- ID3D11VideoDevice * video_device, GUID * decoder_profile)
+ ID3D11VideoDevice * video_device, ID3D11VideoDecoder * decoder,
+ const GUID * decoder_profile)
{
g_return_val_if_fail (gst_is_d3d11_memory (GST_MEMORY_CAST (mem)), NULL);
g_return_val_if_fail (video_device != NULL, NULL);
+ g_return_val_if_fail (decoder != NULL, NULL);
g_return_val_if_fail (decoder_profile != NULL, NULL);
if (!gst_d3d11_memory_ensure_decoder_output_view (mem,
- video_device, decoder_profile))
+ video_device, decoder, decoder_profile))
return NULL;
return mem->priv->decoder_output_view;
GST_D3D11_CLEAR_COM (dmem_priv->staging);
GST_D3D11_CLEAR_COM (dmem_priv->buffer);
+ GST_D3D11_CLEAR_COM (dmem_priv->decoder_handle);
+
gst_clear_object (&dmem->device);
g_mutex_clear (&dmem_priv->lock);
g_free (dmem->priv);
mem = (GstD3D11Memory *) gst_buffer_peek_memory (buffer, 0);
if (!gst_d3d11_memory_get_decoder_output_view (mem, self->video_device,
- &self->decoder_profile)) {
+ self->decoder_handle, &self->decoder_profile)) {
GST_ERROR_OBJECT (self, "Decoder output view is unavailable");
return FALSE;
}
dmem = (GstD3D11Memory *) mem;
view = gst_d3d11_memory_get_decoder_output_view (dmem, decoder->video_device,
- &decoder->decoder_profile);
+ decoder->decoder_handle, &decoder->decoder_profile);
if (!view) {
GST_ERROR_OBJECT (decoder, "Decoder output view is unavailable");