Go to the documentation of this file.
   57 #define BUFFER_SIZE         1024 
   58 #define BUFFER_REMAINING(x) (BUFFER_SIZE - strlen(x)) 
   59 #define BUFFER_CAT(x)       (&((x)[strlen(x)])) 
  100                              const AVFrame *picture, 
int *got_packet);
 
  127         return XVID_ERR_FAIL;
 
  133              "# ffmpeg 2-pass log file, using xvid codec\n");
 
  135              "# Do not modify. libxvidcore version: %d.%d.%d\n\n",
 
  136              XVID_VERSION_MAJOR(XVID_VERSION),
 
  137              XVID_VERSION_MINOR(XVID_VERSION),
 
  138              XVID_VERSION_PATCH(XVID_VERSION));
 
  152                                  xvid_plg_destroy_t *param)
 
  156     if (
ref->twopassbuffer)
 
  157         ref->twopassbuffer[0] = 0;
 
  169                                 xvid_plg_data_t *param)
 
  172     int motion_replacements;
 
  176     if (param->zone && param->zone->mode == XVID_ZONE_QUANT)
 
  183     motion_remove       = ~XVID_ME_CHROMA_PVOP &
 
  184                           ~XVID_ME_CHROMA_BVOP &
 
  185                           ~XVID_ME_EXTSEARCH16 &
 
  186                           ~XVID_ME_ADVANCEDDIAMOND16;
 
  187     motion_replacements = XVID_ME_FAST_MODEINTERPOLATE |
 
  188                           XVID_ME_SKIP_DELTASEARCH     |
 
  189                           XVID_ME_FASTREFINE16         |
 
  190                           XVID_ME_BFRAME_EARLYSTOP;
 
  191     vop_remove          = ~XVID_VOP_MODEDECISION_RD      &
 
  192                           ~XVID_VOP_FAST_MODEDECISION_RD &
 
  193                           ~XVID_VOP_TRELLISQUANT         &
 
  197     param->vol_flags    &= ~XVID_VOL_GMC;
 
  198     param->vop_flags    &= vop_remove;
 
  199     param->motion_flags &= motion_remove;
 
  200     param->motion_flags |= motion_replacements;
 
  213                                xvid_plg_data_t *param)
 
  215     char *log = 
ref->twopassbuffer;
 
  216     const char *frame_types = 
