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