annotate libmpcodecs/ve_xvid.c @ 10579:f25d93203a71

From: Kir Kostuchenko <kir@users.sourceforge.net> Hi, I found that command line options brightness, hue, contrast and saturation does not works, becouse mplayer apply it, before open tv (kernel says invalid ioctl). Here are simple fix. Please apply.
author gabucino
date Tue, 12 Aug 2003 11:32:51 +0000
parents 34c91eb8a897
children 57bdcdb061d7
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
7456
dacc262f41ba Support for XviD encoding
kmkaplan
parents:
diff changeset
1 #include <stdio.h>
dacc262f41ba Support for XviD encoding
kmkaplan
parents:
diff changeset
2 #include <stdlib.h>
dacc262f41ba Support for XviD encoding
kmkaplan
parents:
diff changeset
3 #include <string.h>
8078
26a2ae540b04 bugfixes :
rguyom
parents: 7458
diff changeset
4 #include <errno.h>
9809
508dc4231269 Actually do something useful with XVID_GLOBAL_EXTRASTATS / XVID_EXTRASTATS.
rguyom
parents: 9806
diff changeset
5 #include <math.h>
9817
796e9b8bf2e3 - added <time.h> since we're using time() related functions
rguyom
parents: 9809
diff changeset
6 #include <time.h>
9809
508dc4231269 Actually do something useful with XVID_GLOBAL_EXTRASTATS / XVID_EXTRASTATS.
rguyom
parents: 9806
diff changeset
7
508dc4231269 Actually do something useful with XVID_GLOBAL_EXTRASTATS / XVID_EXTRASTATS.
rguyom
parents: 9806
diff changeset
8 #if !defined(INFINITY) && defined(HUGE_VAL)
508dc4231269 Actually do something useful with XVID_GLOBAL_EXTRASTATS / XVID_EXTRASTATS.
rguyom
parents: 9806
diff changeset
9 #define INFINITY HUGE_VAL
508dc4231269 Actually do something useful with XVID_GLOBAL_EXTRASTATS / XVID_EXTRASTATS.
rguyom
parents: 9806
diff changeset
10 #endif
7456
dacc262f41ba Support for XviD encoding
kmkaplan
parents:
diff changeset
11
dacc262f41ba Support for XviD encoding
kmkaplan
parents:
diff changeset
12 #include "../config.h"
dacc262f41ba Support for XviD encoding
kmkaplan
parents:
diff changeset
13 #include "../mp_msg.h"
dacc262f41ba Support for XviD encoding
kmkaplan
parents:
diff changeset
14
dacc262f41ba Support for XviD encoding
kmkaplan
parents:
diff changeset
15 #ifdef HAVE_XVID
dacc262f41ba Support for XviD encoding
kmkaplan
parents:
diff changeset
16
dacc262f41ba Support for XviD encoding
kmkaplan
parents:
diff changeset
17 #include "codec-cfg.h"
dacc262f41ba Support for XviD encoding
kmkaplan
parents:
diff changeset
18 #include "stream.h"
dacc262f41ba Support for XviD encoding
kmkaplan
parents:
diff changeset
19 #include "demuxer.h"
dacc262f41ba Support for XviD encoding
kmkaplan
parents:
diff changeset
20 #include "stheader.h"
dacc262f41ba Support for XviD encoding
kmkaplan
parents:
diff changeset
21
8585
27da710563c2 the long-waited MUXER layer, and new MPEG-PS muxer
arpi
parents: 8561
diff changeset
22 #include "muxer.h"
7456
dacc262f41ba Support for XviD encoding
kmkaplan
parents:
diff changeset
23
dacc262f41ba Support for XviD encoding
kmkaplan
parents:
diff changeset
24 #include "img_format.h"
dacc262f41ba Support for XviD encoding
kmkaplan
parents:
diff changeset
25 #include "mp_image.h"
dacc262f41ba Support for XviD encoding
kmkaplan
parents:
diff changeset
26 #include "vf.h"
dacc262f41ba Support for XviD encoding
kmkaplan
parents:
diff changeset
27
dacc262f41ba Support for XviD encoding
kmkaplan
parents:
diff changeset
28 #include <xvid.h>
dacc262f41ba Support for XviD encoding
kmkaplan
parents:
diff changeset
29 #include "xvid_vbr.h"
dacc262f41ba Support for XviD encoding
kmkaplan
parents:
diff changeset
30
8491
ce25d80dd6c3 Use the XVID_API_UNSTABLE macro instead of a home-made one.
rguyom
parents: 8462
diff changeset
31 #include "cfgparser.h"
ce25d80dd6c3 Use the XVID_API_UNSTABLE macro instead of a home-made one.
rguyom
parents: 8462
diff changeset
32
ce25d80dd6c3 Use the XVID_API_UNSTABLE macro instead of a home-made one.
rguyom
parents: 8462
diff changeset
33
ce25d80dd6c3 Use the XVID_API_UNSTABLE macro instead of a home-made one.
rguyom
parents: 8462
diff changeset
34 #ifdef XVID_API_UNSTABLE
ce25d80dd6c3 Use the XVID_API_UNSTABLE macro instead of a home-made one.
rguyom
parents: 8462
diff changeset
35 #warning *******************************************************************
ce25d80dd6c3 Use the XVID_API_UNSTABLE macro instead of a home-made one.
rguyom
parents: 8462
diff changeset
36 #warning ** **
ce25d80dd6c3 Use the XVID_API_UNSTABLE macro instead of a home-made one.
rguyom
parents: 8462
diff changeset
37 #warning ** Y O U '' R E U S I N G U N S T A B L E S O F T W A R E **
ce25d80dd6c3 Use the XVID_API_UNSTABLE macro instead of a home-made one.
rguyom
parents: 8462
diff changeset
38 #warning ** **
9806
rguyom
parents: 9805
diff changeset
39 #warning ** Streams produced by this version aren''t probably compatible **
8491
ce25d80dd6c3 Use the XVID_API_UNSTABLE macro instead of a home-made one.
rguyom
parents: 8462
diff changeset
40 #warning ** with anything else, even the xvid decoder itself. There are **
ce25d80dd6c3 Use the XVID_API_UNSTABLE macro instead of a home-made one.
rguyom
parents: 8462
diff changeset
41 #warning ** bugs, this code could crash, could blow up your PC or the **
ce25d80dd6c3 Use the XVID_API_UNSTABLE macro instead of a home-made one.
rguyom
parents: 8462
diff changeset
42 #warning ** whole building ! **
ce25d80dd6c3 Use the XVID_API_UNSTABLE macro instead of a home-made one.
rguyom
parents: 8462
diff changeset
43 #warning ** If you want stable code and compatible streams, use stable **
ce25d80dd6c3 Use the XVID_API_UNSTABLE macro instead of a home-made one.
rguyom
parents: 8462
diff changeset
44 #warning ** XViD releases (currently 0.9.x). **
ce25d80dd6c3 Use the XVID_API_UNSTABLE macro instead of a home-made one.
rguyom
parents: 8462
diff changeset
45 #warning ** **
ce25d80dd6c3 Use the XVID_API_UNSTABLE macro instead of a home-made one.
rguyom
parents: 8462
diff changeset
46 #warning *******************************************************************
8462
800d77666843 Support the latest development code from XViD dev-api-3 CVS
rguyom
parents: 8247
diff changeset
47 #endif
800d77666843 Support the latest development code from XViD dev-api-3 CVS
rguyom
parents: 8247
diff changeset
48
7456
dacc262f41ba Support for XviD encoding
kmkaplan
parents:
diff changeset
49 /**********************************************************************/
8462
800d77666843 Support the latest development code from XViD dev-api-3 CVS
rguyom
parents: 8247
diff changeset
50 /* motion estimation quality presets */
800d77666843 Support the latest development code from XViD dev-api-3 CVS
rguyom
parents: 8247
diff changeset
51 static int const motion_presets[7] = {
8491
ce25d80dd6c3 Use the XVID_API_UNSTABLE macro instead of a home-made one.
rguyom
parents: 8462
diff changeset
52 #ifdef XVID_API_UNSTABLE
8462
800d77666843 Support the latest development code from XViD dev-api-3 CVS
rguyom
parents: 8247
diff changeset
53 0,
9803
4563dfa92a5b xvid fixes and more options by elcabesa & Martin Drab
henry
parents: 9014
diff changeset
54 0,
8462
800d77666843 Support the latest development code from XViD dev-api-3 CVS
rguyom
parents: 8247
diff changeset
55 0,
800d77666843 Support the latest development code from XViD dev-api-3 CVS
rguyom
parents: 8247
diff changeset
56 0,
9817
796e9b8bf2e3 - added <time.h> since we're using time() related functions
rguyom
parents: 9809
diff changeset
57 PMV_HALFPELREFINE16 | PMV_HALFPELDIAMOND8,
796e9b8bf2e3 - added <time.h> since we're using time() related functions
rguyom
parents: 9809
diff changeset
58 PMV_HALFPELREFINE16 | PMV_HALFPELDIAMOND8 | PMV_ADVANCEDDIAMOND16,
796e9b8bf2e3 - added <time.h> since we're using time() related functions
rguyom
parents: 9809
diff changeset
59 PMV_HALFPELREFINE16 | PMV_EXTSEARCH16 | PMV_HALFPELREFINE8 | PMV_HALFPELDIAMOND8 | PMV_USESQUARES16
8462
800d77666843 Support the latest development code from XViD dev-api-3 CVS
rguyom
parents: 8247
diff changeset
60 #else
8078
26a2ae540b04 bugfixes :
rguyom
parents: 7458
diff changeset
61 0,
26a2ae540b04 bugfixes :
rguyom
parents: 7458
diff changeset
62 PMV_QUICKSTOP16,
7456
dacc262f41ba Support for XviD encoding
kmkaplan
parents:
diff changeset
63 PMV_EARLYSTOP16,
8078
26a2ae540b04 bugfixes :
rguyom
parents: 7458
diff changeset
64 PMV_EARLYSTOP16 | PMV_EARLYSTOP8,
26a2ae540b04 bugfixes :
rguyom
parents: 7458
diff changeset
65 PMV_EARLYSTOP16 | PMV_HALFPELREFINE16 | PMV_EARLYSTOP8 | PMV_HALFPELDIAMOND8,
26a2ae540b04 bugfixes :
rguyom
parents: 7458
diff changeset
66 PMV_EARLYSTOP16 | PMV_HALFPELREFINE16 | PMV_EARLYSTOP8 | PMV_HALFPELDIAMOND8 | PMV_ADVANCEDDIAMOND16,
26a2ae540b04 bugfixes :
rguyom
parents: 7458
diff changeset
67 PMV_EARLYSTOP16 | PMV_HALFPELREFINE16 | PMV_EXTSEARCH16 | PMV_EARLYSTOP8 | PMV_HALFPELREFINE8 |
26a2ae540b04 bugfixes :
rguyom
parents: 7458
diff changeset
68 PMV_HALFPELDIAMOND8 | PMV_USESQUARES16
26a2ae540b04 bugfixes :
rguyom
parents: 7458
diff changeset
69
8462
800d77666843 Support the latest development code from XViD dev-api-3 CVS
rguyom
parents: 8247
diff changeset
70 #endif
7456
dacc262f41ba Support for XviD encoding
kmkaplan
parents:
diff changeset
71 };
dacc262f41ba Support for XviD encoding
kmkaplan
parents:
diff changeset
72
8078
26a2ae540b04 bugfixes :
rguyom
parents: 7458
diff changeset
73 extern char* passtmpfile;
7456
dacc262f41ba Support for XviD encoding
kmkaplan
parents:
diff changeset
74
8078
26a2ae540b04 bugfixes :
rguyom
parents: 7458
diff changeset
75 static int xvidenc_pass = 0;
9817
796e9b8bf2e3 - added <time.h> since we're using time() related functions
rguyom
parents: 9809
diff changeset
76 static int xvidenc_quality = 6;
8462
800d77666843 Support the latest development code from XViD dev-api-3 CVS
rguyom
parents: 8247
diff changeset
77 static int xvidenc_4mv = 0;
8078
26a2ae540b04 bugfixes :
rguyom
parents: 7458
diff changeset
78 static int xvidenc_bitrate = -1;
26a2ae540b04 bugfixes :
rguyom
parents: 7458
diff changeset
79 static int xvidenc_rc_reaction_delay_factor = -1;
26a2ae540b04 bugfixes :
rguyom
parents: 7458
diff changeset
80 static int xvidenc_rc_averaging_period = -1;
26a2ae540b04 bugfixes :
rguyom
parents: 7458
diff changeset
81 static int xvidenc_rc_buffer = -1;
8247
91edcb091dc6 Instead of min_quantizer, max_quantizer, min_iquantizer, etc... use a
rguyom
parents: 8221
diff changeset
82 static char* xvidenc_quant_range = "2-31/2-31";
8221
8ea6ba1e6c0b Implements [min|max]_[i|p]quantizer.
rguyom
parents: 8193
diff changeset
83 static int xvidenc_min_key_interval = -1;
8078
26a2ae540b04 bugfixes :
rguyom
parents: 7458
diff changeset
84 static int xvidenc_max_key_interval = -1;
26a2ae540b04 bugfixes :
rguyom
parents: 7458
diff changeset
85 static int xvidenc_mpeg_quant = 0;
8192
126223903808 - added modulated quatization
rguyom
parents: 8123
diff changeset
86 static int xvidenc_mod_quant = 0;
8221
8ea6ba1e6c0b Implements [min|max]_[i|p]quantizer.
rguyom
parents: 8193
diff changeset
87 static int xvidenc_keyframe_boost = -1;
8192
126223903808 - added modulated quatization
rguyom
parents: 8123
diff changeset
88 static int xvidenc_kfthreshold = -1;
126223903808 - added modulated quatization
rguyom
parents: 8123
diff changeset
89 static int xvidenc_kfreduction = -1;
8078
26a2ae540b04 bugfixes :
rguyom
parents: 7458
diff changeset
90 static int xvidenc_fixed_quant = 0;
26a2ae540b04 bugfixes :
rguyom
parents: 7458
diff changeset
91 static int xvidenc_debug = 0;
9805
rguyom
parents: 9804
diff changeset
92 static int xvidenc_interlacing = 0;
9806
rguyom
parents: 9805
diff changeset
93 static int xvidenc_greyscale = 0;
8491
ce25d80dd6c3 Use the XVID_API_UNSTABLE macro instead of a home-made one.
rguyom
parents: 8462
diff changeset
94 #ifdef XVID_API_UNSTABLE
9805
rguyom
parents: 9804
diff changeset
95 static int xvidenc_packed = 0;
rguyom
parents: 9804
diff changeset
96 static int xvidenc_divx5bvop = 1;
9804
e20ef33d172a Updating XviD :
rguyom
parents: 9803
diff changeset
97 static int xvidenc_lumi_mask = 0;
8462
800d77666843 Support the latest development code from XViD dev-api-3 CVS
rguyom
parents: 8247
diff changeset
98 static int xvidenc_qpel = 0;
800d77666843 Support the latest development code from XViD dev-api-3 CVS
rguyom
parents: 8247
diff changeset
99 static int xvidenc_max_bframes = 0;
9804
e20ef33d172a Updating XviD :
rguyom
parents: 9803
diff changeset
100 static int xvidenc_bquant_ratio = 150;
e20ef33d172a Updating XviD :
rguyom
parents: 9803
diff changeset
101 static int xvidenc_bquant_offset = 100;
9843
34c91eb8a897 + bf_threshold
rguyom
parents: 9835
diff changeset
102 static int xvidenc_bf_threshold = 0;
8462
800d77666843 Support the latest development code from XViD dev-api-3 CVS
rguyom
parents: 8247
diff changeset
103 static int xvidenc_gmc = 0;
9805
rguyom
parents: 9804
diff changeset
104 static int xvidenc_chroma_me = 0;
9817
796e9b8bf2e3 - added <time.h> since we're using time() related functions
rguyom
parents: 9809
diff changeset
105 static int xvidenc_chroma_opt = 0;
8462
800d77666843 Support the latest development code from XViD dev-api-3 CVS
rguyom
parents: 8247
diff changeset
106 static int xvidenc_reduced = 0;
9817
796e9b8bf2e3 - added <time.h> since we're using time() related functions
rguyom
parents: 9809
diff changeset
107 static int xvidenc_hqac = 0;
796e9b8bf2e3 - added <time.h> since we're using time() related functions
rguyom
parents: 9809
diff changeset
108 static int xvidenc_vhq = 0;
796e9b8bf2e3 - added <time.h> since we're using time() related functions
rguyom
parents: 9809
diff changeset
109 static int xvidenc_psnr = 0;
9809
508dc4231269 Actually do something useful with XVID_GLOBAL_EXTRASTATS / XVID_EXTRASTATS.
rguyom
parents: 9806
diff changeset
110 static uint64_t xvid_error[3];
8462
800d77666843 Support the latest development code from XViD dev-api-3 CVS
rguyom
parents: 8247
diff changeset
111 #endif
7458
e5dacf3e6a04 Use string selection to choose mode
kmkaplan
parents: 7456
diff changeset
112
7456
dacc262f41ba Support for XviD encoding
kmkaplan
parents:
diff changeset
113 struct config xvidencopts_conf[] = {
8078
26a2ae540b04 bugfixes :
rguyom
parents: 7458
diff changeset
114 { "pass", &xvidenc_pass, CONF_TYPE_INT, CONF_RANGE, 0, 2, NULL},
8462
800d77666843 Support the latest development code from XViD dev-api-3 CVS
rguyom
parents: 8247
diff changeset
115 { "me_quality", &xvidenc_quality, CONF_TYPE_INT, CONF_RANGE, 0,
800d77666843 Support the latest development code from XViD dev-api-3 CVS
rguyom
parents: 8247
diff changeset
116 sizeof(motion_presets) / sizeof(motion_presets[0]) - 1, NULL},
800d77666843 Support the latest development code from XViD dev-api-3 CVS
rguyom
parents: 8247
diff changeset
117 { "4mv", &xvidenc_4mv, CONF_TYPE_FLAG, 0, 0, 1, NULL},
800d77666843 Support the latest development code from XViD dev-api-3 CVS
rguyom
parents: 8247
diff changeset
118 { "bitrate", &xvidenc_bitrate, CONF_TYPE_INT, CONF_RANGE, 4, 24000000, NULL},
8078
26a2ae540b04 bugfixes :
rguyom
parents: 7458
diff changeset
119 { "rc_reaction_delay_factor", &xvidenc_rc_reaction_delay_factor, CONF_TYPE_INT, 0, 0, 0, NULL},
26a2ae540b04 bugfixes :
rguyom
parents: 7458
diff changeset
120 { "rc_averaging_period", &xvidenc_rc_averaging_period, CONF_TYPE_INT, 0, 0, 0, NULL},
26a2ae540b04 bugfixes :
rguyom
parents: 7458
diff changeset
121 { "rc_buffer", &xvidenc_rc_buffer, CONF_TYPE_INT, 0, 0, 0, NULL},
8247
91edcb091dc6 Instead of min_quantizer, max_quantizer, min_iquantizer, etc... use a
rguyom
parents: 8221
diff changeset
122 { "quant_range", &xvidenc_quant_range, CONF_TYPE_STRING, 0, 0, 0, NULL},
8078
26a2ae540b04 bugfixes :
rguyom
parents: 7458
diff changeset
123 { "min_key_interval", &xvidenc_min_key_interval, CONF_TYPE_INT, 0, 0, 0, NULL}, /* for XVID_MODE_2PASS_2 */
26a2ae540b04 bugfixes :
rguyom
parents: 7458
diff changeset
124 { "max_key_interval", &xvidenc_max_key_interval, CONF_TYPE_INT, 0, 0, 0, NULL},
26a2ae540b04 bugfixes :
rguyom
parents: 7458
diff changeset
125 { "mpeg_quant", &xvidenc_mpeg_quant, CONF_TYPE_FLAG, 0, 0, 1, NULL},
8192
126223903808 - added modulated quatization
rguyom
parents: 8123
diff changeset
126 { "mod_quant", &xvidenc_mod_quant, CONF_TYPE_FLAG, 0, 0, 1, NULL},
8193
83d3125cb382 A bit more sane range.
rguyom
parents: 8192
diff changeset
127 { "keyframe_boost", &xvidenc_keyframe_boost, CONF_TYPE_INT, CONF_RANGE, 0, 1000, NULL}, /* for XVID_MODE_2PASS_2 */
8078
26a2ae540b04 bugfixes :
rguyom
parents: 7458
diff changeset
128 { "kfthreshold", &xvidenc_kfthreshold, CONF_TYPE_INT, 0, 0, 0, NULL}, /* for XVID_MODE_2PASS_2 */
8192
126223903808 - added modulated quatization
rguyom
parents: 8123
diff changeset
129 { "kfreduction", &xvidenc_kfreduction, CONF_TYPE_INT, CONF_RANGE, 0, 100, NULL}, /* for XVID_MODE_2PASS_2 */
8078
26a2ae540b04 bugfixes :
rguyom
parents: 7458
diff changeset
130 { "fixed_quant", &xvidenc_fixed_quant, CONF_TYPE_INT, CONF_RANGE, 1, 31, NULL}, /* for XVID_MODE_FIXED_QUANT */
26a2ae540b04 bugfixes :
rguyom
parents: 7458
diff changeset
131 { "debug", &xvidenc_debug, CONF_TYPE_FLAG, 0, 0, 1, NULL},
9805
rguyom
parents: 9804
diff changeset
132 { "interlacing", &xvidenc_interlacing, CONF_TYPE_FLAG, 0, 0, 1, NULL},
9806
rguyom
parents: 9805
diff changeset
133 { "greyscale", &xvidenc_greyscale, CONF_TYPE_FLAG, 0, 0, 1, NULL},
8491
ce25d80dd6c3 Use the XVID_API_UNSTABLE macro instead of a home-made one.
rguyom
parents: 8462
diff changeset
134 #ifdef XVID_API_UNSTABLE
9805
rguyom
parents: 9804
diff changeset
135 { "packed", &xvidenc_packed, CONF_TYPE_FLAG, 0, 0, 1, NULL},
rguyom
parents: 9804
diff changeset
136 { "divx5bvop", &xvidenc_divx5bvop, CONF_TYPE_FLAG, 0, 0, 1, NULL},
9804
e20ef33d172a Updating XviD :
rguyom
parents: 9803
diff changeset
137 //{ "lumi_mask", &xvidenc_lumi_mask, CONF_TYPE_FLAG, 0, 0, 1, NULL},
9809
508dc4231269 Actually do something useful with XVID_GLOBAL_EXTRASTATS / XVID_EXTRASTATS.
rguyom
parents: 9806
diff changeset
138 { "psnr", &xvidenc_psnr, CONF_TYPE_FLAG, 0, 0, 1, NULL},
8462
800d77666843 Support the latest development code from XViD dev-api-3 CVS
rguyom
parents: 8247
diff changeset
139 { "qpel", &xvidenc_qpel, CONF_TYPE_FLAG, 0, 0, 1, NULL},
800d77666843 Support the latest development code from XViD dev-api-3 CVS
rguyom
parents: 8247
diff changeset
140 { "max_bframes", &xvidenc_max_bframes, CONF_TYPE_INT, CONF_RANGE, 0, 4, NULL},
800d77666843 Support the latest development code from XViD dev-api-3 CVS
rguyom
parents: 8247
diff changeset
141 { "bquant_ratio", &xvidenc_bquant_ratio, CONF_TYPE_INT, CONF_RANGE, 0, 1000, NULL},
800d77666843 Support the latest development code from XViD dev-api-3 CVS
rguyom
parents: 8247
diff changeset
142 { "bquant_offset", &xvidenc_bquant_offset, CONF_TYPE_INT, CONF_RANGE, -1000, 1000, NULL},
9843
34c91eb8a897 + bf_threshold
rguyom
parents: 9835
diff changeset
143 { "bf_threshold", &xvidenc_bf_threshold, CONF_TYPE_INT, CONF_RANGE, -255, 255, NULL},
8462
800d77666843 Support the latest development code from XViD dev-api-3 CVS
rguyom
parents: 8247
diff changeset
144 { "reduced", &xvidenc_reduced, CONF_TYPE_FLAG, 0, 0, 1, NULL},
800d77666843 Support the latest development code from XViD dev-api-3 CVS
rguyom
parents: 8247
diff changeset
145 { "gmc", &xvidenc_gmc, CONF_TYPE_FLAG, 0, 0, 1, NULL},
9805
rguyom
parents: 9804
diff changeset
146 { "chroma_me", &xvidenc_chroma_me, CONF_TYPE_FLAG, 0, 0, 1, NULL},
9803
4563dfa92a5b xvid fixes and more options by elcabesa & Martin Drab
henry
parents: 9014
diff changeset
147 { "hq_ac", &xvidenc_hqac, CONF_TYPE_FLAG, 0, 0, 1, NULL},
9819
9aa9715af708 Shift vhq values and set vhq=1 to MODEDECISION.
rguyom
parents: 9817
diff changeset
148 { "vhq", &xvidenc_vhq, CONF_TYPE_INT, CONF_RANGE, 0, 4, NULL},
9817
796e9b8bf2e3 - added <time.h> since we're using time() related functions
rguyom
parents: 9809
diff changeset
149 { "chroma_opt", &xvidenc_chroma_opt, CONF_TYPE_FLAG, 0, 0, 1, NULL},
8462
800d77666843 Support the latest development code from XViD dev-api-3 CVS
rguyom
parents: 8247
diff changeset
150 #endif
7456
dacc262f41ba Support for XviD encoding
kmkaplan
parents:
diff changeset
151 { NULL, NULL, 0, 0, 0, 0, NULL}
dacc262f41ba Support for XviD encoding
kmkaplan
parents:
diff changeset
152 };
dacc262f41ba Support for XviD encoding
kmkaplan
parents:
diff changeset
153
dacc262f41ba Support for XviD encoding
kmkaplan
parents:
diff changeset
154 struct vf_priv_s {
8585
27da710563c2 the long-waited MUXER layer, and new MPEG-PS muxer
arpi
parents: 8561
diff changeset
155 muxer_stream_t* mux;
7456
dacc262f41ba Support for XviD encoding
kmkaplan
parents:
diff changeset
156 XVID_ENC_FRAME enc_frame;
dacc262f41ba Support for XviD encoding
kmkaplan
parents:
diff changeset
157 void* enc_handle;
dacc262f41ba Support for XviD encoding
kmkaplan
parents:
diff changeset
158 vbr_control_t vbr_state;
9809
508dc4231269 Actually do something useful with XVID_GLOBAL_EXTRASTATS / XVID_EXTRASTATS.
rguyom
parents: 9806
diff changeset
159 int pixels;
508dc4231269 Actually do something useful with XVID_GLOBAL_EXTRASTATS / XVID_EXTRASTATS.
rguyom
parents: 9806
diff changeset
160 int nb_frames;
7456
dacc262f41ba Support for XviD encoding
kmkaplan
parents:
diff changeset
161 };
dacc262f41ba Support for XviD encoding
kmkaplan
parents:
diff changeset
162
dacc262f41ba Support for XviD encoding
kmkaplan
parents:
diff changeset
163 static int
dacc262f41ba Support for XviD encoding
kmkaplan
parents:
diff changeset
164 config(struct vf_instance_s* vf,
dacc262f41ba Support for XviD encoding
kmkaplan
parents:
diff changeset
165 int width, int height, int d_width, int d_height,
dacc262f41ba Support for XviD encoding
kmkaplan
parents:
diff changeset
166 unsigned int flags, unsigned int outfmt)
dacc262f41ba Support for XviD encoding
kmkaplan
parents:
diff changeset
167 {
dacc262f41ba Support for XviD encoding
kmkaplan
parents:
diff changeset
168 XVID_ENC_PARAM enc_param;
8078
26a2ae540b04 bugfixes :
rguyom
parents: 7458
diff changeset
169 struct vf_priv_s *fp = vf->priv;
8247
91edcb091dc6 Instead of min_quantizer, max_quantizer, min_iquantizer, etc... use a
rguyom
parents: 8221
diff changeset
170 unsigned int min_iq, max_iq, min_pq, max_pq;
7456
dacc262f41ba Support for XviD encoding
kmkaplan
parents:
diff changeset
171
8078
26a2ae540b04 bugfixes :
rguyom
parents: 7458
diff changeset
172 fp->mux->bih->biWidth = width;
26a2ae540b04 bugfixes :
rguyom
parents: 7458
diff changeset
173 fp->mux->bih->biHeight = height;
26a2ae540b04 bugfixes :
rguyom
parents: 7458
diff changeset
174 fp->mux->bih->biSizeImage = fp->mux->bih->biWidth * fp->mux->bih->biHeight * 3;
26a2ae540b04 bugfixes :
rguyom
parents: 7458
diff changeset
175 mp_msg(MSGT_MENCODER,MSGL_INFO,"videocodec: XViD (%dx%d fourcc=%x [%.4s])\n",
26a2ae540b04 bugfixes :
rguyom
parents: 7458
diff changeset
176 width, height, fp->mux->bih->biCompression, (char *)&fp->mux->bih->biCompression);
7456
dacc262f41ba Support for XviD encoding
kmkaplan
parents:
diff changeset
177
8247
91edcb091dc6 Instead of min_quantizer, max_quantizer, min_iquantizer, etc... use a
rguyom
parents: 8221
diff changeset
178 // {min,max}_{i,p}quantizer parsing & validation
91edcb091dc6 Instead of min_quantizer, max_quantizer, min_iquantizer, etc... use a
rguyom
parents: 8221
diff changeset
179 if (sscanf (xvidenc_quant_range, "%u-%u/%u-%u", &min_iq, &max_iq, &min_pq, &max_pq) < 4) {
91edcb091dc6 Instead of min_quantizer, max_quantizer, min_iquantizer, etc... use a
rguyom
parents: 8221
diff changeset
180 mp_msg (MSGT_MENCODER, MSGL_ERR,
91edcb091dc6 Instead of min_quantizer, max_quantizer, min_iquantizer, etc... use a
rguyom
parents: 8221
diff changeset
181 "xvid: ERROR: cannot parse \"quant_range=%s\"\n", xvidenc_quant_range);
91edcb091dc6 Instead of min_quantizer, max_quantizer, min_iquantizer, etc... use a
rguyom
parents: 8221
diff changeset
182 return 0;
91edcb091dc6 Instead of min_quantizer, max_quantizer, min_iquantizer, etc... use a
rguyom
parents: 8221
diff changeset
183 }
91edcb091dc6 Instead of min_quantizer, max_quantizer, min_iquantizer, etc... use a
rguyom
parents: 8221
diff changeset
184 if (min_iq < 1 || min_iq > 31 || max_iq < 1 || max_iq > 31 || min_iq > max_iq ||
91edcb091dc6 Instead of min_quantizer, max_quantizer, min_iquantizer, etc... use a
rguyom
parents: 8221
diff changeset
185 min_pq < 1 || min_pq > 31 || max_pq < 1 || max_pq > 31 || min_pq > max_pq) {
91edcb091dc6 Instead of min_quantizer, max_quantizer, min_iquantizer, etc... use a
rguyom
parents: 8221
diff changeset
186 mp_msg (MSGT_MENCODER, MSGL_ERR,
91edcb091dc6 Instead of min_quantizer, max_quantizer, min_iquantizer, etc... use a
rguyom
parents: 8221
diff changeset
187 "xvid: ERROR: {min,max} {I,P} quantizer must be in [1,31] and min must be <= max.\n");
91edcb091dc6 Instead of min_quantizer, max_quantizer, min_iquantizer, etc... use a
rguyom
parents: 8221
diff changeset
188 mp_msg (MSGT_MENCODER, MSGL_ERR,
91edcb091dc6 Instead of min_quantizer, max_quantizer, min_iquantizer, etc... use a
rguyom
parents: 8221
diff changeset
189 "xvid: ERROR: cannot use \"quant_range=%s\"\n", xvidenc_quant_range);
91edcb091dc6 Instead of min_quantizer, max_quantizer, min_iquantizer, etc... use a
rguyom
parents: 8221
diff changeset
190 return -1;
91edcb091dc6 Instead of min_quantizer, max_quantizer, min_iquantizer, etc... use a
rguyom
parents: 8221
diff changeset
191 }
91edcb091dc6 Instead of min_quantizer, max_quantizer, min_iquantizer, etc... use a
rguyom
parents: 8221
diff changeset
192
8491
ce25d80dd6c3 Use the XVID_API_UNSTABLE macro instead of a home-made one.
rguyom
parents: 8462
diff changeset
193 #ifdef XVID_API_UNSTABLE
ce25d80dd6c3 Use the XVID_API_UNSTABLE macro instead of a home-made one.
rguyom
parents: 8462
diff changeset
194 mp_msg (MSGT_MENCODER, MSGL_WARN,
ce25d80dd6c3 Use the XVID_API_UNSTABLE macro instead of a home-made one.
rguyom
parents: 8462
diff changeset
195 "\n"
ce25d80dd6c3 Use the XVID_API_UNSTABLE macro instead of a home-made one.
rguyom
parents: 8462
diff changeset
196 "*******************************************************************\n"
ce25d80dd6c3 Use the XVID_API_UNSTABLE macro instead of a home-made one.
rguyom
parents: 8462
diff changeset
197 "** **\n"
ce25d80dd6c3 Use the XVID_API_UNSTABLE macro instead of a home-made one.
rguyom
parents: 8462
diff changeset
198 "** Y O U ' R E U S I N G U N S T A B L E S O F T W A R E **\n"
ce25d80dd6c3 Use the XVID_API_UNSTABLE macro instead of a home-made one.
rguyom
parents: 8462
diff changeset
199 "** **\n"
9806
rguyom
parents: 9805
diff changeset
200 "** Streams produced by this version aren't probably compatible **\n"
8491
ce25d80dd6c3 Use the XVID_API_UNSTABLE macro instead of a home-made one.
rguyom
parents: 8462
diff changeset
201 "** with anything else, even the xvid decoder itself. There are **\n"
ce25d80dd6c3 Use the XVID_API_UNSTABLE macro instead of a home-made one.
rguyom
parents: 8462
diff changeset
202 "** bugs, this code could crash, could blow up your PC or the **\n"
ce25d80dd6c3 Use the XVID_API_UNSTABLE macro instead of a home-made one.
rguyom
parents: 8462
diff changeset
203 "** whole building ! **\n"
ce25d80dd6c3 Use the XVID_API_UNSTABLE macro instead of a home-made one.
rguyom
parents: 8462
diff changeset
204 "** If you want stable code and compatible streams, use stable **\n"
ce25d80dd6c3 Use the XVID_API_UNSTABLE macro instead of a home-made one.
rguyom
parents: 8462
diff changeset
205 "** XViD releases (currently 0.9.x). **\n"
ce25d80dd6c3 Use the XVID_API_UNSTABLE macro instead of a home-made one.
rguyom
parents: 8462
diff changeset
206 "** **\n"
ce25d80dd6c3 Use the XVID_API_UNSTABLE macro instead of a home-made one.
rguyom
parents: 8462
diff changeset
207 "*******************************************************************\n"
ce25d80dd6c3 Use the XVID_API_UNSTABLE macro instead of a home-made one.
rguyom
parents: 8462
diff changeset
208 "\n");
ce25d80dd6c3 Use the XVID_API_UNSTABLE macro instead of a home-made one.
rguyom
parents: 8462
diff changeset
209 #endif
ce25d80dd6c3 Use the XVID_API_UNSTABLE macro instead of a home-made one.
rguyom
parents: 8462
diff changeset
210
8078
26a2ae540b04 bugfixes :
rguyom
parents: 7458
diff changeset
211 // initialize XViD core parameters
26a2ae540b04 bugfixes :
rguyom
parents: 7458
diff changeset
212 // ===============================
7456
dacc262f41ba Support for XviD encoding
kmkaplan
parents:
diff changeset
213 memset(&enc_param, 0, sizeof(enc_param));
dacc262f41ba Support for XviD encoding
kmkaplan
parents:
diff changeset
214 enc_param.width = width;
dacc262f41ba Support for XviD encoding
kmkaplan
parents:
diff changeset
215 enc_param.height = height;
8078
26a2ae540b04 bugfixes :
rguyom
parents: 7458
diff changeset
216 enc_param.fincr = fp->mux->h.dwScale;
26a2ae540b04 bugfixes :
rguyom
parents: 7458
diff changeset
217 enc_param.fbase = fp->mux->h.dwRate;
26a2ae540b04 bugfixes :
rguyom
parents: 7458
diff changeset
218 if (xvidenc_bitrate > 16000)
26a2ae540b04 bugfixes :
rguyom
parents: 7458
diff changeset
219 enc_param.rc_bitrate = xvidenc_bitrate;
26a2ae540b04 bugfixes :
rguyom
parents: 7458
diff changeset
220 else if (xvidenc_bitrate > 0)
26a2ae540b04 bugfixes :
rguyom
parents: 7458
diff changeset
221 enc_param.rc_bitrate = xvidenc_bitrate * 1000;
26a2ae540b04 bugfixes :
rguyom
parents: 7458
diff changeset
222 else
26a2ae540b04 bugfixes :
rguyom
parents: 7458
diff changeset
223 enc_param.rc_bitrate = -1;
8491
ce25d80dd6c3 Use the XVID_API_UNSTABLE macro instead of a home-made one.
rguyom
parents: 8462
diff changeset
224 #ifdef XVID_API_UNSTABLE
8462
800d77666843 Support the latest development code from XViD dev-api-3 CVS
rguyom
parents: 8247
diff changeset
225 if (xvidenc_max_bframes >= 1 && xvidenc_pass >= 1) {
800d77666843 Support the latest development code from XViD dev-api-3 CVS
rguyom
parents: 8247
diff changeset
226 mp_msg(MSGT_MENCODER,MSGL_WARN, "xvid: cannot use bframes with 2-pass, disabling bframes\n");
800d77666843 Support the latest development code from XViD dev-api-3 CVS
rguyom
parents: 8247
diff changeset
227 xvidenc_max_bframes = 0;
800d77666843 Support the latest development code from XViD dev-api-3 CVS
rguyom
parents: 8247
diff changeset
228 }
800d77666843 Support the latest development code from XViD dev-api-3 CVS
rguyom
parents: 8247
diff changeset
229 enc_param.max_bframes = xvidenc_max_bframes;
800d77666843 Support the latest development code from XViD dev-api-3 CVS
rguyom
parents: 8247
diff changeset
230 enc_param.bquant_ratio = xvidenc_bquant_ratio;
800d77666843 Support the latest development code from XViD dev-api-3 CVS
rguyom
parents: 8247
diff changeset
231 enc_param.bquant_offset = xvidenc_bquant_offset;
9805
rguyom
parents: 9804
diff changeset
232 if (xvidenc_divx5bvop)
rguyom
parents: 9804
diff changeset
233 enc_param.global |= XVID_GLOBAL_DX50BVOP;
rguyom
parents: 9804
diff changeset
234 if (xvidenc_packed)
rguyom
parents: 9804
diff changeset
235 enc_param.global |= XVID_GLOBAL_PACKED;
8462
800d77666843 Support the latest development code from XViD dev-api-3 CVS
rguyom
parents: 8247
diff changeset
236 if (xvidenc_reduced)
800d77666843 Support the latest development code from XViD dev-api-3 CVS
rguyom
parents: 8247
diff changeset
237 enc_param.global |= XVID_GLOBAL_REDUCED;
9809
508dc4231269 Actually do something useful with XVID_GLOBAL_EXTRASTATS / XVID_EXTRASTATS.
rguyom
parents: 9806
diff changeset
238 if (xvidenc_psnr) {
9803
4563dfa92a5b xvid fixes and more options by elcabesa & Martin Drab
henry
parents: 9014
diff changeset
239 enc_param.global |= XVID_GLOBAL_EXTRASTATS;
9809
508dc4231269 Actually do something useful with XVID_GLOBAL_EXTRASTATS / XVID_EXTRASTATS.
rguyom
parents: 9806
diff changeset
240 fp->pixels = width * height;
508dc4231269 Actually do something useful with XVID_GLOBAL_EXTRASTATS / XVID_EXTRASTATS.
rguyom
parents: 9806
diff changeset
241 fp->nb_frames = 0;
508dc4231269 Actually do something useful with XVID_GLOBAL_EXTRASTATS / XVID_EXTRASTATS.
rguyom
parents: 9806
diff changeset
242 xvid_error[0] = xvid_error[1] = xvid_error[2] = 0;
508dc4231269 Actually do something useful with XVID_GLOBAL_EXTRASTATS / XVID_EXTRASTATS.
rguyom
parents: 9806
diff changeset
243 }
9806
rguyom
parents: 9805
diff changeset
244 if (xvidenc_greyscale)
rguyom
parents: 9805
diff changeset
245 enc_param.global |= XVID_GREYSCALE;
9835
rguyom
parents: 9823
diff changeset
246 #endif
8078
26a2ae540b04 bugfixes :
rguyom
parents: 7458
diff changeset
247 enc_param.rc_reaction_delay_factor = xvidenc_rc_reaction_delay_factor;
26a2ae540b04 bugfixes :
rguyom
parents: 7458
diff changeset
248 enc_param.rc_averaging_period = xvidenc_rc_averaging_period;
26a2ae540b04 bugfixes :
rguyom
parents: 7458
diff changeset
249 enc_param.rc_buffer = xvidenc_rc_buffer;
8247
91edcb091dc6 Instead of min_quantizer, max_quantizer, min_iquantizer, etc... use a
rguyom
parents: 8221
diff changeset
250 enc_param.min_quantizer = min_iq;
91edcb091dc6 Instead of min_quantizer, max_quantizer, min_iquantizer, etc... use a
rguyom
parents: 8221
diff changeset
251 enc_param.max_quantizer = max_iq;
8221
8ea6ba1e6c0b Implements [min|max]_[i|p]quantizer.
rguyom
parents: 8193
diff changeset
252 if( xvidenc_max_key_interval <= 0 )
8ea6ba1e6c0b Implements [min|max]_[i|p]quantizer.
rguyom
parents: 8193
diff changeset
253 xvidenc_max_key_interval = 10 * enc_param.fbase / enc_param.fincr;
8ea6ba1e6c0b Implements [min|max]_[i|p]quantizer.
rguyom
parents: 8193
diff changeset
254 enc_param.max_key_interval = xvidenc_max_key_interval;
7456
dacc262f41ba Support for XviD encoding
kmkaplan
parents:
diff changeset
255 switch (xvid_encore(NULL, XVID_ENC_CREATE, &enc_param, NULL)) {
dacc262f41ba Support for XviD encoding
kmkaplan
parents:
diff changeset
256 case XVID_ERR_FAIL:
8078
26a2ae540b04 bugfixes :
rguyom
parents: 7458
diff changeset
257 mp_msg(MSGT_MENCODER,MSGL_ERR, "xvid: encoder creation failed\n");
7456
dacc262f41ba Support for XviD encoding
kmkaplan
parents:
diff changeset
258 return 0;
dacc262f41ba Support for XviD encoding
kmkaplan
parents:
diff changeset
259 case XVID_ERR_MEMORY:
8078
26a2ae540b04 bugfixes :
rguyom
parents: 7458
diff changeset
260 mp_msg(MSGT_MENCODER,MSGL_ERR, "xvid: encoder creation failed, out of memory\n");
7456
dacc262f41ba Support for XviD encoding
kmkaplan
parents:
diff changeset
261 return 0;
dacc262f41ba Support for XviD encoding
kmkaplan
parents:
diff changeset
262 case XVID_ERR_FORMAT:
8078
26a2ae540b04 bugfixes :
rguyom
parents: 7458
diff changeset
263 mp_msg(MSGT_MENCODER,MSGL_ERR, "xvid: encoder creation failed, bad format\n");
7456
dacc262f41ba Support for XviD encoding
kmkaplan
parents:
diff changeset
264 return 0;
dacc262f41ba Support for XviD encoding
kmkaplan
parents:
diff changeset
265 }
8078
26a2ae540b04 bugfixes :
rguyom
parents: 7458
diff changeset
266 fp->enc_handle = enc_param.handle;
7456
dacc262f41ba Support for XviD encoding
kmkaplan
parents:
diff changeset
267
8078
26a2ae540b04 bugfixes :
rguyom
parents: 7458
diff changeset
268 // initialize XViD per-frame static parameters
26a2ae540b04 bugfixes :
rguyom
parents: 7458
diff changeset
269 // ===========================================
8462
800d77666843 Support the latest development code from XViD dev-api-3 CVS
rguyom
parents: 8247
diff changeset
270 fp->enc_frame.motion = motion_presets[xvidenc_quality];
800d77666843 Support the latest development code from XViD dev-api-3 CVS
rguyom
parents: 8247
diff changeset
271 fp->enc_frame.general = XVID_HALFPEL | (xvidenc_mpeg_quant ? XVID_MPEGQUANT : XVID_H263QUANT);
800d77666843 Support the latest development code from XViD dev-api-3 CVS
rguyom
parents: 8247
diff changeset
272 if (xvidenc_4mv)
800d77666843 Support the latest development code from XViD dev-api-3 CVS
rguyom
parents: 8247
diff changeset
273 fp->enc_frame.general |= XVID_INTER4V;
9805
rguyom
parents: 9804
diff changeset
274 if (xvidenc_interlacing)
rguyom
parents: 9804
diff changeset
275 fp->enc_frame.general |= XVID_INTERLACING;
8491
ce25d80dd6c3 Use the XVID_API_UNSTABLE macro instead of a home-made one.
rguyom
parents: 8462
diff changeset
276 #ifdef XVID_API_UNSTABLE
9843
34c91eb8a897 + bf_threshold
rguyom
parents: 9835
diff changeset
277 fp->enc_frame.bframe_threshold = xvidenc_bf_threshold;
9835
rguyom
parents: 9823
diff changeset
278 if (xvidenc_lumi_mask)
rguyom
parents: 9823
diff changeset
279 fp->enc_frame.general |= XVID_LUMIMASKING;
8462
800d77666843 Support the latest development code from XViD dev-api-3 CVS
rguyom
parents: 8247
diff changeset
280 if (xvidenc_qpel) {
800d77666843 Support the latest development code from XViD dev-api-3 CVS
rguyom
parents: 8247
diff changeset
281 fp->enc_frame.general |= XVID_QUARTERPEL;
9817
796e9b8bf2e3 - added <time.h> since we're using time() related functions
rguyom
parents: 9809
diff changeset
282 fp->enc_frame.motion |= PMV_QUARTERPELREFINE16 | PMV_QUARTERPELREFINE8;
8462
800d77666843 Support the latest development code from XViD dev-api-3 CVS
rguyom
parents: 8247
diff changeset
283 }
9817
796e9b8bf2e3 - added <time.h> since we're using time() related functions
rguyom
parents: 9809
diff changeset
284 switch (xvidenc_vhq) {
9819
9aa9715af708 Shift vhq values and set vhq=1 to MODEDECISION.
rguyom
parents: 9817
diff changeset
285 case 4: // wide search
9817
796e9b8bf2e3 - added <time.h> since we're using time() related functions
rguyom
parents: 9809
diff changeset
286 fp->enc_frame.motion |= EXTSEARCH_BITS | PMV_EXTSEARCH8;
9819
9aa9715af708 Shift vhq values and set vhq=1 to MODEDECISION.
rguyom
parents: 9817
diff changeset
287 case 3: // medium search
9817
796e9b8bf2e3 - added <time.h> since we're using time() related functions
rguyom
parents: 9809
diff changeset
288 fp->enc_frame.motion |= HALFPELREFINE8_BITS | QUARTERPELREFINE8_BITS | CHECKPREDICTION_BITS;
9819
9aa9715af708 Shift vhq values and set vhq=1 to MODEDECISION.
rguyom
parents: 9817
diff changeset
289 case 2: // limited search
9817
796e9b8bf2e3 - added <time.h> since we're using time() related functions
rguyom
parents: 9809
diff changeset
290 fp->enc_frame.motion |= HALFPELREFINE16_BITS | QUARTERPELREFINE16_BITS;
9819
9aa9715af708 Shift vhq values and set vhq=1 to MODEDECISION.
rguyom
parents: 9817
diff changeset
291 case 1: // mode decision
9803
4563dfa92a5b xvid fixes and more options by elcabesa & Martin Drab
henry
parents: 9014
diff changeset
292 fp->enc_frame.general |= XVID_MODEDECISION_BITS;
9817
796e9b8bf2e3 - added <time.h> since we're using time() related functions
rguyom
parents: 9809
diff changeset
293 break;
796e9b8bf2e3 - added <time.h> since we're using time() related functions
rguyom
parents: 9809
diff changeset
294 case 0: // off
796e9b8bf2e3 - added <time.h> since we're using time() related functions
rguyom
parents: 9809
diff changeset
295 break;
796e9b8bf2e3 - added <time.h> since we're using time() related functions
rguyom
parents: 9809
diff changeset
296 }
8462
800d77666843 Support the latest development code from XViD dev-api-3 CVS
rguyom
parents: 8247
diff changeset
297 if (xvidenc_gmc)
800d77666843 Support the latest development code from XViD dev-api-3 CVS
rguyom
parents: 8247
diff changeset
298 fp->enc_frame.general |= XVID_GMC;
9809
508dc4231269 Actually do something useful with XVID_GLOBAL_EXTRASTATS / XVID_EXTRASTATS.
rguyom
parents: 9806
diff changeset
299 if (xvidenc_psnr)
9803
4563dfa92a5b xvid fixes and more options by elcabesa & Martin Drab
henry
parents: 9014
diff changeset
300 fp->enc_frame.general |= XVID_EXTRASTATS;
9805
rguyom
parents: 9804
diff changeset
301 if (xvidenc_chroma_me)
9803
4563dfa92a5b xvid fixes and more options by elcabesa & Martin Drab
henry
parents: 9014
diff changeset
302 fp->enc_frame.motion |= PMV_CHROMA16 | PMV_CHROMA8;
8462
800d77666843 Support the latest development code from XViD dev-api-3 CVS
rguyom
parents: 8247
diff changeset
303 if(xvidenc_reduced)
800d77666843 Support the latest development code from XViD dev-api-3 CVS
rguyom
parents: 8247
diff changeset
304 fp->enc_frame.general |= XVID_REDUCED;
9803
4563dfa92a5b xvid fixes and more options by elcabesa & Martin Drab
henry
parents: 9014
diff changeset
305 if(xvidenc_hqac)
4563dfa92a5b xvid fixes and more options by elcabesa & Martin Drab
henry
parents: 9014
diff changeset
306 fp->enc_frame.general |= XVID_HQACPRED;
9817
796e9b8bf2e3 - added <time.h> since we're using time() related functions
rguyom
parents: 9809
diff changeset
307 if (xvidenc_chroma_opt)
9803
4563dfa92a5b xvid fixes and more options by elcabesa & Martin Drab
henry
parents: 9014
diff changeset
308 fp->enc_frame.general |= XVID_CHROMAOPT;
9835
rguyom
parents: 9823
diff changeset
309 #else
rguyom
parents: 9823
diff changeset
310 if (xvidenc_greyscale)
rguyom
parents: 9823
diff changeset
311 fp->enc_frame.general |= XVID_GREYSCALE;
8462
800d77666843 Support the latest development code from XViD dev-api-3 CVS
rguyom
parents: 8247
diff changeset
312 #endif
8078
26a2ae540b04 bugfixes :
rguyom
parents: 7458
diff changeset
313
7456
dacc262f41ba Support for XviD encoding
kmkaplan
parents:
diff changeset
314 switch (outfmt) {
dacc262f41ba Support for XviD encoding
kmkaplan
parents:
diff changeset
315 case IMGFMT_YV12:
8078
26a2ae540b04 bugfixes :
rguyom
parents: 7458
diff changeset
316 fp->enc_frame.colorspace = XVID_CSP_YV12;
7456
dacc262f41ba Support for XviD encoding
kmkaplan
parents:
diff changeset
317 break;
dacc262f41ba Support for XviD encoding
kmkaplan
parents:
diff changeset
318 case IMGFMT_IYUV: case IMGFMT_I420:
8078
26a2ae540b04 bugfixes :
rguyom
parents: 7458
diff changeset
319 fp->enc_frame.colorspace = XVID_CSP_I420;
7456
dacc262f41ba Support for XviD encoding
kmkaplan
parents:
diff changeset
320 break;
dacc262f41ba Support for XviD encoding
kmkaplan
parents:
diff changeset
321 case IMGFMT_YUY2:
8078
26a2ae540b04 bugfixes :
rguyom
parents: 7458
diff changeset
322 fp->enc_frame.colorspace = XVID_CSP_YUY2;
7456
dacc262f41ba Support for XviD encoding
kmkaplan
parents:
diff changeset
323 break;
dacc262f41ba Support for XviD encoding
kmkaplan
parents:
diff changeset
324 case IMGFMT_UYVY:
8078
26a2ae540b04 bugfixes :
rguyom
parents: 7458
diff changeset
325 fp->enc_frame.colorspace = XVID_CSP_UYVY;
7456
dacc262f41ba Support for XviD encoding
kmkaplan
parents:
diff changeset
326 break;
dacc262f41ba Support for XviD encoding
kmkaplan
parents:
diff changeset
327 case IMGFMT_RGB24: case IMGFMT_BGR24:
8078
26a2ae540b04 bugfixes :
rguyom
parents: 7458
diff changeset
328 fp->enc_frame.colorspace = XVID_CSP_RGB24;
7456
dacc262f41ba Support for XviD encoding
kmkaplan
parents:
diff changeset
329 break;
dacc262f41ba Support for XviD encoding
kmkaplan
parents:
diff changeset
330 default:
dacc262f41ba Support for XviD encoding
kmkaplan
parents:
diff changeset
331 mp_msg(MSGT_MENCODER,MSGL_ERR,"xvid: unsupported picture format (%s)!\n",
dacc262f41ba Support for XviD encoding
kmkaplan
parents:
diff changeset
332 vo_format_name(outfmt));
dacc262f41ba Support for XviD encoding
kmkaplan
parents:
diff changeset
333 return 0;
dacc262f41ba Support for XviD encoding
kmkaplan
parents:
diff changeset
334 }
8078
26a2ae540b04 bugfixes :
rguyom
parents: 7458
diff changeset
335 fp->enc_frame.quant_intra_matrix = 0;
26a2ae540b04 bugfixes :
rguyom
parents: 7458
diff changeset
336 fp->enc_frame.quant_inter_matrix = 0;
26a2ae540b04 bugfixes :
rguyom
parents: 7458
diff changeset
337
26a2ae540b04 bugfixes :
rguyom
parents: 7458
diff changeset
338 // initialize VBR engine
26a2ae540b04 bugfixes :
rguyom
parents: 7458
diff changeset
339 // =====================
26a2ae540b04 bugfixes :
rguyom
parents: 7458
diff changeset
340 vbrSetDefaults(&fp->vbr_state);
8221
8ea6ba1e6c0b Implements [min|max]_[i|p]quantizer.
rguyom
parents: 8193
diff changeset
341 if (xvidenc_min_key_interval < 0)
8ea6ba1e6c0b Implements [min|max]_[i|p]quantizer.
rguyom
parents: 8193
diff changeset
342 xvidenc_min_key_interval = fp->vbr_state.min_key_interval;
8ea6ba1e6c0b Implements [min|max]_[i|p]quantizer.
rguyom
parents: 8193
diff changeset
343
8ea6ba1e6c0b Implements [min|max]_[i|p]quantizer.
rguyom
parents: 8193
diff changeset
344 // pass
8078
26a2ae540b04 bugfixes :
rguyom
parents: 7458
diff changeset
345 if (xvidenc_pass == 0) {
26a2ae540b04 bugfixes :
rguyom
parents: 7458
diff changeset
346 if (xvidenc_fixed_quant >= 1) {
26a2ae540b04 bugfixes :
rguyom
parents: 7458
diff changeset
347 fp->vbr_state.mode = VBR_MODE_FIXED_QUANT;
26a2ae540b04 bugfixes :
rguyom
parents: 7458
diff changeset
348 fp->vbr_state.fixed_quant = xvidenc_fixed_quant;
26a2ae540b04 bugfixes :
rguyom
parents: 7458
diff changeset
349 } else
26a2ae540b04 bugfixes :
rguyom
parents: 7458
diff changeset
350 fp->vbr_state.mode = VBR_MODE_1PASS;
7456
dacc262f41ba Support for XviD encoding
kmkaplan
parents:
diff changeset
351 }
8078
26a2ae540b04 bugfixes :
rguyom
parents: 7458
diff changeset
352 else if (xvidenc_pass == 1)
26a2ae540b04 bugfixes :
rguyom
parents: 7458
diff changeset
353 fp->vbr_state.mode = VBR_MODE_2PASS_1;
26a2ae540b04 bugfixes :
rguyom
parents: 7458
diff changeset
354 else if (xvidenc_pass == 2)
26a2ae540b04 bugfixes :
rguyom
parents: 7458
diff changeset
355 fp->vbr_state.mode = VBR_MODE_2PASS_2;
26a2ae540b04 bugfixes :
rguyom
parents: 7458
diff changeset
356 else
26a2ae540b04 bugfixes :
rguyom
parents: 7458
diff changeset
357 return -1;
8221
8ea6ba1e6c0b Implements [min|max]_[i|p]quantizer.
rguyom
parents: 8193
diff changeset
358
8ea6ba1e6c0b Implements [min|max]_[i|p]quantizer.
rguyom
parents: 8193
diff changeset
359 // misc
8078
26a2ae540b04 bugfixes :
rguyom
parents: 7458
diff changeset
360 fp->vbr_state.fps = (double)enc_param.fbase / enc_param.fincr;
26a2ae540b04 bugfixes :
rguyom
parents: 7458
diff changeset
361 fp->vbr_state.filename = passtmpfile;
26a2ae540b04 bugfixes :
rguyom
parents: 7458
diff changeset
362 fp->vbr_state.desired_bitrate = enc_param.rc_bitrate;
8247
91edcb091dc6 Instead of min_quantizer, max_quantizer, min_iquantizer, etc... use a
rguyom
parents: 8221
diff changeset
363 fp->vbr_state.min_iquant = min_iq;
91edcb091dc6 Instead of min_quantizer, max_quantizer, min_iquantizer, etc... use a
rguyom
parents: 8221
diff changeset
364 fp->vbr_state.max_iquant = max_iq;
91edcb091dc6 Instead of min_quantizer, max_quantizer, min_iquantizer, etc... use a
rguyom
parents: 8221
diff changeset
365 fp->vbr_state.min_pquant = min_pq;
91edcb091dc6 Instead of min_quantizer, max_quantizer, min_iquantizer, etc... use a
rguyom
parents: 8221
diff changeset
366 fp->vbr_state.max_pquant = max_pq;
8221
8ea6ba1e6c0b Implements [min|max]_[i|p]quantizer.
rguyom
parents: 8193
diff changeset
367 if (xvidenc_keyframe_boost >= 0)
8078
26a2ae540b04 bugfixes :
rguyom
parents: 7458
diff changeset
368 fp->vbr_state.keyframe_boost = xvidenc_keyframe_boost;
8192
126223903808 - added modulated quatization
rguyom
parents: 8123
diff changeset
369 if (xvidenc_kfthreshold >= 0)
8078
26a2ae540b04 bugfixes :
rguyom
parents: 7458
diff changeset
370 fp->vbr_state.kftreshold = xvidenc_kfthreshold;
8192
126223903808 - added modulated quatization
rguyom
parents: 8123
diff changeset
371 if (xvidenc_kfreduction >= 0)
8078
26a2ae540b04 bugfixes :
rguyom
parents: 7458
diff changeset
372 fp->vbr_state.kfreduction = xvidenc_kfreduction;
8221
8ea6ba1e6c0b Implements [min|max]_[i|p]quantizer.
rguyom
parents: 8193
diff changeset
373 if (xvidenc_min_key_interval >= 0)
8078
26a2ae540b04 bugfixes :
rguyom
parents: 7458
diff changeset
374 fp->vbr_state.min_key_interval = xvidenc_min_key_interval;
26a2ae540b04 bugfixes :
rguyom
parents: 7458
diff changeset
375 fp->vbr_state.max_key_interval = enc_param.max_key_interval;
26a2ae540b04 bugfixes :
rguyom
parents: 7458
diff changeset
376 fp->vbr_state.debug = xvidenc_debug;
8221
8ea6ba1e6c0b Implements [min|max]_[i|p]quantizer.
rguyom
parents: 8193
diff changeset
377
8078
26a2ae540b04 bugfixes :
rguyom
parents: 7458
diff changeset
378 vbrInit(&fp->vbr_state);
26a2ae540b04 bugfixes :
rguyom
parents: 7458
diff changeset
379
7456
dacc262f41ba Support for XviD encoding
kmkaplan
parents:
diff changeset
380 return 1;
dacc262f41ba Support for XviD encoding
kmkaplan
parents:
diff changeset
381 }
dacc262f41ba Support for XviD encoding
kmkaplan
parents:
diff changeset
382
9823
da375915f47c "psnr" & related code is only for the -HEAD (unstable) XviD branch.
rguyom
parents: 9819
diff changeset
383 #ifdef XVID_API_UNSTABLE
9809
508dc4231269 Actually do something useful with XVID_GLOBAL_EXTRASTATS / XVID_EXTRASTATS.
rguyom
parents: 9806
diff changeset
384 static double
508dc4231269 Actually do something useful with XVID_GLOBAL_EXTRASTATS / XVID_EXTRASTATS.
rguyom
parents: 9806
diff changeset
385 sse_to_PSNR(double sse, double pixels)
508dc4231269 Actually do something useful with XVID_GLOBAL_EXTRASTATS / XVID_EXTRASTATS.
rguyom
parents: 9806
diff changeset
386 {
508dc4231269 Actually do something useful with XVID_GLOBAL_EXTRASTATS / XVID_EXTRASTATS.
rguyom
parents: 9806
diff changeset
387 return sse == 0 ? INFINITY : 4.34294481903251827652 * (11.08252709031685229249 - log(sse/pixels));
508dc4231269 Actually do something useful with XVID_GLOBAL_EXTRASTATS / XVID_EXTRASTATS.
rguyom
parents: 9806
diff changeset
388 // 4.34294481903251827652 = 10/log(10)
508dc4231269 Actually do something useful with XVID_GLOBAL_EXTRASTATS / XVID_EXTRASTATS.
rguyom
parents: 9806
diff changeset
389 // 11.08252709031685229249 = log(255*255)
508dc4231269 Actually do something useful with XVID_GLOBAL_EXTRASTATS / XVID_EXTRASTATS.
rguyom
parents: 9806
diff changeset
390 }
9823
da375915f47c "psnr" & related code is only for the -HEAD (unstable) XviD branch.
rguyom
parents: 9819
diff changeset
391 #endif
9809
508dc4231269 Actually do something useful with XVID_GLOBAL_EXTRASTATS / XVID_EXTRASTATS.
rguyom
parents: 9806
diff changeset
392
7456
dacc262f41ba Support for XviD encoding
kmkaplan
parents:
diff changeset
393 static void
dacc262f41ba Support for XviD encoding
kmkaplan
parents:
diff changeset
394 uninit(struct vf_instance_s* vf)
dacc262f41ba Support for XviD encoding
kmkaplan
parents:
diff changeset
395 {
8078
26a2ae540b04 bugfixes :
rguyom
parents: 7458
diff changeset
396 struct vf_priv_s *fp = vf->priv;
26a2ae540b04 bugfixes :
rguyom
parents: 7458
diff changeset
397
9823
da375915f47c "psnr" & related code is only for the -HEAD (unstable) XviD branch.
rguyom
parents: 9819
diff changeset
398 #ifdef XVID_API_UNSTABLE
9809
508dc4231269 Actually do something useful with XVID_GLOBAL_EXTRASTATS / XVID_EXTRASTATS.
rguyom
parents: 9806
diff changeset
399 if (xvidenc_psnr) {
508dc4231269 Actually do something useful with XVID_GLOBAL_EXTRASTATS / XVID_EXTRASTATS.
rguyom
parents: 9806
diff changeset
400 double p = (double)fp->pixels * (double)fp->nb_frames;
508dc4231269 Actually do something useful with XVID_GLOBAL_EXTRASTATS / XVID_EXTRASTATS.
rguyom
parents: 9806
diff changeset
401 printf ("PSNR: Y:%2.2f, Cb:%2.2f, Cr:%2.2f, All:%2.2f\n",
508dc4231269 Actually do something useful with XVID_GLOBAL_EXTRASTATS / XVID_EXTRASTATS.
rguyom
parents: 9806
diff changeset
402 sse_to_PSNR(xvid_error[0], p),
508dc4231269 Actually do something useful with XVID_GLOBAL_EXTRASTATS / XVID_EXTRASTATS.
rguyom
parents: 9806
diff changeset
403 sse_to_PSNR(xvid_error[1], p/4),
508dc4231269 Actually do something useful with XVID_GLOBAL_EXTRASTATS / XVID_EXTRASTATS.
rguyom
parents: 9806
diff changeset
404 sse_to_PSNR(xvid_error[2], p/4),
508dc4231269 Actually do something useful with XVID_GLOBAL_EXTRASTATS / XVID_EXTRASTATS.
rguyom
parents: 9806
diff changeset
405 sse_to_PSNR(xvid_error[0] + xvid_error[1] + xvid_error[2], p*1.5));
508dc4231269 Actually do something useful with XVID_GLOBAL_EXTRASTATS / XVID_EXTRASTATS.
rguyom
parents: 9806
diff changeset
406 }
9823
da375915f47c "psnr" & related code is only for the -HEAD (unstable) XviD branch.
rguyom
parents: 9819
diff changeset
407 #endif
8078
26a2ae540b04 bugfixes :
rguyom
parents: 7458
diff changeset
408 vbrFinish(&fp->vbr_state);
7456
dacc262f41ba Support for XviD encoding
kmkaplan
parents:
diff changeset
409 }
dacc262f41ba Support for XviD encoding
kmkaplan
parents:
diff changeset
410
dacc262f41ba Support for XviD encoding
kmkaplan
parents:
diff changeset
411 static int
dacc262f41ba Support for XviD encoding
kmkaplan
parents:
diff changeset
412 control(struct vf_instance_s* vf, int request, void* data)
dacc262f41ba Support for XviD encoding
kmkaplan
parents:
diff changeset
413 {
dacc262f41ba Support for XviD encoding
kmkaplan
parents:
diff changeset
414 return CONTROL_UNKNOWN;
dacc262f41ba Support for XviD encoding
kmkaplan
parents:
diff changeset
415 }
dacc262f41ba Support for XviD encoding
kmkaplan
parents:
diff changeset
416
dacc262f41ba Support for XviD encoding
kmkaplan
parents:
diff changeset
417 static int
dacc262f41ba Support for XviD encoding
kmkaplan
parents:
diff changeset
418 query_format(struct vf_instance_s* vf, unsigned int fmt)
dacc262f41ba Support for XviD encoding
kmkaplan
parents:
diff changeset
419 {
dacc262f41ba Support for XviD encoding
kmkaplan
parents:
diff changeset
420 switch(fmt){
dacc262f41ba Support for XviD encoding
kmkaplan
parents:
diff changeset
421 case IMGFMT_YV12: case IMGFMT_IYUV: case IMGFMT_I420:
dacc262f41ba Support for XviD encoding
kmkaplan
parents:
diff changeset
422 return VFCAP_CSP_SUPPORTED | VFCAP_CSP_SUPPORTED_BY_HW;
dacc262f41ba Support for XviD encoding
kmkaplan
parents:
diff changeset
423 case IMGFMT_YUY2: case IMGFMT_UYVY:
dacc262f41ba Support for XviD encoding
kmkaplan
parents:
diff changeset
424 return VFCAP_CSP_SUPPORTED;
dacc262f41ba Support for XviD encoding
kmkaplan
parents:
diff changeset
425 case IMGFMT_RGB24: case IMGFMT_BGR24:
dacc262f41ba Support for XviD encoding
kmkaplan
parents:
diff changeset
426 return VFCAP_CSP_SUPPORTED | VFCAP_FLIPPED;
dacc262f41ba Support for XviD encoding
kmkaplan
parents:
diff changeset
427 }
dacc262f41ba Support for XviD encoding
kmkaplan
parents:
diff changeset
428 return 0;
dacc262f41ba Support for XviD encoding
kmkaplan
parents:
diff changeset
429 }
dacc262f41ba Support for XviD encoding
kmkaplan
parents:
diff changeset
430
dacc262f41ba Support for XviD encoding
kmkaplan
parents:
diff changeset
431 static int
dacc262f41ba Support for XviD encoding
kmkaplan
parents:
diff changeset
432 put_image(struct vf_instance_s* vf, mp_image_t *mpi)
dacc262f41ba Support for XviD encoding
kmkaplan
parents:
diff changeset
433 {
dacc262f41ba Support for XviD encoding
kmkaplan
parents:
diff changeset
434 XVID_ENC_STATS enc_stats;
8078
26a2ae540b04 bugfixes :
rguyom
parents: 7458
diff changeset
435 struct vf_priv_s *fp = vf->priv;
7456
dacc262f41ba Support for XviD encoding
kmkaplan
parents:
diff changeset
436
8078
26a2ae540b04 bugfixes :
rguyom
parents: 7458
diff changeset
437 fp->enc_frame.bitstream = fp->mux->buffer;
26a2ae540b04 bugfixes :
rguyom
parents: 7458
diff changeset
438 fp->enc_frame.length = -1 /* fp->mux->buffer_size */;
26a2ae540b04 bugfixes :
rguyom
parents: 7458
diff changeset
439 fp->enc_frame.image = mpi->planes[0];
8561
36da960c94e3 API change in dev-api-3 branch.
rguyom
parents: 8491
diff changeset
440 #ifdef XVID_API_UNSTABLE
36da960c94e3 API change in dev-api-3 branch.
rguyom
parents: 8491
diff changeset
441 fp->enc_frame.stride = mpi->stride[0];
36da960c94e3 API change in dev-api-3 branch.
rguyom
parents: 8491
diff changeset
442 #endif
8192
126223903808 - added modulated quatization
rguyom
parents: 8123
diff changeset
443
126223903808 - added modulated quatization
rguyom
parents: 8123
diff changeset
444 // get quantizers & I/P decision from the VBR engine
8491
ce25d80dd6c3 Use the XVID_API_UNSTABLE macro instead of a home-made one.
rguyom
parents: 8462
diff changeset
445 #ifdef XVID_API_UNSTABLE
8462
800d77666843 Support the latest development code from XViD dev-api-3 CVS
rguyom
parents: 8247
diff changeset
446 if (xvidenc_max_bframes >= 1) {
9803
4563dfa92a5b xvid fixes and more options by elcabesa & Martin Drab
henry
parents: 9014
diff changeset
447 if (xvidenc_fixed_quant!=0) {
8462
800d77666843 Support the latest development code from XViD dev-api-3 CVS
rguyom
parents: 8247
diff changeset
448 // hack, the internal VBR engine isn't fixed-quant aware
800d77666843 Support the latest development code from XViD dev-api-3 CVS
rguyom
parents: 8247
diff changeset
449 fp->enc_frame.quant = xvidenc_fixed_quant;
800d77666843 Support the latest development code from XViD dev-api-3 CVS
rguyom
parents: 8247
diff changeset
450 fp->enc_frame.intra = -1;
800d77666843 Support the latest development code from XViD dev-api-3 CVS
rguyom
parents: 8247
diff changeset
451 fp->enc_frame.bquant = (xvidenc_fixed_quant * xvidenc_bquant_ratio + xvidenc_bquant_offset) / 100;
800d77666843 Support the latest development code from XViD dev-api-3 CVS
rguyom
parents: 8247
diff changeset
452 } else
800d77666843 Support the latest development code from XViD dev-api-3 CVS
rguyom
parents: 8247
diff changeset
453 // use the internal VBR engine since the external one isn't bframe aware
9803
4563dfa92a5b xvid fixes and more options by elcabesa & Martin Drab
henry
parents: 9014
diff changeset
454 fp->enc_frame.quant =0;
4563dfa92a5b xvid fixes and more options by elcabesa & Martin Drab
henry
parents: 9014
diff changeset
455 fp->enc_frame.intra =-1;
4563dfa92a5b xvid fixes and more options by elcabesa & Martin Drab
henry
parents: 9014
diff changeset
456 fp->enc_frame.bquant = 0;
8462
800d77666843 Support the latest development code from XViD dev-api-3 CVS
rguyom
parents: 8247
diff changeset
457 } else {
800d77666843 Support the latest development code from XViD dev-api-3 CVS
rguyom
parents: 8247
diff changeset
458 fp->enc_frame.quant = vbrGetQuant(&fp->vbr_state);
800d77666843 Support the latest development code from XViD dev-api-3 CVS
rguyom
parents: 8247
diff changeset
459 fp->enc_frame.intra = vbrGetIntra(&fp->vbr_state);
800d77666843 Support the latest development code from XViD dev-api-3 CVS
rguyom
parents: 8247
diff changeset
460 }
800d77666843 Support the latest development code from XViD dev-api-3 CVS
rguyom
parents: 8247
diff changeset
461 #else
8078
26a2ae540b04 bugfixes :
rguyom
parents: 7458
diff changeset
462 fp->enc_frame.quant = vbrGetQuant(&fp->vbr_state);
26a2ae540b04 bugfixes :
rguyom
parents: 7458
diff changeset
463 fp->enc_frame.intra = vbrGetIntra(&fp->vbr_state);
8462
800d77666843 Support the latest development code from XViD dev-api-3 CVS
rguyom
parents: 8247
diff changeset
464 #endif
8192
126223903808 - added modulated quatization
rguyom
parents: 8123
diff changeset
465
126223903808 - added modulated quatization
rguyom
parents: 8123
diff changeset
466 // modulated quantizer type
126223903808 - added modulated quatization
rguyom
parents: 8123
diff changeset
467 if (xvidenc_mod_quant && xvidenc_pass == 2) {
126223903808 - added modulated quatization
rguyom
parents: 8123
diff changeset
468 fp->enc_frame.general |= (fp->enc_frame.quant < 4) ? XVID_MPEGQUANT : XVID_H263QUANT;
126223903808 - added modulated quatization
rguyom
parents: 8123
diff changeset
469 fp->enc_frame.general &= (fp->enc_frame.quant < 4) ? ~XVID_H263QUANT : ~XVID_MPEGQUANT;
126223903808 - added modulated quatization
rguyom
parents: 8123
diff changeset
470 }
126223903808 - added modulated quatization
rguyom
parents: 8123
diff changeset
471
126223903808 - added modulated quatization
rguyom
parents: 8123
diff changeset
472 // encode frame
8078
26a2ae540b04 bugfixes :
rguyom
parents: 7458
diff changeset
473 switch (xvid_encore(fp->enc_handle, XVID_ENC_ENCODE, &fp->enc_frame, &enc_stats)) {
7456
dacc262f41ba Support for XviD encoding
kmkaplan
parents:
diff changeset
474 case XVID_ERR_OK:
dacc262f41ba Support for XviD encoding
kmkaplan
parents:
diff changeset
475 break;
dacc262f41ba Support for XviD encoding
kmkaplan
parents:
diff changeset
476 case XVID_ERR_MEMORY:
dacc262f41ba Support for XviD encoding
kmkaplan
parents:
diff changeset
477 mp_msg(MSGT_MENCODER, MSGL_ERR, "xvid: out of memory\n");
dacc262f41ba Support for XviD encoding
kmkaplan
parents:
diff changeset
478 break;
dacc262f41ba Support for XviD encoding
kmkaplan
parents:
diff changeset
479 case XVID_ERR_FORMAT:
dacc262f41ba Support for XviD encoding
kmkaplan
parents:
diff changeset
480 mp_msg(MSGT_MENCODER, MSGL_ERR, "xvid: bad format\n");
dacc262f41ba Support for XviD encoding
kmkaplan
parents:
diff changeset
481 break;
dacc262f41ba Support for XviD encoding
kmkaplan
parents:
diff changeset
482 default:
dacc262f41ba Support for XviD encoding
kmkaplan
parents:
diff changeset
483 mp_msg(MSGT_MENCODER, MSGL_ERR, "xvid: failure\n");
dacc262f41ba Support for XviD encoding
kmkaplan
parents:
diff changeset
484 break;
dacc262f41ba Support for XviD encoding
kmkaplan
parents:
diff changeset
485 }
9809
508dc4231269 Actually do something useful with XVID_GLOBAL_EXTRASTATS / XVID_EXTRASTATS.
rguyom
parents: 9806
diff changeset
486
9823
da375915f47c "psnr" & related code is only for the -HEAD (unstable) XviD branch.
rguyom
parents: 9819
diff changeset
487 #ifdef XVID_API_UNSTABLE
9809
508dc4231269 Actually do something useful with XVID_GLOBAL_EXTRASTATS / XVID_EXTRASTATS.
rguyom
parents: 9806
diff changeset
488 if (xvidenc_psnr) {
508dc4231269 Actually do something useful with XVID_GLOBAL_EXTRASTATS / XVID_EXTRASTATS.
rguyom
parents: 9806
diff changeset
489 static FILE *fvstats = NULL;
508dc4231269 Actually do something useful with XVID_GLOBAL_EXTRASTATS / XVID_EXTRASTATS.
rguyom
parents: 9806
diff changeset
490 char filename[20];
508dc4231269 Actually do something useful with XVID_GLOBAL_EXTRASTATS / XVID_EXTRASTATS.
rguyom
parents: 9806
diff changeset
491
508dc4231269 Actually do something useful with XVID_GLOBAL_EXTRASTATS / XVID_EXTRASTATS.
rguyom
parents: 9806
diff changeset
492 if (!fvstats) {
508dc4231269 Actually do something useful with XVID_GLOBAL_EXTRASTATS / XVID_EXTRASTATS.
rguyom
parents: 9806
diff changeset
493 time_t today2;
508dc4231269 Actually do something useful with XVID_GLOBAL_EXTRASTATS / XVID_EXTRASTATS.
rguyom
parents: 9806
diff changeset
494 struct tm *today;
508dc4231269 Actually do something useful with XVID_GLOBAL_EXTRASTATS / XVID_EXTRASTATS.
rguyom
parents: 9806
diff changeset
495 today2 = time (NULL);
508dc4231269 Actually do something useful with XVID_GLOBAL_EXTRASTATS / XVID_EXTRASTATS.
rguyom
parents: 9806
diff changeset
496 today = localtime (&today2);
508dc4231269 Actually do something useful with XVID_GLOBAL_EXTRASTATS / XVID_EXTRASTATS.
rguyom
parents: 9806
diff changeset
497 sprintf (filename, "psnr_%02d%02d%02d.log", today->tm_hour, today->tm_min, today->tm_sec);
508dc4231269 Actually do something useful with XVID_GLOBAL_EXTRASTATS / XVID_EXTRASTATS.
rguyom
parents: 9806
diff changeset
498 fvstats = fopen (filename,"w");
508dc4231269 Actually do something useful with XVID_GLOBAL_EXTRASTATS / XVID_EXTRASTATS.
rguyom
parents: 9806
diff changeset
499 if (!fvstats) {
508dc4231269 Actually do something useful with XVID_GLOBAL_EXTRASTATS / XVID_EXTRASTATS.
rguyom
parents: 9806
diff changeset
500 perror ("fopen");
508dc4231269 Actually do something useful with XVID_GLOBAL_EXTRASTATS / XVID_EXTRASTATS.
rguyom
parents: 9806
diff changeset
501 xvidenc_psnr = 0; // disable block
508dc4231269 Actually do something useful with XVID_GLOBAL_EXTRASTATS / XVID_EXTRASTATS.
rguyom
parents: 9806
diff changeset
502 }
508dc4231269 Actually do something useful with XVID_GLOBAL_EXTRASTATS / XVID_EXTRASTATS.
rguyom
parents: 9806
diff changeset
503 }
508dc4231269 Actually do something useful with XVID_GLOBAL_EXTRASTATS / XVID_EXTRASTATS.
rguyom
parents: 9806
diff changeset
504
508dc4231269 Actually do something useful with XVID_GLOBAL_EXTRASTATS / XVID_EXTRASTATS.
rguyom
parents: 9806
diff changeset
505 xvid_error[0] += enc_stats.sse_y;
508dc4231269 Actually do something useful with XVID_GLOBAL_EXTRASTATS / XVID_EXTRASTATS.
rguyom
parents: 9806
diff changeset
506 xvid_error[1] += enc_stats.sse_u;
508dc4231269 Actually do something useful with XVID_GLOBAL_EXTRASTATS / XVID_EXTRASTATS.
rguyom
parents: 9806
diff changeset
507 xvid_error[2] += enc_stats.sse_v;
508dc4231269 Actually do something useful with XVID_GLOBAL_EXTRASTATS / XVID_EXTRASTATS.
rguyom
parents: 9806
diff changeset
508
508dc4231269 Actually do something useful with XVID_GLOBAL_EXTRASTATS / XVID_EXTRASTATS.
rguyom
parents: 9806
diff changeset
509 fprintf (fvstats, "%6d, %2d, %6d, %2.2f, %2.2f, %2.2f, %2.2f %c\n",
508dc4231269 Actually do something useful with XVID_GLOBAL_EXTRASTATS / XVID_EXTRASTATS.
rguyom
parents: 9806
diff changeset
510 fp->nb_frames,
508dc4231269 Actually do something useful with XVID_GLOBAL_EXTRASTATS / XVID_EXTRASTATS.
rguyom
parents: 9806
diff changeset
511 enc_stats.quant,
508dc4231269 Actually do something useful with XVID_GLOBAL_EXTRASTATS / XVID_EXTRASTATS.
rguyom
parents: 9806
diff changeset
512 fp->enc_frame.length,
508dc4231269 Actually do something useful with XVID_GLOBAL_EXTRASTATS / XVID_EXTRASTATS.
rguyom
parents: 9806
diff changeset
513 sse_to_PSNR (enc_stats.sse_y, fp->pixels),
508dc4231269 Actually do something useful with XVID_GLOBAL_EXTRASTATS / XVID_EXTRASTATS.
rguyom
parents: 9806
diff changeset
514 sse_to_PSNR (enc_stats.sse_u, fp->pixels / 4),
508dc4231269 Actually do something useful with XVID_GLOBAL_EXTRASTATS / XVID_EXTRASTATS.
rguyom
parents: 9806
diff changeset
515 sse_to_PSNR (enc_stats.sse_v, fp->pixels / 4),
508dc4231269 Actually do something useful with XVID_GLOBAL_EXTRASTATS / XVID_EXTRASTATS.
rguyom
parents: 9806
diff changeset
516 sse_to_PSNR (enc_stats.sse_y + enc_stats.sse_u + enc_stats.sse_v, (double)fp->pixels * 1.5),
508dc4231269 Actually do something useful with XVID_GLOBAL_EXTRASTATS / XVID_EXTRASTATS.
rguyom
parents: 9806
diff changeset
517 fp->enc_frame.intra == 0 ? 'P' : fp->enc_frame.intra == 1 ? 'I' : 'B'
508dc4231269 Actually do something useful with XVID_GLOBAL_EXTRASTATS / XVID_EXTRASTATS.
rguyom
parents: 9806
diff changeset
518 );
508dc4231269 Actually do something useful with XVID_GLOBAL_EXTRASTATS / XVID_EXTRASTATS.
rguyom
parents: 9806
diff changeset
519
508dc4231269 Actually do something useful with XVID_GLOBAL_EXTRASTATS / XVID_EXTRASTATS.
rguyom
parents: 9806
diff changeset
520 fp->nb_frames++;
508dc4231269 Actually do something useful with XVID_GLOBAL_EXTRASTATS / XVID_EXTRASTATS.
rguyom
parents: 9806
diff changeset
521 }
9823
da375915f47c "psnr" & related code is only for the -HEAD (unstable) XviD branch.
rguyom
parents: 9819
diff changeset
522 #endif
8192
126223903808 - added modulated quatization
rguyom
parents: 8123
diff changeset
523
126223903808 - added modulated quatization
rguyom
parents: 8123
diff changeset
524 // write output
9014
c671e9adbe22 Cleanup of the muxer API, func parameters muxer & muxer_f eliminated.
arpi
parents: 8585
diff changeset
525 muxer_write_chunk(fp->mux, fp->enc_frame.length, fp->enc_frame.intra==1 ? 0x10 : 0);
8192
126223903808 - added modulated quatization
rguyom
parents: 8123
diff changeset
526
126223903808 - added modulated quatization
rguyom
parents: 8123
diff changeset
527 // update the VBR engine
8078
26a2ae540b04 bugfixes :
rguyom
parents: 7458
diff changeset
528 vbrUpdate(&fp->vbr_state, enc_stats.quant, fp->enc_frame.intra,
26a2ae540b04 bugfixes :
rguyom
parents: 7458
diff changeset
529 enc_stats.hlength, fp->enc_frame.length, enc_stats.kblks, enc_stats.mblks, enc_stats.ublks);
8192
126223903808 - added modulated quatization
rguyom
parents: 8123
diff changeset
530
7456
dacc262f41ba Support for XviD encoding
kmkaplan
parents:
diff changeset
531 return 1;
dacc262f41ba Support for XviD encoding
kmkaplan
parents:
diff changeset
532 }
dacc262f41ba Support for XviD encoding
kmkaplan
parents:
diff changeset
533
dacc262f41ba Support for XviD encoding
kmkaplan
parents:
diff changeset
534 //===========================================================================//
dacc262f41ba Support for XviD encoding
kmkaplan
parents:
diff changeset
535
dacc262f41ba Support for XviD encoding
kmkaplan
parents:
diff changeset
536 static int
dacc262f41ba Support for XviD encoding
kmkaplan
parents:
diff changeset
537 vf_open(vf_instance_t *vf, char* args)
dacc262f41ba Support for XviD encoding
kmkaplan
parents:
diff changeset
538 {
dacc262f41ba Support for XviD encoding
kmkaplan
parents:
diff changeset
539 XVID_INIT_PARAM params = { 0, 0, 0};
dacc262f41ba Support for XviD encoding
kmkaplan
parents:
diff changeset
540 vf->config = config;
dacc262f41ba Support for XviD encoding
kmkaplan
parents:
diff changeset
541 vf->control = control;
dacc262f41ba Support for XviD encoding
kmkaplan
parents:
diff changeset
542 vf->uninit = uninit;
dacc262f41ba Support for XviD encoding
kmkaplan
parents:
diff changeset
543 vf->query_format = query_format;
dacc262f41ba Support for XviD encoding
kmkaplan
parents:
diff changeset
544 vf->put_image = put_image;
dacc262f41ba Support for XviD encoding
kmkaplan
parents:
diff changeset
545 vf->priv = malloc(sizeof(struct vf_priv_s));
dacc262f41ba Support for XviD encoding
kmkaplan
parents:
diff changeset
546 memset(vf->priv, 0, sizeof(struct vf_priv_s));
8585
27da710563c2 the long-waited MUXER layer, and new MPEG-PS muxer
arpi
parents: 8561
diff changeset
547 vf->priv->mux = (muxer_stream_t*)args;
7456
dacc262f41ba Support for XviD encoding
kmkaplan
parents:
diff changeset
548
dacc262f41ba Support for XviD encoding
kmkaplan
parents:
diff changeset
549 vf->priv->mux->bih = malloc(sizeof(BITMAPINFOHEADER));
dacc262f41ba Support for XviD encoding
kmkaplan
parents:
diff changeset
550 vf->priv->mux->bih->biSize = sizeof(BITMAPINFOHEADER);
dacc262f41ba Support for XviD encoding
kmkaplan
parents:
diff changeset
551 vf->priv->mux->bih->biWidth = 0;
dacc262f41ba Support for XviD encoding
kmkaplan
parents:
diff changeset
552 vf->priv->mux->bih->biHeight = 0;
dacc262f41ba Support for XviD encoding
kmkaplan
parents:
diff changeset
553 vf->priv->mux->bih->biPlanes = 1;
dacc262f41ba Support for XviD encoding
kmkaplan
parents:
diff changeset
554 vf->priv->mux->bih->biBitCount = 24;
dacc262f41ba Support for XviD encoding
kmkaplan
parents:
diff changeset
555 vf->priv->mux->bih->biCompression = mmioFOURCC('X','V','I','D');
dacc262f41ba Support for XviD encoding
kmkaplan
parents:
diff changeset
556
dacc262f41ba Support for XviD encoding
kmkaplan
parents:
diff changeset
557 if (xvid_init(NULL, 0, &params, NULL) != XVID_ERR_OK) {
8078
26a2ae540b04 bugfixes :
rguyom
parents: 7458
diff changeset
558 mp_msg(MSGT_MENCODER,MSGL_ERR, "xvid: initialisation failure\n");
7456
dacc262f41ba Support for XviD encoding
kmkaplan
parents:
diff changeset
559 abort();
dacc262f41ba Support for XviD encoding
kmkaplan
parents:
diff changeset
560 }
dacc262f41ba Support for XviD encoding
kmkaplan
parents:
diff changeset
561 if (params.api_version != API_VERSION) {
8078
26a2ae540b04 bugfixes :
rguyom
parents: 7458
diff changeset
562 mp_msg(MSGT_MENCODER,MSGL_ERR, "xvid: XviD library API version mismatch\n"
7456
dacc262f41ba Support for XviD encoding
kmkaplan
parents:
diff changeset
563 "\texpected %d.%d, got %d.%d, you should recompile MPlayer.\n",
dacc262f41ba Support for XviD encoding
kmkaplan
parents:
diff changeset
564 API_VERSION >> 16, API_VERSION & 0xff,
dacc262f41ba Support for XviD encoding
kmkaplan
parents:
diff changeset
565 params.api_version >> 16, params.api_version & 0xff);
dacc262f41ba Support for XviD encoding
kmkaplan
parents:
diff changeset
566 abort();
dacc262f41ba Support for XviD encoding
kmkaplan
parents:
diff changeset
567 }
dacc262f41ba Support for XviD encoding
kmkaplan
parents:
diff changeset
568
dacc262f41ba Support for XviD encoding
kmkaplan
parents:
diff changeset
569 return 1;
dacc262f41ba Support for XviD encoding
kmkaplan
parents:
diff changeset
570 }
dacc262f41ba Support for XviD encoding
kmkaplan
parents:
diff changeset
571
dacc262f41ba Support for XviD encoding
kmkaplan
parents:
diff changeset
572 vf_info_t ve_info_xvid = {
dacc262f41ba Support for XviD encoding
kmkaplan
parents:
diff changeset
573 "XviD encoder",
dacc262f41ba Support for XviD encoding
kmkaplan
parents:
diff changeset
574 "xvid",
8078
26a2ae540b04 bugfixes :
rguyom
parents: 7458
diff changeset
575 "Kim Minh Kaplan & Rémi Guyomarch",
7456
dacc262f41ba Support for XviD encoding
kmkaplan
parents:
diff changeset
576 "for internal use by mencoder",
dacc262f41ba Support for XviD encoding
kmkaplan
parents:
diff changeset
577 vf_open
dacc262f41ba Support for XviD encoding
kmkaplan
parents:
diff changeset
578 };
dacc262f41ba Support for XviD encoding
kmkaplan
parents:
diff changeset
579
dacc262f41ba Support for XviD encoding
kmkaplan
parents:
diff changeset
580 //===========================================================================//
dacc262f41ba Support for XviD encoding
kmkaplan
parents:
diff changeset
581 #endif