" ipbs";
 
  221         return XVID_ERR_FAIL;
 
  224     if (param->type < 5 && param->type > 0)
 
  225         frame_type = frame_types[param->type];
 
  227         return XVID_ERR_FAIL;
 
  230              "%c %d %d %d %d %d %d\n",
 
  231              frame_type, param->stats.quant, param->stats.kblks,
 
  232              param->stats.mblks, param->stats.ublks,
 
  233              param->stats.length, param->stats.hlength);
 
  255     case XVID_PLG_BEFORE:
 
  257     case XVID_PLG_CREATE:
 
  261     case XVID_PLG_DESTROY:
 
  264         return XVID_ERR_FAIL;
 
  282                                  unsigned int header_len,
 
  283                                  unsigned int frame_len)
 
  287     for (
i = 0; 
i < header_len - 3; 
i++) {
 
  309         pkt->
size = frame_len - vo_len;
 
  326     int est_frate, est_fbase;
 
  333     gcd = 
av_gcd(frate, fbase);
 
  339     if (frate <= 65000 && fbase <= 65000) {
 
  345     fps     = (float) frate / (
float) fbase;
 
  346     est_fps = 
roundf(fps * 1000.0) / 1000.0;
 
  348     est_frate = (
int) est_fps;
 
  349     if (est_fps > (
int) est_fps) {
 
  350         est_frate = (est_frate + 1) * 1000;
 
  351         est_fbase = (
int) 
roundf((
float) est_frate / est_fps);
 
  355     gcd = 
av_gcd(est_frate, est_fbase);
 
  361     if (fbase > est_fbase) {
 
  365                "Xvid: framerate re-estimated: %.2f, %.3f%% correction\n",
 
  366                est_fps, (((est_fps - fps) / fps) * 100.0));
 
  375     int xerr, 
i, 
ret = -1;
 
  376     int xvid_flags = avctx->
flags;
 
  378     uint16_t *intra, *inter;
 
  381     xvid_plugin_single_t      single          = { 0 };
 
  383     xvid_plugin_2pass2_t      rc2pass2        = { 0 };
 
  384     xvid_plugin_lumimasking_t masking_l       = { 0 }; 
 
  385     xvid_plugin_lumimasking_t masking_v       = { 0 }; 
 
  386     xvid_plugin_ssim_t        ssim            = { 0 };
 
  387     xvid_gbl_init_t           xvid_gbl_init   = { 0 };
 
  388     xvid_enc_create_t         xvid_enc_create = { 0 };
 
  389     xvid_enc_plugin_t         plugins[4];
 
  409         x->
me_flags |= XVID_ME_EXTSEARCH16 |
 
  413         x->
me_flags |= XVID_ME_ADVANCEDDIAMOND8 |
 
  414                        XVID_ME_HALFPELREFINE8   |
 
  415                        XVID_ME_CHROMA_PVOP      |
 
  419         x->
me_flags |= XVID_ME_ADVANCEDDIAMOND16 |
 
  420                        XVID_ME_HALFPELREFINE16;
 
  426         x->
vop_flags |=  XVID_VOP_MODEDECISION_RD;
 
  427         x->
me_flags  |=  XVID_ME_HALFPELREFINE8_RD    |
 
  428                          XVID_ME_QUARTERPELREFINE8_RD |
 
  429                          XVID_ME_EXTSEARCH_RD         |
 
  430                          XVID_ME_CHECKPREDICTION_RD;
 
  432         if (!(x->
vop_flags & XVID_VOP_MODEDECISION_RD))
 
  433             x->
vop_flags |= XVID_VOP_FAST_MODEDECISION_RD;
 
  434         x->
me_flags |= XVID_ME_HALFPELREFINE16_RD |
 
  435                        XVID_ME_QUARTERPELREFINE16_RD;
 
  448         x->
me_flags  |= XVID_ME_QUARTERPELREFINE16;
 
  450             x->
me_flags |= XVID_ME_QUARTERPELREFINE8;
 
  453     xvid_gbl_init.version   = XVID_VERSION;
 
  454     xvid_gbl_init.debug     = 0;
 
  455     xvid_gbl_init.cpu_flags = 0;
 
  458     xvid_global(
NULL, XVID_GBL_INIT, &xvid_gbl_init, 
NULL);
 
  461     xvid_enc_create.version = XVID_VERSION;
 
  464     xvid_enc_create.width  =
 
  466     xvid_enc_create.height =
 
  473     xvid_enc_create.zones     = 
NULL;
 
  474     xvid_enc_create.num_zones = 0;
 
  477 #if (XVID_VERSION <= 0x010303) && (XVID_VERSION >= 0x010300) 
  479     if (avctx->
height <= 16) {
 
  481             xvid_enc_create.num_threads = 0;
 
  484                    "Too small height for threads > 1.");
 
  490     xvid_enc_create.plugins     = plugins;
 
  491     xvid_enc_create.num_plugins = 0;
 
  499         rc2pass1.
version     = XVID_VERSION;
 
  505                    "Xvid: Cannot allocate 2-pass log buffers\n");
 
  512         plugins[xvid_enc_create.num_plugins].param = &rc2pass1;
 
  513         xvid_enc_create.num_plugins++;
 
  515         rc2pass2.
version = XVID_VERSION;
 
  527                    "Xvid: No 2-pass information loaded for second pass\n");
 
  542         plugins[xvid_enc_create.num_plugins].func  = xvid_plugin_2pass2;
 
  543         plugins[xvid_enc_create.num_plugins].param = &rc2pass2;
 
  544         xvid_enc_create.num_plugins++;
 
  547         single.version = XVID_VERSION;
 
  550         plugins[xvid_enc_create.num_plugins].func  = xvid_plugin_single;
 
  551         plugins[xvid_enc_create.num_plugins].param = &single;
 
  552         xvid_enc_create.num_plugins++;
 
  560         masking_l.method                          = 0;
 
  561         plugins[xvid_enc_create.num_plugins].func = xvid_plugin_lumimasking;
 
  565         plugins[xvid_enc_create.num_plugins].param =
 
  567         xvid_enc_create.num_plugins++;
 
  572         masking_v.method                           = 1;
 
  573         plugins[xvid_enc_create.num_plugins].func  = xvid_plugin_lumimasking;
 
  574         plugins[xvid_enc_create.num_plugins].param = &masking_v;
 
  575         xvid_enc_create.num_plugins++;
 
  580                "Both lumi_aq and variance_aq are enabled. The resulting quality" 
  581                "will be the worse one of the two effects made by the AQ.\n");
 
  585         plugins[xvid_enc_create.num_plugins].func  = xvid_plugin_ssim;
 
  586         ssim.b_printstat                           = x->
