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 {
33 else
34 return VA_INVALID_SURFACE;
35 }
36
40 {
43 VADecPictureParameterBufferVP9 pic_param;
46
48
49 pic_param = (VADecPictureParameterBufferVP9) {
50 .frame_width = avctx->
width,
51 .frame_height = avctx->
height,
52
53 .pic_fields.bits = {
56 .frame_type = !
h->h.keyframe,
57 .show_frame = !
h->h.invisible,
58 .error_resilient_mode =
h->h.errorres,
59 .intra_only =
h->h.intraonly,
60 .allow_high_precision_mv =
h->h.keyframe ? 0 :
h->h.highprecisionmvs,
61 .mcomp_filter_type =
h->h.filtermode ^ (
h->h.filtermode <= 1),
62 .frame_parallel_decoding_mode =
h->h.parallelmode,
63 .reset_frame_context =
h->h.resetctx,
64 .refresh_frame_context =
h->h.refreshctx,
65 .frame_context_idx =
h->h.framectxid,
66
67 .segmentation_enabled =
h->h.segmentation.enabled,
68 .segmentation_temporal_update =
h->h.segmentation.temporal,
69 .segmentation_update_map =
h->h.segmentation.update_map,
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],
77 .lossless_flag =
h->h.lossless,
78 },
79
80 .filter_level =
h->h.filter.level,
81 .sharpness_level =
h->h.filter.sharpness,
82 .log2_tile_rows =
h->h.tiling.log2_tile_rows,
83 .log2_tile_columns =
h->h.tiling.log2_tile_cols,
84
85 .frame_header_length_in_bytes =
h->h.uncompressed_header_size,
86 .first_partition_size =
h->h.compressed_header_size,
87
88 .profile =
h->h.profile,
89 .bit_depth =
h->h.bpp,
90 };
91
92 for (
i = 0;
i < 7;
i++)
93 pic_param.mb_segment_tree_probs[
i] =
h->h.segmentation.prob[
i];
94
95 if (
h->h.segmentation.temporal) {
96 for (
i = 0;
i < 3;
i++)
97 pic_param.segment_pred_probs[
i] =
h->h.segmentation.pred_prob[
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;
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 = {
146 .segment_reference_enabled =
h->h.segmentation.feat[
i].ref_enabled,
147 .segment_reference =
h->h.segmentation.feat[
i].ref_val,
148 .segment_reference_skipped =
h->h.segmentation.feat[
i].skip_enabled,
149 },
150
151 .luma_dc_quant_scale =
h->h.segmentation.feat[
i].qmul[0][0],
152 .luma_ac_quant_scale =
h->h.segmentation.feat[
i].qmul[0][1],
153 .chroma_dc_quant_scale =
h->h.segmentation.feat[
i].qmul[1][0],
154 .chroma_ac_quant_scale =
h->h.segmentation.feat[
i].qmul[1][1],
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, 1, sizeof(slice_param),
163 if (err) {
165 return err;
166 }
167
168 return 0;
169 }
170
172 .
p.
name =
"vp9_vaapi",
185 };