FFmpeg
libxavs.c
Go to the documentation of this file.
1 /*
2  * AVS encoding using the xavs library
3  * Copyright (C) 2010 Amanda, Y.N. Wu <amanda11192003@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 #include <stdio.h>
23 #include <stdlib.h>
24 #include <string.h>
25 #include <math.h>
26 #include <stdint.h>
27 #include <float.h>
28 #include <xavs.h>
29 #include "avcodec.h"
30 #include "internal.h"
31 #include "packet_internal.h"
32 #include "libavutil/internal.h"
33 #include "libavutil/mem.h"
34 #include "libavutil/opt.h"
35 
36 #define END_OF_STREAM 0x001
37 
38 #define XAVS_PART_I8X8 0x002 /* Analyze i8x8 (requires 8x8 transform) */
39 #define XAVS_PART_P8X8 0x010 /* Analyze p16x8, p8x16 and p8x8 */
40 #define XAVS_PART_B8X8 0x100 /* Analyze b16x8, b*/
41 
42 typedef struct XavsContext {
43  AVClass *class;
44  xavs_param_t params;
45  xavs_t *enc;
46  xavs_picture_t pic;
48  int sei_size;
50  float crf;
51  int cqp;
52  int b_bias;
53  float cplxblur;
55  int aud;
58  int mbtree;
64 
65  int64_t *pts_buffer;
67 } XavsContext;
68 
69 static void XAVS_log(void *p, int level, const char *fmt, va_list args)
70 {
71  static const int level_map[] = {
72  [XAVS_LOG_ERROR] = AV_LOG_ERROR,
73  [XAVS_LOG_WARNING] = AV_LOG_WARNING,
74  [XAVS_LOG_INFO] = AV_LOG_INFO,
75  [XAVS_LOG_DEBUG] = AV_LOG_DEBUG
76  };
77 
78  if (level < 0 || level > XAVS_LOG_DEBUG)
79  return;
80 
81  av_vlog(p, level_map[level], fmt, args);
82 }
83 
85  xavs_nal_t *nals, int nnal)
86 {
87  XavsContext *x4 = ctx->priv_data;
88  uint8_t *p;
90 
91  if (!nnal)
92  return 0;
93 
94  for (i = 0; i < nnal; i++)
95  size += nals[i].i_payload;
96 
97  if ((ret = ff_alloc_packet2(ctx, pkt, size, 0)) < 0)
98  return ret;
99  p = pkt->data;
100 
101  /* Write the SEI as part of the first frame. */
102  if (x4->sei_size > 0 && nnal > 0) {
103  memcpy(p, x4->sei, x4->sei_size);
104  p += x4->sei_size;
105  x4->sei_size = 0;
106  }
107 
108  for (i = 0; i < nnal; i++) {
109  s = xavs_nal_encode(p, &size, 1, nals + i);
110  if (s < 0)
111  return -1;
112  p += s;
113  }
114  pkt->size = p - pkt->data;
115 
116  return 1;
117 }
118 
119 static int XAVS_frame(AVCodecContext *avctx, AVPacket *pkt,
120  const AVFrame *frame, int *got_packet)
121 {
122  XavsContext *x4 = avctx->priv_data;
123  xavs_nal_t *nal;
124  int nnal, i, ret;
125  xavs_picture_t pic_out;
126  int pict_type;
127 
128  x4->pic.img.i_csp = XAVS_CSP_I420;
129  x4->pic.img.i_plane = 3;
130 
131  if (frame) {
132  for (i = 0; i < 3; i++) {
133  x4->pic.img.plane[i] = frame->data[i];
134  x4->pic.img.i_stride[i] = frame->linesize[i];
135  }
136 
137  x4->pic.i_pts = frame->pts;
138  x4->pic.i_type = XAVS_TYPE_AUTO;
139  x4->pts_buffer[avctx->frame_number % (avctx->max_b_frames+1)] = frame->pts;
140  }
141 
142  if (xavs_encoder_encode(x4->enc, &nal, &nnal,
143  frame? &x4->pic: NULL, &pic_out) < 0)
144  return -1;
145 
146  ret = encode_nals(avctx, pkt, nal, nnal);
147 
148  if (ret < 0)
149  return -1;
150 
151  if (!ret) {
152  if (!frame && !(x4->end_of_stream)) {
153  if ((ret = ff_alloc_packet2(avctx, pkt, 4, 0)) < 0)
154  return ret;
155 
156  pkt->data[0] = 0x0;
157  pkt->data[1] = 0x0;
158  pkt->data[2] = 0x01;
159  pkt->data[3] = 0xb1;
160  pkt->dts = 2*x4->pts_buffer[(x4->out_frame_count-1)%(avctx->max_b_frames+1)] -
161  x4->pts_buffer[(x4->out_frame_count-2)%(avctx->max_b_frames+1)];
163  *got_packet = 1;
164  }
165  return 0;
166  }
167 
168 #if FF_API_CODED_FRAME
170  avctx->coded_frame->pts = pic_out.i_pts;
172 #endif
173  pkt->pts = pic_out.i_pts;
174  if (avctx->has_b_frames) {
175  if (!x4->out_frame_count)
176  pkt->dts = pkt->pts - (x4->pts_buffer[1] - x4->pts_buffer[0]);
177  else
178  pkt->dts = x4->pts_buffer[(x4->out_frame_count-1)%(avctx->max_b_frames+1)];
179  } else
180  pkt->dts = pkt->pts;
181 
182  switch (pic_out.i_type) {
183  case XAVS_TYPE_IDR:
184  case XAVS_TYPE_I:
185  pict_type = AV_PICTURE_TYPE_I;
186  break;
187  case XAVS_TYPE_P:
188  pict_type = AV_PICTURE_TYPE_P;
189  break;
190  case XAVS_TYPE_B:
191  case XAVS_TYPE_BREF:
192  pict_type = AV_PICTURE_TYPE_B;
193  break;
194  default:
195  pict_type = AV_PICTURE_TYPE_NONE;
196  }
197 #if FF_API_CODED_FRAME
199  avctx->coded_frame->pict_type = pict_type;
201 #endif
202 
203  /* There is no IDR frame in AVS JiZhun */
204  /* Sequence header is used as a flag */
205  if (pic_out.i_type == XAVS_TYPE_I) {
206 #if FF_API_CODED_FRAME
208  avctx->coded_frame->key_frame = 1;
210 #endif
211  pkt->flags |= AV_PKT_FLAG_KEY;
212  }
213 
214 #if FF_API_CODED_FRAME
216  avctx->coded_frame->quality = (pic_out.i_qpplus1 - 1) * FF_QP2LAMBDA;
218 #endif
219 
220  ff_side_data_set_encoder_stats(pkt, (pic_out.i_qpplus1 - 1) * FF_QP2LAMBDA, NULL, 0, pict_type);
221 
222  x4->out_frame_count++;
223  *got_packet = ret;
224  return 0;
225 }
226 
228 {
229  XavsContext *x4 = avctx->priv_data;
230 
231  av_freep(&avctx->extradata);
232  av_freep(&x4->sei);
233  av_freep(&x4->pts_buffer);
234 
235  if (x4->enc)
236  xavs_encoder_close(x4->enc);
237 
238  return 0;
239 }
240 
241 static av_cold int XAVS_init(AVCodecContext *avctx)
242 {
243  XavsContext *x4 = avctx->priv_data;
244 
245  x4->sei_size = 0;
246  xavs_param_default(&x4->params);
247 
248  x4->params.pf_log = XAVS_log;
249  x4->params.p_log_private = avctx;
250  x4->params.i_keyint_max = avctx->gop_size;
251  if (avctx->bit_rate) {
252  x4->params.rc.i_bitrate = avctx->bit_rate / 1000;
253  x4->params.rc.i_rc_method = XAVS_RC_ABR;
254  }
255  x4->params.rc.i_vbv_buffer_size = avctx->rc_buffer_size / 1000;
256  x4->params.rc.i_vbv_max_bitrate = avctx->rc_max_rate / 1000;
257  x4->params.rc.b_stat_write = avctx->flags & AV_CODEC_FLAG_PASS1;
258  if (avctx->flags & AV_CODEC_FLAG_PASS2) {
259  x4->params.rc.b_stat_read = 1;
260  } else {
261  if (x4->crf >= 0) {
262  x4->params.rc.i_rc_method = XAVS_RC_CRF;
263  x4->params.rc.f_rf_constant = x4->crf;
264  } else if (x4->cqp >= 0) {
265  x4->params.rc.i_rc_method = XAVS_RC_CQP;
266  x4->params.rc.i_qp_constant = x4->cqp;
267  }
268  }
269 
270  if (x4->aud >= 0)
271  x4->params.b_aud = x4->aud;
272  if (x4->mbtree >= 0)
273  x4->params.rc.b_mb_tree = x4->mbtree;
274  if (x4->direct_pred >= 0)
275  x4->params.analyse.i_direct_mv_pred = x4->direct_pred;
276  if (x4->fast_pskip >= 0)
277  x4->params.analyse.b_fast_pskip = x4->fast_pskip;
278  if (x4->motion_est >= 0)
279  x4->params.analyse.i_me_method = x4->motion_est;
280  if (x4->mixed_refs >= 0)
281  x4->params.analyse.b_mixed_references = x4->mixed_refs;
282  if (x4->b_bias != INT_MIN)
283  x4->params.i_bframe_bias = x4->b_bias;
284  if (x4->cplxblur >= 0)
285  x4->params.rc.f_complexity_blur = x4->cplxblur;
286 
287  x4->params.i_bframe = avctx->max_b_frames;
288  /* cabac is not included in AVS JiZhun Profile */
289  x4->params.b_cabac = 0;
290 
291 #if FF_API_PRIVATE_OPT
293  if (avctx->b_frame_strategy)
294  x4->b_frame_strategy = avctx->b_frame_strategy;
296 #endif
297 
298  x4->params.i_bframe_adaptive = x4->b_frame_strategy;
299 
300  avctx->has_b_frames = !!avctx->max_b_frames;
301 
302  /* AVS doesn't allow B picture as reference */
303  /* The max allowed reference frame number of B is 2 */
304  x4->params.i_keyint_min = avctx->keyint_min;
305  if (x4->params.i_keyint_min > x4->params.i_keyint_max)
306  x4->params.i_keyint_min = x4->params.i_keyint_max;
307 
308 #if FF_API_PRIVATE_OPT
310  if (avctx->scenechange_threshold)
313 #endif
314 
315  x4->params.i_scenecut_threshold = x4->scenechange_threshold;
316 
317  // x4->params.b_deblocking_filter = avctx->flags & AV_CODEC_FLAG_LOOP_FILTER;
318 
319  x4->params.rc.i_qp_min = avctx->qmin;
320  x4->params.rc.i_qp_max = avctx->qmax;
321  x4->params.rc.i_qp_step = avctx->max_qdiff;
322 
323  x4->params.rc.f_qcompress = avctx->qcompress; /* 0.0 => cbr, 1.0 => constant qp */
324  x4->params.rc.f_qblur = avctx->qblur; /* temporally blur quants */
325 
326  x4->params.i_frame_reference = avctx->refs;
327 
328  x4->params.i_width = avctx->width;
329  x4->params.i_height = avctx->height;
330  x4->params.vui.i_sar_width = avctx->sample_aspect_ratio.num;
331  x4->params.vui.i_sar_height = avctx->sample_aspect_ratio.den;
332  /* This is only used for counting the fps */
333  x4->params.i_fps_num = avctx->time_base.den;
334  x4->params.i_fps_den = avctx->time_base.num;
335  x4->params.analyse.inter = XAVS_ANALYSE_I8x8 |XAVS_ANALYSE_PSUB16x16| XAVS_ANALYSE_BSUB16x16;
336 
337  x4->params.analyse.i_me_range = avctx->me_range;
338  x4->params.analyse.i_subpel_refine = avctx->me_subpel_quality;
339 
340  x4->params.analyse.b_chroma_me = avctx->me_cmp & FF_CMP_CHROMA;
341  /* AVS P2 only enables 8x8 transform */
342  x4->params.analyse.b_transform_8x8 = 1; //avctx->flags2 & AV_CODEC_FLAG2_8X8DCT;
343 
344  x4->params.analyse.i_trellis = avctx->trellis;
345 
346 #if FF_API_PRIVATE_OPT
348  if (avctx->noise_reduction >= 0)
349  x4->noise_reduction = avctx->noise_reduction;
351 #endif
352 
353  x4->params.analyse.i_noise_reduction = x4->noise_reduction;
354 
355  if (avctx->level > 0)
356  x4->params.i_level_idc = avctx->level;
357 
358  if (avctx->bit_rate > 0)
359  x4->params.rc.f_rate_tolerance =
360  (float)avctx->bit_rate_tolerance / avctx->bit_rate;
361 
362  if ((avctx->rc_buffer_size) &&
363  (avctx->rc_initial_buffer_occupancy <= avctx->rc_buffer_size)) {
364  x4->params.rc.f_vbv_buffer_init =
365  (float)avctx->rc_initial_buffer_occupancy / avctx->rc_buffer_size;
366  } else
367  x4->params.rc.f_vbv_buffer_init = 0.9;
368 
369  /* TAG:do we have MB tree RC method */
370  /* what is the RC method we are now using? Default NO */
371  x4->params.rc.f_ip_factor = 1 / fabs(avctx->i_quant_factor);
372  x4->params.rc.f_pb_factor = avctx->b_quant_factor;
373 
374 #if FF_API_PRIVATE_OPT
376  if (avctx->chromaoffset)
377  x4->chroma_offset = avctx->chromaoffset;
379 #endif
380 
381  x4->params.analyse.i_chroma_qp_offset = x4->chroma_offset;
382 
383  x4->params.analyse.b_psnr = avctx->flags & AV_CODEC_FLAG_PSNR;
384  x4->params.i_log_level = XAVS_LOG_DEBUG;
385  x4->params.i_threads = avctx->thread_count;
386  x4->params.b_interlaced = avctx->flags & AV_CODEC_FLAG_INTERLACED_DCT;
387 
388  if (avctx->flags & AV_CODEC_FLAG_GLOBAL_HEADER)
389  x4->params.b_repeat_headers = 0;
390 
391  x4->enc = xavs_encoder_open(&x4->params);
392  if (!x4->enc)
393  return -1;
394 
395  if (!(x4->pts_buffer = av_mallocz_array((avctx->max_b_frames+1), sizeof(*x4->pts_buffer))))
396  return AVERROR(ENOMEM);
397 
398  /* TAG: Do we have GLOBAL HEADER in AVS */
399  /* We Have PPS and SPS in AVS */
400  if (avctx->flags & AV_CODEC_FLAG_GLOBAL_HEADER && 0) {
401  xavs_nal_t *nal;
402  int nnal, s, i, size;
403  uint8_t *p;
404 
405  s = xavs_encoder_headers(x4->enc, &nal, &nnal);
406 
407  avctx->extradata = p = av_malloc(s);
408  for (i = 0; i < nnal; i++) {
409  /* Don't put the SEI in extradata. */
410  if (nal[i].i_type == NAL_SEI) {
411  x4->sei = av_malloc( 5 + nal[i].i_payload * 4 / 3 );
412  if (xavs_nal_encode(x4->sei, &x4->sei_size, 1, nal + i) < 0)
413  return -1;
414 
415  continue;
416  }
417  size = xavs_nal_encode(p, &s, 1, nal + i);
418  if (size < 0)
419  return -1;
420  p += size;
421  }
422  avctx->extradata_size = p - avctx->extradata;
423  }
424  return 0;
425 }
426 
427 #define OFFSET(x) offsetof(XavsContext, x)
428 #define VE AV_OPT_FLAG_VIDEO_PARAM | AV_OPT_FLAG_ENCODING_PARAM
429 static const AVOption options[] = {
430  { "crf", "Select the quality for constant quality mode", OFFSET(crf), AV_OPT_TYPE_FLOAT, {.dbl = -1 }, -1, FLT_MAX, VE },
431  { "qp", "Constant quantization parameter rate control method",OFFSET(cqp), AV_OPT_TYPE_INT, {.i64 = -1 }, -1, INT_MAX, VE },
432  { "b-bias", "Influences how often B-frames are used", OFFSET(b_bias), AV_OPT_TYPE_INT, {.i64 = INT_MIN}, INT_MIN, INT_MAX, VE },
433  { "cplxblur", "Reduce fluctuations in QP (before curve compression)", OFFSET(cplxblur), AV_OPT_TYPE_FLOAT, {.dbl = -1 }, -1, FLT_MAX, VE},
434  { "direct-pred", "Direct MV prediction mode", OFFSET(direct_pred), AV_OPT_TYPE_INT, {.i64 = -1 }, -1, INT_MAX, VE, "direct-pred" },
435  { "none", NULL, 0, AV_OPT_TYPE_CONST, { .i64 = XAVS_DIRECT_PRED_NONE }, 0, 0, VE, "direct-pred" },
436  { "spatial", NULL, 0, AV_OPT_TYPE_CONST, { .i64 = XAVS_DIRECT_PRED_SPATIAL }, 0, 0, VE, "direct-pred" },
437  { "temporal", NULL, 0, AV_OPT_TYPE_CONST, { .i64 = XAVS_DIRECT_PRED_TEMPORAL }, 0, 0, VE, "direct-pred" },
438  { "auto", NULL, 0, AV_OPT_TYPE_CONST, { .i64 = XAVS_DIRECT_PRED_AUTO }, 0, 0, VE, "direct-pred" },
439  { "aud", "Use access unit delimiters.", OFFSET(aud), AV_OPT_TYPE_BOOL, {.i64 = -1 }, -1, 1, VE},
440  { "mbtree", "Use macroblock tree ratecontrol.", OFFSET(mbtree), AV_OPT_TYPE_BOOL, {.i64 = -1 }, -1, 1, VE},
441  { "mixed-refs", "One reference per partition, as opposed to one reference per macroblock", OFFSET(mixed_refs), AV_OPT_TYPE_BOOL, {.i64 = -1}, -1, 1, VE },
442  { "fast-pskip", NULL, OFFSET(fast_pskip), AV_OPT_TYPE_BOOL, {.i64 = -1 }, -1, 1, VE},
443  { "motion-est", "Set motion estimation method", OFFSET(motion_est), AV_OPT_TYPE_INT, { .i64 = XAVS_ME_DIA }, -1, XAVS_ME_TESA, VE, "motion-est"},
444  { "dia", NULL, 0, AV_OPT_TYPE_CONST, { .i64 = XAVS_ME_DIA }, INT_MIN, INT_MAX, VE, "motion-est" },
445  { "hex", NULL, 0, AV_OPT_TYPE_CONST, { .i64 = XAVS_ME_HEX }, INT_MIN, INT_MAX, VE, "motion-est" },
446  { "umh", NULL, 0, AV_OPT_TYPE_CONST, { .i64 = XAVS_ME_UMH }, INT_MIN, INT_MAX, VE, "motion-est" },
447  { "esa", NULL, 0, AV_OPT_TYPE_CONST, { .i64 = XAVS_ME_ESA }, INT_MIN, INT_MAX, VE, "motion-est" },
448  { "tesa", NULL, 0, AV_OPT_TYPE_CONST, { .i64 = XAVS_ME_TESA }, INT_MIN, INT_MAX, VE, "motion-est" },
449  { "b_strategy", "Strategy to choose between I/P/B-frames", OFFSET(b_frame_strategy), AV_OPT_TYPE_INT, {.i64 = 0 }, 0, 2, VE},
450  { "chromaoffset", "QP difference between chroma and luma", OFFSET(chroma_offset), AV_OPT_TYPE_INT, {.i64 = 0 }, INT_MIN, INT_MAX, VE},
451  { "sc_threshold", "Scene change threshold", OFFSET(scenechange_threshold), AV_OPT_TYPE_INT, {.i64 = 0 }, 0, INT_MAX, VE},
452  { "noise_reduction", "Noise reduction", OFFSET(noise_reduction), AV_OPT_TYPE_INT, {.i64 = 0 }, 0, INT_MAX, VE},
453 
454  { NULL },
455 };
456 
457 static const AVClass xavs_class = {
458  .class_name = "libxavs",
459  .item_name = av_default_item_name,
460  .option = options,
461  .version = LIBAVUTIL_VERSION_INT,
462 };
463 
464 static const AVCodecDefault xavs_defaults[] = {
465  { "b", "0" },
466  { NULL },
467 };
468 
470  .name = "libxavs",
471  .long_name = NULL_IF_CONFIG_SMALL("libxavs Chinese AVS (Audio Video Standard)"),
472  .type = AVMEDIA_TYPE_VIDEO,
473  .id = AV_CODEC_ID_CAVS,
474  .priv_data_size = sizeof(XavsContext),
475  .init = XAVS_init,
476  .encode2 = XAVS_frame,
477  .close = XAVS_close,
480  .priv_class = &xavs_class,
481  .defaults = xavs_defaults,
482  .wrapper_name = "libxavs",
483 };
#define NULL
Definition: coverity.c:32
#define VE
Definition: libxavs.c:428
int chroma_offset
Definition: libxavs.c:61
This structure describes decoded (raw) audio or video data.
Definition: frame.h:308
AVOption.
Definition: opt.h:248
int ff_side_data_set_encoder_stats(AVPacket *pkt, int quality, int64_t *error, int error_count, int pict_type)
Definition: avpacket.c:729
#define AV_CODEC_FLAG_INTERLACED_DCT
Use interlaced DCT.
Definition: avcodec.h:321
float qblur
amount of qscale smoothing over time (0.0-1.0)
Definition: avcodec.h:1361
#define AV_LOG_WARNING
Something somehow does not look correct.
Definition: log.h:200
int64_t bit_rate
the average bitrate
Definition: avcodec.h:576
#define LIBAVUTIL_VERSION_INT
Definition: version.h:85
Memory handling functions.
static av_cold int init(AVCodecContext *avctx)
Definition: avrndec.c:35
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...
Definition: avcodec.h:786
int rc_initial_buffer_occupancy
Number of bits which should be loaded into the rc buffer before decoding starts.
Definition: avcodec.h:1432
xavs_t * enc
Definition: libxavs.c:45
int num
Numerator.
Definition: rational.h:59
int size
Definition: packet.h:364
const char * av_default_item_name(void *ptr)
Return the context name.
Definition: log.c:235
AVRational sample_aspect_ratio
sample aspect ratio (0 if unknown) That is the width of a pixel divided by the height of the pixel...
Definition: avcodec.h:905
int end_of_stream
Definition: libxavs.c:49
static void XAVS_log(void *p, int level, const char *fmt, va_list args)
Definition: libxavs.c:69
static AVPacket pkt
#define AV_CODEC_CAP_AUTO_THREADS
Codec supports avctx->thread_count == 0 (auto).
Definition: codec.h:118
AVCodec.
Definition: codec.h:190
static const AVOption options[]
Definition: libxavs.c:429
AVRational time_base
This is the fundamental unit of time (in seconds) in terms of which frame timestamps are represented...
Definition: avcodec.h:649
Undefined.
Definition: avutil.h:273
static av_cold int XAVS_close(AVCodecContext *avctx)
Definition: libxavs.c:227
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:72
#define AV_CODEC_CAP_DELAY
Encoder or decoder requires flushing with NULL input at the end in order to give the complete and cor...
Definition: codec.h:75
int ff_alloc_packet2(AVCodecContext *avctx, AVPacket *avpkt, int64_t size, int64_t min_size)
Check AVPacket size and/or allocate data.
Definition: encode.c:33
int bit_rate_tolerance
number of bits the bitstream is allowed to diverge from the reference.
Definition: avcodec.h:584
uint8_t * sei
Definition: libxavs.c:47
uint8_t
#define av_cold
Definition: attributes.h:88
#define av_malloc(s)
AVOptions.
int me_range
maximum motion estimation search range in subpel units If 0 then no limit.
Definition: avcodec.h:997
float b_quant_factor
qscale factor between IP and B-frames If > 0 then the last P-frame quantizer will be used (q= lastp_q...
Definition: avcodec.h:795
int64_t pts
Presentation timestamp in time_base units (time when frame should be shown to user).
Definition: frame.h:401
uint8_t * extradata
some codecs need / can use extradata like Huffman tables.
Definition: avcodec.h:627
int me_cmp
motion estimation comparison function
Definition: avcodec.h:912
uint8_t * data
Definition: packet.h:363
ptrdiff_t size
Definition: opengl_enc.c:100
#define FF_CMP_CHROMA
Definition: avcodec.h:947
#define AV_INPUT_BUFFER_MIN_SIZE
minimum encoding buffer size Used to avoid some checks during header writing.
Definition: avcodec.h:222
static int encode_nals(AVCodecContext *ctx, AVPacket *pkt, xavs_nal_t *nals, int nnal)
Definition: libxavs.c:84
int b_frame_strategy
Definition: libxavs.c:60
#define AV_PKT_FLAG_KEY
The packet contains a keyframe.
Definition: packet.h:396
#define AV_LOG_ERROR
Something went wrong and cannot losslessly be recovered.
Definition: log.h:194
int has_b_frames
Size of the frame reordering buffer in the decoder.
Definition: avcodec.h:816
#define END_OF_STREAM
Definition: libxavs.c:36
int qmax
maximum quantizer
Definition: avcodec.h:1375
static av_cold int XAVS_init(AVCodecContext *avctx)
Definition: libxavs.c:241
#define NULL_IF_CONFIG_SMALL(x)
Return NULL if CONFIG_SMALL is true, otherwise the argument without modification. ...
Definition: internal.h:153
#define AV_LOG_DEBUG
Stuff which is only useful for libav* developers.
Definition: log.h:215
int b_bias
Definition: libxavs.c:52
void av_vlog(void *avcl, int level, const char *fmt, va_list vl)
Send the specified message to the log if the level is less than or equal to the current av_log_level...
Definition: log.c:424
int flags
AV_CODEC_FLAG_*.
Definition: avcodec.h:606
const char * name
Name of the codec implementation.
Definition: codec.h:197
float i_quant_factor
qscale factor between P- and I-frames If > 0 then the last P-frame quantizer will be used (q = lastp_...
Definition: avcodec.h:831
int mixed_refs
Definition: libxavs.c:59
int fast_pskip
Definition: libxavs.c:56
int flags
A combination of AV_PKT_FLAG values.
Definition: packet.h:369
int rc_buffer_size
decoder bitstream buffer size
Definition: avcodec.h:1389
int direct_pred
Definition: libxavs.c:54
common internal API header
int refs
number of reference frames
Definition: avcodec.h:1114
static const AVCodecDefault xavs_defaults[]
Definition: libxavs.c:464
enum AVPictureType pict_type
Picture type of the frame.
Definition: frame.h:391
int out_frame_count
Definition: libxavs.c:66
int noise_reduction
Definition: libxavs.c:63
int width
picture width / height.
Definition: avcodec.h:699
attribute_deprecated int noise_reduction
Definition: avcodec.h:1044
AVFormatContext * ctx
Definition: movenc.c:48
#define AV_CODEC_FLAG_PSNR
error[?] variables will be set during encoding.
Definition: avcodec.h:312
#define AV_CODEC_FLAG_PASS1
Use internal 2pass ratecontrol in first pass mode.
Definition: avcodec.h:296
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
#define s(width, name)
Definition: cbs_vp9.c:257
int level
level
Definition: avcodec.h:1982
int quality
quality (between 1 (good) and FF_LAMBDA_MAX (bad))
Definition: frame.h:431
static const AVClass xavs_class
Definition: libxavs.c:457
int max_qdiff
maximum quantizer difference between frames
Definition: avcodec.h:1382
xavs_param_t params
Definition: libxavs.c:44
int thread_count
thread count is used to decide how many independent tasks should be passed to execute() ...
Definition: avcodec.h:1785
if(ret)
static int XAVS_frame(AVCodecContext *avctx, AVPacket *pkt, const AVFrame *frame, int *got_packet)
Definition: libxavs.c:119
int motion_est
Definition: libxavs.c:57
float cplxblur
Definition: libxavs.c:53
#define AV_LOG_INFO
Standard information.
Definition: log.h:205
Libavcodec external API header.
attribute_deprecated int scenechange_threshold
Definition: avcodec.h:1040
int mbtree
Definition: libxavs.c:58
int linesize[AV_NUM_DATA_POINTERS]
For video, size in bytes of each picture line.
Definition: frame.h:339
attribute_deprecated int b_frame_strategy
Definition: avcodec.h:800
main external API structure.
Definition: avcodec.h:526
int qmin
minimum quantizer
Definition: avcodec.h:1368
int extradata_size
Definition: avcodec.h:628
int scenechange_threshold
Definition: libxavs.c:62
int sei_size
Definition: libxavs.c:48
Describe the class of an AVClass context structure.
Definition: log.h:67
attribute_deprecated int chromaoffset
Definition: avcodec.h:1119
float qcompress
amount of qscale change between easy & hard scenes (0.0-1.0)
Definition: avcodec.h:1360
static enum AVPixelFormat pix_fmts[]
Definition: libkvazaar.c:270
uint8_t * data[AV_NUM_DATA_POINTERS]
pointer to the picture/channel planes.
Definition: frame.h:322
uint8_t level
Definition: svq3.c:209
#define AV_CODEC_FLAG_GLOBAL_HEADER
Place global headers in extradata instead of every keyframe.
Definition: avcodec.h:329
int gop_size
the number of pictures in a group of pictures, or 0 for intra_only
Definition: avcodec.h:721
int cqp
Definition: libxavs.c:51
planar YUV 4:2:0, 12bpp, (1 Cr & Cb sample per 2x2 Y samples)
Definition: pixfmt.h:66
#define FF_DISABLE_DEPRECATION_WARNINGS
Definition: internal.h:84
common internal api header.
Bi-dir predicted.
Definition: avutil.h:276
attribute_deprecated AVFrame * coded_frame
the picture in the bitstream
Definition: avcodec.h:1776
int den
Denominator.
Definition: rational.h:60
int trellis
trellis RD quantization
Definition: avcodec.h:1475
#define AV_CODEC_FLAG_PASS2
Use internal 2pass ratecontrol in second pass mode.
Definition: avcodec.h:300
void * priv_data
Definition: avcodec.h:553
#define FF_ENABLE_DEPRECATION_WARNINGS
Definition: internal.h:85
AVCodec ff_libxavs_encoder
Definition: libxavs.c:469
int key_frame
1 -> keyframe, 0-> not
Definition: frame.h:386
#define FF_QP2LAMBDA
factor to convert from H.263 QP to lambda
Definition: avutil.h:227
float crf
Definition: libxavs.c:50
int64_t dts
Decompression timestamp in AVStream->time_base units; the time at which the packet is decompressed...
Definition: packet.h:362
int frame_number
Frame counter, set by libavcodec.
Definition: avcodec.h:1217
#define av_freep(p)
int64_t * pts_buffer
Definition: libxavs.c:65
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
#define OFFSET(x)
Definition: libxavs.c:427
AVPixelFormat
Pixel format.
Definition: pixfmt.h:64
This structure stores compressed data.
Definition: packet.h:340
int aud
Definition: libxavs.c:55
int me_subpel_quality
subpel ME quality
Definition: avcodec.h:988
int64_t pts
Presentation timestamp in AVStream->time_base units; the time at which the decompressed packet will b...
Definition: packet.h:356
int i
Definition: input.c:407
Predicted.
Definition: avutil.h:275
xavs_picture_t pic
Definition: libxavs.c:46
int64_t rc_max_rate
maximum bitrate
Definition: avcodec.h:1404
void * av_mallocz_array(size_t nmemb, size_t size)
Definition: mem.c:190
int keyint_min
minimum GOP size
Definition: avcodec.h:1107