Go to the documentation of this file.
46 #include <jxl/encode.h>
47 #include <jxl/thread_parallel_runner.h>
88 return (100.0 -
quality) * 0.10;
90 return 0.1 + (100.0 -
quality) * 0.09;
109 JxlEncoderReset(
ctx->encoder);
112 if (JxlEncoderSetParallelRunner(
ctx->encoder, JxlThreadParallelRunner,
ctx->runner)
113 != JXL_ENC_SUCCESS) {
118 ctx->options = JxlEncoderFrameSettingsCreate(
ctx->encoder,
NULL);
134 JxlMemoryManager manager;
137 ctx->encoder = JxlEncoderCreate(&manager);
149 ctx->buffer_size = 4096;
158 if (
ctx->distance < 0.0) {
170 if (
ctx->distance > 0.0 &&
ctx->distance < 0.01)
171 ctx->distance = 0.01;
211 jxl_color->primaries = JXL_PRIMARIES_SRGB;
212 jxl_color->white_point = JXL_WHITE_POINT_D65;
215 jxl_color->primaries = JXL_PRIMARIES_2100;
216 jxl_color->white_point = JXL_WHITE_POINT_D65;
219 jxl_color->primaries = JXL_PRIMARIES_P3;
220 jxl_color->white_point = JXL_WHITE_POINT_DCI;
223 jxl_color->primaries = JXL_PRIMARIES_P3;
224 jxl_color->white_point = JXL_WHITE_POINT_D65;
227 av_log(avctx,
AV_LOG_WARNING,
"Unknown primaries, assuming BT.709/sRGB. Colors may be wrong.\n");
228 jxl_color->primaries = JXL_PRIMARIES_SRGB;
229 jxl_color->white_point = JXL_WHITE_POINT_D65;
237 jxl_color->primaries = JXL_PRIMARIES_CUSTOM;
238 jxl_color->white_point = JXL_WHITE_POINT_CUSTOM;
240 jxl_color->primaries_red_xy[0] =
av_q2d(
desc->prim.r.x);
241 jxl_color->primaries_red_xy[1] =
av_q2d(
desc->prim.r.y);
242 jxl_color->primaries_green_xy[0] =
av_q2d(
desc->prim.g.x);
243 jxl_color->primaries_green_xy[1] =
av_q2d(
desc->prim.g.y);
244 jxl_color->primaries_blue_xy[0] =
av_q2d(
desc->prim.b.x);
245 jxl_color->primaries_blue_xy[1] =
av_q2d(
desc->prim.b.y);
246 jxl_color->white_point_xy[0] =
av_q2d(
desc->wp.x);
247 jxl_color->white_point_xy[1] =
av_q2d(
desc->wp.y);
255 JxlColorEncoding jxl_color;
262 jxl_color.transfer_function = JXL_TRANSFER_FUNCTION_709;
265 jxl_color.transfer_function = JXL_TRANSFER_FUNCTION_LINEAR;
268 jxl_color.transfer_function = JXL_TRANSFER_FUNCTION_SRGB;
271 jxl_color.transfer_function = JXL_TRANSFER_FUNCTION_DCI;
274 jxl_color.transfer_function = JXL_TRANSFER_FUNCTION_PQ;
277 jxl_color.transfer_function = JXL_TRANSFER_FUNCTION_HLG;
280 jxl_color.transfer_function = JXL_TRANSFER_FUNCTION_GAMMA;
281 jxl_color.gamma = 1/2.2f;
284 jxl_color.transfer_function = JXL_TRANSFER_FUNCTION_GAMMA;
285 jxl_color.gamma = 1/2.8f;
290 "Unknown transfer function, assuming Linear Light. Colors may be wrong.\n");
291 jxl_color.transfer_function = JXL_TRANSFER_FUNCTION_LINEAR;
294 "Unknown transfer function, assuming IEC61966-2-1/sRGB. Colors may be wrong.\n");
295 jxl_color.transfer_function = JXL_TRANSFER_FUNCTION_SRGB;
299 jxl_color.rendering_intent = JXL_RENDERING_INTENT_RELATIVE;
300 if (
info->num_color_channels == 1)
301 jxl_color.color_space = JXL_COLOR_SPACE_GRAY;
303 jxl_color.color_space = JXL_COLOR_SPACE_RGB;
311 if (JxlEncoderSetColorEncoding(
ctx->encoder, &jxl_color) != JXL_ENC_SUCCESS) {
331 JxlPixelFormat *jxl_fmt = &
ctx->jxl_fmt;
335 #if JPEGXL_NUMERIC_VERSION >= JPEGXL_COMPUTE_NUMERIC_VERSION(0, 8, 0)
336 JxlBitDepth jxl_bit_depth;
340 JxlEncoderInitBasicInfo(&
info);
344 info.num_extra_channels = (jxl_fmt->num_channels + 1) & 0x1;
345 info.num_color_channels = jxl_fmt->num_channels -
info.num_extra_channels;
349 info.alpha_bits = (
info.num_extra_channels > 0) *
info.bits_per_sample;
351 info.exponent_bits_per_sample =
info.bits_per_sample > 16 ? 8 : 5;
352 info.alpha_exponent_bits =
info.alpha_bits ?
info.exponent_bits_per_sample : 0;
353 jxl_fmt->data_type =
info.bits_per_sample > 16 ? JXL_TYPE_FLOAT : JXL_TYPE_FLOAT16;
355 info.exponent_bits_per_sample = 0;
356 info.alpha_exponent_bits = 0;
357 jxl_fmt->data_type =
info.bits_per_sample <= 8 ? JXL_TYPE_UINT8 : JXL_TYPE_UINT16;
360 if (
info.alpha_bits) {
363 info.alpha_premultiplied = 1;
369 #if JPEGXL_NUMERIC_VERSION >= JPEGXL_COMPUTE_NUMERIC_VERSION(0, 8, 0)
370 jxl_bit_depth.bits_per_sample = bits_per_sample;
371 jxl_bit_depth.type = JXL_BIT_DEPTH_FROM_PIXEL_FORMAT;
373 info.exponent_bits_per_sample : 0;
379 av_log(avctx,
AV_LOG_WARNING,
"This encoder does not support limited (tv) range, colors will be wrong!\n");
384 info.uses_original_profile =
ctx->distance == 0.0 || !
ctx->xyb;
417 if (
frame->linesize < 0)
423 info.orientation = orientation;
426 info.orientation =
frame->linesize[0] >= 0 ? JXL_ORIENT_IDENTITY : JXL_ORIENT_FLIP_VERTICAL;
430 if (
frame->linesize < 0)
434 info.have_animation = 1;
435 info.animation.have_timecodes = 0;
436 info.animation.num_loops = 0;
442 if (JxlEncoderSetBasicInfo(
ctx->encoder, &
info) != JXL_ENC_SUCCESS) {
448 if (
info.alpha_bits) {
449 JxlExtraChannelInfo extra_info;
450 JxlEncoderInitExtraChannelInfo(JXL_CHANNEL_ALPHA, &extra_info);
451 extra_info.bits_per_sample =
info.alpha_bits;
452 extra_info.exponent_bits_per_sample =
info.alpha_exponent_bits;
453 extra_info.alpha_premultiplied =
info.alpha_premultiplied;
455 if (JxlEncoderSetExtraChannelInfo(
ctx->encoder, 0, &extra_info) != JXL_ENC_SUCCESS) {
462 if (sd && sd->
size && JxlEncoderSetICCProfile(
ctx->encoder, sd->
data, sd->
size) != JXL_ENC_SUCCESS) {
467 if (!sd || !sd->
size)
470 #if JPEGXL_NUMERIC_VERSION >= JPEGXL_COMPUTE_NUMERIC_VERSION(0, 8, 0)
471 if (JxlEncoderSetFrameBitDepth(
ctx->options, &jxl_bit_depth) != JXL_ENC_SUCCESS)
476 if (JxlEncoderUseBoxes(
ctx->encoder) != JXL_ENC_SUCCESS)
482 if (JxlEncoderGetRequiredCodestreamLevel(
ctx->encoder) > 5) {
483 if (JxlEncoderSetCodestreamLevel(
ctx->encoder, 10) != JXL_ENC_SUCCESS)
506 JxlPixelFormat *jxl_fmt = &
ctx->jxl_fmt;
509 if (JxlEncoderFrameSettingsSetOption(
ctx->options, JXL_ENC_FRAME_SETTING_EFFORT,
ctx->effort)
510 != JXL_ENC_SUCCESS) {
515 if (JxlEncoderSetFrameDistance(
ctx->options,
ctx->distance) != JXL_ENC_SUCCESS) {
525 if (JxlEncoderFrameSettingsSetOption(
ctx->options, JXL_ENC_FRAME_SETTING_MODULAR,
526 ctx->modular ||
ctx->distance <= 0.0 ? 1 : -1) != JXL_ENC_SUCCESS) {
531 jxl_fmt->endianness = JXL_NATIVE_ENDIAN;
532 if (
frame->linesize[0] >= 0) {
533 jxl_fmt->align =
frame->linesize[0];
536 jxl_fmt->align = -
frame->linesize[0];
550 JxlEncoderStatus jret;
552 uint8_t *next_out =
ctx->buffer;
555 jret = JxlEncoderProcessOutput(
ctx->encoder, &next_out, &
available);
556 if (jret == JXL_ENC_ERROR) {
562 if (jret == JXL_ENC_SUCCESS)
564 if (jret == JXL_ENC_NEED_MORE_OUTPUT) {
571 size_t new_size =
ctx->buffer_size * 2;
576 ctx->buffer_size = new_size;
577 next_out =
ctx->buffer + *bytes_written;
597 size_t bytes_written = 0;
614 if (JxlEncoderAddImageFrame(
ctx->options, &
ctx->jxl_fmt,
data,
ctx->jxl_fmt.align *
frame->height)
615 != JXL_ENC_SUCCESS) {
623 JxlEncoderCloseInput(
ctx->encoder);
633 memcpy(
pkt->
data,
ctx->buffer, bytes_written);
654 size_t bytes_written = 0;
680 ctx->frame ?
ctx->frame->pts -
ctx->prev->pts :
689 if (JxlEncoderSetFrameHeader(
ctx->options, &
frame_header) != JXL_ENC_SUCCESS) {
698 if (JxlEncoderAddImageFrame(
ctx->options, &
ctx->jxl_fmt,
data,
ctx->jxl_fmt.align *
ctx->prev->height)
699 != JXL_ENC_SUCCESS) {
705 JxlEncoderCloseInput(
ctx->encoder);
715 memcpy(
pkt->
data,
ctx->buffer, bytes_written);
732 JxlThreadParallelRunnerDestroy(
ctx->runner);
740 JxlEncoderDestroy(
ctx->encoder);
750 #define OFFSET(x) offsetof(LibJxlEncodeContext, x)
751 #define VE AV_OPT_FLAG_VIDEO_PARAM | AV_OPT_FLAG_ENCODING_PARAM
755 {
"distance",
"Maximum Butteraugli distance (quality setting, "
758 {
"xyb",
"Use XYB-encoding for lossy images",
OFFSET(xyb),
800 .p.wrapper_name =
"libjxl",
804 .
p.
name =
"libjxl_anim",
823 .p.wrapper_name =
"libjxl",
JxlEncoderFrameSettings * options
#define AV_LOG_WARNING
Something somehow does not look correct.
AVPixelFormat
Pixel format.
@ AV_CODEC_ID_JPEGXL_ANIM
size_t ff_libjxl_get_threadcount(int threads)
Transform threadcount in ffmpeg to one used by libjxl.
enum AVAlphaMode alpha_mode
Indicates how the alpha channel of the video is represented.
#define FF_CODEC_CAP_INIT_CLEANUP
The codec allows calling the close function for deallocation even if the init function returned a fai...
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 ...
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
@ AV_PIX_FMT_YA8
8 bits gray, 8 bits alpha
@ AVALPHA_MODE_STRAIGHT
Alpha channel is independent of color values.
@ AVALPHA_MODE_PREMULTIPLIED
Alpha channel is multiplied into color values.
int av_exif_parse_buffer(void *logctx, const uint8_t *buf, size_t size, AVExifMetadata *ifd, enum AVExifHeaderMode header_mode)
Decodes the EXIF data provided in the buffer and writes it into the struct *ifd.
AVFrameSideData * av_frame_get_side_data(const AVFrame *frame, enum AVFrameSideDataType type)
int av_exif_write(void *logctx, const AVExifMetadata *ifd, AVBufferRef **buffer, enum AVExifHeaderMode header_mode)
Allocates a buffer using av_malloc of an appropriate size and writes the EXIF data represented by ifd...
Struct that contains both white point location and primaries location, providing the complete descrip...
const AVPixFmtDescriptor * av_pix_fmt_desc_get(enum AVPixelFormat pix_fmt)
#define AVERROR_EOF
End of file.
@ AVCOL_TRC_LINEAR
"Linear transfer characteristics"
static int FUNC() frame_header(CodedBitstreamContext *ctx, RWContext *rw, APVRawFrameHeader *current)
#define AV_CODEC_FLAG_QSCALE
Use fixed qscale.
int av_exif_orientation_to_matrix(int32_t *matrix, int orientation)
Convert an orientation constant used by EXIF's orientation tag into a display matrix used by AV_FRAME...
#define AV_PIX_FMT_FLAG_FLOAT
The pixel format contains IEEE-754 floating point values.
void av_frame_free(AVFrame **frame)
Free the frame and any dynamically allocated objects in it, e.g.
This structure describes decoded (raw) audio or video data.
enum AVColorTransferCharacteristic color_trc
Color Transfer Characteristic.
@ AVCOL_RANGE_JPEG
Full range content.
void av_display_matrix_flip(int32_t matrix[9], int hflip, int vflip)
Flip the input matrix horizontally and/or vertically.
#define FF_CODEC_CAP_NOT_INIT_THREADSAFE
The codec is not known to be init-threadsafe (i.e.
@ AV_FRAME_DATA_DISPLAYMATRIX
This side data contains a 3x3 transformation matrix describing an affine transformation that needs to...
int av_get_bits_per_pixel(const AVPixFmtDescriptor *pixdesc)
Return the number of bits per pixel used by the pixel format described by pixdesc.
int64_t duration
Duration of this packet in AVStream->time_base units, 0 if unknown.
AVColorPrimaries
Chromaticity coordinates of the source primaries.
trying all byte sequences megabyte in length and selecting the best looking sequence will yield cases to try But a word about quality
static av_cold int libjxl_anim_encode_init(AVCodecContext *avctx)
Initializer for the animation encoder.
AVCodec p
The public AVCodec.
@ AVCOL_TRC_IEC61966_2_1
IEC 61966-2-1 (sRGB or sYCC)
static int libjxl_anim_encode_frame(AVCodecContext *avctx, AVPacket *pkt)
Encode one frame of the animation.
int thread_count
thread count is used to decide how many independent tasks should be passed to execute()
@ AVCOL_TRC_GAMMA28
also ITU-R BT470BG
void av_exif_free(AVExifMetadata *ifd)
Frees all resources associated with the given EXIF metadata struct.
int flags
AV_CODEC_FLAG_*.
#define AV_PIX_FMT_GRAY16
#define FF_CODEC_ENCODE_CB(func)
static int libjxl_populate_colorspace(AVCodecContext *avctx, const AVFrame *frame, const AVPixFmtDescriptor *pix_desc, const JxlBasicInfo *info)
@ AVCOL_TRC_GAMMA22
also ITU-R BT470M / ITU-R BT1700 625 PAL & SECAM
AVFrame * av_frame_alloc(void)
Allocate an AVFrame and set its fields to default values.
enum AVColorPrimaries color_primaries
Chromaticity coordinates of the source primaries.
#define AV_LOG_ERROR
Something went wrong and cannot losslessly be recovered.
int global_quality
Global quality for codecs which cannot change it per frame.
const AVColorPrimariesDesc * av_csp_primaries_desc_from_id(enum AVColorPrimaries prm)
Retrieves a complete gamut description from an enum constant describing the color primaries.
static double av_q2d(AVRational a)
Convert an AVRational to a double.
#define AV_CODEC_CAP_OTHER_THREADS
Codec supports multithreading through a method other than slice- or frame-level multithreading.
#define AV_CODEC_CAP_ENCODER_REORDERED_OPAQUE
This encoder can reorder user opaque values from input AVFrames and return them with corresponding ou...
int bits_per_raw_sample
Bits per sample/pixel of internal libavcodec pixel/sample format.
#define AV_PIX_FMT_RGBF32
#define AV_PIX_FMT_GRAYF32
#define CODEC_LONG_NAME(str)
@ AV_PIX_FMT_RGBA
packed RGBA 8:8:8:8, 32bpp, RGBARGBA...
#define AV_PIX_FMT_RGBA64
#define LIBAVUTIL_VERSION_INT
int32_t av_exif_get_tag_id(const char *name)
Retrieves the tag ID associated with the provided tag string name.
Describe the class of an AVClass context structure.
enum AVColorRange color_range
MPEG vs JPEG YUV range.
#define CODEC_PIXFMTS_ARRAY(array)
void av_buffer_unref(AVBufferRef **buf)
Free a given reference and automatically free the buffer if there are no more references to it.
@ AV_EXIF_TIFF_HEADER
The TIFF header starts with 0x49492a00, or 0x4d4d002a.
uint8_t nb_components
The number of components each pixel has, (1-4)
#define FF_CODEC_RECEIVE_PACKET_CB(func)
@ AVCOL_PRI_BT709
also ITU-R BT1361 / IEC 61966-2-4 / SMPTE RP 177 Annex B
const char * av_default_item_name(void *ptr)
Return the context name.
@ AV_FRAME_DATA_ICC_PROFILE
The data contains an ICC profile as an opaque octet buffer following the format described by ISO 1507...
static int libjxl_init_jxl_encoder(AVCodecContext *avctx)
Initialize the encoder on a per-file basis.
@ AV_PIX_FMT_GRAY8
Y , 8bpp.
uint64_t flags
Combination of AV_PIX_FMT_FLAG_...
int av_exif_remove_entry(void *logctx, AVExifMetadata *ifd, uint16_t id, int flags)
Remove an entry from the provided EXIF metadata struct.
@ AVCOL_RANGE_UNSPECIFIED
@ AVCOL_PRI_BT2020
ITU-R BT2020.
union AVExifEntry::@120 value
AVRational time_base
This is the fundamental unit of time (in seconds) in terms of which frame timestamps are represented.
AVAlphaMode
Correlation between the alpha channel and color values.
@ AVCOL_TRC_SMPTE2084
SMPTE ST 2084 for 10-, 12-, 14- and 16-bit systems.
@ AVCOL_PRI_SMPTE431
SMPTE ST 431-2 (2011) / DCI P3.
int(* init)(AVBSFContext *ctx)
@ AV_PIX_FMT_RGB24
packed RGB 8:8:8, 24bpp, RGBRGB...
#define AV_CODEC_CAP_DR1
Codec uses get_buffer() or get_encode_buffer() for allocating buffers and supports custom allocators.
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,...
static int libjxl_encode_frame(AVCodecContext *avctx, AVPacket *pkt, const AVFrame *frame, int *got_packet)
Encode an entire 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.
const FFCodec ff_libjxl_encoder
int64_t dts
Decompression timestamp in AVStream->time_base units; the time at which the packet is decompressed.
#define AVERROR_EXTERNAL
Generic error in an external library.
static float quality_to_distance(float quality)
Map a quality setting for -qscale roughly from libjpeg quality numbers to libjxl's butteraugli distan...
@ AVCOL_TRC_BT709
also ITU-R BT1361
@ AV_OPT_TYPE_FLOAT
Underlying C type is float.
static int libjxl_populate_primaries(void *avctx, JxlColorEncoding *jxl_color, enum AVColorPrimaries prm)
Populate a JxlColorEncoding with the given enum AVColorPrimaries.
int64_t pts
Presentation timestamp in AVStream->time_base units; the time at which the decompressed packet will b...
static av_cold int libjxl_encode_init(AVCodecContext *avctx)
Global encoder initialization.
const FFCodec ff_libjxl_anim_encoder
static av_cold int libjxl_encode_close(AVCodecContext *avctx)
void av_frame_move_ref(AVFrame *dst, AVFrame *src)
Move everything contained in src to dst and reset src.
void av_frame_unref(AVFrame *frame)
Unreference all the buffers referenced by frame and reset the frame fields.
const char * name
Name of the codec implementation.
static enum AVPixelFormat libjxl_supported_pixfmts[]
@ AVCOL_RANGE_MPEG
Narrow or limited range content.
#define FF_CODEC_CAP_ICC_PROFILES
Codec supports embedded ICC profiles (AV_FRAME_DATA_ICC_PROFILE).
static const AVClass libjxl_encode_class
const char * class_name
The name of the class; usually it is the same name as the context structure type to which the AVClass...
@ AVALPHA_MODE_UNSPECIFIED
Unknown alpha handling, or no alpha channel.
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
main external API structure.
@ AVCOL_TRC_ARIB_STD_B67
ARIB STD-B67, known as "Hybrid log-gamma".
int ff_get_encode_buffer(AVCodecContext *avctx, AVPacket *avpkt, int64_t size, int flags)
Get a buffer for a packet.
static const AVOption libjxl_encode_options[]
@ AV_OPT_TYPE_INT
Underlying C type is int.
#define AV_PIX_FMT_RGBAF32
int64_t duration
Duration of the stream, in AV_TIME_BASE fractional seconds.
int ff_exif_sanitize_ifd(void *logctx, const AVFrame *frame, AVExifMetadata *ifd)
Compares values in the IFD with data in the provided AVFrame and sets the values in that IFD to match...
int ff_encode_get_frame(AVCodecContext *avctx, AVFrame *frame)
Called by encoders to get the next frame for encoding.
A reference to a data buffer.
#define FF_CODEC_CAP_AUTO_THREADS
Codec handles avctx->thread_count == 0 (auto) internally.
Structure to hold side data for an AVFrame.
Descriptor that unambiguously describes how the bits of a pixel are stored in the up to 4 data planes...
@ AVCOL_PRI_SMPTE432
SMPTE ST 432-1 (2010) / P3 D65 / Display P3.
This structure stores compressed data.
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...
int av_exif_get_entry(void *logctx, AVExifMetadata *ifd, uint16_t id, int flags, AVExifEntry **value)
Get an entry with the tagged ID from the EXIF metadata struct.
@ AV_FRAME_DATA_EXIF
Extensible image file format metadata.
static float distance(float x, float y, int band)
@ AVCOL_TRC_SMPTE428
SMPTE ST 428-1.
#define FF_QP2LAMBDA
factor to convert from H.263 QP to lambda
int av_exif_matrix_to_orientation(const int32_t *matrix)
Convert a display matrix used by AV_FRAME_DATA_DISPLAYMATRIX into an orientation constant used by EXI...
void * av_realloc(void *ptr, size_t size)
Allocate, reallocate, or free a block of memory.