23#include "config_components.h"
32#define MAX_SLICES 1024
35 DXVA_PictureParameters
pp;
45 DXVA_PictureParameters *pp)
60 memset(pp, 0,
sizeof(*pp));
64 pp->wForwardRefPictureIndex = 0xffff;
68 pp->wBackwardRefPictureIndex = 0xffff;
69 pp->wDecodedPictureIndex =
73 pp->wPicWidthInMBminus1 = avctx->
width - 1;
74 pp->wPicHeightInMBminus1= avctx->
height - 1;
77 pp->wPicWidthInMBminus1 =
s->mb_width - 1;
78 pp->wPicHeightInMBminus1=
s->mb_height - 1;
80 pp->bMacroblockWidthMinus1 = 15;
81 pp->bMacroblockHeightMinus1 = 15;
82 pp->bBlockWidthMinus1 = 7;
83 pp->bBlockHeightMinus1 = 7;
86 pp->bPicStructure |= 0x01;
88 pp->bPicStructure |= 0x02;
92 pp->bBidirectionalAveragingMode = (1 << 7) |
100 (!
s->quarter_sample );
107 pp->bPicReadbackRequests = 0;
108 pp->bRcontrol = v->
rnd;
122 pp->bPicDeblocked = ((!pp->bPicBackwardPrediction && v->
overlap) << 6) |
144 pp->bReservedBits = v->
pq;
148 pp->wBitstreamPCEelements = v->
lumshift;
150 pp->wBitstreamFcodes = 32;
151 pp->wBitstreamPCEelements = 0;
159 pp->wBitstreamFcodes = (32 << 8) | 32;
160 pp->wBitstreamPCEelements = 0;
163 pp->bBitstreamConcealmentNeed = 0;
164 pp->bBitstreamConcealmentMethod = 0;
168 unsigned position,
unsigned size)
173 memset(slice, 0,
sizeof(*slice));
174 slice->wHorizontalPosition = 0;
175 slice->wVerticalPosition =
s->mb_y;
176 slice->dwSliceBitsInBuffer = 8 *
size;
177 slice->dwSliceDataLocation = position;
178 slice->bStartCodeBitOffset = 0;
182 slice->wNumberMBsInSlice = (
s->mb_y >> v->
field_mode) *
s->mb_width +
s->mb_x;
183 slice->wQuantizerScaleCode = v->
pq;
184 slice->wBadSliceChopping = 0;
196 static const uint8_t
start_code[] = { 0, 0, 1, 0x0d };
198 const unsigned mb_count =
s->mb_width * (
s->mb_height >> v->
field_mode);
200 void *dxva_data_ptr =
NULL;
201 uint8_t *dxva_data, *
current, *end;
209 type = D3D11_VIDEO_DECODER_BUFFER_BITSTREAM;
213 &dxva_size, &dxva_data_ptr)))
219 type = DXVA2_BitStreamDateBufferType;
222 &dxva_data_ptr, &dxva_size)))
230 dxva_data = dxva_data_ptr;
232 end = dxva_data + dxva_size;
235 unsigned position,
size;
237 position =
slice->dwSliceDataLocation;
246 slice->wNumberMBsInSlice =
247 slice[1].wNumberMBsInSlice -
slice[0].wNumberMBsInSlice;
249 slice->wNumberMBsInSlice =
250 mb_count -
slice[0].wNumberMBsInSlice;
253 if (start_code_size) {
261 slice->dwSliceBitsInBuffer += start_code_size * 8;
268 if (
slice && padding > 0) {
271 slice->dwSliceBitsInBuffer += padding * 8;
289 D3D11_VIDEO_DECODER_BUFFER_DESC *dsc11 = bs;
290 memset(dsc11, 0,
sizeof(*dsc11));
291 dsc11->BufferType =
type;
292 dsc11->DataSize =
current - dxva_data;
293 dsc11->NumMBsInBuffer = mb_count;
295 type = D3D11_VIDEO_DECODER_BUFFER_SLICE_CONTROL;
300 DXVA2_DecodeBufferDesc *dsc2 = bs;
301 memset(dsc2, 0,
sizeof(*dsc2));
302 dsc2->CompressedBufferType =
type;
303 dsc2->DataSize =
current - dxva_data;
304 dsc2->NumMBsInBuffer = mb_count;
306 type = DXVA2_SliceControlBufferType;
378 &ctx_pic->
pp,
sizeof(ctx_pic->
pp),
384#if CONFIG_WMV3_DXVA2_HWACCEL
386 .p.name =
"wmv3_dxva2",
401#if CONFIG_VC1_DXVA2_HWACCEL
403 .p.name =
"vc1_dxva2",
418#if CONFIG_WMV3_D3D11VA_HWACCEL
420 .p.name =
"wmv3_d3d11va",
435#if CONFIG_WMV3_D3D11VA2_HWACCEL
437 .p.name =
"wmv3_d3d11va2",
452#if CONFIG_VC1_D3D11VA_HWACCEL
454 .p.name =
"vc1_d3d11va",
469#if CONFIG_VC1_D3D11VA2_HWACCEL
471 .p.name =
"vc1_d3d11va2",
#define av_assert0(cond)
assert() equivalent, that is always enabled.
#define i(width, name, range_min, range_max)
int ff_dxva2_is_d3d11(const AVCodecContext *avctx)
unsigned ff_dxva2_get_surface_index(const AVCodecContext *avctx, AVDXVAContext *ctx, const AVFrame *frame, int curr)
int ff_dxva2_decode_init(AVCodecContext *avctx)
int ff_dxva2_commit_buffer(AVCodecContext *avctx, AVDXVAContext *ctx, DECODER_BUFFER_DESC *dsc, unsigned type, const void *data, unsigned size, unsigned mb_count)
int ff_dxva2_decode_uninit(AVCodecContext *avctx)
int ff_dxva2_common_end_frame(AVCodecContext *avctx, AVFrame *frame, const void *pp, unsigned pp_size, const void *qm, unsigned qm_size, int(*commit_bs_si)(AVCodecContext *, DECODER_BUFFER_DESC *bs, DECODER_BUFFER_DESC *slice))
int ff_dxva2_common_frame_params(AVCodecContext *avctx, AVBufferRef *hw_frames_ctx)
static int commit_bitstream_and_slice_buffer(AVCodecContext *avctx, DECODER_BUFFER_DESC *bs, DECODER_BUFFER_DESC *sc)
#define DXVA_CONTEXT(avctx)
#define DXVA_CONTEXT_CFG_INTRARESID(avctx, ctx)
#define DXVA2_CONTEXT(ctx)
#define DXVA_CONTEXT_CFG_RESIDACCEL(avctx, ctx)
#define D3D11VA_CONTEXT(ctx)
#define DXVA_CONTEXT_REPORT_ID(avctx, ctx)
#define DXVA_CONTEXT_VALID(avctx, ctx)
static int commit_bitstream_and_slice_buffer(AVCodecContext *avctx, DECODER_BUFFER_DESC *bs, DECODER_BUFFER_DESC *sc)
static int dxva2_vc1_start_frame(AVCodecContext *avctx, av_unused const AVBufferRef *buffer_ref, av_unused const uint8_t *buffer, av_unused uint32_t size)
static int dxva2_vc1_end_frame(AVCodecContext *avctx)
void ff_dxva2_vc1_fill_picture_parameters(AVCodecContext *avctx, AVDXVAContext *ctx, DXVA_PictureParameters *pp)
static int dxva2_vc1_decode_slice(AVCodecContext *avctx, const uint8_t *buffer, uint32_t size)
void ff_dxva2_vc1_fill_slice(AVCodecContext *avctx, DXVA_SliceInfo *slice, unsigned position, unsigned size)
static struct @111144215057303131116103221376075045141373005341 current
static int get_bits_count(const GetBitContext *s)
#define AV_LOG_ERROR
Something went wrong and cannot losslessly be recovered.
@ AV_PICTURE_TYPE_I
Intra.
@ AV_PICTURE_TYPE_P
Predicted.
@ AV_PICTURE_TYPE_B
Bi-dir predicted.
const struct FFHWAccel ff_wmv3_dxva2_hwaccel
const struct FFHWAccel ff_vc1_dxva2_hwaccel
const struct FFHWAccel ff_wmv3_d3d11va2_hwaccel
const struct FFHWAccel ff_wmv3_d3d11va_hwaccel
const struct FFHWAccel ff_vc1_d3d11va_hwaccel
const struct FFHWAccel ff_vc1_d3d11va2_hwaccel
static const chunk_decoder decoder[8]
#define PICT_BOTTOM_FIELD
mpegvideo decoder header.
@ AV_PIX_FMT_DXVA2_VLD
HW decoding through DXVA2, Picture.data[3] contains a LPDIRECT3DSURFACE9 pointer.
@ AV_PIX_FMT_D3D11
Hardware surfaces for Direct3D11.
@ AV_PIX_FMT_D3D11VA_VLD
HW decoding through Direct3D11 via old API, Picture.data[3] contains a ID3D11VideoDecoderOutputView p...
A reference to a data buffer.
main external API structure.
enum AVPixelFormat pix_fmt
Pixel format, see AV_PIX_FMT_xxx.
int width
picture width / height.
void * hwaccel_picture_private
RefStruct reference for hardware accelerator private data.
MPVPicture * ptr
RefStruct reference.
MPVWorkPicture cur_pic
copy of the current picture structure.
int tfcntrflag
TFCNTR present.
int profile
Sequence header data for all Profiles TODO: choose between ints, uint8_ts and monobit flags.
uint8_t bfraction_lut_index
Index for BFRACTION value (see Table 40, reproduced into ff_vc1_bfraction_lut[])
int dquant
How qscale varies with MBs, 2 bits (not in Simple)
int multires
frame-level RESPIC syntax element present
int finterpflag
INTERPFRM present.
int extended_mv
Ext MV in P/B (not in Simple)
int extended_dmv
Additional extended dmv range at P/B-frame-level.
int panscanflag
NUMPANSCANWIN, TOPLEFT{X,Y}, BOTRIGHT{X,Y} present.
uint8_t mv_mode2
Secondary MV coding mode (B-frames)
int psf
Progressive Segmented Frame.
int refdist
distance of the current picture from reference
int field_mode
1 for interlaced field pictures
uint8_t rangeredfrm
Frame decoding info for S/M profiles only.
int quantizer_mode
2 bits, quantizer mode used for sequence, see QUANT_*
int broadcast
TFF/RFF present.
int refdist_flag
REFDIST syntax element present in II, IP, PI or PP field picture headers.
int max_b_frames
max number of B-frames
int chromaformat
2 bits, 2=4:2:0, only defined
int overlap
overlapped transforms in use
uint8_t mv_mode
Frame decoding info for all profiles.
int postprocflag
Per-frame processing suggestion flag present.
enum FrameCodingMode fcm
Frame decoding info for Advanced profile.
int interlace
Progressive/interlaced (RPTFTM syntax element)
uint8_t lumscale
Luma compensation parameters.
uint8_t lumscale2
for interlaced field P picture
int resync_marker
could this stream contain resync markers
int fastuvmc
Rounding of qpel vector to hpel ? (not in Simple)
int rangered
RANGEREDFRM (range reduction) syntax element present at frame level.
int vstransform
variable-size [48]x[48] transform type + info
DXVA_SliceInfo slice[MAX_SLICES]
const uint8_t * bitstream
#define avpriv_request_sample(...)
static AVFormatContext * ctx
@ PROGRESSIVE
in the bitstream is reported as 00b
@ ILACE_FIELD
in the bitstream is reported as 11b
@ ILACE_FRAME
in the bitstream is reported as 10b
@ MV_PMODE_INTENSITY_COMP
@ MV_PMODE_1MV_HPEL_BILIN