FFmpeg
Loading...
Searching...
No Matches
libx265.c
Go to the documentation of this file.
1/*
2 * libx265 encoder
3 *
4 * Copyright (c) 2013-2014 Derek Buitenhuis
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#if defined(_MSC_VER)
24#define X265_API_IMPORTS 1
25#endif
26
27#include <x265.h>
28#include <float.h>
29
30#include "libavutil/avassert.h"
31#include "libavutil/buffer.h"
32#include "libavutil/internal.h"
34#include "libavutil/mem.h"
35#include "libavutil/opt.h"
36#include "libavutil/pixdesc.h"
37#include "avcodec.h"
38#include "codec_internal.h"
39#include "dovi_rpu.h"
40#include "encode.h"
41#include "atsc_a53.h"
42#include "sei.h"
43
44#if defined(X265_ENABLE_ALPHA) && MAX_LAYERS > 2
45#define FF_X265_MAX_LAYERS MAX_LAYERS
46#elif X265_BUILD >= 210
47#define FF_X265_MAX_LAYERS 2
48#else
49#define FF_X265_MAX_LAYERS 1
50#endif
51
60
61typedef struct libx265Context {
62 const AVClass *class;
63
64 x265_encoder *encoder;
65 x265_param *params;
66 const x265_api *api;
67
68 float crf;
69 int cqp;
71 char *preset;
72 char *tune;
73 char *profile;
74 char *stats;
76
77 void *sei_data;
80 int a53_cc;
81
83 int nb_rd;
84
85 /**
86 * If the encoder does not support ROI then warn the first time we
87 * encounter a frame with ROI side data.
88 */
90
93
94static int is_keyframe(NalUnitType naltype)
95{
96 switch (naltype) {
97 case NAL_UNIT_CODED_SLICE_BLA_W_LP:
98 case NAL_UNIT_CODED_SLICE_BLA_W_RADL:
99 case NAL_UNIT_CODED_SLICE_BLA_N_LP:
100 case NAL_UNIT_CODED_SLICE_IDR_W_RADL:
101 case NAL_UNIT_CODED_SLICE_IDR_N_LP:
102 case NAL_UNIT_CODED_SLICE_CRA:
103 return 1;
104 default:
105 return 0;
106 }
107}
108
110{
111 const int add = 16;
112
114 int idx;
115
116 for (int i = 0; i < ctx->nb_rd; i++)
117 if (!ctx->rd[i].in_use) {
118 ctx->rd[i].in_use = 1;
119 return i;
120 }
121
122 tmp = av_realloc_array(ctx->rd, ctx->nb_rd + add, sizeof(*ctx->rd));
123 if (!tmp)
124 return AVERROR(ENOMEM);
125 memset(tmp + ctx->nb_rd, 0, sizeof(*tmp) * add);
126
127 ctx->rd = tmp;
128 ctx->nb_rd += add;
129
130 idx = ctx->nb_rd - add;
131 ctx->rd[idx].in_use = 1;
132
133 return idx;
134}
135
136static void rd_release(libx265Context *ctx, int idx)
137{
138 av_assert0(idx >= 0 && idx < ctx->nb_rd);
139 av_buffer_unref(&ctx->rd[idx].frame_opaque_ref);
140 memset(&ctx->rd[idx], 0, sizeof(ctx->rd[idx]));
141}
142
144{
145 libx265Context *ctx = avctx->priv_data;
146
147 ctx->api->param_free(ctx->params);
148 av_freep(&ctx->sei_data);
149
150 for (int i = 0; i < ctx->nb_rd; i++)
151 rd_release(ctx, i);
152 av_freep(&ctx->rd);
153
154 if (ctx->encoder)
155 ctx->api->encoder_close(ctx->encoder);
156
157 ff_dovi_ctx_unref(&ctx->dovi);
158
159 return 0;
160}
161
163 const char *key, float value)
164{
165 libx265Context *ctx = avctx->priv_data;
166 char buf[256];
167
168 snprintf(buf, sizeof(buf), "%2.2f", value);
169 if (ctx->api->param_parse(ctx->params, key, buf) == X265_PARAM_BAD_VALUE) {
170 av_log(avctx, AV_LOG_ERROR, "Invalid value %2.2f for param \"%s\".\n", value, key);
171 return AVERROR(EINVAL);
172 }
173
174 return 0;
175}
176
178 const char *key, int value)
179{
180 libx265Context *ctx = avctx->priv_data;
181 char buf[256];
182
183 snprintf(buf, sizeof(buf), "%d", value);
184 if (ctx->api->param_parse(ctx->params, key, buf) == X265_PARAM_BAD_VALUE) {
185 av_log(avctx, AV_LOG_ERROR, "Invalid value %d for param \"%s\".\n", value, key);
186 return AVERROR(EINVAL);
187 }
188
189 return 0;
190}
191
192static int handle_mdcv(void *logctx, const x265_api *api,
193 x265_param *params,
194 const AVMasteringDisplayMetadata *mdcv)
195{
196 char buf[10 /* # of PRId64s */ * 20 /* max strlen for %PRId64 */ + sizeof("G(,)B(,)R(,)WP(,)L(,)")];
197
198 // G(%hu,%hu)B(%hu,%hu)R(%hu,%hu)WP(%hu,%hu)L(%u,%u)
199 snprintf(buf, sizeof(buf),
200 "G(%"PRId64",%"PRId64")B(%"PRId64",%"PRId64")R(%"PRId64",%"PRId64")"
201 "WP(%"PRId64",%"PRId64")L(%"PRId64",%"PRId64")",
202 av_rescale_q(1, mdcv->display_primaries[1][0], (AVRational){ 1, 50000 }),
203 av_rescale_q(1, mdcv->display_primaries[1][1], (AVRational){ 1, 50000 }),
204 av_rescale_q(1, mdcv->display_primaries[2][0], (AVRational){ 1, 50000 }),
205 av_rescale_q(1, mdcv->display_primaries[2][1], (AVRational){ 1, 50000 }),
206 av_rescale_q(1, mdcv->display_primaries[0][0], (AVRational){ 1, 50000 }),
207 av_rescale_q(1, mdcv->display_primaries[0][1], (AVRational){ 1, 50000 }),
208 av_rescale_q(1, mdcv->white_point[0], (AVRational){ 1, 50000 }),
209 av_rescale_q(1, mdcv->white_point[1], (AVRational){ 1, 50000 }),
210 av_rescale_q(1, mdcv->max_luminance, (AVRational){ 1, 10000 }),
211 av_rescale_q(1, mdcv->min_luminance, (AVRational){ 1, 10000 }));
212
213 if (api->param_parse(params, "master-display", buf) ==
214 X265_PARAM_BAD_VALUE) {
215 av_log(logctx, AV_LOG_ERROR,
216 "Invalid value \"%s\" for param \"master-display\".\n",
217 buf);
218 return AVERROR(EINVAL);
219 }
220
221 return 0;
222}
223
224static int handle_side_data(AVCodecContext *avctx, const x265_api *api,
225 x265_param *params)
226{
227 const AVFrameSideData *cll_sd =
230 const AVFrameSideData *mdcv_sd =
234
235 if (cll_sd) {
236 const AVContentLightMetadata *cll =
237 (AVContentLightMetadata *)cll_sd->data;
238
239 params->maxCLL = cll->MaxCLL;
240 params->maxFALL = cll->MaxFALL;
241 }
242
243 if (mdcv_sd) {
244 int ret = handle_mdcv(
245 avctx, api, params,
246 (AVMasteringDisplayMetadata *)mdcv_sd->data);
247 if (ret < 0)
248 return ret;
249 }
250
251 return 0;
252}
253
255{
256 int level = av_log_get_level() + avctx->log_level_offset;
257
258 if (level <= AV_LOG_QUIET)
259 return X265_LOG_NONE;
260 if (level <= AV_LOG_ERROR)
261 return X265_LOG_ERROR;
262 if (level <= AV_LOG_WARNING)
263 return X265_LOG_WARNING;
264 if (level <= AV_LOG_INFO)
265 return X265_LOG_INFO;
266 if (level <= AV_LOG_DEBUG)
267 return X265_LOG_DEBUG;
268
269 return X265_LOG_FULL;
270}
271
273{
274 libx265Context *ctx = avctx->priv_data;
275 AVCPBProperties *cpb_props = NULL;
277 int ret;
278
279 ctx->api = x265_api_get(desc->comp[0].depth);
280 if (!ctx->api)
281 ctx->api = x265_api_get(0);
282
283 ctx->params = ctx->api->param_alloc();
284 if (!ctx->params) {
285 av_log(avctx, AV_LOG_ERROR, "Could not allocate x265 param structure.\n");
286 return AVERROR(ENOMEM);
287 }
288
289 if (ctx->api->param_default_preset(ctx->params, ctx->preset, ctx->tune) < 0) {
290 int i;
291
292 av_log(avctx, AV_LOG_ERROR, "Error setting preset/tune %s/%s.\n", ctx->preset, ctx->tune);
293 av_log(avctx, AV_LOG_INFO, "Possible presets:");
294 for (i = 0; x265_preset_names[i]; i++)
295 av_log(avctx, AV_LOG_INFO, " %s", x265_preset_names[i]);
296
297 av_log(avctx, AV_LOG_INFO, "\n");
298 av_log(avctx, AV_LOG_INFO, "Possible tunes:");
299 for (i = 0; x265_tune_names[i]; i++)
300 av_log(avctx, AV_LOG_INFO, " %s", x265_tune_names[i]);
301
302 av_log(avctx, AV_LOG_INFO, "\n");
303
304 return AVERROR(EINVAL);
305 }
306
307 ctx->params->logLevel = get_x265_log_level(avctx);
308 ctx->params->frameNumThreads = avctx->thread_count;
309 if (avctx->framerate.num > 0 && avctx->framerate.den > 0) {
310 ctx->params->fpsNum = avctx->framerate.num;
311 ctx->params->fpsDenom = avctx->framerate.den;
312 } else {
313 ctx->params->fpsNum = avctx->time_base.den;
314 ctx->params->fpsDenom = avctx->time_base.num;
315 }
316 ctx->params->sourceWidth = avctx->width;
317 ctx->params->sourceHeight = avctx->height;
318 ctx->params->bEnablePsnr = !!(avctx->flags & AV_CODEC_FLAG_PSNR);
319 ctx->params->bOpenGOP = !(avctx->flags & AV_CODEC_FLAG_CLOSED_GOP);
320
321 /* Tune the CTU size based on input resolution. */
322 if (ctx->params->sourceWidth < 64 || ctx->params->sourceHeight < 64)
323 ctx->params->maxCUSize = 32;
324 if (ctx->params->sourceWidth < 32 || ctx->params->sourceHeight < 32)
325 ctx->params->maxCUSize = 16;
326 if (ctx->params->sourceWidth < 16 || ctx->params->sourceHeight < 16) {
327 av_log(avctx, AV_LOG_ERROR, "Image size is too small (%dx%d).\n",
328 ctx->params->sourceWidth, ctx->params->sourceHeight);
329 return AVERROR(EINVAL);
330 }
331
332
333 ctx->params->vui.bEnableVideoSignalTypePresentFlag = 1;
334
336 ctx->params->vui.bEnableVideoFullRangeFlag =
338 else
339 ctx->params->vui.bEnableVideoFullRangeFlag =
340 (desc->flags & AV_PIX_FMT_FLAG_RGB) ||
341 avctx->pix_fmt == AV_PIX_FMT_YUVJ420P ||
342 avctx->pix_fmt == AV_PIX_FMT_YUVJ422P ||
344
348
349 ctx->params->vui.bEnableColorDescriptionPresentFlag = 1;
350
351 // x265 validates the parameters internally
352 ctx->params->vui.colorPrimaries = avctx->color_primaries;
353 ctx->params->vui.transferCharacteristics = avctx->color_trc;
354#if X265_BUILD >= 159
355 if (avctx->color_trc == AVCOL_TRC_ARIB_STD_B67)
356 ctx->params->preferredTransferCharacteristics = ctx->params->vui.transferCharacteristics;
357#endif
358 ctx->params->vui.matrixCoeffs = avctx->colorspace;
359 }
360
361 // chroma sample location values are to be ignored in case of non-4:2:0
362 // according to the specification, so we only write them out in case of
363 // 4:2:0 (log2_chroma_{w,h} == 1).
364 ctx->params->vui.bEnableChromaLocInfoPresentFlag =
366 desc->log2_chroma_w == 1 && desc->log2_chroma_h == 1;
367
368 if (ctx->params->vui.bEnableChromaLocInfoPresentFlag) {
369 ctx->params->vui.chromaSampleLocTypeTopField =
370 ctx->params->vui.chromaSampleLocTypeBottomField =
371 avctx->chroma_sample_location - 1;
372 }
373
374 if (avctx->sample_aspect_ratio.num > 0 && avctx->sample_aspect_ratio.den > 0) {
375 char sar[12];
376 int sar_num, sar_den;
377
378 av_reduce(&sar_num, &sar_den,
380 avctx->sample_aspect_ratio.den, 65535);
381 snprintf(sar, sizeof(sar), "%d:%d", sar_num, sar_den);
382 if (ctx->api->param_parse(ctx->params, "sar", sar) == X265_PARAM_BAD_VALUE) {
383 av_log(avctx, AV_LOG_ERROR, "Invalid SAR: %d:%d.\n", sar_num, sar_den);
384 return AVERROR_INVALIDDATA;
385 }
386 }
387
388 switch (desc->log2_chroma_w) {
389 // 4:4:4, RGB. gray
390 case 0:
391 // gray
392 if (desc->nb_components == 1) {
393 if (ctx->api->api_build_number < 85) {
394 av_log(avctx, AV_LOG_ERROR,
395 "libx265 version is %d, must be at least 85 for gray encoding.\n",
396 ctx->api->api_build_number);
397 return AVERROR_INVALIDDATA;
398 }
399 ctx->params->internalCsp = X265_CSP_I400;
400 break;
401 }
402
403 // set identity matrix for RGB
404 if (desc->flags & AV_PIX_FMT_FLAG_RGB) {
405 ctx->params->vui.matrixCoeffs = AVCOL_SPC_RGB;
406 ctx->params->vui.bEnableVideoSignalTypePresentFlag = 1;
407 ctx->params->vui.bEnableColorDescriptionPresentFlag = 1;
408 }
409
410 ctx->params->internalCsp = X265_CSP_I444;
411 break;
412 // 4:2:0, 4:2:2
413 case 1:
414 ctx->params->internalCsp = desc->log2_chroma_h == 1 ?
415 X265_CSP_I420 : X265_CSP_I422;
416 break;
417 default:
418 av_log(avctx, AV_LOG_ERROR,
419 "Pixel format '%s' cannot be mapped to a libx265 CSP!\n",
420 desc->name);
421 return AVERROR_BUG;
422 }
423
424 ret = handle_side_data(avctx, ctx->api, ctx->params);
425 if (ret < 0) {
426 av_log(avctx, AV_LOG_ERROR, "Failed handling side data! (%s)\n",
427 av_err2str(ret));
428 return ret;
429 }
430
431 if (ctx->crf >= 0) {
432 char crf[6];
433
434 snprintf(crf, sizeof(crf), "%2.2f", ctx->crf);
435 if (ctx->api->param_parse(ctx->params, "crf", crf) == X265_PARAM_BAD_VALUE) {
436 av_log(avctx, AV_LOG_ERROR, "Invalid crf: %2.2f.\n", ctx->crf);
437 return AVERROR(EINVAL);
438 }
439 } else if (avctx->bit_rate > 0) {
440 ctx->params->rc.bitrate = avctx->bit_rate / 1000;
441 ctx->params->rc.rateControlMode = X265_RC_ABR;
442 } else if (ctx->cqp >= 0) {
443 ret = libx265_param_parse_int(avctx, "qp", ctx->cqp);
444 if (ret < 0)
445 return ret;
446 }
447
448 if (avctx->qmin >= 0) {
449 ret = libx265_param_parse_int(avctx, "qpmin", avctx->qmin);
450 if (ret < 0)
451 return ret;
452 }
453 if (avctx->qmax >= 0) {
454 ret = libx265_param_parse_int(avctx, "qpmax", avctx->qmax);
455 if (ret < 0)
456 return ret;
457 }
458 if (avctx->max_qdiff >= 0) {
459 ret = libx265_param_parse_int(avctx, "qpstep", avctx->max_qdiff);
460 if (ret < 0)
461 return ret;
462 }
463 if (avctx->qblur >= 0) {
464 ret = libx265_param_parse_float(avctx, "qblur", avctx->qblur);
465 if (ret < 0)
466 return ret;
467 }
468 if (avctx->qcompress >= 0) {
469 ret = libx265_param_parse_float(avctx, "qcomp", avctx->qcompress);
470 if (ret < 0)
471 return ret;
472 }
473 if (avctx->i_quant_factor >= 0) {
474 ret = libx265_param_parse_float(avctx, "ipratio", avctx->i_quant_factor);
475 if (ret < 0)
476 return ret;
477 }
478 if (avctx->b_quant_factor >= 0) {
479 ret = libx265_param_parse_float(avctx, "pbratio", avctx->b_quant_factor);
480 if (ret < 0)
481 return ret;
482 }
483
484 ctx->params->rc.vbvBufferSize = avctx->rc_buffer_size / 1000;
485 ctx->params->rc.vbvMaxBitrate = avctx->rc_max_rate / 1000;
486
487 cpb_props = ff_encode_add_cpb_side_data(avctx);
488 if (!cpb_props)
489 return AVERROR(ENOMEM);
490 cpb_props->buffer_size = ctx->params->rc.vbvBufferSize * 1000;
491 cpb_props->max_bitrate = ctx->params->rc.vbvMaxBitrate * 1000LL;
492 cpb_props->avg_bitrate = ctx->params->rc.bitrate * 1000LL;
493
494 if (!(avctx->flags & AV_CODEC_FLAG_GLOBAL_HEADER))
495 ctx->params->bRepeatHeaders = 1;
496
497 if (avctx->gop_size >= 0) {
498 ret = libx265_param_parse_int(avctx, "keyint", avctx->gop_size);
499 if (ret < 0)
500 return ret;
501 }
502 if (avctx->keyint_min > 0) {
503 ret = libx265_param_parse_int(avctx, "min-keyint", avctx->keyint_min);
504 if (ret < 0)
505 return ret;
506 }
507 if (avctx->max_b_frames >= 0) {
508 ret = libx265_param_parse_int(avctx, "bframes", avctx->max_b_frames);
509 if (ret < 0)
510 return ret;
511 }
512 if (avctx->refs >= 0) {
513 ret = libx265_param_parse_int(avctx, "ref", avctx->refs);
514 if (ret < 0)
515 return ret;
516 }
517
518 {
519 const AVDictionaryEntry *en = NULL;
520 while ((en = av_dict_iterate(ctx->x265_opts, en))) {
521 int parse_ret;
522
523 // ignore forced alpha option. The pixel format is all we need.
524 if (!strncmp(en->key, "alpha", 5)) {
525 if (desc->nb_components == 4) {
526 av_log(avctx, AV_LOG_WARNING,
527 "Ignoring redundant \"alpha\" option.\n");
528 continue;
529 }
530 av_log(avctx, AV_LOG_ERROR,
531 "Alpha encoding was requested through an unsupported "
532 "option when no alpha plane is present\n");
533 return AVERROR(EINVAL);
534 }
535
536 parse_ret = ctx->api->param_parse(ctx->params, en->key, en->value);
537 switch (parse_ret) {
538 case X265_PARAM_BAD_NAME:
539 av_log(avctx, AV_LOG_WARNING,
540 "Unknown option: %s.\n", en->key);
541 break;
542 case X265_PARAM_BAD_VALUE:
543 av_log(avctx, AV_LOG_WARNING,
544 "Invalid value for %s: %s.\n", en->key, en->value);
545 break;
546 default:
547 break;
548 }
549 }
550 }
551
552 if (avctx->flags & AV_CODEC_FLAG_PASS1) {
553 if (ctx->api->param_parse(ctx->params, "pass", "1") == X265_PARAM_BAD_VALUE) {
554 av_log(avctx, AV_LOG_ERROR, "Invalid value for param \"pass\".\n");
555 return AVERROR(EINVAL);
556 }
557 } else if (avctx->flags & AV_CODEC_FLAG_PASS2) {
558 if (ctx->api->param_parse(ctx->params, "pass", "2") == X265_PARAM_BAD_VALUE) {
559 av_log(avctx, AV_LOG_ERROR, "Invalid value for param \"pass\".\n");
560 return AVERROR(EINVAL);
561 }
562 }
563 if (ctx->stats) {
564 if (ctx->api->param_parse(ctx->params, "stats", ctx->stats) == X265_PARAM_BAD_VALUE) {
565 av_log(avctx, AV_LOG_ERROR, "Invalid value \"%s\" for param \"stats\".\n", ctx->stats);
566 return AVERROR(EINVAL);
567 }
568 }
569
570 if (ctx->params->rc.vbvBufferSize && avctx->rc_initial_buffer_occupancy > 1000 &&
571 ctx->params->rc.vbvBufferInit == 0.9) {
572 ctx->params->rc.vbvBufferInit = (float)avctx->rc_initial_buffer_occupancy / 1000;
573 }
574
575 if (ctx->profile) {
576 if (ctx->api->param_apply_profile(ctx->params, ctx->profile) < 0) {
577 int i;
578 av_log(avctx, AV_LOG_ERROR, "Invalid or incompatible profile set: %s.\n", ctx->profile);
579 av_log(avctx, AV_LOG_INFO, "Possible profiles:");
580 for (i = 0; x265_profile_names[i]; i++)
581 av_log(avctx, AV_LOG_INFO, " %s", x265_profile_names[i]);
582 av_log(avctx, AV_LOG_INFO, "\n");
583 return AVERROR(EINVAL);
584 }
585 }
586
587#if X265_BUILD >= 167
588 ctx->dovi.logctx = avctx;
589 if ((ret = ff_dovi_configure(&ctx->dovi, avctx)) < 0)
590 return ret;
591 ctx->params->dolbyProfile = ctx->dovi.cfg.dv_profile * 10 +
592 ctx->dovi.cfg.dv_bl_signal_compatibility_id;
593#endif
594
595#if X265_BUILD >= 210 && FF_X265_MAX_LAYERS > 1
596 if (desc->flags & AV_PIX_FMT_FLAG_ALPHA) {
597 if (ctx->api->param_parse(ctx->params, "alpha", "1") < 0) {
598 av_log(avctx, AV_LOG_ERROR, "Loaded libx265 does not support alpha layer encoding.\n");
599 return AVERROR(ENOTSUP);
600 }
601 }
602#endif
603
604 ctx->encoder = ctx->api->encoder_open(ctx->params);
605 if (!ctx->encoder) {
606 av_log(avctx, AV_LOG_ERROR, "Cannot open libx265 encoder.\n");
608 return AVERROR_INVALIDDATA;
609 }
610
611 if (avctx->flags & AV_CODEC_FLAG_GLOBAL_HEADER) {
612 x265_nal *nal;
613 int nnal;
614
615 avctx->extradata_size = ctx->api->encoder_headers(ctx->encoder, &nal, &nnal);
616 if (avctx->extradata_size <= 0) {
617 av_log(avctx, AV_LOG_ERROR, "Cannot encode headers.\n");
619 return AVERROR_INVALIDDATA;
620 }
621
623 if (!avctx->extradata) {
624 av_log(avctx, AV_LOG_ERROR,
625 "Cannot allocate HEVC header of size %d.\n", avctx->extradata_size);
627 return AVERROR(ENOMEM);
628 }
629
630 memcpy(avctx->extradata, nal[0].payload, avctx->extradata_size);
631 memset(avctx->extradata + avctx->extradata_size, 0, AV_INPUT_BUFFER_PADDING_SIZE);
632 }
633
634 return 0;
635}
636
637static av_cold int libx265_encode_set_roi(libx265Context *ctx, const AVFrame *frame, x265_picture* pic)
638{
640 if (sd) {
641 if (ctx->params->rc.aqMode == X265_AQ_NONE) {
642 if (!ctx->roi_warned) {
643 ctx->roi_warned = 1;
644 av_log(ctx, AV_LOG_WARNING, "Adaptive quantization must be enabled to use ROI encoding, skipping ROI.\n");
645 }
646 } else {
647 /* 8x8 block when qg-size is 8, 16*16 block otherwise. */
648 int mb_size = (ctx->params->rc.qgSize == 8) ? 8 : 16;
649 int mbx = (frame->width + mb_size - 1) / mb_size;
650 int mby = (frame->height + mb_size - 1) / mb_size;
651 int qp_range = 51 + 6 * (pic->bitDepth - 8);
652 int nb_rois;
653 const AVRegionOfInterest *roi;
654 uint32_t roi_size;
655 float *qoffsets; /* will be freed after encode is called. */
656
657 roi = (const AVRegionOfInterest*)sd->data;
658 roi_size = roi->self_size;
659 if (!roi_size || sd->size % roi_size != 0) {
660 av_log(ctx, AV_LOG_ERROR, "Invalid AVRegionOfInterest.self_size.\n");
661 return AVERROR(EINVAL);
662 }
663 nb_rois = sd->size / roi_size;
664
665 qoffsets = av_calloc(mbx * mby, sizeof(*qoffsets));
666 if (!qoffsets)
667 return AVERROR(ENOMEM);
668
669 // This list must be iterated in reverse because the first
670 // region in the list applies when regions overlap.
671 for (int i = nb_rois - 1; i >= 0; i--) {
672 int startx, endx, starty, endy;
673 float qoffset;
674
675 roi = (const AVRegionOfInterest*)(sd->data + roi_size * i);
676
677 starty = FFMIN(mby, roi->top / mb_size);
678 endy = FFMIN(mby, (roi->bottom + mb_size - 1)/ mb_size);
679 startx = FFMIN(mbx, roi->left / mb_size);
680 endx = FFMIN(mbx, (roi->right + mb_size - 1)/ mb_size);
681
682 if (roi->qoffset.den == 0) {
683 av_free(qoffsets);
684 av_log(ctx, AV_LOG_ERROR, "AVRegionOfInterest.qoffset.den must not be zero.\n");
685 return AVERROR(EINVAL);
686 }
687 qoffset = roi->qoffset.num * 1.0f / roi->qoffset.den;
688 qoffset = av_clipf(qoffset * qp_range, -qp_range, +qp_range);
689
690 for (int y = starty; y < endy; y++)
691 for (int x = startx; x < endx; x++)
692 qoffsets[x + y*mbx] = qoffset;
693 }
694
695 pic->quantOffsets = qoffsets;
696 }
697 }
698 return 0;
699}
700
701static void free_picture(libx265Context *ctx, x265_picture *pic)
702{
703 x265_sei *sei = &pic->userSEI;
704 for (int i = 0; i < sei->numPayloads; i++)
705 av_free(sei->payloads[i].payload);
706
707#if X265_BUILD >= 167
708 av_free(pic->rpu.payload);
709#endif
710
711 if (pic->userData) {
712 int idx = (int)(intptr_t)pic->userData - 1;
713 rd_release(ctx, idx);
714 pic->userData = NULL;
715 }
716
717 av_freep(&pic->quantOffsets);
718 sei->numPayloads = 0;
719}
720
722 const AVFrame *pic, int *got_packet)
723{
725 libx265Context *ctx = avctx->priv_data;
726 x265_picture x265pic;
727 x265_picture x265pic_out[FF_X265_MAX_LAYERS] = { 0 };
728#if (X265_BUILD >= 210) && (X265_BUILD < 213)
729 x265_picture *x265pic_lyrptr_out[FF_X265_MAX_LAYERS];
730#endif
731 x265_nal *nal;
732 x265_sei *sei;
733 uint8_t *dst;
734 int payload = 0;
735 int nnal;
736 int ret;
737 int i;
738
739 ctx->api->picture_init(ctx->params, &x265pic);
740
741 sei = &x265pic.userSEI;
742 sei->numPayloads = 0;
743
744 if (pic) {
745 AVFrameSideData *sd;
746 ReorderedData *rd;
747 int rd_idx;
748
749 for (i = 0; i < desc->nb_components; i++) {
750 x265pic.planes[i] = pic->data[i];
751 x265pic.stride[i] = pic->linesize[i];
752 }
753
754 x265pic.pts = pic->pts;
755 x265pic.bitDepth = av_pix_fmt_desc_get(avctx->pix_fmt)->comp[0].depth;
756
757 x265pic.sliceType = pic->pict_type == AV_PICTURE_TYPE_I ?
758 (ctx->forced_idr ? X265_TYPE_IDR : X265_TYPE_I) :
759 pic->pict_type == AV_PICTURE_TYPE_P ? X265_TYPE_P :
760 pic->pict_type == AV_PICTURE_TYPE_B ? X265_TYPE_B :
761 X265_TYPE_AUTO;
762
763 ret = libx265_encode_set_roi(ctx, pic, &x265pic);
764 if (ret < 0)
765 return ret;
766
767 rd_idx = rd_get(ctx);
768 if (rd_idx < 0) {
769 free_picture(ctx, &x265pic);
770 return rd_idx;
771 }
772 rd = &ctx->rd[rd_idx];
773
774 rd->duration = pic->duration;
775 if (avctx->flags & AV_CODEC_FLAG_COPY_OPAQUE) {
776 rd->frame_opaque = pic->opaque;
778 if (ret < 0) {
779 rd_release(ctx, rd_idx);
780 free_picture(ctx, &x265pic);
781 return ret;
782 }
783 }
784
785 x265pic.userData = (void*)(intptr_t)(rd_idx + 1);
786
787 if (ctx->a53_cc) {
788 void *sei_data;
789 size_t sei_size;
790
791 ret = ff_alloc_a53_sei(pic, 0, &sei_data, &sei_size);
792 if (ret < 0) {
793 av_log(ctx, AV_LOG_ERROR, "Not enough memory for closed captions, skipping\n");
794 } else if (sei_data) {
795 void *tmp;
796 x265_sei_payload *sei_payload;
797
798 tmp = av_fast_realloc(ctx->sei_data,
799 &ctx->sei_data_size,
800 (sei->numPayloads + 1) * sizeof(*sei_payload));
801 if (!tmp) {
802 av_free(sei_data);
803 free_picture(ctx, &x265pic);
804 return AVERROR(ENOMEM);
805 }
806 ctx->sei_data = tmp;
807 sei->payloads = ctx->sei_data;
808 sei_payload = &sei->payloads[sei->numPayloads];
809 sei_payload->payload = sei_data;
810 sei_payload->payloadSize = sei_size;
811 sei_payload->payloadType = (SEIPayloadType)SEI_TYPE_USER_DATA_REGISTERED_ITU_T_T35;
812 sei->numPayloads++;
813 }
814 }
815
816 if (ctx->udu_sei) {
817 for (i = 0; i < pic->nb_side_data; i++) {
818 AVFrameSideData *side_data = pic->side_data[i];
819 void *tmp;
820 x265_sei_payload *sei_payload;
821
822 if (side_data->type != AV_FRAME_DATA_SEI_UNREGISTERED)
823 continue;
824
825 tmp = av_fast_realloc(ctx->sei_data,
826 &ctx->sei_data_size,
827 (sei->numPayloads + 1) * sizeof(*sei_payload));
828 if (!tmp) {
829 free_picture(ctx, &x265pic);
830 return AVERROR(ENOMEM);
831 }
832 ctx->sei_data = tmp;
833 sei->payloads = ctx->sei_data;
834 sei_payload = &sei->payloads[sei->numPayloads];
835 sei_payload->payload = av_memdup(side_data->data, side_data->size);
836 if (!sei_payload->payload) {
837 free_picture(ctx, &x265pic);
838 return AVERROR(ENOMEM);
839 }
840 sei_payload->payloadSize = side_data->size;
841 /* Equal to libx265 USER_DATA_UNREGISTERED */
842 sei_payload->payloadType = (SEIPayloadType)SEI_TYPE_USER_DATA_UNREGISTERED;
843 sei->numPayloads++;
844 }
845 }
846
847#if X265_BUILD >= 167
849 if (ctx->dovi.cfg.dv_profile && sd) {
850 const AVDOVIMetadata *metadata = (const AVDOVIMetadata *)sd->data;
852 &x265pic.rpu.payload,
853 &x265pic.rpu.payloadSize);
854 if (ret < 0) {
855 free_picture(ctx, &x265pic);
856 return ret;
857 }
858 } else if (ctx->dovi.cfg.dv_profile) {
859 av_log(avctx, AV_LOG_ERROR, "Dolby Vision enabled, but received frame "
860 "without AV_FRAME_DATA_DOVI_METADATA");
861 free_picture(ctx, &x265pic);
862 return AVERROR_INVALIDDATA;
863 }
864#endif
865 }
866
867#if (X265_BUILD >= 210) && (X265_BUILD < 213)
868 for (i = 0; i < FF_ARRAY_ELEMS(x265pic_out); i++)
869 x265pic_lyrptr_out[i] = &x265pic_out[i];
870
871 ret = ctx->api->encoder_encode(ctx->encoder, &nal, &nnal,
872 pic ? &x265pic : NULL, x265pic_lyrptr_out);
873#else
874 ret = ctx->api->encoder_encode(ctx->encoder, &nal, &nnal,
875 pic ? &x265pic : NULL, x265pic_out);
876#endif
877
878 for (i = 0; i < sei->numPayloads; i++)
879 av_free(sei->payloads[i].payload);
880 av_freep(&x265pic.quantOffsets);
881
882 if (ret < 0)
883 return AVERROR_EXTERNAL;
884
885 if (!nnal)
886 return 0;
887
888 for (i = 0; i < nnal; i++)
889 payload += nal[i].sizeBytes;
890
891 ret = ff_get_encode_buffer(avctx, pkt, payload, 0);
892 if (ret < 0) {
893 av_log(avctx, AV_LOG_ERROR, "Error getting output packet.\n");
894 return ret;
895 }
896 dst = pkt->data;
897
898 for (i = 0; i < nnal; i++) {
899 memcpy(dst, nal[i].payload, nal[i].sizeBytes);
900 dst += nal[i].sizeBytes;
901
902 if (is_keyframe(nal[i].type))
903 pkt->flags |= AV_PKT_FLAG_KEY;
904 }
905
906 pkt->pts = x265pic_out->pts;
907 pkt->dts = x265pic_out->dts;
908
909 enum AVPictureType pict_type;
910 switch (x265pic_out->sliceType) {
911 case X265_TYPE_IDR:
912 case X265_TYPE_I:
913 pict_type = AV_PICTURE_TYPE_I;
914 break;
915 case X265_TYPE_P:
916 pict_type = AV_PICTURE_TYPE_P;
917 break;
918 case X265_TYPE_B:
919 case X265_TYPE_BREF:
920 pict_type = AV_PICTURE_TYPE_B;
921 break;
922 default:
923 av_log(avctx, AV_LOG_ERROR, "Unknown picture type encountered.\n");
924 return AVERROR_EXTERNAL;
925 }
926
927#if X265_BUILD >= 130
928 if (x265pic_out->sliceType == X265_TYPE_B)
929#else
930 if (x265pic_out->frameData.sliceType == 'b')
931#endif
932 pkt->flags |= AV_PKT_FLAG_DISPOSABLE;
933
934 ff_encode_add_stats_side_data(pkt, x265pic_out->frameData.qp * FF_QP2LAMBDA, NULL, 0, pict_type);
935
936 if (x265pic_out->userData) {
937 int idx = (int)(intptr_t)x265pic_out->userData - 1;
938 ReorderedData *rd = &ctx->rd[idx];
939
940 pkt->duration = rd->duration;
941
942 if (avctx->flags & AV_CODEC_FLAG_COPY_OPAQUE) {
943 pkt->opaque = rd->frame_opaque;
944 pkt->opaque_ref = rd->frame_opaque_ref;
946 }
947
948 rd_release(ctx, idx);
949 }
950
951 *got_packet = 1;
952 return 0;
953}
954
955static const enum AVPixelFormat x265_csp_eight[] = {
964#if X265_BUILD >= 210 && FF_X265_MAX_LAYERS > 1
966#endif
968};
969
990
1016
1018 const AVCodec *codec,
1019 enum AVCodecConfig config,
1020 unsigned flags, const void **out,
1021 int *out_num)
1022{
1023 if (config == AV_CODEC_CONFIG_PIX_FORMAT) {
1024 if (x265_api_get(12)) {
1026 *out_num = FF_ARRAY_ELEMS(x265_csp_twelve) - 1;
1027 } else if (x265_api_get(10)) {
1028 *out = x265_csp_ten;
1029 *out_num = FF_ARRAY_ELEMS(x265_csp_ten) - 1;
1030 } else if (x265_api_get(8)) {
1032 *out_num = FF_ARRAY_ELEMS(x265_csp_eight) - 1;
1033 } else
1034 return AVERROR_EXTERNAL;
1035 return 0;
1036 }
1037
1038 return ff_default_get_supported_config(avctx, codec, config, flags, out, out_num);
1039}
1040
1041#define OFFSET(x) offsetof(libx265Context, x)
1042#define VE AV_OPT_FLAG_VIDEO_PARAM | AV_OPT_FLAG_ENCODING_PARAM
1043static const AVOption options[] = {
1044 { "crf", "set the x265 crf", OFFSET(crf), AV_OPT_TYPE_FLOAT, { .dbl = -1 }, -1, FLT_MAX, VE },
1045 { "qp", "set the x265 qp", OFFSET(cqp), AV_OPT_TYPE_INT, { .i64 = -1 }, -1, INT_MAX, VE },
1046 { "forced-idr", "if forcing keyframes, force them as IDR frames", OFFSET(forced_idr),AV_OPT_TYPE_BOOL, { .i64 = 0 }, 0, 1, VE },
1047 { "preset", "set the x265 preset", OFFSET(preset), AV_OPT_TYPE_STRING, { 0 }, 0, 0, VE },
1048 { "tune", "set the x265 tune parameter", OFFSET(tune), AV_OPT_TYPE_STRING, { 0 }, 0, 0, VE },
1049 { "profile", "set the x265 profile", OFFSET(profile), AV_OPT_TYPE_STRING, { 0 }, 0, 0, VE },
1050 { "x265-stats", "Filename for 2 pass stats", OFFSET(stats), AV_OPT_TYPE_STRING, { 0 }, 0, 0, VE },
1051 { "udu_sei", "Use user data unregistered SEI if available", OFFSET(udu_sei), AV_OPT_TYPE_BOOL, { .i64 = 0 }, 0, 1, VE },
1052 { "a53cc", "Use A53 Closed Captions (if available)", OFFSET(a53_cc), AV_OPT_TYPE_BOOL, { .i64 = 0 }, 0, 1, VE },
1053 { "x265-params", "set the x265 configuration using a :-separated list of key=value parameters", OFFSET(x265_opts), AV_OPT_TYPE_DICT, { 0 }, 0, 0, VE },
1054#if X265_BUILD >= 167
1055 { "dolbyvision", "Enable Dolby Vision RPU coding", OFFSET(dovi.enable), AV_OPT_TYPE_BOOL, {.i64 = FF_DOVI_AUTOMATIC }, -1, 1, VE, .unit = "dovi" },
1056 { "auto", NULL, 0, AV_OPT_TYPE_CONST, {.i64 = FF_DOVI_AUTOMATIC}, .flags = VE, .unit = "dovi" },
1057#endif
1058 { NULL }
1059};
1060
1061static const AVClass class = {
1062 .class_name = "libx265",
1064 .option = options,
1066};
1067
1069 { "b", "0" },
1070 { "bf", "-1" },
1071 { "g", "-1" },
1072 { "keyint_min", "-1" },
1073 { "refs", "-1" },
1074 { "qmin", "-1" },
1075 { "qmax", "-1" },
1076 { "qdiff", "-1" },
1077 { "qblur", "-1" },
1078 { "qcomp", "-1" },
1079 { "i_qfactor", "-1" },
1080 { "b_qfactor", "-1" },
1081 { NULL },
1082};
1083
1085 .p.name = "libx265",
1086 CODEC_LONG_NAME("libx265 H.265 / HEVC"),
1087 .p.type = AVMEDIA_TYPE_VIDEO,
1088 .p.id = AV_CODEC_ID_HEVC,
1089 .p.capabilities = AV_CODEC_CAP_DR1 | AV_CODEC_CAP_DELAY |
1092 .color_ranges = AVCOL_RANGE_MPEG | AVCOL_RANGE_JPEG,
1093 .p.priv_class = &class,
1094 .p.wrapper_name = "libx265",
1095 .init = libx265_encode_init,
1096 .get_supported_config = libx265_get_supported_config,
1098 .close = libx265_encode_close,
1099 .priv_data_size = sizeof(libx265Context),
1101 .caps_internal = FF_CODEC_CAP_NOT_INIT_THREADSAFE |
1103};
uint8_t ptrdiff_t const uint8_t ptrdiff_t int intptr_t intptr_t int int16_t * dst
Definition dsp.h:87
SwsAArch64OpImplParams params
Definition ops.c:51
const FFCodec ff_libx265_encoder
Definition libx265.c:1084
#define VE
Definition amfenc_av1.c:30
static const FFCodecDefault defaults[]
Definition amfenc_av1.c:723
static FILE * out
static AVFormatContext * ctx
int ff_alloc_a53_sei(const AVFrame *frame, size_t prefix_len, void **data, size_t *sei_size)
Check AVFrame for A53 side data and allocate and fill SEI message with A53 info.
Definition atsc_a53.c:26
simple assert() macros that are a bit more flexible than ISO C assert().
#define av_assert0(cond)
assert() equivalent, that is always enabled.
Definition avassert.h:42
int ff_default_get_supported_config(const AVCodecContext *avctx, const AVCodec *codec, enum AVCodecConfig config, unsigned flags, const void **out_configs, int *out_num_configs)
Definition avcodec.c:765
Libavcodec external API header.
refcounted data buffer API
static int FUNC metadata(CodedBitstreamContext *ctx, RWContext *rw, APVRawMetadata *current)
#define flags(name, subs,...)
Definition cbs_h264.c:74
#define i(width, name, range_min, range_max)
Definition cbs_h264.c:63
static int FUNC sei(CodedBitstreamContext *ctx, RWContext *rw, H264RawSEI *current)
static int FUNC sei_payload(CodedBitstreamContext *ctx, RWContext *rw, LCEVCRawSEI *current, int payload_size)
static int FUNC nal(CodedBitstreamContext *ctx, RWContext *rw, LCEVCRawNAL *current, int nal_unit_type)
#define FF_CODEC_CAP_NOT_INIT_THREADSAFE
The codec is not known to be init-threadsafe (i.e.
#define FF_CODEC_ENCODE_CB(func)
#define CODEC_LONG_NAME(str)
#define FF_CODEC_CAP_AUTO_THREADS
Codec handles avctx->thread_count == 0 (auto) internally.
#define av_clipf
Definition common.h:145
#define NULL
Definition coverity.c:32
long long int64_t
Definition coverity.c:34
static AVPacket * pkt
static AVFrame * frame
void ff_dovi_ctx_unref(DOVIContext *s)
Completely reset a DOVIContext, preserving only logctx.
Definition dovi_rpu.c:30
#define FF_DOVI_AUTOMATIC
Enable tri-state.
Definition dovi_rpu.h:49
int ff_dovi_rpu_generate(DOVIContext *s, const AVDOVIMetadata *metadata, int flags, uint8_t **out_rpu, int *out_size)
Synthesize a Dolby Vision RPU reflecting the current state.
@ FF_DOVI_WRAP_NAL
wrap inside NAL RBSP
Definition dovi_rpu.h:159
int ff_dovi_configure(DOVIContext *s, AVCodecContext *avctx)
Variant of ff_dovi_configure_from_codedpar which infers the codec parameters from an AVCodecContext.
int ff_get_encode_buffer(AVCodecContext *avctx, AVPacket *avpkt, int64_t size, int flags)
Get a buffer for a packet.
Definition encode.c:106
AVCPBProperties * ff_encode_add_cpb_side_data(AVCodecContext *avctx)
Add a CPB properties side data to an encoding context.
Definition encode.c:1039
int ff_encode_add_stats_side_data(AVPacket *pkt, int quality, const int64_t error[], int error_count, enum AVPictureType pict_type)
Definition encode.c:1070
double value
Definition eval.c:102
static CheckasmStats stats
Definition checkasm.c:75
const char * key
@ AV_OPT_TYPE_CONST
Special option type for declaring named constants.
Definition opt.h:298
@ AV_OPT_TYPE_INT
Underlying C type is int.
Definition opt.h:258
@ AV_OPT_TYPE_FLOAT
Underlying C type is float.
Definition opt.h:270
@ AV_OPT_TYPE_DICT
Underlying C type is AVDictionary*.
Definition opt.h:289
@ AV_OPT_TYPE_BOOL
Underlying C type is int.
Definition opt.h:326
@ AV_OPT_TYPE_STRING
Underlying C type is a uint8_t* that is either NULL or points to a C string allocated with the av_mal...
Definition opt.h:275
#define AV_CODEC_CAP_ENCODER_REORDERED_OPAQUE
This encoder can reorder user opaque values from input AVFrames and return them with corresponding ou...
Definition codec.h:147
#define AV_CODEC_FLAG_PASS2
Use internal 2pass ratecontrol in second pass mode.
Definition avcodec.h:294
#define AV_CODEC_CAP_OTHER_THREADS
Codec supports multithreading through a method other than slice- or frame-level multithreading.
Definition codec.h:112
#define AV_CODEC_CAP_DELAY
Encoder or decoder requires flushing with NULL input at the end in order to give the complete and cor...
Definition codec.h:79
#define AV_CODEC_FLAG_CLOSED_GOP
Definition avcodec.h:332
#define AV_CODEC_CAP_DR1
Codec uses get_buffer() or get_encode_buffer() for allocating buffers and supports custom allocators.
Definition codec.h:49
#define AV_CODEC_FLAG_PASS1
Use internal 2pass ratecontrol in first pass mode.
Definition avcodec.h:290
#define AV_CODEC_FLAG_GLOBAL_HEADER
Place global headers in extradata instead of every keyframe.
Definition avcodec.h:318
#define AV_CODEC_FLAG_PSNR
error[?
Definition avcodec.h:306
#define AV_CODEC_FLAG_COPY_OPAQUE
Definition avcodec.h:279
@ AV_CODEC_ID_HEVC
Definition codec_id.h:223
#define AV_INPUT_BUFFER_PADDING_SIZE
Required number of additionally allocated bytes at the end of the input bitstream for decoding.
Definition defs.h:40
AVCodecConfig
Definition avcodec.h:2572
@ AV_CODEC_CONFIG_PIX_FORMAT
AVPixelFormat, terminated by AV_PIX_FMT_NONE.
Definition avcodec.h:2573
#define AV_PKT_FLAG_KEY
The packet contains a keyframe.
Definition packet.h:650
#define AV_PKT_FLAG_DISPOSABLE
Flag is used to indicate packets that contain frames that can be discarded by the decoder.
Definition packet.h:669
void av_buffer_unref(AVBufferRef **buf)
Free a given reference and automatically free the buffer if there are no more references to it.
Definition buffer.c:139
int av_buffer_replace(AVBufferRef **pdst, const AVBufferRef *src)
Ensure dst refers to the same data as src.
Definition buffer.c:233
const AVDictionaryEntry * av_dict_iterate(const AVDictionary *m, const AVDictionaryEntry *prev)
Iterate over a dictionary.
Definition dict.c:42
#define FF_QP2LAMBDA
factor to convert from H.263 QP to lambda
Definition avutil.h:226
#define AVERROR_EXTERNAL
Generic error in an external library.
Definition error.h:59
#define AVERROR_BUG
Internal bug, also see AVERROR_BUG2.
Definition error.h:52
#define AVERROR_INVALIDDATA
Invalid data found when processing input.
Definition error.h:61
#define av_err2str(errnum)
Convenience macro, the return value should be used only directly in function arguments but never stan...
Definition error.h:122
#define AVERROR(e)
Definition error.h:45
AVFrameSideData * av_frame_get_side_data(const AVFrame *frame, enum AVFrameSideDataType type)
Definition frame.c:659
static const AVFrameSideData * av_frame_side_data_get(AVFrameSideData *const *sd, const int nb_sd, enum AVFrameSideDataType type)
Wrapper around av_frame_side_data_get_c() to workaround the limitation that for any type T the conver...
Definition frame.h:1196
@ AV_FRAME_DATA_DOVI_METADATA
Parsed Dolby Vision metadata, suitable for passing to a software implementation.
Definition frame.h:208
@ AV_FRAME_DATA_CONTENT_LIGHT_LEVEL
Content light level (based on CTA-861.3).
Definition frame.h:137
@ AV_FRAME_DATA_SEI_UNREGISTERED
User data unregistered metadata associated with a video frame.
Definition frame.h:178
@ AV_FRAME_DATA_MASTERING_DISPLAY_METADATA
Mastering display metadata associated with a video frame.
Definition frame.h:120
@ AV_FRAME_DATA_REGIONS_OF_INTEREST
Regions Of Interest, the data is an array of AVRegionOfInterest type, the number of array element is ...
Definition frame.h:165
#define AV_LOG_QUIET
Print no output.
Definition log.h:192
#define AV_LOG_DEBUG
Stuff which is only useful for libav* developers.
Definition log.h:231
#define AV_LOG_WARNING
Something somehow does not look correct.
Definition log.h:216
#define AV_LOG_INFO
Standard information.
Definition log.h:221
#define AV_LOG_ERROR
Something went wrong and cannot losslessly be recovered.
Definition log.h:210
const char * av_default_item_name(void *ptr)
Return the context name.
Definition log.c:241
int av_log_get_level(void)
Get the current log level.
Definition log.c:471
int av_reduce(int *dst_num, int *dst_den, int64_t num, int64_t den, int64_t max)
Reduce a fraction.
Definition rational.c:35
int64_t av_rescale_q(int64_t a, AVRational bq, AVRational cq)
Rescale a 64-bit integer by 2 rational numbers.
void * av_fast_realloc(void *ptr, unsigned int *size, size_t min_size)
Reallocate the given buffer if it is not large enough, otherwise do nothing.
Definition mem.c:495
void * av_realloc_array(void *ptr, size_t nmemb, size_t size)
Definition mem.c:217
void * av_memdup(const void *p, size_t size)
Duplicate a buffer with av_malloc().
Definition mem.c:302
@ AVMEDIA_TYPE_VIDEO
Definition avutil.h:200
AVPictureType
Definition avutil.h:276
@ AV_PICTURE_TYPE_I
Intra.
Definition avutil.h:278
@ AV_PICTURE_TYPE_P
Predicted.
Definition avutil.h:279
@ AV_PICTURE_TYPE_B
Bi-dir predicted.
Definition avutil.h:280
#define LIBAVUTIL_VERSION_INT
Definition version.h:85
cl_device_type type
#define av_cold
Definition attributes.h:117
common internal API header
const char * desc
Definition libsvtav1.c:83
#define FF_X265_MAX_LAYERS
Definition libx265.c:49
static int is_keyframe(NalUnitType naltype)
Definition libx265.c:94
static int handle_side_data(AVCodecContext *avctx, const x265_api *api, x265_param *params)
Definition libx265.c:224
static av_cold int libx265_encode_set_roi(libx265Context *ctx, const AVFrame *frame, x265_picture *pic)
Definition libx265.c:637
static enum AVPixelFormat x265_csp_eight[]
Definition libx265.c:955
static int get_x265_log_level(AVCodecContext *avctx)
Definition libx265.c:254
static int libx265_encode_frame(AVCodecContext *avctx, AVPacket *pkt, const AVFrame *pic, int *got_packet)
Definition libx265.c:721
static int rd_get(libx265Context *ctx)
Definition libx265.c:109
static av_cold int libx265_encode_init(AVCodecContext *avctx)
Definition libx265.c:272
static av_cold int libx265_param_parse_float(AVCodecContext *avctx, const char *key, float value)
Definition libx265.c:162
static enum AVPixelFormat x265_csp_twelve[]
Definition libx265.c:991
static enum AVPixelFormat x265_csp_ten[]
Definition libx265.c:970
static av_cold int libx265_encode_close(AVCodecContext *avctx)
Definition libx265.c:143
static const FFCodecDefault x265_defaults[]
Definition libx265.c:1068
static void rd_release(libx265Context *ctx, int idx)
Definition libx265.c:136
#define OFFSET(x)
Definition libx265.c:1041
static int handle_mdcv(void *logctx, const x265_api *api, x265_param *params, const AVMasteringDisplayMetadata *mdcv)
Definition libx265.c:192
static int libx265_get_supported_config(const AVCodecContext *avctx, const AVCodec *codec, enum AVCodecConfig config, unsigned flags, const void **out, int *out_num)
Definition libx265.c:1017
static av_cold int libx265_param_parse_int(AVCodecContext *avctx, const char *key, int value)
Definition libx265.c:177
static void free_picture(libx265Context *ctx, x265_picture *pic)
Definition libx265.c:701
#define FFMIN(a, b)
Definition macros.h:49
void * av_calloc(size_t nmemb, size_t size)
Definition mem.c:264
Memory handling functions.
int profile
Definition mxfenc.c:2299
#define av_malloc(s)
Definition ops_static.c:52
AVOptions.
const AVPixFmtDescriptor * av_pix_fmt_desc_get(enum AVPixelFormat pix_fmt)
Definition pixdesc.c:3460
#define AV_PIX_FMT_FLAG_ALPHA
The pixel format has an alpha channel.
Definition pixdesc.h:147
#define AV_PIX_FMT_FLAG_RGB
The pixel format contains RGB-like data (as opposed to YUV/grayscale).
Definition pixdesc.h:136
#define AV_PIX_FMT_YUV444P12
Definition pixfmt.h:552
@ AVCHROMA_LOC_UNSPECIFIED
Definition pixfmt.h:803
#define AV_PIX_FMT_YUV420P10
Definition pixfmt.h:545
@ AVCOL_RANGE_MPEG
Narrow or limited range content.
Definition pixfmt.h:766
@ AVCOL_RANGE_UNSPECIFIED
Definition pixfmt.h:749
@ AVCOL_RANGE_JPEG
Full range content.
Definition pixfmt.h:783
#define AV_PIX_FMT_YUV420P12
Definition pixfmt.h:549
#define AV_PIX_FMT_YUVA420P10
Definition pixfmt.h:596
#define AV_PIX_FMT_YUV422P12
Definition pixfmt.h:550
#define AV_PIX_FMT_GBRP10
Definition pixfmt.h:564
#define AV_PIX_FMT_YUV422P10
Definition pixfmt.h:546
#define AV_PIX_FMT_GRAY12
Definition pixfmt.h:526
#define AV_PIX_FMT_GBRP12
Definition pixfmt.h:565
AVPixelFormat
Pixel format.
Definition pixfmt.h:71
@ AV_PIX_FMT_NONE
Definition pixfmt.h:72
@ AV_PIX_FMT_YUV420P
planar YUV 4:2:0, 12bpp, (1 Cr & Cb sample per 2x2 Y samples)
Definition pixfmt.h:73
@ AV_PIX_FMT_YUV422P
planar YUV 4:2:2, 16bpp, (1 Cr & Cb sample per 2x1 Y samples)
Definition pixfmt.h:77
@ AV_PIX_FMT_GRAY8
Y , 8bpp.
Definition pixfmt.h:81
@ AV_PIX_FMT_YUVA420P
planar YUV 4:2:0, 20bpp, (1 Cr & Cb sample per 2x2 Y & A samples)
Definition pixfmt.h:108
@ AV_PIX_FMT_YUV444P
planar YUV 4:4:4, 24bpp, (1 Cr & Cb sample per 1x1 Y samples)
Definition pixfmt.h:78
@ AV_PIX_FMT_YUVJ422P
planar YUV 4:2:2, 16bpp, full scale (JPEG), deprecated in favor of AV_PIX_FMT_YUV422P and setting col...
Definition pixfmt.h:86
@ AV_PIX_FMT_GBRP
planar GBR 4:4:4 24bpp
Definition pixfmt.h:165
@ AV_PIX_FMT_YUVJ444P
planar YUV 4:4:4, 24bpp, full scale (JPEG), deprecated in favor of AV_PIX_FMT_YUV444P and setting col...
Definition pixfmt.h:87
@ AV_PIX_FMT_YUVJ420P
planar YUV 4:2:0, 12bpp, full scale (JPEG), deprecated in favor of AV_PIX_FMT_YUV420P and setting col...
Definition pixfmt.h:85
#define AV_PIX_FMT_GRAY10
Definition pixfmt.h:525
@ AVCOL_PRI_UNSPECIFIED
Definition pixfmt.h:645
@ AVCOL_TRC_ARIB_STD_B67
ARIB STD-B67, known as "Hybrid log-gamma".
Definition pixfmt.h:693
@ AVCOL_TRC_UNSPECIFIED
Definition pixfmt.h:675
#define AV_PIX_FMT_YUV444P10
Definition pixfmt.h:548
@ AVCOL_SPC_RGB
order of coefficients is actually GBR, also IEC 61966-2-1 (sRGB), YZX and ST 428-1
Definition pixfmt.h:707
@ AVCOL_SPC_UNSPECIFIED
Definition pixfmt.h:709
@ SEI_TYPE_USER_DATA_REGISTERED_ITU_T_T35
Definition sei.h:34
@ SEI_TYPE_USER_DATA_UNREGISTERED
Definition sei.h:35
#define FF_ARRAY_ELEMS(a)
#define snprintf
Definition snprintf.h:34
A reference to a data buffer.
Definition buffer.h:82
This structure describes the bitrate properties of an encoded bitstream.
Definition defs.h:282
int64_t avg_bitrate
Average bitrate of the stream, in bits per second.
Definition defs.h:297
int64_t max_bitrate
Maximum bitrate of the stream, in bits per second.
Definition defs.h:287
int64_t buffer_size
The size of the buffer to which the ratecontrol is applied, in bits.
Definition defs.h:303
Describe the class of an AVClass context structure.
Definition log.h:76
const char * class_name
The name of the class; usually it is the same name as the context structure type to which the AVClass...
Definition log.h:81
main external API structure.
Definition avcodec.h:443
enum AVPixelFormat pix_fmt
Pixel format, see AV_PIX_FMT_xxx.
Definition avcodec.h:643
int max_qdiff
maximum quantizer difference between frames
Definition avcodec.h:1266
int width
picture width / height.
Definition avcodec.h:604
int rc_buffer_size
decoder bitstream buffer size
Definition avcodec.h:1273
enum AVColorRange color_range
MPEG vs JPEG YUV range.
Definition avcodec.h:681
enum AVColorPrimaries color_primaries
Chromaticity coordinates of the source primaries.
Definition avcodec.h:657
int max_b_frames
maximum number of B-frames between non-B-frames Note: The output will be delayed by max_b_frames+1 re...
Definition avcodec.h:781
int qmin
minimum quantizer
Definition avcodec.h:1252
int keyint_min
minimum GOP size
Definition avcodec.h:1014
float b_quant_factor
qscale factor between IP and B-frames If > 0 then the last P-frame quantizer will be used (q= lastp_q...
Definition avcodec.h:790
AVRational framerate
Definition avcodec.h:563
AVRational sample_aspect_ratio
sample aspect ratio (0 if unknown) That is the width of a pixel divided by the height of the pixel.
Definition avcodec.h:628
int64_t bit_rate
the average bitrate
Definition avcodec.h:493
int rc_initial_buffer_occupancy
Number of bits which should be loaded into the rc buffer before decoding starts.
Definition avcodec.h:1316
int log_level_offset
Definition avcodec.h:449
int nb_decoded_side_data
Definition avcodec.h:1930
enum AVColorSpace colorspace
YUV colorspace type.
Definition avcodec.h:671
int gop_size
the number of pictures in a group of pictures, or 0 for intra_only
Definition avcodec.h:1021
int refs
number of reference frames
Definition avcodec.h:701
int64_t rc_max_rate
maximum bitrate
Definition avcodec.h:1288
int thread_count
thread count is used to decide how many independent tasks should be passed to execute()
Definition avcodec.h:1579
int qmax
maximum quantizer
Definition avcodec.h:1259
enum AVColorTransferCharacteristic color_trc
Color Transfer Characteristic.
Definition avcodec.h:664
AVRational time_base
This is the fundamental unit of time (in seconds) in terms of which frame timestamps are represented.
Definition avcodec.h:547
int flags
AV_CODEC_FLAG_*.
Definition avcodec.h:500
AVFrameSideData ** decoded_side_data
Array containing static side data, such as HDR10 CLL / MDCV structures.
Definition avcodec.h:1929
uint8_t * extradata
Out-of-band global headers that may be used by some codecs.
Definition avcodec.h:526
enum AVChromaLocation chroma_sample_location
This defines the location of chroma samples.
Definition avcodec.h:688
float qcompress
amount of qscale change between easy & hard scenes (0.0-1.0)
Definition avcodec.h:1244
float qblur
amount of qscale smoothing over time (0.0-1.0)
Definition avcodec.h:1245
int extradata_size
Definition avcodec.h:527
float i_quant_factor
qscale factor between P- and I-frames If > 0 then the last P-frame quantizer will be used (q = lastp_...
Definition avcodec.h:806
void * priv_data
Definition avcodec.h:470
AVCodec.
Definition codec.h:175
int depth
Number of bits in the component.
Definition pixdesc.h:57
Content light level needed by to transmit HDR over HDMI (CTA-861.3).
unsigned MaxFALL
Max average light level per frame (cd/m^2).
unsigned MaxCLL
Max content light level (cd/m^2).
Combined struct representing a combination of header, mapping and color metadata, for attaching to fr...
Definition dovi_meta.h:345
char * key
Definition dict.h:91
char * value
Definition dict.h:92
Structure to hold side data for an AVFrame.
Definition frame.h:327
enum AVFrameSideDataType type
Definition frame.h:328
size_t size
Definition frame.h:330
uint8_t * data
Definition frame.h:329
This structure describes decoded (raw) audio or video data.
Definition frame.h:472
int64_t pts
Presentation timestamp in time_base units (time when frame should be shown to user).
Definition frame.h:574
uint8_t * data[AV_NUM_DATA_POINTERS]
pointer to the picture/channel planes.
Definition frame.h:493
void * opaque
Frame owner's private data.
Definition frame.h:610
AVFrameSideData ** side_data
Definition frame.h:669
AVBufferRef * opaque_ref
Frame owner's private data.
Definition frame.h:785
int nb_side_data
Definition frame.h:670
int linesize[AV_NUM_DATA_POINTERS]
For video, a positive or negative value, which is typically indicating the size in bytes of each pict...
Definition frame.h:517
int64_t duration
Duration of the frame, in the same units as pts.
Definition frame.h:820
enum AVPictureType pict_type
Picture type of the frame.
Definition frame.h:564
Mastering display metadata capable of representing the color volume of the display used to master the...
AVRational max_luminance
Max luminance of mastering display (cd/m^2).
AVRational min_luminance
Min luminance of mastering display (cd/m^2).
AVRational display_primaries[3][2]
CIE 1931 xy chromaticity coords of color primaries (r, g, b order).
AVRational white_point[2]
CIE 1931 xy chromaticity coords of white point.
AVOption.
Definition opt.h:428
This structure stores compressed data.
Definition packet.h:580
Descriptor that unambiguously describes how the bits of a pixel are stored in the up to 4 data planes...
Definition pixdesc.h:69
AVComponentDescriptor comp[4]
Parameters that describe how pixels are packed.
Definition pixdesc.h:105
Rational number (pair of numerator and denominator).
Definition rational.h:58
int num
Numerator.
Definition rational.h:59
int den
Denominator.
Definition rational.h:60
Structure describing a single Region Of Interest.
Definition frame.h:398
uint32_t self_size
Must be set to the size of this data structure (that is, sizeof(AVRegionOfInterest)).
Definition frame.h:403
AVRational qoffset
Quantisation offset.
Definition frame.h:440
int top
Distance in pixels from the top edge of the frame to the top and bottom edges and from the left edge ...
Definition frame.h:413
int64_t duration
Definition libx265.c:53
void * frame_opaque
Definition libx265.c:55
AVBufferRef * frame_opaque_ref
Definition libx265.c:56
char * tune
Definition libx265.c:72
const x265_api * api
Definition libx265.c:66
x265_param * params
Definition libx265.c:65
x265_encoder * encoder
Definition libx265.c:64
char * profile
Definition libx265.c:73
int sei_data_size
Definition libx265.c:78
AVDictionary * x265_opts
Definition libx265.c:75
ReorderedData * rd
Definition libx265.c:82
int roi_warned
If the encoder does not support ROI then warn the first time we encounter a frame with ROI side data.
Definition libx265.c:89
char * stats
Definition libx265.c:74
char * preset
Definition libx265.c:71
void * sei_data
Definition libx265.c:77
DOVIContext dovi
Definition libx265.c:91
uint8_t level
Definition svq3.c:208
#define av_free(p)
#define av_freep(p)
#define av_log(a,...)
static uint8_t tmp[40]
Definition aes_ctr.c:52
preset
Definition vf_curves.c:47