58 #define BUFFER_SIZE 1024 59 #define BUFFER_REMAINING(x) (BUFFER_SIZE - strlen(x)) 60 #define BUFFER_CAT(x) (&((x)[strlen(x)])) 101 const AVFrame *picture,
int *got_packet);
128 return XVID_ERR_FAIL;
134 "# ffmpeg 2-pass log file, using xvid codec\n");
136 "# Do not modify. libxvidcore version: %d.%d.%d\n\n",
137 XVID_VERSION_MAJOR(XVID_VERSION),
138 XVID_VERSION_MINOR(XVID_VERSION),
139 XVID_VERSION_PATCH(XVID_VERSION));
153 xvid_plg_destroy_t *param)
170 xvid_plg_data_t *param)
173 int motion_replacements;
177 if (param->zone && param->zone->mode == XVID_ZONE_QUANT)
184 motion_remove = ~XVID_ME_CHROMA_PVOP &
185 ~XVID_ME_CHROMA_BVOP &
186 ~XVID_ME_EXTSEARCH16 &
187 ~XVID_ME_ADVANCEDDIAMOND16;
188 motion_replacements = XVID_ME_FAST_MODEINTERPOLATE |
189 XVID_ME_SKIP_DELTASEARCH |
190 XVID_ME_FASTREFINE16 |
191 XVID_ME_BFRAME_EARLYSTOP;
192 vop_remove = ~XVID_VOP_MODEDECISION_RD &
193 ~XVID_VOP_FAST_MODEDECISION_RD &
194 ~XVID_VOP_TRELLISQUANT &
198 param->vol_flags &= ~XVID_VOL_GMC;
199 param->vop_flags &= vop_remove;
200 param->motion_flags &= motion_remove;
201 param->motion_flags |= motion_replacements;
214 xvid_plg_data_t *param)
217 const char *frame_types =
" ipbs";
222 return XVID_ERR_FAIL;
225 if (param->type < 5 && param->type > 0)
226 frame_type = frame_types[param->type];
228 return XVID_ERR_FAIL;
231 "%c %d %d %d %d %d %d\n",
232 frame_type, param->stats.quant, param->stats.kblks,
233 param->stats.mblks, param->stats.ublks,
234 param->stats.length, param->stats.hlength);
256 case XVID_PLG_BEFORE:
258 case XVID_PLG_CREATE:
262 case XVID_PLG_DESTROY:
265 return XVID_ERR_FAIL;
283 unsigned int header_len,
284 unsigned int frame_len)
288 for (
i = 0;
i < header_len - 3;
i++) {
289 if (pkt->
data[
i] == 0x00 &&
290 pkt->
data[
i + 1] == 0x00 &&
291 pkt->
data[
i + 2] == 0x01 &&
292 pkt->
data[
i + 3] == 0xB6) {
309 memmove(pkt->
data, &pkt->
data[vo_len], frame_len - vo_len);
310 pkt->
size = frame_len - vo_len;
327 int est_frate, est_fbase;
334 gcd =
av_gcd(frate, fbase);
340 if (frate <= 65000 && fbase <= 65000) {
346 fps = (float) frate / (
float) fbase;
347 est_fps =
roundf(fps * 1000.0) / 1000.0;
349 est_frate = (
int) est_fps;
350 if (est_fps > (
int) est_fps) {
351 est_frate = (est_frate + 1) * 1000;
352 est_fbase = (
int)
roundf((
float) est_frate / est_fps);
356 gcd =
av_gcd(est_frate, est_fbase);
362 if (fbase > est_fbase) {
366 "Xvid: framerate re-estimated: %.2f, %.3f%% correction\n",
367 est_fps, (((est_fps - fps) / fps) * 100.0));
376 int xerr,
i,
ret = -1;
377 int xvid_flags = avctx->
flags;
379 uint16_t *intra, *inter;
382 xvid_plugin_single_t single = { 0 };
384 xvid_plugin_2pass2_t rc2pass2 = { 0 };
385 xvid_plugin_lumimasking_t masking_l = { 0 };
386 xvid_plugin_lumimasking_t masking_v = { 0 };
387 xvid_plugin_ssim_t
ssim = { 0 };
388 xvid_gbl_init_t xvid_gbl_init = { 0 };
389 xvid_enc_create_t xvid_enc_create = { 0 };
390 xvid_enc_plugin_t plugins[4];
410 x->
me_flags |= XVID_ME_EXTSEARCH16 |
414 x->
me_flags |= XVID_ME_ADVANCEDDIAMOND8 |
415 XVID_ME_HALFPELREFINE8 |
416 XVID_ME_CHROMA_PVOP |
420 x->
me_flags |= XVID_ME_ADVANCEDDIAMOND16 |
421 XVID_ME_HALFPELREFINE16;
427 x->
vop_flags |= XVID_VOP_MODEDECISION_RD;
428 x->
me_flags |= XVID_ME_HALFPELREFINE8_RD |
429 XVID_ME_QUARTERPELREFINE8_RD |
430 XVID_ME_EXTSEARCH_RD |
431 XVID_ME_CHECKPREDICTION_RD;
433 if (!(x->
vop_flags & XVID_VOP_MODEDECISION_RD))
434 x->
vop_flags |= XVID_VOP_FAST_MODEDECISION_RD;
435 x->
me_flags |= XVID_ME_HALFPELREFINE16_RD |
436 XVID_ME_QUARTERPELREFINE16_RD;
449 x->
me_flags |= XVID_ME_QUARTERPELREFINE16;
451 x->
me_flags |= XVID_ME_QUARTERPELREFINE8;
454 xvid_gbl_init.version = XVID_VERSION;
455 xvid_gbl_init.debug = 0;
456 xvid_gbl_init.cpu_flags = 0;
459 xvid_global(
NULL, XVID_GBL_INIT, &xvid_gbl_init,
NULL);
462 xvid_enc_create.version = XVID_VERSION;
465 xvid_enc_create.width =
467 xvid_enc_create.height =
474 xvid_enc_create.zones =
NULL;
475 xvid_enc_create.num_zones = 0;
478 #if (XVID_VERSION <= 0x010303) && (XVID_VERSION >= 0x010300) 480 if (avctx->
height <= 16) {
482 xvid_enc_create.num_threads = 0;
485 "Too small height for threads > 1.");
491 xvid_enc_create.plugins = plugins;
492 xvid_enc_create.num_plugins = 0;
500 rc2pass1.
version = XVID_VERSION;
506 "Xvid: Cannot allocate 2-pass log buffers\n");
513 plugins[xvid_enc_create.num_plugins].param = &rc2pass1;
514 xvid_enc_create.num_plugins++;
516 rc2pass2.
version = XVID_VERSION;
528 "Xvid: No 2-pass information loaded for second pass\n");
535 else if (strlen(avctx->
stats_in) > ret) {
543 plugins[xvid_enc_create.num_plugins].func = xvid_plugin_2pass2;
544 plugins[xvid_enc_create.num_plugins].param = &rc2pass2;
545 xvid_enc_create.num_plugins++;
548 single.version = XVID_VERSION;
551 plugins[xvid_enc_create.num_plugins].func = xvid_plugin_single;
552 plugins[xvid_enc_create.num_plugins].param = &single;
553 xvid_enc_create.num_plugins++;
561 masking_l.method = 0;
562 plugins[xvid_enc_create.num_plugins].func = xvid_plugin_lumimasking;
566 plugins[xvid_enc_create.num_plugins].param =
568 xvid_enc_create.num_plugins++;
573 masking_v.method = 1;
574 plugins[xvid_enc_create.num_plugins].func = xvid_plugin_lumimasking;
575 plugins[xvid_enc_create.num_plugins].param = &masking_v;
576 xvid_enc_create.num_plugins++;
581 "Both lumi_aq and variance_aq are enabled. The resulting quality" 582 "will be the worse one of the two effects made by the AQ.\n");
586 plugins[xvid_enc_create.num_plugins].func = xvid_plugin_ssim;
587 ssim.b_printstat = x->
ssim == 2;
589 ssim.cpu_flags = xvid_gbl_init.cpu_flags;
590 ssim.b_visualize = 0;
591 plugins[xvid_enc_create.num_plugins].param = &
ssim;
592 xvid_enc_create.num_plugins++;
600 xvid_enc_create.max_key_interval = avctx->
gop_size;
602 xvid_enc_create.max_key_interval = 240;
605 if (xvid_flags & AV_CODEC_FLAG_QSCALE)
610 xvid_enc_create.min_quant[0] = avctx->
qmin;
611 xvid_enc_create.min_quant[1] = avctx->
qmin;
612 xvid_enc_create.min_quant[2] = avctx->
qmin;
613 xvid_enc_create.max_quant[0] = avctx->
qmax;
614 xvid_enc_create.max_quant[1] = avctx->
qmax;
615 xvid_enc_create.max_quant[2] = avctx->
qmax;
621 #if FF_API_PRIVATE_OPT 648 for (i = 0; i < 64; i++) {
657 xvid_enc_create.frame_drop_ratio = 0;
658 xvid_enc_create.global = 0;
660 xvid_enc_create.global |= XVID_GLOBAL_CLOSED_GOP;
681 xvid_enc_create.global |= XVID_GLOBAL_PACKED;
697 xerr = xvid_encore(
NULL, XVID_ENC_CREATE, &xvid_enc_create,
NULL);
704 size = ((avctx->
width + 1) & ~1) * ((avctx->
height + 1) & ~1);
706 if (!picture->
data[0]) {
711 picture->
data[2] = picture->
data[1] + size / 4;
712 memset(picture->
data[0], 0, size);
713 memset(picture->
data[1], 128, size / 2);
715 if (!ret && got_packet)
723 xerr = xvid_encore(
NULL, XVID_ENC_CREATE, &xvid_enc_create,
NULL);
735 const AVFrame *picture,
int *got_packet)
737 int xerr,
i,
ret, user_packet = !!pkt->
data;
739 int mb_width = (avctx->
width + 15) / 16;
740 int mb_height = (avctx->
height + 15) / 16;
743 xvid_enc_frame_t xvid_enc_frame = { 0 };
744 xvid_enc_stats_t xvid_enc_stats = { 0 };
750 xvid_enc_frame.version = XVID_VERSION;
751 xvid_enc_stats.version = XVID_VERSION;
754 xvid_enc_frame.bitstream = pkt->
data;
755 xvid_enc_frame.length = pkt->
size;
760 "Xvid: Color spaces other than 420P not supported\n");
764 xvid_enc_frame.input.csp = XVID_CSP_PLANAR;
766 for (i = 0; i < 4; i++) {
767 xvid_enc_frame.input.plane[
i] = picture->
data[
i];
768 xvid_enc_frame.input.stride[
i] = picture->
linesize[
i];
774 xvid_enc_frame.motion = x->
me_flags;
775 xvid_enc_frame.type =
785 "Invalid pixel aspect ratio %i/%i, limit is 255/255 reducing\n",
790 xvid_enc_frame.par = XVID_PAR_EXT;
798 xvid_enc_frame.quant = 0;
806 &xvid_enc_frame, &xvid_enc_stats);
825 if (xvid_enc_stats.type == XVID_TYPE_PVOP)
827 else if (xvid_enc_stats.type == XVID_TYPE_BVOP)
829 else if (xvid_enc_stats.type == XVID_TYPE_SVOP)
834 #if FF_API_CODED_FRAME 843 if (xvid_enc_frame.out_flags & XVID_KEYFRAME) {
844 #if FF_API_CODED_FRAME 852 xvid_enc_stats.hlength, xerr);
854 #if FF_API_CODED_FRAME 870 "Xvid: Encoding Error Occurred: %i\n", xerr);
902 #define OFFSET(x) offsetof(struct xvid_context, x) 903 #define VE AV_OPT_FLAG_VIDEO_PARAM | AV_OPT_FLAG_ENCODING_PARAM 938 .wrapper_name =
"libxvid",
#define FF_CODEC_CAP_INIT_CLEANUP
The codec allows calling the close function for deallocation even if the init function returned a fai...
This structure describes decoded (raw) audio or video data.
char * old_twopassbuffer
Old character buffer (two-pass)
int ff_side_data_set_encoder_stats(AVPacket *pkt, int quality, int64_t *error, int error_count, int pict_type)
AVCodec ff_libxvid_encoder
#define AV_LOG_WARNING
Something somehow does not look correct.
int64_t bit_rate
the average bitrate
#define LIBAVUTIL_VERSION_INT
Memory handling functions.
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...
#define BUFFER_REMAINING(x)
const char * av_default_item_name(void *ptr)
Return the context name.
AVRational sample_aspect_ratio
sample aspect ratio (0 if unknown) That is the width of a pixel divided by the height of the pixel...
enum AVPixelFormat pix_fmt
Pixel format, see AV_PIX_FMT_xxx.
int avpriv_tempfile(const char *prefix, char **filename, int log_offset, void *log_ctx)
Wrapper to work around the lack of mkstemp() on mingw.
char * stats_in
pass2 encoding statistics input buffer Concatenated stuff from stats_out of pass1 should be placed he...
#define FF_ARRAY_ELEMS(a)
unsigned char * intra_matrix
P-Frame Quant Matrix.
int me_flags
Motion Estimation flags.
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...
const char * class_name
The name of the class; usually it is the same name as the context structure type to which the AVClass...
#define av_assert0(cond)
assert() equivalent, that is always enabled.
int ff_alloc_packet2(AVCodecContext *avctx, AVPacket *avpkt, int64_t size, int64_t min_size)
Check AVPacket size and/or allocate data.
#define FF_CODEC_CAP_INIT_THREADSAFE
The codec does not modify any global variables in the init function, allowing to call the init functi...
AVFrame * av_frame_alloc(void)
Allocate an AVFrame and set its fields to default values.
static int xvid_encode_frame(AVCodecContext *avctx, AVPacket *pkt, const AVFrame *picture, int *got_packet)
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...
uint8_t * extradata
some codecs need / can use extradata like Huffman tables.
int quicktime_format
Are we in a QT-based format?
struct xvid_context * context
Pointer to private context.
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.
int av_reduce(int *dst_num, int *dst_den, int64_t num, int64_t den, int64_t max)
Reduce a fraction.
float lumi_masking
luminance masking (0-> disabled)
char * stats_out
pass1 encoding statistics output buffer
#define AV_CODEC_FLAG_GRAY
Only decode/encode grayscale.
#define AV_INPUT_BUFFER_MIN_SIZE
minimum encoding buffer size Used to avoid some checks during header writing.
#define AV_PKT_FLAG_KEY
The packet contains a keyframe.
static int xvid_ff_2pass(void *ref, int cmd, void *p1, void *p2)
Dispatch function for our custom plugin.
#define AV_LOG_ERROR
Something went wrong and cannot losslessly be recovered.
#define AV_CODEC_FLAG_4MV
4 MV per MB allowed / advanced prediction for H.263.
void av_frame_free(AVFrame **frame)
Free the frame and any dynamically allocated objects in it, e.g.
int qmax
maximum quantizer
#define NULL_IF_CONFIG_SMALL(x)
Return NULL if CONFIG_SMALL is true, otherwise the argument without modification. ...
#define AV_LOG_DEBUG
Stuff which is only useful for libav* developers.
int flags
AV_CODEC_FLAG_*.
simple assert() macros that are a bit more flexible than ISO C assert().
int64_t av_gcd(int64_t a, int64_t b)
Compute the greatest common divisor of two integer operands.
const char * name
Name of the codec implementation.
int me_quality
Motion estimation quality.
int flags
A combination of AV_PKT_FLAG values.
static int xvid_encode_close(AVCodecContext *avctx)
char * twopassfile
second pass temp file name
common internal API header
static const AVOption options[]
#define BUFFER_SIZE
Buffer management macros.
int vop_flags
VOP flags for Xvid encoder.
Structure for the private first-pass plugin.
enum AVPictureType pict_type
Picture type of the frame.
#define AV_CODEC_FLAG_QSCALE
Use fixed qscale.
int variance_aq
Variance adaptive quantization.
#define AV_CODEC_FLAG_AC_PRED
H.263 advanced intra coding / MPEG-4 AC prediction.
Structure for the private Xvid context.
int width
picture width / height.
static const AVClass xvid_class
unsigned char * inter_matrix
I-Frame Quant Matrix.
#define AV_CODEC_FLAG_PASS1
Use internal 2pass ratecontrol in first pass mode.
int quality
quality (between 1 (good) and FF_LAMBDA_MAX (bad))
int mb_decision
macroblock decision mode
int thread_count
thread count is used to decide how many independent tasks should be passed to execute() ...
int ssim_acc
SSIM accuracy.
#define AV_LOG_INFO
Standard information.
Libavcodec external API header.
attribute_deprecated int mpeg_quant
int linesize[AV_NUM_DATA_POINTERS]
For video, size in bytes of each picture line.
main external API structure.
void av_packet_unref(AVPacket *pkt)
Wipe the packet.
int qmin
minimum quantizer
unsigned int codec_tag
fourcc (LSB first, so "ABCD" -> ('D'<<24) + ('C'<<16) + ('B'<<8) + 'A').
uint16_t * intra_matrix
custom intra quantization matrix Must be allocated with the av_malloc() family of functions...
Describe the class of an AVClass context structure.
char * twopassbuffer
Character buffer for two-pass.
float b_quant_offset
qscale offset between IP and B-frames
static av_cold int xvid_encode_init(AVCodecContext *avctx)
static av_always_inline av_const float roundf(float x)
uint16_t * inter_matrix
custom inter quantization matrix Must be allocated with the av_malloc() family of functions...
#define AV_CODEC_FLAG_QPEL
Use qpel MC.
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.
int mpeg_quant
Quantization type.
int gop_size
the number of pictures in a group of pictures, or 0 for intra_only
int ssim
SSIM information display mode.
planar YUV 4:2:0, 12bpp, (1 Cr & Cb sample per 2x2 Y samples)
#define FF_DISABLE_DEPRECATION_WARNINGS
common internal api header.
static int ref[MAX_W *MAX_W]
int vol_flags
VOL flags for Xvid encoder.
attribute_deprecated AVFrame * coded_frame
the picture in the bitstream
void av_init_packet(AVPacket *pkt)
Initialize optional fields of a packet with default values.
static int xvid_ff_2pass_create(xvid_plg_create_t *param, void **handle)
Initialize the two-pass plugin and context.
int trellis
trellis RD quantization
static int xvid_ff_2pass_before(struct xvid_context *ref, xvid_plg_data_t *param)
Enable fast encode mode during the first pass.
#define AV_CODEC_FLAG_PASS2
Use internal 2pass ratecontrol in second pass mode.
void * encoder_handle
Handle for Xvid encoder.
static int xvid_ff_2pass_after(struct xvid_context *ref, xvid_plg_data_t *param)
Capture statistic data and write it during first pass.
#define FF_ENABLE_DEPRECATION_WARNINGS
int key_frame
1 -> keyframe, 0-> not
#define FF_QP2LAMBDA
factor to convert from H.263 QP to lambda
static int xvid_ff_2pass_destroy(struct xvid_context *ref, xvid_plg_destroy_t *param)
Destroy the two-pass plugin context.
static void xvid_correct_framerate(AVCodecContext *avctx)
Routine to correct a possibly erroneous framerate being fed to us.
#define AV_CODEC_FLAG_CLOSED_GOP
int qscale
Do we use constant scale?
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 AVERROR_EXTERNAL
Generic error in an external library.
uint64_t_TMPL AV_WL64 unsigned int_TMPL AV_RL32
AVPixelFormat
Pixel format.
This structure stores compressed data.
int lumi_aq
Lumi masking as an aq method.