Mercurial > mplayer.hg
annotate libmpcodecs/ve_xvid.c @ 9804:e20ef33d172a
Updating XviD :
- deleted "hinted_me" and "hint_file", the whole idea is bogus.
- commented-out "lumi_mask", it's too buggy.
- better defaults for "bquant_ratio" / "bquant_offset"
- fixed a typo : "extrastatl" -> "extrastat"
author | rguyom |
---|---|
date | Wed, 02 Apr 2003 21:33:19 +0000 |
parents | 4563dfa92a5b |
children | 79bdc8a266ac |
rev | line source |
---|---|
7456 | 1 #include <stdio.h> |
2 #include <stdlib.h> | |
3 #include <string.h> | |
8078 | 4 #include <errno.h> |
7456 | 5 |
6 #include "../config.h" | |
7 #include "../mp_msg.h" | |
8 | |
9 #ifdef HAVE_XVID | |
10 | |
11 #include "codec-cfg.h" | |
12 #include "stream.h" | |
13 #include "demuxer.h" | |
14 #include "stheader.h" | |
15 | |
8585 | 16 #include "muxer.h" |
7456 | 17 |
18 #include "img_format.h" | |
19 #include "mp_image.h" | |
20 #include "vf.h" | |
21 | |
22 #include <xvid.h> | |
23 #include "xvid_vbr.h" | |
24 | |
8491
ce25d80dd6c3
Use the XVID_API_UNSTABLE macro instead of a home-made one.
rguyom
parents:
8462
diff
changeset
|
25 #include "cfgparser.h" |
ce25d80dd6c3
Use the XVID_API_UNSTABLE macro instead of a home-made one.
rguyom
parents:
8462
diff
changeset
|
26 |
ce25d80dd6c3
Use the XVID_API_UNSTABLE macro instead of a home-made one.
rguyom
parents:
8462
diff
changeset
|
27 |
ce25d80dd6c3
Use the XVID_API_UNSTABLE macro instead of a home-made one.
rguyom
parents:
8462
diff
changeset
|
28 #ifdef XVID_API_UNSTABLE |
ce25d80dd6c3
Use the XVID_API_UNSTABLE macro instead of a home-made one.
rguyom
parents:
8462
diff
changeset
|
29 #warning ******************************************************************* |
ce25d80dd6c3
Use the XVID_API_UNSTABLE macro instead of a home-made one.
rguyom
parents:
8462
diff
changeset
|
30 #warning ** ** |
ce25d80dd6c3
Use the XVID_API_UNSTABLE macro instead of a home-made one.
rguyom
parents:
8462
diff
changeset
|
31 #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
|
32 #warning ** ** |
ce25d80dd6c3
Use the XVID_API_UNSTABLE macro instead of a home-made one.
rguyom
parents:
8462
diff
changeset
|
33 #warning ** Streams produced by this version aren''nt probably compatible ** |
ce25d80dd6c3
Use the XVID_API_UNSTABLE macro instead of a home-made one.
rguyom
parents:
8462
diff
changeset
|
34 #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
|
35 #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
|
36 #warning ** whole building ! ** |
ce25d80dd6c3
Use the XVID_API_UNSTABLE macro instead of a home-made one.
rguyom
parents:
8462
diff
changeset
|
37 #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
|
38 #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
|
39 #warning ** ** |
ce25d80dd6c3
Use the XVID_API_UNSTABLE macro instead of a home-made one.
rguyom
parents:
8462
diff
changeset
|
40 #warning ******************************************************************* |
8462
800d77666843
Support the latest development code from XViD dev-api-3 CVS
rguyom
parents:
8247
diff
changeset
|
41 #endif |
800d77666843
Support the latest development code from XViD dev-api-3 CVS
rguyom
parents:
8247
diff
changeset
|
42 |
7456 | 43 /**********************************************************************/ |
8462
800d77666843
Support the latest development code from XViD dev-api-3 CVS
rguyom
parents:
8247
diff
changeset
|
44 /* motion estimation quality presets */ |
800d77666843
Support the latest development code from XViD dev-api-3 CVS
rguyom
parents:
8247
diff
changeset
|
45 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
|
46 #ifdef XVID_API_UNSTABLE |
8462
800d77666843
Support the latest development code from XViD dev-api-3 CVS
rguyom
parents:
8247
diff
changeset
|
47 0, |
9803
4563dfa92a5b
xvid fixes and more options by elcabesa & Martin Drab
henry
parents:
9014
diff
changeset
|
48 0, |
8462
800d77666843
Support the latest development code from XViD dev-api-3 CVS
rguyom
parents:
8247
diff
changeset
|
49 0, |
800d77666843
Support the latest development code from XViD dev-api-3 CVS
rguyom
parents:
8247
diff
changeset
|
50 0, |
9803
4563dfa92a5b
xvid fixes and more options by elcabesa & Martin Drab
henry
parents:
9014
diff
changeset
|
51 PMV_HALFPELREFINE16 | PMV_HALFPELDIAMOND8 | HALFPELREFINE16_BITS, |
4563dfa92a5b
xvid fixes and more options by elcabesa & Martin Drab
henry
parents:
9014
diff
changeset
|
52 PMV_HALFPELREFINE16 | PMV_HALFPELDIAMOND8 | PMV_ADVANCEDDIAMOND16 | HALFPELREFINE16_BITS, |
4563dfa92a5b
xvid fixes and more options by elcabesa & Martin Drab
henry
parents:
9014
diff
changeset
|
53 PMV_HALFPELREFINE16 | PMV_EXTSEARCH16 | PMV_HALFPELREFINE8 | PMV_HALFPELDIAMOND8 | PMV_USESQUARES16 | EXTSEARCH_BITS | HALFPELREFINE8_BITS | HALFPELREFINE16_BITS | CHECKPREDICTION_BITS |
8462
800d77666843
Support the latest development code from XViD dev-api-3 CVS
rguyom
parents:
8247
diff
changeset
|
54 #else |
8078 | 55 0, |
56 PMV_QUICKSTOP16, | |
7456 | 57 PMV_EARLYSTOP16, |
8078 | 58 PMV_EARLYSTOP16 | PMV_EARLYSTOP8, |
59 PMV_EARLYSTOP16 | PMV_HALFPELREFINE16 | PMV_EARLYSTOP8 | PMV_HALFPELDIAMOND8, | |
60 PMV_EARLYSTOP16 | PMV_HALFPELREFINE16 | PMV_EARLYSTOP8 | PMV_HALFPELDIAMOND8 | PMV_ADVANCEDDIAMOND16, | |
61 PMV_EARLYSTOP16 | PMV_HALFPELREFINE16 | PMV_EXTSEARCH16 | PMV_EARLYSTOP8 | PMV_HALFPELREFINE8 | | |
62 PMV_HALFPELDIAMOND8 | PMV_USESQUARES16 | |
63 | |
8462
800d77666843
Support the latest development code from XViD dev-api-3 CVS
rguyom
parents:
8247
diff
changeset
|
64 #endif |
7456 | 65 }; |
66 | |
8078 | 67 extern char* passtmpfile; |
7456 | 68 |
8078 | 69 static int xvidenc_pass = 0; |
8462
800d77666843
Support the latest development code from XViD dev-api-3 CVS
rguyom
parents:
8247
diff
changeset
|
70 static int xvidenc_quality = 4; |
800d77666843
Support the latest development code from XViD dev-api-3 CVS
rguyom
parents:
8247
diff
changeset
|
71 static int xvidenc_4mv = 0; |
8078 | 72 static int xvidenc_bitrate = -1; |
73 static int xvidenc_rc_reaction_delay_factor = -1; | |
74 static int xvidenc_rc_averaging_period = -1; | |
75 static int xvidenc_rc_buffer = -1; | |
8247
91edcb091dc6
Instead of min_quantizer, max_quantizer, min_iquantizer, etc... use a
rguyom
parents:
8221
diff
changeset
|
76 static char* xvidenc_quant_range = "2-31/2-31"; |
8221 | 77 static int xvidenc_min_key_interval = -1; |
8078 | 78 static int xvidenc_max_key_interval = -1; |
79 static int xvidenc_mpeg_quant = 0; | |
8192 | 80 static int xvidenc_mod_quant = 0; |
8221 | 81 static int xvidenc_keyframe_boost = -1; |
8192 | 82 static int xvidenc_kfthreshold = -1; |
83 static int xvidenc_kfreduction = -1; | |
8078 | 84 static int xvidenc_fixed_quant = 0; |
85 static int xvidenc_debug = 0; | |
8491
ce25d80dd6c3
Use the XVID_API_UNSTABLE macro instead of a home-made one.
rguyom
parents:
8462
diff
changeset
|
86 #ifdef XVID_API_UNSTABLE |
9804 | 87 static int xvidenc_lumi_mask = 0; |
8462
800d77666843
Support the latest development code from XViD dev-api-3 CVS
rguyom
parents:
8247
diff
changeset
|
88 static int xvidenc_qpel = 0; |
800d77666843
Support the latest development code from XViD dev-api-3 CVS
rguyom
parents:
8247
diff
changeset
|
89 static int xvidenc_max_bframes = 0; |
9804 | 90 static int xvidenc_bquant_ratio = 150; |
91 static int xvidenc_bquant_offset = 100; | |
8462
800d77666843
Support the latest development code from XViD dev-api-3 CVS
rguyom
parents:
8247
diff
changeset
|
92 static int xvidenc_gmc = 0; |
800d77666843
Support the latest development code from XViD dev-api-3 CVS
rguyom
parents:
8247
diff
changeset
|
93 static int xvidenc_me_colour = 0; |
800d77666843
Support the latest development code from XViD dev-api-3 CVS
rguyom
parents:
8247
diff
changeset
|
94 static int xvidenc_reduced = 0; |
9803
4563dfa92a5b
xvid fixes and more options by elcabesa & Martin Drab
henry
parents:
9014
diff
changeset
|
95 static int xvidenc_xstat=0; |
4563dfa92a5b
xvid fixes and more options by elcabesa & Martin Drab
henry
parents:
9014
diff
changeset
|
96 static int xvidenc_hqac=0; |
4563dfa92a5b
xvid fixes and more options by elcabesa & Martin Drab
henry
parents:
9014
diff
changeset
|
97 static int xvidenc_vhq=0; |
4563dfa92a5b
xvid fixes and more options by elcabesa & Martin Drab
henry
parents:
9014
diff
changeset
|
98 static int xvidenc_pref=0; |
8462
800d77666843
Support the latest development code from XViD dev-api-3 CVS
rguyom
parents:
8247
diff
changeset
|
99 #endif |
7458 | 100 |
7456 | 101 struct config xvidencopts_conf[] = { |
8078 | 102 { "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
|
103 { "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
|
104 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
|
105 { "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
|
106 { "bitrate", &xvidenc_bitrate, CONF_TYPE_INT, CONF_RANGE, 4, 24000000, NULL}, |
8078 | 107 { "rc_reaction_delay_factor", &xvidenc_rc_reaction_delay_factor, CONF_TYPE_INT, 0, 0, 0, NULL}, |
108 { "rc_averaging_period", &xvidenc_rc_averaging_period, CONF_TYPE_INT, 0, 0, 0, NULL}, | |
109 { "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
|
110 { "quant_range", &xvidenc_quant_range, CONF_TYPE_STRING, 0, 0, 0, NULL}, |
8078 | 111 { "min_key_interval", &xvidenc_min_key_interval, CONF_TYPE_INT, 0, 0, 0, NULL}, /* for XVID_MODE_2PASS_2 */ |
112 { "max_key_interval", &xvidenc_max_key_interval, CONF_TYPE_INT, 0, 0, 0, NULL}, | |
113 { "mpeg_quant", &xvidenc_mpeg_quant, CONF_TYPE_FLAG, 0, 0, 1, NULL}, | |
8192 | 114 { "mod_quant", &xvidenc_mod_quant, CONF_TYPE_FLAG, 0, 0, 1, NULL}, |
8193 | 115 { "keyframe_boost", &xvidenc_keyframe_boost, CONF_TYPE_INT, CONF_RANGE, 0, 1000, NULL}, /* for XVID_MODE_2PASS_2 */ |
8078 | 116 { "kfthreshold", &xvidenc_kfthreshold, CONF_TYPE_INT, 0, 0, 0, NULL}, /* for XVID_MODE_2PASS_2 */ |
8192 | 117 { "kfreduction", &xvidenc_kfreduction, CONF_TYPE_INT, CONF_RANGE, 0, 100, NULL}, /* for XVID_MODE_2PASS_2 */ |
8078 | 118 { "fixed_quant", &xvidenc_fixed_quant, CONF_TYPE_INT, CONF_RANGE, 1, 31, NULL}, /* for XVID_MODE_FIXED_QUANT */ |
119 { "debug", &xvidenc_debug, 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
|
120 #ifdef XVID_API_UNSTABLE |
9804 | 121 //{ "lumi_mask", &xvidenc_lumi_mask, CONF_TYPE_FLAG, 0, 0, 1, NULL}, |
122 { "extrastat", &xvidenc_xstat, 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
|
123 { "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
|
124 { "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
|
125 { "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
|
126 { "bquant_offset", &xvidenc_bquant_offset, CONF_TYPE_INT, CONF_RANGE, -1000, 1000, NULL}, |
800d77666843
Support the latest development code from XViD dev-api-3 CVS
rguyom
parents:
8247
diff
changeset
|
127 { "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
|
128 { "gmc", &xvidenc_gmc, CONF_TYPE_FLAG, 0, 0, 1, NULL}, |
800d77666843
Support the latest development code from XViD dev-api-3 CVS
rguyom
parents:
8247
diff
changeset
|
129 { "me_colour", &xvidenc_me_colour, CONF_TYPE_FLAG, 0, 0, 1, NULL}, |
9803
4563dfa92a5b
xvid fixes and more options by elcabesa & Martin Drab
henry
parents:
9014
diff
changeset
|
130 { "hq_ac", &xvidenc_hqac, CONF_TYPE_FLAG, 0, 0, 1, NULL}, |
4563dfa92a5b
xvid fixes and more options by elcabesa & Martin Drab
henry
parents:
9014
diff
changeset
|
131 { "vhq", &xvidenc_vhq, CONF_TYPE_FLAG, 0, 0, 1, NULL}, |
4563dfa92a5b
xvid fixes and more options by elcabesa & Martin Drab
henry
parents:
9014
diff
changeset
|
132 { "chroma_opt", &xvidenc_pref, 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
|
133 #endif |
7456 | 134 { NULL, NULL, 0, 0, 0, 0, NULL} |
135 }; | |
136 | |
137 struct vf_priv_s { | |
8585 | 138 muxer_stream_t* mux; |
7456 | 139 XVID_ENC_FRAME enc_frame; |
140 void* enc_handle; | |
141 vbr_control_t vbr_state; | |
142 }; | |
143 | |
144 static int | |
145 config(struct vf_instance_s* vf, | |
146 int width, int height, int d_width, int d_height, | |
147 unsigned int flags, unsigned int outfmt) | |
148 { | |
149 XVID_ENC_PARAM enc_param; | |
8078 | 150 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
|
151 unsigned int min_iq, max_iq, min_pq, max_pq; |
7456 | 152 |
8078 | 153 fp->mux->bih->biWidth = width; |
154 fp->mux->bih->biHeight = height; | |
155 fp->mux->bih->biSizeImage = fp->mux->bih->biWidth * fp->mux->bih->biHeight * 3; | |
156 mp_msg(MSGT_MENCODER,MSGL_INFO,"videocodec: XViD (%dx%d fourcc=%x [%.4s])\n", | |
157 width, height, fp->mux->bih->biCompression, (char *)&fp->mux->bih->biCompression); | |
7456 | 158 |
8247
91edcb091dc6
Instead of min_quantizer, max_quantizer, min_iquantizer, etc... use a
rguyom
parents:
8221
diff
changeset
|
159 // {min,max}_{i,p}quantizer parsing & validation |
91edcb091dc6
Instead of min_quantizer, max_quantizer, min_iquantizer, etc... use a
rguyom
parents:
8221
diff
changeset
|
160 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
|
161 mp_msg (MSGT_MENCODER, MSGL_ERR, |
91edcb091dc6
Instead of min_quantizer, max_quantizer, min_iquantizer, etc... use a
rguyom
parents:
8221
diff
changeset
|
162 "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
|
163 return 0; |
91edcb091dc6
Instead of min_quantizer, max_quantizer, min_iquantizer, etc... use a
rguyom
parents:
8221
diff
changeset
|
164 } |
91edcb091dc6
Instead of min_quantizer, max_quantizer, min_iquantizer, etc... use a
rguyom
parents:
8221
diff
changeset
|
165 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
|
166 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
|
167 mp_msg (MSGT_MENCODER, MSGL_ERR, |
91edcb091dc6
Instead of min_quantizer, max_quantizer, min_iquantizer, etc... use a
rguyom
parents:
8221
diff
changeset
|
168 "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
|
169 mp_msg (MSGT_MENCODER, MSGL_ERR, |
91edcb091dc6
Instead of min_quantizer, max_quantizer, min_iquantizer, etc... use a
rguyom
parents:
8221
diff
changeset
|
170 "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
|
171 return -1; |
91edcb091dc6
Instead of min_quantizer, max_quantizer, min_iquantizer, etc... use a
rguyom
parents:
8221
diff
changeset
|
172 } |
91edcb091dc6
Instead of min_quantizer, max_quantizer, min_iquantizer, etc... use a
rguyom
parents:
8221
diff
changeset
|
173 |
8491
ce25d80dd6c3
Use the XVID_API_UNSTABLE macro instead of a home-made one.
rguyom
parents:
8462
diff
changeset
|
174 #ifdef XVID_API_UNSTABLE |
ce25d80dd6c3
Use the XVID_API_UNSTABLE macro instead of a home-made one.
rguyom
parents:
8462
diff
changeset
|
175 mp_msg (MSGT_MENCODER, MSGL_WARN, |
ce25d80dd6c3
Use the XVID_API_UNSTABLE macro instead of a home-made one.
rguyom
parents:
8462
diff
changeset
|
176 "\n" |
ce25d80dd6c3
Use the XVID_API_UNSTABLE macro instead of a home-made one.
rguyom
parents:
8462
diff
changeset
|
177 "*******************************************************************\n" |
ce25d80dd6c3
Use the XVID_API_UNSTABLE macro instead of a home-made one.
rguyom
parents:
8462
diff
changeset
|
178 "** **\n" |
ce25d80dd6c3
Use the XVID_API_UNSTABLE macro instead of a home-made one.
rguyom
parents:
8462
diff
changeset
|
179 "** 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
|
180 "** **\n" |
ce25d80dd6c3
Use the XVID_API_UNSTABLE macro instead of a home-made one.
rguyom
parents:
8462
diff
changeset
|
181 "** Streams produced by this version aren'nt probably compatible **\n" |
ce25d80dd6c3
Use the XVID_API_UNSTABLE macro instead of a home-made one.
rguyom
parents:
8462
diff
changeset
|
182 "** 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
|
183 "** 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
|
184 "** whole building ! **\n" |
ce25d80dd6c3
Use the XVID_API_UNSTABLE macro instead of a home-made one.
rguyom
parents:
8462
diff
changeset
|
185 "** 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
|
186 "** 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
|
187 "** **\n" |
ce25d80dd6c3
Use the XVID_API_UNSTABLE macro instead of a home-made one.
rguyom
parents:
8462
diff
changeset
|
188 "*******************************************************************\n" |
ce25d80dd6c3
Use the XVID_API_UNSTABLE macro instead of a home-made one.
rguyom
parents:
8462
diff
changeset
|
189 "\n"); |
ce25d80dd6c3
Use the XVID_API_UNSTABLE macro instead of a home-made one.
rguyom
parents:
8462
diff
changeset
|
190 #endif |
ce25d80dd6c3
Use the XVID_API_UNSTABLE macro instead of a home-made one.
rguyom
parents:
8462
diff
changeset
|
191 |
8078 | 192 // initialize XViD core parameters |
193 // =============================== | |
7456 | 194 memset(&enc_param, 0, sizeof(enc_param)); |
195 enc_param.width = width; | |
196 enc_param.height = height; | |
8078 | 197 enc_param.fincr = fp->mux->h.dwScale; |
198 enc_param.fbase = fp->mux->h.dwRate; | |
199 if (xvidenc_bitrate > 16000) | |
200 enc_param.rc_bitrate = xvidenc_bitrate; | |
201 else if (xvidenc_bitrate > 0) | |
202 enc_param.rc_bitrate = xvidenc_bitrate * 1000; | |
203 else | |
204 enc_param.rc_bitrate = -1; | |
8491
ce25d80dd6c3
Use the XVID_API_UNSTABLE macro instead of a home-made one.
rguyom
parents:
8462
diff
changeset
|
205 #ifdef XVID_API_UNSTABLE |
8462
800d77666843
Support the latest development code from XViD dev-api-3 CVS
rguyom
parents:
8247
diff
changeset
|
206 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
|
207 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
|
208 xvidenc_max_bframes = 0; |
800d77666843
Support the latest development code from XViD dev-api-3 CVS
rguyom
parents:
8247
diff
changeset
|
209 } |
800d77666843
Support the latest development code from XViD dev-api-3 CVS
rguyom
parents:
8247
diff
changeset
|
210 enc_param.max_bframes = xvidenc_max_bframes; |
800d77666843
Support the latest development code from XViD dev-api-3 CVS
rguyom
parents:
8247
diff
changeset
|
211 enc_param.bquant_ratio = xvidenc_bquant_ratio; |
800d77666843
Support the latest development code from XViD dev-api-3 CVS
rguyom
parents:
8247
diff
changeset
|
212 enc_param.bquant_offset = xvidenc_bquant_offset; |
800d77666843
Support the latest development code from XViD dev-api-3 CVS
rguyom
parents:
8247
diff
changeset
|
213 if (xvidenc_reduced) |
800d77666843
Support the latest development code from XViD dev-api-3 CVS
rguyom
parents:
8247
diff
changeset
|
214 enc_param.global |= XVID_GLOBAL_REDUCED; |
9803
4563dfa92a5b
xvid fixes and more options by elcabesa & Martin Drab
henry
parents:
9014
diff
changeset
|
215 if (xvidenc_xstat) |
4563dfa92a5b
xvid fixes and more options by elcabesa & Martin Drab
henry
parents:
9014
diff
changeset
|
216 enc_param.global |= XVID_GLOBAL_EXTRASTATS; |
4563dfa92a5b
xvid fixes and more options by elcabesa & Martin Drab
henry
parents:
9014
diff
changeset
|
217 |
8462
800d77666843
Support the latest development code from XViD dev-api-3 CVS
rguyom
parents:
8247
diff
changeset
|
218 #endif |
8078 | 219 enc_param.rc_reaction_delay_factor = xvidenc_rc_reaction_delay_factor; |
220 enc_param.rc_averaging_period = xvidenc_rc_averaging_period; | |
221 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
|
222 enc_param.min_quantizer = min_iq; |
91edcb091dc6
Instead of min_quantizer, max_quantizer, min_iquantizer, etc... use a
rguyom
parents:
8221
diff
changeset
|
223 enc_param.max_quantizer = max_iq; |
8221 | 224 if( xvidenc_max_key_interval <= 0 ) |
225 xvidenc_max_key_interval = 10 * enc_param.fbase / enc_param.fincr; | |
226 enc_param.max_key_interval = xvidenc_max_key_interval; | |
7456 | 227 switch (xvid_encore(NULL, XVID_ENC_CREATE, &enc_param, NULL)) { |
228 case XVID_ERR_FAIL: | |
8078 | 229 mp_msg(MSGT_MENCODER,MSGL_ERR, "xvid: encoder creation failed\n"); |
7456 | 230 return 0; |
231 case XVID_ERR_MEMORY: | |
8078 | 232 mp_msg(MSGT_MENCODER,MSGL_ERR, "xvid: encoder creation failed, out of memory\n"); |
7456 | 233 return 0; |
234 case XVID_ERR_FORMAT: | |
8078 | 235 mp_msg(MSGT_MENCODER,MSGL_ERR, "xvid: encoder creation failed, bad format\n"); |
7456 | 236 return 0; |
237 } | |
8078 | 238 fp->enc_handle = enc_param.handle; |
7456 | 239 |
8078 | 240 // initialize XViD per-frame static parameters |
241 // =========================================== | |
8462
800d77666843
Support the latest development code from XViD dev-api-3 CVS
rguyom
parents:
8247
diff
changeset
|
242 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
|
243 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
|
244 if (xvidenc_4mv) |
800d77666843
Support the latest development code from XViD dev-api-3 CVS
rguyom
parents:
8247
diff
changeset
|
245 fp->enc_frame.general |= XVID_INTER4V; |
8078 | 246 if (xvidenc_lumi_mask) |
247 fp->enc_frame.general |= XVID_LUMIMASKING; | |
8491
ce25d80dd6c3
Use the XVID_API_UNSTABLE macro instead of a home-made one.
rguyom
parents:
8462
diff
changeset
|
248 #ifdef XVID_API_UNSTABLE |
8462
800d77666843
Support the latest development code from XViD dev-api-3 CVS
rguyom
parents:
8247
diff
changeset
|
249 if (xvidenc_qpel) { |
800d77666843
Support the latest development code from XViD dev-api-3 CVS
rguyom
parents:
8247
diff
changeset
|
250 fp->enc_frame.general |= XVID_QUARTERPEL; |
9803
4563dfa92a5b
xvid fixes and more options by elcabesa & Martin Drab
henry
parents:
9014
diff
changeset
|
251 fp->enc_frame.motion |= PMV_QUARTERPELREFINE16 | PMV_QUARTERPELREFINE8 |QUARTERPELREFINE16_BITS | QUARTERPELREFINE8_BITS; |
8462
800d77666843
Support the latest development code from XViD dev-api-3 CVS
rguyom
parents:
8247
diff
changeset
|
252 } |
9803
4563dfa92a5b
xvid fixes and more options by elcabesa & Martin Drab
henry
parents:
9014
diff
changeset
|
253 if (xvidenc_vhq) |
4563dfa92a5b
xvid fixes and more options by elcabesa & Martin Drab
henry
parents:
9014
diff
changeset
|
254 fp->enc_frame.general |= XVID_MODEDECISION_BITS; |
8462
800d77666843
Support the latest development code from XViD dev-api-3 CVS
rguyom
parents:
8247
diff
changeset
|
255 if (xvidenc_gmc) |
800d77666843
Support the latest development code from XViD dev-api-3 CVS
rguyom
parents:
8247
diff
changeset
|
256 fp->enc_frame.general |= XVID_GMC; |
9803
4563dfa92a5b
xvid fixes and more options by elcabesa & Martin Drab
henry
parents:
9014
diff
changeset
|
257 if (xvidenc_xstat) |
4563dfa92a5b
xvid fixes and more options by elcabesa & Martin Drab
henry
parents:
9014
diff
changeset
|
258 fp->enc_frame.general |= XVID_EXTRASTATS; |
8462
800d77666843
Support the latest development code from XViD dev-api-3 CVS
rguyom
parents:
8247
diff
changeset
|
259 if (xvidenc_me_colour) |
9803
4563dfa92a5b
xvid fixes and more options by elcabesa & Martin Drab
henry
parents:
9014
diff
changeset
|
260 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
|
261 if(xvidenc_reduced) |
800d77666843
Support the latest development code from XViD dev-api-3 CVS
rguyom
parents:
8247
diff
changeset
|
262 fp->enc_frame.general |= XVID_REDUCED; |
9803
4563dfa92a5b
xvid fixes and more options by elcabesa & Martin Drab
henry
parents:
9014
diff
changeset
|
263 if(xvidenc_hqac) |
4563dfa92a5b
xvid fixes and more options by elcabesa & Martin Drab
henry
parents:
9014
diff
changeset
|
264 fp->enc_frame.general |= XVID_HQACPRED; |
4563dfa92a5b
xvid fixes and more options by elcabesa & Martin Drab
henry
parents:
9014
diff
changeset
|
265 if (xvidenc_pref) |
4563dfa92a5b
xvid fixes and more options by elcabesa & Martin Drab
henry
parents:
9014
diff
changeset
|
266 fp->enc_frame.general |= XVID_CHROMAOPT; |
8462
800d77666843
Support the latest development code from XViD dev-api-3 CVS
rguyom
parents:
8247
diff
changeset
|
267 #endif |
8078 | 268 |
7456 | 269 switch (outfmt) { |
270 case IMGFMT_YV12: | |
8078 | 271 fp->enc_frame.colorspace = XVID_CSP_YV12; |
7456 | 272 break; |
273 case IMGFMT_IYUV: case IMGFMT_I420: | |
8078 | 274 fp->enc_frame.colorspace = XVID_CSP_I420; |
7456 | 275 break; |
276 case IMGFMT_YUY2: | |
8078 | 277 fp->enc_frame.colorspace = XVID_CSP_YUY2; |
7456 | 278 break; |
279 case IMGFMT_UYVY: | |
8078 | 280 fp->enc_frame.colorspace = XVID_CSP_UYVY; |
7456 | 281 break; |
282 case IMGFMT_RGB24: case IMGFMT_BGR24: | |
8078 | 283 fp->enc_frame.colorspace = XVID_CSP_RGB24; |
7456 | 284 break; |
285 default: | |
286 mp_msg(MSGT_MENCODER,MSGL_ERR,"xvid: unsupported picture format (%s)!\n", | |
287 vo_format_name(outfmt)); | |
288 return 0; | |
289 } | |
8078 | 290 fp->enc_frame.quant_intra_matrix = 0; |
291 fp->enc_frame.quant_inter_matrix = 0; | |
292 | |
293 // initialize VBR engine | |
294 // ===================== | |
295 vbrSetDefaults(&fp->vbr_state); | |
8221 | 296 if (xvidenc_min_key_interval < 0) |
297 xvidenc_min_key_interval = fp->vbr_state.min_key_interval; | |
298 | |
299 // pass | |
8078 | 300 if (xvidenc_pass == 0) { |
301 if (xvidenc_fixed_quant >= 1) { | |
302 fp->vbr_state.mode = VBR_MODE_FIXED_QUANT; | |
303 fp->vbr_state.fixed_quant = xvidenc_fixed_quant; | |
304 } else | |
305 fp->vbr_state.mode = VBR_MODE_1PASS; | |
7456 | 306 } |
8078 | 307 else if (xvidenc_pass == 1) |
308 fp->vbr_state.mode = VBR_MODE_2PASS_1; | |
309 else if (xvidenc_pass == 2) | |
310 fp->vbr_state.mode = VBR_MODE_2PASS_2; | |
311 else | |
312 return -1; | |
8221 | 313 |
314 // misc | |
8078 | 315 fp->vbr_state.fps = (double)enc_param.fbase / enc_param.fincr; |
316 fp->vbr_state.filename = passtmpfile; | |
317 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
|
318 fp->vbr_state.min_iquant = min_iq; |
91edcb091dc6
Instead of min_quantizer, max_quantizer, min_iquantizer, etc... use a
rguyom
parents:
8221
diff
changeset
|
319 fp->vbr_state.max_iquant = max_iq; |
91edcb091dc6
Instead of min_quantizer, max_quantizer, min_iquantizer, etc... use a
rguyom
parents:
8221
diff
changeset
|
320 fp->vbr_state.min_pquant = min_pq; |
91edcb091dc6
Instead of min_quantizer, max_quantizer, min_iquantizer, etc... use a
rguyom
parents:
8221
diff
changeset
|
321 fp->vbr_state.max_pquant = max_pq; |
8221 | 322 if (xvidenc_keyframe_boost >= 0) |
8078 | 323 fp->vbr_state.keyframe_boost = xvidenc_keyframe_boost; |
8192 | 324 if (xvidenc_kfthreshold >= 0) |
8078 | 325 fp->vbr_state.kftreshold = xvidenc_kfthreshold; |
8192 | 326 if (xvidenc_kfreduction >= 0) |
8078 | 327 fp->vbr_state.kfreduction = xvidenc_kfreduction; |
8221 | 328 if (xvidenc_min_key_interval >= 0) |
8078 | 329 fp->vbr_state.min_key_interval = xvidenc_min_key_interval; |
330 fp->vbr_state.max_key_interval = enc_param.max_key_interval; | |
331 fp->vbr_state.debug = xvidenc_debug; | |
8221 | 332 |
8078 | 333 vbrInit(&fp->vbr_state); |
334 | |
7456 | 335 return 1; |
336 } | |
337 | |
338 static void | |
339 uninit(struct vf_instance_s* vf) | |
340 { | |
8078 | 341 struct vf_priv_s *fp = vf->priv; |
342 | |
343 vbrFinish(&fp->vbr_state); | |
7456 | 344 } |
345 | |
346 static int | |
347 control(struct vf_instance_s* vf, int request, void* data) | |
348 { | |
349 return CONTROL_UNKNOWN; | |
350 } | |
351 | |
352 static int | |
353 query_format(struct vf_instance_s* vf, unsigned int fmt) | |
354 { | |
355 switch(fmt){ | |
356 case IMGFMT_YV12: case IMGFMT_IYUV: case IMGFMT_I420: | |
357 return VFCAP_CSP_SUPPORTED | VFCAP_CSP_SUPPORTED_BY_HW; | |
358 case IMGFMT_YUY2: case IMGFMT_UYVY: | |
359 return VFCAP_CSP_SUPPORTED; | |
360 case IMGFMT_RGB24: case IMGFMT_BGR24: | |
361 return VFCAP_CSP_SUPPORTED | VFCAP_FLIPPED; | |
362 } | |
363 return 0; | |
364 } | |
365 | |
366 static int | |
367 put_image(struct vf_instance_s* vf, mp_image_t *mpi) | |
368 { | |
369 XVID_ENC_STATS enc_stats; | |
8078 | 370 struct vf_priv_s *fp = vf->priv; |
7456 | 371 |
8078 | 372 fp->enc_frame.bitstream = fp->mux->buffer; |
373 fp->enc_frame.length = -1 /* fp->mux->buffer_size */; | |
374 fp->enc_frame.image = mpi->planes[0]; | |
8561 | 375 #ifdef XVID_API_UNSTABLE |
376 fp->enc_frame.stride = mpi->stride[0]; | |
377 #endif | |
8192 | 378 |
379 // 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
|
380 #ifdef XVID_API_UNSTABLE |
8462
800d77666843
Support the latest development code from XViD dev-api-3 CVS
rguyom
parents:
8247
diff
changeset
|
381 if (xvidenc_max_bframes >= 1) { |
9803
4563dfa92a5b
xvid fixes and more options by elcabesa & Martin Drab
henry
parents:
9014
diff
changeset
|
382 if (xvidenc_fixed_quant!=0) { |
8462
800d77666843
Support the latest development code from XViD dev-api-3 CVS
rguyom
parents:
8247
diff
changeset
|
383 // 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
|
384 fp->enc_frame.quant = xvidenc_fixed_quant; |
800d77666843
Support the latest development code from XViD dev-api-3 CVS
rguyom
parents:
8247
diff
changeset
|
385 fp->enc_frame.intra = -1; |
800d77666843
Support the latest development code from XViD dev-api-3 CVS
rguyom
parents:
8247
diff
changeset
|
386 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
|
387 } else |
800d77666843
Support the latest development code from XViD dev-api-3 CVS
rguyom
parents:
8247
diff
changeset
|
388 // 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
|
389 fp->enc_frame.quant =0; |
4563dfa92a5b
xvid fixes and more options by elcabesa & Martin Drab
henry
parents:
9014
diff
changeset
|
390 fp->enc_frame.intra =-1; |
4563dfa92a5b
xvid fixes and more options by elcabesa & Martin Drab
henry
parents:
9014
diff
changeset
|
391 fp->enc_frame.bquant = 0; |
8462
800d77666843
Support the latest development code from XViD dev-api-3 CVS
rguyom
parents:
8247
diff
changeset
|
392 } else { |
800d77666843
Support the latest development code from XViD dev-api-3 CVS
rguyom
parents:
8247
diff
changeset
|
393 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
|
394 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
|
395 } |
800d77666843
Support the latest development code from XViD dev-api-3 CVS
rguyom
parents:
8247
diff
changeset
|
396 #else |
8078 | 397 fp->enc_frame.quant = vbrGetQuant(&fp->vbr_state); |
398 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
|
399 #endif |
8192 | 400 |
401 // modulated quantizer type | |
402 if (xvidenc_mod_quant && xvidenc_pass == 2) { | |
403 fp->enc_frame.general |= (fp->enc_frame.quant < 4) ? XVID_MPEGQUANT : XVID_H263QUANT; | |
404 fp->enc_frame.general &= (fp->enc_frame.quant < 4) ? ~XVID_H263QUANT : ~XVID_MPEGQUANT; | |
405 } | |
406 | |
407 // encode frame | |
8078 | 408 switch (xvid_encore(fp->enc_handle, XVID_ENC_ENCODE, &fp->enc_frame, &enc_stats)) { |
7456 | 409 case XVID_ERR_OK: |
410 break; | |
411 case XVID_ERR_MEMORY: | |
412 mp_msg(MSGT_MENCODER, MSGL_ERR, "xvid: out of memory\n"); | |
413 break; | |
414 case XVID_ERR_FORMAT: | |
415 mp_msg(MSGT_MENCODER, MSGL_ERR, "xvid: bad format\n"); | |
416 break; | |
417 default: | |
418 mp_msg(MSGT_MENCODER, MSGL_ERR, "xvid: failure\n"); | |
419 break; | |
420 } | |
8192 | 421 |
422 // write output | |
9014
c671e9adbe22
Cleanup of the muxer API, func parameters muxer & muxer_f eliminated.
arpi
parents:
8585
diff
changeset
|
423 muxer_write_chunk(fp->mux, fp->enc_frame.length, fp->enc_frame.intra==1 ? 0x10 : 0); |
8192 | 424 |
425 // update the VBR engine | |
8078 | 426 vbrUpdate(&fp->vbr_state, enc_stats.quant, fp->enc_frame.intra, |
427 enc_stats.hlength, fp->enc_frame.length, enc_stats.kblks, enc_stats.mblks, enc_stats.ublks); | |
8192 | 428 |
7456 | 429 return 1; |
430 } | |
431 | |
432 //===========================================================================// | |
433 | |
434 static int | |
435 vf_open(vf_instance_t *vf, char* args) | |
436 { | |
437 XVID_INIT_PARAM params = { 0, 0, 0}; | |
438 vf->config = config; | |
439 vf->control = control; | |
440 vf->uninit = uninit; | |
441 vf->query_format = query_format; | |
442 vf->put_image = put_image; | |
443 vf->priv = malloc(sizeof(struct vf_priv_s)); | |
444 memset(vf->priv, 0, sizeof(struct vf_priv_s)); | |
8585 | 445 vf->priv->mux = (muxer_stream_t*)args; |
7456 | 446 |
447 vf->priv->mux->bih = malloc(sizeof(BITMAPINFOHEADER)); | |
448 vf->priv->mux->bih->biSize = sizeof(BITMAPINFOHEADER); | |
449 vf->priv->mux->bih->biWidth = 0; | |
450 vf->priv->mux->bih->biHeight = 0; | |
451 vf->priv->mux->bih->biPlanes = 1; | |
452 vf->priv->mux->bih->biBitCount = 24; | |
453 vf->priv->mux->bih->biCompression = mmioFOURCC('X','V','I','D'); | |
454 | |
455 if (xvid_init(NULL, 0, ¶ms, NULL) != XVID_ERR_OK) { | |
8078 | 456 mp_msg(MSGT_MENCODER,MSGL_ERR, "xvid: initialisation failure\n"); |
7456 | 457 abort(); |
458 } | |
459 if (params.api_version != API_VERSION) { | |
8078 | 460 mp_msg(MSGT_MENCODER,MSGL_ERR, "xvid: XviD library API version mismatch\n" |
7456 | 461 "\texpected %d.%d, got %d.%d, you should recompile MPlayer.\n", |
462 API_VERSION >> 16, API_VERSION & 0xff, | |
463 params.api_version >> 16, params.api_version & 0xff); | |
464 abort(); | |
465 } | |
466 | |
467 return 1; | |
468 } | |
469 | |
470 vf_info_t ve_info_xvid = { | |
471 "XviD encoder", | |
472 "xvid", | |
8078 | 473 "Kim Minh Kaplan & Rémi Guyomarch", |
7456 | 474 "for internal use by mencoder", |
475 vf_open | |
476 }; | |
477 | |
478 //===========================================================================// | |
479 #endif |