Mercurial > mplayer.hg
annotate libmpcodecs/ve_xvid4.c @ 36650:8b2c68d6fd89
Enable specifying a font file in the GUI preferences.
This has been broken since the introduction of Fontconfig.
Since Fontconfig is selecting fonts by font patterns and the GUI does so
by selecting a font file, it is necessary to temporarily disable
fontconfig font handling if there is a directory separator character
found in the name (or pattern) of the font to be used, i.e. assume the
font name to be a pattern if and only if it doesn't contain a directory
separator character.
Thus set option 'fontconfig' depending on font_name. Set it in guiInit()
for the font possibly given in a configuration file or on the command
line, and set it in mplayerLoadFont() whenever it is affected by GUI
preferences settings.
(Although the font selection dialog only allows files to be selected,
it is possible to simply enter a fontconfig font pattern in the
preferences' text entry field - or to enter it directly into the GUI
configuration file or to specify on the command line, both of which
always is possible.)
author | ib |
---|---|
date | Sun, 26 Jan 2014 16:40:49 +0000 |
parents | 389d43c448b3 |
children |
rev | line source |
---|---|
26727 | 1 /* |
26883 | 2 * - XviD 1.x decoder module for mplayer/mencoder - |
11437 | 3 * |
26727 | 4 * Copyright(C) 2003 Marco Belli <elcabesa@inwind.it> |
5 * 2003-2004 Edouard Gomez <ed.gomez@free.fr> | |
11437 | 6 * |
26727 | 7 * This file is part of MPlayer. |
11437 | 8 * |
26727 | 9 * MPlayer is free software; you can redistribute it and/or modify |
10 * it under the terms of the GNU General Public License as published by | |
11 * the Free Software Foundation; either version 2 of the License, or | |
12 * (at your option) any later version. | |
11437 | 13 * |
26727 | 14 * MPlayer is distributed in the hope that it will be useful, |
15 * but WITHOUT ANY WARRANTY; without even the implied warranty of | |
16 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | |
17 * GNU General Public License for more details. | |
11437 | 18 * |
26727 | 19 * You should have received a copy of the GNU General Public License along |
20 * with MPlayer; if not, write to the Free Software Foundation, Inc., | |
21 * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. | |
22 */ | |
11437 | 23 |
24 /***************************************************************************** | |
25 * Includes | |
26 ****************************************************************************/ | |
27 | |
28 #include <stdio.h> | |
29 #include <stdlib.h> | |
30 #include <string.h> | |
35903 | 31 #include <strings.h> |
11437 | 32 #include <errno.h> |
33 #include <math.h> | |
34 #include <limits.h> | |
11920 | 35 #include <time.h> |
11437 | 36 |
17012 | 37 #include "config.h" |
38 #include "mp_msg.h" | |
32064
a735105a66b6
Move all MEncoder-related extern variable declarations to mencoder.h.
diego
parents:
32033
diff
changeset
|
39 #include "mencoder.h" |
11437 | 40 #include "codec-cfg.h" |
22600
3c2b4a866c6a
Add explicit location for headers from the stream/ directory.
diego
parents:
21660
diff
changeset
|
41 #include "stream/stream.h" |
22601
ed8f90096c65
Add explicit location for headers from the libmpdemux/ directory.
diego
parents:
22600
diff
changeset
|
42 #include "libmpdemux/demuxer.h" |
ed8f90096c65
Add explicit location for headers from the libmpdemux/ directory.
diego
parents:
22600
diff
changeset
|
43 #include "libmpdemux/stheader.h" |
11437 | 44 |
22600
3c2b4a866c6a
Add explicit location for headers from the stream/ directory.
diego
parents:
21660
diff
changeset
|
45 #include "stream/stream.h" |
22601
ed8f90096c65
Add explicit location for headers from the libmpdemux/ directory.
diego
parents:
22600
diff
changeset
|
46 #include "libmpdemux/muxer.h" |
11437 | 47 |
48 #include "img_format.h" | |
49 #include "mp_image.h" | |
32479 | 50 #include "ve.h" |
11437 | 51 #include "vf.h" |
52 | |
53 #include <xvid.h> | |
54 #include <stdio.h> | |
55 #include <stdarg.h> | |
56 #include <limits.h> | |
11912
8eb96d751dcd
new options - aspect,autoaspect,turbo,chroma_opt. patch by Nico <nsabbi@tiscali.it> and Edouard Gomez
iive
parents:
11586
diff
changeset
|
57 #include <assert.h> |
11437 | 58 |
59 #include "m_option.h" | |
33760
84b3eebfd796
ve_xvid: Add libavutil/rational.h #include for AVRational et al.
diego
parents:
32574
diff
changeset
|
60 #include "libavutil/rational.h" |
26069
1318e956c092
FFmpeg now uses different (unified) #include paths.
diego
parents:
25962
diff
changeset
|
61 #include "libavutil/avutil.h" |
24295
de8e36aec5ff
Remove imported rational calculation code and use the original one from avutil.
iive
parents:
22601
diff
changeset
|
62 |
11437 | 63 #define FINE (!0) |
64 #define BAD (!FINE) | |
65 | |
15619
ccf2c61afacd
XviD zones support. Patch by Doom9: < feedback123 GROOVY doom9 STEADY org >
gpoirier
parents:
15070
diff
changeset
|
66 #define MAX_ZONES 64 |
ccf2c61afacd
XviD zones support. Patch by Doom9: < feedback123 GROOVY doom9 STEADY org >
gpoirier
parents:
15070
diff
changeset
|
67 |
16481
beebfccc00f1
adds Simple, Advanced Simple and DivX profile support for XviD, Patch by Robert Swain < robert POUM swain AH gmail POUM com >
gpoirier
parents:
15664
diff
changeset
|
68 // Profile flag definitions |
beebfccc00f1
adds Simple, Advanced Simple and DivX profile support for XviD, Patch by Robert Swain < robert POUM swain AH gmail POUM com >
gpoirier
parents:
15664
diff
changeset
|
69 #define PROFILE_ADAPTQUANT 0x00000001 |
beebfccc00f1
adds Simple, Advanced Simple and DivX profile support for XviD, Patch by Robert Swain < robert POUM swain AH gmail POUM com >
gpoirier
parents:
15664
diff
changeset
|
70 #define PROFILE_BVOP 0x00000002 |
beebfccc00f1
adds Simple, Advanced Simple and DivX profile support for XviD, Patch by Robert Swain < robert POUM swain AH gmail POUM com >
gpoirier
parents:
15664
diff
changeset
|
71 #define PROFILE_MPEGQUANT 0x00000004 |
beebfccc00f1
adds Simple, Advanced Simple and DivX profile support for XviD, Patch by Robert Swain < robert POUM swain AH gmail POUM com >
gpoirier
parents:
15664
diff
changeset
|
72 #define PROFILE_INTERLACE 0x00000008 |
beebfccc00f1
adds Simple, Advanced Simple and DivX profile support for XviD, Patch by Robert Swain < robert POUM swain AH gmail POUM com >
gpoirier
parents:
15664
diff
changeset
|
73 #define PROFILE_QPEL 0x00000010 |
beebfccc00f1
adds Simple, Advanced Simple and DivX profile support for XviD, Patch by Robert Swain < robert POUM swain AH gmail POUM com >
gpoirier
parents:
15664
diff
changeset
|
74 #define PROFILE_GMC 0x00000020 |
beebfccc00f1
adds Simple, Advanced Simple and DivX profile support for XviD, Patch by Robert Swain < robert POUM swain AH gmail POUM com >
gpoirier
parents:
15664
diff
changeset
|
75 #define PROFILE_4MV 0x00000040 |
beebfccc00f1
adds Simple, Advanced Simple and DivX profile support for XviD, Patch by Robert Swain < robert POUM swain AH gmail POUM com >
gpoirier
parents:
15664
diff
changeset
|
76 #define PROFILE_DXN 0x00000080 |
beebfccc00f1
adds Simple, Advanced Simple and DivX profile support for XviD, Patch by Robert Swain < robert POUM swain AH gmail POUM com >
gpoirier
parents:
15664
diff
changeset
|
77 |
beebfccc00f1
adds Simple, Advanced Simple and DivX profile support for XviD, Patch by Robert Swain < robert POUM swain AH gmail POUM com >
gpoirier
parents:
15664
diff
changeset
|
78 // Reduce code duplication in profiles[] array |
beebfccc00f1
adds Simple, Advanced Simple and DivX profile support for XviD, Patch by Robert Swain < robert POUM swain AH gmail POUM com >
gpoirier
parents:
15664
diff
changeset
|
79 #define PROFILE_S (PROFILE_4MV) |
beebfccc00f1
adds Simple, Advanced Simple and DivX profile support for XviD, Patch by Robert Swain < robert POUM swain AH gmail POUM com >
gpoirier
parents:
15664
diff
changeset
|
80 #define PROFILE_AS (PROFILE_4MV|PROFILE_ADAPTQUANT|PROFILE_BVOP|PROFILE_MPEGQUANT|PROFILE_INTERLACE|PROFILE_QPEL|PROFILE_GMC) |
beebfccc00f1
adds Simple, Advanced Simple and DivX profile support for XviD, Patch by Robert Swain < robert POUM swain AH gmail POUM com >
gpoirier
parents:
15664
diff
changeset
|
81 |
24629
36c574ac1008
Define profiles_t as const to fix a warning. Prevent profiles[] from been exported.
iive
parents:
24295
diff
changeset
|
82 typedef const struct |
16481
beebfccc00f1
adds Simple, Advanced Simple and DivX profile support for XviD, Patch by Robert Swain < robert POUM swain AH gmail POUM com >
gpoirier
parents:
15664
diff
changeset
|
83 { |
28186
79aef31ed618
XVID profile array should be const, so it is in rodata
reimar
parents:
26883
diff
changeset
|
84 const char *name; ///< profile name |
16481
beebfccc00f1
adds Simple, Advanced Simple and DivX profile support for XviD, Patch by Robert Swain < robert POUM swain AH gmail POUM com >
gpoirier
parents:
15664
diff
changeset
|
85 int id; ///< mpeg-4 profile id; iso/iec 14496-2:2001 table G-1 |
beebfccc00f1
adds Simple, Advanced Simple and DivX profile support for XviD, Patch by Robert Swain < robert POUM swain AH gmail POUM com >
gpoirier
parents:
15664
diff
changeset
|
86 int width; ///< profile width restriction |
beebfccc00f1
adds Simple, Advanced Simple and DivX profile support for XviD, Patch by Robert Swain < robert POUM swain AH gmail POUM com >
gpoirier
parents:
15664
diff
changeset
|
87 int height; ///< profile height restriction |
beebfccc00f1
adds Simple, Advanced Simple and DivX profile support for XviD, Patch by Robert Swain < robert POUM swain AH gmail POUM com >
gpoirier
parents:
15664
diff
changeset
|
88 int fps; ///< profile frame rate restriction |
beebfccc00f1
adds Simple, Advanced Simple and DivX profile support for XviD, Patch by Robert Swain < robert POUM swain AH gmail POUM com >
gpoirier
parents:
15664
diff
changeset
|
89 int max_objects; ///< ?????? |
beebfccc00f1
adds Simple, Advanced Simple and DivX profile support for XviD, Patch by Robert Swain < robert POUM swain AH gmail POUM com >
gpoirier
parents:
15664
diff
changeset
|
90 int total_vmv_buffer_sz; ///< macroblock memory; when BVOPS=false, vmv = 2*vcv; when BVOPS=true, vmv = 3*vcv |
beebfccc00f1
adds Simple, Advanced Simple and DivX profile support for XviD, Patch by Robert Swain < robert POUM swain AH gmail POUM com >
gpoirier
parents:
15664
diff
changeset
|
91 int max_vmv_buffer_sz; ///< max macroblocks per vop |
beebfccc00f1
adds Simple, Advanced Simple and DivX profile support for XviD, Patch by Robert Swain < robert POUM swain AH gmail POUM com >
gpoirier
parents:
15664
diff
changeset
|
92 int vcv_decoder_rate; ///< macroblocks decoded per second |
beebfccc00f1
adds Simple, Advanced Simple and DivX profile support for XviD, Patch by Robert Swain < robert POUM swain AH gmail POUM com >
gpoirier
parents:
15664
diff
changeset
|
93 int max_acpred_mbs; ///< percentage |
beebfccc00f1
adds Simple, Advanced Simple and DivX profile support for XviD, Patch by Robert Swain < robert POUM swain AH gmail POUM com >
gpoirier
parents:
15664
diff
changeset
|
94 int max_vbv_size; ///< max vbv size (bits) 16368 bits |
beebfccc00f1
adds Simple, Advanced Simple and DivX profile support for XviD, Patch by Robert Swain < robert POUM swain AH gmail POUM com >
gpoirier
parents:
15664
diff
changeset
|
95 int max_video_packet_length; ///< bits |
beebfccc00f1
adds Simple, Advanced Simple and DivX profile support for XviD, Patch by Robert Swain < robert POUM swain AH gmail POUM com >
gpoirier
parents:
15664
diff
changeset
|
96 int max_bitrate; ///< bits per second |
beebfccc00f1
adds Simple, Advanced Simple and DivX profile support for XviD, Patch by Robert Swain < robert POUM swain AH gmail POUM com >
gpoirier
parents:
15664
diff
changeset
|
97 int vbv_peakrate; ///< max bits over anyone second period; 0=don't care |
beebfccc00f1
adds Simple, Advanced Simple and DivX profile support for XviD, Patch by Robert Swain < robert POUM swain AH gmail POUM com >
gpoirier
parents:
15664
diff
changeset
|
98 int dxn_max_bframes; ///< dxn: max consecutive bframes |
beebfccc00f1
adds Simple, Advanced Simple and DivX profile support for XviD, Patch by Robert Swain < robert POUM swain AH gmail POUM com >
gpoirier
parents:
15664
diff
changeset
|
99 unsigned int flags; ///< flags for allowed options/dxn note the definitions for PROFILE_S and PROFILE_AS |
beebfccc00f1
adds Simple, Advanced Simple and DivX profile support for XviD, Patch by Robert Swain < robert POUM swain AH gmail POUM com >
gpoirier
parents:
15664
diff
changeset
|
100 } profile_t; |
beebfccc00f1
adds Simple, Advanced Simple and DivX profile support for XviD, Patch by Robert Swain < robert POUM swain AH gmail POUM com >
gpoirier
parents:
15664
diff
changeset
|
101 |
26883 | 102 // Code taken from XviD VfW source for profile support |
11912
8eb96d751dcd
new options - aspect,autoaspect,turbo,chroma_opt. patch by Nico <nsabbi@tiscali.it> and Edouard Gomez
iive
parents:
11586
diff
changeset
|
103 |
16481
beebfccc00f1
adds Simple, Advanced Simple and DivX profile support for XviD, Patch by Robert Swain < robert POUM swain AH gmail POUM com >
gpoirier
parents:
15664
diff
changeset
|
104 /* default vbv_occupancy is (64/170)*vbv_buffer_size */ |
beebfccc00f1
adds Simple, Advanced Simple and DivX profile support for XviD, Patch by Robert Swain < robert POUM swain AH gmail POUM com >
gpoirier
parents:
15664
diff
changeset
|
105 |
28186
79aef31ed618
XVID profile array should be const, so it is in rodata
reimar
parents:
26883
diff
changeset
|
106 static const profile_t profiles[] = |
16481
beebfccc00f1
adds Simple, Advanced Simple and DivX profile support for XviD, Patch by Robert Swain < robert POUM swain AH gmail POUM com >
gpoirier
parents:
15664
diff
changeset
|
107 { |
beebfccc00f1
adds Simple, Advanced Simple and DivX profile support for XviD, Patch by Robert Swain < robert POUM swain AH gmail POUM com >
gpoirier
parents:
15664
diff
changeset
|
108 /* name p@l w h fps obj Tvmv vmv vcv ac% vbv pkt bps vbv_peak dbf flags */ |
beebfccc00f1
adds Simple, Advanced Simple and DivX profile support for XviD, Patch by Robert Swain < robert POUM swain AH gmail POUM com >
gpoirier
parents:
15664
diff
changeset
|
109 /* unrestricted profile (default) */ |
beebfccc00f1
adds Simple, Advanced Simple and DivX profile support for XviD, Patch by Robert Swain < robert POUM swain AH gmail POUM com >
gpoirier
parents:
15664
diff
changeset
|
110 { "unrestricted", 0x00, 0, 0, 0, 0, 0, 0, 0, 100, 0*16368, -1, 0, 0, -1, 0xffffffff & ~PROFILE_DXN }, |
beebfccc00f1
adds Simple, Advanced Simple and DivX profile support for XviD, Patch by Robert Swain < robert POUM swain AH gmail POUM com >
gpoirier
parents:
15664
diff
changeset
|
111 |
beebfccc00f1
adds Simple, Advanced Simple and DivX profile support for XviD, Patch by Robert Swain < robert POUM swain AH gmail POUM com >
gpoirier
parents:
15664
diff
changeset
|
112 { "sp0", 0x08, 176, 144, 15, 1, 198, 99, 1485, 100, 10*16368, 2048, 64000, 0, -1, PROFILE_S }, |
beebfccc00f1
adds Simple, Advanced Simple and DivX profile support for XviD, Patch by Robert Swain < robert POUM swain AH gmail POUM com >
gpoirier
parents:
15664
diff
changeset
|
113 /* simple@l0: max f_code=1, intra_dc_vlc_threshold=0 */ |
beebfccc00f1
adds Simple, Advanced Simple and DivX profile support for XviD, Patch by Robert Swain < robert POUM swain AH gmail POUM com >
gpoirier
parents:
15664
diff
changeset
|
114 /* if ac preidition is used, adaptive quantization must not be used */ |
beebfccc00f1
adds Simple, Advanced Simple and DivX profile support for XviD, Patch by Robert Swain < robert POUM swain AH gmail POUM com >
gpoirier
parents:
15664
diff
changeset
|
115 /* <=qcif must be used */ |
beebfccc00f1
adds Simple, Advanced Simple and DivX profile support for XviD, Patch by Robert Swain < robert POUM swain AH gmail POUM com >
gpoirier
parents:
15664
diff
changeset
|
116 { "sp1", 0x01, 176, 144, 15, 4, 198, 99, 1485, 100, 10*16368, 2048, 64000, 0, -1, PROFILE_S|PROFILE_ADAPTQUANT }, |
beebfccc00f1
adds Simple, Advanced Simple and DivX profile support for XviD, Patch by Robert Swain < robert POUM swain AH gmail POUM com >
gpoirier
parents:
15664
diff
changeset
|
117 { "sp2", 0x02, 352, 288, 15, 4, 792, 396, 5940, 100, 40*16368, 4096, 128000, 0, -1, PROFILE_S|PROFILE_ADAPTQUANT }, |
beebfccc00f1
adds Simple, Advanced Simple and DivX profile support for XviD, Patch by Robert Swain < robert POUM swain AH gmail POUM com >
gpoirier
parents:
15664
diff
changeset
|
118 { "sp3", 0x03, 352, 288, 15, 4, 792, 396, 11880, 100, 40*16368, 8192, 384000, 0, -1, PROFILE_S|PROFILE_ADAPTQUANT }, |
31937
0b29d0c8c62d
Add new Simple Profile Levels to the Xvid encoder.
cehoyos
parents:
30955
diff
changeset
|
119 /* From ISO/IEC 14496-2:2004/FPDAM 2: New Levels for Simple Profile */ |
0b29d0c8c62d
Add new Simple Profile Levels to the Xvid encoder.
cehoyos
parents:
30955
diff
changeset
|
120 { "sp4a", 0x04, 640, 480, 30, 4, 2400, 1200, 36000, 100, 80*16368, 16384, 4000000, 0, -1, PROFILE_S|PROFILE_ADAPTQUANT }, |
0b29d0c8c62d
Add new Simple Profile Levels to the Xvid encoder.
cehoyos
parents:
30955
diff
changeset
|
121 { "sp5", 0x05, 720, 576, 30, 4, 3240, 1620, 40500, 100, 112*16368, 16384, 8000000, 0, -1, PROFILE_S|PROFILE_ADAPTQUANT }, |
0b29d0c8c62d
Add new Simple Profile Levels to the Xvid encoder.
cehoyos
parents:
30955
diff
changeset
|
122 /* From ISO/IEC 14496-2:2004/FPDAM 4: Simple profile level 6 */ |
0b29d0c8c62d
Add new Simple Profile Levels to the Xvid encoder.
cehoyos
parents:
30955
diff
changeset
|
123 { "sp6", 0x06, 1280, 720, 30, 4, 7200, 3600, 108000, 100, 248*16368, 16384,12000000, 0, -1, PROFILE_S|PROFILE_ADAPTQUANT }, |
16481
beebfccc00f1
adds Simple, Advanced Simple and DivX profile support for XviD, Patch by Robert Swain < robert POUM swain AH gmail POUM com >
gpoirier
parents:
15664
diff
changeset
|
124 |
beebfccc00f1
adds Simple, Advanced Simple and DivX profile support for XviD, Patch by Robert Swain < robert POUM swain AH gmail POUM com >
gpoirier
parents:
15664
diff
changeset
|
125 { "asp0", 0xf0, 176, 144, 30, 1, 297, 99, 2970, 100, 10*16368, 2048, 128000, 0, -1, PROFILE_AS }, |
beebfccc00f1
adds Simple, Advanced Simple and DivX profile support for XviD, Patch by Robert Swain < robert POUM swain AH gmail POUM com >
gpoirier
parents:
15664
diff
changeset
|
126 { "asp1", 0xf1, 176, 144, 30, 4, 297, 99, 2970, 100, 10*16368, 2048, 128000, 0, -1, PROFILE_AS }, |
beebfccc00f1
adds Simple, Advanced Simple and DivX profile support for XviD, Patch by Robert Swain < robert POUM swain AH gmail POUM com >
gpoirier
parents:
15664
diff
changeset
|
127 { "asp2", 0xf2, 352, 288, 15, 4, 1188, 396, 5940, 100, 40*16368, 4096, 384000, 0, -1, PROFILE_AS }, |
beebfccc00f1
adds Simple, Advanced Simple and DivX profile support for XviD, Patch by Robert Swain < robert POUM swain AH gmail POUM com >
gpoirier
parents:
15664
diff
changeset
|
128 { "asp3", 0xf3, 352, 288, 30, 4, 1188, 396, 11880, 100, 40*16368, 4096, 768000, 0, -1, PROFILE_AS }, |
beebfccc00f1
adds Simple, Advanced Simple and DivX profile support for XviD, Patch by Robert Swain < robert POUM swain AH gmail POUM com >
gpoirier
parents:
15664
diff
changeset
|
129 /* ISMA Profile 1, (ASP) @ L3b (CIF, 1.5 Mb/s) CIF(352x288), 30fps, 1.5Mbps max ??? */ |
beebfccc00f1
adds Simple, Advanced Simple and DivX profile support for XviD, Patch by Robert Swain < robert POUM swain AH gmail POUM com >
gpoirier
parents:
15664
diff
changeset
|
130 { "asp4", 0xf4, 352, 576, 30, 4, 2376, 792, 23760, 50, 80*16368, 8192, 3000000, 0, -1, PROFILE_AS }, |
beebfccc00f1
adds Simple, Advanced Simple and DivX profile support for XviD, Patch by Robert Swain < robert POUM swain AH gmail POUM com >
gpoirier
parents:
15664
diff
changeset
|
131 { "asp5", 0xf5, 720, 576, 30, 4, 4860, 1620, 48600, 25, 112*16368, 16384, 8000000, 0, -1, PROFILE_AS }, |
beebfccc00f1
adds Simple, Advanced Simple and DivX profile support for XviD, Patch by Robert Swain < robert POUM swain AH gmail POUM com >
gpoirier
parents:
15664
diff
changeset
|
132 |
beebfccc00f1
adds Simple, Advanced Simple and DivX profile support for XviD, Patch by Robert Swain < robert POUM swain AH gmail POUM com >
gpoirier
parents:
15664
diff
changeset
|
133 // information provided by DivXNetworks, USA. |
beebfccc00f1
adds Simple, Advanced Simple and DivX profile support for XviD, Patch by Robert Swain < robert POUM swain AH gmail POUM com >
gpoirier
parents:
15664
diff
changeset
|
134 // "DivX Certified Profile Compatibility v1.1", February 2005 |
beebfccc00f1
adds Simple, Advanced Simple and DivX profile support for XviD, Patch by Robert Swain < robert POUM swain AH gmail POUM com >
gpoirier
parents:
15664
diff
changeset
|
135 { "dxnhandheld", 0x00, 176, 144, 15, 1, 198, 99, 1485, 100, 32*8192, -1, 537600, 800000, 0, PROFILE_ADAPTQUANT|PROFILE_DXN }, |
beebfccc00f1
adds Simple, Advanced Simple and DivX profile support for XviD, Patch by Robert Swain < robert POUM swain AH gmail POUM com >
gpoirier
parents:
15664
diff
changeset
|
136 { "dxnportntsc", 0x00, 352, 240, 30, 1, 990, 330, 36000, 100, 384*8192, -1, 4854000, 8000000, 1, PROFILE_4MV|PROFILE_ADAPTQUANT|PROFILE_BVOP|PROFILE_DXN }, |
beebfccc00f1
adds Simple, Advanced Simple and DivX profile support for XviD, Patch by Robert Swain < robert POUM swain AH gmail POUM com >
gpoirier
parents:
15664
diff
changeset
|
137 { "dxnportpal", 0x00, 352, 288, 25, 1, 1188, 396, 36000, 100, 384*8192, -1, 4854000, 8000000, 1, PROFILE_4MV|PROFILE_ADAPTQUANT|PROFILE_BVOP|PROFILE_DXN }, |
beebfccc00f1
adds Simple, Advanced Simple and DivX profile support for XviD, Patch by Robert Swain < robert POUM swain AH gmail POUM com >
gpoirier
parents:
15664
diff
changeset
|
138 { "dxnhtntsc", 0x00, 720, 480, 30, 1, 4050, 1350, 40500, 100, 384*8192, -1, 4854000, 8000000, 1, PROFILE_4MV|PROFILE_ADAPTQUANT|PROFILE_BVOP|PROFILE_INTERLACE|PROFILE_DXN }, |
beebfccc00f1
adds Simple, Advanced Simple and DivX profile support for XviD, Patch by Robert Swain < robert POUM swain AH gmail POUM com >
gpoirier
parents:
15664
diff
changeset
|
139 { "dxnhtpal", 0x00, 720, 576, 25, 1, 4860, 1620, 40500, 100, 384*8192, -1, 4854000, 8000000, 1, PROFILE_4MV|PROFILE_ADAPTQUANT|PROFILE_BVOP|PROFILE_INTERLACE|PROFILE_DXN }, |
beebfccc00f1
adds Simple, Advanced Simple and DivX profile support for XviD, Patch by Robert Swain < robert POUM swain AH gmail POUM com >
gpoirier
parents:
15664
diff
changeset
|
140 { "dxnhdtv", 0x00, 1280, 720, 30, 1,10800, 3600, 108000, 100, 768*8192, -1, 9708400, 16000000, 2, PROFILE_4MV|PROFILE_ADAPTQUANT|PROFILE_BVOP|PROFILE_INTERLACE|PROFILE_DXN }, |
beebfccc00f1
adds Simple, Advanced Simple and DivX profile support for XviD, Patch by Robert Swain < robert POUM swain AH gmail POUM com >
gpoirier
parents:
15664
diff
changeset
|
141 |
beebfccc00f1
adds Simple, Advanced Simple and DivX profile support for XviD, Patch by Robert Swain < robert POUM swain AH gmail POUM com >
gpoirier
parents:
15664
diff
changeset
|
142 { NULL, 0x00, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0x00000000 }, |
beebfccc00f1
adds Simple, Advanced Simple and DivX profile support for XviD, Patch by Robert Swain < robert POUM swain AH gmail POUM com >
gpoirier
parents:
15664
diff
changeset
|
143 }; |
beebfccc00f1
adds Simple, Advanced Simple and DivX profile support for XviD, Patch by Robert Swain < robert POUM swain AH gmail POUM com >
gpoirier
parents:
15664
diff
changeset
|
144 |
beebfccc00f1
adds Simple, Advanced Simple and DivX profile support for XviD, Patch by Robert Swain < robert POUM swain AH gmail POUM com >
gpoirier
parents:
15664
diff
changeset
|
145 /** |
beebfccc00f1
adds Simple, Advanced Simple and DivX profile support for XviD, Patch by Robert Swain < robert POUM swain AH gmail POUM com >
gpoirier
parents:
15664
diff
changeset
|
146 * \brief return the pointer to a chosen profile |
beebfccc00f1
adds Simple, Advanced Simple and DivX profile support for XviD, Patch by Robert Swain < robert POUM swain AH gmail POUM com >
gpoirier
parents:
15664
diff
changeset
|
147 * \param str the profile name |
beebfccc00f1
adds Simple, Advanced Simple and DivX profile support for XviD, Patch by Robert Swain < robert POUM swain AH gmail POUM com >
gpoirier
parents:
15664
diff
changeset
|
148 * \return pointer of the appropriate profiles array entry or NULL for a mistyped profile name |
beebfccc00f1
adds Simple, Advanced Simple and DivX profile support for XviD, Patch by Robert Swain < robert POUM swain AH gmail POUM com >
gpoirier
parents:
15664
diff
changeset
|
149 */ |
28186
79aef31ed618
XVID profile array should be const, so it is in rodata
reimar
parents:
26883
diff
changeset
|
150 static const profile_t *profileFromName(const char *str) |
16481
beebfccc00f1
adds Simple, Advanced Simple and DivX profile support for XviD, Patch by Robert Swain < robert POUM swain AH gmail POUM com >
gpoirier
parents:
15664
diff
changeset
|
151 { |
beebfccc00f1
adds Simple, Advanced Simple and DivX profile support for XviD, Patch by Robert Swain < robert POUM swain AH gmail POUM com >
gpoirier
parents:
15664
diff
changeset
|
152 profile_t *cur = profiles; |
beebfccc00f1
adds Simple, Advanced Simple and DivX profile support for XviD, Patch by Robert Swain < robert POUM swain AH gmail POUM com >
gpoirier
parents:
15664
diff
changeset
|
153 while (cur->name && strcasecmp(cur->name, str)) cur++; |
beebfccc00f1
adds Simple, Advanced Simple and DivX profile support for XviD, Patch by Robert Swain < robert POUM swain AH gmail POUM com >
gpoirier
parents:
15664
diff
changeset
|
154 if(!cur->name) return NULL; |
beebfccc00f1
adds Simple, Advanced Simple and DivX profile support for XviD, Patch by Robert Swain < robert POUM swain AH gmail POUM com >
gpoirier
parents:
15664
diff
changeset
|
155 return cur; |
beebfccc00f1
adds Simple, Advanced Simple and DivX profile support for XviD, Patch by Robert Swain < robert POUM swain AH gmail POUM com >
gpoirier
parents:
15664
diff
changeset
|
156 } |
11912
8eb96d751dcd
new options - aspect,autoaspect,turbo,chroma_opt. patch by Nico <nsabbi@tiscali.it> and Edouard Gomez
iive
parents:
11586
diff
changeset
|
157 |
11437 | 158 /***************************************************************************** |
159 * Configuration options | |
160 ****************************************************************************/ | |
161 | |
162 static int xvidenc_bitrate = 0; | |
163 static int xvidenc_pass = 0; | |
164 static float xvidenc_quantizer = 0; | |
165 | |
166 static int xvidenc_packed = 0; | |
167 static int xvidenc_closed_gop = 1; | |
168 static int xvidenc_interlaced = 0; | |
169 static int xvidenc_quarterpel = 0; | |
170 static int xvidenc_gmc = 0; | |
15070
bde4030f9134
Better defaults encoding settings for XviD, intended to be a good tradeoff CPU/PSNR.
gpoirier
parents:
14878
diff
changeset
|
171 static int xvidenc_trellis = 1; |
11437 | 172 static int xvidenc_cartoon = 0; |
173 static int xvidenc_hqacpred = 1; | |
15070
bde4030f9134
Better defaults encoding settings for XviD, intended to be a good tradeoff CPU/PSNR.
gpoirier
parents:
14878
diff
changeset
|
174 static int xvidenc_chromame = 1; |
11912
8eb96d751dcd
new options - aspect,autoaspect,turbo,chroma_opt. patch by Nico <nsabbi@tiscali.it> and Edouard Gomez
iive
parents:
11586
diff
changeset
|
175 static int xvidenc_chroma_opt = 0; |
15070
bde4030f9134
Better defaults encoding settings for XviD, intended to be a good tradeoff CPU/PSNR.
gpoirier
parents:
14878
diff
changeset
|
176 static int xvidenc_vhq = 1; |
bde4030f9134
Better defaults encoding settings for XviD, intended to be a good tradeoff CPU/PSNR.
gpoirier
parents:
14878
diff
changeset
|
177 static int xvidenc_bvhq = 1; |
11437 | 178 static int xvidenc_motion = 6; |
11912
8eb96d751dcd
new options - aspect,autoaspect,turbo,chroma_opt. patch by Nico <nsabbi@tiscali.it> and Edouard Gomez
iive
parents:
11586
diff
changeset
|
179 static int xvidenc_turbo = 0; |
11437 | 180 static int xvidenc_stats = 0; |
11912
8eb96d751dcd
new options - aspect,autoaspect,turbo,chroma_opt. patch by Nico <nsabbi@tiscali.it> and Edouard Gomez
iive
parents:
11586
diff
changeset
|
181 static int xvidenc_max_key_interval = 0; /* Let xvidcore set a 10s interval by default */ |
11437 | 182 static int xvidenc_frame_drop_ratio = 0; |
183 static int xvidenc_greyscale = 0; | |
15638
189da3c3116b
Add XviD's luminance masking (option name: lumi_mask)
gpoirier
parents:
15619
diff
changeset
|
184 static int xvidenc_luminance_masking = 0; |
11920 | 185 static int xvidenc_debug = 0; |
186 static int xvidenc_psnr = 0; | |
11437 | 187 |
11912
8eb96d751dcd
new options - aspect,autoaspect,turbo,chroma_opt. patch by Nico <nsabbi@tiscali.it> and Edouard Gomez
iive
parents:
11586
diff
changeset
|
188 static int xvidenc_max_bframes = 2; |
17703 | 189 static int xvidenc_num_threads = 0; |
11437 | 190 static int xvidenc_bquant_ratio = 150; |
191 static int xvidenc_bquant_offset = 100; | |
192 static int xvidenc_bframe_threshold = 0; | |
193 | |
194 static int xvidenc_min_quant[3] = {2, 2, 2}; | |
195 static int xvidenc_max_quant[3] = {31, 31, 31}; | |
196 static char *xvidenc_intra_matrix_file = NULL; | |
197 static char *xvidenc_inter_matrix_file = NULL; | |
198 static char *xvidenc_quant_method = NULL; | |
199 | |
200 static int xvidenc_cbr_reaction_delay_factor = 0; | |
201 static int xvidenc_cbr_averaging_period = 0; | |
202 static int xvidenc_cbr_buffer = 0; | |
203 | |
204 static int xvidenc_vbr_keyframe_boost = 0; | |
11912
8eb96d751dcd
new options - aspect,autoaspect,turbo,chroma_opt. patch by Nico <nsabbi@tiscali.it> and Edouard Gomez
iive
parents:
11586
diff
changeset
|
205 static int xvidenc_vbr_overflow_control_strength = 5; |
11437 | 206 static int xvidenc_vbr_curve_compression_high = 0; |
207 static int xvidenc_vbr_curve_compression_low = 0; | |
11912
8eb96d751dcd
new options - aspect,autoaspect,turbo,chroma_opt. patch by Nico <nsabbi@tiscali.it> and Edouard Gomez
iive
parents:
11586
diff
changeset
|
208 static int xvidenc_vbr_max_overflow_improvement = 5; |
8eb96d751dcd
new options - aspect,autoaspect,turbo,chroma_opt. patch by Nico <nsabbi@tiscali.it> and Edouard Gomez
iive
parents:
11586
diff
changeset
|
209 static int xvidenc_vbr_max_overflow_degradation = 5; |
11437 | 210 static int xvidenc_vbr_kfreduction = 0; |
11586 | 211 static int xvidenc_vbr_kfthreshold = 0; |
11912
8eb96d751dcd
new options - aspect,autoaspect,turbo,chroma_opt. patch by Nico <nsabbi@tiscali.it> and Edouard Gomez
iive
parents:
11586
diff
changeset
|
212 static int xvidenc_vbr_container_frame_overhead = 24; /* mencoder uses AVI container */ |
11437 | 213 |
32574
59ecb59c86cc
Expose the VBV options of xvid encoder to the command line interface.
iive
parents:
32537
diff
changeset
|
214 static int xvidenc_vbv_size = 0; |
59ecb59c86cc
Expose the VBV options of xvid encoder to the command line interface.
iive
parents:
32537
diff
changeset
|
215 static int xvidenc_vbv_initial = 0; |
59ecb59c86cc
Expose the VBV options of xvid encoder to the command line interface.
iive
parents:
32537
diff
changeset
|
216 static int xvidenc_vbv_maxrate = 0; |
59ecb59c86cc
Expose the VBV options of xvid encoder to the command line interface.
iive
parents:
32537
diff
changeset
|
217 |
16481
beebfccc00f1
adds Simple, Advanced Simple and DivX profile support for XviD, Patch by Robert Swain < robert POUM swain AH gmail POUM com >
gpoirier
parents:
15664
diff
changeset
|
218 // commandline profile option string - default to unrestricted |
beebfccc00f1
adds Simple, Advanced Simple and DivX profile support for XviD, Patch by Robert Swain < robert POUM swain AH gmail POUM com >
gpoirier
parents:
15664
diff
changeset
|
219 static char *xvidenc_profile = "unrestricted"; |
beebfccc00f1
adds Simple, Advanced Simple and DivX profile support for XviD, Patch by Robert Swain < robert POUM swain AH gmail POUM com >
gpoirier
parents:
15664
diff
changeset
|
220 |
11437 | 221 static char *xvidenc_par = NULL; |
222 static int xvidenc_par_width = 0; | |
223 static int xvidenc_par_height = 0; | |
11912
8eb96d751dcd
new options - aspect,autoaspect,turbo,chroma_opt. patch by Nico <nsabbi@tiscali.it> and Edouard Gomez
iive
parents:
11586
diff
changeset
|
224 static float xvidenc_dar_aspect = 0.0f; |
8eb96d751dcd
new options - aspect,autoaspect,turbo,chroma_opt. patch by Nico <nsabbi@tiscali.it> and Edouard Gomez
iive
parents:
11586
diff
changeset
|
225 static int xvidenc_autoaspect = 0; |
11437 | 226 |
15619
ccf2c61afacd
XviD zones support. Patch by Doom9: < feedback123 GROOVY doom9 STEADY org >
gpoirier
parents:
15070
diff
changeset
|
227 static char *xvidenc_zones = NULL; // zones string |
ccf2c61afacd
XviD zones support. Patch by Doom9: < feedback123 GROOVY doom9 STEADY org >
gpoirier
parents:
15070
diff
changeset
|
228 |
30955
4e59a7aebadb
Mark encoder-related m_option_t struct arrays as const.
diego
parents:
30642
diff
changeset
|
229 const m_option_t xvidencopts_conf[] = |
11437 | 230 { |
231 /* Standard things mencoder should be able to treat directly */ | |
232 {"bitrate", &xvidenc_bitrate, CONF_TYPE_INT, 0, 0, 0, NULL}, | |
233 {"pass", &xvidenc_pass, CONF_TYPE_INT, CONF_RANGE, 1, 2, NULL}, | |
234 {"fixed_quant", &xvidenc_quantizer, CONF_TYPE_FLOAT, CONF_RANGE, 1, 31, NULL}, | |
235 | |
236 /* Features */ | |
237 {"quant_type", &xvidenc_quant_method, CONF_TYPE_STRING, 0, 0, 0, NULL}, | |
238 {"me_quality", &xvidenc_motion, CONF_TYPE_INT, CONF_RANGE, 0, 6, NULL}, | |
239 {"chroma_me", &xvidenc_chromame, CONF_TYPE_FLAG, 0, 0, 1, NULL}, | |
13853
5a786c7e4df4
have each XviD's option flag have its (no)counterpart
gpoirier
parents:
13675
diff
changeset
|
240 {"nochroma_me", &xvidenc_chromame, CONF_TYPE_FLAG, 0, 1, 0, NULL}, |
11912
8eb96d751dcd
new options - aspect,autoaspect,turbo,chroma_opt. patch by Nico <nsabbi@tiscali.it> and Edouard Gomez
iive
parents:
11586
diff
changeset
|
241 {"chroma_opt", &xvidenc_chroma_opt, CONF_TYPE_FLAG, 0, 0, 1, NULL}, |
13853
5a786c7e4df4
have each XviD's option flag have its (no)counterpart
gpoirier
parents:
13675
diff
changeset
|
242 {"nochroma_opt", &xvidenc_chroma_opt, CONF_TYPE_FLAG, 0, 1, 0, NULL}, |
11437 | 243 {"vhq", &xvidenc_vhq, CONF_TYPE_INT, CONF_RANGE, 0, 4, NULL}, |
13610 | 244 {"bvhq", &xvidenc_bvhq, CONF_TYPE_INT, CONF_RANGE, 0, 1, NULL}, |
11437 | 245 {"max_bframes", &xvidenc_max_bframes, CONF_TYPE_INT, CONF_RANGE, 0, 20, NULL}, |
17703 | 246 {"threads", &xvidenc_num_threads, CONF_TYPE_INT, 0, 0, 0, NULL}, |
11437 | 247 {"bquant_ratio", &xvidenc_bquant_ratio, CONF_TYPE_INT, CONF_RANGE, 0, 200, NULL}, |
248 {"bquant_offset", &xvidenc_bquant_offset, CONF_TYPE_INT, CONF_RANGE, 0, 200, NULL}, | |
249 {"bf_threshold", &xvidenc_bframe_threshold, CONF_TYPE_INT, CONF_RANGE, -255, 255, NULL}, | |
250 {"qpel", &xvidenc_quarterpel, CONF_TYPE_FLAG, 0, 0, 1, NULL}, | |
13853
5a786c7e4df4
have each XviD's option flag have its (no)counterpart
gpoirier
parents:
13675
diff
changeset
|
251 {"noqpel", &xvidenc_quarterpel, CONF_TYPE_FLAG, 0, 1, 0, NULL}, |
11437 | 252 {"gmc", &xvidenc_gmc, CONF_TYPE_FLAG, 0, 0, 1, NULL}, |
13853
5a786c7e4df4
have each XviD's option flag have its (no)counterpart
gpoirier
parents:
13675
diff
changeset
|
253 {"nogmc", &xvidenc_gmc, CONF_TYPE_FLAG, 0, 1, 0, NULL}, |
11437 | 254 {"trellis", &xvidenc_trellis, CONF_TYPE_FLAG, 0, 0, 1, NULL}, |
13853
5a786c7e4df4
have each XviD's option flag have its (no)counterpart
gpoirier
parents:
13675
diff
changeset
|
255 {"notrellis", &xvidenc_trellis, CONF_TYPE_FLAG, 0, 1, 0, NULL}, |
11437 | 256 {"packed", &xvidenc_packed, CONF_TYPE_FLAG, 0, 0, 1, NULL}, |
13853
5a786c7e4df4
have each XviD's option flag have its (no)counterpart
gpoirier
parents:
13675
diff
changeset
|
257 {"nopacked", &xvidenc_packed, CONF_TYPE_FLAG, 0, 1, 0, NULL}, |
11437 | 258 {"closed_gop", &xvidenc_closed_gop, CONF_TYPE_FLAG, 0, 0, 1, NULL}, |
13853
5a786c7e4df4
have each XviD's option flag have its (no)counterpart
gpoirier
parents:
13675
diff
changeset
|
259 {"noclosed_gop", &xvidenc_closed_gop, CONF_TYPE_FLAG, 0, 1, 0, NULL}, |
11491 | 260 {"interlacing", &xvidenc_interlaced, CONF_TYPE_FLAG, 0, 0, 1, NULL}, |
13853
5a786c7e4df4
have each XviD's option flag have its (no)counterpart
gpoirier
parents:
13675
diff
changeset
|
261 {"nointerlacing", &xvidenc_interlaced, CONF_TYPE_FLAG, 0, 1, 0, NULL}, |
11437 | 262 {"cartoon", &xvidenc_cartoon, CONF_TYPE_FLAG, 0, 0, 1, NULL}, |
13853
5a786c7e4df4
have each XviD's option flag have its (no)counterpart
gpoirier
parents:
13675
diff
changeset
|
263 {"nocartoon", &xvidenc_cartoon, CONF_TYPE_FLAG, 0, 1, 0, NULL}, |
11437 | 264 {"hq_ac", &xvidenc_hqacpred, CONF_TYPE_FLAG, 0, 0, 1, NULL}, |
13853
5a786c7e4df4
have each XviD's option flag have its (no)counterpart
gpoirier
parents:
13675
diff
changeset
|
265 {"nohq_ac", &xvidenc_hqacpred, CONF_TYPE_FLAG, 0, 1, 0, NULL}, |
11437 | 266 {"frame_drop_ratio", &xvidenc_frame_drop_ratio, CONF_TYPE_INT, CONF_RANGE, 0, 100, NULL}, |
267 {"max_key_interval", &xvidenc_max_key_interval, CONF_TYPE_INT, CONF_MIN, 0, 0, NULL}, | |
20259
135e5919638f
Use American spelling of "gray" instead for British's "grey" for XviD option, while keeping backward compatibility
gpoirier
parents:
20017
diff
changeset
|
268 {"greyscale", &xvidenc_greyscale, CONF_TYPE_FLAG, 0, 0, 1, NULL}, /* kept for backward compatibility */ |
29263
0f1b5b68af32
whitespace cosmetics: Remove all trailing whitespace.
diego
parents:
28186
diff
changeset
|
269 {"grayscale", &xvidenc_greyscale, CONF_TYPE_FLAG, 0, 0, 1, NULL}, |
13853
5a786c7e4df4
have each XviD's option flag have its (no)counterpart
gpoirier
parents:
13675
diff
changeset
|
270 {"nogreyscale", &xvidenc_greyscale, CONF_TYPE_FLAG, 0, 1, 0, NULL}, |
15638
189da3c3116b
Add XviD's luminance masking (option name: lumi_mask)
gpoirier
parents:
15619
diff
changeset
|
271 {"lumi_mask", &xvidenc_luminance_masking, CONF_TYPE_FLAG, 0, 0, 1, NULL}, |
189da3c3116b
Add XviD's luminance masking (option name: lumi_mask)
gpoirier
parents:
15619
diff
changeset
|
272 {"nolumi_mask", &xvidenc_luminance_masking, CONF_TYPE_FLAG, 0, 1, 0, NULL}, |
11912
8eb96d751dcd
new options - aspect,autoaspect,turbo,chroma_opt. patch by Nico <nsabbi@tiscali.it> and Edouard Gomez
iive
parents:
11586
diff
changeset
|
273 {"turbo", &xvidenc_turbo, CONF_TYPE_FLAG, 0, 0, 1, NULL}, |
11920 | 274 {"debug", &xvidenc_debug, CONF_TYPE_INT , 0 ,0,-1,NULL}, |
11437 | 275 {"stats", &xvidenc_stats, CONF_TYPE_FLAG, 0, 0, 1, NULL}, |
11920 | 276 {"psnr", &xvidenc_psnr , CONF_TYPE_FLAG, 0, 0, 1, NULL}, |
11437 | 277 |
278 | |
279 /* section [quantizer] */ | |
280 {"min_iquant", &xvidenc_min_quant[0], CONF_TYPE_INT, CONF_RANGE, 1, 31, NULL}, | |
281 {"max_iquant", &xvidenc_max_quant[0], CONF_TYPE_INT, CONF_RANGE, 1, 31, NULL}, | |
282 {"min_pquant", &xvidenc_min_quant[1], CONF_TYPE_INT, CONF_RANGE, 1, 31, NULL}, | |
283 {"max_pquant", &xvidenc_max_quant[1], CONF_TYPE_INT, CONF_RANGE, 1, 31, NULL}, | |
284 {"min_bquant", &xvidenc_min_quant[2], CONF_TYPE_INT, CONF_RANGE, 1, 31, NULL}, | |
285 {"max_bquant", &xvidenc_max_quant[2], CONF_TYPE_INT, CONF_RANGE, 1, 31, NULL}, | |
286 {"quant_intra_matrix", &xvidenc_intra_matrix_file, CONF_TYPE_STRING, 0, 0, 100, NULL}, | |
287 {"quant_inter_matrix", &xvidenc_inter_matrix_file, CONF_TYPE_STRING, 0, 0, 100, NULL}, | |
288 | |
289 /* section [cbr] */ | |
11491 | 290 {"rc_reaction_delay_factor", &xvidenc_cbr_reaction_delay_factor, CONF_TYPE_INT, CONF_RANGE, 0, 100, NULL}, |
291 {"rc_averaging_period", &xvidenc_cbr_averaging_period, CONF_TYPE_INT, CONF_MIN, 0, 0, NULL}, | |
292 {"rc_buffer", &xvidenc_cbr_buffer, CONF_TYPE_INT, CONF_MIN, 0, 0, NULL}, | |
11437 | 293 |
294 /* section [vbr] */ | |
295 {"keyframe_boost", &xvidenc_vbr_keyframe_boost, CONF_TYPE_INT, CONF_RANGE, 0, 100, NULL}, | |
296 {"curve_compression_high", &xvidenc_vbr_curve_compression_high, CONF_TYPE_INT, CONF_RANGE, 0, 100, NULL}, | |
297 {"curve_compression_low", &xvidenc_vbr_curve_compression_low, CONF_TYPE_INT, CONF_RANGE, 0, 100, NULL}, | |
298 {"overflow_control_strength", &xvidenc_vbr_overflow_control_strength, CONF_TYPE_INT, CONF_RANGE, 0, 100, NULL}, | |
299 {"max_overflow_improvement", &xvidenc_vbr_max_overflow_improvement, CONF_TYPE_INT, CONF_RANGE, 0, 100, NULL}, | |
300 {"max_overflow_degradation", &xvidenc_vbr_max_overflow_degradation, CONF_TYPE_INT, CONF_RANGE, 0, 100, NULL}, | |
301 {"kfreduction", &xvidenc_vbr_kfreduction, CONF_TYPE_INT, CONF_RANGE, 0, 100, NULL}, | |
11586 | 302 {"kfthreshold", &xvidenc_vbr_kfthreshold, CONF_TYPE_INT, CONF_MIN, 0, 0, NULL}, |
11437 | 303 {"container_frame_overhead", &xvidenc_vbr_container_frame_overhead, CONF_TYPE_INT, CONF_MIN, 0, 0, NULL}, |
304 | |
32574
59ecb59c86cc
Expose the VBV options of xvid encoder to the command line interface.
iive
parents:
32537
diff
changeset
|
305 /* section [vbv] */ |
59ecb59c86cc
Expose the VBV options of xvid encoder to the command line interface.
iive
parents:
32537
diff
changeset
|
306 {"vbv_bufsize", &xvidenc_vbv_size, CONF_TYPE_INT, CONF_MIN, 0, 0, NULL}, |
59ecb59c86cc
Expose the VBV options of xvid encoder to the command line interface.
iive
parents:
32537
diff
changeset
|
307 {"vbv_initial", &xvidenc_vbv_initial, CONF_TYPE_INT, CONF_MIN, 0, 0, NULL}, |
59ecb59c86cc
Expose the VBV options of xvid encoder to the command line interface.
iive
parents:
32537
diff
changeset
|
308 {"vbv_maxrate", &xvidenc_vbv_maxrate, CONF_TYPE_INT, CONF_MIN, 0, 0, NULL}, |
59ecb59c86cc
Expose the VBV options of xvid encoder to the command line interface.
iive
parents:
32537
diff
changeset
|
309 |
11437 | 310 /* Section Aspect Ratio */ |
311 {"par", &xvidenc_par, CONF_TYPE_STRING, 0, 0, 0, NULL}, | |
312 {"par_width", &xvidenc_par_width, CONF_TYPE_INT, CONF_RANGE, 0, 255, NULL}, | |
313 {"par_height", &xvidenc_par_height, CONF_TYPE_INT, CONF_RANGE, 0, 255, NULL}, | |
11912
8eb96d751dcd
new options - aspect,autoaspect,turbo,chroma_opt. patch by Nico <nsabbi@tiscali.it> and Edouard Gomez
iive
parents:
11586
diff
changeset
|
314 {"aspect", &xvidenc_dar_aspect, CONF_TYPE_FLOAT, CONF_RANGE, 0.1, 9.99, NULL}, |
8eb96d751dcd
new options - aspect,autoaspect,turbo,chroma_opt. patch by Nico <nsabbi@tiscali.it> and Edouard Gomez
iive
parents:
11586
diff
changeset
|
315 {"autoaspect", &xvidenc_autoaspect, CONF_TYPE_FLAG, 0, 0, 1, NULL}, |
13853
5a786c7e4df4
have each XviD's option flag have its (no)counterpart
gpoirier
parents:
13675
diff
changeset
|
316 {"noautoaspect", &xvidenc_autoaspect, CONF_TYPE_FLAG, 0, 1, 0, NULL}, |
11437 | 317 |
15619
ccf2c61afacd
XviD zones support. Patch by Doom9: < feedback123 GROOVY doom9 STEADY org >
gpoirier
parents:
15070
diff
changeset
|
318 /* Section Zones */ |
ccf2c61afacd
XviD zones support. Patch by Doom9: < feedback123 GROOVY doom9 STEADY org >
gpoirier
parents:
15070
diff
changeset
|
319 {"zones", &xvidenc_zones, CONF_TYPE_STRING, 0, 0, 0, NULL}, |
ccf2c61afacd
XviD zones support. Patch by Doom9: < feedback123 GROOVY doom9 STEADY org >
gpoirier
parents:
15070
diff
changeset
|
320 |
16481
beebfccc00f1
adds Simple, Advanced Simple and DivX profile support for XviD, Patch by Robert Swain < robert POUM swain AH gmail POUM com >
gpoirier
parents:
15664
diff
changeset
|
321 /* section profiles */ |
beebfccc00f1
adds Simple, Advanced Simple and DivX profile support for XviD, Patch by Robert Swain < robert POUM swain AH gmail POUM com >
gpoirier
parents:
15664
diff
changeset
|
322 {"profile", &xvidenc_profile, CONF_TYPE_STRING, 0, 0, 0, NULL}, |
beebfccc00f1
adds Simple, Advanced Simple and DivX profile support for XviD, Patch by Robert Swain < robert POUM swain AH gmail POUM com >
gpoirier
parents:
15664
diff
changeset
|
323 |
11437 | 324 /* End of the config array */ |
325 {NULL, 0, 0, 0, 0, 0, NULL} | |
326 }; | |
327 | |
328 /***************************************************************************** | |
329 * Module private data | |
330 ****************************************************************************/ | |
331 | |
25607
9d0b189ce1b2
Fix illegal identifiers: Names starting with __ or _ and uppercase are reserved
diego
parents:
24735
diff
changeset
|
332 typedef struct xvid_mplayer_module_t |
11437 | 333 { |
334 /* Instance related global vars */ | |
335 void *instance; | |
336 xvid_gbl_init_t init; | |
337 xvid_enc_create_t create; | |
338 xvid_enc_frame_t frame; | |
339 xvid_plugin_single_t onepass; | |
340 xvid_plugin_2pass1_t pass1; | |
341 xvid_plugin_2pass2_t pass2; | |
342 | |
343 /* This data must survive local block scope, so here it is */ | |
344 xvid_enc_plugin_t plugins[7]; | |
15619
ccf2c61afacd
XviD zones support. Patch by Doom9: < feedback123 GROOVY doom9 STEADY org >
gpoirier
parents:
15070
diff
changeset
|
345 xvid_enc_zone_t zones[MAX_ZONES]; |
11437 | 346 |
347 /* MPEG4 stream buffer */ | |
348 muxer_stream_t *mux; | |
349 | |
350 /* Stats accumulators */ | |
351 int frames; | |
352 long long sse_y; | |
353 long long sse_u; | |
354 long long sse_v; | |
355 | |
356 /* Min & Max PSNR */ | |
357 int min_sse_y; | |
358 int min_sse_u; | |
359 int min_sse_v; | |
11920 | 360 int min_framenum; |
11437 | 361 int max_sse_y; |
362 int max_sse_u; | |
363 int max_sse_v; | |
11920 | 364 int max_framenum; |
29263
0f1b5b68af32
whitespace cosmetics: Remove all trailing whitespace.
diego
parents:
28186
diff
changeset
|
365 |
11920 | 366 int pixels; |
29263
0f1b5b68af32
whitespace cosmetics: Remove all trailing whitespace.
diego
parents:
28186
diff
changeset
|
367 |
13610 | 368 /* DAR/PAR and all that thingies */ |
369 int d_width; | |
370 int d_height; | |
371 FILE *fvstats; | |
11437 | 372 } xvid_mplayer_module_t; |
373 | |
16481
beebfccc00f1
adds Simple, Advanced Simple and DivX profile support for XviD, Patch by Robert Swain < robert POUM swain AH gmail POUM com >
gpoirier
parents:
15664
diff
changeset
|
374 static int dispatch_settings(xvid_mplayer_module_t *mod); |
11437 | 375 static int set_create_struct(xvid_mplayer_module_t *mod); |
376 static int set_frame_struct(xvid_mplayer_module_t *mod, mp_image_t *mpi); | |
13610 | 377 static void update_stats(xvid_mplayer_module_t *mod, xvid_enc_stats_t *stats); |
378 static void print_stats(xvid_mplayer_module_t *mod); | |
379 static void flush_internal_buffers(xvid_mplayer_module_t *mod); | |
380 static const char *par_string(int parcode); | |
11437 | 381 static const char *errorstring(int err); |
382 | |
383 /***************************************************************************** | |
384 * Video Filter API function definitions | |
385 ****************************************************************************/ | |
386 | |
387 /*============================================================================ | |
388 * config | |
389 *==========================================================================*/ | |
390 | |
391 static int | |
30642
a972c1a4a012
cosmetics: Rename struct vf_instance_s --> vf_instance.
diego
parents:
29263
diff
changeset
|
392 config(struct vf_instance *vf, |
11437 | 393 int width, int height, int d_width, int d_height, |
394 unsigned int flags, unsigned int outfmt) | |
395 { | |
396 int err; | |
397 xvid_mplayer_module_t *mod = (xvid_mplayer_module_t *)vf->priv; | |
29263
0f1b5b68af32
whitespace cosmetics: Remove all trailing whitespace.
diego
parents:
28186
diff
changeset
|
398 |
11437 | 399 /* Complete the muxer initialization */ |
400 mod->mux->bih->biWidth = width; | |
401 mod->mux->bih->biHeight = height; | |
29263
0f1b5b68af32
whitespace cosmetics: Remove all trailing whitespace.
diego
parents:
28186
diff
changeset
|
402 mod->mux->bih->biSizeImage = |
13610 | 403 mod->mux->bih->biWidth * mod->mux->bih->biHeight * 3 / 2; |
12061 | 404 mod->mux->aspect = (float)d_width/d_height; |
11437 | 405 |
406 /* Message the FourCC type */ | |
407 mp_msg(MSGT_MENCODER, MSGL_INFO, | |
26883 | 408 "videocodec: XviD (%dx%d fourcc=%x [%.4s])\n", |
11437 | 409 width, height, mod->mux->bih->biCompression, |
410 (char *)&mod->mux->bih->biCompression); | |
411 | |
13610 | 412 /* Total number of pixels per frame required for PSNR */ |
413 mod->pixels = mod->mux->bih->biWidth*mod->mux->bih->biHeight; | |
414 | |
11437 | 415 /*-------------------------------------------------------------------- |
26883 | 416 * Dispatch all module settings to XviD structures |
11437 | 417 *------------------------------------------------------------------*/ |
418 | |
11912
8eb96d751dcd
new options - aspect,autoaspect,turbo,chroma_opt. patch by Nico <nsabbi@tiscali.it> and Edouard Gomez
iive
parents:
11586
diff
changeset
|
419 mod->d_width = d_width; |
8eb96d751dcd
new options - aspect,autoaspect,turbo,chroma_opt. patch by Nico <nsabbi@tiscali.it> and Edouard Gomez
iive
parents:
11586
diff
changeset
|
420 mod->d_height = d_height; |
8eb96d751dcd
new options - aspect,autoaspect,turbo,chroma_opt. patch by Nico <nsabbi@tiscali.it> and Edouard Gomez
iive
parents:
11586
diff
changeset
|
421 |
16481
beebfccc00f1
adds Simple, Advanced Simple and DivX profile support for XviD, Patch by Robert Swain < robert POUM swain AH gmail POUM com >
gpoirier
parents:
15664
diff
changeset
|
422 if(dispatch_settings(mod) == BAD) |
26754
63630c09e237
cosmetics: Remove pointless parentheses from return calls.
diego
parents:
26727
diff
changeset
|
423 return BAD; |
11437 | 424 |
425 /*-------------------------------------------------------------------- | |
426 * Set remaining information in the xvid_enc_create_t structure | |
427 *------------------------------------------------------------------*/ | |
428 | |
429 if(set_create_struct(mod) == BAD) | |
26754
63630c09e237
cosmetics: Remove pointless parentheses from return calls.
diego
parents:
26727
diff
changeset
|
430 return BAD; |
11437 | 431 |
432 /*-------------------------------------------------------------------- | |
433 * Encoder instance creation | |
434 *------------------------------------------------------------------*/ | |
435 | |
436 err = xvid_encore(NULL, XVID_ENC_CREATE, &mod->create, NULL); | |
437 | |
438 if(err<0) { | |
439 mp_msg(MSGT_MENCODER, MSGL_ERR, | |
440 "xvid: xvidcore returned a '%s' error\n", errorstring(err)); | |
26754
63630c09e237
cosmetics: Remove pointless parentheses from return calls.
diego
parents:
26727
diff
changeset
|
441 return BAD; |
11437 | 442 } |
29263
0f1b5b68af32
whitespace cosmetics: Remove all trailing whitespace.
diego
parents:
28186
diff
changeset
|
443 |
11437 | 444 /* Store the encoder instance into the private data */ |
445 mod->instance = mod->create.handle; | |
446 | |
17659 | 447 mod->mux->decoder_delay = mod->create.max_bframes ? 1 : 0; |
448 | |
26754
63630c09e237
cosmetics: Remove pointless parentheses from return calls.
diego
parents:
26727
diff
changeset
|
449 return FINE; |
11437 | 450 } |
451 | |
452 /*============================================================================ | |
453 * uninit | |
454 *==========================================================================*/ | |
455 | |
456 static void | |
30642
a972c1a4a012
cosmetics: Rename struct vf_instance_s --> vf_instance.
diego
parents:
29263
diff
changeset
|
457 uninit(struct vf_instance *vf) |
11437 | 458 { |
459 | |
460 xvid_mplayer_module_t *mod = (xvid_mplayer_module_t *)vf->priv; | |
461 | |
462 /* Destroy xvid instance */ | |
463 xvid_encore(mod->instance, XVID_ENC_DESTROY, NULL, NULL); | |
464 | |
13610 | 465 /* Display stats (if any) */ |
466 print_stats(mod); | |
11437 | 467 |
13610 | 468 /* Close PSNR file if ever opened */ |
469 if (mod->fvstats) { | |
470 fclose(mod->fvstats); | |
471 mod->fvstats = NULL; | |
11437 | 472 } |
473 | |
13610 | 474 /* Free allocated memory */ |
32537
8fa2f43cb760
Remove most of the NULL pointer check before free all over the code
cboesch
parents:
32479
diff
changeset
|
475 free(mod->frame.quant_intra_matrix); |
8fa2f43cb760
Remove most of the NULL pointer check before free all over the code
cboesch
parents:
32479
diff
changeset
|
476 free(mod->frame.quant_inter_matrix); |
8fa2f43cb760
Remove most of the NULL pointer check before free all over the code
cboesch
parents:
32479
diff
changeset
|
477 free(mod->mux->bih); |
13610 | 478 free(vf->priv); |
479 vf->priv=NULL; | |
11437 | 480 |
481 return; | |
482 } | |
483 | |
484 /*============================================================================ | |
485 * control | |
486 *==========================================================================*/ | |
487 | |
488 static int | |
30642
a972c1a4a012
cosmetics: Rename struct vf_instance_s --> vf_instance.
diego
parents:
29263
diff
changeset
|
489 control(struct vf_instance *vf, int request, void* data) |
11437 | 490 { |
13610 | 491 xvid_mplayer_module_t *mod = (xvid_mplayer_module_t *)vf->priv; |
492 | |
493 switch(request){ | |
494 case VFCTRL_FLUSH_FRAMES: | |
495 if(mod)/*paranoid*/ | |
496 flush_internal_buffers(mod); | |
497 break; | |
498 } | |
26754
63630c09e237
cosmetics: Remove pointless parentheses from return calls.
diego
parents:
26727
diff
changeset
|
499 return CONTROL_UNKNOWN; |
11437 | 500 } |
501 | |
502 /*============================================================================ | |
503 * query_format | |
504 *==========================================================================*/ | |
505 | |
506 static int | |
30642
a972c1a4a012
cosmetics: Rename struct vf_instance_s --> vf_instance.
diego
parents:
29263
diff
changeset
|
507 query_format(struct vf_instance *vf, unsigned int fmt) |
11437 | 508 { |
509 switch(fmt){ | |
510 case IMGFMT_YV12: | |
511 case IMGFMT_IYUV: | |
512 case IMGFMT_I420: | |
26754
63630c09e237
cosmetics: Remove pointless parentheses from return calls.
diego
parents:
26727
diff
changeset
|
513 return VFCAP_CSP_SUPPORTED | VFCAP_CSP_SUPPORTED_BY_HW; |
11437 | 514 case IMGFMT_YUY2: |
515 case IMGFMT_UYVY: | |
26754
63630c09e237
cosmetics: Remove pointless parentheses from return calls.
diego
parents:
26727
diff
changeset
|
516 return VFCAP_CSP_SUPPORTED; |
11437 | 517 } |
26754
63630c09e237
cosmetics: Remove pointless parentheses from return calls.
diego
parents:
26727
diff
changeset
|
518 return BAD; |
11437 | 519 } |
520 | |
521 /*============================================================================ | |
522 * put_image | |
523 *==========================================================================*/ | |
524 | |
525 static int | |
30642
a972c1a4a012
cosmetics: Rename struct vf_instance_s --> vf_instance.
diego
parents:
29263
diff
changeset
|
526 put_image(struct vf_instance *vf, mp_image_t *mpi, double pts) |
11437 | 527 { |
528 int size; | |
29263
0f1b5b68af32
whitespace cosmetics: Remove all trailing whitespace.
diego
parents:
28186
diff
changeset
|
529 xvid_enc_stats_t stats; |
11437 | 530 xvid_mplayer_module_t *mod = (xvid_mplayer_module_t *)vf->priv; |
531 | |
532 /* Prepare the stats */ | |
533 memset(&stats,0,sizeof( xvid_enc_stats_t)); | |
534 stats.version = XVID_VERSION; | |
535 | |
536 /* ------------------------------------------------------------------- | |
537 * Set remaining information in the xvid_enc_frame_t structure | |
538 * NB: all the other struct members were initialized by | |
539 * dispatch_settings | |
540 * -----------------------------------------------------------------*/ | |
541 | |
542 if(set_frame_struct(mod, mpi) == BAD) | |
26754
63630c09e237
cosmetics: Remove pointless parentheses from return calls.
diego
parents:
26727
diff
changeset
|
543 return BAD; |
11437 | 544 |
32479 | 545 mod->frame.type = is_forced_key_frame(pts) || xvidenc_motion == 0 ? |
546 XVID_TYPE_IVOP : XVID_TYPE_AUTO; | |
547 | |
11437 | 548 /* ------------------------------------------------------------------- |
549 * Encode the frame | |
550 * ---------------------------------------------------------------- */ | |
551 | |
552 size = xvid_encore(mod->instance, XVID_ENC_ENCODE, &mod->frame, &stats); | |
553 | |
554 /* Analyse the returned value */ | |
555 if(size<0) { | |
556 mp_msg(MSGT_MENCODER, MSGL_ERR, | |
557 "xvid: xvidcore returned a '%s' error\n", errorstring(size)); | |
26754
63630c09e237
cosmetics: Remove pointless parentheses from return calls.
diego
parents:
26727
diff
changeset
|
558 return BAD; |
11437 | 559 } |
560 | |
561 /* If size is == 0, we're done with that frame */ | |
17659 | 562 if(size == 0) { |
563 ++mod->mux->encoder_delay; | |
26754
63630c09e237
cosmetics: Remove pointless parentheses from return calls.
diego
parents:
26727
diff
changeset
|
564 return FINE; |
17659 | 565 } |
11437 | 566 |
13610 | 567 /* xvidcore returns stats about encoded frame in an asynchronous way |
568 * accumulate these stats */ | |
569 update_stats(mod, &stats); | |
11437 | 570 |
571 /* xvidcore outputed bitstream -- mux it */ | |
572 muxer_write_chunk(mod->mux, | |
573 size, | |
17487
fa17424b4c7b
change muxer_write_chunk() so that pts/dts _could_ be passed from encoder to muxer
michael
parents:
17012
diff
changeset
|
574 (mod->frame.out_flags & XVID_KEYFRAME)?0x10:0, MP_NOPTS_VALUE, MP_NOPTS_VALUE); |
11437 | 575 |
26754
63630c09e237
cosmetics: Remove pointless parentheses from return calls.
diego
parents:
26727
diff
changeset
|
576 return FINE; |
11437 | 577 } |
578 | |
579 /*============================================================================ | |
580 * vf_open | |
581 *==========================================================================*/ | |
582 | |
583 static int | |
584 vf_open(vf_instance_t *vf, char* args) | |
585 { | |
586 xvid_mplayer_module_t *mod; | |
587 xvid_gbl_init_t xvid_gbl_init; | |
588 xvid_gbl_info_t xvid_gbl_info; | |
589 | |
590 /* Setting libmpcodec module API pointers */ | |
591 vf->config = config; | |
14878 | 592 vf->default_caps = VFCAP_CONSTANT; |
11437 | 593 vf->control = control; |
594 vf->uninit = uninit; | |
595 vf->query_format = query_format; | |
596 vf->put_image = put_image; | |
597 | |
598 /* Allocate the private part of the codec module */ | |
599 vf->priv = malloc(sizeof(xvid_mplayer_module_t)); | |
600 mod = (xvid_mplayer_module_t*)vf->priv; | |
601 | |
602 if(mod == NULL) { | |
603 mp_msg(MSGT_MENCODER,MSGL_ERR, | |
604 "xvid: memory allocation failure (private data)\n"); | |
26754
63630c09e237
cosmetics: Remove pointless parentheses from return calls.
diego
parents:
26727
diff
changeset
|
605 return BAD; |
11437 | 606 } |
607 | |
608 /* Initialize the module to zeros */ | |
609 memset(mod, 0, sizeof(xvid_mplayer_module_t)); | |
610 mod->min_sse_y = mod->min_sse_u = mod->min_sse_v = INT_MAX; | |
611 mod->max_sse_y = mod->max_sse_u = mod->max_sse_v = INT_MIN; | |
612 | |
613 /* Bind the Muxer */ | |
614 mod->mux = (muxer_stream_t*)args; | |
615 | |
616 /* Initialize muxer BITMAP header */ | |
32123 | 617 mod->mux->bih = calloc(1, sizeof(*mod->mux->bih)); |
11437 | 618 |
619 if(mod->mux->bih == NULL) { | |
620 mp_msg(MSGT_MENCODER,MSGL_ERR, | |
621 "xvid: memory allocation failure (BITMAP header)\n"); | |
26754
63630c09e237
cosmetics: Remove pointless parentheses from return calls.
diego
parents:
26727
diff
changeset
|
622 return BAD; |
11437 | 623 } |
624 | |
32123 | 625 mod->mux->bih->biSize = sizeof(*mod->mux->bih); |
11437 | 626 mod->mux->bih->biWidth = 0; |
627 mod->mux->bih->biHeight = 0; | |
628 mod->mux->bih->biPlanes = 1; | |
13610 | 629 mod->mux->bih->biBitCount = 12; |
11437 | 630 mod->mux->bih->biCompression = mmioFOURCC('X','V','I','D'); |
631 | |
26883 | 632 /* Retrieve information about the host XviD library */ |
11437 | 633 memset(&xvid_gbl_info, 0, sizeof(xvid_gbl_info_t)); |
634 xvid_gbl_info.version = XVID_VERSION; | |
635 | |
636 if (xvid_global(NULL, XVID_GBL_INFO, &xvid_gbl_info, NULL) < 0) { | |
13610 | 637 mp_msg(MSGT_MENCODER,MSGL_WARN, "xvid: could not get information about the library\n"); |
11437 | 638 } else { |
639 mp_msg(MSGT_MENCODER,MSGL_INFO, "xvid: using library version %d.%d.%d (build %s)\n", | |
640 XVID_VERSION_MAJOR(xvid_gbl_info.actual_version), | |
641 XVID_VERSION_MINOR(xvid_gbl_info.actual_version), | |
642 XVID_VERSION_PATCH(xvid_gbl_info.actual_version), | |
643 xvid_gbl_info.build); | |
644 } | |
29263
0f1b5b68af32
whitespace cosmetics: Remove all trailing whitespace.
diego
parents:
28186
diff
changeset
|
645 |
11437 | 646 /* Initialize the xvid_gbl_init structure */ |
647 memset(&xvid_gbl_init, 0, sizeof(xvid_gbl_init_t)); | |
648 xvid_gbl_init.version = XVID_VERSION; | |
11920 | 649 xvid_gbl_init.debug = xvidenc_debug; |
11437 | 650 |
651 /* Initialize the xvidcore library */ | |
652 if (xvid_global(NULL, XVID_GBL_INIT, &xvid_gbl_init, NULL) < 0) { | |
653 mp_msg(MSGT_MENCODER,MSGL_ERR, "xvid: initialisation failure\n"); | |
26754
63630c09e237
cosmetics: Remove pointless parentheses from return calls.
diego
parents:
26727
diff
changeset
|
654 return BAD; |
11437 | 655 } |
656 | |
26754
63630c09e237
cosmetics: Remove pointless parentheses from return calls.
diego
parents:
26727
diff
changeset
|
657 return FINE; |
11437 | 658 } |
659 | |
660 /***************************************************************************** | |
661 * Helper functions | |
662 ****************************************************************************/ | |
663 | |
664 static void *read_matrix(unsigned char *filename); | |
665 | |
16481
beebfccc00f1
adds Simple, Advanced Simple and DivX profile support for XviD, Patch by Robert Swain < robert POUM swain AH gmail POUM com >
gpoirier
parents:
15664
diff
changeset
|
666 static int dispatch_settings(xvid_mplayer_module_t *mod) |
11437 | 667 { |
668 xvid_enc_create_t *create = &mod->create; | |
669 xvid_enc_frame_t *frame = &mod->frame; | |
670 xvid_plugin_single_t *onepass = &mod->onepass; | |
671 xvid_plugin_2pass2_t *pass2 = &mod->pass2; | |
24295
de8e36aec5ff
Remove imported rational calculation code and use the original one from avutil.
iive
parents:
22601
diff
changeset
|
672 AVRational ar; |
11437 | 673 |
674 const int motion_presets[7] = | |
675 { | |
676 0, | |
677 0, | |
678 0, | |
679 0, | |
680 XVID_ME_HALFPELREFINE16, | |
681 XVID_ME_HALFPELREFINE16 | XVID_ME_ADVANCEDDIAMOND16, | |
682 XVID_ME_HALFPELREFINE16 | XVID_ME_EXTSEARCH16 | | |
683 XVID_ME_HALFPELREFINE8 | XVID_ME_USESQUARES16 | |
684 }; | |
685 | |
16615 | 686 //profile is unrestricted as default |
28186
79aef31ed618
XVID profile array should be const, so it is in rodata
reimar
parents:
26883
diff
changeset
|
687 const profile_t *selected_profile = profileFromName("unrestricted"); |
16615 | 688 if(xvidenc_profile) |
689 selected_profile = profileFromName(xvidenc_profile); | |
690 if(!selected_profile) | |
691 { | |
692 mp_msg(MSGT_MENCODER,MSGL_ERR, | |
693 "xvid:[ERROR] \"%s\" is an invalid profile name\n", xvidenc_profile); | |
26754
63630c09e237
cosmetics: Remove pointless parentheses from return calls.
diego
parents:
26727
diff
changeset
|
694 return BAD; |
16615 | 695 } |
29263
0f1b5b68af32
whitespace cosmetics: Remove all trailing whitespace.
diego
parents:
28186
diff
changeset
|
696 |
11437 | 697 /* ------------------------------------------------------------------- |
698 * Dispatch all settings having an impact on the "create" structure | |
699 * This includes plugins as they are passed to encore through the | |
700 * create structure | |
701 * -----------------------------------------------------------------*/ | |
702 | |
703 /* ------------------------------------------------------------------- | |
704 * The create structure | |
705 * ---------------------------------------------------------------- */ | |
706 | |
707 create->global = 0; | |
708 | |
11920 | 709 if(xvidenc_psnr) |
710 xvidenc_stats = 1; | |
711 | |
11437 | 712 if(xvidenc_stats) |
713 create->global |= XVID_GLOBAL_EXTRASTATS_ENABLE; | |
714 | |
715 create->num_zones = 0; | |
716 create->zones = NULL; | |
717 create->num_plugins = 0; | |
718 create->plugins = NULL; | |
17703 | 719 create->num_threads = xvidenc_num_threads; |
16481
beebfccc00f1
adds Simple, Advanced Simple and DivX profile support for XviD, Patch by Robert Swain < robert POUM swain AH gmail POUM com >
gpoirier
parents:
15664
diff
changeset
|
720 |
beebfccc00f1
adds Simple, Advanced Simple and DivX profile support for XviD, Patch by Robert Swain < robert POUM swain AH gmail POUM com >
gpoirier
parents:
15664
diff
changeset
|
721 if( (selected_profile->flags & PROFILE_BVOP) && |
beebfccc00f1
adds Simple, Advanced Simple and DivX profile support for XviD, Patch by Robert Swain < robert POUM swain AH gmail POUM com >
gpoirier
parents:
15664
diff
changeset
|
722 /* dxn: prevent bframes usage if interlacing is selected */ |
beebfccc00f1
adds Simple, Advanced Simple and DivX profile support for XviD, Patch by Robert Swain < robert POUM swain AH gmail POUM com >
gpoirier
parents:
15664
diff
changeset
|
723 !((selected_profile->flags & PROFILE_DXN) && xvidenc_interlaced) ) |
beebfccc00f1
adds Simple, Advanced Simple and DivX profile support for XviD, Patch by Robert Swain < robert POUM swain AH gmail POUM com >
gpoirier
parents:
15664
diff
changeset
|
724 { |
11437 | 725 create->max_bframes = xvidenc_max_bframes; |
726 create->bquant_ratio = xvidenc_bquant_ratio; | |
727 create->bquant_offset = xvidenc_bquant_offset; | |
16481
beebfccc00f1
adds Simple, Advanced Simple and DivX profile support for XviD, Patch by Robert Swain < robert POUM swain AH gmail POUM com >
gpoirier
parents:
15664
diff
changeset
|
728 if(xvidenc_packed) |
beebfccc00f1
adds Simple, Advanced Simple and DivX profile support for XviD, Patch by Robert Swain < robert POUM swain AH gmail POUM com >
gpoirier
parents:
15664
diff
changeset
|
729 create->global |= XVID_GLOBAL_PACKED; |
beebfccc00f1
adds Simple, Advanced Simple and DivX profile support for XviD, Patch by Robert Swain < robert POUM swain AH gmail POUM com >
gpoirier
parents:
15664
diff
changeset
|
730 if(xvidenc_closed_gop) |
beebfccc00f1
adds Simple, Advanced Simple and DivX profile support for XviD, Patch by Robert Swain < robert POUM swain AH gmail POUM com >
gpoirier
parents:
15664
diff
changeset
|
731 create->global |= XVID_GLOBAL_CLOSED_GOP; |
beebfccc00f1
adds Simple, Advanced Simple and DivX profile support for XviD, Patch by Robert Swain < robert POUM swain AH gmail POUM com >
gpoirier
parents:
15664
diff
changeset
|
732 |
beebfccc00f1
adds Simple, Advanced Simple and DivX profile support for XviD, Patch by Robert Swain < robert POUM swain AH gmail POUM com >
gpoirier
parents:
15664
diff
changeset
|
733 /* dxn: restrict max bframes, require closed gop |
beebfccc00f1
adds Simple, Advanced Simple and DivX profile support for XviD, Patch by Robert Swain < robert POUM swain AH gmail POUM com >
gpoirier
parents:
15664
diff
changeset
|
734 and require packed b-frames */ |
beebfccc00f1
adds Simple, Advanced Simple and DivX profile support for XviD, Patch by Robert Swain < robert POUM swain AH gmail POUM com >
gpoirier
parents:
15664
diff
changeset
|
735 if(selected_profile->flags & PROFILE_DXN) |
beebfccc00f1
adds Simple, Advanced Simple and DivX profile support for XviD, Patch by Robert Swain < robert POUM swain AH gmail POUM com >
gpoirier
parents:
15664
diff
changeset
|
736 { |
beebfccc00f1
adds Simple, Advanced Simple and DivX profile support for XviD, Patch by Robert Swain < robert POUM swain AH gmail POUM com >
gpoirier
parents:
15664
diff
changeset
|
737 if(create->max_bframes > selected_profile->dxn_max_bframes) |
beebfccc00f1
adds Simple, Advanced Simple and DivX profile support for XviD, Patch by Robert Swain < robert POUM swain AH gmail POUM com >
gpoirier
parents:
15664
diff
changeset
|
738 create->max_bframes = selected_profile->dxn_max_bframes; |
beebfccc00f1
adds Simple, Advanced Simple and DivX profile support for XviD, Patch by Robert Swain < robert POUM swain AH gmail POUM com >
gpoirier
parents:
15664
diff
changeset
|
739 create->global |= XVID_GLOBAL_CLOSED_GOP; |
beebfccc00f1
adds Simple, Advanced Simple and DivX profile support for XviD, Patch by Robert Swain < robert POUM swain AH gmail POUM com >
gpoirier
parents:
15664
diff
changeset
|
740 create->global |= XVID_GLOBAL_PACKED; |
beebfccc00f1
adds Simple, Advanced Simple and DivX profile support for XviD, Patch by Robert Swain < robert POUM swain AH gmail POUM com >
gpoirier
parents:
15664
diff
changeset
|
741 } |
beebfccc00f1
adds Simple, Advanced Simple and DivX profile support for XviD, Patch by Robert Swain < robert POUM swain AH gmail POUM com >
gpoirier
parents:
15664
diff
changeset
|
742 } |
beebfccc00f1
adds Simple, Advanced Simple and DivX profile support for XviD, Patch by Robert Swain < robert POUM swain AH gmail POUM com >
gpoirier
parents:
15664
diff
changeset
|
743 else |
beebfccc00f1
adds Simple, Advanced Simple and DivX profile support for XviD, Patch by Robert Swain < robert POUM swain AH gmail POUM com >
gpoirier
parents:
15664
diff
changeset
|
744 create->max_bframes = 0; |
beebfccc00f1
adds Simple, Advanced Simple and DivX profile support for XviD, Patch by Robert Swain < robert POUM swain AH gmail POUM com >
gpoirier
parents:
15664
diff
changeset
|
745 |
16515
1218c5859ce8
10l: fully working DXN profile support require XviD 1.1.x. Earlier version will work but will lack VBV support
gpoirier
parents:
16481
diff
changeset
|
746 #if XVID_API >= XVID_MAKE_API(4,1) |
16481
beebfccc00f1
adds Simple, Advanced Simple and DivX profile support for XviD, Patch by Robert Swain < robert POUM swain AH gmail POUM com >
gpoirier
parents:
15664
diff
changeset
|
747 /* dxn: always write divx5 userdata */ |
beebfccc00f1
adds Simple, Advanced Simple and DivX profile support for XviD, Patch by Robert Swain < robert POUM swain AH gmail POUM com >
gpoirier
parents:
15664
diff
changeset
|
748 if(selected_profile->flags & PROFILE_DXN) |
beebfccc00f1
adds Simple, Advanced Simple and DivX profile support for XviD, Patch by Robert Swain < robert POUM swain AH gmail POUM com >
gpoirier
parents:
15664
diff
changeset
|
749 create->global |= XVID_GLOBAL_DIVX5_USERDATA; |
16515
1218c5859ce8
10l: fully working DXN profile support require XviD 1.1.x. Earlier version will work but will lack VBV support
gpoirier
parents:
16481
diff
changeset
|
750 #endif |
29263
0f1b5b68af32
whitespace cosmetics: Remove all trailing whitespace.
diego
parents:
28186
diff
changeset
|
751 |
11437 | 752 create->max_key_interval = xvidenc_max_key_interval; |
753 create->frame_drop_ratio = xvidenc_frame_drop_ratio; | |
754 create->min_quant[0] = xvidenc_min_quant[0]; | |
755 create->min_quant[1] = xvidenc_min_quant[1]; | |
756 create->min_quant[2] = xvidenc_min_quant[2]; | |
757 create->max_quant[0] = xvidenc_max_quant[0]; | |
758 create->max_quant[1] = xvidenc_max_quant[1]; | |
759 create->max_quant[2] = xvidenc_max_quant[2]; | |
760 | |
761 | |
762 /* ------------------------------------------------------------------- | |
763 * The single pass plugin | |
764 * ---------------------------------------------------------------- */ | |
765 | |
13675
d4cba4c4c54c
Bitrate setting option in ve_xvid4.c doesn't follow the rules described
rathann
parents:
13610
diff
changeset
|
766 if (xvidenc_bitrate > 16000) onepass->bitrate = xvidenc_bitrate; |
d4cba4c4c54c
Bitrate setting option in ve_xvid4.c doesn't follow the rules described
rathann
parents:
13610
diff
changeset
|
767 else onepass->bitrate = xvidenc_bitrate*1000; |
11437 | 768 onepass->reaction_delay_factor = xvidenc_cbr_reaction_delay_factor; |
769 onepass->averaging_period = xvidenc_cbr_averaging_period; | |
770 onepass->buffer = xvidenc_cbr_buffer; | |
771 | |
772 /* ------------------------------------------------------------------- | |
773 * The pass2 plugin | |
774 * ---------------------------------------------------------------- */ | |
775 | |
776 pass2->keyframe_boost = xvidenc_vbr_keyframe_boost; | |
777 pass2->overflow_control_strength = xvidenc_vbr_overflow_control_strength; | |
778 pass2->curve_compression_high = xvidenc_vbr_curve_compression_high; | |
779 pass2->curve_compression_low = xvidenc_vbr_curve_compression_low; | |
780 pass2->max_overflow_improvement = xvidenc_vbr_max_overflow_improvement; | |
781 pass2->max_overflow_degradation = xvidenc_vbr_max_overflow_degradation; | |
782 pass2->kfreduction = xvidenc_vbr_kfreduction; | |
11586 | 783 pass2->kfthreshold = xvidenc_vbr_kfthreshold; |
11437 | 784 pass2->container_frame_overhead = xvidenc_vbr_container_frame_overhead; |
785 | |
16481
beebfccc00f1
adds Simple, Advanced Simple and DivX profile support for XviD, Patch by Robert Swain < robert POUM swain AH gmail POUM com >
gpoirier
parents:
15664
diff
changeset
|
786 /* VBV */ |
beebfccc00f1
adds Simple, Advanced Simple and DivX profile support for XviD, Patch by Robert Swain < robert POUM swain AH gmail POUM com >
gpoirier
parents:
15664
diff
changeset
|
787 |
16515
1218c5859ce8
10l: fully working DXN profile support require XviD 1.1.x. Earlier version will work but will lack VBV support
gpoirier
parents:
16481
diff
changeset
|
788 #if XVID_API >= XVID_MAKE_API(4,1) |
32574
59ecb59c86cc
Expose the VBV options of xvid encoder to the command line interface.
iive
parents:
32537
diff
changeset
|
789 if(xvidenc_vbv_size > 0) { |
59ecb59c86cc
Expose the VBV options of xvid encoder to the command line interface.
iive
parents:
32537
diff
changeset
|
790 if(selected_profile->max_vbv_size > 0 && xvidenc_vbv_size > selected_profile->max_vbv_size) { |
59ecb59c86cc
Expose the VBV options of xvid encoder to the command line interface.
iive
parents:
32537
diff
changeset
|
791 mp_msg(MSGT_MENCODER,MSGL_ERR, |
59ecb59c86cc
Expose the VBV options of xvid encoder to the command line interface.
iive
parents:
32537
diff
changeset
|
792 "xvid:[ERROR] Selected profile limits vbv_bufsize <= %d\n", selected_profile->max_vbv_size); |
59ecb59c86cc
Expose the VBV options of xvid encoder to the command line interface.
iive
parents:
32537
diff
changeset
|
793 return BAD; |
59ecb59c86cc
Expose the VBV options of xvid encoder to the command line interface.
iive
parents:
32537
diff
changeset
|
794 } |
59ecb59c86cc
Expose the VBV options of xvid encoder to the command line interface.
iive
parents:
32537
diff
changeset
|
795 |
59ecb59c86cc
Expose the VBV options of xvid encoder to the command line interface.
iive
parents:
32537
diff
changeset
|
796 pass2->vbv_size = xvidenc_vbv_size; |
59ecb59c86cc
Expose the VBV options of xvid encoder to the command line interface.
iive
parents:
32537
diff
changeset
|
797 } else { |
59ecb59c86cc
Expose the VBV options of xvid encoder to the command line interface.
iive
parents:
32537
diff
changeset
|
798 pass2->vbv_size = selected_profile->max_vbv_size; |
59ecb59c86cc
Expose the VBV options of xvid encoder to the command line interface.
iive
parents:
32537
diff
changeset
|
799 } |
59ecb59c86cc
Expose the VBV options of xvid encoder to the command line interface.
iive
parents:
32537
diff
changeset
|
800 |
59ecb59c86cc
Expose the VBV options of xvid encoder to the command line interface.
iive
parents:
32537
diff
changeset
|
801 if(xvidenc_vbv_initial > 0) { |
59ecb59c86cc
Expose the VBV options of xvid encoder to the command line interface.
iive
parents:
32537
diff
changeset
|
802 if(xvidenc_vbv_initial > pass2->vbv_size) { |
59ecb59c86cc
Expose the VBV options of xvid encoder to the command line interface.
iive
parents:
32537
diff
changeset
|
803 mp_msg(MSGT_MENCODER,MSGL_ERR, |
59ecb59c86cc
Expose the VBV options of xvid encoder to the command line interface.
iive
parents:
32537
diff
changeset
|
804 "xvid:[ERROR] vbv_initial must be <= vbv_bufsize\n"); |
59ecb59c86cc
Expose the VBV options of xvid encoder to the command line interface.
iive
parents:
32537
diff
changeset
|
805 return BAD; |
59ecb59c86cc
Expose the VBV options of xvid encoder to the command line interface.
iive
parents:
32537
diff
changeset
|
806 } |
59ecb59c86cc
Expose the VBV options of xvid encoder to the command line interface.
iive
parents:
32537
diff
changeset
|
807 |
59ecb59c86cc
Expose the VBV options of xvid encoder to the command line interface.
iive
parents:
32537
diff
changeset
|
808 pass2->vbv_initial = xvidenc_vbv_initial; |
59ecb59c86cc
Expose the VBV options of xvid encoder to the command line interface.
iive
parents:
32537
diff
changeset
|
809 } else { |
59ecb59c86cc
Expose the VBV options of xvid encoder to the command line interface.
iive
parents:
32537
diff
changeset
|
810 pass2->vbv_initial = (pass2->vbv_size*3)>>2; /* 75% */ |
59ecb59c86cc
Expose the VBV options of xvid encoder to the command line interface.
iive
parents:
32537
diff
changeset
|
811 } |
59ecb59c86cc
Expose the VBV options of xvid encoder to the command line interface.
iive
parents:
32537
diff
changeset
|
812 |
59ecb59c86cc
Expose the VBV options of xvid encoder to the command line interface.
iive
parents:
32537
diff
changeset
|
813 if(xvidenc_vbv_maxrate > 0) { |
59ecb59c86cc
Expose the VBV options of xvid encoder to the command line interface.
iive
parents:
32537
diff
changeset
|
814 if(selected_profile->max_bitrate > 0 && xvidenc_vbv_maxrate > selected_profile->max_bitrate) { |
59ecb59c86cc
Expose the VBV options of xvid encoder to the command line interface.
iive
parents:
32537
diff
changeset
|
815 mp_msg(MSGT_MENCODER,MSGL_ERR, |
59ecb59c86cc
Expose the VBV options of xvid encoder to the command line interface.
iive
parents:
32537
diff
changeset
|
816 "xvid:[ERROR] Selected profile limits vbv_maxrate <= %d\n", selected_profile->max_bitrate); |
59ecb59c86cc
Expose the VBV options of xvid encoder to the command line interface.
iive
parents:
32537
diff
changeset
|
817 return BAD; |
59ecb59c86cc
Expose the VBV options of xvid encoder to the command line interface.
iive
parents:
32537
diff
changeset
|
818 } |
59ecb59c86cc
Expose the VBV options of xvid encoder to the command line interface.
iive
parents:
32537
diff
changeset
|
819 |
59ecb59c86cc
Expose the VBV options of xvid encoder to the command line interface.
iive
parents:
32537
diff
changeset
|
820 pass2->vbv_maxrate = xvidenc_vbv_maxrate; |
59ecb59c86cc
Expose the VBV options of xvid encoder to the command line interface.
iive
parents:
32537
diff
changeset
|
821 } else { |
59ecb59c86cc
Expose the VBV options of xvid encoder to the command line interface.
iive
parents:
32537
diff
changeset
|
822 pass2->vbv_maxrate = selected_profile->max_bitrate; |
59ecb59c86cc
Expose the VBV options of xvid encoder to the command line interface.
iive
parents:
32537
diff
changeset
|
823 } |
59ecb59c86cc
Expose the VBV options of xvid encoder to the command line interface.
iive
parents:
32537
diff
changeset
|
824 |
59ecb59c86cc
Expose the VBV options of xvid encoder to the command line interface.
iive
parents:
32537
diff
changeset
|
825 pass2->vbv_peakrate = selected_profile->vbv_peakrate; /* Useless */ |
16515
1218c5859ce8
10l: fully working DXN profile support require XviD 1.1.x. Earlier version will work but will lack VBV support
gpoirier
parents:
16481
diff
changeset
|
826 #endif |
16481
beebfccc00f1
adds Simple, Advanced Simple and DivX profile support for XviD, Patch by Robert Swain < robert POUM swain AH gmail POUM com >
gpoirier
parents:
15664
diff
changeset
|
827 |
beebfccc00f1
adds Simple, Advanced Simple and DivX profile support for XviD, Patch by Robert Swain < robert POUM swain AH gmail POUM com >
gpoirier
parents:
15664
diff
changeset
|
828 create->profile = selected_profile->id; |
beebfccc00f1
adds Simple, Advanced Simple and DivX profile support for XviD, Patch by Robert Swain < robert POUM swain AH gmail POUM com >
gpoirier
parents:
15664
diff
changeset
|
829 |
11437 | 830 /* ------------------------------------------------------------------- |
831 * The frame structure | |
832 * ---------------------------------------------------------------- */ | |
833 frame->vol_flags = 0; | |
834 frame->vop_flags = 0; | |
835 frame->motion = 0; | |
836 | |
837 frame->vop_flags |= XVID_VOP_HALFPEL; | |
838 frame->motion |= motion_presets[xvidenc_motion]; | |
839 | |
840 if(xvidenc_stats) | |
841 frame->vol_flags |= XVID_VOL_EXTRASTATS; | |
842 | |
843 if(xvidenc_greyscale) | |
844 frame->vop_flags |= XVID_VOP_GREYSCALE; | |
845 | |
846 if(xvidenc_cartoon) { | |
847 frame->vop_flags |= XVID_VOP_CARTOON; | |
848 frame->motion |= XVID_ME_DETECT_STATIC_MOTION; | |
849 } | |
850 | |
16481
beebfccc00f1
adds Simple, Advanced Simple and DivX profile support for XviD, Patch by Robert Swain < robert POUM swain AH gmail POUM com >
gpoirier
parents:
15664
diff
changeset
|
851 // MPEG quantisation is only supported in ASP and unrestricted profiles |
beebfccc00f1
adds Simple, Advanced Simple and DivX profile support for XviD, Patch by Robert Swain < robert POUM swain AH gmail POUM com >
gpoirier
parents:
15664
diff
changeset
|
852 if((selected_profile->flags & PROFILE_MPEGQUANT) && |
beebfccc00f1
adds Simple, Advanced Simple and DivX profile support for XviD, Patch by Robert Swain < robert POUM swain AH gmail POUM com >
gpoirier
parents:
15664
diff
changeset
|
853 (xvidenc_quant_method != NULL) && |
beebfccc00f1
adds Simple, Advanced Simple and DivX profile support for XviD, Patch by Robert Swain < robert POUM swain AH gmail POUM com >
gpoirier
parents:
15664
diff
changeset
|
854 !strcasecmp(xvidenc_quant_method, "mpeg")) |
beebfccc00f1
adds Simple, Advanced Simple and DivX profile support for XviD, Patch by Robert Swain < robert POUM swain AH gmail POUM com >
gpoirier
parents:
15664
diff
changeset
|
855 { |
beebfccc00f1
adds Simple, Advanced Simple and DivX profile support for XviD, Patch by Robert Swain < robert POUM swain AH gmail POUM com >
gpoirier
parents:
15664
diff
changeset
|
856 frame->vol_flags |= XVID_VOL_MPEGQUANT; |
11437 | 857 if(xvidenc_intra_matrix_file != NULL) { |
858 frame->quant_intra_matrix = (unsigned char*)read_matrix(xvidenc_intra_matrix_file); | |
859 if(frame->quant_intra_matrix != NULL) { | |
13610 | 860 mp_msg(MSGT_MENCODER, MSGL_INFO, "xvid: Loaded Intra matrix (switching to mpeg quantization type)\n"); |
32537
8fa2f43cb760
Remove most of the NULL pointer check before free all over the code
cboesch
parents:
32479
diff
changeset
|
861 free(xvidenc_quant_method); |
11437 | 862 xvidenc_quant_method = strdup("mpeg"); |
863 } | |
864 } | |
865 if(xvidenc_inter_matrix_file != NULL) { | |
866 frame->quant_inter_matrix = read_matrix(xvidenc_inter_matrix_file); | |
867 if(frame->quant_inter_matrix) { | |
13610 | 868 mp_msg(MSGT_MENCODER, MSGL_INFO, "\nxvid: Loaded Inter matrix (switching to mpeg quantization type)\n"); |
32537
8fa2f43cb760
Remove most of the NULL pointer check before free all over the code
cboesch
parents:
32479
diff
changeset
|
869 free(xvidenc_quant_method); |
11437 | 870 xvidenc_quant_method = strdup("mpeg"); |
871 } | |
872 } | |
873 } | |
16481
beebfccc00f1
adds Simple, Advanced Simple and DivX profile support for XviD, Patch by Robert Swain < robert POUM swain AH gmail POUM com >
gpoirier
parents:
15664
diff
changeset
|
874 if(xvidenc_quarterpel && (selected_profile->flags & PROFILE_QPEL)) { |
11437 | 875 frame->vol_flags |= XVID_VOL_QUARTERPEL; |
876 frame->motion |= XVID_ME_QUARTERPELREFINE16; | |
877 frame->motion |= XVID_ME_QUARTERPELREFINE8; | |
878 } | |
16481
beebfccc00f1
adds Simple, Advanced Simple and DivX profile support for XviD, Patch by Robert Swain < robert POUM swain AH gmail POUM com >
gpoirier
parents:
15664
diff
changeset
|
879 if(xvidenc_gmc && (selected_profile->flags & PROFILE_GMC)) { |
11437 | 880 frame->vol_flags |= XVID_VOL_GMC; |
881 frame->motion |= XVID_ME_GME_REFINE; | |
882 } | |
16481
beebfccc00f1
adds Simple, Advanced Simple and DivX profile support for XviD, Patch by Robert Swain < robert POUM swain AH gmail POUM com >
gpoirier
parents:
15664
diff
changeset
|
883 if(xvidenc_interlaced && (selected_profile->flags & PROFILE_INTERLACE)) { |
11437 | 884 frame->vol_flags |= XVID_VOL_INTERLACING; |
885 } | |
886 if(xvidenc_trellis) { | |
887 frame->vop_flags |= XVID_VOP_TRELLISQUANT; | |
888 } | |
889 if(xvidenc_hqacpred) { | |
890 frame->vop_flags |= XVID_VOP_HQACPRED; | |
891 } | |
11912
8eb96d751dcd
new options - aspect,autoaspect,turbo,chroma_opt. patch by Nico <nsabbi@tiscali.it> and Edouard Gomez
iive
parents:
11586
diff
changeset
|
892 if(xvidenc_chroma_opt) { |
8eb96d751dcd
new options - aspect,autoaspect,turbo,chroma_opt. patch by Nico <nsabbi@tiscali.it> and Edouard Gomez
iive
parents:
11586
diff
changeset
|
893 frame->vop_flags |= XVID_VOP_CHROMAOPT; |
8eb96d751dcd
new options - aspect,autoaspect,turbo,chroma_opt. patch by Nico <nsabbi@tiscali.it> and Edouard Gomez
iive
parents:
11586
diff
changeset
|
894 } |
16481
beebfccc00f1
adds Simple, Advanced Simple and DivX profile support for XviD, Patch by Robert Swain < robert POUM swain AH gmail POUM com >
gpoirier
parents:
15664
diff
changeset
|
895 if((xvidenc_motion > 4) && (selected_profile->flags & PROFILE_4MV)) { |
11437 | 896 frame->vop_flags |= XVID_VOP_INTER4V; |
897 } | |
898 if(xvidenc_chromame) { | |
899 frame->motion |= XVID_ME_CHROMA_PVOP; | |
900 frame->motion |= XVID_ME_CHROMA_BVOP; | |
901 } | |
902 if(xvidenc_vhq >= 1) { | |
903 frame->vop_flags |= XVID_VOP_MODEDECISION_RD; | |
904 } | |
905 if(xvidenc_vhq >= 2) { | |
906 frame->motion |= XVID_ME_HALFPELREFINE16_RD; | |
907 frame->motion |= XVID_ME_QUARTERPELREFINE16_RD; | |
908 } | |
909 if(xvidenc_vhq >= 3) { | |
910 frame->motion |= XVID_ME_HALFPELREFINE8_RD; | |
911 frame->motion |= XVID_ME_QUARTERPELREFINE8_RD; | |
912 frame->motion |= XVID_ME_CHECKPREDICTION_RD; | |
913 } | |
914 if(xvidenc_vhq >= 4) { | |
915 frame->motion |= XVID_ME_EXTSEARCH_RD; | |
916 } | |
13610 | 917 if(xvidenc_bvhq >= 1) { |
918 #if XVID_API >= XVID_MAKE_API(4,1) | |
919 frame->vop_flags |= XVID_VOP_RD_BVOP; | |
920 #endif | |
921 } | |
11912
8eb96d751dcd
new options - aspect,autoaspect,turbo,chroma_opt. patch by Nico <nsabbi@tiscali.it> and Edouard Gomez
iive
parents:
11586
diff
changeset
|
922 if(xvidenc_turbo) { |
8eb96d751dcd
new options - aspect,autoaspect,turbo,chroma_opt. patch by Nico <nsabbi@tiscali.it> and Edouard Gomez
iive
parents:
11586
diff
changeset
|
923 frame->motion |= XVID_ME_FASTREFINE16; |
8eb96d751dcd
new options - aspect,autoaspect,turbo,chroma_opt. patch by Nico <nsabbi@tiscali.it> and Edouard Gomez
iive
parents:
11586
diff
changeset
|
924 frame->motion |= XVID_ME_FASTREFINE8; |
8eb96d751dcd
new options - aspect,autoaspect,turbo,chroma_opt. patch by Nico <nsabbi@tiscali.it> and Edouard Gomez
iive
parents:
11586
diff
changeset
|
925 frame->motion |= XVID_ME_SKIP_DELTASEARCH; |
8eb96d751dcd
new options - aspect,autoaspect,turbo,chroma_opt. patch by Nico <nsabbi@tiscali.it> and Edouard Gomez
iive
parents:
11586
diff
changeset
|
926 frame->motion |= XVID_ME_FAST_MODEINTERPOLATE; |
8eb96d751dcd
new options - aspect,autoaspect,turbo,chroma_opt. patch by Nico <nsabbi@tiscali.it> and Edouard Gomez
iive
parents:
11586
diff
changeset
|
927 frame->motion |= XVID_ME_BFRAME_EARLYSTOP; |
8eb96d751dcd
new options - aspect,autoaspect,turbo,chroma_opt. patch by Nico <nsabbi@tiscali.it> and Edouard Gomez
iive
parents:
11586
diff
changeset
|
928 } |
11437 | 929 |
930 /* motion level == 0 means no motion search which is equivalent to | |
931 * intra coding only */ | |
932 if(xvidenc_motion == 0) { | |
933 frame->type = XVID_TYPE_IVOP; | |
934 } else { | |
935 frame->type = XVID_TYPE_AUTO; | |
936 } | |
937 | |
938 frame->bframe_threshold = xvidenc_bframe_threshold; | |
939 | |
11912
8eb96d751dcd
new options - aspect,autoaspect,turbo,chroma_opt. patch by Nico <nsabbi@tiscali.it> and Edouard Gomez
iive
parents:
11586
diff
changeset
|
940 /* PAR related initialization */ |
8eb96d751dcd
new options - aspect,autoaspect,turbo,chroma_opt. patch by Nico <nsabbi@tiscali.it> and Edouard Gomez
iive
parents:
11586
diff
changeset
|
941 frame->par = XVID_PAR_11_VGA; /* Default */ |
8eb96d751dcd
new options - aspect,autoaspect,turbo,chroma_opt. patch by Nico <nsabbi@tiscali.it> and Edouard Gomez
iive
parents:
11586
diff
changeset
|
942 |
16481
beebfccc00f1
adds Simple, Advanced Simple and DivX profile support for XviD, Patch by Robert Swain < robert POUM swain AH gmail POUM com >
gpoirier
parents:
15664
diff
changeset
|
943 if( !(selected_profile->flags & PROFILE_DXN) ) |
beebfccc00f1
adds Simple, Advanced Simple and DivX profile support for XviD, Patch by Robert Swain < robert POUM swain AH gmail POUM com >
gpoirier
parents:
15664
diff
changeset
|
944 { |
29263
0f1b5b68af32
whitespace cosmetics: Remove all trailing whitespace.
diego
parents:
28186
diff
changeset
|
945 if(xvidenc_dar_aspect > 0) |
24295
de8e36aec5ff
Remove imported rational calculation code and use the original one from avutil.
iive
parents:
22601
diff
changeset
|
946 ar = av_d2q(xvidenc_dar_aspect * mod->mux->bih->biHeight / mod->mux->bih->biWidth, 255); |
11912
8eb96d751dcd
new options - aspect,autoaspect,turbo,chroma_opt. patch by Nico <nsabbi@tiscali.it> and Edouard Gomez
iive
parents:
11586
diff
changeset
|
947 else if(xvidenc_autoaspect) |
24295
de8e36aec5ff
Remove imported rational calculation code and use the original one from avutil.
iive
parents:
22601
diff
changeset
|
948 ar = av_d2q((float)mod->d_width / mod->d_height * mod->mux->bih->biHeight / mod->mux->bih->biWidth, 255); |
11912
8eb96d751dcd
new options - aspect,autoaspect,turbo,chroma_opt. patch by Nico <nsabbi@tiscali.it> and Edouard Gomez
iive
parents:
11586
diff
changeset
|
949 else ar.num = ar.den = 0; |
29263
0f1b5b68af32
whitespace cosmetics: Remove all trailing whitespace.
diego
parents:
28186
diff
changeset
|
950 |
11912
8eb96d751dcd
new options - aspect,autoaspect,turbo,chroma_opt. patch by Nico <nsabbi@tiscali.it> and Edouard Gomez
iive
parents:
11586
diff
changeset
|
951 if(ar.den != 0) { |
8eb96d751dcd
new options - aspect,autoaspect,turbo,chroma_opt. patch by Nico <nsabbi@tiscali.it> and Edouard Gomez
iive
parents:
11586
diff
changeset
|
952 if(ar.num == 12 && ar.den == 11) |
8eb96d751dcd
new options - aspect,autoaspect,turbo,chroma_opt. patch by Nico <nsabbi@tiscali.it> and Edouard Gomez
iive
parents:
11586
diff
changeset
|
953 frame->par = XVID_PAR_43_PAL; |
8eb96d751dcd
new options - aspect,autoaspect,turbo,chroma_opt. patch by Nico <nsabbi@tiscali.it> and Edouard Gomez
iive
parents:
11586
diff
changeset
|
954 else if(ar.num == 10 && ar.den == 11) |
8eb96d751dcd
new options - aspect,autoaspect,turbo,chroma_opt. patch by Nico <nsabbi@tiscali.it> and Edouard Gomez
iive
parents:
11586
diff
changeset
|
955 frame->par = XVID_PAR_43_NTSC; |
8eb96d751dcd
new options - aspect,autoaspect,turbo,chroma_opt. patch by Nico <nsabbi@tiscali.it> and Edouard Gomez
iive
parents:
11586
diff
changeset
|
956 else if(ar.num == 16 && ar.den == 11) |
8eb96d751dcd
new options - aspect,autoaspect,turbo,chroma_opt. patch by Nico <nsabbi@tiscali.it> and Edouard Gomez
iive
parents:
11586
diff
changeset
|
957 frame->par = XVID_PAR_169_PAL; |
8eb96d751dcd
new options - aspect,autoaspect,turbo,chroma_opt. patch by Nico <nsabbi@tiscali.it> and Edouard Gomez
iive
parents:
11586
diff
changeset
|
958 else if(ar.num == 40 && ar.den == 33) |
8eb96d751dcd
new options - aspect,autoaspect,turbo,chroma_opt. patch by Nico <nsabbi@tiscali.it> and Edouard Gomez
iive
parents:
11586
diff
changeset
|
959 frame->par = XVID_PAR_169_NTSC; |
8eb96d751dcd
new options - aspect,autoaspect,turbo,chroma_opt. patch by Nico <nsabbi@tiscali.it> and Edouard Gomez
iive
parents:
11586
diff
changeset
|
960 else |
29263
0f1b5b68af32
whitespace cosmetics: Remove all trailing whitespace.
diego
parents:
28186
diff
changeset
|
961 { |
11912
8eb96d751dcd
new options - aspect,autoaspect,turbo,chroma_opt. patch by Nico <nsabbi@tiscali.it> and Edouard Gomez
iive
parents:
11586
diff
changeset
|
962 frame->par = XVID_PAR_EXT; |
8eb96d751dcd
new options - aspect,autoaspect,turbo,chroma_opt. patch by Nico <nsabbi@tiscali.it> and Edouard Gomez
iive
parents:
11586
diff
changeset
|
963 frame->par_width = ar.num; |
8eb96d751dcd
new options - aspect,autoaspect,turbo,chroma_opt. patch by Nico <nsabbi@tiscali.it> and Edouard Gomez
iive
parents:
11586
diff
changeset
|
964 frame->par_height= ar.den; |
8eb96d751dcd
new options - aspect,autoaspect,turbo,chroma_opt. patch by Nico <nsabbi@tiscali.it> and Edouard Gomez
iive
parents:
11586
diff
changeset
|
965 } |
29263
0f1b5b68af32
whitespace cosmetics: Remove all trailing whitespace.
diego
parents:
28186
diff
changeset
|
966 |
11912
8eb96d751dcd
new options - aspect,autoaspect,turbo,chroma_opt. patch by Nico <nsabbi@tiscali.it> and Edouard Gomez
iive
parents:
11586
diff
changeset
|
967 } else if(xvidenc_par != NULL) { |
11437 | 968 if(strcasecmp(xvidenc_par, "pal43") == 0) |
969 frame->par = XVID_PAR_43_PAL; | |
11912
8eb96d751dcd
new options - aspect,autoaspect,turbo,chroma_opt. patch by Nico <nsabbi@tiscali.it> and Edouard Gomez
iive
parents:
11586
diff
changeset
|
970 else if(strcasecmp(xvidenc_par, "pal169") == 0) |
11437 | 971 frame->par = XVID_PAR_169_PAL; |
11912
8eb96d751dcd
new options - aspect,autoaspect,turbo,chroma_opt. patch by Nico <nsabbi@tiscali.it> and Edouard Gomez
iive
parents:
11586
diff
changeset
|
972 else if(strcasecmp(xvidenc_par, "ntsc43") == 0) |
11437 | 973 frame->par = XVID_PAR_43_NTSC; |
11912
8eb96d751dcd
new options - aspect,autoaspect,turbo,chroma_opt. patch by Nico <nsabbi@tiscali.it> and Edouard Gomez
iive
parents:
11586
diff
changeset
|
974 else if(strcasecmp(xvidenc_par, "ntsc169") == 0) |
11437 | 975 frame->par = XVID_PAR_169_NTSC; |
11912
8eb96d751dcd
new options - aspect,autoaspect,turbo,chroma_opt. patch by Nico <nsabbi@tiscali.it> and Edouard Gomez
iive
parents:
11586
diff
changeset
|
976 else if(strcasecmp(xvidenc_par, "ext") == 0) |
11437 | 977 frame->par = XVID_PAR_EXT; |
11912
8eb96d751dcd
new options - aspect,autoaspect,turbo,chroma_opt. patch by Nico <nsabbi@tiscali.it> and Edouard Gomez
iive
parents:
11586
diff
changeset
|
978 |
11437 | 979 if(frame->par == XVID_PAR_EXT) { |
980 if(xvidenc_par_width) | |
981 frame->par_width = xvidenc_par_width; | |
982 else | |
983 frame->par_width = 1; | |
984 | |
985 if(xvidenc_par_height) | |
986 frame->par_height = xvidenc_par_height; | |
987 else | |
988 frame->par_height = 1; | |
989 } | |
11912
8eb96d751dcd
new options - aspect,autoaspect,turbo,chroma_opt. patch by Nico <nsabbi@tiscali.it> and Edouard Gomez
iive
parents:
11586
diff
changeset
|
990 } |
13610 | 991 |
992 /* Display par information */ | |
29263
0f1b5b68af32
whitespace cosmetics: Remove all trailing whitespace.
diego
parents:
28186
diff
changeset
|
993 mp_msg(MSGT_MENCODER, MSGL_INFO, "xvid: par=%d/%d (%s), displayed=%dx%d, sampled=%dx%d\n", |
13610 | 994 ar.num, ar.den, par_string(frame->par), |
995 mod->d_width, mod->d_height, mod->mux->bih->biWidth, mod->mux->bih->biHeight); | |
16481
beebfccc00f1
adds Simple, Advanced Simple and DivX profile support for XviD, Patch by Robert Swain < robert POUM swain AH gmail POUM com >
gpoirier
parents:
15664
diff
changeset
|
996 } |
beebfccc00f1
adds Simple, Advanced Simple and DivX profile support for XviD, Patch by Robert Swain < robert POUM swain AH gmail POUM com >
gpoirier
parents:
15664
diff
changeset
|
997 else |
beebfccc00f1
adds Simple, Advanced Simple and DivX profile support for XviD, Patch by Robert Swain < robert POUM swain AH gmail POUM com >
gpoirier
parents:
15664
diff
changeset
|
998 mp_msg(MSGT_MENCODER, MSGL_INFO, |
beebfccc00f1
adds Simple, Advanced Simple and DivX profile support for XviD, Patch by Robert Swain < robert POUM swain AH gmail POUM com >
gpoirier
parents:
15664
diff
changeset
|
999 "xvid: par=0/0 (vga11) forced by choosing a DXN profile\n"); |
26754
63630c09e237
cosmetics: Remove pointless parentheses from return calls.
diego
parents:
26727
diff
changeset
|
1000 return FINE; |
11437 | 1001 } |
1002 | |
1003 static int set_create_struct(xvid_mplayer_module_t *mod) | |
1004 { | |
1005 int pass; | |
15619
ccf2c61afacd
XviD zones support. Patch by Doom9: < feedback123 GROOVY doom9 STEADY org >
gpoirier
parents:
15070
diff
changeset
|
1006 int doZones = 0; |
11437 | 1007 xvid_enc_create_t *create = &mod->create; |
1008 | |
16481
beebfccc00f1
adds Simple, Advanced Simple and DivX profile support for XviD, Patch by Robert Swain < robert POUM swain AH gmail POUM com >
gpoirier
parents:
15664
diff
changeset
|
1009 // profile is unrestricted as default |
beebfccc00f1
adds Simple, Advanced Simple and DivX profile support for XviD, Patch by Robert Swain < robert POUM swain AH gmail POUM com >
gpoirier
parents:
15664
diff
changeset
|
1010 profile_t *selected_profile = profileFromName("unrestricted"); |
beebfccc00f1
adds Simple, Advanced Simple and DivX profile support for XviD, Patch by Robert Swain < robert POUM swain AH gmail POUM com >
gpoirier
parents:
15664
diff
changeset
|
1011 if(xvidenc_profile) |
beebfccc00f1
adds Simple, Advanced Simple and DivX profile support for XviD, Patch by Robert Swain < robert POUM swain AH gmail POUM com >
gpoirier
parents:
15664
diff
changeset
|
1012 selected_profile = profileFromName(xvidenc_profile); |
beebfccc00f1
adds Simple, Advanced Simple and DivX profile support for XviD, Patch by Robert Swain < robert POUM swain AH gmail POUM com >
gpoirier
parents:
15664
diff
changeset
|
1013 if(!selected_profile) |
26754
63630c09e237
cosmetics: Remove pointless parentheses from return calls.
diego
parents:
26727
diff
changeset
|
1014 return BAD; |
16481
beebfccc00f1
adds Simple, Advanced Simple and DivX profile support for XviD, Patch by Robert Swain < robert POUM swain AH gmail POUM com >
gpoirier
parents:
15664
diff
changeset
|
1015 |
11437 | 1016 /* Most of the structure is initialized by dispatch settings, only a |
1017 * few things are missing */ | |
1018 create->version = XVID_VERSION; | |
1019 | |
1020 /* Width and Height */ | |
1021 create->width = mod->mux->bih->biWidth; | |
1022 create->height = mod->mux->bih->biHeight; | |
1023 | |
16481
beebfccc00f1
adds Simple, Advanced Simple and DivX profile support for XviD, Patch by Robert Swain < robert POUM swain AH gmail POUM com >
gpoirier
parents:
15664
diff
changeset
|
1024 /* Check resolution of video to be coded is within profile width/height |
beebfccc00f1
adds Simple, Advanced Simple and DivX profile support for XviD, Patch by Robert Swain < robert POUM swain AH gmail POUM com >
gpoirier
parents:
15664
diff
changeset
|
1025 restrictions */ |
beebfccc00f1
adds Simple, Advanced Simple and DivX profile support for XviD, Patch by Robert Swain < robert POUM swain AH gmail POUM com >
gpoirier
parents:
15664
diff
changeset
|
1026 if( ((selected_profile->width != 0) && |
beebfccc00f1
adds Simple, Advanced Simple and DivX profile support for XviD, Patch by Robert Swain < robert POUM swain AH gmail POUM com >
gpoirier
parents:
15664
diff
changeset
|
1027 (mod->mux->bih->biWidth > selected_profile->width)) || |
beebfccc00f1
adds Simple, Advanced Simple and DivX profile support for XviD, Patch by Robert Swain < robert POUM swain AH gmail POUM com >
gpoirier
parents:
15664
diff
changeset
|
1028 ((selected_profile->height != 0) && |
beebfccc00f1
adds Simple, Advanced Simple and DivX profile support for XviD, Patch by Robert Swain < robert POUM swain AH gmail POUM com >
gpoirier
parents:
15664
diff
changeset
|
1029 (mod->mux->bih->biHeight > selected_profile->height)) ) |
beebfccc00f1
adds Simple, Advanced Simple and DivX profile support for XviD, Patch by Robert Swain < robert POUM swain AH gmail POUM com >
gpoirier
parents:
15664
diff
changeset
|
1030 { |
beebfccc00f1
adds Simple, Advanced Simple and DivX profile support for XviD, Patch by Robert Swain < robert POUM swain AH gmail POUM com >
gpoirier
parents:
15664
diff
changeset
|
1031 mp_msg(MSGT_MENCODER,MSGL_ERR, |
beebfccc00f1
adds Simple, Advanced Simple and DivX profile support for XviD, Patch by Robert Swain < robert POUM swain AH gmail POUM com >
gpoirier
parents:
15664
diff
changeset
|
1032 "xvid:[ERROR] resolution must be <= %dx%d for the chosen profile\n", |
beebfccc00f1
adds Simple, Advanced Simple and DivX profile support for XviD, Patch by Robert Swain < robert POUM swain AH gmail POUM com >
gpoirier
parents:
15664
diff
changeset
|
1033 selected_profile->width, selected_profile->height); |
26754
63630c09e237
cosmetics: Remove pointless parentheses from return calls.
diego
parents:
26727
diff
changeset
|
1034 return BAD; |
16481
beebfccc00f1
adds Simple, Advanced Simple and DivX profile support for XviD, Patch by Robert Swain < robert POUM swain AH gmail POUM com >
gpoirier
parents:
15664
diff
changeset
|
1035 } |
beebfccc00f1
adds Simple, Advanced Simple and DivX profile support for XviD, Patch by Robert Swain < robert POUM swain AH gmail POUM com >
gpoirier
parents:
15664
diff
changeset
|
1036 |
11437 | 1037 /* FPS */ |
1038 create->fincr = mod->mux->h.dwScale; | |
1039 create->fbase = mod->mux->h.dwRate; | |
1040 | |
16481
beebfccc00f1
adds Simple, Advanced Simple and DivX profile support for XviD, Patch by Robert Swain < robert POUM swain AH gmail POUM com >
gpoirier
parents:
15664
diff
changeset
|
1041 // Check frame rate is within profile restrictions |
beebfccc00f1
adds Simple, Advanced Simple and DivX profile support for XviD, Patch by Robert Swain < robert POUM swain AH gmail POUM com >
gpoirier
parents:
15664
diff
changeset
|
1042 if( ((float)mod->mux->h.dwRate/(float)mod->mux->h.dwScale > (float)selected_profile->fps) && |
beebfccc00f1
adds Simple, Advanced Simple and DivX profile support for XviD, Patch by Robert Swain < robert POUM swain AH gmail POUM com >
gpoirier
parents:
15664
diff
changeset
|
1043 (selected_profile->fps != 0)) |
beebfccc00f1
adds Simple, Advanced Simple and DivX profile support for XviD, Patch by Robert Swain < robert POUM swain AH gmail POUM com >
gpoirier
parents:
15664
diff
changeset
|
1044 { |
31938
93c67b51b171
Print a warning, but allow to encode to a non-supported frame rate with
cehoyos
parents:
31937
diff
changeset
|
1045 mp_msg(MSGT_MENCODER,MSGL_WARN, |
93c67b51b171
Print a warning, but allow to encode to a non-supported frame rate with
cehoyos
parents:
31937
diff
changeset
|
1046 "xvid:[WARNING] frame rate should be <= %d for the chosen profile\n", |
16481
beebfccc00f1
adds Simple, Advanced Simple and DivX profile support for XviD, Patch by Robert Swain < robert POUM swain AH gmail POUM com >
gpoirier
parents:
15664
diff
changeset
|
1047 selected_profile->fps); |
beebfccc00f1
adds Simple, Advanced Simple and DivX profile support for XviD, Patch by Robert Swain < robert POUM swain AH gmail POUM com >
gpoirier
parents:
15664
diff
changeset
|
1048 } |
beebfccc00f1
adds Simple, Advanced Simple and DivX profile support for XviD, Patch by Robert Swain < robert POUM swain AH gmail POUM com >
gpoirier
parents:
15664
diff
changeset
|
1049 |
11437 | 1050 /* Encodings zones */ |
1051 memset(mod->zones, 0, sizeof(mod->zones)); | |
1052 create->zones = mod->zones; | |
1053 create->num_zones = 0; | |
1054 | |
1055 /* Plugins */ | |
1056 memset(mod->plugins, 0, sizeof(mod->plugins)); | |
1057 create->plugins = mod->plugins; | |
1058 create->num_plugins = 0; | |
1059 | |
1060 /* ------------------------------------------------------------------- | |
1061 * Initialize and bind the right rate controller plugin | |
1062 * ---------------------------------------------------------------- */ | |
1063 | |
1064 /* First we try to sort out configuration conflicts */ | |
1065 if(xvidenc_quantizer != 0 && (xvidenc_bitrate || xvidenc_pass)) { | |
1066 mp_msg(MSGT_MENCODER, MSGL_ERR, | |
1067 "xvid: you can't mix Fixed Quantizer Rate Control" | |
1068 " with other Rate Control mechanisms\n"); | |
26754
63630c09e237
cosmetics: Remove pointless parentheses from return calls.
diego
parents:
26727
diff
changeset
|
1069 return BAD; |
11437 | 1070 } |
1071 | |
1072 if(xvidenc_bitrate != 0 && xvidenc_pass == 1) { | |
13610 | 1073 mp_msg(MSGT_MENCODER, MSGL_WARN, |
11437 | 1074 "xvid: bitrate setting is ignored during first pass\n"); |
1075 } | |
1076 | |
1077 /* Sort out which sort of pass we are supposed to do | |
1078 * pass == 1<<0 CBR | |
1079 * pass == 1<<1 Two pass first pass | |
1080 * pass == 1<<2 Two pass second pass | |
1081 * pass == 1<<3 Constant quantizer | |
1082 */ | |
1083 #define MODE_CBR (1<<0) | |
1084 #define MODE_2PASS1 (1<<1) | |
1085 #define MODE_2PASS2 (1<<2) | |
1086 #define MODE_QUANT (1<<3) | |
1087 | |
1088 pass = 0; | |
1089 | |
1090 if(xvidenc_bitrate != 0 && xvidenc_pass == 0) | |
1091 pass |= MODE_CBR; | |
1092 | |
1093 if(xvidenc_pass == 1) | |
1094 pass |= MODE_2PASS1; | |
1095 | |
1096 if(xvidenc_bitrate != 0 && xvidenc_pass == 2) | |
1097 pass |= MODE_2PASS2; | |
1098 | |
1099 if(xvidenc_quantizer != 0 && xvidenc_pass == 0) | |
1100 pass |= MODE_QUANT; | |
1101 | |
1102 /* We must be in at least one RC mode */ | |
1103 if(pass == 0) { | |
1104 mp_msg(MSGT_MENCODER, MSGL_ERR, | |
1105 "xvid: you must specify one or a valid combination of " | |
25809 | 1106 "'bitrate', 'pass', 'fixed_quant' settings\n"); |
26754
63630c09e237
cosmetics: Remove pointless parentheses from return calls.
diego
parents:
26727
diff
changeset
|
1107 return BAD; |
11437 | 1108 } |
1109 | |
1110 /* Sanity checking */ | |
1111 if(pass != MODE_CBR && pass != MODE_QUANT && | |
1112 pass != MODE_2PASS1 && pass != MODE_2PASS2) { | |
1113 mp_msg(MSGT_MENCODER, MSGL_ERR, | |
1114 "xvid: this code should not be reached - fill a bug " | |
1115 "report\n"); | |
26754
63630c09e237
cosmetics: Remove pointless parentheses from return calls.
diego
parents:
26727
diff
changeset
|
1116 return BAD; |
11437 | 1117 } |
1118 | |
1119 /* This is a single pass encoding: either a CBR pass or a constant | |
1120 * quantizer pass */ | |
1121 if(pass == MODE_CBR || pass == MODE_QUANT) { | |
1122 xvid_plugin_single_t *onepass = &mod->onepass; | |
1123 | |
1124 /* There is not much left to initialize after dispatch settings */ | |
1125 onepass->version = XVID_VERSION; | |
13675
d4cba4c4c54c
Bitrate setting option in ve_xvid4.c doesn't follow the rules described
rathann
parents:
13610
diff
changeset
|
1126 if (xvidenc_bitrate > 16000) onepass->bitrate = xvidenc_bitrate; |
d4cba4c4c54c
Bitrate setting option in ve_xvid4.c doesn't follow the rules described
rathann
parents:
13610
diff
changeset
|
1127 else onepass->bitrate = xvidenc_bitrate*1000; |
11437 | 1128 |
1129 /* Quantizer mode uses the same plugin, we have only to define | |
1130 * a constant quantizer zone beginning at frame 0 */ | |
1131 if(pass == MODE_QUANT) { | |
24295
de8e36aec5ff
Remove imported rational calculation code and use the original one from avutil.
iive
parents:
22601
diff
changeset
|
1132 AVRational squant; |
de8e36aec5ff
Remove imported rational calculation code and use the original one from avutil.
iive
parents:
22601
diff
changeset
|
1133 squant = av_d2q(xvidenc_quantizer,128); |
11437 | 1134 |
1135 create->zones[create->num_zones].mode = XVID_ZONE_QUANT; | |
1136 create->zones[create->num_zones].frame = 0; | |
12806 | 1137 create->zones[create->num_zones].increment = squant.num; |
1138 create->zones[create->num_zones].base = squant.den; | |
11437 | 1139 create->num_zones++; |
1140 | |
1141 mp_msg(MSGT_MENCODER, MSGL_INFO, | |
1142 "xvid: Fixed Quant Rate Control -- quantizer=%d/%d=%2.2f\n", | |
11929 | 1143 squant.num, |
1144 squant.den, | |
1145 (float)(squant.num)/(float)(squant.den)); | |
29263
0f1b5b68af32
whitespace cosmetics: Remove all trailing whitespace.
diego
parents:
28186
diff
changeset
|
1146 |
11437 | 1147 } else { |
1148 mp_msg(MSGT_MENCODER, MSGL_INFO, | |
1149 "xvid: CBR Rate Control -- bitrate=%dkbit/s\n", | |
13675
d4cba4c4c54c
Bitrate setting option in ve_xvid4.c doesn't follow the rules described
rathann
parents:
13610
diff
changeset
|
1150 xvidenc_bitrate>16000?xvidenc_bitrate/1000:xvidenc_bitrate); |
15619
ccf2c61afacd
XviD zones support. Patch by Doom9: < feedback123 GROOVY doom9 STEADY org >
gpoirier
parents:
15070
diff
changeset
|
1151 doZones = 1; |
11437 | 1152 } |
1153 | |
1154 create->plugins[create->num_plugins].func = xvid_plugin_single; | |
1155 create->plugins[create->num_plugins].param = onepass; | |
1156 create->num_plugins++; | |
1157 } | |
1158 | |
1159 /* This is the first pass of a Two pass process */ | |
1160 if(pass == MODE_2PASS1) { | |
1161 xvid_plugin_2pass1_t *pass1 = &mod->pass1; | |
1162 | |
1163 /* There is not much to initialize for this plugin */ | |
1164 pass1->version = XVID_VERSION; | |
16602 | 1165 pass1->filename = passtmpfile; |
11437 | 1166 |
1167 create->plugins[create->num_plugins].func = xvid_plugin_2pass1; | |
1168 create->plugins[create->num_plugins].param = pass1; | |
1169 create->num_plugins++; | |
1170 | |
1171 mp_msg(MSGT_MENCODER, MSGL_INFO, | |
1172 "xvid: 2Pass Rate Control -- 1st pass\n"); | |
1173 } | |
1174 | |
1175 /* This is the second pass of a Two pass process */ | |
1176 if(pass == MODE_2PASS2) { | |
1177 xvid_plugin_2pass2_t *pass2 = &mod->pass2; | |
1178 | |
1179 /* There is not much left to initialize after dispatch settings */ | |
1180 pass2->version = XVID_VERSION; | |
16602 | 1181 pass2->filename = passtmpfile; |
11437 | 1182 |
1183 /* Positive bitrate values are bitrates as usual but if the | |
1184 * value is negative it is considered as being a total size | |
1185 * to reach (in kilobytes) */ | |
1186 if(xvidenc_bitrate > 0) { | |
13675
d4cba4c4c54c
Bitrate setting option in ve_xvid4.c doesn't follow the rules described
rathann
parents:
13610
diff
changeset
|
1187 if(xvidenc_bitrate > 16000) pass2->bitrate = xvidenc_bitrate; |
d4cba4c4c54c
Bitrate setting option in ve_xvid4.c doesn't follow the rules described
rathann
parents:
13610
diff
changeset
|
1188 else pass2->bitrate = xvidenc_bitrate*1000; |
11437 | 1189 mp_msg(MSGT_MENCODER, MSGL_INFO, |
1190 "xvid: 2Pass Rate Control -- 2nd pass -- bitrate=%dkbit/s\n", | |
13675
d4cba4c4c54c
Bitrate setting option in ve_xvid4.c doesn't follow the rules described
rathann
parents:
13610
diff
changeset
|
1191 xvidenc_bitrate>16000?xvidenc_bitrate/1000:xvidenc_bitrate); |
11437 | 1192 } else { |
1193 pass2->bitrate = xvidenc_bitrate; | |
1194 mp_msg(MSGT_MENCODER, MSGL_INFO, | |
1195 "xvid: 2Pass Rate Control -- 2nd pass -- total size=%dkB\n", | |
1196 -xvidenc_bitrate); | |
1197 } | |
1198 | |
1199 create->plugins[create->num_plugins].func = xvid_plugin_2pass2; | |
1200 create->plugins[create->num_plugins].param = pass2; | |
1201 create->num_plugins++; | |
15619
ccf2c61afacd
XviD zones support. Patch by Doom9: < feedback123 GROOVY doom9 STEADY org >
gpoirier
parents:
15070
diff
changeset
|
1202 doZones = 1; |
11437 | 1203 } |
15638
189da3c3116b
Add XviD's luminance masking (option name: lumi_mask)
gpoirier
parents:
15619
diff
changeset
|
1204 |
16481
beebfccc00f1
adds Simple, Advanced Simple and DivX profile support for XviD, Patch by Robert Swain < robert POUM swain AH gmail POUM com >
gpoirier
parents:
15664
diff
changeset
|
1205 if(xvidenc_luminance_masking && (selected_profile->flags & PROFILE_ADAPTQUANT)) { |
15638
189da3c3116b
Add XviD's luminance masking (option name: lumi_mask)
gpoirier
parents:
15619
diff
changeset
|
1206 create->plugins[create->num_plugins].func = xvid_plugin_lumimasking; |
189da3c3116b
Add XviD's luminance masking (option name: lumi_mask)
gpoirier
parents:
15619
diff
changeset
|
1207 create->plugins[create->num_plugins].param = NULL; |
189da3c3116b
Add XviD's luminance masking (option name: lumi_mask)
gpoirier
parents:
15619
diff
changeset
|
1208 create->num_plugins++; |
189da3c3116b
Add XviD's luminance masking (option name: lumi_mask)
gpoirier
parents:
15619
diff
changeset
|
1209 } |
189da3c3116b
Add XviD's luminance masking (option name: lumi_mask)
gpoirier
parents:
15619
diff
changeset
|
1210 |
15619
ccf2c61afacd
XviD zones support. Patch by Doom9: < feedback123 GROOVY doom9 STEADY org >
gpoirier
parents:
15070
diff
changeset
|
1211 // parse zones |
ccf2c61afacd
XviD zones support. Patch by Doom9: < feedback123 GROOVY doom9 STEADY org >
gpoirier
parents:
15070
diff
changeset
|
1212 if (xvidenc_zones != NULL && doZones > 0) // do not apply zones in CQ, and first pass mode (xvid vfw doesn't allow them in those modes either) |
ccf2c61afacd
XviD zones support. Patch by Doom9: < feedback123 GROOVY doom9 STEADY org >
gpoirier
parents:
15070
diff
changeset
|
1213 { |
24735
4baa2dbe172c
Silence a gcc warning: "wrong type argument to increment".
zuxy
parents:
24629
diff
changeset
|
1214 char *p; |
15619
ccf2c61afacd
XviD zones support. Patch by Doom9: < feedback123 GROOVY doom9 STEADY org >
gpoirier
parents:
15070
diff
changeset
|
1215 int i; |
ccf2c61afacd
XviD zones support. Patch by Doom9: < feedback123 GROOVY doom9 STEADY org >
gpoirier
parents:
15070
diff
changeset
|
1216 p = xvidenc_zones; |
ccf2c61afacd
XviD zones support. Patch by Doom9: < feedback123 GROOVY doom9 STEADY org >
gpoirier
parents:
15070
diff
changeset
|
1217 create->num_zones = 0; // set the number of zones back to zero, this overwrites the zone defined for CQ - desired because each zone has to be specified on the commandline even in cq mode |
ccf2c61afacd
XviD zones support. Patch by Doom9: < feedback123 GROOVY doom9 STEADY org >
gpoirier
parents:
15070
diff
changeset
|
1218 for(i = 0; p; i++) |
ccf2c61afacd
XviD zones support. Patch by Doom9: < feedback123 GROOVY doom9 STEADY org >
gpoirier
parents:
15070
diff
changeset
|
1219 { |
ccf2c61afacd
XviD zones support. Patch by Doom9: < feedback123 GROOVY doom9 STEADY org >
gpoirier
parents:
15070
diff
changeset
|
1220 int start; |
15664 | 1221 int q; |
15619
ccf2c61afacd
XviD zones support. Patch by Doom9: < feedback123 GROOVY doom9 STEADY org >
gpoirier
parents:
15070
diff
changeset
|
1222 double value; |
ccf2c61afacd
XviD zones support. Patch by Doom9: < feedback123 GROOVY doom9 STEADY org >
gpoirier
parents:
15070
diff
changeset
|
1223 char mode; |
ccf2c61afacd
XviD zones support. Patch by Doom9: < feedback123 GROOVY doom9 STEADY org >
gpoirier
parents:
15070
diff
changeset
|
1224 int e = sscanf(p, "%d,%c,%lf", &start, &mode, &value); // start,mode(q = constant quant, w = weight),value |
ccf2c61afacd
XviD zones support. Patch by Doom9: < feedback123 GROOVY doom9 STEADY org >
gpoirier
parents:
15070
diff
changeset
|
1225 if(e != 3) |
ccf2c61afacd
XviD zones support. Patch by Doom9: < feedback123 GROOVY doom9 STEADY org >
gpoirier
parents:
15070
diff
changeset
|
1226 { |
ccf2c61afacd
XviD zones support. Patch by Doom9: < feedback123 GROOVY doom9 STEADY org >
gpoirier
parents:
15070
diff
changeset
|
1227 mp_msg(MSGT_MENCODER,MSGL_ERR, "error parsing zones\n"); |
26754
63630c09e237
cosmetics: Remove pointless parentheses from return calls.
diego
parents:
26727
diff
changeset
|
1228 return BAD; |
15619
ccf2c61afacd
XviD zones support. Patch by Doom9: < feedback123 GROOVY doom9 STEADY org >
gpoirier
parents:
15070
diff
changeset
|
1229 } |
15664 | 1230 q = (int)(value * 100); |
15619
ccf2c61afacd
XviD zones support. Patch by Doom9: < feedback123 GROOVY doom9 STEADY org >
gpoirier
parents:
15070
diff
changeset
|
1231 if (mode == 'q') |
ccf2c61afacd
XviD zones support. Patch by Doom9: < feedback123 GROOVY doom9 STEADY org >
gpoirier
parents:
15070
diff
changeset
|
1232 { |
ccf2c61afacd
XviD zones support. Patch by Doom9: < feedback123 GROOVY doom9 STEADY org >
gpoirier
parents:
15070
diff
changeset
|
1233 if (q < 200 || q > 3100) // make sure that quantizer is in allowable range |
ccf2c61afacd
XviD zones support. Patch by Doom9: < feedback123 GROOVY doom9 STEADY org >
gpoirier
parents:
15070
diff
changeset
|
1234 { |
ccf2c61afacd
XviD zones support. Patch by Doom9: < feedback123 GROOVY doom9 STEADY org >
gpoirier
parents:
15070
diff
changeset
|
1235 mp_msg(MSGT_MENCODER, MSGL_ERR, "zone quantizer must be between 2 and 31\n"); |
26754
63630c09e237
cosmetics: Remove pointless parentheses from return calls.
diego
parents:
26727
diff
changeset
|
1236 return BAD; |
15619
ccf2c61afacd
XviD zones support. Patch by Doom9: < feedback123 GROOVY doom9 STEADY org >
gpoirier
parents:
15070
diff
changeset
|
1237 } |
ccf2c61afacd
XviD zones support. Patch by Doom9: < feedback123 GROOVY doom9 STEADY org >
gpoirier
parents:
15070
diff
changeset
|
1238 else |
ccf2c61afacd
XviD zones support. Patch by Doom9: < feedback123 GROOVY doom9 STEADY org >
gpoirier
parents:
15070
diff
changeset
|
1239 { |
ccf2c61afacd
XviD zones support. Patch by Doom9: < feedback123 GROOVY doom9 STEADY org >
gpoirier
parents:
15070
diff
changeset
|
1240 create->zones[create->num_zones].mode = XVID_ZONE_QUANT; |
ccf2c61afacd
XviD zones support. Patch by Doom9: < feedback123 GROOVY doom9 STEADY org >
gpoirier
parents:
15070
diff
changeset
|
1241 } |
ccf2c61afacd
XviD zones support. Patch by Doom9: < feedback123 GROOVY doom9 STEADY org >
gpoirier
parents:
15070
diff
changeset
|
1242 } |
ccf2c61afacd
XviD zones support. Patch by Doom9: < feedback123 GROOVY doom9 STEADY org >
gpoirier
parents:
15070
diff
changeset
|
1243 if (mode == 'w') |
ccf2c61afacd
XviD zones support. Patch by Doom9: < feedback123 GROOVY doom9 STEADY org >
gpoirier
parents:
15070
diff
changeset
|
1244 { |
ccf2c61afacd
XviD zones support. Patch by Doom9: < feedback123 GROOVY doom9 STEADY org >
gpoirier
parents:
15070
diff
changeset
|
1245 if (q < 1 || q > 200) |
ccf2c61afacd
XviD zones support. Patch by Doom9: < feedback123 GROOVY doom9 STEADY org >
gpoirier
parents:
15070
diff
changeset
|
1246 { |
ccf2c61afacd
XviD zones support. Patch by Doom9: < feedback123 GROOVY doom9 STEADY org >
gpoirier
parents:
15070
diff
changeset
|
1247 mp_msg(MSGT_MENCODER, MSGL_ERR, "zone weight must be between 1 and 200\n"); |
26754
63630c09e237
cosmetics: Remove pointless parentheses from return calls.
diego
parents:
26727
diff
changeset
|
1248 return BAD; |
15619
ccf2c61afacd
XviD zones support. Patch by Doom9: < feedback123 GROOVY doom9 STEADY org >
gpoirier
parents:
15070
diff
changeset
|
1249 } |
ccf2c61afacd
XviD zones support. Patch by Doom9: < feedback123 GROOVY doom9 STEADY org >
gpoirier
parents:
15070
diff
changeset
|
1250 else |
ccf2c61afacd
XviD zones support. Patch by Doom9: < feedback123 GROOVY doom9 STEADY org >
gpoirier
parents:
15070
diff
changeset
|
1251 { |
ccf2c61afacd
XviD zones support. Patch by Doom9: < feedback123 GROOVY doom9 STEADY org >
gpoirier
parents:
15070
diff
changeset
|
1252 create->zones[create->num_zones].mode = XVID_ZONE_WEIGHT; |
ccf2c61afacd
XviD zones support. Patch by Doom9: < feedback123 GROOVY doom9 STEADY org >
gpoirier
parents:
15070
diff
changeset
|
1253 } |
ccf2c61afacd
XviD zones support. Patch by Doom9: < feedback123 GROOVY doom9 STEADY org >
gpoirier
parents:
15070
diff
changeset
|
1254 } |
ccf2c61afacd
XviD zones support. Patch by Doom9: < feedback123 GROOVY doom9 STEADY org >
gpoirier
parents:
15070
diff
changeset
|
1255 create->zones[create->num_zones].frame = start; |
ccf2c61afacd
XviD zones support. Patch by Doom9: < feedback123 GROOVY doom9 STEADY org >
gpoirier
parents:
15070
diff
changeset
|
1256 create->zones[create->num_zones].increment = q; |
ccf2c61afacd
XviD zones support. Patch by Doom9: < feedback123 GROOVY doom9 STEADY org >
gpoirier
parents:
15070
diff
changeset
|
1257 create->zones[create->num_zones].base = 100; // increment is 100 times the actual value |
ccf2c61afacd
XviD zones support. Patch by Doom9: < feedback123 GROOVY doom9 STEADY org >
gpoirier
parents:
15070
diff
changeset
|
1258 create->num_zones++; |
ccf2c61afacd
XviD zones support. Patch by Doom9: < feedback123 GROOVY doom9 STEADY org >
gpoirier
parents:
15070
diff
changeset
|
1259 if (create->num_zones > MAX_ZONES) // show warning if we have too many zones |
ccf2c61afacd
XviD zones support. Patch by Doom9: < feedback123 GROOVY doom9 STEADY org >
gpoirier
parents:
15070
diff
changeset
|
1260 { |
ccf2c61afacd
XviD zones support. Patch by Doom9: < feedback123 GROOVY doom9 STEADY org >
gpoirier
parents:
15070
diff
changeset
|
1261 mp_msg(MSGT_MENCODER, MSGL_ERR, "too many zones, zones will be ignored\n"); |
ccf2c61afacd
XviD zones support. Patch by Doom9: < feedback123 GROOVY doom9 STEADY org >
gpoirier
parents:
15070
diff
changeset
|
1262 } |
ccf2c61afacd
XviD zones support. Patch by Doom9: < feedback123 GROOVY doom9 STEADY org >
gpoirier
parents:
15070
diff
changeset
|
1263 p = strchr(p, '/'); |
ccf2c61afacd
XviD zones support. Patch by Doom9: < feedback123 GROOVY doom9 STEADY org >
gpoirier
parents:
15070
diff
changeset
|
1264 if(p) p++; |
ccf2c61afacd
XviD zones support. Patch by Doom9: < feedback123 GROOVY doom9 STEADY org >
gpoirier
parents:
15070
diff
changeset
|
1265 } |
ccf2c61afacd
XviD zones support. Patch by Doom9: < feedback123 GROOVY doom9 STEADY org >
gpoirier
parents:
15070
diff
changeset
|
1266 } |
26754
63630c09e237
cosmetics: Remove pointless parentheses from return calls.
diego
parents:
26727
diff
changeset
|
1267 return FINE; |
11437 | 1268 } |
1269 | |
1270 static int set_frame_struct(xvid_mplayer_module_t *mod, mp_image_t *mpi) | |
1271 { | |
1272 xvid_enc_frame_t *frame = &mod->frame; | |
1273 | |
1274 /* Most of the initialization is done during dispatch_settings */ | |
1275 frame->version = XVID_VERSION; | |
1276 | |
1277 /* Bind output buffer */ | |
1278 frame->bitstream = mod->mux->buffer; | |
1279 frame->length = -1; | |
1280 | |
1281 /* Frame format */ | |
1282 switch(mpi->imgfmt) { | |
1283 case IMGFMT_YV12: | |
1284 case IMGFMT_IYUV: | |
1285 case IMGFMT_I420: | |
1286 frame->input.csp = XVID_CSP_USER; | |
1287 break; | |
1288 case IMGFMT_YUY2: | |
1289 frame->input.csp = XVID_CSP_YUY2; | |
1290 break; | |
1291 case IMGFMT_UYVY: | |
1292 frame->input.csp = XVID_CSP_UYVY; | |
1293 break; | |
1294 default: | |
1295 mp_msg(MSGT_MENCODER, MSGL_ERR, | |
1296 "xvid: unsupported picture format (%s)!\n", | |
1297 vo_format_name(mpi->imgfmt)); | |
26754
63630c09e237
cosmetics: Remove pointless parentheses from return calls.
diego
parents:
26727
diff
changeset
|
1298 return BAD; |
11437 | 1299 } |
1300 | |
1301 /* Bind source frame */ | |
1302 frame->input.plane[0] = mpi->planes[0]; | |
1303 frame->input.plane[1] = mpi->planes[1]; | |
1304 frame->input.plane[2] = mpi->planes[2]; | |
1305 frame->input.stride[0] = mpi->stride[0]; | |
1306 frame->input.stride[1] = mpi->stride[1]; | |
1307 frame->input.stride[2] = mpi->stride[2]; | |
1308 | |
1309 /* Force the right quantizer -- It is internally managed by RC | |
1310 * plugins */ | |
1311 frame->quant = 0; | |
1312 | |
26754
63630c09e237
cosmetics: Remove pointless parentheses from return calls.
diego
parents:
26727
diff
changeset
|
1313 return FINE; |
11437 | 1314 } |
1315 | |
13610 | 1316 static void |
29263
0f1b5b68af32
whitespace cosmetics: Remove all trailing whitespace.
diego
parents:
28186
diff
changeset
|
1317 flush_internal_buffers(xvid_mplayer_module_t *mod) |
13610 | 1318 { |
1319 int size; | |
1320 xvid_enc_frame_t *frame = &mod->frame; | |
1321 | |
1322 if (mod->instance == NULL) | |
25962 | 1323 return; /* encoder not initialized */ |
13610 | 1324 |
1325 /* Init a fake frame to force flushing */ | |
1326 frame->version = XVID_VERSION; | |
1327 frame->bitstream = mod->mux->buffer; | |
1328 frame->length = -1; | |
1329 frame->input.csp = XVID_CSP_NULL; | |
1330 frame->input.plane[0] = NULL; | |
1331 frame->input.plane[1] = NULL; | |
1332 frame->input.plane[2] = NULL; | |
1333 frame->input.stride[0] = 0; | |
1334 frame->input.stride[1] = 0; | |
1335 frame->input.stride[2] = 0; | |
1336 frame->quant = 0; | |
1337 | |
1338 /* Flush encoder buffers caused by bframes usage */ | |
1339 do { | |
1340 xvid_enc_stats_t stats; | |
1341 memset(&stats, 0, sizeof(xvid_enc_stats_t)); | |
1342 stats.version = XVID_VERSION; | |
1343 | |
1344 /* Encode internal buffer */ | |
1345 size = xvid_encore(mod->instance, XVID_ENC_ENCODE, &mod->frame, &stats); | |
1346 | |
1347 if (size>0) { | |
1348 /* Update stats */ | |
1349 update_stats(mod, &stats); | |
1350 | |
1351 /* xvidcore outputed bitstream -- mux it */ | |
1352 muxer_write_chunk(mod->mux, size, | |
17487
fa17424b4c7b
change muxer_write_chunk() so that pts/dts _could_ be passed from encoder to muxer
michael
parents:
17012
diff
changeset
|
1353 (mod->frame.out_flags & XVID_KEYFRAME)?0x10:0, MP_NOPTS_VALUE, MP_NOPTS_VALUE); |
13610 | 1354 } |
1355 } while (size>0); | |
1356 } | |
1357 | |
1358 #define SSE2PSNR(sse, nbpixels) \ | |
1359 ((!(sse)) ? 99.99f : 48.131f - 10*(double)log10((double)(sse)/(double)((nbpixels)))) | |
1360 static void | |
1361 update_stats(xvid_mplayer_module_t *mod, xvid_enc_stats_t *stats) | |
1362 { | |
1363 if(xvidenc_stats && stats->type > 0) { | |
1364 mod->sse_y += stats->sse_y; | |
1365 mod->sse_u += stats->sse_u; | |
1366 mod->sse_v += stats->sse_v; | |
1367 | |
1368 if(mod->min_sse_y > stats->sse_y) { | |
1369 mod->min_sse_y = stats->sse_y; | |
1370 mod->min_sse_u = stats->sse_u; | |
1371 mod->min_sse_v = stats->sse_v; | |
1372 mod->min_framenum = mod->frames; | |
1373 } | |
1374 | |
1375 if(mod->max_sse_y < stats->sse_y) { | |
1376 mod->max_sse_y = stats->sse_y; | |
1377 mod->max_sse_u = stats->sse_u; | |
1378 mod->max_sse_v = stats->sse_v; | |
1379 mod->max_framenum = mod->frames; | |
1380 } | |
29263
0f1b5b68af32
whitespace cosmetics: Remove all trailing whitespace.
diego
parents:
28186
diff
changeset
|
1381 |
35325
d462bb933886
Do not attempt to write into a file if opening it failed.
reimar
parents:
35324
diff
changeset
|
1382 if (xvidenc_psnr && !mod->fvstats) { |
13610 | 1383 char filename[20]; |
1384 time_t today2; | |
1385 struct tm *today; | |
1386 today2 = time (NULL); | |
1387 today = localtime (&today2); | |
1388 sprintf (filename, "psnr_%02d%02d%02d.log", today->tm_hour, today->tm_min, today->tm_sec); | |
1389 mod->fvstats = fopen (filename,"w"); | |
1390 if (!mod->fvstats) { | |
1391 perror ("fopen"); | |
1392 /* Disable PSNR file output so we don't get here again */ | |
1393 xvidenc_psnr = 0; | |
1394 } | |
35325
d462bb933886
Do not attempt to write into a file if opening it failed.
reimar
parents:
35324
diff
changeset
|
1395 } |
d462bb933886
Do not attempt to write into a file if opening it failed.
reimar
parents:
35324
diff
changeset
|
1396 if (xvidenc_psnr) { |
13610 | 1397 fprintf (mod->fvstats, "%6d, %2d, %6d, %2.2f, %2.2f, %2.2f, %2.2f %c\n", |
1398 mod->frames, | |
1399 stats->quant, | |
1400 stats->length, | |
1401 SSE2PSNR (stats->sse_y, mod->pixels), | |
1402 SSE2PSNR (stats->sse_u, mod->pixels / 4), | |
1403 SSE2PSNR (stats->sse_v, mod->pixels / 4), | |
1404 SSE2PSNR (stats->sse_y + stats->sse_u + stats->sse_v,(double)mod->pixels * 1.5), | |
1405 stats->type==1?'I':stats->type==2?'P':stats->type==3?'B':stats->type?'S':'?' | |
1406 ); | |
1407 } | |
1408 mod->frames++; | |
1409 } | |
1410 } | |
1411 | |
1412 static void | |
1413 print_stats(xvid_mplayer_module_t *mod) | |
1414 { | |
1415 if (mod->frames) { | |
1416 mod->sse_y /= mod->frames; | |
1417 mod->sse_u /= mod->frames; | |
1418 mod->sse_v /= mod->frames; | |
1419 | |
1420 mp_msg(MSGT_MENCODER, MSGL_INFO, | |
1421 "The value 99.99dB is a special value and represents " | |
1422 "the upper range limit\n"); | |
1423 mp_msg(MSGT_MENCODER, MSGL_INFO, | |
20017
8e43776eeb49
make PSNR printing more consistent with other encoders
corey
parents:
19614
diff
changeset
|
1424 "xvid: Min PSNR Y:%.2f, Cb:%.2f, Cr:%.2f, All:%.2f in frame %d\n", |
13610 | 1425 SSE2PSNR(mod->max_sse_y, mod->pixels), |
1426 SSE2PSNR(mod->max_sse_u, mod->pixels/4), | |
1427 SSE2PSNR(mod->max_sse_v, mod->pixels/4), | |
20017
8e43776eeb49
make PSNR printing more consistent with other encoders
corey
parents:
19614
diff
changeset
|
1428 SSE2PSNR(mod->max_sse_y + mod->max_sse_u + mod->max_sse_v, mod->pixels*1.5), |
13610 | 1429 mod->max_framenum); |
1430 mp_msg(MSGT_MENCODER, MSGL_INFO, | |
20017
8e43776eeb49
make PSNR printing more consistent with other encoders
corey
parents:
19614
diff
changeset
|
1431 "xvid: Average PSNR Y:%.2f, Cb:%.2f, Cr:%.2f, All:%.2f for %d frames\n", |
13610 | 1432 SSE2PSNR(mod->sse_y, mod->pixels), |
1433 SSE2PSNR(mod->sse_u, mod->pixels/4), | |
1434 SSE2PSNR(mod->sse_v, mod->pixels/4), | |
20017
8e43776eeb49
make PSNR printing more consistent with other encoders
corey
parents:
19614
diff
changeset
|
1435 SSE2PSNR(mod->sse_y + mod->sse_u + mod->sse_v, mod->pixels*1.5), |
13610 | 1436 mod->frames); |
1437 mp_msg(MSGT_MENCODER, MSGL_INFO, | |
20017
8e43776eeb49
make PSNR printing more consistent with other encoders
corey
parents:
19614
diff
changeset
|
1438 "xvid: Max PSNR Y:%.2f, Cb:%.2f, Cr:%.2f, All:%.2f in frame %d\n", |
13610 | 1439 SSE2PSNR(mod->min_sse_y, mod->pixels), |
1440 SSE2PSNR(mod->min_sse_u, mod->pixels/4), | |
1441 SSE2PSNR(mod->min_sse_v, mod->pixels/4), | |
20017
8e43776eeb49
make PSNR printing more consistent with other encoders
corey
parents:
19614
diff
changeset
|
1442 SSE2PSNR(mod->min_sse_y + mod->min_sse_u + mod->min_sse_v, mod->pixels*1.5), |
13610 | 1443 mod->min_framenum); |
1444 } | |
1445 } | |
1446 #undef SSE2PSNR | |
1447 | |
11437 | 1448 static void *read_matrix(unsigned char *filename) |
1449 { | |
1450 int i; | |
1451 unsigned char *matrix; | |
1452 FILE *input; | |
29263
0f1b5b68af32
whitespace cosmetics: Remove all trailing whitespace.
diego
parents:
28186
diff
changeset
|
1453 |
11437 | 1454 /* Allocate matrix space */ |
1455 if((matrix = malloc(64*sizeof(unsigned char))) == NULL) | |
26754
63630c09e237
cosmetics: Remove pointless parentheses from return calls.
diego
parents:
26727
diff
changeset
|
1456 return NULL; |
11437 | 1457 |
1458 /* Open the matrix file */ | |
1459 if((input = fopen(filename, "rb")) == NULL) { | |
13610 | 1460 mp_msg(MSGT_MENCODER, MSGL_ERR, |
11437 | 1461 "xvid: Error opening the matrix file %s\n", |
1462 filename); | |
1463 free(matrix); | |
26754
63630c09e237
cosmetics: Remove pointless parentheses from return calls.
diego
parents:
26727
diff
changeset
|
1464 return NULL; |
11437 | 1465 } |
1466 | |
1467 /* Read the matrix */ | |
1468 for(i=0; i<64; i++) { | |
1469 | |
1470 int value; | |
1471 | |
1472 /* If fscanf fails then get out of the loop */ | |
1473 if(fscanf(input, "%d", &value) != 1) { | |
13610 | 1474 mp_msg(MSGT_MENCODER, MSGL_ERR, |
11437 | 1475 "xvid: Error reading the matrix file %s\n", |
1476 filename); | |
1477 free(matrix); | |
1478 fclose(input); | |
26754
63630c09e237
cosmetics: Remove pointless parentheses from return calls.
diego
parents:
26727
diff
changeset
|
1479 return NULL; |
11437 | 1480 } |
1481 | |
1482 /* Clamp the value to safe range */ | |
1483 value = (value< 1)?1 :value; | |
1484 value = (value>255)?255:value; | |
1485 matrix[i] = value; | |
1486 } | |
1487 | |
1488 /* We're done */ | |
1489 fclose(input); | |
1490 | |
26754
63630c09e237
cosmetics: Remove pointless parentheses from return calls.
diego
parents:
26727
diff
changeset
|
1491 return matrix; |
29263
0f1b5b68af32
whitespace cosmetics: Remove all trailing whitespace.
diego
parents:
28186
diff
changeset
|
1492 |
11437 | 1493 } |
1494 | |
13610 | 1495 |
1496 static const char * | |
1497 par_string(int parcode) | |
1498 { | |
1499 const char *par_string; | |
1500 switch (parcode) { | |
1501 case XVID_PAR_11_VGA: | |
1502 par_string = "vga11"; | |
1503 break; | |
1504 case XVID_PAR_43_PAL: | |
1505 par_string = "pal43"; | |
1506 break; | |
1507 case XVID_PAR_43_NTSC: | |
1508 par_string = "ntsc43"; | |
1509 break; | |
1510 case XVID_PAR_169_PAL: | |
1511 par_string = "pal169"; | |
1512 break; | |
1513 case XVID_PAR_169_NTSC: | |
1514 par_string = "ntsc69"; | |
1515 break; | |
1516 case XVID_PAR_EXT: | |
1517 par_string = "ext"; | |
1518 break; | |
1519 default: | |
1520 par_string = "unknown"; | |
1521 break; | |
1522 } | |
26754
63630c09e237
cosmetics: Remove pointless parentheses from return calls.
diego
parents:
26727
diff
changeset
|
1523 return par_string; |
13610 | 1524 } |
1525 | |
11437 | 1526 static const char *errorstring(int err) |
1527 { | |
13610 | 1528 const char *error; |
11437 | 1529 switch(err) { |
1530 case XVID_ERR_FAIL: | |
1531 error = "General fault"; | |
1532 break; | |
1533 case XVID_ERR_MEMORY: | |
1534 error = "Memory allocation error"; | |
1535 break; | |
1536 case XVID_ERR_FORMAT: | |
1537 error = "File format error"; | |
1538 break; | |
1539 case XVID_ERR_VERSION: | |
1540 error = "Structure version not supported"; | |
1541 break; | |
1542 case XVID_ERR_END: | |
1543 error = "End of stream reached"; | |
1544 break; | |
1545 default: | |
1546 error = "Unknown"; | |
1547 } | |
1548 | |
26754
63630c09e237
cosmetics: Remove pointless parentheses from return calls.
diego
parents:
26727
diff
changeset
|
1549 return error; |
11437 | 1550 } |
1551 | |
1552 /***************************************************************************** | |
1553 * Module structure definition | |
1554 ****************************************************************************/ | |
1555 | |
32033 | 1556 const vf_info_t ve_info_xvid = { |
26883 | 1557 "XviD 1.0 encoder", |
11437 | 1558 "xvid", |
1559 "Marco Belli <elcabesa@inwind.it>, Edouard Gomez <ed.gomez@free.fr>", | |
1560 "No comment", | |
1561 vf_open | |
1562 }; | |
1563 | |
1564 | |
1565 /* Please do not change that tag comment. | |
1566 * arch-tag: 42ccc257-0548-4a3e-9617-2876c4e8ac88 mplayer xvid encoder module */ |