annotate msmpeg4.c @ 10311:943b63f364ca libavcodec

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