Libav
libxvid.c
Go to the documentation of this file.
1 /*
2  * Interface to xvidcore for mpeg4 encoding
3  * Copyright (c) 2004 Adam Thayer <krevnik@comcast.net>
4  *
5  * This file is part of Libav.
6  *
7  * Libav 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  * Libav 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 Libav; if not, write to the Free Software
19  * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
20  */
21 
28 #include <xvid.h>
29 #include <unistd.h>
30 #include "avcodec.h"
31 #include "libavutil/cpu.h"
32 #include "libavutil/intreadwrite.h"
33 #include "libavutil/mathematics.h"
34 #include "libxvid.h"
35 #include "mpegvideo.h"
36 
40 #define BUFFER_SIZE 1024
41 #define BUFFER_REMAINING(x) (BUFFER_SIZE - strlen(x))
42 #define BUFFER_CAT(x) (&((x)[strlen(x)]))
43 
48 struct xvid_context {
49  AVClass *class;
51  int xsize;
52  int ysize;
53  int vop_flags;
54  int vol_flags;
55  int me_flags;
56  int qscale;
58  char *twopassbuffer;
60  char *twopassfile;
61  unsigned char *intra_matrix;
62  unsigned char *inter_matrix;
63  int lumi_aq;
65  int ssim;
66  int ssim_acc;
67  int gmc;
68 };
69 
73 struct xvid_ff_pass1 {
74  int version;
76 };
77 
78 /*
79  * Xvid 2-Pass Kludge Section
80  *
81  * Xvid's default 2-pass doesn't allow us to create data as we need to, so
82  * this section spends time replacing the first pass plugin so we can write
83  * statistic information as libavcodec requests in. We have another kludge
84  * that allows us to pass data to the second pass in Xvid without a custom
85  * rate-control plugin.
86  */
87 
95 static int xvid_ff_2pass_create(xvid_plg_create_t * param,
96  void ** handle) {
97  struct xvid_ff_pass1 *x = (struct xvid_ff_pass1 *)param->param;
98  char *log = x->context->twopassbuffer;
99 
100  /* Do a quick bounds check */
101  if (!log)
102  return XVID_ERR_FAIL;
103 
104  /* We use snprintf() */
105  /* This is because we can safely prevent a buffer overflow */
106  log[0] = 0;
107  snprintf(log, BUFFER_REMAINING(log),
108  "# avconv 2-pass log file, using xvid codec\n");
109  snprintf(BUFFER_CAT(log), BUFFER_REMAINING(log),
110  "# Do not modify. libxvidcore version: %d.%d.%d\n\n",
111  XVID_VERSION_MAJOR(XVID_VERSION),
112  XVID_VERSION_MINOR(XVID_VERSION),
113  XVID_VERSION_PATCH(XVID_VERSION));
114 
115  *handle = x->context;
116  return 0;
117 }
118 
126 static int xvid_ff_2pass_destroy(struct xvid_context *ref,
127  xvid_plg_destroy_t *param) {
128  /* Currently cannot think of anything to do on destruction */
129  /* Still, the framework should be here for reference/use */
130  if (ref->twopassbuffer)
131  ref->twopassbuffer[0] = 0;
132  return 0;
133 }
134 
142 static int xvid_ff_2pass_before(struct xvid_context *ref,
143  xvid_plg_data_t *param) {
144  int motion_remove;
145  int motion_replacements;
146  int vop_remove;
147 
148  /* Nothing to do here, result is changed too much */
149  if( param->zone && param->zone->mode == XVID_ZONE_QUANT )
150  return 0;
151 
152  /* We can implement a 'turbo' first pass mode here */
153  param->quant = 2;
154 
155  /* Init values */
156  motion_remove = ~XVID_ME_CHROMA_PVOP &
157  ~XVID_ME_CHROMA_BVOP &
158  ~XVID_ME_EXTSEARCH16 &
159  ~XVID_ME_ADVANCEDDIAMOND16;
160  motion_replacements = XVID_ME_FAST_MODEINTERPOLATE |
161  XVID_ME_SKIP_DELTASEARCH |
162  XVID_ME_FASTREFINE16 |
163  XVID_ME_BFRAME_EARLYSTOP;
164  vop_remove = ~XVID_VOP_MODEDECISION_RD &
165  ~XVID_VOP_FAST_MODEDECISION_RD &
166  ~XVID_VOP_TRELLISQUANT &
167  ~XVID_VOP_INTER4V &
168  ~XVID_VOP_HQACPRED;
169 
170  param->vol_flags &= ~XVID_VOL_GMC;
171  param->vop_flags &= vop_remove;
172  param->motion_flags &= motion_remove;
173  param->motion_flags |= motion_replacements;
174 
175  return 0;
176 }
177 
185 static int xvid_ff_2pass_after(struct xvid_context *ref,
186  xvid_plg_data_t *param) {
187  char *log = ref->twopassbuffer;
188  const char *frame_types = " ipbs";
189  char frame_type;
190 
191  /* Quick bounds check */
192  if (!log)
193  return XVID_ERR_FAIL;
194 
195  /* Convert the type given to us into a character */
196  if( param->type < 5 && param->type > 0 ) {
197  frame_type = frame_types[param->type];
198  } else {
199  return XVID_ERR_FAIL;
200  }
201 
202  snprintf(BUFFER_CAT(log), BUFFER_REMAINING(log),
203  "%c %d %d %d %d %d %d\n",
204  frame_type, param->stats.quant, param->stats.kblks, param->stats.mblks,
205  param->stats.ublks, param->stats.length, param->stats.hlength);
206 
207  return 0;
208 }
209 
221 static int xvid_ff_2pass(void *ref, int cmd, void *p1, void *p2)
222 {
223  switch( cmd ) {
224  case XVID_PLG_INFO:
225  case XVID_PLG_FRAME:
226  return 0;
227 
228  case XVID_PLG_BEFORE:
229  return xvid_ff_2pass_before(ref, p1);
230 
231  case XVID_PLG_CREATE:
232  return xvid_ff_2pass_create(p1, p2);
233 
234  case XVID_PLG_AFTER:
235  return xvid_ff_2pass_after(ref, p1);
236 
237  case XVID_PLG_DESTROY:
238  return xvid_ff_2pass_destroy(ref, p1);
239 
240  default:
241  return XVID_ERR_FAIL;
242  }
243 }
244 
259  AVPacket *pkt,
260  unsigned int header_len,
261  unsigned int frame_len) {
262  int vo_len = 0, i;
263 
264  for( i = 0; i < header_len - 3; i++ ) {
265  if( pkt->data[i] == 0x00 &&
266  pkt->data[i+1] == 0x00 &&
267  pkt->data[i+2] == 0x01 &&
268  pkt->data[i+3] == 0xB6 ) {
269  vo_len = i;
270  break;
271  }
272  }
273 
274  if( vo_len > 0 ) {
275  /* We need to store the header, so extract it */
276  if (!avctx->extradata) {
277  avctx->extradata = av_malloc(vo_len);
278  memcpy(avctx->extradata, pkt->data, vo_len);
279  avctx->extradata_size = vo_len;
280  }
281  /* Less dangerous now, memmove properly copies the two
282  chunks of overlapping data */
283  memmove(pkt->data, &pkt->data[vo_len], frame_len - vo_len);
284  pkt->size = frame_len - vo_len;
285  }
286  return 0;
287 }
288 
299 {
300  int frate, fbase;
301  int est_frate, est_fbase;
302  int gcd;
303  float est_fps, fps;
304 
305  frate = avctx->time_base.den;
306  fbase = avctx->time_base.num;
307 
308  gcd = av_gcd(frate, fbase);
309  if( gcd > 1 ) {
310  frate /= gcd;
311  fbase /= gcd;
312  }
313 
314  if( frate <= 65000 && fbase <= 65000 ) {
315  avctx->time_base.den = frate;
316  avctx->time_base.num = fbase;
317  return;
318  }
319 
320  fps = (float)frate / (float)fbase;
321  est_fps = roundf(fps * 1000.0) / 1000.0;
322 
323  est_frate = (int)est_fps;
324  if( est_fps > (int)est_fps ) {
325  est_frate = (est_frate + 1) * 1000;
326  est_fbase = (int)roundf((float)est_frate / est_fps);
327  } else
328  est_fbase = 1;
329 
330  gcd = av_gcd(est_frate, est_fbase);
331  if( gcd > 1 ) {
332  est_frate /= gcd;
333  est_fbase /= gcd;
334  }
335 
336  if( fbase > est_fbase ) {
337  avctx->time_base.den = est_frate;
338  avctx->time_base.num = est_fbase;
339  av_log(avctx, AV_LOG_DEBUG,
340  "Xvid: framerate re-estimated: %.2f, %.3f%% correction\n",
341  est_fps, (((est_fps - fps)/fps) * 100.0));
342  } else {
343  avctx->time_base.den = frate;
344  avctx->time_base.num = fbase;
345  }
346 }
347 
349  int xerr, i;
350  int xvid_flags = avctx->flags;
351  struct xvid_context *x = avctx->priv_data;
352  uint16_t *intra, *inter;
353  int fd;
354 
355  xvid_plugin_single_t single = { 0 };
356  struct xvid_ff_pass1 rc2pass1 = { 0 };
357  xvid_plugin_2pass2_t rc2pass2 = { 0 };
358  xvid_plugin_lumimasking_t masking_l = { 0 }; /* For lumi masking */
359  xvid_plugin_lumimasking_t masking_v = { 0 }; /* For variance AQ */
360  xvid_plugin_ssim_t ssim = { 0 };
361  xvid_gbl_init_t xvid_gbl_init = { 0 };
362  xvid_enc_create_t xvid_enc_create = { 0 };
363  xvid_enc_plugin_t plugins[7];
364 
365  /* Bring in VOP flags from avconv command-line */
366  x->vop_flags = XVID_VOP_HALFPEL; /* Bare minimum quality */
367  if( xvid_flags & CODEC_FLAG_4MV )
368  x->vop_flags |= XVID_VOP_INTER4V; /* Level 3 */
369  if( avctx->trellis
370  )
371  x->vop_flags |= XVID_VOP_TRELLISQUANT; /* Level 5 */
372  if( xvid_flags & CODEC_FLAG_AC_PRED )
373  x->vop_flags |= XVID_VOP_HQACPRED; /* Level 6 */
374  if( xvid_flags & CODEC_FLAG_GRAY )
375  x->vop_flags |= XVID_VOP_GREYSCALE;
376 
377  /* Decide which ME quality setting to use */
378  x->me_flags = 0;
379  switch( avctx->me_method ) {
380  case ME_FULL: /* Quality 6 */
381  x->me_flags |= XVID_ME_EXTSEARCH16
382  | XVID_ME_EXTSEARCH8;
383 
384  case ME_EPZS: /* Quality 4 */
385  x->me_flags |= XVID_ME_ADVANCEDDIAMOND8
386  | XVID_ME_HALFPELREFINE8
387  | XVID_ME_CHROMA_PVOP
388  | XVID_ME_CHROMA_BVOP;
389 
390  case ME_LOG: /* Quality 2 */
391  case ME_PHODS:
392  case ME_X1:
393  x->me_flags |= XVID_ME_ADVANCEDDIAMOND16
394  | XVID_ME_HALFPELREFINE16;
395 
396  case ME_ZERO: /* Quality 0 */
397  default:
398  break;
399  }
400 
401  /* Decide how we should decide blocks */
402  switch( avctx->mb_decision ) {
403  case 2:
404  x->vop_flags |= XVID_VOP_MODEDECISION_RD;
405  x->me_flags |= XVID_ME_HALFPELREFINE8_RD
406  | XVID_ME_QUARTERPELREFINE8_RD
407  | XVID_ME_EXTSEARCH_RD
408  | XVID_ME_CHECKPREDICTION_RD;
409  case 1:
410  if( !(x->vop_flags & XVID_VOP_MODEDECISION_RD) )
411  x->vop_flags |= XVID_VOP_FAST_MODEDECISION_RD;
412  x->me_flags |= XVID_ME_HALFPELREFINE16_RD
413  | XVID_ME_QUARTERPELREFINE16_RD;
414 
415  default:
416  break;
417  }
418 
419  /* Bring in VOL flags from avconv command-line */
420 #if FF_API_GMC
421  if (avctx->flags & CODEC_FLAG_GMC)
422  x->gmc = 1;
423 #endif
424 
425  x->vol_flags = 0;
426  if (x->gmc) {
427  x->vol_flags |= XVID_VOL_GMC;
428  x->me_flags |= XVID_ME_GME_REFINE;
429  }
430  if( xvid_flags & CODEC_FLAG_QPEL ) {
431  x->vol_flags |= XVID_VOL_QUARTERPEL;
432  x->me_flags |= XVID_ME_QUARTERPELREFINE16;
433  if( x->vop_flags & XVID_VOP_INTER4V )
434  x->me_flags |= XVID_ME_QUARTERPELREFINE8;
435  }
436 
437  xvid_gbl_init.version = XVID_VERSION;
438  xvid_gbl_init.debug = 0;
439  xvid_gbl_init.cpu_flags = 0;
440 
441  /* Initialize */
442  xvid_global(NULL, XVID_GBL_INIT, &xvid_gbl_init, NULL);
443 
444  /* Create the encoder reference */
445  xvid_enc_create.version = XVID_VERSION;
446 
447  /* Store the desired frame size */
448  xvid_enc_create.width = x->xsize = avctx->width;
449  xvid_enc_create.height = x->ysize = avctx->height;
450 
451  /* Xvid can determine the proper profile to use */
452  /* xvid_enc_create.profile = XVID_PROFILE_S_L3; */
453 
454  /* We don't use zones */
455  xvid_enc_create.zones = NULL;
456  xvid_enc_create.num_zones = 0;
457 
458  xvid_enc_create.num_threads = avctx->thread_count;
459 
460  xvid_enc_create.plugins = plugins;
461  xvid_enc_create.num_plugins = 0;
462 
463  /* Initialize Buffers */
464  x->twopassbuffer = NULL;
465  x->old_twopassbuffer = NULL;
466  x->twopassfile = NULL;
467 
468  if( xvid_flags & CODEC_FLAG_PASS1 ) {
469  rc2pass1.version = XVID_VERSION;
470  rc2pass1.context = x;
473  if (!x->twopassbuffer || !x->old_twopassbuffer) {
474  av_log(avctx, AV_LOG_ERROR,
475  "Xvid: Cannot allocate 2-pass log buffers\n");
476  return -1;
477  }
478  x->twopassbuffer[0] = x->old_twopassbuffer[0] = 0;
479 
480  plugins[xvid_enc_create.num_plugins].func = xvid_ff_2pass;
481  plugins[xvid_enc_create.num_plugins].param = &rc2pass1;
482  xvid_enc_create.num_plugins++;
483  } else if( xvid_flags & CODEC_FLAG_PASS2 ) {
484  rc2pass2.version = XVID_VERSION;
485  rc2pass2.bitrate = avctx->bit_rate;
486 
487  fd = ff_tempfile("xvidff.", &x->twopassfile);
488  if( fd == -1 ) {
489  av_log(avctx, AV_LOG_ERROR,
490  "Xvid: Cannot write 2-pass pipe\n");
491  return -1;
492  }
493 
494  if (!avctx->stats_in) {
495  av_log(avctx, AV_LOG_ERROR,
496  "Xvid: No 2-pass information loaded for second pass\n");
497  return -1;
498  }
499 
500  if( strlen(avctx->stats_in) >
501  write(fd, avctx->stats_in, strlen(avctx->stats_in)) ) {
502  close(fd);
503  av_log(avctx, AV_LOG_ERROR,
504  "Xvid: Cannot write to 2-pass pipe\n");
505  return -1;
506  }
507 
508  close(fd);
509  rc2pass2.filename = x->twopassfile;
510  plugins[xvid_enc_create.num_plugins].func = xvid_plugin_2pass2;
511  plugins[xvid_enc_create.num_plugins].param = &rc2pass2;
512  xvid_enc_create.num_plugins++;
513  } else if( !(xvid_flags & CODEC_FLAG_QSCALE) ) {
514  /* Single Pass Bitrate Control! */
515  single.version = XVID_VERSION;
516  single.bitrate = avctx->bit_rate;
517 
518  plugins[xvid_enc_create.num_plugins].func = xvid_plugin_single;
519  plugins[xvid_enc_create.num_plugins].param = &single;
520  xvid_enc_create.num_plugins++;
521  }
522 
523  if (avctx->lumi_masking != 0.0)
524  x->lumi_aq = 1;
525 
526  if (x->lumi_aq && x->variance_aq) {
527  x->variance_aq = 0;
528  av_log(avctx, AV_LOG_WARNING,
529  "variance_aq is ignored when lumi_aq is set.\n");
530  }
531 
532  /* Luminance Masking */
533  if (x->lumi_aq) {
534  masking_l.method = 0;
535  plugins[xvid_enc_create.num_plugins].func = xvid_plugin_lumimasking;
536 
537  /* The old behavior is that when avctx->lumi_masking is specified,
538  * plugins[...].param = NULL. Trying to keep the old behavior here. */
539  plugins[xvid_enc_create.num_plugins].param = avctx->lumi_masking ? NULL
540  : &masking_l;
541  xvid_enc_create.num_plugins++;
542  }
543 
544  /* Variance AQ */
545  if (x->variance_aq) {
546  masking_v.method = 1;
547  plugins[xvid_enc_create.num_plugins].func = xvid_plugin_lumimasking;
548  plugins[xvid_enc_create.num_plugins].param = &masking_v;
549  xvid_enc_create.num_plugins++;
550  }
551 
552  /* SSIM */
553  if (x->ssim) {
554  plugins[xvid_enc_create.num_plugins].func = xvid_plugin_ssim;
555  ssim.b_printstat = x->ssim == 2;
556  ssim.acc = x->ssim_acc;
557  ssim.cpu_flags = xvid_gbl_init.cpu_flags;
558  ssim.b_visualize = 0;
559  plugins[xvid_enc_create.num_plugins].param = &ssim;
560  xvid_enc_create.num_plugins++;
561  }
562 
563  /* Frame Rate and Key Frames */
564  xvid_correct_framerate(avctx);
565  xvid_enc_create.fincr = avctx->time_base.num;
566  xvid_enc_create.fbase = avctx->time_base.den;
567  if( avctx->gop_size > 0 )
568  xvid_enc_create.max_key_interval = avctx->gop_size;
569  else
570  xvid_enc_create.max_key_interval = 240; /* Xvid's best default */
571 
572  /* Quants */
573  if( xvid_flags & CODEC_FLAG_QSCALE ) x->qscale = 1;
574  else x->qscale = 0;
575 
576  xvid_enc_create.min_quant[0] = avctx->qmin;
577  xvid_enc_create.min_quant[1] = avctx->qmin;
578  xvid_enc_create.min_quant[2] = avctx->qmin;
579  xvid_enc_create.max_quant[0] = avctx->qmax;
580  xvid_enc_create.max_quant[1] = avctx->qmax;
581  xvid_enc_create.max_quant[2] = avctx->qmax;
582 
583  /* Quant Matrices */
584  x->intra_matrix = x->inter_matrix = NULL;
585  if( avctx->mpeg_quant )
586  x->vol_flags |= XVID_VOL_MPEGQUANT;
587  if( (avctx->intra_matrix || avctx->inter_matrix) ) {
588  x->vol_flags |= XVID_VOL_MPEGQUANT;
589 
590  if( avctx->intra_matrix ) {
591  intra = avctx->intra_matrix;
592  x->intra_matrix = av_malloc(sizeof(unsigned char) * 64);
593  } else
594  intra = NULL;
595  if( avctx->inter_matrix ) {
596  inter = avctx->inter_matrix;
597  x->inter_matrix = av_malloc(sizeof(unsigned char) * 64);
598  } else
599  inter = NULL;
600 
601  for( i = 0; i < 64; i++ ) {
602  if( intra )
603  x->intra_matrix[i] = (unsigned char)intra[i];
604  if( inter )
605  x->inter_matrix[i] = (unsigned char)inter[i];
606  }
607  }
608 
609  /* Misc Settings */
610  xvid_enc_create.frame_drop_ratio = 0;
611  xvid_enc_create.global = 0;
612  if( xvid_flags & CODEC_FLAG_CLOSED_GOP )
613  xvid_enc_create.global |= XVID_GLOBAL_CLOSED_GOP;
614 
615  /* Determines which codec mode we are operating in */
616  avctx->extradata = NULL;
617  avctx->extradata_size = 0;
618  if( xvid_flags & CODEC_FLAG_GLOBAL_HEADER ) {
619  /* In this case, we are claiming to be MPEG4 */
620  x->quicktime_format = 1;
621  avctx->codec_id = AV_CODEC_ID_MPEG4;
622  } else {
623  /* We are claiming to be Xvid */
624  x->quicktime_format = 0;
625  if(!avctx->codec_tag)
626  avctx->codec_tag = AV_RL32("xvid");
627  }
628 
629  /* Bframes */
630  xvid_enc_create.max_bframes = avctx->max_b_frames;
631  xvid_enc_create.bquant_offset = 100 * avctx->b_quant_offset;
632  xvid_enc_create.bquant_ratio = 100 * avctx->b_quant_factor;
633  if( avctx->max_b_frames > 0 && !x->quicktime_format ) xvid_enc_create.global |= XVID_GLOBAL_PACKED;
634 
635  /* Create encoder context */
636  xerr = xvid_encore(NULL, XVID_ENC_CREATE, &xvid_enc_create, NULL);
637  if( xerr ) {
638  av_log(avctx, AV_LOG_ERROR, "Xvid: Could not create encoder reference\n");
639  return -1;
640  }
641 
642  x->encoder_handle = xvid_enc_create.handle;
643  avctx->coded_frame = av_frame_alloc();
644  if (!avctx->coded_frame)
645  return AVERROR(ENOMEM);
646 
647  return 0;
648 }
649 
650 static int xvid_encode_frame(AVCodecContext *avctx, AVPacket *pkt,
651  const AVFrame *picture, int *got_packet)
652 {
653  int xerr, i, ret, user_packet = !!pkt->data;
654  char *tmp;
655  struct xvid_context *x = avctx->priv_data;
656  AVFrame *p = avctx->coded_frame;
657  int mb_width = (avctx->width + 15) / 16;
658  int mb_height = (avctx->height + 15) / 16;
659 
660  xvid_enc_frame_t xvid_enc_frame = { 0 };
661  xvid_enc_stats_t xvid_enc_stats = { 0 };
662 
663  if (!user_packet &&
664  (ret = av_new_packet(pkt, mb_width*mb_height*MAX_MB_BYTES + FF_MIN_BUFFER_SIZE)) < 0) {
665  av_log(avctx, AV_LOG_ERROR, "Error getting output packet.\n");
666  return ret;
667  }
668 
669  /* Start setting up the frame */
670  xvid_enc_frame.version = XVID_VERSION;
671  xvid_enc_stats.version = XVID_VERSION;
672 
673  /* Let Xvid know where to put the frame. */
674  xvid_enc_frame.bitstream = pkt->data;
675  xvid_enc_frame.length = pkt->size;
676 
677  /* Initialize input image fields */
678  if( avctx->pix_fmt != AV_PIX_FMT_YUV420P ) {
679  av_log(avctx, AV_LOG_ERROR, "Xvid: Color spaces other than 420p not supported\n");
680  return -1;
681  }
682 
683  xvid_enc_frame.input.csp = XVID_CSP_PLANAR; /* YUV420P */
684 
685  for( i = 0; i < 4; i++ ) {
686  xvid_enc_frame.input.plane[i] = picture->data[i];
687  xvid_enc_frame.input.stride[i] = picture->linesize[i];
688  }
689 
690  /* Encoder Flags */
691  xvid_enc_frame.vop_flags = x->vop_flags;
692  xvid_enc_frame.vol_flags = x->vol_flags;
693  xvid_enc_frame.motion = x->me_flags;
694  xvid_enc_frame.type =
695  picture->pict_type == AV_PICTURE_TYPE_I ? XVID_TYPE_IVOP :
696  picture->pict_type == AV_PICTURE_TYPE_P ? XVID_TYPE_PVOP :
697  picture->pict_type == AV_PICTURE_TYPE_B ? XVID_TYPE_BVOP :
698  XVID_TYPE_AUTO;
699 
700  /* Pixel aspect ratio setting */
701  if (avctx->sample_aspect_ratio.num < 1 || avctx->sample_aspect_ratio.num > 255 ||
702  avctx->sample_aspect_ratio.den < 1 || avctx->sample_aspect_ratio.den > 255) {
703  av_log(avctx, AV_LOG_ERROR, "Invalid pixel aspect ratio %i/%i\n",
705  return -1;
706  }
707  xvid_enc_frame.par = XVID_PAR_EXT;
708  xvid_enc_frame.par_width = avctx->sample_aspect_ratio.num;
709  xvid_enc_frame.par_height = avctx->sample_aspect_ratio.den;
710 
711  /* Quant Setting */
712  if( x->qscale ) xvid_enc_frame.quant = picture->quality / FF_QP2LAMBDA;
713  else xvid_enc_frame.quant = 0;
714 
715  /* Matrices */
716  xvid_enc_frame.quant_intra_matrix = x->intra_matrix;
717  xvid_enc_frame.quant_inter_matrix = x->inter_matrix;
718 
719  /* Encode */
720  xerr = xvid_encore(x->encoder_handle, XVID_ENC_ENCODE,
721  &xvid_enc_frame, &xvid_enc_stats);
722 
723  /* Two-pass log buffer swapping */
724  avctx->stats_out = NULL;
725  if( x->twopassbuffer ) {
726  tmp = x->old_twopassbuffer;
728  x->twopassbuffer = tmp;
729  x->twopassbuffer[0] = 0;
730  if( x->old_twopassbuffer[0] != 0 ) {
731  avctx->stats_out = x->old_twopassbuffer;
732  }
733  }
734 
735  if (xerr > 0) {
736  *got_packet = 1;
737 
738  p->quality = xvid_enc_stats.quant * FF_QP2LAMBDA;
739  if( xvid_enc_stats.type == XVID_TYPE_PVOP )
741  else if( xvid_enc_stats.type == XVID_TYPE_BVOP )
743  else if( xvid_enc_stats.type == XVID_TYPE_SVOP )
745  else
747  if( xvid_enc_frame.out_flags & XVID_KEYFRAME ) {
748  p->key_frame = 1;
749  pkt->flags |= AV_PKT_FLAG_KEY;
750  if( x->quicktime_format )
751  return xvid_strip_vol_header(avctx, pkt,
752  xvid_enc_stats.hlength, xerr);
753  } else
754  p->key_frame = 0;
755 
756  pkt->size = xerr;
757 
758  return 0;
759  } else {
760  if (!user_packet)
761  av_free_packet(pkt);
762  if (!xerr)
763  return 0;
764  av_log(avctx, AV_LOG_ERROR, "Xvid: Encoding Error Occurred: %i\n", xerr);
765  return -1;
766  }
767 }
768 
770  struct xvid_context *x = avctx->priv_data;
771 
772  xvid_encore(x->encoder_handle, XVID_ENC_DESTROY, NULL, NULL);
773 
774  av_freep(&avctx->extradata);
775  if (x->twopassbuffer) {
778  }
779  av_free(x->twopassfile);
780  av_free(x->intra_matrix);
781  av_free(x->inter_matrix);
782 
783  return 0;
784 }
785 
786 #define OFFSET(x) offsetof(struct xvid_context, x)
787 #define VE AV_OPT_FLAG_VIDEO_PARAM | AV_OPT_FLAG_ENCODING_PARAM
788 static const AVOption options[] = {
789  { "lumi_aq", "Luminance masking AQ", OFFSET(lumi_aq), AV_OPT_TYPE_INT, { .i64 = 0 }, 0, 1, VE },
790  { "variance_aq", "Variance AQ", OFFSET(variance_aq), AV_OPT_TYPE_INT, { .i64 = 0 }, 0, 1, VE },
791  { "ssim", "Show SSIM information to stdout", OFFSET(ssim), AV_OPT_TYPE_INT, { .i64 = 0 }, 0, 2, VE, "ssim" },
792  { "off", NULL, 0, AV_OPT_TYPE_CONST, { .i64 = 0 }, INT_MIN, INT_MAX, VE, "ssim" },
793  { "avg", NULL, 0, AV_OPT_TYPE_CONST, { .i64 = 1 }, INT_MIN, INT_MAX, VE, "ssim" },
794  { "frame", NULL, 0, AV_OPT_TYPE_CONST, { .i64 = 2 }, INT_MIN, INT_MAX, VE, "ssim" },
795  { "ssim_acc", "SSIM accuracy", OFFSET(ssim_acc), AV_OPT_TYPE_INT, { .i64 = 2 }, 0, 4, VE },
796  { "gmc", "use GMC", OFFSET(gmc), AV_OPT_TYPE_INT, { .i64 = 0 }, 0, 1, VE },
797  { NULL },
798 };
799 
800 static const AVClass xvid_class = {
801  .class_name = "libxvid",
802  .item_name = av_default_item_name,
803  .option = options,
804  .version = LIBAVUTIL_VERSION_INT,
805 };
806 
808  .name = "libxvid",
809  .long_name = NULL_IF_CONFIG_SMALL("libxvidcore MPEG-4 part 2"),
810  .type = AVMEDIA_TYPE_VIDEO,
811  .id = AV_CODEC_ID_MPEG4,
812  .priv_data_size = sizeof(struct xvid_context),
813  .init = xvid_encode_init,
814  .encode2 = xvid_encode_frame,
815  .close = xvid_encode_close,
816  .pix_fmts = (const enum AVPixelFormat[]){ AV_PIX_FMT_YUV420P, AV_PIX_FMT_NONE },
817  .priv_class = &xvid_class,
818 };
S(GMC)-VOP MPEG4.
Definition: avutil.h:256
void av_free_packet(AVPacket *pkt)
Free a packet.
Definition: avpacket.c:243
This structure describes decoded (raw) audio or video data.
Definition: frame.h:135
int mpeg_quant
0-> h263 quant 1-> mpeg quant
Definition: avcodec.h:1346
AVOption.
Definition: opt.h:234
char * old_twopassbuffer
Old character buffer (two-pass)
Definition: libxvid.c:59
#define CODEC_FLAG_PASS2
Use internal 2pass ratecontrol in second pass mode.
Definition: avcodec.h:636
AVCodec ff_libxvid_encoder
Definition: libxvid.c:807
#define AV_LOG_WARNING
Something somehow does not look correct.
Definition: log.h:129
#define CODEC_FLAG_PASS1
Use internal 2pass ratecontrol in first pass mode.
Definition: avcodec.h:635
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:1309
#define BUFFER_REMAINING(x)
Definition: libxvid.c:41
int num
numerator
Definition: rational.h:44
int size
Definition: avcodec.h:974
enhanced predictive zonal search
Definition: avcodec.h:550
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:1429
void av_log(void *avcl, int level, const char *fmt,...) av_printf_format(3
Send the specified message to the log if the level is less than or equal to the current av_log_level...
enum AVPixelFormat pix_fmt
Pixel format, see AV_PIX_FMT_xxx.
Definition: avcodec.h:1254
mpegvideo header.
unsigned char * intra_matrix
P-Frame Quant Matrix.
Definition: libxvid.c:61
int ysize
Frame y size.
Definition: libxvid.c:52
AVCodec.
Definition: avcodec.h:2796
int me_flags
Motion Estimation flags.
Definition: libxvid.c:55
uint8_t * extradata
some codecs need / can use extradata like Huffman tables.
Definition: avcodec.h:1164
#define CODEC_FLAG_QPEL
Use qpel MC.
Definition: avcodec.h:614
AVFrame * av_frame_alloc(void)
Allocate an AVFrame and set its fields to default values.
Definition: frame.c:57
common functions for use with the Xvid wrappers
AVRational time_base
This is the fundamental unit of time (in seconds) in terms of which frame timestamps are represented...
Definition: avcodec.h:1175
void av_freep(void *ptr)
Free a memory block which has been allocated with av_malloc(z)() or av_realloc() and set the pointer ...
Definition: mem.c:198
int xsize
Frame x size.
Definition: libxvid.c:51
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:38
#define CODEC_FLAG_GLOBAL_HEADER
Place global headers in extradata instead of every keyframe.
Definition: avcodec.h:657
static int xvid_encode_frame(AVCodecContext *avctx, AVPacket *pkt, const AVFrame *picture, int *got_packet)
Definition: libxvid.c:650
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:1318
const char * name
Name of the codec implementation.
Definition: avcodec.h:2803
int quicktime_format
Are we in a QT-based format?
Definition: libxvid.c:57
struct xvid_context * context
Pointer to private context.
Definition: libxvid.c:75
static int xvid_strip_vol_header(AVCodecContext *avctx, AVPacket *pkt, unsigned int header_len, unsigned int frame_len)
Routine to create a global VO/VOL header for MP4 container.
Definition: libxvid.c:258
float lumi_masking
luminance masking (0-> disabled)
Definition: avcodec.h:1369
#define CODEC_FLAG_AC_PRED
H.263 advanced intra coding / MPEG-4 AC prediction.
Definition: avcodec.h:660
#define AV_PKT_FLAG_KEY
The packet contains a keyframe.
Definition: avcodec.h:1019
static int xvid_ff_2pass(void *ref, int cmd, void *p1, void *p2)
Dispatch function for our custom plugin.
Definition: libxvid.c:221
int av_new_packet(AVPacket *pkt, int size)
Allocate the payload of a packet and initialize its fields with default values.
Definition: avpacket.c:81
no search, that is use 0,0 vector whenever one is needed
Definition: avcodec.h:546
reserved for experiments
Definition: avcodec.h:551
#define AV_LOG_ERROR
Something went wrong and cannot losslessly be recovered.
Definition: log.h:123
void av_free(void *ptr)
Free a memory block which has been allocated with av_malloc(z)() or av_realloc(). ...
Definition: mem.c:186
#define AVERROR(e)
Definition: error.h:43
int qmax
maximum quantizer
Definition: avcodec.h:2080
#define NULL_IF_CONFIG_SMALL(x)
Return NULL if CONFIG_SMALL is true, otherwise the argument without modification. ...
Definition: internal.h:150
#define AV_LOG_DEBUG
Stuff which is only useful for libav* developers.
Definition: log.h:144
int flags
CODEC_FLAG_*.
Definition: avcodec.h:1144
#define CODEC_FLAG_QSCALE
Use fixed qscale.
Definition: avcodec.h:611
int64_t av_const av_gcd(int64_t a, int64_t b)
Return the greatest common divisor of a and b.
Definition: mathematics.c:53
Libavcodec external API header.
AVPixelFormat
Pixel format.
Definition: pixfmt.h:63
int flags
A combination of AV_PKT_FLAG values.
Definition: avcodec.h:979
#define OFFSET(x)
Definition: libxvid.c:786
static av_cold int xvid_encode_close(AVCodecContext *avctx)
Definition: libxvid.c:769
char * twopassfile
second pass temp file name
Definition: libxvid.c:60
static const AVOption options[]
Definition: libxvid.c:788
#define BUFFER_SIZE
Buffer management macros.
Definition: libxvid.c:40
int vop_flags
VOP flags for Xvid encoder.
Definition: libxvid.c:53
int bit_rate
the average bitrate
Definition: avcodec.h:1114
Structure for the private first-pass plugin.
Definition: libxvid.c:73
enum AVPictureType pict_type
Picture type of the frame.
Definition: frame.h:196
int variance_aq
Variance adaptive quantization.
Definition: libxvid.c:64
#define FF_MIN_BUFFER_SIZE
minimum encoding buffer size Used to avoid some checks during header writing.
Definition: avcodec.h:538
#define MAX_MB_BYTES
Definition: mpegvideo.h:74
char * stats_in
pass2 encoding statistics input buffer Concatenated stuff from stats_out of pass1 should be placed he...
Definition: avcodec.h:2300
uint16_t * intra_matrix
custom intra quantization matrix
Definition: avcodec.h:1591
Structure for the private Xvid context.
Definition: libxvid.c:48
int width
picture width / height.
Definition: avcodec.h:1224
static const AVClass xvid_class
Definition: libxvid.c:800
void * av_malloc(size_t size) av_malloc_attrib 1(1)
Allocate a block of size bytes with alignment suitable for all memory accesses (including vectors if ...
Definition: mem.c:62
unsigned char * inter_matrix
I-Frame Quant Matrix.
Definition: libxvid.c:62
int quality
quality (between 1 (good) and FF_LAMBDA_MAX (bad))
Definition: frame.h:235
int mb_decision
macroblock decision mode
Definition: avcodec.h:1581
char * stats_out
pass1 encoding statistics output buffer
Definition: avcodec.h:2292
planar YUV 4:2:0, 12bpp, (1 Cr & Cb sample per 2x2 Y samples)
Definition: pixfmt.h:65
LIBAVUTIL_VERSION_INT
Definition: eval.c:55
int thread_count
thread count is used to decide how many independent tasks should be passed to execute() ...
Definition: avcodec.h:2540
if(ac->has_optimized_func)
int ssim_acc
SSIM accuracy.
Definition: libxvid.c:66
NULL
Definition: eval.c:55
#define av_cold
Definition: attributes.h:66
#define BUFFER_CAT(x)
Definition: libxvid.c:42
enum AVCodecID codec_id
Definition: avcodec.h:1067
main external API structure.
Definition: avcodec.h:1050
static void close(AVCodecParserContext *s)
Definition: h264_parser.c:490
int qmin
minimum quantizer
Definition: avcodec.h:2073
unsigned int codec_tag
fourcc (LSB first, so "ABCD" -> ('D'<<24) + ('C'<<16) + ('B'<<8) + 'A').
Definition: avcodec.h:1082
int extradata_size
Definition: avcodec.h:1165
Describe the class of an AVClass context structure.
Definition: log.h:33
AVFrame * coded_frame
the picture in the bitstream
Definition: avcodec.h:2532
uint8_t * data
Definition: avcodec.h:973
int linesize[AV_NUM_DATA_POINTERS]
For video, size in bytes of each picture line.
Definition: frame.h:153
char * twopassbuffer
Character buffer for two-pass.
Definition: libxvid.c:58
float b_quant_offset
qscale offset between IP and B-frames
Definition: avcodec.h:1331
static av_cold int xvid_encode_init(AVCodecContext *avctx)
Definition: libxvid.c:348
int version
Xvid version.
Definition: libxvid.c:74
#define CODEC_FLAG_CLOSED_GOP
Definition: avcodec.h:663
static av_always_inline av_const float roundf(float x)
Definition: libm.h:158
void * priv_data
Definition: avcodec.h:1092
int gop_size
the number of pictures in a group of pictures, or 0 for intra_only
Definition: avcodec.h:1245
int ssim
SSIM information display mode.
Definition: libxvid.c:65
#define CODEC_FLAG_GRAY
Only decode/encode grayscale.
Definition: avcodec.h:637
int vol_flags
VOL flags for Xvid encoder.
Definition: libxvid.c:54
Bi-dir predicted.
Definition: avutil.h:255
int ff_tempfile(const char *prefix, char **filename)
Definition: libxvid_rc.c:44
int den
denominator
Definition: rational.h:45
static int xvid_ff_2pass_create(xvid_plg_create_t *param, void **handle)
Initialize the two-pass plugin and context.
Definition: libxvid.c:95
int trellis
trellis RD quantization
Definition: avcodec.h:2234
static int xvid_ff_2pass_before(struct xvid_context *ref, xvid_plg_data_t *param)
Enable fast encode mode during the first pass.
Definition: libxvid.c:142
void * encoder_handle
Handle for Xvid encoder.
Definition: libxvid.c:50
#define CODEC_FLAG_GMC
Definition: avcodec.h:619
static int xvid_ff_2pass_after(struct xvid_context *ref, xvid_plg_data_t *param)
Capture statistic data and write it during first pass.
Definition: libxvid.c:185
#define AV_RL32(x)
Definition: intreadwrite.h:248
int key_frame
1 -> keyframe, 0-> not
Definition: frame.h:191
#define VE
Definition: libxvid.c:787
#define FF_QP2LAMBDA
factor to convert from H.263 QP to lambda
Definition: avutil.h:207
uint16_t * inter_matrix
custom inter quantization matrix
Definition: avcodec.h:1598
static int xvid_ff_2pass_destroy(struct xvid_context *ref, xvid_plg_destroy_t *param)
Destroy the two-pass plugin context.
Definition: libxvid.c:126
static void xvid_correct_framerate(AVCodecContext *avctx)
Routine to correct a possibly erroneous framerate being fed to us.
Definition: libxvid.c:298
int me_method
Motion estimation algorithm used for video coding.
Definition: avcodec.h:1263
int qscale
Do we use constant scale?
Definition: libxvid.c:56
av_default_item_name
Return the context name.
Definition: dnxhdenc.c:52
#define CODEC_FLAG_4MV
4 MV per MB allowed / advanced prediction for H.263.
Definition: avcodec.h:612
This structure stores compressed data.
Definition: avcodec.h:950
uint8_t * data[AV_NUM_DATA_POINTERS]
pointer to the picture/channel planes.
Definition: frame.h:141
Predicted.
Definition: avutil.h:254
int lumi_aq
Lumi masking as an aq method.
Definition: libxvid.c:63