diff --git a/doc/APIchanges b/doc/APIchanges
index a8c8e2eef9efb64bb971771b9cbdaf8df9c840f7..59d2d03462f3b409bb5463acbb2677c3c80efb26 100644
--- a/doc/APIchanges
+++ b/doc/APIchanges
@@ -13,6 +13,9 @@ libavutil:     2014-08-09
 
 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
   Add AVCodecContext.initial_padding. Deprecate the use of AVCodecContext.delay
   for audio encoding.
diff --git a/libavcodec/avcodec.h b/libavcodec/avcodec.h
index a24ce407c94ff697dff4d81a376db3b665a96abd..8e6c019b6241e1fc4c3651d67de14e0c86bb072e 100644
--- a/libavcodec/avcodec.h
+++ b/libavcodec/avcodec.h
@@ -2900,7 +2900,8 @@ typedef struct AVCodec {
 } AVCodec;
 
 /**
- * AVHWAccel.
+ * @defgroup lavc_hwaccel AVHWAccel
+ * @{
  */
 typedef struct AVHWAccel {
     /**
@@ -3024,6 +3025,17 @@ typedef struct AVHWAccel {
     int priv_data_size;
 } 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
  *
diff --git a/libavcodec/vdpau.c b/libavcodec/vdpau.c
index 9805a8d0b1dff2f79184c7ae9ae513bfd44d09e4..1d68e70b478e589c07820076d86767d60706efd7 100644
--- a/libavcodec/vdpau.c
+++ b/libavcodec/vdpau.c
@@ -94,7 +94,9 @@ int ff_vdpau_common_init(AVCodecContext *avctx, VdpDecoderProfile profile,
     vdctx->device           = hwctx->device;
     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);
 
     status = vdctx->get_proc_address(vdctx->device,
@@ -313,7 +315,7 @@ int av_vdpau_bind_context(AVCodecContext *avctx, VdpDevice device,
 {
     VDPAUHWContext *hwctx;
 
-    if (flags != 0)
+    if (flags & ~AV_HWACCEL_FLAG_IGNORE_LEVEL)
         return AVERROR(EINVAL);
 
     if (av_reallocp(&avctx->hwaccel_context, sizeof(*hwctx)))
@@ -325,6 +327,7 @@ int av_vdpau_bind_context(AVCodecContext *avctx, VdpDevice device,
     hwctx->context.decoder  = VDP_INVALID_HANDLE;
     hwctx->device           = device;
     hwctx->get_proc_address = get_proc;
+    hwctx->flags            = flags;
     hwctx->reset            = 1;
     return 0;
 }
diff --git a/libavcodec/vdpau.h b/libavcodec/vdpau.h
index 1714b1e1fb7409436d131ce4efd396d6f3dfa509..24c3b02c02bf850d2f04924e87a6e07ed4637ffd 100644
--- a/libavcodec/vdpau.h
+++ b/libavcodec/vdpau.h
@@ -143,7 +143,7 @@ typedef struct AVVDPAUContext {
  * @param avctx decoding context whose get_format() callback is invoked
  * @param device VDPAU device handle to use for hardware acceleration
  * @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.
  */
diff --git a/libavcodec/vdpau_internal.h b/libavcodec/vdpau_internal.h
index 69cd455160d3a90c7c56503aae051f880b4f678a..16493b0741c52d80b238801ef1f51c801b8e4fe1 100644
--- a/libavcodec/vdpau_internal.h
+++ b/libavcodec/vdpau_internal.h
@@ -53,6 +53,7 @@ typedef struct VDPAUHWContext {
     VdpDevice device;
     VdpGetProcAddress *get_proc_address;
     char reset;
+    unsigned char flags;
 } VDPAUHWContext;
 
 typedef struct VDPAUContext {
diff --git a/libavcodec/version.h b/libavcodec/version.h
index c44686d6ec35674b87c995a2b0ef4f6d356c1f1a..097dee392bd74a77fe0c0b5f99fc7ee2243a9113 100644
--- a/libavcodec/version.h
+++ b/libavcodec/version.h
@@ -29,7 +29,7 @@
 #include "libavutil/version.h"
 
 #define LIBAVCODEC_VERSION_MAJOR 56
-#define LIBAVCODEC_VERSION_MINOR  3
+#define LIBAVCODEC_VERSION_MINOR  4
 #define LIBAVCODEC_VERSION_MICRO  0
 
 #define LIBAVCODEC_VERSION_INT  AV_VERSION_INT(LIBAVCODEC_VERSION_MAJOR, \