annotate msmpeg4.c @ 12530:63edd10ad4bc libavcodec tip

Try to fix crashes introduced by r25218 r25218 made assumptions about the existence of past reference frames that weren't necessarily true.
author darkshikari
date Tue, 28 Sep 2010 09:06:22 +0000
parents 7c9d711a4201
children
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
0
986e461dc072 Initial revision
glantau
parents:
diff changeset
1 /*
986e461dc072 Initial revision
glantau
parents:
diff changeset
2 * MSMPEG4 backend for ffmpeg encoder and decoder
8629
04423b2f6e0b cosmetics: Remove pointless period after copyright statement non-sentences.
diego
parents: 8596
diff changeset
3 * Copyright (c) 2001 Fabrice Bellard
1739
07a484280a82 copyright year update of the files i touched and remembered, things look annoyingly unmaintained otherwise
michael
parents: 1651
diff changeset
4 * Copyright (c) 2002-2004 Michael Niedermayer <michaelni@gmx.at>
0
986e461dc072 Initial revision
glantau
parents:
diff changeset
5 *
5214
470601203f44 Group all copyright and author notices together.
diego
parents: 5179
diff changeset
6 * msmpeg4v1 & v2 stuff by Michael Niedermayer <michaelni@gmx.at>
470601203f44 Group all copyright and author notices together.
diego
parents: 5179
diff changeset
7 *
3947
c8c591fe26f8 Change license headers to say 'FFmpeg' instead of 'this program/this library'
diego
parents: 3781
diff changeset
8 * This file is part of FFmpeg.
c8c591fe26f8 Change license headers to say 'FFmpeg' instead of 'this program/this library'
diego
parents: 3781
diff changeset
9 *
c8c591fe26f8 Change license headers to say 'FFmpeg' instead of 'this program/this library'
diego
parents: 3781
diff changeset
10 * FFmpeg is free software; you can redistribute it and/or
429
718a22dc121f license/copyright change
glantau
parents: 411
diff changeset
11 * modify it under the terms of the GNU Lesser General Public
718a22dc121f license/copyright change
glantau
parents: 411
diff changeset
12 * License as published by the Free Software Foundation; either
3947
c8c591fe26f8 Change license headers to say 'FFmpeg' instead of 'this program/this library'
diego
parents: 3781
diff changeset
13 * version 2.1 of the License, or (at your option) any later version.
0
986e461dc072 Initial revision
glantau
parents:
diff changeset
14 *
3947
c8c591fe26f8 Change license headers to say 'FFmpeg' instead of 'this program/this library'
diego
parents: 3781
diff changeset
15 * FFmpeg is distributed in the hope that it will be useful,
0
986e461dc072 Initial revision
glantau
parents:
diff changeset
16 * but WITHOUT ANY WARRANTY; without even the implied warranty of
429
718a22dc121f license/copyright change
glantau
parents: 411
diff changeset
17 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
718a22dc121f license/copyright change
glantau
parents: 411
diff changeset
18 * Lesser General Public License for more details.
0
986e461dc072 Initial revision
glantau
parents:
diff changeset
19 *
429
718a22dc121f license/copyright change
glantau
parents: 411
diff changeset
20 * You should have received a copy of the GNU Lesser General Public
3947
c8c591fe26f8 Change license headers to say 'FFmpeg' instead of 'this program/this library'
diego
parents: 3781
diff changeset
21 * License along with FFmpeg; if not, write to the Free Software
3036
0b546eab515d Update licensing information: The FSF changed postal address.
diego
parents: 2979
diff changeset
22 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
0
986e461dc072 Initial revision
glantau
parents:
diff changeset
23 */
1106
1e39f273ecd6 per file doxy
michaelni
parents: 1070
diff changeset
24
1e39f273ecd6 per file doxy
michaelni
parents: 1070
diff changeset
25 /**
11644
7dd2a45249a9 Remove explicit filename from Doxygen @file commands.
diego
parents: 11560
diff changeset
26 * @file
1106
1e39f273ecd6 per file doxy
michaelni
parents: 1070
diff changeset
27 * MSMPEG4 backend for ffmpeg encoder and decoder.
1e39f273ecd6 per file doxy
michaelni
parents: 1070
diff changeset
28 */
1e39f273ecd6 per file doxy
michaelni
parents: 1070
diff changeset
29
396
fce0a2520551 removed useless header includes - use av memory functions
glantau
parents: 347
diff changeset
30 #include "avcodec.h"
0
986e461dc072 Initial revision
glantau
parents:
diff changeset
31 #include "dsputil.h"
986e461dc072 Initial revision
glantau
parents:
diff changeset
32 #include "mpegvideo.h"
5884
02007962faf4 split wmv2 in its own file
aurel
parents: 5882
diff changeset
33 #include "msmpeg4.h"
10071
6ac0d4957d35 Replace #ifdef PIC checks with the more appropriate HAVE_EBX_AVAILABLE/HAVE_7REGS.
reimar
parents: 9998
diff changeset
34 #include "libavutil/x86_cpu.h"
10803
4605bd2fdb7f Split the mpeg4 encoder and decoder off h263.c
michael
parents: 10758
diff changeset
35 #include "h263.h"
4605bd2fdb7f Split the mpeg4 encoder and decoder off h263.c
michael
parents: 10758
diff changeset
36 #include "mpeg4video.h"
411
5c8b3a717929 workaround dc_scale bug in old ffmpeg msmpeg4v3 encoder (set workaround_bugs=1 for this)
michaelni
parents: 396
diff changeset
37
0
986e461dc072 Initial revision
glantau
parents:
diff changeset
38 /*
2967
ef2149182f1c COSMETICS: Remove all trailing whitespace.
diego
parents: 2846
diff changeset
39 * You can also call this codec : MPEG4 with a twist !
0
986e461dc072 Initial revision
glantau
parents:
diff changeset
40 *
2967
ef2149182f1c COSMETICS: Remove all trailing whitespace.
diego
parents: 2846
diff changeset
41 * TODO:
0
986e461dc072 Initial revision
glantau
parents:
diff changeset
42 * - (encoding) select best mv table (two choices)
2967
ef2149182f1c COSMETICS: Remove all trailing whitespace.
diego
parents: 2846
diff changeset
43 * - (encoding) select best vlc/dc table
0
986e461dc072 Initial revision
glantau
parents:
diff changeset
44 */
986e461dc072 Initial revision
glantau
parents:
diff changeset
45 //#define DEBUG
986e461dc072 Initial revision
glantau
parents:
diff changeset
46
531
f5d7fcc81787 get_vlc() optimizations
michaelni
parents: 519
diff changeset
47 #define DC_VLC_BITS 9
f5d7fcc81787 get_vlc() optimizations
michaelni
parents: 519
diff changeset
48 #define V2_INTRA_CBPC_VLC_BITS 3
f5d7fcc81787 get_vlc() optimizations
michaelni
parents: 519
diff changeset
49 #define V2_MB_TYPE_VLC_BITS 7
f5d7fcc81787 get_vlc() optimizations
michaelni
parents: 519
diff changeset
50 #define MV_VLC_BITS 9
f5d7fcc81787 get_vlc() optimizations
michaelni
parents: 519
diff changeset
51 #define V2_MV_VLC_BITS 9
f5d7fcc81787 get_vlc() optimizations
michaelni
parents: 519
diff changeset
52 #define TEX_VLC_BITS 9
f5d7fcc81787 get_vlc() optimizations
michaelni
parents: 519
diff changeset
53
578
32c142b10263 fixing bitrate vs. kbitrate in header
michaelni
parents: 563
diff changeset
54 #define II_BITRATE 128*1024
32c142b10263 fixing bitrate vs. kbitrate in header
michaelni
parents: 563
diff changeset
55 #define MBAC_BITRATE 50*1024
32c142b10263 fixing bitrate vs. kbitrate in header
michaelni
parents: 563
diff changeset
56
936
caa77cd960c0 qpel encoding
michaelni
parents: 903
diff changeset
57 #define DEFAULT_INTER_INDEX 3
caa77cd960c0 qpel encoding
michaelni
parents: 903
diff changeset
58
1064
b32afefe7d33 * UINTX -> uintx_t INTX -> intx_t
kabi
parents: 1063
diff changeset
59 static uint32_t v2_dc_lum_table[512][2];
b32afefe7d33 * UINTX -> uintx_t INTX -> intx_t
kabi
parents: 1063
diff changeset
60 static uint32_t v2_dc_chroma_table[512][2];
307
764aeec1320e msmpeg4v2 decoding (no encoding yet)
michaelni
parents: 300
diff changeset
61
3359
87187ebe2c28 Rename VC9 to VC1 as there is no such thing as VC9
kostya
parents: 3177
diff changeset
62 /* vc1 externs */
6146
809fd829a864 Add a couple of missing consts.
diego
parents: 5885
diff changeset
63 extern const uint8_t wmv3_dc_scale_table[32];
601
76e9b51cccda faster vlc table selection
michaelni
parents: 596
diff changeset
64
0
986e461dc072 Initial revision
glantau
parents:
diff changeset
65 #ifdef DEBUG
986e461dc072 Initial revision
glantau
parents:
diff changeset
66 int frame_count = 0;
986e461dc072 Initial revision
glantau
parents:
diff changeset
67 #endif
986e461dc072 Initial revision
glantau
parents:
diff changeset
68
986e461dc072 Initial revision
glantau
parents:
diff changeset
69 #include "msmpeg4data.h"
986e461dc072 Initial revision
glantau
parents:
diff changeset
70
8590
7a463923ecd1 Change semantic of CONFIG_*, HAVE_* and ARCH_*.
aurel
parents: 8031
diff changeset
71 #if CONFIG_ENCODERS //strangely gcc includes this even if it is not referenced
1064
b32afefe7d33 * UINTX -> uintx_t INTX -> intx_t
kabi
parents: 1063
diff changeset
72 static uint8_t rl_length[NB_RL_TABLES][MAX_LEVEL+1][MAX_RUN+1][2];
1325
1cbc2380d172 CONFIG_ENCODERS cleanup
michaelni
parents: 1273
diff changeset
73 #endif //CONFIG_ENCODERS
601
76e9b51cccda faster vlc table selection
michaelni
parents: 596
diff changeset
74
4668
1f1a0e67b961 kill av_mallocz_static() calls in init_rl()
michael
parents: 4174
diff changeset
75 static uint8_t static_rl_table_store[NB_RL_TABLES][2][2*MAX_RUN + MAX_LEVEL + 3];
1f1a0e67b961 kill av_mallocz_static() calls in init_rl()
michael
parents: 4174
diff changeset
76
10751
74e8feb81c6d cosmetics: Reorder functions to avoid forward declarations.
diego
parents: 10750
diff changeset
77 /* This table is practically identical to the one from h263
74e8feb81c6d cosmetics: Reorder functions to avoid forward declarations.
diego
parents: 10750
diff changeset
78 * except that it is inverted. */
74e8feb81c6d cosmetics: Reorder functions to avoid forward declarations.
diego
parents: 10750
diff changeset
79 static av_cold void init_h263_dc_for_msmpeg4(void)
74e8feb81c6d cosmetics: Reorder functions to avoid forward declarations.
diego
parents: 10750
diff changeset
80 {
74e8feb81c6d cosmetics: Reorder functions to avoid forward declarations.
diego
parents: 10750
diff changeset
81 int level, uni_code, uni_len;
74e8feb81c6d cosmetics: Reorder functions to avoid forward declarations.
diego
parents: 10750
diff changeset
82
74e8feb81c6d cosmetics: Reorder functions to avoid forward declarations.
diego
parents: 10750
diff changeset
83 for(level=-256; level<256; level++){
74e8feb81c6d cosmetics: Reorder functions to avoid forward declarations.
diego
parents: 10750
diff changeset
84 int size, v, l;
74e8feb81c6d cosmetics: Reorder functions to avoid forward declarations.
diego
parents: 10750
diff changeset
85 /* find number of bits */
74e8feb81c6d cosmetics: Reorder functions to avoid forward declarations.
diego
parents: 10750
diff changeset
86 size = 0;
74e8feb81c6d cosmetics: Reorder functions to avoid forward declarations.
diego
parents: 10750
diff changeset
87 v = abs(level);
74e8feb81c6d cosmetics: Reorder functions to avoid forward declarations.
diego
parents: 10750
diff changeset
88 while (v) {
74e8feb81c6d cosmetics: Reorder functions to avoid forward declarations.
diego
parents: 10750
diff changeset
89 v >>= 1;
74e8feb81c6d cosmetics: Reorder functions to avoid forward declarations.
diego
parents: 10750
diff changeset
90 size++;
74e8feb81c6d cosmetics: Reorder functions to avoid forward declarations.
diego
parents: 10750
diff changeset
91 }
74e8feb81c6d cosmetics: Reorder functions to avoid forward declarations.
diego
parents: 10750
diff changeset
92
74e8feb81c6d cosmetics: Reorder functions to avoid forward declarations.
diego
parents: 10750
diff changeset
93 if (level < 0)
74e8feb81c6d cosmetics: Reorder functions to avoid forward declarations.
diego
parents: 10750
diff changeset
94 l= (-level) ^ ((1 << size) - 1);
74e8feb81c6d cosmetics: Reorder functions to avoid forward declarations.
diego
parents: 10750
diff changeset
95 else
74e8feb81c6d cosmetics: Reorder functions to avoid forward declarations.
diego
parents: 10750
diff changeset
96 l= level;
74e8feb81c6d cosmetics: Reorder functions to avoid forward declarations.
diego
parents: 10750
diff changeset
97
74e8feb81c6d cosmetics: Reorder functions to avoid forward declarations.
diego
parents: 10750
diff changeset
98 /* luminance h263 */
10816
9abebeca7d1b Rename DCtab_*, its a global variable and it helps understanding if mpeg4
michael
parents: 10803
diff changeset
99 uni_code= ff_mpeg4_DCtab_lum[size][0];
9abebeca7d1b Rename DCtab_*, its a global variable and it helps understanding if mpeg4
michael
parents: 10803
diff changeset
100 uni_len = ff_mpeg4_DCtab_lum[size][1];
10751
74e8feb81c6d cosmetics: Reorder functions to avoid forward declarations.
diego
parents: 10750
diff changeset
101 uni_code ^= (1<<uni_len)-1; //M$ does not like compatibility
74e8feb81c6d cosmetics: Reorder functions to avoid forward declarations.
diego
parents: 10750
diff changeset
102
74e8feb81c6d cosmetics: Reorder functions to avoid forward declarations.
diego
parents: 10750
diff changeset
103 if (size > 0) {
74e8feb81c6d cosmetics: Reorder functions to avoid forward declarations.
diego
parents: 10750
diff changeset
104 uni_code<<=size; uni_code|=l;
74e8feb81c6d cosmetics: Reorder functions to avoid forward declarations.
diego
parents: 10750
diff changeset
105 uni_len+=size;
74e8feb81c6d cosmetics: Reorder functions to avoid forward declarations.
diego
parents: 10750
diff changeset
106 if (size > 8){
74e8feb81c6d cosmetics: Reorder functions to avoid forward declarations.
diego
parents: 10750
diff changeset
107 uni_code<<=1; uni_code|=1;
74e8feb81c6d cosmetics: Reorder functions to avoid forward declarations.
diego
parents: 10750
diff changeset
108 uni_len++;
74e8feb81c6d cosmetics: Reorder functions to avoid forward declarations.
diego
parents: 10750
diff changeset
109 }
74e8feb81c6d cosmetics: Reorder functions to avoid forward declarations.
diego
parents: 10750
diff changeset
110 }
74e8feb81c6d cosmetics: Reorder functions to avoid forward declarations.
diego
parents: 10750
diff changeset
111 v2_dc_lum_table[level+256][0]= uni_code;
74e8feb81c6d cosmetics: Reorder functions to avoid forward declarations.
diego
parents: 10750
diff changeset
112 v2_dc_lum_table[level+256][1]= uni_len;
74e8feb81c6d cosmetics: Reorder functions to avoid forward declarations.
diego
parents: 10750
diff changeset
113
74e8feb81c6d cosmetics: Reorder functions to avoid forward declarations.
diego
parents: 10750
diff changeset
114 /* chrominance h263 */
10816
9abebeca7d1b Rename DCtab_*, its a global variable and it helps understanding if mpeg4
michael
parents: 10803
diff changeset
115 uni_code= ff_mpeg4_DCtab_chrom[size][0];
9abebeca7d1b Rename DCtab_*, its a global variable and it helps understanding if mpeg4
michael
parents: 10803
diff changeset
116 uni_len = ff_mpeg4_DCtab_chrom[size][1];
10751
74e8feb81c6d cosmetics: Reorder functions to avoid forward declarations.
diego
parents: 10750
diff changeset
117 uni_code ^= (1<<uni_len)-1; //M$ does not like compatibility
74e8feb81c6d cosmetics: Reorder functions to avoid forward declarations.
diego
parents: 10750
diff changeset
118
74e8feb81c6d cosmetics: Reorder functions to avoid forward declarations.
diego
parents: 10750
diff changeset
119 if (size > 0) {
74e8feb81c6d cosmetics: Reorder functions to avoid forward declarations.
diego
parents: 10750
diff changeset
120 uni_code<<=size; uni_code|=l;
74e8feb81c6d cosmetics: Reorder functions to avoid forward declarations.
diego
parents: 10750
diff changeset
121 uni_len+=size;
74e8feb81c6d cosmetics: Reorder functions to avoid forward declarations.
diego
parents: 10750
diff changeset
122 if (size > 8){
74e8feb81c6d cosmetics: Reorder functions to avoid forward declarations.
diego
parents: 10750
diff changeset
123 uni_code<<=1; uni_code|=1;
74e8feb81c6d cosmetics: Reorder functions to avoid forward declarations.
diego
parents: 10750
diff changeset
124 uni_len++;
74e8feb81c6d cosmetics: Reorder functions to avoid forward declarations.
diego
parents: 10750
diff changeset
125 }
74e8feb81c6d cosmetics: Reorder functions to avoid forward declarations.
diego
parents: 10750
diff changeset
126 }
74e8feb81c6d cosmetics: Reorder functions to avoid forward declarations.
diego
parents: 10750
diff changeset
127 v2_dc_chroma_table[level+256][0]= uni_code;
74e8feb81c6d cosmetics: Reorder functions to avoid forward declarations.
diego
parents: 10750
diff changeset
128 v2_dc_chroma_table[level+256][1]= uni_len;
74e8feb81c6d cosmetics: Reorder functions to avoid forward declarations.
diego
parents: 10750
diff changeset
129
74e8feb81c6d cosmetics: Reorder functions to avoid forward declarations.
diego
parents: 10750
diff changeset
130 }
74e8feb81c6d cosmetics: Reorder functions to avoid forward declarations.
diego
parents: 10750
diff changeset
131 }
74e8feb81c6d cosmetics: Reorder functions to avoid forward declarations.
diego
parents: 10750
diff changeset
132
9007
043574c5c153 Add missing av_cold in static init/close functions.
stefano
parents: 8780
diff changeset
133 static av_cold void common_init(MpegEncContext * s)
499
8b7a54d58549 wmv1 support
michaelni
parents: 483
diff changeset
134 {
6350
8e63d869a904 typo fix: inited --> initialized
diego
parents: 6146
diff changeset
135 static int initialized=0;
2967
ef2149182f1c COSMETICS: Remove all trailing whitespace.
diego
parents: 2846
diff changeset
136
499
8b7a54d58549 wmv1 support
michaelni
parents: 483
diff changeset
137 switch(s->msmpeg4_version){
8b7a54d58549 wmv1 support
michaelni
parents: 483
diff changeset
138 case 1:
8b7a54d58549 wmv1 support
michaelni
parents: 483
diff changeset
139 case 2:
8b7a54d58549 wmv1 support
michaelni
parents: 483
diff changeset
140 s->y_dc_scale_table=
8b7a54d58549 wmv1 support
michaelni
parents: 483
diff changeset
141 s->c_dc_scale_table= ff_mpeg1_dc_scale_table;
8b7a54d58549 wmv1 support
michaelni
parents: 483
diff changeset
142 break;
8b7a54d58549 wmv1 support
michaelni
parents: 483
diff changeset
143 case 3:
8b7a54d58549 wmv1 support
michaelni
parents: 483
diff changeset
144 if(s->workaround_bugs){
8b7a54d58549 wmv1 support
michaelni
parents: 483
diff changeset
145 s->y_dc_scale_table= old_ff_y_dc_scale_table;
7136
7a73d76aaaa0 remove duplicate tables
stefang
parents: 6940
diff changeset
146 s->c_dc_scale_table= wmv1_c_dc_scale_table;
499
8b7a54d58549 wmv1 support
michaelni
parents: 483
diff changeset
147 } else{
8b7a54d58549 wmv1 support
michaelni
parents: 483
diff changeset
148 s->y_dc_scale_table= ff_mpeg4_y_dc_scale_table;
8b7a54d58549 wmv1 support
michaelni
parents: 483
diff changeset
149 s->c_dc_scale_table= ff_mpeg4_c_dc_scale_table;
8b7a54d58549 wmv1 support
michaelni
parents: 483
diff changeset
150 }
8b7a54d58549 wmv1 support
michaelni
parents: 483
diff changeset
151 break;
8b7a54d58549 wmv1 support
michaelni
parents: 483
diff changeset
152 case 4:
936
caa77cd960c0 qpel encoding
michaelni
parents: 903
diff changeset
153 case 5:
499
8b7a54d58549 wmv1 support
michaelni
parents: 483
diff changeset
154 s->y_dc_scale_table= wmv1_y_dc_scale_table;
8b7a54d58549 wmv1 support
michaelni
parents: 483
diff changeset
155 s->c_dc_scale_table= wmv1_c_dc_scale_table;
8b7a54d58549 wmv1 support
michaelni
parents: 483
diff changeset
156 break;
9995
3141f69e3905 Do not check for both CONFIG_VC1_DECODER and CONFIG_WMV3_DECODER,
diego
parents: 9455
diff changeset
157 #if CONFIG_VC1_DECODER
2474
81a9f883a17a In that patch:
michael
parents: 2465
diff changeset
158 case 6:
81a9f883a17a In that patch:
michael
parents: 2465
diff changeset
159 s->y_dc_scale_table= wmv3_dc_scale_table;
81a9f883a17a In that patch:
michael
parents: 2465
diff changeset
160 s->c_dc_scale_table= wmv3_dc_scale_table;
81a9f883a17a In that patch:
michael
parents: 2465
diff changeset
161 break;
2639
e2780f828440 put most codecs under ifdefs
michael
parents: 2637
diff changeset
162 #endif
2474
81a9f883a17a In that patch:
michael
parents: 2465
diff changeset
163
499
8b7a54d58549 wmv1 support
michaelni
parents: 483
diff changeset
164 }
8b7a54d58549 wmv1 support
michaelni
parents: 483
diff changeset
165
2967
ef2149182f1c COSMETICS: Remove all trailing whitespace.
diego
parents: 2846
diff changeset
166
936
caa77cd960c0 qpel encoding
michaelni
parents: 903
diff changeset
167 if(s->msmpeg4_version>=4){
1273
a979fab41ed8 ASV1 codec
michaelni
parents: 1261
diff changeset
168 ff_init_scantable(s->dsp.idct_permutation, &s->intra_scantable , wmv1_scantable[1]);
a979fab41ed8 ASV1 codec
michaelni
parents: 1261
diff changeset
169 ff_init_scantable(s->dsp.idct_permutation, &s->intra_h_scantable, wmv1_scantable[2]);
a979fab41ed8 ASV1 codec
michaelni
parents: 1261
diff changeset
170 ff_init_scantable(s->dsp.idct_permutation, &s->intra_v_scantable, wmv1_scantable[3]);
a979fab41ed8 ASV1 codec
michaelni
parents: 1261
diff changeset
171 ff_init_scantable(s->dsp.idct_permutation, &s->inter_scantable , wmv1_scantable[0]);
499
8b7a54d58549 wmv1 support
michaelni
parents: 483
diff changeset
172 }
706
e65798d228ea idct permutation cleanup, idct can be selected per context now
michaelni
parents: 601
diff changeset
173 //Note the default tables are set in common_init in mpegvideo.c
2967
ef2149182f1c COSMETICS: Remove all trailing whitespace.
diego
parents: 2846
diff changeset
174
6350
8e63d869a904 typo fix: inited --> initialized
diego
parents: 6146
diff changeset
175 if(!initialized){
8e63d869a904 typo fix: inited --> initialized
diego
parents: 6146
diff changeset
176 initialized=1;
499
8b7a54d58549 wmv1 support
michaelni
parents: 483
diff changeset
177
8b7a54d58549 wmv1 support
michaelni
parents: 483
diff changeset
178 init_h263_dc_for_msmpeg4();
8b7a54d58549 wmv1 support
michaelni
parents: 483
diff changeset
179 }
8b7a54d58549 wmv1 support
michaelni
parents: 483
diff changeset
180 }
8b7a54d58549 wmv1 support
michaelni
parents: 483
diff changeset
181
8590
7a463923ecd1 Change semantic of CONFIG_*, HAVE_* and ARCH_*.
aurel
parents: 8031
diff changeset
182 #if CONFIG_ENCODERS
1070
6da5ae9ee199 more #ifdef CONFIG_ENCODERS patch by (Wolfgang Hesseler <qv at multimediaware dot com>) with modifications by me (s/WOLFGANG/CONFIG_ENCODERS/ and some other fixes)
michaelni
parents: 1064
diff changeset
183
0
986e461dc072 Initial revision
glantau
parents:
diff changeset
184 /* build the table which associate a (x,y) motion vector to a vlc */
986e461dc072 Initial revision
glantau
parents:
diff changeset
185 static void init_mv_table(MVTable *tab)
986e461dc072 Initial revision
glantau
parents:
diff changeset
186 {
986e461dc072 Initial revision
glantau
parents:
diff changeset
187 int i, x, y;
986e461dc072 Initial revision
glantau
parents:
diff changeset
188
1064
b32afefe7d33 * UINTX -> uintx_t INTX -> intx_t
kabi
parents: 1063
diff changeset
189 tab->table_mv_index = av_malloc(sizeof(uint16_t) * 4096);
0
986e461dc072 Initial revision
glantau
parents:
diff changeset
190 /* mark all entries as not used */
986e461dc072 Initial revision
glantau
parents:
diff changeset
191 for(i=0;i<4096;i++)
986e461dc072 Initial revision
glantau
parents:
diff changeset
192 tab->table_mv_index[i] = tab->n;
2967
ef2149182f1c COSMETICS: Remove all trailing whitespace.
diego
parents: 2846
diff changeset
193
0
986e461dc072 Initial revision
glantau
parents:
diff changeset
194 for(i=0;i<tab->n;i++) {
986e461dc072 Initial revision
glantau
parents:
diff changeset
195 x = tab->table_mvx[i];
986e461dc072 Initial revision
glantau
parents:
diff changeset
196 y = tab->table_mvy[i];
986e461dc072 Initial revision
glantau
parents:
diff changeset
197 tab->table_mv_index[(x << 6) | y] = i;
986e461dc072 Initial revision
glantau
parents:
diff changeset
198 }
986e461dc072 Initial revision
glantau
parents:
diff changeset
199 }
986e461dc072 Initial revision
glantau
parents:
diff changeset
200
5882
51fc10d9fdff rename some msmpeg4 symbols and make them non-static
aurel
parents: 5543
diff changeset
201 void ff_msmpeg4_code012(PutBitContext *pb, int n)
0
986e461dc072 Initial revision
glantau
parents:
diff changeset
202 {
986e461dc072 Initial revision
glantau
parents:
diff changeset
203 if (n == 0) {
986e461dc072 Initial revision
glantau
parents:
diff changeset
204 put_bits(pb, 1, 0);
986e461dc072 Initial revision
glantau
parents:
diff changeset
205 } else {
986e461dc072 Initial revision
glantau
parents:
diff changeset
206 put_bits(pb, 1, 1);
986e461dc072 Initial revision
glantau
parents:
diff changeset
207 put_bits(pb, 1, (n >= 2));
986e461dc072 Initial revision
glantau
parents:
diff changeset
208 }
986e461dc072 Initial revision
glantau
parents:
diff changeset
209 }
986e461dc072 Initial revision
glantau
parents:
diff changeset
210
499
8b7a54d58549 wmv1 support
michaelni
parents: 483
diff changeset
211 static int get_size_of_code(MpegEncContext * s, RLTable *rl, int last, int run, int level, int intra){
8b7a54d58549 wmv1 support
michaelni
parents: 483
diff changeset
212 int size=0;
8b7a54d58549 wmv1 support
michaelni
parents: 483
diff changeset
213 int code;
8b7a54d58549 wmv1 support
michaelni
parents: 483
diff changeset
214 int run_diff= intra ? 0 : 1;
2967
ef2149182f1c COSMETICS: Remove all trailing whitespace.
diego
parents: 2846
diff changeset
215
499
8b7a54d58549 wmv1 support
michaelni
parents: 483
diff changeset
216 code = get_rl_index(rl, last, run, level);
8b7a54d58549 wmv1 support
michaelni
parents: 483
diff changeset
217 size+= rl->table_vlc[code][1];
8b7a54d58549 wmv1 support
michaelni
parents: 483
diff changeset
218 if (code == rl->n) {
8b7a54d58549 wmv1 support
michaelni
parents: 483
diff changeset
219 int level1, run1;
8b7a54d58549 wmv1 support
michaelni
parents: 483
diff changeset
220
8b7a54d58549 wmv1 support
michaelni
parents: 483
diff changeset
221 level1 = level - rl->max_level[last][run];
2967
ef2149182f1c COSMETICS: Remove all trailing whitespace.
diego
parents: 2846
diff changeset
222 if (level1 < 1)
499
8b7a54d58549 wmv1 support
michaelni
parents: 483
diff changeset
223 goto esc2;
8b7a54d58549 wmv1 support
michaelni
parents: 483
diff changeset
224 code = get_rl_index(rl, last, run, level1);
8b7a54d58549 wmv1 support
michaelni
parents: 483
diff changeset
225 if (code == rl->n) {
8b7a54d58549 wmv1 support
michaelni
parents: 483
diff changeset
226 esc2:
8b7a54d58549 wmv1 support
michaelni
parents: 483
diff changeset
227 size++;
8b7a54d58549 wmv1 support
michaelni
parents: 483
diff changeset
228 if (level > MAX_LEVEL)
8b7a54d58549 wmv1 support
michaelni
parents: 483
diff changeset
229 goto esc3;
8b7a54d58549 wmv1 support
michaelni
parents: 483
diff changeset
230 run1 = run - rl->max_run[last][level] - run_diff;
8b7a54d58549 wmv1 support
michaelni
parents: 483
diff changeset
231 if (run1 < 0)
8b7a54d58549 wmv1 support
michaelni
parents: 483
diff changeset
232 goto esc3;
8b7a54d58549 wmv1 support
michaelni
parents: 483
diff changeset
233 code = get_rl_index(rl, last, run1, level);
8b7a54d58549 wmv1 support
michaelni
parents: 483
diff changeset
234 if (code == rl->n) {
8b7a54d58549 wmv1 support
michaelni
parents: 483
diff changeset
235 esc3:
8b7a54d58549 wmv1 support
michaelni
parents: 483
diff changeset
236 /* third escape */
8b7a54d58549 wmv1 support
michaelni
parents: 483
diff changeset
237 size+=1+1+6+8;
8b7a54d58549 wmv1 support
michaelni
parents: 483
diff changeset
238 } else {
8b7a54d58549 wmv1 support
michaelni
parents: 483
diff changeset
239 /* second escape */
8b7a54d58549 wmv1 support
michaelni
parents: 483
diff changeset
240 size+= 1+1+ rl->table_vlc[code][1];
8b7a54d58549 wmv1 support
michaelni
parents: 483
diff changeset
241 }
8b7a54d58549 wmv1 support
michaelni
parents: 483
diff changeset
242 } else {
8b7a54d58549 wmv1 support
michaelni
parents: 483
diff changeset
243 /* first escape */
8b7a54d58549 wmv1 support
michaelni
parents: 483
diff changeset
244 size+= 1+1+ rl->table_vlc[code][1];
8b7a54d58549 wmv1 support
michaelni
parents: 483
diff changeset
245 }
8b7a54d58549 wmv1 support
michaelni
parents: 483
diff changeset
246 } else {
8b7a54d58549 wmv1 support
michaelni
parents: 483
diff changeset
247 size++;
8b7a54d58549 wmv1 support
michaelni
parents: 483
diff changeset
248 }
8b7a54d58549 wmv1 support
michaelni
parents: 483
diff changeset
249 return size;
8b7a54d58549 wmv1 support
michaelni
parents: 483
diff changeset
250 }
8b7a54d58549 wmv1 support
michaelni
parents: 483
diff changeset
251
10751
74e8feb81c6d cosmetics: Reorder functions to avoid forward declarations.
diego
parents: 10750
diff changeset
252 av_cold void ff_msmpeg4_encode_init(MpegEncContext *s)
74e8feb81c6d cosmetics: Reorder functions to avoid forward declarations.
diego
parents: 10750
diff changeset
253 {
74e8feb81c6d cosmetics: Reorder functions to avoid forward declarations.
diego
parents: 10750
diff changeset
254 static int init_done=0;
74e8feb81c6d cosmetics: Reorder functions to avoid forward declarations.
diego
parents: 10750
diff changeset
255 int i;
74e8feb81c6d cosmetics: Reorder functions to avoid forward declarations.
diego
parents: 10750
diff changeset
256
74e8feb81c6d cosmetics: Reorder functions to avoid forward declarations.
diego
parents: 10750
diff changeset
257 common_init(s);
74e8feb81c6d cosmetics: Reorder functions to avoid forward declarations.
diego
parents: 10750
diff changeset
258 if(s->msmpeg4_version>=4){
74e8feb81c6d cosmetics: Reorder functions to avoid forward declarations.
diego
parents: 10750
diff changeset
259 s->min_qcoeff= -255;
74e8feb81c6d cosmetics: Reorder functions to avoid forward declarations.
diego
parents: 10750
diff changeset
260 s->max_qcoeff= 255;
74e8feb81c6d cosmetics: Reorder functions to avoid forward declarations.
diego
parents: 10750
diff changeset
261 }
74e8feb81c6d cosmetics: Reorder functions to avoid forward declarations.
diego
parents: 10750
diff changeset
262
74e8feb81c6d cosmetics: Reorder functions to avoid forward declarations.
diego
parents: 10750
diff changeset
263 if (!init_done) {
74e8feb81c6d cosmetics: Reorder functions to avoid forward declarations.
diego
parents: 10750
diff changeset
264 /* init various encoding tables */
74e8feb81c6d cosmetics: Reorder functions to avoid forward declarations.
diego
parents: 10750
diff changeset
265 init_done = 1;
74e8feb81c6d cosmetics: Reorder functions to avoid forward declarations.
diego
parents: 10750
diff changeset
266 init_mv_table(&mv_tables[0]);
74e8feb81c6d cosmetics: Reorder functions to avoid forward declarations.
diego
parents: 10750
diff changeset
267 init_mv_table(&mv_tables[1]);
74e8feb81c6d cosmetics: Reorder functions to avoid forward declarations.
diego
parents: 10750
diff changeset
268 for(i=0;i<NB_RL_TABLES;i++)
74e8feb81c6d cosmetics: Reorder functions to avoid forward declarations.
diego
parents: 10750
diff changeset
269 init_rl(&rl_table[i], static_rl_table_store[i]);
74e8feb81c6d cosmetics: Reorder functions to avoid forward declarations.
diego
parents: 10750
diff changeset
270
74e8feb81c6d cosmetics: Reorder functions to avoid forward declarations.
diego
parents: 10750
diff changeset
271 for(i=0; i<NB_RL_TABLES; i++){
74e8feb81c6d cosmetics: Reorder functions to avoid forward declarations.
diego
parents: 10750
diff changeset
272 int level;
74e8feb81c6d cosmetics: Reorder functions to avoid forward declarations.
diego
parents: 10750
diff changeset
273 for(level=0; level<=MAX_LEVEL; level++){
74e8feb81c6d cosmetics: Reorder functions to avoid forward declarations.
diego
parents: 10750
diff changeset
274 int run;
74e8feb81c6d cosmetics: Reorder functions to avoid forward declarations.
diego
parents: 10750
diff changeset
275 for(run=0; run<=MAX_RUN; run++){
74e8feb81c6d cosmetics: Reorder functions to avoid forward declarations.
diego
parents: 10750
diff changeset
276 int last;
74e8feb81c6d cosmetics: Reorder functions to avoid forward declarations.
diego
parents: 10750
diff changeset
277 for(last=0; last<2; last++){
74e8feb81c6d cosmetics: Reorder functions to avoid forward declarations.
diego
parents: 10750
diff changeset
278 rl_length[i][level][run][last]= get_size_of_code(s, &rl_table[ i], last, run, level, 0);
74e8feb81c6d cosmetics: Reorder functions to avoid forward declarations.
diego
parents: 10750
diff changeset
279 }
74e8feb81c6d cosmetics: Reorder functions to avoid forward declarations.
diego
parents: 10750
diff changeset
280 }
74e8feb81c6d cosmetics: Reorder functions to avoid forward declarations.
diego
parents: 10750
diff changeset
281 }
74e8feb81c6d cosmetics: Reorder functions to avoid forward declarations.
diego
parents: 10750
diff changeset
282 }
74e8feb81c6d cosmetics: Reorder functions to avoid forward declarations.
diego
parents: 10750
diff changeset
283 }
74e8feb81c6d cosmetics: Reorder functions to avoid forward declarations.
diego
parents: 10750
diff changeset
284 }
74e8feb81c6d cosmetics: Reorder functions to avoid forward declarations.
diego
parents: 10750
diff changeset
285
7994
ecade9a77827 Mark the ff_find_best_tables symbol static to msmpeg4. Patch by Diego Petten«Ò
lu_zero
parents: 7831
diff changeset
286 static void find_best_tables(MpegEncContext * s)
499
8b7a54d58549 wmv1 support
michaelni
parents: 483
diff changeset
287 {
8b7a54d58549 wmv1 support
michaelni
parents: 483
diff changeset
288 int i;
8b7a54d58549 wmv1 support
michaelni
parents: 483
diff changeset
289 int best =-1, best_size =9999999;
8b7a54d58549 wmv1 support
michaelni
parents: 483
diff changeset
290 int chroma_best=-1, best_chroma_size=9999999;
601
76e9b51cccda faster vlc table selection
michaelni
parents: 596
diff changeset
291
499
8b7a54d58549 wmv1 support
michaelni
parents: 483
diff changeset
292 for(i=0; i<3; i++){
8b7a54d58549 wmv1 support
michaelni
parents: 483
diff changeset
293 int level;
8b7a54d58549 wmv1 support
michaelni
parents: 483
diff changeset
294 int chroma_size=0;
8b7a54d58549 wmv1 support
michaelni
parents: 483
diff changeset
295 int size=0;
8b7a54d58549 wmv1 support
michaelni
parents: 483
diff changeset
296
8b7a54d58549 wmv1 support
michaelni
parents: 483
diff changeset
297 if(i>0){// ;)
2967
ef2149182f1c COSMETICS: Remove all trailing whitespace.
diego
parents: 2846
diff changeset
298 size++;
499
8b7a54d58549 wmv1 support
michaelni
parents: 483
diff changeset
299 chroma_size++;
8b7a54d58549 wmv1 support
michaelni
parents: 483
diff changeset
300 }
8b7a54d58549 wmv1 support
michaelni
parents: 483
diff changeset
301 for(level=0; level<=MAX_LEVEL; level++){
8b7a54d58549 wmv1 support
michaelni
parents: 483
diff changeset
302 int run;
8b7a54d58549 wmv1 support
michaelni
parents: 483
diff changeset
303 for(run=0; run<=MAX_RUN; run++){
8b7a54d58549 wmv1 support
michaelni
parents: 483
diff changeset
304 int last;
601
76e9b51cccda faster vlc table selection
michaelni
parents: 596
diff changeset
305 const int last_size= size + chroma_size;
499
8b7a54d58549 wmv1 support
michaelni
parents: 483
diff changeset
306 for(last=0; last<2; last++){
8b7a54d58549 wmv1 support
michaelni
parents: 483
diff changeset
307 int inter_count = s->ac_stats[0][0][level][run][last] + s->ac_stats[0][1][level][run][last];
8b7a54d58549 wmv1 support
michaelni
parents: 483
diff changeset
308 int intra_luma_count = s->ac_stats[1][0][level][run][last];
8b7a54d58549 wmv1 support
michaelni
parents: 483
diff changeset
309 int intra_chroma_count= s->ac_stats[1][1][level][run][last];
2967
ef2149182f1c COSMETICS: Remove all trailing whitespace.
diego
parents: 2846
diff changeset
310
6481
493dc59d469a add FF_ prefix to all (frame)_TYPE usage
aurel
parents: 6350
diff changeset
311 if(s->pict_type==FF_I_TYPE){
774
baa66649df35 mergeing inter & intra rl_length tables (50% smaller & no meassureable difference in filesize/quality)
michaelni
parents: 773
diff changeset
312 size += intra_luma_count *rl_length[i ][level][run][last];
baa66649df35 mergeing inter & intra rl_length tables (50% smaller & no meassureable difference in filesize/quality)
michaelni
parents: 773
diff changeset
313 chroma_size+= intra_chroma_count*rl_length[i+3][level][run][last];
499
8b7a54d58549 wmv1 support
michaelni
parents: 483
diff changeset
314 }else{
774
baa66649df35 mergeing inter & intra rl_length tables (50% smaller & no meassureable difference in filesize/quality)
michaelni
parents: 773
diff changeset
315 size+= intra_luma_count *rl_length[i ][level][run][last]
baa66649df35 mergeing inter & intra rl_length tables (50% smaller & no meassureable difference in filesize/quality)
michaelni
parents: 773
diff changeset
316 +intra_chroma_count*rl_length[i+3][level][run][last]
baa66649df35 mergeing inter & intra rl_length tables (50% smaller & no meassureable difference in filesize/quality)
michaelni
parents: 773
diff changeset
317 +inter_count *rl_length[i+3][level][run][last];
2967
ef2149182f1c COSMETICS: Remove all trailing whitespace.
diego
parents: 2846
diff changeset
318 }
499
8b7a54d58549 wmv1 support
michaelni
parents: 483
diff changeset
319 }
601
76e9b51cccda faster vlc table selection
michaelni
parents: 596
diff changeset
320 if(last_size == size+chroma_size) break;
499
8b7a54d58549 wmv1 support
michaelni
parents: 483
diff changeset
321 }
8b7a54d58549 wmv1 support
michaelni
parents: 483
diff changeset
322 }
8b7a54d58549 wmv1 support
michaelni
parents: 483
diff changeset
323 if(size<best_size){
8b7a54d58549 wmv1 support
michaelni
parents: 483
diff changeset
324 best_size= size;
8b7a54d58549 wmv1 support
michaelni
parents: 483
diff changeset
325 best= i;
8b7a54d58549 wmv1 support
michaelni
parents: 483
diff changeset
326 }
8b7a54d58549 wmv1 support
michaelni
parents: 483
diff changeset
327 if(chroma_size<best_chroma_size){
8b7a54d58549 wmv1 support
michaelni
parents: 483
diff changeset
328 best_chroma_size= chroma_size;
8b7a54d58549 wmv1 support
michaelni
parents: 483
diff changeset
329 chroma_best= i;
8b7a54d58549 wmv1 support
michaelni
parents: 483
diff changeset
330 }
8b7a54d58549 wmv1 support
michaelni
parents: 483
diff changeset
331 }
601
76e9b51cccda faster vlc table selection
michaelni
parents: 596
diff changeset
332
2967
ef2149182f1c COSMETICS: Remove all trailing whitespace.
diego
parents: 2846
diff changeset
333 // printf("type:%d, best:%d, qp:%d, var:%d, mcvar:%d, size:%d //\n",
499
8b7a54d58549 wmv1 support
michaelni
parents: 483
diff changeset
334 // s->pict_type, best, s->qscale, s->mb_var_sum, s->mc_mb_var_sum, best_size);
2967
ef2149182f1c COSMETICS: Remove all trailing whitespace.
diego
parents: 2846
diff changeset
335
6481
493dc59d469a add FF_ prefix to all (frame)_TYPE usage
aurel
parents: 6350
diff changeset
336 if(s->pict_type==FF_P_TYPE) chroma_best= best;
499
8b7a54d58549 wmv1 support
michaelni
parents: 483
diff changeset
337
8b7a54d58549 wmv1 support
michaelni
parents: 483
diff changeset
338 memset(s->ac_stats, 0, sizeof(int)*(MAX_LEVEL+1)*(MAX_RUN+1)*2*2*2);
8b7a54d58549 wmv1 support
michaelni
parents: 483
diff changeset
339
8b7a54d58549 wmv1 support
michaelni
parents: 483
diff changeset
340 s->rl_table_index = best;
8b7a54d58549 wmv1 support
michaelni
parents: 483
diff changeset
341 s->rl_chroma_table_index= chroma_best;
2967
ef2149182f1c COSMETICS: Remove all trailing whitespace.
diego
parents: 2846
diff changeset
342
499
8b7a54d58549 wmv1 support
michaelni
parents: 483
diff changeset
343 if(s->pict_type != s->last_non_b_pict_type){
8b7a54d58549 wmv1 support
michaelni
parents: 483
diff changeset
344 s->rl_table_index= 2;
6481
493dc59d469a add FF_ prefix to all (frame)_TYPE usage
aurel
parents: 6350
diff changeset
345 if(s->pict_type==FF_I_TYPE)
499
8b7a54d58549 wmv1 support
michaelni
parents: 483
diff changeset
346 s->rl_chroma_table_index= 1;
8b7a54d58549 wmv1 support
michaelni
parents: 483
diff changeset
347 else
8b7a54d58549 wmv1 support
michaelni
parents: 483
diff changeset
348 s->rl_chroma_table_index= 2;
8b7a54d58549 wmv1 support
michaelni
parents: 483
diff changeset
349 }
8b7a54d58549 wmv1 support
michaelni
parents: 483
diff changeset
350
8b7a54d58549 wmv1 support
michaelni
parents: 483
diff changeset
351 }
8b7a54d58549 wmv1 support
michaelni
parents: 483
diff changeset
352
457
583dcee270d2 msmpeg4v1 decoding
michaelni
parents: 440
diff changeset
353 /* write MSMPEG4 compatible frame header */
0
986e461dc072 Initial revision
glantau
parents:
diff changeset
354 void msmpeg4_encode_picture_header(MpegEncContext * s, int picture_number)
986e461dc072 Initial revision
glantau
parents:
diff changeset
355 {
7994
ecade9a77827 Mark the ff_find_best_tables symbol static to msmpeg4. Patch by Diego Petten«Ò
lu_zero
parents: 7831
diff changeset
356 find_best_tables(s);
0
986e461dc072 Initial revision
glantau
parents:
diff changeset
357
986e461dc072 Initial revision
glantau
parents:
diff changeset
358 align_put_bits(&s->pb);
986e461dc072 Initial revision
glantau
parents:
diff changeset
359 put_bits(&s->pb, 2, s->pict_type - 1);
986e461dc072 Initial revision
glantau
parents:
diff changeset
360
986e461dc072 Initial revision
glantau
parents:
diff changeset
361 put_bits(&s->pb, 5, s->qscale);
499
8b7a54d58549 wmv1 support
michaelni
parents: 483
diff changeset
362 if(s->msmpeg4_version<=2){
8b7a54d58549 wmv1 support
michaelni
parents: 483
diff changeset
363 s->rl_table_index = 2;
8b7a54d58549 wmv1 support
michaelni
parents: 483
diff changeset
364 s->rl_chroma_table_index = 2;
8b7a54d58549 wmv1 support
michaelni
parents: 483
diff changeset
365 }
310
49e73229a5e6 msmpeg4v2 encoding
michaelni
parents: 309
diff changeset
366
0
986e461dc072 Initial revision
glantau
parents:
diff changeset
367 s->dc_table_index = 1;
986e461dc072 Initial revision
glantau
parents:
diff changeset
368 s->mv_table_index = 1; /* only if P frame */
986e461dc072 Initial revision
glantau
parents:
diff changeset
369 s->use_skip_mb_code = 1; /* only if P frame */
499
8b7a54d58549 wmv1 support
michaelni
parents: 483
diff changeset
370 s->per_mb_rl_table = 0;
759
21b506d700cc fixing msmpeg4v3 encoding at bitrates <128k
michaelni
parents: 746
diff changeset
371 if(s->msmpeg4_version==4)
6481
493dc59d469a add FF_ prefix to all (frame)_TYPE usage
aurel
parents: 6350
diff changeset
372 s->inter_intra_pred= (s->width*s->height < 320*240 && s->bit_rate<=II_BITRATE && s->pict_type==FF_P_TYPE);
936
caa77cd960c0 qpel encoding
michaelni
parents: 903
diff changeset
373 //printf("%d %d %d %d %d\n", s->pict_type, s->bit_rate, s->inter_intra_pred, s->width, s->height);
499
8b7a54d58549 wmv1 support
michaelni
parents: 483
diff changeset
374
6481
493dc59d469a add FF_ prefix to all (frame)_TYPE usage
aurel
parents: 6350
diff changeset
375 if (s->pict_type == FF_I_TYPE) {
519
55b4e2248a45 wmv1 slice_height != mb_height support
michaelni
parents: 501
diff changeset
376 s->slice_height= s->mb_height/1;
55b4e2248a45 wmv1 slice_height != mb_height support
michaelni
parents: 501
diff changeset
377 put_bits(&s->pb, 5, 0x16 + s->mb_height/s->slice_height);
2967
ef2149182f1c COSMETICS: Remove all trailing whitespace.
diego
parents: 2846
diff changeset
378
499
8b7a54d58549 wmv1 support
michaelni
parents: 483
diff changeset
379 if(s->msmpeg4_version==4){
8b7a54d58549 wmv1 support
michaelni
parents: 483
diff changeset
380 msmpeg4_encode_ext_header(s);
578
32c142b10263 fixing bitrate vs. kbitrate in header
michaelni
parents: 563
diff changeset
381 if(s->bit_rate>MBAC_BITRATE)
519
55b4e2248a45 wmv1 slice_height != mb_height support
michaelni
parents: 501
diff changeset
382 put_bits(&s->pb, 1, s->per_mb_rl_table);
499
8b7a54d58549 wmv1 support
michaelni
parents: 483
diff changeset
383 }
0
986e461dc072 Initial revision
glantau
parents:
diff changeset
384
457
583dcee270d2 msmpeg4v1 decoding
michaelni
parents: 440
diff changeset
385 if(s->msmpeg4_version>2){
499
8b7a54d58549 wmv1 support
michaelni
parents: 483
diff changeset
386 if(!s->per_mb_rl_table){
5882
51fc10d9fdff rename some msmpeg4 symbols and make them non-static
aurel
parents: 5543
diff changeset
387 ff_msmpeg4_code012(&s->pb, s->rl_chroma_table_index);
51fc10d9fdff rename some msmpeg4 symbols and make them non-static
aurel
parents: 5543
diff changeset
388 ff_msmpeg4_code012(&s->pb, s->rl_table_index);
499
8b7a54d58549 wmv1 support
michaelni
parents: 483
diff changeset
389 }
0
986e461dc072 Initial revision
glantau
parents:
diff changeset
390
310
49e73229a5e6 msmpeg4v2 encoding
michaelni
parents: 309
diff changeset
391 put_bits(&s->pb, 1, s->dc_table_index);
49e73229a5e6 msmpeg4v2 encoding
michaelni
parents: 309
diff changeset
392 }
0
986e461dc072 Initial revision
glantau
parents:
diff changeset
393 } else {
986e461dc072 Initial revision
glantau
parents:
diff changeset
394 put_bits(&s->pb, 1, s->use_skip_mb_code);
2967
ef2149182f1c COSMETICS: Remove all trailing whitespace.
diego
parents: 2846
diff changeset
395
578
32c142b10263 fixing bitrate vs. kbitrate in header
michaelni
parents: 563
diff changeset
396 if(s->msmpeg4_version==4 && s->bit_rate>MBAC_BITRATE)
499
8b7a54d58549 wmv1 support
michaelni
parents: 483
diff changeset
397 put_bits(&s->pb, 1, s->per_mb_rl_table);
8b7a54d58549 wmv1 support
michaelni
parents: 483
diff changeset
398
457
583dcee270d2 msmpeg4v1 decoding
michaelni
parents: 440
diff changeset
399 if(s->msmpeg4_version>2){
499
8b7a54d58549 wmv1 support
michaelni
parents: 483
diff changeset
400 if(!s->per_mb_rl_table)
5882
51fc10d9fdff rename some msmpeg4 symbols and make them non-static
aurel
parents: 5543
diff changeset
401 ff_msmpeg4_code012(&s->pb, s->rl_table_index);
0
986e461dc072 Initial revision
glantau
parents:
diff changeset
402
310
49e73229a5e6 msmpeg4v2 encoding
michaelni
parents: 309
diff changeset
403 put_bits(&s->pb, 1, s->dc_table_index);
0
986e461dc072 Initial revision
glantau
parents:
diff changeset
404
310
49e73229a5e6 msmpeg4v2 encoding
michaelni
parents: 309
diff changeset
405 put_bits(&s->pb, 1, s->mv_table_index);
49e73229a5e6 msmpeg4v2 encoding
michaelni
parents: 309
diff changeset
406 }
0
986e461dc072 Initial revision
glantau
parents:
diff changeset
407 }
986e461dc072 Initial revision
glantau
parents:
diff changeset
408
499
8b7a54d58549 wmv1 support
michaelni
parents: 483
diff changeset
409 s->esc3_level_length= 0;
8b7a54d58549 wmv1 support
michaelni
parents: 483
diff changeset
410 s->esc3_run_length= 0;
0
986e461dc072 Initial revision
glantau
parents:
diff changeset
411 }
986e461dc072 Initial revision
glantau
parents:
diff changeset
412
208
2eb04d6be309 (commit by michael)
arpi_esp
parents: 204
diff changeset
413 void msmpeg4_encode_ext_header(MpegEncContext * s)
2eb04d6be309 (commit by michael)
arpi_esp
parents: 204
diff changeset
414 {
2637
ef44d24680d1 switch to native time bases
michael
parents: 2632
diff changeset
415 put_bits(&s->pb, 5, s->avctx->time_base.den / s->avctx->time_base.num); //yes 29.97 -> 29
208
2eb04d6be309 (commit by michael)
arpi_esp
parents: 204
diff changeset
416
847
f3c369b8ddca reversing header game
michaelni
parents: 774
diff changeset
417 put_bits(&s->pb, 11, FFMIN(s->bit_rate/1024, 2047));
208
2eb04d6be309 (commit by michael)
arpi_esp
parents: 204
diff changeset
418
1163
0951691c4225 fixing msmpeg4v2 encoding
michaelni
parents: 1144
diff changeset
419 if(s->msmpeg4_version>=3)
457
583dcee270d2 msmpeg4v1 decoding
michaelni
parents: 440
diff changeset
420 put_bits(&s->pb, 1, s->flipflop_rounding);
1163
0951691c4225 fixing msmpeg4v2 encoding
michaelni
parents: 1144
diff changeset
421 else
0951691c4225 fixing msmpeg4v2 encoding
michaelni
parents: 1144
diff changeset
422 assert(s->flipflop_rounding==0);
208
2eb04d6be309 (commit by michael)
arpi_esp
parents: 204
diff changeset
423 }
2eb04d6be309 (commit by michael)
arpi_esp
parents: 204
diff changeset
424
1070
6da5ae9ee199 more #ifdef CONFIG_ENCODERS patch by (Wolfgang Hesseler <qv at multimediaware dot com>) with modifications by me (s/WOLFGANG/CONFIG_ENCODERS/ and some other fixes)
michaelni
parents: 1064
diff changeset
425 #endif //CONFIG_ENCODERS
6da5ae9ee199 more #ifdef CONFIG_ENCODERS patch by (Wolfgang Hesseler <qv at multimediaware dot com>) with modifications by me (s/WOLFGANG/CONFIG_ENCODERS/ and some other fixes)
michaelni
parents: 1064
diff changeset
426
0
986e461dc072 Initial revision
glantau
parents:
diff changeset
427 /* predict coded block */
5882
51fc10d9fdff rename some msmpeg4 symbols and make them non-static
aurel
parents: 5543
diff changeset
428 int ff_msmpeg4_coded_block_pred(MpegEncContext * s, int n, uint8_t **coded_block_ptr)
0
986e461dc072 Initial revision
glantau
parents:
diff changeset
429 {
299
fb9e77674bd4 minor optimizations / simplifications
michaelni
parents: 251
diff changeset
430 int xy, wrap, pred, a, b, c;
0
986e461dc072 Initial revision
glantau
parents:
diff changeset
431
299
fb9e77674bd4 minor optimizations / simplifications
michaelni
parents: 251
diff changeset
432 xy = s->block_index[n];
1938
e2501e6e7ff7 unify table indexing (motion_val,dc_val,ac_val,coded_block changed)
michael
parents: 1739
diff changeset
433 wrap = s->b8_stride;
0
986e461dc072 Initial revision
glantau
parents:
diff changeset
434
986e461dc072 Initial revision
glantau
parents:
diff changeset
435 /* B C
2967
ef2149182f1c COSMETICS: Remove all trailing whitespace.
diego
parents: 2846
diff changeset
436 * A X
0
986e461dc072 Initial revision
glantau
parents:
diff changeset
437 */
299
fb9e77674bd4 minor optimizations / simplifications
michaelni
parents: 251
diff changeset
438 a = s->coded_block[xy - 1 ];
fb9e77674bd4 minor optimizations / simplifications
michaelni
parents: 251
diff changeset
439 b = s->coded_block[xy - 1 - wrap];
fb9e77674bd4 minor optimizations / simplifications
michaelni
parents: 251
diff changeset
440 c = s->coded_block[xy - wrap];
2967
ef2149182f1c COSMETICS: Remove all trailing whitespace.
diego
parents: 2846
diff changeset
441
0
986e461dc072 Initial revision
glantau
parents:
diff changeset
442 if (b == c) {
986e461dc072 Initial revision
glantau
parents:
diff changeset
443 pred = a;
986e461dc072 Initial revision
glantau
parents:
diff changeset
444 } else {
986e461dc072 Initial revision
glantau
parents:
diff changeset
445 pred = c;
986e461dc072 Initial revision
glantau
parents:
diff changeset
446 }
2967
ef2149182f1c COSMETICS: Remove all trailing whitespace.
diego
parents: 2846
diff changeset
447
0
986e461dc072 Initial revision
glantau
parents:
diff changeset
448 /* store value */
299
fb9e77674bd4 minor optimizations / simplifications
michaelni
parents: 251
diff changeset
449 *coded_block_ptr = &s->coded_block[xy];
0
986e461dc072 Initial revision
glantau
parents:
diff changeset
450
986e461dc072 Initial revision
glantau
parents:
diff changeset
451 return pred;
986e461dc072 Initial revision
glantau
parents:
diff changeset
452 }
986e461dc072 Initial revision
glantau
parents:
diff changeset
453
8590
7a463923ecd1 Change semantic of CONFIG_*, HAVE_* and ARCH_*.
aurel
parents: 8031
diff changeset
454 #if CONFIG_ENCODERS
1070
6da5ae9ee199 more #ifdef CONFIG_ENCODERS patch by (Wolfgang Hesseler <qv at multimediaware dot com>) with modifications by me (s/WOLFGANG/CONFIG_ENCODERS/ and some other fixes)
michaelni
parents: 1064
diff changeset
455
5882
51fc10d9fdff rename some msmpeg4 symbols and make them non-static
aurel
parents: 5543
diff changeset
456 void ff_msmpeg4_encode_motion(MpegEncContext * s,
0
986e461dc072 Initial revision
glantau
parents:
diff changeset
457 int mx, int my)
986e461dc072 Initial revision
glantau
parents:
diff changeset
458 {
986e461dc072 Initial revision
glantau
parents:
diff changeset
459 int code;
986e461dc072 Initial revision
glantau
parents:
diff changeset
460 MVTable *mv;
986e461dc072 Initial revision
glantau
parents:
diff changeset
461
986e461dc072 Initial revision
glantau
parents:
diff changeset
462 /* modulo encoding */
986e461dc072 Initial revision
glantau
parents:
diff changeset
463 /* WARNING : you cannot reach all the MVs even with the modulo
986e461dc072 Initial revision
glantau
parents:
diff changeset
464 encoding. This is a somewhat strange compromise they took !!! */
986e461dc072 Initial revision
glantau
parents:
diff changeset
465 if (mx <= -64)
986e461dc072 Initial revision
glantau
parents:
diff changeset
466 mx += 64;
986e461dc072 Initial revision
glantau
parents:
diff changeset
467 else if (mx >= 64)
986e461dc072 Initial revision
glantau
parents:
diff changeset
468 mx -= 64;
986e461dc072 Initial revision
glantau
parents:
diff changeset
469 if (my <= -64)
986e461dc072 Initial revision
glantau
parents:
diff changeset
470 my += 64;
986e461dc072 Initial revision
glantau
parents:
diff changeset
471 else if (my >= 64)
986e461dc072 Initial revision
glantau
parents:
diff changeset
472 my -= 64;
2967
ef2149182f1c COSMETICS: Remove all trailing whitespace.
diego
parents: 2846
diff changeset
473
0
986e461dc072 Initial revision
glantau
parents:
diff changeset
474 mx += 32;
986e461dc072 Initial revision
glantau
parents:
diff changeset
475 my += 32;
986e461dc072 Initial revision
glantau
parents:
diff changeset
476 #if 0
986e461dc072 Initial revision
glantau
parents:
diff changeset
477 if ((unsigned)mx >= 64 ||
2967
ef2149182f1c COSMETICS: Remove all trailing whitespace.
diego
parents: 2846
diff changeset
478 (unsigned)my >= 64)
3177
8d1b2cc2a75b (f)printf --> av_log conversion
diego
parents: 3036
diff changeset
479 av_log(s->avctx, AV_LOG_ERROR, "error mx=%d my=%d\n", mx, my);
0
986e461dc072 Initial revision
glantau
parents:
diff changeset
480 #endif
986e461dc072 Initial revision
glantau
parents:
diff changeset
481 mv = &mv_tables[s->mv_table_index];
986e461dc072 Initial revision
glantau
parents:
diff changeset
482
986e461dc072 Initial revision
glantau
parents:
diff changeset
483 code = mv->table_mv_index[(mx << 6) | my];
2967
ef2149182f1c COSMETICS: Remove all trailing whitespace.
diego
parents: 2846
diff changeset
484 put_bits(&s->pb,
ef2149182f1c COSMETICS: Remove all trailing whitespace.
diego
parents: 2846
diff changeset
485 mv->table_mv_bits[code],
0
986e461dc072 Initial revision
glantau
parents:
diff changeset
486 mv->table_mv_code[code]);
986e461dc072 Initial revision
glantau
parents:
diff changeset
487 if (code == mv->n) {
5129
0244bba24b43 misc typo fixes
diego
parents: 5127
diff changeset
488 /* escape : code literally */
0
986e461dc072 Initial revision
glantau
parents:
diff changeset
489 put_bits(&s->pb, 6, mx);
986e461dc072 Initial revision
glantau
parents:
diff changeset
490 put_bits(&s->pb, 6, my);
986e461dc072 Initial revision
glantau
parents:
diff changeset
491 }
986e461dc072 Initial revision
glantau
parents:
diff changeset
492 }
986e461dc072 Initial revision
glantau
parents:
diff changeset
493
5882
51fc10d9fdff rename some msmpeg4 symbols and make them non-static
aurel
parents: 5543
diff changeset
494 void ff_msmpeg4_handle_slices(MpegEncContext *s){
519
55b4e2248a45 wmv1 slice_height != mb_height support
michaelni
parents: 501
diff changeset
495 if (s->mb_x == 0) {
55b4e2248a45 wmv1 slice_height != mb_height support
michaelni
parents: 501
diff changeset
496 if (s->slice_height && (s->mb_y % s->slice_height) == 0) {
983
ca2a303ea039 fixed wmv2 slices
michaelni
parents: 936
diff changeset
497 if(s->msmpeg4_version < 4){
745
25d7fb7c89be better/cleaner error resilience (done in a 2nd pass after decoding)
michaelni
parents: 743
diff changeset
498 ff_mpeg4_clean_buffers(s);
519
55b4e2248a45 wmv1 slice_height != mb_height support
michaelni
parents: 501
diff changeset
499 }
55b4e2248a45 wmv1 slice_height != mb_height support
michaelni
parents: 501
diff changeset
500 s->first_slice_line = 1;
55b4e2248a45 wmv1 slice_height != mb_height support
michaelni
parents: 501
diff changeset
501 } else {
2967
ef2149182f1c COSMETICS: Remove all trailing whitespace.
diego
parents: 2846
diff changeset
502 s->first_slice_line = 0;
519
55b4e2248a45 wmv1 slice_height != mb_height support
michaelni
parents: 501
diff changeset
503 }
55b4e2248a45 wmv1 slice_height != mb_height support
michaelni
parents: 501
diff changeset
504 }
55b4e2248a45 wmv1 slice_height != mb_height support
michaelni
parents: 501
diff changeset
505 }
55b4e2248a45 wmv1 slice_height != mb_height support
michaelni
parents: 501
diff changeset
506
10751
74e8feb81c6d cosmetics: Reorder functions to avoid forward declarations.
diego
parents: 10750
diff changeset
507 static void msmpeg4v2_encode_motion(MpegEncContext * s, int val)
74e8feb81c6d cosmetics: Reorder functions to avoid forward declarations.
diego
parents: 10750
diff changeset
508 {
74e8feb81c6d cosmetics: Reorder functions to avoid forward declarations.
diego
parents: 10750
diff changeset
509 int range, bit_size, sign, code, bits;
74e8feb81c6d cosmetics: Reorder functions to avoid forward declarations.
diego
parents: 10750
diff changeset
510
74e8feb81c6d cosmetics: Reorder functions to avoid forward declarations.
diego
parents: 10750
diff changeset
511 if (val == 0) {
74e8feb81c6d cosmetics: Reorder functions to avoid forward declarations.
diego
parents: 10750
diff changeset
512 /* zero vector */
74e8feb81c6d cosmetics: Reorder functions to avoid forward declarations.
diego
parents: 10750
diff changeset
513 code = 0;
74e8feb81c6d cosmetics: Reorder functions to avoid forward declarations.
diego
parents: 10750
diff changeset
514 put_bits(&s->pb, mvtab[code][1], mvtab[code][0]);
74e8feb81c6d cosmetics: Reorder functions to avoid forward declarations.
diego
parents: 10750
diff changeset
515 } else {
74e8feb81c6d cosmetics: Reorder functions to avoid forward declarations.
diego
parents: 10750
diff changeset
516 bit_size = s->f_code - 1;
74e8feb81c6d cosmetics: Reorder functions to avoid forward declarations.
diego
parents: 10750
diff changeset
517 range = 1 << bit_size;
74e8feb81c6d cosmetics: Reorder functions to avoid forward declarations.
diego
parents: 10750
diff changeset
518 if (val <= -64)
74e8feb81c6d cosmetics: Reorder functions to avoid forward declarations.
diego
parents: 10750
diff changeset
519 val += 64;
74e8feb81c6d cosmetics: Reorder functions to avoid forward declarations.
diego
parents: 10750
diff changeset
520 else if (val >= 64)
74e8feb81c6d cosmetics: Reorder functions to avoid forward declarations.
diego
parents: 10750
diff changeset
521 val -= 64;
74e8feb81c6d cosmetics: Reorder functions to avoid forward declarations.
diego
parents: 10750
diff changeset
522
74e8feb81c6d cosmetics: Reorder functions to avoid forward declarations.
diego
parents: 10750
diff changeset
523 if (val >= 0) {
74e8feb81c6d cosmetics: Reorder functions to avoid forward declarations.
diego
parents: 10750
diff changeset
524 sign = 0;
74e8feb81c6d cosmetics: Reorder functions to avoid forward declarations.
diego
parents: 10750
diff changeset
525 } else {
74e8feb81c6d cosmetics: Reorder functions to avoid forward declarations.
diego
parents: 10750
diff changeset
526 val = -val;
74e8feb81c6d cosmetics: Reorder functions to avoid forward declarations.
diego
parents: 10750
diff changeset
527 sign = 1;
74e8feb81c6d cosmetics: Reorder functions to avoid forward declarations.
diego
parents: 10750
diff changeset
528 }
74e8feb81c6d cosmetics: Reorder functions to avoid forward declarations.
diego
parents: 10750
diff changeset
529 val--;
74e8feb81c6d cosmetics: Reorder functions to avoid forward declarations.
diego
parents: 10750
diff changeset
530 code = (val >> bit_size) + 1;
74e8feb81c6d cosmetics: Reorder functions to avoid forward declarations.
diego
parents: 10750
diff changeset
531 bits = val & (range - 1);
74e8feb81c6d cosmetics: Reorder functions to avoid forward declarations.
diego
parents: 10750
diff changeset
532
74e8feb81c6d cosmetics: Reorder functions to avoid forward declarations.
diego
parents: 10750
diff changeset
533 put_bits(&s->pb, mvtab[code][1] + 1, (mvtab[code][0] << 1) | sign);
74e8feb81c6d cosmetics: Reorder functions to avoid forward declarations.
diego
parents: 10750
diff changeset
534 if (bit_size > 0) {
74e8feb81c6d cosmetics: Reorder functions to avoid forward declarations.
diego
parents: 10750
diff changeset
535 put_bits(&s->pb, bit_size, bits);
74e8feb81c6d cosmetics: Reorder functions to avoid forward declarations.
diego
parents: 10750
diff changeset
536 }
74e8feb81c6d cosmetics: Reorder functions to avoid forward declarations.
diego
parents: 10750
diff changeset
537 }
74e8feb81c6d cosmetics: Reorder functions to avoid forward declarations.
diego
parents: 10750
diff changeset
538 }
74e8feb81c6d cosmetics: Reorder functions to avoid forward declarations.
diego
parents: 10750
diff changeset
539
2967
ef2149182f1c COSMETICS: Remove all trailing whitespace.
diego
parents: 2846
diff changeset
540 void msmpeg4_encode_mb(MpegEncContext * s,
0
986e461dc072 Initial revision
glantau
parents:
diff changeset
541 DCTELEM block[6][64],
986e461dc072 Initial revision
glantau
parents:
diff changeset
542 int motion_x, int motion_y)
986e461dc072 Initial revision
glantau
parents:
diff changeset
543 {
986e461dc072 Initial revision
glantau
parents:
diff changeset
544 int cbp, coded_cbp, i;
986e461dc072 Initial revision
glantau
parents:
diff changeset
545 int pred_x, pred_y;
1064
b32afefe7d33 * UINTX -> uintx_t INTX -> intx_t
kabi
parents: 1063
diff changeset
546 uint8_t *coded_block;
0
986e461dc072 Initial revision
glantau
parents:
diff changeset
547
5882
51fc10d9fdff rename some msmpeg4 symbols and make them non-static
aurel
parents: 5543
diff changeset
548 ff_msmpeg4_handle_slices(s);
2967
ef2149182f1c COSMETICS: Remove all trailing whitespace.
diego
parents: 2846
diff changeset
549
0
986e461dc072 Initial revision
glantau
parents:
diff changeset
550 if (!s->mb_intra) {
2979
bfabfdf9ce55 COSMETICS: tabs --> spaces, some prettyprinting
diego
parents: 2967
diff changeset
551 /* compute cbp */
bfabfdf9ce55 COSMETICS: tabs --> spaces, some prettyprinting
diego
parents: 2967
diff changeset
552 cbp = 0;
bfabfdf9ce55 COSMETICS: tabs --> spaces, some prettyprinting
diego
parents: 2967
diff changeset
553 for (i = 0; i < 6; i++) {
bfabfdf9ce55 COSMETICS: tabs --> spaces, some prettyprinting
diego
parents: 2967
diff changeset
554 if (s->block_last_index[i] >= 0)
bfabfdf9ce55 COSMETICS: tabs --> spaces, some prettyprinting
diego
parents: 2967
diff changeset
555 cbp |= 1 << (5 - i);
bfabfdf9ce55 COSMETICS: tabs --> spaces, some prettyprinting
diego
parents: 2967
diff changeset
556 }
bfabfdf9ce55 COSMETICS: tabs --> spaces, some prettyprinting
diego
parents: 2967
diff changeset
557 if (s->use_skip_mb_code && (cbp | motion_x | motion_y) == 0) {
bfabfdf9ce55 COSMETICS: tabs --> spaces, some prettyprinting
diego
parents: 2967
diff changeset
558 /* skip macroblock */
bfabfdf9ce55 COSMETICS: tabs --> spaces, some prettyprinting
diego
parents: 2967
diff changeset
559 put_bits(&s->pb, 1, 1);
1164
0e3c0c4a7b3d msmpeg4 2pass support & some related cleanup
michaelni
parents: 1163
diff changeset
560 s->last_bits++;
2979
bfabfdf9ce55 COSMETICS: tabs --> spaces, some prettyprinting
diego
parents: 2967
diff changeset
561 s->misc_bits++;
1216
b874217f906b 2pass stats fix (by ffdshow cvslog)
michaelni
parents: 1177
diff changeset
562 s->skip_count++;
1164
0e3c0c4a7b3d msmpeg4 2pass support & some related cleanup
michaelni
parents: 1163
diff changeset
563
2979
bfabfdf9ce55 COSMETICS: tabs --> spaces, some prettyprinting
diego
parents: 2967
diff changeset
564 return;
bfabfdf9ce55 COSMETICS: tabs --> spaces, some prettyprinting
diego
parents: 2967
diff changeset
565 }
0
986e461dc072 Initial revision
glantau
parents:
diff changeset
566 if (s->use_skip_mb_code)
2979
bfabfdf9ce55 COSMETICS: tabs --> spaces, some prettyprinting
diego
parents: 2967
diff changeset
567 put_bits(&s->pb, 1, 0); /* mb coded */
2967
ef2149182f1c COSMETICS: Remove all trailing whitespace.
diego
parents: 2846
diff changeset
568
457
583dcee270d2 msmpeg4v1 decoding
michaelni
parents: 440
diff changeset
569 if(s->msmpeg4_version<=2){
2967
ef2149182f1c COSMETICS: Remove all trailing whitespace.
diego
parents: 2846
diff changeset
570 put_bits(&s->pb,
ef2149182f1c COSMETICS: Remove all trailing whitespace.
diego
parents: 2846
diff changeset
571 v2_mb_type[cbp&3][1],
310
49e73229a5e6 msmpeg4v2 encoding
michaelni
parents: 309
diff changeset
572 v2_mb_type[cbp&3][0]);
49e73229a5e6 msmpeg4v2 encoding
michaelni
parents: 309
diff changeset
573 if((cbp&3) != 3) coded_cbp= cbp ^ 0x3C;
49e73229a5e6 msmpeg4v2 encoding
michaelni
parents: 309
diff changeset
574 else coded_cbp= cbp;
0
986e461dc072 Initial revision
glantau
parents:
diff changeset
575
2967
ef2149182f1c COSMETICS: Remove all trailing whitespace.
diego
parents: 2846
diff changeset
576 put_bits(&s->pb,
10818
514dc1c87b2e Rename most non static h263 tables so their name contains h263.
michael
parents: 10816
diff changeset
577 ff_h263_cbpy_tab[coded_cbp>>2][1],
514dc1c87b2e Rename most non static h263 tables so their name contains h263.
michael
parents: 10816
diff changeset
578 ff_h263_cbpy_tab[coded_cbp>>2][0]);
1164
0e3c0c4a7b3d msmpeg4 2pass support & some related cleanup
michaelni
parents: 1163
diff changeset
579
0e3c0c4a7b3d msmpeg4 2pass support & some related cleanup
michaelni
parents: 1163
diff changeset
580 s->misc_bits += get_bits_diff(s);
0e3c0c4a7b3d msmpeg4 2pass support & some related cleanup
michaelni
parents: 1163
diff changeset
581
1938
e2501e6e7ff7 unify table indexing (motion_val,dc_val,ac_val,coded_block changed)
michael
parents: 1739
diff changeset
582 h263_pred_motion(s, 0, 0, &pred_x, &pred_y);
310
49e73229a5e6 msmpeg4v2 encoding
michaelni
parents: 309
diff changeset
583 msmpeg4v2_encode_motion(s, motion_x - pred_x);
49e73229a5e6 msmpeg4v2 encoding
michaelni
parents: 309
diff changeset
584 msmpeg4v2_encode_motion(s, motion_y - pred_y);
49e73229a5e6 msmpeg4v2 encoding
michaelni
parents: 309
diff changeset
585 }else{
2967
ef2149182f1c COSMETICS: Remove all trailing whitespace.
diego
parents: 2846
diff changeset
586 put_bits(&s->pb,
ef2149182f1c COSMETICS: Remove all trailing whitespace.
diego
parents: 2846
diff changeset
587 table_mb_non_intra[cbp + 64][1],
310
49e73229a5e6 msmpeg4v2 encoding
michaelni
parents: 309
diff changeset
588 table_mb_non_intra[cbp + 64][0]);
49e73229a5e6 msmpeg4v2 encoding
michaelni
parents: 309
diff changeset
589
1164
0e3c0c4a7b3d msmpeg4 2pass support & some related cleanup
michaelni
parents: 1163
diff changeset
590 s->misc_bits += get_bits_diff(s);
0e3c0c4a7b3d msmpeg4 2pass support & some related cleanup
michaelni
parents: 1163
diff changeset
591
310
49e73229a5e6 msmpeg4v2 encoding
michaelni
parents: 309
diff changeset
592 /* motion vector */
1938
e2501e6e7ff7 unify table indexing (motion_val,dc_val,ac_val,coded_block changed)
michael
parents: 1739
diff changeset
593 h263_pred_motion(s, 0, 0, &pred_x, &pred_y);
5882
51fc10d9fdff rename some msmpeg4 symbols and make them non-static
aurel
parents: 5543
diff changeset
594 ff_msmpeg4_encode_motion(s, motion_x - pred_x,
310
49e73229a5e6 msmpeg4v2 encoding
michaelni
parents: 309
diff changeset
595 motion_y - pred_y);
49e73229a5e6 msmpeg4v2 encoding
michaelni
parents: 309
diff changeset
596 }
1164
0e3c0c4a7b3d msmpeg4 2pass support & some related cleanup
michaelni
parents: 1163
diff changeset
597
0e3c0c4a7b3d msmpeg4 2pass support & some related cleanup
michaelni
parents: 1163
diff changeset
598 s->mv_bits += get_bits_diff(s);
0e3c0c4a7b3d msmpeg4 2pass support & some related cleanup
michaelni
parents: 1163
diff changeset
599
0e3c0c4a7b3d msmpeg4 2pass support & some related cleanup
michaelni
parents: 1163
diff changeset
600 for (i = 0; i < 6; i++) {
5178
b215d5a5fa9a static (inline) X => ff_X
benoit
parents: 5129
diff changeset
601 ff_msmpeg4_encode_block(s, block[i], i);
1164
0e3c0c4a7b3d msmpeg4 2pass support & some related cleanup
michaelni
parents: 1163
diff changeset
602 }
0e3c0c4a7b3d msmpeg4 2pass support & some related cleanup
michaelni
parents: 1163
diff changeset
603 s->p_tex_bits += get_bits_diff(s);
0
986e461dc072 Initial revision
glantau
parents:
diff changeset
604 } else {
2979
bfabfdf9ce55 COSMETICS: tabs --> spaces, some prettyprinting
diego
parents: 2967
diff changeset
605 /* compute cbp */
bfabfdf9ce55 COSMETICS: tabs --> spaces, some prettyprinting
diego
parents: 2967
diff changeset
606 cbp = 0;
0
986e461dc072 Initial revision
glantau
parents:
diff changeset
607 coded_cbp = 0;
2979
bfabfdf9ce55 COSMETICS: tabs --> spaces, some prettyprinting
diego
parents: 2967
diff changeset
608 for (i = 0; i < 6; i++) {
0
986e461dc072 Initial revision
glantau
parents:
diff changeset
609 int val, pred;
986e461dc072 Initial revision
glantau
parents:
diff changeset
610 val = (s->block_last_index[i] >= 1);
986e461dc072 Initial revision
glantau
parents:
diff changeset
611 cbp |= val << (5 - i);
986e461dc072 Initial revision
glantau
parents:
diff changeset
612 if (i < 4) {
986e461dc072 Initial revision
glantau
parents:
diff changeset
613 /* predict value for close blocks only for luma */
5882
51fc10d9fdff rename some msmpeg4 symbols and make them non-static
aurel
parents: 5543
diff changeset
614 pred = ff_msmpeg4_coded_block_pred(s, i, &coded_block);
0
986e461dc072 Initial revision
glantau
parents:
diff changeset
615 *coded_block = val;
986e461dc072 Initial revision
glantau
parents:
diff changeset
616 val = val ^ pred;
986e461dc072 Initial revision
glantau
parents:
diff changeset
617 }
986e461dc072 Initial revision
glantau
parents:
diff changeset
618 coded_cbp |= val << (5 - i);
2979
bfabfdf9ce55 COSMETICS: tabs --> spaces, some prettyprinting
diego
parents: 2967
diff changeset
619 }
0
986e461dc072 Initial revision
glantau
parents:
diff changeset
620 #if 0
986e461dc072 Initial revision
glantau
parents:
diff changeset
621 if (coded_cbp)
986e461dc072 Initial revision
glantau
parents:
diff changeset
622 printf("cbp=%x %x\n", cbp, coded_cbp);
986e461dc072 Initial revision
glantau
parents:
diff changeset
623 #endif
986e461dc072 Initial revision
glantau
parents:
diff changeset
624
457
583dcee270d2 msmpeg4v1 decoding
michaelni
parents: 440
diff changeset
625 if(s->msmpeg4_version<=2){
6481
493dc59d469a add FF_ prefix to all (frame)_TYPE usage
aurel
parents: 6350
diff changeset
626 if (s->pict_type == FF_I_TYPE) {
2967
ef2149182f1c COSMETICS: Remove all trailing whitespace.
diego
parents: 2846
diff changeset
627 put_bits(&s->pb,
310
49e73229a5e6 msmpeg4v2 encoding
michaelni
parents: 309
diff changeset
628 v2_intra_cbpc[cbp&3][1], v2_intra_cbpc[cbp&3][0]);
49e73229a5e6 msmpeg4v2 encoding
michaelni
parents: 309
diff changeset
629 } else {
49e73229a5e6 msmpeg4v2 encoding
michaelni
parents: 309
diff changeset
630 if (s->use_skip_mb_code)
2979
bfabfdf9ce55 COSMETICS: tabs --> spaces, some prettyprinting
diego
parents: 2967
diff changeset
631 put_bits(&s->pb, 1, 0); /* mb coded */
2967
ef2149182f1c COSMETICS: Remove all trailing whitespace.
diego
parents: 2846
diff changeset
632 put_bits(&s->pb,
ef2149182f1c COSMETICS: Remove all trailing whitespace.
diego
parents: 2846
diff changeset
633 v2_mb_type[(cbp&3) + 4][1],
310
49e73229a5e6 msmpeg4v2 encoding
michaelni
parents: 309
diff changeset
634 v2_mb_type[(cbp&3) + 4][0]);
49e73229a5e6 msmpeg4v2 encoding
michaelni
parents: 309
diff changeset
635 }
2979
bfabfdf9ce55 COSMETICS: tabs --> spaces, some prettyprinting
diego
parents: 2967
diff changeset
636 put_bits(&s->pb, 1, 0); /* no AC prediction yet */
2967
ef2149182f1c COSMETICS: Remove all trailing whitespace.
diego
parents: 2846
diff changeset
637 put_bits(&s->pb,
10818
514dc1c87b2e Rename most non static h263 tables so their name contains h263.
michael
parents: 10816
diff changeset
638 ff_h263_cbpy_tab[cbp>>2][1],
514dc1c87b2e Rename most non static h263 tables so their name contains h263.
michael
parents: 10816
diff changeset
639 ff_h263_cbpy_tab[cbp>>2][0]);
310
49e73229a5e6 msmpeg4v2 encoding
michaelni
parents: 309
diff changeset
640 }else{
6481
493dc59d469a add FF_ prefix to all (frame)_TYPE usage
aurel
parents: 6350
diff changeset
641 if (s->pict_type == FF_I_TYPE) {
2967
ef2149182f1c COSMETICS: Remove all trailing whitespace.
diego
parents: 2846
diff changeset
642 put_bits(&s->pb,
2474
81a9f883a17a In that patch:
michael
parents: 2465
diff changeset
643 ff_msmp4_mb_i_table[coded_cbp][1], ff_msmp4_mb_i_table[coded_cbp][0]);
310
49e73229a5e6 msmpeg4v2 encoding
michaelni
parents: 309
diff changeset
644 } else {
49e73229a5e6 msmpeg4v2 encoding
michaelni
parents: 309
diff changeset
645 if (s->use_skip_mb_code)
2979
bfabfdf9ce55 COSMETICS: tabs --> spaces, some prettyprinting
diego
parents: 2967
diff changeset
646 put_bits(&s->pb, 1, 0); /* mb coded */
2967
ef2149182f1c COSMETICS: Remove all trailing whitespace.
diego
parents: 2846
diff changeset
647 put_bits(&s->pb,
ef2149182f1c COSMETICS: Remove all trailing whitespace.
diego
parents: 2846
diff changeset
648 table_mb_non_intra[cbp][1],
310
49e73229a5e6 msmpeg4v2 encoding
michaelni
parents: 309
diff changeset
649 table_mb_non_intra[cbp][0]);
49e73229a5e6 msmpeg4v2 encoding
michaelni
parents: 309
diff changeset
650 }
2979
bfabfdf9ce55 COSMETICS: tabs --> spaces, some prettyprinting
diego
parents: 2967
diff changeset
651 put_bits(&s->pb, 1, 0); /* no AC prediction yet */
578
32c142b10263 fixing bitrate vs. kbitrate in header
michaelni
parents: 563
diff changeset
652 if(s->inter_intra_pred){
32c142b10263 fixing bitrate vs. kbitrate in header
michaelni
parents: 563
diff changeset
653 s->h263_aic_dir=0;
32c142b10263 fixing bitrate vs. kbitrate in header
michaelni
parents: 563
diff changeset
654 put_bits(&s->pb, table_inter_intra[s->h263_aic_dir][1], table_inter_intra[s->h263_aic_dir][0]);
32c142b10263 fixing bitrate vs. kbitrate in header
michaelni
parents: 563
diff changeset
655 }
0
986e461dc072 Initial revision
glantau
parents:
diff changeset
656 }
1164
0e3c0c4a7b3d msmpeg4 2pass support & some related cleanup
michaelni
parents: 1163
diff changeset
657 s->misc_bits += get_bits_diff(s);
0
986e461dc072 Initial revision
glantau
parents:
diff changeset
658
1164
0e3c0c4a7b3d msmpeg4 2pass support & some related cleanup
michaelni
parents: 1163
diff changeset
659 for (i = 0; i < 6; i++) {
5178
b215d5a5fa9a static (inline) X => ff_X
benoit
parents: 5129
diff changeset
660 ff_msmpeg4_encode_block(s, block[i], i);
1164
0e3c0c4a7b3d msmpeg4 2pass support & some related cleanup
michaelni
parents: 1163
diff changeset
661 }
0e3c0c4a7b3d msmpeg4 2pass support & some related cleanup
michaelni
parents: 1163
diff changeset
662 s->i_tex_bits += get_bits_diff(s);
1216
b874217f906b 2pass stats fix (by ffdshow cvslog)
michaelni
parents: 1177
diff changeset
663 s->i_count++;
0
986e461dc072 Initial revision
glantau
parents:
diff changeset
664 }
986e461dc072 Initial revision
glantau
parents:
diff changeset
665 }
986e461dc072 Initial revision
glantau
parents:
diff changeset
666
1070
6da5ae9ee199 more #ifdef CONFIG_ENCODERS patch by (Wolfgang Hesseler <qv at multimediaware dot com>) with modifications by me (s/WOLFGANG/CONFIG_ENCODERS/ and some other fixes)
michaelni
parents: 1064
diff changeset
667 #endif //CONFIG_ENCODERS
6da5ae9ee199 more #ifdef CONFIG_ENCODERS patch by (Wolfgang Hesseler <qv at multimediaware dot com>) with modifications by me (s/WOLFGANG/CONFIG_ENCODERS/ and some other fixes)
michaelni
parents: 1064
diff changeset
668
2967
ef2149182f1c COSMETICS: Remove all trailing whitespace.
diego
parents: 2846
diff changeset
669 static inline int msmpeg4v1_pred_dc(MpegEncContext * s, int n,
1064
b32afefe7d33 * UINTX -> uintx_t INTX -> intx_t
kabi
parents: 1063
diff changeset
670 int32_t **dc_val_ptr)
457
583dcee270d2 msmpeg4v1 decoding
michaelni
parents: 440
diff changeset
671 {
583dcee270d2 msmpeg4v1 decoding
michaelni
parents: 440
diff changeset
672 int i;
583dcee270d2 msmpeg4v1 decoding
michaelni
parents: 440
diff changeset
673
583dcee270d2 msmpeg4v1 decoding
michaelni
parents: 440
diff changeset
674 if (n < 4) {
583dcee270d2 msmpeg4v1 decoding
michaelni
parents: 440
diff changeset
675 i= 0;
583dcee270d2 msmpeg4v1 decoding
michaelni
parents: 440
diff changeset
676 } else {
583dcee270d2 msmpeg4v1 decoding
michaelni
parents: 440
diff changeset
677 i= n-3;
583dcee270d2 msmpeg4v1 decoding
michaelni
parents: 440
diff changeset
678 }
2967
ef2149182f1c COSMETICS: Remove all trailing whitespace.
diego
parents: 2846
diff changeset
679
457
583dcee270d2 msmpeg4v1 decoding
michaelni
parents: 440
diff changeset
680 *dc_val_ptr= &s->last_dc[i];
2967
ef2149182f1c COSMETICS: Remove all trailing whitespace.
diego
parents: 2846
diff changeset
681 return s->last_dc[i];
457
583dcee270d2 msmpeg4v1 decoding
michaelni
parents: 440
diff changeset
682 }
583dcee270d2 msmpeg4v1 decoding
michaelni
parents: 440
diff changeset
683
519
55b4e2248a45 wmv1 slice_height != mb_height support
michaelni
parents: 501
diff changeset
684 static int get_dc(uint8_t *src, int stride, int scale)
55b4e2248a45 wmv1 slice_height != mb_height support
michaelni
parents: 501
diff changeset
685 {
55b4e2248a45 wmv1 slice_height != mb_height support
michaelni
parents: 501
diff changeset
686 int y;
55b4e2248a45 wmv1 slice_height != mb_height support
michaelni
parents: 501
diff changeset
687 int sum=0;
55b4e2248a45 wmv1 slice_height != mb_height support
michaelni
parents: 501
diff changeset
688 for(y=0; y<8; y++){
55b4e2248a45 wmv1 slice_height != mb_height support
michaelni
parents: 501
diff changeset
689 int x;
55b4e2248a45 wmv1 slice_height != mb_height support
michaelni
parents: 501
diff changeset
690 for(x=0; x<8; x++){
55b4e2248a45 wmv1 slice_height != mb_height support
michaelni
parents: 501
diff changeset
691 sum+=src[x + y*stride];
55b4e2248a45 wmv1 slice_height != mb_height support
michaelni
parents: 501
diff changeset
692 }
55b4e2248a45 wmv1 slice_height != mb_height support
michaelni
parents: 501
diff changeset
693 }
1261
362947395f5c fastdiv patch by (BERO <bero at geocities dot co dot jp>) with fixes & cleanup by me
michaelni
parents: 1255
diff changeset
694 return FASTDIV((sum + (scale>>1)), scale);
519
55b4e2248a45 wmv1 slice_height != mb_height support
michaelni
parents: 501
diff changeset
695 }
55b4e2248a45 wmv1 slice_height != mb_height support
michaelni
parents: 501
diff changeset
696
0
986e461dc072 Initial revision
glantau
parents:
diff changeset
697 /* dir = 0: left, dir = 1: top prediction */
2967
ef2149182f1c COSMETICS: Remove all trailing whitespace.
diego
parents: 2846
diff changeset
698 static inline int msmpeg4_pred_dc(MpegEncContext * s, int n,
3781
8e79b099d354 dc_val should be signed
mru
parents: 3777
diff changeset
699 int16_t **dc_val_ptr, int *dir_ptr)
0
986e461dc072 Initial revision
glantau
parents:
diff changeset
700 {
299
fb9e77674bd4 minor optimizations / simplifications
michaelni
parents: 251
diff changeset
701 int a, b, c, wrap, pred, scale;
3781
8e79b099d354 dc_val should be signed
mru
parents: 3777
diff changeset
702 int16_t *dc_val;
0
986e461dc072 Initial revision
glantau
parents:
diff changeset
703
986e461dc072 Initial revision
glantau
parents:
diff changeset
704 /* find prediction */
986e461dc072 Initial revision
glantau
parents:
diff changeset
705 if (n < 4) {
2979
bfabfdf9ce55 COSMETICS: tabs --> spaces, some prettyprinting
diego
parents: 2967
diff changeset
706 scale = s->y_dc_scale;
0
986e461dc072 Initial revision
glantau
parents:
diff changeset
707 } else {
2979
bfabfdf9ce55 COSMETICS: tabs --> spaces, some prettyprinting
diego
parents: 2967
diff changeset
708 scale = s->c_dc_scale;
0
986e461dc072 Initial revision
glantau
parents:
diff changeset
709 }
2967
ef2149182f1c COSMETICS: Remove all trailing whitespace.
diego
parents: 2846
diff changeset
710
299
fb9e77674bd4 minor optimizations / simplifications
michaelni
parents: 251
diff changeset
711 wrap = s->block_wrap[n];
fb9e77674bd4 minor optimizations / simplifications
michaelni
parents: 251
diff changeset
712 dc_val= s->dc_val[0] + s->block_index[n];
0
986e461dc072 Initial revision
glantau
parents:
diff changeset
713
986e461dc072 Initial revision
glantau
parents:
diff changeset
714 /* B C
2967
ef2149182f1c COSMETICS: Remove all trailing whitespace.
diego
parents: 2846
diff changeset
715 * A X
0
986e461dc072 Initial revision
glantau
parents:
diff changeset
716 */
299
fb9e77674bd4 minor optimizations / simplifications
michaelni
parents: 251
diff changeset
717 a = dc_val[ - 1];
fb9e77674bd4 minor optimizations / simplifications
michaelni
parents: 251
diff changeset
718 b = dc_val[ - 1 - wrap];
fb9e77674bd4 minor optimizations / simplifications
michaelni
parents: 251
diff changeset
719 c = dc_val[ - wrap];
2967
ef2149182f1c COSMETICS: Remove all trailing whitespace.
diego
parents: 2846
diff changeset
720
983
ca2a303ea039 fixed wmv2 slices
michaelni
parents: 936
diff changeset
721 if(s->first_slice_line && (n&2)==0 && s->msmpeg4_version<4){
745
25d7fb7c89be better/cleaner error resilience (done in a 2nd pass after decoding)
michaelni
parents: 743
diff changeset
722 b=c=1024;
25d7fb7c89be better/cleaner error resilience (done in a 2nd pass after decoding)
michaelni
parents: 743
diff changeset
723 }
0
986e461dc072 Initial revision
glantau
parents:
diff changeset
724
986e461dc072 Initial revision
glantau
parents:
diff changeset
725 /* XXX: the following solution consumes divisions, but it does not
986e461dc072 Initial revision
glantau
parents:
diff changeset
726 necessitate to modify mpegvideo.c. The problem comes from the
986e461dc072 Initial revision
glantau
parents:
diff changeset
727 fact they decided to store the quantized DC (which would lead
986e461dc072 Initial revision
glantau
parents:
diff changeset
728 to problems if Q could vary !) */
10071
6ac0d4957d35 Replace #ifdef PIC checks with the more appropriate HAVE_EBX_AVAILABLE/HAVE_7REGS.
reimar
parents: 9998
diff changeset
729 #if ARCH_X86 && HAVE_7REGS && HAVE_EBX_AVAILABLE
8031
eebc7209c47f Convert asm keyword into __asm__.
flameeyes
parents: 7994
diff changeset
730 __asm__ volatile(
2979
bfabfdf9ce55 COSMETICS: tabs --> spaces, some prettyprinting
diego
parents: 2967
diff changeset
731 "movl %3, %%eax \n\t"
bfabfdf9ce55 COSMETICS: tabs --> spaces, some prettyprinting
diego
parents: 2967
diff changeset
732 "shrl $1, %%eax \n\t"
bfabfdf9ce55 COSMETICS: tabs --> spaces, some prettyprinting
diego
parents: 2967
diff changeset
733 "addl %%eax, %2 \n\t"
bfabfdf9ce55 COSMETICS: tabs --> spaces, some prettyprinting
diego
parents: 2967
diff changeset
734 "addl %%eax, %1 \n\t"
bfabfdf9ce55 COSMETICS: tabs --> spaces, some prettyprinting
diego
parents: 2967
diff changeset
735 "addl %0, %%eax \n\t"
bfabfdf9ce55 COSMETICS: tabs --> spaces, some prettyprinting
diego
parents: 2967
diff changeset
736 "mull %4 \n\t"
bfabfdf9ce55 COSMETICS: tabs --> spaces, some prettyprinting
diego
parents: 2967
diff changeset
737 "movl %%edx, %0 \n\t"
bfabfdf9ce55 COSMETICS: tabs --> spaces, some prettyprinting
diego
parents: 2967
diff changeset
738 "movl %1, %%eax \n\t"
bfabfdf9ce55 COSMETICS: tabs --> spaces, some prettyprinting
diego
parents: 2967
diff changeset
739 "mull %4 \n\t"
bfabfdf9ce55 COSMETICS: tabs --> spaces, some prettyprinting
diego
parents: 2967
diff changeset
740 "movl %%edx, %1 \n\t"
bfabfdf9ce55 COSMETICS: tabs --> spaces, some prettyprinting
diego
parents: 2967
diff changeset
741 "movl %2, %%eax \n\t"
bfabfdf9ce55 COSMETICS: tabs --> spaces, some prettyprinting
diego
parents: 2967
diff changeset
742 "mull %4 \n\t"
bfabfdf9ce55 COSMETICS: tabs --> spaces, some prettyprinting
diego
parents: 2967
diff changeset
743 "movl %%edx, %2 \n\t"
bfabfdf9ce55 COSMETICS: tabs --> spaces, some prettyprinting
diego
parents: 2967
diff changeset
744 : "+b" (a), "+c" (b), "+D" (c)
4174
8535fcac43c1 rename inverse -> ff_inverse
mru
parents: 4116
diff changeset
745 : "g" (scale), "S" (ff_inverse[scale])
2979
bfabfdf9ce55 COSMETICS: tabs --> spaces, some prettyprinting
diego
parents: 2967
diff changeset
746 : "%eax", "%edx"
204
fceb435fae6b (commit by michael)
arpi_esp
parents: 201
diff changeset
747 );
221
fe243b4aec02 * temporal solution for shared lib compilation
kabi
parents: 214
diff changeset
748 #else
8590
7a463923ecd1 Change semantic of CONFIG_*, HAVE_* and ARCH_*.
aurel
parents: 8031
diff changeset
749 /* #elif ARCH_ALPHA */
214
73df666cacc7 Alpha optimizations by Falk Hueffner <falk.hueffner@student.uni-tuebingen.de>
nickols_k
parents: 208
diff changeset
750 /* Divisions are extremely costly on Alpha; optimize the most
221
fe243b4aec02 * temporal solution for shared lib compilation
kabi
parents: 214
diff changeset
751 common case. But they are costly everywhere...
fe243b4aec02 * temporal solution for shared lib compilation
kabi
parents: 214
diff changeset
752 */
214
73df666cacc7 Alpha optimizations by Falk Hueffner <falk.hueffner@student.uni-tuebingen.de>
nickols_k
parents: 208
diff changeset
753 if (scale == 8) {
2979
bfabfdf9ce55 COSMETICS: tabs --> spaces, some prettyprinting
diego
parents: 2967
diff changeset
754 a = (a + (8 >> 1)) / 8;
bfabfdf9ce55 COSMETICS: tabs --> spaces, some prettyprinting
diego
parents: 2967
diff changeset
755 b = (b + (8 >> 1)) / 8;
bfabfdf9ce55 COSMETICS: tabs --> spaces, some prettyprinting
diego
parents: 2967
diff changeset
756 c = (c + (8 >> 1)) / 8;
214
73df666cacc7 Alpha optimizations by Falk Hueffner <falk.hueffner@student.uni-tuebingen.de>
nickols_k
parents: 208
diff changeset
757 } else {
2979
bfabfdf9ce55 COSMETICS: tabs --> spaces, some prettyprinting
diego
parents: 2967
diff changeset
758 a = FASTDIV((a + (scale >> 1)), scale);
bfabfdf9ce55 COSMETICS: tabs --> spaces, some prettyprinting
diego
parents: 2967
diff changeset
759 b = FASTDIV((b + (scale >> 1)), scale);
bfabfdf9ce55 COSMETICS: tabs --> spaces, some prettyprinting
diego
parents: 2967
diff changeset
760 c = FASTDIV((c + (scale >> 1)), scale);
214
73df666cacc7 Alpha optimizations by Falk Hueffner <falk.hueffner@student.uni-tuebingen.de>
nickols_k
parents: 208
diff changeset
761 }
204
fceb435fae6b (commit by michael)
arpi_esp
parents: 201
diff changeset
762 #endif
0
986e461dc072 Initial revision
glantau
parents:
diff changeset
763 /* XXX: WARNING: they did not choose the same test as MPEG4. This
986e461dc072 Initial revision
glantau
parents:
diff changeset
764 is very important ! */
501
2241bce35bb9 fixing wmv1 bugs, it was foolish to belive that m$ would use the same dc prediction as mpeg4 just cuz they changed it a bit from msmpeg4v3
michaelni
parents: 499
diff changeset
765 if(s->msmpeg4_version>3){
519
55b4e2248a45 wmv1 slice_height != mb_height support
michaelni
parents: 501
diff changeset
766 if(s->inter_intra_pred){
55b4e2248a45 wmv1 slice_height != mb_height support
michaelni
parents: 501
diff changeset
767 uint8_t *dest;
55b4e2248a45 wmv1 slice_height != mb_height support
michaelni
parents: 501
diff changeset
768 int wrap;
2967
ef2149182f1c COSMETICS: Remove all trailing whitespace.
diego
parents: 2846
diff changeset
769
519
55b4e2248a45 wmv1 slice_height != mb_height support
michaelni
parents: 501
diff changeset
770 if(n==1){
55b4e2248a45 wmv1 slice_height != mb_height support
michaelni
parents: 501
diff changeset
771 pred=a;
55b4e2248a45 wmv1 slice_height != mb_height support
michaelni
parents: 501
diff changeset
772 *dir_ptr = 0;
55b4e2248a45 wmv1 slice_height != mb_height support
michaelni
parents: 501
diff changeset
773 }else if(n==2){
55b4e2248a45 wmv1 slice_height != mb_height support
michaelni
parents: 501
diff changeset
774 pred=c;
55b4e2248a45 wmv1 slice_height != mb_height support
michaelni
parents: 501
diff changeset
775 *dir_ptr = 1;
55b4e2248a45 wmv1 slice_height != mb_height support
michaelni
parents: 501
diff changeset
776 }else if(n==3){
55b4e2248a45 wmv1 slice_height != mb_height support
michaelni
parents: 501
diff changeset
777 if (abs(a - b) < abs(b - c)) {
55b4e2248a45 wmv1 slice_height != mb_height support
michaelni
parents: 501
diff changeset
778 pred = c;
55b4e2248a45 wmv1 slice_height != mb_height support
michaelni
parents: 501
diff changeset
779 *dir_ptr = 1;
55b4e2248a45 wmv1 slice_height != mb_height support
michaelni
parents: 501
diff changeset
780 } else {
55b4e2248a45 wmv1 slice_height != mb_height support
michaelni
parents: 501
diff changeset
781 pred = a;
55b4e2248a45 wmv1 slice_height != mb_height support
michaelni
parents: 501
diff changeset
782 *dir_ptr = 0;
55b4e2248a45 wmv1 slice_height != mb_height support
michaelni
parents: 501
diff changeset
783 }
55b4e2248a45 wmv1 slice_height != mb_height support
michaelni
parents: 501
diff changeset
784 }else{
55b4e2248a45 wmv1 slice_height != mb_height support
michaelni
parents: 501
diff changeset
785 if(n<4){
55b4e2248a45 wmv1 slice_height != mb_height support
michaelni
parents: 501
diff changeset
786 wrap= s->linesize;
903
22ee74da2cd3 cleanup
michaelni
parents: 847
diff changeset
787 dest= s->current_picture.data[0] + (((n>>1) + 2*s->mb_y) * 8* wrap ) + ((n&1) + 2*s->mb_x) * 8;
519
55b4e2248a45 wmv1 slice_height != mb_height support
michaelni
parents: 501
diff changeset
788 }else{
556
762c67fd4078 uvlinesize
michaelni
parents: 542
diff changeset
789 wrap= s->uvlinesize;
903
22ee74da2cd3 cleanup
michaelni
parents: 847
diff changeset
790 dest= s->current_picture.data[n-3] + (s->mb_y * 8 * wrap) + s->mb_x * 8;
519
55b4e2248a45 wmv1 slice_height != mb_height support
michaelni
parents: 501
diff changeset
791 }
55b4e2248a45 wmv1 slice_height != mb_height support
michaelni
parents: 501
diff changeset
792 if(s->mb_x==0) a= (1024 + (scale>>1))/scale;
55b4e2248a45 wmv1 slice_height != mb_height support
michaelni
parents: 501
diff changeset
793 else a= get_dc(dest-8, wrap, scale*8);
55b4e2248a45 wmv1 slice_height != mb_height support
michaelni
parents: 501
diff changeset
794 if(s->mb_y==0) c= (1024 + (scale>>1))/scale;
55b4e2248a45 wmv1 slice_height != mb_height support
michaelni
parents: 501
diff changeset
795 else c= get_dc(dest-8*wrap, wrap, scale*8);
2967
ef2149182f1c COSMETICS: Remove all trailing whitespace.
diego
parents: 2846
diff changeset
796
519
55b4e2248a45 wmv1 slice_height != mb_height support
michaelni
parents: 501
diff changeset
797 if (s->h263_aic_dir==0) {
55b4e2248a45 wmv1 slice_height != mb_height support
michaelni
parents: 501
diff changeset
798 pred= a;
55b4e2248a45 wmv1 slice_height != mb_height support
michaelni
parents: 501
diff changeset
799 *dir_ptr = 0;
55b4e2248a45 wmv1 slice_height != mb_height support
michaelni
parents: 501
diff changeset
800 }else if (s->h263_aic_dir==1) {
55b4e2248a45 wmv1 slice_height != mb_height support
michaelni
parents: 501
diff changeset
801 if(n==0){
55b4e2248a45 wmv1 slice_height != mb_height support
michaelni
parents: 501
diff changeset
802 pred= c;
55b4e2248a45 wmv1 slice_height != mb_height support
michaelni
parents: 501
diff changeset
803 *dir_ptr = 1;
55b4e2248a45 wmv1 slice_height != mb_height support
michaelni
parents: 501
diff changeset
804 }else{
55b4e2248a45 wmv1 slice_height != mb_height support
michaelni
parents: 501
diff changeset
805 pred= a;
55b4e2248a45 wmv1 slice_height != mb_height support
michaelni
parents: 501
diff changeset
806 *dir_ptr = 0;
55b4e2248a45 wmv1 slice_height != mb_height support
michaelni
parents: 501
diff changeset
807 }
55b4e2248a45 wmv1 slice_height != mb_height support
michaelni
parents: 501
diff changeset
808 }else if (s->h263_aic_dir==2) {
55b4e2248a45 wmv1 slice_height != mb_height support
michaelni
parents: 501
diff changeset
809 if(n==0){
55b4e2248a45 wmv1 slice_height != mb_height support
michaelni
parents: 501
diff changeset
810 pred= a;
55b4e2248a45 wmv1 slice_height != mb_height support
michaelni
parents: 501
diff changeset
811 *dir_ptr = 0;
55b4e2248a45 wmv1 slice_height != mb_height support
michaelni
parents: 501
diff changeset
812 }else{
55b4e2248a45 wmv1 slice_height != mb_height support
michaelni
parents: 501
diff changeset
813 pred= c;
55b4e2248a45 wmv1 slice_height != mb_height support
michaelni
parents: 501
diff changeset
814 *dir_ptr = 1;
55b4e2248a45 wmv1 slice_height != mb_height support
michaelni
parents: 501
diff changeset
815 }
55b4e2248a45 wmv1 slice_height != mb_height support
michaelni
parents: 501
diff changeset
816 } else {
55b4e2248a45 wmv1 slice_height != mb_height support
michaelni
parents: 501
diff changeset
817 pred= c;
55b4e2248a45 wmv1 slice_height != mb_height support
michaelni
parents: 501
diff changeset
818 *dir_ptr = 1;
55b4e2248a45 wmv1 slice_height != mb_height support
michaelni
parents: 501
diff changeset
819 }
55b4e2248a45 wmv1 slice_height != mb_height support
michaelni
parents: 501
diff changeset
820 }
55b4e2248a45 wmv1 slice_height != mb_height support
michaelni
parents: 501
diff changeset
821 }else{
55b4e2248a45 wmv1 slice_height != mb_height support
michaelni
parents: 501
diff changeset
822 if (abs(a - b) < abs(b - c)) {
55b4e2248a45 wmv1 slice_height != mb_height support
michaelni
parents: 501
diff changeset
823 pred = c;
55b4e2248a45 wmv1 slice_height != mb_height support
michaelni
parents: 501
diff changeset
824 *dir_ptr = 1;
55b4e2248a45 wmv1 slice_height != mb_height support
michaelni
parents: 501
diff changeset
825 } else {
55b4e2248a45 wmv1 slice_height != mb_height support
michaelni
parents: 501
diff changeset
826 pred = a;
55b4e2248a45 wmv1 slice_height != mb_height support
michaelni
parents: 501
diff changeset
827 *dir_ptr = 0;
55b4e2248a45 wmv1 slice_height != mb_height support
michaelni
parents: 501
diff changeset
828 }
501
2241bce35bb9 fixing wmv1 bugs, it was foolish to belive that m$ would use the same dc prediction as mpeg4 just cuz they changed it a bit from msmpeg4v3
michaelni
parents: 499
diff changeset
829 }
2241bce35bb9 fixing wmv1 bugs, it was foolish to belive that m$ would use the same dc prediction as mpeg4 just cuz they changed it a bit from msmpeg4v3
michaelni
parents: 499
diff changeset
830 }else{
2241bce35bb9 fixing wmv1 bugs, it was foolish to belive that m$ would use the same dc prediction as mpeg4 just cuz they changed it a bit from msmpeg4v3
michaelni
parents: 499
diff changeset
831 if (abs(a - b) <= abs(b - c)) {
2241bce35bb9 fixing wmv1 bugs, it was foolish to belive that m$ would use the same dc prediction as mpeg4 just cuz they changed it a bit from msmpeg4v3
michaelni
parents: 499
diff changeset
832 pred = c;
2241bce35bb9 fixing wmv1 bugs, it was foolish to belive that m$ would use the same dc prediction as mpeg4 just cuz they changed it a bit from msmpeg4v3
michaelni
parents: 499
diff changeset
833 *dir_ptr = 1;
2241bce35bb9 fixing wmv1 bugs, it was foolish to belive that m$ would use the same dc prediction as mpeg4 just cuz they changed it a bit from msmpeg4v3
michaelni
parents: 499
diff changeset
834 } else {
2241bce35bb9 fixing wmv1 bugs, it was foolish to belive that m$ would use the same dc prediction as mpeg4 just cuz they changed it a bit from msmpeg4v3
michaelni
parents: 499
diff changeset
835 pred = a;
2241bce35bb9 fixing wmv1 bugs, it was foolish to belive that m$ would use the same dc prediction as mpeg4 just cuz they changed it a bit from msmpeg4v3
michaelni
parents: 499
diff changeset
836 *dir_ptr = 0;
2241bce35bb9 fixing wmv1 bugs, it was foolish to belive that m$ would use the same dc prediction as mpeg4 just cuz they changed it a bit from msmpeg4v3
michaelni
parents: 499
diff changeset
837 }
0
986e461dc072 Initial revision
glantau
parents:
diff changeset
838 }
986e461dc072 Initial revision
glantau
parents:
diff changeset
839
986e461dc072 Initial revision
glantau
parents:
diff changeset
840 /* update predictor */
299
fb9e77674bd4 minor optimizations / simplifications
michaelni
parents: 251
diff changeset
841 *dc_val_ptr = &dc_val[0];
0
986e461dc072 Initial revision
glantau
parents:
diff changeset
842 return pred;
986e461dc072 Initial revision
glantau
parents:
diff changeset
843 }
986e461dc072 Initial revision
glantau
parents:
diff changeset
844
986e461dc072 Initial revision
glantau
parents:
diff changeset
845 #define DC_MAX 119
986e461dc072 Initial revision
glantau
parents:
diff changeset
846
986e461dc072 Initial revision
glantau
parents:
diff changeset
847 static void msmpeg4_encode_dc(MpegEncContext * s, int level, int n, int *dir_ptr)
986e461dc072 Initial revision
glantau
parents:
diff changeset
848 {
986e461dc072 Initial revision
glantau
parents:
diff changeset
849 int sign, code;
5179
04bbac6e28df modify msmpeg4 functions to generate VC1 compatible block layer bitstream
benoit
parents: 5178
diff changeset
850 int pred, extquant;
04bbac6e28df modify msmpeg4 functions to generate VC1 compatible block layer bitstream
benoit
parents: 5178
diff changeset
851 int extrabits = 0;
0
986e461dc072 Initial revision
glantau
parents:
diff changeset
852
457
583dcee270d2 msmpeg4v1 decoding
michaelni
parents: 440
diff changeset
853 if(s->msmpeg4_version==1){
1064
b32afefe7d33 * UINTX -> uintx_t INTX -> intx_t
kabi
parents: 1063
diff changeset
854 int32_t *dc_val;
457
583dcee270d2 msmpeg4v1 decoding
michaelni
parents: 440
diff changeset
855 pred = msmpeg4v1_pred_dc(s, n, &dc_val);
2967
ef2149182f1c COSMETICS: Remove all trailing whitespace.
diego
parents: 2846
diff changeset
856
457
583dcee270d2 msmpeg4v1 decoding
michaelni
parents: 440
diff changeset
857 /* update predictor */
583dcee270d2 msmpeg4v1 decoding
michaelni
parents: 440
diff changeset
858 *dc_val= level;
583dcee270d2 msmpeg4v1 decoding
michaelni
parents: 440
diff changeset
859 }else{
3781
8e79b099d354 dc_val should be signed
mru
parents: 3777
diff changeset
860 int16_t *dc_val;
501
2241bce35bb9 fixing wmv1 bugs, it was foolish to belive that m$ would use the same dc prediction as mpeg4 just cuz they changed it a bit from msmpeg4v3
michaelni
parents: 499
diff changeset
861 pred = msmpeg4_pred_dc(s, n, &dc_val, dir_ptr);
457
583dcee270d2 msmpeg4v1 decoding
michaelni
parents: 440
diff changeset
862
583dcee270d2 msmpeg4v1 decoding
michaelni
parents: 440
diff changeset
863 /* update predictor */
583dcee270d2 msmpeg4v1 decoding
michaelni
parents: 440
diff changeset
864 if (n < 4) {
583dcee270d2 msmpeg4v1 decoding
michaelni
parents: 440
diff changeset
865 *dc_val = level * s->y_dc_scale;
583dcee270d2 msmpeg4v1 decoding
michaelni
parents: 440
diff changeset
866 } else {
583dcee270d2 msmpeg4v1 decoding
michaelni
parents: 440
diff changeset
867 *dc_val = level * s->c_dc_scale;
583dcee270d2 msmpeg4v1 decoding
michaelni
parents: 440
diff changeset
868 }
0
986e461dc072 Initial revision
glantau
parents:
diff changeset
869 }
986e461dc072 Initial revision
glantau
parents:
diff changeset
870
986e461dc072 Initial revision
glantau
parents:
diff changeset
871 /* do the prediction */
986e461dc072 Initial revision
glantau
parents:
diff changeset
872 level -= pred;
986e461dc072 Initial revision
glantau
parents:
diff changeset
873
457
583dcee270d2 msmpeg4v1 decoding
michaelni
parents: 440
diff changeset
874 if(s->msmpeg4_version<=2){
310
49e73229a5e6 msmpeg4v2 encoding
michaelni
parents: 309
diff changeset
875 if (n < 4) {
2967
ef2149182f1c COSMETICS: Remove all trailing whitespace.
diego
parents: 2846
diff changeset
876 put_bits(&s->pb,
310
49e73229a5e6 msmpeg4v2 encoding
michaelni
parents: 309
diff changeset
877 v2_dc_lum_table[level+256][1],
49e73229a5e6 msmpeg4v2 encoding
michaelni
parents: 309
diff changeset
878 v2_dc_lum_table[level+256][0]);
49e73229a5e6 msmpeg4v2 encoding
michaelni
parents: 309
diff changeset
879 }else{
2967
ef2149182f1c COSMETICS: Remove all trailing whitespace.
diego
parents: 2846
diff changeset
880 put_bits(&s->pb,
310
49e73229a5e6 msmpeg4v2 encoding
michaelni
parents: 309
diff changeset
881 v2_dc_chroma_table[level+256][1],
49e73229a5e6 msmpeg4v2 encoding
michaelni
parents: 309
diff changeset
882 v2_dc_chroma_table[level+256][0]);
49e73229a5e6 msmpeg4v2 encoding
michaelni
parents: 309
diff changeset
883 }
49e73229a5e6 msmpeg4v2 encoding
michaelni
parents: 309
diff changeset
884 }else{
49e73229a5e6 msmpeg4v2 encoding
michaelni
parents: 309
diff changeset
885 sign = 0;
49e73229a5e6 msmpeg4v2 encoding
michaelni
parents: 309
diff changeset
886 if (level < 0) {
49e73229a5e6 msmpeg4v2 encoding
michaelni
parents: 309
diff changeset
887 level = -level;
49e73229a5e6 msmpeg4v2 encoding
michaelni
parents: 309
diff changeset
888 sign = 1;
49e73229a5e6 msmpeg4v2 encoding
michaelni
parents: 309
diff changeset
889 }
49e73229a5e6 msmpeg4v2 encoding
michaelni
parents: 309
diff changeset
890 code = level;
2967
ef2149182f1c COSMETICS: Remove all trailing whitespace.
diego
parents: 2846
diff changeset
891 if (code > DC_MAX)
310
49e73229a5e6 msmpeg4v2 encoding
michaelni
parents: 309
diff changeset
892 code = DC_MAX;
5179
04bbac6e28df modify msmpeg4 functions to generate VC1 compatible block layer bitstream
benoit
parents: 5178
diff changeset
893 else if( s->msmpeg4_version>=6 ) {
04bbac6e28df modify msmpeg4 functions to generate VC1 compatible block layer bitstream
benoit
parents: 5178
diff changeset
894 if( s->qscale == 1 ) {
04bbac6e28df modify msmpeg4 functions to generate VC1 compatible block layer bitstream
benoit
parents: 5178
diff changeset
895 extquant = (level + 3) & 0x3;
04bbac6e28df modify msmpeg4 functions to generate VC1 compatible block layer bitstream
benoit
parents: 5178
diff changeset
896 code = ((level+3)>>2);
04bbac6e28df modify msmpeg4 functions to generate VC1 compatible block layer bitstream
benoit
parents: 5178
diff changeset
897 } else if( s->qscale == 2 ) {
04bbac6e28df modify msmpeg4 functions to generate VC1 compatible block layer bitstream
benoit
parents: 5178
diff changeset
898 extquant = (level + 1) & 0x1;
04bbac6e28df modify msmpeg4 functions to generate VC1 compatible block layer bitstream
benoit
parents: 5178
diff changeset
899 code = ((level+1)>>1);
04bbac6e28df modify msmpeg4 functions to generate VC1 compatible block layer bitstream
benoit
parents: 5178
diff changeset
900 }
04bbac6e28df modify msmpeg4 functions to generate VC1 compatible block layer bitstream
benoit
parents: 5178
diff changeset
901 }
0
986e461dc072 Initial revision
glantau
parents:
diff changeset
902
310
49e73229a5e6 msmpeg4v2 encoding
michaelni
parents: 309
diff changeset
903 if (s->dc_table_index == 0) {
49e73229a5e6 msmpeg4v2 encoding
michaelni
parents: 309
diff changeset
904 if (n < 4) {
2465
5565203c95ee use dc tables from msmpeg4 instead of duplicating them patch by anonymous
michael
parents: 2464
diff changeset
905 put_bits(&s->pb, ff_table0_dc_lum[code][1], ff_table0_dc_lum[code][0]);
310
49e73229a5e6 msmpeg4v2 encoding
michaelni
parents: 309
diff changeset
906 } else {
2465
5565203c95ee use dc tables from msmpeg4 instead of duplicating them patch by anonymous
michael
parents: 2464
diff changeset
907 put_bits(&s->pb, ff_table0_dc_chroma[code][1], ff_table0_dc_chroma[code][0]);
310
49e73229a5e6 msmpeg4v2 encoding
michaelni
parents: 309
diff changeset
908 }
0
986e461dc072 Initial revision
glantau
parents:
diff changeset
909 } else {
310
49e73229a5e6 msmpeg4v2 encoding
michaelni
parents: 309
diff changeset
910 if (n < 4) {
2465
5565203c95ee use dc tables from msmpeg4 instead of duplicating them patch by anonymous
michael
parents: 2464
diff changeset
911 put_bits(&s->pb, ff_table1_dc_lum[code][1], ff_table1_dc_lum[code][0]);
310
49e73229a5e6 msmpeg4v2 encoding
michaelni
parents: 309
diff changeset
912 } else {
2465
5565203c95ee use dc tables from msmpeg4 instead of duplicating them patch by anonymous
michael
parents: 2464
diff changeset
913 put_bits(&s->pb, ff_table1_dc_chroma[code][1], ff_table1_dc_chroma[code][0]);
310
49e73229a5e6 msmpeg4v2 encoding
michaelni
parents: 309
diff changeset
914 }
0
986e461dc072 Initial revision
glantau
parents:
diff changeset
915 }
2967
ef2149182f1c COSMETICS: Remove all trailing whitespace.
diego
parents: 2846
diff changeset
916
5179
04bbac6e28df modify msmpeg4 functions to generate VC1 compatible block layer bitstream
benoit
parents: 5178
diff changeset
917 if(s->msmpeg4_version>=6 && s->qscale<=2)
04bbac6e28df modify msmpeg4 functions to generate VC1 compatible block layer bitstream
benoit
parents: 5178
diff changeset
918 extrabits = 3 - s->qscale;
04bbac6e28df modify msmpeg4 functions to generate VC1 compatible block layer bitstream
benoit
parents: 5178
diff changeset
919
310
49e73229a5e6 msmpeg4v2 encoding
michaelni
parents: 309
diff changeset
920 if (code == DC_MAX)
5179
04bbac6e28df modify msmpeg4 functions to generate VC1 compatible block layer bitstream
benoit
parents: 5178
diff changeset
921 put_bits(&s->pb, 8 + extrabits, level);
04bbac6e28df modify msmpeg4 functions to generate VC1 compatible block layer bitstream
benoit
parents: 5178
diff changeset
922 else if(extrabits > 0)//== VC1 && s->qscale<=2
04bbac6e28df modify msmpeg4 functions to generate VC1 compatible block layer bitstream
benoit
parents: 5178
diff changeset
923 put_bits(&s->pb, extrabits, extquant);
2967
ef2149182f1c COSMETICS: Remove all trailing whitespace.
diego
parents: 2846
diff changeset
924
310
49e73229a5e6 msmpeg4v2 encoding
michaelni
parents: 309
diff changeset
925 if (level != 0) {
49e73229a5e6 msmpeg4v2 encoding
michaelni
parents: 309
diff changeset
926 put_bits(&s->pb, 1, sign);
49e73229a5e6 msmpeg4v2 encoding
michaelni
parents: 309
diff changeset
927 }
0
986e461dc072 Initial revision
glantau
parents:
diff changeset
928 }
986e461dc072 Initial revision
glantau
parents:
diff changeset
929 }
986e461dc072 Initial revision
glantau
parents:
diff changeset
930
986e461dc072 Initial revision
glantau
parents:
diff changeset
931 /* Encoding of a block. Very similar to MPEG4 except for a different
986e461dc072 Initial revision
glantau
parents:
diff changeset
932 escape coding (same as H263) and more vlc tables.
986e461dc072 Initial revision
glantau
parents:
diff changeset
933 */
5178
b215d5a5fa9a static (inline) X => ff_X
benoit
parents: 5129
diff changeset
934 void ff_msmpeg4_encode_block(MpegEncContext * s, DCTELEM * block, int n)
0
986e461dc072 Initial revision
glantau
parents:
diff changeset
935 {
986e461dc072 Initial revision
glantau
parents:
diff changeset
936 int level, run, last, i, j, last_index;
986e461dc072 Initial revision
glantau
parents:
diff changeset
937 int last_non_zero, sign, slevel;
986e461dc072 Initial revision
glantau
parents:
diff changeset
938 int code, run_diff, dc_pred_dir;
986e461dc072 Initial revision
glantau
parents:
diff changeset
939 const RLTable *rl;
1064
b32afefe7d33 * UINTX -> uintx_t INTX -> intx_t
kabi
parents: 1063
diff changeset
940 const uint8_t *scantable;
0
986e461dc072 Initial revision
glantau
parents:
diff changeset
941
986e461dc072 Initial revision
glantau
parents:
diff changeset
942 if (s->mb_intra) {
986e461dc072 Initial revision
glantau
parents:
diff changeset
943 msmpeg4_encode_dc(s, block[0], n, &dc_pred_dir);
986e461dc072 Initial revision
glantau
parents:
diff changeset
944 i = 1;
986e461dc072 Initial revision
glantau
parents:
diff changeset
945 if (n < 4) {
986e461dc072 Initial revision
glantau
parents:
diff changeset
946 rl = &rl_table[s->rl_table_index];
986e461dc072 Initial revision
glantau
parents:
diff changeset
947 } else {
986e461dc072 Initial revision
glantau
parents:
diff changeset
948 rl = &rl_table[3 + s->rl_chroma_table_index];
986e461dc072 Initial revision
glantau
parents:
diff changeset
949 }
5496
f966fc154841 make wmv1 and wmv2 playable with M$ DMO decoder
michael
parents: 5214
diff changeset
950 run_diff = s->msmpeg4_version>=4;
706
e65798d228ea idct permutation cleanup, idct can be selected per context now
michaelni
parents: 601
diff changeset
951 scantable= s->intra_scantable.permutated;
0
986e461dc072 Initial revision
glantau
parents:
diff changeset
952 } else {
986e461dc072 Initial revision
glantau
parents:
diff changeset
953 i = 0;
986e461dc072 Initial revision
glantau
parents:
diff changeset
954 rl = &rl_table[3 + s->rl_table_index];
457
583dcee270d2 msmpeg4v1 decoding
michaelni
parents: 440
diff changeset
955 if(s->msmpeg4_version<=2)
310
49e73229a5e6 msmpeg4v2 encoding
michaelni
parents: 309
diff changeset
956 run_diff = 0;
49e73229a5e6 msmpeg4v2 encoding
michaelni
parents: 309
diff changeset
957 else
49e73229a5e6 msmpeg4v2 encoding
michaelni
parents: 309
diff changeset
958 run_diff = 1;
706
e65798d228ea idct permutation cleanup, idct can be selected per context now
michaelni
parents: 601
diff changeset
959 scantable= s->inter_scantable.permutated;
0
986e461dc072 Initial revision
glantau
parents:
diff changeset
960 }
986e461dc072 Initial revision
glantau
parents:
diff changeset
961
499
8b7a54d58549 wmv1 support
michaelni
parents: 483
diff changeset
962 /* recalculate block_last_index for M$ wmv1 */
5179
04bbac6e28df modify msmpeg4 functions to generate VC1 compatible block layer bitstream
benoit
parents: 5178
diff changeset
963 if(s->msmpeg4_version>=4 && s->msmpeg4_version<6 && s->block_last_index[n]>0){
499
8b7a54d58549 wmv1 support
michaelni
parents: 483
diff changeset
964 for(last_index=63; last_index>=0; last_index--){
8b7a54d58549 wmv1 support
michaelni
parents: 483
diff changeset
965 if(block[scantable[last_index]]) break;
8b7a54d58549 wmv1 support
michaelni
parents: 483
diff changeset
966 }
745
25d7fb7c89be better/cleaner error resilience (done in a 2nd pass after decoding)
michaelni
parents: 743
diff changeset
967 s->block_last_index[n]= last_index;
499
8b7a54d58549 wmv1 support
michaelni
parents: 483
diff changeset
968 }else
8b7a54d58549 wmv1 support
michaelni
parents: 483
diff changeset
969 last_index = s->block_last_index[n];
0
986e461dc072 Initial revision
glantau
parents:
diff changeset
970 /* AC coefs */
986e461dc072 Initial revision
glantau
parents:
diff changeset
971 last_non_zero = i - 1;
986e461dc072 Initial revision
glantau
parents:
diff changeset
972 for (; i <= last_index; i++) {
2979
bfabfdf9ce55 COSMETICS: tabs --> spaces, some prettyprinting
diego
parents: 2967
diff changeset
973 j = scantable[i];
bfabfdf9ce55 COSMETICS: tabs --> spaces, some prettyprinting
diego
parents: 2967
diff changeset
974 level = block[j];
bfabfdf9ce55 COSMETICS: tabs --> spaces, some prettyprinting
diego
parents: 2967
diff changeset
975 if (level) {
bfabfdf9ce55 COSMETICS: tabs --> spaces, some prettyprinting
diego
parents: 2967
diff changeset
976 run = i - last_non_zero - 1;
bfabfdf9ce55 COSMETICS: tabs --> spaces, some prettyprinting
diego
parents: 2967
diff changeset
977 last = (i == last_index);
bfabfdf9ce55 COSMETICS: tabs --> spaces, some prettyprinting
diego
parents: 2967
diff changeset
978 sign = 0;
bfabfdf9ce55 COSMETICS: tabs --> spaces, some prettyprinting
diego
parents: 2967
diff changeset
979 slevel = level;
bfabfdf9ce55 COSMETICS: tabs --> spaces, some prettyprinting
diego
parents: 2967
diff changeset
980 if (level < 0) {
bfabfdf9ce55 COSMETICS: tabs --> spaces, some prettyprinting
diego
parents: 2967
diff changeset
981 sign = 1;
bfabfdf9ce55 COSMETICS: tabs --> spaces, some prettyprinting
diego
parents: 2967
diff changeset
982 level = -level;
bfabfdf9ce55 COSMETICS: tabs --> spaces, some prettyprinting
diego
parents: 2967
diff changeset
983 }
601
76e9b51cccda faster vlc table selection
michaelni
parents: 596
diff changeset
984
499
8b7a54d58549 wmv1 support
michaelni
parents: 483
diff changeset
985 if(level<=MAX_LEVEL && run<=MAX_RUN){
8b7a54d58549 wmv1 support
michaelni
parents: 483
diff changeset
986 s->ac_stats[s->mb_intra][n>3][level][run][last]++;
8b7a54d58549 wmv1 support
michaelni
parents: 483
diff changeset
987 }
8b7a54d58549 wmv1 support
michaelni
parents: 483
diff changeset
988 #if 0
8b7a54d58549 wmv1 support
michaelni
parents: 483
diff changeset
989 else
8b7a54d58549 wmv1 support
michaelni
parents: 483
diff changeset
990 s->ac_stats[s->mb_intra][n>3][40][63][0]++; //esc3 like
8b7a54d58549 wmv1 support
michaelni
parents: 483
diff changeset
991 #endif
0
986e461dc072 Initial revision
glantau
parents:
diff changeset
992 code = get_rl_index(rl, last, run, level);
986e461dc072 Initial revision
glantau
parents:
diff changeset
993 put_bits(&s->pb, rl->table_vlc[code][1], rl->table_vlc[code][0]);
986e461dc072 Initial revision
glantau
parents:
diff changeset
994 if (code == rl->n) {
986e461dc072 Initial revision
glantau
parents:
diff changeset
995 int level1, run1;
986e461dc072 Initial revision
glantau
parents:
diff changeset
996
986e461dc072 Initial revision
glantau
parents:
diff changeset
997 level1 = level - rl->max_level[last][run];
2967
ef2149182f1c COSMETICS: Remove all trailing whitespace.
diego
parents: 2846
diff changeset
998 if (level1 < 1)
0
986e461dc072 Initial revision
glantau
parents:
diff changeset
999 goto esc2;
986e461dc072 Initial revision
glantau
parents:
diff changeset
1000 code = get_rl_index(rl, last, run, level1);
986e461dc072 Initial revision
glantau
parents:
diff changeset
1001 if (code == rl->n) {
986e461dc072 Initial revision
glantau
parents:
diff changeset
1002 esc2:
986e461dc072 Initial revision
glantau
parents:
diff changeset
1003 put_bits(&s->pb, 1, 0);
986e461dc072 Initial revision
glantau
parents:
diff changeset
1004 if (level > MAX_LEVEL)
986e461dc072 Initial revision
glantau
parents:
diff changeset
1005 goto esc3;
986e461dc072 Initial revision
glantau
parents:
diff changeset
1006 run1 = run - rl->max_run[last][level] - run_diff;
986e461dc072 Initial revision
glantau
parents:
diff changeset
1007 if (run1 < 0)
986e461dc072 Initial revision
glantau
parents:
diff changeset
1008 goto esc3;
5496
f966fc154841 make wmv1 and wmv2 playable with M$ DMO decoder
michael
parents: 5214
diff changeset
1009 code = get_rl_index(rl, last, run1+1, level);
f966fc154841 make wmv1 and wmv2 playable with M$ DMO decoder
michael
parents: 5214
diff changeset
1010 if (s->msmpeg4_version == 4 && code == rl->n)
f966fc154841 make wmv1 and wmv2 playable with M$ DMO decoder
michael
parents: 5214
diff changeset
1011 goto esc3;
0
986e461dc072 Initial revision
glantau
parents:
diff changeset
1012 code = get_rl_index(rl, last, run1, level);
986e461dc072 Initial revision
glantau
parents:
diff changeset
1013 if (code == rl->n) {
986e461dc072 Initial revision
glantau
parents:
diff changeset
1014 esc3:
986e461dc072 Initial revision
glantau
parents:
diff changeset
1015 /* third escape */
986e461dc072 Initial revision
glantau
parents:
diff changeset
1016 put_bits(&s->pb, 1, 0);
986e461dc072 Initial revision
glantau
parents:
diff changeset
1017 put_bits(&s->pb, 1, last);
936
caa77cd960c0 qpel encoding
michaelni
parents: 903
diff changeset
1018 if(s->msmpeg4_version>=4){
499
8b7a54d58549 wmv1 support
michaelni
parents: 483
diff changeset
1019 if(s->esc3_level_length==0){
8b7a54d58549 wmv1 support
michaelni
parents: 483
diff changeset
1020 s->esc3_level_length=8;
8b7a54d58549 wmv1 support
michaelni
parents: 483
diff changeset
1021 s->esc3_run_length= 6;
5179
04bbac6e28df modify msmpeg4 functions to generate VC1 compatible block layer bitstream
benoit
parents: 5178
diff changeset
1022 //ESCLVLSZ + ESCRUNSZ
499
8b7a54d58549 wmv1 support
michaelni
parents: 483
diff changeset
1023 if(s->qscale<8)
5179
04bbac6e28df modify msmpeg4 functions to generate VC1 compatible block layer bitstream
benoit
parents: 5178
diff changeset
1024 put_bits(&s->pb, 6 + (s->msmpeg4_version>=6), 3);
499
8b7a54d58549 wmv1 support
michaelni
parents: 483
diff changeset
1025 else
8b7a54d58549 wmv1 support
michaelni
parents: 483
diff changeset
1026 put_bits(&s->pb, 8, 3);
8b7a54d58549 wmv1 support
michaelni
parents: 483
diff changeset
1027 }
8b7a54d58549 wmv1 support
michaelni
parents: 483
diff changeset
1028 put_bits(&s->pb, s->esc3_run_length, run);
8b7a54d58549 wmv1 support
michaelni
parents: 483
diff changeset
1029 put_bits(&s->pb, 1, sign);
8b7a54d58549 wmv1 support
michaelni
parents: 483
diff changeset
1030 put_bits(&s->pb, s->esc3_level_length, level);
8b7a54d58549 wmv1 support
michaelni
parents: 483
diff changeset
1031 }else{
8b7a54d58549 wmv1 support
michaelni
parents: 483
diff changeset
1032 put_bits(&s->pb, 6, run);
7260
3ec34b551aae bitstream: move put_sbits() from flacenc.c to bitstream.h and use it
ramiro
parents: 7136
diff changeset
1033 put_sbits(&s->pb, 8, slevel);
499
8b7a54d58549 wmv1 support
michaelni
parents: 483
diff changeset
1034 }
0
986e461dc072 Initial revision
glantau
parents:
diff changeset
1035 } else {
986e461dc072 Initial revision
glantau
parents:
diff changeset
1036 /* second escape */
986e461dc072 Initial revision
glantau
parents:
diff changeset
1037 put_bits(&s->pb, 1, 1);
986e461dc072 Initial revision
glantau
parents:
diff changeset
1038 put_bits(&s->pb, rl->table_vlc[code][1], rl->table_vlc[code][0]);
986e461dc072 Initial revision
glantau
parents:
diff changeset
1039 put_bits(&s->pb, 1, sign);
986e461dc072 Initial revision
glantau
parents:
diff changeset
1040 }
986e461dc072 Initial revision
glantau
parents:
diff changeset
1041 } else {
986e461dc072 Initial revision
glantau
parents:
diff changeset
1042 /* first escape */
986e461dc072 Initial revision
glantau
parents:
diff changeset
1043 put_bits(&s->pb, 1, 1);
986e461dc072 Initial revision
glantau
parents:
diff changeset
1044 put_bits(&s->pb, rl->table_vlc[code][1], rl->table_vlc[code][0]);
986e461dc072 Initial revision
glantau
parents:
diff changeset
1045 put_bits(&s->pb, 1, sign);
986e461dc072 Initial revision
glantau
parents:
diff changeset
1046 }
986e461dc072 Initial revision
glantau
parents:
diff changeset
1047 } else {
986e461dc072 Initial revision
glantau
parents:
diff changeset
1048 put_bits(&s->pb, 1, sign);
986e461dc072 Initial revision
glantau
parents:
diff changeset
1049 }
2979
bfabfdf9ce55 COSMETICS: tabs --> spaces, some prettyprinting
diego
parents: 2967
diff changeset
1050 last_non_zero = i;
bfabfdf9ce55 COSMETICS: tabs --> spaces, some prettyprinting
diego
parents: 2967
diff changeset
1051 }
0
986e461dc072 Initial revision
glantau
parents:
diff changeset
1052 }
986e461dc072 Initial revision
glantau
parents:
diff changeset
1053 }
986e461dc072 Initial revision
glantau
parents:
diff changeset
1054
986e461dc072 Initial revision
glantau
parents:
diff changeset
1055 /****************************************/
986e461dc072 Initial revision
glantau
parents:
diff changeset
1056 /* decoding stuff */
986e461dc072 Initial revision
glantau
parents:
diff changeset
1057
5882
51fc10d9fdff rename some msmpeg4 symbols and make them non-static
aurel
parents: 5543
diff changeset
1058 VLC ff_mb_non_intra_vlc[4];
307
764aeec1320e msmpeg4v2 decoding (no encoding yet)
michaelni
parents: 300
diff changeset
1059 static VLC v2_dc_lum_vlc;
764aeec1320e msmpeg4v2 decoding (no encoding yet)
michaelni
parents: 300
diff changeset
1060 static VLC v2_dc_chroma_vlc;
764aeec1320e msmpeg4v2 decoding (no encoding yet)
michaelni
parents: 300
diff changeset
1061 static VLC v2_intra_cbpc_vlc;
764aeec1320e msmpeg4v2 decoding (no encoding yet)
michaelni
parents: 300
diff changeset
1062 static VLC v2_mb_type_vlc;
764aeec1320e msmpeg4v2 decoding (no encoding yet)
michaelni
parents: 300
diff changeset
1063 static VLC v2_mv_vlc;
5882
51fc10d9fdff rename some msmpeg4 symbols and make them non-static
aurel
parents: 5543
diff changeset
1064 VLC ff_inter_intra_vlc;
307
764aeec1320e msmpeg4v2 decoding (no encoding yet)
michaelni
parents: 300
diff changeset
1065
10751
74e8feb81c6d cosmetics: Reorder functions to avoid forward declarations.
diego
parents: 10750
diff changeset
1066 /* This is identical to h263 except that its range is multiplied by 2. */
74e8feb81c6d cosmetics: Reorder functions to avoid forward declarations.
diego
parents: 10750
diff changeset
1067 static int msmpeg4v2_decode_motion(MpegEncContext * s, int pred, int f_code)
307
764aeec1320e msmpeg4v2 decoding (no encoding yet)
michaelni
parents: 300
diff changeset
1068 {
10751
74e8feb81c6d cosmetics: Reorder functions to avoid forward declarations.
diego
parents: 10750
diff changeset
1069 int code, val, sign, shift;
74e8feb81c6d cosmetics: Reorder functions to avoid forward declarations.
diego
parents: 10750
diff changeset
1070
74e8feb81c6d cosmetics: Reorder functions to avoid forward declarations.
diego
parents: 10750
diff changeset
1071 code = get_vlc2(&s->gb, v2_mv_vlc.table, V2_MV_VLC_BITS, 2);
74e8feb81c6d cosmetics: Reorder functions to avoid forward declarations.
diego
parents: 10750
diff changeset
1072 // printf("MV code %d at %d %d pred: %d\n", code, s->mb_x,s->mb_y, pred);
74e8feb81c6d cosmetics: Reorder functions to avoid forward declarations.
diego
parents: 10750
diff changeset
1073 if (code < 0)
74e8feb81c6d cosmetics: Reorder functions to avoid forward declarations.
diego
parents: 10750
diff changeset
1074 return 0xffff;
74e8feb81c6d cosmetics: Reorder functions to avoid forward declarations.
diego
parents: 10750
diff changeset
1075
74e8feb81c6d cosmetics: Reorder functions to avoid forward declarations.
diego
parents: 10750
diff changeset
1076 if (code == 0)
74e8feb81c6d cosmetics: Reorder functions to avoid forward declarations.
diego
parents: 10750
diff changeset
1077 return pred;
74e8feb81c6d cosmetics: Reorder functions to avoid forward declarations.
diego
parents: 10750
diff changeset
1078 sign = get_bits1(&s->gb);
74e8feb81c6d cosmetics: Reorder functions to avoid forward declarations.
diego
parents: 10750
diff changeset
1079 shift = f_code - 1;
74e8feb81c6d cosmetics: Reorder functions to avoid forward declarations.
diego
parents: 10750
diff changeset
1080 val = code;
74e8feb81c6d cosmetics: Reorder functions to avoid forward declarations.
diego
parents: 10750
diff changeset
1081 if (shift) {
74e8feb81c6d cosmetics: Reorder functions to avoid forward declarations.
diego
parents: 10750
diff changeset
1082 val = (val - 1) << shift;
74e8feb81c6d cosmetics: Reorder functions to avoid forward declarations.
diego
parents: 10750
diff changeset
1083 val |= get_bits(&s->gb, shift);
74e8feb81c6d cosmetics: Reorder functions to avoid forward declarations.
diego
parents: 10750
diff changeset
1084 val++;
74e8feb81c6d cosmetics: Reorder functions to avoid forward declarations.
diego
parents: 10750
diff changeset
1085 }
74e8feb81c6d cosmetics: Reorder functions to avoid forward declarations.
diego
parents: 10750
diff changeset
1086 if (sign)
74e8feb81c6d cosmetics: Reorder functions to avoid forward declarations.
diego
parents: 10750
diff changeset
1087 val = -val;
74e8feb81c6d cosmetics: Reorder functions to avoid forward declarations.
diego
parents: 10750
diff changeset
1088
74e8feb81c6d cosmetics: Reorder functions to avoid forward declarations.
diego
parents: 10750
diff changeset
1089 val += pred;
74e8feb81c6d cosmetics: Reorder functions to avoid forward declarations.
diego
parents: 10750
diff changeset
1090 if (val <= -64)
74e8feb81c6d cosmetics: Reorder functions to avoid forward declarations.
diego
parents: 10750
diff changeset
1091 val += 64;
74e8feb81c6d cosmetics: Reorder functions to avoid forward declarations.
diego
parents: 10750
diff changeset
1092 else if (val >= 64)
74e8feb81c6d cosmetics: Reorder functions to avoid forward declarations.
diego
parents: 10750
diff changeset
1093 val -= 64;
74e8feb81c6d cosmetics: Reorder functions to avoid forward declarations.
diego
parents: 10750
diff changeset
1094
74e8feb81c6d cosmetics: Reorder functions to avoid forward declarations.
diego
parents: 10750
diff changeset
1095 return val;
74e8feb81c6d cosmetics: Reorder functions to avoid forward declarations.
diego
parents: 10750
diff changeset
1096 }
74e8feb81c6d cosmetics: Reorder functions to avoid forward declarations.
diego
parents: 10750
diff changeset
1097
74e8feb81c6d cosmetics: Reorder functions to avoid forward declarations.
diego
parents: 10750
diff changeset
1098 static int msmpeg4v12_decode_mb(MpegEncContext *s, DCTELEM block[6][64])
74e8feb81c6d cosmetics: Reorder functions to avoid forward declarations.
diego
parents: 10750
diff changeset
1099 {
74e8feb81c6d cosmetics: Reorder functions to avoid forward declarations.
diego
parents: 10750
diff changeset
1100 int cbp, code, i;
307
764aeec1320e msmpeg4v2 decoding (no encoding yet)
michaelni
parents: 300
diff changeset
1101
10751
74e8feb81c6d cosmetics: Reorder functions to avoid forward declarations.
diego
parents: 10750
diff changeset
1102 if (s->pict_type == FF_P_TYPE) {
74e8feb81c6d cosmetics: Reorder functions to avoid forward declarations.
diego
parents: 10750
diff changeset
1103 if (s->use_skip_mb_code) {
74e8feb81c6d cosmetics: Reorder functions to avoid forward declarations.
diego
parents: 10750
diff changeset
1104 if (get_bits1(&s->gb)) {
74e8feb81c6d cosmetics: Reorder functions to avoid forward declarations.
diego
parents: 10750
diff changeset
1105 /* skip mb */
74e8feb81c6d cosmetics: Reorder functions to avoid forward declarations.
diego
parents: 10750
diff changeset
1106 s->mb_intra = 0;
74e8feb81c6d cosmetics: Reorder functions to avoid forward declarations.
diego
parents: 10750
diff changeset
1107 for(i=0;i<6;i++)
74e8feb81c6d cosmetics: Reorder functions to avoid forward declarations.
diego
parents: 10750
diff changeset
1108 s->block_last_index[i] = -1;
74e8feb81c6d cosmetics: Reorder functions to avoid forward declarations.
diego
parents: 10750
diff changeset
1109 s->mv_dir = MV_DIR_FORWARD;
74e8feb81c6d cosmetics: Reorder functions to avoid forward declarations.
diego
parents: 10750
diff changeset
1110 s->mv_type = MV_TYPE_16X16;
74e8feb81c6d cosmetics: Reorder functions to avoid forward declarations.
diego
parents: 10750
diff changeset
1111 s->mv[0][0][0] = 0;
74e8feb81c6d cosmetics: Reorder functions to avoid forward declarations.
diego
parents: 10750
diff changeset
1112 s->mv[0][0][1] = 0;
74e8feb81c6d cosmetics: Reorder functions to avoid forward declarations.
diego
parents: 10750
diff changeset
1113 s->mb_skipped = 1;
74e8feb81c6d cosmetics: Reorder functions to avoid forward declarations.
diego
parents: 10750
diff changeset
1114 return 0;
307
764aeec1320e msmpeg4v2 decoding (no encoding yet)
michaelni
parents: 300
diff changeset
1115 }
10751
74e8feb81c6d cosmetics: Reorder functions to avoid forward declarations.
diego
parents: 10750
diff changeset
1116 }
74e8feb81c6d cosmetics: Reorder functions to avoid forward declarations.
diego
parents: 10750
diff changeset
1117
74e8feb81c6d cosmetics: Reorder functions to avoid forward declarations.
diego
parents: 10750
diff changeset
1118 if(s->msmpeg4_version==2)
74e8feb81c6d cosmetics: Reorder functions to avoid forward declarations.
diego
parents: 10750
diff changeset
1119 code = get_vlc2(&s->gb, v2_mb_type_vlc.table, V2_MB_TYPE_VLC_BITS, 1);
74e8feb81c6d cosmetics: Reorder functions to avoid forward declarations.
diego
parents: 10750
diff changeset
1120 else
10821
030e30b050e4 Use h263 tables in msmpeg4v1 dont duplicate them halfway.
michael
parents: 10818
diff changeset
1121 code = get_vlc2(&s->gb, ff_h263_inter_MCBPC_vlc.table, INTER_MCBPC_VLC_BITS, 2);
10751
74e8feb81c6d cosmetics: Reorder functions to avoid forward declarations.
diego
parents: 10750
diff changeset
1122 if(code<0 || code>7){
74e8feb81c6d cosmetics: Reorder functions to avoid forward declarations.
diego
parents: 10750
diff changeset
1123 av_log(s->avctx, AV_LOG_ERROR, "cbpc %d invalid at %d %d\n", code, s->mb_x, s->mb_y);
74e8feb81c6d cosmetics: Reorder functions to avoid forward declarations.
diego
parents: 10750
diff changeset
1124 return -1;
74e8feb81c6d cosmetics: Reorder functions to avoid forward declarations.
diego
parents: 10750
diff changeset
1125 }
74e8feb81c6d cosmetics: Reorder functions to avoid forward declarations.
diego
parents: 10750
diff changeset
1126
74e8feb81c6d cosmetics: Reorder functions to avoid forward declarations.
diego
parents: 10750
diff changeset
1127 s->mb_intra = code >>2;
307
764aeec1320e msmpeg4v2 decoding (no encoding yet)
michaelni
parents: 300
diff changeset
1128
10751
74e8feb81c6d cosmetics: Reorder functions to avoid forward declarations.
diego
parents: 10750
diff changeset
1129 cbp = code & 0x3;
74e8feb81c6d cosmetics: Reorder functions to avoid forward declarations.
diego
parents: 10750
diff changeset
1130 } else {
74e8feb81c6d cosmetics: Reorder functions to avoid forward declarations.
diego
parents: 10750
diff changeset
1131 s->mb_intra = 1;
74e8feb81c6d cosmetics: Reorder functions to avoid forward declarations.
diego
parents: 10750
diff changeset
1132 if(s->msmpeg4_version==2)
74e8feb81c6d cosmetics: Reorder functions to avoid forward declarations.
diego
parents: 10750
diff changeset
1133 cbp= get_vlc2(&s->gb, v2_intra_cbpc_vlc.table, V2_INTRA_CBPC_VLC_BITS, 1);
74e8feb81c6d cosmetics: Reorder functions to avoid forward declarations.
diego
parents: 10750
diff changeset
1134 else
10821
030e30b050e4 Use h263 tables in msmpeg4v1 dont duplicate them halfway.
michael
parents: 10818
diff changeset
1135 cbp= get_vlc2(&s->gb, ff_h263_intra_MCBPC_vlc.table, INTRA_MCBPC_VLC_BITS, 1);
10751
74e8feb81c6d cosmetics: Reorder functions to avoid forward declarations.
diego
parents: 10750
diff changeset
1136 if(cbp<0 || cbp>3){
74e8feb81c6d cosmetics: Reorder functions to avoid forward declarations.
diego
parents: 10750
diff changeset
1137 av_log(s->avctx, AV_LOG_ERROR, "cbpc %d invalid at %d %d\n", cbp, s->mb_x, s->mb_y);
74e8feb81c6d cosmetics: Reorder functions to avoid forward declarations.
diego
parents: 10750
diff changeset
1138 return -1;
74e8feb81c6d cosmetics: Reorder functions to avoid forward declarations.
diego
parents: 10750
diff changeset
1139 }
74e8feb81c6d cosmetics: Reorder functions to avoid forward declarations.
diego
parents: 10750
diff changeset
1140 }
307
764aeec1320e msmpeg4v2 decoding (no encoding yet)
michaelni
parents: 300
diff changeset
1141
10751
74e8feb81c6d cosmetics: Reorder functions to avoid forward declarations.
diego
parents: 10750
diff changeset
1142 if (!s->mb_intra) {
74e8feb81c6d cosmetics: Reorder functions to avoid forward declarations.
diego
parents: 10750
diff changeset
1143 int mx, my, cbpy;
74e8feb81c6d cosmetics: Reorder functions to avoid forward declarations.
diego
parents: 10750
diff changeset
1144
10818
514dc1c87b2e Rename most non static h263 tables so their name contains h263.
michael
parents: 10816
diff changeset
1145 cbpy= get_vlc2(&s->gb, ff_h263_cbpy_vlc.table, CBPY_VLC_BITS, 1);
10751
74e8feb81c6d cosmetics: Reorder functions to avoid forward declarations.
diego
parents: 10750
diff changeset
1146 if(cbpy<0){
74e8feb81c6d cosmetics: Reorder functions to avoid forward declarations.
diego
parents: 10750
diff changeset
1147 av_log(s->avctx, AV_LOG_ERROR, "cbpy %d invalid at %d %d\n", cbp, s->mb_x, s->mb_y);
74e8feb81c6d cosmetics: Reorder functions to avoid forward declarations.
diego
parents: 10750
diff changeset
1148 return -1;
74e8feb81c6d cosmetics: Reorder functions to avoid forward declarations.
diego
parents: 10750
diff changeset
1149 }
74e8feb81c6d cosmetics: Reorder functions to avoid forward declarations.
diego
parents: 10750
diff changeset
1150
74e8feb81c6d cosmetics: Reorder functions to avoid forward declarations.
diego
parents: 10750
diff changeset
1151 cbp|= cbpy<<2;
74e8feb81c6d cosmetics: Reorder functions to avoid forward declarations.
diego
parents: 10750
diff changeset
1152 if(s->msmpeg4_version==1 || (cbp&3) != 3) cbp^= 0x3C;
74e8feb81c6d cosmetics: Reorder functions to avoid forward declarations.
diego
parents: 10750
diff changeset
1153
74e8feb81c6d cosmetics: Reorder functions to avoid forward declarations.
diego
parents: 10750
diff changeset
1154 h263_pred_motion(s, 0, 0, &mx, &my);
74e8feb81c6d cosmetics: Reorder functions to avoid forward declarations.
diego
parents: 10750
diff changeset
1155 mx= msmpeg4v2_decode_motion(s, mx, 1);
74e8feb81c6d cosmetics: Reorder functions to avoid forward declarations.
diego
parents: 10750
diff changeset
1156 my= msmpeg4v2_decode_motion(s, my, 1);
307
764aeec1320e msmpeg4v2 decoding (no encoding yet)
michaelni
parents: 300
diff changeset
1157
10751
74e8feb81c6d cosmetics: Reorder functions to avoid forward declarations.
diego
parents: 10750
diff changeset
1158 s->mv_dir = MV_DIR_FORWARD;
74e8feb81c6d cosmetics: Reorder functions to avoid forward declarations.
diego
parents: 10750
diff changeset
1159 s->mv_type = MV_TYPE_16X16;
74e8feb81c6d cosmetics: Reorder functions to avoid forward declarations.
diego
parents: 10750
diff changeset
1160 s->mv[0][0][0] = mx;
74e8feb81c6d cosmetics: Reorder functions to avoid forward declarations.
diego
parents: 10750
diff changeset
1161 s->mv[0][0][1] = my;
74e8feb81c6d cosmetics: Reorder functions to avoid forward declarations.
diego
parents: 10750
diff changeset
1162 } else {
74e8feb81c6d cosmetics: Reorder functions to avoid forward declarations.
diego
parents: 10750
diff changeset
1163 if(s->msmpeg4_version==2){
74e8feb81c6d cosmetics: Reorder functions to avoid forward declarations.
diego
parents: 10750
diff changeset
1164 s->ac_pred = get_bits1(&s->gb);
10818
514dc1c87b2e Rename most non static h263 tables so their name contains h263.
michael
parents: 10816
diff changeset
1165 cbp|= get_vlc2(&s->gb, ff_h263_cbpy_vlc.table, CBPY_VLC_BITS, 1)<<2; //FIXME check errors
10751
74e8feb81c6d cosmetics: Reorder functions to avoid forward declarations.
diego
parents: 10750
diff changeset
1166 } else{
74e8feb81c6d cosmetics: Reorder functions to avoid forward declarations.
diego
parents: 10750
diff changeset
1167 s->ac_pred = 0;
10818
514dc1c87b2e Rename most non static h263 tables so their name contains h263.
michael
parents: 10816
diff changeset
1168 cbp|= get_vlc2(&s->gb, ff_h263_cbpy_vlc.table, CBPY_VLC_BITS, 1)<<2; //FIXME check errors
10751
74e8feb81c6d cosmetics: Reorder functions to avoid forward declarations.
diego
parents: 10750
diff changeset
1169 if(s->pict_type==FF_P_TYPE) cbp^=0x3C;
74e8feb81c6d cosmetics: Reorder functions to avoid forward declarations.
diego
parents: 10750
diff changeset
1170 }
74e8feb81c6d cosmetics: Reorder functions to avoid forward declarations.
diego
parents: 10750
diff changeset
1171 }
74e8feb81c6d cosmetics: Reorder functions to avoid forward declarations.
diego
parents: 10750
diff changeset
1172
74e8feb81c6d cosmetics: Reorder functions to avoid forward declarations.
diego
parents: 10750
diff changeset
1173 s->dsp.clear_blocks(s->block[0]);
74e8feb81c6d cosmetics: Reorder functions to avoid forward declarations.
diego
parents: 10750
diff changeset
1174 for (i = 0; i < 6; i++) {
74e8feb81c6d cosmetics: Reorder functions to avoid forward declarations.
diego
parents: 10750
diff changeset
1175 if (ff_msmpeg4_decode_block(s, block[i], i, (cbp >> (5 - i)) & 1, NULL) < 0)
74e8feb81c6d cosmetics: Reorder functions to avoid forward declarations.
diego
parents: 10750
diff changeset
1176 {
74e8feb81c6d cosmetics: Reorder functions to avoid forward declarations.
diego
parents: 10750
diff changeset
1177 av_log(s->avctx, AV_LOG_ERROR, "\nerror while decoding block: %d x %d (%d)\n", s->mb_x, s->mb_y, i);
74e8feb81c6d cosmetics: Reorder functions to avoid forward declarations.
diego
parents: 10750
diff changeset
1178 return -1;
74e8feb81c6d cosmetics: Reorder functions to avoid forward declarations.
diego
parents: 10750
diff changeset
1179 }
74e8feb81c6d cosmetics: Reorder functions to avoid forward declarations.
diego
parents: 10750
diff changeset
1180 }
74e8feb81c6d cosmetics: Reorder functions to avoid forward declarations.
diego
parents: 10750
diff changeset
1181 return 0;
74e8feb81c6d cosmetics: Reorder functions to avoid forward declarations.
diego
parents: 10750
diff changeset
1182 }
74e8feb81c6d cosmetics: Reorder functions to avoid forward declarations.
diego
parents: 10750
diff changeset
1183
74e8feb81c6d cosmetics: Reorder functions to avoid forward declarations.
diego
parents: 10750
diff changeset
1184 static int msmpeg4v34_decode_mb(MpegEncContext *s, DCTELEM block[6][64])
74e8feb81c6d cosmetics: Reorder functions to avoid forward declarations.
diego
parents: 10750
diff changeset
1185 {
74e8feb81c6d cosmetics: Reorder functions to avoid forward declarations.
diego
parents: 10750
diff changeset
1186 int cbp, code, i;
74e8feb81c6d cosmetics: Reorder functions to avoid forward declarations.
diego
parents: 10750
diff changeset
1187 uint8_t *coded_val;
74e8feb81c6d cosmetics: Reorder functions to avoid forward declarations.
diego
parents: 10750
diff changeset
1188 uint32_t * const mb_type_ptr= &s->current_picture.mb_type[ s->mb_x + s->mb_y*s->mb_stride ];
74e8feb81c6d cosmetics: Reorder functions to avoid forward declarations.
diego
parents: 10750
diff changeset
1189
74e8feb81c6d cosmetics: Reorder functions to avoid forward declarations.
diego
parents: 10750
diff changeset
1190 if (s->pict_type == FF_P_TYPE) {
74e8feb81c6d cosmetics: Reorder functions to avoid forward declarations.
diego
parents: 10750
diff changeset
1191 if (s->use_skip_mb_code) {
74e8feb81c6d cosmetics: Reorder functions to avoid forward declarations.
diego
parents: 10750
diff changeset
1192 if (get_bits1(&s->gb)) {
74e8feb81c6d cosmetics: Reorder functions to avoid forward declarations.
diego
parents: 10750
diff changeset
1193 /* skip mb */
74e8feb81c6d cosmetics: Reorder functions to avoid forward declarations.
diego
parents: 10750
diff changeset
1194 s->mb_intra = 0;
74e8feb81c6d cosmetics: Reorder functions to avoid forward declarations.
diego
parents: 10750
diff changeset
1195 for(i=0;i<6;i++)
74e8feb81c6d cosmetics: Reorder functions to avoid forward declarations.
diego
parents: 10750
diff changeset
1196 s->block_last_index[i] = -1;
74e8feb81c6d cosmetics: Reorder functions to avoid forward declarations.
diego
parents: 10750
diff changeset
1197 s->mv_dir = MV_DIR_FORWARD;
74e8feb81c6d cosmetics: Reorder functions to avoid forward declarations.
diego
parents: 10750
diff changeset
1198 s->mv_type = MV_TYPE_16X16;
74e8feb81c6d cosmetics: Reorder functions to avoid forward declarations.
diego
parents: 10750
diff changeset
1199 s->mv[0][0][0] = 0;
74e8feb81c6d cosmetics: Reorder functions to avoid forward declarations.
diego
parents: 10750
diff changeset
1200 s->mv[0][0][1] = 0;
74e8feb81c6d cosmetics: Reorder functions to avoid forward declarations.
diego
parents: 10750
diff changeset
1201 s->mb_skipped = 1;
74e8feb81c6d cosmetics: Reorder functions to avoid forward declarations.
diego
parents: 10750
diff changeset
1202 *mb_type_ptr = MB_TYPE_SKIP | MB_TYPE_L0 | MB_TYPE_16x16;
74e8feb81c6d cosmetics: Reorder functions to avoid forward declarations.
diego
parents: 10750
diff changeset
1203
74e8feb81c6d cosmetics: Reorder functions to avoid forward declarations.
diego
parents: 10750
diff changeset
1204 return 0;
307
764aeec1320e msmpeg4v2 decoding (no encoding yet)
michaelni
parents: 300
diff changeset
1205 }
10751
74e8feb81c6d cosmetics: Reorder functions to avoid forward declarations.
diego
parents: 10750
diff changeset
1206 }
74e8feb81c6d cosmetics: Reorder functions to avoid forward declarations.
diego
parents: 10750
diff changeset
1207
74e8feb81c6d cosmetics: Reorder functions to avoid forward declarations.
diego
parents: 10750
diff changeset
1208 code = get_vlc2(&s->gb, ff_mb_non_intra_vlc[DEFAULT_INTER_INDEX].table, MB_NON_INTRA_VLC_BITS, 3);
74e8feb81c6d cosmetics: Reorder functions to avoid forward declarations.
diego
parents: 10750
diff changeset
1209 if (code < 0)
74e8feb81c6d cosmetics: Reorder functions to avoid forward declarations.
diego
parents: 10750
diff changeset
1210 return -1;
74e8feb81c6d cosmetics: Reorder functions to avoid forward declarations.
diego
parents: 10750
diff changeset
1211 //s->mb_intra = (code & 0x40) ? 0 : 1;
74e8feb81c6d cosmetics: Reorder functions to avoid forward declarations.
diego
parents: 10750
diff changeset
1212 s->mb_intra = (~code & 0x40) >> 6;
307
764aeec1320e msmpeg4v2 decoding (no encoding yet)
michaelni
parents: 300
diff changeset
1213
10751
74e8feb81c6d cosmetics: Reorder functions to avoid forward declarations.
diego
parents: 10750
diff changeset
1214 cbp = code & 0x3f;
74e8feb81c6d cosmetics: Reorder functions to avoid forward declarations.
diego
parents: 10750
diff changeset
1215 } else {
74e8feb81c6d cosmetics: Reorder functions to avoid forward declarations.
diego
parents: 10750
diff changeset
1216 s->mb_intra = 1;
74e8feb81c6d cosmetics: Reorder functions to avoid forward declarations.
diego
parents: 10750
diff changeset
1217 code = get_vlc2(&s->gb, ff_msmp4_mb_i_vlc.table, MB_INTRA_VLC_BITS, 2);
74e8feb81c6d cosmetics: Reorder functions to avoid forward declarations.
diego
parents: 10750
diff changeset
1218 if (code < 0)
74e8feb81c6d cosmetics: Reorder functions to avoid forward declarations.
diego
parents: 10750
diff changeset
1219 return -1;
74e8feb81c6d cosmetics: Reorder functions to avoid forward declarations.
diego
parents: 10750
diff changeset
1220 /* predict coded block pattern */
74e8feb81c6d cosmetics: Reorder functions to avoid forward declarations.
diego
parents: 10750
diff changeset
1221 cbp = 0;
74e8feb81c6d cosmetics: Reorder functions to avoid forward declarations.
diego
parents: 10750
diff changeset
1222 for(i=0;i<6;i++) {
74e8feb81c6d cosmetics: Reorder functions to avoid forward declarations.
diego
parents: 10750
diff changeset
1223 int val = ((code >> (5 - i)) & 1);
74e8feb81c6d cosmetics: Reorder functions to avoid forward declarations.
diego
parents: 10750
diff changeset
1224 if (i < 4) {
74e8feb81c6d cosmetics: Reorder functions to avoid forward declarations.
diego
parents: 10750
diff changeset
1225 int pred = ff_msmpeg4_coded_block_pred(s, i, &coded_val);
74e8feb81c6d cosmetics: Reorder functions to avoid forward declarations.
diego
parents: 10750
diff changeset
1226 val = val ^ pred;
74e8feb81c6d cosmetics: Reorder functions to avoid forward declarations.
diego
parents: 10750
diff changeset
1227 *coded_val = val;
74e8feb81c6d cosmetics: Reorder functions to avoid forward declarations.
diego
parents: 10750
diff changeset
1228 }
74e8feb81c6d cosmetics: Reorder functions to avoid forward declarations.
diego
parents: 10750
diff changeset
1229 cbp |= val << (5 - i);
74e8feb81c6d cosmetics: Reorder functions to avoid forward declarations.
diego
parents: 10750
diff changeset
1230 }
74e8feb81c6d cosmetics: Reorder functions to avoid forward declarations.
diego
parents: 10750
diff changeset
1231 }
2967
ef2149182f1c COSMETICS: Remove all trailing whitespace.
diego
parents: 2846
diff changeset
1232
10751
74e8feb81c6d cosmetics: Reorder functions to avoid forward declarations.
diego
parents: 10750
diff changeset
1233 if (!s->mb_intra) {
74e8feb81c6d cosmetics: Reorder functions to avoid forward declarations.
diego
parents: 10750
diff changeset
1234 int mx, my;
74e8feb81c6d cosmetics: Reorder functions to avoid forward declarations.
diego
parents: 10750
diff changeset
1235 //printf("P at %d %d\n", s->mb_x, s->mb_y);
74e8feb81c6d cosmetics: Reorder functions to avoid forward declarations.
diego
parents: 10750
diff changeset
1236 if(s->per_mb_rl_table && cbp){
74e8feb81c6d cosmetics: Reorder functions to avoid forward declarations.
diego
parents: 10750
diff changeset
1237 s->rl_table_index = decode012(&s->gb);
74e8feb81c6d cosmetics: Reorder functions to avoid forward declarations.
diego
parents: 10750
diff changeset
1238 s->rl_chroma_table_index = s->rl_table_index;
74e8feb81c6d cosmetics: Reorder functions to avoid forward declarations.
diego
parents: 10750
diff changeset
1239 }
74e8feb81c6d cosmetics: Reorder functions to avoid forward declarations.
diego
parents: 10750
diff changeset
1240 h263_pred_motion(s, 0, 0, &mx, &my);
74e8feb81c6d cosmetics: Reorder functions to avoid forward declarations.
diego
parents: 10750
diff changeset
1241 if (ff_msmpeg4_decode_motion(s, &mx, &my) < 0)
74e8feb81c6d cosmetics: Reorder functions to avoid forward declarations.
diego
parents: 10750
diff changeset
1242 return -1;
74e8feb81c6d cosmetics: Reorder functions to avoid forward declarations.
diego
parents: 10750
diff changeset
1243 s->mv_dir = MV_DIR_FORWARD;
74e8feb81c6d cosmetics: Reorder functions to avoid forward declarations.
diego
parents: 10750
diff changeset
1244 s->mv_type = MV_TYPE_16X16;
74e8feb81c6d cosmetics: Reorder functions to avoid forward declarations.
diego
parents: 10750
diff changeset
1245 s->mv[0][0][0] = mx;
74e8feb81c6d cosmetics: Reorder functions to avoid forward declarations.
diego
parents: 10750
diff changeset
1246 s->mv[0][0][1] = my;
74e8feb81c6d cosmetics: Reorder functions to avoid forward declarations.
diego
parents: 10750
diff changeset
1247 *mb_type_ptr = MB_TYPE_L0 | MB_TYPE_16x16;
74e8feb81c6d cosmetics: Reorder functions to avoid forward declarations.
diego
parents: 10750
diff changeset
1248 } else {
74e8feb81c6d cosmetics: Reorder functions to avoid forward declarations.
diego
parents: 10750
diff changeset
1249 //printf("I at %d %d %d %06X\n", s->mb_x, s->mb_y, ((cbp&3)? 1 : 0) +((cbp&0x3C)? 2 : 0), show_bits(&s->gb, 24));
74e8feb81c6d cosmetics: Reorder functions to avoid forward declarations.
diego
parents: 10750
diff changeset
1250 s->ac_pred = get_bits1(&s->gb);
74e8feb81c6d cosmetics: Reorder functions to avoid forward declarations.
diego
parents: 10750
diff changeset
1251 *mb_type_ptr = MB_TYPE_INTRA;
74e8feb81c6d cosmetics: Reorder functions to avoid forward declarations.
diego
parents: 10750
diff changeset
1252 if(s->inter_intra_pred){
74e8feb81c6d cosmetics: Reorder functions to avoid forward declarations.
diego
parents: 10750
diff changeset
1253 s->h263_aic_dir= get_vlc2(&s->gb, ff_inter_intra_vlc.table, INTER_INTRA_VLC_BITS, 1);
74e8feb81c6d cosmetics: Reorder functions to avoid forward declarations.
diego
parents: 10750
diff changeset
1254 // printf("%d%d %d %d/", s->ac_pred, s->h263_aic_dir, s->mb_x, s->mb_y);
74e8feb81c6d cosmetics: Reorder functions to avoid forward declarations.
diego
parents: 10750
diff changeset
1255 }
74e8feb81c6d cosmetics: Reorder functions to avoid forward declarations.
diego
parents: 10750
diff changeset
1256 if(s->per_mb_rl_table && cbp){
74e8feb81c6d cosmetics: Reorder functions to avoid forward declarations.
diego
parents: 10750
diff changeset
1257 s->rl_table_index = decode012(&s->gb);
74e8feb81c6d cosmetics: Reorder functions to avoid forward declarations.
diego
parents: 10750
diff changeset
1258 s->rl_chroma_table_index = s->rl_table_index;
74e8feb81c6d cosmetics: Reorder functions to avoid forward declarations.
diego
parents: 10750
diff changeset
1259 }
74e8feb81c6d cosmetics: Reorder functions to avoid forward declarations.
diego
parents: 10750
diff changeset
1260 }
307
764aeec1320e msmpeg4v2 decoding (no encoding yet)
michaelni
parents: 300
diff changeset
1261
10751
74e8feb81c6d cosmetics: Reorder functions to avoid forward declarations.
diego
parents: 10750
diff changeset
1262 s->dsp.clear_blocks(s->block[0]);
74e8feb81c6d cosmetics: Reorder functions to avoid forward declarations.
diego
parents: 10750
diff changeset
1263 for (i = 0; i < 6; i++) {
74e8feb81c6d cosmetics: Reorder functions to avoid forward declarations.
diego
parents: 10750
diff changeset
1264 if (ff_msmpeg4_decode_block(s, block[i], i, (cbp >> (5 - i)) & 1, NULL) < 0)
74e8feb81c6d cosmetics: Reorder functions to avoid forward declarations.
diego
parents: 10750
diff changeset
1265 {
74e8feb81c6d cosmetics: Reorder functions to avoid forward declarations.
diego
parents: 10750
diff changeset
1266 av_log(s->avctx, AV_LOG_ERROR, "\nerror while decoding block: %d x %d (%d)\n", s->mb_x, s->mb_y, i);
74e8feb81c6d cosmetics: Reorder functions to avoid forward declarations.
diego
parents: 10750
diff changeset
1267 return -1;
307
764aeec1320e msmpeg4v2 decoding (no encoding yet)
michaelni
parents: 300
diff changeset
1268 }
10751
74e8feb81c6d cosmetics: Reorder functions to avoid forward declarations.
diego
parents: 10750
diff changeset
1269 }
74e8feb81c6d cosmetics: Reorder functions to avoid forward declarations.
diego
parents: 10750
diff changeset
1270
74e8feb81c6d cosmetics: Reorder functions to avoid forward declarations.
diego
parents: 10750
diff changeset
1271 return 0;
307
764aeec1320e msmpeg4v2 decoding (no encoding yet)
michaelni
parents: 300
diff changeset
1272 }
0
986e461dc072 Initial revision
glantau
parents:
diff changeset
1273
986e461dc072 Initial revision
glantau
parents:
diff changeset
1274 /* init all vlc decoding tables */
10822
9ccc13d1144d Move AVCodecs from h263dec.c to msmpeg4.c and disentangle init decode init.
michael
parents: 10821
diff changeset
1275 av_cold int ff_msmpeg4_decode_init(AVCodecContext *avctx)
0
986e461dc072 Initial revision
glantau
parents:
diff changeset
1276 {
10822
9ccc13d1144d Move AVCodecs from h263dec.c to msmpeg4.c and disentangle init decode init.
michael
parents: 10821
diff changeset
1277 MpegEncContext *s = avctx->priv_data;
483
97da217aed7f fixed multiple allocation bug
bellard
parents: 468
diff changeset
1278 static int done = 0;
0
986e461dc072 Initial revision
glantau
parents:
diff changeset
1279 int i;
986e461dc072 Initial revision
glantau
parents:
diff changeset
1280 MVTable *mv;
986e461dc072 Initial revision
glantau
parents:
diff changeset
1281
10822
9ccc13d1144d Move AVCodecs from h263dec.c to msmpeg4.c and disentangle init decode init.
michael
parents: 10821
diff changeset
1282 ff_h263_decode_init(avctx);
9ccc13d1144d Move AVCodecs from h263dec.c to msmpeg4.c and disentangle init decode init.
michael
parents: 10821
diff changeset
1283
499
8b7a54d58549 wmv1 support
michaelni
parents: 483
diff changeset
1284 common_init(s);
483
97da217aed7f fixed multiple allocation bug
bellard
parents: 468
diff changeset
1285
97da217aed7f fixed multiple allocation bug
bellard
parents: 468
diff changeset
1286 if (!done) {
97da217aed7f fixed multiple allocation bug
bellard
parents: 468
diff changeset
1287 done = 1;
0
986e461dc072 Initial revision
glantau
parents:
diff changeset
1288
483
97da217aed7f fixed multiple allocation bug
bellard
parents: 468
diff changeset
1289 for(i=0;i<NB_RL_TABLES;i++) {
4668
1f1a0e67b961 kill av_mallocz_static() calls in init_rl()
michael
parents: 4174
diff changeset
1290 init_rl(&rl_table[i], static_rl_table_store[i]);
483
97da217aed7f fixed multiple allocation bug
bellard
parents: 468
diff changeset
1291 }
6940
778ecab25dd8 Change init_vlc_rl() so it does not use *alloc_static() anymore.
michael
parents: 6481
diff changeset
1292 INIT_VLC_RL(rl_table[0], 642);
778ecab25dd8 Change init_vlc_rl() so it does not use *alloc_static() anymore.
michael
parents: 6481
diff changeset
1293 INIT_VLC_RL(rl_table[1], 1104);
778ecab25dd8 Change init_vlc_rl() so it does not use *alloc_static() anymore.
michael
parents: 6481
diff changeset
1294 INIT_VLC_RL(rl_table[2], 554);
778ecab25dd8 Change init_vlc_rl() so it does not use *alloc_static() anymore.
michael
parents: 6481
diff changeset
1295 INIT_VLC_RL(rl_table[3], 940);
778ecab25dd8 Change init_vlc_rl() so it does not use *alloc_static() anymore.
michael
parents: 6481
diff changeset
1296 INIT_VLC_RL(rl_table[4], 962);
778ecab25dd8 Change init_vlc_rl() so it does not use *alloc_static() anymore.
michael
parents: 6481
diff changeset
1297 INIT_VLC_RL(rl_table[5], 554);
483
97da217aed7f fixed multiple allocation bug
bellard
parents: 468
diff changeset
1298
9396
bb9f74aa37ee Get rid of INIT_VLC_USE_STATIC in msmpeg4
michael
parents: 9393
diff changeset
1299 mv = &mv_tables[0];
bb9f74aa37ee Get rid of INIT_VLC_USE_STATIC in msmpeg4
michael
parents: 9393
diff changeset
1300 INIT_VLC_STATIC(&mv->vlc, MV_VLC_BITS, mv->n + 1,
bb9f74aa37ee Get rid of INIT_VLC_USE_STATIC in msmpeg4
michael
parents: 9393
diff changeset
1301 mv->table_mv_bits, 1, 1,
bb9f74aa37ee Get rid of INIT_VLC_USE_STATIC in msmpeg4
michael
parents: 9393
diff changeset
1302 mv->table_mv_code, 2, 2, 3714);
bb9f74aa37ee Get rid of INIT_VLC_USE_STATIC in msmpeg4
michael
parents: 9393
diff changeset
1303 mv = &mv_tables[1];
bb9f74aa37ee Get rid of INIT_VLC_USE_STATIC in msmpeg4
michael
parents: 9393
diff changeset
1304 INIT_VLC_STATIC(&mv->vlc, MV_VLC_BITS, mv->n + 1,
bb9f74aa37ee Get rid of INIT_VLC_USE_STATIC in msmpeg4
michael
parents: 9393
diff changeset
1305 mv->table_mv_bits, 1, 1,
bb9f74aa37ee Get rid of INIT_VLC_USE_STATIC in msmpeg4
michael
parents: 9393
diff changeset
1306 mv->table_mv_code, 2, 2, 2694);
bb9f74aa37ee Get rid of INIT_VLC_USE_STATIC in msmpeg4
michael
parents: 9393
diff changeset
1307
bb9f74aa37ee Get rid of INIT_VLC_USE_STATIC in msmpeg4
michael
parents: 9393
diff changeset
1308 INIT_VLC_STATIC(&ff_msmp4_dc_luma_vlc[0], DC_VLC_BITS, 120,
2465
5565203c95ee use dc tables from msmpeg4 instead of duplicating them patch by anonymous
michael
parents: 2464
diff changeset
1309 &ff_table0_dc_lum[0][1], 8, 4,
9396
bb9f74aa37ee Get rid of INIT_VLC_USE_STATIC in msmpeg4
michael
parents: 9393
diff changeset
1310 &ff_table0_dc_lum[0][0], 8, 4, 1158);
bb9f74aa37ee Get rid of INIT_VLC_USE_STATIC in msmpeg4
michael
parents: 9393
diff changeset
1311 INIT_VLC_STATIC(&ff_msmp4_dc_chroma_vlc[0], DC_VLC_BITS, 120,
2465
5565203c95ee use dc tables from msmpeg4 instead of duplicating them patch by anonymous
michael
parents: 2464
diff changeset
1312 &ff_table0_dc_chroma[0][1], 8, 4,
9396
bb9f74aa37ee Get rid of INIT_VLC_USE_STATIC in msmpeg4
michael
parents: 9393
diff changeset
1313 &ff_table0_dc_chroma[0][0], 8, 4, 1118);
bb9f74aa37ee Get rid of INIT_VLC_USE_STATIC in msmpeg4
michael
parents: 9393
diff changeset
1314 INIT_VLC_STATIC(&ff_msmp4_dc_luma_vlc[1], DC_VLC_BITS, 120,
2465
5565203c95ee use dc tables from msmpeg4 instead of duplicating them patch by anonymous
michael
parents: 2464
diff changeset
1315 &ff_table1_dc_lum[0][1], 8, 4,
9396
bb9f74aa37ee Get rid of INIT_VLC_USE_STATIC in msmpeg4
michael
parents: 9393
diff changeset
1316 &ff_table1_dc_lum[0][0], 8, 4, 1476);
bb9f74aa37ee Get rid of INIT_VLC_USE_STATIC in msmpeg4
michael
parents: 9393
diff changeset
1317 INIT_VLC_STATIC(&ff_msmp4_dc_chroma_vlc[1], DC_VLC_BITS, 120,
2465
5565203c95ee use dc tables from msmpeg4 instead of duplicating them patch by anonymous
michael
parents: 2464
diff changeset
1318 &ff_table1_dc_chroma[0][1], 8, 4,
9396
bb9f74aa37ee Get rid of INIT_VLC_USE_STATIC in msmpeg4
michael
parents: 9393
diff changeset
1319 &ff_table1_dc_chroma[0][0], 8, 4, 1216);
2967
ef2149182f1c COSMETICS: Remove all trailing whitespace.
diego
parents: 2846
diff changeset
1320
9396
bb9f74aa37ee Get rid of INIT_VLC_USE_STATIC in msmpeg4
michael
parents: 9393
diff changeset
1321 INIT_VLC_STATIC(&v2_dc_lum_vlc, DC_VLC_BITS, 512,
483
97da217aed7f fixed multiple allocation bug
bellard
parents: 468
diff changeset
1322 &v2_dc_lum_table[0][1], 8, 4,
9396
bb9f74aa37ee Get rid of INIT_VLC_USE_STATIC in msmpeg4
michael
parents: 9393
diff changeset
1323 &v2_dc_lum_table[0][0], 8, 4, 1472);
bb9f74aa37ee Get rid of INIT_VLC_USE_STATIC in msmpeg4
michael
parents: 9393
diff changeset
1324 INIT_VLC_STATIC(&v2_dc_chroma_vlc, DC_VLC_BITS, 512,
483
97da217aed7f fixed multiple allocation bug
bellard
parents: 468
diff changeset
1325 &v2_dc_chroma_table[0][1], 8, 4,
9396
bb9f74aa37ee Get rid of INIT_VLC_USE_STATIC in msmpeg4
michael
parents: 9393
diff changeset
1326 &v2_dc_chroma_table[0][0], 8, 4, 1506);
2967
ef2149182f1c COSMETICS: Remove all trailing whitespace.
diego
parents: 2846
diff changeset
1327
9396
bb9f74aa37ee Get rid of INIT_VLC_USE_STATIC in msmpeg4
michael
parents: 9393
diff changeset
1328 INIT_VLC_STATIC(&v2_intra_cbpc_vlc, V2_INTRA_CBPC_VLC_BITS, 4,
483
97da217aed7f fixed multiple allocation bug
bellard
parents: 468
diff changeset
1329 &v2_intra_cbpc[0][1], 2, 1,
9396
bb9f74aa37ee Get rid of INIT_VLC_USE_STATIC in msmpeg4
michael
parents: 9393
diff changeset
1330 &v2_intra_cbpc[0][0], 2, 1, 8);
bb9f74aa37ee Get rid of INIT_VLC_USE_STATIC in msmpeg4
michael
parents: 9393
diff changeset
1331 INIT_VLC_STATIC(&v2_mb_type_vlc, V2_MB_TYPE_VLC_BITS, 8,
483
97da217aed7f fixed multiple allocation bug
bellard
parents: 468
diff changeset
1332 &v2_mb_type[0][1], 2, 1,
9396
bb9f74aa37ee Get rid of INIT_VLC_USE_STATIC in msmpeg4
michael
parents: 9393
diff changeset
1333 &v2_mb_type[0][0], 2, 1, 128);
bb9f74aa37ee Get rid of INIT_VLC_USE_STATIC in msmpeg4
michael
parents: 9393
diff changeset
1334 INIT_VLC_STATIC(&v2_mv_vlc, V2_MV_VLC_BITS, 33,
483
97da217aed7f fixed multiple allocation bug
bellard
parents: 468
diff changeset
1335 &mvtab[0][1], 2, 1,
9396
bb9f74aa37ee Get rid of INIT_VLC_USE_STATIC in msmpeg4
michael
parents: 9393
diff changeset
1336 &mvtab[0][0], 2, 1, 538);
0
986e461dc072 Initial revision
glantau
parents:
diff changeset
1337
9396
bb9f74aa37ee Get rid of INIT_VLC_USE_STATIC in msmpeg4
michael
parents: 9393
diff changeset
1338 INIT_VLC_STATIC(&ff_mb_non_intra_vlc[0], MB_NON_INTRA_VLC_BITS, 128,
bb9f74aa37ee Get rid of INIT_VLC_USE_STATIC in msmpeg4
michael
parents: 9393
diff changeset
1339 &wmv2_inter_table[0][0][1], 8, 4,
bb9f74aa37ee Get rid of INIT_VLC_USE_STATIC in msmpeg4
michael
parents: 9393
diff changeset
1340 &wmv2_inter_table[0][0][0], 8, 4, 1636);
bb9f74aa37ee Get rid of INIT_VLC_USE_STATIC in msmpeg4
michael
parents: 9393
diff changeset
1341 INIT_VLC_STATIC(&ff_mb_non_intra_vlc[1], MB_NON_INTRA_VLC_BITS, 128,
bb9f74aa37ee Get rid of INIT_VLC_USE_STATIC in msmpeg4
michael
parents: 9393
diff changeset
1342 &wmv2_inter_table[1][0][1], 8, 4,
bb9f74aa37ee Get rid of INIT_VLC_USE_STATIC in msmpeg4
michael
parents: 9393
diff changeset
1343 &wmv2_inter_table[1][0][0], 8, 4, 2648);
bb9f74aa37ee Get rid of INIT_VLC_USE_STATIC in msmpeg4
michael
parents: 9393
diff changeset
1344 INIT_VLC_STATIC(&ff_mb_non_intra_vlc[2], MB_NON_INTRA_VLC_BITS, 128,
bb9f74aa37ee Get rid of INIT_VLC_USE_STATIC in msmpeg4
michael
parents: 9393
diff changeset
1345 &wmv2_inter_table[2][0][1], 8, 4,
bb9f74aa37ee Get rid of INIT_VLC_USE_STATIC in msmpeg4
michael
parents: 9393
diff changeset
1346 &wmv2_inter_table[2][0][0], 8, 4, 1532);
bb9f74aa37ee Get rid of INIT_VLC_USE_STATIC in msmpeg4
michael
parents: 9393
diff changeset
1347 INIT_VLC_STATIC(&ff_mb_non_intra_vlc[3], MB_NON_INTRA_VLC_BITS, 128,
bb9f74aa37ee Get rid of INIT_VLC_USE_STATIC in msmpeg4
michael
parents: 9393
diff changeset
1348 &wmv2_inter_table[3][0][1], 8, 4,
bb9f74aa37ee Get rid of INIT_VLC_USE_STATIC in msmpeg4
michael
parents: 9393
diff changeset
1349 &wmv2_inter_table[3][0][0], 8, 4, 2488);
2967
ef2149182f1c COSMETICS: Remove all trailing whitespace.
diego
parents: 2846
diff changeset
1350
9396
bb9f74aa37ee Get rid of INIT_VLC_USE_STATIC in msmpeg4
michael
parents: 9393
diff changeset
1351 INIT_VLC_STATIC(&ff_msmp4_mb_i_vlc, MB_INTRA_VLC_BITS, 64,
bb9f74aa37ee Get rid of INIT_VLC_USE_STATIC in msmpeg4
michael
parents: 9393
diff changeset
1352 &ff_msmp4_mb_i_table[0][1], 4, 2,
bb9f74aa37ee Get rid of INIT_VLC_USE_STATIC in msmpeg4
michael
parents: 9393
diff changeset
1353 &ff_msmp4_mb_i_table[0][0], 4, 2, 536);
bb9f74aa37ee Get rid of INIT_VLC_USE_STATIC in msmpeg4
michael
parents: 9393
diff changeset
1354
bb9f74aa37ee Get rid of INIT_VLC_USE_STATIC in msmpeg4
michael
parents: 9393
diff changeset
1355 INIT_VLC_STATIC(&ff_inter_intra_vlc, INTER_INTRA_VLC_BITS, 4,
519
55b4e2248a45 wmv1 slice_height != mb_height support
michaelni
parents: 501
diff changeset
1356 &table_inter_intra[0][1], 2, 1,
9396
bb9f74aa37ee Get rid of INIT_VLC_USE_STATIC in msmpeg4
michael
parents: 9393
diff changeset
1357 &table_inter_intra[0][0], 2, 1, 8);
483
97da217aed7f fixed multiple allocation bug
bellard
parents: 468
diff changeset
1358 }
2967
ef2149182f1c COSMETICS: Remove all trailing whitespace.
diego
parents: 2846
diff changeset
1359
745
25d7fb7c89be better/cleaner error resilience (done in a 2nd pass after decoding)
michaelni
parents: 743
diff changeset
1360 switch(s->msmpeg4_version){
25d7fb7c89be better/cleaner error resilience (done in a 2nd pass after decoding)
michaelni
parents: 743
diff changeset
1361 case 1:
25d7fb7c89be better/cleaner error resilience (done in a 2nd pass after decoding)
michaelni
parents: 743
diff changeset
1362 case 2:
25d7fb7c89be better/cleaner error resilience (done in a 2nd pass after decoding)
michaelni
parents: 743
diff changeset
1363 s->decode_mb= msmpeg4v12_decode_mb;
25d7fb7c89be better/cleaner error resilience (done in a 2nd pass after decoding)
michaelni
parents: 743
diff changeset
1364 break;
25d7fb7c89be better/cleaner error resilience (done in a 2nd pass after decoding)
michaelni
parents: 743
diff changeset
1365 case 3:
25d7fb7c89be better/cleaner error resilience (done in a 2nd pass after decoding)
michaelni
parents: 743
diff changeset
1366 case 4:
25d7fb7c89be better/cleaner error resilience (done in a 2nd pass after decoding)
michaelni
parents: 743
diff changeset
1367 s->decode_mb= msmpeg4v34_decode_mb;
25d7fb7c89be better/cleaner error resilience (done in a 2nd pass after decoding)
michaelni
parents: 743
diff changeset
1368 break;
936
caa77cd960c0 qpel encoding
michaelni
parents: 903
diff changeset
1369 case 5:
8596
68e959302527 replace all occurrence of ENABLE_ by the corresponding CONFIG_, HAVE_ or ARCH_
aurel
parents: 8590
diff changeset
1370 if (CONFIG_WMV2_DECODER)
5885
5c19c955c62b cosmetics: indentation
aurel
parents: 5884
diff changeset
1371 s->decode_mb= ff_wmv2_decode_mb;
2474
81a9f883a17a In that patch:
michael
parents: 2465
diff changeset
1372 case 6:
3359
87187ebe2c28 Rename VC9 to VC1 as there is no such thing as VC9
kostya
parents: 3177
diff changeset
1373 //FIXME + TODO VC1 decode mb
936
caa77cd960c0 qpel encoding
michaelni
parents: 903
diff changeset
1374 break;
745
25d7fb7c89be better/cleaner error resilience (done in a 2nd pass after decoding)
michaelni
parents: 743
diff changeset
1375 }
2967
ef2149182f1c COSMETICS: Remove all trailing whitespace.
diego
parents: 2846
diff changeset
1376
5127
4dbe6578f811 misc spelling fixes
diego
parents: 5098
diff changeset
1377 s->slice_height= s->mb_height; //to avoid 1/0 if the first frame is not a keyframe
2967
ef2149182f1c COSMETICS: Remove all trailing whitespace.
diego
parents: 2846
diff changeset
1378
0
986e461dc072 Initial revision
glantau
parents:
diff changeset
1379 return 0;
986e461dc072 Initial revision
glantau
parents:
diff changeset
1380 }
986e461dc072 Initial revision
glantau
parents:
diff changeset
1381
307
764aeec1320e msmpeg4v2 decoding (no encoding yet)
michaelni
parents: 300
diff changeset
1382 int msmpeg4_decode_picture_header(MpegEncContext * s)
300
d874359e58f1 msmpeg4v2 header parser & some dump bits code behind #if 0
michaelni
parents: 299
diff changeset
1383 {
499
8b7a54d58549 wmv1 support
michaelni
parents: 483
diff changeset
1384 int code;
300
d874359e58f1 msmpeg4v2 header parser & some dump bits code behind #if 0
michaelni
parents: 299
diff changeset
1385
311
ac677a84d5df wmv1 header parser (unfinished)
michaelni
parents: 310
diff changeset
1386 #if 0
ac677a84d5df wmv1 header parser (unfinished)
michaelni
parents: 310
diff changeset
1387 {
ac677a84d5df wmv1 header parser (unfinished)
michaelni
parents: 310
diff changeset
1388 int i;
1025
1f9afd8b9131 GetBitContext.size is allways multiplied by 8 -> use size_in_bits to avoid useless *8 in a few inner loops
michaelni
parents: 983
diff changeset
1389 for(i=0; i<s->gb.size_in_bits; i++)
3177
8d1b2cc2a75b (f)printf --> av_log conversion
diego
parents: 3036
diff changeset
1390 av_log(s->avctx, AV_LOG_DEBUG, "%d", get_bits1(&s->gb));
311
ac677a84d5df wmv1 header parser (unfinished)
michaelni
parents: 310
diff changeset
1391 // get_bits1(&s->gb);
3177
8d1b2cc2a75b (f)printf --> av_log conversion
diego
parents: 3036
diff changeset
1392 av_log(s->avctx, AV_LOG_DEBUG, "END\n");
311
ac677a84d5df wmv1 header parser (unfinished)
michaelni
parents: 310
diff changeset
1393 return -1;
ac677a84d5df wmv1 header parser (unfinished)
michaelni
parents: 310
diff changeset
1394 }
ac677a84d5df wmv1 header parser (unfinished)
michaelni
parents: 310
diff changeset
1395 #endif
457
583dcee270d2 msmpeg4v1 decoding
michaelni
parents: 440
diff changeset
1396
583dcee270d2 msmpeg4v1 decoding
michaelni
parents: 440
diff changeset
1397 if(s->msmpeg4_version==1){
12411
7c9d711a4201 msmpeg4v1: fix undefined behaviour in msmpeg4_decode_picture_header()
mru
parents: 12108
diff changeset
1398 int start_code = get_bits_long(&s->gb, 32);
457
583dcee270d2 msmpeg4v1 decoding
michaelni
parents: 440
diff changeset
1399 if(start_code!=0x00000100){
1598
932d306bf1dc av_log() patch by (Michel Bardiaux <mbardiaux at peaktime dot be>)
michael
parents: 1399
diff changeset
1400 av_log(s->avctx, AV_LOG_ERROR, "invalid startcode\n");
457
583dcee270d2 msmpeg4v1 decoding
michaelni
parents: 440
diff changeset
1401 return -1;
583dcee270d2 msmpeg4v1 decoding
michaelni
parents: 440
diff changeset
1402 }
583dcee270d2 msmpeg4v1 decoding
michaelni
parents: 440
diff changeset
1403
9455
6cb61c6220c3 Get rid of an unused variable, found by the clang static analyzer.
michael
parents: 9396
diff changeset
1404 skip_bits(&s->gb, 5); // frame number */
457
583dcee270d2 msmpeg4v1 decoding
michaelni
parents: 440
diff changeset
1405 }
583dcee270d2 msmpeg4v1 decoding
michaelni
parents: 440
diff changeset
1406
300
d874359e58f1 msmpeg4v2 header parser & some dump bits code behind #if 0
michaelni
parents: 299
diff changeset
1407 s->pict_type = get_bits(&s->gb, 2) + 1;
6481
493dc59d469a add FF_ prefix to all (frame)_TYPE usage
aurel
parents: 6350
diff changeset
1408 if (s->pict_type != FF_I_TYPE &&
493dc59d469a add FF_ prefix to all (frame)_TYPE usage
aurel
parents: 6350
diff changeset
1409 s->pict_type != FF_P_TYPE){
1598
932d306bf1dc av_log() patch by (Michel Bardiaux <mbardiaux at peaktime dot be>)
michael
parents: 1399
diff changeset
1410 av_log(s->avctx, AV_LOG_ERROR, "invalid picture type\n");
300
d874359e58f1 msmpeg4v2 header parser & some dump bits code behind #if 0
michaelni
parents: 299
diff changeset
1411 return -1;
457
583dcee270d2 msmpeg4v1 decoding
michaelni
parents: 440
diff changeset
1412 }
519
55b4e2248a45 wmv1 slice_height != mb_height support
michaelni
parents: 501
diff changeset
1413 #if 0
55b4e2248a45 wmv1 slice_height != mb_height support
michaelni
parents: 501
diff changeset
1414 {
55b4e2248a45 wmv1 slice_height != mb_height support
michaelni
parents: 501
diff changeset
1415 static int had_i=0;
6481
493dc59d469a add FF_ prefix to all (frame)_TYPE usage
aurel
parents: 6350
diff changeset
1416 if(s->pict_type == FF_I_TYPE) had_i=1;
519
55b4e2248a45 wmv1 slice_height != mb_height support
michaelni
parents: 501
diff changeset
1417 if(!had_i) return -1;
55b4e2248a45 wmv1 slice_height != mb_height support
michaelni
parents: 501
diff changeset
1418 }
55b4e2248a45 wmv1 slice_height != mb_height support
michaelni
parents: 501
diff changeset
1419 #endif
1651
ccf7c96a630f h263 modified quantization fix
michael
parents: 1598
diff changeset
1420 s->chroma_qscale= s->qscale = get_bits(&s->gb, 5);
1063
fdeac9642346 check for qscale==0 (fixes 1/0 on one corrupted stream)
michaelni
parents: 1057
diff changeset
1421 if(s->qscale==0){
1598
932d306bf1dc av_log() patch by (Michel Bardiaux <mbardiaux at peaktime dot be>)
michael
parents: 1399
diff changeset
1422 av_log(s->avctx, AV_LOG_ERROR, "invalid qscale\n");
1063
fdeac9642346 check for qscale==0 (fixes 1/0 on one corrupted stream)
michaelni
parents: 1057
diff changeset
1423 return -1;
fdeac9642346 check for qscale==0 (fixes 1/0 on one corrupted stream)
michaelni
parents: 1057
diff changeset
1424 }
300
d874359e58f1 msmpeg4v2 header parser & some dump bits code behind #if 0
michaelni
parents: 299
diff changeset
1425
6481
493dc59d469a add FF_ prefix to all (frame)_TYPE usage
aurel
parents: 6350
diff changeset
1426 if (s->pict_type == FF_I_TYPE) {
2967
ef2149182f1c COSMETICS: Remove all trailing whitespace.
diego
parents: 2846
diff changeset
1427 code = get_bits(&s->gb, 5);
457
583dcee270d2 msmpeg4v1 decoding
michaelni
parents: 440
diff changeset
1428 if(s->msmpeg4_version==1){
583dcee270d2 msmpeg4v1 decoding
michaelni
parents: 440
diff changeset
1429 if(code==0 || code>s->mb_height){
1598
932d306bf1dc av_log() patch by (Michel Bardiaux <mbardiaux at peaktime dot be>)
michael
parents: 1399
diff changeset
1430 av_log(s->avctx, AV_LOG_ERROR, "invalid slice height %d\n", code);
457
583dcee270d2 msmpeg4v1 decoding
michaelni
parents: 440
diff changeset
1431 return -1;
583dcee270d2 msmpeg4v1 decoding
michaelni
parents: 440
diff changeset
1432 }
583dcee270d2 msmpeg4v1 decoding
michaelni
parents: 440
diff changeset
1433
583dcee270d2 msmpeg4v1 decoding
michaelni
parents: 440
diff changeset
1434 s->slice_height = code;
583dcee270d2 msmpeg4v1 decoding
michaelni
parents: 440
diff changeset
1435 }else{
583dcee270d2 msmpeg4v1 decoding
michaelni
parents: 440
diff changeset
1436 /* 0x17: one slice, 0x18: two slices, ... */
519
55b4e2248a45 wmv1 slice_height != mb_height support
michaelni
parents: 501
diff changeset
1437 if (code < 0x17){
1598
932d306bf1dc av_log() patch by (Michel Bardiaux <mbardiaux at peaktime dot be>)
michael
parents: 1399
diff changeset
1438 av_log(s->avctx, AV_LOG_ERROR, "error, slice code was %X\n", code);
457
583dcee270d2 msmpeg4v1 decoding
michaelni
parents: 440
diff changeset
1439 return -1;
519
55b4e2248a45 wmv1 slice_height != mb_height support
michaelni
parents: 501
diff changeset
1440 }
457
583dcee270d2 msmpeg4v1 decoding
michaelni
parents: 440
diff changeset
1441
583dcee270d2 msmpeg4v1 decoding
michaelni
parents: 440
diff changeset
1442 s->slice_height = s->mb_height / (code - 0x16);
583dcee270d2 msmpeg4v1 decoding
michaelni
parents: 440
diff changeset
1443 }
311
ac677a84d5df wmv1 header parser (unfinished)
michaelni
parents: 310
diff changeset
1444
ac677a84d5df wmv1 header parser (unfinished)
michaelni
parents: 310
diff changeset
1445 switch(s->msmpeg4_version){
457
583dcee270d2 msmpeg4v1 decoding
michaelni
parents: 440
diff changeset
1446 case 1:
311
ac677a84d5df wmv1 header parser (unfinished)
michaelni
parents: 310
diff changeset
1447 case 2:
307
764aeec1320e msmpeg4v2 decoding (no encoding yet)
michaelni
parents: 300
diff changeset
1448 s->rl_chroma_table_index = 2;
764aeec1320e msmpeg4v2 decoding (no encoding yet)
michaelni
parents: 300
diff changeset
1449 s->rl_table_index = 2;
300
d874359e58f1 msmpeg4v2 header parser & some dump bits code behind #if 0
michaelni
parents: 299
diff changeset
1450
307
764aeec1320e msmpeg4v2 decoding (no encoding yet)
michaelni
parents: 300
diff changeset
1451 s->dc_table_index = 0; //not used
311
ac677a84d5df wmv1 header parser (unfinished)
michaelni
parents: 310
diff changeset
1452 break;
ac677a84d5df wmv1 header parser (unfinished)
michaelni
parents: 310
diff changeset
1453 case 3:
307
764aeec1320e msmpeg4v2 decoding (no encoding yet)
michaelni
parents: 300
diff changeset
1454 s->rl_chroma_table_index = decode012(&s->gb);
764aeec1320e msmpeg4v2 decoding (no encoding yet)
michaelni
parents: 300
diff changeset
1455 s->rl_table_index = decode012(&s->gb);
0
986e461dc072 Initial revision
glantau
parents:
diff changeset
1456
307
764aeec1320e msmpeg4v2 decoding (no encoding yet)
michaelni
parents: 300
diff changeset
1457 s->dc_table_index = get_bits1(&s->gb);
311
ac677a84d5df wmv1 header parser (unfinished)
michaelni
parents: 310
diff changeset
1458 break;
ac677a84d5df wmv1 header parser (unfinished)
michaelni
parents: 310
diff changeset
1459 case 4:
499
8b7a54d58549 wmv1 support
michaelni
parents: 483
diff changeset
1460 msmpeg4_decode_ext_header(s, (2+5+5+17+7)/8);
8b7a54d58549 wmv1 support
michaelni
parents: 483
diff changeset
1461
578
32c142b10263 fixing bitrate vs. kbitrate in header
michaelni
parents: 563
diff changeset
1462 if(s->bit_rate > MBAC_BITRATE) s->per_mb_rl_table= get_bits1(&s->gb);
32c142b10263 fixing bitrate vs. kbitrate in header
michaelni
parents: 563
diff changeset
1463 else s->per_mb_rl_table= 0;
2967
ef2149182f1c COSMETICS: Remove all trailing whitespace.
diego
parents: 2846
diff changeset
1464
499
8b7a54d58549 wmv1 support
michaelni
parents: 483
diff changeset
1465 if(!s->per_mb_rl_table){
8b7a54d58549 wmv1 support
michaelni
parents: 483
diff changeset
1466 s->rl_chroma_table_index = decode012(&s->gb);
8b7a54d58549 wmv1 support
michaelni
parents: 483
diff changeset
1467 s->rl_table_index = decode012(&s->gb);
311
ac677a84d5df wmv1 header parser (unfinished)
michaelni
parents: 310
diff changeset
1468 }
ac677a84d5df wmv1 header parser (unfinished)
michaelni
parents: 310
diff changeset
1469
499
8b7a54d58549 wmv1 support
michaelni
parents: 483
diff changeset
1470 s->dc_table_index = get_bits1(&s->gb);
519
55b4e2248a45 wmv1 slice_height != mb_height support
michaelni
parents: 501
diff changeset
1471 s->inter_intra_pred= 0;
311
ac677a84d5df wmv1 header parser (unfinished)
michaelni
parents: 310
diff changeset
1472 break;
307
764aeec1320e msmpeg4v2 decoding (no encoding yet)
michaelni
parents: 300
diff changeset
1473 }
0
986e461dc072 Initial revision
glantau
parents:
diff changeset
1474 s->no_rounding = 1;
1388
b5c65adac96a debug stuff
michaelni
parents: 1325
diff changeset
1475 if(s->avctx->debug&FF_DEBUG_PICT_INFO)
2979
bfabfdf9ce55 COSMETICS: tabs --> spaces, some prettyprinting
diego
parents: 2967
diff changeset
1476 av_log(s->avctx, AV_LOG_DEBUG, "qscale:%d rlc:%d rl:%d dc:%d mbrl:%d slice:%d \n",
bfabfdf9ce55 COSMETICS: tabs --> spaces, some prettyprinting
diego
parents: 2967
diff changeset
1477 s->qscale,
bfabfdf9ce55 COSMETICS: tabs --> spaces, some prettyprinting
diego
parents: 2967
diff changeset
1478 s->rl_chroma_table_index,
bfabfdf9ce55 COSMETICS: tabs --> spaces, some prettyprinting
diego
parents: 2967
diff changeset
1479 s->rl_table_index,
bfabfdf9ce55 COSMETICS: tabs --> spaces, some prettyprinting
diego
parents: 2967
diff changeset
1480 s->dc_table_index,
519
55b4e2248a45 wmv1 slice_height != mb_height support
michaelni
parents: 501
diff changeset
1481 s->per_mb_rl_table,
1388
b5c65adac96a debug stuff
michaelni
parents: 1325
diff changeset
1482 s->slice_height);
0
986e461dc072 Initial revision
glantau
parents:
diff changeset
1483 } else {
457
583dcee270d2 msmpeg4v1 decoding
michaelni
parents: 440
diff changeset
1484 switch(s->msmpeg4_version){
583dcee270d2 msmpeg4v1 decoding
michaelni
parents: 440
diff changeset
1485 case 1:
583dcee270d2 msmpeg4v1 decoding
michaelni
parents: 440
diff changeset
1486 case 2:
583dcee270d2 msmpeg4v1 decoding
michaelni
parents: 440
diff changeset
1487 if(s->msmpeg4_version==1)
583dcee270d2 msmpeg4v1 decoding
michaelni
parents: 440
diff changeset
1488 s->use_skip_mb_code = 1;
583dcee270d2 msmpeg4v1 decoding
michaelni
parents: 440
diff changeset
1489 else
583dcee270d2 msmpeg4v1 decoding
michaelni
parents: 440
diff changeset
1490 s->use_skip_mb_code = get_bits1(&s->gb);
307
764aeec1320e msmpeg4v2 decoding (no encoding yet)
michaelni
parents: 300
diff changeset
1491 s->rl_table_index = 2;
764aeec1320e msmpeg4v2 decoding (no encoding yet)
michaelni
parents: 300
diff changeset
1492 s->rl_chroma_table_index = s->rl_table_index;
764aeec1320e msmpeg4v2 decoding (no encoding yet)
michaelni
parents: 300
diff changeset
1493 s->dc_table_index = 0; //not used
764aeec1320e msmpeg4v2 decoding (no encoding yet)
michaelni
parents: 300
diff changeset
1494 s->mv_table_index = 0;
457
583dcee270d2 msmpeg4v1 decoding
michaelni
parents: 440
diff changeset
1495 break;
583dcee270d2 msmpeg4v1 decoding
michaelni
parents: 440
diff changeset
1496 case 3:
583dcee270d2 msmpeg4v1 decoding
michaelni
parents: 440
diff changeset
1497 s->use_skip_mb_code = get_bits1(&s->gb);
307
764aeec1320e msmpeg4v2 decoding (no encoding yet)
michaelni
parents: 300
diff changeset
1498 s->rl_table_index = decode012(&s->gb);
764aeec1320e msmpeg4v2 decoding (no encoding yet)
michaelni
parents: 300
diff changeset
1499 s->rl_chroma_table_index = s->rl_table_index;
0
986e461dc072 Initial revision
glantau
parents:
diff changeset
1500
307
764aeec1320e msmpeg4v2 decoding (no encoding yet)
michaelni
parents: 300
diff changeset
1501 s->dc_table_index = get_bits1(&s->gb);
764aeec1320e msmpeg4v2 decoding (no encoding yet)
michaelni
parents: 300
diff changeset
1502
764aeec1320e msmpeg4v2 decoding (no encoding yet)
michaelni
parents: 300
diff changeset
1503 s->mv_table_index = get_bits1(&s->gb);
457
583dcee270d2 msmpeg4v1 decoding
michaelni
parents: 440
diff changeset
1504 break;
499
8b7a54d58549 wmv1 support
michaelni
parents: 483
diff changeset
1505 case 4:
8b7a54d58549 wmv1 support
michaelni
parents: 483
diff changeset
1506 s->use_skip_mb_code = get_bits1(&s->gb);
519
55b4e2248a45 wmv1 slice_height != mb_height support
michaelni
parents: 501
diff changeset
1507
578
32c142b10263 fixing bitrate vs. kbitrate in header
michaelni
parents: 563
diff changeset
1508 if(s->bit_rate > MBAC_BITRATE) s->per_mb_rl_table= get_bits1(&s->gb);
32c142b10263 fixing bitrate vs. kbitrate in header
michaelni
parents: 563
diff changeset
1509 else s->per_mb_rl_table= 0;
519
55b4e2248a45 wmv1 slice_height != mb_height support
michaelni
parents: 501
diff changeset
1510
499
8b7a54d58549 wmv1 support
michaelni
parents: 483
diff changeset
1511 if(!s->per_mb_rl_table){
8b7a54d58549 wmv1 support
michaelni
parents: 483
diff changeset
1512 s->rl_table_index = decode012(&s->gb);
8b7a54d58549 wmv1 support
michaelni
parents: 483
diff changeset
1513 s->rl_chroma_table_index = s->rl_table_index;
8b7a54d58549 wmv1 support
michaelni
parents: 483
diff changeset
1514 }
8b7a54d58549 wmv1 support
michaelni
parents: 483
diff changeset
1515
8b7a54d58549 wmv1 support
michaelni
parents: 483
diff changeset
1516 s->dc_table_index = get_bits1(&s->gb);
8b7a54d58549 wmv1 support
michaelni
parents: 483
diff changeset
1517
8b7a54d58549 wmv1 support
michaelni
parents: 483
diff changeset
1518 s->mv_table_index = get_bits1(&s->gb);
578
32c142b10263 fixing bitrate vs. kbitrate in header
michaelni
parents: 563
diff changeset
1519 s->inter_intra_pred= (s->width*s->height < 320*240 && s->bit_rate<=II_BITRATE);
499
8b7a54d58549 wmv1 support
michaelni
parents: 483
diff changeset
1520 break;
307
764aeec1320e msmpeg4v2 decoding (no encoding yet)
michaelni
parents: 300
diff changeset
1521 }
2967
ef2149182f1c COSMETICS: Remove all trailing whitespace.
diego
parents: 2846
diff changeset
1522
1388
b5c65adac96a debug stuff
michaelni
parents: 1325
diff changeset
1523 if(s->avctx->debug&FF_DEBUG_PICT_INFO)
2979
bfabfdf9ce55 COSMETICS: tabs --> spaces, some prettyprinting
diego
parents: 2967
diff changeset
1524 av_log(s->avctx, AV_LOG_DEBUG, "skip:%d rl:%d rlc:%d dc:%d mv:%d mbrl:%d qp:%d \n",
bfabfdf9ce55 COSMETICS: tabs --> spaces, some prettyprinting
diego
parents: 2967
diff changeset
1525 s->use_skip_mb_code,
bfabfdf9ce55 COSMETICS: tabs --> spaces, some prettyprinting
diego
parents: 2967
diff changeset
1526 s->rl_table_index,
bfabfdf9ce55 COSMETICS: tabs --> spaces, some prettyprinting
diego
parents: 2967
diff changeset
1527 s->rl_chroma_table_index,
bfabfdf9ce55 COSMETICS: tabs --> spaces, some prettyprinting
diego
parents: 2967
diff changeset
1528 s->dc_table_index,
bfabfdf9ce55 COSMETICS: tabs --> spaces, some prettyprinting
diego
parents: 2967
diff changeset
1529 s->mv_table_index,
519
55b4e2248a45 wmv1 slice_height != mb_height support
michaelni
parents: 501
diff changeset
1530 s->per_mb_rl_table,
1388
b5c65adac96a debug stuff
michaelni
parents: 1325
diff changeset
1531 s->qscale);
b5c65adac96a debug stuff
michaelni
parents: 1325
diff changeset
1532
2979
bfabfdf9ce55 COSMETICS: tabs --> spaces, some prettyprinting
diego
parents: 2967
diff changeset
1533 if(s->flipflop_rounding){
bfabfdf9ce55 COSMETICS: tabs --> spaces, some prettyprinting
diego
parents: 2967
diff changeset
1534 s->no_rounding ^= 1;
bfabfdf9ce55 COSMETICS: tabs --> spaces, some prettyprinting
diego
parents: 2967
diff changeset
1535 }else{
bfabfdf9ce55 COSMETICS: tabs --> spaces, some prettyprinting
diego
parents: 2967
diff changeset
1536 s->no_rounding = 0;
bfabfdf9ce55 COSMETICS: tabs --> spaces, some prettyprinting
diego
parents: 2967
diff changeset
1537 }
0
986e461dc072 Initial revision
glantau
parents:
diff changeset
1538 }
936
caa77cd960c0 qpel encoding
michaelni
parents: 903
diff changeset
1539 //printf("%d %d %d %d %d\n", s->pict_type, s->bit_rate, s->inter_intra_pred, s->width, s->height);
499
8b7a54d58549 wmv1 support
michaelni
parents: 483
diff changeset
1540
8b7a54d58549 wmv1 support
michaelni
parents: 483
diff changeset
1541 s->esc3_level_length= 0;
8b7a54d58549 wmv1 support
michaelni
parents: 483
diff changeset
1542 s->esc3_run_length= 0;
307
764aeec1320e msmpeg4v2 decoding (no encoding yet)
michaelni
parents: 300
diff changeset
1543
0
986e461dc072 Initial revision
glantau
parents:
diff changeset
1544 return 0;
986e461dc072 Initial revision
glantau
parents:
diff changeset
1545 }
986e461dc072 Initial revision
glantau
parents:
diff changeset
1546
208
2eb04d6be309 (commit by michael)
arpi_esp
parents: 204
diff changeset
1547 int msmpeg4_decode_ext_header(MpegEncContext * s, int buf_size)
2eb04d6be309 (commit by michael)
arpi_esp
parents: 204
diff changeset
1548 {
457
583dcee270d2 msmpeg4v1 decoding
michaelni
parents: 440
diff changeset
1549 int left= buf_size*8 - get_bits_count(&s->gb);
583dcee270d2 msmpeg4v1 decoding
michaelni
parents: 440
diff changeset
1550 int length= s->msmpeg4_version>=3 ? 17 : 16;
208
2eb04d6be309 (commit by michael)
arpi_esp
parents: 204
diff changeset
1551 /* the alt_bitstream reader could read over the end so we need to check it */
457
583dcee270d2 msmpeg4v1 decoding
michaelni
parents: 440
diff changeset
1552 if(left>=length && left<length+8)
208
2eb04d6be309 (commit by michael)
arpi_esp
parents: 204
diff changeset
1553 {
251
75091bfc577b fixing msmpeg4 decoding if fps < 16 (i thought it was a indicator for the ext header, its the fps indeed)
michaelni
parents: 246
diff changeset
1554 int fps;
75091bfc577b fixing msmpeg4 decoding if fps < 16 (i thought it was a indicator for the ext header, its the fps indeed)
michaelni
parents: 246
diff changeset
1555
75091bfc577b fixing msmpeg4 decoding if fps < 16 (i thought it was a indicator for the ext header, its the fps indeed)
michaelni
parents: 246
diff changeset
1556 fps= get_bits(&s->gb, 5);
578
32c142b10263 fixing bitrate vs. kbitrate in header
michaelni
parents: 563
diff changeset
1557 s->bit_rate= get_bits(&s->gb, 11)*1024;
457
583dcee270d2 msmpeg4v1 decoding
michaelni
parents: 440
diff changeset
1558 if(s->msmpeg4_version>=3)
583dcee270d2 msmpeg4v1 decoding
michaelni
parents: 440
diff changeset
1559 s->flipflop_rounding= get_bits1(&s->gb);
583dcee270d2 msmpeg4v1 decoding
michaelni
parents: 440
diff changeset
1560 else
583dcee270d2 msmpeg4v1 decoding
michaelni
parents: 440
diff changeset
1561 s->flipflop_rounding= 0;
251
75091bfc577b fixing msmpeg4 decoding if fps < 16 (i thought it was a indicator for the ext header, its the fps indeed)
michaelni
parents: 246
diff changeset
1562
578
32c142b10263 fixing bitrate vs. kbitrate in header
michaelni
parents: 563
diff changeset
1563 // printf("fps:%2d bps:%2d roundingType:%1d\n", fps, s->bit_rate/1024, s->flipflop_rounding);
457
583dcee270d2 msmpeg4v1 decoding
michaelni
parents: 440
diff changeset
1564 }
583dcee270d2 msmpeg4v1 decoding
michaelni
parents: 440
diff changeset
1565 else if(left<length+8)
583dcee270d2 msmpeg4v1 decoding
michaelni
parents: 440
diff changeset
1566 {
583dcee270d2 msmpeg4v1 decoding
michaelni
parents: 440
diff changeset
1567 s->flipflop_rounding= 0;
1399
08f82699fc71 skip ext header missing message for msmpeg4v2
michaelni
parents: 1388
diff changeset
1568 if(s->msmpeg4_version != 2)
1598
932d306bf1dc av_log() patch by (Michel Bardiaux <mbardiaux at peaktime dot be>)
michael
parents: 1399
diff changeset
1569 av_log(s->avctx, AV_LOG_ERROR, "ext header missing, %d left\n", left);
208
2eb04d6be309 (commit by michael)
arpi_esp
parents: 204
diff changeset
1570 }
2eb04d6be309 (commit by michael)
arpi_esp
parents: 204
diff changeset
1571 else
2eb04d6be309 (commit by michael)
arpi_esp
parents: 204
diff changeset
1572 {
1598
932d306bf1dc av_log() patch by (Michel Bardiaux <mbardiaux at peaktime dot be>)
michael
parents: 1399
diff changeset
1573 av_log(s->avctx, AV_LOG_ERROR, "I frame too long, ignoring ext header\n");
208
2eb04d6be309 (commit by michael)
arpi_esp
parents: 204
diff changeset
1574 }
251
75091bfc577b fixing msmpeg4 decoding if fps < 16 (i thought it was a indicator for the ext header, its the fps indeed)
michaelni
parents: 246
diff changeset
1575
208
2eb04d6be309 (commit by michael)
arpi_esp
parents: 204
diff changeset
1576 return 0;
2eb04d6be309 (commit by michael)
arpi_esp
parents: 204
diff changeset
1577 }
2eb04d6be309 (commit by michael)
arpi_esp
parents: 204
diff changeset
1578
10751
74e8feb81c6d cosmetics: Reorder functions to avoid forward declarations.
diego
parents: 10750
diff changeset
1579 static int msmpeg4_decode_dc(MpegEncContext * s, int n, int *dir_ptr)
310
49e73229a5e6 msmpeg4v2 encoding
michaelni
parents: 309
diff changeset
1580 {
10751
74e8feb81c6d cosmetics: Reorder functions to avoid forward declarations.
diego
parents: 10750
diff changeset
1581 int level, pred;
457
583dcee270d2 msmpeg4v1 decoding
michaelni
parents: 440
diff changeset
1582
10751
74e8feb81c6d cosmetics: Reorder functions to avoid forward declarations.
diego
parents: 10750
diff changeset
1583 if(s->msmpeg4_version<=2){
74e8feb81c6d cosmetics: Reorder functions to avoid forward declarations.
diego
parents: 10750
diff changeset
1584 if (n < 4) {
74e8feb81c6d cosmetics: Reorder functions to avoid forward declarations.
diego
parents: 10750
diff changeset
1585 level = get_vlc2(&s->gb, v2_dc_lum_vlc.table, DC_VLC_BITS, 3);
74e8feb81c6d cosmetics: Reorder functions to avoid forward declarations.
diego
parents: 10750
diff changeset
1586 } else {
74e8feb81c6d cosmetics: Reorder functions to avoid forward declarations.
diego
parents: 10750
diff changeset
1587 level = get_vlc2(&s->gb, v2_dc_chroma_vlc.table, DC_VLC_BITS, 3);
307
764aeec1320e msmpeg4v2 decoding (no encoding yet)
michaelni
parents: 300
diff changeset
1588 }
10751
74e8feb81c6d cosmetics: Reorder functions to avoid forward declarations.
diego
parents: 10750
diff changeset
1589 if (level < 0)
457
583dcee270d2 msmpeg4v1 decoding
michaelni
parents: 440
diff changeset
1590 return -1;
10751
74e8feb81c6d cosmetics: Reorder functions to avoid forward declarations.
diego
parents: 10750
diff changeset
1591 level-=256;
74e8feb81c6d cosmetics: Reorder functions to avoid forward declarations.
diego
parents: 10750
diff changeset
1592 }else{ //FIXME optimize use unified tables & index
74e8feb81c6d cosmetics: Reorder functions to avoid forward declarations.
diego
parents: 10750
diff changeset
1593 if (n < 4) {
74e8feb81c6d cosmetics: Reorder functions to avoid forward declarations.
diego
parents: 10750
diff changeset
1594 level = get_vlc2(&s->gb, ff_msmp4_dc_luma_vlc[s->dc_table_index].table, DC_VLC_BITS, 3);
74e8feb81c6d cosmetics: Reorder functions to avoid forward declarations.
diego
parents: 10750
diff changeset
1595 } else {
74e8feb81c6d cosmetics: Reorder functions to avoid forward declarations.
diego
parents: 10750
diff changeset
1596 level = get_vlc2(&s->gb, ff_msmp4_dc_chroma_vlc[s->dc_table_index].table, DC_VLC_BITS, 3);
457
583dcee270d2 msmpeg4v1 decoding
michaelni
parents: 440
diff changeset
1597 }
10751
74e8feb81c6d cosmetics: Reorder functions to avoid forward declarations.
diego
parents: 10750
diff changeset
1598 if (level < 0){
74e8feb81c6d cosmetics: Reorder functions to avoid forward declarations.
diego
parents: 10750
diff changeset
1599 av_log(s->avctx, AV_LOG_ERROR, "illegal dc vlc\n");
457
583dcee270d2 msmpeg4v1 decoding
michaelni
parents: 440
diff changeset
1600 return -1;
583dcee270d2 msmpeg4v1 decoding
michaelni
parents: 440
diff changeset
1601 }
307
764aeec1320e msmpeg4v2 decoding (no encoding yet)
michaelni
parents: 300
diff changeset
1602
10751
74e8feb81c6d cosmetics: Reorder functions to avoid forward declarations.
diego
parents: 10750
diff changeset
1603 if (level == DC_MAX) {
74e8feb81c6d cosmetics: Reorder functions to avoid forward declarations.
diego
parents: 10750
diff changeset
1604 level = get_bits(&s->gb, 8);
74e8feb81c6d cosmetics: Reorder functions to avoid forward declarations.
diego
parents: 10750
diff changeset
1605 if (get_bits1(&s->gb))
74e8feb81c6d cosmetics: Reorder functions to avoid forward declarations.
diego
parents: 10750
diff changeset
1606 level = -level;
74e8feb81c6d cosmetics: Reorder functions to avoid forward declarations.
diego
parents: 10750
diff changeset
1607 } else if (level != 0) {
74e8feb81c6d cosmetics: Reorder functions to avoid forward declarations.
diego
parents: 10750
diff changeset
1608 if (get_bits1(&s->gb))
74e8feb81c6d cosmetics: Reorder functions to avoid forward declarations.
diego
parents: 10750
diff changeset
1609 level = -level;
457
583dcee270d2 msmpeg4v1 decoding
michaelni
parents: 440
diff changeset
1610 }
307
764aeec1320e msmpeg4v2 decoding (no encoding yet)
michaelni
parents: 300
diff changeset
1611 }
764aeec1320e msmpeg4v2 decoding (no encoding yet)
michaelni
parents: 300
diff changeset
1612
10751
74e8feb81c6d cosmetics: Reorder functions to avoid forward declarations.
diego
parents: 10750
diff changeset
1613 if(s->msmpeg4_version==1){
74e8feb81c6d cosmetics: Reorder functions to avoid forward declarations.
diego
parents: 10750
diff changeset
1614 int32_t *dc_val;
74e8feb81c6d cosmetics: Reorder functions to avoid forward declarations.
diego
parents: 10750
diff changeset
1615 pred = msmpeg4v1_pred_dc(s, n, &dc_val);
74e8feb81c6d cosmetics: Reorder functions to avoid forward declarations.
diego
parents: 10750
diff changeset
1616 level += pred;
0
986e461dc072 Initial revision
glantau
parents:
diff changeset
1617
10751
74e8feb81c6d cosmetics: Reorder functions to avoid forward declarations.
diego
parents: 10750
diff changeset
1618 /* update predictor */
74e8feb81c6d cosmetics: Reorder functions to avoid forward declarations.
diego
parents: 10750
diff changeset
1619 *dc_val= level;
74e8feb81c6d cosmetics: Reorder functions to avoid forward declarations.
diego
parents: 10750
diff changeset
1620 }else{
74e8feb81c6d cosmetics: Reorder functions to avoid forward declarations.
diego
parents: 10750
diff changeset
1621 int16_t *dc_val;
74e8feb81c6d cosmetics: Reorder functions to avoid forward declarations.
diego
parents: 10750
diff changeset
1622 pred = msmpeg4_pred_dc(s, n, &dc_val, dir_ptr);
74e8feb81c6d cosmetics: Reorder functions to avoid forward declarations.
diego
parents: 10750
diff changeset
1623 level += pred;
2967
ef2149182f1c COSMETICS: Remove all trailing whitespace.
diego
parents: 2846
diff changeset
1624
10751
74e8feb81c6d cosmetics: Reorder functions to avoid forward declarations.
diego
parents: 10750
diff changeset
1625 /* update predictor */
74e8feb81c6d cosmetics: Reorder functions to avoid forward declarations.
diego
parents: 10750
diff changeset
1626 if (n < 4) {
74e8feb81c6d cosmetics: Reorder functions to avoid forward declarations.
diego
parents: 10750
diff changeset
1627 *dc_val = level * s->y_dc_scale;
74e8feb81c6d cosmetics: Reorder functions to avoid forward declarations.
diego
parents: 10750
diff changeset
1628 } else {
74e8feb81c6d cosmetics: Reorder functions to avoid forward declarations.
diego
parents: 10750
diff changeset
1629 *dc_val = level * s->c_dc_scale;
0
986e461dc072 Initial revision
glantau
parents:
diff changeset
1630 }
986e461dc072 Initial revision
glantau
parents:
diff changeset
1631 }
986e461dc072 Initial revision
glantau
parents:
diff changeset
1632
10751
74e8feb81c6d cosmetics: Reorder functions to avoid forward declarations.
diego
parents: 10750
diff changeset
1633 return level;
74e8feb81c6d cosmetics: Reorder functions to avoid forward declarations.
diego
parents: 10750
diff changeset
1634 }
0
986e461dc072 Initial revision
glantau
parents:
diff changeset
1635
563
61442627f857 fixes fire.avi & subtitles.avi
michaelni
parents: 556
diff changeset
1636 //#define ERROR_DETAILS
5882
51fc10d9fdff rename some msmpeg4 symbols and make them non-static
aurel
parents: 5543
diff changeset
1637 int ff_msmpeg4_decode_block(MpegEncContext * s, DCTELEM * block,
936
caa77cd960c0 qpel encoding
michaelni
parents: 903
diff changeset
1638 int n, int coded, const uint8_t *scan_table)
0
986e461dc072 Initial revision
glantau
parents:
diff changeset
1639 {
542
d55978a3c369 rl vlc decoding optimizations
michaelni
parents: 531
diff changeset
1640 int level, i, last, run, run_diff;
8780
56c41adae7d8 Fix: libavcodec/msmpeg4.c:1612: warning: ¡Ædc_pred_dir¡Ç may be used uninitialized in this function
michael
parents: 8718
diff changeset
1641 int av_uninit(dc_pred_dir);
0
986e461dc072 Initial revision
glantau
parents:
diff changeset
1642 RLTable *rl;
542
d55978a3c369 rl vlc decoding optimizations
michaelni
parents: 531
diff changeset
1643 RL_VLC_ELEM *rl_vlc;
200
6ab301aaa652 (commit by michael)
arpi_esp
parents: 195
diff changeset
1644 int qmul, qadd;
0
986e461dc072 Initial revision
glantau
parents:
diff changeset
1645
986e461dc072 Initial revision
glantau
parents:
diff changeset
1646 if (s->mb_intra) {
200
6ab301aaa652 (commit by michael)
arpi_esp
parents: 195
diff changeset
1647 qmul=1;
6ab301aaa652 (commit by michael)
arpi_esp
parents: 195
diff changeset
1648 qadd=0;
6ab301aaa652 (commit by michael)
arpi_esp
parents: 195
diff changeset
1649
2979
bfabfdf9ce55 COSMETICS: tabs --> spaces, some prettyprinting
diego
parents: 2967
diff changeset
1650 /* DC coef */
0
986e461dc072 Initial revision
glantau
parents:
diff changeset
1651 level = msmpeg4_decode_dc(s, n, &dc_pred_dir);
2967
ef2149182f1c COSMETICS: Remove all trailing whitespace.
diego
parents: 2846
diff changeset
1652
457
583dcee270d2 msmpeg4v1 decoding
michaelni
parents: 440
diff changeset
1653 if (level < 0){
1598
932d306bf1dc av_log() patch by (Michel Bardiaux <mbardiaux at peaktime dot be>)
michael
parents: 1399
diff changeset
1654 av_log(s->avctx, AV_LOG_ERROR, "dc overflow- block: %d qscale: %d//\n", n, s->qscale);
519
55b4e2248a45 wmv1 slice_height != mb_height support
michaelni
parents: 501
diff changeset
1655 if(s->inter_intra_pred) level=0;
55b4e2248a45 wmv1 slice_height != mb_height support
michaelni
parents: 501
diff changeset
1656 else return -1;
457
583dcee270d2 msmpeg4v1 decoding
michaelni
parents: 440
diff changeset
1657 }
0
986e461dc072 Initial revision
glantau
parents:
diff changeset
1658 if (n < 4) {
986e461dc072 Initial revision
glantau
parents:
diff changeset
1659 rl = &rl_table[s->rl_table_index];
457
583dcee270d2 msmpeg4v1 decoding
michaelni
parents: 440
diff changeset
1660 if(level > 256*s->y_dc_scale){
1598
932d306bf1dc av_log() patch by (Michel Bardiaux <mbardiaux at peaktime dot be>)
michael
parents: 1399
diff changeset
1661 av_log(s->avctx, AV_LOG_ERROR, "dc overflow+ L qscale: %d//\n", s->qscale);
519
55b4e2248a45 wmv1 slice_height != mb_height support
michaelni
parents: 501
diff changeset
1662 if(!s->inter_intra_pred) return -1;
457
583dcee270d2 msmpeg4v1 decoding
michaelni
parents: 440
diff changeset
1663 }
0
986e461dc072 Initial revision
glantau
parents:
diff changeset
1664 } else {
986e461dc072 Initial revision
glantau
parents:
diff changeset
1665 rl = &rl_table[3 + s->rl_chroma_table_index];
457
583dcee270d2 msmpeg4v1 decoding
michaelni
parents: 440
diff changeset
1666 if(level > 256*s->c_dc_scale){
1598
932d306bf1dc av_log() patch by (Michel Bardiaux <mbardiaux at peaktime dot be>)
michael
parents: 1399
diff changeset
1667 av_log(s->avctx, AV_LOG_ERROR, "dc overflow+ C qscale: %d//\n", s->qscale);
519
55b4e2248a45 wmv1 slice_height != mb_height support
michaelni
parents: 501
diff changeset
1668 if(!s->inter_intra_pred) return -1;
457
583dcee270d2 msmpeg4v1 decoding
michaelni
parents: 440
diff changeset
1669 }
0
986e461dc072 Initial revision
glantau
parents:
diff changeset
1670 }
457
583dcee270d2 msmpeg4v1 decoding
michaelni
parents: 440
diff changeset
1671 block[0] = level;
200
6ab301aaa652 (commit by michael)
arpi_esp
parents: 195
diff changeset
1672
5496
f966fc154841 make wmv1 and wmv2 playable with M$ DMO decoder
michael
parents: 5214
diff changeset
1673 run_diff = s->msmpeg4_version >= 4;
542
d55978a3c369 rl vlc decoding optimizations
michaelni
parents: 531
diff changeset
1674 i = 0;
0
986e461dc072 Initial revision
glantau
parents:
diff changeset
1675 if (!coded) {
986e461dc072 Initial revision
glantau
parents:
diff changeset
1676 goto not_coded;
986e461dc072 Initial revision
glantau
parents:
diff changeset
1677 }
986e461dc072 Initial revision
glantau
parents:
diff changeset
1678 if (s->ac_pred) {
2967
ef2149182f1c COSMETICS: Remove all trailing whitespace.
diego
parents: 2846
diff changeset
1679 if (dc_pred_dir == 0)
706
e65798d228ea idct permutation cleanup, idct can be selected per context now
michaelni
parents: 601
diff changeset
1680 scan_table = s->intra_v_scantable.permutated; /* left */
0
986e461dc072 Initial revision
glantau
parents:
diff changeset
1681 else
706
e65798d228ea idct permutation cleanup, idct can be selected per context now
michaelni
parents: 601
diff changeset
1682 scan_table = s->intra_h_scantable.permutated; /* top */
0
986e461dc072 Initial revision
glantau
parents:
diff changeset
1683 } else {
706
e65798d228ea idct permutation cleanup, idct can be selected per context now
michaelni
parents: 601
diff changeset
1684 scan_table = s->intra_scantable.permutated;
0
986e461dc072 Initial revision
glantau
parents:
diff changeset
1685 }
542
d55978a3c369 rl vlc decoding optimizations
michaelni
parents: 531
diff changeset
1686 rl_vlc= rl->rl_vlc[0];
0
986e461dc072 Initial revision
glantau
parents:
diff changeset
1687 } else {
200
6ab301aaa652 (commit by michael)
arpi_esp
parents: 195
diff changeset
1688 qmul = s->qscale << 1;
6ab301aaa652 (commit by michael)
arpi_esp
parents: 195
diff changeset
1689 qadd = (s->qscale - 1) | 1;
542
d55978a3c369 rl vlc decoding optimizations
michaelni
parents: 531
diff changeset
1690 i = -1;
0
986e461dc072 Initial revision
glantau
parents:
diff changeset
1691 rl = &rl_table[3 + s->rl_table_index];
307
764aeec1320e msmpeg4v2 decoding (no encoding yet)
michaelni
parents: 300
diff changeset
1692
764aeec1320e msmpeg4v2 decoding (no encoding yet)
michaelni
parents: 300
diff changeset
1693 if(s->msmpeg4_version==2)
764aeec1320e msmpeg4v2 decoding (no encoding yet)
michaelni
parents: 300
diff changeset
1694 run_diff = 0;
764aeec1320e msmpeg4v2 decoding (no encoding yet)
michaelni
parents: 300
diff changeset
1695 else
764aeec1320e msmpeg4v2 decoding (no encoding yet)
michaelni
parents: 300
diff changeset
1696 run_diff = 1;
764aeec1320e msmpeg4v2 decoding (no encoding yet)
michaelni
parents: 300
diff changeset
1697
0
986e461dc072 Initial revision
glantau
parents:
diff changeset
1698 if (!coded) {
542
d55978a3c369 rl vlc decoding optimizations
michaelni
parents: 531
diff changeset
1699 s->block_last_index[n] = i;
0
986e461dc072 Initial revision
glantau
parents:
diff changeset
1700 return 0;
986e461dc072 Initial revision
glantau
parents:
diff changeset
1701 }
936
caa77cd960c0 qpel encoding
michaelni
parents: 903
diff changeset
1702 if(!scan_table)
caa77cd960c0 qpel encoding
michaelni
parents: 903
diff changeset
1703 scan_table = s->inter_scantable.permutated;
542
d55978a3c369 rl vlc decoding optimizations
michaelni
parents: 531
diff changeset
1704 rl_vlc= rl->rl_vlc[s->qscale];
0
986e461dc072 Initial revision
glantau
parents:
diff changeset
1705 }
542
d55978a3c369 rl vlc decoding optimizations
michaelni
parents: 531
diff changeset
1706 {
d55978a3c369 rl vlc decoding optimizations
michaelni
parents: 531
diff changeset
1707 OPEN_READER(re, &s->gb);
0
986e461dc072 Initial revision
glantau
parents:
diff changeset
1708 for(;;) {
542
d55978a3c369 rl vlc decoding optimizations
michaelni
parents: 531
diff changeset
1709 UPDATE_CACHE(re, &s->gb);
2615
0d88e3f89379 avoid UPDATE_CACHE() in GET_RL_VLC() if not needed
michael
parents: 2474
diff changeset
1710 GET_RL_VLC(level, run, re, &s->gb, rl_vlc, TEX_VLC_BITS, 2, 0);
542
d55978a3c369 rl vlc decoding optimizations
michaelni
parents: 531
diff changeset
1711 if (level==0) {
d55978a3c369 rl vlc decoding optimizations
michaelni
parents: 531
diff changeset
1712 int cache;
d55978a3c369 rl vlc decoding optimizations
michaelni
parents: 531
diff changeset
1713 cache= GET_CACHE(re, &s->gb);
0
986e461dc072 Initial revision
glantau
parents:
diff changeset
1714 /* escape */
542
d55978a3c369 rl vlc decoding optimizations
michaelni
parents: 531
diff changeset
1715 if (s->msmpeg4_version==1 || (cache&0x80000000)==0) {
d55978a3c369 rl vlc decoding optimizations
michaelni
parents: 531
diff changeset
1716 if (s->msmpeg4_version==1 || (cache&0x40000000)==0) {
0
986e461dc072 Initial revision
glantau
parents:
diff changeset
1717 /* third escape */
542
d55978a3c369 rl vlc decoding optimizations
michaelni
parents: 531
diff changeset
1718 if(s->msmpeg4_version!=1) LAST_SKIP_BITS(re, &s->gb, 2);
d55978a3c369 rl vlc decoding optimizations
michaelni
parents: 531
diff changeset
1719 UPDATE_CACHE(re, &s->gb);
499
8b7a54d58549 wmv1 support
michaelni
parents: 483
diff changeset
1720 if(s->msmpeg4_version<=3){
542
d55978a3c369 rl vlc decoding optimizations
michaelni
parents: 531
diff changeset
1721 last= SHOW_UBITS(re, &s->gb, 1); SKIP_CACHE(re, &s->gb, 1);
d55978a3c369 rl vlc decoding optimizations
michaelni
parents: 531
diff changeset
1722 run= SHOW_UBITS(re, &s->gb, 6); SKIP_CACHE(re, &s->gb, 6);
d55978a3c369 rl vlc decoding optimizations
michaelni
parents: 531
diff changeset
1723 level= SHOW_SBITS(re, &s->gb, 8); LAST_SKIP_CACHE(re, &s->gb, 8);
d55978a3c369 rl vlc decoding optimizations
michaelni
parents: 531
diff changeset
1724 SKIP_COUNTER(re, &s->gb, 1+6+8);
2967
ef2149182f1c COSMETICS: Remove all trailing whitespace.
diego
parents: 2846
diff changeset
1725 }else{
499
8b7a54d58549 wmv1 support
michaelni
parents: 483
diff changeset
1726 int sign;
542
d55978a3c369 rl vlc decoding optimizations
michaelni
parents: 531
diff changeset
1727 last= SHOW_UBITS(re, &s->gb, 1); SKIP_BITS(re, &s->gb, 1);
499
8b7a54d58549 wmv1 support
michaelni
parents: 483
diff changeset
1728 if(!s->esc3_level_length){
8b7a54d58549 wmv1 support
michaelni
parents: 483
diff changeset
1729 int ll;
8b7a54d58549 wmv1 support
michaelni
parents: 483
diff changeset
1730 //printf("ESC-3 %X at %d %d\n", show_bits(&s->gb, 24), s->mb_x, s->mb_y);
8b7a54d58549 wmv1 support
michaelni
parents: 483
diff changeset
1731 if(s->qscale<8){
542
d55978a3c369 rl vlc decoding optimizations
michaelni
parents: 531
diff changeset
1732 ll= SHOW_UBITS(re, &s->gb, 3); SKIP_BITS(re, &s->gb, 3);
499
8b7a54d58549 wmv1 support
michaelni
parents: 483
diff changeset
1733 if(ll==0){
11075
2663fdcdb769 Implement cool new vlc code.
michael
parents: 10822
diff changeset
1734 ll= 8+SHOW_UBITS(re, &s->gb, 1); SKIP_BITS(re, &s->gb, 1);
499
8b7a54d58549 wmv1 support
michaelni
parents: 483
diff changeset
1735 }
8b7a54d58549 wmv1 support
michaelni
parents: 483
diff changeset
1736 }else{
8b7a54d58549 wmv1 support
michaelni
parents: 483
diff changeset
1737 ll=2;
542
d55978a3c369 rl vlc decoding optimizations
michaelni
parents: 531
diff changeset
1738 while(ll<8 && SHOW_UBITS(re, &s->gb, 1)==0){
d55978a3c369 rl vlc decoding optimizations
michaelni
parents: 531
diff changeset
1739 ll++;
d55978a3c369 rl vlc decoding optimizations
michaelni
parents: 531
diff changeset
1740 SKIP_BITS(re, &s->gb, 1);
d55978a3c369 rl vlc decoding optimizations
michaelni
parents: 531
diff changeset
1741 }
578
32c142b10263 fixing bitrate vs. kbitrate in header
michaelni
parents: 563
diff changeset
1742 if(ll<8) SKIP_BITS(re, &s->gb, 1);
499
8b7a54d58549 wmv1 support
michaelni
parents: 483
diff changeset
1743 }
8b7a54d58549 wmv1 support
michaelni
parents: 483
diff changeset
1744
8b7a54d58549 wmv1 support
michaelni
parents: 483
diff changeset
1745 s->esc3_level_length= ll;
542
d55978a3c369 rl vlc decoding optimizations
michaelni
parents: 531
diff changeset
1746 s->esc3_run_length= SHOW_UBITS(re, &s->gb, 2) + 3; SKIP_BITS(re, &s->gb, 2);
499
8b7a54d58549 wmv1 support
michaelni
parents: 483
diff changeset
1747 //printf("level length:%d, run length: %d\n", ll, s->esc3_run_length);
578
32c142b10263 fixing bitrate vs. kbitrate in header
michaelni
parents: 563
diff changeset
1748 UPDATE_CACHE(re, &s->gb);
499
8b7a54d58549 wmv1 support
michaelni
parents: 483
diff changeset
1749 }
2967
ef2149182f1c COSMETICS: Remove all trailing whitespace.
diego
parents: 2846
diff changeset
1750 run= SHOW_UBITS(re, &s->gb, s->esc3_run_length);
542
d55978a3c369 rl vlc decoding optimizations
michaelni
parents: 531
diff changeset
1751 SKIP_BITS(re, &s->gb, s->esc3_run_length);
2967
ef2149182f1c COSMETICS: Remove all trailing whitespace.
diego
parents: 2846
diff changeset
1752
ef2149182f1c COSMETICS: Remove all trailing whitespace.
diego
parents: 2846
diff changeset
1753 sign= SHOW_UBITS(re, &s->gb, 1);
542
d55978a3c369 rl vlc decoding optimizations
michaelni
parents: 531
diff changeset
1754 SKIP_BITS(re, &s->gb, 1);
2967
ef2149182f1c COSMETICS: Remove all trailing whitespace.
diego
parents: 2846
diff changeset
1755
ef2149182f1c COSMETICS: Remove all trailing whitespace.
diego
parents: 2846
diff changeset
1756 level= SHOW_UBITS(re, &s->gb, s->esc3_level_length);
542
d55978a3c369 rl vlc decoding optimizations
michaelni
parents: 531
diff changeset
1757 SKIP_BITS(re, &s->gb, s->esc3_level_length);
499
8b7a54d58549 wmv1 support
michaelni
parents: 483
diff changeset
1758 if(sign) level= -level;
8b7a54d58549 wmv1 support
michaelni
parents: 483
diff changeset
1759 }
8b7a54d58549 wmv1 support
michaelni
parents: 483
diff changeset
1760 //printf("level: %d, run: %d at %d %d\n", level, run, s->mb_x, s->mb_y);
457
583dcee270d2 msmpeg4v1 decoding
michaelni
parents: 440
diff changeset
1761 #if 0 // waste of time / this will detect very few errors
583dcee270d2 msmpeg4v1 decoding
michaelni
parents: 440
diff changeset
1762 {
4001
34fdffe98bd0 Rename ABS macro to FFABS.
diego
parents: 3947
diff changeset
1763 const int abs_level= FFABS(level);
457
583dcee270d2 msmpeg4v1 decoding
michaelni
parents: 440
diff changeset
1764 const int run1= run - rl->max_run[last][abs_level] - run_diff;
583dcee270d2 msmpeg4v1 decoding
michaelni
parents: 440
diff changeset
1765 if(abs_level<=MAX_LEVEL && run<=MAX_RUN){
583dcee270d2 msmpeg4v1 decoding
michaelni
parents: 440
diff changeset
1766 if(abs_level <= rl->max_level[last][run]){
3177
8d1b2cc2a75b (f)printf --> av_log conversion
diego
parents: 3036
diff changeset
1767 av_log(s->avctx, AV_LOG_ERROR, "illegal 3. esc, vlc encoding possible\n");
457
583dcee270d2 msmpeg4v1 decoding
michaelni
parents: 440
diff changeset
1768 return DECODING_AC_LOST;
583dcee270d2 msmpeg4v1 decoding
michaelni
parents: 440
diff changeset
1769 }
583dcee270d2 msmpeg4v1 decoding
michaelni
parents: 440
diff changeset
1770 if(abs_level <= rl->max_level[last][run]*2){
3177
8d1b2cc2a75b (f)printf --> av_log conversion
diego
parents: 3036
diff changeset
1771 av_log(s->avctx, AV_LOG_ERROR, "illegal 3. esc, esc 1 encoding possible\n");
457
583dcee270d2 msmpeg4v1 decoding
michaelni
parents: 440
diff changeset
1772 return DECODING_AC_LOST;
583dcee270d2 msmpeg4v1 decoding
michaelni
parents: 440
diff changeset
1773 }
499
8b7a54d58549 wmv1 support
michaelni
parents: 483
diff changeset
1774 if(run1>=0 && abs_level <= rl->max_level[last][run1]){
3177
8d1b2cc2a75b (f)printf --> av_log conversion
diego
parents: 3036
diff changeset
1775 av_log(s->avctx, AV_LOG_ERROR, "illegal 3. esc, esc 2 encoding possible\n");
457
583dcee270d2 msmpeg4v1 decoding
michaelni
parents: 440
diff changeset
1776 return DECODING_AC_LOST;
583dcee270d2 msmpeg4v1 decoding
michaelni
parents: 440
diff changeset
1777 }
583dcee270d2 msmpeg4v1 decoding
michaelni
parents: 440
diff changeset
1778 }
583dcee270d2 msmpeg4v1 decoding
michaelni
parents: 440
diff changeset
1779 }
583dcee270d2 msmpeg4v1 decoding
michaelni
parents: 440
diff changeset
1780 #endif
2979
bfabfdf9ce55 COSMETICS: tabs --> spaces, some prettyprinting
diego
parents: 2967
diff changeset
1781 //level = level * qmul + (level>0) * qadd - (level<=0) * qadd ;
bfabfdf9ce55 COSMETICS: tabs --> spaces, some prettyprinting
diego
parents: 2967
diff changeset
1782 if (level>0) level= level * qmul + qadd;
457
583dcee270d2 msmpeg4v1 decoding
michaelni
parents: 440
diff changeset
1783 else level= level * qmul - qadd;
583dcee270d2 msmpeg4v1 decoding
michaelni
parents: 440
diff changeset
1784 #if 0 // waste of time too :(
583dcee270d2 msmpeg4v1 decoding
michaelni
parents: 440
diff changeset
1785 if(level>2048 || level<-2048){
3177
8d1b2cc2a75b (f)printf --> av_log conversion
diego
parents: 3036
diff changeset
1786 av_log(s->avctx, AV_LOG_ERROR, "|level| overflow in 3. esc\n");
457
583dcee270d2 msmpeg4v1 decoding
michaelni
parents: 440
diff changeset
1787 return DECODING_AC_LOST;
583dcee270d2 msmpeg4v1 decoding
michaelni
parents: 440
diff changeset
1788 }
583dcee270d2 msmpeg4v1 decoding
michaelni
parents: 440
diff changeset
1789 #endif
542
d55978a3c369 rl vlc decoding optimizations
michaelni
parents: 531
diff changeset
1790 i+= run + 1;
d55978a3c369 rl vlc decoding optimizations
michaelni
parents: 531
diff changeset
1791 if(last) i+=192;
563
61442627f857 fixes fire.avi & subtitles.avi
michaelni
parents: 556
diff changeset
1792 #ifdef ERROR_DETAILS
61442627f857 fixes fire.avi & subtitles.avi
michaelni
parents: 556
diff changeset
1793 if(run==66)
2846
40765c51a7a9 Compilation fixes part 1 patch by (Arvind R. and Burkhard Plaum, plaum, ipf uni-stuttgart de)
michael
parents: 2639
diff changeset
1794 av_log(s->avctx, AV_LOG_ERROR, "illegal vlc code in ESC3 level=%d\n", level);
563
61442627f857 fixes fire.avi & subtitles.avi
michaelni
parents: 556
diff changeset
1795 else if((i>62 && i<192) || i>192+63)
2846
40765c51a7a9 Compilation fixes part 1 patch by (Arvind R. and Burkhard Plaum, plaum, ipf uni-stuttgart de)
michael
parents: 2639
diff changeset
1796 av_log(s->avctx, AV_LOG_ERROR, "run overflow in ESC3 i=%d run=%d level=%d\n", i, run, level);
563
61442627f857 fixes fire.avi & subtitles.avi
michaelni
parents: 556
diff changeset
1797 #endif
0
986e461dc072 Initial revision
glantau
parents:
diff changeset
1798 } else {
986e461dc072 Initial revision
glantau
parents:
diff changeset
1799 /* second escape */
542
d55978a3c369 rl vlc decoding optimizations
michaelni
parents: 531
diff changeset
1800 #if MIN_CACHE_BITS < 23
d55978a3c369 rl vlc decoding optimizations
michaelni
parents: 531
diff changeset
1801 LAST_SKIP_BITS(re, &s->gb, 2);
d55978a3c369 rl vlc decoding optimizations
michaelni
parents: 531
diff changeset
1802 UPDATE_CACHE(re, &s->gb);
d55978a3c369 rl vlc decoding optimizations
michaelni
parents: 531
diff changeset
1803 #else
d55978a3c369 rl vlc decoding optimizations
michaelni
parents: 531
diff changeset
1804 SKIP_BITS(re, &s->gb, 2);
d55978a3c369 rl vlc decoding optimizations
michaelni
parents: 531
diff changeset
1805 #endif
2615
0d88e3f89379 avoid UPDATE_CACHE() in GET_RL_VLC() if not needed
michael
parents: 2474
diff changeset
1806 GET_RL_VLC(level, run, re, &s->gb, rl_vlc, TEX_VLC_BITS, 2, 1);
542
d55978a3c369 rl vlc decoding optimizations
michaelni
parents: 531
diff changeset
1807 i+= run + rl->max_run[run>>7][level/qmul] + run_diff; //FIXME opt indexing
d55978a3c369 rl vlc decoding optimizations
michaelni
parents: 531
diff changeset
1808 level = (level ^ SHOW_SBITS(re, &s->gb, 1)) - SHOW_SBITS(re, &s->gb, 1);
d55978a3c369 rl vlc decoding optimizations
michaelni
parents: 531
diff changeset
1809 LAST_SKIP_BITS(re, &s->gb, 1);
563
61442627f857 fixes fire.avi & subtitles.avi
michaelni
parents: 556
diff changeset
1810 #ifdef ERROR_DETAILS
61442627f857 fixes fire.avi & subtitles.avi
michaelni
parents: 556
diff changeset
1811 if(run==66)
2846
40765c51a7a9 Compilation fixes part 1 patch by (Arvind R. and Burkhard Plaum, plaum, ipf uni-stuttgart de)
michael
parents: 2639
diff changeset
1812 av_log(s->avctx, AV_LOG_ERROR, "illegal vlc code in ESC2 level=%d\n", level);
563
61442627f857 fixes fire.avi & subtitles.avi
michaelni
parents: 556
diff changeset
1813 else if((i>62 && i<192) || i>192+63)
2846
40765c51a7a9 Compilation fixes part 1 patch by (Arvind R. and Burkhard Plaum, plaum, ipf uni-stuttgart de)
michael
parents: 2639
diff changeset
1814 av_log(s->avctx, AV_LOG_ERROR, "run overflow in ESC2 i=%d run=%d level=%d\n", i, run, level);
563
61442627f857 fixes fire.avi & subtitles.avi
michaelni
parents: 556
diff changeset
1815 #endif
0
986e461dc072 Initial revision
glantau
parents:
diff changeset
1816 }
986e461dc072 Initial revision
glantau
parents:
diff changeset
1817 } else {
986e461dc072 Initial revision
glantau
parents:
diff changeset
1818 /* first escape */
542
d55978a3c369 rl vlc decoding optimizations
michaelni
parents: 531
diff changeset
1819 #if MIN_CACHE_BITS < 22
d55978a3c369 rl vlc decoding optimizations
michaelni
parents: 531
diff changeset
1820 LAST_SKIP_BITS(re, &s->gb, 1);
d55978a3c369 rl vlc decoding optimizations
michaelni
parents: 531
diff changeset
1821 UPDATE_CACHE(re, &s->gb);
d55978a3c369 rl vlc decoding optimizations
michaelni
parents: 531
diff changeset
1822 #else
d55978a3c369 rl vlc decoding optimizations
michaelni
parents: 531
diff changeset
1823 SKIP_BITS(re, &s->gb, 1);
d55978a3c369 rl vlc decoding optimizations
michaelni
parents: 531
diff changeset
1824 #endif
2615
0d88e3f89379 avoid UPDATE_CACHE() in GET_RL_VLC() if not needed
michael
parents: 2474
diff changeset
1825 GET_RL_VLC(level, run, re, &s->gb, rl_vlc, TEX_VLC_BITS, 2, 1);
542
d55978a3c369 rl vlc decoding optimizations
michaelni
parents: 531
diff changeset
1826 i+= run;
d55978a3c369 rl vlc decoding optimizations
michaelni
parents: 531
diff changeset
1827 level = level + rl->max_level[run>>7][(run-1)&63] * qmul;//FIXME opt indexing
d55978a3c369 rl vlc decoding optimizations
michaelni
parents: 531
diff changeset
1828 level = (level ^ SHOW_SBITS(re, &s->gb, 1)) - SHOW_SBITS(re, &s->gb, 1);
d55978a3c369 rl vlc decoding optimizations
michaelni
parents: 531
diff changeset
1829 LAST_SKIP_BITS(re, &s->gb, 1);
563
61442627f857 fixes fire.avi & subtitles.avi
michaelni
parents: 556
diff changeset
1830 #ifdef ERROR_DETAILS
61442627f857 fixes fire.avi & subtitles.avi
michaelni
parents: 556
diff changeset
1831 if(run==66)
2846
40765c51a7a9 Compilation fixes part 1 patch by (Arvind R. and Burkhard Plaum, plaum, ipf uni-stuttgart de)
michael
parents: 2639
diff changeset
1832 av_log(s->avctx, AV_LOG_ERROR, "illegal vlc code in ESC1 level=%d\n", level);
563
61442627f857 fixes fire.avi & subtitles.avi
michaelni
parents: 556
diff changeset
1833 else if((i>62 && i<192) || i>192+63)
2846
40765c51a7a9 Compilation fixes part 1 patch by (Arvind R. and Burkhard Plaum, plaum, ipf uni-stuttgart de)
michael
parents: 2639
diff changeset
1834 av_log(s->avctx, AV_LOG_ERROR, "run overflow in ESC1 i=%d run=%d level=%d\n", i, run, level);
563
61442627f857 fixes fire.avi & subtitles.avi
michaelni
parents: 556
diff changeset
1835 #endif
0
986e461dc072 Initial revision
glantau
parents:
diff changeset
1836 }
986e461dc072 Initial revision
glantau
parents:
diff changeset
1837 } else {
542
d55978a3c369 rl vlc decoding optimizations
michaelni
parents: 531
diff changeset
1838 i+= run;
d55978a3c369 rl vlc decoding optimizations
michaelni
parents: 531
diff changeset
1839 level = (level ^ SHOW_SBITS(re, &s->gb, 1)) - SHOW_SBITS(re, &s->gb, 1);
d55978a3c369 rl vlc decoding optimizations
michaelni
parents: 531
diff changeset
1840 LAST_SKIP_BITS(re, &s->gb, 1);
563
61442627f857 fixes fire.avi & subtitles.avi
michaelni
parents: 556
diff changeset
1841 #ifdef ERROR_DETAILS
61442627f857 fixes fire.avi & subtitles.avi
michaelni
parents: 556
diff changeset
1842 if(run==66)
2846
40765c51a7a9 Compilation fixes part 1 patch by (Arvind R. and Burkhard Plaum, plaum, ipf uni-stuttgart de)
michael
parents: 2639
diff changeset
1843 av_log(s->avctx, AV_LOG_ERROR, "illegal vlc code level=%d\n", level);
563
61442627f857 fixes fire.avi & subtitles.avi
michaelni
parents: 556
diff changeset
1844 else if((i>62 && i<192) || i>192+63)
2846
40765c51a7a9 Compilation fixes part 1 patch by (Arvind R. and Burkhard Plaum, plaum, ipf uni-stuttgart de)
michael
parents: 2639
diff changeset
1845 av_log(s->avctx, AV_LOG_ERROR, "run overflow i=%d run=%d level=%d\n", i, run, level);
563
61442627f857 fixes fire.avi & subtitles.avi
michaelni
parents: 556
diff changeset
1846 #endif
0
986e461dc072 Initial revision
glantau
parents:
diff changeset
1847 }
542
d55978a3c369 rl vlc decoding optimizations
michaelni
parents: 531
diff changeset
1848 if (i > 62){
d55978a3c369 rl vlc decoding optimizations
michaelni
parents: 531
diff changeset
1849 i-= 192;
d55978a3c369 rl vlc decoding optimizations
michaelni
parents: 531
diff changeset
1850 if(i&(~63)){
10535
95f3daa991a2 Use get_bits_left() instead of size_in_bits - get_bits_count().
rbultje
parents: 10071
diff changeset
1851 const int left= get_bits_left(&s->gb);
7831
8195c970d077 Rename error_resilience to error_recognition.
michael
parents: 7260
diff changeset
1852 if(((i+192 == 64 && level/qmul==-1) || s->error_recognition<=1) && left>=0){
1598
932d306bf1dc av_log() patch by (Michel Bardiaux <mbardiaux at peaktime dot be>)
michael
parents: 1399
diff changeset
1853 av_log(s->avctx, AV_LOG_ERROR, "ignoring overflow at %d %d\n", s->mb_x, s->mb_y);
563
61442627f857 fixes fire.avi & subtitles.avi
michaelni
parents: 556
diff changeset
1854 break;
61442627f857 fixes fire.avi & subtitles.avi
michaelni
parents: 556
diff changeset
1855 }else{
1598
932d306bf1dc av_log() patch by (Michel Bardiaux <mbardiaux at peaktime dot be>)
michael
parents: 1399
diff changeset
1856 av_log(s->avctx, AV_LOG_ERROR, "ac-tex damaged at %d %d\n", s->mb_x, s->mb_y);
563
61442627f857 fixes fire.avi & subtitles.avi
michaelni
parents: 556
diff changeset
1857 return -1;
61442627f857 fixes fire.avi & subtitles.avi
michaelni
parents: 556
diff changeset
1858 }
542
d55978a3c369 rl vlc decoding optimizations
michaelni
parents: 531
diff changeset
1859 }
d55978a3c369 rl vlc decoding optimizations
michaelni
parents: 531
diff changeset
1860
d55978a3c369 rl vlc decoding optimizations
michaelni
parents: 531
diff changeset
1861 block[scan_table[i]] = level;
d55978a3c369 rl vlc decoding optimizations
michaelni
parents: 531
diff changeset
1862 break;
499
8b7a54d58549 wmv1 support
michaelni
parents: 483
diff changeset
1863 }
457
583dcee270d2 msmpeg4v1 decoding
michaelni
parents: 440
diff changeset
1864
542
d55978a3c369 rl vlc decoding optimizations
michaelni
parents: 531
diff changeset
1865 block[scan_table[i]] = level;
0
986e461dc072 Initial revision
glantau
parents:
diff changeset
1866 }
542
d55978a3c369 rl vlc decoding optimizations
michaelni
parents: 531
diff changeset
1867 CLOSE_READER(re, &s->gb);
d55978a3c369 rl vlc decoding optimizations
michaelni
parents: 531
diff changeset
1868 }
0
986e461dc072 Initial revision
glantau
parents:
diff changeset
1869 not_coded:
986e461dc072 Initial revision
glantau
parents:
diff changeset
1870 if (s->mb_intra) {
986e461dc072 Initial revision
glantau
parents:
diff changeset
1871 mpeg4_pred_ac(s, block, n, dc_pred_dir);
986e461dc072 Initial revision
glantau
parents:
diff changeset
1872 if (s->ac_pred) {
542
d55978a3c369 rl vlc decoding optimizations
michaelni
parents: 531
diff changeset
1873 i = 63; /* XXX: not optimal */
0
986e461dc072 Initial revision
glantau
parents:
diff changeset
1874 }
986e461dc072 Initial revision
glantau
parents:
diff changeset
1875 }
936
caa77cd960c0 qpel encoding
michaelni
parents: 903
diff changeset
1876 if(s->msmpeg4_version>=4 && i>0) i=63; //FIXME/XXX optimize
542
d55978a3c369 rl vlc decoding optimizations
michaelni
parents: 531
diff changeset
1877 s->block_last_index[n] = i;
2967
ef2149182f1c COSMETICS: Remove all trailing whitespace.
diego
parents: 2846
diff changeset
1878
0
986e461dc072 Initial revision
glantau
parents:
diff changeset
1879 return 0;
986e461dc072 Initial revision
glantau
parents:
diff changeset
1880 }
986e461dc072 Initial revision
glantau
parents:
diff changeset
1881
5882
51fc10d9fdff rename some msmpeg4 symbols and make them non-static
aurel
parents: 5543
diff changeset
1882 int ff_msmpeg4_decode_motion(MpegEncContext * s,
0
986e461dc072 Initial revision
glantau
parents:
diff changeset
1883 int *mx_ptr, int *my_ptr)
986e461dc072 Initial revision
glantau
parents:
diff changeset
1884 {
986e461dc072 Initial revision
glantau
parents:
diff changeset
1885 MVTable *mv;
986e461dc072 Initial revision
glantau
parents:
diff changeset
1886 int code, mx, my;
986e461dc072 Initial revision
glantau
parents:
diff changeset
1887
986e461dc072 Initial revision
glantau
parents:
diff changeset
1888 mv = &mv_tables[s->mv_table_index];
986e461dc072 Initial revision
glantau
parents:
diff changeset
1889
531
f5d7fcc81787 get_vlc() optimizations
michaelni
parents: 519
diff changeset
1890 code = get_vlc2(&s->gb, mv->vlc.table, MV_VLC_BITS, 2);
499
8b7a54d58549 wmv1 support
michaelni
parents: 483
diff changeset
1891 if (code < 0){
1598
932d306bf1dc av_log() patch by (Michel Bardiaux <mbardiaux at peaktime dot be>)
michael
parents: 1399
diff changeset
1892 av_log(s->avctx, AV_LOG_ERROR, "illegal MV code at %d %d\n", s->mb_x, s->mb_y);
0
986e461dc072 Initial revision
glantau
parents:
diff changeset
1893 return -1;
499
8b7a54d58549 wmv1 support
michaelni
parents: 483
diff changeset
1894 }
0
986e461dc072 Initial revision
glantau
parents:
diff changeset
1895 if (code == mv->n) {
499
8b7a54d58549 wmv1 support
michaelni
parents: 483
diff changeset
1896 //printf("MV ESC %X at %d %d\n", show_bits(&s->gb, 24), s->mb_x, s->mb_y);
0
986e461dc072 Initial revision
glantau
parents:
diff changeset
1897 mx = get_bits(&s->gb, 6);
986e461dc072 Initial revision
glantau
parents:
diff changeset
1898 my = get_bits(&s->gb, 6);
986e461dc072 Initial revision
glantau
parents:
diff changeset
1899 } else {
986e461dc072 Initial revision
glantau
parents:
diff changeset
1900 mx = mv->table_mvx[code];
986e461dc072 Initial revision
glantau
parents:
diff changeset
1901 my = mv->table_mvy[code];
986e461dc072 Initial revision
glantau
parents:
diff changeset
1902 }
986e461dc072 Initial revision
glantau
parents:
diff changeset
1903
986e461dc072 Initial revision
glantau
parents:
diff changeset
1904 mx += *mx_ptr - 32;
986e461dc072 Initial revision
glantau
parents:
diff changeset
1905 my += *my_ptr - 32;
986e461dc072 Initial revision
glantau
parents:
diff changeset
1906 /* WARNING : they do not do exactly modulo encoding */
986e461dc072 Initial revision
glantau
parents:
diff changeset
1907 if (mx <= -64)
986e461dc072 Initial revision
glantau
parents:
diff changeset
1908 mx += 64;
986e461dc072 Initial revision
glantau
parents:
diff changeset
1909 else if (mx >= 64)
986e461dc072 Initial revision
glantau
parents:
diff changeset
1910 mx -= 64;
986e461dc072 Initial revision
glantau
parents:
diff changeset
1911
986e461dc072 Initial revision
glantau
parents:
diff changeset
1912 if (my <= -64)
986e461dc072 Initial revision
glantau
parents:
diff changeset
1913 my += 64;
986e461dc072 Initial revision
glantau
parents:
diff changeset
1914 else if (my >= 64)
986e461dc072 Initial revision
glantau
parents:
diff changeset
1915 my -= 64;
986e461dc072 Initial revision
glantau
parents:
diff changeset
1916 *mx_ptr = mx;
986e461dc072 Initial revision
glantau
parents:
diff changeset
1917 *my_ptr = my;
986e461dc072 Initial revision
glantau
parents:
diff changeset
1918 return 0;
986e461dc072 Initial revision
glantau
parents:
diff changeset
1919 }
10822
9ccc13d1144d Move AVCodecs from h263dec.c to msmpeg4.c and disentangle init decode init.
michael
parents: 10821
diff changeset
1920
9ccc13d1144d Move AVCodecs from h263dec.c to msmpeg4.c and disentangle init decode init.
michael
parents: 10821
diff changeset
1921 AVCodec msmpeg4v1_decoder = {
9ccc13d1144d Move AVCodecs from h263dec.c to msmpeg4.c and disentangle init decode init.
michael
parents: 10821
diff changeset
1922 "msmpeg4v1",
11560
8a4984c5cacc Define AVMediaType enum, and use it instead of enum CodecType, which
stefano
parents: 11075
diff changeset
1923 AVMEDIA_TYPE_VIDEO,
10822
9ccc13d1144d Move AVCodecs from h263dec.c to msmpeg4.c and disentangle init decode init.
michael
parents: 10821
diff changeset
1924 CODEC_ID_MSMPEG4V1,
9ccc13d1144d Move AVCodecs from h263dec.c to msmpeg4.c and disentangle init decode init.
michael
parents: 10821
diff changeset
1925 sizeof(MpegEncContext),
9ccc13d1144d Move AVCodecs from h263dec.c to msmpeg4.c and disentangle init decode init.
michael
parents: 10821
diff changeset
1926 ff_msmpeg4_decode_init,
9ccc13d1144d Move AVCodecs from h263dec.c to msmpeg4.c and disentangle init decode init.
michael
parents: 10821
diff changeset
1927 NULL,
9ccc13d1144d Move AVCodecs from h263dec.c to msmpeg4.c and disentangle init decode init.
michael
parents: 10821
diff changeset
1928 ff_h263_decode_end,
9ccc13d1144d Move AVCodecs from h263dec.c to msmpeg4.c and disentangle init decode init.
michael
parents: 10821
diff changeset
1929 ff_h263_decode_frame,
9ccc13d1144d Move AVCodecs from h263dec.c to msmpeg4.c and disentangle init decode init.
michael
parents: 10821
diff changeset
1930 CODEC_CAP_DRAW_HORIZ_BAND | CODEC_CAP_DR1,
12108
c35d7bc64882 Add new decoder property max_lowres and do not init decoder if requested value is higher.
cehoyos
parents: 11644
diff changeset
1931 .max_lowres= 3,
10822
9ccc13d1144d Move AVCodecs from h263dec.c to msmpeg4.c and disentangle init decode init.
michael
parents: 10821
diff changeset
1932 .long_name= NULL_IF_CONFIG_SMALL("MPEG-4 part 2 Microsoft variant version 1"),
9ccc13d1144d Move AVCodecs from h263dec.c to msmpeg4.c and disentangle init decode init.
michael
parents: 10821
diff changeset
1933 .pix_fmts= ff_pixfmt_list_420,
9ccc13d1144d Move AVCodecs from h263dec.c to msmpeg4.c and disentangle init decode init.
michael
parents: 10821
diff changeset
1934 };
9ccc13d1144d Move AVCodecs from h263dec.c to msmpeg4.c and disentangle init decode init.
michael
parents: 10821
diff changeset
1935
9ccc13d1144d Move AVCodecs from h263dec.c to msmpeg4.c and disentangle init decode init.
michael
parents: 10821
diff changeset
1936 AVCodec msmpeg4v2_decoder = {
9ccc13d1144d Move AVCodecs from h263dec.c to msmpeg4.c and disentangle init decode init.
michael
parents: 10821
diff changeset
1937 "msmpeg4v2",
11560
8a4984c5cacc Define AVMediaType enum, and use it instead of enum CodecType, which
stefano
parents: 11075
diff changeset
1938 AVMEDIA_TYPE_VIDEO,
10822
9ccc13d1144d Move AVCodecs from h263dec.c to msmpeg4.c and disentangle init decode init.
michael
parents: 10821
diff changeset
1939 CODEC_ID_MSMPEG4V2,
9ccc13d1144d Move AVCodecs from h263dec.c to msmpeg4.c and disentangle init decode init.
michael
parents: 10821
diff changeset
1940 sizeof(MpegEncContext),
9ccc13d1144d Move AVCodecs from h263dec.c to msmpeg4.c and disentangle init decode init.
michael
parents: 10821
diff changeset
1941 ff_msmpeg4_decode_init,
9ccc13d1144d Move AVCodecs from h263dec.c to msmpeg4.c and disentangle init decode init.
michael
parents: 10821
diff changeset
1942 NULL,
9ccc13d1144d Move AVCodecs from h263dec.c to msmpeg4.c and disentangle init decode init.
michael
parents: 10821
diff changeset
1943 ff_h263_decode_end,
9ccc13d1144d Move AVCodecs from h263dec.c to msmpeg4.c and disentangle init decode init.
michael
parents: 10821
diff changeset
1944 ff_h263_decode_frame,
9ccc13d1144d Move AVCodecs from h263dec.c to msmpeg4.c and disentangle init decode init.
michael
parents: 10821
diff changeset
1945 CODEC_CAP_DRAW_HORIZ_BAND | CODEC_CAP_DR1,
12108
c35d7bc64882 Add new decoder property max_lowres and do not init decoder if requested value is higher.
cehoyos
parents: 11644
diff changeset
1946 .max_lowres= 3,
10822
9ccc13d1144d Move AVCodecs from h263dec.c to msmpeg4.c and disentangle init decode init.
michael
parents: 10821
diff changeset
1947 .long_name= NULL_IF_CONFIG_SMALL("MPEG-4 part 2 Microsoft variant version 2"),
9ccc13d1144d Move AVCodecs from h263dec.c to msmpeg4.c and disentangle init decode init.
michael
parents: 10821
diff changeset
1948 .pix_fmts= ff_pixfmt_list_420,
9ccc13d1144d Move AVCodecs from h263dec.c to msmpeg4.c and disentangle init decode init.
michael
parents: 10821
diff changeset
1949 };
9ccc13d1144d Move AVCodecs from h263dec.c to msmpeg4.c and disentangle init decode init.
michael
parents: 10821
diff changeset
1950
9ccc13d1144d Move AVCodecs from h263dec.c to msmpeg4.c and disentangle init decode init.
michael
parents: 10821
diff changeset
1951 AVCodec msmpeg4v3_decoder = {
9ccc13d1144d Move AVCodecs from h263dec.c to msmpeg4.c and disentangle init decode init.
michael
parents: 10821
diff changeset
1952 "msmpeg4",
11560
8a4984c5cacc Define AVMediaType enum, and use it instead of enum CodecType, which
stefano
parents: 11075
diff changeset
1953 AVMEDIA_TYPE_VIDEO,
10822
9ccc13d1144d Move AVCodecs from h263dec.c to msmpeg4.c and disentangle init decode init.
michael
parents: 10821
diff changeset
1954 CODEC_ID_MSMPEG4V3,
9ccc13d1144d Move AVCodecs from h263dec.c to msmpeg4.c and disentangle init decode init.
michael
parents: 10821
diff changeset
1955 sizeof(MpegEncContext),
9ccc13d1144d Move AVCodecs from h263dec.c to msmpeg4.c and disentangle init decode init.
michael
parents: 10821
diff changeset
1956 ff_msmpeg4_decode_init,
9ccc13d1144d Move AVCodecs from h263dec.c to msmpeg4.c and disentangle init decode init.
michael
parents: 10821
diff changeset
1957 NULL,
9ccc13d1144d Move AVCodecs from h263dec.c to msmpeg4.c and disentangle init decode init.
michael
parents: 10821
diff changeset
1958 ff_h263_decode_end,
9ccc13d1144d Move AVCodecs from h263dec.c to msmpeg4.c and disentangle init decode init.
michael
parents: 10821
diff changeset
1959 ff_h263_decode_frame,
9ccc13d1144d Move AVCodecs from h263dec.c to msmpeg4.c and disentangle init decode init.
michael
parents: 10821
diff changeset
1960 CODEC_CAP_DRAW_HORIZ_BAND | CODEC_CAP_DR1,
12108
c35d7bc64882 Add new decoder property max_lowres and do not init decoder if requested value is higher.
cehoyos
parents: 11644
diff changeset
1961 .max_lowres= 3,
10822
9ccc13d1144d Move AVCodecs from h263dec.c to msmpeg4.c and disentangle init decode init.
michael
parents: 10821
diff changeset
1962 .long_name= NULL_IF_CONFIG_SMALL("MPEG-4 part 2 Microsoft variant version 3"),
9ccc13d1144d Move AVCodecs from h263dec.c to msmpeg4.c and disentangle init decode init.
michael
parents: 10821
diff changeset
1963 .pix_fmts= ff_pixfmt_list_420,
9ccc13d1144d Move AVCodecs from h263dec.c to msmpeg4.c and disentangle init decode init.
michael
parents: 10821
diff changeset
1964 };
9ccc13d1144d Move AVCodecs from h263dec.c to msmpeg4.c and disentangle init decode init.
michael
parents: 10821
diff changeset
1965
9ccc13d1144d Move AVCodecs from h263dec.c to msmpeg4.c and disentangle init decode init.
michael
parents: 10821
diff changeset
1966 AVCodec wmv1_decoder = {
9ccc13d1144d Move AVCodecs from h263dec.c to msmpeg4.c and disentangle init decode init.
michael
parents: 10821
diff changeset
1967 "wmv1",
11560
8a4984c5cacc Define AVMediaType enum, and use it instead of enum CodecType, which
stefano
parents: 11075
diff changeset
1968 AVMEDIA_TYPE_VIDEO,
10822
9ccc13d1144d Move AVCodecs from h263dec.c to msmpeg4.c and disentangle init decode init.
michael
parents: 10821
diff changeset
1969 CODEC_ID_WMV1,
9ccc13d1144d Move AVCodecs from h263dec.c to msmpeg4.c and disentangle init decode init.
michael
parents: 10821
diff changeset
1970 sizeof(MpegEncContext),
9ccc13d1144d Move AVCodecs from h263dec.c to msmpeg4.c and disentangle init decode init.
michael
parents: 10821
diff changeset
1971 ff_msmpeg4_decode_init,
9ccc13d1144d Move AVCodecs from h263dec.c to msmpeg4.c and disentangle init decode init.
michael
parents: 10821
diff changeset
1972 NULL,
9ccc13d1144d Move AVCodecs from h263dec.c to msmpeg4.c and disentangle init decode init.
michael
parents: 10821
diff changeset
1973 ff_h263_decode_end,
9ccc13d1144d Move AVCodecs from h263dec.c to msmpeg4.c and disentangle init decode init.
michael
parents: 10821
diff changeset
1974 ff_h263_decode_frame,
9ccc13d1144d Move AVCodecs from h263dec.c to msmpeg4.c and disentangle init decode init.
michael
parents: 10821
diff changeset
1975 CODEC_CAP_DRAW_HORIZ_BAND | CODEC_CAP_DR1,
12108
c35d7bc64882 Add new decoder property max_lowres and do not init decoder if requested value is higher.
cehoyos
parents: 11644
diff changeset
1976 .max_lowres= 3,
10822
9ccc13d1144d Move AVCodecs from h263dec.c to msmpeg4.c and disentangle init decode init.
michael
parents: 10821
diff changeset
1977 .long_name= NULL_IF_CONFIG_SMALL("Windows Media Video 7"),
9ccc13d1144d Move AVCodecs from h263dec.c to msmpeg4.c and disentangle init decode init.
michael
parents: 10821
diff changeset
1978 .pix_fmts= ff_pixfmt_list_420,
9ccc13d1144d Move AVCodecs from h263dec.c to msmpeg4.c and disentangle init decode init.
michael
parents: 10821
diff changeset
1979 };