annotate libmpcodecs/ve_divx4.c @ 13988:8ca30ef4e093

synced with latest versions
author paszczi
date Fri, 19 Nov 2004 23:05:56 +0000
parents 656a1b45b309
children acf3241be19b
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;
12061
656a1b45b309 Use aspect from encoder for AVI vprp header
ranma
parents: 10594
diff changeset
214 mux_v->aspect = (float)d_width/d_height;
5550
7d1dfb59c6c0 encoders
arpi
parents:
diff changeset
215
7d1dfb59c6c0 encoders
arpi
parents:
diff changeset
216 if(!divx4_param.bitrate) divx4_param.bitrate=800000;
7d1dfb59c6c0 encoders
arpi
parents:
diff changeset
217 else if(divx4_param.bitrate<=16000) divx4_param.bitrate*=1000;
7d1dfb59c6c0 encoders
arpi
parents:
diff changeset
218 if(!divx4_param.quality) divx4_param.quality=5; // the quality of compression ( 1 - fastest, 5 - best )
7d1dfb59c6c0 encoders
arpi
parents:
diff changeset
219
10252
d275152390ee I've found some time to implement the encoding support for the new
arpi
parents: 9300
diff changeset
220 #if ENCORE_MAJOR_VERSION >= 5200
d275152390ee I've found some time to implement the encoding support for the new
arpi
parents: 9300
diff changeset
221 format.biSize=sizeof(DivXBitmapInfoHeader);
d275152390ee I've found some time to implement the encoding support for the new
arpi
parents: 9300
diff changeset
222 format.biWidth=width;
d275152390ee I've found some time to implement the encoding support for the new
arpi
parents: 9300
diff changeset
223 format.biHeight=height;
d275152390ee I've found some time to implement the encoding support for the new
arpi
parents: 9300
diff changeset
224 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
225 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
226 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
227 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
228 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
229 }
d275152390ee I've found some time to implement the encoding support for the new
arpi
parents: 9300
diff changeset
230 #else
d275152390ee I've found some time to implement the encoding support for the new
arpi
parents: 9300
diff changeset
231 divx4_param.x_dim=width;
d275152390ee I've found some time to implement the encoding support for the new
arpi
parents: 9300
diff changeset
232 divx4_param.y_dim=height;
d275152390ee I've found some time to implement the encoding support for the new
arpi
parents: 9300
diff changeset
233 divx4_param.framerate=(float)mux_v->h.dwRate/mux_v->h.dwScale;
5551
73978162b6a1 soem fixes
arpi
parents: 5550
diff changeset
234 // set some usefull defaults:
73978162b6a1 soem fixes
arpi
parents: 5550
diff changeset
235 if(!divx4_param.min_quantizer) divx4_param.min_quantizer=2;
73978162b6a1 soem fixes
arpi
parents: 5550
diff changeset
236 if(!divx4_param.max_quantizer) divx4_param.max_quantizer=31;
73978162b6a1 soem fixes
arpi
parents: 5550
diff changeset
237 if(!divx4_param.rc_period) divx4_param.rc_period=2000;
73978162b6a1 soem fixes
arpi
parents: 5550
diff changeset
238 if(!divx4_param.rc_reaction_period) divx4_param.rc_reaction_period=10;
73978162b6a1 soem fixes
arpi
parents: 5550
diff changeset
239 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
240 #endif
5551
73978162b6a1 soem fixes
arpi
parents: 5550
diff changeset
241
7332
dd32b0c95c95 Code to XviD VBR Library from transcode.
kmkaplan
parents: 7127
diff changeset
242 #ifdef HAVE_XVID_VBR
dd32b0c95c95 Code to XviD VBR Library from transcode.
kmkaplan
parents: 7127
diff changeset
243 if (vbrpass >= 0) {
dd32b0c95c95 Code to XviD VBR Library from transcode.
kmkaplan
parents: 7127
diff changeset
244 vbrSetDefaults(&vf->priv->vbr_state);
dd32b0c95c95 Code to XviD VBR Library from transcode.
kmkaplan
parents: 7127
diff changeset
245 vf->priv->vbr_state.desired_bitrate = divx4_param.bitrate;
dd32b0c95c95 Code to XviD VBR Library from transcode.
kmkaplan
parents: 7127
diff changeset
246 switch (vbrpass) {
dd32b0c95c95 Code to XviD VBR Library from transcode.
kmkaplan
parents: 7127
diff changeset
247 case 0:
dd32b0c95c95 Code to XviD VBR Library from transcode.
kmkaplan
parents: 7127
diff changeset
248 vf->priv->vbr_state.mode = VBR_MODE_1PASS;
dd32b0c95c95 Code to XviD VBR Library from transcode.
kmkaplan
parents: 7127
diff changeset
249 break;
dd32b0c95c95 Code to XviD VBR Library from transcode.
kmkaplan
parents: 7127
diff changeset
250 case 1:
dd32b0c95c95 Code to XviD VBR Library from transcode.
kmkaplan
parents: 7127
diff changeset
251 vf->priv->vbr_state.mode = VBR_MODE_2PASS_1;
dd32b0c95c95 Code to XviD VBR Library from transcode.
kmkaplan
parents: 7127
diff changeset
252 break;
dd32b0c95c95 Code to XviD VBR Library from transcode.
kmkaplan
parents: 7127
diff changeset
253 case 2:
dd32b0c95c95 Code to XviD VBR Library from transcode.
kmkaplan
parents: 7127
diff changeset
254 vf->priv->vbr_state.mode = VBR_MODE_2PASS_2;
dd32b0c95c95 Code to XviD VBR Library from transcode.
kmkaplan
parents: 7127
diff changeset
255 break;
dd32b0c95c95 Code to XviD VBR Library from transcode.
kmkaplan
parents: 7127
diff changeset
256 default:
dd32b0c95c95 Code to XviD VBR Library from transcode.
kmkaplan
parents: 7127
diff changeset
257 abort();
dd32b0c95c95 Code to XviD VBR Library from transcode.
kmkaplan
parents: 7127
diff changeset
258 }
dd32b0c95c95 Code to XviD VBR Library from transcode.
kmkaplan
parents: 7127
diff changeset
259 vf->priv->vbr_state.debug = vbrdebug;
dd32b0c95c95 Code to XviD VBR Library from transcode.
kmkaplan
parents: 7127
diff changeset
260 if (vbrInit(&vf->priv->vbr_state) == -1)
dd32b0c95c95 Code to XviD VBR Library from transcode.
kmkaplan
parents: 7127
diff changeset
261 abort();
dd32b0c95c95 Code to XviD VBR Library from transcode.
kmkaplan
parents: 7127
diff changeset
262 /* XXX - kludge to workaround some DivX encoder limitations */
dd32b0c95c95 Code to XviD VBR Library from transcode.
kmkaplan
parents: 7127
diff changeset
263 if (vf->priv->vbr_state.mode != VBR_MODE_2PASS_2)
dd32b0c95c95 Code to XviD VBR Library from transcode.
kmkaplan
parents: 7127
diff changeset
264 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
265 }
dd32b0c95c95 Code to XviD VBR Library from transcode.
kmkaplan
parents: 7127
diff changeset
266 #endif
dd32b0c95c95 Code to XviD VBR Library from transcode.
kmkaplan
parents: 7127
diff changeset
267
10252
d275152390ee I've found some time to implement the encoding support for the new
arpi
parents: 9300
diff changeset
268 #if ENCORE_MAJOR_VERSION >= 5200
d275152390ee I've found some time to implement the encoding support for the new
arpi
parents: 9300
diff changeset
269 switch(outfmt){
d275152390ee I've found some time to implement the encoding support for the new
arpi
parents: 9300
diff changeset
270 case IMGFMT_YV12: {
d275152390ee I've found some time to implement the encoding support for the new
arpi
parents: 9300
diff changeset
271 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
272 break;
d275152390ee I've found some time to implement the encoding support for the new
arpi
parents: 9300
diff changeset
273 }
d275152390ee I've found some time to implement the encoding support for the new
arpi
parents: 9300
diff changeset
274 case IMGFMT_IYUV: {
d275152390ee I've found some time to implement the encoding support for the new
arpi
parents: 9300
diff changeset
275 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
276 break;
d275152390ee I've found some time to implement the encoding support for the new
arpi
parents: 9300
diff changeset
277 }
d275152390ee I've found some time to implement the encoding support for the new
arpi
parents: 9300
diff changeset
278 case IMGFMT_I420: {
d275152390ee I've found some time to implement the encoding support for the new
arpi
parents: 9300
diff changeset
279 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
280 break;
d275152390ee I've found some time to implement the encoding support for the new
arpi
parents: 9300
diff changeset
281 }
d275152390ee I've found some time to implement the encoding support for the new
arpi
parents: 9300
diff changeset
282 case IMGFMT_YUY2: {
d275152390ee I've found some time to implement the encoding support for the new
arpi
parents: 9300
diff changeset
283 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
284 break;
d275152390ee I've found some time to implement the encoding support for the new
arpi
parents: 9300
diff changeset
285 }
d275152390ee I've found some time to implement the encoding support for the new
arpi
parents: 9300
diff changeset
286 case IMGFMT_V422: {
d275152390ee I've found some time to implement the encoding support for the new
arpi
parents: 9300
diff changeset
287 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
288 break;
d275152390ee I've found some time to implement the encoding support for the new
arpi
parents: 9300
diff changeset
289 }
d275152390ee I've found some time to implement the encoding support for the new
arpi
parents: 9300
diff changeset
290 case IMGFMT_UYVY: {
d275152390ee I've found some time to implement the encoding support for the new
arpi
parents: 9300
diff changeset
291 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
292 break;
d275152390ee I've found some time to implement the encoding support for the new
arpi
parents: 9300
diff changeset
293 }
d275152390ee I've found some time to implement the encoding support for the new
arpi
parents: 9300
diff changeset
294 case IMGFMT_YVYU: {
d275152390ee I've found some time to implement the encoding support for the new
arpi
parents: 9300
diff changeset
295 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
296 break;
d275152390ee I've found some time to implement the encoding support for the new
arpi
parents: 9300
diff changeset
297 }
d275152390ee I've found some time to implement the encoding support for the new
arpi
parents: 9300
diff changeset
298 case IMGFMT_BGR24: {
d275152390ee I've found some time to implement the encoding support for the new
arpi
parents: 9300
diff changeset
299 format.biCompression=0;
d275152390ee I've found some time to implement the encoding support for the new
arpi
parents: 9300
diff changeset
300 format.biBitCount=24;
d275152390ee I've found some time to implement the encoding support for the new
arpi
parents: 9300
diff changeset
301 break;
d275152390ee I've found some time to implement the encoding support for the new
arpi
parents: 9300
diff changeset
302 }
d275152390ee I've found some time to implement the encoding support for the new
arpi
parents: 9300
diff changeset
303 case IMGFMT_BGR32: {
d275152390ee I've found some time to implement the encoding support for the new
arpi
parents: 9300
diff changeset
304 format.biCompression=0;
d275152390ee I've found some time to implement the encoding support for the new
arpi
parents: 9300
diff changeset
305 format.biBitCount=32;
d275152390ee I've found some time to implement the encoding support for the new
arpi
parents: 9300
diff changeset
306 break;
d275152390ee I've found some time to implement the encoding support for the new
arpi
parents: 9300
diff changeset
307 }
d275152390ee I've found some time to implement the encoding support for the new
arpi
parents: 9300
diff changeset
308 default:
d275152390ee I've found some time to implement the encoding support for the new
arpi
parents: 9300
diff changeset
309 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
310 vo_format_name(outfmt));
d275152390ee I've found some time to implement the encoding support for the new
arpi
parents: 9300
diff changeset
311 return 0;
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
d275152390ee I've found some time to implement the encoding support for the new
arpi
parents: 9300
diff changeset
314 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
315 #else
5550
7d1dfb59c6c0 encoders
arpi
parents:
diff changeset
316 divx4_param.handle=NULL;
7d1dfb59c6c0 encoders
arpi
parents:
diff changeset
317 encore(NULL,ENC_OPT_INIT,&divx4_param,NULL);
7d1dfb59c6c0 encoders
arpi
parents:
diff changeset
318 vf->priv->enc_handle=divx4_param.handle;
7d1dfb59c6c0 encoders
arpi
parents:
diff changeset
319 switch(outfmt){
7d1dfb59c6c0 encoders
arpi
parents:
diff changeset
320 case IMGFMT_YV12: vf->priv->enc_frame.colorspace=ENC_CSP_YV12; break;
7d1dfb59c6c0 encoders
arpi
parents:
diff changeset
321 case IMGFMT_IYUV:
7d1dfb59c6c0 encoders
arpi
parents:
diff changeset
322 case IMGFMT_I420: vf->priv->enc_frame.colorspace=ENC_CSP_I420; break;
7d1dfb59c6c0 encoders
arpi
parents:
diff changeset
323 case IMGFMT_YUY2: vf->priv->enc_frame.colorspace=ENC_CSP_YUY2; break;
7d1dfb59c6c0 encoders
arpi
parents:
diff changeset
324 case IMGFMT_UYVY: vf->priv->enc_frame.colorspace=ENC_CSP_UYVY; break;
7d1dfb59c6c0 encoders
arpi
parents:
diff changeset
325 case IMGFMT_RGB24:
7d1dfb59c6c0 encoders
arpi
parents:
diff changeset
326 case IMGFMT_BGR24:
7d1dfb59c6c0 encoders
arpi
parents:
diff changeset
327 vf->priv->enc_frame.colorspace=ENC_CSP_RGB24; break;
7d1dfb59c6c0 encoders
arpi
parents:
diff changeset
328 default:
7d1dfb59c6c0 encoders
arpi
parents:
diff changeset
329 mp_msg(MSGT_MENCODER,MSGL_ERR,"divx4: unsupported picture format (%s)!\n",
7d1dfb59c6c0 encoders
arpi
parents:
diff changeset
330 vo_format_name(outfmt));
7d1dfb59c6c0 encoders
arpi
parents:
diff changeset
331 return 0;
7d1dfb59c6c0 encoders
arpi
parents:
diff changeset
332 }
7d1dfb59c6c0 encoders
arpi
parents:
diff changeset
333
7d1dfb59c6c0 encoders
arpi
parents:
diff changeset
334 switch(pass){
7d1dfb59c6c0 encoders
arpi
parents:
diff changeset
335 case 1:
7d1dfb59c6c0 encoders
arpi
parents:
diff changeset
336 if (VbrControl_init_2pass_vbr_analysis(passtmpfile, divx4_param.quality) == -1){
7d1dfb59c6c0 encoders
arpi
parents:
diff changeset
337 mp_msg(MSGT_MENCODER,MSGL_ERR,"2pass failed: filename=%s\n", passtmpfile);
7d1dfb59c6c0 encoders
arpi
parents:
diff changeset
338 pass=0;
7d1dfb59c6c0 encoders
arpi
parents:
diff changeset
339 }
7d1dfb59c6c0 encoders
arpi
parents:
diff changeset
340 break;
7d1dfb59c6c0 encoders
arpi
parents:
diff changeset
341 case 2:
7d1dfb59c6c0 encoders
arpi
parents:
diff changeset
342 if (VbrControl_init_2pass_vbr_encoding(passtmpfile,
7d1dfb59c6c0 encoders
arpi
parents:
diff changeset
343 divx4_param.bitrate,
7d1dfb59c6c0 encoders
arpi
parents:
diff changeset
344 divx4_param.framerate,
7d1dfb59c6c0 encoders
arpi
parents:
diff changeset
345 divx4_crispness,
7d1dfb59c6c0 encoders
arpi
parents:
diff changeset
346 divx4_param.quality) == -1){
7d1dfb59c6c0 encoders
arpi
parents:
diff changeset
347 mp_msg(MSGT_MENCODER,MSGL_ERR,"2pass failed: filename=%s\n", passtmpfile);
7d1dfb59c6c0 encoders
arpi
parents:
diff changeset
348 pass=0;
7d1dfb59c6c0 encoders
arpi
parents:
diff changeset
349 }
7d1dfb59c6c0 encoders
arpi
parents:
diff changeset
350 break;
7d1dfb59c6c0 encoders
arpi
parents:
diff changeset
351 }
10252
d275152390ee I've found some time to implement the encoding support for the new
arpi
parents: 9300
diff changeset
352 #endif
5550
7d1dfb59c6c0 encoders
arpi
parents:
diff changeset
353
7d1dfb59c6c0 encoders
arpi
parents:
diff changeset
354 return 1;
7d1dfb59c6c0 encoders
arpi
parents:
diff changeset
355 }
7d1dfb59c6c0 encoders
arpi
parents:
diff changeset
356
7332
dd32b0c95c95 Code to XviD VBR Library from transcode.
kmkaplan
parents: 7127
diff changeset
357 #ifdef HAVE_XVID_VBR
dd32b0c95c95 Code to XviD VBR Library from transcode.
kmkaplan
parents: 7127
diff changeset
358 static void uninit(struct vf_instance_s* vf){
dd32b0c95c95 Code to XviD VBR Library from transcode.
kmkaplan
parents: 7127
diff changeset
359 if (vbrpass >= 0 && vbrFinish(&vf->priv->vbr_state) == -1)
dd32b0c95c95 Code to XviD VBR Library from transcode.
kmkaplan
parents: 7127
diff changeset
360 abort();
dd32b0c95c95 Code to XviD VBR Library from transcode.
kmkaplan
parents: 7127
diff changeset
361 }
10252
d275152390ee I've found some time to implement the encoding support for the new
arpi
parents: 9300
diff changeset
362 #else
d275152390ee I've found some time to implement the encoding support for the new
arpi
parents: 9300
diff changeset
363 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
364 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
365 vf->priv->enc_handle = NULL;
d275152390ee I've found some time to implement the encoding support for the new
arpi
parents: 9300
diff changeset
366 }
7332
dd32b0c95c95 Code to XviD VBR Library from transcode.
kmkaplan
parents: 7127
diff changeset
367 #endif
dd32b0c95c95 Code to XviD VBR Library from transcode.
kmkaplan
parents: 7127
diff changeset
368
5550
7d1dfb59c6c0 encoders
arpi
parents:
diff changeset
369 static int control(struct vf_instance_s* vf, int request, void* data){
7d1dfb59c6c0 encoders
arpi
parents:
diff changeset
370
7d1dfb59c6c0 encoders
arpi
parents:
diff changeset
371 return CONTROL_UNKNOWN;
7d1dfb59c6c0 encoders
arpi
parents:
diff changeset
372 }
7d1dfb59c6c0 encoders
arpi
parents:
diff changeset
373
7d1dfb59c6c0 encoders
arpi
parents:
diff changeset
374 static int query_format(struct vf_instance_s* vf, unsigned int fmt){
7d1dfb59c6c0 encoders
arpi
parents:
diff changeset
375 switch(fmt){
7d1dfb59c6c0 encoders
arpi
parents:
diff changeset
376 case IMGFMT_YV12:
7d1dfb59c6c0 encoders
arpi
parents:
diff changeset
377 case IMGFMT_IYUV:
7d1dfb59c6c0 encoders
arpi
parents:
diff changeset
378 case IMGFMT_I420:
7d1dfb59c6c0 encoders
arpi
parents:
diff changeset
379 return 3; // no conversion
7d1dfb59c6c0 encoders
arpi
parents:
diff changeset
380 case IMGFMT_YUY2:
7d1dfb59c6c0 encoders
arpi
parents:
diff changeset
381 case IMGFMT_UYVY:
5706
26c89aadf6f8 flipped rgb fixed
arpi
parents: 5607
diff changeset
382 return 1; // conversion
5550
7d1dfb59c6c0 encoders
arpi
parents:
diff changeset
383 case IMGFMT_RGB24:
7d1dfb59c6c0 encoders
arpi
parents:
diff changeset
384 case IMGFMT_BGR24:
5706
26c89aadf6f8 flipped rgb fixed
arpi
parents: 5607
diff changeset
385 return 1 | VFCAP_FLIPPED; // conversion+flipped
5550
7d1dfb59c6c0 encoders
arpi
parents:
diff changeset
386 }
7d1dfb59c6c0 encoders
arpi
parents:
diff changeset
387 return 0;
7d1dfb59c6c0 encoders
arpi
parents:
diff changeset
388 }
7d1dfb59c6c0 encoders
arpi
parents:
diff changeset
389
7368
a894e99c1e51 changing return type of put_image void->int
arpi
parents: 7332
diff changeset
390 static int put_image(struct vf_instance_s* vf, mp_image_t *mpi){
5550
7d1dfb59c6c0 encoders
arpi
parents:
diff changeset
391 ENC_RESULT enc_result;
7d1dfb59c6c0 encoders
arpi
parents:
diff changeset
392 vf->priv->enc_frame.image=mpi->planes[0];
7d1dfb59c6c0 encoders
arpi
parents:
diff changeset
393 vf->priv->enc_frame.bitstream=mux_v->buffer;
7d1dfb59c6c0 encoders
arpi
parents:
diff changeset
394 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
395 #if ENCORE_MAJOR_VERSION >= 5200
d275152390ee I've found some time to implement the encoding support for the new
arpi
parents: 9300
diff changeset
396 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
397 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
398 if(enc_result.cType == 'I')
d275152390ee I've found some time to implement the encoding support for the new
arpi
parents: 9300
diff changeset
399 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
400 else
d275152390ee I've found some time to implement the encoding support for the new
arpi
parents: 9300
diff changeset
401 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
402 #else
5550
7d1dfb59c6c0 encoders
arpi
parents:
diff changeset
403 vf->priv->enc_frame.mvs=NULL;
7332
dd32b0c95c95 Code to XviD VBR Library from transcode.
kmkaplan
parents: 7127
diff changeset
404 #ifdef HAVE_XVID_VBR
dd32b0c95c95 Code to XviD VBR Library from transcode.
kmkaplan
parents: 7127
diff changeset
405 if (vbrpass >= 0) {
dd32b0c95c95 Code to XviD VBR Library from transcode.
kmkaplan
parents: 7127
diff changeset
406 int quant = vbrGetQuant(&vf->priv->vbr_state);
dd32b0c95c95 Code to XviD VBR Library from transcode.
kmkaplan
parents: 7127
diff changeset
407 int intra = vbrGetIntra(&vf->priv->vbr_state);
dd32b0c95c95 Code to XviD VBR Library from transcode.
kmkaplan
parents: 7127
diff changeset
408 vf->priv->enc_frame.quant = quant ? quant : 1;
dd32b0c95c95 Code to XviD VBR Library from transcode.
kmkaplan
parents: 7127
diff changeset
409 vf->priv->enc_frame.intra = intra;
dd32b0c95c95 Code to XviD VBR Library from transcode.
kmkaplan
parents: 7127
diff changeset
410 /* XXX - kludge to workaround some DivX encoder limitations:
dd32b0c95c95 Code to XviD VBR Library from transcode.
kmkaplan
parents: 7127
diff changeset
411 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
412 not report quantizer and intra*/
dd32b0c95c95 Code to XviD VBR Library from transcode.
kmkaplan
parents: 7127
diff changeset
413 if (vf->priv->vbr_state.mode != VBR_MODE_2PASS_2)
dd32b0c95c95 Code to XviD VBR Library from transcode.
kmkaplan
parents: 7127
diff changeset
414 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
415 else {
dd32b0c95c95 Code to XviD VBR Library from transcode.
kmkaplan
parents: 7127
diff changeset
416 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
417 enc_result.quantizer = quant;
dd32b0c95c95 Code to XviD VBR Library from transcode.
kmkaplan
parents: 7127
diff changeset
418 if (intra >= 0)
dd32b0c95c95 Code to XviD VBR Library from transcode.
kmkaplan
parents: 7127
diff changeset
419 enc_result.is_key_frame = intra;
dd32b0c95c95 Code to XviD VBR Library from transcode.
kmkaplan
parents: 7127
diff changeset
420 }
dd32b0c95c95 Code to XviD VBR Library from transcode.
kmkaplan
parents: 7127
diff changeset
421 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
422 (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
423 0, 0, 0) == -1)
dd32b0c95c95 Code to XviD VBR Library from transcode.
kmkaplan
parents: 7127
diff changeset
424 abort();
dd32b0c95c95 Code to XviD VBR Library from transcode.
kmkaplan
parents: 7127
diff changeset
425 }
dd32b0c95c95 Code to XviD VBR Library from transcode.
kmkaplan
parents: 7127
diff changeset
426 else
dd32b0c95c95 Code to XviD VBR Library from transcode.
kmkaplan
parents: 7127
diff changeset
427 #endif
5550
7d1dfb59c6c0 encoders
arpi
parents:
diff changeset
428 if(pass==2){ // handle 2-pass:
7d1dfb59c6c0 encoders
arpi
parents:
diff changeset
429 vf->priv->enc_frame.quant = VbrControl_get_quant();
7d1dfb59c6c0 encoders
arpi
parents:
diff changeset
430 vf->priv->enc_frame.intra = VbrControl_get_intra();
7d1dfb59c6c0 encoders
arpi
parents:
diff changeset
431 encore(vf->priv->enc_handle,ENC_OPT_ENCODE_VBR,&vf->priv->enc_frame,&enc_result);
7d1dfb59c6c0 encoders
arpi
parents:
diff changeset
432 VbrControl_update_2pass_vbr_encoding(enc_result.motion_bits,
7d1dfb59c6c0 encoders
arpi
parents:
diff changeset
433 enc_result.texture_bits,
7d1dfb59c6c0 encoders
arpi
parents:
diff changeset
434 enc_result.total_bits);
7d1dfb59c6c0 encoders
arpi
parents:
diff changeset
435 } else {
7d1dfb59c6c0 encoders
arpi
parents:
diff changeset
436 vf->priv->enc_frame.quant=0;
7d1dfb59c6c0 encoders
arpi
parents:
diff changeset
437 vf->priv->enc_frame.intra=0;
7d1dfb59c6c0 encoders
arpi
parents:
diff changeset
438 encore(vf->priv->enc_handle,ENC_OPT_ENCODE,&vf->priv->enc_frame,&enc_result);
7d1dfb59c6c0 encoders
arpi
parents:
diff changeset
439 if(pass==1){
7d1dfb59c6c0 encoders
arpi
parents:
diff changeset
440 VbrControl_update_2pass_vbr_analysis(enc_result.is_key_frame,
7d1dfb59c6c0 encoders
arpi
parents:
diff changeset
441 enc_result.motion_bits,
7d1dfb59c6c0 encoders
arpi
parents:
diff changeset
442 enc_result.texture_bits,
7d1dfb59c6c0 encoders
arpi
parents:
diff changeset
443 enc_result.total_bits,
7d1dfb59c6c0 encoders
arpi
parents:
diff changeset
444 enc_result.quantizer);
7d1dfb59c6c0 encoders
arpi
parents:
diff changeset
445 }
7d1dfb59c6c0 encoders
arpi
parents:
diff changeset
446 }
9014
c671e9adbe22 Cleanup of the muxer API, func parameters muxer & muxer_f eliminated.
arpi
parents: 8585
diff changeset
447 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
448 #endif
7368
a894e99c1e51 changing return type of put_image void->int
arpi
parents: 7332
diff changeset
449 return 1;
5550
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
7d1dfb59c6c0 encoders
arpi
parents:
diff changeset
454 static int vf_open(vf_instance_t *vf, char* args){
7d1dfb59c6c0 encoders
arpi
parents:
diff changeset
455 vf->config=config;
7d1dfb59c6c0 encoders
arpi
parents:
diff changeset
456 vf->control=control;
7d1dfb59c6c0 encoders
arpi
parents:
diff changeset
457 vf->query_format=query_format;
7d1dfb59c6c0 encoders
arpi
parents:
diff changeset
458 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
459 //#ifdef HAVE_XVID_VBR
7332
dd32b0c95c95 Code to XviD VBR Library from transcode.
kmkaplan
parents: 7127
diff changeset
460 vf->uninit = uninit;
10252
d275152390ee I've found some time to implement the encoding support for the new
arpi
parents: 9300
diff changeset
461 //#endif
5550
7d1dfb59c6c0 encoders
arpi
parents:
diff changeset
462 vf->priv=malloc(sizeof(struct vf_priv_s));
7d1dfb59c6c0 encoders
arpi
parents:
diff changeset
463 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
464 vf->priv->mux=(muxer_stream_t*)args;
5550
7d1dfb59c6c0 encoders
arpi
parents:
diff changeset
465
7d1dfb59c6c0 encoders
arpi
parents:
diff changeset
466 mux_v->bih=malloc(sizeof(BITMAPINFOHEADER));
7d1dfb59c6c0 encoders
arpi
parents:
diff changeset
467 mux_v->bih->biSize=sizeof(BITMAPINFOHEADER);
7d1dfb59c6c0 encoders
arpi
parents:
diff changeset
468 mux_v->bih->biWidth=0;
7d1dfb59c6c0 encoders
arpi
parents:
diff changeset
469 mux_v->bih->biHeight=0;
7d1dfb59c6c0 encoders
arpi
parents:
diff changeset
470 mux_v->bih->biPlanes=1;
7d1dfb59c6c0 encoders
arpi
parents:
diff changeset
471 mux_v->bih->biBitCount=24;
5854
3a961eaf45b9 divx5.1 features added
arpi
parents: 5706
diff changeset
472 #if ENCORE_MAJOR_VERSION >= 5010
3a961eaf45b9 divx5.1 features added
arpi
parents: 5706
diff changeset
473 mux_v->bih->biCompression=mmioFOURCC('D','X','5','0');
3a961eaf45b9 divx5.1 features added
arpi
parents: 5706
diff changeset
474 #else
5550
7d1dfb59c6c0 encoders
arpi
parents:
diff changeset
475 mux_v->bih->biCompression=mmioFOURCC('d','i','v','x');
5854
3a961eaf45b9 divx5.1 features added
arpi
parents: 5706
diff changeset
476 #endif
5550
7d1dfb59c6c0 encoders
arpi
parents:
diff changeset
477
7d1dfb59c6c0 encoders
arpi
parents:
diff changeset
478 return 1;
7d1dfb59c6c0 encoders
arpi
parents:
diff changeset
479 }
7d1dfb59c6c0 encoders
arpi
parents:
diff changeset
480
7d1dfb59c6c0 encoders
arpi
parents:
diff changeset
481 vf_info_t ve_info_divx4 = {
7d1dfb59c6c0 encoders
arpi
parents:
diff changeset
482 "divx4 encoder",
7d1dfb59c6c0 encoders
arpi
parents:
diff changeset
483 "divx4",
7d1dfb59c6c0 encoders
arpi
parents:
diff changeset
484 "A'rpi",
7d1dfb59c6c0 encoders
arpi
parents:
diff changeset
485 "for internal use by mencoder",
7d1dfb59c6c0 encoders
arpi
parents:
diff changeset
486 vf_open
7d1dfb59c6c0 encoders
arpi
parents:
diff changeset
487 };
7d1dfb59c6c0 encoders
arpi
parents:
diff changeset
488
7d1dfb59c6c0 encoders
arpi
parents:
diff changeset
489 //===========================================================================//
7d1dfb59c6c0 encoders
arpi
parents:
diff changeset
490 #endif