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 #include <string.h>
19
23
28
31
33
37
41
43
47
49 {
53
56 }
57
60 if (
ctx->src_display) {
65 }
66
68 const int luma_den = 10000;
69 ctx->in_metadata.max_display_mastering_luminance =
71 ctx->in_metadata.min_display_mastering_luminance =
73 ctx->in_metadata.max_display_mastering_luminance);
74
76 "Mastering Display Metadata(in luminance):\n");
78 "min_luminance=%u, max_luminance=%u\n",
79 ctx->in_metadata.min_display_mastering_luminance,
80 ctx->in_metadata.max_display_mastering_luminance);
81 }
82
85 const int mapping[3] = {1, 2, 0}; //green, blue, red
86 const int chroma_den = 50000;
87
88 for (
i = 0;
i < 3;
i++) {
89 const int j = mapping[
i];
90 ctx->in_metadata.display_primaries_x[
i] =
93 chroma_den);
94 ctx->in_metadata.display_primaries_y[
i] =
97 chroma_den);
98 }
99
100 ctx->in_metadata.white_point_x =
102 chroma_den);
103 ctx->in_metadata.white_point_y =
105 chroma_den);
106
108 "Mastering Display Metadata(in primaries):\n");
110 "G(%u,%u) B(%u,%u) R(%u,%u) WP(%u,%u)\n",
111 ctx->in_metadata.display_primaries_x[0],
112 ctx->in_metadata.display_primaries_y[0],
113 ctx->in_metadata.display_primaries_x[1],
114 ctx->in_metadata.display_primaries_y[1],
115 ctx->in_metadata.display_primaries_x[2],
116 ctx->in_metadata.display_primaries_y[2],
117 ctx->in_metadata.white_point_x,
118 ctx->in_metadata.white_point_y);
119 }
120 } else {
123 }
124
127 if (
ctx->src_light) {
132 }
133
134 ctx->in_metadata.max_content_light_level = light_meta->
MaxCLL;
135 ctx->in_metadata.max_pic_average_light_level = light_meta->
MaxFALL;
136
138 "Mastering Content Light Level (in):\n");
140 "MaxCLL(%u) MaxFALL(%u)\n",
141 ctx->in_metadata.max_content_light_level,
142 ctx->in_metadata.max_pic_average_light_level);
143 } else {
145 }
146 return 0;
147 }
148
150 {
153 VAStatus vas;
154 VAProcFilterParameterBufferHDRToneMapping *hdrtm_param;
155
157 (void**)&hdrtm_param);
158 if (vas != VA_STATUS_SUCCESS) {
160 "buffer (%d): %d (%s).\n",
163 }
164
165 memcpy(hdrtm_param->data.metadata, &
ctx->in_metadata,
sizeof(VAHdrMetaDataHDR10));
166
168 if (vas != VA_STATUS_SUCCESS) {
170 "%d (%s).\n", vas, vaErrorStr(vas));
172 }
173
174 return 0;
175 }
176
178 {
181 VAStatus vas;
182 VAProcFilterParameterBufferHDRToneMapping hdrtm_param;
183 VAProcFilterCapHighDynamicRange hdr_cap[VAProcHighDynamicRangeMetadataTypeCount];
184 int num_query_caps;
186
187 memset(&hdrtm_param, 0, sizeof(hdrtm_param));
188 memset(&
ctx->in_metadata, 0,
sizeof(
ctx->in_metadata));
189
190 num_query_caps = VAProcHighDynamicRangeMetadataTypeCount;
191 vas = vaQueryVideoProcFilterCaps(vpp_ctx->
hwctx->
display,
193 VAProcFilterHighDynamicRangeToneMapping,
194 &hdr_cap, &num_query_caps);
195 if (vas != VA_STATUS_SUCCESS) {
197 "context: %d (%s).\n", vas, vaErrorStr(vas));
199 }
200
201 for (
i = 0;
i < num_query_caps;
i++) {
202 if (hdr_cap[
i].metadata_type != VAProcHighDynamicRangeMetadataNone)
203 break;
204 }
205
206 if (
i >= num_query_caps) {
209 }
210
211 for (
i = 0;
i < num_query_caps;
i++) {
212 if (VA_TONE_MAPPING_HDR_TO_SDR & hdr_cap[
i].caps_flag)
213 break;
214 }
215
216 if (
i >= num_query_caps) {
218 "VAAPI driver doesn't support HDR to SDR\n");
220 }
221
222 hdrtm_param.type = VAProcFilterHighDynamicRangeToneMapping;
223 hdrtm_param.data.metadata_type = VAProcHighDynamicRangeMetadataHDR10;
224 hdrtm_param.data.metadata = &
ctx->in_metadata;
225 hdrtm_param.data.metadata_size = sizeof(VAHdrMetaDataHDR10);
226
228 VAProcFilterParameterBufferType,
229 &hdrtm_param, sizeof(hdrtm_param), 1);
230 }
231
233 {
239 VASurfaceID input_surface, output_surface;
240
241 VAProcPipelineParameterBuffer params;
242 int err;
243
247
251 }
252
254 if (err < 0)
256
258 if (err < 0)
260
261 input_surface = (VASurfaceID)(uintptr_t)input_frame->
data[3];
263 input_surface);
264
270 }
271
272 output_surface = (VASurfaceID)(uintptr_t)
output_frame->data[3];
274 output_surface);
275 memset(¶ms, 0, sizeof(params));
276
278 if (err < 0)
280
283
286 else
288
291
294 if (err < 0)
296
300 }
301
303 if (err < 0)
305
307
311
313
317 return err;
318 }
319
321 {
324
328
329 if (
ctx->output_format_string) {
334 break;
335 default:
338 }
339 } else {
342 }
343
344 #define STRING_OPTION(var_name, func_name, default_value) do { \
345 if (ctx->var_name ## _string) { \
346 int var = av_ ## func_name ## _from_name(ctx->var_name ## _string); \
347 if (var < 0) { \
348 av_log(avctx, AV_LOG_ERROR, "Invalid %s.\n", #var_name); \
349 return AVERROR(EINVAL); \
350 } \
351 ctx->var_name = var; \
352 } else { \
353 ctx->var_name = default_value; \
354 } \
355 } while (0)
356
360
361 return 0;
362 }
363
364 #define OFFSET(x) offsetof(HDRVAAPIContext, x)
365 #define FLAGS (AV_OPT_FLAG_VIDEO_PARAM | AV_OPT_FLAG_FILTERING_PARAM)
368 { "matrix", "Output color matrix coefficient set",
370 { .str =
NULL }, .flags =
FLAGS,
"matrix" },
371 { "m", "Output color matrix coefficient set",
373 { .str =
NULL }, .flags =
FLAGS,
"matrix" },
374 { "primaries", "Output color primaries set",
376 { .str =
NULL }, .flags =
FLAGS,
"primaries" },
377 { "p", "Output color primaries set",
379 { .str =
NULL }, .flags =
FLAGS,
"primaries" },
380 { "transfer", "Output color transfer characteristics set",
382 { .str =
NULL }, .flags =
FLAGS,
"transfer" },
383 { "t", "Output color transfer characteristics set",
385 { .str =
NULL }, .flags =
FLAGS,
"transfer" },
387 };
388
389
391
393 {
398 },
399 };
400
402 {
406 },
407 };
408
410 .
name =
"tonemap_vaapi",
418 .priv_class = &tonemap_vaapi_class,
420 };