annotate libmpcodecs/ve_xvid.c @ 14685:4b02f759f529

small reordering to make future 'multiple files' changes more modular, puts single file loading separate from global option loading in the begginning. patch by Oded Shimon
author reynaldo
date Sat, 12 Feb 2005 15:11:02 +0000
parents acf3241be19b
children 5723c4b2a2ea
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
11436
6afc2d6f5a08 XviD Api4 support
iive
parents: 10594
diff changeset
15 #ifdef HAVE_XVID3
7456
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
10594
57bdcdb061d7 Removed the historic cfgparser and switched full to the new config parser (altought some macros still remain for compatibility). As a side effect 90% of the warning messages are gone from the core. Things should be cleaner now and less confusing for newbies.
alex
parents: 9843
diff changeset
31 #include "m_option.h"
8491
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
10594
57bdcdb061d7 Removed the historic cfgparser and switched full to the new config parser (altought some macros still remain for compatibility). As a side effect 90% of the warning messages are gone from the core. Things should be cleaner now and less confusing for newbies.
alex
parents: 9843
diff changeset
113 m_option_t 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;
12061
656a1b45b309 Use aspect from encoder for AVI vprp header
ranma
parents: 11436
diff changeset
175 fp->mux->aspect = (float)d_width/d_height;
8078
26a2ae540b04 bugfixes :
rguyom
parents: 7458
diff changeset
176 mp_msg(MSGT_MENCODER,MSGL_INFO,"videocodec: XViD (%dx%d fourcc=%x [%.4s])\n",
26a2ae540b04 bugfixes :
rguyom
parents: 7458
diff changeset
177 width, height, fp->mux->bih->biCompression, (char *)&fp->mux->bih->biCompression);
7456
dacc262f41ba Support for XviD encoding
kmkaplan
parents:
diff changeset
178
8247
91edcb091dc6 Instead of min_quantizer, max_quantizer, min_iquantizer, etc... use a
rguyom
parents: 8221
diff changeset
179 // {min,max}_{i,p}quantizer parsing & validation
91edcb091dc6 Instead of min_quantizer, max_quantizer, min_iquantizer, etc... use a
rguyom
parents: 8221
diff changeset
180 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
181 mp_msg (MSGT_MENCODER, MSGL_ERR,
91edcb091dc6 Instead of min_quantizer, max_quantizer, min_iquantizer, etc... use a
rguyom
parents: 8221
diff changeset
182 "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
183 return 0;
91edcb091dc6 Instead of min_quantizer, max_quantizer, min_iquantizer, etc... use a
rguyom
parents: 8221
diff changeset
184 }
91edcb091dc6 Instead of min_quantizer, max_quantizer, min_iquantizer, etc... use a
rguyom
parents: 8221
diff changeset
185 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
186 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
187 mp_msg (MSGT_MENCODER, MSGL_ERR,
91edcb091dc6 Instead of min_quantizer, max_quantizer, min_iquantizer, etc... use a
rguyom
parents: 8221
diff changeset
188 "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
189 mp_msg (MSGT_MENCODER, MSGL_ERR,
91edcb091dc6 Instead of min_quantizer, max_quantizer, min_iquantizer, etc... use a
rguyom
parents: 8221
diff changeset
190 "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
191 return -1;
91edcb091dc6 Instead of min_quantizer, max_quantizer, min_iquantizer, etc... use a
rguyom
parents: 8221
diff changeset
192 }
91edcb091dc6 Instead of min_quantizer, max_quantizer, min_iquantizer, etc... use a
rguyom
parents: 8221
diff changeset
193
8491
ce25d80dd6c3 Use the XVID_API_UNSTABLE macro instead of a home-made one.
rguyom
parents: 8462
diff changeset
194 #ifdef XVID_API_UNSTABLE
ce25d80dd6c3 Use the XVID_API_UNSTABLE macro instead of a home-made one.
rguyom
parents: 8462
diff changeset
195 mp_msg (MSGT_MENCODER, MSGL_WARN,
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 "** **\n"
ce25d80dd6c3 Use the XVID_API_UNSTABLE macro instead of a home-made one.
rguyom
parents: 8462
diff changeset
199 "** 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
200 "** **\n"
9806
rguyom
parents: 9805
diff changeset
201 "** 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
202 "** 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
203 "** 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
204 "** whole building ! **\n"
ce25d80dd6c3 Use the XVID_API_UNSTABLE macro instead of a home-made one.
rguyom
parents: 8462
diff changeset
205 "** 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
206 "** 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
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 "\n");
ce25d80dd6c3 Use the XVID_API_UNSTABLE macro instead of a home-made one.
rguyom
parents: 8462
diff changeset
210 #endif
ce25d80dd6c3 Use the XVID_API_UNSTABLE macro instead of a home-made one.
rguyom
parents: 8462
diff changeset
211
8078
26a2ae540b04 bugfixes :
rguyom
parents: 7458
diff changeset
212 // initialize XViD core parameters
26a2ae540b04 bugfixes :
rguyom
parents: 7458
diff changeset
213 // ===============================
7456
dacc262f41ba Support for XviD encoding
kmkaplan
parents:
diff changeset
214 memset(&enc_param, 0, sizeof(enc_param));
dacc262f41ba Support for XviD encoding
kmkaplan
parents:
diff changeset
215 enc_param.width = width;
dacc262f41ba Support for XviD encoding
kmkaplan
parents:
diff changeset
216 enc_param.height = height;
8078
26a2ae540b04 bugfixes :
rguyom
parents: 7458
diff changeset
217 enc_param.fincr = fp->mux->h.dwScale;
26a2ae540b04 bugfixes :
rguyom
parents: 7458
diff changeset
218 enc_param.fbase = fp->mux->h.dwRate;
26a2ae540b04 bugfixes :
rguyom
parents: 7458
diff changeset
219 if (xvidenc_bitrate > 16000)
26a2ae540b04 bugfixes :
rguyom
parents: 7458
diff changeset
220 enc_param.rc_bitrate = xvidenc_bitrate;
26a2ae540b04 bugfixes :
rguyom
parents: 7458
diff changeset
221 else if (xvidenc_bitrate > 0)
26a2ae540b04 bugfixes :
rguyom
parents: 7458
diff changeset
222 enc_param.rc_bitrate = xvidenc_bitrate * 1000;
26a2ae540b04 bugfixes :
rguyom
parents: 7458
diff changeset
223 else
26a2ae540b04 bugfixes :
rguyom
parents: 7458
diff changeset
224 enc_param.rc_bitrate = -1;
8491
ce25d80dd6c3 Use the XVID_API_UNSTABLE macro instead of a home-made one.
rguyom
parents: 8462
diff changeset
225 #ifdef XVID_API_UNSTABLE
8462
800d77666843 Support the latest development code from XViD dev-api-3 CVS
rguyom
parents: 8247
diff changeset
226 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
227 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
228 xvidenc_max_bframes = 0;
800d77666843 Support the latest development code from XViD dev-api-3 CVS
rguyom
parents: 8247
diff changeset
229 }
800d77666843 Support the latest development code from XViD dev-api-3 CVS
rguyom
parents: 8247
diff changeset
230 enc_param.max_bframes = xvidenc_max_bframes;
800d77666843 Support the latest development code from XViD dev-api-3 CVS
rguyom
parents: 8247
diff changeset
231 enc_param.bquant_ratio = xvidenc_bquant_ratio;
800d77666843 Support the latest development code from XViD dev-api-3 CVS
rguyom
parents: 8247
diff changeset
232 enc_param.bquant_offset = xvidenc_bquant_offset;
9805
rguyom
parents: 9804
diff changeset
233 if (xvidenc_divx5bvop)
rguyom
parents: 9804
diff changeset
234 enc_param.global |= XVID_GLOBAL_DX50BVOP;
rguyom
parents: 9804
diff changeset
235 if (xvidenc_packed)
rguyom
parents: 9804
diff changeset
236 enc_param.global |= XVID_GLOBAL_PACKED;
8462
800d77666843 Support the latest development code from XViD dev-api-3 CVS
rguyom
parents: 8247
diff changeset
237 if (xvidenc_reduced)
800d77666843 Support the latest development code from XViD dev-api-3 CVS
rguyom
parents: 8247
diff changeset
238 enc_param.global |= XVID_GLOBAL_REDUCED;
9809
508dc4231269 Actually do something useful with XVID_GLOBAL_EXTRASTATS / XVID_EXTRASTATS.
rguyom
parents: 9806
diff changeset
239 if (xvidenc_psnr) {
9803
4563dfa92a5b xvid fixes and more options by elcabesa & Martin Drab
henry
parents: 9014
diff changeset
240 enc_param.global |= XVID_GLOBAL_EXTRASTATS;
9809
508dc4231269 Actually do something useful with XVID_GLOBAL_EXTRASTATS / XVID_EXTRASTATS.
rguyom
parents: 9806
diff changeset
241 fp->pixels = width * height;
508dc4231269 Actually do something useful with XVID_GLOBAL_EXTRASTATS / XVID_EXTRASTATS.
rguyom
parents: 9806
diff changeset
242 fp->nb_frames = 0;
508dc4231269 Actually do something useful with XVID_GLOBAL_EXTRASTATS / XVID_EXTRASTATS.
rguyom
parents: 9806
diff changeset
243 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
244 }
9806
rguyom
parents: 9805
diff changeset
245 if (xvidenc_greyscale)
rguyom
parents: 9805
diff changeset
246 enc_param.global |= XVID_GREYSCALE;
9835
rguyom
parents: 9823
diff changeset
247 #endif
8078
26a2ae540b04 bugfixes :
rguyom
parents: 7458
diff changeset
248 enc_param.rc_reaction_delay_factor = xvidenc_rc_reaction_delay_factor;
26a2ae540b04 bugfixes :
rguyom
parents: 7458
diff changeset
249 enc_param.rc_averaging_period = xvidenc_rc_averaging_period;
26a2ae540b04 bugfixes :
rguyom
parents: 7458
diff changeset
250 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
251 enc_param.min_quantizer = min_iq;
91edcb091dc6 Instead of min_quantizer, max_quantizer, min_iquantizer, etc... use a
rguyom
parents: 8221
diff changeset
252 enc_param.max_quantizer = max_iq;
8221
8ea6ba1e6c0b Implements [min|max]_[i|p]quantizer.
rguyom
parents: 8193
diff changeset
253 if( xvidenc_max_key_interval <= 0 )
8ea6ba1e6c0b Implements [min|max]_[i|p]quantizer.
rguyom
parents: 8193
diff changeset
254 xvidenc_max_key_interval = 10 * enc_param.fbase / enc_param.fincr;
8ea6ba1e6c0b Implements [min|max]_[i|p]quantizer.
rguyom
parents: 8193
diff changeset
255 enc_param.max_key_interval = xvidenc_max_key_interval;
7456
dacc262f41ba Support for XviD encoding
kmkaplan
parents:
diff changeset
256 switch (xvid_encore(NULL, XVID_ENC_CREATE, &enc_param, NULL)) {
dacc262f41ba Support for XviD encoding
kmkaplan
parents:
diff changeset
257 case XVID_ERR_FAIL:
8078
26a2ae540b04 bugfixes :
rguyom
parents: 7458
diff changeset
258 mp_msg(MSGT_MENCODER,MSGL_ERR, "xvid: encoder creation failed\n");
7456
dacc262f41ba Support for XviD encoding
kmkaplan
parents:
diff changeset
259 return 0;
dacc262f41ba Support for XviD encoding
kmkaplan
parents:
diff changeset
260 case XVID_ERR_MEMORY:
8078
26a2ae540b04 bugfixes :
rguyom
parents: 7458
diff changeset
261 mp_msg(MSGT_MENCODER,MSGL_ERR, "xvid: encoder creation failed, out of memory\n");
7456
dacc262f41ba Support for XviD encoding
kmkaplan
parents:
diff changeset
262 return 0;
dacc262f41ba Support for XviD encoding
kmkaplan
parents:
diff changeset
263 case XVID_ERR_FORMAT:
8078
26a2ae540b04 bugfixes :
rguyom
parents: 7458
diff changeset
264 mp_msg(MSGT_MENCODER,MSGL_ERR, "xvid: encoder creation failed, bad format\n");
7456
dacc262f41ba Support for XviD encoding
kmkaplan
parents:
diff changeset
265 return 0;
dacc262f41ba Support for XviD encoding
kmkaplan
parents:
diff changeset
266 }
8078
26a2ae540b04 bugfixes :
rguyom
parents: 7458
diff changeset
267 fp->enc_handle = enc_param.handle;
7456
dacc262f41ba Support for XviD encoding
kmkaplan
parents:
diff changeset
268
8078
26a2ae540b04 bugfixes :
rguyom
parents: 7458
diff changeset
269 // initialize XViD per-frame static parameters
26a2ae540b04 bugfixes :
rguyom
parents: 7458
diff changeset
270 // ===========================================
8462
800d77666843 Support the latest development code from XViD dev-api-3 CVS
rguyom
parents: 8247
diff changeset
271 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
272 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
273 if (xvidenc_4mv)
800d77666843 Support the latest development code from XViD dev-api-3 CVS
rguyom
parents: 8247
diff changeset
274 fp->enc_frame.general |= XVID_INTER4V;
9805
rguyom
parents: 9804
diff changeset
275 if (xvidenc_interlacing)
rguyom
parents: 9804
diff changeset
276 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
277 #ifdef XVID_API_UNSTABLE
9843
34c91eb8a897 + bf_threshold
rguyom
parents: 9835
diff changeset
278 fp->enc_frame.bframe_threshold = xvidenc_bf_threshold;
9835
rguyom
parents: 9823
diff changeset
279 if (xvidenc_lumi_mask)
rguyom
parents: 9823
diff changeset
280 fp->enc_frame.general |= XVID_LUMIMASKING;
8462
800d77666843 Support the latest development code from XViD dev-api-3 CVS
rguyom
parents: 8247
diff changeset
281 if (xvidenc_qpel) {
800d77666843 Support the latest development code from XViD dev-api-3 CVS
rguyom
parents: 8247
diff changeset
282 fp->enc_frame.general |= XVID_QUARTERPEL;
9817
796e9b8bf2e3 - added <time.h> since we're using time() related functions
rguyom
parents: 9809
diff changeset
283 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
284 }
9817
796e9b8bf2e3 - added <time.h> since we're using time() related functions
rguyom
parents: 9809
diff changeset
285 switch (xvidenc_vhq) {
9819
9aa9715af708 Shift vhq values and set vhq=1 to MODEDECISION.
rguyom
parents: 9817
diff changeset
286 case 4: // wide search
9817
796e9b8bf2e3 - added <time.h> since we're using time() related functions
rguyom
parents: 9809
diff changeset
287 fp->enc_frame.motion |= EXTSEARCH_BITS | PMV_EXTSEARCH8;
9819
9aa9715af708 Shift vhq values and set vhq=1 to MODEDECISION.
rguyom
parents: 9817
diff changeset
288 case 3: // medium search
9817
796e9b8bf2e3 - added <time.h> since we're using time() related functions
rguyom
parents: 9809
diff changeset
289 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
290 case 2: // limited search
9817
796e9b8bf2e3 - added <time.h> since we're using time() related functions
rguyom
parents: 9809
diff changeset
291 fp->enc_frame.motion |= HALFPELREFINE16_BITS | QUARTERPELREFINE16_BITS;
9819
9aa9715af708 Shift vhq values and set vhq=1 to MODEDECISION.
rguyom
parents: 9817
diff changeset
292 case 1: // mode decision
9803
4563dfa92a5b xvid fixes and more options by elcabesa & Martin Drab
henry
parents: 9014
diff changeset
293 fp->enc_frame.general |= XVID_MODEDECISION_BITS;
9817
796e9b8bf2e3 - added <time.h> since we're using time() related functions
rguyom
parents: 9809
diff changeset
294 break;
796e9b8bf2e3 - added <time.h> since we're using time() related functions
rguyom
parents: 9809
diff changeset
295 case 0: // off
796e9b8bf2e3 - added <time.h> since we're using time() related functions
rguyom
parents: 9809
diff changeset
296 break;
796e9b8bf2e3 - added <time.h> since we're using time() related functions
rguyom
parents: 9809
diff changeset
297 }
8462
800d77666843 Support the latest development code from XViD dev-api-3 CVS
rguyom
parents: 8247
diff changeset
298 if (xvidenc_gmc)
800d77666843 Support the latest development code from XViD dev-api-3 CVS
rguyom
parents: 8247
diff changeset
299 fp->enc_frame.general |= XVID_GMC;
9809
508dc4231269 Actually do something useful with XVID_GLOBAL_EXTRASTATS / XVID_EXTRASTATS.
rguyom
parents: 9806
diff changeset
300 if (xvidenc_psnr)
9803
4563dfa92a5b xvid fixes and more options by elcabesa & Martin Drab
henry
parents: 9014
diff changeset
301 fp->enc_frame.general |= XVID_EXTRASTATS;
9805
rguyom
parents: 9804
diff changeset
302 if (xvidenc_chroma_me)
9803
4563dfa92a5b xvid fixes and more options by elcabesa & Martin Drab
henry
parents: 9014
diff changeset
303 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
304 if(xvidenc_reduced)
800d77666843 Support the latest development code from XViD dev-api-3 CVS
rguyom
parents: 8247
diff changeset
305 fp->enc_frame.general |= XVID_REDUCED;
9803
4563dfa92a5b xvid fixes and more options by elcabesa & Martin Drab
henry
parents: 9014
diff changeset
306 if(xvidenc_hqac)
4563dfa92a5b xvid fixes and more options by elcabesa & Martin Drab
henry
parents: 9014
diff changeset
307 fp->enc_frame.general |= XVID_HQACPRED;
9817
796e9b8bf2e3 - added <time.h> since we're using time() related functions
rguyom
parents: 9809
diff changeset
308 if (xvidenc_chroma_opt)
9803
4563dfa92a5b xvid fixes and more options by elcabesa & Martin Drab
henry
parents: 9014
diff changeset
309 fp->enc_frame.general |= XVID_CHROMAOPT;
9835
rguyom
parents: 9823
diff changeset
310 #else
rguyom
parents: 9823
diff changeset
311 if (xvidenc_greyscale)
rguyom
parents: 9823
diff changeset
312 fp->enc_frame.general |= XVID_GREYSCALE;
8462
800d77666843 Support the latest development code from XViD dev-api-3 CVS
rguyom
parents: 8247
diff changeset
313 #endif
8078
26a2ae540b04 bugfixes :
rguyom
parents: 7458
diff changeset
314
7456
dacc262f41ba Support for XviD encoding
kmkaplan
parents:
diff changeset
315 switch (outfmt) {
dacc262f41ba Support for XviD encoding
kmkaplan
parents:
diff changeset
316 case IMGFMT_YV12:
8078
26a2ae540b04 bugfixes :
rguyom
parents: 7458
diff changeset
317 fp->enc_frame.colorspace = XVID_CSP_YV12;
7456
dacc262f41ba Support for XviD encoding
kmkaplan
parents:
diff changeset
318 break;
dacc262f41ba Support for XviD encoding
kmkaplan
parents:
diff changeset
319 case IMGFMT_IYUV: case IMGFMT_I420:
8078
26a2ae540b04 bugfixes :
rguyom
parents: 7458
diff changeset
320 fp->enc_frame.colorspace = XVID_CSP_I420;
7456
dacc262f41ba Support for XviD encoding
kmkaplan
parents:
diff changeset
321 break;
dacc262f41ba Support for XviD encoding
kmkaplan
parents:
diff changeset
322 case IMGFMT_YUY2:
8078
26a2ae540b04 bugfixes :
rguyom
parents: 7458
diff changeset
323 fp->enc_frame.colorspace = XVID_CSP_YUY2;
7456
dacc262f41ba Support for XviD encoding
kmkaplan
parents:
diff changeset
324 break;
dacc262f41ba Support for XviD encoding
kmkaplan
parents:
diff changeset
325 case IMGFMT_UYVY:
8078
26a2ae540b04 bugfixes :
rguyom
parents: 7458
diff changeset
326 fp->enc_frame.colorspace = XVID_CSP_UYVY;
7456
dacc262f41ba Support for XviD encoding
kmkaplan
parents:
diff changeset
327 break;
dacc262f41ba Support for XviD encoding
kmkaplan
parents:
diff changeset
328 case IMGFMT_RGB24: case IMGFMT_BGR24:
8078
26a2ae540b04 bugfixes :
rguyom
parents: 7458
diff changeset
329 fp->enc_frame.colorspace = XVID_CSP_RGB24;
7456
dacc262f41ba Support for XviD encoding
kmkaplan
parents:
diff changeset
330 break;
dacc262f41ba Support for XviD encoding
kmkaplan
parents:
diff changeset
331 default:
dacc262f41ba Support for XviD encoding
kmkaplan
parents:
diff changeset
332 mp_msg(MSGT_MENCODER,MSGL_ERR,"xvid: unsupported picture format (%s)!\n",
dacc262f41ba Support for XviD encoding
kmkaplan
parents:
diff changeset
333 vo_format_name(outfmt));
dacc262f41ba Support for XviD encoding
kmkaplan
parents:
diff changeset
334 return 0;
dacc262f41ba Support for XviD encoding
kmkaplan
parents:
diff changeset
335 }
8078
26a2ae540b04 bugfixes :
rguyom
parents: 7458
diff changeset
336 fp->enc_frame.quant_intra_matrix = 0;
26a2ae540b04 bugfixes :
rguyom
parents: 7458
diff changeset
337 fp->enc_frame.quant_inter_matrix = 0;
26a2ae540b04 bugfixes :
rguyom
parents: 7458
diff changeset
338
26a2ae540b04 bugfixes :
rguyom
parents: 7458
diff changeset
339 // initialize VBR engine
26a2ae540b04 bugfixes :
rguyom
parents: 7458
diff changeset
340 // =====================
26a2ae540b04 bugfixes :
rguyom
parents: 7458
diff changeset
341 vbrSetDefaults(&fp->vbr_state);
8221
8ea6ba1e6c0b Implements [min|max]_[i|p]quantizer.
rguyom
parents: 8193
diff changeset
342 if (xvidenc_min_key_interval < 0)
8ea6ba1e6c0b Implements [min|max]_[i|p]quantizer.
rguyom
parents: 8193
diff changeset
343 xvidenc_min_key_interval = fp->vbr_state.min_key_interval;
8ea6ba1e6c0b Implements [min|max]_[i|p]quantizer.
rguyom
parents: 8193
diff changeset
344
8ea6ba1e6c0b Implements [min|max]_[i|p]quantizer.
rguyom
parents: 8193
diff changeset
345 // pass
8078
26a2ae540b04 bugfixes :
rguyom
parents: 7458
diff changeset
346 if (xvidenc_pass == 0) {
26a2ae540b04 bugfixes :
rguyom
parents: 7458
diff changeset
347 if (xvidenc_fixed_quant >= 1) {
26a2ae540b04 bugfixes :
rguyom
parents: 7458
diff changeset
348 fp->vbr_state.mode = VBR_MODE_FIXED_QUANT;
26a2ae540b04 bugfixes :
rguyom
parents: 7458
diff changeset
349 fp->vbr_state.fixed_quant = xvidenc_fixed_quant;
26a2ae540b04 bugfixes :
rguyom
parents: 7458
diff changeset
350 } else
26a2ae540b04 bugfixes :
rguyom
parents: 7458
diff changeset
351 fp->vbr_state.mode = VBR_MODE_1PASS;
7456
dacc262f41ba Support for XviD encoding
kmkaplan
parents:
diff changeset
352 }
8078
26a2ae540b04 bugfixes :
rguyom
parents: 7458
diff changeset
353 else if (xvidenc_pass == 1)
26a2ae540b04 bugfixes :
rguyom
parents: 7458
diff changeset
354 fp->vbr_state.mode = VBR_MODE_2PASS_1;
26a2ae540b04 bugfixes :
rguyom
parents: 7458
diff changeset
355 else if (xvidenc_pass == 2)
26a2ae540b04 bugfixes :
rguyom
parents: 7458
diff changeset
356 fp->vbr_state.mode = VBR_MODE_2PASS_2;
26a2ae540b04 bugfixes :
rguyom
parents: 7458
diff changeset
357 else
26a2ae540b04 bugfixes :
rguyom
parents: 7458
diff changeset
358 return -1;
8221
8ea6ba1e6c0b Implements [min|max]_[i|p]quantizer.
rguyom
parents: 8193
diff changeset
359
8ea6ba1e6c0b Implements [min|max]_[i|p]quantizer.
rguyom
parents: 8193
diff changeset
360 // misc
8078
26a2ae540b04 bugfixes :
rguyom
parents: 7458
diff changeset
361 fp->vbr_state.fps = (double)enc_param.fbase / enc_param.fincr;
26a2ae540b04 bugfixes :
rguyom
parents: 7458
diff changeset
362 fp->vbr_state.filename = passtmpfile;
26a2ae540b04 bugfixes :
rguyom
parents: 7458
diff changeset
363 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
364 fp->vbr_state.min_iquant = min_iq;
91edcb091dc6 Instead of min_quantizer, max_quantizer, min_iquantizer, etc... use a
rguyom
parents: 8221
diff changeset
365 fp->vbr_state.max_iquant = max_iq;
91edcb091dc6 Instead of min_quantizer, max_quantizer, min_iquantizer, etc... use a
rguyom
parents: 8221
diff changeset
366 fp->vbr_state.min_pquant = min_pq;
91edcb091dc6 Instead of min_quantizer, max_quantizer, min_iquantizer, etc... use a
rguyom
parents: 8221
diff changeset
367 fp->vbr_state.max_pquant = max_pq;
8221
8ea6ba1e6c0b Implements [min|max]_[i|p]quantizer.
rguyom
parents: 8193
diff changeset
368 if (xvidenc_keyframe_boost >= 0)
8078
26a2ae540b04 bugfixes :
rguyom
parents: 7458
diff changeset
369 fp->vbr_state.keyframe_boost = xvidenc_keyframe_boost;
8192
126223903808 - added modulated quatization
rguyom
parents: 8123
diff changeset
370 if (xvidenc_kfthreshold >= 0)
8078
26a2ae540b04 bugfixes :
rguyom
parents: 7458
diff changeset
371 fp->vbr_state.kftreshold = xvidenc_kfthreshold;
8192
126223903808 - added modulated quatization
rguyom
parents: 8123
diff changeset
372 if (xvidenc_kfreduction >= 0)
8078
26a2ae540b04 bugfixes :
rguyom
parents: 7458
diff changeset
373 fp->vbr_state.kfreduction = xvidenc_kfreduction;
8221
8ea6ba1e6c0b Implements [min|max]_[i|p]quantizer.
rguyom
parents: 8193
diff changeset
374 if (xvidenc_min_key_interval >= 0)
8078
26a2ae540b04 bugfixes :
rguyom
parents: 7458
diff changeset
375 fp->vbr_state.min_key_interval = xvidenc_min_key_interval;
26a2ae540b04 bugfixes :
rguyom
parents: 7458
diff changeset
376 fp->vbr_state.max_key_interval = enc_param.max_key_interval;
26a2ae540b04 bugfixes :
rguyom
parents: 7458
diff changeset
377 fp->vbr_state.debug = xvidenc_debug;
8221
8ea6ba1e6c0b Implements [min|max]_[i|p]quantizer.
rguyom
parents: 8193
diff changeset
378
8078
26a2ae540b04 bugfixes :
rguyom
parents: 7458
diff changeset
379 vbrInit(&fp->vbr_state);
26a2ae540b04 bugfixes :
rguyom
parents: 7458
diff changeset
380
7456
dacc262f41ba Support for XviD encoding
kmkaplan
parents:
diff changeset
381 return 1;
dacc262f41ba Support for XviD encoding
kmkaplan
parents:
diff changeset
382 }
dacc262f41ba Support for XviD encoding
kmkaplan
parents:
diff changeset
383
9823
da375915f47c "psnr" & related code is only for the -HEAD (unstable) XviD branch.
rguyom
parents: 9819
diff changeset
384 #ifdef XVID_API_UNSTABLE
9809
508dc4231269 Actually do something useful with XVID_GLOBAL_EXTRASTATS / XVID_EXTRASTATS.
rguyom
parents: 9806
diff changeset
385 static double
508dc4231269 Actually do something useful with XVID_GLOBAL_EXTRASTATS / XVID_EXTRASTATS.
rguyom
parents: 9806
diff changeset
386 sse_to_PSNR(double sse, double pixels)
508dc4231269 Actually do something useful with XVID_GLOBAL_EXTRASTATS / XVID_EXTRASTATS.
rguyom
parents: 9806
diff changeset
387 {
508dc4231269 Actually do something useful with XVID_GLOBAL_EXTRASTATS / XVID_EXTRASTATS.
rguyom
parents: 9806
diff changeset
388 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
389 // 4.34294481903251827652 = 10/log(10)
508dc4231269 Actually do something useful with XVID_GLOBAL_EXTRASTATS / XVID_EXTRASTATS.
rguyom
parents: 9806
diff changeset
390 // 11.08252709031685229249 = log(255*255)
508dc4231269 Actually do something useful with XVID_GLOBAL_EXTRASTATS / XVID_EXTRASTATS.
rguyom
parents: 9806
diff changeset
391 }
9823
da375915f47c "psnr" & related code is only for the -HEAD (unstable) XviD branch.
rguyom
parents: 9819
diff changeset
392 #endif
9809
508dc4231269 Actually do something useful with XVID_GLOBAL_EXTRASTATS / XVID_EXTRASTATS.
rguyom
parents: 9806
diff changeset
393
7456
dacc262f41ba Support for XviD encoding
kmkaplan
parents:
diff changeset
394 static void
dacc262f41ba Support for XviD encoding
kmkaplan
parents:
diff changeset
395 uninit(struct vf_instance_s* vf)
dacc262f41ba Support for XviD encoding
kmkaplan
parents:
diff changeset
396 {
8078
26a2ae540b04 bugfixes :
rguyom
parents: 7458
diff changeset
397 struct vf_priv_s *fp = vf->priv;
26a2ae540b04 bugfixes :
rguyom
parents: 7458
diff changeset
398
9823
da375915f47c "psnr" & related code is only for the -HEAD (unstable) XviD branch.
rguyom
parents: 9819
diff changeset
399 #ifdef XVID_API_UNSTABLE
9809
508dc4231269 Actually do something useful with XVID_GLOBAL_EXTRASTATS / XVID_EXTRASTATS.
rguyom
parents: 9806
diff changeset
400 if (xvidenc_psnr) {
508dc4231269 Actually do something useful with XVID_GLOBAL_EXTRASTATS / XVID_EXTRASTATS.
rguyom
parents: 9806
diff changeset
401 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
402 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
403 sse_to_PSNR(xvid_error[0], p),
508dc4231269 Actually do something useful with XVID_GLOBAL_EXTRASTATS / XVID_EXTRASTATS.
rguyom
parents: 9806
diff changeset
404 sse_to_PSNR(xvid_error[1], p/4),
508dc4231269 Actually do something useful with XVID_GLOBAL_EXTRASTATS / XVID_EXTRASTATS.
rguyom
parents: 9806
diff changeset
405 sse_to_PSNR(xvid_error[2], p/4),
508dc4231269 Actually do something useful with XVID_GLOBAL_EXTRASTATS / XVID_EXTRASTATS.
rguyom
parents: 9806
diff changeset
406 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
407 }
9823
da375915f47c "psnr" & related code is only for the -HEAD (unstable) XviD branch.
rguyom
parents: 9819
diff changeset
408 #endif
8078
26a2ae540b04 bugfixes :
rguyom
parents: 7458
diff changeset
409 vbrFinish(&fp->vbr_state);
7456
dacc262f41ba Support for XviD encoding
kmkaplan
parents:
diff changeset
410 }
dacc262f41ba Support for XviD encoding
kmkaplan
parents:
diff changeset
411
dacc262f41ba Support for XviD encoding
kmkaplan
parents:
diff changeset
412 static int
dacc262f41ba Support for XviD encoding
kmkaplan
parents:
diff changeset
413 control(struct vf_instance_s* vf, int request, void* data)
dacc262f41ba Support for XviD encoding
kmkaplan
parents:
diff changeset
414 {
dacc262f41ba Support for XviD encoding
kmkaplan
parents:
diff changeset
415 return CONTROL_UNKNOWN;
dacc262f41ba Support for XviD encoding
kmkaplan
parents:
diff changeset
416 }
dacc262f41ba Support for XviD encoding
kmkaplan
parents:
diff changeset
417
dacc262f41ba Support for XviD encoding
kmkaplan
parents:
diff changeset
418 static int
dacc262f41ba Support for XviD encoding
kmkaplan
parents:
diff changeset
419 query_format(struct vf_instance_s* vf, unsigned int fmt)
dacc262f41ba Support for XviD encoding
kmkaplan
parents:
diff changeset
420 {
dacc262f41ba Support for XviD encoding
kmkaplan
parents:
diff changeset
421 switch(fmt){
dacc262f41ba Support for XviD encoding
kmkaplan
parents:
diff changeset
422 case IMGFMT_YV12: case IMGFMT_IYUV: case IMGFMT_I420:
dacc262f41ba Support for XviD encoding
kmkaplan
parents:
diff changeset
423 return VFCAP_CSP_SUPPORTED | VFCAP_CSP_SUPPORTED_BY_HW;
dacc262f41ba Support for XviD encoding
kmkaplan
parents:
diff changeset
424 case IMGFMT_YUY2: case IMGFMT_UYVY:
dacc262f41ba Support for XviD encoding
kmkaplan
parents:
diff changeset
425 return VFCAP_CSP_SUPPORTED;
dacc262f41ba Support for XviD encoding
kmkaplan
parents:
diff changeset
426 case IMGFMT_RGB24: case IMGFMT_BGR24:
dacc262f41ba Support for XviD encoding
kmkaplan
parents:
diff changeset
427 return VFCAP_CSP_SUPPORTED | VFCAP_FLIPPED;
dacc262f41ba Support for XviD encoding
kmkaplan
parents:
diff changeset
428 }
dacc262f41ba Support for XviD encoding
kmkaplan
parents:
diff changeset
429 return 0;
dacc262f41ba Support for XviD encoding
kmkaplan
parents:
diff changeset
430 }
dacc262f41ba Support for XviD encoding
kmkaplan
parents:
diff changeset
431
dacc262f41ba Support for XviD encoding
kmkaplan
parents:
diff changeset
432 static int
dacc262f41ba Support for XviD encoding
kmkaplan
parents:
diff changeset
433 put_image(struct vf_instance_s* vf, mp_image_t *mpi)
dacc262f41ba Support for XviD encoding
kmkaplan
parents:
diff changeset
434 {
dacc262f41ba Support for XviD encoding
kmkaplan
parents:
diff changeset
435 XVID_ENC_STATS enc_stats;
8078
26a2ae540b04 bugfixes :
rguyom
parents: 7458
diff changeset
436 struct vf_priv_s *fp = vf->priv;
7456
dacc262f41ba Support for XviD encoding
kmkaplan
parents:
diff changeset
437
8078
26a2ae540b04 bugfixes :
rguyom
parents: 7458
diff changeset
438 fp->enc_frame.bitstream = fp->mux->buffer;
26a2ae540b04 bugfixes :
rguyom
parents: 7458
diff changeset
439 fp->enc_frame.length = -1 /* fp->mux->buffer_size */;
26a2ae540b04 bugfixes :
rguyom
parents: 7458
diff changeset
440 fp->enc_frame.image = mpi->planes[0];
8561
36da960c94e3 API change in dev-api-3 branch.
rguyom
parents: 8491
diff changeset
441 #ifdef XVID_API_UNSTABLE
36da960c94e3 API change in dev-api-3 branch.
rguyom
parents: 8491
diff changeset
442 fp->enc_frame.stride = mpi->stride[0];
36da960c94e3 API change in dev-api-3 branch.
rguyom
parents: 8491
diff changeset
443 #endif
8192
126223903808 - added modulated quatization
rguyom
parents: 8123
diff changeset
444
126223903808 - added modulated quatization
rguyom
parents: 8123
diff changeset
445 // 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
446 #ifdef XVID_API_UNSTABLE
8462
800d77666843 Support the latest development code from XViD dev-api-3 CVS
rguyom
parents: 8247
diff changeset
447 if (xvidenc_max_bframes >= 1) {
9803
4563dfa92a5b xvid fixes and more options by elcabesa & Martin Drab
henry
parents: 9014
diff changeset
448 if (xvidenc_fixed_quant!=0) {
8462
800d77666843 Support the latest development code from XViD dev-api-3 CVS
rguyom
parents: 8247
diff changeset
449 // 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
450 fp->enc_frame.quant = xvidenc_fixed_quant;
800d77666843 Support the latest development code from XViD dev-api-3 CVS
rguyom
parents: 8247
diff changeset
451 fp->enc_frame.intra = -1;
800d77666843 Support the latest development code from XViD dev-api-3 CVS
rguyom
parents: 8247
diff changeset
452 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
453 } else
800d77666843 Support the latest development code from XViD dev-api-3 CVS
rguyom
parents: 8247
diff changeset
454 // 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
455 fp->enc_frame.quant =0;
4563dfa92a5b xvid fixes and more options by elcabesa & Martin Drab
henry
parents: 9014
diff changeset
456 fp->enc_frame.intra =-1;
4563dfa92a5b xvid fixes and more options by elcabesa & Martin Drab
henry
parents: 9014
diff changeset
457 fp->enc_frame.bquant = 0;
8462
800d77666843 Support the latest development code from XViD dev-api-3 CVS
rguyom
parents: 8247
diff changeset
458 } else {
800d77666843 Support the latest development code from XViD dev-api-3 CVS
rguyom
parents: 8247
diff changeset
459 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
460 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
461 }
800d77666843 Support the latest development code from XViD dev-api-3 CVS
rguyom
parents: 8247
diff changeset
462 #else
8078
26a2ae540b04 bugfixes :
rguyom
parents: 7458
diff changeset
463 fp->enc_frame.quant = vbrGetQuant(&fp->vbr_state);
26a2ae540b04 bugfixes :
rguyom
parents: 7458
diff changeset
464 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
465 #endif
8192
126223903808 - added modulated quatization
rguyom
parents: 8123
diff changeset
466
126223903808 - added modulated quatization
rguyom
parents: 8123
diff changeset
467 // modulated quantizer type
126223903808 - added modulated quatization
rguyom
parents: 8123
diff changeset
468 if (xvidenc_mod_quant && xvidenc_pass == 2) {
126223903808 - added modulated quatization
rguyom
parents: 8123
diff changeset
469 fp->enc_frame.general |= (fp->enc_frame.quant < 4) ? XVID_MPEGQUANT : XVID_H263QUANT;
126223903808 - added modulated quatization
rguyom
parents: 8123
diff changeset
470 fp->enc_frame.general &= (fp->enc_frame.quant < 4) ? ~XVID_H263QUANT : ~XVID_MPEGQUANT;
126223903808 - added modulated quatization
rguyom
parents: 8123
diff changeset
471 }
126223903808 - added modulated quatization
rguyom
parents: 8123
diff changeset
472
126223903808 - added modulated quatization
rguyom
parents: 8123
diff changeset
473 // encode frame
8078
26a2ae540b04 bugfixes :
rguyom
parents: 7458
diff changeset
474 switch (xvid_encore(fp->enc_handle, XVID_ENC_ENCODE, &fp->enc_frame, &enc_stats)) {
7456
dacc262f41ba Support for XviD encoding
kmkaplan
parents:
diff changeset
475 case XVID_ERR_OK:
dacc262f41ba Support for XviD encoding
kmkaplan
parents:
diff changeset
476 break;
dacc262f41ba Support for XviD encoding
kmkaplan
parents:
diff changeset
477 case XVID_ERR_MEMORY:
dacc262f41ba Support for XviD encoding
kmkaplan
parents:
diff changeset
478 mp_msg(MSGT_MENCODER, MSGL_ERR, "xvid: out of memory\n");
dacc262f41ba Support for XviD encoding
kmkaplan
parents:
diff changeset
479 break;
dacc262f41ba Support for XviD encoding
kmkaplan
parents:
diff changeset
480 case XVID_ERR_FORMAT:
dacc262f41ba Support for XviD encoding
kmkaplan
parents:
diff changeset
481 mp_msg(MSGT_MENCODER, MSGL_ERR, "xvid: bad format\n");
dacc262f41ba Support for XviD encoding
kmkaplan
parents:
diff changeset
482 break;
dacc262f41ba Support for XviD encoding
kmkaplan
parents:
diff changeset
483 default:
dacc262f41ba Support for XviD encoding
kmkaplan
parents:
diff changeset
484 mp_msg(MSGT_MENCODER, MSGL_ERR, "xvid: failure\n");
dacc262f41ba Support for XviD encoding
kmkaplan
parents:
diff changeset
485 break;
dacc262f41ba Support for XviD encoding
kmkaplan
parents:
diff changeset
486 }
9809
508dc4231269 Actually do something useful with XVID_GLOBAL_EXTRASTATS / XVID_EXTRASTATS.
rguyom
parents: 9806
diff changeset
487
9823
da375915f47c "psnr" & related code is only for the -HEAD (unstable) XviD branch.
rguyom
parents: 9819
diff changeset
488 #ifdef XVID_API_UNSTABLE
9809
508dc4231269 Actually do something useful with XVID_GLOBAL_EXTRASTATS / XVID_EXTRASTATS.
rguyom
parents: 9806
diff changeset
489 if (xvidenc_psnr) {
508dc4231269 Actually do something useful with XVID_GLOBAL_EXTRASTATS / XVID_EXTRASTATS.
rguyom
parents: 9806
diff changeset
490 static FILE *fvstats = NULL;
508dc4231269 Actually do something useful with XVID_GLOBAL_EXTRASTATS / XVID_EXTRASTATS.
rguyom
parents: 9806
diff changeset
491 char filename[20];
508dc4231269 Actually do something useful with XVID_GLOBAL_EXTRASTATS / XVID_EXTRASTATS.
rguyom
parents: 9806
diff changeset
492
508dc4231269 Actually do something useful with XVID_GLOBAL_EXTRASTATS / XVID_EXTRASTATS.
rguyom
parents: 9806
diff changeset
493 if (!fvstats) {
508dc4231269 Actually do something useful with XVID_GLOBAL_EXTRASTATS / XVID_EXTRASTATS.
rguyom
parents: 9806
diff changeset
494 time_t today2;
508dc4231269 Actually do something useful with XVID_GLOBAL_EXTRASTATS / XVID_EXTRASTATS.
rguyom
parents: 9806
diff changeset
495 struct tm *today;
508dc4231269 Actually do something useful with XVID_GLOBAL_EXTRASTATS / XVID_EXTRASTATS.
rguyom
parents: 9806
diff changeset
496 today2 = time (NULL);
508dc4231269 Actually do something useful with XVID_GLOBAL_EXTRASTATS / XVID_EXTRASTATS.
rguyom
parents: 9806
diff changeset
497 today = localtime (&today2);
508dc4231269 Actually do something useful with XVID_GLOBAL_EXTRASTATS / XVID_EXTRASTATS.
rguyom
parents: 9806
diff changeset
498 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
499 fvstats = fopen (filename,"w");
508dc4231269 Actually do something useful with XVID_GLOBAL_EXTRASTATS / XVID_EXTRASTATS.
rguyom
parents: 9806
diff changeset
500 if (!fvstats) {
508dc4231269 Actually do something useful with XVID_GLOBAL_EXTRASTATS / XVID_EXTRASTATS.
rguyom
parents: 9806
diff changeset
501 perror ("fopen");
508dc4231269 Actually do something useful with XVID_GLOBAL_EXTRASTATS / XVID_EXTRASTATS.
rguyom
parents: 9806
diff changeset
502 xvidenc_psnr = 0; // disable block
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
508dc4231269 Actually do something useful with XVID_GLOBAL_EXTRASTATS / XVID_EXTRASTATS.
rguyom
parents: 9806
diff changeset
506 xvid_error[0] += enc_stats.sse_y;
508dc4231269 Actually do something useful with XVID_GLOBAL_EXTRASTATS / XVID_EXTRASTATS.
rguyom
parents: 9806
diff changeset
507 xvid_error[1] += enc_stats.sse_u;
508dc4231269 Actually do something useful with XVID_GLOBAL_EXTRASTATS / XVID_EXTRASTATS.
rguyom
parents: 9806
diff changeset
508 xvid_error[2] += enc_stats.sse_v;
508dc4231269 Actually do something useful with XVID_GLOBAL_EXTRASTATS / XVID_EXTRASTATS.
rguyom
parents: 9806
diff changeset
509
508dc4231269 Actually do something useful with XVID_GLOBAL_EXTRASTATS / XVID_EXTRASTATS.
rguyom
parents: 9806
diff changeset
510 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
511 fp->nb_frames,
508dc4231269 Actually do something useful with XVID_GLOBAL_EXTRASTATS / XVID_EXTRASTATS.
rguyom
parents: 9806
diff changeset
512 enc_stats.quant,
508dc4231269 Actually do something useful with XVID_GLOBAL_EXTRASTATS / XVID_EXTRASTATS.
rguyom
parents: 9806
diff changeset
513 fp->enc_frame.length,
508dc4231269 Actually do something useful with XVID_GLOBAL_EXTRASTATS / XVID_EXTRASTATS.
rguyom
parents: 9806
diff changeset
514 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
515 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
516 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
517 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
518 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
519 );
508dc4231269 Actually do something useful with XVID_GLOBAL_EXTRASTATS / XVID_EXTRASTATS.
rguyom
parents: 9806
diff changeset
520
508dc4231269 Actually do something useful with XVID_GLOBAL_EXTRASTATS / XVID_EXTRASTATS.
rguyom
parents: 9806
diff changeset
521 fp->nb_frames++;
508dc4231269 Actually do something useful with XVID_GLOBAL_EXTRASTATS / XVID_EXTRASTATS.
rguyom
parents: 9806
diff changeset
522 }
9823
da375915f47c "psnr" & related code is only for the -HEAD (unstable) XviD branch.
rguyom
parents: 9819
diff changeset
523 #endif
8192
126223903808 - added modulated quatization
rguyom
parents: 8123
diff changeset
524
126223903808 - added modulated quatization
rguyom
parents: 8123
diff changeset
525 // write output
9014
c671e9adbe22 Cleanup of the muxer API, func parameters muxer & muxer_f eliminated.
arpi
parents: 8585
diff changeset
526 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
527
126223903808 - added modulated quatization
rguyom
parents: 8123
diff changeset
528 // update the VBR engine
8078
26a2ae540b04 bugfixes :
rguyom
parents: 7458
diff changeset
529 vbrUpdate(&fp->vbr_state, enc_stats.quant, fp->enc_frame.intra,
26a2ae540b04 bugfixes :
rguyom
parents: 7458
diff changeset
530 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
531
7456
dacc262f41ba Support for XviD encoding
kmkaplan
parents:
diff changeset
532 return 1;
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
dacc262f41ba Support for XviD encoding
kmkaplan
parents:
diff changeset
537 static int
dacc262f41ba Support for XviD encoding
kmkaplan
parents:
diff changeset
538 vf_open(vf_instance_t *vf, char* args)
dacc262f41ba Support for XviD encoding
kmkaplan
parents:
diff changeset
539 {
dacc262f41ba Support for XviD encoding
kmkaplan
parents:
diff changeset
540 XVID_INIT_PARAM params = { 0, 0, 0};
dacc262f41ba Support for XviD encoding
kmkaplan
parents:
diff changeset
541 vf->config = config;
dacc262f41ba Support for XviD encoding
kmkaplan
parents:
diff changeset
542 vf->control = control;
dacc262f41ba Support for XviD encoding
kmkaplan
parents:
diff changeset
543 vf->uninit = uninit;
dacc262f41ba Support for XviD encoding
kmkaplan
parents:
diff changeset
544 vf->query_format = query_format;
dacc262f41ba Support for XviD encoding
kmkaplan
parents:
diff changeset
545 vf->put_image = put_image;
dacc262f41ba Support for XviD encoding
kmkaplan
parents:
diff changeset
546 vf->priv = malloc(sizeof(struct vf_priv_s));
dacc262f41ba Support for XviD encoding
kmkaplan
parents:
diff changeset
547 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
548 vf->priv->mux = (muxer_stream_t*)args;
7456
dacc262f41ba Support for XviD encoding
kmkaplan
parents:
diff changeset
549
14549
acf3241be19b Initialized BITMAPINFOHEADER to 0 to avoid problems, esp. windows has problems
reimar
parents: 12061
diff changeset
550 vf->priv->mux->bih = calloc(1, sizeof(BITMAPINFOHEADER));
7456
dacc262f41ba Support for XviD encoding
kmkaplan
parents:
diff changeset
551 vf->priv->mux->bih->biSize = sizeof(BITMAPINFOHEADER);
dacc262f41ba Support for XviD encoding
kmkaplan
parents:
diff changeset
552 vf->priv->mux->bih->biWidth = 0;
dacc262f41ba Support for XviD encoding
kmkaplan
parents:
diff changeset
553 vf->priv->mux->bih->biHeight = 0;
dacc262f41ba Support for XviD encoding
kmkaplan
parents:
diff changeset
554 vf->priv->mux->bih->biPlanes = 1;
dacc262f41ba Support for XviD encoding
kmkaplan
parents:
diff changeset
555 vf->priv->mux->bih->biBitCount = 24;
dacc262f41ba Support for XviD encoding
kmkaplan
parents:
diff changeset
556 vf->priv->mux->bih->biCompression = mmioFOURCC('X','V','I','D');
dacc262f41ba Support for XviD encoding
kmkaplan
parents:
diff changeset
557
dacc262f41ba Support for XviD encoding
kmkaplan
parents:
diff changeset
558 if (xvid_init(NULL, 0, &params, NULL) != XVID_ERR_OK) {
8078
26a2ae540b04 bugfixes :
rguyom
parents: 7458
diff changeset
559 mp_msg(MSGT_MENCODER,MSGL_ERR, "xvid: initialisation failure\n");
7456
dacc262f41ba Support for XviD encoding
kmkaplan
parents:
diff changeset
560 abort();
dacc262f41ba Support for XviD encoding
kmkaplan
parents:
diff changeset
561 }
dacc262f41ba Support for XviD encoding
kmkaplan
parents:
diff changeset
562 if (params.api_version != API_VERSION) {
8078
26a2ae540b04 bugfixes :
rguyom
parents: 7458
diff changeset
563 mp_msg(MSGT_MENCODER,MSGL_ERR, "xvid: XviD library API version mismatch\n"
7456
dacc262f41ba Support for XviD encoding
kmkaplan
parents:
diff changeset
564 "\texpected %d.%d, got %d.%d, you should recompile MPlayer.\n",
dacc262f41ba Support for XviD encoding
kmkaplan
parents:
diff changeset
565 API_VERSION >> 16, API_VERSION & 0xff,
dacc262f41ba Support for XviD encoding
kmkaplan
parents:
diff changeset
566 params.api_version >> 16, params.api_version & 0xff);
dacc262f41ba Support for XviD encoding
kmkaplan
parents:
diff changeset
567 abort();
dacc262f41ba Support for XviD encoding
kmkaplan
parents:
diff changeset
568 }
dacc262f41ba Support for XviD encoding
kmkaplan
parents:
diff changeset
569
dacc262f41ba Support for XviD encoding
kmkaplan
parents:
diff changeset
570 return 1;
dacc262f41ba Support for XviD encoding
kmkaplan
parents:
diff changeset
571 }
dacc262f41ba Support for XviD encoding
kmkaplan
parents:
diff changeset
572
dacc262f41ba Support for XviD encoding
kmkaplan
parents:
diff changeset
573 vf_info_t ve_info_xvid = {
dacc262f41ba Support for XviD encoding
kmkaplan
parents:
diff changeset
574 "XviD encoder",
dacc262f41ba Support for XviD encoding
kmkaplan
parents:
diff changeset
575 "xvid",
8078
26a2ae540b04 bugfixes :
rguyom
parents: 7458
diff changeset
576 "Kim Minh Kaplan & Rémi Guyomarch",
7456
dacc262f41ba Support for XviD encoding
kmkaplan
parents:
diff changeset
577 "for internal use by mencoder",
dacc262f41ba Support for XviD encoding
kmkaplan
parents:
diff changeset
578 vf_open
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 //===========================================================================//
dacc262f41ba Support for XviD encoding
kmkaplan
parents:
diff changeset
582 #endif