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 "packet_internal.h"
42 #include "profiles.h"
43 
44 #define MAX_BS_BUF (128 * 1024 * 1024)
45 #define MAX_NUM_FRMS (1) // supports only 1-frame in an access unit
46 #define FRM_IDX (0) // supports only 1-frame in an access unit
47 #define MAX_NUM_CC (OAPV_MAX_CC) // Max number of color componets (upto 4:4:4:4)
48 
49 /**
50  * The structure stores all the states associated with the instance of APV encoder
51  */
52 typedef struct ApvEncContext {
53  const AVClass *class;
54 
55  oapve_t id; // APV instance identifier
56  oapvm_t mid;
57  oapve_cdesc_t cdsc; // coding parameters i.e profile, width & height of input frame, num of therads, frame rate ...
58  oapv_bitb_t bitb; // bitstream buffer (output)
59  oapve_stat_t stat; // encoding status (output)
60 
61  oapv_frms_t ifrms; // frames for input
62 
63  int num_frames; // number of frames in an access unit
64 
65  int preset_id; // preset of apv ( fastest, fast, medium, slow, placebo)
66 
67  int qp; // quantization parameter (QP) [0,63]
68 
71 
72 static int apv_imgb_release(oapv_imgb_t *imgb)
73 {
74  int refcnt = --imgb->refcnt;
75  if (refcnt == 0) {
76  for (int i = 0; i < imgb->np; i++)
77  av_freep(&imgb->baddr[i]);
78  av_free(imgb);
79  }
80 
81  return refcnt;
82 }
83 
84 static int apv_imgb_addref(oapv_imgb_t * imgb)
85 {
86  int refcnt = ++imgb->refcnt;
87  return refcnt;
88 }
89 
90 static int apv_imgb_getref(oapv_imgb_t * imgb)
91 {
92  return imgb->refcnt;
93 }
94 
95 /**
96  * Convert FFmpeg pixel format (AVPixelFormat) into APV pre-defined color format
97  *
98  * @return APV pre-defined color format (@see oapv.h) on success, OAPV_CF_UNKNOWN on failure
99  */
100 static inline int get_color_format(enum AVPixelFormat pix_fmt)
101 {
102  int cf = OAPV_CF_UNKNOWN;
103 
104  switch (pix_fmt) {
105  case AV_PIX_FMT_GRAY10:
106  cf = OAPV_CF_YCBCR400;
107  break;
109  cf = OAPV_CF_YCBCR422;
110  break;
112  cf = OAPV_CF_YCBCR422;
113  break;
115  cf = OAPV_CF_YCBCR444;
116  break;
118  cf = OAPV_CF_YCBCR444;
119  break;
121  cf = OAPV_CF_YCBCR4444;
122  break;
124  cf = OAPV_CF_YCBCR4444;
125  break;
126  default:
127  av_assert0(cf != OAPV_CF_UNKNOWN);
128  }
129 
130  return cf;
131 }
132 
133 static oapv_imgb_t *apv_imgb_create(AVCodecContext *avctx)
134 {
136  oapv_imgb_t *imgb;
137  int input_depth;
138  int cfmt; // color format
139  int cs;
140 
141  av_assert0(desc);
142 
143  imgb = av_mallocz(sizeof(oapv_imgb_t));
144  if (!imgb)
145  goto fail;
146 
147  input_depth = desc->comp[0].depth;
148  cfmt = get_color_format(avctx->pix_fmt);
149  cs = OAPV_CS_SET(cfmt, input_depth, AV_HAVE_BIGENDIAN);
150 
151  imgb->np = desc->nb_components;
152 
153  for (int i = 0; i < imgb->np; i++) {
154  imgb->w[i] = avctx->width >> ((i == 1 || i == 2) ? desc->log2_chroma_w : 0);
155  imgb->h[i] = avctx->height;
156  imgb->aw[i] = FFALIGN(imgb->w[i], OAPV_MB_W);
157  imgb->ah[i] = FFALIGN(imgb->h[i], OAPV_MB_H);
158  imgb->s[i] = imgb->aw[i] * OAPV_CS_GET_BYTE_DEPTH(cs);
159 
160  imgb->bsize[i] = imgb->e[i] = imgb->s[i] * imgb->ah[i];
161  imgb->a[i] = imgb->baddr[i] = av_mallocz(imgb->bsize[i]);
162  if (imgb->a[i] == NULL)
163  goto fail;
164  }
165 
166  imgb->cs = cs;
167  imgb->addref = apv_imgb_addref;
168  imgb->getref = apv_imgb_getref;
169  imgb->release = apv_imgb_release;
170  imgb->refcnt = 1;
171 
172  return imgb;
173 fail:
174  av_log(avctx, AV_LOG_ERROR, "cannot create image buffer\n");
175  if (imgb) {
176  for (int i = 0; i < imgb->np; i++)
177  av_freep(&imgb->a[i]);
178  av_freep(&imgb);
179  }
180  return NULL;
181 }
182 
183 /**
184  * The function returns a pointer to the object of the oapve_cdesc_t type.
185  * oapve_cdesc_t contains all encoder parameters that should be initialized before the encoder is used.
186  *
187  * The field values of the oapve_cdesc_t structure are populated based on:
188  * - the corresponding field values of the AvCodecConetxt structure,
189  * - the apv encoder specific option values,
190  *
191  * The order of processing input data and populating the apve_cdsc structure
192  * 1) first, the fields of the AVCodecContext structure corresponding to the provided input options are processed,
193  * (i.e -pix_fmt yuv422p -s:v 1920x1080 -r 30 -profile:v 0)
194  * 2) then apve-specific options added as AVOption to the apv AVCodec implementation
195  * (i.e -preset 0)
196  *
197  * Keep in mind that, there are options that can be set in different ways.
198  * In this case, please follow the above-mentioned order of processing.
199  * The most recent assignments overwrite the previous values.
200  *
201  * @param[in] avctx codec context (AVCodecContext)
202  * @param[out] cdsc contains all APV encoder encoder parameters that should be initialized before the encoder is use
203  *
204  * @return 0 on success, negative error code on failure
205  */
206 static int get_conf(AVCodecContext *avctx, oapve_cdesc_t *cdsc)
207 {
208  ApvEncContext *apv = avctx->priv_data;
209 
210  /* initialize apv_param struct with default values */
211  int ret = oapve_param_default(&cdsc->param[FRM_IDX]);
212  if (OAPV_FAILED(ret)) {
213  av_log(avctx, AV_LOG_ERROR, "Cannot set default parameter\n");
214  return AVERROR_EXTERNAL;
215  }
216 
217  /* read options from AVCodecContext */
218  if (avctx->width > 0)
219  cdsc->param[FRM_IDX].w = avctx->width;
220 
221  if (avctx->height > 0)
222  cdsc->param[FRM_IDX].h = avctx->height;
223 
224  if (avctx->framerate.num > 0) {
225  cdsc->param[FRM_IDX].fps_num = avctx->framerate.num;
226  cdsc->param[FRM_IDX].fps_den = avctx->framerate.den;
227  } else if (avctx->time_base.num > 0) {
228  cdsc->param[FRM_IDX].fps_num = avctx->time_base.den;
229  cdsc->param[FRM_IDX].fps_den = avctx->time_base.num;
230  }
231 
232  cdsc->param[FRM_IDX].preset = apv->preset_id;
233  cdsc->param[FRM_IDX].qp = apv->qp;
234  if (avctx->bit_rate / 1000 > INT_MAX || avctx->rc_max_rate / 1000 > INT_MAX) {
235  av_log(avctx, AV_LOG_ERROR, "bit_rate and rc_max_rate > %d000 is not supported\n", INT_MAX);
236  return AVERROR(EINVAL);
237  }
238  cdsc->param[FRM_IDX].bitrate = (int)(avctx->bit_rate / 1000);
239  if (cdsc->param[FRM_IDX].bitrate) {
240  if (cdsc->param[FRM_IDX].qp) {
241  av_log(avctx, AV_LOG_WARNING, "You cannot set both the bitrate and the QP parameter at the same time.\n"
242  "If the bitrate is set, the rate control type is set to ABR, which means that the QP value is ignored.\n");
243  }
244  cdsc->param[FRM_IDX].rc_type = OAPV_RC_ABR;
245  }
246 
247  cdsc->threads = avctx->thread_count;
248 
249  if (avctx->color_primaries != AVCOL_PRI_UNSPECIFIED) {
250  cdsc->param[FRM_IDX].color_primaries = avctx->color_primaries;
251  cdsc->param[FRM_IDX].color_description_present_flag = 1;
252  }
253 
254  if (avctx->color_trc != AVCOL_TRC_UNSPECIFIED) {
255  cdsc->param[FRM_IDX].transfer_characteristics = avctx->color_trc;
256  cdsc->param[FRM_IDX].color_description_present_flag = 1;
257  }
258 
259  if (avctx->colorspace != AVCOL_SPC_UNSPECIFIED) {
260  cdsc->param[FRM_IDX].matrix_coefficients = avctx->colorspace;
261  cdsc->param[FRM_IDX].color_description_present_flag = 1;
262  }
263 
264  if (avctx->color_range != AVCOL_RANGE_UNSPECIFIED) {
265  cdsc->param[FRM_IDX].full_range_flag = (avctx->color_range == AVCOL_RANGE_JPEG);
266  cdsc->param[FRM_IDX].color_description_present_flag = 1;
267  }
268 
269  cdsc->max_bs_buf_size = MAX_BS_BUF; /* maximum bitstream buffer size */
270  cdsc->max_num_frms = MAX_NUM_FRMS;
271 
272  const AVDictionaryEntry *en = NULL;
273  while (en = av_dict_iterate(apv->oapv_params, en)) {
274  ret = oapve_param_parse(&cdsc->param[FRM_IDX], en->key, en->value);
275  if (ret < 0)
276  av_log(avctx, AV_LOG_WARNING, "Error parsing option '%s = %s'.\n", en->key, en->value);
277  }
278 
279  return 0;
280 }
281 
282 /**
283  * @brief Initialize APV codec
284  * Create an encoder instance and allocate all the needed resources
285  *
286  * @param avctx codec context
287  * @return 0 on success, negative error code on failure
288  */
290 {
291  ApvEncContext *apv = avctx->priv_data;
292  oapve_cdesc_t *cdsc = &apv->cdsc;
293  unsigned char *bs_buf;
294  int ret;
295 
296  /* allocate bitstream buffer */
297  bs_buf = (unsigned char *)av_malloc(MAX_BS_BUF);
298  if (bs_buf == NULL) {
299  av_log(avctx, AV_LOG_ERROR, "Cannot allocate bitstream buffer, size=%d\n", MAX_BS_BUF);
300  return AVERROR(ENOMEM);
301  }
302  apv->bitb.addr = bs_buf;
303  apv->bitb.bsize = MAX_BS_BUF;
304 
305  /* read configurations and set values for created descriptor (APV_CDSC) */
306  ret = get_conf(avctx, cdsc);
307  if (ret < 0) {
308  av_log(avctx, AV_LOG_ERROR, "Cannot get OAPV configuration\n");
309  return ret;
310  }
311 
312  /* create encoder */
313  apv->id = oapve_create(cdsc, &ret);
314  if (apv->id == NULL) {
315  av_log(avctx, AV_LOG_ERROR, "Cannot create OAPV encoder\n");
316  if (ret == OAPV_ERR_INVALID_LEVEL)
317  av_log(avctx, AV_LOG_ERROR, "Invalid level idc: %d\n", cdsc->param[0].level_idc);
318  return AVERROR_EXTERNAL;
319  }
320 
321  /* create metadata handler */
322  apv->mid = oapvm_create(&ret);
323  if (apv->mid == NULL || OAPV_FAILED(ret)) {
324  av_log(avctx, AV_LOG_ERROR, "cannot create OAPV metadata handler\n");
325  return AVERROR_EXTERNAL;
326  }
327 
328  int value = OAPV_CFG_VAL_AU_BS_FMT_NONE;
329  int size = 4;
330  ret = oapve_config(apv->id, OAPV_CFG_SET_AU_BS_FMT, &value, &size);
331  if (OAPV_FAILED(ret)) {
332  av_log(avctx, AV_LOG_ERROR, "Failed to set config for using encoder output format\n");
333  return AVERROR_EXTERNAL;
334  }
335 
336  apv->ifrms.frm[FRM_IDX].imgb = apv_imgb_create(avctx);
337  if (apv->ifrms.frm[FRM_IDX].imgb == NULL)
338  return AVERROR(ENOMEM);
339  apv->ifrms.num_frms++;
340 
341  /* color description values */
342  if (cdsc->param[FRM_IDX].color_description_present_flag) {
343  avctx->color_primaries = cdsc->param[FRM_IDX].color_primaries;
344  avctx->color_trc = cdsc->param[FRM_IDX].transfer_characteristics;
345  avctx->colorspace = cdsc->param[FRM_IDX].matrix_coefficients;
346  avctx->color_range = (cdsc->param[FRM_IDX].full_range_flag) ? AVCOL_RANGE_JPEG : AVCOL_RANGE_MPEG;
347  }
348 
349  return 0;
350 }
351 
352 /**
353  * Encode raw data frame into APV packet
354  *
355  * @param[in] avctx codec context
356  * @param[out] avpkt output AVPacket containing encoded data
357  * @param[in] frame AVFrame containing the raw data to be encoded
358  * @param[out] got_packet encoder sets to 0 or 1 to indicate that a
359  * non-empty packet was returned in pkt
360  *
361  * @return 0 on success, negative error code on failure
362  */
363 static int liboapve_encode(AVCodecContext *avctx, AVPacket *avpkt,
364  const AVFrame *frame, int *got_packet)
365 {
366  ApvEncContext *apv = avctx->priv_data;
367  const oapve_cdesc_t *cdsc = &apv->cdsc;
368  oapv_frm_t *frm = &apv->ifrms.frm[FRM_IDX];
369  oapv_imgb_t *imgb = frm->imgb;
370  int ret;
371 
372  if (avctx->width != frame->width || avctx->height != frame->height || avctx->pix_fmt != frame->format) {
373  av_log(avctx, AV_LOG_ERROR, "Dimension changes are not supported\n");
374  return AVERROR(EINVAL);
375  }
376 
377  av_image_copy((uint8_t **)imgb->a, imgb->s, (const uint8_t **)frame->data, frame->linesize,
378  frame->format, frame->width, frame->height);
379 
380  imgb->ts[0] = frame->pts;
381 
382  frm->group_id = 1; // @todo FIX-ME : need to set properly in case of multi-frame
383  frm->pbu_type = OAPV_PBU_TYPE_PRIMARY_FRAME;
384 
385  ret = oapve_encode(apv->id, &apv->ifrms, apv->mid, &apv->bitb, &apv->stat, NULL);
386  if (OAPV_FAILED(ret)) {
387  av_log(avctx, AV_LOG_ERROR, "oapve_encode() failed\n");
388  return AVERROR_EXTERNAL;
389  }
390 
391  /* store bitstream */
392  if (OAPV_SUCCEEDED(ret) && apv->stat.write > 0) {
393  uint8_t *data = apv->bitb.addr;
394  int size = apv->stat.write;
395 
396  // The encoder may return a "Raw bitstream" formated AU, including au_size.
397  // Discard it as we only need the access_unit() structure.
398  if (size > 4 && AV_RB32(data) != APV_SIGNATURE) {
399  data += 4;
400  size -= 4;
401  }
402 
403  ret = ff_get_encode_buffer(avctx, avpkt, size, 0);
404  if (ret < 0)
405  return ret;
406 
407  memcpy(avpkt->data, data, size);
408  avpkt->pts = avpkt->dts = frame->pts;
409  avpkt->flags |= AV_PKT_FLAG_KEY;
410 
411  if (cdsc->param[FRM_IDX].qp)
413 
414  *got_packet = 1;
415  }
416 
417  return 0;
418 }
419 
420 /**
421  * Destroy the encoder and release all the allocated resources
422  *
423  * @param avctx codec context
424  * @return 0 on success, negative error code on failure
425  */
427 {
428  ApvEncContext *apv = avctx->priv_data;
429 
430  for (int i = 0; i < apv->num_frames; i++) {
431  if (apv->ifrms.frm[i].imgb != NULL)
432  apv->ifrms.frm[i].imgb->release(apv->ifrms.frm[i].imgb);
433  apv->ifrms.frm[i].imgb = NULL;
434  }
435 
436  if (apv->mid) {
437  oapvm_rem_all(apv->mid);
438  }
439 
440  if (apv->id) {
441  oapve_delete(apv->id);
442  apv->id = NULL;
443  }
444 
445  if (apv->mid) {
446  oapvm_delete(apv->mid);
447  apv->mid = NULL;
448  }
449 
450  av_freep(&apv->bitb.addr); /* release bitstream buffer */
451 
452  return 0;
453 }
454 
455 #define OFFSET(x) offsetof(ApvEncContext, x)
456 #define VE AV_OPT_FLAG_VIDEO_PARAM | AV_OPT_FLAG_ENCODING_PARAM
457 
458 static const enum AVPixelFormat supported_pixel_formats[] = {
467 };
468 
469 static const AVOption liboapv_options[] = {
470  { "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" },
471  { "fastest", NULL, 0, AV_OPT_TYPE_CONST, { .i64 = OAPV_PRESET_FASTEST }, INT_MIN, INT_MAX, VE, .unit = "preset" },
472  { "fast", NULL, 0, AV_OPT_TYPE_CONST, { .i64 = OAPV_PRESET_FAST }, INT_MIN, INT_MAX, VE, .unit = "preset" },
473  { "medium", NULL, 0, AV_OPT_TYPE_CONST, { .i64 = OAPV_PRESET_MEDIUM }, INT_MIN, INT_MAX, VE, .unit = "preset" },
474  { "slow", NULL, 0, AV_OPT_TYPE_CONST, { .i64 = OAPV_PRESET_SLOW }, INT_MIN, INT_MAX, VE, .unit = "preset" },
475  { "placebo", NULL, 0, AV_OPT_TYPE_CONST, { .i64 = OAPV_PRESET_PLACEBO }, INT_MIN, INT_MAX, VE, .unit = "preset" },
476  { "default", NULL, 0, AV_OPT_TYPE_CONST, { .i64 = OAPV_PRESET_DEFAULT }, INT_MIN, INT_MAX, VE, .unit = "preset" },
477 
478  { "qp", "Quantization parameter value for CQP rate control mode", OFFSET(qp), AV_OPT_TYPE_INT, { .i64 = 32 }, 0, 63, VE },
479  { "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 },
480  { NULL }
481 };
482 
483 static const AVClass liboapve_class = {
484  .class_name = "liboapv",
485  .item_name = av_default_item_name,
486  .option = liboapv_options,
487  .version = LIBAVUTIL_VERSION_INT,
488 };
489 
491  { "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)
492  { NULL },
493 };
494 
496  .p.name = "liboapv",
497  .p.long_name = NULL_IF_CONFIG_SMALL("liboapv APV"),
498  .p.type = AVMEDIA_TYPE_VIDEO,
499  .p.id = AV_CODEC_ID_APV,
500  .init = liboapve_init,
502  .close = liboapve_close,
503  .priv_data_size = sizeof(ApvEncContext),
504  .p.priv_class = &liboapve_class,
505  .defaults = liboapve_defaults,
506  .p.capabilities = AV_CODEC_CAP_OTHER_THREADS | AV_CODEC_CAP_DR1,
507  .p.wrapper_name = "liboapv",
508  .p.pix_fmts = supported_pixel_formats,
509  .p.profiles = NULL_IF_CONFIG_SMALL(ff_apv_profiles),
511 };
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:100
liboapv_options
static const AVOption liboapv_options[]
Definition: liboapvenc.c:469
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:42
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:659
ApvEncContext::stat
oapve_stat_t stat
Definition: liboapvenc.c:59
ApvEncContext
The structure stores all the states associated with the instance of APV encoder.
Definition: liboapvenc.c:52
av_pix_fmt_desc_get
const AVPixFmtDescriptor * av_pix_fmt_desc_get(enum AVPixelFormat pix_fmt)
Definition: pixdesc.c:3441
AVFrame
This structure describes decoded (raw) audio or video data.
Definition: frame.h:421
pixdesc.h
AVCodecContext::color_trc
enum AVColorTransferCharacteristic color_trc
Color Transfer Characteristic.
Definition: avcodec.h:652
AVCOL_RANGE_JPEG
@ AVCOL_RANGE_JPEG
Full range content.
Definition: pixfmt.h:767
AVPacket::data
uint8_t * data
Definition: packet.h:552
AVOption
AVOption.
Definition: opt.h:429
encode.h
AVCOL_TRC_UNSPECIFIED
@ AVCOL_TRC_UNSPECIFIED
Definition: pixfmt.h:664
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:34
FFCodec
Definition: codec_internal.h:127
ApvEncContext::qp
int qp
Definition: liboapvenc.c:67
AVDictionary
Definition: dict.c:32
APV_SIGNATURE
#define APV_SIGNATURE
Definition: apv.h:23
ApvEncContext::cdsc
oapve_cdesc_t cdsc
Definition: liboapvenc.c:57
AV_PKT_FLAG_KEY
#define AV_PKT_FLAG_KEY
The packet contains a keyframe.
Definition: packet.h:607
ApvEncContext::bitb
oapv_bitb_t bitb
Definition: liboapvenc.c:58
av_malloc
#define av_malloc(s)
Definition: tableprint_vlc.h:31
liboapve_class
static const AVClass liboapve_class
Definition: liboapvenc.c:483
AVCodecContext::framerate
AVRational framerate
Definition: avcodec.h:551
ApvEncContext::num_frames
int num_frames
Definition: liboapvenc.c:63
apv_imgb_release
static int apv_imgb_release(oapv_imgb_t *imgb)
Definition: liboapvenc.c:72
ff_apv_profiles
const AVProfile ff_apv_profiles[]
Definition: profiles.c:206
FFCodecDefault
Definition: codec_internal.h:96
FFCodec::p
AVCodec p
The public AVCodec.
Definition: codec_internal.h:131
ApvEncContext::id
oapve_t id
Definition: liboapvenc.c:55
fail
#define fail()
Definition: checkasm.h:199
AVCodecContext::thread_count
int thread_count
thread count is used to decide how many independent tasks should be passed to execute()
Definition: avcodec.h:1561
FF_CODEC_ENCODE_CB
#define FF_CODEC_ENCODE_CB(func)
Definition: codec_internal.h:353
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:645
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:90
ApvEncContext::ifrms
oapv_frms_t ifrms
Definition: liboapvenc.c:61
intreadwrite.h
liboapve_defaults
static const FFCodecDefault liboapve_defaults[]
Definition: liboapvenc.c:490
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:44
av_assert0
#define av_assert0(cond)
assert() equivalent, that is always enabled.
Definition: avassert.h:41
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:289
AVCodecContext::rc_max_rate
int64_t rc_max_rate
maximum bitrate
Definition: avcodec.h:1270
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:669
apv_imgb_addref
static int apv_imgb_addref(oapv_imgb_t *imgb)
Definition: liboapvenc.c:84
AVCodecContext::bit_rate
int64_t bit_rate
the average bitrate
Definition: avcodec.h:481
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:240
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:426
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:133
AVCOL_RANGE_UNSPECIFIED
@ AVCOL_RANGE_UNSPECIFIED
Definition: pixfmt.h:733
apv_imgb_getref
static int apv_imgb_getref(oapv_imgb_t *imgb)
Definition: liboapvenc.c:90
ApvEncContext::oapv_params
AVDictionary * oapv_params
Definition: liboapvenc.c:69
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:535
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
AV_PIX_FMT_YUV422P12
#define AV_PIX_FMT_YUV422P12
Definition: pixfmt.h:544
size
int size
Definition: twinvq_data.h:10344
VE
#define VE
Definition: liboapvenc.c:456
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:458
AVPacket::dts
int64_t dts
Decompression timestamp in AVStream->time_base units; the time at which the packet is decompressed.
Definition: packet.h:551
OFFSET
#define OFFSET(x)
Definition: liboapvenc.c:455
FRM_IDX
#define FRM_IDX
Definition: liboapvenc.c:46
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:558
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:363
MAX_NUM_FRMS
#define MAX_NUM_FRMS
Definition: liboapvenc.c:45
i
#define i(width, name, range_min, range_max)
Definition: cbs_h2645.c:256
AVPacket::pts
int64_t pts
Presentation timestamp in AVStream->time_base units; the time at which the decompressed packet will b...
Definition: packet.h:545
ApvEncContext::preset_id
int preset_id
Definition: liboapvenc.c:65
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
av_mallocz
void * av_mallocz(size_t size)
Allocate a memory block with alignment suitable for all memory accesses (including vectors if availab...
Definition: mem.c:256
AVCodec::name
const char * name
Name of the codec implementation.
Definition: codec.h:179
AVCOL_SPC_UNSPECIFIED
@ AVCOL_SPC_UNSPECIFIED
Definition: pixfmt.h:693
AVCodecContext::height
int height
Definition: avcodec.h:592
AVCodecContext::pix_fmt
enum AVPixelFormat pix_fmt
Pixel format, see AV_PIX_FMT_xxx.
Definition: avcodec.h:631
AVCOL_RANGE_MPEG
@ AVCOL_RANGE_MPEG
Narrow or limited range content.
Definition: pixfmt.h:750
avcodec.h
ff_liboapv_encoder
const FFCodec ff_liboapv_encoder
Definition: liboapvenc.c:495
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:431
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:106
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
desc
const char * desc
Definition: libsvtav1.c:79
AVMEDIA_TYPE_VIDEO
@ AVMEDIA_TYPE_VIDEO
Definition: avutil.h:200
mem.h
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:72
AVPixFmtDescriptor
Descriptor that unambiguously describes how the bits of a pixel are stored in the up to 4 data planes...
Definition: pixdesc.h:69
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:529
AVCodecContext::priv_data
void * priv_data
Definition: avcodec.h:458
av_freep
#define av_freep(p)
Definition: tableprint_vlc.h:35
AVCodecContext::width
int width
picture width / height.
Definition: avcodec.h:592
imgutils.h
av_log
#define av_log(a,...)
Definition: tableprint_vlc.h:27
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: packet.c:612
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)
The function returns a pointer to the object of the oapve_cdesc_t type.
Definition: liboapvenc.c:206
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:56
av_dict_iterate
const AVDictionaryEntry * av_dict_iterate(const AVDictionary *m, const AVDictionaryEntry *prev)
Iterate over a dictionary.
Definition: dict.c:42