32#define xavs2_opt_set2(name, format, ...) do{ \
33 char opt_str[16] = {0}; \
35 av_strlcatf(opt_str, sizeof(opt_str), format, __VA_ARGS__); \
36 err = cae->api->opt_set2(cae->param, name, opt_str); \
38 av_log(avctx, AV_LOG_WARNING, "Invalid value for %s: %s\n", name, opt_str);\
59 const xavs2_api_t *
api;
136 for (plane = 0; plane < 3; plane++) {
137 p_plane = (uint16_t *)pic->img.img_planes[plane];
138 p_buffer =
frame->data[plane];
139 for (hIdx = 0; hIdx < pic->img.i_lines[plane]; hIdx++) {
140 memset(p_plane, 0, pic->img.i_stride[plane]);
141 for (wIdx = 0; wIdx < pic->img.i_width[plane]; wIdx++) {
142 p_plane[wIdx] = p_buffer[wIdx] << shift_in;
144 p_plane += pic->img.i_stride[plane];
145 p_buffer +=
frame->linesize[plane];
158 for (plane = 0; plane < 3; plane++) {
159 p_plane = pic->img.img_planes[plane];
160 p_buffer =
frame->data[plane];
161 stride = pic->img.i_width[plane] * pic->img.in_sample_size;
162 for (hIdx = 0; hIdx < pic->img.i_lines[plane]; hIdx++) {
163 memcpy(p_plane, p_buffer,
stride);
164 p_plane += pic->img.i_stride[plane];
165 p_buffer +=
frame->linesize[plane];
179 if (cae->
api->encoder_get_buffer(cae->
encoder, &pic) < 0) {
184 switch (
frame->format) {
186 if (pic.img.in_sample_size == pic.img.enc_sample_size) {
189 const int shift_in = atoi(cae->
api->opt_get(cae->
param,
"SampleShift"));
194 if (pic.img.in_sample_size == pic.img.enc_sample_size) {
206 pic.i_pts =
frame->pts;
207 pic.i_type = XAVS2_TYPE_AUTO;
220 if ((cae->
packet.len) && (cae->
packet.state != XAVS2_STATE_FLUSH_END)) {
229 if (cae->
packet.type == XAVS2_TYPE_IDR ||
230 cae->
packet.type == XAVS2_TYPE_I ||
231 cae->
packet.type == XAVS2_TYPE_KEYFRAME) {
261#define OFFSET(x) offsetof(XAVS2EContext, x)
262#define VE AV_OPT_FLAG_VIDEO_PARAM | AV_OPT_FLAG_ENCODING_PARAM
265 {
"lcu_row_threads" ,
"number of parallel threads for rows" ,
OFFSET(lcu_row_threads) ,
AV_OPT_TYPE_INT, {.i64 = 0 }, 0, INT_MAX,
VE },
266 {
"initial_qp" ,
"Quantization initial parameter" ,
OFFSET(initial_qp) ,
AV_OPT_TYPE_INT, {.i64 = 34 }, 1, 63,
VE },
270 {
"speed_level" ,
"Speed level, higher is better but slower",
OFFSET(preset_level) ,
AV_OPT_TYPE_INT, {.i64 = 0 }, 0, 9,
VE },
271 {
"log_level" ,
"log level: -1: none, 0: error, 1: warning, 2: info, 3: debug",
OFFSET(log_level) ,
AV_OPT_TYPE_INT, {.i64 = 0 }, -1, 3,
VE },
272 {
"xavs2-params" ,
"set the xavs2 configuration using a :-separated list of key=value parameters",
OFFSET(xavs2_opts),
AV_OPT_TYPE_DICT, { 0 }, 0, 0,
VE },
277 .class_name =
"XAVS2EContext",
291 .p.name =
"libxavs2",
307 .p.wrapper_name =
"libxavs2",
static void bit_depth(AudioStatsContext *s, const uint64_t *const mask, uint8_t *depth)
const FFCodec ff_libxavs2_encoder
#define CODEC_PIXFMTS(...)
#define FF_CODEC_CAP_NOT_INIT_THREADSAFE
The codec is not known to be init-threadsafe (i.e.
#define FF_CODEC_ENCODE_CB(func)
#define CODEC_LONG_NAME(str)
#define FF_CODEC_CAP_AUTO_THREADS
Codec handles avctx->thread_count == 0 (auto) internally.
int(* init)(AVBSFContext *ctx)
int ff_get_encode_buffer(AVCodecContext *avctx, AVPacket *avpkt, int64_t size, int flags)
Get a buffer for a packet.
@ AV_OPT_TYPE_INT
Underlying C type is int.
@ AV_OPT_TYPE_DICT
Underlying C type is AVDictionary*.
#define AV_CODEC_CAP_OTHER_THREADS
Codec supports multithreading through a method other than slice- or frame-level multithreading.
#define AV_CODEC_CAP_DELAY
Encoder or decoder requires flushing with NULL input at the end in order to give the complete and cor...
#define AV_CODEC_FLAG_CLOSED_GOP
#define AV_CODEC_CAP_DR1
Codec uses get_buffer() or get_encode_buffer() for allocating buffers and supports custom allocators.
#define AV_PKT_FLAG_KEY
The packet contains a keyframe.
const AVDictionaryEntry * av_dict_iterate(const AVDictionary *m, const AVDictionaryEntry *prev)
Iterate over a dictionary.
#define AVERROR_EXTERNAL
Generic error in an external library.
#define AV_LOG_ERROR
Something went wrong and cannot losslessly be recovered.
const char * av_default_item_name(void *ptr)
Return the context name.
#define LIBAVUTIL_VERSION_INT
static void xavs2_copy_frame(xavs2_picture_t *pic, const AVFrame *frame)
static void xavs2_copy_frame_with_shift(xavs2_picture_t *pic, const AVFrame *frame, const int shift_in)
static av_cold int xavs2_init(AVCodecContext *avctx)
static const FFCodecDefault xavs2_defaults[]
#define xavs2_opt_set2(name, format,...)
static int xavs2_encode_frame(AVCodecContext *avctx, AVPacket *pkt, const AVFrame *frame, int *got_packet)
static av_cold int xavs2_close(AVCodecContext *avctx)
static const AVClass libxavs2
void ff_mpeg12_find_best_frame_rate(AVRational frame_rate, int *code, int *ext_n, int *ext_d, int nonstandard)
#define AV_PIX_FMT_YUV420P10
@ AVCOL_RANGE_MPEG
Narrow or limited range content.
@ AV_PIX_FMT_YUV420P
planar YUV 4:2:0, 12bpp, (1 Cr & Cb sample per 2x2 Y samples)
Describe the class of an AVClass context structure.
main external API structure.
enum AVPixelFormat pix_fmt
Pixel format, see AV_PIX_FMT_xxx.
int width
picture width / height.
int max_b_frames
maximum number of B-frames between non-B-frames Note: The output will be delayed by max_b_frames+1 re...
int qmin
minimum quantizer
int64_t bit_rate
the average bitrate
int gop_size
the number of pictures in a group of pictures, or 0 for intra_only
int thread_count
thread count is used to decide how many independent tasks should be passed to execute()
int qmax
maximum quantizer
int flags
AV_CODEC_FLAG_*.
This structure describes decoded (raw) audio or video data.
This structure stores compressed data.
AVDictionary * xavs2_opts