annotate libmpcodecs/ve_divx4.c @ 11245:9a3230a5ef38

100l patch by (Tilmann Bitterberg <transcode at tibit dot org>)
author michael
date Thu, 23 Oct 2003 12:05:33 +0000
parents 57bdcdb061d7
children 656a1b45b309
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
5550
7d1dfb59c6c0 encoders
arpi
parents:
diff changeset
1 #include <stdio.h>
7d1dfb59c6c0 encoders
arpi
parents:
diff changeset
2 #include <stdlib.h>
7d1dfb59c6c0 encoders
arpi
parents:
diff changeset
3 #include <string.h>
7d1dfb59c6c0 encoders
arpi
parents:
diff changeset
4
7d1dfb59c6c0 encoders
arpi
parents:
diff changeset
5 #include "../config.h"
7d1dfb59c6c0 encoders
arpi
parents:
diff changeset
6 #include "../mp_msg.h"
7d1dfb59c6c0 encoders
arpi
parents:
diff changeset
7
7d1dfb59c6c0 encoders
arpi
parents:
diff changeset
8 #ifdef HAVE_DIVX4ENCORE
7d1dfb59c6c0 encoders
arpi
parents:
diff changeset
9
7d1dfb59c6c0 encoders
arpi
parents:
diff changeset
10 #include "codec-cfg.h"
7d1dfb59c6c0 encoders
arpi
parents:
diff changeset
11 #include "stream.h"
7d1dfb59c6c0 encoders
arpi
parents:
diff changeset
12 #include "demuxer.h"
7d1dfb59c6c0 encoders
arpi
parents:
diff changeset
13 #include "stheader.h"
7d1dfb59c6c0 encoders
arpi
parents:
diff changeset
14
8585
27da710563c2 the long-waited MUXER layer, and new MPEG-PS muxer
arpi
parents: 8032
diff changeset
15 #include "muxer.h"
5550
7d1dfb59c6c0 encoders
arpi
parents:
diff changeset
16
5607
1972c3475d93 mp_image.h and img_format.h moved to libmpcodecs
arpi
parents: 5551
diff changeset
17 #include "img_format.h"
1972c3475d93 mp_image.h and img_format.h moved to libmpcodecs
arpi
parents: 5551
diff changeset
18 #include "mp_image.h"
5550
7d1dfb59c6c0 encoders
arpi
parents:
diff changeset
19 #include "vf.h"
7d1dfb59c6c0 encoders
arpi
parents:
diff changeset
20
7332
dd32b0c95c95 Code to XviD VBR Library from transcode.
kmkaplan
parents: 7127
diff changeset
21 /* About XviD VBR Library, Edouard Gomez (GomGom) said:
dd32b0c95c95 Code to XviD VBR Library from transcode.
kmkaplan
parents: 7127
diff changeset
22 <GomGom> header bytes == frame header bytes :-)
dd32b0c95c95 Code to XviD VBR Library from transcode.
kmkaplan
parents: 7127
diff changeset
23 <GomGom> total bytes = frame bytes == texture + header
dd32b0c95c95 Code to XviD VBR Library from transcode.
kmkaplan
parents: 7127
diff changeset
24 <GomGom> quant = quant returned by xvidcore
dd32b0c95c95 Code to XviD VBR Library from transcode.
kmkaplan
parents: 7127
diff changeset
25 <GomGom> it's possible that xvid lowers or increases the passed quant because of lumimasking
dd32b0c95c95 Code to XviD VBR Library from transcode.
kmkaplan
parents: 7127
diff changeset
26 <GomGom> kblks = blocks coded as intra blocks
dd32b0c95c95 Code to XviD VBR Library from transcode.
kmkaplan
parents: 7127
diff changeset
27 <GomGom> mblks = blocks coded as predicted blocks
dd32b0c95c95 Code to XviD VBR Library from transcode.
kmkaplan
parents: 7127
diff changeset
28 <GomGom> ublks = skipped blocks
dd32b0c95c95 Code to XviD VBR Library from transcode.
kmkaplan
parents: 7127
diff changeset
29 <GomGom> at the moemnt le vbr lib uses total bytes, and quant
dd32b0c95c95 Code to XviD VBR Library from transcode.
kmkaplan
parents: 7127
diff changeset
30 <GomGom> so it's easy to use it with divx5 (wo bframes)
dd32b0c95c95 Code to XviD VBR Library from transcode.
kmkaplan
parents: 7127
diff changeset
31 <klOUg> bframes breaks what assumptions?
dd32b0c95c95 Code to XviD VBR Library from transcode.
kmkaplan
parents: 7127
diff changeset
32 <GomGom> quant estimation for next frame
dd32b0c95c95 Code to XviD VBR Library from transcode.
kmkaplan
parents: 7127
diff changeset
33 <GomGom> because of the bframe quant multiplier given to divx5
dd32b0c95c95 Code to XviD VBR Library from transcode.
kmkaplan
parents: 7127
diff changeset
34 <GomGom> that the vbr lib does not "know"
dd32b0c95c95 Code to XviD VBR Library from transcode.
kmkaplan
parents: 7127
diff changeset
35 */
dd32b0c95c95 Code to XviD VBR Library from transcode.
kmkaplan
parents: 7127
diff changeset
36
5550
7d1dfb59c6c0 encoders
arpi
parents:
diff changeset
37 //===========================================================================//
7d1dfb59c6c0 encoders
arpi
parents:
diff changeset
38
8032
136e7e515764 removed -pass nonsense from mencoder! it's now a suboption to -divx4opts
rfelker
parents: 7368
diff changeset
39 static int pass;
5550
7d1dfb59c6c0 encoders
arpi
parents:
diff changeset
40 extern char* passtmpfile;
7d1dfb59c6c0 encoders
arpi
parents:
diff changeset
41
9300
32be26de0d7c cleanup detection of various divx4 versions/alternatives
arpi
parents: 9014
diff changeset
42 #ifdef ENCORE_XVID
32be26de0d7c cleanup detection of various divx4 versions/alternatives
arpi
parents: 9014
diff changeset
43 #include <divx4.h>
32be26de0d7c cleanup detection of various divx4 versions/alternatives
arpi
parents: 9014
diff changeset
44 #else
5550
7d1dfb59c6c0 encoders
arpi
parents:
diff changeset
45 #include <encore2.h>
9300
32be26de0d7c cleanup detection of various divx4 versions/alternatives
arpi
parents: 9014
diff changeset
46 #endif
5550
7d1dfb59c6c0 encoders
arpi
parents:
diff changeset
47
5854
3a961eaf45b9 divx5.1 features added
arpi
parents: 5706
diff changeset
48 #ifndef ENCORE_MAJOR_VERSION
3a961eaf45b9 divx5.1 features added
arpi
parents: 5706
diff changeset
49 #define ENCORE_MAJOR_VERSION 4000
3a961eaf45b9 divx5.1 features added
arpi
parents: 5706
diff changeset
50 #endif
3a961eaf45b9 divx5.1 features added
arpi
parents: 5706
diff changeset
51
10252
d275152390ee I've found some time to implement the encoding support for the new
arpi
parents: 9300
diff changeset
52 #if ENCORE_MAJOR_VERSION < 5200
d275152390ee I've found some time to implement the encoding support for the new
arpi
parents: 9300
diff changeset
53 #include "divx4_vbr.h"
d275152390ee I've found some time to implement the encoding support for the new
arpi
parents: 9300
diff changeset
54 #define HAVE_XVID_VBR
d275152390ee I've found some time to implement the encoding support for the new
arpi
parents: 9300
diff changeset
55 #ifdef HAVE_XVID_VBR
d275152390ee I've found some time to implement the encoding support for the new
arpi
parents: 9300
diff changeset
56 #include "xvid_vbr.h"
d275152390ee I've found some time to implement the encoding support for the new
arpi
parents: 9300
diff changeset
57 #endif
d275152390ee I've found some time to implement the encoding support for the new
arpi
parents: 9300
diff changeset
58 #endif
d275152390ee I've found some time to implement the encoding support for the new
arpi
parents: 9300
diff changeset
59
d275152390ee I've found some time to implement the encoding support for the new
arpi
parents: 9300
diff changeset
60 #if ENCORE_MAJOR_VERSION >= 5200
d275152390ee I've found some time to implement the encoding support for the new
arpi
parents: 9300
diff changeset
61 SETTINGS divx4_param;
d275152390ee I've found some time to implement the encoding support for the new
arpi
parents: 9300
diff changeset
62 #else
5550
7d1dfb59c6c0 encoders
arpi
parents:
diff changeset
63 ENC_PARAM divx4_param;
10252
d275152390ee I've found some time to implement the encoding support for the new
arpi
parents: 9300
diff changeset
64 #endif
5550
7d1dfb59c6c0 encoders
arpi
parents:
diff changeset
65 int divx4_crispness;
7332
dd32b0c95c95 Code to XviD VBR Library from transcode.
kmkaplan
parents: 7127
diff changeset
66 #ifdef HAVE_XVID_VBR
dd32b0c95c95 Code to XviD VBR Library from transcode.
kmkaplan
parents: 7127
diff changeset
67 static int vbrpass = -1;
dd32b0c95c95 Code to XviD VBR Library from transcode.
kmkaplan
parents: 7127
diff changeset
68 static int vbrdebug = 0;
dd32b0c95c95 Code to XviD VBR Library from transcode.
kmkaplan
parents: 7127
diff changeset
69 #endif
5550
7d1dfb59c6c0 encoders
arpi
parents:
diff changeset
70
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: 10252
diff changeset
71 #include "m_option.h"
5550
7d1dfb59c6c0 encoders
arpi
parents:
diff changeset
72
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: 10252
diff changeset
73 m_option_t divx4opts_conf[]={
8032
136e7e515764 removed -pass nonsense from mencoder! it's now a suboption to -divx4opts
rfelker
parents: 7368
diff changeset
74 {"pass", &pass, CONF_TYPE_INT, CONF_RANGE,0,2, NULL},
5550
7d1dfb59c6c0 encoders
arpi
parents:
diff changeset
75 {"br", &divx4_param.bitrate, CONF_TYPE_INT, CONF_RANGE, 4, 24000000, NULL},
10252
d275152390ee I've found some time to implement the encoding support for the new
arpi
parents: 9300
diff changeset
76 #if ENCORE_MAJOR_VERSION < 5200
5550
7d1dfb59c6c0 encoders
arpi
parents:
diff changeset
77 {"rc_period", &divx4_param.rc_period, CONF_TYPE_INT, 0,0,0, NULL},
7d1dfb59c6c0 encoders
arpi
parents:
diff changeset
78 {"rc_reaction_period", &divx4_param.rc_reaction_period, CONF_TYPE_INT, 0,0,0, NULL},
7d1dfb59c6c0 encoders
arpi
parents:
diff changeset
79 {"rc_reaction_ratio", &divx4_param.rc_reaction_ratio, CONF_TYPE_INT, 0,0,0, NULL},
7d1dfb59c6c0 encoders
arpi
parents:
diff changeset
80 {"min_quant", &divx4_param.min_quantizer, CONF_TYPE_INT, CONF_RANGE,0,32, NULL},
7d1dfb59c6c0 encoders
arpi
parents:
diff changeset
81 {"max_quant", &divx4_param.max_quantizer, CONF_TYPE_INT, CONF_RANGE,0,32, NULL},
10252
d275152390ee I've found some time to implement the encoding support for the new
arpi
parents: 9300
diff changeset
82 #endif
5550
7d1dfb59c6c0 encoders
arpi
parents:
diff changeset
83 {"key", &divx4_param.max_key_interval, CONF_TYPE_INT, CONF_MIN,0,0, NULL},
7d1dfb59c6c0 encoders
arpi
parents:
diff changeset
84 {"deinterlace", &divx4_param.deinterlace, CONF_TYPE_FLAG, 0,0,1, NULL},
7d1dfb59c6c0 encoders
arpi
parents:
diff changeset
85 {"q", &divx4_param.quality, CONF_TYPE_INT, CONF_RANGE, 1, 5, NULL},
7d1dfb59c6c0 encoders
arpi
parents:
diff changeset
86 {"crispness", &divx4_crispness, CONF_TYPE_INT, CONF_RANGE,0,100, NULL},
5854
3a961eaf45b9 divx5.1 features added
arpi
parents: 5706
diff changeset
87 #if ENCORE_MAJOR_VERSION >= 5010
10252
d275152390ee I've found some time to implement the encoding support for the new
arpi
parents: 9300
diff changeset
88 #if ENCORE_MAJOR_VERSION >= 5200
d275152390ee I've found some time to implement the encoding support for the new
arpi
parents: 9300
diff changeset
89 /* rate control modes:
d275152390ee I've found some time to implement the encoding support for the new
arpi
parents: 9300
diff changeset
90 0 (VBV 1-pass)
d275152390ee I've found some time to implement the encoding support for the new
arpi
parents: 9300
diff changeset
91 1 (1-pass constant quality)
d275152390ee I've found some time to implement the encoding support for the new
arpi
parents: 9300
diff changeset
92 2 (VBV multipass 1st-pass)
d275152390ee I've found some time to implement the encoding support for the new
arpi
parents: 9300
diff changeset
93 3 (VBV multipass nth-pass)
d275152390ee I've found some time to implement the encoding support for the new
arpi
parents: 9300
diff changeset
94 4 (original 1-pass)
d275152390ee I've found some time to implement the encoding support for the new
arpi
parents: 9300
diff changeset
95 5 (original 1st pass)
d275152390ee I've found some time to implement the encoding support for the new
arpi
parents: 9300
diff changeset
96 6 (original 2nd pass)
d275152390ee I've found some time to implement the encoding support for the new
arpi
parents: 9300
diff changeset
97 7 (1-pass constant frame size)
d275152390ee I've found some time to implement the encoding support for the new
arpi
parents: 9300
diff changeset
98 */
d275152390ee I've found some time to implement the encoding support for the new
arpi
parents: 9300
diff changeset
99 {"vbr", &divx4_param.vbr_mode, CONF_TYPE_INT, CONF_RANGE,0,7, NULL},
d275152390ee I've found some time to implement the encoding support for the new
arpi
parents: 9300
diff changeset
100 {"bidirect", &divx4_param.use_bidirect, CONF_TYPE_FLAG, 0,0,1, NULL},
d275152390ee I've found some time to implement the encoding support for the new
arpi
parents: 9300
diff changeset
101 {"key_frame_threshold", &divx4_param.key_frame_threshold, CONF_TYPE_INT, CONF_RANGE,1,100, NULL},
d275152390ee I've found some time to implement the encoding support for the new
arpi
parents: 9300
diff changeset
102 /* default values from the DivX Help Guide:
d275152390ee I've found some time to implement the encoding support for the new
arpi
parents: 9300
diff changeset
103 bitrate size occupancy
d275152390ee I've found some time to implement the encoding support for the new
arpi
parents: 9300
diff changeset
104 128000 262144 196608 (Handheld)
d275152390ee I've found some time to implement the encoding support for the new
arpi
parents: 9300
diff changeset
105 768000 1048576 786432 (Portable)
d275152390ee I've found some time to implement the encoding support for the new
arpi
parents: 9300
diff changeset
106 4000000 3145728 2359296 (Home Theatre)
d275152390ee I've found some time to implement the encoding support for the new
arpi
parents: 9300
diff changeset
107 8000000 6291456 4718592 (High Definition)
d275152390ee I've found some time to implement the encoding support for the new
arpi
parents: 9300
diff changeset
108 Do not mess with these values unless you are absolutely sure of what you are doing!
d275152390ee I've found some time to implement the encoding support for the new
arpi
parents: 9300
diff changeset
109 */
d275152390ee I've found some time to implement the encoding support for the new
arpi
parents: 9300
diff changeset
110 {"vbv_bitrate", &divx4_param.vbv_bitrate, CONF_TYPE_INT, 0,0,0, NULL},
d275152390ee I've found some time to implement the encoding support for the new
arpi
parents: 9300
diff changeset
111 {"vbv_size", &divx4_param.vbv_size, CONF_TYPE_INT, 0,0,0, NULL},
d275152390ee I've found some time to implement the encoding support for the new
arpi
parents: 9300
diff changeset
112 {"vbv_occupancy", &divx4_param.vbv_occupancy, CONF_TYPE_INT, 0,0,0, NULL},
d275152390ee I've found some time to implement the encoding support for the new
arpi
parents: 9300
diff changeset
113 {"complexity", &divx4_param.complexity_modulation, CONF_TYPE_FLOAT, CONF_RANGE,0.0,1.0, NULL},
d275152390ee I've found some time to implement the encoding support for the new
arpi
parents: 9300
diff changeset
114 {"readlog", &divx4_param.log_file_read, CONF_TYPE_STRING, 0,0,1, NULL},
d275152390ee I've found some time to implement the encoding support for the new
arpi
parents: 9300
diff changeset
115 {"writelog", &divx4_param.log_file_write, CONF_TYPE_STRING, 0,0,1, NULL},
d275152390ee I've found some time to implement the encoding support for the new
arpi
parents: 9300
diff changeset
116 {"mv_file", &divx4_param.mv_file, CONF_TYPE_STRING, 0,0,1, NULL},
d275152390ee I've found some time to implement the encoding support for the new
arpi
parents: 9300
diff changeset
117 {"data_partitioning", &divx4_param.data_partitioning, CONF_TYPE_FLAG, 0,0,1, NULL},
d275152390ee I've found some time to implement the encoding support for the new
arpi
parents: 9300
diff changeset
118 {"qpel", &divx4_param.quarter_pel, CONF_TYPE_FLAG, 0,0,1, NULL},
d275152390ee I've found some time to implement the encoding support for the new
arpi
parents: 9300
diff changeset
119 {"gmc", &divx4_param.use_gmc, CONF_TYPE_FLAG, 0,0,1, NULL},
d275152390ee I've found some time to implement the encoding support for the new
arpi
parents: 9300
diff changeset
120 {"pv", &divx4_param.psychovisual, CONF_TYPE_FLAG, 0,0,1, NULL},
d275152390ee I've found some time to implement the encoding support for the new
arpi
parents: 9300
diff changeset
121 {"pv_strength_frame", &divx4_param.pv_strength_frame, CONF_TYPE_FLOAT, CONF_RANGE,0.0,1.0, NULL},
d275152390ee I've found some time to implement the encoding support for the new
arpi
parents: 9300
diff changeset
122 {"pv_strength_MB", &divx4_param.pv_strength_MB, CONF_TYPE_FLOAT, CONF_RANGE,0.0,1.0, NULL},
d275152390ee I've found some time to implement the encoding support for the new
arpi
parents: 9300
diff changeset
123 {"interlace_mode", &divx4_param.interlace_mode, CONF_TYPE_INT, CONF_RANGE,0,3, NULL},
d275152390ee I've found some time to implement the encoding support for the new
arpi
parents: 9300
diff changeset
124 {"crop", &divx4_param.enable_crop, CONF_TYPE_FLAG, 0,0,1, NULL},
d275152390ee I've found some time to implement the encoding support for the new
arpi
parents: 9300
diff changeset
125 {"resize", &divx4_param.enable_resize, CONF_TYPE_FLAG, 0,0,1, NULL},
d275152390ee I've found some time to implement the encoding support for the new
arpi
parents: 9300
diff changeset
126 {"width", &divx4_param.resize_width, CONF_TYPE_INT, 0,0,0, NULL},
d275152390ee I've found some time to implement the encoding support for the new
arpi
parents: 9300
diff changeset
127 {"height", &divx4_param.resize_height, CONF_TYPE_INT, 0,0,0, NULL},
d275152390ee I've found some time to implement the encoding support for the new
arpi
parents: 9300
diff changeset
128 {"left", &divx4_param.crop_left, CONF_TYPE_INT, 0,0,0, NULL},
d275152390ee I've found some time to implement the encoding support for the new
arpi
parents: 9300
diff changeset
129 {"right", &divx4_param.crop_right, CONF_TYPE_INT, 0,0,0, NULL},
d275152390ee I've found some time to implement the encoding support for the new
arpi
parents: 9300
diff changeset
130 {"top", &divx4_param.crop_top, CONF_TYPE_INT, 0,0,0, NULL},
d275152390ee I've found some time to implement the encoding support for the new
arpi
parents: 9300
diff changeset
131 {"bottom", &divx4_param.crop_bottom, CONF_TYPE_INT, 0,0,0, NULL},
d275152390ee I've found some time to implement the encoding support for the new
arpi
parents: 9300
diff changeset
132 {"resize_mode", &divx4_param.resize_mode, CONF_TYPE_FLAG, 0,0,1, NULL},
d275152390ee I've found some time to implement the encoding support for the new
arpi
parents: 9300
diff changeset
133 {"temporal", &divx4_param.temporal_enable, CONF_TYPE_FLAG, 0,0,1, NULL},
d275152390ee I've found some time to implement the encoding support for the new
arpi
parents: 9300
diff changeset
134 {"spatial", &divx4_param.spatial_passes, CONF_TYPE_INT, CONF_RANGE,0,3, NULL},
d275152390ee I've found some time to implement the encoding support for the new
arpi
parents: 9300
diff changeset
135 {"temporal_level", &divx4_param.temporal_level, CONF_TYPE_FLOAT, CONF_RANGE,0.0,1.0, NULL},
d275152390ee I've found some time to implement the encoding support for the new
arpi
parents: 9300
diff changeset
136 {"spatial_level", &divx4_param.spatial_level, CONF_TYPE_FLOAT, CONF_RANGE,0.0,1.0, NULL},
d275152390ee I've found some time to implement the encoding support for the new
arpi
parents: 9300
diff changeset
137 #else
5854
3a961eaf45b9 divx5.1 features added
arpi
parents: 5706
diff changeset
138 {"bidirect", &divx4_param.extensions.use_bidirect, CONF_TYPE_FLAG, 0,0,1, NULL},
3a961eaf45b9 divx5.1 features added
arpi
parents: 5706
diff changeset
139 {"obmc", &divx4_param.extensions.obmc, CONF_TYPE_FLAG, 0,0,1, NULL},
3a961eaf45b9 divx5.1 features added
arpi
parents: 5706
diff changeset
140 {"data_partitioning", &divx4_param.extensions.data_partitioning, CONF_TYPE_FLAG, 0,0,1, NULL},
10252
d275152390ee I've found some time to implement the encoding support for the new
arpi
parents: 9300
diff changeset
141 // {"mpeg2", &divx4_param.extensions.mpeg2_quant, CONF_TYPE_FLAG, 0,0,1, NULL},
5854
3a961eaf45b9 divx5.1 features added
arpi
parents: 5706
diff changeset
142 {"qpel", &divx4_param.extensions.quarter_pel, CONF_TYPE_FLAG, 0,0,1, NULL},
3a961eaf45b9 divx5.1 features added
arpi
parents: 5706
diff changeset
143 {"intra_frame_threshold", &divx4_param.extensions.intra_frame_threshold, CONF_TYPE_INT, CONF_RANGE,1,100, NULL},
3a961eaf45b9 divx5.1 features added
arpi
parents: 5706
diff changeset
144 {"psychovisual", &divx4_param.extensions.psychovisual, CONF_TYPE_FLAG, 0,0,1, NULL},
10252
d275152390ee I've found some time to implement the encoding support for the new
arpi
parents: 9300
diff changeset
145 {"pv", &divx4_param.extensions.psychovisual, CONF_TYPE_FLAG, 0,0,1, NULL},
d275152390ee I've found some time to implement the encoding support for the new
arpi
parents: 9300
diff changeset
146 {"pv_strength_frame", &divx4_param.extensions.pv_strength_frame, CONF_TYPE_FLOAT, CONF_RANGE,0.0,1.0, NULL},
d275152390ee I've found some time to implement the encoding support for the new
arpi
parents: 9300
diff changeset
147 {"pv_strength_MB", &divx4_param.extensions.pv_strength_MB, CONF_TYPE_FLOAT, CONF_RANGE,0.0,1.0, NULL},
5854
3a961eaf45b9 divx5.1 features added
arpi
parents: 5706
diff changeset
148 {"testing_param", &divx4_param.extensions.testing_param, CONF_TYPE_FLAG, 0,0,1, NULL},
3a961eaf45b9 divx5.1 features added
arpi
parents: 5706
diff changeset
149 {"gmc", &divx4_param.extensions.use_gmc, CONF_TYPE_FLAG, 0,0,1, NULL},
3a961eaf45b9 divx5.1 features added
arpi
parents: 5706
diff changeset
150 {"interlace_mode", &divx4_param.extensions.interlace_mode, CONF_TYPE_INT, CONF_RANGE,0,2, NULL},
10252
d275152390ee I've found some time to implement the encoding support for the new
arpi
parents: 9300
diff changeset
151 {"crop", &divx4_param.extensions.enable_crop, CONF_TYPE_FLAG, 0,0,1, NULL},
d275152390ee I've found some time to implement the encoding support for the new
arpi
parents: 9300
diff changeset
152 {"resize", &divx4_param.extensions.enable_resize, CONF_TYPE_FLAG, 0,0,1, NULL},
d275152390ee I've found some time to implement the encoding support for the new
arpi
parents: 9300
diff changeset
153 {"width", &divx4_param.extensions.resize_width, CONF_TYPE_INT, 0,0,0, NULL},
d275152390ee I've found some time to implement the encoding support for the new
arpi
parents: 9300
diff changeset
154 {"height", &divx4_param.extensions.resize_height, CONF_TYPE_INT, 0,0,0, NULL},
d275152390ee I've found some time to implement the encoding support for the new
arpi
parents: 9300
diff changeset
155 {"left", &divx4_param.extensions.crop_left, CONF_TYPE_INT, 0,0,0, NULL},
d275152390ee I've found some time to implement the encoding support for the new
arpi
parents: 9300
diff changeset
156 {"right", &divx4_param.extensions.crop_right, CONF_TYPE_INT, 0,0,0, NULL},
d275152390ee I've found some time to implement the encoding support for the new
arpi
parents: 9300
diff changeset
157 {"top", &divx4_param.extensions.crop_top, CONF_TYPE_INT, 0,0,0, NULL},
d275152390ee I've found some time to implement the encoding support for the new
arpi
parents: 9300
diff changeset
158 {"bottom", &divx4_param.extensions.crop_bottom, CONF_TYPE_INT, 0,0,0, NULL},
d275152390ee I've found some time to implement the encoding support for the new
arpi
parents: 9300
diff changeset
159 {"resize_mode", &divx4_param.extensions.resize_mode, CONF_TYPE_FLAG, 0,0,1, NULL},
5854
3a961eaf45b9 divx5.1 features added
arpi
parents: 5706
diff changeset
160 {"temporal", &divx4_param.extensions.temporal_enable, CONF_TYPE_FLAG, 0,0,1, NULL},
10252
d275152390ee I've found some time to implement the encoding support for the new
arpi
parents: 9300
diff changeset
161 {"spatial", &divx4_param.extensions.spatial_passes, CONF_TYPE_INT, CONF_RANGE,0,3, NULL},
d275152390ee I've found some time to implement the encoding support for the new
arpi
parents: 9300
diff changeset
162 {"temporal_level", &divx4_param.extensions.temporal_level, CONF_TYPE_FLOAT, CONF_RANGE,0.0,1.0, NULL},
d275152390ee I've found some time to implement the encoding support for the new
arpi
parents: 9300
diff changeset
163 {"spatial_level", &divx4_param.extensions.spatial_level, CONF_TYPE_FLOAT, CONF_RANGE,0.0,1.0, NULL},
5854
3a961eaf45b9 divx5.1 features added
arpi
parents: 5706
diff changeset
164 {"mv_file", &divx4_param.extensions.mv_file, CONF_TYPE_STRING, 0,0,1, NULL},
3a961eaf45b9 divx5.1 features added
arpi
parents: 5706
diff changeset
165 #endif
10252
d275152390ee I've found some time to implement the encoding support for the new
arpi
parents: 9300
diff changeset
166 #endif
7332
dd32b0c95c95 Code to XviD VBR Library from transcode.
kmkaplan
parents: 7127
diff changeset
167 #ifdef HAVE_XVID_VBR
dd32b0c95c95 Code to XviD VBR Library from transcode.
kmkaplan
parents: 7127
diff changeset
168 {"vbrpass", &vbrpass, CONF_TYPE_INT, CONF_RANGE, 0, 2, NULL},
dd32b0c95c95 Code to XviD VBR Library from transcode.
kmkaplan
parents: 7127
diff changeset
169 {"vbrdebug", &vbrdebug, CONF_TYPE_INT, CONF_RANGE, 0, 1, NULL},
dd32b0c95c95 Code to XviD VBR Library from transcode.
kmkaplan
parents: 7127
diff changeset
170 #endif
5550
7d1dfb59c6c0 encoders
arpi
parents:
diff changeset
171 {"help", "TODO: divx4opts help!\n", CONF_TYPE_PRINT, CONF_NOCFG, 0, 0, NULL},
7d1dfb59c6c0 encoders
arpi
parents:
diff changeset
172 {NULL, NULL, 0, 0, 0, 0, NULL}
7d1dfb59c6c0 encoders
arpi
parents:
diff changeset
173 };
7d1dfb59c6c0 encoders
arpi
parents:
diff changeset
174
7d1dfb59c6c0 encoders
arpi
parents:
diff changeset
175 struct vf_priv_s {
8585
27da710563c2 the long-waited MUXER layer, and new MPEG-PS muxer
arpi
parents: 8032
diff changeset
176 muxer_stream_t* mux;
5550
7d1dfb59c6c0 encoders
arpi
parents:
diff changeset
177 ENC_RESULT enc_result;
7d1dfb59c6c0 encoders
arpi
parents:
diff changeset
178 ENC_FRAME enc_frame;
7d1dfb59c6c0 encoders
arpi
parents:
diff changeset
179 void* enc_handle;
7332
dd32b0c95c95 Code to XviD VBR Library from transcode.
kmkaplan
parents: 7127
diff changeset
180 #ifdef HAVE_XVID_VBR
dd32b0c95c95 Code to XviD VBR Library from transcode.
kmkaplan
parents: 7127
diff changeset
181 vbr_control_t vbr_state;
dd32b0c95c95 Code to XviD VBR Library from transcode.
kmkaplan
parents: 7127
diff changeset
182 #endif
5550
7d1dfb59c6c0 encoders
arpi
parents:
diff changeset
183 };
7d1dfb59c6c0 encoders
arpi
parents:
diff changeset
184
7d1dfb59c6c0 encoders
arpi
parents:
diff changeset
185 #define mux_v (vf->priv->mux)
7d1dfb59c6c0 encoders
arpi
parents:
diff changeset
186
7d1dfb59c6c0 encoders
arpi
parents:
diff changeset
187 static int config(struct vf_instance_s* vf,
7d1dfb59c6c0 encoders
arpi
parents:
diff changeset
188 int width, int height, int d_width, int d_height,
7d1dfb59c6c0 encoders
arpi
parents:
diff changeset
189 unsigned int flags, unsigned int outfmt){
7d1dfb59c6c0 encoders
arpi
parents:
diff changeset
190
10252
d275152390ee I've found some time to implement the encoding support for the new
arpi
parents: 9300
diff changeset
191 #if ENCORE_MAJOR_VERSION >= 5200
d275152390ee I've found some time to implement the encoding support for the new
arpi
parents: 9300
diff changeset
192 DivXBitmapInfoHeader format;
d275152390ee I've found some time to implement the encoding support for the new
arpi
parents: 9300
diff changeset
193 char profile = (char) encore(0, ENC_OPT_PROFILE, 0, 0);
d275152390ee I've found some time to implement the encoding support for the new
arpi
parents: 9300
diff changeset
194
d275152390ee I've found some time to implement the encoding support for the new
arpi
parents: 9300
diff changeset
195 mp_msg(MSGT_MENCODER, MSGL_INFO, "encoder binary profile: %c\n", profile);
d275152390ee I've found some time to implement the encoding support for the new
arpi
parents: 9300
diff changeset
196
d275152390ee I've found some time to implement the encoding support for the new
arpi
parents: 9300
diff changeset
197 if((pass <= 1 && (divx4_param.vbr_mode == RCMODE_VBV_MULTIPASS_NTH ||
d275152390ee I've found some time to implement the encoding support for the new
arpi
parents: 9300
diff changeset
198 divx4_param.vbr_mode == RCMODE_502_2PASS_2ND)) ||
d275152390ee I've found some time to implement the encoding support for the new
arpi
parents: 9300
diff changeset
199 (pass == 2 && (divx4_param.vbr_mode == RCMODE_VBV_1PASS ||
d275152390ee I've found some time to implement the encoding support for the new
arpi
parents: 9300
diff changeset
200 divx4_param.vbr_mode == RCMODE_1PASS_CONSTANT_Q ||
d275152390ee I've found some time to implement the encoding support for the new
arpi
parents: 9300
diff changeset
201 divx4_param.vbr_mode == RCMODE_VBV_MULTIPASS_1ST ||
d275152390ee I've found some time to implement the encoding support for the new
arpi
parents: 9300
diff changeset
202 divx4_param.vbr_mode == RCMODE_502_1PASS ||
d275152390ee I've found some time to implement the encoding support for the new
arpi
parents: 9300
diff changeset
203 divx4_param.vbr_mode == RCMODE_502_2PASS_1ST ||
d275152390ee I've found some time to implement the encoding support for the new
arpi
parents: 9300
diff changeset
204 divx4_param.vbr_mode == RCMODE_IMAGE_COMPRESS))) {
d275152390ee I've found some time to implement the encoding support for the new
arpi
parents: 9300
diff changeset
205 mp_msg(MSGT_MENCODER, MSGL_ERR, "pass (%i) and rate control mode (%i) doesn't match, please consult encore2.h\n",
d275152390ee I've found some time to implement the encoding support for the new
arpi
parents: 9300
diff changeset
206 pass, divx4_param.vbr_mode);
d275152390ee I've found some time to implement the encoding support for the new
arpi
parents: 9300
diff changeset
207 abort();
d275152390ee I've found some time to implement the encoding support for the new
arpi
parents: 9300
diff changeset
208 }
d275152390ee I've found some time to implement the encoding support for the new
arpi
parents: 9300
diff changeset
209 #endif
d275152390ee I've found some time to implement the encoding support for the new
arpi
parents: 9300
diff changeset
210
5550
7d1dfb59c6c0 encoders
arpi
parents:
diff changeset
211 mux_v->bih->biWidth=width;
7d1dfb59c6c0 encoders
arpi
parents:
diff changeset
212 mux_v->bih->biHeight=height;
10252
d275152390ee I've found some time to implement the encoding support for the new
arpi
parents: 9300
diff changeset
213 mux_v->bih->biSizeImage=width*height*3;
5550
7d1dfb59c6c0 encoders
arpi
parents:
diff changeset
214
7d1dfb59c6c0 encoders
arpi
parents:
diff changeset
215 if(!divx4_param.bitrate) divx4_param.bitrate=800000;
7d1dfb59c6c0 encoders
arpi
parents:
diff changeset
216 else if(divx4_param.bitrate<=16000) divx4_param.bitrate*=1000;
7d1dfb59c6c0 encoders
arpi
parents:
diff changeset
217 if(!divx4_param.quality) divx4_param.quality=5; // the quality of compression ( 1 - fastest, 5 - best )
7d1dfb59c6c0 encoders
arpi
parents:
diff changeset
218
10252
d275152390ee I've found some time to implement the encoding support for the new
arpi
parents: 9300
diff changeset
219 #if ENCORE_MAJOR_VERSION >= 5200
d275152390ee I've found some time to implement the encoding support for the new
arpi
parents: 9300
diff changeset
220 format.biSize=sizeof(DivXBitmapInfoHeader);
d275152390ee I've found some time to implement the encoding support for the new
arpi
parents: 9300
diff changeset
221 format.biWidth=width;
d275152390ee I've found some time to implement the encoding support for the new
arpi
parents: 9300
diff changeset
222 format.biHeight=height;
d275152390ee I've found some time to implement the encoding support for the new
arpi
parents: 9300
diff changeset
223 format.biSizeImage=mux_v->bih->biSizeImage;
d275152390ee I've found some time to implement the encoding support for the new
arpi
parents: 9300
diff changeset
224 if(divx4_param.vbv_bitrate > 0) {
d275152390ee I've found some time to implement the encoding support for the new
arpi
parents: 9300
diff changeset
225 divx4_param.vbv_bitrate = ((divx4_param.vbv_bitrate - 1) / 400 + 1) * 400;
d275152390ee I've found some time to implement the encoding support for the new
arpi
parents: 9300
diff changeset
226 divx4_param.vbv_size = ((divx4_param.vbv_size - 1) / 16384 + 1) * 16384;
d275152390ee I've found some time to implement the encoding support for the new
arpi
parents: 9300
diff changeset
227 divx4_param.vbv_occupancy = ((divx4_param.vbv_occupancy - 1) / 64 + 1) * 64;
d275152390ee I've found some time to implement the encoding support for the new
arpi
parents: 9300
diff changeset
228 }
d275152390ee I've found some time to implement the encoding support for the new
arpi
parents: 9300
diff changeset
229 #else
d275152390ee I've found some time to implement the encoding support for the new
arpi
parents: 9300
diff changeset
230 divx4_param.x_dim=width;
d275152390ee I've found some time to implement the encoding support for the new
arpi
parents: 9300
diff changeset
231 divx4_param.y_dim=height;
d275152390ee I've found some time to implement the encoding support for the new
arpi
parents: 9300
diff changeset
232 divx4_param.framerate=(float)mux_v->h.dwRate/mux_v->h.dwScale;
5551
73978162b6a1 soem fixes
arpi
parents: 5550
diff changeset
233 // set some usefull defaults:
73978162b6a1 soem fixes
arpi
parents: 5550
diff changeset
234 if(!divx4_param.min_quantizer) divx4_param.min_quantizer=2;
73978162b6a1 soem fixes
arpi
parents: 5550
diff changeset
235 if(!divx4_param.max_quantizer) divx4_param.max_quantizer=31;
73978162b6a1 soem fixes
arpi
parents: 5550
diff changeset
236 if(!divx4_param.rc_period) divx4_param.rc_period=2000;
73978162b6a1 soem fixes
arpi
parents: 5550
diff changeset
237 if(!divx4_param.rc_reaction_period) divx4_param.rc_reaction_period=10;
73978162b6a1 soem fixes
arpi
parents: 5550
diff changeset
238 if(!divx4_param.rc_reaction_ratio) divx4_param.rc_reaction_ratio=20;
10252
d275152390ee I've found some time to implement the encoding support for the new
arpi
parents: 9300
diff changeset
239 #endif
5551
73978162b6a1 soem fixes
arpi
parents: 5550
diff changeset
240
7332
dd32b0c95c95 Code to XviD VBR Library from transcode.
kmkaplan
parents: 7127
diff changeset
241 #ifdef HAVE_XVID_VBR
dd32b0c95c95 Code to XviD VBR Library from transcode.
kmkaplan
parents: 7127
diff changeset
242 if (vbrpass >= 0) {
dd32b0c95c95 Code to XviD VBR Library from transcode.
kmkaplan
parents: 7127
diff changeset
243 vbrSetDefaults(&vf->priv->vbr_state);
dd32b0c95c95 Code to XviD VBR Library from transcode.
kmkaplan
parents: 7127
diff changeset
244 vf->priv->vbr_state.desired_bitrate = divx4_param.bitrate;
dd32b0c95c95 Code to XviD VBR Library from transcode.
kmkaplan
parents: 7127
diff changeset
245 switch (vbrpass) {
dd32b0c95c95 Code to XviD VBR Library from transcode.
kmkaplan
parents: 7127
diff changeset
246 case 0:
dd32b0c95c95 Code to XviD VBR Library from transcode.
kmkaplan
parents: 7127
diff changeset
247 vf->priv->vbr_state.mode = VBR_MODE_1PASS;
dd32b0c95c95 Code to XviD VBR Library from transcode.
kmkaplan
parents: 7127
diff changeset
248 break;
dd32b0c95c95 Code to XviD VBR Library from transcode.
kmkaplan
parents: 7127
diff changeset
249 case 1:
dd32b0c95c95 Code to XviD VBR Library from transcode.
kmkaplan
parents: 7127
diff changeset
250 vf->priv->vbr_state.mode = VBR_MODE_2PASS_1;
dd32b0c95c95 Code to XviD VBR Library from transcode.
kmkaplan
parents: 7127
diff changeset
251 break;
dd32b0c95c95 Code to XviD VBR Library from transcode.
kmkaplan
parents: 7127
diff changeset
252 case 2:
dd32b0c95c95 Code to XviD VBR Library from transcode.
kmkaplan
parents: 7127
diff changeset
253 vf->priv->vbr_state.mode = VBR_MODE_2PASS_2;
dd32b0c95c95 Code to XviD VBR Library from transcode.
kmkaplan
parents: 7127
diff changeset
254 break;
dd32b0c95c95 Code to XviD VBR Library from transcode.
kmkaplan
parents: 7127
diff changeset
255 default:
dd32b0c95c95 Code to XviD VBR Library from transcode.
kmkaplan
parents: 7127
diff changeset
256 abort();
dd32b0c95c95 Code to XviD VBR Library from transcode.
kmkaplan
parents: 7127
diff changeset
257 }
dd32b0c95c95 Code to XviD VBR Library from transcode.
kmkaplan
parents: 7127
diff changeset
258 vf->priv->vbr_state.debug = vbrdebug;
dd32b0c95c95 Code to XviD VBR Library from transcode.
kmkaplan
parents: 7127
diff changeset
259 if (vbrInit(&vf->priv->vbr_state) == -1)
dd32b0c95c95 Code to XviD VBR Library from transcode.
kmkaplan
parents: 7127
diff changeset
260 abort();
dd32b0c95c95 Code to XviD VBR Library from transcode.
kmkaplan
parents: 7127
diff changeset
261 /* XXX - kludge to workaround some DivX encoder limitations */
dd32b0c95c95 Code to XviD VBR Library from transcode.
kmkaplan
parents: 7127
diff changeset
262 if (vf->priv->vbr_state.mode != VBR_MODE_2PASS_2)
dd32b0c95c95 Code to XviD VBR Library from transcode.
kmkaplan
parents: 7127
diff changeset
263 divx4_param.min_quantizer = divx4_param.max_quantizer = vbrGetQuant(&vf->priv->vbr_state);
dd32b0c95c95 Code to XviD VBR Library from transcode.
kmkaplan
parents: 7127
diff changeset
264 }
dd32b0c95c95 Code to XviD VBR Library from transcode.
kmkaplan
parents: 7127
diff changeset
265 #endif
dd32b0c95c95 Code to XviD VBR Library from transcode.
kmkaplan
parents: 7127
diff changeset
266
10252
d275152390ee I've found some time to implement the encoding support for the new
arpi
parents: 9300
diff changeset
267 #if ENCORE_MAJOR_VERSION >= 5200
d275152390ee I've found some time to implement the encoding support for the new
arpi
parents: 9300
diff changeset
268 switch(outfmt){
d275152390ee I've found some time to implement the encoding support for the new
arpi
parents: 9300
diff changeset
269 case IMGFMT_YV12: {
d275152390ee I've found some time to implement the encoding support for the new
arpi
parents: 9300
diff changeset
270 format.biCompression=mmioFOURCC('Y','V','1','2');
d275152390ee I've found some time to implement the encoding support for the new
arpi
parents: 9300
diff changeset
271 break;
d275152390ee I've found some time to implement the encoding support for the new
arpi
parents: 9300
diff changeset
272 }
d275152390ee I've found some time to implement the encoding support for the new
arpi
parents: 9300
diff changeset
273 case IMGFMT_IYUV: {
d275152390ee I've found some time to implement the encoding support for the new
arpi
parents: 9300
diff changeset
274 format.biCompression=mmioFOURCC('I','Y','U','V');
d275152390ee I've found some time to implement the encoding support for the new
arpi
parents: 9300
diff changeset
275 break;
d275152390ee I've found some time to implement the encoding support for the new
arpi
parents: 9300
diff changeset
276 }
d275152390ee I've found some time to implement the encoding support for the new
arpi
parents: 9300
diff changeset
277 case IMGFMT_I420: {
d275152390ee I've found some time to implement the encoding support for the new
arpi
parents: 9300
diff changeset
278 format.biCompression=mmioFOURCC('I','4','2','0');
d275152390ee I've found some time to implement the encoding support for the new
arpi
parents: 9300
diff changeset
279 break;
d275152390ee I've found some time to implement the encoding support for the new
arpi
parents: 9300
diff changeset
280 }
d275152390ee I've found some time to implement the encoding support for the new
arpi
parents: 9300
diff changeset
281 case IMGFMT_YUY2: {
d275152390ee I've found some time to implement the encoding support for the new
arpi
parents: 9300
diff changeset
282 format.biCompression=mmioFOURCC('Y','U','Y','2');
d275152390ee I've found some time to implement the encoding support for the new
arpi
parents: 9300
diff changeset
283 break;
d275152390ee I've found some time to implement the encoding support for the new
arpi
parents: 9300
diff changeset
284 }
d275152390ee I've found some time to implement the encoding support for the new
arpi
parents: 9300
diff changeset
285 case IMGFMT_V422: {
d275152390ee I've found some time to implement the encoding support for the new
arpi
parents: 9300
diff changeset
286 format.biCompression=mmioFOURCC('V','4','2','2');
d275152390ee I've found some time to implement the encoding support for the new
arpi
parents: 9300
diff changeset
287 break;
d275152390ee I've found some time to implement the encoding support for the new
arpi
parents: 9300
diff changeset
288 }
d275152390ee I've found some time to implement the encoding support for the new
arpi
parents: 9300
diff changeset
289 case IMGFMT_UYVY: {
d275152390ee I've found some time to implement the encoding support for the new
arpi
parents: 9300
diff changeset
290 format.biCompression=mmioFOURCC('U','Y','V','Y');
d275152390ee I've found some time to implement the encoding support for the new
arpi
parents: 9300
diff changeset
291 break;
d275152390ee I've found some time to implement the encoding support for the new
arpi
parents: 9300
diff changeset
292 }
d275152390ee I've found some time to implement the encoding support for the new
arpi
parents: 9300
diff changeset
293 case IMGFMT_YVYU: {
d275152390ee I've found some time to implement the encoding support for the new
arpi
parents: 9300
diff changeset
294 format.biCompression=mmioFOURCC('Y','V','Y','U');
d275152390ee I've found some time to implement the encoding support for the new
arpi
parents: 9300
diff changeset
295 break;
d275152390ee I've found some time to implement the encoding support for the new
arpi
parents: 9300
diff changeset
296 }
d275152390ee I've found some time to implement the encoding support for the new
arpi
parents: 9300
diff changeset
297 case IMGFMT_BGR24: {
d275152390ee I've found some time to implement the encoding support for the new
arpi
parents: 9300
diff changeset
298 format.biCompression=0;
d275152390ee I've found some time to implement the encoding support for the new
arpi
parents: 9300
diff changeset
299 format.biBitCount=24;
d275152390ee I've found some time to implement the encoding support for the new
arpi
parents: 9300
diff changeset
300 break;
d275152390ee I've found some time to implement the encoding support for the new
arpi
parents: 9300
diff changeset
301 }
d275152390ee I've found some time to implement the encoding support for the new
arpi
parents: 9300
diff changeset
302 case IMGFMT_BGR32: {
d275152390ee I've found some time to implement the encoding support for the new
arpi
parents: 9300
diff changeset
303 format.biCompression=0;
d275152390ee I've found some time to implement the encoding support for the new
arpi
parents: 9300
diff changeset
304 format.biBitCount=32;
d275152390ee I've found some time to implement the encoding support for the new
arpi
parents: 9300
diff changeset
305 break;
d275152390ee I've found some time to implement the encoding support for the new
arpi
parents: 9300
diff changeset
306 }
d275152390ee I've found some time to implement the encoding support for the new
arpi
parents: 9300
diff changeset
307 default:
d275152390ee I've found some time to implement the encoding support for the new
arpi
parents: 9300
diff changeset
308 mp_msg(MSGT_MENCODER,MSGL_ERR,"divx4: unsupported picture format (%s)!\n",
d275152390ee I've found some time to implement the encoding support for the new
arpi
parents: 9300
diff changeset
309 vo_format_name(outfmt));
d275152390ee I've found some time to implement the encoding support for the new
arpi
parents: 9300
diff changeset
310 return 0;
d275152390ee I've found some time to implement the encoding support for the new
arpi
parents: 9300
diff changeset
311 }
d275152390ee I've found some time to implement the encoding support for the new
arpi
parents: 9300
diff changeset
312
d275152390ee I've found some time to implement the encoding support for the new
arpi
parents: 9300
diff changeset
313 encore(&vf->priv->enc_handle, ENC_OPT_INIT, &format, &divx4_param);
d275152390ee I've found some time to implement the encoding support for the new
arpi
parents: 9300
diff changeset
314 #else
5550
7d1dfb59c6c0 encoders
arpi
parents:
diff changeset
315 divx4_param.handle=NULL;
7d1dfb59c6c0 encoders
arpi
parents:
diff changeset
316 encore(NULL,ENC_OPT_INIT,&divx4_param,NULL);
7d1dfb59c6c0 encoders
arpi
parents:
diff changeset
317 vf->priv->enc_handle=divx4_param.handle;
7d1dfb59c6c0 encoders
arpi
parents:
diff changeset
318 switch(outfmt){
7d1dfb59c6c0 encoders
arpi
parents:
diff changeset
319 case IMGFMT_YV12: vf->priv->enc_frame.colorspace=ENC_CSP_YV12; break;
7d1dfb59c6c0 encoders
arpi
parents:
diff changeset
320 case IMGFMT_IYUV:
7d1dfb59c6c0 encoders
arpi
parents:
diff changeset
321 case IMGFMT_I420: vf->priv->enc_frame.colorspace=ENC_CSP_I420; break;
7d1dfb59c6c0 encoders
arpi
parents:
diff changeset
322 case IMGFMT_YUY2: vf->priv->enc_frame.colorspace=ENC_CSP_YUY2; break;
7d1dfb59c6c0 encoders
arpi
parents:
diff changeset
323 case IMGFMT_UYVY: vf->priv->enc_frame.colorspace=ENC_CSP_UYVY; break;
7d1dfb59c6c0 encoders
arpi
parents:
diff changeset
324 case IMGFMT_RGB24:
7d1dfb59c6c0 encoders
arpi
parents:
diff changeset
325 case IMGFMT_BGR24:
7d1dfb59c6c0 encoders
arpi
parents:
diff changeset
326 vf->priv->enc_frame.colorspace=ENC_CSP_RGB24; break;
7d1dfb59c6c0 encoders
arpi
parents:
diff changeset
327 default:
7d1dfb59c6c0 encoders
arpi
parents:
diff changeset
328 mp_msg(MSGT_MENCODER,MSGL_ERR,"divx4: unsupported picture format (%s)!\n",
7d1dfb59c6c0 encoders
arpi
parents:
diff changeset
329 vo_format_name(outfmt));
7d1dfb59c6c0 encoders
arpi
parents:
diff changeset
330 return 0;
7d1dfb59c6c0 encoders
arpi
parents:
diff changeset
331 }
7d1dfb59c6c0 encoders
arpi
parents:
diff changeset
332
7d1dfb59c6c0 encoders
arpi
parents:
diff changeset
333 switch(pass){
7d1dfb59c6c0 encoders
arpi
parents:
diff changeset
334 case 1:
7d1dfb59c6c0 encoders
arpi
parents:
diff changeset
335 if (VbrControl_init_2pass_vbr_analysis(passtmpfile, divx4_param.quality) == -1){
7d1dfb59c6c0 encoders
arpi
parents:
diff changeset
336 mp_msg(MSGT_MENCODER,MSGL_ERR,"2pass failed: filename=%s\n", passtmpfile);
7d1dfb59c6c0 encoders
arpi
parents:
diff changeset
337 pass=0;
7d1dfb59c6c0 encoders
arpi
parents:
diff changeset
338 }
7d1dfb59c6c0 encoders
arpi
parents:
diff changeset
339 break;
7d1dfb59c6c0 encoders
arpi
parents:
diff changeset
340 case 2:
7d1dfb59c6c0 encoders
arpi
parents:
diff changeset
341 if (VbrControl_init_2pass_vbr_encoding(passtmpfile,
7d1dfb59c6c0 encoders
arpi
parents:
diff changeset
342 divx4_param.bitrate,
7d1dfb59c6c0 encoders
arpi
parents:
diff changeset
343 divx4_param.framerate,
7d1dfb59c6c0 encoders
arpi
parents:
diff changeset
344 divx4_crispness,
7d1dfb59c6c0 encoders
arpi
parents:
diff changeset
345 divx4_param.quality) == -1){
7d1dfb59c6c0 encoders
arpi
parents:
diff changeset
346 mp_msg(MSGT_MENCODER,MSGL_ERR,"2pass failed: filename=%s\n", passtmpfile);
7d1dfb59c6c0 encoders
arpi
parents:
diff changeset
347 pass=0;
7d1dfb59c6c0 encoders
arpi
parents:
diff changeset
348 }
7d1dfb59c6c0 encoders
arpi
parents:
diff changeset
349 break;
7d1dfb59c6c0 encoders
arpi
parents:
diff changeset
350 }
10252
d275152390ee I've found some time to implement the encoding support for the new
arpi
parents: 9300
diff changeset
351 #endif
5550
7d1dfb59c6c0 encoders
arpi
parents:
diff changeset
352
7d1dfb59c6c0 encoders
arpi
parents:
diff changeset
353 return 1;
7d1dfb59c6c0 encoders
arpi
parents:
diff changeset
354 }
7d1dfb59c6c0 encoders
arpi
parents:
diff changeset
355
7332
dd32b0c95c95 Code to XviD VBR Library from transcode.
kmkaplan
parents: 7127
diff changeset
356 #ifdef HAVE_XVID_VBR
dd32b0c95c95 Code to XviD VBR Library from transcode.
kmkaplan
parents: 7127
diff changeset
357 static void uninit(struct vf_instance_s* vf){
dd32b0c95c95 Code to XviD VBR Library from transcode.
kmkaplan
parents: 7127
diff changeset
358 if (vbrpass >= 0 && vbrFinish(&vf->priv->vbr_state) == -1)
dd32b0c95c95 Code to XviD VBR Library from transcode.
kmkaplan
parents: 7127
diff changeset
359 abort();
dd32b0c95c95 Code to XviD VBR Library from transcode.
kmkaplan
parents: 7127
diff changeset
360 }
10252
d275152390ee I've found some time to implement the encoding support for the new
arpi
parents: 9300
diff changeset
361 #else
d275152390ee I've found some time to implement the encoding support for the new
arpi
parents: 9300
diff changeset
362 static void uninit(struct vf_instance_s* vf){
d275152390ee I've found some time to implement the encoding support for the new
arpi
parents: 9300
diff changeset
363 encore(vf->priv->enc_handle, ENC_OPT_RELEASE, 0, 0);
d275152390ee I've found some time to implement the encoding support for the new
arpi
parents: 9300
diff changeset
364 vf->priv->enc_handle = NULL;
d275152390ee I've found some time to implement the encoding support for the new
arpi
parents: 9300
diff changeset
365 }
7332
dd32b0c95c95 Code to XviD VBR Library from transcode.
kmkaplan
parents: 7127
diff changeset
366 #endif
dd32b0c95c95 Code to XviD VBR Library from transcode.
kmkaplan
parents: 7127
diff changeset
367
5550
7d1dfb59c6c0 encoders
arpi
parents:
diff changeset
368 static int control(struct vf_instance_s* vf, int request, void* data){
7d1dfb59c6c0 encoders
arpi
parents:
diff changeset
369
7d1dfb59c6c0 encoders
arpi
parents:
diff changeset
370 return CONTROL_UNKNOWN;
7d1dfb59c6c0 encoders
arpi
parents:
diff changeset
371 }
7d1dfb59c6c0 encoders
arpi
parents:
diff changeset
372
7d1dfb59c6c0 encoders
arpi
parents:
diff changeset
373 static int query_format(struct vf_instance_s* vf, unsigned int fmt){
7d1dfb59c6c0 encoders
arpi
parents:
diff changeset
374 switch(fmt){
7d1dfb59c6c0 encoders
arpi
parents:
diff changeset
375 case IMGFMT_YV12:
7d1dfb59c6c0 encoders
arpi
parents:
diff changeset
376 case IMGFMT_IYUV:
7d1dfb59c6c0 encoders
arpi
parents:
diff changeset
377 case IMGFMT_I420:
7d1dfb59c6c0 encoders
arpi
parents:
diff changeset
378 return 3; // no conversion
7d1dfb59c6c0 encoders
arpi
parents:
diff changeset
379 case IMGFMT_YUY2:
7d1dfb59c6c0 encoders
arpi
parents:
diff changeset
380 case IMGFMT_UYVY:
5706
26c89aadf6f8 flipped rgb fixed
arpi
parents: 5607
diff changeset
381 return 1; // conversion
5550
7d1dfb59c6c0 encoders
arpi
parents:
diff changeset
382 case IMGFMT_RGB24:
7d1dfb59c6c0 encoders
arpi
parents:
diff changeset
383 case IMGFMT_BGR24:
5706
26c89aadf6f8 flipped rgb fixed
arpi
parents: 5607
diff changeset
384 return 1 | VFCAP_FLIPPED; // conversion+flipped
5550
7d1dfb59c6c0 encoders
arpi
parents:
diff changeset
385 }
7d1dfb59c6c0 encoders
arpi
parents:
diff changeset
386 return 0;
7d1dfb59c6c0 encoders
arpi
parents:
diff changeset
387 }
7d1dfb59c6c0 encoders
arpi
parents:
diff changeset
388
7368
a894e99c1e51 changing return type of put_image void->int
arpi
parents: 7332
diff changeset
389 static int put_image(struct vf_instance_s* vf, mp_image_t *mpi){
5550
7d1dfb59c6c0 encoders
arpi
parents:
diff changeset
390 ENC_RESULT enc_result;
7d1dfb59c6c0 encoders
arpi
parents:
diff changeset
391 vf->priv->enc_frame.image=mpi->planes[0];
7d1dfb59c6c0 encoders
arpi
parents:
diff changeset
392 vf->priv->enc_frame.bitstream=mux_v->buffer;
7d1dfb59c6c0 encoders
arpi
parents:
diff changeset
393 vf->priv->enc_frame.length=mux_v->buffer_size;
10252
d275152390ee I've found some time to implement the encoding support for the new
arpi
parents: 9300
diff changeset
394 #if ENCORE_MAJOR_VERSION >= 5200
d275152390ee I've found some time to implement the encoding support for the new
arpi
parents: 9300
diff changeset
395 vf->priv->enc_frame.produce_empty_frame = 0;
d275152390ee I've found some time to implement the encoding support for the new
arpi
parents: 9300
diff changeset
396 encore(vf->priv->enc_handle, ENC_OPT_ENCODE, &vf->priv->enc_frame, &enc_result);
d275152390ee I've found some time to implement the encoding support for the new
arpi
parents: 9300
diff changeset
397 if(enc_result.cType == 'I')
d275152390ee I've found some time to implement the encoding support for the new
arpi
parents: 9300
diff changeset
398 muxer_write_chunk(mux_v,vf->priv->enc_frame.length,0x10);
d275152390ee I've found some time to implement the encoding support for the new
arpi
parents: 9300
diff changeset
399 else
d275152390ee I've found some time to implement the encoding support for the new
arpi
parents: 9300
diff changeset
400 muxer_write_chunk(mux_v,vf->priv->enc_frame.length,0);
d275152390ee I've found some time to implement the encoding support for the new
arpi
parents: 9300
diff changeset
401 #else
5550
7d1dfb59c6c0 encoders
arpi
parents:
diff changeset
402 vf->priv->enc_frame.mvs=NULL;
7332
dd32b0c95c95 Code to XviD VBR Library from transcode.
kmkaplan
parents: 7127
diff changeset
403 #ifdef HAVE_XVID_VBR
dd32b0c95c95 Code to XviD VBR Library from transcode.
kmkaplan
parents: 7127
diff changeset
404 if (vbrpass >= 0) {
dd32b0c95c95 Code to XviD VBR Library from transcode.
kmkaplan
parents: 7127
diff changeset
405 int quant = vbrGetQuant(&vf->priv->vbr_state);
dd32b0c95c95 Code to XviD VBR Library from transcode.
kmkaplan
parents: 7127
diff changeset
406 int intra = vbrGetIntra(&vf->priv->vbr_state);
dd32b0c95c95 Code to XviD VBR Library from transcode.
kmkaplan
parents: 7127
diff changeset
407 vf->priv->enc_frame.quant = quant ? quant : 1;
dd32b0c95c95 Code to XviD VBR Library from transcode.
kmkaplan
parents: 7127
diff changeset
408 vf->priv->enc_frame.intra = intra;
dd32b0c95c95 Code to XviD VBR Library from transcode.
kmkaplan
parents: 7127
diff changeset
409 /* XXX - kludge to workaround some DivX encoder limitations:
dd32b0c95c95 Code to XviD VBR Library from transcode.
kmkaplan
parents: 7127
diff changeset
410 only pass 2 needs to call encore with VBR, and then it does
dd32b0c95c95 Code to XviD VBR Library from transcode.
kmkaplan
parents: 7127
diff changeset
411 not report quantizer and intra*/
dd32b0c95c95 Code to XviD VBR Library from transcode.
kmkaplan
parents: 7127
diff changeset
412 if (vf->priv->vbr_state.mode != VBR_MODE_2PASS_2)
dd32b0c95c95 Code to XviD VBR Library from transcode.
kmkaplan
parents: 7127
diff changeset
413 encore(vf->priv->enc_handle, ENC_OPT_ENCODE, &vf->priv->enc_frame, &enc_result);
dd32b0c95c95 Code to XviD VBR Library from transcode.
kmkaplan
parents: 7127
diff changeset
414 else {
dd32b0c95c95 Code to XviD VBR Library from transcode.
kmkaplan
parents: 7127
diff changeset
415 encore(vf->priv->enc_handle, ENC_OPT_ENCODE_VBR, &vf->priv->enc_frame, &enc_result);
dd32b0c95c95 Code to XviD VBR Library from transcode.
kmkaplan
parents: 7127
diff changeset
416 enc_result.quantizer = quant;
dd32b0c95c95 Code to XviD VBR Library from transcode.
kmkaplan
parents: 7127
diff changeset
417 if (intra >= 0)
dd32b0c95c95 Code to XviD VBR Library from transcode.
kmkaplan
parents: 7127
diff changeset
418 enc_result.is_key_frame = intra;
dd32b0c95c95 Code to XviD VBR Library from transcode.
kmkaplan
parents: 7127
diff changeset
419 }
dd32b0c95c95 Code to XviD VBR Library from transcode.
kmkaplan
parents: 7127
diff changeset
420 if (vbrUpdate(&vf->priv->vbr_state, enc_result.quantizer, enc_result.is_key_frame,
dd32b0c95c95 Code to XviD VBR Library from transcode.
kmkaplan
parents: 7127
diff changeset
421 (enc_result.total_bits - enc_result.texture_bits) / 8, enc_result.total_bits / 8,
dd32b0c95c95 Code to XviD VBR Library from transcode.
kmkaplan
parents: 7127
diff changeset
422 0, 0, 0) == -1)
dd32b0c95c95 Code to XviD VBR Library from transcode.
kmkaplan
parents: 7127
diff changeset
423 abort();
dd32b0c95c95 Code to XviD VBR Library from transcode.
kmkaplan
parents: 7127
diff changeset
424 }
dd32b0c95c95 Code to XviD VBR Library from transcode.
kmkaplan
parents: 7127
diff changeset
425 else
dd32b0c95c95 Code to XviD VBR Library from transcode.
kmkaplan
parents: 7127
diff changeset
426 #endif
5550
7d1dfb59c6c0 encoders
arpi
parents:
diff changeset
427 if(pass==2){ // handle 2-pass:
7d1dfb59c6c0 encoders
arpi
parents:
diff changeset
428 vf->priv->enc_frame.quant = VbrControl_get_quant();
7d1dfb59c6c0 encoders
arpi
parents:
diff changeset
429 vf->priv->enc_frame.intra = VbrControl_get_intra();
7d1dfb59c6c0 encoders
arpi
parents:
diff changeset
430 encore(vf->priv->enc_handle,ENC_OPT_ENCODE_VBR,&vf->priv->enc_frame,&enc_result);
7d1dfb59c6c0 encoders
arpi
parents:
diff changeset
431 VbrControl_update_2pass_vbr_encoding(enc_result.motion_bits,
7d1dfb59c6c0 encoders
arpi
parents:
diff changeset
432 enc_result.texture_bits,
7d1dfb59c6c0 encoders
arpi
parents:
diff changeset
433 enc_result.total_bits);
7d1dfb59c6c0 encoders
arpi
parents:
diff changeset
434 } else {
7d1dfb59c6c0 encoders
arpi
parents:
diff changeset
435 vf->priv->enc_frame.quant=0;
7d1dfb59c6c0 encoders
arpi
parents:
diff changeset
436 vf->priv->enc_frame.intra=0;
7d1dfb59c6c0 encoders
arpi
parents:
diff changeset
437 encore(vf->priv->enc_handle,ENC_OPT_ENCODE,&vf->priv->enc_frame,&enc_result);
7d1dfb59c6c0 encoders
arpi
parents:
diff changeset
438 if(pass==1){
7d1dfb59c6c0 encoders
arpi
parents:
diff changeset
439 VbrControl_update_2pass_vbr_analysis(enc_result.is_key_frame,
7d1dfb59c6c0 encoders
arpi
parents:
diff changeset
440 enc_result.motion_bits,
7d1dfb59c6c0 encoders
arpi
parents:
diff changeset
441 enc_result.texture_bits,
7d1dfb59c6c0 encoders
arpi
parents:
diff changeset
442 enc_result.total_bits,
7d1dfb59c6c0 encoders
arpi
parents:
diff changeset
443 enc_result.quantizer);
7d1dfb59c6c0 encoders
arpi
parents:
diff changeset
444 }
7d1dfb59c6c0 encoders
arpi
parents:
diff changeset
445 }
9014
c671e9adbe22 Cleanup of the muxer API, func parameters muxer & muxer_f eliminated.
arpi
parents: 8585
diff changeset
446 muxer_write_chunk(mux_v,vf->priv->enc_frame.length,enc_result.is_key_frame?0x10:0);
10252
d275152390ee I've found some time to implement the encoding support for the new
arpi
parents: 9300
diff changeset
447 #endif
7368
a894e99c1e51 changing return type of put_image void->int
arpi
parents: 7332
diff changeset
448 return 1;
5550
7d1dfb59c6c0 encoders
arpi
parents:
diff changeset
449 }
7d1dfb59c6c0 encoders
arpi
parents:
diff changeset
450
7d1dfb59c6c0 encoders
arpi
parents:
diff changeset
451 //===========================================================================//
7d1dfb59c6c0 encoders
arpi
parents:
diff changeset
452
7d1dfb59c6c0 encoders
arpi
parents:
diff changeset
453 static int vf_open(vf_instance_t *vf, char* args){
7d1dfb59c6c0 encoders
arpi
parents:
diff changeset
454 vf->config=config;
7d1dfb59c6c0 encoders
arpi
parents:
diff changeset
455 vf->control=control;
7d1dfb59c6c0 encoders
arpi
parents:
diff changeset
456 vf->query_format=query_format;
7d1dfb59c6c0 encoders
arpi
parents:
diff changeset
457 vf->put_image=put_image;
10252
d275152390ee I've found some time to implement the encoding support for the new
arpi
parents: 9300
diff changeset
458 //#ifdef HAVE_XVID_VBR
7332
dd32b0c95c95 Code to XviD VBR Library from transcode.
kmkaplan
parents: 7127
diff changeset
459 vf->uninit = uninit;
10252
d275152390ee I've found some time to implement the encoding support for the new
arpi
parents: 9300
diff changeset
460 //#endif
5550
7d1dfb59c6c0 encoders
arpi
parents:
diff changeset
461 vf->priv=malloc(sizeof(struct vf_priv_s));
7d1dfb59c6c0 encoders
arpi
parents:
diff changeset
462 memset(vf->priv,0,sizeof(struct vf_priv_s));
8585
27da710563c2 the long-waited MUXER layer, and new MPEG-PS muxer
arpi
parents: 8032
diff changeset
463 vf->priv->mux=(muxer_stream_t*)args;
5550
7d1dfb59c6c0 encoders
arpi
parents:
diff changeset
464
7d1dfb59c6c0 encoders
arpi
parents:
diff changeset
465 mux_v->bih=malloc(sizeof(BITMAPINFOHEADER));
7d1dfb59c6c0 encoders
arpi
parents:
diff changeset
466 mux_v->bih->biSize=sizeof(BITMAPINFOHEADER);
7d1dfb59c6c0 encoders
arpi
parents:
diff changeset
467 mux_v->bih->biWidth=0;
7d1dfb59c6c0 encoders
arpi
parents:
diff changeset
468 mux_v->bih->biHeight=0;
7d1dfb59c6c0 encoders
arpi
parents:
diff changeset
469 mux_v->bih->biPlanes=1;
7d1dfb59c6c0 encoders
arpi
parents:
diff changeset
470 mux_v->bih->biBitCount=24;
5854
3a961eaf45b9 divx5.1 features added
arpi
parents: 5706
diff changeset
471 #if ENCORE_MAJOR_VERSION >= 5010
3a961eaf45b9 divx5.1 features added
arpi
parents: 5706
diff changeset
472 mux_v->bih->biCompression=mmioFOURCC('D','X','5','0');
3a961eaf45b9 divx5.1 features added
arpi
parents: 5706
diff changeset
473 #else
5550
7d1dfb59c6c0 encoders
arpi
parents:
diff changeset
474 mux_v->bih->biCompression=mmioFOURCC('d','i','v','x');
5854
3a961eaf45b9 divx5.1 features added
arpi
parents: 5706
diff changeset
475 #endif
5550
7d1dfb59c6c0 encoders
arpi
parents:
diff changeset
476
7d1dfb59c6c0 encoders
arpi
parents:
diff changeset
477 return 1;
7d1dfb59c6c0 encoders
arpi
parents:
diff changeset
478 }
7d1dfb59c6c0 encoders
arpi
parents:
diff changeset
479
7d1dfb59c6c0 encoders
arpi
parents:
diff changeset
480 vf_info_t ve_info_divx4 = {
7d1dfb59c6c0 encoders
arpi
parents:
diff changeset
481 "divx4 encoder",
7d1dfb59c6c0 encoders
arpi
parents:
diff changeset
482 "divx4",
7d1dfb59c6c0 encoders
arpi
parents:
diff changeset
483 "A'rpi",
7d1dfb59c6c0 encoders
arpi
parents:
diff changeset
484 "for internal use by mencoder",
7d1dfb59c6c0 encoders
arpi
parents:
diff changeset
485 vf_open
7d1dfb59c6c0 encoders
arpi
parents:
diff changeset
486 };
7d1dfb59c6c0 encoders
arpi
parents:
diff changeset
487
7d1dfb59c6c0 encoders
arpi
parents:
diff changeset
488 //===========================================================================//
7d1dfb59c6c0 encoders
arpi
parents:
diff changeset
489 #endif