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