summaryrefslogtreecommitdiffstats
path: root/libavcodec/dxva2.c
diff options
context:
space:
mode:
authorwm4 <nfxjfg@googlemail.com>2017-06-22 14:52:56 +0200
committerwm4 <nfxjfg@googlemail.com>2017-06-27 18:05:02 +0200
commit8d7fdba7b8670db9dd5023dde6fe3a06674933c4 (patch)
tree0a5731479f026e851bb1a0ea79f3517c83ae69ca /libavcodec/dxva2.c
parent6f5ff3269b12776a32b12887128ba034ad86e08b (diff)
downloadffmpeg-streaming-8d7fdba7b8670db9dd5023dde6fe3a06674933c4.zip
ffmpeg-streaming-8d7fdba7b8670db9dd5023dde6fe3a06674933c4.tar.gz
dxva: support DXGI_FORMAT_420_OPAQUE decoding
Some devices (some phones, apparently) will support only this opaque format. Of course this won't work with CLI, because copying data directly is not supported. Automatic frame allocation (setting AVCodecContext.hw_device_ctx) does not support this mode, even if it's the only supported mode. But since opaque surfaces are generally less useful, that's probably ok. Merges Libav commit 5030e3856c2126fb829edb828f5aae011d178eb4. Signed-off-by: Luca Barbato <lu_zero@gentoo.org>
Diffstat (limited to 'libavcodec/dxva2.c')
-rw-r--r--libavcodec/dxva2.c13
1 files changed, 11 insertions, 2 deletions
diff --git a/libavcodec/dxva2.c b/libavcodec/dxva2.c
index e9a6605..76e8249 100644
--- a/libavcodec/dxva2.c
+++ b/libavcodec/dxva2.c
@@ -393,19 +393,28 @@ static int d3d11va_get_decoder_configuration(AVCodecContext *avctx,
return ret;
}
+static DXGI_FORMAT d3d11va_map_sw_to_hw_format(enum AVPixelFormat pix_fmt)
+{
+ switch (pix_fmt) {
+ case AV_PIX_FMT_NV12: return DXGI_FORMAT_NV12;
+ case AV_PIX_FMT_P010: return DXGI_FORMAT_P010;
+ case AV_PIX_FMT_YUV420P: return DXGI_FORMAT_420_OPAQUE;
+ default: return DXGI_FORMAT_UNKNOWN;
+ }
+}
+
static int d3d11va_create_decoder(AVCodecContext *avctx)
{
FFDXVASharedContext *sctx = DXVA_SHARED_CONTEXT(avctx);
GUID *guid_list;
unsigned guid_count, i;
GUID decoder_guid;
- DXGI_FORMAT surface_format = avctx->sw_pix_fmt == AV_PIX_FMT_YUV420P10 ?
- DXGI_FORMAT_P010 : DXGI_FORMAT_NV12;
D3D11_VIDEO_DECODER_DESC desc = { 0 };
D3D11_VIDEO_DECODER_CONFIG config;
AVHWFramesContext *frames_ctx = (AVHWFramesContext *)avctx->hw_frames_ctx->data;
AVD3D11VADeviceContext *device_hwctx = frames_ctx->device_ctx->hwctx;
AVD3D11VAFramesContext *frames_hwctx = frames_ctx->hwctx;
+ DXGI_FORMAT surface_format = d3d11va_map_sw_to_hw_format(frames_ctx->sw_format);
D3D11_TEXTURE2D_DESC texdesc;
HRESULT hr;
int ret;
OpenPOWER on IntegriCloud