FFmpeg
libjxlenc.c
Go to the documentation of this file.
1 /*
2  * JPEG XL encoding support via libjxl
3  * Copyright (c) 2021 Leo Izen <leo.izen@gmail.com>
4  *
5  * This file is part of FFmpeg.
6  *
7  * FFmpeg is free software; you can redistribute it and/or
8  * modify it under the terms of the GNU Lesser General Public
9  * License as published by the Free Software Foundation; either
10  * version 2.1 of the License, or (at your option) any later version.
11  *
12  * FFmpeg is distributed in the hope that it will be useful,
13  * but WITHOUT ANY WARRANTY; without even the implied warranty of
14  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
15  * Lesser General Public License for more details.
16  *
17  * You should have received a copy of the GNU Lesser General Public
18  * License along with FFmpeg; if not, write to the Free Software
19  * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
20  */
21 
22 /**
23  * @file
24  * JPEG XL encoder using libjxl
25  */
26 
27 #include <string.h>
28 
29 #include "libavutil/avutil.h"
30 #include "libavutil/csp.h"
31 #include "libavutil/error.h"
32 #include "libavutil/frame.h"
33 #include "libavutil/libm.h"
34 #include "libavutil/mem.h"
35 #include "libavutil/opt.h"
36 #include "libavutil/pixdesc.h"
37 #include "libavutil/pixfmt.h"
38 #include "libavutil/version.h"
39 
40 #include "avcodec.h"
41 #include "encode.h"
42 #include "codec_internal.h"
43 
44 #include <jxl/encode.h>
45 #include <jxl/thread_parallel_runner.h>
46 #include "libjxl.h"
47 
48 typedef struct LibJxlEncodeContext {
49  AVClass *class;
50  void *runner;
51  JxlEncoder *encoder;
52  JxlEncoderFrameSettings *options;
53  int effort;
54  float distance;
55  int modular;
56  int xyb;
57  uint8_t *buffer;
58  size_t buffer_size;
59  JxlPixelFormat jxl_fmt;
60 
61  /* animation stuff */
66 
67 /**
68  * Map a quality setting for -qscale roughly from libjpeg
69  * quality numbers to libjxl's butteraugli distance for
70  * photographic content.
71  *
72  * Setting distance explicitly is preferred, but this will
73  * allow qscale to be used as a fallback.
74  *
75  * This function is continuous and injective on [0, 100] which
76  * makes it monotonic.
77  *
78  * @param quality 0.0 to 100.0 quality setting, libjpeg quality
79  * @return Butteraugli distance between 0.0 and 15.0
80  */
81 static float quality_to_distance(float quality)
82 {
83  if (quality >= 100.0)
84  return 0.0;
85  else if (quality >= 90.0)
86  return (100.0 - quality) * 0.10;
87  else if (quality >= 30.0)
88  return 0.1 + (100.0 - quality) * 0.09;
89  else if (quality > 0.0)
90  return 15.0 + (59.0 * quality - 4350.0) * quality / 9000.0;
91  else
92  return 15.0;
93 }
94 
95 /**
96  * Initalize the encoder on a per-file basis. All of these need to be set
97  * once each time the encoder is reset, which is each frame for still
98  * images, to make the image2 muxer work. For animation this is run once.
99  *
100  * @return 0 upon success, negative on failure.
101  */
103 {
105 
106  /* reset the encoder every frame for image2 muxer */
107  JxlEncoderReset(ctx->encoder);
108 
109  /* This needs to be set each time the encoder is reset */
110  if (JxlEncoderSetParallelRunner(ctx->encoder, JxlThreadParallelRunner, ctx->runner)
111  != JXL_ENC_SUCCESS) {
112  av_log(avctx, AV_LOG_ERROR, "Failed to set JxlThreadParallelRunner\n");
113  return AVERROR_EXTERNAL;
114  }
115 
116  ctx->options = JxlEncoderFrameSettingsCreate(ctx->encoder, NULL);
117  if (!ctx->options) {
118  av_log(avctx, AV_LOG_ERROR, "Failed to create JxlEncoderOptions\n");
119  return AVERROR_EXTERNAL;
120  }
121 
122  return 0;
123 }
124 
125 /**
126  * Global encoder initialization. This only needs to be run once,
127  * not every frame.
128  */
130 {
132  JxlMemoryManager manager;
133 
135  ctx->encoder = JxlEncoderCreate(&manager);
136  if (!ctx->encoder) {
137  av_log(avctx, AV_LOG_ERROR, "Failed to create JxlEncoder\n");
138  return AVERROR_EXTERNAL;
139  }
140 
141  ctx->runner = JxlThreadParallelRunnerCreate(&manager, ff_libjxl_get_threadcount(avctx->thread_count));
142  if (!ctx->runner) {
143  av_log(avctx, AV_LOG_ERROR, "Failed to create JxlThreadParallelRunner\n");
144  return AVERROR_EXTERNAL;
145  }
146 
147  ctx->buffer_size = 4096;
148  ctx->buffer = av_realloc(NULL, ctx->buffer_size);
149 
150  if (!ctx->buffer) {
151  av_log(avctx, AV_LOG_ERROR, "Could not allocate encoding buffer\n");
152  return AVERROR(ENOMEM);
153  }
154 
155  /* check for negative, our default */
156  if (ctx->distance < 0.0) {
157  /* use ffmpeg.c -q option if passed */
158  if (avctx->flags & AV_CODEC_FLAG_QSCALE)
159  ctx->distance = quality_to_distance((float)avctx->global_quality / FF_QP2LAMBDA);
160  else
161  /* default 1.0 matches cjxl */
162  ctx->distance = 1.0;
163  }
164  /*
165  * 0.01 is the minimum distance accepted for lossy
166  * interpreting any positive value less than this as minimum
167  */
168  if (ctx->distance > 0.0 && ctx->distance < 0.01)
169  ctx->distance = 0.01;
170 
171  return 0;
172 }
173 
174 /**
175  * Initializer for the animation encoder. This calls the other initializers
176  * to prevent code duplication and also allocates the prev-frame used in the
177  * encoder.
178  */
180 {
181  int ret;
183 
184  ret = libjxl_encode_init(avctx);
185  if (ret < 0)
186  return ret;
187 
188  ret = libjxl_init_jxl_encoder(avctx);
189  if (ret < 0)
190  return ret;
191 
192  ctx->frame = av_frame_alloc();
193  if (!ctx->frame)
194  return AVERROR(ENOMEM);
195 
196  return 0;
197 }
198 
199 /**
200  * Populate a JxlColorEncoding with the given enum AVColorPrimaries.
201  * @return < 0 upon failure, >= 0 upon success
202  */
203 static int libjxl_populate_primaries(void *avctx, JxlColorEncoding *jxl_color, enum AVColorPrimaries prm)
204 {
205  const AVColorPrimariesDesc *desc;
206 
207  switch (prm) {
208  case AVCOL_PRI_BT709:
209  jxl_color->primaries = JXL_PRIMARIES_SRGB;
210  jxl_color->white_point = JXL_WHITE_POINT_D65;
211  return 0;
212  case AVCOL_PRI_BT2020:
213  jxl_color->primaries = JXL_PRIMARIES_2100;
214  jxl_color->white_point = JXL_WHITE_POINT_D65;
215  return 0;
216  case AVCOL_PRI_SMPTE431:
217  jxl_color->primaries = JXL_PRIMARIES_P3;
218  jxl_color->white_point = JXL_WHITE_POINT_DCI;
219  return 0;
220  case AVCOL_PRI_SMPTE432:
221  jxl_color->primaries = JXL_PRIMARIES_P3;
222  jxl_color->white_point = JXL_WHITE_POINT_D65;
223  return 0;
225  av_log(avctx, AV_LOG_WARNING, "Unknown primaries, assuming BT.709/sRGB. Colors may be wrong.\n");
226  jxl_color->primaries = JXL_PRIMARIES_SRGB;
227  jxl_color->white_point = JXL_WHITE_POINT_D65;
228  return 0;
229  }
230 
232  if (!desc)
233  return AVERROR(EINVAL);
234 
235  jxl_color->primaries = JXL_PRIMARIES_CUSTOM;
236  jxl_color->white_point = JXL_WHITE_POINT_CUSTOM;
237 
238  jxl_color->primaries_red_xy[0] = av_q2d(desc->prim.r.x);
239  jxl_color->primaries_red_xy[1] = av_q2d(desc->prim.r.y);
240  jxl_color->primaries_green_xy[0] = av_q2d(desc->prim.g.x);
241  jxl_color->primaries_green_xy[1] = av_q2d(desc->prim.g.y);
242  jxl_color->primaries_blue_xy[0] = av_q2d(desc->prim.b.x);
243  jxl_color->primaries_blue_xy[1] = av_q2d(desc->prim.b.y);
244  jxl_color->white_point_xy[0] = av_q2d(desc->wp.x);
245  jxl_color->white_point_xy[1] = av_q2d(desc->wp.y);
246 
247  return 0;
248 }
249 
251  const AVPixFmtDescriptor *pix_desc, const JxlBasicInfo *info)
252 {
253  JxlColorEncoding jxl_color;
255  int ret;
256 
257  switch (frame->color_trc && frame->color_trc != AVCOL_TRC_UNSPECIFIED
258  ? frame->color_trc : avctx->color_trc) {
259  case AVCOL_TRC_BT709:
260  jxl_color.transfer_function = JXL_TRANSFER_FUNCTION_709;
261  break;
262  case AVCOL_TRC_LINEAR:
263  jxl_color.transfer_function = JXL_TRANSFER_FUNCTION_LINEAR;
264  break;
266  jxl_color.transfer_function = JXL_TRANSFER_FUNCTION_SRGB;
267  break;
268  case AVCOL_TRC_SMPTE428:
269  jxl_color.transfer_function = JXL_TRANSFER_FUNCTION_DCI;
270  break;
271  case AVCOL_TRC_SMPTE2084:
272  jxl_color.transfer_function = JXL_TRANSFER_FUNCTION_PQ;
273  break;
275  jxl_color.transfer_function = JXL_TRANSFER_FUNCTION_HLG;
276  break;
277  case AVCOL_TRC_GAMMA22:
278  jxl_color.transfer_function = JXL_TRANSFER_FUNCTION_GAMMA;
279  jxl_color.gamma = 1/2.2f;
280  break;
281  case AVCOL_TRC_GAMMA28:
282  jxl_color.transfer_function = JXL_TRANSFER_FUNCTION_GAMMA;
283  jxl_color.gamma = 1/2.8f;
284  break;
285  default:
286  if (pix_desc->flags & AV_PIX_FMT_FLAG_FLOAT) {
287  av_log(avctx, AV_LOG_WARNING,
288  "Unknown transfer function, assuming Linear Light. Colors may be wrong.\n");
289  jxl_color.transfer_function = JXL_TRANSFER_FUNCTION_LINEAR;
290  } else {
291  av_log(avctx, AV_LOG_WARNING,
292  "Unknown transfer function, assuming IEC61966-2-1/sRGB. Colors may be wrong.\n");
293  jxl_color.transfer_function = JXL_TRANSFER_FUNCTION_SRGB;
294  }
295  }
296 
297  jxl_color.rendering_intent = JXL_RENDERING_INTENT_RELATIVE;
298  if (info->num_color_channels == 1)
299  jxl_color.color_space = JXL_COLOR_SPACE_GRAY;
300  else
301  jxl_color.color_space = JXL_COLOR_SPACE_RGB;
302 
303  ret = libjxl_populate_primaries(avctx, &jxl_color,
304  frame->color_primaries && frame->color_primaries != AVCOL_PRI_UNSPECIFIED
305  ? frame->color_primaries : avctx->color_primaries);
306  if (ret < 0)
307  return ret;
308 
309  if (JxlEncoderSetColorEncoding(ctx->encoder, &jxl_color) != JXL_ENC_SUCCESS) {
310  av_log(avctx, AV_LOG_WARNING, "Failed to set JxlColorEncoding\n");
311  return AVERROR_EXTERNAL;
312  }
313 
314  return 0;
315 }
316 
317 /**
318  * Sends metadata to libjxl based on the first frame of the stream, such as pixel format,
319  * orientation, bit depth, and that sort of thing.
320  */
321 static int libjxl_preprocess_stream(AVCodecContext *avctx, const AVFrame *frame, int animated)
322 {
324  AVFrameSideData *sd;
325  const AVPixFmtDescriptor *pix_desc = av_pix_fmt_desc_get(frame->format);
326  JxlBasicInfo info;
327  JxlPixelFormat *jxl_fmt = &ctx->jxl_fmt;
328  int bits_per_sample;
329 #if JPEGXL_NUMERIC_VERSION >= JPEGXL_COMPUTE_NUMERIC_VERSION(0, 8, 0)
330  JxlBitDepth jxl_bit_depth;
331 #endif
332 
333  /* populate the basic info settings */
334  JxlEncoderInitBasicInfo(&info);
335  jxl_fmt->num_channels = pix_desc->nb_components;
336  info.xsize = frame->width;
337  info.ysize = frame->height;
338  info.num_extra_channels = (jxl_fmt->num_channels + 1) & 0x1;
339  info.num_color_channels = jxl_fmt->num_channels - info.num_extra_channels;
340  bits_per_sample = av_get_bits_per_pixel(pix_desc) / jxl_fmt->num_channels;
341  info.bits_per_sample = avctx->bits_per_raw_sample > 0 && !(pix_desc->flags & AV_PIX_FMT_FLAG_FLOAT)
342  ? avctx->bits_per_raw_sample : bits_per_sample;
343  info.alpha_bits = (info.num_extra_channels > 0) * info.bits_per_sample;
344  if (pix_desc->flags & AV_PIX_FMT_FLAG_FLOAT) {
345  info.exponent_bits_per_sample = info.bits_per_sample > 16 ? 8 : 5;
346  info.alpha_exponent_bits = info.alpha_bits ? info.exponent_bits_per_sample : 0;
347  jxl_fmt->data_type = info.bits_per_sample > 16 ? JXL_TYPE_FLOAT : JXL_TYPE_FLOAT16;
348  } else {
349  info.exponent_bits_per_sample = 0;
350  info.alpha_exponent_bits = 0;
351  jxl_fmt->data_type = info.bits_per_sample <= 8 ? JXL_TYPE_UINT8 : JXL_TYPE_UINT16;
352  }
353 
354 #if JPEGXL_NUMERIC_VERSION >= JPEGXL_COMPUTE_NUMERIC_VERSION(0, 8, 0)
355  jxl_bit_depth.bits_per_sample = bits_per_sample;
356  jxl_bit_depth.type = JXL_BIT_DEPTH_FROM_PIXEL_FORMAT;
357  jxl_bit_depth.exponent_bits_per_sample = pix_desc->flags & AV_PIX_FMT_FLAG_FLOAT ?
358  info.exponent_bits_per_sample : 0;
359 #endif
360 
361  /* JPEG XL format itself does not support limited range */
362  if (avctx->color_range == AVCOL_RANGE_MPEG ||
363  avctx->color_range == AVCOL_RANGE_UNSPECIFIED && frame->color_range == AVCOL_RANGE_MPEG)
364  av_log(avctx, AV_LOG_WARNING, "This encoder does not support limited (tv) range, colors will be wrong!\n");
365  else if (avctx->color_range != AVCOL_RANGE_JPEG && frame->color_range != AVCOL_RANGE_JPEG)
366  av_log(avctx, AV_LOG_WARNING, "Unknown color range, assuming full (pc)\n");
367 
368  /* bitexact lossless requires there to be no XYB transform */
369  info.uses_original_profile = ctx->distance == 0.0 || !ctx->xyb;
370 
371  /* libjxl doesn't support negative linesizes so we use orientation to work around this */
372  info.orientation = frame->linesize[0] >= 0 ? JXL_ORIENT_IDENTITY : JXL_ORIENT_FLIP_VERTICAL;
373 
374  if (animated) {
375  info.have_animation = 1;
376  info.animation.have_timecodes = 0;
377  info.animation.num_loops = 0;
378  /* avctx->timebase is in seconds per tick, so we take the reciprocol */
379  info.animation.tps_numerator = avctx->time_base.den;
380  info.animation.tps_denominator = avctx->time_base.num;
381  }
382 
383  if (JxlEncoderSetBasicInfo(ctx->encoder, &info) != JXL_ENC_SUCCESS) {
384  av_log(avctx, AV_LOG_ERROR, "Failed to set JxlBasicInfo\n");
385  return AVERROR_EXTERNAL;
386  }
387 
389  if (sd && sd->size && JxlEncoderSetICCProfile(ctx->encoder, sd->data, sd->size) != JXL_ENC_SUCCESS) {
390  av_log(avctx, AV_LOG_WARNING, "Could not set ICC Profile\n");
391  sd = NULL;
392  }
393 
394  if (!sd || !sd->size)
395  libjxl_populate_colorspace(avctx, frame, pix_desc, &info);
396 
397 #if JPEGXL_NUMERIC_VERSION >= JPEGXL_COMPUTE_NUMERIC_VERSION(0, 8, 0)
398  if (JxlEncoderSetFrameBitDepth(ctx->options, &jxl_bit_depth) != JXL_ENC_SUCCESS)
399  av_log(avctx, AV_LOG_WARNING, "Failed to set JxlBitDepth\n");
400 #endif
401 
402  /* depending on basic info, level 10 might
403  * be required instead of level 5 */
404  if (JxlEncoderGetRequiredCodestreamLevel(ctx->encoder) > 5) {
405  if (JxlEncoderSetCodestreamLevel(ctx->encoder, 10) != JXL_ENC_SUCCESS)
406  av_log(avctx, AV_LOG_WARNING, "Could not increase codestream level\n");
407  }
408 
409  return 0;
410 }
411 
412 /**
413  * Sends frame information to libjxl on a per-frame basis. If this is a still image,
414  * this is evaluated once per output file. If this is an animated JPEG XL encode, it
415  * is called once per frame.
416  *
417  * This returns a buffer to the data that should be passed to libjxl (via the
418  * argument **data). If the linesize is nonnegative, this will be frame->data[0],
419  * although if the linesize is negative, it will be the start of the buffer
420  * instead. *data is just a pointer to a location in frame->data so it should not be
421  * freed directly.
422  */
423 static int libjxl_preprocess_frame(AVCodecContext *avctx, const AVFrame *frame, const uint8_t **data)
424 {
426  JxlPixelFormat *jxl_fmt = &ctx->jxl_fmt;
427 
428  /* these shouldn't fail, libjxl bug notwithstanding */
429  if (JxlEncoderFrameSettingsSetOption(ctx->options, JXL_ENC_FRAME_SETTING_EFFORT, ctx->effort)
430  != JXL_ENC_SUCCESS) {
431  av_log(avctx, AV_LOG_ERROR, "Failed to set effort to: %d\n", ctx->effort);
432  return AVERROR_EXTERNAL;
433  }
434 
435  if (JxlEncoderSetFrameDistance(ctx->options, ctx->distance) != JXL_ENC_SUCCESS) {
436  av_log(avctx, AV_LOG_ERROR, "Failed to set distance: %f\n", ctx->distance);
437  return AVERROR_EXTERNAL;
438  }
439 
440  /*
441  * In theory the library should automatically enable modular if necessary,
442  * but it appears it won't at the moment due to a bug. This will still
443  * work even if that is patched.
444  */
445  if (JxlEncoderFrameSettingsSetOption(ctx->options, JXL_ENC_FRAME_SETTING_MODULAR,
446  ctx->modular || ctx->distance <= 0.0 ? 1 : -1) != JXL_ENC_SUCCESS) {
447  av_log(avctx, AV_LOG_ERROR, "Failed to set modular\n");
448  return AVERROR_EXTERNAL;
449  }
450 
451  jxl_fmt->endianness = JXL_NATIVE_ENDIAN;
452  if (frame->linesize[0] >= 0) {
453  jxl_fmt->align = frame->linesize[0];
454  *data = frame->data[0];
455  } else {
456  jxl_fmt->align = -frame->linesize[0];
457  *data = frame->data[0] + frame->linesize[0] * (frame->height - 1);
458  }
459 
460  return 0;
461 }
462 
463 /**
464  * Run libjxl's output processing loop, reallocating the packet as necessary
465  * if libjxl needs more space to work with.
466  */
467 static int libjxl_process_output(AVCodecContext *avctx, size_t *bytes_written)
468 {
470  JxlEncoderStatus jret;
471  size_t available = ctx->buffer_size;
472  uint8_t *next_out = ctx->buffer;
473 
474  while (1) {
475  jret = JxlEncoderProcessOutput(ctx->encoder, &next_out, &available);
476  if (jret == JXL_ENC_ERROR) {
477  av_log(avctx, AV_LOG_ERROR, "Unspecified libjxl error occurred\n");
478  return AVERROR_EXTERNAL;
479  }
480  *bytes_written = ctx->buffer_size - available;
481  /* all data passed has been encoded */
482  if (jret == JXL_ENC_SUCCESS)
483  break;
484  if (jret == JXL_ENC_NEED_MORE_OUTPUT) {
485  /*
486  * at the moment, libjxl has no way to
487  * tell us how much space it actually needs
488  * so we need to malloc loop
489  */
490  uint8_t *temp;
491  size_t new_size = ctx->buffer_size * 2;
492  temp = av_realloc(ctx->buffer, new_size);
493  if (!temp)
494  return AVERROR(ENOMEM);
495  ctx->buffer = temp;
496  ctx->buffer_size = new_size;
497  next_out = ctx->buffer + *bytes_written;
498  available = new_size - *bytes_written;
499  continue;
500  }
501  av_log(avctx, AV_LOG_ERROR, "Bad libjxl event: %d\n", jret);
502  return AVERROR_EXTERNAL;
503  }
504 
505  return 0;
506 }
507 
508 /**
509  * Encode an entire frame. This will always reinitialize a new still image
510  * and encode a one-frame image (for image2 and image2pipe).
511  */
512 static int libjxl_encode_frame(AVCodecContext *avctx, AVPacket *pkt, const AVFrame *frame, int *got_packet)
513 {
514 
516  int ret;
517  size_t bytes_written = 0;
518  const uint8_t *data;
519 
520  ret = libjxl_init_jxl_encoder(avctx);
521  if (ret < 0) {
522  av_log(avctx, AV_LOG_ERROR, "Error frame-initializing JxlEncoder\n");
523  return ret;
524  }
525 
526  ret = libjxl_preprocess_stream(avctx, frame, 0);
527  if (ret < 0)
528  return ret;
529 
531  if (ret < 0)
532  return ret;
533 
534  if (JxlEncoderAddImageFrame(ctx->options, &ctx->jxl_fmt, data, ctx->jxl_fmt.align * frame->height)
535  != JXL_ENC_SUCCESS) {
536  av_log(avctx, AV_LOG_ERROR, "Failed to add Image Frame\n");
537  return AVERROR_EXTERNAL;
538  }
539 
540  /*
541  * Run this after the last frame in the image has been passed.
542  */
543  JxlEncoderCloseInput(ctx->encoder);
544 
545  ret = libjxl_process_output(avctx, &bytes_written);
546  if (ret < 0)
547  return ret;
548 
549  ret = ff_get_encode_buffer(avctx, pkt, bytes_written, 0);
550  if (ret < 0)
551  return ret;
552 
553  memcpy(pkt->data, ctx->buffer, bytes_written);
554  *got_packet = 1;
555 
556  return 0;
557 }
558 
559 /**
560  * Encode one frame of the animation. libjxl requires us to set duration of the frame
561  * but we're only promised the PTS, not the duration. As a result we have to buffer
562  * a frame and subtract the PTS from the last PTS. The last frame uses the previous
563  * frame's calculated duration as a fallback if its duration field is unset.
564  *
565  * We also need to tell libjxl if our frame is the last one, which we won't know upon
566  * receiving a single frame, so we have to buffer a frame as well and send the "last frame"
567  * upon receiving the special EOF frame.
568  */
570 {
572  int ret = 0;
573  JxlFrameHeader frame_header;
574  size_t bytes_written = 0;
575  const uint8_t *data;
576 
577  if (!ctx->prev) {
578  ctx->prev = av_frame_alloc();
579  if (!ctx->prev)
580  return AVERROR(ENOMEM);
581  ret = ff_encode_get_frame(avctx, ctx->prev);
582  if (ret == AVERROR(EAGAIN) || ret == AVERROR_EOF)
583  return ret;
584  ret = libjxl_preprocess_stream(avctx, ctx->prev, 1);
585  if (ret < 0)
586  return ret;
587  }
588 
589  ret = ff_encode_get_frame(avctx, ctx->frame);
590  if (ret == AVERROR_EOF) {
591  av_frame_free(&ctx->frame);
592  ret = 0;
593  }
594  if (ret == AVERROR(EAGAIN))
595  return ret;
596 
597  JxlEncoderInitFrameHeader(&frame_header);
598 
599  ctx->duration = ctx->prev->duration ? ctx->prev->duration :
600  ctx->frame ? ctx->frame->pts - ctx->prev->pts :
601  ctx->duration ? ctx->duration :
602  1;
603 
604  frame_header.duration = ctx->duration;
605  pkt->duration = ctx->duration;
606  pkt->pts = ctx->prev->pts;
607  pkt->dts = pkt->pts;
608 
609  if (JxlEncoderSetFrameHeader(ctx->options, &frame_header) != JXL_ENC_SUCCESS) {
610  av_log(avctx, AV_LOG_ERROR, "Failed to set JxlFrameHeader\n");
611  return AVERROR_EXTERNAL;
612  }
613 
614  ret = libjxl_preprocess_frame(avctx, ctx->prev, &data);
615  if (ret < 0)
616  return ret;
617 
618  if (JxlEncoderAddImageFrame(ctx->options, &ctx->jxl_fmt, data, ctx->jxl_fmt.align * ctx->prev->height)
619  != JXL_ENC_SUCCESS) {
620  av_log(avctx, AV_LOG_ERROR, "Failed to add Image Frame\n");
621  return AVERROR_EXTERNAL;
622  }
623 
624  if (!ctx->frame)
625  JxlEncoderCloseInput(ctx->encoder);
626 
627  ret = libjxl_process_output(avctx, &bytes_written);
628  if (ret < 0)
629  return ret;
630 
631  ret = ff_get_encode_buffer(avctx, pkt, bytes_written, 0);
632  if (ret < 0)
633  return ret;
634 
635  memcpy(pkt->data, ctx->buffer, bytes_written);
636 
637  if (ctx->frame) {
638  av_frame_unref(ctx->prev);
639  av_frame_move_ref(ctx->prev, ctx->frame);
640  } else {
641  av_frame_free(&ctx->prev);
642  }
643 
644  return ret;
645 }
646 
648 {
650 
651  if (ctx->runner)
652  JxlThreadParallelRunnerDestroy(ctx->runner);
653  ctx->runner = NULL;
654 
655  /*
656  * destroying the encoder also frees
657  * ctx->options so we don't need to
658  */
659  if (ctx->encoder)
660  JxlEncoderDestroy(ctx->encoder);
661  ctx->encoder = NULL;
662 
663  av_freep(&ctx->buffer);
664  av_frame_free(&ctx->prev);
665  av_frame_free(&ctx->frame);
666 
667  return 0;
668 }
669 
670 #define OFFSET(x) offsetof(LibJxlEncodeContext, x)
671 #define VE AV_OPT_FLAG_VIDEO_PARAM | AV_OPT_FLAG_ENCODING_PARAM
672 
673 static const AVOption libjxl_encode_options[] = {
674  { "effort", "Encoding effort", OFFSET(effort), AV_OPT_TYPE_INT, { .i64 = 7 }, 1, 9, VE },
675  { "distance", "Maximum Butteraugli distance (quality setting, "
676  "lower = better, zero = lossless, default 1.0)", OFFSET(distance), AV_OPT_TYPE_FLOAT, { .dbl = -1.0 }, -1.0, 15.0, VE },
677  { "modular", "Force modular mode", OFFSET(modular), AV_OPT_TYPE_INT, { .i64 = 0 }, 0, 1, VE },
678  { "xyb", "Use XYB-encoding for lossy images", OFFSET(xyb),
679  AV_OPT_TYPE_INT, { .i64 = 1 }, 0, 1, VE },
680  { NULL },
681 };
682 
683 static const AVClass libjxl_encode_class = {
684  .class_name = "libjxl",
685  .item_name = av_default_item_name,
686  .option = libjxl_encode_options,
687  .version = LIBAVUTIL_VERSION_INT,
688 };
689 
698 };
699 
701  .p.name = "libjxl",
702  CODEC_LONG_NAME("libjxl JPEG XL"),
703  .p.type = AVMEDIA_TYPE_VIDEO,
704  .p.id = AV_CODEC_ID_JPEGXL,
705  .priv_data_size = sizeof(LibJxlEncodeContext),
708  .close = libjxl_encode_close,
709  .p.capabilities = AV_CODEC_CAP_OTHER_THREADS |
712  .caps_internal = FF_CODEC_CAP_NOT_INIT_THREADSAFE |
716  .p.priv_class = &libjxl_encode_class,
717  .p.wrapper_name = "libjxl",
718 };
719 
721  .p.name = "libjxl_anim",
722  CODEC_LONG_NAME("libjxl JPEG XL animated"),
723  .p.type = AVMEDIA_TYPE_VIDEO,
724  .p.id = AV_CODEC_ID_JPEGXL_ANIM,
725  .priv_data_size = sizeof(LibJxlEncodeContext),
728  .close = libjxl_encode_close,
729  .p.capabilities = AV_CODEC_CAP_OTHER_THREADS |
732  .caps_internal = FF_CODEC_CAP_NOT_INIT_THREADSAFE |
736  .p.priv_class = &libjxl_encode_class,
737  .p.wrapper_name = "libjxl",
738 };
LibJxlEncodeContext::effort
int effort
Definition: libjxlenc.c:53
LibJxlEncodeContext::options
JxlEncoderFrameSettings * options
Definition: libjxlenc.c:52
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
AV_CODEC_ID_JPEGXL_ANIM
@ AV_CODEC_ID_JPEGXL_ANIM
Definition: codec_id.h:331
LibJxlEncodeContext::buffer_size
size_t buffer_size
Definition: libjxlenc.c:58
ff_libjxl_get_threadcount
size_t ff_libjxl_get_threadcount(int threads)
Transform threadcount in ffmpeg to one used by libjxl.
Definition: libjxl.c:33
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
libjxl_process_output
static int libjxl_process_output(AVCodecContext *avctx, size_t *bytes_written)
Run libjxl's output processing loop, reallocating the packet as necessary if libjxl needs more space ...
Definition: libjxlenc.c:467
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
AV_PIX_FMT_YA8
@ AV_PIX_FMT_YA8
8 bits gray, 8 bits alpha
Definition: pixfmt.h:140
libm.h
av_frame_get_side_data
AVFrameSideData * av_frame_get_side_data(const AVFrame *frame, enum AVFrameSideDataType type)
Definition: frame.c:661
VE
#define VE
Definition: libjxlenc.c:671
AVColorPrimariesDesc
Struct that contains both white point location and primaries location, providing the complete descrip...
Definition: csp.h:78
av_pix_fmt_desc_get
const AVPixFmtDescriptor * av_pix_fmt_desc_get(enum AVPixelFormat pix_fmt)
Definition: pixdesc.c:3341
AVERROR_EOF
#define AVERROR_EOF
End of file.
Definition: error.h:57
LibJxlEncodeContext::runner
void * runner
Definition: libjxlenc.c:50
AVCOL_TRC_LINEAR
@ AVCOL_TRC_LINEAR
"Linear transfer characteristics"
Definition: pixfmt.h:653
AV_CODEC_FLAG_QSCALE
#define AV_CODEC_FLAG_QSCALE
Use fixed qscale.
Definition: avcodec.h:213
int64_t
long long int64_t
Definition: coverity.c:34
AV_PIX_FMT_FLAG_FLOAT
#define AV_PIX_FMT_FLAG_FLOAT
The pixel format contains IEEE-754 floating point values.
Definition: pixdesc.h:158
av_frame_free
void av_frame_free(AVFrame **frame)
Free the frame and any dynamically allocated objects in it, e.g.
Definition: frame.c:63
AVFrame
This structure describes decoded (raw) audio or video data.
Definition: frame.h:410
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:750
AVPacket::data
uint8_t * data
Definition: packet.h:535
AVOption
AVOption.
Definition: opt.h:429
encode.h
AVCOL_TRC_UNSPECIFIED
@ AVCOL_TRC_UNSPECIFIED
Definition: pixfmt.h:647
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
libjxl.h
av_get_bits_per_pixel
int av_get_bits_per_pixel(const AVPixFmtDescriptor *pixdesc)
Return the number of bits per pixel used by the pixel format described by pixdesc.
Definition: pixdesc.c:3293
AVPacket::duration
int64_t duration
Duration of this packet in AVStream->time_base units, 0 if unknown.
Definition: packet.h:553
AVColorPrimaries
AVColorPrimaries
Chromaticity coordinates of the source primaries.
Definition: pixfmt.h:619
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
libjxl_anim_encode_init
static av_cold int libjxl_anim_encode_init(AVCodecContext *avctx)
Initializer for the animation encoder.
Definition: libjxlenc.c:179
FFCodec::p
AVCodec p
The public AVCodec.
Definition: codec_internal.h:131
AVCOL_TRC_IEC61966_2_1
@ AVCOL_TRC_IEC61966_2_1
IEC 61966-2-1 (sRGB or sYCC)
Definition: pixfmt.h:658
libjxl_anim_encode_frame
static int libjxl_anim_encode_frame(AVCodecContext *avctx, AVPacket *pkt)
Encode one frame of the animation.
Definition: libjxlenc.c:569
OFFSET
#define OFFSET(x)
Definition: libjxlenc.c:670
LibJxlEncodeContext::prev
AVFrame * prev
Definition: libjxlenc.c:63
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
AVCOL_TRC_GAMMA28
@ AVCOL_TRC_GAMMA28
also ITU-R BT470BG
Definition: pixfmt.h:650
AVCodecContext::flags
int flags
AV_CODEC_FLAG_*.
Definition: avcodec.h:488
LibJxlEncodeContext::xyb
int xyb
Definition: libjxlenc.c:56
AV_PIX_FMT_GRAY16
#define AV_PIX_FMT_GRAY16
Definition: pixfmt.h:511
FF_CODEC_ENCODE_CB
#define FF_CODEC_ENCODE_CB(func)
Definition: codec_internal.h:353
AVRational::num
int num
Numerator.
Definition: rational.h:59
libjxl_populate_colorspace
static int libjxl_populate_colorspace(AVCodecContext *avctx, const AVFrame *frame, const AVPixFmtDescriptor *pix_desc, const JxlBasicInfo *info)
Definition: libjxlenc.c:250
LibJxlEncodeContext::modular
int modular
Definition: libjxlenc.c:55
AVCOL_TRC_GAMMA22
@ AVCOL_TRC_GAMMA22
also ITU-R BT470M / ITU-R BT1700 625 PAL & SECAM
Definition: pixfmt.h:649
av_frame_alloc
AVFrame * av_frame_alloc(void)
Allocate an AVFrame and set its fields to default values.
Definition: frame.c:51
AVCodecContext::color_primaries
enum AVColorPrimaries color_primaries
Chromaticity coordinates of the source primaries.
Definition: avcodec.h:645
pkt
AVPacket * pkt
Definition: movenc.c:60
AV_LOG_ERROR
#define AV_LOG_ERROR
Something went wrong and cannot losslessly be recovered.
Definition: log.h:210
AVFrameSideData::size
size_t size
Definition: frame.h:268
av_cold
#define av_cold
Definition: attributes.h:90
AVCodecContext::global_quality
int global_quality
Global quality for codecs which cannot change it per frame.
Definition: avcodec.h:1217
av_csp_primaries_desc_from_id
const AVColorPrimariesDesc * av_csp_primaries_desc_from_id(enum AVColorPrimaries prm)
Retrieves a complete gamut description from an enum constant describing the color primaries.
Definition: csp.c:90
av_q2d
static double av_q2d(AVRational a)
Convert an AVRational to a double.
Definition: rational.h:104
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
info
MIPS optimizations info
Definition: mips.txt:2
AV_CODEC_CAP_ENCODER_REORDERED_OPAQUE
#define AV_CODEC_CAP_ENCODER_REORDERED_OPAQUE
This encoder can reorder user opaque values from input AVFrames and return them with corresponding ou...
Definition: codec.h:144
AVCodecContext::bits_per_raw_sample
int bits_per_raw_sample
Bits per sample/pixel of internal libavcodec pixel/sample format.
Definition: avcodec.h:1553
ctx
AVFormatContext * ctx
Definition: movenc.c:49
AV_PIX_FMT_RGBF32
#define AV_PIX_FMT_RGBF32
Definition: pixfmt.h:609
AV_PIX_FMT_GRAYF32
#define AV_PIX_FMT_GRAYF32
Definition: pixfmt.h:565
AVCOL_PRI_UNSPECIFIED
@ AVCOL_PRI_UNSPECIFIED
Definition: pixfmt.h:622
CODEC_LONG_NAME
#define CODEC_LONG_NAME(str)
Definition: codec_internal.h:326
AV_PIX_FMT_RGBA
@ AV_PIX_FMT_RGBA
packed RGBA 8:8:8:8, 32bpp, RGBARGBA...
Definition: pixfmt.h:100
AV_PIX_FMT_RGBA64
#define AV_PIX_FMT_RGBA64
Definition: pixfmt.h:518
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
CODEC_PIXFMTS_ARRAY
#define CODEC_PIXFMTS_ARRAY(array)
Definition: codec_internal.h:387
AVPixFmtDescriptor::nb_components
uint8_t nb_components
The number of components each pixel has, (1-4)
Definition: pixdesc.h:71
LibJxlEncodeContext::buffer
uint8_t * buffer
Definition: libjxlenc.c:57
FF_CODEC_RECEIVE_PACKET_CB
#define FF_CODEC_RECEIVE_PACKET_CB(func)
Definition: codec_internal.h:361
AVCOL_PRI_BT709
@ AVCOL_PRI_BT709
also ITU-R BT1361 / IEC 61966-2-4 / SMPTE RP 177 Annex B
Definition: pixfmt.h:621
av_default_item_name
const char * av_default_item_name(void *ptr)
Return the context name.
Definition: log.c:240
AV_FRAME_DATA_ICC_PROFILE
@ AV_FRAME_DATA_ICC_PROFILE
The data contains an ICC profile as an opaque octet buffer following the format described by ISO 1507...
Definition: frame.h:144
libjxl_init_jxl_encoder
static int libjxl_init_jxl_encoder(AVCodecContext *avctx)
Initalize the encoder on a per-file basis.
Definition: libjxlenc.c:102
AV_PIX_FMT_GRAY8
@ AV_PIX_FMT_GRAY8
Y , 8bpp.
Definition: pixfmt.h:81
AVPixFmtDescriptor::flags
uint64_t flags
Combination of AV_PIX_FMT_FLAG_...
Definition: pixdesc.h:94
AVCOL_RANGE_UNSPECIFIED
@ AVCOL_RANGE_UNSPECIFIED
Definition: pixfmt.h:716
LibJxlEncodeContext
Definition: libjxlenc.c:48
error.h
AVCOL_PRI_BT2020
@ AVCOL_PRI_BT2020
ITU-R BT2020.
Definition: pixfmt.h:630
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
AVCOL_TRC_SMPTE2084
@ AVCOL_TRC_SMPTE2084
SMPTE ST 2084 for 10-, 12-, 14- and 16-bit systems.
Definition: pixfmt.h:661
AVCOL_PRI_SMPTE431
@ AVCOL_PRI_SMPTE431
SMPTE ST 431-2 (2011) / DCI P3.
Definition: pixfmt.h:633
init
int(* init)(AVBSFContext *ctx)
Definition: dts2pts.c:368
AV_PIX_FMT_RGB24
@ AV_PIX_FMT_RGB24
packed RGB 8:8:8, 24bpp, RGBRGB...
Definition: pixfmt.h:75
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
libjxl_preprocess_stream
static int libjxl_preprocess_stream(AVCodecContext *avctx, const AVFrame *frame, int animated)
Sends metadata to libjxl based on the first frame of the stream, such as pixel format,...
Definition: libjxlenc.c:321
codec_internal.h
libjxl_encode_frame
static int libjxl_encode_frame(AVCodecContext *avctx, AVPacket *pkt, const AVFrame *frame, int *got_packet)
Encode an entire frame.
Definition: libjxlenc.c:512
AV_PIX_FMT_RGB48
#define AV_PIX_FMT_RGB48
Definition: pixfmt.h:514
AVFrameSideData::data
uint8_t * data
Definition: frame.h:267
libjxl_preprocess_frame
static int libjxl_preprocess_frame(AVCodecContext *avctx, const AVFrame *frame, const uint8_t **data)
Sends frame information to libjxl on a per-frame basis.
Definition: libjxlenc.c:423
ff_libjxl_encoder
const FFCodec ff_libjxl_encoder
Definition: libjxlenc.c:700
frame.h
AVPacket::dts
int64_t dts
Decompression timestamp in AVStream->time_base units; the time at which the packet is decompressed.
Definition: packet.h:534
csp.h
AVERROR_EXTERNAL
#define AVERROR_EXTERNAL
Generic error in an external library.
Definition: error.h:59
quality_to_distance
static float quality_to_distance(float quality)
Map a quality setting for -qscale roughly from libjpeg quality numbers to libjxl's butteraugli distan...
Definition: libjxlenc.c:81
AVCOL_TRC_BT709
@ AVCOL_TRC_BT709
also ITU-R BT1361
Definition: pixfmt.h:646
AV_OPT_TYPE_FLOAT
@ AV_OPT_TYPE_FLOAT
Underlying C type is float.
Definition: opt.h:271
LibJxlEncodeContext::distance
float distance
Definition: libjxlenc.c:54
libjxl_populate_primaries
static int libjxl_populate_primaries(void *avctx, JxlColorEncoding *jxl_color, enum AVColorPrimaries prm)
Populate a JxlColorEncoding with the given enum AVColorPrimaries.
Definition: libjxlenc.c:203
AV_PIX_FMT_YA16
#define AV_PIX_FMT_YA16
Definition: pixfmt.h:513
AVPacket::pts
int64_t pts
Presentation timestamp in AVStream->time_base units; the time at which the decompressed packet will b...
Definition: packet.h:528
libjxl_encode_init
static av_cold int libjxl_encode_init(AVCodecContext *avctx)
Global encoder initialization.
Definition: libjxlenc.c:129
ff_libjxl_anim_encoder
const FFCodec ff_libjxl_anim_encoder
Definition: libjxlenc.c:720
available
if no frame is available
Definition: filter_design.txt:166
AV_CODEC_ID_JPEGXL
@ AV_CODEC_ID_JPEGXL
Definition: codec_id.h:317
libjxl_encode_close
static av_cold int libjxl_encode_close(AVCodecContext *avctx)
Definition: libjxlenc.c:647
av_frame_move_ref
void av_frame_move_ref(AVFrame *dst, AVFrame *src)
Move everything contained in src to dst and reset src.
Definition: frame.c:525
av_frame_unref
void av_frame_unref(AVFrame *frame)
Unreference all the buffers referenced by frame and reset the frame fields.
Definition: frame.c:498
LibJxlEncodeContext::jxl_fmt
JxlPixelFormat jxl_fmt
Definition: libjxlenc.c:59
AVCodec::name
const char * name
Name of the codec implementation.
Definition: codec.h:179
libjxl_supported_pixfmts
static enum AVPixelFormat libjxl_supported_pixfmts[]
Definition: libjxlenc.c:690
AVCOL_RANGE_MPEG
@ AVCOL_RANGE_MPEG
Narrow or limited range content.
Definition: pixfmt.h:733
FF_CODEC_CAP_ICC_PROFILES
#define FF_CODEC_CAP_ICC_PROFILES
Codec supports embedded ICC profiles (AV_FRAME_DATA_ICC_PROFILE).
Definition: codec_internal.h:81
libjxl_encode_class
static const AVClass libjxl_encode_class
Definition: libjxlenc.c:683
avcodec.h
version.h
ret
ret
Definition: filter_design.txt:187
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:264
AVCodecContext
main external API structure.
Definition: avcodec.h:431
AVCOL_TRC_ARIB_STD_B67
@ AVCOL_TRC_ARIB_STD_B67
ARIB STD-B67, known as "Hybrid log-gamma".
Definition: pixfmt.h:665
frame_header
Definition: truemotion1.c:88
frame_header
static int FUNC() frame_header(CodedBitstreamContext *ctx, RWContext *rw, JPEGRawFrameHeader *current)
Definition: cbs_jpeg_syntax_template.c:19
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
libjxl_encode_options
static const AVOption libjxl_encode_options[]
Definition: libjxlenc.c:673
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
temp
else temp
Definition: vf_mcdeint.c:263
AV_PIX_FMT_RGBAF32
#define AV_PIX_FMT_RGBAF32
Definition: pixfmt.h:610
AVFormatContext::duration
int64_t duration
Duration of the stream, in AV_TIME_BASE fractional seconds.
Definition: avformat.h:1400
LibJxlEncodeContext::frame
AVFrame * frame
Definition: libjxlenc.c:62
desc
const char * desc
Definition: libsvtav1.c:79
AVMEDIA_TYPE_VIDEO
@ AVMEDIA_TYPE_VIDEO
Definition: avutil.h:201
avutil.h
mem.h
ff_encode_get_frame
int ff_encode_get_frame(AVCodecContext *avctx, AVFrame *frame)
Called by encoders to get the next frame for encoding.
Definition: encode.c:205
FF_CODEC_CAP_AUTO_THREADS
#define FF_CODEC_CAP_AUTO_THREADS
Codec handles avctx->thread_count == 0 (auto) internally.
Definition: codec_internal.h:72
AVFrameSideData
Structure to hold side data for an AVFrame.
Definition: frame.h:265
AVPixFmtDescriptor
Descriptor that unambiguously describes how the bits of a pixel are stored in the up to 4 data planes...
Definition: pixdesc.h:69
AVCOL_PRI_SMPTE432
@ AVCOL_PRI_SMPTE432
SMPTE ST 432-1 (2010) / P3 D65 / Display P3.
Definition: pixfmt.h:634
AVPacket
This structure stores compressed data.
Definition: packet.h:512
AVCodecContext::priv_data
void * priv_data
Definition: avcodec.h:458
av_freep
#define av_freep(p)
Definition: tableprint_vlc.h:35
ff_libjxl_init_memory_manager
void ff_libjxl_init_memory_manager(JxlMemoryManager *manager)
Initialize and populate a JxlMemoryManager with av_malloc() and av_free() so libjxl will use these fu...
Definition: libjxl.c:65
distance
static float distance(float x, float y, int band)
Definition: nellymoserenc.c:231
av_log
#define av_log(a,...)
Definition: tableprint_vlc.h:27
AVCOL_TRC_SMPTE428
@ AVCOL_TRC_SMPTE428
SMPTE ST 428-1.
Definition: pixfmt.h:663
LibJxlEncodeContext::encoder
JxlEncoder * encoder
Definition: libjxlenc.c:51
FF_QP2LAMBDA
#define FF_QP2LAMBDA
factor to convert from H.263 QP to lambda
Definition: avutil.h:227
LibJxlEncodeContext::duration
int64_t duration
Definition: libjxlenc.c:64
av_realloc
void * av_realloc(void *ptr, size_t size)
Allocate, reallocate, or free a block of memory.
Definition: mem.c:155