FFmpeg
libaomenc.c
Go to the documentation of this file.
1 /*
2  * Copyright (c) 2010, Google, Inc.
3  *
4  * This file is part of FFmpeg.
5  *
6  * FFmpeg is free software; you can redistribute it and/or
7  * modify it under the terms of the GNU Lesser General Public
8  * License as published by the Free Software Foundation; either
9  * version 2.1 of the License, or (at your option) any later version.
10  *
11  * FFmpeg is distributed in the hope that it will be useful,
12  * but WITHOUT ANY WARRANTY; without even the implied warranty of
13  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
14  * Lesser General Public License for more details.
15  *
16  * You should have received a copy of the GNU Lesser General Public
17  * License along with FFmpeg; if not, write to the Free Software
18  * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
19  */
20 
21 /**
22  * @file
23  * AV1 encoder support via libaom
24  */
25 
26 #define AOM_DISABLE_CTRL_TYPECHECKS 1
27 #include <aom/aom_encoder.h>
28 #include <aom/aomcx.h>
29 
30 #include "libavutil/avassert.h"
31 #include "libavutil/base64.h"
32 #include "libavutil/common.h"
33 #include "libavutil/mathematics.h"
34 #include "libavutil/opt.h"
35 #include "libavutil/pixdesc.h"
36 
37 #include "av1.h"
38 #include "avcodec.h"
39 #include "internal.h"
40 #include "packet_internal.h"
41 #include "profiles.h"
42 
43 /*
44  * Portion of struct aom_codec_cx_pkt from aom_encoder.h.
45  * One encoded frame returned from the library.
46  */
47 struct FrameListData {
48  void *buf; /**< compressed data buffer */
49  size_t sz; /**< length of compressed data */
50  int64_t pts; /**< time stamp to show frame
51  (in timebase units) */
52  unsigned long duration; /**< duration to show frame
53  (in timebase units) */
54  uint32_t flags; /**< flags for this frame */
55  uint64_t sse[4];
56  int have_sse; /**< true if we have pending sse[] */
57  uint64_t frame_number;
59 };
60 
61 typedef struct AOMEncoderContext {
62  AVClass *class;
64  struct aom_codec_ctx encoder;
65  struct aom_image rawimg;
66  struct aom_fixed_buf twopass_stats;
68  int cpu_used;
72  int aq_mode;
75  int crf;
80  uint64_t sse[4];
81  int have_sse; /**< true if we have pending sse[] */
82  uint64_t frame_number;
90  aom_superblock_size_t superblock_size;
92  int row_mt;
97  int usage;
98  int tune;
99 } AOMContext;
100 
101 static const char *const ctlidstr[] = {
102  [AOME_SET_CPUUSED] = "AOME_SET_CPUUSED",
103  [AOME_SET_CQ_LEVEL] = "AOME_SET_CQ_LEVEL",
104  [AOME_SET_ENABLEAUTOALTREF] = "AOME_SET_ENABLEAUTOALTREF",
105  [AOME_SET_ARNR_MAXFRAMES] = "AOME_SET_ARNR_MAXFRAMES",
106  [AOME_SET_ARNR_STRENGTH] = "AOME_SET_ARNR_STRENGTH",
107  [AOME_SET_STATIC_THRESHOLD] = "AOME_SET_STATIC_THRESHOLD",
108  [AV1E_SET_COLOR_RANGE] = "AV1E_SET_COLOR_RANGE",
109  [AV1E_SET_COLOR_PRIMARIES] = "AV1E_SET_COLOR_PRIMARIES",
110  [AV1E_SET_MATRIX_COEFFICIENTS] = "AV1E_SET_MATRIX_COEFFICIENTS",
111  [AV1E_SET_TRANSFER_CHARACTERISTICS] = "AV1E_SET_TRANSFER_CHARACTERISTICS",
112  [AV1E_SET_AQ_MODE] = "AV1E_SET_AQ_MODE",
113  [AV1E_SET_FRAME_PARALLEL_DECODING] = "AV1E_SET_FRAME_PARALLEL_DECODING",
114  [AV1E_SET_SUPERBLOCK_SIZE] = "AV1E_SET_SUPERBLOCK_SIZE",
115  [AV1E_SET_TILE_COLUMNS] = "AV1E_SET_TILE_COLUMNS",
116  [AV1E_SET_TILE_ROWS] = "AV1E_SET_TILE_ROWS",
117  [AV1E_SET_ENABLE_RESTORATION] = "AV1E_SET_ENABLE_RESTORATION",
118 #ifdef AOM_CTRL_AV1E_SET_ROW_MT
119  [AV1E_SET_ROW_MT] = "AV1E_SET_ROW_MT",
120 #endif
121 #ifdef AOM_CTRL_AV1E_SET_DENOISE_NOISE_LEVEL
122  [AV1E_SET_DENOISE_NOISE_LEVEL] = "AV1E_SET_DENOISE_NOISE_LEVEL",
123 #endif
124 #ifdef AOM_CTRL_AV1E_SET_DENOISE_BLOCK_SIZE
125  [AV1E_SET_DENOISE_BLOCK_SIZE] = "AV1E_SET_DENOISE_BLOCK_SIZE",
126 #endif
127 #ifdef AOM_CTRL_AV1E_SET_MAX_REFERENCE_FRAMES
128  [AV1E_SET_MAX_REFERENCE_FRAMES] = "AV1E_SET_MAX_REFERENCE_FRAMES",
129 #endif
130 #ifdef AOM_CTRL_AV1E_SET_ENABLE_GLOBAL_MOTION
131  [AV1E_SET_ENABLE_GLOBAL_MOTION] = "AV1E_SET_ENABLE_GLOBAL_MOTION",
132 #endif
133 #ifdef AOM_CTRL_AV1E_SET_ENABLE_INTRABC
134  [AV1E_SET_ENABLE_INTRABC] = "AV1E_SET_ENABLE_INTRABC",
135 #endif
136  [AV1E_SET_ENABLE_CDEF] = "AV1E_SET_ENABLE_CDEF",
137  [AOME_SET_TUNING] = "AOME_SET_TUNING",
138 };
139 
140 static av_cold void log_encoder_error(AVCodecContext *avctx, const char *desc)
141 {
142  AOMContext *ctx = avctx->priv_data;
143  const char *error = aom_codec_error(&ctx->encoder);
144  const char *detail = aom_codec_error_detail(&ctx->encoder);
145 
146  av_log(avctx, AV_LOG_ERROR, "%s: %s\n", desc, error);
147  if (detail)
148  av_log(avctx, AV_LOG_ERROR, " Additional information: %s\n", detail);
149 }
150 
152  const struct aom_codec_enc_cfg *cfg)
153 {
154  int width = -30;
155  int level = AV_LOG_DEBUG;
156 
157  av_log(avctx, level, "aom_codec_enc_cfg\n");
158  av_log(avctx, level, "generic settings\n"
159  " %*s%u\n %*s%u\n %*s%u\n %*s%u\n %*s%u\n"
160  " %*s%u\n %*s%u\n"
161  " %*s{%u/%u}\n %*s%u\n %*s%d\n %*s%u\n",
162  width, "g_usage:", cfg->g_usage,
163  width, "g_threads:", cfg->g_threads,
164  width, "g_profile:", cfg->g_profile,
165  width, "g_w:", cfg->g_w,
166  width, "g_h:", cfg->g_h,
167  width, "g_bit_depth:", cfg->g_bit_depth,
168  width, "g_input_bit_depth:", cfg->g_input_bit_depth,
169  width, "g_timebase:", cfg->g_timebase.num, cfg->g_timebase.den,
170  width, "g_error_resilient:", cfg->g_error_resilient,
171  width, "g_pass:", cfg->g_pass,
172  width, "g_lag_in_frames:", cfg->g_lag_in_frames);
173  av_log(avctx, level, "rate control settings\n"
174  " %*s%u\n %*s%d\n %*s%p(%"SIZE_SPECIFIER")\n %*s%u\n",
175  width, "rc_dropframe_thresh:", cfg->rc_dropframe_thresh,
176  width, "rc_end_usage:", cfg->rc_end_usage,
177  width, "rc_twopass_stats_in:", cfg->rc_twopass_stats_in.buf, cfg->rc_twopass_stats_in.sz,
178  width, "rc_target_bitrate:", cfg->rc_target_bitrate);
179  av_log(avctx, level, "quantizer settings\n"
180  " %*s%u\n %*s%u\n",
181  width, "rc_min_quantizer:", cfg->rc_min_quantizer,
182  width, "rc_max_quantizer:", cfg->rc_max_quantizer);
183  av_log(avctx, level, "bitrate tolerance\n"
184  " %*s%u\n %*s%u\n",
185  width, "rc_undershoot_pct:", cfg->rc_undershoot_pct,
186  width, "rc_overshoot_pct:", cfg->rc_overshoot_pct);
187  av_log(avctx, level, "decoder buffer model\n"
188  " %*s%u\n %*s%u\n %*s%u\n",
189  width, "rc_buf_sz:", cfg->rc_buf_sz,
190  width, "rc_buf_initial_sz:", cfg->rc_buf_initial_sz,
191  width, "rc_buf_optimal_sz:", cfg->rc_buf_optimal_sz);
192  av_log(avctx, level, "2 pass rate control settings\n"
193  " %*s%u\n %*s%u\n %*s%u\n",
194  width, "rc_2pass_vbr_bias_pct:", cfg->rc_2pass_vbr_bias_pct,
195  width, "rc_2pass_vbr_minsection_pct:", cfg->rc_2pass_vbr_minsection_pct,
196  width, "rc_2pass_vbr_maxsection_pct:", cfg->rc_2pass_vbr_maxsection_pct);
197  av_log(avctx, level, "keyframing settings\n"
198  " %*s%d\n %*s%u\n %*s%u\n",
199  width, "kf_mode:", cfg->kf_mode,
200  width, "kf_min_dist:", cfg->kf_min_dist,
201  width, "kf_max_dist:", cfg->kf_max_dist);
202  av_log(avctx, level, "tile settings\n"
203  " %*s%d\n %*s%d\n",
204  width, "tile_width_count:", cfg->tile_width_count,
205  width, "tile_height_count:", cfg->tile_height_count);
206  av_log(avctx, level, "\n");
207 }
208 
209 static void coded_frame_add(void *list, struct FrameListData *cx_frame)
210 {
211  struct FrameListData **p = list;
212 
213  while (*p)
214  p = &(*p)->next;
215  *p = cx_frame;
216  cx_frame->next = NULL;
217 }
218 
219 static av_cold void free_coded_frame(struct FrameListData *cx_frame)
220 {
221  av_freep(&cx_frame->buf);
222  av_freep(&cx_frame);
223 }
224 
226 {
227  struct FrameListData *p = list;
228 
229  while (p) {
230  list = list->next;
231  free_coded_frame(p);
232  p = list;
233  }
234 }
235 
237 #ifdef UENUM1BYTE
238  aome_enc_control_id id,
239 #else
240  enum aome_enc_control_id id,
241 #endif
242  int val)
243 {
244  AOMContext *ctx = avctx->priv_data;
245  char buf[80];
246  int width = -30;
247  int res;
248 
249  snprintf(buf, sizeof(buf), "%s:", ctlidstr[id]);
250  av_log(avctx, AV_LOG_DEBUG, " %*s%d\n", width, buf, val);
251 
252  res = aom_codec_control(&ctx->encoder, id, val);
253  if (res != AOM_CODEC_OK) {
254  snprintf(buf, sizeof(buf), "Failed to set %s codec control",
255  ctlidstr[id]);
256  log_encoder_error(avctx, buf);
257  return AVERROR(EINVAL);
258  }
259 
260  return 0;
261 }
262 
263 static av_cold int aom_free(AVCodecContext *avctx)
264 {
265  AOMContext *ctx = avctx->priv_data;
266 
267  aom_codec_destroy(&ctx->encoder);
268  av_freep(&ctx->twopass_stats.buf);
269  av_freep(&avctx->stats_out);
270  free_frame_list(ctx->coded_frame_list);
271  av_bsf_free(&ctx->bsf);
272  return 0;
273 }
274 
275 static int set_pix_fmt(AVCodecContext *avctx, aom_codec_caps_t codec_caps,
276  struct aom_codec_enc_cfg *enccfg, aom_codec_flags_t *flags,
277  aom_img_fmt_t *img_fmt)
278 {
279  AOMContext av_unused *ctx = avctx->priv_data;
280  enccfg->g_bit_depth = enccfg->g_input_bit_depth = 8;
281  switch (avctx->pix_fmt) {
282  case AV_PIX_FMT_YUV420P:
283  enccfg->g_profile = FF_PROFILE_AV1_MAIN;
284  *img_fmt = AOM_IMG_FMT_I420;
285  return 0;
286  case AV_PIX_FMT_YUV422P:
287  enccfg->g_profile = FF_PROFILE_AV1_PROFESSIONAL;
288  *img_fmt = AOM_IMG_FMT_I422;
289  return 0;
290  case AV_PIX_FMT_YUV444P:
291  enccfg->g_profile = FF_PROFILE_AV1_HIGH;
292  *img_fmt = AOM_IMG_FMT_I444;
293  return 0;
296  if (codec_caps & AOM_CODEC_CAP_HIGHBITDEPTH) {
297  enccfg->g_bit_depth = enccfg->g_input_bit_depth =
298  avctx->pix_fmt == AV_PIX_FMT_YUV420P10 ? 10 : 12;
299  enccfg->g_profile =
300  enccfg->g_bit_depth == 10 ? FF_PROFILE_AV1_MAIN : FF_PROFILE_AV1_PROFESSIONAL;
301  *img_fmt = AOM_IMG_FMT_I42016;
302  *flags |= AOM_CODEC_USE_HIGHBITDEPTH;
303  return 0;
304  }
305  break;
308  if (codec_caps & AOM_CODEC_CAP_HIGHBITDEPTH) {
309  enccfg->g_bit_depth = enccfg->g_input_bit_depth =
310  avctx->pix_fmt == AV_PIX_FMT_YUV422P10 ? 10 : 12;
311  enccfg->g_profile = FF_PROFILE_AV1_PROFESSIONAL;
312  *img_fmt = AOM_IMG_FMT_I42216;
313  *flags |= AOM_CODEC_USE_HIGHBITDEPTH;
314  return 0;
315  }
316  break;
319  if (codec_caps & AOM_CODEC_CAP_HIGHBITDEPTH) {
320  enccfg->g_bit_depth = enccfg->g_input_bit_depth =
321  avctx->pix_fmt == AV_PIX_FMT_YUV444P10 ? 10 : 12;
322  enccfg->g_profile =
323  enccfg->g_bit_depth == 10 ? FF_PROFILE_AV1_HIGH : FF_PROFILE_AV1_PROFESSIONAL;
324  *img_fmt = AOM_IMG_FMT_I44416;
325  *flags |= AOM_CODEC_USE_HIGHBITDEPTH;
326  return 0;
327  }
328  break;
329  default:
330  break;
331  }
332  av_log(avctx, AV_LOG_ERROR, "Unsupported pixel format.\n");
333  return AVERROR_INVALIDDATA;
334 }
335 
336 static void set_color_range(AVCodecContext *avctx)
337 {
338  aom_color_range_t aom_cr;
339  switch (avctx->color_range) {
341  case AVCOL_RANGE_MPEG: aom_cr = AOM_CR_STUDIO_RANGE; break;
342  case AVCOL_RANGE_JPEG: aom_cr = AOM_CR_FULL_RANGE; break;
343  default:
344  av_log(avctx, AV_LOG_WARNING, "Unsupported color range (%d)\n",
345  avctx->color_range);
346  return;
347  }
348 
349  codecctl_int(avctx, AV1E_SET_COLOR_RANGE, aom_cr);
350 }
351 
352 static int count_uniform_tiling(int dim, int sb_size, int tiles_log2)
353 {
354  int sb_dim = (dim + sb_size - 1) / sb_size;
355  int tile_dim = (sb_dim + (1 << tiles_log2) - 1) >> tiles_log2;
356  av_assert0(tile_dim > 0);
357  return (sb_dim + tile_dim - 1) / tile_dim;
358 }
359 
360 static int choose_tiling(AVCodecContext *avctx,
361  struct aom_codec_enc_cfg *enccfg)
362 {
363  AOMContext *ctx = avctx->priv_data;
364  int sb_128x128_possible, sb_size, sb_width, sb_height;
365  int uniform_rows, uniform_cols;
366  int uniform_64x64_possible, uniform_128x128_possible;
367  int tile_size, rounding, i;
368 
369  if (ctx->tile_cols_log2 >= 0)
370  ctx->tile_cols = 1 << ctx->tile_cols_log2;
371  if (ctx->tile_rows_log2 >= 0)
372  ctx->tile_rows = 1 << ctx->tile_rows_log2;
373 
374  if (ctx->tile_cols == 0) {
375  ctx->tile_cols = (avctx->width + AV1_MAX_TILE_WIDTH - 1) /
377  if (ctx->tile_cols > 1) {
378  av_log(avctx, AV_LOG_DEBUG, "Automatically using %d tile "
379  "columns to fill width.\n", ctx->tile_cols);
380  }
381  }
382  av_assert0(ctx->tile_cols > 0);
383  if (ctx->tile_rows == 0) {
384  int max_tile_width =
385  FFALIGN((FFALIGN(avctx->width, 128) +
386  ctx->tile_cols - 1) / ctx->tile_cols, 128);
387  ctx->tile_rows =
388  (max_tile_width * FFALIGN(avctx->height, 128) +
390  if (ctx->tile_rows > 1) {
391  av_log(avctx, AV_LOG_DEBUG, "Automatically using %d tile "
392  "rows to fill area.\n", ctx->tile_rows);
393  }
394  }
395  av_assert0(ctx->tile_rows > 0);
396 
397  if ((avctx->width + 63) / 64 < ctx->tile_cols ||
398  (avctx->height + 63) / 64 < ctx->tile_rows) {
399  av_log(avctx, AV_LOG_ERROR, "Invalid tile sizing: frame not "
400  "large enough to fit specified tile arrangement.\n");
401  return AVERROR(EINVAL);
402  }
403  if (ctx->tile_cols > AV1_MAX_TILE_COLS ||
404  ctx->tile_rows > AV1_MAX_TILE_ROWS) {
405  av_log(avctx, AV_LOG_ERROR, "Invalid tile sizing: AV1 does "
406  "not allow more than %dx%d tiles.\n",
408  return AVERROR(EINVAL);
409  }
410  if (avctx->width / ctx->tile_cols > AV1_MAX_TILE_WIDTH) {
411  av_log(avctx, AV_LOG_ERROR, "Invalid tile sizing: AV1 does "
412  "not allow tiles of width greater than %d.\n",
414  return AVERROR(EINVAL);
415  }
416 
417  ctx->superblock_size = AOM_SUPERBLOCK_SIZE_DYNAMIC;
418 
419  if (ctx->tile_cols == 1 && ctx->tile_rows == 1) {
420  av_log(avctx, AV_LOG_DEBUG, "Using a single tile.\n");
421  return 0;
422  }
423 
424  sb_128x128_possible =
425  (avctx->width + 127) / 128 >= ctx->tile_cols &&
426  (avctx->height + 127) / 128 >= ctx->tile_rows;
427 
428  ctx->tile_cols_log2 = ctx->tile_cols == 1 ? 0 :
429  av_log2(ctx->tile_cols - 1) + 1;
430  ctx->tile_rows_log2 = ctx->tile_rows == 1 ? 0 :
431  av_log2(ctx->tile_rows - 1) + 1;
432 
433  uniform_cols = count_uniform_tiling(avctx->width,
434  64, ctx->tile_cols_log2);
435  uniform_rows = count_uniform_tiling(avctx->height,
436  64, ctx->tile_rows_log2);
437  av_log(avctx, AV_LOG_DEBUG, "Uniform with 64x64 superblocks "
438  "-> %dx%d tiles.\n", uniform_cols, uniform_rows);
439  uniform_64x64_possible = uniform_cols == ctx->tile_cols &&
440  uniform_rows == ctx->tile_rows;
441 
442  if (sb_128x128_possible) {
443  uniform_cols = count_uniform_tiling(avctx->width,
444  128, ctx->tile_cols_log2);
445  uniform_rows = count_uniform_tiling(avctx->height,
446  128, ctx->tile_rows_log2);
447  av_log(avctx, AV_LOG_DEBUG, "Uniform with 128x128 superblocks "
448  "-> %dx%d tiles.\n", uniform_cols, uniform_rows);
449  uniform_128x128_possible = uniform_cols == ctx->tile_cols &&
450  uniform_rows == ctx->tile_rows;
451  } else {
452  av_log(avctx, AV_LOG_DEBUG, "128x128 superblocks not possible.\n");
453  uniform_128x128_possible = 0;
454  }
455 
456  ctx->uniform_tiles = 1;
457  if (uniform_64x64_possible && uniform_128x128_possible) {
458  av_log(avctx, AV_LOG_DEBUG, "Using uniform tiling with dynamic "
459  "superblocks (tile_cols_log2 = %d, tile_rows_log2 = %d).\n",
460  ctx->tile_cols_log2, ctx->tile_rows_log2);
461  return 0;
462  }
463  if (uniform_64x64_possible && !sb_128x128_possible) {
464  av_log(avctx, AV_LOG_DEBUG, "Using uniform tiling with 64x64 "
465  "superblocks (tile_cols_log2 = %d, tile_rows_log2 = %d).\n",
466  ctx->tile_cols_log2, ctx->tile_rows_log2);
467  ctx->superblock_size = AOM_SUPERBLOCK_SIZE_64X64;
468  return 0;
469  }
470  if (uniform_128x128_possible) {
471  av_log(avctx, AV_LOG_DEBUG, "Using uniform tiling with 128x128 "
472  "superblocks (tile_cols_log2 = %d, tile_rows_log2 = %d).\n",
473  ctx->tile_cols_log2, ctx->tile_rows_log2);
474  ctx->superblock_size = AOM_SUPERBLOCK_SIZE_128X128;
475  return 0;
476  }
477  ctx->uniform_tiles = 0;
478 
479  if (sb_128x128_possible) {
480  sb_size = 128;
481  ctx->superblock_size = AOM_SUPERBLOCK_SIZE_128X128;
482  } else {
483  sb_size = 64;
484  ctx->superblock_size = AOM_SUPERBLOCK_SIZE_64X64;
485  }
486  av_log(avctx, AV_LOG_DEBUG, "Using fixed tiling with %dx%d "
487  "superblocks (tile_cols = %d, tile_rows = %d).\n",
488  sb_size, sb_size, ctx->tile_cols, ctx->tile_rows);
489 
490  enccfg->tile_width_count = ctx->tile_cols;
491  enccfg->tile_height_count = ctx->tile_rows;
492 
493  sb_width = (avctx->width + sb_size - 1) / sb_size;
494  sb_height = (avctx->height + sb_size - 1) / sb_size;
495 
496  tile_size = sb_width / ctx->tile_cols;
497  rounding = sb_width % ctx->tile_cols;
498  for (i = 0; i < ctx->tile_cols; i++) {
499  enccfg->tile_widths[i] = tile_size +
500  (i < rounding / 2 ||
501  i > ctx->tile_cols - 1 - (rounding + 1) / 2);
502  }
503 
504  tile_size = sb_height / ctx->tile_rows;
505  rounding = sb_height % ctx->tile_rows;
506  for (i = 0; i < ctx->tile_rows; i++) {
507  enccfg->tile_heights[i] = tile_size +
508  (i < rounding / 2 ||
509  i > ctx->tile_rows - 1 - (rounding + 1) / 2);
510  }
511 
512  return 0;
513 }
514 
515 static av_cold int aom_init(AVCodecContext *avctx,
516  const struct aom_codec_iface *iface)
517 {
518  AOMContext *ctx = avctx->priv_data;
519  struct aom_codec_enc_cfg enccfg = { 0 };
520 #ifdef AOM_FRAME_IS_INTRAONLY
521  aom_codec_flags_t flags =
522  (avctx->flags & AV_CODEC_FLAG_PSNR) ? AOM_CODEC_USE_PSNR : 0;
523 #else
524  aom_codec_flags_t flags = 0;
525 #endif
526  AVCPBProperties *cpb_props;
527  int res;
528  aom_img_fmt_t img_fmt;
529  aom_codec_caps_t codec_caps = aom_codec_get_caps(iface);
530 
531  av_log(avctx, AV_LOG_INFO, "%s\n", aom_codec_version_str());
532  av_log(avctx, AV_LOG_VERBOSE, "%s\n", aom_codec_build_config());
533 
534  if ((res = aom_codec_enc_config_default(iface, &enccfg, 0)) != AOM_CODEC_OK) {
535  av_log(avctx, AV_LOG_ERROR, "Failed to get config: %s\n",
536  aom_codec_err_to_string(res));
537  return AVERROR(EINVAL);
538  }
539 
540  if (set_pix_fmt(avctx, codec_caps, &enccfg, &flags, &img_fmt))
541  return AVERROR(EINVAL);
542 
543  if(!avctx->bit_rate)
544  if(avctx->rc_max_rate || avctx->rc_buffer_size || avctx->rc_initial_buffer_occupancy) {
545  av_log( avctx, AV_LOG_ERROR, "Rate control parameters set without a bitrate\n");
546  return AVERROR(EINVAL);
547  }
548 
549  dump_enc_cfg(avctx, &enccfg);
550 
551  enccfg.g_w = avctx->width;
552  enccfg.g_h = avctx->height;
553  enccfg.g_timebase.num = avctx->time_base.num;
554  enccfg.g_timebase.den = avctx->time_base.den;
555  enccfg.g_threads =
556  FFMIN(avctx->thread_count ? avctx->thread_count : av_cpu_count(), 64);
557 
558  enccfg.g_usage = ctx->usage;
559 
560  if (ctx->lag_in_frames >= 0)
561  enccfg.g_lag_in_frames = ctx->lag_in_frames;
562 
563  if (avctx->flags & AV_CODEC_FLAG_PASS1)
564  enccfg.g_pass = AOM_RC_FIRST_PASS;
565  else if (avctx->flags & AV_CODEC_FLAG_PASS2)
566  enccfg.g_pass = AOM_RC_LAST_PASS;
567  else
568  enccfg.g_pass = AOM_RC_ONE_PASS;
569 
570  if (avctx->rc_min_rate == avctx->rc_max_rate &&
571  avctx->rc_min_rate == avctx->bit_rate && avctx->bit_rate) {
572  enccfg.rc_end_usage = AOM_CBR;
573  } else if (ctx->crf >= 0) {
574  enccfg.rc_end_usage = AOM_CQ;
575  if (!avctx->bit_rate)
576  enccfg.rc_end_usage = AOM_Q;
577  }
578 
579  if (avctx->bit_rate) {
580  enccfg.rc_target_bitrate = av_rescale_rnd(avctx->bit_rate, 1, 1000,
582  } else if (enccfg.rc_end_usage != AOM_Q) {
583  enccfg.rc_end_usage = AOM_Q;
584  ctx->crf = 32;
585  av_log(avctx, AV_LOG_WARNING,
586  "Neither bitrate nor constrained quality specified, using default CRF of %d\n",
587  ctx->crf);
588  }
589 
590  if (avctx->qmin >= 0)
591  enccfg.rc_min_quantizer = avctx->qmin;
592  if (avctx->qmax >= 0)
593  enccfg.rc_max_quantizer = avctx->qmax;
594 
595  if (enccfg.rc_end_usage == AOM_CQ || enccfg.rc_end_usage == AOM_Q) {
596  if (ctx->crf < enccfg.rc_min_quantizer || ctx->crf > enccfg.rc_max_quantizer) {
597  av_log(avctx, AV_LOG_ERROR,
598  "CQ level %d must be between minimum and maximum quantizer value (%d-%d)\n",
599  ctx->crf, enccfg.rc_min_quantizer, enccfg.rc_max_quantizer);
600  return AVERROR(EINVAL);
601  }
602  }
603 
604  enccfg.rc_dropframe_thresh = ctx->drop_threshold;
605 
606  // 0-100 (0 => CBR, 100 => VBR)
607  enccfg.rc_2pass_vbr_bias_pct = round(avctx->qcompress * 100);
608  if (ctx->minsection_pct >= 0)
609  enccfg.rc_2pass_vbr_minsection_pct = ctx->minsection_pct;
610  else if (avctx->bit_rate)
611  enccfg.rc_2pass_vbr_minsection_pct =
612  avctx->rc_min_rate * 100LL / avctx->bit_rate;
613  if (ctx->maxsection_pct >= 0)
614  enccfg.rc_2pass_vbr_maxsection_pct = ctx->maxsection_pct;
615  else if (avctx->rc_max_rate)
616  enccfg.rc_2pass_vbr_maxsection_pct =
617  avctx->rc_max_rate * 100LL / avctx->bit_rate;
618 
619  if (avctx->rc_buffer_size)
620  enccfg.rc_buf_sz =
621  avctx->rc_buffer_size * 1000LL / avctx->bit_rate;
622  if (avctx->rc_initial_buffer_occupancy)
623  enccfg.rc_buf_initial_sz =
624  avctx->rc_initial_buffer_occupancy * 1000LL / avctx->bit_rate;
625  enccfg.rc_buf_optimal_sz = enccfg.rc_buf_sz * 5 / 6;
626 
627  if (ctx->rc_undershoot_pct >= 0)
628  enccfg.rc_undershoot_pct = ctx->rc_undershoot_pct;
629  if (ctx->rc_overshoot_pct >= 0)
630  enccfg.rc_overshoot_pct = ctx->rc_overshoot_pct;
631 
632  // _enc_init() will balk if kf_min_dist differs from max w/AOM_KF_AUTO
633  if (avctx->keyint_min >= 0 && avctx->keyint_min == avctx->gop_size)
634  enccfg.kf_min_dist = avctx->keyint_min;
635  if (avctx->gop_size >= 0)
636  enccfg.kf_max_dist = avctx->gop_size;
637 
638  if (enccfg.g_pass == AOM_RC_FIRST_PASS)
639  enccfg.g_lag_in_frames = 0;
640  else if (enccfg.g_pass == AOM_RC_LAST_PASS) {
641  int decode_size, ret;
642 
643  if (!avctx->stats_in) {
644  av_log(avctx, AV_LOG_ERROR, "No stats file for second pass\n");
645  return AVERROR_INVALIDDATA;
646  }
647 
648  ctx->twopass_stats.sz = strlen(avctx->stats_in) * 3 / 4;
649  ret = av_reallocp(&ctx->twopass_stats.buf, ctx->twopass_stats.sz);
650  if (ret < 0) {
651  av_log(avctx, AV_LOG_ERROR,
652  "Stat buffer alloc (%"SIZE_SPECIFIER" bytes) failed\n",
653  ctx->twopass_stats.sz);
654  ctx->twopass_stats.sz = 0;
655  return ret;
656  }
657  decode_size = av_base64_decode(ctx->twopass_stats.buf, avctx->stats_in,
658  ctx->twopass_stats.sz);
659  if (decode_size < 0) {
660  av_log(avctx, AV_LOG_ERROR, "Stat buffer decode failed\n");
661  return AVERROR_INVALIDDATA;
662  }
663 
664  ctx->twopass_stats.sz = decode_size;
665  enccfg.rc_twopass_stats_in = ctx->twopass_stats;
666  }
667 
668  /* 0-3: For non-zero values the encoder increasingly optimizes for reduced
669  * complexity playback on low powered devices at the expense of encode
670  * quality. */
671  if (avctx->profile != FF_PROFILE_UNKNOWN)
672  enccfg.g_profile = avctx->profile;
673 
674  enccfg.g_error_resilient = ctx->error_resilient;
675 
676  res = choose_tiling(avctx, &enccfg);
677  if (res < 0)
678  return res;
679 
680  dump_enc_cfg(avctx, &enccfg);
681  /* Construct Encoder Context */
682  res = aom_codec_enc_init(&ctx->encoder, iface, &enccfg, flags);
683  if (res != AOM_CODEC_OK) {
684  log_encoder_error(avctx, "Failed to initialize encoder");
685  return AVERROR(EINVAL);
686  }
687 
688  // codec control failures are currently treated only as warnings
689  av_log(avctx, AV_LOG_DEBUG, "aom_codec_control\n");
690  codecctl_int(avctx, AOME_SET_CPUUSED, ctx->cpu_used);
691  if (ctx->auto_alt_ref >= 0)
692  codecctl_int(avctx, AOME_SET_ENABLEAUTOALTREF, ctx->auto_alt_ref);
693  if (ctx->arnr_max_frames >= 0)
694  codecctl_int(avctx, AOME_SET_ARNR_MAXFRAMES, ctx->arnr_max_frames);
695  if (ctx->arnr_strength >= 0)
696  codecctl_int(avctx, AOME_SET_ARNR_STRENGTH, ctx->arnr_strength);
697  if (ctx->enable_cdef >= 0)
698  codecctl_int(avctx, AV1E_SET_ENABLE_CDEF, ctx->enable_cdef);
699  if (ctx->enable_restoration >= 0)
700  codecctl_int(avctx, AV1E_SET_ENABLE_RESTORATION, ctx->enable_restoration);
701 
702  codecctl_int(avctx, AOME_SET_STATIC_THRESHOLD, ctx->static_thresh);
703  if (ctx->crf >= 0)
704  codecctl_int(avctx, AOME_SET_CQ_LEVEL, ctx->crf);
705  if (ctx->tune >= 0)
706  codecctl_int(avctx, AOME_SET_TUNING, ctx->tune);
707 
708  codecctl_int(avctx, AV1E_SET_COLOR_PRIMARIES, avctx->color_primaries);
709  codecctl_int(avctx, AV1E_SET_MATRIX_COEFFICIENTS, avctx->colorspace);
710  codecctl_int(avctx, AV1E_SET_TRANSFER_CHARACTERISTICS, avctx->color_trc);
711  if (ctx->aq_mode >= 0)
712  codecctl_int(avctx, AV1E_SET_AQ_MODE, ctx->aq_mode);
713  if (ctx->frame_parallel >= 0)
714  codecctl_int(avctx, AV1E_SET_FRAME_PARALLEL_DECODING, ctx->frame_parallel);
715  set_color_range(avctx);
716 
717  codecctl_int(avctx, AV1E_SET_SUPERBLOCK_SIZE, ctx->superblock_size);
718  if (ctx->uniform_tiles) {
719  codecctl_int(avctx, AV1E_SET_TILE_COLUMNS, ctx->tile_cols_log2);
720  codecctl_int(avctx, AV1E_SET_TILE_ROWS, ctx->tile_rows_log2);
721  }
722 
723 #ifdef AOM_CTRL_AV1E_SET_DENOISE_NOISE_LEVEL
724  if (ctx->denoise_noise_level >= 0)
725  codecctl_int(avctx, AV1E_SET_DENOISE_NOISE_LEVEL, ctx->denoise_noise_level);
726 #endif
727 #ifdef AOM_CTRL_AV1E_SET_DENOISE_BLOCK_SIZE
728  if (ctx->denoise_block_size >= 0)
729  codecctl_int(avctx, AV1E_SET_DENOISE_BLOCK_SIZE, ctx->denoise_block_size);
730 #endif
731 #ifdef AOM_CTRL_AV1E_SET_ENABLE_GLOBAL_MOTION
732  if (ctx->enable_global_motion >= 0)
733  codecctl_int(avctx, AV1E_SET_ENABLE_GLOBAL_MOTION, ctx->enable_global_motion);
734 #endif
735 #ifdef AOM_CTRL_AV1E_SET_MAX_REFERENCE_FRAMES
736  if (avctx->refs >= 3) {
737  codecctl_int(avctx, AV1E_SET_MAX_REFERENCE_FRAMES, avctx->refs);
738  }
739 #endif
740 #ifdef AOM_CTRL_AV1E_SET_ROW_MT
741  if (ctx->row_mt >= 0)
742  codecctl_int(avctx, AV1E_SET_ROW_MT, ctx->row_mt);
743 #endif
744 #ifdef AOM_CTRL_AV1E_SET_ENABLE_INTRABC
745  if (ctx->enable_intrabc >= 0)
746  codecctl_int(avctx, AV1E_SET_ENABLE_INTRABC, ctx->enable_intrabc);
747 #endif
748 
749  // provide dummy value to initialize wrapper, values will be updated each _encode()
750  aom_img_wrap(&ctx->rawimg, img_fmt, avctx->width, avctx->height, 1,
751  (unsigned char*)1);
752 
753  if (codec_caps & AOM_CODEC_CAP_HIGHBITDEPTH)
754  ctx->rawimg.bit_depth = enccfg.g_bit_depth;
755 
756  cpb_props = ff_add_cpb_side_data(avctx);
757  if (!cpb_props)
758  return AVERROR(ENOMEM);
759 
760  if (avctx->flags & AV_CODEC_FLAG_GLOBAL_HEADER) {
761  const AVBitStreamFilter *filter = av_bsf_get_by_name("extract_extradata");
762  int ret;
763 
764  if (!filter) {
765  av_log(avctx, AV_LOG_ERROR, "extract_extradata bitstream filter "
766  "not found. This is a bug, please report it.\n");
767  return AVERROR_BUG;
768  }
769  ret = av_bsf_alloc(filter, &ctx->bsf);
770  if (ret < 0)
771  return ret;
772 
773  ret = avcodec_parameters_from_context(ctx->bsf->par_in, avctx);
774  if (ret < 0)
775  return ret;
776 
777  ret = av_bsf_init(ctx->bsf);
778  if (ret < 0)
779  return ret;
780  }
781 
782  if (enccfg.rc_end_usage == AOM_CBR ||
783  enccfg.g_pass != AOM_RC_ONE_PASS) {
784  cpb_props->max_bitrate = avctx->rc_max_rate;
785  cpb_props->min_bitrate = avctx->rc_min_rate;
786  cpb_props->avg_bitrate = avctx->bit_rate;
787  }
788  cpb_props->buffer_size = avctx->rc_buffer_size;
789 
790  return 0;
791 }
792 
793 static inline void cx_pktcpy(AOMContext *ctx,
794  struct FrameListData *dst,
795  const struct aom_codec_cx_pkt *src)
796 {
797  dst->pts = src->data.frame.pts;
798  dst->duration = src->data.frame.duration;
799  dst->flags = src->data.frame.flags;
800  dst->sz = src->data.frame.sz;
801  dst->buf = src->data.frame.buf;
802 #ifdef AOM_FRAME_IS_INTRAONLY
803  dst->have_sse = 0;
804  dst->frame_number = ++ctx->frame_number;
805  dst->have_sse = ctx->have_sse;
806  if (ctx->have_sse) {
807  /* associate last-seen SSE to the frame. */
808  /* Transfers ownership from ctx to dst. */
809  memcpy(dst->sse, ctx->sse, sizeof(dst->sse));
810  ctx->have_sse = 0;
811  }
812 #endif
813 }
814 
815 /**
816  * Store coded frame information in format suitable for return from encode2().
817  *
818  * Write information from @a cx_frame to @a pkt
819  * @return packet data size on success
820  * @return a negative AVERROR on error
821  */
822 static int storeframe(AVCodecContext *avctx, struct FrameListData *cx_frame,
823  AVPacket *pkt)
824 {
825  AOMContext *ctx = avctx->priv_data;
826  int av_unused pict_type;
827  int ret = ff_alloc_packet2(avctx, pkt, cx_frame->sz, 0);
828  if (ret < 0) {
829  av_log(avctx, AV_LOG_ERROR,
830  "Error getting output packet of size %"SIZE_SPECIFIER".\n", cx_frame->sz);
831  return ret;
832  }
833  memcpy(pkt->data, cx_frame->buf, pkt->size);
834  pkt->pts = pkt->dts = cx_frame->pts;
835 
836  if (!!(cx_frame->flags & AOM_FRAME_IS_KEY)) {
838 #ifdef AOM_FRAME_IS_INTRAONLY
839  pict_type = AV_PICTURE_TYPE_I;
840  } else if (cx_frame->flags & AOM_FRAME_IS_INTRAONLY) {
841  pict_type = AV_PICTURE_TYPE_I;
842  } else {
843  pict_type = AV_PICTURE_TYPE_P;
844  }
845 
846  ff_side_data_set_encoder_stats(pkt, 0, cx_frame->sse + 1,
847  cx_frame->have_sse ? 3 : 0, pict_type);
848 
849  if (cx_frame->have_sse) {
850  int i;
851  for (i = 0; i < 3; ++i) {
852  avctx->error[i] += cx_frame->sse[i + 1];
853  }
854  cx_frame->have_sse = 0;
855 #endif
856  }
857 
858  if (avctx->flags & AV_CODEC_FLAG_GLOBAL_HEADER) {
859  ret = av_bsf_send_packet(ctx->bsf, pkt);
860  if (ret < 0) {
861  av_log(avctx, AV_LOG_ERROR, "extract_extradata filter "
862  "failed to send input packet\n");
863  return ret;
864  }
865  ret = av_bsf_receive_packet(ctx->bsf, pkt);
866 
867  if (ret < 0) {
868  av_log(avctx, AV_LOG_ERROR, "extract_extradata filter "
869  "failed to receive output packet\n");
870  return ret;
871  }
872  }
873  return pkt->size;
874 }
875 
876 /**
877  * Queue multiple output frames from the encoder, returning the front-most.
878  * In cases where aom_codec_get_cx_data() returns more than 1 frame append
879  * the frame queue. Return the head frame if available.
880  * @return Stored frame size
881  * @return AVERROR(EINVAL) on output size error
882  * @return AVERROR(ENOMEM) on coded frame queue data allocation error
883  */
884 static int queue_frames(AVCodecContext *avctx, AVPacket *pkt_out)
885 {
886  AOMContext *ctx = avctx->priv_data;
887  const struct aom_codec_cx_pkt *pkt;
888  const void *iter = NULL;
889  int size = 0;
890 
891  if (ctx->coded_frame_list) {
892  struct FrameListData *cx_frame = ctx->coded_frame_list;
893  /* return the leading frame if we've already begun queueing */
894  size = storeframe(avctx, cx_frame, pkt_out);
895  if (size < 0)
896  return size;
897  ctx->coded_frame_list = cx_frame->next;
898  free_coded_frame(cx_frame);
899  }
900 
901  /* consume all available output from the encoder before returning. buffers
902  * are only good through the next aom_codec call */
903  while ((pkt = aom_codec_get_cx_data(&ctx->encoder, &iter))) {
904  switch (pkt->kind) {
905  case AOM_CODEC_CX_FRAME_PKT:
906  if (!size) {
907  struct FrameListData cx_frame;
908 
909  /* avoid storing the frame when the list is empty and we haven't yet
910  * provided a frame for output */
911  av_assert0(!ctx->coded_frame_list);
912  cx_pktcpy(ctx, &cx_frame, pkt);
913  size = storeframe(avctx, &cx_frame, pkt_out);
914  if (size < 0)
915  return size;
916  } else {
917  struct FrameListData *cx_frame =
918  av_malloc(sizeof(struct FrameListData));
919 
920  if (!cx_frame) {
921  av_log(avctx, AV_LOG_ERROR,
922  "Frame queue element alloc failed\n");
923  return AVERROR(ENOMEM);
924  }
925  cx_pktcpy(ctx, cx_frame, pkt);
926  cx_frame->buf = av_malloc(cx_frame->sz);
927 
928  if (!cx_frame->buf) {
929  av_log(avctx, AV_LOG_ERROR,
930  "Data buffer alloc (%"SIZE_SPECIFIER" bytes) failed\n",
931  cx_frame->sz);
932  av_freep(&cx_frame);
933  return AVERROR(ENOMEM);
934  }
935  memcpy(cx_frame->buf, pkt->data.frame.buf, pkt->data.frame.sz);
936  coded_frame_add(&ctx->coded_frame_list, cx_frame);
937  }
938  break;
939  case AOM_CODEC_STATS_PKT:
940  {
941  struct aom_fixed_buf *stats = &ctx->twopass_stats;
942  int err;
943  if ((err = av_reallocp(&stats->buf,
944  stats->sz +
945  pkt->data.twopass_stats.sz)) < 0) {
946  stats->sz = 0;
947  av_log(avctx, AV_LOG_ERROR, "Stat buffer realloc failed\n");
948  return err;
949  }
950  memcpy((uint8_t *)stats->buf + stats->sz,
951  pkt->data.twopass_stats.buf, pkt->data.twopass_stats.sz);
952  stats->sz += pkt->data.twopass_stats.sz;
953  break;
954  }
955 #ifdef AOM_FRAME_IS_INTRAONLY
956  case AOM_CODEC_PSNR_PKT:
957  {
958  av_assert0(!ctx->have_sse);
959  ctx->sse[0] = pkt->data.psnr.sse[0];
960  ctx->sse[1] = pkt->data.psnr.sse[1];
961  ctx->sse[2] = pkt->data.psnr.sse[2];
962  ctx->sse[3] = pkt->data.psnr.sse[3];
963  ctx->have_sse = 1;
964  break;
965  }
966 #endif
967  case AOM_CODEC_CUSTOM_PKT:
968  // ignore unsupported/unrecognized packet types
969  break;
970  }
971  }
972 
973  return size;
974 }
975 
976 static int aom_encode(AVCodecContext *avctx, AVPacket *pkt,
977  const AVFrame *frame, int *got_packet)
978 {
979  AOMContext *ctx = avctx->priv_data;
980  struct aom_image *rawimg = NULL;
981  int64_t timestamp = 0;
982  int res, coded_size;
983  aom_enc_frame_flags_t flags = 0;
984 
985  if (frame) {
986  rawimg = &ctx->rawimg;
987  rawimg->planes[AOM_PLANE_Y] = frame->data[0];
988  rawimg->planes[AOM_PLANE_U] = frame->data[1];
989  rawimg->planes[AOM_PLANE_V] = frame->data[2];
990  rawimg->stride[AOM_PLANE_Y] = frame->linesize[0];
991  rawimg->stride[AOM_PLANE_U] = frame->linesize[1];
992  rawimg->stride[AOM_PLANE_V] = frame->linesize[2];
993  timestamp = frame->pts;
994  switch (frame->color_range) {
995  case AVCOL_RANGE_MPEG:
996  rawimg->range = AOM_CR_STUDIO_RANGE;
997  break;
998  case AVCOL_RANGE_JPEG:
999  rawimg->range = AOM_CR_FULL_RANGE;
1000  break;
1001  }
1002 
1003  if (frame->pict_type == AV_PICTURE_TYPE_I)
1004  flags |= AOM_EFLAG_FORCE_KF;
1005  }
1006 
1007  res = aom_codec_encode(&ctx->encoder, rawimg, timestamp,
1008  avctx->ticks_per_frame, flags);
1009  if (res != AOM_CODEC_OK) {
1010  log_encoder_error(avctx, "Error encoding frame");
1011  return AVERROR_INVALIDDATA;
1012  }
1013  coded_size = queue_frames(avctx, pkt);
1014 
1015  if (!frame && avctx->flags & AV_CODEC_FLAG_PASS1) {
1016  size_t b64_size = AV_BASE64_SIZE(ctx->twopass_stats.sz);
1017 
1018  avctx->stats_out = av_malloc(b64_size);
1019  if (!avctx->stats_out) {
1020  av_log(avctx, AV_LOG_ERROR, "Stat buffer alloc (%"SIZE_SPECIFIER" bytes) failed\n",
1021  b64_size);
1022  return AVERROR(ENOMEM);
1023  }
1024  av_base64_encode(avctx->stats_out, b64_size, ctx->twopass_stats.buf,
1025  ctx->twopass_stats.sz);
1026  }
1027 
1028  *got_packet = !!coded_size;
1029  return 0;
1030 }
1031 
1032 static const enum AVPixelFormat av1_pix_fmts[] = {
1037 };
1038 
1039 static const enum AVPixelFormat av1_pix_fmts_highbd[] = {
1050 };
1051 
1052 static av_cold void av1_init_static(AVCodec *codec)
1053 {
1054  aom_codec_caps_t codec_caps = aom_codec_get_caps(aom_codec_av1_cx());
1055  if (codec_caps & AOM_CODEC_CAP_HIGHBITDEPTH)
1056  codec->pix_fmts = av1_pix_fmts_highbd;
1057  else
1058  codec->pix_fmts = av1_pix_fmts;
1059 
1060  if (aom_codec_version_major() < 2)
1062 }
1063 
1064 static av_cold int av1_init(AVCodecContext *avctx)
1065 {
1066  return aom_init(avctx, aom_codec_av1_cx());
1067 }
1068 
1069 #define OFFSET(x) offsetof(AOMContext, x)
1070 #define VE AV_OPT_FLAG_VIDEO_PARAM | AV_OPT_FLAG_ENCODING_PARAM
1071 static const AVOption options[] = {
1072  { "cpu-used", "Quality/Speed ratio modifier", OFFSET(cpu_used), AV_OPT_TYPE_INT, {.i64 = 1}, 0, 8, VE},
1073  { "auto-alt-ref", "Enable use of alternate reference "
1074  "frames (2-pass only)", OFFSET(auto_alt_ref), AV_OPT_TYPE_INT, {.i64 = -1}, -1, 2, VE},
1075  { "lag-in-frames", "Number of frames to look ahead at for "
1076  "alternate reference frame selection", OFFSET(lag_in_frames), AV_OPT_TYPE_INT, {.i64 = -1}, -1, INT_MAX, VE},
1077  { "arnr-max-frames", "altref noise reduction max frame count", OFFSET(arnr_max_frames), AV_OPT_TYPE_INT, {.i64 = -1}, -1, INT_MAX, VE},
1078  { "arnr-strength", "altref noise reduction filter strength", OFFSET(arnr_strength), AV_OPT_TYPE_INT, {.i64 = -1}, -1, 6, VE},
1079  { "aq-mode", "adaptive quantization mode", OFFSET(aq_mode), AV_OPT_TYPE_INT, {.i64 = -1}, -1, 4, VE, "aq_mode"},
1080  { "none", "Aq not used", 0, AV_OPT_TYPE_CONST, {.i64 = 0}, 0, 0, VE, "aq_mode"},
1081  { "variance", "Variance based Aq", 0, AV_OPT_TYPE_CONST, {.i64 = 1}, 0, 0, VE, "aq_mode"},
1082  { "complexity", "Complexity based Aq", 0, AV_OPT_TYPE_CONST, {.i64 = 2}, 0, 0, VE, "aq_mode"},
1083  { "cyclic", "Cyclic Refresh Aq", 0, AV_OPT_TYPE_CONST, {.i64 = 3}, 0, 0, VE, "aq_mode"},
1084  { "error-resilience", "Error resilience configuration", OFFSET(error_resilient), AV_OPT_TYPE_FLAGS, {.i64 = 0}, INT_MIN, INT_MAX, VE, "er"},
1085  { "default", "Improve resiliency against losses of whole frames", 0, AV_OPT_TYPE_CONST, {.i64 = AOM_ERROR_RESILIENT_DEFAULT}, 0, 0, VE, "er"},
1086  { "crf", "Select the quality for constant quality mode", offsetof(AOMContext, crf), AV_OPT_TYPE_INT, {.i64 = -1}, -1, 63, VE },
1087  { "static-thresh", "A change threshold on blocks below which they will be skipped by the encoder", OFFSET(static_thresh), AV_OPT_TYPE_INT, { .i64 = 0 }, 0, INT_MAX, VE },
1088  { "drop-threshold", "Frame drop threshold", offsetof(AOMContext, drop_threshold), AV_OPT_TYPE_INT, {.i64 = 0 }, INT_MIN, INT_MAX, VE },
1089  { "denoise-noise-level", "Amount of noise to be removed", OFFSET(denoise_noise_level), AV_OPT_TYPE_INT, {.i64 = -1}, -1, INT_MAX, VE},
1090  { "denoise-block-size", "Denoise block size ", OFFSET(denoise_block_size), AV_OPT_TYPE_INT, {.i64 = -1}, -1, INT_MAX, VE},
1091  { "undershoot-pct", "Datarate undershoot (min) target (%)", OFFSET(rc_undershoot_pct), AV_OPT_TYPE_INT, {.i64 = -1}, -1, 100, VE},
1092  { "overshoot-pct", "Datarate overshoot (max) target (%)", OFFSET(rc_overshoot_pct), AV_OPT_TYPE_INT, {.i64 = -1}, -1, 1000, VE},
1093  { "minsection-pct", "GOP min bitrate (% of target)", OFFSET(minsection_pct), AV_OPT_TYPE_INT, {.i64 = -1}, -1, 100, VE},
1094  { "maxsection-pct", "GOP max bitrate (% of target)", OFFSET(maxsection_pct), AV_OPT_TYPE_INT, {.i64 = -1}, -1, 5000, VE},
1095  { "frame-parallel", "Enable frame parallel decodability features", OFFSET(frame_parallel), AV_OPT_TYPE_BOOL, {.i64 = -1}, -1, 1, VE},
1096  { "tiles", "Tile columns x rows", OFFSET(tile_cols), AV_OPT_TYPE_IMAGE_SIZE, { .str = NULL }, 0, 0, VE },
1097  { "tile-columns", "Log2 of number of tile columns to use", OFFSET(tile_cols_log2), AV_OPT_TYPE_INT, {.i64 = -1}, -1, 6, VE},
1098  { "tile-rows", "Log2 of number of tile rows to use", OFFSET(tile_rows_log2), AV_OPT_TYPE_INT, {.i64 = -1}, -1, 6, VE},
1099  { "row-mt", "Enable row based multi-threading", OFFSET(row_mt), AV_OPT_TYPE_BOOL, {.i64 = -1}, -1, 1, VE},
1100  { "enable-cdef", "Enable CDEF filtering", OFFSET(enable_cdef), AV_OPT_TYPE_BOOL, {.i64 = -1}, -1, 1, VE},
1101  { "enable-global-motion", "Enable global motion", OFFSET(enable_global_motion), AV_OPT_TYPE_BOOL, {.i64 = -1}, -1, 1, VE},
1102  { "enable-intrabc", "Enable intra block copy prediction mode", OFFSET(enable_intrabc), AV_OPT_TYPE_BOOL, {.i64 = -1}, -1, 1, VE},
1103  { "enable-restoration", "Enable Loop Restoration filtering", OFFSET(enable_restoration), AV_OPT_TYPE_BOOL, {.i64 = -1}, -1, 1, VE},
1104  { "usage", "Quality and compression efficiency vs speed trade-off", OFFSET(usage), AV_OPT_TYPE_INT, {.i64 = 0}, 0, INT_MAX, VE, "usage"},
1105  { "good", "Good quality", 0, AV_OPT_TYPE_CONST, {.i64 = 0 /* AOM_USAGE_GOOD_QUALITY */}, 0, 0, VE, "usage"},
1106  { "realtime", "Realtime encoding", 0, AV_OPT_TYPE_CONST, {.i64 = 1 /* AOM_USAGE_REALTIME */}, 0, 0, VE, "usage"},
1107  { "tune", "The metric that the encoder tunes for. Automatically chosen by the encoder by default", OFFSET(tune), AV_OPT_TYPE_INT, {.i64 = -1}, -1, AOM_TUNE_SSIM, VE, "tune"},
1108  { "psnr", NULL, 0, AV_OPT_TYPE_CONST, {.i64 = AOM_TUNE_PSNR}, 0, 0, VE, "tune"},
1109  { "ssim", NULL, 0, AV_OPT_TYPE_CONST, {.i64 = AOM_TUNE_SSIM}, 0, 0, VE, "tune"},
1110  { NULL },
1111 };
1112 
1113 static const AVCodecDefault defaults[] = {
1114  { "b", "0" },
1115  { "qmin", "-1" },
1116  { "qmax", "-1" },
1117  { "g", "-1" },
1118  { "keyint_min", "-1" },
1119  { NULL },
1120 };
1121 
1122 static const AVClass class_aom = {
1123  .class_name = "libaom-av1 encoder",
1124  .item_name = av_default_item_name,
1125  .option = options,
1126  .version = LIBAVUTIL_VERSION_INT,
1127 };
1128 
1130  .name = "libaom-av1",
1131  .long_name = NULL_IF_CONFIG_SMALL("libaom AV1"),
1132  .type = AVMEDIA_TYPE_VIDEO,
1133  .id = AV_CODEC_ID_AV1,
1134  .priv_data_size = sizeof(AOMContext),
1135  .init = av1_init,
1136  .encode2 = aom_encode,
1137  .close = aom_free,
1140  .priv_class = &class_aom,
1141  .defaults = defaults,
1142  .init_static_data = av1_init_static,
1143  .wrapper_name = "libaom",
1144 };
usage
static void usage(const char *program_name)
Definition: avio_list_dir.c:105
error
static void error(const char *err)
Definition: target_bsf_fuzzer.c:29
AOMEncoderContext::error_resilient
int error_resilient
Definition: libaomenc.c:74
AOMEncoderContext::usage
int usage
Definition: libaomenc.c:97
AVCodec
AVCodec.
Definition: codec.h:190
AV_LOG_WARNING
#define AV_LOG_WARNING
Something somehow does not look correct.
Definition: log.h:182
AOMEncoderContext::tile_rows_log2
int tile_rows_log2
Definition: libaomenc.c:89
AVPixelFormat
AVPixelFormat
Pixel format.
Definition: pixfmt.h:64
level
uint8_t level
Definition: svq3.c:210
FrameListData::pts
int64_t pts
time stamp to show frame (in timebase units)
Definition: libaomenc.c:50
AVCodecContext::keyint_min
int keyint_min
minimum GOP size
Definition: avcodec.h:1107
init
static av_cold int init(AVCodecContext *avctx)
Definition: avrndec.c:35
AOMEncoderContext::sse
uint64_t sse[4]
Definition: libaomenc.c:80
AVERROR
Filter the word “frame” indicates either a video frame or a group of audio as stored in an AVFrame structure Format for each input and each output the list of supported formats For video that means pixel format For audio that means channel sample they are references to shared objects When the negotiation mechanism computes the intersection of the formats supported at each end of a all references to both lists are replaced with a reference to the intersection And when a single format is eventually chosen for a link amongst the remaining all references to the list are updated That means that if a filter requires that its input and output have the same format amongst a supported all it has to do is use a reference to the same list of formats query_formats can leave some formats unset and return AVERROR(EAGAIN) to cause the negotiation mechanism toagain later. That can be used by filters with complex requirements to use the format negotiated on one link to set the formats supported on another. Frame references ownership and permissions
opt.h
set_color_range
static void set_color_range(AVCodecContext *avctx)
Definition: libaomenc.c:336
AVCodecContext::colorspace
enum AVColorSpace colorspace
YUV colorspace type.
Definition: avcodec.h:1154
AVCodecContext::rc_min_rate
int64_t rc_min_rate
minimum bitrate
Definition: avcodec.h:1411
aom_init
static av_cold int aom_init(AVCodecContext *avctx, const struct aom_codec_iface *iface)
Definition: libaomenc.c:515
ff_libaom_av1_encoder
AVCodec ff_libaom_av1_encoder
Definition: libaomenc.c:1129
stats
static void stats(AVPacket *const *in, int n_in, unsigned *_max, unsigned *_sum)
Definition: vp9_superframe_bsf.c:34
AOMEncoderContext::enable_restoration
int enable_restoration
Definition: libaomenc.c:96
ff_side_data_set_encoder_stats
int ff_side_data_set_encoder_stats(AVPacket *pkt, int quality, int64_t *error, int error_count, int pict_type)
Definition: avpacket.c:728
avcodec_parameters_from_context
int avcodec_parameters_from_context(AVCodecParameters *par, const AVCodecContext *codec)
Fill the parameters struct based on the values from the supplied codec context.
Definition: utils.c:2127
AOMEncoderContext::denoise_noise_level
int denoise_noise_level
Definition: libaomenc.c:78
av_unused
#define av_unused
Definition: attributes.h:131
AVCodec::pix_fmts
enum AVPixelFormat * pix_fmts
array of supported pixel formats, or NULL if unknown, array is terminated by -1
Definition: codec.h:211
av_bsf_init
int av_bsf_init(AVBSFContext *ctx)
Prepare the filter for use, after all the parameters and options have been set.
Definition: bsf.c:144
AOMEncoderContext::lag_in_frames
int lag_in_frames
Definition: libaomenc.c:73
AVFrame
This structure describes decoded (raw) audio or video data.
Definition: frame.h:300
pixdesc.h
AVCodecContext::color_trc
enum AVColorTransferCharacteristic color_trc
Color Transfer Characteristic.
Definition: avcodec.h:1147
AVCodec::capabilities
int capabilities
Codec capabilities.
Definition: codec.h:209
AVCOL_RANGE_JPEG
@ AVCOL_RANGE_JPEG
the normal 2^n-1 "JPEG" YUV ranges
Definition: pixfmt.h:535
coded_frame_add
static void coded_frame_add(void *list, struct FrameListData *cx_frame)
Definition: libaomenc.c:209
internal.h
AVPacket::data
uint8_t * data
Definition: packet.h:355
AV1_MAX_TILE_ROWS
@ AV1_MAX_TILE_ROWS
Definition: av1.h:80
AOMEncoderContext::frame_number
uint64_t frame_number
Definition: libaomenc.c:82
AVOption
AVOption.
Definition: opt.h:246
cx_pktcpy
static void cx_pktcpy(AOMContext *ctx, struct FrameListData *dst, const struct aom_codec_cx_pkt *src)
Definition: libaomenc.c:793
AV_PIX_FMT_YUV420P10
#define AV_PIX_FMT_YUV420P10
Definition: pixfmt.h:397
AV_LOG_VERBOSE
#define AV_LOG_VERBOSE
Detailed information.
Definition: log.h:192
dump_enc_cfg
static av_cold void dump_enc_cfg(AVCodecContext *avctx, const struct aom_codec_enc_cfg *cfg)
Definition: libaomenc.c:151
mathematics.h
filter
filter_frame For filters that do not use the this method is called when a frame is pushed to the filter s input It can be called at any time except in a reentrant way If the input frame is enough to produce then the filter should push the output frames on the output link immediately As an exception to the previous rule if the input frame is enough to produce several output frames then the filter needs output only at least one per link The additional frames can be left buffered in the filter
Definition: filter_design.txt:228
AV_CODEC_FLAG_PSNR
#define AV_CODEC_FLAG_PSNR
error[?] variables will be set during encoding.
Definition: avcodec.h:312
ff_add_cpb_side_data
AVCPBProperties * ff_add_cpb_side_data(AVCodecContext *avctx)
Add a CPB properties side data to an encoding context.
Definition: utils.c:2037
AVCodecContext::qmax
int qmax
maximum quantizer
Definition: avcodec.h:1375
options
static const AVOption options[]
Definition: libaomenc.c:1071
AV_PKT_FLAG_KEY
#define AV_PKT_FLAG_KEY
The packet contains a keyframe.
Definition: packet.h:388
AVBSFContext
The bitstream filter state.
Definition: bsf.h:49
av_malloc
#define av_malloc(s)
Definition: tableprint_vlc.h:31
AV_CODEC_FLAG_GLOBAL_HEADER
#define AV_CODEC_FLAG_GLOBAL_HEADER
Place global headers in extradata instead of every keyframe.
Definition: avcodec.h:329
av_bsf_get_by_name
const AVBitStreamFilter * av_bsf_get_by_name(const char *name)
Definition: bitstream_filters.c:83
storeframe
static int storeframe(AVCodecContext *avctx, struct FrameListData *cx_frame, AVPacket *pkt)
Store coded frame information in format suitable for return from encode2().
Definition: libaomenc.c:822
FrameListData::flags
uint32_t flags
flags for this frame
Definition: libaomenc.c:54
AOMEncoderContext::cpu_used
int cpu_used
Definition: libaomenc.c:68
AOMEncoderContext::coded_frame_list
struct FrameListData * coded_frame_list
Definition: libaomenc.c:67
AOMEncoderContext::static_thresh
int static_thresh
Definition: libaomenc.c:76
AV1_MAX_TILE_AREA
@ AV1_MAX_TILE_AREA
Definition: av1.h:79
AVCodecContext::thread_count
int thread_count
thread count is used to decide how many independent tasks should be passed to execute()
Definition: avcodec.h:1785
AOMEncoderContext::minsection_pct
int minsection_pct
Definition: libaomenc.c:85
AOMEncoderContext::uniform_tiles
int uniform_tiles
Definition: libaomenc.c:91
AOMEncoderContext::row_mt
int row_mt
Definition: libaomenc.c:92
AVCodecContext::refs
int refs
number of reference frames
Definition: avcodec.h:1114
AVCodecContext::flags
int flags
AV_CODEC_FLAG_*.
Definition: avcodec.h:606
AOMEncoderContext::denoise_block_size
int denoise_block_size
Definition: libaomenc.c:79
val
static double val(void *priv, double ch)
Definition: aeval.c:76
AVRational::num
int num
Numerator.
Definition: rational.h:59
AV_PIX_FMT_YUV444P10
#define AV_PIX_FMT_YUV444P10
Definition: pixfmt.h:400
free_coded_frame
static av_cold void free_coded_frame(struct FrameListData *cx_frame)
Definition: libaomenc.c:219
avassert.h
AVCodecContext::color_primaries
enum AVColorPrimaries color_primaries
Chromaticity coordinates of the source primaries.
Definition: avcodec.h:1140
count_uniform_tiling
static int count_uniform_tiling(int dim, int sb_size, int tiles_log2)
Definition: libaomenc.c:352
AV_LOG_ERROR
#define AV_LOG_ERROR
Something went wrong and cannot losslessly be recovered.
Definition: log.h:176
AV_CODEC_CAP_EXPERIMENTAL
#define AV_CODEC_CAP_EXPERIMENTAL
Codec is experimental and is thus avoided in favor of non experimental encoders.
Definition: codec.h:98
av_cold
#define av_cold
Definition: attributes.h:90
AVCodecContext::rc_initial_buffer_occupancy
int rc_initial_buffer_occupancy
Number of bits which should be loaded into the rc buffer before decoding starts.
Definition: avcodec.h:1432
AOMEncoderContext::enable_cdef
int enable_cdef
Definition: libaomenc.c:93
AOMEncoderContext::twopass_stats
struct aom_fixed_buf twopass_stats
Definition: libaomenc.c:66
width
#define width
queue_frames
static int queue_frames(AVCodecContext *avctx, AVPacket *pkt_out)
Queue multiple output frames from the encoder, returning the front-most.
Definition: libaomenc.c:884
AVCodecContext::stats_in
char * stats_in
pass2 encoding statistics input buffer Concatenated stuff from stats_out of pass1 should be placed he...
Definition: avcodec.h:1553
codecctl_int
static av_cold int codecctl_int(AVCodecContext *avctx, enum aome_enc_control_id id, int val)
Definition: libaomenc.c:236
AVCodecContext::ticks_per_frame
int ticks_per_frame
For some codecs, the time base is closer to the field rate than the frame rate.
Definition: avcodec.h:658
FrameListData::sse
uint64_t sse[4]
Definition: libaomenc.c:55
FF_PROFILE_UNKNOWN
#define FF_PROFILE_UNKNOWN
Definition: avcodec.h:1860
av_assert0
#define av_assert0(cond)
assert() equivalent, that is always enabled.
Definition: avassert.h:37
AOMEncoderContext::have_sse
int have_sse
true if we have pending sse[]
Definition: libaomenc.c:81
FrameListData::frame_number
uint64_t frame_number
Definition: libaomenc.c:57
AV_LOG_DEBUG
#define AV_LOG_DEBUG
Stuff which is only useful for libav* developers.
Definition: log.h:197
set_pix_fmt
static int set_pix_fmt(AVCodecContext *avctx, aom_codec_caps_t codec_caps, struct aom_codec_enc_cfg *enccfg, aom_codec_flags_t *flags, aom_img_fmt_t *img_fmt)
Definition: libaomenc.c:275
ctx
AVFormatContext * ctx
Definition: movenc.c:48
ff_av1_profiles
const AVProfile ff_av1_profiles[]
Definition: profiles.c:141
tile_cols
int tile_cols
Definition: h265_levels.c:218
AV_PIX_FMT_YUV420P
@ AV_PIX_FMT_YUV420P
planar YUV 4:2:0, 12bpp, (1 Cr & Cb sample per 2x2 Y samples)
Definition: pixfmt.h:66
AVCodecContext::rc_max_rate
int64_t rc_max_rate
maximum bitrate
Definition: avcodec.h:1404
AOMEncoderContext::superblock_size
aom_superblock_size_t superblock_size
Definition: libaomenc.c:90
AVCodecContext::error
uint64_t error[AV_NUM_DATA_POINTERS]
error
Definition: avcodec.h:1709
AVCPBProperties
This structure describes the bitrate properties of an encoded bitstream.
Definition: avcodec.h:448
AVCodecDefault
Definition: internal.h:201
AVCodecContext::rc_buffer_size
int rc_buffer_size
decoder bitstream buffer size
Definition: avcodec.h:1389
AVCPBProperties::avg_bitrate
int avg_bitrate
Average bitrate of the stream, in bits per second.
Definition: avcodec.h:472
AOMEncoderContext::drop_threshold
int drop_threshold
Definition: libaomenc.c:77
LIBAVUTIL_VERSION_INT
#define LIBAVUTIL_VERSION_INT
Definition: version.h:85
AVClass
Describe the class of an AVClass context structure.
Definition: log.h:67
AOMEncoderContext::tile_rows
int tile_rows
Definition: libaomenc.c:88
NULL
#define NULL
Definition: coverity.c:32
AOMEncoderContext
Definition: libaomenc.c:61
AOMEncoderContext::rc_overshoot_pct
int rc_overshoot_pct
Definition: libaomenc.c:84
AVCodecContext::color_range
enum AVColorRange color_range
MPEG vs JPEG YUV range.
Definition: avcodec.h:1161
AV_CODEC_ID_AV1
@ AV_CODEC_ID_AV1
Definition: codec_id.h:274
AOMEncoderContext::arnr_max_frames
int arnr_max_frames
Definition: libaomenc.c:70
AVCodecContext::bit_rate
int64_t bit_rate
the average bitrate
Definition: avcodec.h:576
AV_OPT_TYPE_IMAGE_SIZE
@ AV_OPT_TYPE_IMAGE_SIZE
offset must point to two consecutive integers
Definition: opt.h:233
av_default_item_name
const char * av_default_item_name(void *ptr)
Return the context name.
Definition: log.c:235
AV_PICTURE_TYPE_I
@ AV_PICTURE_TYPE_I
Intra.
Definition: avutil.h:274
profiles.h
src
#define src
Definition: vp8dsp.c:254
list
Filter the word “frame” indicates either a video frame or a group of audio as stored in an AVFrame structure Format for each input and each output the list of supported formats For video that means pixel format For audio that means channel sample they are references to shared objects When the negotiation mechanism computes the intersection of the formats supported at each end of a all references to both lists are replaced with a reference to the intersection And when a single format is eventually chosen for a link amongst the remaining list
Definition: filter_design.txt:25
FrameListData::buf
void * buf
compressed data buffer
Definition: libaomenc.c:48
AV_ROUND_NEAR_INF
@ AV_ROUND_NEAR_INF
Round to nearest and halfway cases away from zero.
Definition: mathematics.h:84
AOMEncoderContext::rc_undershoot_pct
int rc_undershoot_pct
Definition: libaomenc.c:83
AV_PIX_FMT_YUV422P10
#define AV_PIX_FMT_YUV422P10
Definition: pixfmt.h:398
AV1_MAX_TILE_COLS
@ AV1_MAX_TILE_COLS
Definition: av1.h:81
av_base64_decode
int av_base64_decode(uint8_t *out, const char *in_str, int out_size)
Decode a base64-encoded string.
Definition: base64.c:79
defaults
static const AVCodecDefault defaults[]
Definition: libaomenc.c:1113
base64.h
AVCOL_RANGE_UNSPECIFIED
@ AVCOL_RANGE_UNSPECIFIED
Definition: pixfmt.h:533
AOMEncoderContext::enable_global_motion
int enable_global_motion
Definition: libaomenc.c:94
AOMEncoderContext::encoder
struct aom_codec_ctx encoder
Definition: libaomenc.c:64
av1_init
static av_cold int av1_init(AVCodecContext *avctx)
Definition: libaomenc.c:1064
av_cpu_count
int av_cpu_count(void)
Definition: cpu.c:267
AVCodecContext::qcompress
float qcompress
amount of qscale change between easy & hard scenes (0.0-1.0)
Definition: avcodec.h:1360
AVCodecContext::time_base
AVRational time_base
This is the fundamental unit of time (in seconds) in terms of which frame timestamps are represented.
Definition: avcodec.h:649
av_rescale_rnd
int64_t av_rescale_rnd(int64_t a, int64_t b, int64_t c, enum AVRounding rnd)
Rescale a 64-bit integer with specified rounding.
Definition: mathematics.c:58
FrameListData::next
struct FrameListData * next
Definition: libaomenc.c:58
AVCodecContext::stats_out
char * stats_out
pass1 encoding statistics output buffer
Definition: avcodec.h:1545
ctlidstr
static const char *const ctlidstr[]
Definition: libaomenc.c:101
AV_CODEC_CAP_AUTO_THREADS
#define AV_CODEC_CAP_AUTO_THREADS
Codec supports avctx->thread_count == 0 (auto).
Definition: codec.h:118
desc
const char * desc
Definition: nvenc.c:79
FF_PROFILE_AV1_MAIN
#define FF_PROFILE_AV1_MAIN
Definition: avcodec.h:1952
AVPacket::size
int size
Definition: packet.h:356
NULL_IF_CONFIG_SMALL
#define NULL_IF_CONFIG_SMALL(x)
Return NULL if CONFIG_SMALL is true, otherwise the argument without modification.
Definition: internal.h:188
AVCodecContext::gop_size
int gop_size
the number of pictures in a group of pictures, or 0 for intra_only
Definition: avcodec.h:721
AV_PIX_FMT_YUV422P12
#define AV_PIX_FMT_YUV422P12
Definition: pixfmt.h:402
size
int size
Definition: twinvq_data.h:11134
av_reallocp
int av_reallocp(void *ptr, size_t size)
Allocate, reallocate, or free a block of memory through a pointer to a pointer.
Definition: mem.c:161
AV_PIX_FMT_YUV444P12
#define AV_PIX_FMT_YUV444P12
Definition: pixfmt.h:404
aom_encode
static int aom_encode(AVCodecContext *avctx, AVPacket *pkt, const AVFrame *frame, int *got_packet)
Definition: libaomenc.c:976
av1.h
FrameListData
Portion of struct vpx_codec_cx_pkt from vpx_encoder.h.
Definition: libaomenc.c:47
AOMEncoderContext::tile_cols_log2
int tile_cols_log2
Definition: libaomenc.c:89
AVPacket::dts
int64_t dts
Decompression timestamp in AVStream->time_base units; the time at which the packet is decompressed.
Definition: packet.h:354
AV_CODEC_FLAG_PASS2
#define AV_CODEC_FLAG_PASS2
Use internal 2pass ratecontrol in second pass mode.
Definition: avcodec.h:300
AOMEncoderContext::tile_cols
int tile_cols
Definition: libaomenc.c:88
FFMIN
#define FFMIN(a, b)
Definition: common.h:96
AVCPBProperties::max_bitrate
int max_bitrate
Maximum bitrate of the stream, in bits per second.
Definition: avcodec.h:454
AVPacket::flags
int flags
A combination of AV_PKT_FLAG values.
Definition: packet.h:361
AOMEncoderContext::rawimg
struct aom_image rawimg
Definition: libaomenc.c:65
AOMEncoderContext::aq_mode
int aq_mode
Definition: libaomenc.c:72
AV_LOG_INFO
#define AV_LOG_INFO
Standard information.
Definition: log.h:187
AV_BASE64_SIZE
#define AV_BASE64_SIZE(x)
Calculate the output size needed to base64-encode x bytes to a null-terminated string.
Definition: base64.h:66
AOMEncoderContext::arnr_strength
int arnr_strength
Definition: libaomenc.c:71
av_bsf_receive_packet
int av_bsf_receive_packet(AVBSFContext *ctx, AVPacket *pkt)
Retrieve a filtered packet.
Definition: bsf.c:223
i
#define i(width, name, range_min, range_max)
Definition: cbs_h2645.c:269
AVPacket::pts
int64_t pts
Presentation timestamp in AVStream->time_base units; the time at which the decompressed packet will b...
Definition: packet.h:348
round
static av_always_inline av_const double round(double x)
Definition: libm.h:444
common.h
uint8_t
uint8_t
Definition: audio_convert.c:194
AVCodec::name
const char * name
Name of the codec implementation.
Definition: codec.h:197
AVCPBProperties::min_bitrate
int min_bitrate
Minimum bitrate of the stream, in bits per second.
Definition: avcodec.h:463
AVCodecContext::height
int height
Definition: avcodec.h:699
AVCodecContext::pix_fmt
enum AVPixelFormat pix_fmt
Pixel format, see AV_PIX_FMT_xxx.
Definition: avcodec.h:736
FrameListData::duration
unsigned long duration
duration to show frame (in timebase units)
Definition: libaomenc.c:52
AOMEncoderContext::auto_alt_ref
int auto_alt_ref
Definition: libaomenc.c:69
AVCOL_RANGE_MPEG
@ AVCOL_RANGE_MPEG
the normal 219*2^(n-8) "MPEG" YUV ranges
Definition: pixfmt.h:534
FF_PROFILE_AV1_PROFESSIONAL
#define FF_PROFILE_AV1_PROFESSIONAL
Definition: avcodec.h:1954
avcodec.h
dim
int dim
Definition: vorbis_enc_data.h:451
ret
ret
Definition: filter_design.txt:187
AVClass::class_name
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:72
frame
these buffered frames must be flushed immediately if a new input produces new the filter must not call request_frame to get more It must just process the frame or queue it The task of requesting more frames is left to the filter s request_frame method or the application If a filter has several the filter must be ready for frames arriving randomly on any input any filter with several inputs will most likely require some kind of queuing mechanism It is perfectly acceptable to have a limited queue and to drop frames when the inputs are too unbalanced request_frame For filters that do not use the this method is called when a frame is wanted on an output For a it should directly call filter_frame on the corresponding output For a if there are queued frames already one of these frames should be pushed If the filter should request a frame on one of its repeatedly until at least one frame has been pushed Return or at least make progress towards producing a frame
Definition: filter_design.txt:264
AOMEncoderContext::bsf
AVBSFContext * bsf
Definition: libaomenc.c:63
AVCPBProperties::buffer_size
int buffer_size
The size of the buffer to which the ratecontrol is applied, in bits.
Definition: avcodec.h:481
log_encoder_error
static av_cold void log_encoder_error(AVCodecContext *avctx, const char *desc)
Definition: libaomenc.c:140
AV1_MAX_TILE_WIDTH
@ AV1_MAX_TILE_WIDTH
Definition: av1.h:78
VE
#define VE
Definition: libaomenc.c:1070
AV_PIX_FMT_YUV420P12
#define AV_PIX_FMT_YUV420P12
Definition: pixfmt.h:401
av_bsf_send_packet
int av_bsf_send_packet(AVBSFContext *ctx, AVPacket *pkt)
Submit a packet for filtering.
Definition: bsf.c:197
SIZE_SPECIFIER
#define SIZE_SPECIFIER
Definition: internal.h:264
free_frame_list
static av_cold void free_frame_list(struct FrameListData *list)
Definition: libaomenc.c:225
AVCodecContext
main external API structure.
Definition: avcodec.h:526
pkt
static AVPacket pkt
Definition: demuxing_decoding.c:54
AVBitStreamFilter
Definition: bsf.h:98
AVCodecContext::qmin
int qmin
minimum quantizer
Definition: avcodec.h:1368
AVRational::den
int den
Denominator.
Definition: rational.h:60
AV_PIX_FMT_NONE
@ AV_PIX_FMT_NONE
Definition: pixfmt.h:65
AV_OPT_TYPE_INT
@ AV_OPT_TYPE_INT
Definition: opt.h:223
AVCodecContext::profile
int profile
profile
Definition: avcodec.h:1859
choose_tiling
static int choose_tiling(AVCodecContext *avctx, struct aom_codec_enc_cfg *enccfg)
Definition: libaomenc.c:360
AOMEncoderContext::maxsection_pct
int maxsection_pct
Definition: libaomenc.c:86
av_base64_encode
char * av_base64_encode(char *out, int out_size, const uint8_t *in, int in_size)
Encode data to base64 and null-terminate.
Definition: base64.c:138
profiles
static const AVProfile profiles[]
Definition: libfdk-aacenc.c:428
AV_CODEC_CAP_DELAY
#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:75
AV_PIX_FMT_YUV444P
@ AV_PIX_FMT_YUV444P
planar YUV 4:4:4, 24bpp, (1 Cr & Cb sample per 1x1 Y samples)
Definition: pixfmt.h:71
class_aom
static const AVClass class_aom
Definition: libaomenc.c:1122
AV_PICTURE_TYPE_P
@ AV_PICTURE_TYPE_P
Predicted.
Definition: avutil.h:275
AVMEDIA_TYPE_VIDEO
@ AVMEDIA_TYPE_VIDEO
Definition: avutil.h:201
AV_PIX_FMT_YUV422P
@ AV_PIX_FMT_YUV422P
planar YUV 4:2:2, 16bpp, (1 Cr & Cb sample per 2x1 Y samples)
Definition: pixfmt.h:70
packet_internal.h
av1_pix_fmts
static enum AVPixelFormat av1_pix_fmts[]
Definition: libaomenc.c:1032
FFALIGN
#define FFALIGN(x, a)
Definition: macros.h:48
AOMEncoderContext::frame_parallel
int frame_parallel
Definition: libaomenc.c:87
AVPacket
This structure stores compressed data.
Definition: packet.h:332
AVCodecContext::priv_data
void * priv_data
Definition: avcodec.h:553
AV_OPT_TYPE_BOOL
@ AV_OPT_TYPE_BOOL
Definition: opt.h:240
av1_pix_fmts_highbd
static enum AVPixelFormat av1_pix_fmts_highbd[]
Definition: libaomenc.c:1039
av_freep
#define av_freep(p)
Definition: tableprint_vlc.h:35
av_bsf_free
void av_bsf_free(AVBSFContext **pctx)
Free a bitstream filter context and everything associated with it; write NULL into the supplied point...
Definition: bsf.c:40
AVCodecContext::width
int width
picture width / height.
Definition: avcodec.h:699
AV_OPT_TYPE_FLAGS
@ AV_OPT_TYPE_FLAGS
Definition: opt.h:222
flags
#define flags(name, subs,...)
Definition: cbs_av1.c:565
AVERROR_BUG
#define AVERROR_BUG
Internal bug, also see AVERROR_BUG2.
Definition: error.h:50
av_log
#define av_log(a,...)
Definition: tableprint_vlc.h:28
FrameListData::sz
size_t sz
length of compressed data
Definition: libaomenc.c:49
AVERROR_INVALIDDATA
#define AVERROR_INVALIDDATA
Invalid data found when processing input.
Definition: error.h:59
FF_PROFILE_AV1_HIGH
#define FF_PROFILE_AV1_HIGH
Definition: avcodec.h:1953
ff_alloc_packet2
int ff_alloc_packet2(AVCodecContext *avctx, AVPacket *avpkt, int64_t size, int64_t min_size)
Check AVPacket size and/or allocate data.
Definition: encode.c:32
av1_init_static
static av_cold void av1_init_static(AVCodec *codec)
Definition: libaomenc.c:1052
AOMEncoderContext::enable_intrabc
int enable_intrabc
Definition: libaomenc.c:95
aom_free
static av_cold int aom_free(AVCodecContext *avctx)
Definition: libaomenc.c:263
AV_OPT_TYPE_CONST
@ AV_OPT_TYPE_CONST
Definition: opt.h:232
snprintf
#define snprintf
Definition: snprintf.h:34
AOMEncoderContext::tune
int tune
Definition: libaomenc.c:98
av_log2
int av_log2(unsigned v)
Definition: intmath.c:26
AOMEncoderContext::crf
int crf
Definition: libaomenc.c:75
OFFSET
#define OFFSET(x)
Definition: libaomenc.c:1069
av_bsf_alloc
int av_bsf_alloc(const AVBitStreamFilter *filter, AVBSFContext **pctx)
Allocate a context for a given bitstream filter.
Definition: bsf.c:91
AV_CODEC_FLAG_PASS1
#define AV_CODEC_FLAG_PASS1
Use internal 2pass ratecontrol in first pass mode.
Definition: avcodec.h:296
FrameListData::have_sse
int have_sse
true if we have pending sse[]
Definition: libaomenc.c:56