mirror of
https://gitee.com/openharmony/third_party_ffmpeg
synced 2024-11-23 19:30:05 +00:00
dxva: Add ability to enable workaround for older ATI cards
The workaround needs to be enabled per PCI ID which cannot be detected inside libavcodec. So add a flag to manually enable the alternate behavior. Signed-off-by: Janne Grunau <janne-libav@jannau.net>
This commit is contained in:
parent
d4a544cbc4
commit
dcce09d64b
@ -27,6 +27,8 @@
|
|||||||
|
|
||||||
#include <dxva2api.h>
|
#include <dxva2api.h>
|
||||||
|
|
||||||
|
#define FF_DXVA2_WORKAROUND_SCALING_LIST_ZIGZAG 1 ///< Work around for DXVA2 and old UVD/UVD+ ATI video cards
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* This structure is used to provides the necessary configurations and data
|
* This structure is used to provides the necessary configurations and data
|
||||||
* to the DXVA2 Libav HWAccel implementation.
|
* to the DXVA2 Libav HWAccel implementation.
|
||||||
|
@ -113,7 +113,10 @@ static void fill_picture_parameters(struct dxva_context *ctx, const H264Context
|
|||||||
|
|
||||||
pp->bit_depth_luma_minus8 = h->sps.bit_depth_luma - 8;
|
pp->bit_depth_luma_minus8 = h->sps.bit_depth_luma - 8;
|
||||||
pp->bit_depth_chroma_minus8 = h->sps.bit_depth_chroma - 8;
|
pp->bit_depth_chroma_minus8 = h->sps.bit_depth_chroma - 8;
|
||||||
pp->Reserved16Bits = 3; /* FIXME is there a way to detect the right mode ? */
|
if (ctx->workaround & FF_DXVA2_WORKAROUND_SCALING_LIST_ZIGZAG)
|
||||||
|
pp->Reserved16Bits = 0;
|
||||||
|
else
|
||||||
|
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++;
|
||||||
pp->CurrFieldOrderCnt[0] = 0;
|
pp->CurrFieldOrderCnt[0] = 0;
|
||||||
if ((s->picture_structure & PICT_TOP_FIELD) &&
|
if ((s->picture_structure & PICT_TOP_FIELD) &&
|
||||||
@ -150,17 +153,27 @@ static void fill_picture_parameters(struct dxva_context *ctx, const H264Context
|
|||||||
//pp->SliceGroupMap[810]; /* XXX not implemented by Libav */
|
//pp->SliceGroupMap[810]; /* XXX not implemented by Libav */
|
||||||
}
|
}
|
||||||
|
|
||||||
static void fill_scaling_lists(const H264Context *h, DXVA_Qmatrix_H264 *qm)
|
static void fill_scaling_lists(struct dxva_context *ctx, const H264Context *h, DXVA_Qmatrix_H264 *qm)
|
||||||
{
|
{
|
||||||
unsigned i, j;
|
unsigned i, j;
|
||||||
memset(qm, 0, sizeof(*qm));
|
memset(qm, 0, sizeof(*qm));
|
||||||
for (i = 0; i < 6; i++)
|
if (ctx->workaround & FF_DXVA2_WORKAROUND_SCALING_LIST_ZIGZAG) {
|
||||||
for (j = 0; j < 16; j++)
|
for (i = 0; i < 6; i++)
|
||||||
qm->bScalingLists4x4[i][j] = h->pps.scaling_matrix4[i][zigzag_scan[j]];
|
for (j = 0; j < 16; j++)
|
||||||
|
qm->bScalingLists4x4[i][j] = h->pps.scaling_matrix4[i][j];
|
||||||
|
|
||||||
for (i = 0; i < 2; i++)
|
for (i = 0; i < 2; i++)
|
||||||
for (j = 0; j < 64; j++)
|
for (j = 0; j < 64; j++)
|
||||||
qm->bScalingLists8x8[i][j] = h->pps.scaling_matrix8[i][ff_zigzag_direct[j]];
|
qm->bScalingLists8x8[i][j] = h->pps.scaling_matrix8[i][j];
|
||||||
|
} else {
|
||||||
|
for (i = 0; i < 6; i++)
|
||||||
|
for (j = 0; j < 16; j++)
|
||||||
|
qm->bScalingLists4x4[i][j] = h->pps.scaling_matrix4[i][zigzag_scan[j]];
|
||||||
|
|
||||||
|
for (i = 0; i < 2; i++)
|
||||||
|
for (j = 0; j < 64; j++)
|
||||||
|
qm->bScalingLists8x8[i][j] = h->pps.scaling_matrix8[i][ff_zigzag_direct[j]];
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
static int is_slice_short(struct dxva_context *ctx)
|
static int is_slice_short(struct dxva_context *ctx)
|
||||||
@ -370,7 +383,7 @@ static int start_frame(AVCodecContext *avctx,
|
|||||||
fill_picture_parameters(ctx, h, &ctx_pic->pp);
|
fill_picture_parameters(ctx, h, &ctx_pic->pp);
|
||||||
|
|
||||||
/* Fill up DXVA_Qmatrix_H264 */
|
/* Fill up DXVA_Qmatrix_H264 */
|
||||||
fill_scaling_lists(h, &ctx_pic->qm);
|
fill_scaling_lists(ctx, h, &ctx_pic->qm);
|
||||||
|
|
||||||
ctx_pic->slice_count = 0;
|
ctx_pic->slice_count = 0;
|
||||||
ctx_pic->bitstream_size = 0;
|
ctx_pic->bitstream_size = 0;
|
||||||
|
Loading…
Reference in New Issue
Block a user