1 /*
2 * This file is part of FFmpeg.
3 *
4 * FFmpeg is free software; you can redistribute it and/or
5 * modify it under the terms of the GNU Lesser General Public
6 * License as published by the Free Software Foundation; either
7 * version 2.1 of the License, or (at your option) any later version.
8 *
9 * FFmpeg is distributed in the hope that it will be useful,
10 * but WITHOUT ANY WARRANTY; without even the implied warranty of
11 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
12 * Lesser General Public License for more details.
13 *
14 * You should have received a copy of the GNU Lesser General Public
15 * License along with FFmpeg; if not, write to the Free Software
16 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
17 */
18
19 /**
20 * @file
21 * VPP video filter with AMF hardware acceleration
22 */
23
24 #include <stdio.h>
25 #include <string.h>
26
32
36
37 #include "AMF/components/VideoConverter.h"
39
45
46 #if CONFIG_DXVA2
47 #include <d3d9.h>
48 #endif
49
50 #if CONFIG_D3D11VA
51 #include <d3d11.h>
52 #endif
53
55 {
71 };
80 };
81 output_pix_fmts = output_pix_fmts_default;
82
84 }
85
87 {
93 int err;
94 AMF_RESULT res;
95 enum AMF_VIDEO_CONVERTER_COLOR_PROFILE_ENUM amf_color_profile;
97
99 if (err < 0)
100 return err;
101 // FIXME: add checks whether we have HW context
103 res =
ctx->amf_device_ctx->factory->pVtbl->CreateComponent(
ctx->amf_device_ctx->factory,
ctx->amf_device_ctx->context, AMFVideoConverter, &
ctx->component);
105 // FIXME: add checks whether we have HW context
108
111 AMF_ASSIGN_PROPERTY_SIZE(res,
ctx->component, AMF_VIDEO_CONVERTER_OUTPUT_SIZE,
out_size);
113
114 AMF_ASSIGN_PROPERTY_INT64(res,
ctx->component, AMF_VIDEO_CONVERTER_SCALE, (amf_int32)
ctx->scale_type);
116
117 amf_color_profile = AMF_VIDEO_CONVERTER_COLOR_PROFILE_UNKNOWN;
118
119 switch(
ctx->color_profile) {
120 case AMF_VIDEO_CONVERTER_COLOR_PROFILE_601:
121 if (
ctx->color_range == AMF_COLOR_RANGE_FULL) {
122 amf_color_profile = AMF_VIDEO_CONVERTER_COLOR_PROFILE_FULL_601;
123 } else {
124 amf_color_profile = AMF_VIDEO_CONVERTER_COLOR_PROFILE_601;
125 }
126 break;
127 case AMF_VIDEO_CONVERTER_COLOR_PROFILE_709:
128 if (
ctx->color_range == AMF_COLOR_RANGE_FULL) {
129 amf_color_profile = AMF_VIDEO_CONVERTER_COLOR_PROFILE_FULL_709;
130 } else {
131 amf_color_profile = AMF_VIDEO_CONVERTER_COLOR_PROFILE_709;
132 }
133 break;
134 case AMF_VIDEO_CONVERTER_COLOR_PROFILE_2020:
135 if (
ctx->color_range == AMF_COLOR_RANGE_FULL) {
136 amf_color_profile = AMF_VIDEO_CONVERTER_COLOR_PROFILE_FULL_2020;
137 } else {
138 amf_color_profile = AMF_VIDEO_CONVERTER_COLOR_PROFILE_2020;
139 }
140 break;
141 default:
142 amf_color_profile = AMF_VIDEO_CONVERTER_COLOR_PROFILE_UNKNOWN;
143 break;
144 }
145
146 if (amf_color_profile != AMF_VIDEO_CONVERTER_COLOR_PROFILE_UNKNOWN) {
147 AMF_ASSIGN_PROPERTY_INT64(res,
ctx->component, AMF_VIDEO_CONVERTER_COLOR_PROFILE, amf_color_profile);
148 }
149
150 if (
ctx->color_range != AMF_COLOR_RANGE_UNDEFINED) {
151 AMF_ASSIGN_PROPERTY_INT64(res,
ctx->component, AMF_VIDEO_CONVERTER_OUTPUT_COLOR_RANGE,
ctx->color_range);
152 }
153
154 if (
ctx->primaries != AMF_COLOR_PRIMARIES_UNDEFINED) {
155 AMF_ASSIGN_PROPERTY_INT64(res,
ctx->component, AMF_VIDEO_CONVERTER_OUTPUT_COLOR_PRIMARIES,
ctx->primaries);
156 }
157
158 if (
ctx->trc != AMF_COLOR_TRANSFER_CHARACTERISTIC_UNDEFINED) {
159 AMF_ASSIGN_PROPERTY_INT64(res,
ctx->component, AMF_VIDEO_CONVERTER_OUTPUT_TRANSFER_CHARACTERISTIC,
ctx->trc);
160 }
161
164
165 return 0;
166 }
167
168 #define OFFSET(x) offsetof(AMFFilterContext, x)
169 #define FLAGS AV_OPT_FLAG_VIDEO_PARAM|AV_OPT_FLAG_FILTERING_PARAM
174
175 {
"scale_type",
"Scale type",
OFFSET(scale_type),
AV_OPT_TYPE_INT, { .i64 = AMF_VIDEO_CONVERTER_SCALE_BILINEAR }, AMF_VIDEO_CONVERTER_SCALE_BILINEAR, AMF_VIDEO_CONVERTER_SCALE_BICUBIC,
FLAGS,
"scale_type" },
176 {
"bilinear",
"Bilinear", 0,
AV_OPT_TYPE_CONST, { .i64 = AMF_VIDEO_CONVERTER_SCALE_BILINEAR }, 0, 0,
FLAGS,
"scale_type" },
177 {
"bicubic",
"Bicubic", 0,
AV_OPT_TYPE_CONST, { .i64 = AMF_VIDEO_CONVERTER_SCALE_BICUBIC }, 0, 0,
FLAGS,
"scale_type" },
178
179 {
"color_profile",
"Color profile",
OFFSET(color_profile),
AV_OPT_TYPE_INT, { .i64 = AMF_VIDEO_CONVERTER_COLOR_PROFILE_UNKNOWN }, AMF_VIDEO_CONVERTER_COLOR_PROFILE_UNKNOWN, AMF_VIDEO_CONVERTER_COLOR_PROFILE_FULL_2020,
FLAGS,
"color_profile" },
180 {
"bt601",
"BT.601", 0,
AV_OPT_TYPE_CONST, { .i64 = AMF_VIDEO_CONVERTER_COLOR_PROFILE_601 }, 0, 0,
FLAGS,
"color_profile" },
181 {
"bt709",
"BT.709", 0,
AV_OPT_TYPE_CONST, { .i64 = AMF_VIDEO_CONVERTER_COLOR_PROFILE_709 }, 0, 0,
FLAGS,
"color_profile" },
182 {
"bt2020",
"BT.2020", 0,
AV_OPT_TYPE_CONST, { .i64 = AMF_VIDEO_CONVERTER_COLOR_PROFILE_2020 }, 0, 0,
FLAGS,
"color_profile" },
183
185 {
"studio",
"Studio", 0,
AV_OPT_TYPE_CONST, { .i64 = AMF_COLOR_RANGE_STUDIO }, 0, 0,
FLAGS,
"color_range" },
187
188 {
"primaries",
"Output color primaries",
OFFSET(
primaries),
AV_OPT_TYPE_INT, { .i64 = AMF_COLOR_PRIMARIES_UNDEFINED }, AMF_COLOR_PRIMARIES_UNDEFINED, AMF_COLOR_PRIMARIES_JEDEC_P22,
FLAGS,
"primaries" },
189 {
"bt709",
"BT.709", 0,
AV_OPT_TYPE_CONST, { .i64 = AMF_COLOR_PRIMARIES_BT709 }, 0, 0,
FLAGS,
"primaries" },
190 {
"bt470m",
"BT.470M", 0,
AV_OPT_TYPE_CONST, { .i64 = AMF_COLOR_PRIMARIES_BT470M }, 0, 0,
FLAGS,
"primaries" },
191 {
"bt470bg",
"BT.470BG", 0,
AV_OPT_TYPE_CONST, { .i64 = AMF_COLOR_PRIMARIES_BT470BG }, 0, 0,
FLAGS,
"primaries" },
192 {
"smpte170m",
"SMPTE170M", 0,
AV_OPT_TYPE_CONST, { .i64 = AMF_COLOR_PRIMARIES_SMPTE170M }, 0, 0,
FLAGS,
"primaries" },
193 {
"smpte240m",
"SMPTE240M", 0,
AV_OPT_TYPE_CONST, { .i64 = AMF_COLOR_PRIMARIES_SMPTE240M }, 0, 0,
FLAGS,
"primaries" },
195 {
"bt2020",
"BT2020", 0,
AV_OPT_TYPE_CONST, { .i64 = AMF_COLOR_PRIMARIES_BT2020 }, 0, 0,
FLAGS,
"primaries" },
196 {
"smpte428",
"SMPTE428", 0,
AV_OPT_TYPE_CONST, { .i64 = AMF_COLOR_PRIMARIES_SMPTE428 }, 0, 0,
FLAGS,
"primaries" },
197 {
"smpte431",
"SMPTE431", 0,
AV_OPT_TYPE_CONST, { .i64 = AMF_COLOR_PRIMARIES_SMPTE431 }, 0, 0,
FLAGS,
"primaries" },
198 {
"smpte432",
"SMPTE432", 0,
AV_OPT_TYPE_CONST, { .i64 = AMF_COLOR_PRIMARIES_SMPTE432 }, 0, 0,
FLAGS,
"primaries" },
199 {
"jedec-p22",
"JEDEC_P22", 0,
AV_OPT_TYPE_CONST, { .i64 = AMF_COLOR_PRIMARIES_JEDEC_P22 }, 0, 0,
FLAGS,
"primaries" },
200
201 {
"trc",
"Output transfer characteristics",
OFFSET(trc),
AV_OPT_TYPE_INT, { .i64 = AMF_COLOR_TRANSFER_CHARACTERISTIC_UNDEFINED }, AMF_COLOR_TRANSFER_CHARACTERISTIC_UNDEFINED, AMF_COLOR_TRANSFER_CHARACTERISTIC_ARIB_STD_B67,
FLAGS,
"trc" },
202 {
"bt709",
"BT.709", 0,
AV_OPT_TYPE_CONST, { .i64 = AMF_COLOR_TRANSFER_CHARACTERISTIC_BT709 }, 0, 0,
FLAGS,
"trc" },
203 {
"gamma22",
"GAMMA22", 0,
AV_OPT_TYPE_CONST, { .i64 = AMF_COLOR_TRANSFER_CHARACTERISTIC_GAMMA22 }, 0, 0,
FLAGS,
"trc" },
204 {
"gamma28",
"GAMMA28", 0,
AV_OPT_TYPE_CONST, { .i64 = AMF_COLOR_TRANSFER_CHARACTERISTIC_GAMMA28 }, 0, 0,
FLAGS,
"trc" },
205 {
"smpte170m",
"SMPTE170M", 0,
AV_OPT_TYPE_CONST, { .i64 = AMF_COLOR_TRANSFER_CHARACTERISTIC_SMPTE170M }, 0, 0,
FLAGS,
"trc" },
206 {
"smpte240m",
"SMPTE240M", 0,
AV_OPT_TYPE_CONST, { .i64 = AMF_COLOR_TRANSFER_CHARACTERISTIC_SMPTE240M }, 0, 0,
FLAGS,
"trc" },
207 {
"linear",
"Linear", 0,
AV_OPT_TYPE_CONST, { .i64 = AMF_COLOR_TRANSFER_CHARACTERISTIC_LINEAR }, 0, 0,
FLAGS,
"trc" },
208 {
"log",
"LOG", 0,
AV_OPT_TYPE_CONST, { .i64 = AMF_COLOR_TRANSFER_CHARACTERISTIC_LOG }, 0, 0,
FLAGS,
"trc" },
209 {
"log-sqrt",
"LOG_SQRT", 0,
AV_OPT_TYPE_CONST, { .i64 = AMF_COLOR_TRANSFER_CHARACTERISTIC_LOG_SQRT }, 0, 0,
FLAGS,
"trc" },
210 {
"iec61966-2-4",
"IEC61966_2_4", 0,
AV_OPT_TYPE_CONST, { .i64 = AMF_COLOR_TRANSFER_CHARACTERISTIC_IEC61966_2_4 }, 0, 0,
FLAGS,
"trc" },
211 {
"bt1361-ecg",
"BT1361_ECG", 0,
AV_OPT_TYPE_CONST, { .i64 = AMF_COLOR_TRANSFER_CHARACTERISTIC_BT1361_ECG }, 0, 0,
FLAGS,
"trc" },
212 {
"iec61966-2-1",
"IEC61966_2_1", 0,
AV_OPT_TYPE_CONST, { .i64 = AMF_COLOR_TRANSFER_CHARACTERISTIC_IEC61966_2_1 }, 0, 0,
FLAGS,
"trc" },
213 {
"bt2020-10",
"BT.2020_10", 0,
AV_OPT_TYPE_CONST, { .i64 = AMF_COLOR_TRANSFER_CHARACTERISTIC_BT2020_10 }, 0, 0,
FLAGS,
"trc" },
214 {
"bt2020-12",
"BT.2020-12", 0,
AV_OPT_TYPE_CONST, { .i64 = AMF_COLOR_TRANSFER_CHARACTERISTIC_BT2020_12 }, 0, 0,
FLAGS,
"trc" },
215 {
"smpte2084",
"SMPTE2084", 0,
AV_OPT_TYPE_CONST, { .i64 = AMF_COLOR_TRANSFER_CHARACTERISTIC_SMPTE2084 }, 0, 0,
FLAGS,
"trc" },
216 {
"smpte428",
"SMPTE428", 0,
AV_OPT_TYPE_CONST, { .i64 = AMF_COLOR_TRANSFER_CHARACTERISTIC_SMPTE428 }, 0, 0,
FLAGS,
"trc" },
217 {
"arib-std-b67",
"ARIB_STD_B67", 0,
AV_OPT_TYPE_CONST, { .i64 = AMF_COLOR_TRANSFER_CHARACTERISTIC_ARIB_STD_B67 }, 0, 0,
FLAGS,
"trc" },
218
223 {
"force_divisible_by",
"enforce that the output resolution is divisible by a defined integer when force_original_aspect_ratio is used",
OFFSET(force_divisible_by),
AV_OPT_TYPE_INT, { .i64 = 1}, 1, 256,
FLAGS },
224 {
"reset_sar",
"reset SAR to 1 and scale to square pixels if scaling proportionally",
OFFSET(reset_sar),
AV_OPT_TYPE_BOOL, { .i64 = 0}, 0, 1,
FLAGS },
225
227 };
228
229
231
233 {
237 }
238 };
239
241 {
245 }
246 };
247
251 .p.priv_class = &vpp_amf_class,
260 };