FFmpeg
liboapvenc.c
Go to the documentation of this file.
1 /*
2  * liboapv encoder
3  * Advanced Professional Video codec library
4  *
5  * Copyright (C) 2025 Dawid Kozinski <d.kozinski@samsung.com>
6  *
7  * This file is part of FFmpeg.
8  *
9  * FFmpeg is free software; you can redistribute it and/or
10  * modify it under the terms of the GNU Lesser General Public
11  * License as published by the Free Software Foundation; either
12  * version 2.1 of the License, or (at your option) any later version.
13  *
14  * FFmpeg is distributed in the hope that it will be useful,
15  * but WITHOUT ANY WARRANTY; without even the implied warranty of
16  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
17  * Lesser General Public License for more details.
18  *
19  * You should have received a copy of the GNU Lesser General Public
20  * License along with FFmpeg; if not, write to the Free Software
21  * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
22  */
23 
24 #include <stdint.h>
25 #include <stdlib.h>
26 
27 #include <oapv/oapv.h>
28 
29 #include "libavutil/avassert.h"
30 #include "libavutil/intreadwrite.h"
31 #include "libavutil/imgutils.h"
32 #include "libavutil/mem.h"
33 #include "libavutil/opt.h"
34 #include "libavutil/pixdesc.h"
35 #include "libavutil/pixfmt.h"
36 
37 #include "avcodec.h"
38 #include "apv.h"
39 #include "codec_internal.h"
40 #include "encode.h"
41 #include "profiles.h"
42 
43 #define MAX_BS_BUF (128 * 1024 * 1024)
44 #define MAX_NUM_FRMS (1) // supports only 1-frame in an access unit
45 #define FRM_IDX (0) // supports only 1-frame in an access unit
46 #define MAX_NUM_CC (OAPV_MAX_CC) // Max number of color components (upto 4:4:4:4)
47 
48 /**
49  * The structure stores all the states associated with the instance of APV encoder
50  */
51 typedef struct ApvEncContext {
52  const AVClass *class;
53 
54  oapve_t id; // APV instance identifier
55  oapvm_t mid;
56  oapve_cdesc_t cdsc; // coding parameters i.e profile, width & height of input frame, num of therads, frame rate ...
57  oapv_bitb_t bitb; // bitstream buffer (output)
58  oapve_stat_t stat; // encoding status (output)
59 
60  oapv_frms_t ifrms; // frames for input
61 
62  int preset_id; // preset of apv ( fastest, fast, medium, slow, placebo)
63 
64  int qp; // quantization parameter (QP) [0,63]
65 
68 
69 static int apv_imgb_release(oapv_imgb_t *imgb)
70 {
71  int refcnt = --imgb->refcnt;
72  if (refcnt == 0) {
73  for (int i = 0; i < imgb->np; i++)
74  av_freep(&imgb->baddr[i]);
75  av_free(imgb);
76  }
77 
78  return refcnt;
79 }
80 
81 static int apv_imgb_addref(oapv_imgb_t * imgb)
82 {
83  int refcnt = ++imgb->refcnt;
84  return refcnt;
85 }
86 
87 static int apv_imgb_getref(oapv_imgb_t * imgb)
88 {
89  return imgb->refcnt;
90 }
91 
92 /**
93  * Convert FFmpeg pixel format (AVPixelFormat) into APV pre-defined color format
94  *
95  * @return APV pre-defined color format (@see oapv.h) on success, OAPV_CF_UNKNOWN on failure
96  */
97 static inline int get_color_format(enum AVPixelFormat pix_fmt)
98 {
99  int cf = OAPV_CF_UNKNOWN;
100 
101  switch (pix_fmt) {
102  case AV_PIX_FMT_GRAY10:
103  cf = OAPV_CF_YCBCR400;
104  break;
106  cf = OAPV_CF_YCBCR422;
107  break;
109  cf = OAPV_CF_YCBCR422;
110  break;
112  cf = OAPV_CF_YCBCR444;
113  break;
115  cf = OAPV_CF_YCBCR444;
116  break;
118  cf = OAPV_CF_YCBCR4444;
119  break;
121  cf = OAPV_CF_YCBCR4444;
122  break;
123  default:
124  av_assert0(cf != OAPV_CF_UNKNOWN);
125  }
126 
127  return cf;
128 }
129 
131 {
132  int cfi = -1;
133 
134  switch (pix_fmt) {
135  case AV_PIX_FMT_GRAY10:
136  cfi = APV_CHROMA_FORMAT_400;
137  break;
140  cfi = APV_CHROMA_FORMAT_422;
141  break;
144  cfi = APV_CHROMA_FORMAT_444;
145  break;
149  break;
150  default:
151  av_assert0(cfi >= 0);
152  }
153 
154  return cfi;
155 }
156 
157 static inline int get_min_profile(enum AVPixelFormat pix_fmt)
158 {
160 
161  switch (pix_fmt) {
162  case AV_PIX_FMT_GRAY10:
164  break;
167  break;
170  break;
173  break;
176  break;
179  break;
182  break;
183  default:
185  }
186 
187  return profile;
188 }
189 
191 {
193  const int chroma_format_idc = get_chroma_format_idc(pix_fmt);
194  const int bit_depth = desc->comp[0].depth;
195 
196  av_assert0(desc);
197 
198  switch (profile) {
200  return chroma_format_idc == APV_CHROMA_FORMAT_422 && bit_depth == 10;
202  return chroma_format_idc == APV_CHROMA_FORMAT_422 &&
203  bit_depth >= 10 && bit_depth <= 12;
205  return chroma_format_idc >= APV_CHROMA_FORMAT_422 &&
206  chroma_format_idc <= APV_CHROMA_FORMAT_444 &&
207  bit_depth == 10;
209  return chroma_format_idc >= APV_CHROMA_FORMAT_422 &&
210  chroma_format_idc <= APV_CHROMA_FORMAT_444 &&
211  bit_depth >= 10 && bit_depth <= 12;
213  return chroma_format_idc >= APV_CHROMA_FORMAT_422 &&
214  chroma_format_idc <= APV_CHROMA_FORMAT_4444 &&
215  bit_depth == 10;
217  return chroma_format_idc >= APV_CHROMA_FORMAT_422 &&
218  chroma_format_idc <= APV_CHROMA_FORMAT_4444 &&
219  bit_depth >= 10 && bit_depth <= 12;
221  return chroma_format_idc == APV_CHROMA_FORMAT_400 && bit_depth == 10;
222  default:
223  return 0;
224  }
225 }
226 
227 static int validate_profile(AVCodecContext *avctx, int profile)
228 {
229  const int minimum = get_min_profile(avctx->pix_fmt);
230  const char *profile_name = av_get_profile_name(avctx->codec, profile);
231  const char *minimum_name = av_get_profile_name(avctx->codec, minimum);
232 
233  if (!profile_is_compatible(avctx->pix_fmt, profile)) {
234  av_log(avctx, AV_LOG_ERROR,
235  "Profile %s (%d) is incompatible with pixel format %s; minimum compatible profile is %s (%d)\n",
236  profile_name ? profile_name : "unknown", profile,
238  minimum_name ? minimum_name : "unknown", minimum);
239  return AVERROR(EINVAL);
240  }
241 
242  return 0;
243 }
244 
245 static oapv_imgb_t *apv_imgb_create(AVCodecContext *avctx)
246 {
248  oapv_imgb_t *imgb;
249  int input_depth;
250  int cfmt; // color format
251  int cs;
252 
253  av_assert0(desc);
254 
255  imgb = av_mallocz(sizeof(oapv_imgb_t));
256  if (!imgb)
257  goto fail;
258 
259  input_depth = desc->comp[0].depth;
260  cfmt = get_color_format(avctx->pix_fmt);
261  cs = OAPV_CS_SET(cfmt, input_depth, AV_HAVE_BIGENDIAN);
262 
263  imgb->np = desc->nb_components;
264 
265  for (int i = 0; i < imgb->np; i++) {
266  imgb->w[i] = avctx->width >> ((i == 1 || i == 2) ? desc->log2_chroma_w : 0);
267  imgb->h[i] = avctx->height;
268  imgb->aw[i] = FFALIGN(imgb->w[i], OAPV_MB_W);
269  imgb->ah[i] = FFALIGN(imgb->h[i], OAPV_MB_H);
270  imgb->s[i] = imgb->aw[i] * OAPV_CS_GET_BYTE_DEPTH(cs);
271 
272  imgb->bsize[i] = imgb->e[i] = imgb->s[i] * imgb->ah[i];
273  imgb->a[i] = imgb->baddr[i] = av_mallocz(imgb->bsize[i]);
274  if (imgb->a[i] == NULL)
275  goto fail;
276  }
277 
278  imgb->cs = cs;
279  imgb->addref = apv_imgb_addref;
280  imgb->getref = apv_imgb_getref;
281  imgb->release = apv_imgb_release;
282  imgb->refcnt = 1;
283 
284  return imgb;
285 fail:
286  av_log(avctx, AV_LOG_ERROR, "cannot create image buffer\n");
287  if (imgb) {
288  for (int i = 0; i < imgb->np; i++)
289  av_freep(&imgb->a[i]);
290  av_freep(&imgb);
291  }
292  return NULL;
293 }
294 
295 /**
296  * Populate the liboapv configuration from AVCodecContext and encoder options.
297  *
298  * AVCodecContext fields are applied first, followed by liboapv private options
299  * and finally oapv-params. The APV profile defaults to the minimum profile
300  * implied by pix_fmt, and later overrides must remain compatible with that
301  * pixel format.
302  *
303  * @param[in] avctx codec context (AVCodecContext)
304  * @param[out] cdsc contains all APV encoder encoder parameters that should be initialized before the encoder is use
305  *
306  * @return 0 on success, negative error code on failure
307  */
308 static int get_conf(AVCodecContext *avctx, oapve_cdesc_t *cdsc)
309 {
310  ApvEncContext *apv = avctx->priv_data;
311 
312  /* initialize apv_param struct with default values */
313  int ret = oapve_param_default(&cdsc->param[FRM_IDX]);
314  if (OAPV_FAILED(ret)) {
315  av_log(avctx, AV_LOG_ERROR, "Cannot set default parameter\n");
316  return AVERROR_EXTERNAL;
317  }
318 
319  /* read options from AVCodecContext */
320  if (avctx->width > 0)
321  cdsc->param[FRM_IDX].w = avctx->width;
322 
323  if (avctx->height > 0)
324  cdsc->param[FRM_IDX].h = avctx->height;
325 
326  if (avctx->framerate.num > 0) {
327  cdsc->param[FRM_IDX].fps_num = avctx->framerate.num;
328  cdsc->param[FRM_IDX].fps_den = avctx->framerate.den;
329  } else if (avctx->time_base.num > 0) {
330  cdsc->param[FRM_IDX].fps_num = avctx->time_base.den;
331  cdsc->param[FRM_IDX].fps_den = avctx->time_base.num;
332  }
333 
334  cdsc->param[FRM_IDX].profile_idc = get_min_profile(avctx->pix_fmt);
335  if (avctx->profile != AV_PROFILE_UNKNOWN) {
336  ret = validate_profile(avctx, avctx->profile);
337  if (ret < 0)
338  return ret;
339  cdsc->param[FRM_IDX].profile_idc = avctx->profile;
340  }
341  cdsc->param[FRM_IDX].preset = apv->preset_id;
342  cdsc->param[FRM_IDX].qp = apv->qp;
343  if (avctx->bit_rate / 1000 > INT_MAX || avctx->rc_max_rate / 1000 > INT_MAX) {
344  av_log(avctx, AV_LOG_ERROR, "bit_rate and rc_max_rate > %d000 is not supported\n", INT_MAX);
345  return AVERROR(EINVAL);
346  }
347  cdsc->param[FRM_IDX].bitrate = (int)(avctx->bit_rate / 1000);
348  if (cdsc->param[FRM_IDX].bitrate) {
349  if (cdsc->param[FRM_IDX].qp) {
350  av_log(avctx, AV_LOG_WARNING, "You cannot set both the bitrate and the QP parameter at the same time.\n"
351  "If the bitrate is set, the rate control type is set to ABR, which means that the QP value is ignored.\n");
352  }
353  cdsc->param[FRM_IDX].rc_type = OAPV_RC_ABR;
354  }
355 
356  cdsc->threads = avctx->thread_count;
357 
358  if (avctx->color_primaries != AVCOL_PRI_UNSPECIFIED) {
359  cdsc->param[FRM_IDX].color_primaries = avctx->color_primaries;
360  cdsc->param[FRM_IDX].color_description_present_flag = 1;
361  }
362 
363  if (avctx->color_trc != AVCOL_TRC_UNSPECIFIED) {
364  cdsc->param[FRM_IDX].transfer_characteristics = avctx->color_trc;
365  cdsc->param[FRM_IDX].color_description_present_flag = 1;
366  }
367 
368  if (avctx->colorspace != AVCOL_SPC_UNSPECIFIED) {
369  cdsc->param[FRM_IDX].matrix_coefficients = avctx->colorspace;
370  cdsc->param[FRM_IDX].color_description_present_flag = 1;
371  }
372 
373  if (avctx->color_range != AVCOL_RANGE_UNSPECIFIED) {
374  cdsc->param[FRM_IDX].full_range_flag = (avctx->color_range == AVCOL_RANGE_JPEG);
375  cdsc->param[FRM_IDX].color_description_present_flag = 1;
376  }
377 
378  cdsc->max_bs_buf_size = MAX_BS_BUF; /* maximum bitstream buffer size */
379  cdsc->max_num_frms = MAX_NUM_FRMS;
380 
381  const AVDictionaryEntry *en = NULL;
382  while (en = av_dict_iterate(apv->oapv_params, en)) {
383  ret = oapve_param_parse(&cdsc->param[FRM_IDX], en->key, en->value);
384  if (ret < 0)
385  av_log(avctx, AV_LOG_WARNING, "Error parsing option '%s = %s'.\n", en->key, en->value);
386  }
387 
388  ret = validate_profile(avctx, cdsc->param[FRM_IDX].profile_idc);
389  if (ret < 0)
390  return ret;
391 
392  avctx->profile = cdsc->param[FRM_IDX].profile_idc;
393 
394  return 0;
395 }
396 
397 /**
398  * @brief Initialize APV codec
399  * Create an encoder instance and allocate all the needed resources
400  *
401  * @param avctx codec context
402  * @return 0 on success, negative error code on failure
403  */
405 {
406  ApvEncContext *apv = avctx->priv_data;
407  oapve_cdesc_t *cdsc = &apv->cdsc;
408  unsigned char *bs_buf;
409  int ret;
410 
411  /* allocate bitstream buffer */
412  bs_buf = (unsigned char *)av_malloc(MAX_BS_BUF);
413  if (bs_buf == NULL) {
414  av_log(avctx, AV_LOG_ERROR, "Cannot allocate bitstream buffer, size=%d\n", MAX_BS_BUF);
415  return AVERROR(ENOMEM);
416  }
417  apv->bitb.addr = bs_buf;
418  apv->bitb.bsize = MAX_BS_BUF;
419 
420  /* read configurations and set values for created descriptor (APV_CDSC) */
421  ret = get_conf(avctx, cdsc);
422  if (ret < 0) {
423  av_log(avctx, AV_LOG_ERROR, "Cannot get OAPV configuration\n");
424  return ret;
425  }
426 
427  /* create encoder */
428  apv->id = oapve_create(cdsc, &ret);
429  if (apv->id == NULL) {
430  av_log(avctx, AV_LOG_ERROR, "Cannot create OAPV encoder\n");
431  if (ret == OAPV_ERR_INVALID_LEVEL)
432  av_log(avctx, AV_LOG_ERROR, "Invalid level idc: %d\n", cdsc->param[0].level_idc);
433  return AVERROR_EXTERNAL;
434  }
435 
436  /* create metadata handler */
437  apv->mid = oapvm_create(&ret);
438  if (apv->mid == NULL || OAPV_FAILED(ret)) {
439  av_log(avctx, AV_LOG_ERROR, "cannot create OAPV metadata handler\n");
440  return AVERROR_EXTERNAL;
441  }
442 
443  int value = OAPV_CFG_VAL_AU_BS_FMT_NONE;
444  int size = 4;
445  ret = oapve_config(apv->id, OAPV_CFG_SET_AU_BS_FMT, &value, &size);
446  if (OAPV_FAILED(ret)) {
447  av_log(avctx, AV_LOG_ERROR, "Failed to set config for using encoder output format\n");
448  return AVERROR_EXTERNAL;
449  }
450 
451  apv->ifrms.frm[FRM_IDX].imgb = apv_imgb_create(avctx);
452  if (apv->ifrms.frm[FRM_IDX].imgb == NULL)
453  return AVERROR(ENOMEM);
454  apv->ifrms.num_frms++;
455 
456  /* color description values */
457  if (cdsc->param[FRM_IDX].color_description_present_flag) {
458  avctx->color_primaries = cdsc->param[FRM_IDX].color_primaries;
459  avctx->color_trc = cdsc->param[FRM_IDX].transfer_characteristics;
460  avctx->colorspace = cdsc->param[FRM_IDX].matrix_coefficients;
461  avctx->color_range = (cdsc->param[FRM_IDX].full_range_flag) ? AVCOL_RANGE_JPEG : AVCOL_RANGE_MPEG;
462  }
463 
464  return 0;
465 }
466 
467 /**
468  * Encode raw data frame into APV packet
469  *
470  * @param[in] avctx codec context
471  * @param[out] avpkt output AVPacket containing encoded data
472  * @param[in] frame AVFrame containing the raw data to be encoded
473  * @param[out] got_packet encoder sets to 0 or 1 to indicate that a
474  * non-empty packet was returned in pkt
475  *
476  * @return 0 on success, negative error code on failure
477  */
478 static int liboapve_encode(AVCodecContext *avctx, AVPacket *avpkt,
479  const AVFrame *frame, int *got_packet)
480 {
481  ApvEncContext *apv = avctx->priv_data;
482  const oapve_cdesc_t *cdsc = &apv->cdsc;
483  oapv_frm_t *frm = &apv->ifrms.frm[FRM_IDX];
484  oapv_imgb_t *imgb = frm->imgb;
485  int ret;
486 
487  if (avctx->width != frame->width || avctx->height != frame->height || avctx->pix_fmt != frame->format) {
488  av_log(avctx, AV_LOG_ERROR, "Dimension changes are not supported\n");
489  return AVERROR(EINVAL);
490  }
491 
492  av_image_copy((uint8_t **)imgb->a, imgb->s, (const uint8_t **)frame->data, frame->linesize,
493  frame->format, frame->width, frame->height);
494 
495  imgb->ts[0] = frame->pts;
496 
497  frm->group_id = 1; // @todo FIX-ME : need to set properly in case of multi-frame
498  frm->pbu_type = OAPV_PBU_TYPE_PRIMARY_FRAME;
499 
500  ret = oapve_encode(apv->id, &apv->ifrms, apv->mid, &apv->bitb, &apv->stat, NULL);
501  if (OAPV_FAILED(ret)) {
502  av_log(avctx, AV_LOG_ERROR, "oapve_encode() failed\n");
503  return AVERROR_EXTERNAL;
504  }
505 
506  /* store bitstream */
507  if (OAPV_SUCCEEDED(ret) && apv->stat.write > 0) {
508  uint8_t *data = apv->bitb.addr;
509  int size = apv->stat.write;
510 
511  // The encoder may return a "Raw bitstream" formatted AU, including au_size.
512  // Discard it as we only need the access_unit() structure.
513  if (size > 4 && AV_RB32(data) != APV_SIGNATURE) {
514  data += 4;
515  size -= 4;
516  }
517 
518  ret = ff_get_encode_buffer(avctx, avpkt, size, 0);
519  if (ret < 0)
520  return ret;
521 
522  memcpy(avpkt->data, data, size);
523  avpkt->pts = avpkt->dts = frame->pts;
524  avpkt->flags |= AV_PKT_FLAG_KEY;
525 
526  if (cdsc->param[FRM_IDX].qp)
528 
529  *got_packet = 1;
530  }
531 
532  return 0;
533 }
534 
535 /**
536  * Destroy the encoder and release all the allocated resources
537  *
538  * @param avctx codec context
539  * @return 0 on success, negative error code on failure
540  */
542 {
543  ApvEncContext *apv = avctx->priv_data;
544 
545  for (int i = 0; i < apv->ifrms.num_frms; i++) {
546  if (apv->ifrms.frm[i].imgb != NULL)
547  apv->ifrms.frm[i].imgb->release(apv->ifrms.frm[i].imgb);
548  apv->ifrms.frm[i].imgb = NULL;
549  }
550 
551  if (apv->mid) {
552  oapvm_rem_all(apv->mid);
553  }
554 
555  if (apv->id) {
556  oapve_delete(apv->id);
557  apv->id = NULL;
558  }
559 
560  if (apv->mid) {
561  oapvm_delete(apv->mid);
562  apv->mid = NULL;
563  }
564 
565  av_freep(&apv->bitb.addr); /* release bitstream buffer */
566 
567  return 0;
568 }
569 
570 #define OFFSET(x) offsetof(ApvEncContext, x)
571 #define VE AV_OPT_FLAG_VIDEO_PARAM | AV_OPT_FLAG_ENCODING_PARAM
572 
573 static const enum AVPixelFormat supported_pixel_formats[] = {
582 };
583 
584 static const AVOption liboapv_options[] = {
585  { "preset", "Encoding preset for setting encoding speed (optimization level control)", OFFSET(preset_id), AV_OPT_TYPE_INT, { .i64 = OAPV_PRESET_DEFAULT }, OAPV_PRESET_FASTEST, OAPV_PRESET_PLACEBO, VE, .unit = "preset" },
586  { "fastest", NULL, 0, AV_OPT_TYPE_CONST, { .i64 = OAPV_PRESET_FASTEST }, INT_MIN, INT_MAX, VE, .unit = "preset" },
587  { "fast", NULL, 0, AV_OPT_TYPE_CONST, { .i64 = OAPV_PRESET_FAST }, INT_MIN, INT_MAX, VE, .unit = "preset" },
588  { "medium", NULL, 0, AV_OPT_TYPE_CONST, { .i64 = OAPV_PRESET_MEDIUM }, INT_MIN, INT_MAX, VE, .unit = "preset" },
589  { "slow", NULL, 0, AV_OPT_TYPE_CONST, { .i64 = OAPV_PRESET_SLOW }, INT_MIN, INT_MAX, VE, .unit = "preset" },
590  { "placebo", NULL, 0, AV_OPT_TYPE_CONST, { .i64 = OAPV_PRESET_PLACEBO }, INT_MIN, INT_MAX, VE, .unit = "preset" },
591  { "default", NULL, 0, AV_OPT_TYPE_CONST, { .i64 = OAPV_PRESET_DEFAULT }, INT_MIN, INT_MAX, VE, .unit = "preset" },
592 
593  { "qp", "Quantization parameter value for CQP rate control mode", OFFSET(qp), AV_OPT_TYPE_INT, { .i64 = 32 }, 0, 63, VE },
594  { "oapv-params", "Override the apv configuration using a :-separated list of key=value parameters", OFFSET(oapv_params), AV_OPT_TYPE_DICT, { 0 }, 0, 0, VE },
595  { NULL }
596 };
597 
598 static const AVClass liboapve_class = {
599  .class_name = "liboapv",
600  .item_name = av_default_item_name,
601  .option = liboapv_options,
602  .version = LIBAVUTIL_VERSION_INT,
603 };
604 
606  { "b", "0" }, // bitrate in terms of kilo-bits per second (support for bit-rates from a few hundred Mbps to a few Gbps for 2K, 4K and 8K resolution content)
607  { NULL },
608 };
609 
611  .p.name = "liboapv",
612  .p.long_name = NULL_IF_CONFIG_SMALL("liboapv APV"),
613  .p.type = AVMEDIA_TYPE_VIDEO,
614  .p.id = AV_CODEC_ID_APV,
615  .init = liboapve_init,
617  .close = liboapve_close,
618  .priv_data_size = sizeof(ApvEncContext),
619  .p.priv_class = &liboapve_class,
620  .defaults = liboapve_defaults,
621  .p.capabilities = AV_CODEC_CAP_OTHER_THREADS | AV_CODEC_CAP_DR1,
622  .p.wrapper_name = "liboapv",
623  .p.pix_fmts = supported_pixel_formats,
624  .p.profiles = NULL_IF_CONFIG_SMALL(ff_apv_profiles),
626 };
get_color_format
static int get_color_format(enum AVPixelFormat pix_fmt)
Convert FFmpeg pixel format (AVPixelFormat) into APV pre-defined color format.
Definition: liboapvenc.c:97
liboapv_options
static const AVOption liboapv_options[]
Definition: liboapvenc.c:584
AV_LOG_WARNING
#define AV_LOG_WARNING
Something somehow does not look correct.
Definition: log.h:216
AVPixelFormat
AVPixelFormat
Pixel format.
Definition: pixfmt.h:71
FF_CODEC_CAP_INIT_CLEANUP
#define FF_CODEC_CAP_INIT_CLEANUP
The codec allows calling the close function for deallocation even if the init function returned a fai...
Definition: codec_internal.h:43
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
AVCodecContext::colorspace
enum AVColorSpace colorspace
YUV colorspace type.
Definition: avcodec.h:671
AV_PROFILE_APV_444_10
#define AV_PROFILE_APV_444_10
Definition: defs.h:202
validate_profile
static int validate_profile(AVCodecContext *avctx, int profile)
Definition: liboapvenc.c:227
ApvEncContext::stat
oapve_stat_t stat
Definition: liboapvenc.c:58
ApvEncContext
The structure stores all the states associated with the instance of APV encoder.
Definition: liboapvenc.c:51
av_pix_fmt_desc_get
const AVPixFmtDescriptor * av_pix_fmt_desc_get(enum AVPixelFormat pix_fmt)
Definition: pixdesc.c:3456
AVFrame
This structure describes decoded (raw) audio or video data.
Definition: frame.h:459
pixdesc.h
AVCodecContext::color_trc
enum AVColorTransferCharacteristic color_trc
Color Transfer Characteristic.
Definition: avcodec.h:664
AVCOL_RANGE_JPEG
@ AVCOL_RANGE_JPEG
Full range content.
Definition: pixfmt.h:777
get_min_profile
static int get_min_profile(enum AVPixelFormat pix_fmt)
Definition: liboapvenc.c:157
AVPacket::data
uint8_t * data
Definition: packet.h:595
AVOption
AVOption.
Definition: opt.h:429
encode.h
AVCOL_TRC_UNSPECIFIED
@ AVCOL_TRC_UNSPECIFIED
Definition: pixfmt.h:669
data
const char data[16]
Definition: mxf.c:149
FF_CODEC_CAP_NOT_INIT_THREADSAFE
#define FF_CODEC_CAP_NOT_INIT_THREADSAFE
The codec is not known to be init-threadsafe (i.e.
Definition: codec_internal.h:35
FFCodec
Definition: codec_internal.h:127
APV_CHROMA_FORMAT_422
@ APV_CHROMA_FORMAT_422
Definition: apv.h:48
ApvEncContext::qp
int qp
Definition: liboapvenc.c:64
AVDictionary
Definition: dict.c:32
bit_depth
static void bit_depth(AudioStatsContext *s, const uint64_t *const mask, uint8_t *depth)
Definition: af_astats.c:246
APV_SIGNATURE
#define APV_SIGNATURE
Definition: apv.h:23
ApvEncContext::cdsc
oapve_cdesc_t cdsc
Definition: liboapvenc.c:56
AV_PKT_FLAG_KEY
#define AV_PKT_FLAG_KEY
The packet contains a keyframe.
Definition: packet.h:650
ApvEncContext::bitb
oapv_bitb_t bitb
Definition: liboapvenc.c:57
liboapve_class
static const AVClass liboapve_class
Definition: liboapvenc.c:598
AVCodecContext::framerate
AVRational framerate
Definition: avcodec.h:563
apv_imgb_release
static int apv_imgb_release(oapv_imgb_t *imgb)
Definition: liboapvenc.c:69
ff_apv_profiles
const AVProfile ff_apv_profiles[]
Definition: profiles.c:212
FFCodecDefault
Definition: codec_internal.h:97
FFCodec::p
AVCodec p
The public AVCodec.
Definition: codec_internal.h:131
ApvEncContext::id
oapve_t id
Definition: liboapvenc.c:54
AVCodecContext::codec
const struct AVCodec * codec
Definition: avcodec.h:452
fail
#define fail()
Definition: checkasm.h:225
AVCodecContext::thread_count
int thread_count
thread count is used to decide how many independent tasks should be passed to execute()
Definition: avcodec.h:1579
ff_encode_add_stats_side_data
int ff_encode_add_stats_side_data(AVPacket *pkt, int quality, const int64_t error[], int error_count, enum AVPictureType pict_type)
Definition: encode.c:947
FF_CODEC_ENCODE_CB
#define FF_CODEC_ENCODE_CB(func)
Definition: codec_internal.h:359
AVRational::num
int num
Numerator.
Definition: rational.h:59
AV_PIX_FMT_YUV444P10
#define AV_PIX_FMT_YUV444P10
Definition: pixfmt.h:542
avassert.h
AVCodecContext::color_primaries
enum AVColorPrimaries color_primaries
Chromaticity coordinates of the source primaries.
Definition: avcodec.h:657
APV_CHROMA_FORMAT_400
@ APV_CHROMA_FORMAT_400
Definition: apv.h:47
AV_LOG_ERROR
#define AV_LOG_ERROR
Something went wrong and cannot losslessly be recovered.
Definition: log.h:210
av_cold
#define av_cold
Definition: attributes.h:119
AV_PROFILE_UNKNOWN
#define AV_PROFILE_UNKNOWN
Definition: defs.h:65
ApvEncContext::ifrms
oapv_frms_t ifrms
Definition: liboapvenc.c:60
intreadwrite.h
liboapve_defaults
static const FFCodecDefault liboapve_defaults[]
Definition: liboapvenc.c:605
pix_fmt
static enum AVPixelFormat pix_fmt
Definition: demux_decode.c:41
AVDictionaryEntry::key
char * key
Definition: dict.h:91
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:109
MAX_BS_BUF
#define MAX_BS_BUF
Definition: liboapvenc.c:43
av_assert0
#define av_assert0(cond)
assert() equivalent, that is always enabled.
Definition: avassert.h:42
AV_PIX_FMT_YUVA444P12
#define AV_PIX_FMT_YUVA444P12
Definition: pixfmt.h:594
liboapve_init
static av_cold int liboapve_init(AVCodecContext *avctx)
Initialize APV codec Create an encoder instance and allocate all the needed resources.
Definition: liboapvenc.c:404
AVCodecContext::rc_max_rate
int64_t rc_max_rate
maximum bitrate
Definition: avcodec.h:1288
av_mallocz
#define av_mallocz(s)
Definition: tableprint_vlc.h:31
AVCOL_PRI_UNSPECIFIED
@ AVCOL_PRI_UNSPECIFIED
Definition: pixfmt.h:639
AV_PIX_FMT_GRAY10
#define AV_PIX_FMT_GRAY10
Definition: pixfmt.h:519
LIBAVUTIL_VERSION_INT
#define LIBAVUTIL_VERSION_INT
Definition: version.h:85
AVClass
Describe the class of an AVClass context structure.
Definition: log.h:76
NULL
#define NULL
Definition: coverity.c:32
AVCodecContext::color_range
enum AVColorRange color_range
MPEG vs JPEG YUV range.
Definition: avcodec.h:681
apv_imgb_addref
static int apv_imgb_addref(oapv_imgb_t *imgb)
Definition: liboapvenc.c:81
AVCodecContext::bit_rate
int64_t bit_rate
the average bitrate
Definition: avcodec.h:493
AV_OPT_TYPE_DICT
@ AV_OPT_TYPE_DICT
Underlying C type is AVDictionary*.
Definition: opt.h:290
apv.h
av_default_item_name
const char * av_default_item_name(void *ptr)
Return the context name.
Definition: log.c:242
AV_PICTURE_TYPE_I
@ AV_PICTURE_TYPE_I
Intra.
Definition: avutil.h:278
profiles.h
liboapve_close
static av_cold int liboapve_close(AVCodecContext *avctx)
Destroy the encoder and release all the allocated resources.
Definition: liboapvenc.c:541
AV_PIX_FMT_YUV422P10
#define AV_PIX_FMT_YUV422P10
Definition: pixfmt.h:540
apv_imgb_create
static oapv_imgb_t * apv_imgb_create(AVCodecContext *avctx)
Definition: liboapvenc.c:245
AVCOL_RANGE_UNSPECIFIED
@ AVCOL_RANGE_UNSPECIFIED
Definition: pixfmt.h:743
apv_imgb_getref
static int apv_imgb_getref(oapv_imgb_t *imgb)
Definition: liboapvenc.c:87
ApvEncContext::oapv_params
AVDictionary * oapv_params
Definition: liboapvenc.c:66
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:547
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
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:94
codec_internal.h
i
#define i(width, name, range_min, range_max)
Definition: cbs_h264.c:63
AV_PIX_FMT_YUV422P12
#define AV_PIX_FMT_YUV422P12
Definition: pixfmt.h:544
AV_PROFILE_APV_4444_12
#define AV_PROFILE_APV_4444_12
Definition: defs.h:205
size
int size
Definition: twinvq_data.h:10344
VE
#define VE
Definition: liboapvenc.c:571
AV_RB32
uint64_t_TMPL AV_WL64 unsigned int_TMPL AV_WL32 unsigned int_TMPL AV_WL24 unsigned int_TMPL AV_WL16 uint64_t_TMPL AV_WB64 unsigned int_TMPL AV_RB32
Definition: bytestream.h:96
AV_PIX_FMT_YUV444P12
#define AV_PIX_FMT_YUV444P12
Definition: pixfmt.h:546
supported_pixel_formats
static enum AVPixelFormat supported_pixel_formats[]
Definition: liboapvenc.c:573
AVPacket::dts
int64_t dts
Decompression timestamp in AVStream->time_base units; the time at which the packet is decompressed.
Definition: packet.h:594
OFFSET
#define OFFSET(x)
Definition: liboapvenc.c:570
FRM_IDX
#define FRM_IDX
Definition: liboapvenc.c:45
AV_PIX_FMT_YUVA444P10
#define AV_PIX_FMT_YUVA444P10
Definition: pixfmt.h:592
AVERROR_EXTERNAL
#define AVERROR_EXTERNAL
Generic error in an external library.
Definition: error.h:59
AVPacket::flags
int flags
A combination of AV_PKT_FLAG values.
Definition: packet.h:601
AV_PROFILE_APV_400_10
#define AV_PROFILE_APV_400_10
Definition: defs.h:206
liboapve_encode
static int liboapve_encode(AVCodecContext *avctx, AVPacket *avpkt, const AVFrame *frame, int *got_packet)
Encode raw data frame into APV packet.
Definition: liboapvenc.c:478
MAX_NUM_FRMS
#define MAX_NUM_FRMS
Definition: liboapvenc.c:44
av_malloc
#define av_malloc(s)
Definition: ops_asmgen.c:44
AVPacket::pts
int64_t pts
Presentation timestamp in AVStream->time_base units; the time at which the decompressed packet will b...
Definition: packet.h:588
av_get_profile_name
const char * av_get_profile_name(const AVCodec *codec, int profile)
Return a name for the specified profile, if available.
Definition: utils.c:426
AV_PROFILE_APV_422_10
#define AV_PROFILE_APV_422_10
Definition: defs.h:200
ApvEncContext::preset_id
int preset_id
Definition: liboapvenc.c:62
AV_PROFILE_APV_4444_10
#define AV_PROFILE_APV_4444_10
Definition: defs.h:204
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
AVCodec::name
const char * name
Name of the codec implementation.
Definition: codec.h:179
profile
int profile
Definition: mxfenc.c:2299
AVCOL_SPC_UNSPECIFIED
@ AVCOL_SPC_UNSPECIFIED
Definition: pixfmt.h:703
AVCodecContext::height
int height
Definition: avcodec.h:604
AVCodecContext::pix_fmt
enum AVPixelFormat pix_fmt
Pixel format, see AV_PIX_FMT_xxx.
Definition: avcodec.h:643
AVCOL_RANGE_MPEG
@ AVCOL_RANGE_MPEG
Narrow or limited range content.
Definition: pixfmt.h:760
avcodec.h
ff_liboapv_encoder
const FFCodec ff_liboapv_encoder
Definition: liboapvenc.c:610
ret
ret
Definition: filter_design.txt:187
AV_CODEC_ID_APV
@ AV_CODEC_ID_APV
Definition: codec_id.h:332
pixfmt.h
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:81
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:265
AVCodecContext
main external API structure.
Definition: avcodec.h:443
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:105
AVRational::den
int den
Denominator.
Definition: rational.h:60
AV_PIX_FMT_NONE
@ AV_PIX_FMT_NONE
Definition: pixfmt.h:72
AV_OPT_TYPE_INT
@ AV_OPT_TYPE_INT
Underlying C type is int.
Definition: opt.h:259
AVCodecContext::profile
int profile
profile
Definition: avcodec.h:1636
APV_CHROMA_FORMAT_444
@ APV_CHROMA_FORMAT_444
Definition: apv.h:49
AV_PROFILE_APV_444_12
#define AV_PROFILE_APV_444_12
Definition: defs.h:203
Windows::Graphics::DirectX::Direct3D11::p
IDirect3DDxgiInterfaceAccess _COM_Outptr_ void ** p
Definition: vsrc_gfxcapture_winrt.hpp:53
desc
const char * desc
Definition: libsvtav1.c:83
AVMEDIA_TYPE_VIDEO
@ AVMEDIA_TYPE_VIDEO
Definition: avutil.h:200
mem.h
FF_CODEC_CAP_AUTO_THREADS
#define FF_CODEC_CAP_AUTO_THREADS
Codec handles avctx->thread_count == 0 (auto) internally.
Definition: codec_internal.h:73
AVPixFmtDescriptor
Descriptor that unambiguously describes how the bits of a pixel are stored in the up to 4 data planes...
Definition: pixdesc.h:69
get_chroma_format_idc
static int get_chroma_format_idc(enum AVPixelFormat pix_fmt)
Definition: liboapvenc.c:130
av_free
#define av_free(p)
Definition: tableprint_vlc.h:34
AVDictionaryEntry
Definition: dict.h:90
FFALIGN
#define FFALIGN(x, a)
Definition: macros.h:78
AVPacket
This structure stores compressed data.
Definition: packet.h:572
AVCodecContext::priv_data
void * priv_data
Definition: avcodec.h:470
av_freep
#define av_freep(p)
Definition: tableprint_vlc.h:35
AVCodecContext::width
int width
picture width / height.
Definition: avcodec.h:604
imgutils.h
AV_PROFILE_APV_422_12
#define AV_PROFILE_APV_422_12
Definition: defs.h:201
av_log
#define av_log(a,...)
Definition: tableprint_vlc.h:27
AVDictionaryEntry::value
char * value
Definition: dict.h:92
FF_QP2LAMBDA
#define FF_QP2LAMBDA
factor to convert from H.263 QP to lambda
Definition: avutil.h:226
av_image_copy
void av_image_copy(uint8_t *const dst_data[4], const int dst_linesizes[4], const uint8_t *const src_data[4], const int src_linesizes[4], enum AVPixelFormat pix_fmt, int width, int height)
Copy image in src_data to dst_data.
Definition: imgutils.c:422
get_conf
static int get_conf(AVCodecContext *avctx, oapve_cdesc_t *cdsc)
Populate the liboapv configuration from AVCodecContext and encoder options.
Definition: liboapvenc.c:308
AV_OPT_TYPE_CONST
@ AV_OPT_TYPE_CONST
Special option type for declaring named constants.
Definition: opt.h:299
ApvEncContext::mid
oapvm_t mid
Definition: liboapvenc.c:55
profile_is_compatible
static int profile_is_compatible(enum AVPixelFormat pix_fmt, int profile)
Definition: liboapvenc.c:190
av_dict_iterate
const AVDictionaryEntry * av_dict_iterate(const AVDictionary *m, const AVDictionaryEntry *prev)
Iterate over a dictionary.
Definition: dict.c:42
APV_CHROMA_FORMAT_4444
@ APV_CHROMA_FORMAT_4444
Definition: apv.h:50
av_get_pix_fmt_name
const char * av_get_pix_fmt_name(enum AVPixelFormat pix_fmt)
Return the short name for a pixel format, NULL in case pix_fmt is unknown.
Definition: pixdesc.c:3376