Commit d565fef1 authored by Rémi Denis-Courmont's avatar Rémi Denis-Courmont Committed by Anton Khirnov

vdpau: add AV_HWACCEL_FLAG_IGNORE_LEVEL to skip the codec level check

Decoding acceleration may work even if the codec level is higher than
the stated limit of the VDPAU driver. Or the problem may be considered
acceptable by the user. This flag allows skipping the codec level
capability checks and proceed with decoding.

Applications should obviously not set this flag by default, but only if
the user explicitly requested this behavior (and presumably knows how
to turn it back off if it fails).
Signed-off-by: 's avatarAnton Khirnov <anton@khirnov.net>
parent c1724623
...@@ -13,6 +13,9 @@ libavutil: 2014-08-09 ...@@ -13,6 +13,9 @@ libavutil: 2014-08-09
API changes, most recent first: API changes, most recent first:
2014-10-xx - xxxxxxx - lavc 56.4.0 - avcodec.h
Add AV_HWACCEL_FLAG_IGNORE_LEVEL flag to av_vdpau_bind_context().
2014-10-13 - xxxxxxx - lavc 56.03.0 - avcodec.h 2014-10-13 - xxxxxxx - lavc 56.03.0 - avcodec.h
Add AVCodecContext.initial_padding. Deprecate the use of AVCodecContext.delay Add AVCodecContext.initial_padding. Deprecate the use of AVCodecContext.delay
for audio encoding. for audio encoding.
......
...@@ -2900,7 +2900,8 @@ typedef struct AVCodec { ...@@ -2900,7 +2900,8 @@ typedef struct AVCodec {
} AVCodec; } AVCodec;
/** /**
* AVHWAccel. * @defgroup lavc_hwaccel AVHWAccel
* @{
*/ */
typedef struct AVHWAccel { typedef struct AVHWAccel {
/** /**
...@@ -3024,6 +3025,17 @@ typedef struct AVHWAccel { ...@@ -3024,6 +3025,17 @@ typedef struct AVHWAccel {
int priv_data_size; int priv_data_size;
} AVHWAccel; } AVHWAccel;
/**
* Hardware acceleration should be used for decoding even if the codec level
* used is unknown or higher than the maximum supported level reported by the
* hardware driver.
*/
#define AV_HWACCEL_FLAG_IGNORE_LEVEL (1 << 0)
/**
* @}
*/
/** /**
* @defgroup lavc_picture AVPicture * @defgroup lavc_picture AVPicture
* *
......
...@@ -94,7 +94,9 @@ int ff_vdpau_common_init(AVCodecContext *avctx, VdpDecoderProfile profile, ...@@ -94,7 +94,9 @@ int ff_vdpau_common_init(AVCodecContext *avctx, VdpDecoderProfile profile,
vdctx->device = hwctx->device; vdctx->device = hwctx->device;
vdctx->get_proc_address = hwctx->get_proc_address; vdctx->get_proc_address = hwctx->get_proc_address;
if (level < 0) if (hwctx->flags & AV_HWACCEL_FLAG_IGNORE_LEVEL)
level = 0;
else if (level < 0)
return AVERROR(ENOTSUP); return AVERROR(ENOTSUP);
status = vdctx->get_proc_address(vdctx->device, status = vdctx->get_proc_address(vdctx->device,
...@@ -313,7 +315,7 @@ int av_vdpau_bind_context(AVCodecContext *avctx, VdpDevice device, ...@@ -313,7 +315,7 @@ int av_vdpau_bind_context(AVCodecContext *avctx, VdpDevice device,
{ {
VDPAUHWContext *hwctx; VDPAUHWContext *hwctx;
if (flags != 0) if (flags & ~AV_HWACCEL_FLAG_IGNORE_LEVEL)
return AVERROR(EINVAL); return AVERROR(EINVAL);
if (av_reallocp(&avctx->hwaccel_context, sizeof(*hwctx))) if (av_reallocp(&avctx->hwaccel_context, sizeof(*hwctx)))
...@@ -325,6 +327,7 @@ int av_vdpau_bind_context(AVCodecContext *avctx, VdpDevice device, ...@@ -325,6 +327,7 @@ int av_vdpau_bind_context(AVCodecContext *avctx, VdpDevice device,
hwctx->context.decoder = VDP_INVALID_HANDLE; hwctx->context.decoder = VDP_INVALID_HANDLE;
hwctx->device = device; hwctx->device = device;
hwctx->get_proc_address = get_proc; hwctx->get_proc_address = get_proc;
hwctx->flags = flags;
hwctx->reset = 1; hwctx->reset = 1;
return 0; return 0;
} }
......
...@@ -143,7 +143,7 @@ typedef struct AVVDPAUContext { ...@@ -143,7 +143,7 @@ typedef struct AVVDPAUContext {
* @param avctx decoding context whose get_format() callback is invoked * @param avctx decoding context whose get_format() callback is invoked
* @param device VDPAU device handle to use for hardware acceleration * @param device VDPAU device handle to use for hardware acceleration
* @param get_proc_address VDPAU device driver * @param get_proc_address VDPAU device driver
* @param flags for future use, must be zero * @param flags zero of more OR'd AV_HWACCEL_FLAG_* flags
* *
* @return 0 on success, an AVERROR code on failure. * @return 0 on success, an AVERROR code on failure.
*/ */
......
...@@ -53,6 +53,7 @@ typedef struct VDPAUHWContext { ...@@ -53,6 +53,7 @@ typedef struct VDPAUHWContext {
VdpDevice device; VdpDevice device;
VdpGetProcAddress *get_proc_address; VdpGetProcAddress *get_proc_address;
char reset; char reset;
unsigned char flags;
} VDPAUHWContext; } VDPAUHWContext;
typedef struct VDPAUContext { typedef struct VDPAUContext {
......
...@@ -29,7 +29,7 @@ ...@@ -29,7 +29,7 @@
#include "libavutil/version.h" #include "libavutil/version.h"
#define LIBAVCODEC_VERSION_MAJOR 56 #define LIBAVCODEC_VERSION_MAJOR 56
#define LIBAVCODEC_VERSION_MINOR 3 #define LIBAVCODEC_VERSION_MINOR 4
#define LIBAVCODEC_VERSION_MICRO 0 #define LIBAVCODEC_VERSION_MICRO 0
#define LIBAVCODEC_VERSION_INT AV_VERSION_INT(LIBAVCODEC_VERSION_MAJOR, \ #define LIBAVCODEC_VERSION_INT AV_VERSION_INT(LIBAVCODEC_VERSION_MAJOR, \
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment