Go to the documentation of this file.
56 #define BUFFER_SIZE 1024
57 #define BUFFER_REMAINING(x) (BUFFER_SIZE - strlen(x))
58 #define BUFFER_CAT(x) (&((x)[strlen(x)]))
99 const AVFrame *picture,
int *got_packet);
126 return XVID_ERR_FAIL;
132 "# ffmpeg 2-pass log file, using xvid codec\n");
134 "# Do not modify. libxvidcore version: %d.%d.%d\n\n",
135 XVID_VERSION_MAJOR(XVID_VERSION),
136 XVID_VERSION_MINOR(XVID_VERSION),
137 XVID_VERSION_PATCH(XVID_VERSION));
151 xvid_plg_destroy_t *param)
155 if (
ref->twopassbuffer)
156 ref->twopassbuffer[0] = 0;
168 xvid_plg_data_t *param)
171 int motion_replacements;
175 if (param->zone && param->zone->mode == XVID_ZONE_QUANT)
182 motion_remove = ~XVID_ME_CHROMA_PVOP &
183 ~XVID_ME_CHROMA_BVOP &
184 ~XVID_ME_EXTSEARCH16 &
185 ~XVID_ME_ADVANCEDDIAMOND16;
186 motion_replacements = XVID_ME_FAST_MODEINTERPOLATE |
187 XVID_ME_SKIP_DELTASEARCH |
188 XVID_ME_FASTREFINE16 |
189 XVID_ME_BFRAME_EARLYSTOP;
190 vop_remove = ~XVID_VOP_MODEDECISION_RD &
191 ~XVID_VOP_FAST_MODEDECISION_RD &
192 ~XVID_VOP_TRELLISQUANT &
196 param->vol_flags &= ~XVID_VOL_GMC;
197 param->vop_flags &= vop_remove;
198 param->motion_flags &= motion_remove;
199 param->motion_flags |= motion_replacements;
212 xvid_plg_data_t *param)
214 char *
log =
ref->twopassbuffer;
220 return XVID_ERR_FAIL;
223 if (param->type < 5 && param->type > 0)
226 return XVID_ERR_FAIL;
229 "%c %d %d %d %d %d %d\n",
230 frame_type, param->stats.quant, param->stats.kblks,
231 param->stats.mblks, param->stats.ublks,
232 param->stats.length, param->stats.hlength);
254 case XVID_PLG_BEFORE:
256 case XVID_PLG_CREATE:
260 case XVID_PLG_DESTROY:
263 return XVID_ERR_FAIL;
281 unsigned int header_len,
282 unsigned int frame_len)
286 for (
i = 0;
i < header_len - 3;
i++) {
308 pkt->
size = frame_len - vo_len;
325 int est_frate, est_fbase;
332 gcd =
av_gcd(frate, fbase);
338 if (frate <= 65000 && fbase <= 65000) {
344 fps = (
float) frate / (
float) fbase;
345 est_fps =
roundf(fps * 1000.0) / 1000.0;
347 est_frate = (int) est_fps;
348 if (est_fps > (
int) est_fps) {
349 est_frate = (est_frate + 1) * 1000;
350 est_fbase = (int)
roundf((
float) est_frate / est_fps);
354 gcd =
av_gcd(est_frate, est_fbase);
360 if (fbase > est_fbase) {
364 "Xvid: framerate re-estimated: %.2f, %.3f%% correction\n",
365 est_fps, (((est_fps - fps) / fps) * 100.0));
374 int xerr,
i,
ret = -1;
375 int xvid_flags = avctx->
flags;
377 uint16_t *intra, *inter;
380 xvid_plugin_single_t single = { 0 };
382 xvid_plugin_2pass2_t rc2pass2 = { 0 };
383 xvid_plugin_lumimasking_t masking_l = { 0 };
384 xvid_plugin_lumimasking_t masking_v = { 0 };
385 xvid_plugin_ssim_t ssim = { 0 };
386 xvid_gbl_init_t xvid_gbl_init = { 0 };
387 xvid_enc_create_t xvid_enc_create = { 0 };
388 xvid_enc_plugin_t plugins[4];
408 x->
me_flags |= XVID_ME_EXTSEARCH16 |
412 x->
me_flags |= XVID_ME_ADVANCEDDIAMOND8 |
413 XVID_ME_HALFPELREFINE8 |
414 XVID_ME_CHROMA_PVOP |
418 x->
me_flags |= XVID_ME_ADVANCEDDIAMOND16 |
419 XVID_ME_HALFPELREFINE16;
425 x->
vop_flags |= XVID_VOP_MODEDECISION_RD;
426 x->
me_flags |= XVID_ME_HALFPELREFINE8_RD |
427 XVID_ME_QUARTERPELREFINE8_RD |
428 XVID_ME_EXTSEARCH_RD |
429 XVID_ME_CHECKPREDICTION_RD;
431 if (!(x->
vop_flags & XVID_VOP_MODEDECISION_RD))
432 x->
vop_flags |= XVID_VOP_FAST_MODEDECISION_RD;
433 x->
me_flags |= XVID_ME_HALFPELREFINE16_RD |
434 XVID_ME_QUARTERPELREFINE16_RD;
447 x->
me_flags |= XVID_ME_QUARTERPELREFINE16;
449 x->
me_flags |= XVID_ME_QUARTERPELREFINE8;
452 xvid_gbl_init.version = XVID_VERSION;
453 xvid_gbl_init.debug = 0;
454 xvid_gbl_init.cpu_flags = 0;
457 xvid_global(
NULL, XVID_GBL_INIT, &xvid_gbl_init,
NULL);
460 xvid_enc_create.version = XVID_VERSION;
463 xvid_enc_create.width =
465 xvid_enc_create.height =
472 xvid_enc_create.zones =
NULL;
473 xvid_enc_create.num_zones = 0;
476 #if (XVID_VERSION <= 0x010303) && (XVID_VERSION >= 0x010300)
478 if (avctx->
height <= 16) {
480 xvid_enc_create.num_threads = 0;
483 "Too small height for threads > 1.");
489 xvid_enc_create.plugins = plugins;
490 xvid_enc_create.num_plugins = 0;
498 rc2pass1.
version = XVID_VERSION;
504 "Xvid: Cannot allocate 2-pass log buffers\n");
511 plugins[xvid_enc_create.num_plugins].param = &rc2pass1;
512 xvid_enc_create.num_plugins++;
514 rc2pass2.
version = XVID_VERSION;
526 "Xvid: No 2-pass information loaded for second pass\n");
541 plugins[xvid_enc_create.num_plugins].func = xvid_plugin_2pass2;
542 plugins[xvid_enc_create.num_plugins].param = &rc2pass2;
543 xvid_enc_create.num_plugins++;
546 single.version = XVID_VERSION;
549 plugins[xvid_enc_create.num_plugins].func = xvid_plugin_single;
550 plugins[xvid_enc_create.num_plugins].param = &single;
551 xvid_enc_create.num_plugins++;
559 masking_l.method = 0;
560 plugins[xvid_enc_create.num_plugins].func = xvid_plugin_lumimasking;
564 plugins[xvid_enc_create.num_plugins].param =
566 xvid_enc_create.num_plugins++;
571 masking_v.method = 1;
572 plugins[xvid_enc_create.num_plugins].func = xvid_plugin_lumimasking;
573 plugins[xvid_enc_create.num_plugins].param = &masking_v;
574 xvid_enc_create.num_plugins++;
579 "Both lumi_aq and variance_aq are enabled. The resulting quality"
580 "will be the worse one of the two effects made by the AQ.\n");
584 plugins[xvid_enc_create.num_plugins].func = xvid_plugin_ssim;
585 ssim.b_printstat = x->
ssim == 2;
587 ssim.cpu_flags = xvid_gbl_init.cpu_flags;
588 ssim.b_visualize = 0;
589 plugins[xvid_enc_create.num_plugins].param = &ssim;
590 xvid_enc_create.num_plugins++;
598 xvid_enc_create.max_key_interval = avctx->
gop_size;
600 xvid_enc_create.max_key_interval = 240;
608 xvid_enc_create.min_quant[0] = avctx->
qmin;
609 xvid_enc_create.min_quant[1] = avctx->
qmin;
610 xvid_enc_create.min_quant[2] = avctx->
qmin;
611 xvid_enc_create.max_quant[0] = avctx->
qmax;
612 xvid_enc_create.max_quant[1] = avctx->
qmax;
613 xvid_enc_create.max_quant[2] = avctx->
qmax;
643 for (
i = 0;
i < 64;
i++) {
652 xvid_enc_create.frame_drop_ratio = 0;
653 xvid_enc_create.global = 0;
655 xvid_enc_create.global |= XVID_GLOBAL_CLOSED_GOP;
675 xvid_enc_create.global |= XVID_GLOBAL_PACKED;
683 int size, got_packet;
695 xerr = xvid_encore(
NULL, XVID_ENC_CREATE, &xvid_enc_create,
NULL);
705 if (!picture->
data[0]) {
713 memset(picture->
data[1], 128,
size / 2);
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)
835 if (xvid_enc_frame.out_flags & XVID_KEYFRAME) {
839 xvid_enc_stats.hlength, xerr);
849 "Xvid: Encoding Error Occurred: %i\n", xerr);
880 #define OFFSET(x) offsetof(struct xvid_context, x)
881 #define VE AV_OPT_FLAG_VIDEO_PARAM | AV_OPT_FLAG_ENCODING_PARAM
917 .p.wrapper_name =
"libxvid",
#define FF_MATRIX_TYPE_INTRA
Check if the elements of codec context matrices (intra_matrix, inter_matrix or chroma_intra_matrix) a...
#define CODEC_PIXFMTS(...)
void * encoder_handle
Handle for Xvid encoder.
#define AV_LOG_WARNING
Something somehow does not look correct.
#define FF_CODEC_CAP_INIT_CLEANUP
The codec allows calling the close function for deallocation even if the init function returned a fai...
char * old_twopassbuffer
Old character buffer (two-pass)
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 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.
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.
void av_packet_free(AVPacket **pkt)
Free the packet, if the packet is reference counted, it will be unreferenced first.
#define FF_INPUT_BUFFER_MIN_SIZE
Used by some encoders as upper bound for the length of headers.
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.
static av_cold void close(AVCodecParserContext *s)
struct xvid_context * context
Pointer to private context.
AVCodec p
The public AVCodec.
int thread_count
thread count is used to decide how many independent tasks should be passed to execute()
int flags
AV_CODEC_FLAG_*.
unsigned char * intra_matrix
P-Frame Quant Matrix.
int ff_encode_add_stats_side_data(AVPacket *pkt, int quality, const int64_t error[], int error_count, enum AVPictureType pict_type)
#define FF_CODEC_ENCODE_CB(func)
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.
#define FF_ARRAY_ELEMS(a)
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_CODEC_CAP_ENCODER_REORDERED_OPAQUE
This encoder can reorder user opaque values from input AVFrames and return them with corresponding ou...
#define av_assert0(cond)
assert() equivalent, that is always enabled.
#define AV_LOG_DEBUG
Stuff which is only useful for libav* developers.
@ AV_PIX_FMT_YUV420P
planar YUV 4:2:0, 12bpp, (1 Cr & Cb sample per 2x2 Y samples)
#define CODEC_LONG_NAME(str)
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.
int(* init)(AVBSFContext *ctx)
#define AV_CODEC_CAP_DR1
Codec uses get_buffer() or get_encode_buffer() for allocating buffers and supports custom allocators.
static const AVClass xvid_class
#define AV_CODEC_FLAG_GRAY
Only decode/encode grayscale.
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.
AVPacket * av_packet_alloc(void)
Allocate an AVPacket and set its fields to default 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
Out-of-band global headers that may be used by some codecs.
unsigned char * inter_matrix
I-Frame Quant Matrix.
const char * name
Name of the codec implementation.
enum AVPixelFormat pix_fmt
Pixel format, see AV_PIX_FMT_xxx.
@ AVCOL_RANGE_MPEG
Narrow or limited range content.
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...
void * av_malloc(size_t size)
Allocate a memory block with alignment suitable for all memory accesses (including vectors if availab...
static av_cold int xvid_encode_init(AVCodecContext *avctx)
uint64_t_TMPL AV_WL64 unsigned int_TMPL AV_RL32
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
@ AV_OPT_TYPE_INT
Underlying C type is int.
static int ref[MAX_W *MAX_W]
int lumi_aq
Lumi masking as an aq method.
char * twopassbuffer
Character buffer for two-pass.
const FFCodec ff_libxvid_encoder
#define FF_MB_DECISION_RD
rate distortion
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').
#define FF_MB_DECISION_BITS
chooses the one which needs the fewest bits
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, a positive or negative value, which is typically indicating the size in bytes of each pict...
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
@ AV_PICTURE_TYPE_S
S(GMC)-VOP MPEG-4.
@ AV_OPT_TYPE_CONST
Special option type for declaring named constants.
int ff_alloc_packet(AVCodecContext *avctx, AVPacket *avpkt, int64_t size)
Check AVPacket size and allocate data.
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.
int ff_check_codec_matrices(AVCodecContext *avctx, unsigned types, uint16_t min, uint16_t max)
#define FF_MATRIX_TYPE_INTER
static const int8_t frame_types[4]