summaryrefslogtreecommitdiffstats
path: root/libavutil
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 /libavutil
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 'libavutil')
-rw-r--r--libavutil/hwcontext_d3d11va.c12
-rw-r--r--libavutil/hwcontext_d3d11va.h4
2 files changed, 14 insertions, 2 deletions
diff --git a/libavutil/hwcontext_d3d11va.c b/libavutil/hwcontext_d3d11va.c
index 523a6d2..376c76e 100644
--- a/libavutil/hwcontext_d3d11va.c
+++ b/libavutil/hwcontext_d3d11va.c
@@ -83,8 +83,11 @@ static const struct {
DXGI_FORMAT d3d_format;
enum AVPixelFormat pix_fmt;
} supported_formats[] = {
- { DXGI_FORMAT_NV12, AV_PIX_FMT_NV12 },
- { DXGI_FORMAT_P010, AV_PIX_FMT_P010 },
+ { DXGI_FORMAT_NV12, AV_PIX_FMT_NV12 },
+ { DXGI_FORMAT_P010, AV_PIX_FMT_P010 },
+ // Special opaque formats. The pix_fmt is merely a place holder, as the
+ // opaque format cannot be accessed directly.
+ { DXGI_FORMAT_420_OPAQUE, AV_PIX_FMT_YUV420P },
};
static void d3d11va_default_lock(void *ctx)
@@ -270,6 +273,7 @@ static int d3d11va_transfer_get_formats(AVHWFramesContext *ctx,
enum AVHWFrameTransferDirection dir,
enum AVPixelFormat **formats)
{
+ D3D11VAFramesContext *s = ctx->internal->priv;
enum AVPixelFormat *fmts;
fmts = av_malloc_array(2, sizeof(*fmts));
@@ -279,6 +283,10 @@ static int d3d11va_transfer_get_formats(AVHWFramesContext *ctx,
fmts[0] = ctx->sw_format;
fmts[1] = AV_PIX_FMT_NONE;
+ // Don't signal support for opaque formats. Actual access would fail.
+ if (s->format == DXGI_FORMAT_420_OPAQUE)
+ fmts[0] = AV_PIX_FMT_NONE;
+
*formats = fmts;
return 0;
diff --git a/libavutil/hwcontext_d3d11va.h b/libavutil/hwcontext_d3d11va.h
index 676349d..d414515 100644
--- a/libavutil/hwcontext_d3d11va.h
+++ b/libavutil/hwcontext_d3d11va.h
@@ -26,6 +26,10 @@
* The default pool implementation will be fixed-size if initial_pool_size is
* set (and allocate elements from an array texture). Otherwise it will allocate
* individual textures. Be aware that decoding requires a single array texture.
+ *
+ * Using sw_format==AV_PIX_FMT_YUV420P has special semantics, and maps to
+ * DXGI_FORMAT_420_OPAQUE. av_hwframe_transfer_data() is not supported for
+ * this format. Refer to MSDN for details.
*/
#include <d3d11.h>
OpenPOWER on IntegriCloud