ssim == 2;
 
  588         ssim.cpu_flags                             = xvid_gbl_init.cpu_flags;
 
  589         ssim.b_visualize                           = 0;
 
  590         plugins[xvid_enc_create.num_plugins].param = &ssim;
 
  591         xvid_enc_create.num_plugins++;
 
  599         xvid_enc_create.max_key_interval = avctx->
gop_size;
 
  601         xvid_enc_create.max_key_interval = 240; 
 
  609     xvid_enc_create.min_quant[0] = avctx->
qmin;
 
  610     xvid_enc_create.min_quant[1] = avctx->
qmin;
 
  611     xvid_enc_create.min_quant[2] = avctx->
qmin;
 
  612     xvid_enc_create.max_quant[0] = avctx->
qmax;
 
  613     xvid_enc_create.max_quant[1] = avctx->
qmax;
 
  614     xvid_enc_create.max_quant[2] = avctx->
qmax;
 
  620 #if FF_API_PRIVATE_OPT 
  647         for (
i = 0; 
i < 64; 
i++) {
 
  656     xvid_enc_create.frame_drop_ratio = 0;
 
  657     xvid_enc_create.global           = 0;
 
  659         xvid_enc_create.global |= XVID_GLOBAL_CLOSED_GOP;
 
  680         xvid_enc_create.global |= XVID_GLOBAL_PACKED;
 
  696         xerr = xvid_encore(
NULL, XVID_ENC_CREATE, &xvid_enc_create, 
NULL);
 
  705         if (!picture->
data[0]) {
 
  712         memset(picture->
data[1], 128, 
size / 2);
 
  714         if (!
ret && got_packet)
 
  722     xerr = xvid_encore(
NULL, XVID_ENC_CREATE, &xvid_enc_create, 
NULL);
 
  734                              const AVFrame *picture, 
int *got_packet)
 
  738     int mb_width  = (avctx->
width  + 15) / 16;
 
  739     int mb_height = (avctx->
height + 15) / 16;
 
  742     xvid_enc_frame_t xvid_enc_frame = { 0 };
 
  743     xvid_enc_stats_t xvid_enc_stats = { 0 };
 
  749     xvid_enc_frame.version = XVID_VERSION;
 
  750     xvid_enc_stats.version = XVID_VERSION;
 
  753     xvid_enc_frame.bitstream = 
pkt->
data;
 
  754     xvid_enc_frame.length    = 
pkt->
size;
 
  759                "Xvid: Color spaces other than 420P not supported\n");
 
  763     xvid_enc_frame.input.csp = XVID_CSP_PLANAR; 
 
  765     for (
i = 0; 
i < 4; 
i++) {
 
  766         xvid_enc_frame.input.plane[
i]  = picture->
data[
i];
 
  767         xvid_enc_frame.input.stride[
i] = picture->
linesize[
i];
 
  773     xvid_enc_frame.motion    = x->
me_flags;
 
  774     xvid_enc_frame.type      =
 
  784                "Invalid pixel aspect ratio %i/%i, limit is 255/255 reducing\n",
 
  789     xvid_enc_frame.par        = XVID_PAR_EXT;
 
  797         xvid_enc_frame.quant = 0;
 
  805                        &xvid_enc_frame, &xvid_enc_stats);
 
  824         if (xvid_enc_stats.type == XVID_TYPE_PVOP)
 
  826         else if (xvid_enc_stats.type == XVID_TYPE_BVOP)
 
  828         else if (xvid_enc_stats.type == XVID_TYPE_SVOP)
 
  833 #if FF_API_CODED_FRAME 
  842         if (xvid_enc_frame.out_flags & XVID_KEYFRAME) {
 
  843 #if FF_API_CODED_FRAME 
  851                                              xvid_enc_stats.hlength, xerr);
 
  853 #if FF_API_CODED_FRAME 
  869                "Xvid: Encoding Error Occurred: %i\n", xerr);
 
  901 #define OFFSET(x) offsetof(struct xvid_context, x) 
  902 #define VE AV_OPT_FLAG_VIDEO_PARAM | AV_OPT_FLAG_ENCODING_PARAM 
  937     .wrapper_name   = 
