Mercurial > mplayer.hg
annotate libmpcodecs/ve_xvid.c @ 18062:1d9a88da6a52
synced with 1.1252
author | gpoirier |
---|---|
date | Sun, 09 Apr 2006 13:02:47 +0000 |
parents | 20aca9baf5d8 |
children | a1807995e2ab |
rev | line source |
---|---|
7456 | 1 #include <stdio.h> |
2 #include <stdlib.h> | |
3 #include <string.h> | |
8078 | 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 | 11 |
17012 | 12 #include "config.h" |
13 #include "mp_msg.h" | |
7456 | 14 |
11436 | 15 #ifdef HAVE_XVID3 |
7456 | 16 |
17 #include "codec-cfg.h" | |
18 #include "stream.h" | |
19 #include "demuxer.h" | |
20 #include "stheader.h" | |
21 | |
8585 | 22 #include "muxer.h" |
7456 | 23 |
24 #include "img_format.h" | |
25 #include "mp_image.h" | |
26 #include "vf.h" | |
27 | |
28 #include <xvid.h> | |
29 #include "xvid_vbr.h" | |
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 | 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 | 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 | 61 0, |
62 PMV_QUICKSTOP16, | |
7456 | 63 PMV_EARLYSTOP16, |
8078 | 64 PMV_EARLYSTOP16 | PMV_EARLYSTOP8, |
65 PMV_EARLYSTOP16 | PMV_HALFPELREFINE16 | PMV_EARLYSTOP8 | PMV_HALFPELDIAMOND8, | |
66 PMV_EARLYSTOP16 | PMV_HALFPELREFINE16 | PMV_EARLYSTOP8 | PMV_HALFPELDIAMOND8 | PMV_ADVANCEDDIAMOND16, | |
67 PMV_EARLYSTOP16 | PMV_HALFPELREFINE16 | PMV_EXTSEARCH16 | PMV_EARLYSTOP8 | PMV_HALFPELREFINE8 | | |
68 PMV_HALFPELDIAMOND8 | PMV_USESQUARES16 | |
69 | |
8462
800d77666843
Support the latest development code from XViD dev-api-3 CVS
rguyom
parents:
8247
diff
changeset
|
70 #endif |
7456 | 71 }; |
72 | |
8078 | 73 extern char* passtmpfile; |
7456 | 74 |
8078 | 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 | 78 static int xvidenc_bitrate = -1; |
79 static int xvidenc_rc_reaction_delay_factor = -1; | |
80 static int xvidenc_rc_averaging_period = -1; | |
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 | 83 static int xvidenc_min_key_interval = -1; |
8078 | 84 static int xvidenc_max_key_interval = -1; |
85 static int xvidenc_mpeg_quant = 0; | |
8192 | 86 static int xvidenc_mod_quant = 0; |
8221 | 87 static int xvidenc_keyframe_boost = -1; |
8192 | 88 static int xvidenc_kfthreshold = -1; |
89 static int xvidenc_kfreduction = -1; | |
8078 | 90 static int xvidenc_fixed_quant = 0; |
91 static int xvidenc_debug = 0; | |
9805 | 92 static int xvidenc_interlacing = 0; |
9806 | 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 | 95 static int xvidenc_packed = 0; |
96 static int xvidenc_divx5bvop = 1; | |
9804 | 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 | 100 static int xvidenc_bquant_ratio = 150; |
101 static int xvidenc_bquant_offset = 100; | |
9843 | 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 | 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 | 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 | 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 | 119 { "rc_reaction_delay_factor", &xvidenc_rc_reaction_delay_factor, CONF_TYPE_INT, 0, 0, 0, NULL}, |
120 { "rc_averaging_period", &xvidenc_rc_averaging_period, CONF_TYPE_INT, 0, 0, 0, NULL}, | |
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 | 123 { "min_key_interval", &xvidenc_min_key_interval, CONF_TYPE_INT, 0, 0, 0, NULL}, /* for XVID_MODE_2PASS_2 */ |
124 { "max_key_interval", &xvidenc_max_key_interval, CONF_TYPE_INT, 0, 0, 0, NULL}, | |
125 { "mpeg_quant", &xvidenc_mpeg_quant, CONF_TYPE_FLAG, 0, 0, 1, NULL}, | |
8192 | 126 { "mod_quant", &xvidenc_mod_quant, CONF_TYPE_FLAG, 0, 0, 1, NULL}, |
8193 | 127 { "keyframe_boost", &xvidenc_keyframe_boost, CONF_TYPE_INT, CONF_RANGE, 0, 1000, NULL}, /* for XVID_MODE_2PASS_2 */ |
8078 | 128 { "kfthreshold", &xvidenc_kfthreshold, CONF_TYPE_INT, 0, 0, 0, NULL}, /* for XVID_MODE_2PASS_2 */ |
8192 | 129 { "kfreduction", &xvidenc_kfreduction, CONF_TYPE_INT, CONF_RANGE, 0, 100, NULL}, /* for XVID_MODE_2PASS_2 */ |
8078 | 130 { "fixed_quant", &xvidenc_fixed_quant, CONF_TYPE_INT, CONF_RANGE, 1, 31, NULL}, /* for XVID_MODE_FIXED_QUANT */ |
131 { "debug", &xvidenc_debug, CONF_TYPE_FLAG, 0, 0, 1, NULL}, | |
9805 | 132 { "interlacing", &xvidenc_interlacing, CONF_TYPE_FLAG, 0, 0, 1, NULL}, |
9806 | 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 | 135 { "packed", &xvidenc_packed, CONF_TYPE_FLAG, 0, 0, 1, NULL}, |
136 { "divx5bvop", &xvidenc_divx5bvop, CONF_TYPE_FLAG, 0, 0, 1, NULL}, | |
9804 | 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 | 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 | 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 | 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 | 151 { NULL, NULL, 0, 0, 0, 0, NULL} |
152 }; | |
153 | |
154 struct vf_priv_s { | |
8585 | 155 muxer_stream_t* mux; |
7456 | 156 XVID_ENC_FRAME enc_frame; |
157 void* enc_handle; | |
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 | 161 }; |
162 | |
163 static int | |
164 config(struct vf_instance_s* vf, | |
165 int width, int height, int d_width, int d_height, | |
166 unsigned int flags, unsigned int outfmt) | |
167 { | |
168 XVID_ENC_PARAM enc_param; | |
8078 | 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 | 171 |
8078 | 172 fp->mux->bih->biWidth = width; |
173 fp->mux->bih->biHeight = height; | |
174 fp->mux->bih->biSizeImage = fp->mux->bih->biWidth * fp->mux->bih->biHeight * 3; | |
12061 | 175 fp->mux->aspect = (float)d_width/d_height; |
8078 | 176 mp_msg(MSGT_MENCODER,MSGL_INFO,"videocodec: XViD (%dx%d fourcc=%x [%.4s])\n", |
177 width, height, fp->mux->bih->biCompression, (char *)&fp->mux->bih->biCompression); | |
7456 | 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 | 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 | 212 // initialize XViD core parameters |
213 // =============================== | |
7456 | 214 memset(&enc_param, 0, sizeof(enc_param)); |
215 enc_param.width = width; | |
216 enc_param.height = height; | |
8078 | 217 enc_param.fincr = fp->mux->h.dwScale; |
218 enc_param.fbase = fp->mux->h.dwRate; | |
219 if (xvidenc_bitrate > 16000) | |
220 enc_param.rc_bitrate = xvidenc_bitrate; | |
221 else if (xvidenc_bitrate > 0) | |
222 enc_param.rc_bitrate = xvidenc_bitrate * 1000; | |
223 else | |
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 | 233 if (xvidenc_divx5bvop) |
234 enc_param.global |= XVID_GLOBAL_DX50BVOP; | |
235 if (xvidenc_packed) | |
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 | 245 if (xvidenc_greyscale) |
246 enc_param.global |= XVID_GREYSCALE; | |
9835 | 247 #endif |
8078 | 248 enc_param.rc_reaction_delay_factor = xvidenc_rc_reaction_delay_factor; |
249 enc_param.rc_averaging_period = xvidenc_rc_averaging_period; | |
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 | 253 if( xvidenc_max_key_interval <= 0 ) |
254 xvidenc_max_key_interval = 10 * enc_param.fbase / enc_param.fincr; | |
255 enc_param.max_key_interval = xvidenc_max_key_interval; | |
7456 | 256 switch (xvid_encore(NULL, XVID_ENC_CREATE, &enc_param, NULL)) { |
257 case XVID_ERR_FAIL: | |
8078 | 258 mp_msg(MSGT_MENCODER,MSGL_ERR, "xvid: encoder creation failed\n"); |
7456 | 259 return 0; |
260 case XVID_ERR_MEMORY: | |
8078 | 261 mp_msg(MSGT_MENCODER,MSGL_ERR, "xvid: encoder creation failed, out of memory\n"); |
7456 | 262 return 0; |
263 case XVID_ERR_FORMAT: | |
8078 | 264 mp_msg(MSGT_MENCODER,MSGL_ERR, "xvid: encoder creation failed, bad format\n"); |
7456 | 265 return 0; |
266 } | |
8078 | 267 fp->enc_handle = enc_param.handle; |
7456 | 268 |
8078 | 269 // initialize XViD per-frame static parameters |
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 | 275 if (xvidenc_interlacing) |
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 | 278 fp->enc_frame.bframe_threshold = xvidenc_bf_threshold; |
9835 | 279 if (xvidenc_lumi_mask) |
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 | 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 | 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 | 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 | 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 | 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 | 310 #else |
311 if (xvidenc_greyscale) | |
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 | 314 |
7456 | 315 switch (outfmt) { |
316 case IMGFMT_YV12: | |
8078 | 317 fp->enc_frame.colorspace = XVID_CSP_YV12; |
7456 | 318 break; |
319 case IMGFMT_IYUV: case IMGFMT_I420: | |
8078 | 320 fp->enc_frame.colorspace = XVID_CSP_I420; |
7456 | 321 break; |
322 case IMGFMT_YUY2: | |
8078 | 323 fp->enc_frame.colorspace = XVID_CSP_YUY2; |
7456 | 324 break; |
325 case IMGFMT_UYVY: | |
8078 | 326 fp->enc_frame.colorspace = XVID_CSP_UYVY; |
7456 | 327 break; |
328 case IMGFMT_RGB24: case IMGFMT_BGR24: | |
8078 | 329 fp->enc_frame.colorspace = XVID_CSP_RGB24; |
7456 | 330 break; |
331 default: | |
332 mp_msg(MSGT_MENCODER,MSGL_ERR,"xvid: unsupported picture format (%s)!\n", | |
333 vo_format_name(outfmt)); | |
334 return 0; | |
335 } | |
8078 | 336 fp->enc_frame.quant_intra_matrix = 0; |
337 fp->enc_frame.quant_inter_matrix = 0; | |
338 | |
339 // initialize VBR engine | |
340 // ===================== | |
341 vbrSetDefaults(&fp->vbr_state); | |
8221 | 342 if (xvidenc_min_key_interval < 0) |
343 xvidenc_min_key_interval = fp->vbr_state.min_key_interval; | |
344 | |
345 // pass | |
8078 | 346 if (xvidenc_pass == 0) { |
347 if (xvidenc_fixed_quant >= 1) { | |
348 fp->vbr_state.mode = VBR_MODE_FIXED_QUANT; | |
349 fp->vbr_state.fixed_quant = xvidenc_fixed_quant; | |
350 } else | |
351 fp->vbr_state.mode = VBR_MODE_1PASS; | |
7456 | 352 } |
8078 | 353 else if (xvidenc_pass == 1) |
354 fp->vbr_state.mode = VBR_MODE_2PASS_1; | |
355 else if (xvidenc_pass == 2) | |
356 fp->vbr_state.mode = VBR_MODE_2PASS_2; | |
357 else | |
358 return -1; | |
8221 | 359 |
360 // misc | |
8078 | 361 fp->vbr_state.fps = (double)enc_param.fbase / enc_param.fincr; |
362 fp->vbr_state.filename = passtmpfile; | |
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 | 368 if (xvidenc_keyframe_boost >= 0) |
8078 | 369 fp->vbr_state.keyframe_boost = xvidenc_keyframe_boost; |
8192 | 370 if (xvidenc_kfthreshold >= 0) |
8078 | 371 fp->vbr_state.kftreshold = xvidenc_kfthreshold; |
8192 | 372 if (xvidenc_kfreduction >= 0) |
8078 | 373 fp->vbr_state.kfreduction = xvidenc_kfreduction; |
8221 | 374 if (xvidenc_min_key_interval >= 0) |
8078 | 375 fp->vbr_state.min_key_interval = xvidenc_min_key_interval; |
376 fp->vbr_state.max_key_interval = enc_param.max_key_interval; | |
377 fp->vbr_state.debug = xvidenc_debug; | |
8221 | 378 |
8078 | 379 vbrInit(&fp->vbr_state); |
380 | |
17659 | 381 #ifdef XVID_API_UNSTABLE |
382 fp->mux->decoder_delay = enc_param.max_bframes ? 1 : 0; | |
383 #endif | |
384 | |
7456 | 385 return 1; |
386 } | |
387 | |
9823
da375915f47c
"psnr" & related code is only for the -HEAD (unstable) XviD branch.
rguyom
parents:
9819
diff
changeset
|
388 #ifdef XVID_API_UNSTABLE |
9809
508dc4231269
Actually do something useful with XVID_GLOBAL_EXTRASTATS / XVID_EXTRASTATS.
rguyom
parents:
9806
diff
changeset
|
389 static double |
508dc4231269
Actually do something useful with XVID_GLOBAL_EXTRASTATS / XVID_EXTRASTATS.
rguyom
parents:
9806
diff
changeset
|
390 sse_to_PSNR(double sse, double pixels) |
508dc4231269
Actually do something useful with XVID_GLOBAL_EXTRASTATS / XVID_EXTRASTATS.
rguyom
parents:
9806
diff
changeset
|
391 { |
508dc4231269
Actually do something useful with XVID_GLOBAL_EXTRASTATS / XVID_EXTRASTATS.
rguyom
parents:
9806
diff
changeset
|
392 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
|
393 // 4.34294481903251827652 = 10/log(10) |
508dc4231269
Actually do something useful with XVID_GLOBAL_EXTRASTATS / XVID_EXTRASTATS.
rguyom
parents:
9806
diff
changeset
|
394 // 11.08252709031685229249 = log(255*255) |
508dc4231269
Actually do something useful with XVID_GLOBAL_EXTRASTATS / XVID_EXTRASTATS.
rguyom
parents:
9806
diff
changeset
|
395 } |
9823
da375915f47c
"psnr" & related code is only for the -HEAD (unstable) XviD branch.
rguyom
parents:
9819
diff
changeset
|
396 #endif |
9809
508dc4231269
Actually do something useful with XVID_GLOBAL_EXTRASTATS / XVID_EXTRASTATS.
rguyom
parents:
9806
diff
changeset
|
397 |
7456 | 398 static void |
399 uninit(struct vf_instance_s* vf) | |
400 { | |
8078 | 401 struct vf_priv_s *fp = vf->priv; |
402 | |
9823
da375915f47c
"psnr" & related code is only for the -HEAD (unstable) XviD branch.
rguyom
parents:
9819
diff
changeset
|
403 #ifdef XVID_API_UNSTABLE |
9809
508dc4231269
Actually do something useful with XVID_GLOBAL_EXTRASTATS / XVID_EXTRASTATS.
rguyom
parents:
9806
diff
changeset
|
404 if (xvidenc_psnr) { |
508dc4231269
Actually do something useful with XVID_GLOBAL_EXTRASTATS / XVID_EXTRASTATS.
rguyom
parents:
9806
diff
changeset
|
405 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
|
406 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
|
407 sse_to_PSNR(xvid_error[0], p), |
508dc4231269
Actually do something useful with XVID_GLOBAL_EXTRASTATS / XVID_EXTRASTATS.
rguyom
parents:
9806
diff
changeset
|
408 sse_to_PSNR(xvid_error[1], p/4), |
508dc4231269
Actually do something useful with XVID_GLOBAL_EXTRASTATS / XVID_EXTRASTATS.
rguyom
parents:
9806
diff
changeset
|
409 sse_to_PSNR(xvid_error[2], p/4), |
508dc4231269
Actually do something useful with XVID_GLOBAL_EXTRASTATS / XVID_EXTRASTATS.
rguyom
parents:
9806
diff
changeset
|
410 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
|
411 } |
9823
da375915f47c
"psnr" & related code is only for the -HEAD (unstable) XviD branch.
rguyom
parents:
9819
diff
changeset
|
412 #endif |
8078 | 413 vbrFinish(&fp->vbr_state); |
7456 | 414 } |
415 | |
416 static int | |
417 control(struct vf_instance_s* vf, int request, void* data) | |
418 { | |
419 return CONTROL_UNKNOWN; | |
420 } | |
421 | |
422 static int | |
423 query_format(struct vf_instance_s* vf, unsigned int fmt) | |
424 { | |
425 switch(fmt){ | |
426 case IMGFMT_YV12: case IMGFMT_IYUV: case IMGFMT_I420: | |
427 return VFCAP_CSP_SUPPORTED | VFCAP_CSP_SUPPORTED_BY_HW; | |
428 case IMGFMT_YUY2: case IMGFMT_UYVY: | |
429 return VFCAP_CSP_SUPPORTED; | |
430 case IMGFMT_RGB24: case IMGFMT_BGR24: | |
431 return VFCAP_CSP_SUPPORTED | VFCAP_FLIPPED; | |
432 } | |
433 return 0; | |
434 } | |
435 | |
436 static int | |
17906
20aca9baf5d8
passing pts through the filter layer (lets see if pts or cola comes out at the end)
michael
parents:
17659
diff
changeset
|
437 put_image(struct vf_instance_s* vf, mp_image_t *mpi, double pts) |
7456 | 438 { |
439 XVID_ENC_STATS enc_stats; | |
8078 | 440 struct vf_priv_s *fp = vf->priv; |
7456 | 441 |
8078 | 442 fp->enc_frame.bitstream = fp->mux->buffer; |
443 fp->enc_frame.length = -1 /* fp->mux->buffer_size */; | |
444 fp->enc_frame.image = mpi->planes[0]; | |
8561 | 445 #ifdef XVID_API_UNSTABLE |
446 fp->enc_frame.stride = mpi->stride[0]; | |
447 #endif | |
8192 | 448 |
449 // 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
|
450 #ifdef XVID_API_UNSTABLE |
8462
800d77666843
Support the latest development code from XViD dev-api-3 CVS
rguyom
parents:
8247
diff
changeset
|
451 if (xvidenc_max_bframes >= 1) { |
9803
4563dfa92a5b
xvid fixes and more options by elcabesa & Martin Drab
henry
parents:
9014
diff
changeset
|
452 if (xvidenc_fixed_quant!=0) { |
8462
800d77666843
Support the latest development code from XViD dev-api-3 CVS
rguyom
parents:
8247
diff
changeset
|
453 // 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
|
454 fp->enc_frame.quant = xvidenc_fixed_quant; |
800d77666843
Support the latest development code from XViD dev-api-3 CVS
rguyom
parents:
8247
diff
changeset
|
455 fp->enc_frame.intra = -1; |
800d77666843
Support the latest development code from XViD dev-api-3 CVS
rguyom
parents:
8247
diff
changeset
|
456 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
|
457 } else |
800d77666843
Support the latest development code from XViD dev-api-3 CVS
rguyom
parents:
8247
diff
changeset
|
458 // 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
|
459 fp->enc_frame.quant =0; |
4563dfa92a5b
xvid fixes and more options by elcabesa & Martin Drab
henry
parents:
9014
diff
changeset
|
460 fp->enc_frame.intra =-1; |
4563dfa92a5b
xvid fixes and more options by elcabesa & Martin Drab
henry
parents:
9014
diff
changeset
|
461 fp->enc_frame.bquant = 0; |
8462
800d77666843
Support the latest development code from XViD dev-api-3 CVS
rguyom
parents:
8247
diff
changeset
|
462 } else { |
800d77666843
Support the latest development code from XViD dev-api-3 CVS
rguyom
parents:
8247
diff
changeset
|
463 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
|
464 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
|
465 } |
800d77666843
Support the latest development code from XViD dev-api-3 CVS
rguyom
parents:
8247
diff
changeset
|
466 #else |
8078 | 467 fp->enc_frame.quant = vbrGetQuant(&fp->vbr_state); |
468 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
|
469 #endif |
8192 | 470 |
471 // modulated quantizer type | |
472 if (xvidenc_mod_quant && xvidenc_pass == 2) { | |
473 fp->enc_frame.general |= (fp->enc_frame.quant < 4) ? XVID_MPEGQUANT : XVID_H263QUANT; | |
474 fp->enc_frame.general &= (fp->enc_frame.quant < 4) ? ~XVID_H263QUANT : ~XVID_MPEGQUANT; | |
475 } | |
476 | |
477 // encode frame | |
8078 | 478 switch (xvid_encore(fp->enc_handle, XVID_ENC_ENCODE, &fp->enc_frame, &enc_stats)) { |
7456 | 479 case XVID_ERR_OK: |
480 break; | |
481 case XVID_ERR_MEMORY: | |
482 mp_msg(MSGT_MENCODER, MSGL_ERR, "xvid: out of memory\n"); | |
483 break; | |
484 case XVID_ERR_FORMAT: | |
485 mp_msg(MSGT_MENCODER, MSGL_ERR, "xvid: bad format\n"); | |
486 break; | |
487 default: | |
488 mp_msg(MSGT_MENCODER, MSGL_ERR, "xvid: failure\n"); | |
489 break; | |
490 } | |
9809
508dc4231269
Actually do something useful with XVID_GLOBAL_EXTRASTATS / XVID_EXTRASTATS.
rguyom
parents:
9806
diff
changeset
|
491 |
9823
da375915f47c
"psnr" & related code is only for the -HEAD (unstable) XviD branch.
rguyom
parents:
9819
diff
changeset
|
492 #ifdef XVID_API_UNSTABLE |
9809
508dc4231269
Actually do something useful with XVID_GLOBAL_EXTRASTATS / XVID_EXTRASTATS.
rguyom
parents:
9806
diff
changeset
|
493 if (xvidenc_psnr) { |
508dc4231269
Actually do something useful with XVID_GLOBAL_EXTRASTATS / XVID_EXTRASTATS.
rguyom
parents:
9806
diff
changeset
|
494 static FILE *fvstats = NULL; |
508dc4231269
Actually do something useful with XVID_GLOBAL_EXTRASTATS / XVID_EXTRASTATS.
rguyom
parents:
9806
diff
changeset
|
495 char filename[20]; |
508dc4231269
Actually do something useful with XVID_GLOBAL_EXTRASTATS / XVID_EXTRASTATS.
rguyom
parents:
9806
diff
changeset
|
496 |
508dc4231269
Actually do something useful with XVID_GLOBAL_EXTRASTATS / XVID_EXTRASTATS.
rguyom
parents:
9806
diff
changeset
|
497 if (!fvstats) { |
508dc4231269
Actually do something useful with XVID_GLOBAL_EXTRASTATS / XVID_EXTRASTATS.
rguyom
parents:
9806
diff
changeset
|
498 time_t today2; |
508dc4231269
Actually do something useful with XVID_GLOBAL_EXTRASTATS / XVID_EXTRASTATS.
rguyom
parents:
9806
diff
changeset
|
499 struct tm *today; |
508dc4231269
Actually do something useful with XVID_GLOBAL_EXTRASTATS / XVID_EXTRASTATS.
rguyom
parents:
9806
diff
changeset
|
500 today2 = time (NULL); |
508dc4231269
Actually do something useful with XVID_GLOBAL_EXTRASTATS / XVID_EXTRASTATS.
rguyom
parents:
9806
diff
changeset
|
501 today = localtime (&today2); |
508dc4231269
Actually do something useful with XVID_GLOBAL_EXTRASTATS / XVID_EXTRASTATS.
rguyom
parents:
9806
diff
changeset
|
502 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
|
503 fvstats = fopen (filename,"w"); |
508dc4231269
Actually do something useful with XVID_GLOBAL_EXTRASTATS / XVID_EXTRASTATS.
rguyom
parents:
9806
diff
changeset
|
504 if (!fvstats) { |
508dc4231269
Actually do something useful with XVID_GLOBAL_EXTRASTATS / XVID_EXTRASTATS.
rguyom
parents:
9806
diff
changeset
|
505 perror ("fopen"); |
508dc4231269
Actually do something useful with XVID_GLOBAL_EXTRASTATS / XVID_EXTRASTATS.
rguyom
parents:
9806
diff
changeset
|
506 xvidenc_psnr = 0; // disable block |
508dc4231269
Actually do something useful with XVID_GLOBAL_EXTRASTATS / XVID_EXTRASTATS.
rguyom
parents:
9806
diff
changeset
|
507 } |
508dc4231269
Actually do something useful with XVID_GLOBAL_EXTRASTATS / XVID_EXTRASTATS.
rguyom
parents:
9806
diff
changeset
|
508 } |
508dc4231269
Actually do something useful with XVID_GLOBAL_EXTRASTATS / XVID_EXTRASTATS.
rguyom
parents:
9806
diff
changeset
|
509 |
508dc4231269
Actually do something useful with XVID_GLOBAL_EXTRASTATS / XVID_EXTRASTATS.
rguyom
parents:
9806
diff
changeset
|
510 xvid_error[0] += enc_stats.sse_y; |
508dc4231269
Actually do something useful with XVID_GLOBAL_EXTRASTATS / XVID_EXTRASTATS.
rguyom
parents:
9806
diff
changeset
|
511 xvid_error[1] += enc_stats.sse_u; |
508dc4231269
Actually do something useful with XVID_GLOBAL_EXTRASTATS / XVID_EXTRASTATS.
rguyom
parents:
9806
diff
changeset
|
512 xvid_error[2] += enc_stats.sse_v; |
508dc4231269
Actually do something useful with XVID_GLOBAL_EXTRASTATS / XVID_EXTRASTATS.
rguyom
parents:
9806
diff
changeset
|
513 |
508dc4231269
Actually do something useful with XVID_GLOBAL_EXTRASTATS / XVID_EXTRASTATS.
rguyom
parents:
9806
diff
changeset
|
514 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
|
515 fp->nb_frames, |
508dc4231269
Actually do something useful with XVID_GLOBAL_EXTRASTATS / XVID_EXTRASTATS.
rguyom
parents:
9806
diff
changeset
|
516 enc_stats.quant, |
508dc4231269
Actually do something useful with XVID_GLOBAL_EXTRASTATS / XVID_EXTRASTATS.
rguyom
parents:
9806
diff
changeset
|
517 fp->enc_frame.length, |
508dc4231269
Actually do something useful with XVID_GLOBAL_EXTRASTATS / XVID_EXTRASTATS.
rguyom
parents:
9806
diff
changeset
|
518 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
|
519 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
|
520 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
|
521 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
|
522 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
|
523 ); |
508dc4231269
Actually do something useful with XVID_GLOBAL_EXTRASTATS / XVID_EXTRASTATS.
rguyom
parents:
9806
diff
changeset
|
524 |
508dc4231269
Actually do something useful with XVID_GLOBAL_EXTRASTATS / XVID_EXTRASTATS.
rguyom
parents:
9806
diff
changeset
|
525 fp->nb_frames++; |
508dc4231269
Actually do something useful with XVID_GLOBAL_EXTRASTATS / XVID_EXTRASTATS.
rguyom
parents:
9806
diff
changeset
|
526 } |
9823
da375915f47c
"psnr" & related code is only for the -HEAD (unstable) XviD branch.
rguyom
parents:
9819
diff
changeset
|
527 #endif |
8192 | 528 |
529 // write output | |
17659 | 530 if (fp->enc_frame.length > 0) |
17487
fa17424b4c7b
change muxer_write_chunk() so that pts/dts _could_ be passed from encoder to muxer
michael
parents:
17012
diff
changeset
|
531 muxer_write_chunk(fp->mux, fp->enc_frame.length, fp->enc_frame.intra==1 ? 0x10 : 0, MP_NOPTS_VALUE, MP_NOPTS_VALUE); |
17659 | 532 else |
533 ++fp->mux->encoder_delay; | |
8192 | 534 |
535 // update the VBR engine | |
8078 | 536 vbrUpdate(&fp->vbr_state, enc_stats.quant, fp->enc_frame.intra, |
537 enc_stats.hlength, fp->enc_frame.length, enc_stats.kblks, enc_stats.mblks, enc_stats.ublks); | |
8192 | 538 |
7456 | 539 return 1; |
540 } | |
541 | |
542 //===========================================================================// | |
543 | |
544 static int | |
545 vf_open(vf_instance_t *vf, char* args) | |
546 { | |
547 XVID_INIT_PARAM params = { 0, 0, 0}; | |
548 vf->config = config; | |
14878 | 549 vf->default_caps = VFCAP_CONSTANT; |
7456 | 550 vf->control = control; |
551 vf->uninit = uninit; | |
552 vf->query_format = query_format; | |
553 vf->put_image = put_image; | |
554 vf->priv = malloc(sizeof(struct vf_priv_s)); | |
555 memset(vf->priv, 0, sizeof(struct vf_priv_s)); | |
8585 | 556 vf->priv->mux = (muxer_stream_t*)args; |
7456 | 557 |
14549
acf3241be19b
Initialized BITMAPINFOHEADER to 0 to avoid problems, esp. windows has problems
reimar
parents:
12061
diff
changeset
|
558 vf->priv->mux->bih = calloc(1, sizeof(BITMAPINFOHEADER)); |
7456 | 559 vf->priv->mux->bih->biSize = sizeof(BITMAPINFOHEADER); |
560 vf->priv->mux->bih->biWidth = 0; | |
561 vf->priv->mux->bih->biHeight = 0; | |
562 vf->priv->mux->bih->biPlanes = 1; | |
563 vf->priv->mux->bih->biBitCount = 24; | |
564 vf->priv->mux->bih->biCompression = mmioFOURCC('X','V','I','D'); | |
565 | |
566 if (xvid_init(NULL, 0, ¶ms, NULL) != XVID_ERR_OK) { | |
8078 | 567 mp_msg(MSGT_MENCODER,MSGL_ERR, "xvid: initialisation failure\n"); |
7456 | 568 abort(); |
569 } | |
570 if (params.api_version != API_VERSION) { | |
8078 | 571 mp_msg(MSGT_MENCODER,MSGL_ERR, "xvid: XviD library API version mismatch\n" |
7456 | 572 "\texpected %d.%d, got %d.%d, you should recompile MPlayer.\n", |
573 API_VERSION >> 16, API_VERSION & 0xff, | |
574 params.api_version >> 16, params.api_version & 0xff); | |
575 abort(); | |
576 } | |
577 | |
578 return 1; | |
579 } | |
580 | |
581 vf_info_t ve_info_xvid = { | |
582 "XviD encoder", | |
583 "xvid", | |
8078 | 584 "Kim Minh Kaplan & Rémi Guyomarch", |
7456 | 585 "for internal use by mencoder", |
586 vf_open | |
587 }; | |
588 | |
589 //===========================================================================// | |
590 #endif |