FFmpeg
dxva2_vp9.c
Go to the documentation of this file.
1 /*
2  * DXVA2 VP9 HW acceleration.
3  *
4  * copyright (c) 2015 Hendrik Leppkes
5  *
6  * This file is part of FFmpeg.
7  *
8  * FFmpeg is free software; you can redistribute it and/or
9  * modify it under the terms of the GNU Lesser General Public
10  * License as published by the Free Software Foundation; either
11  * version 2.1 of the License, or (at your option) any later version.
12  *
13  * FFmpeg is distributed in the hope that it will be useful,
14  * but WITHOUT ANY WARRANTY; without even the implied warranty of
15  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
16  * Lesser General Public License for more details.
17  *
18  * You should have received a copy of the GNU Lesser General Public
19  * License along with FFmpeg; if not, write to the Free Software
20  * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
21  */
22 
23 #include "config_components.h"
24 
25 #include "libavutil/avassert.h"
26 #include "libavutil/pixdesc.h"
27 
28 #include "dxva2_internal.h"
29 #include "hwaccel_internal.h"
30 #include "vp9shared.h"
31 
33  DXVA_PicParams_VP9 pp;
34  DXVA_Slice_VPx_Short slice;
35  const uint8_t *bitstream;
36  unsigned bitstream_size;
37 };
38 
39 static void fill_picture_entry(DXVA_PicEntry_VPx *pic,
40  unsigned index, unsigned flag)
41 {
42  av_assert0((index & 0x7f) == index && (flag & 0x01) == flag);
43  pic->bPicEntry = index | (flag << 7);
44 }
45 
47  DXVA_PicParams_VP9 *pp)
48 {
49  int i;
50  const AVPixFmtDescriptor * pixdesc = av_pix_fmt_desc_get(avctx->sw_pix_fmt);
51 
52  if (!pixdesc)
53  return -1;
54 
55  memset(pp, 0, sizeof(*pp));
56 
57  fill_picture_entry(&pp->CurrPic, ff_dxva2_get_surface_index(avctx, ctx, h->frames[CUR_FRAME].tf.f), 0);
58 
59  pp->profile = h->h.profile;
60  pp->wFormatAndPictureInfoFlags = ((h->h.keyframe == 0) << 0) |
61  ((h->h.invisible == 0) << 1) |
62  (h->h.errorres << 2) |
63  (pixdesc->log2_chroma_w << 3) | /* subsampling_x */
64  (pixdesc->log2_chroma_h << 4) | /* subsampling_y */
65  (0 << 5) | /* extra_plane */
66  (h->h.refreshctx << 6) |
67  (h->h.parallelmode << 7) |
68  (h->h.intraonly << 8) |
69  (h->h.framectxid << 9) |
70  (h->h.resetctx << 11) |
71  ((h->h.keyframe ? 0 : h->h.highprecisionmvs) << 13) |
72  (0 << 14); /* ReservedFormatInfo2Bits */
73 
74  pp->width = avctx->width;
75  pp->height = avctx->height;
76  pp->BitDepthMinus8Luma = pixdesc->comp[0].depth - 8;
77  pp->BitDepthMinus8Chroma = pixdesc->comp[1].depth - 8;
78  /* swap 0/1 to match the reference */
79  pp->interp_filter = h->h.filtermode ^ (h->h.filtermode <= 1);
80  pp->Reserved8Bits = 0;
81 
82  for (i = 0; i < 8; i++) {
83  if (h->refs[i].f->buf[0]) {
84  fill_picture_entry(&pp->ref_frame_map[i], ff_dxva2_get_surface_index(avctx, ctx, h->refs[i].f), 0);
85  pp->ref_frame_coded_width[i] = h->refs[i].f->width;
86  pp->ref_frame_coded_height[i] = h->refs[i].f->height;
87  } else
88  pp->ref_frame_map[i].bPicEntry = 0xFF;
89  }
90 
91  for (i = 0; i < 3; i++) {
92  uint8_t refidx = h->h.refidx[i];
93  if (h->refs[refidx].f->buf[0])
94  fill_picture_entry(&pp->frame_refs[i], ff_dxva2_get_surface_index(avctx, ctx, h->refs[refidx].f), 0);
95  else
96  pp->frame_refs[i].bPicEntry = 0xFF;
97 
98  pp->ref_frame_sign_bias[i + 1] = h->h.signbias[i];
99  }
100 
101  pp->filter_level = h->h.filter.level;
102  pp->sharpness_level = h->h.filter.sharpness;
103 
104  pp->wControlInfoFlags = (h->h.lf_delta.enabled << 0) |
105  (h->h.lf_delta.updated << 1) |
106  (h->h.use_last_frame_mvs << 2) |
107  (0 << 3); /* ReservedControlInfo5Bits */
108 
109  for (i = 0; i < 4; i++)
110  pp->ref_deltas[i] = h->h.lf_delta.ref[i];
111 
112  for (i = 0; i < 2; i++)
113  pp->mode_deltas[i] = h->h.lf_delta.mode[i];
114 
115  pp->base_qindex = h->h.yac_qi;
116  pp->y_dc_delta_q = h->h.ydc_qdelta;
117  pp->uv_dc_delta_q = h->h.uvdc_qdelta;
118  pp->uv_ac_delta_q = h->h.uvac_qdelta;
119 
120  /* segmentation data */
121  pp->stVP9Segments.wSegmentInfoFlags = (h->h.segmentation.enabled << 0) |
122  (h->h.segmentation.update_map << 1) |
123  (h->h.segmentation.temporal << 2) |
124  (h->h.segmentation.absolute_vals << 3) |
125  (0 << 4); /* ReservedSegmentFlags4Bits */
126 
127  for (i = 0; i < 7; i++)
128  pp->stVP9Segments.tree_probs[i] = h->h.segmentation.prob[i];
129 
130  if (h->h.segmentation.temporal)
131  for (i = 0; i < 3; i++)
132  pp->stVP9Segments.pred_probs[i] = h->h.segmentation.pred_prob[i];
133  else
134  memset(pp->stVP9Segments.pred_probs, 255, sizeof(pp->stVP9Segments.pred_probs));
135 
136  for (i = 0; i < 8; i++) {
137  pp->stVP9Segments.feature_mask[i] = (h->h.segmentation.feat[i].q_enabled << 0) |
138  (h->h.segmentation.feat[i].lf_enabled << 1) |
139  (h->h.segmentation.feat[i].ref_enabled << 2) |
140  (h->h.segmentation.feat[i].skip_enabled << 3);
141 
142  pp->stVP9Segments.feature_data[i][0] = h->h.segmentation.feat[i].q_val;
143  pp->stVP9Segments.feature_data[i][1] = h->h.segmentation.feat[i].lf_val;
144  pp->stVP9Segments.feature_data[i][2] = h->h.segmentation.feat[i].ref_val;
145  pp->stVP9Segments.feature_data[i][3] = 0; /* no data for skip */
146  }
147 
148  pp->log2_tile_cols = h->h.tiling.log2_tile_cols;
149  pp->log2_tile_rows = h->h.tiling.log2_tile_rows;
150 
151  pp->uncompressed_header_size_byte_aligned = h->h.uncompressed_header_size;
152  pp->first_partition_size = h->h.compressed_header_size;
153 
154  pp->StatusReportFeedbackNumber = 1 + DXVA_CONTEXT_REPORT_ID(avctx, ctx)++;
155  return 0;
156 }
157 
158 static void fill_slice_short(DXVA_Slice_VPx_Short *slice,
159  unsigned position, unsigned size)
160 {
161  memset(slice, 0, sizeof(*slice));
162  slice->BSNALunitDataLocation = position;
163  slice->SliceBytesInBuffer = size;
164  slice->wBadSliceChopping = 0;
165 }
166 
170 {
171  const VP9SharedContext *h = avctx->priv_data;
172  AVDXVAContext *ctx = DXVA_CONTEXT(avctx);
173  struct vp9_dxva2_picture_context *ctx_pic = h->frames[CUR_FRAME].hwaccel_picture_private;
174  void *dxva_data_ptr;
175  uint8_t *dxva_data;
176  unsigned dxva_size;
177  unsigned padding;
178  unsigned type;
179 
180 #if CONFIG_D3D11VA
181  if (ff_dxva2_is_d3d11(avctx)) {
182  type = D3D11_VIDEO_DECODER_BUFFER_BITSTREAM;
183  if (FAILED(ID3D11VideoContext_GetDecoderBuffer(D3D11VA_CONTEXT(ctx)->video_context,
185  type,
186  &dxva_size, &dxva_data_ptr)))
187  return -1;
188  }
189 #endif
190 #if CONFIG_DXVA2
191  if (avctx->pix_fmt == AV_PIX_FMT_DXVA2_VLD) {
192  type = DXVA2_BitStreamDateBufferType;
193  if (FAILED(IDirectXVideoDecoder_GetBuffer(DXVA2_CONTEXT(ctx)->decoder,
194  type,
195  &dxva_data_ptr, &dxva_size)))
196  return -1;
197  }
198 #endif
199 
200  dxva_data = dxva_data_ptr;
201 
202  if (ctx_pic->slice.SliceBytesInBuffer > dxva_size) {
203  av_log(avctx, AV_LOG_ERROR, "Failed to build bitstream");
204  return -1;
205  }
206 
207  memcpy(dxva_data, ctx_pic->bitstream, ctx_pic->slice.SliceBytesInBuffer);
208 
209  padding = FFMIN(128 - ((ctx_pic->slice.SliceBytesInBuffer) & 127), dxva_size - ctx_pic->slice.SliceBytesInBuffer);
210  if (padding > 0) {
211  memset(dxva_data + ctx_pic->slice.SliceBytesInBuffer, 0, padding);
212  ctx_pic->slice.SliceBytesInBuffer += padding;
213  }
214 
215 #if CONFIG_D3D11VA
216  if (ff_dxva2_is_d3d11(avctx))
217  if (FAILED(ID3D11VideoContext_ReleaseDecoderBuffer(D3D11VA_CONTEXT(ctx)->video_context, D3D11VA_CONTEXT(ctx)->decoder, type)))
218  return -1;
219 #endif
220 #if CONFIG_DXVA2
221  if (avctx->pix_fmt == AV_PIX_FMT_DXVA2_VLD)
222  if (FAILED(IDirectXVideoDecoder_ReleaseBuffer(DXVA2_CONTEXT(ctx)->decoder, type)))
223  return -1;
224 #endif
225 
226 #if CONFIG_D3D11VA
227  if (ff_dxva2_is_d3d11(avctx)) {
228  D3D11_VIDEO_DECODER_BUFFER_DESC *dsc11 = bs;
229  memset(dsc11, 0, sizeof(*dsc11));
230  dsc11->BufferType = type;
231  dsc11->DataSize = ctx_pic->slice.SliceBytesInBuffer;
232  dsc11->NumMBsInBuffer = 0;
233 
234  type = D3D11_VIDEO_DECODER_BUFFER_SLICE_CONTROL;
235  }
236 #endif
237 #if CONFIG_DXVA2
238  if (avctx->pix_fmt == AV_PIX_FMT_DXVA2_VLD) {
239  DXVA2_DecodeBufferDesc *dsc2 = bs;
240  memset(dsc2, 0, sizeof(*dsc2));
241  dsc2->CompressedBufferType = type;
242  dsc2->DataSize = ctx_pic->slice.SliceBytesInBuffer;
243  dsc2->NumMBsInBuffer = 0;
244 
245  type = DXVA2_SliceControlBufferType;
246  }
247 #endif
248 
249  return ff_dxva2_commit_buffer(avctx, ctx, sc,
250  type,
251  &ctx_pic->slice, sizeof(ctx_pic->slice), 0);
252 }
253 
254 
256  av_unused const uint8_t *buffer,
257  av_unused uint32_t size)
258 {
259  const VP9SharedContext *h = avctx->priv_data;
260  AVDXVAContext *ctx = DXVA_CONTEXT(avctx);
261  struct vp9_dxva2_picture_context *ctx_pic = h->frames[CUR_FRAME].hwaccel_picture_private;
262 
263  if (!DXVA_CONTEXT_VALID(avctx, ctx))
264  return -1;
265  av_assert0(ctx_pic);
266 
267  /* Fill up DXVA_PicParams_VP9 */
268  if (fill_picture_parameters(avctx, ctx, h, &ctx_pic->pp) < 0)
269  return -1;
270 
271  ctx_pic->bitstream_size = 0;
272  ctx_pic->bitstream = NULL;
273  return 0;
274 }
275 
277  const uint8_t *buffer,
278  uint32_t size)
279 {
280  const VP9SharedContext *h = avctx->priv_data;
281  struct vp9_dxva2_picture_context *ctx_pic = h->frames[CUR_FRAME].hwaccel_picture_private;
282  unsigned position;
283 
284  if (!ctx_pic->bitstream)
285  ctx_pic->bitstream = buffer;
286  ctx_pic->bitstream_size += size;
287 
288  position = buffer - ctx_pic->bitstream;
289  fill_slice_short(&ctx_pic->slice, position, size);
290 
291  return 0;
292 }
293 
295 {
296  VP9SharedContext *h = avctx->priv_data;
297  struct vp9_dxva2_picture_context *ctx_pic = h->frames[CUR_FRAME].hwaccel_picture_private;
298  int ret;
299 
300  if (ctx_pic->bitstream_size <= 0)
301  return -1;
302 
303  ret = ff_dxva2_common_end_frame(avctx, h->frames[CUR_FRAME].tf.f,
304  &ctx_pic->pp, sizeof(ctx_pic->pp),
305  NULL, 0,
307  return ret;
308 }
309 
310 #if CONFIG_VP9_DXVA2_HWACCEL
312  .p.name = "vp9_dxva2",
313  .p.type = AVMEDIA_TYPE_VIDEO,
314  .p.id = AV_CODEC_ID_VP9,
315  .p.pix_fmt = AV_PIX_FMT_DXVA2_VLD,
316  .init = ff_dxva2_decode_init,
317  .uninit = ff_dxva2_decode_uninit,
318  .start_frame = dxva2_vp9_start_frame,
319  .decode_slice = dxva2_vp9_decode_slice,
320  .end_frame = dxva2_vp9_end_frame,
321  .frame_params = ff_dxva2_common_frame_params,
322  .frame_priv_data_size = sizeof(struct vp9_dxva2_picture_context),
323  .priv_data_size = sizeof(FFDXVASharedContext),
324 };
325 #endif
326 
327 #if CONFIG_VP9_D3D11VA_HWACCEL
329  .p.name = "vp9_d3d11va",
330  .p.type = AVMEDIA_TYPE_VIDEO,
331  .p.id = AV_CODEC_ID_VP9,
332  .p.pix_fmt = AV_PIX_FMT_D3D11VA_VLD,
333  .init = ff_dxva2_decode_init,
334  .uninit = ff_dxva2_decode_uninit,
335  .start_frame = dxva2_vp9_start_frame,
336  .decode_slice = dxva2_vp9_decode_slice,
337  .end_frame = dxva2_vp9_end_frame,
338  .frame_params = ff_dxva2_common_frame_params,
339  .frame_priv_data_size = sizeof(struct vp9_dxva2_picture_context),
340  .priv_data_size = sizeof(FFDXVASharedContext),
341 };
342 #endif
343 
344 #if CONFIG_VP9_D3D11VA2_HWACCEL
346  .p.name = "vp9_d3d11va2",
347  .p.type = AVMEDIA_TYPE_VIDEO,
348  .p.id = AV_CODEC_ID_VP9,
349  .p.pix_fmt = AV_PIX_FMT_D3D11,
350  .init = ff_dxva2_decode_init,
351  .uninit = ff_dxva2_decode_uninit,
352  .start_frame = dxva2_vp9_start_frame,
353  .decode_slice = dxva2_vp9_decode_slice,
354  .end_frame = dxva2_vp9_end_frame,
355  .frame_params = ff_dxva2_common_frame_params,
356  .frame_priv_data_size = sizeof(struct vp9_dxva2_picture_context),
357  .priv_data_size = sizeof(FFDXVASharedContext),
358 };
359 #endif
fill_picture_entry
static void fill_picture_entry(DXVA_PicEntry_VPx *pic, unsigned index, unsigned flag)
Definition: dxva2_vp9.c:39
av_pix_fmt_desc_get
const AVPixFmtDescriptor * av_pix_fmt_desc_get(enum AVPixelFormat pix_fmt)
Definition: pixdesc.c:2964
av_unused
#define av_unused
Definition: attributes.h:131
FFHWAccel::p
AVHWAccel p
The public AVHWAccel.
Definition: hwaccel_internal.h:38
pixdesc.h
AVComponentDescriptor::depth
int depth
Number of bits in the component.
Definition: pixdesc.h:57
ff_dxva2_common_end_frame
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))
Definition: dxva2.c:886
AV_PIX_FMT_D3D11VA_VLD
@ AV_PIX_FMT_D3D11VA_VLD
HW decoding through Direct3D11 via old API, Picture.data[3] contains a ID3D11VideoDecoderOutputView p...
Definition: pixfmt.h:247
ff_vp9_d3d11va2_hwaccel
const struct FFHWAccel ff_vp9_d3d11va2_hwaccel
decoder
static const chunk_decoder decoder[8]
Definition: dfa.c:331
FFHWAccel
Definition: hwaccel_internal.h:34
commit_bitstream_and_slice_buffer
static int commit_bitstream_and_slice_buffer(AVCodecContext *avctx, DECODER_BUFFER_DESC *bs, DECODER_BUFFER_DESC *sc)
Definition: dxva2_vp9.c:167
type
it s the only field you need to keep assuming you have a context There is some magic you don t need to care about around this just let it vf type
Definition: writing_filters.txt:86
vp9shared.h
avassert.h
AV_LOG_ERROR
#define AV_LOG_ERROR
Something went wrong and cannot losslessly be recovered.
Definition: log.h:180
DXVA2_CONTEXT
#define DXVA2_CONTEXT(ctx)
Definition: dxva2_internal.h:102
AV_PIX_FMT_DXVA2_VLD
@ AV_PIX_FMT_DXVA2_VLD
HW decoding through DXVA2, Picture.data[3] contains a LPDIRECT3DSURFACE9 pointer.
Definition: pixfmt.h:127
VP9SharedContext
Definition: vp9shared.h:164
AV_CODEC_ID_VP9
@ AV_CODEC_ID_VP9
Definition: codec_id.h:220
av_assert0
#define av_assert0(cond)
assert() equivalent, that is always enabled.
Definition: avassert.h:40
DXVA_CONTEXT
#define DXVA_CONTEXT(avctx)
Definition: dxva2_internal.h:99
ctx
AVFormatContext * ctx
Definition: movenc.c:48
AVPixFmtDescriptor::log2_chroma_w
uint8_t log2_chroma_w
Amount to shift the luma width right to find the chroma width.
Definition: pixdesc.h:80
vp9_dxva2_picture_context::bitstream
const uint8_t * bitstream
Definition: dxva2_vp9.c:35
dxva2_internal.h
if
if(ret)
Definition: filter_design.txt:179
NULL
#define NULL
Definition: coverity.c:32
ff_dxva2_decode_init
int ff_dxva2_decode_init(AVCodecContext *avctx)
Definition: dxva2.c:655
hwaccel_internal.h
vp9_dxva2_picture_context::pp
DXVA_PicParams_VP9 pp
Definition: dxva2_vp9.c:33
FFDXVASharedContext
Definition: dxva2_internal.h:67
ff_vp9_dxva2_hwaccel
const struct FFHWAccel ff_vp9_dxva2_hwaccel
dxva2_vp9_start_frame
static int dxva2_vp9_start_frame(AVCodecContext *avctx, av_unused const uint8_t *buffer, av_unused uint32_t size)
Definition: dxva2_vp9.c:255
index
int index
Definition: gxfenc.c:89
fill_picture_parameters
static int fill_picture_parameters(const AVCodecContext *avctx, AVDXVAContext *ctx, const VP9SharedContext *h, DXVA_PicParams_VP9 *pp)
Definition: dxva2_vp9.c:46
dxva2_vp9_decode_slice
static int dxva2_vp9_decode_slice(AVCodecContext *avctx, const uint8_t *buffer, uint32_t size)
Definition: dxva2_vp9.c:276
for
for(k=2;k<=8;++k)
Definition: h264pred_template.c:425
size
int size
Definition: twinvq_data.h:10344
AVDXVAContext
Definition: dxva2_internal.h:58
DECODER_BUFFER_DESC
void DECODER_BUFFER_DESC
Definition: dxva2_internal.h:56
AV_PIX_FMT_D3D11
@ AV_PIX_FMT_D3D11
Hardware surfaces for Direct3D11.
Definition: pixfmt.h:333
AVHWAccel::name
const char * name
Name of the hardware accelerated codec.
Definition: avcodec.h:2135
flag
#define flag(name)
Definition: cbs_av1.c:466
D3D11VA_CONTEXT
#define D3D11VA_CONTEXT(ctx)
Definition: dxva2_internal.h:101
i
#define i(width, name, range_min, range_max)
Definition: cbs_h2645.c:255
vp9_dxva2_picture_context::slice
DXVA_Slice_VPx_Short slice
Definition: dxva2_vp9.c:34
FFMIN
#define FFMIN(a, b)
Definition: macros.h:49
vp9_dxva2_picture_context::bitstream_size
unsigned bitstream_size
Definition: dxva2_vp9.c:36
ff_dxva2_commit_buffer
int ff_dxva2_commit_buffer(AVCodecContext *avctx, AVDXVAContext *ctx, DECODER_BUFFER_DESC *dsc, unsigned type, const void *data, unsigned size, unsigned mb_count)
Definition: dxva2.c:797
vp9_dxva2_picture_context
Definition: dxva2_vp9.c:32
AVCodecContext::height
int height
Definition: avcodec.h:621
AVCodecContext::pix_fmt
enum AVPixelFormat pix_fmt
Pixel format, see AV_PIX_FMT_xxx.
Definition: avcodec.h:658
ff_dxva2_get_surface_index
unsigned ff_dxva2_get_surface_index(const AVCodecContext *avctx, const AVDXVAContext *ctx, const AVFrame *frame)
Definition: dxva2.c:770
ff_dxva2_common_frame_params
int ff_dxva2_common_frame_params(AVCodecContext *avctx, AVBufferRef *hw_frames_ctx)
Definition: dxva2.c:592
fill_slice_short
static void fill_slice_short(DXVA_Slice_VPx_Short *slice, unsigned position, unsigned size)
Definition: dxva2_vp9.c:158
ret
ret
Definition: filter_design.txt:187
AVCodecContext
main external API structure.
Definition: avcodec.h:441
buffer
the frame and frame 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 AVFrame structures Several references can point to the same frame buffer
Definition: filter_design.txt:49
ff_dxva2_is_d3d11
int ff_dxva2_is_d3d11(const AVCodecContext *avctx)
Definition: dxva2.c:1051
AVPixFmtDescriptor::comp
AVComponentDescriptor comp[4]
Parameters that describe how pixels are packed.
Definition: pixdesc.h:105
ff_vp9_d3d11va_hwaccel
const struct FFHWAccel ff_vp9_d3d11va_hwaccel
AVMEDIA_TYPE_VIDEO
@ AVMEDIA_TYPE_VIDEO
Definition: avutil.h:201
ff_dxva2_decode_uninit
int ff_dxva2_decode_uninit(AVCodecContext *avctx)
Definition: dxva2.c:730
CUR_FRAME
#define CUR_FRAME
Definition: vp9shared.h:168
AVPixFmtDescriptor
Descriptor that unambiguously describes how the bits of a pixel are stored in the up to 4 data planes...
Definition: pixdesc.h:69
AVCodecContext::priv_data
void * priv_data
Definition: avcodec.h:468
AVCodecContext::width
int width
picture width / height.
Definition: avcodec.h:621
av_log
#define av_log(a,...)
Definition: tableprint_vlc.h:27
h
h
Definition: vp9dsp_template.c:2038
AVCodecContext::sw_pix_fmt
enum AVPixelFormat sw_pix_fmt
Nominal unaccelerated pixel format, see AV_PIX_FMT_xxx.
Definition: avcodec.h:1810
AVPixFmtDescriptor::log2_chroma_h
uint8_t log2_chroma_h
Amount to shift the luma height right to find the chroma height.
Definition: pixdesc.h:89
dxva2_vp9_end_frame
static int dxva2_vp9_end_frame(AVCodecContext *avctx)
Definition: dxva2_vp9.c:294