Mercurial > mplayer.hg
annotate libmpcodecs/ve_xvid.c @ 10579:f25d93203a71
From: Kir Kostuchenko <kir@users.sourceforge.net>
Hi, I found that command line options brightness, hue, contrast and
saturation does not works, becouse mplayer apply it, before open tv
(kernel says invalid ioctl). Here are simple fix. Please apply.
author | gabucino |
---|---|
date | Tue, 12 Aug 2003 11:32:51 +0000 |
parents | 34c91eb8a897 |
children | 57bdcdb061d7 |
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 |
12 #include "../config.h" | |
13 #include "../mp_msg.h" | |
14 | |
15 #ifdef HAVE_XVID | |
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 | |
8491
ce25d80dd6c3
Use the XVID_API_UNSTABLE macro instead of a home-made one.
rguyom
parents:
8462
diff
changeset
|
31 #include "cfgparser.h" |
ce25d80dd6c3
Use the XVID_API_UNSTABLE macro instead of a home-made one.
rguyom
parents:
8462
diff
changeset
|
32 |
ce25d80dd6c3
Use the XVID_API_UNSTABLE macro instead of a home-made one.
rguyom
parents:
8462
diff
changeset
|
33 |
ce25d80dd6c3
Use the XVID_API_UNSTABLE macro instead of a home-made one.
rguyom
parents:
8462
diff
changeset
|
34 #ifdef XVID_API_UNSTABLE |
ce25d80dd6c3
Use the XVID_API_UNSTABLE macro instead of a home-made one.
rguyom
parents:
8462
diff
changeset
|
35 #warning ******************************************************************* |
ce25d80dd6c3
Use the XVID_API_UNSTABLE macro instead of a home-made one.
rguyom
parents:
8462
diff
changeset
|
36 #warning ** ** |
ce25d80dd6c3
Use the XVID_API_UNSTABLE macro instead of a home-made one.
rguyom
parents:
8462
diff
changeset
|
37 #warning ** Y O U '' R E U S I N G U N S T A B L E S O F T W A R E ** |
ce25d80dd6c3
Use the XVID_API_UNSTABLE macro instead of a home-made one.
rguyom
parents:
8462
diff
changeset
|
38 #warning ** ** |
9806 | 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 |
7456 | 113 struct config 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; | |
175 mp_msg(MSGT_MENCODER,MSGL_INFO,"videocodec: XViD (%dx%d fourcc=%x [%.4s])\n", | |
176 width, height, fp->mux->bih->biCompression, (char *)&fp->mux->bih->biCompression); | |
7456 | 177 |
8247
91edcb091dc6
Instead of min_quantizer, max_quantizer, min_iquantizer, etc... use a
rguyom
parents:
8221
diff
changeset
|
178 // {min,max}_{i,p}quantizer parsing & validation |
91edcb091dc6
Instead of min_quantizer, max_quantizer, min_iquantizer, etc... use a
rguyom
parents:
8221
diff
changeset
|
179 if (sscanf (xvidenc_quant_range, "%u-%u/%u-%u", &min_iq, &max_iq, &min_pq, &max_pq) < 4) { |
91edcb091dc6
Instead of min_quantizer, max_quantizer, min_iquantizer, etc... use a
rguyom
parents:
8221
diff
changeset
|
180 mp_msg (MSGT_MENCODER, MSGL_ERR, |
91edcb091dc6
Instead of min_quantizer, max_quantizer, min_iquantizer, etc... use a
rguyom
parents:
8221
diff
changeset
|
181 "xvid: ERROR: cannot parse \"quant_range=%s\"\n", xvidenc_quant_range); |
91edcb091dc6
Instead of min_quantizer, max_quantizer, min_iquantizer, etc... use a
rguyom
parents:
8221
diff
changeset
|
182 return 0; |
91edcb091dc6
Instead of min_quantizer, max_quantizer, min_iquantizer, etc... use a
rguyom
parents:
8221
diff
changeset
|
183 } |
91edcb091dc6
Instead of min_quantizer, max_quantizer, min_iquantizer, etc... use a
rguyom
parents:
8221
diff
changeset
|
184 if (min_iq < 1 || min_iq > 31 || max_iq < 1 || max_iq > 31 || min_iq > max_iq || |
91edcb091dc6
Instead of min_quantizer, max_quantizer, min_iquantizer, etc... use a
rguyom
parents:
8221
diff
changeset
|
185 min_pq < 1 || min_pq > 31 || max_pq < 1 || max_pq > 31 || min_pq > max_pq) { |
91edcb091dc6
Instead of min_quantizer, max_quantizer, min_iquantizer, etc... use a
rguyom
parents:
8221
diff
changeset
|
186 mp_msg (MSGT_MENCODER, MSGL_ERR, |
91edcb091dc6
Instead of min_quantizer, max_quantizer, min_iquantizer, etc... use a
rguyom
parents:
8221
diff
changeset
|
187 "xvid: ERROR: {min,max} {I,P} quantizer must be in [1,31] and min must be <= max.\n"); |
91edcb091dc6
Instead of min_quantizer, max_quantizer, min_iquantizer, etc... use a
rguyom
parents:
8221
diff
changeset
|
188 mp_msg (MSGT_MENCODER, MSGL_ERR, |
91edcb091dc6
Instead of min_quantizer, max_quantizer, min_iquantizer, etc... use a
rguyom
parents:
8221
diff
changeset
|
189 "xvid: ERROR: cannot use \"quant_range=%s\"\n", xvidenc_quant_range); |
91edcb091dc6
Instead of min_quantizer, max_quantizer, min_iquantizer, etc... use a
rguyom
parents:
8221
diff
changeset
|
190 return -1; |
91edcb091dc6
Instead of min_quantizer, max_quantizer, min_iquantizer, etc... use a
rguyom
parents:
8221
diff
changeset
|
191 } |
91edcb091dc6
Instead of min_quantizer, max_quantizer, min_iquantizer, etc... use a
rguyom
parents:
8221
diff
changeset
|
192 |
8491
ce25d80dd6c3
Use the XVID_API_UNSTABLE macro instead of a home-made one.
rguyom
parents:
8462
diff
changeset
|
193 #ifdef XVID_API_UNSTABLE |
ce25d80dd6c3
Use the XVID_API_UNSTABLE macro instead of a home-made one.
rguyom
parents:
8462
diff
changeset
|
194 mp_msg (MSGT_MENCODER, MSGL_WARN, |
ce25d80dd6c3
Use the XVID_API_UNSTABLE macro instead of a home-made one.
rguyom
parents:
8462
diff
changeset
|
195 "\n" |
ce25d80dd6c3
Use the XVID_API_UNSTABLE macro instead of a home-made one.
rguyom
parents:
8462
diff
changeset
|
196 "*******************************************************************\n" |
ce25d80dd6c3
Use the XVID_API_UNSTABLE macro instead of a home-made one.
rguyom
parents:
8462
diff
changeset
|
197 "** **\n" |
ce25d80dd6c3
Use the XVID_API_UNSTABLE macro instead of a home-made one.
rguyom
parents:
8462
diff
changeset
|
198 "** Y O U ' R E U S I N G U N S T A B L E S O F T W A R E **\n" |
ce25d80dd6c3
Use the XVID_API_UNSTABLE macro instead of a home-made one.
rguyom
parents:
8462
diff
changeset
|
199 "** **\n" |
9806 | 200 "** Streams produced by this version aren't probably compatible **\n" |
8491
ce25d80dd6c3
Use the XVID_API_UNSTABLE macro instead of a home-made one.
rguyom
parents:
8462
diff
changeset
|
201 "** with anything else, even the xvid decoder itself. There are **\n" |
ce25d80dd6c3
Use the XVID_API_UNSTABLE macro instead of a home-made one.
rguyom
parents:
8462
diff
changeset
|
202 "** bugs, this code could crash, could blow up your PC or the **\n" |
ce25d80dd6c3
Use the XVID_API_UNSTABLE macro instead of a home-made one.
rguyom
parents:
8462
diff
changeset
|
203 "** whole building ! **\n" |
ce25d80dd6c3
Use the XVID_API_UNSTABLE macro instead of a home-made one.
rguyom
parents:
8462
diff
changeset
|
204 "** If you want stable code and compatible streams, use stable **\n" |
ce25d80dd6c3
Use the XVID_API_UNSTABLE macro instead of a home-made one.
rguyom
parents:
8462
diff
changeset
|
205 "** XViD releases (currently 0.9.x). **\n" |
ce25d80dd6c3
Use the XVID_API_UNSTABLE macro instead of a home-made one.
rguyom
parents:
8462
diff
changeset
|
206 "** **\n" |
ce25d80dd6c3
Use the XVID_API_UNSTABLE macro instead of a home-made one.
rguyom
parents:
8462
diff
changeset
|
207 "*******************************************************************\n" |
ce25d80dd6c3
Use the XVID_API_UNSTABLE macro instead of a home-made one.
rguyom
parents:
8462
diff
changeset
|
208 "\n"); |
ce25d80dd6c3
Use the XVID_API_UNSTABLE macro instead of a home-made one.
rguyom
parents:
8462
diff
changeset
|
209 #endif |
ce25d80dd6c3
Use the XVID_API_UNSTABLE macro instead of a home-made one.
rguyom
parents:
8462
diff
changeset
|
210 |
8078 | 211 // initialize XViD core parameters |
212 // =============================== | |
7456 | 213 memset(&enc_param, 0, sizeof(enc_param)); |
214 enc_param.width = width; | |
215 enc_param.height = height; | |
8078 | 216 enc_param.fincr = fp->mux->h.dwScale; |
217 enc_param.fbase = fp->mux->h.dwRate; | |
218 if (xvidenc_bitrate > 16000) | |
219 enc_param.rc_bitrate = xvidenc_bitrate; | |
220 else if (xvidenc_bitrate > 0) | |
221 enc_param.rc_bitrate = xvidenc_bitrate * 1000; | |
222 else | |
223 enc_param.rc_bitrate = -1; | |
8491
ce25d80dd6c3
Use the XVID_API_UNSTABLE macro instead of a home-made one.
rguyom
parents:
8462
diff
changeset
|
224 #ifdef XVID_API_UNSTABLE |
8462
800d77666843
Support the latest development code from XViD dev-api-3 CVS
rguyom
parents:
8247
diff
changeset
|
225 if (xvidenc_max_bframes >= 1 && xvidenc_pass >= 1) { |
800d77666843
Support the latest development code from XViD dev-api-3 CVS
rguyom
parents:
8247
diff
changeset
|
226 mp_msg(MSGT_MENCODER,MSGL_WARN, "xvid: cannot use bframes with 2-pass, disabling bframes\n"); |
800d77666843
Support the latest development code from XViD dev-api-3 CVS
rguyom
parents:
8247
diff
changeset
|
227 xvidenc_max_bframes = 0; |
800d77666843
Support the latest development code from XViD dev-api-3 CVS
rguyom
parents:
8247
diff
changeset
|
228 } |
800d77666843
Support the latest development code from XViD dev-api-3 CVS
rguyom
parents:
8247
diff
changeset
|
229 enc_param.max_bframes = xvidenc_max_bframes; |
800d77666843
Support the latest development code from XViD dev-api-3 CVS
rguyom
parents:
8247
diff
changeset
|
230 enc_param.bquant_ratio = xvidenc_bquant_ratio; |
800d77666843
Support the latest development code from XViD dev-api-3 CVS
rguyom
parents:
8247
diff
changeset
|
231 enc_param.bquant_offset = xvidenc_bquant_offset; |
9805 | 232 if (xvidenc_divx5bvop) |
233 enc_param.global |= XVID_GLOBAL_DX50BVOP; | |
234 if (xvidenc_packed) | |
235 enc_param.global |= XVID_GLOBAL_PACKED; | |
8462
800d77666843
Support the latest development code from XViD dev-api-3 CVS
rguyom
parents:
8247
diff
changeset
|
236 if (xvidenc_reduced) |
800d77666843
Support the latest development code from XViD dev-api-3 CVS
rguyom
parents:
8247
diff
changeset
|
237 enc_param.global |= XVID_GLOBAL_REDUCED; |
9809
508dc4231269
Actually do something useful with XVID_GLOBAL_EXTRASTATS / XVID_EXTRASTATS.
rguyom
parents:
9806
diff
changeset
|
238 if (xvidenc_psnr) { |
9803
4563dfa92a5b
xvid fixes and more options by elcabesa & Martin Drab
henry
parents:
9014
diff
changeset
|
239 enc_param.global |= XVID_GLOBAL_EXTRASTATS; |
9809
508dc4231269
Actually do something useful with XVID_GLOBAL_EXTRASTATS / XVID_EXTRASTATS.
rguyom
parents:
9806
diff
changeset
|
240 fp->pixels = width * height; |
508dc4231269
Actually do something useful with XVID_GLOBAL_EXTRASTATS / XVID_EXTRASTATS.
rguyom
parents:
9806
diff
changeset
|
241 fp->nb_frames = 0; |
508dc4231269
Actually do something useful with XVID_GLOBAL_EXTRASTATS / XVID_EXTRASTATS.
rguyom
parents:
9806
diff
changeset
|
242 xvid_error[0] = xvid_error[1] = xvid_error[2] = 0; |
508dc4231269
Actually do something useful with XVID_GLOBAL_EXTRASTATS / XVID_EXTRASTATS.
rguyom
parents:
9806
diff
changeset
|
243 } |
9806 | 244 if (xvidenc_greyscale) |
245 enc_param.global |= XVID_GREYSCALE; | |
9835 | 246 #endif |
8078 | 247 enc_param.rc_reaction_delay_factor = xvidenc_rc_reaction_delay_factor; |
248 enc_param.rc_averaging_period = xvidenc_rc_averaging_period; | |
249 enc_param.rc_buffer = xvidenc_rc_buffer; | |
8247
91edcb091dc6
Instead of min_quantizer, max_quantizer, min_iquantizer, etc... use a
rguyom
parents:
8221
diff
changeset
|
250 enc_param.min_quantizer = min_iq; |
91edcb091dc6
Instead of min_quantizer, max_quantizer, min_iquantizer, etc... use a
rguyom
parents:
8221
diff
changeset
|
251 enc_param.max_quantizer = max_iq; |
8221 | 252 if( xvidenc_max_key_interval <= 0 ) |
253 xvidenc_max_key_interval = 10 * enc_param.fbase / enc_param.fincr; | |
254 enc_param.max_key_interval = xvidenc_max_key_interval; | |
7456 | 255 switch (xvid_encore(NULL, XVID_ENC_CREATE, &enc_param, NULL)) { |
256 case XVID_ERR_FAIL: | |
8078 | 257 mp_msg(MSGT_MENCODER,MSGL_ERR, "xvid: encoder creation failed\n"); |
7456 | 258 return 0; |
259 case XVID_ERR_MEMORY: | |
8078 | 260 mp_msg(MSGT_MENCODER,MSGL_ERR, "xvid: encoder creation failed, out of memory\n"); |
7456 | 261 return 0; |
262 case XVID_ERR_FORMAT: | |
8078 | 263 mp_msg(MSGT_MENCODER,MSGL_ERR, "xvid: encoder creation failed, bad format\n"); |
7456 | 264 return 0; |
265 } | |
8078 | 266 fp->enc_handle = enc_param.handle; |
7456 | 267 |
8078 | 268 // initialize XViD per-frame static parameters |
269 // =========================================== | |
8462
800d77666843
Support the latest development code from XViD dev-api-3 CVS
rguyom
parents:
8247
diff
changeset
|
270 fp->enc_frame.motion = motion_presets[xvidenc_quality]; |
800d77666843
Support the latest development code from XViD dev-api-3 CVS
rguyom
parents:
8247
diff
changeset
|
271 fp->enc_frame.general = XVID_HALFPEL | (xvidenc_mpeg_quant ? XVID_MPEGQUANT : XVID_H263QUANT); |
800d77666843
Support the latest development code from XViD dev-api-3 CVS
rguyom
parents:
8247
diff
changeset
|
272 if (xvidenc_4mv) |
800d77666843
Support the latest development code from XViD dev-api-3 CVS
rguyom
parents:
8247
diff
changeset
|
273 fp->enc_frame.general |= XVID_INTER4V; |
9805 | 274 if (xvidenc_interlacing) |
275 fp->enc_frame.general |= XVID_INTERLACING; | |
8491
ce25d80dd6c3
Use the XVID_API_UNSTABLE macro instead of a home-made one.
rguyom
parents:
8462
diff
changeset
|
276 #ifdef XVID_API_UNSTABLE |
9843 | 277 fp->enc_frame.bframe_threshold = xvidenc_bf_threshold; |
9835 | 278 if (xvidenc_lumi_mask) |
279 fp->enc_frame.general |= XVID_LUMIMASKING; | |
8462
800d77666843
Support the latest development code from XViD dev-api-3 CVS
rguyom
parents:
8247
diff
changeset
|
280 if (xvidenc_qpel) { |
800d77666843
Support the latest development code from XViD dev-api-3 CVS
rguyom
parents:
8247
diff
changeset
|
281 fp->enc_frame.general |= XVID_QUARTERPEL; |
9817
796e9b8bf2e3
- added <time.h> since we're using time() related functions
rguyom
parents:
9809
diff
changeset
|
282 fp->enc_frame.motion |= PMV_QUARTERPELREFINE16 | PMV_QUARTERPELREFINE8; |
8462
800d77666843
Support the latest development code from XViD dev-api-3 CVS
rguyom
parents:
8247
diff
changeset
|
283 } |
9817
796e9b8bf2e3
- added <time.h> since we're using time() related functions
rguyom
parents:
9809
diff
changeset
|
284 switch (xvidenc_vhq) { |
9819 | 285 case 4: // wide search |
9817
796e9b8bf2e3
- added <time.h> since we're using time() related functions
rguyom
parents:
9809
diff
changeset
|
286 fp->enc_frame.motion |= EXTSEARCH_BITS | PMV_EXTSEARCH8; |
9819 | 287 case 3: // medium search |
9817
796e9b8bf2e3
- added <time.h> since we're using time() related functions
rguyom
parents:
9809
diff
changeset
|
288 fp->enc_frame.motion |= HALFPELREFINE8_BITS | QUARTERPELREFINE8_BITS | CHECKPREDICTION_BITS; |
9819 | 289 case 2: // limited search |
9817
796e9b8bf2e3
- added <time.h> since we're using time() related functions
rguyom
parents:
9809
diff
changeset
|
290 fp->enc_frame.motion |= HALFPELREFINE16_BITS | QUARTERPELREFINE16_BITS; |
9819 | 291 case 1: // mode decision |
9803
4563dfa92a5b
xvid fixes and more options by elcabesa & Martin Drab
henry
parents:
9014
diff
changeset
|
292 fp->enc_frame.general |= XVID_MODEDECISION_BITS; |
9817
796e9b8bf2e3
- added <time.h> since we're using time() related functions
rguyom
parents:
9809
diff
changeset
|
293 break; |
796e9b8bf2e3
- added <time.h> since we're using time() related functions
rguyom
parents:
9809
diff
changeset
|
294 case 0: // off |
796e9b8bf2e3
- added <time.h> since we're using time() related functions
rguyom
parents:
9809
diff
changeset
|
295 break; |
796e9b8bf2e3
- added <time.h> since we're using time() related functions
rguyom
parents:
9809
diff
changeset
|
296 } |
8462
800d77666843
Support the latest development code from XViD dev-api-3 CVS
rguyom
parents:
8247
diff
changeset
|
297 if (xvidenc_gmc) |
800d77666843
Support the latest development code from XViD dev-api-3 CVS
rguyom
parents:
8247
diff
changeset
|
298 fp->enc_frame.general |= XVID_GMC; |
9809
508dc4231269
Actually do something useful with XVID_GLOBAL_EXTRASTATS / XVID_EXTRASTATS.
rguyom
parents:
9806
diff
changeset
|
299 if (xvidenc_psnr) |
9803
4563dfa92a5b
xvid fixes and more options by elcabesa & Martin Drab
henry
parents:
9014
diff
changeset
|
300 fp->enc_frame.general |= XVID_EXTRASTATS; |
9805 | 301 if (xvidenc_chroma_me) |
9803
4563dfa92a5b
xvid fixes and more options by elcabesa & Martin Drab
henry
parents:
9014
diff
changeset
|
302 fp->enc_frame.motion |= PMV_CHROMA16 | PMV_CHROMA8; |
8462
800d77666843
Support the latest development code from XViD dev-api-3 CVS
rguyom
parents:
8247
diff
changeset
|
303 if(xvidenc_reduced) |
800d77666843
Support the latest development code from XViD dev-api-3 CVS
rguyom
parents:
8247
diff
changeset
|
304 fp->enc_frame.general |= XVID_REDUCED; |
9803
4563dfa92a5b
xvid fixes and more options by elcabesa & Martin Drab
henry
parents:
9014
diff
changeset
|
305 if(xvidenc_hqac) |
4563dfa92a5b
xvid fixes and more options by elcabesa & Martin Drab
henry
parents:
9014
diff
changeset
|
306 fp->enc_frame.general |= XVID_HQACPRED; |
9817
796e9b8bf2e3
- added <time.h> since we're using time() related functions
rguyom
parents:
9809
diff
changeset
|
307 if (xvidenc_chroma_opt) |
9803
4563dfa92a5b
xvid fixes and more options by elcabesa & Martin Drab
henry
parents:
9014
diff
changeset
|
308 fp->enc_frame.general |= XVID_CHROMAOPT; |
9835 | 309 #else |
310 if (xvidenc_greyscale) | |
311 fp->enc_frame.general |= XVID_GREYSCALE; | |
8462
800d77666843
Support the latest development code from XViD dev-api-3 CVS
rguyom
parents:
8247
diff
changeset
|
312 #endif |
8078 | 313 |
7456 | 314 switch (outfmt) { |
315 case IMGFMT_YV12: | |
8078 | 316 fp->enc_frame.colorspace = XVID_CSP_YV12; |
7456 | 317 break; |
318 case IMGFMT_IYUV: case IMGFMT_I420: | |
8078 | 319 fp->enc_frame.colorspace = XVID_CSP_I420; |
7456 | 320 break; |
321 case IMGFMT_YUY2: | |
8078 | 322 fp->enc_frame.colorspace = XVID_CSP_YUY2; |
7456 | 323 break; |
324 case IMGFMT_UYVY: | |
8078 | 325 fp->enc_frame.colorspace = XVID_CSP_UYVY; |
7456 | 326 break; |
327 case IMGFMT_RGB24: case IMGFMT_BGR24: | |
8078 | 328 fp->enc_frame.colorspace = XVID_CSP_RGB24; |
7456 | 329 break; |
330 default: | |
331 mp_msg(MSGT_MENCODER,MSGL_ERR,"xvid: unsupported picture format (%s)!\n", | |
332 vo_format_name(outfmt)); | |
333 return 0; | |
334 } | |
8078 | 335 fp->enc_frame.quant_intra_matrix = 0; |
336 fp->enc_frame.quant_inter_matrix = 0; | |
337 | |
338 // initialize VBR engine | |
339 // ===================== | |
340 vbrSetDefaults(&fp->vbr_state); | |
8221 | 341 if (xvidenc_min_key_interval < 0) |
342 xvidenc_min_key_interval = fp->vbr_state.min_key_interval; | |
343 | |
344 // pass | |
8078 | 345 if (xvidenc_pass == 0) { |
346 if (xvidenc_fixed_quant >= 1) { | |
347 fp->vbr_state.mode = VBR_MODE_FIXED_QUANT; | |
348 fp->vbr_state.fixed_quant = xvidenc_fixed_quant; | |
349 } else | |
350 fp->vbr_state.mode = VBR_MODE_1PASS; | |
7456 | 351 } |
8078 | 352 else if (xvidenc_pass == 1) |
353 fp->vbr_state.mode = VBR_MODE_2PASS_1; | |
354 else if (xvidenc_pass == 2) | |
355 fp->vbr_state.mode = VBR_MODE_2PASS_2; | |
356 else | |
357 return -1; | |
8221 | 358 |
359 // misc | |
8078 | 360 fp->vbr_state.fps = (double)enc_param.fbase / enc_param.fincr; |
361 fp->vbr_state.filename = passtmpfile; | |
362 fp->vbr_state.desired_bitrate = enc_param.rc_bitrate; | |
8247
91edcb091dc6
Instead of min_quantizer, max_quantizer, min_iquantizer, etc... use a
rguyom
parents:
8221
diff
changeset
|
363 fp->vbr_state.min_iquant = min_iq; |
91edcb091dc6
Instead of min_quantizer, max_quantizer, min_iquantizer, etc... use a
rguyom
parents:
8221
diff
changeset
|
364 fp->vbr_state.max_iquant = max_iq; |
91edcb091dc6
Instead of min_quantizer, max_quantizer, min_iquantizer, etc... use a
rguyom
parents:
8221
diff
changeset
|
365 fp->vbr_state.min_pquant = min_pq; |
91edcb091dc6
Instead of min_quantizer, max_quantizer, min_iquantizer, etc... use a
rguyom
parents:
8221
diff
changeset
|
366 fp->vbr_state.max_pquant = max_pq; |
8221 | 367 if (xvidenc_keyframe_boost >= 0) |
8078 | 368 fp->vbr_state.keyframe_boost = xvidenc_keyframe_boost; |
8192 | 369 if (xvidenc_kfthreshold >= 0) |
8078 | 370 fp->vbr_state.kftreshold = xvidenc_kfthreshold; |
8192 | 371 if (xvidenc_kfreduction >= 0) |
8078 | 372 fp->vbr_state.kfreduction = xvidenc_kfreduction; |
8221 | 373 if (xvidenc_min_key_interval >= 0) |
8078 | 374 fp->vbr_state.min_key_interval = xvidenc_min_key_interval; |
375 fp->vbr_state.max_key_interval = enc_param.max_key_interval; | |
376 fp->vbr_state.debug = xvidenc_debug; | |
8221 | 377 |
8078 | 378 vbrInit(&fp->vbr_state); |
379 | |
7456 | 380 return 1; |
381 } | |
382 | |
9823
da375915f47c
"psnr" & related code is only for the -HEAD (unstable) XviD branch.
rguyom
parents:
9819
diff
changeset
|
383 #ifdef XVID_API_UNSTABLE |
9809
508dc4231269
Actually do something useful with XVID_GLOBAL_EXTRASTATS / XVID_EXTRASTATS.
rguyom
parents:
9806
diff
changeset
|
384 static double |
508dc4231269
Actually do something useful with XVID_GLOBAL_EXTRASTATS / XVID_EXTRASTATS.
rguyom
parents:
9806
diff
changeset
|
385 sse_to_PSNR(double sse, double pixels) |
508dc4231269
Actually do something useful with XVID_GLOBAL_EXTRASTATS / XVID_EXTRASTATS.
rguyom
parents:
9806
diff
changeset
|
386 { |
508dc4231269
Actually do something useful with XVID_GLOBAL_EXTRASTATS / XVID_EXTRASTATS.
rguyom
parents:
9806
diff
changeset
|
387 return sse == 0 ? INFINITY : 4.34294481903251827652 * (11.08252709031685229249 - log(sse/pixels)); |
508dc4231269
Actually do something useful with XVID_GLOBAL_EXTRASTATS / XVID_EXTRASTATS.
rguyom
parents:
9806
diff
changeset
|
388 // 4.34294481903251827652 = 10/log(10) |
508dc4231269
Actually do something useful with XVID_GLOBAL_EXTRASTATS / XVID_EXTRASTATS.
rguyom
parents:
9806
diff
changeset
|
389 // 11.08252709031685229249 = log(255*255) |
508dc4231269
Actually do something useful with XVID_GLOBAL_EXTRASTATS / XVID_EXTRASTATS.
rguyom
parents:
9806
diff
changeset
|
390 } |
9823
da375915f47c
"psnr" & related code is only for the -HEAD (unstable) XviD branch.
rguyom
parents:
9819
diff
changeset
|
391 #endif |
9809
508dc4231269
Actually do something useful with XVID_GLOBAL_EXTRASTATS / XVID_EXTRASTATS.
rguyom
parents:
9806
diff
changeset
|
392 |
7456 | 393 static void |
394 uninit(struct vf_instance_s* vf) | |
395 { | |
8078 | 396 struct vf_priv_s *fp = vf->priv; |
397 | |
9823
da375915f47c
"psnr" & related code is only for the -HEAD (unstable) XviD branch.
rguyom
parents:
9819
diff
changeset
|
398 #ifdef XVID_API_UNSTABLE |
9809
508dc4231269
Actually do something useful with XVID_GLOBAL_EXTRASTATS / XVID_EXTRASTATS.
rguyom
parents:
9806
diff
changeset
|
399 if (xvidenc_psnr) { |
508dc4231269
Actually do something useful with XVID_GLOBAL_EXTRASTATS / XVID_EXTRASTATS.
rguyom
parents:
9806
diff
changeset
|
400 double p = (double)fp->pixels * (double)fp->nb_frames; |
508dc4231269
Actually do something useful with XVID_GLOBAL_EXTRASTATS / XVID_EXTRASTATS.
rguyom
parents:
9806
diff
changeset
|
401 printf ("PSNR: Y:%2.2f, Cb:%2.2f, Cr:%2.2f, All:%2.2f\n", |
508dc4231269
Actually do something useful with XVID_GLOBAL_EXTRASTATS / XVID_EXTRASTATS.
rguyom
parents:
9806
diff
changeset
|
402 sse_to_PSNR(xvid_error[0], p), |
508dc4231269
Actually do something useful with XVID_GLOBAL_EXTRASTATS / XVID_EXTRASTATS.
rguyom
parents:
9806
diff
changeset
|
403 sse_to_PSNR(xvid_error[1], p/4), |
508dc4231269
Actually do something useful with XVID_GLOBAL_EXTRASTATS / XVID_EXTRASTATS.
rguyom
parents:
9806
diff
changeset
|
404 sse_to_PSNR(xvid_error[2], p/4), |
508dc4231269
Actually do something useful with XVID_GLOBAL_EXTRASTATS / XVID_EXTRASTATS.
rguyom
parents:
9806
diff
changeset
|
405 sse_to_PSNR(xvid_error[0] + xvid_error[1] + xvid_error[2], p*1.5)); |
508dc4231269
Actually do something useful with XVID_GLOBAL_EXTRASTATS / XVID_EXTRASTATS.
rguyom
parents:
9806
diff
changeset
|
406 } |
9823
da375915f47c
"psnr" & related code is only for the -HEAD (unstable) XviD branch.
rguyom
parents:
9819
diff
changeset
|
407 #endif |
8078 | 408 vbrFinish(&fp->vbr_state); |
7456 | 409 } |
410 | |
411 static int | |
412 control(struct vf_instance_s* vf, int request, void* data) | |
413 { | |
414 return CONTROL_UNKNOWN; | |
415 } | |
416 | |
417 static int | |
418 query_format(struct vf_instance_s* vf, unsigned int fmt) | |
419 { | |
420 switch(fmt){ | |
421 case IMGFMT_YV12: case IMGFMT_IYUV: case IMGFMT_I420: | |
422 return VFCAP_CSP_SUPPORTED | VFCAP_CSP_SUPPORTED_BY_HW; | |
423 case IMGFMT_YUY2: case IMGFMT_UYVY: | |
424 return VFCAP_CSP_SUPPORTED; | |
425 case IMGFMT_RGB24: case IMGFMT_BGR24: | |
426 return VFCAP_CSP_SUPPORTED | VFCAP_FLIPPED; | |
427 } | |
428 return 0; | |
429 } | |
430 | |
431 static int | |
432 put_image(struct vf_instance_s* vf, mp_image_t *mpi) | |
433 { | |
434 XVID_ENC_STATS enc_stats; | |
8078 | 435 struct vf_priv_s *fp = vf->priv; |
7456 | 436 |
8078 | 437 fp->enc_frame.bitstream = fp->mux->buffer; |
438 fp->enc_frame.length = -1 /* fp->mux->buffer_size */; | |
439 fp->enc_frame.image = mpi->planes[0]; | |
8561 | 440 #ifdef XVID_API_UNSTABLE |
441 fp->enc_frame.stride = mpi->stride[0]; | |
442 #endif | |
8192 | 443 |
444 // get quantizers & I/P decision from the VBR engine | |
8491
ce25d80dd6c3
Use the XVID_API_UNSTABLE macro instead of a home-made one.
rguyom
parents:
8462
diff
changeset
|
445 #ifdef XVID_API_UNSTABLE |
8462
800d77666843
Support the latest development code from XViD dev-api-3 CVS
rguyom
parents:
8247
diff
changeset
|
446 if (xvidenc_max_bframes >= 1) { |
9803
4563dfa92a5b
xvid fixes and more options by elcabesa & Martin Drab
henry
parents:
9014
diff
changeset
|
447 if (xvidenc_fixed_quant!=0) { |
8462
800d77666843
Support the latest development code from XViD dev-api-3 CVS
rguyom
parents:
8247
diff
changeset
|
448 // hack, the internal VBR engine isn't fixed-quant aware |
800d77666843
Support the latest development code from XViD dev-api-3 CVS
rguyom
parents:
8247
diff
changeset
|
449 fp->enc_frame.quant = xvidenc_fixed_quant; |
800d77666843
Support the latest development code from XViD dev-api-3 CVS
rguyom
parents:
8247
diff
changeset
|
450 fp->enc_frame.intra = -1; |
800d77666843
Support the latest development code from XViD dev-api-3 CVS
rguyom
parents:
8247
diff
changeset
|
451 fp->enc_frame.bquant = (xvidenc_fixed_quant * xvidenc_bquant_ratio + xvidenc_bquant_offset) / 100; |
800d77666843
Support the latest development code from XViD dev-api-3 CVS
rguyom
parents:
8247
diff
changeset
|
452 } else |
800d77666843
Support the latest development code from XViD dev-api-3 CVS
rguyom
parents:
8247
diff
changeset
|
453 // use the internal VBR engine since the external one isn't bframe aware |
9803
4563dfa92a5b
xvid fixes and more options by elcabesa & Martin Drab
henry
parents:
9014
diff
changeset
|
454 fp->enc_frame.quant =0; |
4563dfa92a5b
xvid fixes and more options by elcabesa & Martin Drab
henry
parents:
9014
diff
changeset
|
455 fp->enc_frame.intra =-1; |
4563dfa92a5b
xvid fixes and more options by elcabesa & Martin Drab
henry
parents:
9014
diff
changeset
|
456 fp->enc_frame.bquant = 0; |
8462
800d77666843
Support the latest development code from XViD dev-api-3 CVS
rguyom
parents:
8247
diff
changeset
|
457 } else { |
800d77666843
Support the latest development code from XViD dev-api-3 CVS
rguyom
parents:
8247
diff
changeset
|
458 fp->enc_frame.quant = vbrGetQuant(&fp->vbr_state); |
800d77666843
Support the latest development code from XViD dev-api-3 CVS
rguyom
parents:
8247
diff
changeset
|
459 fp->enc_frame.intra = vbrGetIntra(&fp->vbr_state); |
800d77666843
Support the latest development code from XViD dev-api-3 CVS
rguyom
parents:
8247
diff
changeset
|
460 } |
800d77666843
Support the latest development code from XViD dev-api-3 CVS
rguyom
parents:
8247
diff
changeset
|
461 #else |
8078 | 462 fp->enc_frame.quant = vbrGetQuant(&fp->vbr_state); |
463 fp->enc_frame.intra = vbrGetIntra(&fp->vbr_state); | |
8462
800d77666843
Support the latest development code from XViD dev-api-3 CVS
rguyom
parents:
8247
diff
changeset
|
464 #endif |
8192 | 465 |
466 // modulated quantizer type | |
467 if (xvidenc_mod_quant && xvidenc_pass == 2) { | |
468 fp->enc_frame.general |= (fp->enc_frame.quant < 4) ? XVID_MPEGQUANT : XVID_H263QUANT; | |
469 fp->enc_frame.general &= (fp->enc_frame.quant < 4) ? ~XVID_H263QUANT : ~XVID_MPEGQUANT; | |
470 } | |
471 | |
472 // encode frame | |
8078 | 473 switch (xvid_encore(fp->enc_handle, XVID_ENC_ENCODE, &fp->enc_frame, &enc_stats)) { |
7456 | 474 case XVID_ERR_OK: |
475 break; | |
476 case XVID_ERR_MEMORY: | |
477 mp_msg(MSGT_MENCODER, MSGL_ERR, "xvid: out of memory\n"); | |
478 break; | |
479 case XVID_ERR_FORMAT: | |
480 mp_msg(MSGT_MENCODER, MSGL_ERR, "xvid: bad format\n"); | |
481 break; | |
482 default: | |
483 mp_msg(MSGT_MENCODER, MSGL_ERR, "xvid: failure\n"); | |
484 break; | |
485 } | |
9809
508dc4231269
Actually do something useful with XVID_GLOBAL_EXTRASTATS / XVID_EXTRASTATS.
rguyom
parents:
9806
diff
changeset
|
486 |
9823
da375915f47c
"psnr" & related code is only for the -HEAD (unstable) XviD branch.
rguyom
parents:
9819
diff
changeset
|
487 #ifdef XVID_API_UNSTABLE |
9809
508dc4231269
Actually do something useful with XVID_GLOBAL_EXTRASTATS / XVID_EXTRASTATS.
rguyom
parents:
9806
diff
changeset
|
488 if (xvidenc_psnr) { |
508dc4231269
Actually do something useful with XVID_GLOBAL_EXTRASTATS / XVID_EXTRASTATS.
rguyom
parents:
9806
diff
changeset
|
489 static FILE *fvstats = NULL; |
508dc4231269
Actually do something useful with XVID_GLOBAL_EXTRASTATS / XVID_EXTRASTATS.
rguyom
parents:
9806
diff
changeset
|
490 char filename[20]; |
508dc4231269
Actually do something useful with XVID_GLOBAL_EXTRASTATS / XVID_EXTRASTATS.
rguyom
parents:
9806
diff
changeset
|
491 |
508dc4231269
Actually do something useful with XVID_GLOBAL_EXTRASTATS / XVID_EXTRASTATS.
rguyom
parents:
9806
diff
changeset
|
492 if (!fvstats) { |
508dc4231269
Actually do something useful with XVID_GLOBAL_EXTRASTATS / XVID_EXTRASTATS.
rguyom
parents:
9806
diff
changeset
|
493 time_t today2; |
508dc4231269
Actually do something useful with XVID_GLOBAL_EXTRASTATS / XVID_EXTRASTATS.
rguyom
parents:
9806
diff
changeset
|
494 struct tm *today; |
508dc4231269
Actually do something useful with XVID_GLOBAL_EXTRASTATS / XVID_EXTRASTATS.
rguyom
parents:
9806
diff
changeset
|
495 today2 = time (NULL); |
508dc4231269
Actually do something useful with XVID_GLOBAL_EXTRASTATS / XVID_EXTRASTATS.
rguyom
parents:
9806
diff
changeset
|
496 today = localtime (&today2); |
508dc4231269
Actually do something useful with XVID_GLOBAL_EXTRASTATS / XVID_EXTRASTATS.
rguyom
parents:
9806
diff
changeset
|
497 sprintf (filename, "psnr_%02d%02d%02d.log", today->tm_hour, today->tm_min, today->tm_sec); |
508dc4231269
Actually do something useful with XVID_GLOBAL_EXTRASTATS / XVID_EXTRASTATS.
rguyom
parents:
9806
diff
changeset
|
498 fvstats = fopen (filename,"w"); |
508dc4231269
Actually do something useful with XVID_GLOBAL_EXTRASTATS / XVID_EXTRASTATS.
rguyom
parents:
9806
diff
changeset
|
499 if (!fvstats) { |
508dc4231269
Actually do something useful with XVID_GLOBAL_EXTRASTATS / XVID_EXTRASTATS.
rguyom
parents:
9806
diff
changeset
|
500 perror ("fopen"); |
508dc4231269
Actually do something useful with XVID_GLOBAL_EXTRASTATS / XVID_EXTRASTATS.
rguyom
parents:
9806
diff
changeset
|
501 xvidenc_psnr = 0; // disable block |
508dc4231269
Actually do something useful with XVID_GLOBAL_EXTRASTATS / XVID_EXTRASTATS.
rguyom
parents:
9806
diff
changeset
|
502 } |
508dc4231269
Actually do something useful with XVID_GLOBAL_EXTRASTATS / XVID_EXTRASTATS.
rguyom
parents:
9806
diff
changeset
|
503 } |
508dc4231269
Actually do something useful with XVID_GLOBAL_EXTRASTATS / XVID_EXTRASTATS.
rguyom
parents:
9806
diff
changeset
|
504 |
508dc4231269
Actually do something useful with XVID_GLOBAL_EXTRASTATS / XVID_EXTRASTATS.
rguyom
parents:
9806
diff
changeset
|
505 xvid_error[0] += enc_stats.sse_y; |
508dc4231269
Actually do something useful with XVID_GLOBAL_EXTRASTATS / XVID_EXTRASTATS.
rguyom
parents:
9806
diff
changeset
|
506 xvid_error[1] += enc_stats.sse_u; |
508dc4231269
Actually do something useful with XVID_GLOBAL_EXTRASTATS / XVID_EXTRASTATS.
rguyom
parents:
9806
diff
changeset
|
507 xvid_error[2] += enc_stats.sse_v; |
508dc4231269
Actually do something useful with XVID_GLOBAL_EXTRASTATS / XVID_EXTRASTATS.
rguyom
parents:
9806
diff
changeset
|
508 |
508dc4231269
Actually do something useful with XVID_GLOBAL_EXTRASTATS / XVID_EXTRASTATS.
rguyom
parents:
9806
diff
changeset
|
509 fprintf (fvstats, "%6d, %2d, %6d, %2.2f, %2.2f, %2.2f, %2.2f %c\n", |
508dc4231269
Actually do something useful with XVID_GLOBAL_EXTRASTATS / XVID_EXTRASTATS.
rguyom
parents:
9806
diff
changeset
|
510 fp->nb_frames, |
508dc4231269
Actually do something useful with XVID_GLOBAL_EXTRASTATS / XVID_EXTRASTATS.
rguyom
parents:
9806
diff
changeset
|
511 enc_stats.quant, |
508dc4231269
Actually do something useful with XVID_GLOBAL_EXTRASTATS / XVID_EXTRASTATS.
rguyom
parents:
9806
diff
changeset
|
512 fp->enc_frame.length, |
508dc4231269
Actually do something useful with XVID_GLOBAL_EXTRASTATS / XVID_EXTRASTATS.
rguyom
parents:
9806
diff
changeset
|
513 sse_to_PSNR (enc_stats.sse_y, fp->pixels), |
508dc4231269
Actually do something useful with XVID_GLOBAL_EXTRASTATS / XVID_EXTRASTATS.
rguyom
parents:
9806
diff
changeset
|
514 sse_to_PSNR (enc_stats.sse_u, fp->pixels / 4), |
508dc4231269
Actually do something useful with XVID_GLOBAL_EXTRASTATS / XVID_EXTRASTATS.
rguyom
parents:
9806
diff
changeset
|
515 sse_to_PSNR (enc_stats.sse_v, fp->pixels / 4), |
508dc4231269
Actually do something useful with XVID_GLOBAL_EXTRASTATS / XVID_EXTRASTATS.
rguyom
parents:
9806
diff
changeset
|
516 sse_to_PSNR (enc_stats.sse_y + enc_stats.sse_u + enc_stats.sse_v, (double)fp->pixels * 1.5), |
508dc4231269
Actually do something useful with XVID_GLOBAL_EXTRASTATS / XVID_EXTRASTATS.
rguyom
parents:
9806
diff
changeset
|
517 fp->enc_frame.intra == 0 ? 'P' : fp->enc_frame.intra == 1 ? 'I' : 'B' |
508dc4231269
Actually do something useful with XVID_GLOBAL_EXTRASTATS / XVID_EXTRASTATS.
rguyom
parents:
9806
diff
changeset
|
518 ); |
508dc4231269
Actually do something useful with XVID_GLOBAL_EXTRASTATS / XVID_EXTRASTATS.
rguyom
parents:
9806
diff
changeset
|
519 |
508dc4231269
Actually do something useful with XVID_GLOBAL_EXTRASTATS / XVID_EXTRASTATS.
rguyom
parents:
9806
diff
changeset
|
520 fp->nb_frames++; |
508dc4231269
Actually do something useful with XVID_GLOBAL_EXTRASTATS / XVID_EXTRASTATS.
rguyom
parents:
9806
diff
changeset
|
521 } |
9823
da375915f47c
"psnr" & related code is only for the -HEAD (unstable) XviD branch.
rguyom
parents:
9819
diff
changeset
|
522 #endif |
8192 | 523 |
524 // write output | |
9014
c671e9adbe22
Cleanup of the muxer API, func parameters muxer & muxer_f eliminated.
arpi
parents:
8585
diff
changeset
|
525 muxer_write_chunk(fp->mux, fp->enc_frame.length, fp->enc_frame.intra==1 ? 0x10 : 0); |
8192 | 526 |
527 // update the VBR engine | |
8078 | 528 vbrUpdate(&fp->vbr_state, enc_stats.quant, fp->enc_frame.intra, |
529 enc_stats.hlength, fp->enc_frame.length, enc_stats.kblks, enc_stats.mblks, enc_stats.ublks); | |
8192 | 530 |
7456 | 531 return 1; |
532 } | |
533 | |
534 //===========================================================================// | |
535 | |
536 static int | |
537 vf_open(vf_instance_t *vf, char* args) | |
538 { | |
539 XVID_INIT_PARAM params = { 0, 0, 0}; | |
540 vf->config = config; | |
541 vf->control = control; | |
542 vf->uninit = uninit; | |
543 vf->query_format = query_format; | |
544 vf->put_image = put_image; | |
545 vf->priv = malloc(sizeof(struct vf_priv_s)); | |
546 memset(vf->priv, 0, sizeof(struct vf_priv_s)); | |
8585 | 547 vf->priv->mux = (muxer_stream_t*)args; |
7456 | 548 |
549 vf->priv->mux->bih = malloc(sizeof(BITMAPINFOHEADER)); | |
550 vf->priv->mux->bih->biSize = sizeof(BITMAPINFOHEADER); | |
551 vf->priv->mux->bih->biWidth = 0; | |
552 vf->priv->mux->bih->biHeight = 0; | |
553 vf->priv->mux->bih->biPlanes = 1; | |
554 vf->priv->mux->bih->biBitCount = 24; | |
555 vf->priv->mux->bih->biCompression = mmioFOURCC('X','V','I','D'); | |
556 | |
557 if (xvid_init(NULL, 0, ¶ms, NULL) != XVID_ERR_OK) { | |
8078 | 558 mp_msg(MSGT_MENCODER,MSGL_ERR, "xvid: initialisation failure\n"); |
7456 | 559 abort(); |
560 } | |
561 if (params.api_version != API_VERSION) { | |
8078 | 562 mp_msg(MSGT_MENCODER,MSGL_ERR, "xvid: XviD library API version mismatch\n" |
7456 | 563 "\texpected %d.%d, got %d.%d, you should recompile MPlayer.\n", |
564 API_VERSION >> 16, API_VERSION & 0xff, | |
565 params.api_version >> 16, params.api_version & 0xff); | |
566 abort(); | |
567 } | |
568 | |
569 return 1; | |
570 } | |
571 | |
572 vf_info_t ve_info_xvid = { | |
573 "XviD encoder", | |
574 "xvid", | |
8078 | 575 "Kim Minh Kaplan & Rémi Guyomarch", |
7456 | 576 "for internal use by mencoder", |
577 vf_open | |
578 }; | |
579 | |
580 //===========================================================================// | |
581 #endif |