annotate msmpeg4.c @ 1795:920e6381e1fe libavcodec

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