diff options
author | Hendrik Leppkes <h.leppkes@gmail.com> | 2014-04-22 15:22:51 +0200 |
---|---|---|
committer | Anton Khirnov <anton@khirnov.net> | 2014-04-28 20:21:59 +0200 |
commit | ed4b757177f9b563412cdbc8ee3405d82e10fc05 (patch) | |
tree | b6a6cec91ba2837a7f1faa90565087305e510f51 /libavcodec | |
parent | 2fcef90bee98bffeff1d95b7197738f50c450d86 (diff) | |
download | ffmpeg-ed4b757177f9b563412cdbc8ee3405d82e10fc05.tar.gz |
dxva2_h264: add a workaround for old Intel GPUs
Old Intel GPUs expect the reference frame index to the actual surface,
instead of the index into RefFrameList as specified by the spec.
This workaround should be set when using one of the "ClearVideo" decoder
devices.
Signed-off-by: Anton Khirnov <anton@khirnov.net>
Diffstat (limited to 'libavcodec')
-rw-r--r-- | libavcodec/dxva2.h | 1 | ||||
-rw-r--r-- | libavcodec/dxva2_h264.c | 8 | ||||
-rw-r--r-- | libavcodec/version.h | 2 |
3 files changed, 9 insertions, 2 deletions
diff --git a/libavcodec/dxva2.h b/libavcodec/dxva2.h index d161eb9f5e..78939be961 100644 --- a/libavcodec/dxva2.h +++ b/libavcodec/dxva2.h @@ -42,6 +42,7 @@ */ #define FF_DXVA2_WORKAROUND_SCALING_LIST_ZIGZAG 1 ///< Work around for DXVA2 and old UVD/UVD+ ATI video cards +#define FF_DXVA2_WORKAROUND_INTEL_CLEARVIDEO 2 ///< Work around for DXVA2 and old Intel GPUs with ClearVideo interface /** * This structure is used to provides the necessary configurations and data diff --git a/libavcodec/dxva2_h264.c b/libavcodec/dxva2_h264.c index 1e4d98ac3c..3d503e8243 100644 --- a/libavcodec/dxva2_h264.c +++ b/libavcodec/dxva2_h264.c @@ -116,6 +116,8 @@ static void fill_picture_parameters(struct dxva_context *ctx, const H264Context pp->bit_depth_chroma_minus8 = h->sps.bit_depth_chroma - 8; if (ctx->workaround & FF_DXVA2_WORKAROUND_SCALING_LIST_ZIGZAG) pp->Reserved16Bits = 0; + else if (ctx->workaround & FF_DXVA2_WORKAROUND_INTEL_CLEARVIDEO) + pp->Reserved16Bits = 0x34c; else pp->Reserved16Bits = 3; /* FIXME is there a way to detect the right mode ? */ pp->StatusReportFeedbackNumber = 1 + ctx->report_id++; @@ -239,7 +241,11 @@ static void fill_slice_long(AVCodecContext *avctx, DXVA_Slice_H264_Long *slice, if (list < h->list_count && i < h->ref_count[list]) { const H264Picture *r = &h->ref_list[list][i]; unsigned plane; - unsigned index = get_refpic_index(pp, ff_dxva2_get_surface_index(ctx, &r->f)); + unsigned index; + if (ctx->workaround & FF_DXVA2_WORKAROUND_INTEL_CLEARVIDEO) + index = ff_dxva2_get_surface_index(ctx, &r->f); + else + index = get_refpic_index(pp, ff_dxva2_get_surface_index(ctx, &r->f)); fill_picture_entry(&slice->RefPicList[list][i], index, r->reference == PICT_BOTTOM_FIELD); for (plane = 0; plane < 3; plane++) { diff --git a/libavcodec/version.h b/libavcodec/version.h index b04bc306d1..d82a06802a 100644 --- a/libavcodec/version.h +++ b/libavcodec/version.h @@ -29,7 +29,7 @@ #include "libavutil/version.h" #define LIBAVCODEC_VERSION_MAJOR 55 -#define LIBAVCODEC_VERSION_MINOR 49 +#define LIBAVCODEC_VERSION_MINOR 50 #define LIBAVCODEC_VERSION_MICRO 0 #define LIBAVCODEC_VERSION_INT AV_VERSION_INT(LIBAVCODEC_VERSION_MAJOR, \ |