"libxvid",
 
  
void av_packet_unref(AVPacket *pkt)
Wipe the packet.
#define FF_ENABLE_DEPRECATION_WARNINGS
void * encoder_handle
Handle for Xvid encoder.
#define AV_LOG_WARNING
Something somehow does not look correct.
#define FF_CODEC_CAP_INIT_THREADSAFE
The codec does not modify any global variables in the init function, allowing to call the init functi...
AVPixelFormat
Pixel format.
char * old_twopassbuffer
Old character buffer (two-pass)
static av_cold int init(AVCodecContext *avctx)
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
attribute_deprecated int mpeg_quant
int ff_side_data_set_encoder_stats(AVPacket *pkt, int quality, int64_t *error, int error_count, int pict_type)
#define AV_CODEC_FLAG_QSCALE
Use fixed qscale.
uint16_t * intra_matrix
custom intra quantization matrix Must be allocated with the av_malloc() family of functions,...
int qscale
Do we use constant scale?
float lumi_masking
luminance masking (0-> disabled)
void av_frame_free(AVFrame **frame)
Free the frame and any dynamically allocated objects in it, e.g.
static int xvid_encode_frame(AVCodecContext *avctx, AVPacket *pkt, const AVFrame *picture, int *got_packet)
This structure describes decoded (raw) audio or video data.
AVCodec ff_libxvid_encoder
float b_quant_offset
qscale offset between IP and B-frames
#define BUFFER_REMAINING(x)
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.
Structure for the private Xvid context.
int mb_decision
macroblock decision mode
int qmax
maximum quantizer
#define AV_CODEC_FLAG_4MV
4 MV per MB allowed / advanced prediction for H.263.
#define AV_PKT_FLAG_KEY
The packet contains a keyframe.
static av_always_inline av_const float roundf(float x)
uint8_t * data[AV_NUM_DATA_POINTERS]
pointer to the picture/channel planes.
#define AV_CODEC_FLAG_GLOBAL_HEADER
Place global headers in extradata instead of every keyframe.
int64_t av_gcd(int64_t a, int64_t b)
Compute the greatest common divisor of two integer operands.
struct xvid_context * context
Pointer to private context.
int thread_count
thread count is used to decide how many independent tasks should be passed to execute()
int key_frame
1 -> keyframe, 0-> not
int flags
AV_CODEC_FLAG_*.
unsigned char * intra_matrix
P-Frame Quant Matrix.
int av_reduce(int *dst_num, int *dst_den, int64_t num, int64_t den, int64_t max)
Reduce a fraction.
AVFrame * av_frame_alloc(void)
Allocate an AVFrame and set its fields to default values.
#define AV_LOG_ERROR
Something went wrong and cannot losslessly be recovered.
char * twopassfile
second pass temp file name
char * stats_in
pass2 encoding statistics input buffer Concatenated stuff from stats_out of pass1 should be placed he...
int ssim_acc
SSIM accuracy.
#define av_assert0(cond)
assert() equivalent, that is always enabled.
#define AV_LOG_DEBUG
Stuff which is only useful for libav* developers.
#define AV_INPUT_BUFFER_MIN_SIZE
@ AV_PIX_FMT_YUV420P
planar YUV 4:2:0, 12bpp, (1 Cr & Cb sample per 2x2 Y samples)
int quicktime_format
Are we in a QT-based format?
#define LIBAVUTIL_VERSION_INT
int me_flags
Motion Estimation flags.
Describe the class of an AVClass context structure.
int me_quality
Motion estimation quality.
int vop_flags
VOP flags for Xvid encoder.
int64_t bit_rate
the average bitrate
const char * av_default_item_name(void *ptr)
Return the context name.
@ AV_PICTURE_TYPE_I
Intra.
#define AV_CODEC_FLAG_AC_PRED
H.263 advanced intra coding / MPEG-4 AC prediction.
int trellis
trellis RD quantization
static int xvid_ff_2pass(void *ref, int cmd, void *p1, void *p2)
Dispatch function for our custom plugin.
static const AVOption options[]
AVRational time_base
This is the fundamental unit of time (in seconds) in terms of which frame timestamps are represented.
char * stats_out
pass1 encoding statistics output buffer
#define AV_CODEC_FLAG_QPEL
Use qpel MC.
int avpriv_tempfile(const char *prefix, char **filename, int log_offset, void *log_ctx)
Wrapper to work around the lack of mkstemp() on mingw.
enum AVPictureType pict_type
Picture type of the frame.
static const AVClass xvid_class
#define AV_CODEC_FLAG_GRAY
Only decode/encode grayscale.
#define NULL_IF_CONFIG_SMALL(x)
Return NULL if CONFIG_SMALL is true, otherwise the argument without modification.
int gop_size
the number of pictures in a group of pictures, or 0 for intra_only
int quality
quality (between 1 (good) and FF_LAMBDA_MAX (bad))
static int xvid_encode_close(AVCodecContext *avctx)
#define AV_CODEC_FLAG_PASS2
Use internal 2pass ratecontrol in second pass mode.
int variance_aq
Variance adaptive quantization.
#define AVERROR_EXTERNAL
Generic error in an external library.
int flags
A combination of AV_PKT_FLAG values.
#define AV_LOG_INFO
Standard information.
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...
#define BUFFER_SIZE
Buffer management macros.
int vol_flags
VOL flags for Xvid encoder.
static int xvid_ff_2pass_before(struct xvid_context *ref, xvid_plg_data_t *param)
Enable fast encode mode during the first pass.
#define i(width, name, range_min, range_max)
uint8_t * extradata
some codecs need / can use extradata like Huffman tables.
unsigned char * inter_matrix
I-Frame Quant Matrix.
#define FF_CODEC_CAP_INIT_CLEANUP
The codec allows calling the close function for deallocation even if the init function returned a fai...
const char * name
Name of the codec implementation.
enum AVPixelFormat pix_fmt
Pixel format, see AV_PIX_FMT_xxx.
static int xvid_ff_2pass_destroy(struct xvid_context *ref, xvid_plg_destroy_t *param)
Destroy the two-pass plugin context.
#define AV_CODEC_FLAG_CLOSED_GOP
const char * class_name
The name of the class; usually it is the same name as the context structure type to which the AVClass...
static av_cold int xvid_encode_init(AVCodecContext *avctx)
#define FF_ARRAY_ELEMS(a)
uint64_t_TMPL AV_WL64 unsigned int_TMPL AV_RL32
attribute_deprecated AVFrame * coded_frame
the picture in the bitstream
main external API structure.
int mpeg_quant
Quantization type.
@ AV_PICTURE_TYPE_B
Bi-dir predicted.
int ssim
SSIM information display mode.
int qmin
minimum quantizer
static int ref[MAX_W *MAX_W]
int lumi_aq
Lumi masking as an aq method.
char * twopassbuffer
Character buffer for two-pass.
#define FF_DISABLE_DEPRECATION_WARNINGS
Structure for the private first-pass plugin.
@ AV_PICTURE_TYPE_P
Predicted.
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...
unsigned int codec_tag
fourcc (LSB first, so "ABCD" -> ('D'<<24) + ('C'<<16) + ('B'<<8) + 'A').
This structure stores compressed data.
uint16_t * inter_matrix
custom inter quantization matrix Must be allocated with the av_malloc() family of functions,...
static int xvid_ff_2pass_create(xvid_plg_create_t *param, void **handle)
Initialize the two-pass plugin and context.
int width
picture width / height.
int linesize[AV_NUM_DATA_POINTERS]
For video, size in bytes of each picture line.
static int xvid_ff_2pass_after(struct xvid_context *ref, xvid_plg_data_t *param)
Capture statistic data and write it during first pass.
static void xvid_correct_framerate(AVCodecContext *avctx)
Routine to correct a possibly erroneous framerate being fed to us.
#define FF_QP2LAMBDA
factor to convert from H.263 QP to lambda
int ff_alloc_packet2(AVCodecContext *avctx, AVPacket *avpkt, int64_t size, int64_t min_size)
Check AVPacket size and/or allocate data.
@ AV_PICTURE_TYPE_S
S(GMC)-VOP MPEG-4.
AVRational sample_aspect_ratio
sample aspect ratio (0 if unknown) That is the width of a pixel divided by the height of the pixel.
#define AV_CODEC_FLAG_PASS1
Use internal 2pass ratecontrol in first pass mode.
void av_init_packet(AVPacket *pkt)
Initialize optional fields of a packet with default values.