Commit ed4b7571 authored by Hendrik Leppkes's avatar Hendrik Leppkes Committed by Anton Khirnov

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: 's avatarAnton Khirnov <anton@khirnov.net>
parent 2fcef90b
...@@ -13,6 +13,9 @@ libavutil: 2013-12-xx ...@@ -13,6 +13,9 @@ libavutil: 2013-12-xx
API changes, most recent first: API changes, most recent first:
2014-04-xx - xxxxxxx - lavc 55.50.0 - dxva2.h
Add FF_DXVA2_WORKAROUND_INTEL_CLEARVIDEO for old Intel GPUs.
2014-04-xx - xxxxxxx - lavu 53.13.0 - avutil.h 2014-04-xx - xxxxxxx - lavu 53.13.0 - avutil.h
Add av_get_time_base_q(). Add av_get_time_base_q().
......
...@@ -42,6 +42,7 @@ ...@@ -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_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 * This structure is used to provides the necessary configurations and data
......
...@@ -116,6 +116,8 @@ static void fill_picture_parameters(struct dxva_context *ctx, const H264Context ...@@ -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; pp->bit_depth_chroma_minus8 = h->sps.bit_depth_chroma - 8;
if (ctx->workaround & FF_DXVA2_WORKAROUND_SCALING_LIST_ZIGZAG) if (ctx->workaround & FF_DXVA2_WORKAROUND_SCALING_LIST_ZIGZAG)
pp->Reserved16Bits = 0; pp->Reserved16Bits = 0;
else if (ctx->workaround & FF_DXVA2_WORKAROUND_INTEL_CLEARVIDEO)
pp->Reserved16Bits = 0x34c;
else else
pp->Reserved16Bits = 3; /* FIXME is there a way to detect the right mode ? */ pp->Reserved16Bits = 3; /* FIXME is there a way to detect the right mode ? */
pp->StatusReportFeedbackNumber = 1 + ctx->report_id++; pp->StatusReportFeedbackNumber = 1 + ctx->report_id++;
...@@ -239,7 +241,11 @@ static void fill_slice_long(AVCodecContext *avctx, DXVA_Slice_H264_Long *slice, ...@@ -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]) { if (list < h->list_count && i < h->ref_count[list]) {
const H264Picture *r = &h->ref_list[list][i]; const H264Picture *r = &h->ref_list[list][i];
unsigned plane; 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, fill_picture_entry(&slice->RefPicList[list][i], index,
r->reference == PICT_BOTTOM_FIELD); r->reference == PICT_BOTTOM_FIELD);
for (plane = 0; plane < 3; plane++) { for (plane = 0; plane < 3; plane++) {
......
...@@ -29,7 +29,7 @@ ...@@ -29,7 +29,7 @@
#include "libavutil/version.h" #include "libavutil/version.h"
#define LIBAVCODEC_VERSION_MAJOR 55 #define LIBAVCODEC_VERSION_MAJOR 55
#define LIBAVCODEC_VERSION_MINOR 49 #define LIBAVCODEC_VERSION_MINOR 50
#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