FFmpeg
libvpxenc.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  * VP8/9 encoder support via libvpx
24  */
25 
26 #include "config_components.h"
27 
28 #define VPX_DISABLE_CTRL_TYPECHECKS 1
29 #define VPX_CODEC_DISABLE_COMPAT 1
30 #include <vpx/vpx_encoder.h>
31 #include <vpx/vp8cx.h>
32 
33 #include "avcodec.h"
34 #include "codec_internal.h"
35 #include "encode.h"
36 #include "internal.h"
37 #include "libavutil/avassert.h"
38 #include "libvpx.h"
39 #include "packet_internal.h"
40 #include "profiles.h"
41 #include "libavutil/avstring.h"
42 #include "libavutil/base64.h"
43 #include "libavutil/common.h"
44 #include "libavutil/cpu.h"
45 #include "libavutil/fifo.h"
46 #include "libavutil/internal.h"
47 #include "libavutil/intreadwrite.h"
48 #include "libavutil/mathematics.h"
49 #include "libavutil/opt.h"
50 #include "libavutil/pixdesc.h"
51 
52 /**
53  * Portion of struct vpx_codec_cx_pkt from vpx_encoder.h.
54  * One encoded frame returned from the library.
55  */
56 struct FrameListData {
57  void *buf; /**< compressed data buffer */
58  size_t sz; /**< length of compressed data */
59  int64_t pts; /**< time stamp to show frame
60  (in timebase units) */
61  unsigned long duration; /**< duration to show frame
62  (in timebase units) */
63  uint32_t flags; /**< flags for this frame */
64  uint64_t sse[4];
65  int have_sse; /**< true if we have pending sse[] */
66  uint64_t frame_number;
67  struct FrameListData *next;
68 };
69 
70 typedef struct FrameHDR10Plus {
71  int64_t pts;
74 
75 typedef struct VPxEncoderContext {
76  AVClass *class;
77  struct vpx_codec_ctx encoder;
78  struct vpx_image rawimg;
79  struct vpx_codec_ctx encoder_alpha;
80  struct vpx_image rawimg_alpha;
81  uint8_t is_alpha;
82  struct vpx_fixed_buf twopass_stats;
83  int deadline; //i.e., RT/GOOD/BEST
84  uint64_t sse[4];
85  int have_sse; /**< true if we have pending sse[] */
86  uint64_t frame_number;
89 
90  int cpu_used;
91  int sharpness;
92  /**
93  * VP8 specific flags, see VP8F_* below.
94  */
95  int flags;
96 #define VP8F_ERROR_RESILIENT 0x00000001 ///< Enable measures appropriate for streaming over lossy links
97 #define VP8F_AUTO_ALT_REF 0x00000002 ///< Enable automatic alternate reference frame generation
98 
100 
104 
105  int tune;
106 
109  int crf;
114 
118 
119  // VP9-only
120  int lossless;
124  int aq_mode;
127  int vpx_cs;
128  float level;
129  int row_mt;
134  /**
135  * If the driver does not support ROI then warn the first time we
136  * encounter a frame with ROI side data.
137  */
139 #if CONFIG_LIBVPX_VP9_ENCODER && defined(VPX_CTRL_VP9E_SET_MAX_INTER_BITRATE_PCT)
140  vpx_svc_ref_frame_config_t ref_frame_config;
141 #endif
142 } VPxContext;
143 
144 /** String mappings for enum vp8e_enc_control_id */
145 static const char *const ctlidstr[] = {
146  [VP8E_SET_CPUUSED] = "VP8E_SET_CPUUSED",
147  [VP8E_SET_ENABLEAUTOALTREF] = "VP8E_SET_ENABLEAUTOALTREF",
148  [VP8E_SET_NOISE_SENSITIVITY] = "VP8E_SET_NOISE_SENSITIVITY",
149  [VP8E_SET_STATIC_THRESHOLD] = "VP8E_SET_STATIC_THRESHOLD",
150  [VP8E_SET_TOKEN_PARTITIONS] = "VP8E_SET_TOKEN_PARTITIONS",
151  [VP8E_SET_ARNR_MAXFRAMES] = "VP8E_SET_ARNR_MAXFRAMES",
152  [VP8E_SET_ARNR_STRENGTH] = "VP8E_SET_ARNR_STRENGTH",
153  [VP8E_SET_ARNR_TYPE] = "VP8E_SET_ARNR_TYPE",
154  [VP8E_SET_TUNING] = "VP8E_SET_TUNING",
155  [VP8E_SET_CQ_LEVEL] = "VP8E_SET_CQ_LEVEL",
156  [VP8E_SET_MAX_INTRA_BITRATE_PCT] = "VP8E_SET_MAX_INTRA_BITRATE_PCT",
157  [VP8E_SET_SHARPNESS] = "VP8E_SET_SHARPNESS",
158  [VP8E_SET_TEMPORAL_LAYER_ID] = "VP8E_SET_TEMPORAL_LAYER_ID",
159 #if CONFIG_LIBVPX_VP9_ENCODER
160  [VP9E_SET_LOSSLESS] = "VP9E_SET_LOSSLESS",
161  [VP9E_SET_TILE_COLUMNS] = "VP9E_SET_TILE_COLUMNS",
162  [VP9E_SET_TILE_ROWS] = "VP9E_SET_TILE_ROWS",
163  [VP9E_SET_FRAME_PARALLEL_DECODING] = "VP9E_SET_FRAME_PARALLEL_DECODING",
164  [VP9E_SET_AQ_MODE] = "VP9E_SET_AQ_MODE",
165  [VP9E_SET_COLOR_SPACE] = "VP9E_SET_COLOR_SPACE",
166  [VP9E_SET_SVC_LAYER_ID] = "VP9E_SET_SVC_LAYER_ID",
167 #if VPX_ENCODER_ABI_VERSION >= 12
168  [VP9E_SET_SVC_PARAMETERS] = "VP9E_SET_SVC_PARAMETERS",
169  [VP9E_SET_SVC_REF_FRAME_CONFIG] = "VP9E_SET_SVC_REF_FRAME_CONFIG",
170 #endif
171  [VP9E_SET_SVC] = "VP9E_SET_SVC",
172 #if VPX_ENCODER_ABI_VERSION >= 11
173  [VP9E_SET_COLOR_RANGE] = "VP9E_SET_COLOR_RANGE",
174 #endif
175 #if VPX_ENCODER_ABI_VERSION >= 12
176  [VP9E_SET_TARGET_LEVEL] = "VP9E_SET_TARGET_LEVEL",
177  [VP9E_GET_LEVEL] = "VP9E_GET_LEVEL",
178 #endif
179 #ifdef VPX_CTRL_VP9E_SET_ROW_MT
180  [VP9E_SET_ROW_MT] = "VP9E_SET_ROW_MT",
181 #endif
182 #ifdef VPX_CTRL_VP9E_SET_TUNE_CONTENT
183  [VP9E_SET_TUNE_CONTENT] = "VP9E_SET_TUNE_CONTENT",
184 #endif
185 #ifdef VPX_CTRL_VP9E_SET_TPL
186  [VP9E_SET_TPL] = "VP9E_SET_TPL",
187 #endif
188 #endif
189 };
190 
191 static av_cold void log_encoder_error(AVCodecContext *avctx, const char *desc)
192 {
193  VPxContext *ctx = avctx->priv_data;
194  const char *error = vpx_codec_error(&ctx->encoder);
195  const char *detail = vpx_codec_error_detail(&ctx->encoder);
196 
197  av_log(avctx, AV_LOG_ERROR, "%s: %s\n", desc, error);
198  if (detail)
199  av_log(avctx, AV_LOG_ERROR, " Additional information: %s\n", detail);
200 }
201 
203  const struct vpx_codec_enc_cfg *cfg,
204  int level)
205 {
206  int width = -30;
207  int i;
208 
209  av_log(avctx, level, "vpx_codec_enc_cfg\n");
210  av_log(avctx, level, "generic settings\n"
211  " %*s%u\n %*s%u\n %*s%u\n %*s%u\n %*s%u\n"
212 #if CONFIG_LIBVPX_VP9_ENCODER
213  " %*s%u\n %*s%u\n"
214 #endif
215  " %*s{%u/%u}\n %*s%u\n %*s%d\n %*s%u\n",
216  width, "g_usage:", cfg->g_usage,
217  width, "g_threads:", cfg->g_threads,
218  width, "g_profile:", cfg->g_profile,
219  width, "g_w:", cfg->g_w,
220  width, "g_h:", cfg->g_h,
221 #if CONFIG_LIBVPX_VP9_ENCODER
222  width, "g_bit_depth:", cfg->g_bit_depth,
223  width, "g_input_bit_depth:", cfg->g_input_bit_depth,
224 #endif
225  width, "g_timebase:", cfg->g_timebase.num, cfg->g_timebase.den,
226  width, "g_error_resilient:", cfg->g_error_resilient,
227  width, "g_pass:", cfg->g_pass,
228  width, "g_lag_in_frames:", cfg->g_lag_in_frames);
229  av_log(avctx, level, "rate control settings\n"
230  " %*s%u\n %*s%u\n %*s%u\n %*s%u\n"
231  " %*s%d\n %*s%p(%"SIZE_SPECIFIER")\n %*s%u\n",
232  width, "rc_dropframe_thresh:", cfg->rc_dropframe_thresh,
233  width, "rc_resize_allowed:", cfg->rc_resize_allowed,
234  width, "rc_resize_up_thresh:", cfg->rc_resize_up_thresh,
235  width, "rc_resize_down_thresh:", cfg->rc_resize_down_thresh,
236  width, "rc_end_usage:", cfg->rc_end_usage,
237  width, "rc_twopass_stats_in:", cfg->rc_twopass_stats_in.buf, cfg->rc_twopass_stats_in.sz,
238  width, "rc_target_bitrate:", cfg->rc_target_bitrate);
239  av_log(avctx, level, "quantizer settings\n"
240  " %*s%u\n %*s%u\n",
241  width, "rc_min_quantizer:", cfg->rc_min_quantizer,
242  width, "rc_max_quantizer:", cfg->rc_max_quantizer);
243  av_log(avctx, level, "bitrate tolerance\n"
244  " %*s%u\n %*s%u\n",
245  width, "rc_undershoot_pct:", cfg->rc_undershoot_pct,
246  width, "rc_overshoot_pct:", cfg->rc_overshoot_pct);
247  av_log(avctx, level, "temporal layering settings\n"
248  " %*s%u\n", width, "ts_number_layers:", cfg->ts_number_layers);
249  if (avctx->codec_id == AV_CODEC_ID_VP8) {
250  av_log(avctx, level,
251  "\n %*s", width, "ts_target_bitrate:");
252  for (i = 0; i < VPX_TS_MAX_LAYERS; i++)
253  av_log(avctx, level,
254  "%u ", cfg->ts_target_bitrate[i]);
255  }
256 #if (VPX_ENCODER_ABI_VERSION >= 12) && CONFIG_LIBVPX_VP9_ENCODER
257  if (avctx->codec_id == AV_CODEC_ID_VP9) {
258  av_log(avctx, level,
259  "\n %*s", width, "layer_target_bitrate:");
260  for (i = 0; i < VPX_TS_MAX_LAYERS; i++)
261  av_log(avctx, level,
262  "%u ", cfg->layer_target_bitrate[i]);
263  }
264 #endif
265  av_log(avctx, level, "\n");
266  av_log(avctx, level,
267  "\n %*s", width, "ts_rate_decimator:");
268  for (i = 0; i < VPX_TS_MAX_LAYERS; i++)
269  av_log(avctx, level, "%u ", cfg->ts_rate_decimator[i]);
270  av_log(avctx, level, "\n");
271  av_log(avctx, level,
272  "\n %*s%u\n", width, "ts_periodicity:", cfg->ts_periodicity);
273  av_log(avctx, level,
274  "\n %*s", width, "ts_layer_id:");
275  for (i = 0; i < VPX_TS_MAX_PERIODICITY; i++)
276  av_log(avctx, level, "%u ", cfg->ts_layer_id[i]);
277  av_log(avctx, level, "\n");
278  av_log(avctx, level, "decoder buffer model\n"
279  " %*s%u\n %*s%u\n %*s%u\n",
280  width, "rc_buf_sz:", cfg->rc_buf_sz,
281  width, "rc_buf_initial_sz:", cfg->rc_buf_initial_sz,
282  width, "rc_buf_optimal_sz:", cfg->rc_buf_optimal_sz);
283  av_log(avctx, level, "2 pass rate control settings\n"
284  " %*s%u\n %*s%u\n %*s%u\n",
285  width, "rc_2pass_vbr_bias_pct:", cfg->rc_2pass_vbr_bias_pct,
286  width, "rc_2pass_vbr_minsection_pct:", cfg->rc_2pass_vbr_minsection_pct,
287  width, "rc_2pass_vbr_maxsection_pct:", cfg->rc_2pass_vbr_maxsection_pct);
288 #if VPX_ENCODER_ABI_VERSION >= 14
289  av_log(avctx, level, " %*s%u\n",
290  width, "rc_2pass_vbr_corpus_complexity:", cfg->rc_2pass_vbr_corpus_complexity);
291 #endif
292  av_log(avctx, level, "keyframing settings\n"
293  " %*s%d\n %*s%u\n %*s%u\n",
294  width, "kf_mode:", cfg->kf_mode,
295  width, "kf_min_dist:", cfg->kf_min_dist,
296  width, "kf_max_dist:", cfg->kf_max_dist);
297  av_log(avctx, level, "\n");
298 }
299 
300 static void coded_frame_add(void *list, struct FrameListData *cx_frame)
301 {
302  struct FrameListData **p = list;
303 
304  while (*p)
305  p = &(*p)->next;
306  *p = cx_frame;
307  cx_frame->next = NULL;
308 }
309 
310 static av_cold void free_coded_frame(struct FrameListData *cx_frame)
311 {
312  av_freep(&cx_frame->buf);
313  av_freep(&cx_frame);
314 }
315 
317 {
318  struct FrameListData *p = list;
319 
320  while (p) {
321  list = list->next;
322  free_coded_frame(p);
323  p = list;
324  }
325 }
326 
328 {
329  FrameHDR10Plus frame_hdr10_plus;
330  while (av_fifo_read(*fifo, &frame_hdr10_plus, 1) >= 0)
331  av_buffer_unref(&frame_hdr10_plus.hdr10_plus);
332  av_fifo_freep2(fifo);
333 }
334 
336 {
337  FrameHDR10Plus frame_hdr10_plus;
338  uint8_t *data;
339  if (!pkt || av_fifo_peek(fifo, &frame_hdr10_plus, 1, 0) < 0)
340  return 0;
341  if (!frame_hdr10_plus.hdr10_plus || frame_hdr10_plus.pts != pkt->pts)
342  return 0;
343  av_fifo_drain2(fifo, 1);
344 
346  if (!data) {
347  av_buffer_unref(&frame_hdr10_plus.hdr10_plus);
348  return AVERROR(ENOMEM);
349  }
350 
351  memcpy(data, frame_hdr10_plus.hdr10_plus->data, frame_hdr10_plus.hdr10_plus->size);
352  av_buffer_unref(&frame_hdr10_plus.hdr10_plus);
353  return 0;
354 }
355 
357  enum vp8e_enc_control_id id, int val)
358 {
359  VPxContext *ctx = avctx->priv_data;
360  char buf[80];
361  int width = -30;
362  int res;
363 
364  snprintf(buf, sizeof(buf), "%s:", ctlidstr[id]);
365  av_log(avctx, AV_LOG_DEBUG, " %*s%d\n", width, buf, val);
366 
367  res = vpx_codec_control(&ctx->encoder, id, val);
368  if (res != VPX_CODEC_OK) {
369  snprintf(buf, sizeof(buf), "Failed to set %s codec control",
370  ctlidstr[id]);
371  log_encoder_error(avctx, buf);
372  return AVERROR(EINVAL);
373  }
374 
375  if (ctx->is_alpha) {
376  int res_alpha = vpx_codec_control(&ctx->encoder_alpha, id, val);
377  if (res_alpha != VPX_CODEC_OK) {
378  snprintf(buf, sizeof(buf), "Failed to set %s alpha codec control",
379  ctlidstr[id]);
380  log_encoder_error(avctx, buf);
381  return AVERROR(EINVAL);
382  }
383  }
384 
385  return 0;
386 }
387 
388 #if VPX_ENCODER_ABI_VERSION >= 12
389 static av_cold int codecctl_intp(AVCodecContext *avctx,
390  enum vp8e_enc_control_id id, int *val)
391 {
392  VPxContext *ctx = avctx->priv_data;
393  char buf[80];
394  int width = -30;
395  int res;
396 
397  snprintf(buf, sizeof(buf), "%s:", ctlidstr[id]);
398  av_log(avctx, AV_LOG_DEBUG, " %*s%d\n", width, buf, *val);
399 
400  res = vpx_codec_control(&ctx->encoder, id, val);
401  if (res != VPX_CODEC_OK) {
402  snprintf(buf, sizeof(buf), "Failed to set %s codec control",
403  ctlidstr[id]);
404  log_encoder_error(avctx, buf);
405  return AVERROR(EINVAL);
406  }
407 
408  if (ctx->is_alpha) {
409  int res_alpha = vpx_codec_control(&ctx->encoder_alpha, id, val);
410  if (res_alpha != VPX_CODEC_OK) {
411  snprintf(buf, sizeof(buf), "Failed to set %s alpha codec control",
412  ctlidstr[id]);
413  log_encoder_error(avctx, buf);
414  return AVERROR(EINVAL);
415  }
416  }
417 
418  return 0;
419 }
420 #endif
421 
422 static av_cold int vpx_free(AVCodecContext *avctx)
423 {
424  VPxContext *ctx = avctx->priv_data;
425 
426 #if VPX_ENCODER_ABI_VERSION >= 12
427  if (avctx->codec_id == AV_CODEC_ID_VP9 && ctx->level >= 0 &&
428  !(avctx->flags & AV_CODEC_FLAG_PASS1)) {
429  int level_out = 0;
430  if (!codecctl_intp(avctx, VP9E_GET_LEVEL, &level_out))
431  av_log(avctx, AV_LOG_INFO, "Encoded level %.1f\n", level_out * 0.1);
432  }
433 #endif
434 
435  av_freep(&ctx->ts_layer_flags);
436 
437  vpx_codec_destroy(&ctx->encoder);
438  if (ctx->is_alpha) {
439  vpx_codec_destroy(&ctx->encoder_alpha);
440  av_freep(&ctx->rawimg_alpha.planes[VPX_PLANE_U]);
441  av_freep(&ctx->rawimg_alpha.planes[VPX_PLANE_V]);
442  }
443  av_freep(&ctx->twopass_stats.buf);
444  av_freep(&avctx->stats_out);
445  free_frame_list(ctx->coded_frame_list);
446  free_frame_list(ctx->alpha_coded_frame_list);
447  if (ctx->hdr10_plus_fifo)
448  free_hdr10_plus_fifo(&ctx->hdr10_plus_fifo);
449  return 0;
450 }
451 
452 static void vp8_ts_parse_int_array(int *dest, char *value, size_t value_len, int max_entries)
453 {
454  int dest_idx = 0;
455  char *saveptr = NULL;
456  char *token = av_strtok(value, ",", &saveptr);
457 
458  while (token && dest_idx < max_entries) {
459  dest[dest_idx++] = strtoul(token, NULL, 10);
460  token = av_strtok(NULL, ",", &saveptr);
461  }
462 }
463 
464 #if CONFIG_LIBVPX_VP9_ENCODER && defined(VPX_CTRL_VP9E_SET_MAX_INTER_BITRATE_PCT)
465 static void vp8_ts_parse_int64_array(int64_t *dest, char *value, size_t value_len, int max_entries)
466 {
467  int dest_idx = 0;
468  char *saveptr = NULL;
469  char *token = av_strtok(value, ",", &saveptr);
470 
471  while (token && dest_idx < max_entries) {
472  dest[dest_idx++] = strtoull(token, NULL, 10);
473  token = av_strtok(NULL, ",", &saveptr);
474  }
475 }
476 #endif
477 
478 static void set_temporal_layer_pattern(int layering_mode, vpx_codec_enc_cfg_t *cfg,
479  int *layer_flags, int *flag_periodicity)
480 {
481  switch (layering_mode) {
482  case 2: {
483  /**
484  * 2-layers, 2-frame period.
485  */
486  static const int ids[2] = { 0, 1 };
487  cfg->ts_periodicity = 2;
488  *flag_periodicity = 2;
489  cfg->ts_number_layers = 2;
490  cfg->ts_rate_decimator[0] = 2;
491  cfg->ts_rate_decimator[1] = 1;
492  memcpy(cfg->ts_layer_id, ids, sizeof(ids));
493 
494  layer_flags[0] =
495  VP8_EFLAG_NO_REF_GF | VP8_EFLAG_NO_REF_ARF |
496  VP8_EFLAG_NO_UPD_GF | VP8_EFLAG_NO_UPD_ARF;
497  layer_flags[1] =
498  VP8_EFLAG_NO_UPD_ARF | VP8_EFLAG_NO_UPD_GF |
499  VP8_EFLAG_NO_UPD_LAST |
500  VP8_EFLAG_NO_REF_ARF | VP8_EFLAG_NO_REF_GF;
501  break;
502  }
503  case 3: {
504  /**
505  * 3-layers structure with one reference frame.
506  * This works same as temporal_layering_mode 3.
507  *
508  * 3-layers, 4-frame period.
509  */
510  static const int ids[4] = { 0, 2, 1, 2 };
511  cfg->ts_periodicity = 4;
512  *flag_periodicity = 4;
513  cfg->ts_number_layers = 3;
514  cfg->ts_rate_decimator[0] = 4;
515  cfg->ts_rate_decimator[1] = 2;
516  cfg->ts_rate_decimator[2] = 1;
517  memcpy(cfg->ts_layer_id, ids, sizeof(ids));
518 
519  /**
520  * 0=L, 1=GF, 2=ARF,
521  * Intra-layer prediction disabled.
522  */
523  layer_flags[0] =
524  VP8_EFLAG_NO_REF_GF | VP8_EFLAG_NO_REF_ARF |
525  VP8_EFLAG_NO_UPD_GF | VP8_EFLAG_NO_UPD_ARF;
526  layer_flags[1] =
527  VP8_EFLAG_NO_REF_GF | VP8_EFLAG_NO_REF_ARF |
528  VP8_EFLAG_NO_UPD_LAST | VP8_EFLAG_NO_UPD_GF |
529  VP8_EFLAG_NO_UPD_ARF;
530  layer_flags[2] =
531  VP8_EFLAG_NO_REF_GF | VP8_EFLAG_NO_REF_ARF |
532  VP8_EFLAG_NO_UPD_ARF | VP8_EFLAG_NO_UPD_LAST;
533  layer_flags[3] =
534  VP8_EFLAG_NO_REF_LAST | VP8_EFLAG_NO_REF_ARF |
535  VP8_EFLAG_NO_UPD_LAST | VP8_EFLAG_NO_UPD_GF |
536  VP8_EFLAG_NO_UPD_ARF;
537  break;
538  }
539  case 4: {
540  /**
541  * 3-layers structure.
542  * added dependency between the two TL2 frames (on top of case 3).
543  * 3-layers, 4-frame period.
544  */
545  static const int ids[4] = { 0, 2, 1, 2 };
546  cfg->ts_periodicity = 4;
547  *flag_periodicity = 4;
548  cfg->ts_number_layers = 3;
549  cfg->ts_rate_decimator[0] = 4;
550  cfg->ts_rate_decimator[1] = 2;
551  cfg->ts_rate_decimator[2] = 1;
552  memcpy(cfg->ts_layer_id, ids, sizeof(ids));
553 
554  /**
555  * 0=L, 1=GF, 2=ARF, Intra-layer prediction disabled.
556  */
557  layer_flags[0] =
558  VP8_EFLAG_NO_REF_GF | VP8_EFLAG_NO_REF_ARF |
559  VP8_EFLAG_NO_UPD_GF | VP8_EFLAG_NO_UPD_ARF;
560  layer_flags[1] =
561  VP8_EFLAG_NO_REF_GF | VP8_EFLAG_NO_REF_ARF |
562  VP8_EFLAG_NO_UPD_LAST | VP8_EFLAG_NO_UPD_GF;
563  layer_flags[2] =
564  VP8_EFLAG_NO_REF_GF | VP8_EFLAG_NO_REF_ARF |
565  VP8_EFLAG_NO_UPD_ARF | VP8_EFLAG_NO_UPD_LAST;
566  layer_flags[3] =
567  VP8_EFLAG_NO_REF_LAST |
568  VP8_EFLAG_NO_UPD_LAST | VP8_EFLAG_NO_UPD_GF |
569  VP8_EFLAG_NO_UPD_ARF;
570  break;
571  }
572  default:
573  /**
574  * do not change the layer_flags or the flag_periodicity in this case;
575  * it might be that the code is using external flags to be used.
576  */
577  break;
578 
579  }
580 }
581 
582 static int vpx_ts_param_parse(VPxContext *ctx, struct vpx_codec_enc_cfg *enccfg,
583  char *key, char *value, enum AVCodecID codec_id)
584 {
585  size_t value_len = strlen(value);
586  int ts_layering_mode = 0;
587 
588  if (!value_len)
589  return -1;
590 
591  if (!strcmp(key, "ts_number_layers"))
592  enccfg->ts_number_layers = strtoul(value, &value, 10);
593  else if (!strcmp(key, "ts_target_bitrate")) {
594  if (codec_id == AV_CODEC_ID_VP8)
595  vp8_ts_parse_int_array(enccfg->ts_target_bitrate, value, value_len, VPX_TS_MAX_LAYERS);
596 #if (VPX_ENCODER_ABI_VERSION >= 12) && CONFIG_LIBVPX_VP9_ENCODER
597  if (codec_id == AV_CODEC_ID_VP9)
598  vp8_ts_parse_int_array(enccfg->layer_target_bitrate, value, value_len, VPX_TS_MAX_LAYERS);
599 #endif
600  } else if (!strcmp(key, "ts_rate_decimator")) {
601  vp8_ts_parse_int_array(enccfg->ts_rate_decimator, value, value_len, VPX_TS_MAX_LAYERS);
602  } else if (!strcmp(key, "ts_periodicity")) {
603  enccfg->ts_periodicity = strtoul(value, &value, 10);
604  } else if (!strcmp(key, "ts_layer_id")) {
605  vp8_ts_parse_int_array(enccfg->ts_layer_id, value, value_len, VPX_TS_MAX_PERIODICITY);
606  } else if (!strcmp(key, "ts_layering_mode")) {
607  /* option for pre-defined temporal structures in function set_temporal_layer_pattern. */
608  ts_layering_mode = strtoul(value, &value, 4);
609  }
610 
611 #if (VPX_ENCODER_ABI_VERSION >= 12) && CONFIG_LIBVPX_VP9_ENCODER
612  enccfg->temporal_layering_mode = VP9E_TEMPORAL_LAYERING_MODE_BYPASS; // only bypass mode is supported for now.
613  enccfg->ss_number_layers = 1; // TODO: add spatial scalability support.
614 #endif
615  if (ts_layering_mode) {
616  // make sure the ts_layering_mode comes at the end of the ts_parameter string to ensure that
617  // correct configuration is done.
618  ctx->ts_layer_flags = av_malloc_array(VPX_TS_MAX_PERIODICITY, sizeof(*ctx->ts_layer_flags));
619  set_temporal_layer_pattern(ts_layering_mode, enccfg, ctx->ts_layer_flags, &enccfg->ts_periodicity);
620  }
621 
622  return 0;
623 }
624 
625 #if CONFIG_LIBVPX_VP9_ENCODER && defined(VPX_CTRL_VP9E_SET_MAX_INTER_BITRATE_PCT)
626 static int vpx_ref_frame_config_set_value(vpx_svc_ref_frame_config_t *ref_frame_config,
627  int ss_number_layers, char *key, char *value)
628 {
629  size_t value_len = strlen(value);
630 
631  if (!value_len)
632  return AVERROR(EINVAL);
633 
634  if (!strcmp(key, "rfc_update_buffer_slot")) {
635  vp8_ts_parse_int_array(ref_frame_config->update_buffer_slot, value, value_len, ss_number_layers);
636  } else if (!strcmp(key, "rfc_update_last")) {
637  vp8_ts_parse_int_array(ref_frame_config->update_last, value, value_len, ss_number_layers);
638  } else if (!strcmp(key, "rfc_update_golden")) {
639  vp8_ts_parse_int_array(ref_frame_config->update_golden, value, value_len, ss_number_layers);
640  } else if (!strcmp(key, "rfc_update_alt_ref")) {
641  vp8_ts_parse_int_array(ref_frame_config->update_alt_ref, value, value_len, ss_number_layers);
642  } else if (!strcmp(key, "rfc_lst_fb_idx")) {
643  vp8_ts_parse_int_array(ref_frame_config->lst_fb_idx, value, value_len, ss_number_layers);
644  } else if (!strcmp(key, "rfc_gld_fb_idx")) {
645  vp8_ts_parse_int_array(ref_frame_config->gld_fb_idx, value, value_len, ss_number_layers);
646  } else if (!strcmp(key, "rfc_alt_fb_idx")) {
647  vp8_ts_parse_int_array(ref_frame_config->alt_fb_idx, value, value_len, ss_number_layers);
648  } else if (!strcmp(key, "rfc_reference_last")) {
649  vp8_ts_parse_int_array(ref_frame_config->reference_last, value, value_len, ss_number_layers);
650  } else if (!strcmp(key, "rfc_reference_golden")) {
651  vp8_ts_parse_int_array(ref_frame_config->reference_golden, value, value_len, ss_number_layers);
652  } else if (!strcmp(key, "rfc_reference_alt_ref")) {
653  vp8_ts_parse_int_array(ref_frame_config->reference_alt_ref, value, value_len, ss_number_layers);
654  } else if (!strcmp(key, "rfc_reference_duration")) {
655  vp8_ts_parse_int64_array(ref_frame_config->duration, value, value_len, ss_number_layers);
656  }
657 
658  return 0;
659 }
660 
661 static int vpx_parse_ref_frame_config_element(vpx_svc_ref_frame_config_t *ref_frame_config,
662  int ss_number_layers, const char **buf)
663 {
664  const char key_val_sep[] = "=";
665  const char pairs_sep[] = ":";
666  char *key = av_get_token(buf, key_val_sep);
667  char *val = NULL;
668  int ret;
669 
670  if (key && *key && strspn(*buf, key_val_sep)) {
671  (*buf)++;
672  val = av_get_token(buf, pairs_sep);
673  }
674 
675  if (key && *key && val && *val)
676  ret = vpx_ref_frame_config_set_value(ref_frame_config, ss_number_layers, key, val);
677  else
678  ret = AVERROR(EINVAL);
679 
680  av_freep(&key);
681  av_freep(&val);
682 
683  return ret;
684 }
685 
686 static int vpx_parse_ref_frame_config(vpx_svc_ref_frame_config_t *ref_frame_config,
687  int ss_number_layers, const char *str)
688 {
689  int ret = 0;
690 
691  while (*str) {
692  ret =
693  vpx_parse_ref_frame_config_element(ref_frame_config, ss_number_layers, &str);
694  if (ret < 0)
695  return ret;
696 
697  if (*str)
698  str++;
699  }
700 
701  return ret;
702 }
703 #endif
704 
705 #if CONFIG_LIBVPX_VP9_ENCODER
706 static int set_pix_fmt(AVCodecContext *avctx, vpx_codec_caps_t codec_caps,
707  struct vpx_codec_enc_cfg *enccfg, vpx_codec_flags_t *flags,
708  vpx_img_fmt_t *img_fmt)
709 {
710  VPxContext av_unused *ctx = avctx->priv_data;
712  enccfg->g_bit_depth = enccfg->g_input_bit_depth = desc->comp[0].depth;
713  switch (avctx->pix_fmt) {
714  case AV_PIX_FMT_YUV420P:
715  case AV_PIX_FMT_YUVA420P:
716  enccfg->g_profile = 0;
717  *img_fmt = VPX_IMG_FMT_I420;
718  return 0;
719  case AV_PIX_FMT_YUV422P:
720  enccfg->g_profile = 1;
721  *img_fmt = VPX_IMG_FMT_I422;
722  return 0;
723  case AV_PIX_FMT_YUV440P:
724  enccfg->g_profile = 1;
725  *img_fmt = VPX_IMG_FMT_I440;
726  return 0;
727  case AV_PIX_FMT_GBRP:
728  ctx->vpx_cs = VPX_CS_SRGB;
729  case AV_PIX_FMT_YUV444P:
730  enccfg->g_profile = 1;
731  *img_fmt = VPX_IMG_FMT_I444;
732  return 0;
735  if (codec_caps & VPX_CODEC_CAP_HIGHBITDEPTH) {
736  enccfg->g_profile = 2;
737  *img_fmt = VPX_IMG_FMT_I42016;
738  *flags |= VPX_CODEC_USE_HIGHBITDEPTH;
739  return 0;
740  }
741  break;
744  if (codec_caps & VPX_CODEC_CAP_HIGHBITDEPTH) {
745  enccfg->g_profile = 3;
746  *img_fmt = VPX_IMG_FMT_I42216;
747  *flags |= VPX_CODEC_USE_HIGHBITDEPTH;
748  return 0;
749  }
750  break;
753  if (codec_caps & VPX_CODEC_CAP_HIGHBITDEPTH) {
754  enccfg->g_profile = 3;
755  *img_fmt = VPX_IMG_FMT_I44016;
756  *flags |= VPX_CODEC_USE_HIGHBITDEPTH;
757  return 0;
758  }
759  break;
760  case AV_PIX_FMT_GBRP10:
761  case AV_PIX_FMT_GBRP12:
762  ctx->vpx_cs = VPX_CS_SRGB;
765  if (codec_caps & VPX_CODEC_CAP_HIGHBITDEPTH) {
766  enccfg->g_profile = 3;
767  *img_fmt = VPX_IMG_FMT_I44416;
768  *flags |= VPX_CODEC_USE_HIGHBITDEPTH;
769  return 0;
770  }
771  break;
772  default:
773  break;
774  }
775  av_log(avctx, AV_LOG_ERROR, "Unsupported pixel format.\n");
776  return AVERROR_INVALIDDATA;
777 }
778 
779 static void set_colorspace(AVCodecContext *avctx)
780 {
781  enum vpx_color_space vpx_cs;
782  VPxContext *ctx = avctx->priv_data;
783 
784  if (ctx->vpx_cs) {
785  vpx_cs = ctx->vpx_cs;
786  } else {
787  switch (avctx->colorspace) {
788  case AVCOL_SPC_RGB: vpx_cs = VPX_CS_SRGB; break;
789  case AVCOL_SPC_BT709: vpx_cs = VPX_CS_BT_709; break;
790  case AVCOL_SPC_UNSPECIFIED: vpx_cs = VPX_CS_UNKNOWN; break;
791  case AVCOL_SPC_RESERVED: vpx_cs = VPX_CS_RESERVED; break;
792  case AVCOL_SPC_BT470BG: vpx_cs = VPX_CS_BT_601; break;
793  case AVCOL_SPC_SMPTE170M: vpx_cs = VPX_CS_SMPTE_170; break;
794  case AVCOL_SPC_SMPTE240M: vpx_cs = VPX_CS_SMPTE_240; break;
795  case AVCOL_SPC_BT2020_NCL: vpx_cs = VPX_CS_BT_2020; break;
796  default:
797  av_log(avctx, AV_LOG_WARNING, "Unsupported colorspace (%d)\n",
798  avctx->colorspace);
799  return;
800  }
801  }
802  codecctl_int(avctx, VP9E_SET_COLOR_SPACE, vpx_cs);
803 }
804 
805 #if VPX_ENCODER_ABI_VERSION >= 11
806 static void set_color_range(AVCodecContext *avctx)
807 {
808  enum vpx_color_range vpx_cr;
809  switch (avctx->color_range) {
811  case AVCOL_RANGE_MPEG: vpx_cr = VPX_CR_STUDIO_RANGE; break;
812  case AVCOL_RANGE_JPEG: vpx_cr = VPX_CR_FULL_RANGE; break;
813  default:
814  av_log(avctx, AV_LOG_WARNING, "Unsupported color range (%d)\n",
815  avctx->color_range);
816  return;
817  }
818 
819  codecctl_int(avctx, VP9E_SET_COLOR_RANGE, vpx_cr);
820 }
821 #endif
822 #endif
823 
824 /**
825  * Set the target bitrate to VPX library default. Also set CRF to 32 if needed.
826  */
827 static void set_vp8_defaults(AVCodecContext *avctx,
828  struct vpx_codec_enc_cfg *enccfg)
829 {
830  VPxContext *ctx = avctx->priv_data;
831  av_assert0(!avctx->bit_rate);
832  avctx->bit_rate = enccfg->rc_target_bitrate * 1000;
833  if (enccfg->rc_end_usage == VPX_CQ) {
834  av_log(avctx, AV_LOG_WARNING,
835  "Bitrate not specified for constrained quality mode, using default of %dkbit/sec\n",
836  enccfg->rc_target_bitrate);
837  } else {
838  enccfg->rc_end_usage = VPX_CQ;
839  ctx->crf = 32;
840  av_log(avctx, AV_LOG_WARNING,
841  "Neither bitrate nor constrained quality specified, using default CRF of %d and bitrate of %dkbit/sec\n",
842  ctx->crf, enccfg->rc_target_bitrate);
843  }
844 }
845 
846 
847 #if CONFIG_LIBVPX_VP9_ENCODER
848 /**
849  * Keep the target bitrate at 0 to engage constant quality mode. If CRF is not
850  * set, use 32.
851  */
852 static void set_vp9_defaults(AVCodecContext *avctx,
853  struct vpx_codec_enc_cfg *enccfg)
854 {
855  VPxContext *ctx = avctx->priv_data;
856  av_assert0(!avctx->bit_rate);
857  if (enccfg->rc_end_usage != VPX_Q && ctx->lossless < 0) {
858  enccfg->rc_end_usage = VPX_Q;
859  ctx->crf = 32;
860  av_log(avctx, AV_LOG_WARNING,
861  "Neither bitrate nor constrained quality specified, using default CRF of %d\n",
862  ctx->crf);
863  }
864 }
865 #endif
866 
867 /**
868  * Called when the bitrate is not set. It sets appropriate default values for
869  * bitrate and CRF.
870  */
871 static void set_vpx_defaults(AVCodecContext *avctx,
872  struct vpx_codec_enc_cfg *enccfg)
873 {
874  av_assert0(!avctx->bit_rate);
875 #if CONFIG_LIBVPX_VP9_ENCODER
876  if (avctx->codec_id == AV_CODEC_ID_VP9) {
877  set_vp9_defaults(avctx, enccfg);
878  return;
879  }
880 #endif
881  set_vp8_defaults(avctx, enccfg);
882 }
883 
884 static av_cold int vpx_init(AVCodecContext *avctx,
885  const struct vpx_codec_iface *iface)
886 {
887  VPxContext *ctx = avctx->priv_data;
888  struct vpx_codec_enc_cfg enccfg = { 0 };
889  struct vpx_codec_enc_cfg enccfg_alpha;
890  vpx_codec_flags_t flags = (avctx->flags & AV_CODEC_FLAG_PSNR) ? VPX_CODEC_USE_PSNR : 0;
891  AVCPBProperties *cpb_props;
892  int res;
893  vpx_img_fmt_t img_fmt = VPX_IMG_FMT_I420;
894 #if CONFIG_LIBVPX_VP9_ENCODER
895  vpx_codec_caps_t codec_caps = vpx_codec_get_caps(iface);
896  vpx_svc_extra_cfg_t svc_params;
897 #endif
898  AVDictionaryEntry* en = NULL;
899 
900  av_log(avctx, AV_LOG_INFO, "%s\n", vpx_codec_version_str());
901  av_log(avctx, AV_LOG_VERBOSE, "%s\n", vpx_codec_build_config());
902 
903  if (avctx->pix_fmt == AV_PIX_FMT_YUVA420P)
904  ctx->is_alpha = 1;
905 
906  if ((res = vpx_codec_enc_config_default(iface, &enccfg, 0)) != VPX_CODEC_OK) {
907  av_log(avctx, AV_LOG_ERROR, "Failed to get config: %s\n",
908  vpx_codec_err_to_string(res));
909  return AVERROR(EINVAL);
910  }
911 
912 #if CONFIG_LIBVPX_VP9_ENCODER
913  if (avctx->codec_id == AV_CODEC_ID_VP9) {
914  if (set_pix_fmt(avctx, codec_caps, &enccfg, &flags, &img_fmt))
915  return AVERROR(EINVAL);
916  // Keep HDR10+ if it has bit depth higher than 8 and
917  // it has PQ trc (SMPTE2084).
918  if (enccfg.g_bit_depth > 8 && avctx->color_trc == AVCOL_TRC_SMPTE2084) {
919  ctx->hdr10_plus_fifo = av_fifo_alloc2(1, sizeof(FrameHDR10Plus),
921  if (!ctx->hdr10_plus_fifo)
922  return AVERROR(ENOMEM);
923  }
924  }
925 #endif
926 
927  if(!avctx->bit_rate)
928  if(avctx->rc_max_rate || avctx->rc_buffer_size || avctx->rc_initial_buffer_occupancy) {
929  av_log( avctx, AV_LOG_ERROR, "Rate control parameters set without a bitrate\n");
930  return AVERROR(EINVAL);
931  }
932 
933  dump_enc_cfg(avctx, &enccfg, AV_LOG_DEBUG);
934 
935  enccfg.g_w = avctx->width;
936  enccfg.g_h = avctx->height;
937  enccfg.g_timebase.num = avctx->time_base.num;
938  enccfg.g_timebase.den = avctx->time_base.den;
939  enccfg.g_threads =
940  FFMIN(avctx->thread_count ? avctx->thread_count : av_cpu_count(), 16);
941  enccfg.g_lag_in_frames= ctx->lag_in_frames;
942 
943  if (avctx->flags & AV_CODEC_FLAG_PASS1)
944  enccfg.g_pass = VPX_RC_FIRST_PASS;
945  else if (avctx->flags & AV_CODEC_FLAG_PASS2)
946  enccfg.g_pass = VPX_RC_LAST_PASS;
947  else
948  enccfg.g_pass = VPX_RC_ONE_PASS;
949 
950  if (avctx->rc_min_rate == avctx->rc_max_rate &&
951  avctx->rc_min_rate == avctx->bit_rate && avctx->bit_rate) {
952  enccfg.rc_end_usage = VPX_CBR;
953  } else if (ctx->crf >= 0) {
954  enccfg.rc_end_usage = VPX_CQ;
955 #if CONFIG_LIBVPX_VP9_ENCODER
956  if (!avctx->bit_rate && avctx->codec_id == AV_CODEC_ID_VP9)
957  enccfg.rc_end_usage = VPX_Q;
958 #endif
959  }
960 
961  if (avctx->bit_rate) {
962  enccfg.rc_target_bitrate = av_rescale_rnd(avctx->bit_rate, 1, 1000,
964 #if CONFIG_LIBVPX_VP9_ENCODER
965  enccfg.ss_target_bitrate[0] = enccfg.rc_target_bitrate;
966 #endif
967  } else {
968  // Set bitrate to default value. Also sets CRF to default if needed.
969  set_vpx_defaults(avctx, &enccfg);
970  }
971 
972  if (avctx->codec_id == AV_CODEC_ID_VP9 && ctx->lossless == 1) {
973  enccfg.rc_min_quantizer =
974  enccfg.rc_max_quantizer = 0;
975  } else {
976  if (avctx->qmin >= 0)
977  enccfg.rc_min_quantizer = avctx->qmin;
978  if (avctx->qmax >= 0)
979  enccfg.rc_max_quantizer = avctx->qmax;
980  }
981 
982  if (enccfg.rc_end_usage == VPX_CQ
983 #if CONFIG_LIBVPX_VP9_ENCODER
984  || enccfg.rc_end_usage == VPX_Q
985 #endif
986  ) {
987  if (ctx->crf < enccfg.rc_min_quantizer || ctx->crf > enccfg.rc_max_quantizer) {
988  av_log(avctx, AV_LOG_ERROR,
989  "CQ level %d must be between minimum and maximum quantizer value (%d-%d)\n",
990  ctx->crf, enccfg.rc_min_quantizer, enccfg.rc_max_quantizer);
991  return AVERROR(EINVAL);
992  }
993  }
994 
995  enccfg.rc_dropframe_thresh = ctx->drop_threshold;
996 
997  //0-100 (0 => CBR, 100 => VBR)
998  enccfg.rc_2pass_vbr_bias_pct = lrint(avctx->qcompress * 100);
999  if (avctx->bit_rate)
1000  enccfg.rc_2pass_vbr_minsection_pct =
1001  avctx->rc_min_rate * 100LL / avctx->bit_rate;
1002  if (avctx->rc_max_rate)
1003  enccfg.rc_2pass_vbr_maxsection_pct =
1004  avctx->rc_max_rate * 100LL / avctx->bit_rate;
1005 #if CONFIG_LIBVPX_VP9_ENCODER
1006  if (avctx->codec_id == AV_CODEC_ID_VP9) {
1007 #if VPX_ENCODER_ABI_VERSION >= 14
1008  if (ctx->corpus_complexity >= 0)
1009  enccfg.rc_2pass_vbr_corpus_complexity = ctx->corpus_complexity;
1010 #endif
1011  }
1012 #endif
1013 
1014  if (avctx->rc_buffer_size)
1015  enccfg.rc_buf_sz =
1016  avctx->rc_buffer_size * 1000LL / avctx->bit_rate;
1017  if (avctx->rc_initial_buffer_occupancy)
1018  enccfg.rc_buf_initial_sz =
1019  avctx->rc_initial_buffer_occupancy * 1000LL / avctx->bit_rate;
1020  enccfg.rc_buf_optimal_sz = enccfg.rc_buf_sz * 5 / 6;
1021  if (ctx->rc_undershoot_pct >= 0)
1022  enccfg.rc_undershoot_pct = ctx->rc_undershoot_pct;
1023  if (ctx->rc_overshoot_pct >= 0)
1024  enccfg.rc_overshoot_pct = ctx->rc_overshoot_pct;
1025 
1026  //_enc_init() will balk if kf_min_dist differs from max w/VPX_KF_AUTO
1027  if (avctx->keyint_min >= 0 && avctx->keyint_min == avctx->gop_size)
1028  enccfg.kf_min_dist = avctx->keyint_min;
1029  if (avctx->gop_size >= 0)
1030  enccfg.kf_max_dist = avctx->gop_size;
1031 
1032  if (enccfg.g_pass == VPX_RC_FIRST_PASS)
1033  enccfg.g_lag_in_frames = 0;
1034  else if (enccfg.g_pass == VPX_RC_LAST_PASS) {
1035  int decode_size, ret;
1036 
1037  if (!avctx->stats_in) {
1038  av_log(avctx, AV_LOG_ERROR, "No stats file for second pass\n");
1039  return AVERROR_INVALIDDATA;
1040  }
1041 
1042  ctx->twopass_stats.sz = strlen(avctx->stats_in) * 3 / 4;
1043  ret = av_reallocp(&ctx->twopass_stats.buf, ctx->twopass_stats.sz);
1044  if (ret < 0) {
1045  av_log(avctx, AV_LOG_ERROR,
1046  "Stat buffer alloc (%"SIZE_SPECIFIER" bytes) failed\n",
1047  ctx->twopass_stats.sz);
1048  ctx->twopass_stats.sz = 0;
1049  return ret;
1050  }
1051  decode_size = av_base64_decode(ctx->twopass_stats.buf, avctx->stats_in,
1052  ctx->twopass_stats.sz);
1053  if (decode_size < 0) {
1054  av_log(avctx, AV_LOG_ERROR, "Stat buffer decode failed\n");
1055  return AVERROR_INVALIDDATA;
1056  }
1057 
1058  ctx->twopass_stats.sz = decode_size;
1059  enccfg.rc_twopass_stats_in = ctx->twopass_stats;
1060  }
1061 
1062  /* 0-3: For non-zero values the encoder increasingly optimizes for reduced
1063  complexity playback on low powered devices at the expense of encode
1064  quality. */
1065  if (avctx->profile != FF_PROFILE_UNKNOWN)
1066  enccfg.g_profile = avctx->profile;
1067 
1068  enccfg.g_error_resilient = ctx->error_resilient || ctx->flags & VP8F_ERROR_RESILIENT;
1069 
1070  while ((en = av_dict_get(ctx->vpx_ts_parameters, "", en, AV_DICT_IGNORE_SUFFIX))) {
1071  if (vpx_ts_param_parse(ctx, &enccfg, en->key, en->value, avctx->codec_id) < 0)
1072  av_log(avctx, AV_LOG_WARNING,
1073  "Error parsing option '%s = %s'.\n",
1074  en->key, en->value);
1075  }
1076 
1077  /* Construct Encoder Context */
1078  res = vpx_codec_enc_init(&ctx->encoder, iface, &enccfg, flags);
1079  if (res != VPX_CODEC_OK) {
1080  dump_enc_cfg(avctx, &enccfg, AV_LOG_WARNING);
1081  log_encoder_error(avctx, "Failed to initialize encoder");
1082  return AVERROR(EINVAL);
1083  }
1084  dump_enc_cfg(avctx, &enccfg, AV_LOG_DEBUG);
1085 
1086 #if CONFIG_LIBVPX_VP9_ENCODER
1087  if (avctx->codec_id == AV_CODEC_ID_VP9 && enccfg.ts_number_layers > 1) {
1088  memset(&svc_params, 0, sizeof(svc_params));
1089  for (int i = 0; i < enccfg.ts_number_layers; ++i) {
1090  svc_params.max_quantizers[i] = enccfg.rc_max_quantizer;
1091  svc_params.min_quantizers[i] = enccfg.rc_min_quantizer;
1092  }
1093  svc_params.scaling_factor_num[0] = enccfg.g_h;
1094  svc_params.scaling_factor_den[0] = enccfg.g_h;
1095 #if VPX_ENCODER_ABI_VERSION >= 12
1096  codecctl_int(avctx, VP9E_SET_SVC, 1);
1097  codecctl_intp(avctx, VP9E_SET_SVC_PARAMETERS, (int *)&svc_params);
1098 #endif
1099  }
1100 #endif
1101  if (ctx->is_alpha) {
1102  enccfg_alpha = enccfg;
1103  res = vpx_codec_enc_init(&ctx->encoder_alpha, iface, &enccfg_alpha, flags);
1104  if (res != VPX_CODEC_OK) {
1105  log_encoder_error(avctx, "Failed to initialize alpha encoder");
1106  return AVERROR(EINVAL);
1107  }
1108  }
1109 
1110  //codec control failures are currently treated only as warnings
1111  av_log(avctx, AV_LOG_DEBUG, "vpx_codec_control\n");
1112  codecctl_int(avctx, VP8E_SET_CPUUSED, ctx->cpu_used);
1113  if (ctx->flags & VP8F_AUTO_ALT_REF)
1114  ctx->auto_alt_ref = 1;
1115  if (ctx->auto_alt_ref >= 0)
1116  codecctl_int(avctx, VP8E_SET_ENABLEAUTOALTREF,
1117  avctx->codec_id == AV_CODEC_ID_VP8 ? !!ctx->auto_alt_ref : ctx->auto_alt_ref);
1118  if (ctx->arnr_max_frames >= 0)
1119  codecctl_int(avctx, VP8E_SET_ARNR_MAXFRAMES, ctx->arnr_max_frames);
1120  if (ctx->arnr_strength >= 0)
1121  codecctl_int(avctx, VP8E_SET_ARNR_STRENGTH, ctx->arnr_strength);
1122  if (ctx->arnr_type >= 0)
1123  codecctl_int(avctx, VP8E_SET_ARNR_TYPE, ctx->arnr_type);
1124  if (ctx->tune >= 0)
1125  codecctl_int(avctx, VP8E_SET_TUNING, ctx->tune);
1126 
1127  if (ctx->auto_alt_ref && ctx->is_alpha && avctx->codec_id == AV_CODEC_ID_VP8) {
1128  av_log(avctx, AV_LOG_ERROR, "Transparency encoding with auto_alt_ref does not work\n");
1129  return AVERROR(EINVAL);
1130  }
1131 
1132  if (ctx->sharpness >= 0)
1133  codecctl_int(avctx, VP8E_SET_SHARPNESS, ctx->sharpness);
1134 
1135  if (CONFIG_LIBVPX_VP8_ENCODER && avctx->codec_id == AV_CODEC_ID_VP8) {
1136  codecctl_int(avctx, VP8E_SET_NOISE_SENSITIVITY, ctx->noise_sensitivity);
1137  codecctl_int(avctx, VP8E_SET_TOKEN_PARTITIONS, av_log2(avctx->slices));
1138  }
1139  codecctl_int(avctx, VP8E_SET_STATIC_THRESHOLD, ctx->static_thresh);
1140  if (ctx->crf >= 0)
1141  codecctl_int(avctx, VP8E_SET_CQ_LEVEL, ctx->crf);
1142  if (ctx->max_intra_rate >= 0)
1143  codecctl_int(avctx, VP8E_SET_MAX_INTRA_BITRATE_PCT, ctx->max_intra_rate);
1144 
1145 #if CONFIG_LIBVPX_VP9_ENCODER
1146  if (avctx->codec_id == AV_CODEC_ID_VP9) {
1147  if (ctx->lossless >= 0)
1148  codecctl_int(avctx, VP9E_SET_LOSSLESS, ctx->lossless);
1149  if (ctx->tile_columns >= 0)
1150  codecctl_int(avctx, VP9E_SET_TILE_COLUMNS, ctx->tile_columns);
1151  if (ctx->tile_rows >= 0)
1152  codecctl_int(avctx, VP9E_SET_TILE_ROWS, ctx->tile_rows);
1153  if (ctx->frame_parallel >= 0)
1154  codecctl_int(avctx, VP9E_SET_FRAME_PARALLEL_DECODING, ctx->frame_parallel);
1155  if (ctx->aq_mode >= 0)
1156  codecctl_int(avctx, VP9E_SET_AQ_MODE, ctx->aq_mode);
1157  set_colorspace(avctx);
1158 #if VPX_ENCODER_ABI_VERSION >= 11
1159  set_color_range(avctx);
1160 #endif
1161 #if VPX_ENCODER_ABI_VERSION >= 12
1162  codecctl_int(avctx, VP9E_SET_TARGET_LEVEL, ctx->level < 0 ? 255 : lrint(ctx->level * 10));
1163 #endif
1164 #ifdef VPX_CTRL_VP9E_SET_ROW_MT
1165  if (ctx->row_mt >= 0)
1166  codecctl_int(avctx, VP9E_SET_ROW_MT, ctx->row_mt);
1167 #endif
1168 #ifdef VPX_CTRL_VP9E_SET_TUNE_CONTENT
1169  if (ctx->tune_content >= 0)
1170  codecctl_int(avctx, VP9E_SET_TUNE_CONTENT, ctx->tune_content);
1171 #endif
1172 #ifdef VPX_CTRL_VP9E_SET_TPL
1173  if (ctx->tpl_model >= 0)
1174  codecctl_int(avctx, VP9E_SET_TPL, ctx->tpl_model);
1175 #endif
1176  }
1177 #endif
1178 
1179  av_log(avctx, AV_LOG_DEBUG, "Using deadline: %d\n", ctx->deadline);
1180 
1181  //provide dummy value to initialize wrapper, values will be updated each _encode()
1182  vpx_img_wrap(&ctx->rawimg, img_fmt, avctx->width, avctx->height, 1,
1183  (unsigned char*)1);
1184 #if CONFIG_LIBVPX_VP9_ENCODER
1185  if (avctx->codec_id == AV_CODEC_ID_VP9 && (codec_caps & VPX_CODEC_CAP_HIGHBITDEPTH))
1186  ctx->rawimg.bit_depth = enccfg.g_bit_depth;
1187 #endif
1188 
1189  cpb_props = ff_add_cpb_side_data(avctx);
1190  if (!cpb_props)
1191  return AVERROR(ENOMEM);
1192 
1193  if (enccfg.rc_end_usage == VPX_CBR ||
1194  enccfg.g_pass != VPX_RC_ONE_PASS) {
1195  cpb_props->max_bitrate = avctx->rc_max_rate;
1196  cpb_props->min_bitrate = avctx->rc_min_rate;
1197  cpb_props->avg_bitrate = avctx->bit_rate;
1198  }
1199  cpb_props->buffer_size = avctx->rc_buffer_size;
1200 
1201  return 0;
1202 }
1203 
1204 static inline void cx_pktcpy(struct FrameListData *dst,
1205  const struct vpx_codec_cx_pkt *src,
1206  VPxContext *ctx)
1207 {
1208  dst->pts = src->data.frame.pts;
1209  dst->duration = src->data.frame.duration;
1210  dst->flags = src->data.frame.flags;
1211  dst->sz = src->data.frame.sz;
1212  dst->buf = src->data.frame.buf;
1213  dst->have_sse = 0;
1214  /* For alt-ref frame, don't store PSNR or increment frame_number */
1215  if (!(dst->flags & VPX_FRAME_IS_INVISIBLE)) {
1216  dst->frame_number = ++ctx->frame_number;
1217  dst->have_sse = ctx->have_sse;
1218  if (ctx->have_sse) {
1219  /* associate last-seen SSE to the frame. */
1220  /* Transfers ownership from ctx to dst. */
1221  /* WARNING! This makes the assumption that PSNR_PKT comes
1222  just before the frame it refers to! */
1223  memcpy(dst->sse, ctx->sse, sizeof(dst->sse));
1224  ctx->have_sse = 0;
1225  }
1226  } else {
1227  dst->frame_number = -1; /* sanity marker */
1228  }
1229 }
1230 
1231 /**
1232  * Store coded frame information in format suitable for return from encode2().
1233  *
1234  * Write information from @a cx_frame to @a pkt
1235  * @return packet data size on success
1236  * @return a negative AVERROR on error
1237  */
1238 static int storeframe(AVCodecContext *avctx, struct FrameListData *cx_frame,
1239  struct FrameListData *alpha_cx_frame, AVPacket *pkt)
1240 {
1241  VPxContext *ctx = avctx->priv_data;
1242  int ret = ff_get_encode_buffer(avctx, pkt, cx_frame->sz, 0);
1243  uint8_t *side_data;
1244  int pict_type;
1245  int quality;
1246 
1247  if (ret < 0)
1248  return ret;
1249 
1250  memcpy(pkt->data, cx_frame->buf, pkt->size);
1251  pkt->pts = pkt->dts = cx_frame->pts;
1252 
1253  if (!!(cx_frame->flags & VPX_FRAME_IS_KEY)) {
1254  pict_type = AV_PICTURE_TYPE_I;
1256  } else {
1257  pict_type = AV_PICTURE_TYPE_P;
1258  }
1259 
1260  ret = vpx_codec_control(&ctx->encoder, VP8E_GET_LAST_QUANTIZER_64, &quality);
1261  if (ret != VPX_CODEC_OK)
1262  quality = 0;
1264  cx_frame->have_sse ? 3 : 0, pict_type);
1265 
1266  if (cx_frame->have_sse) {
1267  /* Beware of the Y/U/V/all order! */
1268  for (int i = 0; i < 3; ++i)
1269  avctx->error[i] += cx_frame->sse[i + 1];
1270  cx_frame->have_sse = 0;
1271  }
1272  if (alpha_cx_frame) {
1273  side_data = av_packet_new_side_data(pkt,
1275  alpha_cx_frame->sz + 8);
1276  if (!side_data) {
1278  return AVERROR(ENOMEM);
1279  }
1280  AV_WB64(side_data, 1);
1281  memcpy(side_data + 8, alpha_cx_frame->buf, alpha_cx_frame->sz);
1282  }
1283  if (cx_frame->frame_number != -1) {
1284  if (ctx->hdr10_plus_fifo) {
1285  int err = copy_hdr10_plus_to_pkt(ctx->hdr10_plus_fifo, pkt);
1286  if (err < 0)
1287  return err;
1288  }
1289  }
1290 
1291  return pkt->size;
1292 }
1293 
1294 /**
1295  * Queue multiple output frames from the encoder, returning the front-most.
1296  * In cases where vpx_codec_get_cx_data() returns more than 1 frame append
1297  * the frame queue. Return the head frame if available.
1298  * @return Stored frame size
1299  * @return AVERROR(EINVAL) on output size error
1300  * @return AVERROR(ENOMEM) on coded frame queue data allocation error
1301  */
1302 static int queue_frames(AVCodecContext *avctx, struct vpx_codec_ctx *encoder,
1303  struct FrameListData **frame_list, AVPacket *pkt_out)
1304 {
1305  VPxContext *ctx = avctx->priv_data;
1306  const struct vpx_codec_cx_pkt *pkt;
1307  const void *iter = NULL;
1308  int size = 0;
1309 
1310  if (!ctx->is_alpha && *frame_list) {
1311  struct FrameListData *cx_frame = *frame_list;
1312  /* return the leading frame if we've already begun queueing */
1313  size = storeframe(avctx, cx_frame, NULL, pkt_out);
1314  if (size < 0)
1315  return size;
1316  *frame_list = cx_frame->next;
1317  free_coded_frame(cx_frame);
1318  }
1319 
1320  /* consume all available output from the encoder before returning. buffers
1321  are only good through the next vpx_codec call */
1322  while (pkt = vpx_codec_get_cx_data(encoder, &iter)) {
1323  switch (pkt->kind) {
1324  case VPX_CODEC_CX_FRAME_PKT:
1325  if (!ctx->is_alpha && !size) {
1326  struct FrameListData cx_frame;
1327 
1328  /* avoid storing the frame when the list is empty and we haven't yet
1329  provided a frame for output */
1330  av_assert0(!ctx->coded_frame_list);
1331  cx_pktcpy(&cx_frame, pkt, ctx);
1332  size = storeframe(avctx, &cx_frame, NULL, pkt_out);
1333  if (size < 0)
1334  return size;
1335  } else {
1336  struct FrameListData *cx_frame = av_malloc(sizeof(*cx_frame));
1337 
1338  if (!cx_frame) {
1339  av_log(avctx, AV_LOG_ERROR,
1340  "Frame queue element alloc failed\n");
1341  return AVERROR(ENOMEM);
1342  }
1343  cx_pktcpy(cx_frame, pkt, ctx);
1344  cx_frame->buf = av_malloc(cx_frame->sz);
1345 
1346  if (!cx_frame->buf) {
1347  av_log(avctx, AV_LOG_ERROR,
1348  "Data buffer alloc (%"SIZE_SPECIFIER" bytes) failed\n",
1349  cx_frame->sz);
1350  av_freep(&cx_frame);
1351  return AVERROR(ENOMEM);
1352  }
1353  memcpy(cx_frame->buf, pkt->data.frame.buf, pkt->data.frame.sz);
1354  coded_frame_add(frame_list, cx_frame);
1355  }
1356  break;
1357  case VPX_CODEC_STATS_PKT: {
1358  struct vpx_fixed_buf *stats = &ctx->twopass_stats;
1359  int err;
1360  if (!pkt_out)
1361  break;
1362  if ((err = av_reallocp(&stats->buf,
1363  stats->sz +
1364  pkt->data.twopass_stats.sz)) < 0) {
1365  stats->sz = 0;
1366  av_log(avctx, AV_LOG_ERROR, "Stat buffer realloc failed\n");
1367  return err;
1368  }
1369  memcpy((uint8_t*)stats->buf + stats->sz,
1370  pkt->data.twopass_stats.buf, pkt->data.twopass_stats.sz);
1371  stats->sz += pkt->data.twopass_stats.sz;
1372  break;
1373  }
1374  case VPX_CODEC_PSNR_PKT:
1375  if (!pkt_out)
1376  break;
1377  av_assert0(!ctx->have_sse);
1378  ctx->sse[0] = pkt->data.psnr.sse[0];
1379  ctx->sse[1] = pkt->data.psnr.sse[1];
1380  ctx->sse[2] = pkt->data.psnr.sse[2];
1381  ctx->sse[3] = pkt->data.psnr.sse[3];
1382  ctx->have_sse = 1;
1383  break;
1384  case VPX_CODEC_CUSTOM_PKT:
1385  //ignore unsupported/unrecognized packet types
1386  break;
1387  }
1388  }
1389 
1390  return size;
1391 }
1392 
1393 static int set_roi_map(AVCodecContext *avctx, const AVFrameSideData *sd, int frame_width, int frame_height,
1394  vpx_roi_map_t *roi_map, int block_size, int segment_cnt)
1395 {
1396  /**
1397  * range of vpx_roi_map_t.delta_q[i] is [-63, 63]
1398  */
1399 #define MAX_DELTA_Q 63
1400 
1401  const AVRegionOfInterest *roi = NULL;
1402  int nb_rois;
1403  uint32_t self_size;
1404  int segment_id;
1405 
1406  /* record the mapping from delta_q to "segment id + 1" in segment_mapping[].
1407  * the range of delta_q is [-MAX_DELTA_Q, MAX_DELTA_Q],
1408  * and its corresponding array index is [0, 2 * MAX_DELTA_Q],
1409  * and so the length of the mapping array is 2 * MAX_DELTA_Q + 1.
1410  * "segment id + 1", so we can say there's no mapping if the value of array element is zero.
1411  */
1412  int segment_mapping[2 * MAX_DELTA_Q + 1] = { 0 };
1413 
1414  memset(roi_map, 0, sizeof(*roi_map));
1415 
1416  /* segment id 0 in roi_map is reserved for the areas not covered by AVRegionOfInterest.
1417  * segment id 0 in roi_map is also for the areas with AVRegionOfInterest.qoffset near 0.
1418  * (delta_q of segment id 0 is 0).
1419  */
1420  segment_mapping[MAX_DELTA_Q] = 1;
1421  segment_id = 1;
1422 
1423  roi = (const AVRegionOfInterest*)sd->data;
1424  self_size = roi->self_size;
1425  if (!self_size || sd->size % self_size) {
1426  av_log(avctx, AV_LOG_ERROR, "Invalid AVRegionOfInterest.self_size.\n");
1427  return AVERROR(EINVAL);
1428  }
1429  nb_rois = sd->size / self_size;
1430 
1431  /* This list must be iterated from zero because regions are
1432  * defined in order of decreasing importance. So discard less
1433  * important areas if they exceed the segment count.
1434  */
1435  for (int i = 0; i < nb_rois; i++) {
1436  int delta_q;
1437  int mapping_index;
1438 
1439  roi = (const AVRegionOfInterest*)(sd->data + self_size * i);
1440  if (!roi->qoffset.den) {
1441  av_log(avctx, AV_LOG_ERROR, "AVRegionOfInterest.qoffset.den must not be zero.\n");
1442  return AVERROR(EINVAL);
1443  }
1444 
1445  delta_q = (int)(roi->qoffset.num * 1.0f / roi->qoffset.den * MAX_DELTA_Q);
1447 
1448  mapping_index = delta_q + MAX_DELTA_Q;
1449  if (!segment_mapping[mapping_index]) {
1450  if (segment_id == segment_cnt) {
1451  av_log(avctx, AV_LOG_WARNING,
1452  "ROI only supports %d segments (and segment 0 is reserved for non-ROIs), skipping the left ones.\n",
1453  segment_cnt);
1454  break;
1455  }
1456 
1457  segment_mapping[mapping_index] = segment_id + 1;
1458  roi_map->delta_q[segment_id] = delta_q;
1459  segment_id++;
1460  }
1461  }
1462 
1463  roi_map->rows = (frame_height + block_size - 1) / block_size;
1464  roi_map->cols = (frame_width + block_size - 1) / block_size;
1465  roi_map->roi_map = av_calloc(roi_map->rows * roi_map->cols, sizeof(*roi_map->roi_map));
1466  if (!roi_map->roi_map) {
1467  av_log(avctx, AV_LOG_ERROR, "roi_map alloc failed.\n");
1468  return AVERROR(ENOMEM);
1469  }
1470 
1471  /* This list must be iterated in reverse, so for the case that
1472  * two regions are overlapping, the more important area takes effect.
1473  */
1474  for (int i = nb_rois - 1; i >= 0; i--) {
1475  int delta_q;
1476  int mapping_value;
1477  int starty, endy, startx, endx;
1478 
1479  roi = (const AVRegionOfInterest*)(sd->data + self_size * i);
1480 
1481  starty = av_clip(roi->top / block_size, 0, roi_map->rows);
1482  endy = av_clip((roi->bottom + block_size - 1) / block_size, 0, roi_map->rows);
1483  startx = av_clip(roi->left / block_size, 0, roi_map->cols);
1484  endx = av_clip((roi->right + block_size - 1) / block_size, 0, roi_map->cols);
1485 
1486  delta_q = (int)(roi->qoffset.num * 1.0f / roi->qoffset.den * MAX_DELTA_Q);
1488 
1489  mapping_value = segment_mapping[delta_q + MAX_DELTA_Q];
1490  if (mapping_value) {
1491  for (int y = starty; y < endy; y++)
1492  for (int x = startx; x < endx; x++)
1493  roi_map->roi_map[x + y * roi_map->cols] = mapping_value - 1;
1494  }
1495  }
1496 
1497  return 0;
1498 }
1499 
1500 static int vp9_encode_set_roi(AVCodecContext *avctx, int frame_width, int frame_height, const AVFrameSideData *sd)
1501 {
1502  VPxContext *ctx = avctx->priv_data;
1503 
1504 #ifdef VPX_CTRL_VP9E_SET_ROI_MAP
1505  int version = vpx_codec_version();
1506  int major = VPX_VERSION_MAJOR(version);
1507  int minor = VPX_VERSION_MINOR(version);
1508  int patch = VPX_VERSION_PATCH(version);
1509 
1510  if (major > 1 || (major == 1 && minor > 8) || (major == 1 && minor == 8 && patch >= 1)) {
1511  vpx_roi_map_t roi_map;
1512  const int segment_cnt = 8;
1513  const int block_size = 8;
1514  int ret;
1515 
1516  if (ctx->aq_mode > 0 || ctx->cpu_used < 5 || ctx->deadline != VPX_DL_REALTIME) {
1517  if (!ctx->roi_warned) {
1518  ctx->roi_warned = 1;
1519  av_log(avctx, AV_LOG_WARNING, "ROI is only enabled when aq_mode is 0, cpu_used >= 5 "
1520  "and deadline is REALTIME, so skipping ROI.\n");
1521  return AVERROR(EINVAL);
1522  }
1523  }
1524 
1525  ret = set_roi_map(avctx, sd, frame_width, frame_height, &roi_map, block_size, segment_cnt);
1526  if (ret) {
1527  log_encoder_error(avctx, "Failed to set_roi_map.\n");
1528  return ret;
1529  }
1530 
1531  memset(roi_map.ref_frame, -1, sizeof(roi_map.ref_frame));
1532 
1533  if (vpx_codec_control(&ctx->encoder, VP9E_SET_ROI_MAP, &roi_map)) {
1534  log_encoder_error(avctx, "Failed to set VP9E_SET_ROI_MAP codec control.\n");
1536  }
1537  av_freep(&roi_map.roi_map);
1538  return ret;
1539  }
1540 #endif
1541 
1542  if (!ctx->roi_warned) {
1543  ctx->roi_warned = 1;
1544  av_log(avctx, AV_LOG_WARNING, "ROI is not supported, please upgrade libvpx to version >= 1.8.1. "
1545  "You may need to rebuild ffmpeg.\n");
1546  }
1547  return 0;
1548 }
1549 
1550 static int vp8_encode_set_roi(AVCodecContext *avctx, int frame_width, int frame_height, const AVFrameSideData *sd)
1551 {
1552  vpx_roi_map_t roi_map;
1553  const int segment_cnt = 4;
1554  const int block_size = 16;
1555  VPxContext *ctx = avctx->priv_data;
1556 
1557  int ret = set_roi_map(avctx, sd, frame_width, frame_height, &roi_map, block_size, segment_cnt);
1558  if (ret) {
1559  log_encoder_error(avctx, "Failed to set_roi_map.\n");
1560  return ret;
1561  }
1562 
1563  if (vpx_codec_control(&ctx->encoder, VP8E_SET_ROI_MAP, &roi_map)) {
1564  log_encoder_error(avctx, "Failed to set VP8E_SET_ROI_MAP codec control.\n");
1566  }
1567 
1568  av_freep(&roi_map.roi_map);
1569  return ret;
1570 }
1571 
1572 static int realloc_alpha_uv(AVCodecContext *avctx, int width, int height)
1573 {
1574  VPxContext *ctx = avctx->priv_data;
1575  struct vpx_image *rawimg_alpha = &ctx->rawimg_alpha;
1576  unsigned char **planes = rawimg_alpha->planes;
1577  int *stride = rawimg_alpha->stride;
1578 
1579  if (!planes[VPX_PLANE_U] ||
1580  !planes[VPX_PLANE_V] ||
1581  width != (int)rawimg_alpha->d_w ||
1582  height != (int)rawimg_alpha->d_h) {
1583  av_freep(&planes[VPX_PLANE_U]);
1584  av_freep(&planes[VPX_PLANE_V]);
1585 
1586  vpx_img_wrap(rawimg_alpha, VPX_IMG_FMT_I420, width, height, 1,
1587  (unsigned char*)1);
1588  planes[VPX_PLANE_U] = av_malloc_array(stride[VPX_PLANE_U], height);
1589  planes[VPX_PLANE_V] = av_malloc_array(stride[VPX_PLANE_V], height);
1590  if (!planes[VPX_PLANE_U] || !planes[VPX_PLANE_V])
1591  return AVERROR(ENOMEM);
1592 
1593  memset(planes[VPX_PLANE_U], 0x80, stride[VPX_PLANE_U] * height);
1594  memset(planes[VPX_PLANE_V], 0x80, stride[VPX_PLANE_V] * height);
1595  }
1596 
1597  return 0;
1598 }
1599 
1601  const AVFrame *frame, int *got_packet)
1602 {
1603  VPxContext *ctx = avctx->priv_data;
1604  struct vpx_image *rawimg = NULL;
1605  struct vpx_image *rawimg_alpha = NULL;
1606  int64_t timestamp = 0;
1607  int res, coded_size;
1608  vpx_enc_frame_flags_t flags = 0;
1609  const struct vpx_codec_enc_cfg *enccfg = ctx->encoder.config.enc;
1610  vpx_svc_layer_id_t layer_id;
1611  int layer_id_valid = 0;
1612 
1613  if (avctx->qmax >= 0 && enccfg->rc_max_quantizer != avctx->qmax) {
1614  struct vpx_codec_enc_cfg cfg = *enccfg;
1615  cfg.rc_max_quantizer = avctx->qmax;
1616  res = vpx_codec_enc_config_set(&ctx->encoder, &cfg);
1617  if (res != VPX_CODEC_OK) {
1618  log_encoder_error(avctx, "Error reconfiguring encoder");
1619  return AVERROR_INVALIDDATA;
1620  }
1621  }
1622 
1623  if (frame) {
1625  rawimg = &ctx->rawimg;
1626  rawimg->planes[VPX_PLANE_Y] = frame->data[0];
1627  rawimg->planes[VPX_PLANE_U] = frame->data[1];
1628  rawimg->planes[VPX_PLANE_V] = frame->data[2];
1629  rawimg->stride[VPX_PLANE_Y] = frame->linesize[0];
1630  rawimg->stride[VPX_PLANE_U] = frame->linesize[1];
1631  rawimg->stride[VPX_PLANE_V] = frame->linesize[2];
1632  if (ctx->is_alpha) {
1633  rawimg_alpha = &ctx->rawimg_alpha;
1634  res = realloc_alpha_uv(avctx, frame->width, frame->height);
1635  if (res < 0)
1636  return res;
1637  rawimg_alpha->planes[VPX_PLANE_Y] = frame->data[3];
1638  rawimg_alpha->stride[VPX_PLANE_Y] = frame->linesize[3];
1639  }
1640  timestamp = frame->pts;
1641 #if VPX_IMAGE_ABI_VERSION >= 4
1642  switch (frame->color_range) {
1643  case AVCOL_RANGE_MPEG:
1644  rawimg->range = VPX_CR_STUDIO_RANGE;
1645  break;
1646  case AVCOL_RANGE_JPEG:
1647  rawimg->range = VPX_CR_FULL_RANGE;
1648  break;
1649  }
1650 #endif
1651  if (frame->pict_type == AV_PICTURE_TYPE_I)
1652  flags |= VPX_EFLAG_FORCE_KF;
1653  if (frame->metadata) {
1654  AVDictionaryEntry* en = av_dict_get(frame->metadata, "vp8-flags", NULL, 0);
1655  if (en) {
1656  flags |= strtoul(en->value, NULL, 10);
1657  }
1658 
1659  memset(&layer_id, 0, sizeof(layer_id));
1660 
1661  en = av_dict_get(frame->metadata, "temporal_id", NULL, 0);
1662  if (en) {
1663  layer_id.temporal_layer_id = strtoul(en->value, NULL, 10);
1664 #ifdef VPX_CTRL_VP9E_SET_MAX_INTER_BITRATE_PCT
1665  layer_id.temporal_layer_id_per_spatial[0] = layer_id.temporal_layer_id;
1666 #endif
1667  layer_id_valid = 1;
1668  }
1669 #if CONFIG_LIBVPX_VP9_ENCODER && defined(VPX_CTRL_VP9E_SET_MAX_INTER_BITRATE_PCT)
1670  en = av_dict_get(frame->metadata, "ref-frame-config", NULL, 0);
1671 
1672  if (en) {
1673  if (avctx->codec_id == AV_CODEC_ID_VP9) {
1674  int ret = vpx_parse_ref_frame_config(&ctx->ref_frame_config,
1675  enccfg->ss_number_layers, en->value);
1676  if (ret < 0) {
1677  av_log(avctx, AV_LOG_WARNING,
1678  "Error parsing ref_frame_config option %s.\n", en->value);
1679  return ret;
1680  }
1681 
1682  codecctl_intp(avctx, VP9E_SET_SVC_REF_FRAME_CONFIG, (int *)&ctx->ref_frame_config);
1683  } else {
1684  av_log(avctx, AV_LOG_WARNING,
1685  "Ignoring ref-frame-config for a non-VP9 codec\n");
1686  }
1687  }
1688 #endif
1689  }
1690 
1691  if (sd) {
1692  if (avctx->codec_id == AV_CODEC_ID_VP8) {
1693  vp8_encode_set_roi(avctx, frame->width, frame->height, sd);
1694  } else {
1695  vp9_encode_set_roi(avctx, frame->width, frame->height, sd);
1696  }
1697  }
1698 
1699  if (ctx->hdr10_plus_fifo) {
1700  AVFrameSideData *hdr10_plus_metadata;
1701  // Add HDR10+ metadata to queue.
1703  if (hdr10_plus_metadata) {
1704  int err;
1705  struct FrameHDR10Plus data;
1706  data.pts = frame->pts;
1707  data.hdr10_plus = av_buffer_ref(hdr10_plus_metadata->buf);
1708  if (!data.hdr10_plus)
1709  return AVERROR(ENOMEM);
1710  err = av_fifo_write(ctx->hdr10_plus_fifo, &data, 1);
1711  if (err < 0) {
1712  av_buffer_unref(&data.hdr10_plus);
1713  return err;
1714  }
1715  }
1716  }
1717  }
1718 
1719  // this is for encoding with preset temporal layering patterns defined in
1720  // set_temporal_layer_pattern function.
1721  if (enccfg->ts_number_layers > 1 && ctx->ts_layer_flags) {
1722  if (flags & VPX_EFLAG_FORCE_KF) {
1723  // keyframe, reset temporal layering.
1724  ctx->current_temporal_idx = 0;
1725  flags = VPX_EFLAG_FORCE_KF;
1726  } else {
1727  flags = 0;
1728  }
1729 
1730  /* get the flags from the temporal layer configuration. */
1731  flags |= ctx->ts_layer_flags[ctx->current_temporal_idx];
1732 
1733  memset(&layer_id, 0, sizeof(layer_id));
1734 #if VPX_ENCODER_ABI_VERSION >= 12
1735  layer_id.spatial_layer_id = 0;
1736 #endif
1737  layer_id.temporal_layer_id = enccfg->ts_layer_id[ctx->current_temporal_idx];
1738 #ifdef VPX_CTRL_VP9E_SET_MAX_INTER_BITRATE_PCT
1739  layer_id.temporal_layer_id_per_spatial[0] = layer_id.temporal_layer_id;
1740 #endif
1741  layer_id_valid = 1;
1742  }
1743 
1744  if (layer_id_valid) {
1745  if (avctx->codec_id == AV_CODEC_ID_VP8) {
1746  codecctl_int(avctx, VP8E_SET_TEMPORAL_LAYER_ID, layer_id.temporal_layer_id);
1747  }
1748 #if CONFIG_LIBVPX_VP9_ENCODER && VPX_ENCODER_ABI_VERSION >= 12
1749  else if (avctx->codec_id == AV_CODEC_ID_VP9) {
1750  codecctl_intp(avctx, VP9E_SET_SVC_LAYER_ID, (int *)&layer_id);
1751  }
1752 #endif
1753  }
1754 
1755  res = vpx_codec_encode(&ctx->encoder, rawimg, timestamp,
1756  avctx->ticks_per_frame, flags, ctx->deadline);
1757  if (res != VPX_CODEC_OK) {
1758  log_encoder_error(avctx, "Error encoding frame");
1759  return AVERROR_INVALIDDATA;
1760  }
1761 
1762  if (ctx->is_alpha) {
1763  res = vpx_codec_encode(&ctx->encoder_alpha, rawimg_alpha, timestamp,
1764  avctx->ticks_per_frame, flags, ctx->deadline);
1765  if (res != VPX_CODEC_OK) {
1766  log_encoder_error(avctx, "Error encoding alpha frame");
1767  return AVERROR_INVALIDDATA;
1768  }
1769  }
1770 
1771  coded_size = queue_frames(avctx, &ctx->encoder, &ctx->coded_frame_list, pkt);
1772  if (ctx->is_alpha) {
1773  queue_frames(avctx, &ctx->encoder_alpha, &ctx->alpha_coded_frame_list, NULL);
1774 
1775  if (ctx->coded_frame_list && ctx->alpha_coded_frame_list) {
1776  struct FrameListData *cx_frame = ctx->coded_frame_list;
1777  struct FrameListData *alpha_cx_frame = ctx->alpha_coded_frame_list;
1778  av_assert0(!coded_size);
1779  /* return the leading frame if we've already begun queueing */
1780  coded_size = storeframe(avctx, cx_frame, alpha_cx_frame, pkt);
1781  if (coded_size < 0)
1782  return coded_size;
1783  ctx->coded_frame_list = cx_frame->next;
1784  ctx->alpha_coded_frame_list = alpha_cx_frame->next;
1785  free_coded_frame(cx_frame);
1786  free_coded_frame(alpha_cx_frame);
1787  }
1788  }
1789 
1790  if (!frame && avctx->flags & AV_CODEC_FLAG_PASS1) {
1791  unsigned int b64_size = AV_BASE64_SIZE(ctx->twopass_stats.sz);
1792 
1793  avctx->stats_out = av_malloc(b64_size);
1794  if (!avctx->stats_out) {
1795  av_log(avctx, AV_LOG_ERROR, "Stat buffer alloc (%d bytes) failed\n",
1796  b64_size);
1797  return AVERROR(ENOMEM);
1798  }
1799  av_base64_encode(avctx->stats_out, b64_size, ctx->twopass_stats.buf,
1800  ctx->twopass_stats.sz);
1801  } else if (enccfg->ts_number_layers > 1 && ctx->ts_layer_flags) {
1802  ctx->current_temporal_idx = (ctx->current_temporal_idx + 1) % enccfg->ts_periodicity;
1803  }
1804 
1805  *got_packet = !!coded_size;
1806  return 0;
1807 }
1808 
1809 #define OFFSET(x) offsetof(VPxContext, x)
1810 #define VE AV_OPT_FLAG_VIDEO_PARAM | AV_OPT_FLAG_ENCODING_PARAM
1811 
1812 #define COMMON_OPTIONS \
1813  { "lag-in-frames", "Number of frames to look ahead for " \
1814  "alternate reference frame selection", OFFSET(lag_in_frames), AV_OPT_TYPE_INT, {.i64 = -1}, -1, INT_MAX, VE}, \
1815  { "arnr-maxframes", "altref noise reduction max frame count", OFFSET(arnr_max_frames), AV_OPT_TYPE_INT, {.i64 = -1}, -1, INT_MAX, VE}, \
1816  { "arnr-strength", "altref noise reduction filter strength", OFFSET(arnr_strength), AV_OPT_TYPE_INT, {.i64 = -1}, -1, INT_MAX, VE}, \
1817  { "arnr-type", "altref noise reduction filter type", OFFSET(arnr_type), AV_OPT_TYPE_INT, {.i64 = -1}, -1, INT_MAX, VE, "arnr_type"}, \
1818  { "backward", NULL, 0, AV_OPT_TYPE_CONST, {.i64 = 1}, 0, 0, VE, "arnr_type" }, \
1819  { "forward", NULL, 0, AV_OPT_TYPE_CONST, {.i64 = 2}, 0, 0, VE, "arnr_type" }, \
1820  { "centered", NULL, 0, AV_OPT_TYPE_CONST, {.i64 = 3}, 0, 0, VE, "arnr_type" }, \
1821  { "tune", "Tune the encoding to a specific scenario", OFFSET(tune), AV_OPT_TYPE_INT, {.i64 = -1}, -1, INT_MAX, VE, "tune"}, \
1822  { "psnr", NULL, 0, AV_OPT_TYPE_CONST, {.i64 = VP8_TUNE_PSNR}, 0, 0, VE, "tune"}, \
1823  { "ssim", NULL, 0, AV_OPT_TYPE_CONST, {.i64 = VP8_TUNE_SSIM}, 0, 0, VE, "tune"}, \
1824  { "deadline", "Time to spend encoding, in microseconds.", OFFSET(deadline), AV_OPT_TYPE_INT, {.i64 = VPX_DL_GOOD_QUALITY}, INT_MIN, INT_MAX, VE, "quality"}, \
1825  { "best", NULL, 0, AV_OPT_TYPE_CONST, {.i64 = VPX_DL_BEST_QUALITY}, 0, 0, VE, "quality"}, \
1826  { "good", NULL, 0, AV_OPT_TYPE_CONST, {.i64 = VPX_DL_GOOD_QUALITY}, 0, 0, VE, "quality"}, \
1827  { "realtime", NULL, 0, AV_OPT_TYPE_CONST, {.i64 = VPX_DL_REALTIME}, 0, 0, VE, "quality"}, \
1828  { "error-resilient", "Error resilience configuration", OFFSET(error_resilient), AV_OPT_TYPE_FLAGS, {.i64 = 0}, INT_MIN, INT_MAX, VE, "er"}, \
1829  { "max-intra-rate", "Maximum I-frame bitrate (pct) 0=unlimited", OFFSET(max_intra_rate), AV_OPT_TYPE_INT, {.i64 = -1}, -1, INT_MAX, VE}, \
1830  { "default", "Improve resiliency against losses of whole frames", 0, AV_OPT_TYPE_CONST, {.i64 = VPX_ERROR_RESILIENT_DEFAULT}, 0, 0, VE, "er"}, \
1831  { "partitions", "The frame partitions are independently decodable " \
1832  "by the bool decoder, meaning that partitions can be decoded even " \
1833  "though earlier partitions have been lost. Note that intra prediction" \
1834  " is still done over the partition boundary.", 0, AV_OPT_TYPE_CONST, {.i64 = VPX_ERROR_RESILIENT_PARTITIONS}, 0, 0, VE, "er"}, \
1835  { "crf", "Select the quality for constant quality mode", offsetof(VPxContext, crf), AV_OPT_TYPE_INT, {.i64 = -1}, -1, 63, VE }, \
1836  { "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 }, \
1837  { "drop-threshold", "Frame drop threshold", offsetof(VPxContext, drop_threshold), AV_OPT_TYPE_INT, {.i64 = 0 }, INT_MIN, INT_MAX, VE }, \
1838  { "noise-sensitivity", "Noise sensitivity", OFFSET(noise_sensitivity), AV_OPT_TYPE_INT, {.i64 = 0 }, 0, 4, VE}, \
1839  { "undershoot-pct", "Datarate undershoot (min) target (%)", OFFSET(rc_undershoot_pct), AV_OPT_TYPE_INT, { .i64 = -1 }, -1, 100, VE }, \
1840  { "overshoot-pct", "Datarate overshoot (max) target (%)", OFFSET(rc_overshoot_pct), AV_OPT_TYPE_INT, { .i64 = -1 }, -1, 1000, VE }, \
1841  { "ts-parameters", "Temporal scaling configuration using a :-separated list of key=value parameters", OFFSET(vpx_ts_parameters), AV_OPT_TYPE_DICT, {.str=NULL}, 0, 0, VE}, \
1842 
1843 #define LEGACY_OPTIONS \
1844  {"speed", "", offsetof(VPxContext, cpu_used), AV_OPT_TYPE_INT, {.i64 = 1}, -16, 16, VE}, \
1845  {"quality", "", offsetof(VPxContext, deadline), AV_OPT_TYPE_INT, {.i64 = VPX_DL_GOOD_QUALITY}, INT_MIN, INT_MAX, VE, "quality"}, \
1846  {"vp8flags", "", offsetof(VPxContext, flags), AV_OPT_TYPE_FLAGS, {.i64 = 0}, 0, UINT_MAX, VE, "flags"}, \
1847  {"error_resilient", "enable error resilience", 0, AV_OPT_TYPE_CONST, {.i64 = VP8F_ERROR_RESILIENT}, INT_MIN, INT_MAX, VE, "flags"}, \
1848  {"altref", "enable use of alternate reference frames (VP8/2-pass only)", 0, AV_OPT_TYPE_CONST, {.i64 = VP8F_AUTO_ALT_REF}, INT_MIN, INT_MAX, VE, "flags"}, \
1849  {"arnr_max_frames", "altref noise reduction max frame count", offsetof(VPxContext, arnr_max_frames), AV_OPT_TYPE_INT, {.i64 = 0}, 0, 15, VE}, \
1850  {"arnr_strength", "altref noise reduction filter strength", offsetof(VPxContext, arnr_strength), AV_OPT_TYPE_INT, {.i64 = 3}, 0, 6, VE}, \
1851  {"arnr_type", "altref noise reduction filter type", offsetof(VPxContext, arnr_type), AV_OPT_TYPE_INT, {.i64 = 3}, 1, 3, VE}, \
1852  {"rc_lookahead", "Number of frames to look ahead for alternate reference frame selection", offsetof(VPxContext, lag_in_frames), AV_OPT_TYPE_INT, {.i64 = 25}, 0, 25, VE}, \
1853  {"sharpness", "Increase sharpness at the expense of lower PSNR", offsetof(VPxContext, sharpness), AV_OPT_TYPE_INT, {.i64 = -1}, -1, 7, VE},
1854 
1855 #if CONFIG_LIBVPX_VP8_ENCODER
1856 static const AVOption vp8_options[] = {
1858  { "auto-alt-ref", "Enable use of alternate reference "
1859  "frames (2-pass only)", OFFSET(auto_alt_ref), AV_OPT_TYPE_INT, {.i64 = -1}, -1, 2, VE},
1860  { "cpu-used", "Quality/Speed ratio modifier", OFFSET(cpu_used), AV_OPT_TYPE_INT, {.i64 = 1}, -16, 16, VE},
1862  { NULL }
1863 };
1864 #endif
1865 
1866 #if CONFIG_LIBVPX_VP9_ENCODER
1867 static const AVOption vp9_options[] = {
1869  { "auto-alt-ref", "Enable use of alternate reference "
1870  "frames (2-pass only)", OFFSET(auto_alt_ref), AV_OPT_TYPE_INT, {.i64 = -1}, -1, 6, VE},
1871  { "cpu-used", "Quality/Speed ratio modifier", OFFSET(cpu_used), AV_OPT_TYPE_INT, {.i64 = 1}, -8, 8, VE},
1872  { "lossless", "Lossless mode", OFFSET(lossless), AV_OPT_TYPE_INT, {.i64 = -1}, -1, 1, VE},
1873  { "tile-columns", "Number of tile columns to use, log2", OFFSET(tile_columns), AV_OPT_TYPE_INT, {.i64 = -1}, -1, 6, VE},
1874  { "tile-rows", "Number of tile rows to use, log2", OFFSET(tile_rows), AV_OPT_TYPE_INT, {.i64 = -1}, -1, 2, VE},
1875  { "frame-parallel", "Enable frame parallel decodability features", OFFSET(frame_parallel), AV_OPT_TYPE_BOOL,{.i64 = -1}, -1, 1, VE},
1876 #if VPX_ENCODER_ABI_VERSION >= 12
1877  { "aq-mode", "adaptive quantization mode", OFFSET(aq_mode), AV_OPT_TYPE_INT, {.i64 = -1}, -1, 4, VE, "aq_mode"},
1878 #else
1879  { "aq-mode", "adaptive quantization mode", OFFSET(aq_mode), AV_OPT_TYPE_INT, {.i64 = -1}, -1, 3, VE, "aq_mode"},
1880 #endif
1881  { "none", "Aq not used", 0, AV_OPT_TYPE_CONST, {.i64 = 0}, 0, 0, VE, "aq_mode" },
1882  { "variance", "Variance based Aq", 0, AV_OPT_TYPE_CONST, {.i64 = 1}, 0, 0, VE, "aq_mode" },
1883  { "complexity", "Complexity based Aq", 0, AV_OPT_TYPE_CONST, {.i64 = 2}, 0, 0, VE, "aq_mode" },
1884  { "cyclic", "Cyclic Refresh Aq", 0, AV_OPT_TYPE_CONST, {.i64 = 3}, 0, 0, VE, "aq_mode" },
1885 #if VPX_ENCODER_ABI_VERSION >= 12
1886  { "equator360", "360 video Aq", 0, AV_OPT_TYPE_CONST, {.i64 = 4}, 0, 0, VE, "aq_mode" },
1887  {"level", "Specify level", OFFSET(level), AV_OPT_TYPE_FLOAT, {.dbl=-1}, -1, 6.2, VE},
1888 #endif
1889 #ifdef VPX_CTRL_VP9E_SET_ROW_MT
1890  {"row-mt", "Row based multi-threading", OFFSET(row_mt), AV_OPT_TYPE_BOOL, {.i64 = -1}, -1, 1, VE},
1891 #endif
1892 #ifdef VPX_CTRL_VP9E_SET_TUNE_CONTENT
1893 #if VPX_ENCODER_ABI_VERSION >= 14
1894  { "tune-content", "Tune content type", OFFSET(tune_content), AV_OPT_TYPE_INT, {.i64 = -1}, -1, 2, VE, "tune_content" },
1895 #else
1896  { "tune-content", "Tune content type", OFFSET(tune_content), AV_OPT_TYPE_INT, {.i64 = -1}, -1, 1, VE, "tune_content" },
1897 #endif
1898  { "default", "Regular video content", 0, AV_OPT_TYPE_CONST, {.i64 = 0}, 0, 0, VE, "tune_content" },
1899  { "screen", "Screen capture content", 0, AV_OPT_TYPE_CONST, {.i64 = 1}, 0, 0, VE, "tune_content" },
1900 #if VPX_ENCODER_ABI_VERSION >= 14
1901  { "film", "Film content; improves grain retention", 0, AV_OPT_TYPE_CONST, {.i64 = 2}, 0, 0, VE, "tune_content" },
1902 #endif
1903 #endif
1904 #if VPX_ENCODER_ABI_VERSION >= 14
1905  { "corpus-complexity", "corpus vbr complexity midpoint", OFFSET(corpus_complexity), AV_OPT_TYPE_INT, {.i64 = -1}, -1, 10000, VE },
1906 #endif
1907 #ifdef VPX_CTRL_VP9E_SET_TPL
1908  { "enable-tpl", "Enable temporal dependency model", OFFSET(tpl_model), AV_OPT_TYPE_BOOL, {.i64 = -1}, -1, 1, VE },
1909 #endif
1911  { NULL }
1912 };
1913 #endif
1914 
1915 #undef COMMON_OPTIONS
1916 #undef LEGACY_OPTIONS
1917 
1918 static const FFCodecDefault defaults[] = {
1919  { "b", "0" },
1920  { "qmin", "-1" },
1921  { "qmax", "-1" },
1922  { "g", "-1" },
1923  { "keyint_min", "-1" },
1924  { NULL },
1925 };
1926 
1927 #if CONFIG_LIBVPX_VP8_ENCODER
1928 static av_cold int vp8_init(AVCodecContext *avctx)
1929 {
1930  return vpx_init(avctx, vpx_codec_vp8_cx());
1931 }
1932 
1933 static const AVClass class_vp8 = {
1934  .class_name = "libvpx-vp8 encoder",
1935  .item_name = av_default_item_name,
1936  .option = vp8_options,
1937  .version = LIBAVUTIL_VERSION_INT,
1938 };
1939 
1941  .p.name = "libvpx",
1942  .p.long_name = NULL_IF_CONFIG_SMALL("libvpx VP8"),
1943  .p.type = AVMEDIA_TYPE_VIDEO,
1944  .p.id = AV_CODEC_ID_VP8,
1945  .p.capabilities = AV_CODEC_CAP_DR1 | AV_CODEC_CAP_DELAY |
1947  .priv_data_size = sizeof(VPxContext),
1948  .init = vp8_init,
1950  .close = vpx_free,
1951  .caps_internal = FF_CODEC_CAP_AUTO_THREADS,
1952  .p.pix_fmts = (const enum AVPixelFormat[]){ AV_PIX_FMT_YUV420P, AV_PIX_FMT_YUVA420P, AV_PIX_FMT_NONE },
1953  .p.priv_class = &class_vp8,
1954  .defaults = defaults,
1955  .p.wrapper_name = "libvpx",
1956 };
1957 #endif /* CONFIG_LIBVPX_VP8_ENCODER */
1958 
1959 #if CONFIG_LIBVPX_VP9_ENCODER
1960 static av_cold int vp9_init(AVCodecContext *avctx)
1961 {
1962  return vpx_init(avctx, vpx_codec_vp9_cx());
1963 }
1964 
1965 static const AVClass class_vp9 = {
1966  .class_name = "libvpx-vp9 encoder",
1967  .item_name = av_default_item_name,
1968  .option = vp9_options,
1969  .version = LIBAVUTIL_VERSION_INT,
1970 };
1971 
1973  .p.name = "libvpx-vp9",
1974  .p.long_name = NULL_IF_CONFIG_SMALL("libvpx VP9"),
1975  .p.type = AVMEDIA_TYPE_VIDEO,
1976  .p.id = AV_CODEC_ID_VP9,
1977  .p.capabilities = AV_CODEC_CAP_DR1 | AV_CODEC_CAP_DELAY |
1979  .p.profiles = NULL_IF_CONFIG_SMALL(ff_vp9_profiles),
1980  .p.priv_class = &class_vp9,
1981  .p.wrapper_name = "libvpx",
1982  .priv_data_size = sizeof(VPxContext),
1983  .init = vp9_init,
1985  .close = vpx_free,
1986  .caps_internal = FF_CODEC_CAP_AUTO_THREADS,
1987  .defaults = defaults,
1988  .init_static_data = ff_vp9_init_static,
1989 };
1990 #endif /* CONFIG_LIBVPX_VP9_ENCODER */
error
static void error(const char *err)
Definition: target_bsf_fuzzer.c:31
av_packet_unref
void av_packet_unref(AVPacket *pkt)
Wipe the packet.
Definition: avpacket.c:422
AV_LOG_WARNING
#define AV_LOG_WARNING
Something somehow does not look correct.
Definition: log.h:186
AVPixelFormat
AVPixelFormat
Pixel format.
Definition: pixfmt.h:64
level
uint8_t level
Definition: svq3.c:206
FrameListData::pts
int64_t pts
time stamp to show frame (in timebase units)
Definition: libaomenc.c:54
av_clip
#define av_clip
Definition: common.h:95
AVCodecContext::keyint_min
int keyint_min
minimum GOP size
Definition: avcodec.h:931
vp9_init
static av_cold int vp9_init(AVFormatContext *ctx, int st_index, PayloadContext *data)
Definition: rtpdec_vp9.c:34
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:477
FrameHDR10Plus::pts
int64_t pts
Definition: libvpxenc.c:71
FrameHDR10Plus::hdr10_plus
AVBufferRef * hdr10_plus
Definition: libvpxenc.c:72
ff_vp9_init_static
av_cold void ff_vp9_init_static(FFCodec *codec)
Definition: libvpx.c:69
AVCodecContext::colorspace
enum AVColorSpace colorspace
YUV colorspace type.
Definition: avcodec.h:966
av_frame_get_side_data
AVFrameSideData * av_frame_get_side_data(const AVFrame *frame, enum AVFrameSideDataType type)
Definition: frame.c:684
av_get_token
char * av_get_token(const char **buf, const char *term)
Unescape the given string until a non escaped terminating char, and return the token corresponding to...
Definition: avstring.c:154
AVCodecContext::rc_min_rate
int64_t rc_min_rate
minimum bitrate
Definition: avcodec.h:1221
vp8_ts_parse_int_array
static void vp8_ts_parse_int_array(int *dest, char *value, size_t value_len, int max_entries)
Definition: libvpxenc.c:452
stats
static void stats(AVPacket *const *in, int n_in, unsigned *_max, unsigned *_sum)
Definition: vp9_superframe_bsf.c:34
av_pix_fmt_desc_get
const AVPixFmtDescriptor * av_pix_fmt_desc_get(enum AVPixelFormat pix_fmt)
Definition: pixdesc.c:2662
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:602
AVBufferRef::data
uint8_t * data
The data buffer.
Definition: buffer.h:90
VPxEncoderContext::rawimg_alpha
struct vpx_image rawimg_alpha
Definition: libvpxenc.c:80
ff_libvpx_vp9_encoder
FFCodec ff_libvpx_vp9_encoder
av_unused
#define av_unused
Definition: attributes.h:131
VPxEncoderContext
Definition: libvpxenc.c:75
VPxEncoderContext::is_alpha
uint8_t is_alpha
Definition: libvpxenc.c:81
VPxEncoderContext::rawimg
struct vpx_image rawimg
Definition: libvpxenc.c:78
AVFrame
This structure describes decoded (raw) audio or video data.
Definition: frame.h:325
pixdesc.h
AVFrameSideData::buf
AVBufferRef * buf
Definition: frame.h:236
AVCodecContext::color_trc
enum AVColorTransferCharacteristic color_trc
Color Transfer Characteristic.
Definition: avcodec.h:959
AVCOL_RANGE_JPEG
@ AVCOL_RANGE_JPEG
Full range content.
Definition: pixfmt.h:599
internal.h
AVPacket::data
uint8_t * data
Definition: packet.h:374
VP8F_ERROR_RESILIENT
#define VP8F_ERROR_RESILIENT
Enable measures appropriate for streaming over lossy links.
Definition: libvpxenc.c:96
AV_FIFO_FLAG_AUTO_GROW
#define AV_FIFO_FLAG_AUTO_GROW
Automatically resize the FIFO on writes, so that the data fits.
Definition: fifo.h:58
AVOption
AVOption.
Definition: opt.h:251
encode.h
set_pix_fmt
static int set_pix_fmt(AVCodecContext *avctx, struct aom_image *img)
Definition: libaomdec.c:88
data
const char data[16]
Definition: mxf.c:143
AV_PIX_FMT_YUV420P10
#define AV_PIX_FMT_YUV420P10
Definition: pixfmt.h:406
AV_DICT_IGNORE_SUFFIX
#define AV_DICT_IGNORE_SUFFIX
Return first entry in a dictionary whose first part corresponds to the search key,...
Definition: dict.h:68
FFCodec
Definition: codec_internal.h:112
AV_LOG_VERBOSE
#define AV_LOG_VERBOSE
Detailed information.
Definition: log.h:196
AVCOL_SPC_RGB
@ AVCOL_SPC_RGB
order of coefficients is actually GBR, also IEC 61966-2-1 (sRGB), YZX and ST 428-1
Definition: pixfmt.h:526
VP8F_AUTO_ALT_REF
#define VP8F_AUTO_ALT_REF
Enable automatic alternate reference frame generation.
Definition: libvpxenc.c:97
av_fifo_read
int av_fifo_read(AVFifo *f, void *buf, size_t nb_elems)
Read data from a FIFO.
Definition: fifo.c:240
VPxEncoderContext::have_sse
int have_sse
true if we have pending sse[]
Definition: libvpxenc.c:85
AV_PIX_FMT_YUV440P
@ AV_PIX_FMT_YUV440P
planar YUV 4:4:0 (1 Cr & Cb sample per 1x2 Y samples)
Definition: pixfmt.h:99
mathematics.h
AVDictionary
Definition: dict.c:30
AV_CODEC_FLAG_PSNR
#define AV_CODEC_FLAG_PSNR
error[?] variables will be set during encoding.
Definition: avcodec.h:253
av_buffer_ref
AVBufferRef * av_buffer_ref(const AVBufferRef *buf)
Create a new reference to an AVBuffer.
Definition: buffer.c:103
VPxEncoderContext::level
float level
Definition: libvpxenc.c:128
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:1032
AVCodecContext::qmax
int qmax
maximum quantizer
Definition: avcodec.h:1185
VPxEncoderContext::aq_mode
int aq_mode
Definition: libvpxenc.c:124
AV_PKT_FLAG_KEY
#define AV_PKT_FLAG_KEY
The packet contains a keyframe.
Definition: packet.h:429
quality
trying all byte sequences megabyte in length and selecting the best looking sequence will yield cases to try But a word about quality
Definition: rate_distortion.txt:12
AV_WB64
#define AV_WB64(p, v)
Definition: intreadwrite.h:433
av_malloc
#define av_malloc(s)
Definition: tableprint_vlc.h:30
init
static int init
Definition: av_tx.c:47
VPxEncoderContext::encoder_alpha
struct vpx_codec_ctx encoder_alpha
Definition: libvpxenc.c:79
AVCOL_SPC_BT470BG
@ AVCOL_SPC_BT470BG
also ITU-R BT601-6 625 / ITU-R BT1358 625 / ITU-R BT1700 625 PAL & SECAM / IEC 61966-2-4 xvYCC601
Definition: pixfmt.h:531
VPxEncoderContext::auto_alt_ref
int auto_alt_ref
Definition: libvpxenc.c:99
AVCOL_SPC_RESERVED
@ AVCOL_SPC_RESERVED
reserved for future use by ITU-T and ISO/IEC just like 15-255 are
Definition: pixfmt.h:529
FrameListData::flags
uint32_t flags
flags for this frame
Definition: libaomenc.c:58
VPxEncoderContext::coded_frame_list
struct FrameListData * coded_frame_list
Definition: libvpxenc.c:87
fifo.h
FFCodecDefault
Definition: codec_internal.h:82
FFCodec::p
AVCodec p
The public AVCodec.
Definition: codec_internal.h:116
VPxEncoderContext::deadline
int deadline
Definition: libvpxenc.c:83
AVCodecContext::thread_count
int thread_count
thread count is used to decide how many independent tasks should be passed to execute()
Definition: avcodec.h:1463
AV_PIX_FMT_GBRP10
#define AV_PIX_FMT_GBRP10
Definition: pixfmt.h:422
VPxEncoderContext::drop_threshold
int drop_threshold
Definition: libvpxenc.c:125
set_vp8_defaults
static void set_vp8_defaults(AVCodecContext *avctx, struct vpx_codec_enc_cfg *enccfg)
Set the target bitrate to VPX library default.
Definition: libvpxenc.c:827
VPxEncoderContext::roi_warned
int roi_warned
If the driver does not support ROI then warn the first time we encounter a frame with ROI side data.
Definition: libvpxenc.c:138
AVCodecContext::flags
int flags
AV_CODEC_FLAG_*.
Definition: avcodec.h:469
codecctl_int
static av_cold int codecctl_int(AVCodecContext *avctx, enum vp8e_enc_control_id id, int val)
Definition: libvpxenc.c:356
realloc_alpha_uv
static int realloc_alpha_uv(AVCodecContext *avctx, int width, int height)
Definition: libvpxenc.c:1572
val
static double val(void *priv, double ch)
Definition: aeval.c:77
vpx_ts_param_parse
static int vpx_ts_param_parse(VPxContext *ctx, struct vpx_codec_enc_cfg *enccfg, char *key, char *value, enum AVCodecID codec_id)
Definition: libvpxenc.c:582
VPxEncoderContext::max_intra_rate
int max_intra_rate
Definition: libvpxenc.c:111
FF_CODEC_ENCODE_CB
#define FF_CODEC_ENCODE_CB(func)
Definition: codec_internal.h:263
AVRational::num
int num
Numerator.
Definition: rational.h:59
LEGACY_OPTIONS
#define LEGACY_OPTIONS
Definition: libvpxenc.c:1843
AV_PIX_FMT_YUV444P10
#define AV_PIX_FMT_YUV444P10
Definition: pixfmt.h:409
vpx_encode
static int vpx_encode(AVCodecContext *avctx, AVPacket *pkt, const AVFrame *frame, int *got_packet)
Definition: libvpxenc.c:1600
avassert.h
lrint
#define lrint
Definition: tablegen.h:53
pkt
AVPacket * pkt
Definition: movenc.c:59
AV_LOG_ERROR
#define AV_LOG_ERROR
Something went wrong and cannot losslessly be recovered.
Definition: log.h:180
AVFrameSideData::size
size_t size
Definition: frame.h:234
av_cold
#define av_cold
Definition: attributes.h:90
AVRegionOfInterest
Structure describing a single Region Of Interest.
Definition: frame.h:250
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:1242
av_dict_get
AVDictionaryEntry * av_dict_get(const AVDictionary *m, const char *key, const AVDictionaryEntry *prev, int flags)
Get a dictionary entry with matching key.
Definition: dict.c:40
width
#define width
intreadwrite.h
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:1264
AV_PIX_FMT_YUVA420P
@ AV_PIX_FMT_YUVA420P
planar YUV 4:2:0, 20bpp, (1 Cr & Cb sample per 2x2 Y & A samples)
Definition: pixfmt.h:101
COMMON_OPTIONS
#define COMMON_OPTIONS
Definition: libvpxenc.c:1812
AVRegionOfInterest::bottom
int bottom
Definition: frame.h:266
AVFormatContext::flags
int flags
Flags modifying the (de)muxer behaviour.
Definition: avformat.h:1331
vpx_init
static av_cold int vpx_init(AVCodecContext *avctx, const struct vpx_codec_iface *iface)
Definition: libvpxenc.c:884
AVCOL_SPC_SMPTE170M
@ AVCOL_SPC_SMPTE170M
also ITU-R BT601-6 525 / ITU-R BT1358 525 / ITU-R BT1700 NTSC / functionally identical to above
Definition: pixfmt.h:532
log_encoder_error
static av_cold void log_encoder_error(AVCodecContext *avctx, const char *desc)
Definition: libvpxenc.c:191
AVDictionaryEntry::key
char * key
Definition: dict.h:80
AV_CODEC_ID_VP9
@ AV_CODEC_ID_VP9
Definition: codec_id.h:218
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:521
AV_CODEC_CAP_OTHER_THREADS
#define AV_CODEC_CAP_OTHER_THREADS
Codec supports multithreading through a method other than slice- or frame-level multithreading.
Definition: codec.h:127
av_strtok
char * av_strtok(char *s, const char *delim, char **saveptr)
Split the string into several tokens which can be accessed by successive calls to av_strtok().
Definition: avstring.c:189
VPxEncoderContext::row_mt
int row_mt
Definition: libvpxenc.c:129
FrameListData::sse
uint64_t sse[4]
Definition: libaomenc.c:59
VPxEncoderContext::lag_in_frames
int lag_in_frames
Definition: libvpxenc.c:107
tile_rows
int tile_rows
Definition: h265_levels.c:217
FF_PROFILE_UNKNOWN
#define FF_PROFILE_UNKNOWN
Definition: avcodec.h:1548
av_assert0
#define av_assert0(cond)
assert() equivalent, that is always enabled.
Definition: avassert.h:37
FrameListData::frame_number
uint64_t frame_number
Definition: libaomenc.c:61
AV_LOG_DEBUG
#define AV_LOG_DEBUG
Stuff which is only useful for libav* developers.
Definition: log.h:201
VPxEncoderContext::arnr_type
int arnr_type
Definition: libvpxenc.c:103
ctx
AVFormatContext * ctx
Definition: movenc.c:48
MAX_DELTA_Q
#define MAX_DELTA_Q
AV_PKT_DATA_DYNAMIC_HDR10_PLUS
@ AV_PKT_DATA_DYNAMIC_HDR10_PLUS
HDR10+ dynamic metadata associated with a video frame.
Definition: packet.h:300
VPxEncoderContext::static_thresh
int static_thresh
Definition: libvpxenc.c:110
codec_id
enum AVCodecID codec_id
Definition: vaapi_decode.c:371
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
VPxEncoderContext::rc_undershoot_pct
int rc_undershoot_pct
Definition: libvpxenc.c:112
AVCodecContext::rc_max_rate
int64_t rc_max_rate
maximum bitrate
Definition: avcodec.h:1214
AVCodecContext::error
uint64_t error[AV_NUM_DATA_POINTERS]
error
Definition: avcodec.h:1397
key
const char * key
Definition: hwcontext_opencl.c:174
cx_pktcpy
static void cx_pktcpy(struct FrameListData *dst, const struct vpx_codec_cx_pkt *src, VPxContext *ctx)
Definition: libvpxenc.c:1204
VPxEncoderContext::current_temporal_idx
int current_temporal_idx
Definition: libvpxenc.c:117
AVCPBProperties
This structure describes the bitrate properties of an encoded bitstream.
Definition: defs.h:104
AVCodecContext::codec_id
enum AVCodecID codec_id
Definition: avcodec.h:399
if
if(ret)
Definition: filter_design.txt:179
set_vpx_defaults
static void set_vpx_defaults(AVCodecContext *avctx, struct vpx_codec_enc_cfg *enccfg)
Called when the bitrate is not set.
Definition: libvpxenc.c:871
AVCodecContext::rc_buffer_size
int rc_buffer_size
decoder bitstream buffer size
Definition: avcodec.h:1199
VPxEncoderContext::ts_layer_flags
int * ts_layer_flags
Definition: libvpxenc.c:116
LIBAVUTIL_VERSION_INT
#define LIBAVUTIL_VERSION_INT
Definition: version.h:85
AVClass
Describe the class of an AVClass context structure.
Definition: log.h:66
NULL
#define NULL
Definition: coverity.c:32
AVCodecContext::color_range
enum AVColorRange color_range
MPEG vs JPEG YUV range.
Definition: avcodec.h:973
av_buffer_unref
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
VPxEncoderContext::twopass_stats
struct vpx_fixed_buf twopass_stats
Definition: libvpxenc.c:82
vpx_free
static av_cold int vpx_free(AVCodecContext *avctx)
Definition: libvpxenc.c:422
delta_q
#define delta_q(name)
Definition: cbs_av1.c:699
AVCodecContext::bit_rate
int64_t bit_rate
the average bitrate
Definition: avcodec.h:439
VPxEncoderContext::frame_number
uint64_t frame_number
Definition: libvpxenc.c:86
AVRegionOfInterest::self_size
uint32_t self_size
Must be set to the size of this data structure (that is, sizeof(AVRegionOfInterest)).
Definition: frame.h:255
av_default_item_name
const char * av_default_item_name(void *ptr)
Return the context name.
Definition: log.c:237
AV_PICTURE_TYPE_I
@ AV_PICTURE_TYPE_I
Intra.
Definition: avutil.h:274
profiles.h
AV_PIX_FMT_YUV440P10
#define AV_PIX_FMT_YUV440P10
Definition: pixfmt.h:408
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
VPxEncoderContext::noise_sensitivity
int noise_sensitivity
Definition: libvpxenc.c:126
FrameListData::buf
void * buf
compressed data buffer
Definition: libaomenc.c:52
AV_ROUND_NEAR_INF
@ AV_ROUND_NEAR_INF
Round to nearest and halfway cases away from zero.
Definition: mathematics.h:84
VPxEncoderContext::crf
int crf
Definition: libvpxenc.c:109
VPxEncoderContext::tpl_model
int tpl_model
Definition: libvpxenc.c:132
AV_PIX_FMT_YUV422P10
#define AV_PIX_FMT_YUV422P10
Definition: pixfmt.h:407
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:81
VPxEncoderContext::encoder
struct vpx_codec_ctx encoder
Definition: libvpxenc.c:77
VPxEncoderContext::flags
int flags
VP8 specific flags, see VP8F_* below.
Definition: libvpxenc.c:95
base64.h
convert_header.major
int major
Definition: convert_header.py:23
AVCOL_RANGE_UNSPECIFIED
@ AVCOL_RANGE_UNSPECIFIED
Definition: pixfmt.h:565
free_frame_list
static av_cold void free_frame_list(struct FrameListData *list)
Definition: libvpxenc.c:316
AVCodecID
AVCodecID
Identify the syntax and semantics of the bitstream.
Definition: codec_id.h:47
vp8_encode_set_roi
static int vp8_encode_set_roi(AVCodecContext *avctx, int frame_width, int frame_height, const AVFrameSideData *sd)
Definition: libvpxenc.c:1550
planes
static const struct @328 planes[]
av_cpu_count
int av_cpu_count(void)
Definition: cpu.c:195
AVCodecContext::qcompress
float qcompress
amount of qscale change between easy & hard scenes (0.0-1.0)
Definition: avcodec.h:1170
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:512
AVCOL_TRC_SMPTE2084
@ AVCOL_TRC_SMPTE2084
SMPTE ST 2084 for 10-, 12-, 14- and 16-bit systems.
Definition: pixfmt.h:513
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:62
AVCodecContext::stats_out
char * stats_out
pass1 encoding statistics output buffer
Definition: avcodec.h:1256
VPxEncoderContext::rc_overshoot_pct
int rc_overshoot_pct
Definition: libvpxenc.c:113
AV_CODEC_CAP_DR1
#define AV_CODEC_CAP_DR1
Codec uses get_buffer() or get_encode_buffer() for allocating buffers and supports custom allocators.
Definition: codec.h:52
AVPacket::size
int size
Definition: packet.h:375
AVFifo
Definition: fifo.c:35
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:117
AVCodecContext::gop_size
int gop_size
the number of pictures in a group of pictures, or 0 for intra_only
Definition: avcodec.h:584
codec_internal.h
av_fifo_peek
int av_fifo_peek(AVFifo *f, void *buf, size_t nb_elems, size_t offset)
Read data from a FIFO without modifying FIFO state.
Definition: fifo.c:255
cpu.h
AV_PIX_FMT_YUV422P12
#define AV_PIX_FMT_YUV422P12
Definition: pixfmt.h:411
size
int size
Definition: twinvq_data.h:10344
VPxEncoderContext::lossless
int lossless
Definition: libvpxenc.c:120
copy_hdr10_plus_to_pkt
static int copy_hdr10_plus_to_pkt(AVFifo *fifo, AVPacket *pkt)
Definition: libvpxenc.c:335
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:186
AV_PIX_FMT_YUV444P12
#define AV_PIX_FMT_YUV444P12
Definition: pixfmt.h:413
AVFrameSideData::data
uint8_t * data
Definition: frame.h:233
VPxEncoderContext::tune_content
int tune_content
Definition: libvpxenc.c:130
VPxEncoderContext::corpus_complexity
int corpus_complexity
Definition: libvpxenc.c:131
VPxEncoderContext::tile_rows
int tile_rows
Definition: libvpxenc.c:122
AVCPBProperties::min_bitrate
int64_t min_bitrate
Minimum bitrate of the stream, in bits per second.
Definition: defs.h:114
FrameListData
Portion of struct vpx_codec_cx_pkt from vpx_encoder.h.
Definition: libaomenc.c:51
VPxEncoderContext::sharpness
int sharpness
Definition: libvpxenc.c:91
vp9_encode_set_roi
static int vp9_encode_set_roi(AVCodecContext *avctx, int frame_width, int frame_height, const AVFrameSideData *sd)
Definition: libvpxenc.c:1500
AVPacket::dts
int64_t dts
Decompression timestamp in AVStream->time_base units; the time at which the packet is decompressed.
Definition: packet.h:373
AV_CODEC_FLAG_PASS2
#define AV_CODEC_FLAG_PASS2
Use internal 2pass ratecontrol in second pass mode.
Definition: avcodec.h:241
height
#define height
VPxEncoderContext::hdr10_plus_fifo
AVFifo * hdr10_plus_fifo
Definition: libvpxenc.c:133
AVPacket::flags
int flags
A combination of AV_PKT_FLAG values.
Definition: packet.h:380
AVCPBProperties::avg_bitrate
int64_t avg_bitrate
Average bitrate of the stream, in bits per second.
Definition: defs.h:119
version
version
Definition: libkvazaar.c:313
AVRegionOfInterest::right
int right
Definition: frame.h:268
VPxEncoderContext::tune
int tune
Definition: libvpxenc.c:105
AVBufferRef::size
size_t size
Size of data in bytes.
Definition: buffer.h:94
AV_LOG_INFO
#define AV_LOG_INFO
Standard information.
Definition: log.h:191
AV_OPT_TYPE_FLOAT
@ AV_OPT_TYPE_FLOAT
Definition: opt.h:228
AVCOL_SPC_SMPTE240M
@ AVCOL_SPC_SMPTE240M
derived from 170M primaries and D65 white point, 170M is derived from BT470 System M's primaries
Definition: pixfmt.h:533
convert_header.minor
int minor
Definition: convert_header.py:26
AVRegionOfInterest::left
int left
Definition: frame.h:267
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
VPxEncoderContext::vpx_ts_parameters
AVDictionary * vpx_ts_parameters
Definition: libvpxenc.c:115
VPxEncoderContext::tile_columns
int tile_columns
Definition: libvpxenc.c:121
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:367
AVCOL_SPC_BT2020_NCL
@ AVCOL_SPC_BT2020_NCL
ITU-R BT2020 non-constant luminance system.
Definition: pixfmt.h:536
AVRegionOfInterest::top
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:265
internal.h
av_fifo_alloc2
AVFifo * av_fifo_alloc2(size_t nb_elems, size_t elem_size, unsigned int flags)
Allocate and initialize an AVFifo with a given element size.
Definition: fifo.c:47
AV_PIX_FMT_GBRP12
#define AV_PIX_FMT_GBRP12
Definition: pixfmt.h:423
av_malloc_array
#define av_malloc_array(a, b)
Definition: tableprint_vlc.h:31
common.h
AVCPBProperties::max_bitrate
int64_t max_bitrate
Maximum bitrate of the stream, in bits per second.
Definition: defs.h:109
value
it s the only field you need to keep assuming you have a context There is some magic you don t need to care about around this just let it vf default value
Definition: writing_filters.txt:86
FFMIN
#define FFMIN(a, b)
Definition: macros.h:49
av_fifo_freep2
void av_fifo_freep2(AVFifo **f)
Free an AVFifo and reset pointer to NULL.
Definition: fifo.c:286
AVCodec::name
const char * name
Name of the codec implementation.
Definition: codec.h:203
AVCOL_SPC_UNSPECIFIED
@ AVCOL_SPC_UNSPECIFIED
Definition: pixfmt.h:528
AVCodecContext::height
int height
Definition: avcodec.h:562
AVCodecContext::pix_fmt
enum AVPixelFormat pix_fmt
Pixel format, see AV_PIX_FMT_xxx.
Definition: avcodec.h:599
FrameListData::duration
unsigned long duration
duration to show frame (in timebase units)
Definition: libaomenc.c:56
AVCOL_RANGE_MPEG
@ AVCOL_RANGE_MPEG
Narrow or limited range content.
Definition: pixfmt.h:582
av_calloc
void * av_calloc(size_t nmemb, size_t size)
Definition: mem.c:272
defaults
static const FFCodecDefault defaults[]
Definition: libvpxenc.c:1918
avcodec.h
stride
#define stride
Definition: h264pred_template.c:537
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:71
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
AVCPBProperties::buffer_size
int64_t buffer_size
The size of the buffer to which the ratecontrol is applied, in bits.
Definition: defs.h:125
VPxEncoderContext::cpu_used
int cpu_used
Definition: libvpxenc.c:90
VPxEncoderContext::alpha_coded_frame_list
struct FrameListData * alpha_coded_frame_list
Definition: libvpxenc.c:88
FrameHDR10Plus
Definition: libvpxenc.c:70
av_fifo_write
int av_fifo_write(AVFifo *f, const void *buf, size_t nb_elems)
Write data into a FIFO.
Definition: fifo.c:188
AV_PIX_FMT_YUV420P12
#define AV_PIX_FMT_YUV420P12
Definition: pixfmt.h:410
SIZE_SPECIFIER
#define SIZE_SPECIFIER
Definition: internal.h:195
AV_FRAME_DATA_DYNAMIC_HDR_PLUS
@ AV_FRAME_DATA_DYNAMIC_HDR_PLUS
HDR dynamic metadata associated with a video frame.
Definition: frame.h:159
AVCodecContext
main external API structure.
Definition: avcodec.h:389
av_packet_new_side_data
uint8_t * av_packet_new_side_data(AVPacket *pkt, enum AVPacketSideDataType type, size_t size)
Allocate new information of a packet.
Definition: avpacket.c:230
ff_get_encode_buffer
int ff_get_encode_buffer(AVCodecContext *avctx, AVPacket *avpkt, int64_t size, int flags)
Get a buffer for a packet.
Definition: encode.c:79
AVCodecContext::qmin
int qmin
minimum quantizer
Definition: avcodec.h:1178
AVRational::den
int den
Denominator.
Definition: rational.h:60
storeframe
static int storeframe(AVCodecContext *avctx, struct FrameListData *cx_frame, struct FrameListData *alpha_cx_frame, AVPacket *pkt)
Store coded frame information in format suitable for return from encode2().
Definition: libvpxenc.c:1238
AV_PIX_FMT_NONE
@ AV_PIX_FMT_NONE
Definition: pixfmt.h:65
AV_OPT_TYPE_INT
@ AV_OPT_TYPE_INT
Definition: opt.h:225
AVCodecContext::profile
int profile
profile
Definition: avcodec.h:1547
ctlidstr
static const char *const ctlidstr[]
String mappings for enum vp8e_enc_control_id.
Definition: libvpxenc.c:145
free_hdr10_plus_fifo
static av_cold void free_hdr10_plus_fifo(AVFifo **fifo)
Definition: libvpxenc.c:327
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:145
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:82
VPxEncoderContext::frame_parallel
int frame_parallel
Definition: libvpxenc.c:123
ff_libvpx_vp8_encoder
const FFCodec ff_libvpx_vp8_encoder
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
VPxEncoderContext::error_resilient
int error_resilient
Definition: libvpxenc.c:108
AV_PIX_FMT_GBRP
@ AV_PIX_FMT_GBRP
planar GBR 4:4:4 24bpp
Definition: pixfmt.h:158
OFFSET
#define OFFSET(x)
Definition: libvpxenc.c:1809
desc
const char * desc
Definition: libsvtav1.c:83
AV_PICTURE_TYPE_P
@ AV_PICTURE_TYPE_P
Predicted.
Definition: avutil.h:275
AVMEDIA_TYPE_VIDEO
@ AVMEDIA_TYPE_VIDEO
Definition: avutil.h:201
coded_frame_add
static void coded_frame_add(void *list, struct FrameListData *cx_frame)
Definition: libvpxenc.c:300
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
AVBufferRef
A reference to a data buffer.
Definition: buffer.h:82
packet_internal.h
FF_CODEC_CAP_AUTO_THREADS
#define FF_CODEC_CAP_AUTO_THREADS
Codec handles avctx->thread_count == 0 (auto) internally.
Definition: codec_internal.h:70
AV_PKT_DATA_MATROSKA_BLOCKADDITIONAL
@ AV_PKT_DATA_MATROSKA_BLOCKADDITIONAL
Data found in BlockAdditional element of matroska container.
Definition: packet.h:192
AVFrameSideData
Structure to hold side data for an AVFrame.
Definition: frame.h:231
AVPixFmtDescriptor
Descriptor that unambiguously describes how the bits of a pixel are stored in the up to 4 data planes...
Definition: pixdesc.h:69
set_temporal_layer_pattern
static void set_temporal_layer_pattern(int layering_mode, vpx_codec_enc_cfg_t *cfg, int *layer_flags, int *flag_periodicity)
Definition: libvpxenc.c:478
dump_enc_cfg
static av_cold void dump_enc_cfg(AVCodecContext *avctx, const struct vpx_codec_enc_cfg *cfg, int level)
Definition: libvpxenc.c:202
AVDictionaryEntry
Definition: dict.h:79
VPxEncoderContext::arnr_max_frames
int arnr_max_frames
Definition: libvpxenc.c:101
AVCodecContext::slices
int slices
Number of slices.
Definition: avcodec.h:989
AVPacket
This structure stores compressed data.
Definition: packet.h:351
AVCodecContext::priv_data
void * priv_data
Definition: avcodec.h:416
VPxEncoderContext::vpx_cs
int vpx_cs
Definition: libvpxenc.c:127
AV_OPT_TYPE_BOOL
@ AV_OPT_TYPE_BOOL
Definition: opt.h:244
av_freep
#define av_freep(p)
Definition: tableprint_vlc.h:34
src
INIT_CLIP pixel * src
Definition: h264pred_template.c:418
set_roi_map
static int set_roi_map(AVCodecContext *avctx, const AVFrameSideData *sd, int frame_width, int frame_height, vpx_roi_map_t *roi_map, int block_size, int segment_cnt)
Definition: libvpxenc.c:1393
queue_frames
static int queue_frames(AVCodecContext *avctx, struct vpx_codec_ctx *encoder, struct FrameListData **frame_list, AVPacket *pkt_out)
Queue multiple output frames from the encoder, returning the front-most.
Definition: libvpxenc.c:1302
AVCodecContext::width
int width
picture width / height.
Definition: avcodec.h:562
convert_header.str
string str
Definition: convert_header.py:20
AV_FRAME_DATA_REGIONS_OF_INTEREST
@ 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
AV_CODEC_ID_VP8
@ AV_CODEC_ID_VP8
Definition: codec_id.h:190
flags
#define flags(name, subs,...)
Definition: cbs_av1.c:561
av_log
#define av_log(a,...)
Definition: tableprint_vlc.h:27
FrameListData::sz
size_t sz
length of compressed data
Definition: libaomenc.c:53
AVERROR_INVALIDDATA
#define AVERROR_INVALIDDATA
Invalid data found when processing input.
Definition: error.h:61
libvpx.h
AV_PIX_FMT_YUV440P12
#define AV_PIX_FMT_YUV440P12
Definition: pixfmt.h:412
free_coded_frame
static av_cold void free_coded_frame(struct FrameListData *cx_frame)
Definition: libvpxenc.c:310
VPxEncoderContext::arnr_strength
int arnr_strength
Definition: libvpxenc.c:102
vp8_init
static av_cold int vp8_init(AVFormatContext *s, int st_index, PayloadContext *vp8)
Definition: rtpdec_vp8.c:263
AVDictionaryEntry::value
char * value
Definition: dict.h:81
avstring.h
FF_QP2LAMBDA
#define FF_QP2LAMBDA
factor to convert from H.263 QP to lambda
Definition: avutil.h:227
AVCOL_SPC_BT709
@ AVCOL_SPC_BT709
also ITU-R BT1361 / IEC 61966-2-4 xvYCC709 / derived in SMPTE RP 177 Annex B
Definition: pixfmt.h:527
av_fifo_drain2
void av_fifo_drain2(AVFifo *f, size_t size)
Discard the specified amount of data from an AVFifo.
Definition: fifo.c:266
VE
#define VE
Definition: libvpxenc.c:1810
int
int
Definition: ffmpeg_filter.c:153
AVRegionOfInterest::qoffset
AVRational qoffset
Quantisation offset.
Definition: frame.h:292
AV_OPT_TYPE_CONST
@ AV_OPT_TYPE_CONST
Definition: opt.h:234
snprintf
#define snprintf
Definition: snprintf.h:34
av_log2
int av_log2(unsigned v)
Definition: intmath.c:26
VPxEncoderContext::sse
uint64_t sse[4]
Definition: libvpxenc.c:84
ff_vp9_profiles
const AVProfile ff_vp9_profiles[]
Definition: profiles.c:139
AV_CODEC_FLAG_PASS1
#define AV_CODEC_FLAG_PASS1
Use internal 2pass ratecontrol in first pass mode.
Definition: avcodec.h:237
FrameListData::have_sse
int have_sse
true if we have pending sse[]
Definition: libaomenc.c:60