28 DXVA_PicParams_H264
pp;
38 unsigned index,
unsigned flag)
40 assert((index&0x7f) == index && (flag&0x01) == flag);
41 pic->bPicEntry = index | (flag << 7);
45 DXVA_PicParams_H264 *
pp)
50 memset(pp, 0,
sizeof(*pp));
56 pp->UsedForReferenceFlags = 0;
57 pp->NonExistingFrameFlags = 0;
60 if (j < h->short_ref_count) {
64 while (!r && j < h->short_ref_count + 16)
79 pp->UsedForReferenceFlags |= 1 << (2*i + 0);
81 pp->UsedForReferenceFlags |= 1 << (2*i + 1);
83 pp->RefFrameList[
i].bPicEntry = 0xff;
84 pp->FieldOrderCntList[
i][0] = 0;
85 pp->FieldOrderCntList[
i][1] = 0;
86 pp->FrameNumList[
i] = 0;
90 pp->wFrameWidthInMbsMinus1 = h->
mb_width - 1;
91 pp->wFrameHeightInMbsMinus1 = h->
mb_height - 1;
117 pp->Reserved16Bits = 0;
119 pp->Reserved16Bits = 3;
120 pp->StatusReportFeedbackNumber = 1 + ctx->
report_id++;
121 pp->CurrFieldOrderCnt[0] = 0;
123 current_picture->
field_poc[0] != INT_MAX)
124 pp->CurrFieldOrderCnt[0] = current_picture->
field_poc[0];
125 pp->CurrFieldOrderCnt[1] = 0;
127 current_picture->
field_poc[1] != INT_MAX)
128 pp->CurrFieldOrderCnt[1] = current_picture->
field_poc[1];
129 pp->pic_init_qs_minus26 = h->
pps.
init_qs - 26;
132 pp->ContinuationFlag = 1;
133 pp->pic_init_qp_minus26 = h->
pps.
init_qp - 26;
134 pp->num_ref_idx_l0_active_minus1 = h->
pps.
ref_count[0] - 1;
135 pp->num_ref_idx_l1_active_minus1 = h->
pps.
ref_count[1] - 1;
136 pp->Reserved8BitsA = 0;
145 pp->entropy_coding_mode_flag = h->
pps.
cabac;
151 pp->Reserved8BitsB = 0;
152 pp->slice_group_change_rate_minus1= 0;
159 memset(qm, 0,
sizeof(*qm));
161 for (i = 0; i < 6; i++)
162 for (j = 0; j < 16; j++)
165 for (i = 0; i < 64; i++) {
170 for (i = 0; i < 6; i++)
171 for (j = 0; j < 16; j++)
174 for (i = 0; i < 64; i++) {
183 assert(ctx->
cfg->ConfigBitstreamRaw == 1 ||
184 ctx->
cfg->ConfigBitstreamRaw == 2);
185 return ctx->
cfg->ConfigBitstreamRaw == 2;
189 unsigned position,
unsigned size)
191 memset(slice, 0,
sizeof(*slice));
192 slice->BSNALunitDataLocation = position;
193 slice->SliceBytesInBuffer =
size;
194 slice->wBadSliceChopping = 0;
198 unsigned position,
unsigned size)
204 memset(slice, 0,
sizeof(*slice));
205 slice->BSNALunitDataLocation = position;
206 slice->SliceBytesInBuffer =
size;
207 slice->wBadSliceChopping = 0;
210 slice->NumMbsForSlice = 0;
214 slice->slice_type += 5;
218 slice->num_ref_idx_l0_active_minus1 = h->
ref_count[0] - 1;
220 slice->num_ref_idx_l1_active_minus1 = h->
ref_count[1] - 1;
223 slice->Reserved8Bits = 0;
225 for (list = 0; list < 2; list++) {
228 if (list < h->list_count && i < h->ref_count[list]) {
234 for (plane = 0; plane < 3; plane++) {
247 slice->Weights[
list][
i][plane][0] =
w;
248 slice->Weights[
list][
i][plane][1] = o;
252 slice->RefPicList[
list][
i].bPicEntry = 0xff;
253 for (plane = 0; plane < 3; plane++) {
254 slice->Weights[
list][
i][plane][0] = 0;
255 slice->Weights[
list][
i][plane][1] = 0;
260 slice->slice_qs_delta = 0;
274 DXVA2_DecodeBufferDesc *bs,
275 DXVA2_DecodeBufferDesc *sc)
292 DXVA2_BitStreamDateBufferType,
293 (
void **)&dxva_data, &dxva_size)))
296 end = dxva_data + dxva_size;
299 static const uint8_t start_code[] = { 0, 0, 1 };
300 static const unsigned start_code_size =
sizeof(start_code);
301 unsigned position,
size;
303 assert(offsetof(DXVA_Slice_H264_Short, BSNALunitDataLocation) ==
304 offsetof(DXVA_Slice_H264_Long, BSNALunitDataLocation));
305 assert(offsetof(DXVA_Slice_H264_Short, SliceBytesInBuffer) ==
306 offsetof(DXVA_Slice_H264_Long, SliceBytesInBuffer));
311 slice = (DXVA_Slice_H264_Short*)&ctx_pic->
slice_long[i];
313 position = slice->BSNALunitDataLocation;
314 size = slice->SliceBytesInBuffer;
315 if (start_code_size + size > end - current) {
320 slice->BSNALunitDataLocation = current - dxva_data;
321 slice->SliceBytesInBuffer = start_code_size +
size;
324 DXVA_Slice_H264_Long *
slice_long = (DXVA_Slice_H264_Long*)slice;
326 slice_long->NumMbsForSlice =
327 slice_long[1].first_mb_in_slice - slice_long[0].first_mb_in_slice;
329 slice_long->NumMbsForSlice = mb_count - slice_long->first_mb_in_slice;
332 memcpy(current, start_code, start_code_size);
333 current += start_code_size;
335 memcpy(current, &ctx_pic->
bitstream[position], size);
338 padding =
FFMIN(128 - ((current - dxva_data) & 127), end - current);
339 if (slice && padding > 0) {
340 memset(current, 0, padding);
343 slice->SliceBytesInBuffer += padding;
346 DXVA2_BitStreamDateBufferType)))
351 memset(bs, 0,
sizeof(*bs));
352 bs->CompressedBufferType = DXVA2_BitStreamDateBufferType;
353 bs->DataSize = current - dxva_data;
354 bs->NumMBsInBuffer = mb_count;
363 assert((bs->DataSize & 127) == 0);
365 DXVA2_SliceControlBufferType,
366 slice_data, slice_size, mb_count);
421 ctx_pic->
pp.wBitFields &= ~(1 << 15);
435 &ctx_pic->
pp,
sizeof(ctx_pic->
pp),
436 &ctx_pic->
qm,
sizeof(ctx_pic->
qm),
444 .
name =
"h264_dxva2",
#define PICT_BOTTOM_FIELD
int chroma_qp_index_offset[2]
int luma_weight_flag[2]
7.4.3.2 luma_weight_lX_flag
unsigned int ref_count[2]
num_ref_idx_l0/1_active_minus1 + 1
static int commit_bitstream_and_slice_buffer(AVCodecContext *avctx, DXVA2_DecodeBufferDesc *bs, DXVA2_DecodeBufferDesc *sc)
AVHWAccel ff_h264_dxva2_hwaccel
#define FF_ARRAY_ELEMS(a)
Filter the word “frame” indicates either a video frame or a group of audio as stored in an AVFilterBuffer structure Format for each input and each output the list of supported formats For video that means pixel format For audio that means channel sample they are references to shared objects When the negotiation mechanism computes the intersection of the formats supported at each end of a all references to both lists are replaced with a reference to the intersection And when a single format is eventually chosen for a link amongst the remaining list
const DXVA2_ConfigPictureDecode * cfg
DXVA2 configuration used to create the decoder.
output residual component w
unsigned surface_count
The number of surface in the surface array.
DXVA_SliceInfo slice[MAX_SLICES]
int long_ref
1->long term reference 0->short term reference
uint8_t scaling_matrix4[6][16]
int deblocking_filter_parameters_present
deblocking_filter_parameters_present_flag
void * hwaccel_context
Hardware accelerator context.
int luma_weight[48][2][2]
int bit_depth_chroma
bit_depth_chroma_minus8 + 8
Picture ref_list[2][48]
0..15: frame refs, 16..47: mbaff field refs.
int cabac
entropy_coding_mode_flag
unsigned int ref_count[2]
num_ref_idx_l0/1_active_minus1 + 1
static int get_bits_count(const GetBitContext *s)
int ff_h264_get_slice_type(const H264Context *h)
Reconstruct bitstream slice_type.
int redundant_pic_cnt_present
redundant_pic_cnt_present_flag
int luma_log2_weight_denom
int chroma_weight[48][2][2][2]
H.264 / AVC / MPEG4 part10 codec.
uint64_t workaround
A bit field configuring the workarounds needed for using the decoder.
int mb_aff
mb_adaptive_frame_field_flag
int poc_type
pic_order_cnt_type
int constrained_intra_pred
constrained_intra_pred_flag
int direct_spatial_mv_pred
int weighted_pred
weighted_pred_flag
void av_log(void *avcl, int level, const char *fmt,...)
int residual_color_transform_flag
residual_colour_transform_flag
int delta_pic_order_always_zero_flag
#define FIELD_OR_MBAFF_PICTURE(h)
uint8_t scaling_matrix8[6][64]
int ff_dxva2_common_end_frame(AVCodecContext *avctx, Picture *pic, const void *pp, unsigned pp_size, const void *qm, unsigned qm_size, int(*commit_bs_si)(AVCodecContext *, DXVA2_DecodeBufferDesc *bs, DXVA2_DecodeBufferDesc *slice))
static void fill_scaling_lists(struct dxva_context *ctx, const H264Context *h, DXVA_Qmatrix_H264 *qm)
int ref_frame_count
num_ref_frames
const char * name
Name of the hardware accelerated codec.
void * hwaccel_picture_private
hardware accelerator private data
int ff_dxva2_commit_buffer(AVCodecContext *avctx, struct dxva_context *ctx, DXVA2_DecodeBufferDesc *dsc, unsigned type, const void *data, unsigned size, unsigned mb_count)
int init_qp
pic_init_qp_minus26 + 26
int frame_num
h264 frame_num (raw frame_num from slice header)
int direct_8x8_inference_flag
#define FF_DXVA2_WORKAROUND_SCALING_LIST_ZIGZAG
Work around for DXVA2 and old UVD/UVD+ ATI video cards.
static int is_slice_short(struct dxva_context *ctx)
static void fill_picture_parameters(struct dxva_context *ctx, const H264Context *h, DXVA_PicParams_H264 *pp)
DXVA_Slice_H264_Long slice_long[MAX_SLICES]
unsigned report_id
Private to the FFmpeg AVHWAccel implementation.
int pic_order_present
pic_order_present_flag
int chroma_log2_weight_denom
static void fill_slice_short(DXVA_Slice_H264_Short *slice, unsigned position, unsigned size)
unsigned ff_dxva2_get_surface_index(const struct dxva_context *ctx, const Picture *picture)
H264 / AVC / MPEG4 part10 codec data table
int slice_alpha_c0_offset
static const uint8_t zigzag_scan[16+1]
main external API structure.
static void fill_slice_long(AVCodecContext *avctx, DXVA_Slice_H264_Long *slice, unsigned position, unsigned size)
#define AV_LOG_ERROR
Something went wrong and cannot losslessly be recovered.
synthesis window for stochastic i
int log2_max_poc_lsb
log2_max_pic_order_cnt_lsb_minus4
HW decoding through DXVA2, Picture.data[3] contains a LPDIRECT3DSURFACE9 pointer. ...
static int dxva2_h264_decode_slice(AVCodecContext *avctx, const uint8_t *buffer, uint32_t size)
void ff_h264_draw_horiz_band(H264Context *h, int y, int height)
int field_poc[2]
h264 top/bottom POC
int transform_8x8_mode
transform_8x8_mode_flag
const uint8_t * bitstream
int init_qs
pic_init_qs_minus26 + 26
const uint8_t ff_zigzag_direct[64]
int log2_max_frame_num
log2_max_frame_num_minus4 + 4
the buffer and buffer reference mechanism is intended to as much as expensive copies of that data while still allowing the filters to produce correct results The data is stored in buffers represented by AVFilterBuffer structures They must not be accessed but through references stored in AVFilterBufferRef structures Several references can point to the same buffer
int bit_depth_luma
bit_depth_luma_minus8 + 8
static int dxva2_h264_start_frame(AVCodecContext *avctx, av_unused const uint8_t *buffer, av_unused uint32_t size)
static int dxva2_h264_end_frame(AVCodecContext *avctx)
int pic_id
h264 pic_num (short -> no wrap version of pic_num, pic_num & max_pic_num; long -> long_pic_num) ...
int current_slice
current slice number, used to initialize slice_num of each thread/context
int slice_group_count
num_slice_groups_minus1 + 1
int chroma_weight_flag[2]
7.4.3.2 chroma_weight_lX_flag
IDirectXVideoDecoder * decoder
DXVA2 decoder object.
int deblocking_filter
disable_deblocking_filter_idc with 1 <-> 0
DXVA_Slice_H264_Short slice_short[MAX_SLICES]
static void fill_picture_entry(DXVA_PicEntry_H264 *pic, unsigned index, unsigned flag)
This structure is used to provides the necessary configurations and data to the DXVA2 FFmpeg HWAccel ...
int short_ref_count
number of actual short term references
int mb_slice_group_map_type