1 /*
2 * VP9 HW decode acceleration through VA API
3 *
4 * Copyright (C) 2015 Timo Rothenpieler <timo@rothenpieler.org>
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
24
28
30 {
31 if (vf)
33 else
34 return VA_INVALID_SURFACE;
35 }
36
40 {
43 VADecPictureParameterBufferVP9 pic_param;
45 int err, i;
46
48
49 pic_param = (VADecPictureParameterBufferVP9) {
50 .frame_width = avctx->
width,
51 .frame_height = avctx->
height,
52
53 .pic_fields.bits = {
66
70
71 .last_ref_frame = h->
h.
refidx[0],
72 .last_ref_frame_sign_bias = h->
h.
signbias[0],
73 .golden_ref_frame = h->
h.
refidx[1],
74 .golden_ref_frame_sign_bias = h->
h.
signbias[1],
75 .alt_ref_frame = h->
h.
refidx[2],
76 .alt_ref_frame_sign_bias = h->
h.
signbias[2],
78 },
79
84
87
89 .bit_depth = h->
h.
bpp,
90 };
91
92 for (i = 0; i < 7; i++)
94
96 for (i = 0; i < 3; i++)
98 } else {
99 memset(pic_param.segment_pred_probs, 255, sizeof(pic_param.segment_pred_probs));
100 }
101
102 for (i = 0; i < 8; i++) {
105 else
106 pic_param.reference_frames[i] = VA_INVALID_ID;
107 }
108
110 VAPictureParameterBufferType,
111 &pic_param, sizeof(pic_param));
112 if (err < 0) {
114 return err;
115 }
116
117 return 0;
118 }
119
121 {
124
126 }
127
131 {
134 VASliceParameterBufferVP9 slice_param;
135 int err, i;
136
137 slice_param = (VASliceParameterBufferVP9) {
138 .slice_data_size =
size,
139 .slice_data_offset = 0,
140 .slice_data_flag = VA_SLICE_DATA_FLAG_ALL,
141 };
142
143 for (i = 0; i < 8; i++) {
144 slice_param.seg_param[i] = (VASegmentParameterVP9) {
145 .segment_flags.fields = {
149 },
150
155 };
156
157 memcpy(slice_param.seg_param[i].filter_level, h->
h.
segmentation.
feat[i].lflvl,
sizeof(slice_param.seg_param[i].filter_level));
158 }
159
161 &slice_param, sizeof(slice_param),
162 buffer, size);
163 if (err) {
165 return err;
166 }
167
168 return 0;
169 }
170
185 };
const AVPixFmtDescriptor * av_pix_fmt_desc_get(enum AVPixelFormat pix_fmt)
AVBufferRef * buf[AV_NUM_DATA_POINTERS]
AVBuffer references backing the data for this frame.
static av_cold int init(AVCodecContext *avctx)
int ff_vaapi_decode_make_param_buffer(AVCodecContext *avctx, VAAPIDecodePicture *pic, int type, const void *data, size_t size)
static VASurfaceID ff_vaapi_get_surface_id(AVFrame *pic)
uint8_t log2_chroma_w
Amount to shift the luma width right to find the chroma width.
int ff_vaapi_common_frame_params(AVCodecContext *avctx, AVBufferRef *hw_frames_ctx)
int ff_vaapi_decode_uninit(AVCodecContext *avctx)
const AVHWAccel ff_vp9_vaapi_hwaccel
static av_cold int uninit(AVCodecContext *avctx)
int ff_vaapi_decode_issue(AVCodecContext *avctx, VAAPIDecodePicture *pic)
uint8_t log2_chroma_h
Amount to shift the luma height right to find the chroma height.
static VASurfaceID vaapi_vp9_surface_id(const VP9Frame *vf)
static int vaapi_vp9_end_frame(AVCodecContext *avctx)
void * hwaccel_picture_private
const char * name
Name of the hardware accelerated codec.
int ff_vaapi_decode_init(AVCodecContext *avctx)
int width
picture width / height.
VASurfaceID output_surface
Descriptor that unambiguously describes how the bits of a pixel are stored in the up to 4 data planes...
main external API structure.
int ff_vaapi_decode_cancel(AVCodecContext *avctx, VAAPIDecodePicture *pic)
static int vaapi_vp9_decode_slice(AVCodecContext *avctx, const uint8_t *buffer, uint32_t size)
#define HWACCEL_CAP_ASYNC_SAFE
int ff_vaapi_decode_make_slice_buffer(AVCodecContext *avctx, VAAPIDecodePicture *pic, const void *params_data, size_t params_size, const void *slice_data, size_t slice_size)
enum AVPixelFormat sw_pix_fmt
Nominal unaccelerated pixel format, see AV_PIX_FMT_xxx.
static int vaapi_vp9_start_frame(AVCodecContext *avctx, av_unused const uint8_t *buffer, av_unused uint32_t size)