From: Elizabeth Figura zfigura@codeweavers.com
--- dlls/d3d11/d3d11_private.h | 2 ++ dlls/d3d11/device.c | 18 ++++++++++++++---- dlls/d3d11/view.c | 9 +++++++++ dlls/wined3d/decoder.c | 34 ++++++++++++++++++++++++++++++++++ dlls/wined3d/wined3d.spec | 2 ++ include/wine/wined3d.h | 3 +++ 6 files changed, 64 insertions(+), 4 deletions(-)
diff --git a/dlls/d3d11/d3d11_private.h b/dlls/d3d11/d3d11_private.h index 7edad44fdf5..426ac0772c5 100644 --- a/dlls/d3d11/d3d11_private.h +++ b/dlls/d3d11/d3d11_private.h @@ -284,6 +284,8 @@ struct d3d_video_decoder_output_view
HRESULT d3d_video_decoder_output_view_create(struct d3d_device *device, ID3D11Resource *resource, const D3D11_VIDEO_DECODER_OUTPUT_VIEW_DESC *desc, struct d3d_video_decoder_output_view **view); +struct d3d_video_decoder_output_view *unsafe_impl_from_ID3D11VideoDecoderOutputView( + ID3D11VideoDecoderOutputView *iface);
/* ID3D11InputLayout, ID3D10InputLayout */ struct d3d_input_layout diff --git a/dlls/d3d11/device.c b/dlls/d3d11/device.c index 91049c104ea..64baad68859 100644 --- a/dlls/d3d11/device.c +++ b/dlls/d3d11/device.c @@ -3208,15 +3208,25 @@ static HRESULT STDMETHODCALLTYPE d3d11_video_context_ReleaseDecoderBuffer(ID3D11 static HRESULT STDMETHODCALLTYPE d3d11_video_context_DecoderBeginFrame(ID3D11VideoContext *iface, ID3D11VideoDecoder *decoder, ID3D11VideoDecoderOutputView *view, UINT key_size, const void *key) { - FIXME("iface %p, decoder %p, view %p, key_size %u, key %p, stub!\n", iface, decoder, view, key_size, key); - return E_NOTIMPL; + struct d3d_video_decoder_output_view *view_impl = unsafe_impl_from_ID3D11VideoDecoderOutputView(view); + struct d3d_video_decoder *decoder_impl = unsafe_impl_from_ID3D11VideoDecoder(decoder); + + TRACE("iface %p, decoder %p, view %p, key_size %u, key %p.\n", iface, decoder, view, key_size, key); + + if (key_size) + FIXME("Ignoring encryption key.\n"); + + return wined3d_decoder_begin_frame(decoder_impl->wined3d_decoder, view_impl->wined3d_view); }
static HRESULT STDMETHODCALLTYPE d3d11_video_context_DecoderEndFrame( ID3D11VideoContext *iface, ID3D11VideoDecoder *decoder) { - FIXME("iface %p, decoder %p, stub!\n", iface, decoder); - return E_NOTIMPL; + struct d3d_video_decoder *decoder_impl = unsafe_impl_from_ID3D11VideoDecoder(decoder); + + TRACE("iface %p, decoder %p.\n", iface, decoder); + + return wined3d_decoder_end_frame(decoder_impl->wined3d_decoder); }
static HRESULT STDMETHODCALLTYPE d3d11_video_context_SubmitDecoderBuffers(ID3D11VideoContext *iface, diff --git a/dlls/d3d11/view.c b/dlls/d3d11/view.c index bb0b72b37a1..ea7d6c5563c 100644 --- a/dlls/d3d11/view.c +++ b/dlls/d3d11/view.c @@ -2797,3 +2797,12 @@ HRESULT d3d_video_decoder_output_view_create(struct d3d_device *device, ID3D11Re
return S_OK; } + +struct d3d_video_decoder_output_view *unsafe_impl_from_ID3D11VideoDecoderOutputView(ID3D11VideoDecoderOutputView *iface) +{ + if (!iface) + return NULL; + assert(iface->lpVtbl == &d3d11_video_decoder_output_view_vtbl); + + return impl_from_ID3D11VideoDecoderOutputView(iface); +} diff --git a/dlls/wined3d/decoder.c b/dlls/wined3d/decoder.c index 20a54851075..1a33f759174 100644 --- a/dlls/wined3d/decoder.c +++ b/dlls/wined3d/decoder.c @@ -27,6 +27,7 @@ struct wined3d_decoder struct wined3d_device *device; struct wined3d_decoder_desc desc; struct wined3d_buffer *bitstream, *parameters, *matrix, *slice_control; + struct wined3d_decoder_output_view *output_view; };
static void wined3d_decoder_cleanup(struct wined3d_decoder *decoder) @@ -467,3 +468,36 @@ struct wined3d_resource * CDECL wined3d_decoder_get_buffer( FIXME("Unhandled buffer type %#x.\n", type); return NULL; } + +HRESULT CDECL wined3d_decoder_begin_frame(struct wined3d_decoder *decoder, + struct wined3d_decoder_output_view *view) +{ + TRACE("decoder %p, view %p.\n", decoder, view); + + if (decoder->output_view) + { + ERR("Already in frame.\n"); + return E_INVALIDARG; + } + + wined3d_decoder_output_view_incref(view); + decoder->output_view = view; + + return S_OK; +} + +HRESULT CDECL wined3d_decoder_end_frame(struct wined3d_decoder *decoder) +{ + TRACE("decoder %p.\n", decoder); + + if (!decoder->output_view) + { + ERR("Not in frame.\n"); + return E_INVALIDARG; + } + + wined3d_decoder_output_view_decref(decoder->output_view); + decoder->output_view = NULL; + + return S_OK; +} diff --git a/dlls/wined3d/wined3d.spec b/dlls/wined3d/wined3d.spec index 6e617648b05..e9125e52cf6 100644 --- a/dlls/wined3d/wined3d.spec +++ b/dlls/wined3d/wined3d.spec @@ -40,8 +40,10 @@ @ cdecl wined3d_command_list_decref(ptr) @ cdecl wined3d_command_list_incref(ptr)
+@ cdecl wined3d_decoder_begin_frame(ptr ptr) @ cdecl wined3d_decoder_create(ptr ptr ptr) @ cdecl wined3d_decoder_decref(ptr) +@ cdecl wined3d_decoder_end_frame(ptr) @ cdecl wined3d_decoder_get_buffer(ptr long)
@ cdecl wined3d_decoder_output_view_create(ptr ptr ptr ptr ptr) diff --git a/include/wine/wined3d.h b/include/wine/wined3d.h index 0eb4361f40e..7a0434925c0 100644 --- a/include/wine/wined3d.h +++ b/include/wine/wined3d.h @@ -2378,9 +2378,12 @@ ULONG __cdecl wined3d_buffer_incref(struct wined3d_buffer *buffer); ULONG __cdecl wined3d_command_list_decref(struct wined3d_command_list *list); ULONG __cdecl wined3d_command_list_incref(struct wined3d_command_list *list);
+HRESULT __cdecl wined3d_decoder_begin_frame(struct wined3d_decoder *decoder, + struct wined3d_decoder_output_view *view); HRESULT __cdecl wined3d_decoder_create(struct wined3d_device *device, const struct wined3d_decoder_desc *desc, struct wined3d_decoder **decoder); ULONG __cdecl wined3d_decoder_decref(struct wined3d_decoder *decoder); +HRESULT __cdecl wined3d_decoder_end_frame(struct wined3d_decoder *decoder); struct wined3d_resource * __cdecl wined3d_decoder_get_buffer( struct wined3d_decoder *decoder, enum wined3d_decoder_buffer_type type);