annotate msmpeg4.c @ 2463:9baa47d8297b libavcodec

check norm6 vlc validity as there are some bit sequences which dont corespond to any codeword, the other vlc tables all seem to be huffman tables though
author michael
date Tue, 25 Jan 2005 01:29:10 +0000
parents 26560d4fdb1f
children ab390f13c7f5
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++)
2370
26560d4fdb1f Memory leak fix patch by (Burkhard Plaum <plaum >at< ipf.uni-stuttgart )dot( de>)
michael
parents: 2293
diff changeset
242 init_rl(&rl_table[i], 1);
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];
1938
e2501e6e7ff7 unify table indexing (motion_val,dc_val,ac_val,coded_block changed)
michael
parents: 1739
diff changeset
452 wrap = s->b8_stride;
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
1938
e2501e6e7ff7 unify table indexing (motion_val,dc_val,ac_val,coded_block changed)
michael
parents: 1739
diff changeset
570 h263_pred_motion(s, 0, 0, &pred_x, &pred_y);
310
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 */
1938
e2501e6e7ff7 unify table indexing (motion_val,dc_val,ac_val,coded_block changed)
michael
parents: 1739
diff changeset
581 h263_pred_motion(s, 0, 0, &pred_x, &pred_y);
310
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
499
8b7a54d58549 wmv1 support
michaelni
parents: 483
diff changeset
659 static inline int msmpeg4v1_pred_dc(MpegEncContext * s, int n,
1064
b32afefe7d33 * UINTX -> uintx_t INTX -> intx_t
kabi
parents: 1063
diff changeset
660 int32_t **dc_val_ptr)
457
583dcee270d2 msmpeg4v1 decoding
michaelni
parents: 440
diff changeset
661 {
583dcee270d2 msmpeg4v1 decoding
michaelni
parents: 440
diff changeset
662 int i;
583dcee270d2 msmpeg4v1 decoding
michaelni
parents: 440
diff changeset
663
583dcee270d2 msmpeg4v1 decoding
michaelni
parents: 440
diff changeset
664 if (n < 4) {
583dcee270d2 msmpeg4v1 decoding
michaelni
parents: 440
diff changeset
665 i= 0;
583dcee270d2 msmpeg4v1 decoding
michaelni
parents: 440
diff changeset
666 } else {
583dcee270d2 msmpeg4v1 decoding
michaelni
parents: 440
diff changeset
667 i= n-3;
583dcee270d2 msmpeg4v1 decoding
michaelni
parents: 440
diff changeset
668 }
583dcee270d2 msmpeg4v1 decoding
michaelni
parents: 440
diff changeset
669
583dcee270d2 msmpeg4v1 decoding
michaelni
parents: 440
diff changeset
670 *dc_val_ptr= &s->last_dc[i];
583dcee270d2 msmpeg4v1 decoding
michaelni
parents: 440
diff changeset
671 return s->last_dc[i];
583dcee270d2 msmpeg4v1 decoding
michaelni
parents: 440
diff changeset
672 }
583dcee270d2 msmpeg4v1 decoding
michaelni
parents: 440
diff changeset
673
519
55b4e2248a45 wmv1 slice_height != mb_height support
michaelni
parents: 501
diff changeset
674 static int get_dc(uint8_t *src, int stride, int scale)
55b4e2248a45 wmv1 slice_height != mb_height support
michaelni
parents: 501
diff changeset
675 {
55b4e2248a45 wmv1 slice_height != mb_height support
michaelni
parents: 501
diff changeset
676 int y;
55b4e2248a45 wmv1 slice_height != mb_height support
michaelni
parents: 501
diff changeset
677 int sum=0;
55b4e2248a45 wmv1 slice_height != mb_height support
michaelni
parents: 501
diff changeset
678 for(y=0; y<8; y++){
55b4e2248a45 wmv1 slice_height != mb_height support
michaelni
parents: 501
diff changeset
679 int x;
55b4e2248a45 wmv1 slice_height != mb_height support
michaelni
parents: 501
diff changeset
680 for(x=0; x<8; x++){
55b4e2248a45 wmv1 slice_height != mb_height support
michaelni
parents: 501
diff changeset
681 sum+=src[x + y*stride];
55b4e2248a45 wmv1 slice_height != mb_height support
michaelni
parents: 501
diff changeset
682 }
55b4e2248a45 wmv1 slice_height != mb_height support
michaelni
parents: 501
diff changeset
683 }
1261
362947395f5c fastdiv patch by (BERO <bero at geocities dot co dot jp>) with fixes & cleanup by me
michaelni
parents: 1255
diff changeset
684 return FASTDIV((sum + (scale>>1)), scale);
519
55b4e2248a45 wmv1 slice_height != mb_height support
michaelni
parents: 501
diff changeset
685 }
55b4e2248a45 wmv1 slice_height != mb_height support
michaelni
parents: 501
diff changeset
686
0
986e461dc072 Initial revision
glantau
parents:
diff changeset
687 /* dir = 0: left, dir = 1: top prediction */
499
8b7a54d58549 wmv1 support
michaelni
parents: 483
diff changeset
688 static inline int msmpeg4_pred_dc(MpegEncContext * s, int n,
1064
b32afefe7d33 * UINTX -> uintx_t INTX -> intx_t
kabi
parents: 1063
diff changeset
689 uint16_t **dc_val_ptr, int *dir_ptr)
0
986e461dc072 Initial revision
glantau
parents:
diff changeset
690 {
299
fb9e77674bd4 minor optimizations / simplifications
michaelni
parents: 251
diff changeset
691 int a, b, c, wrap, pred, scale;
1064
b32afefe7d33 * UINTX -> uintx_t INTX -> intx_t
kabi
parents: 1063
diff changeset
692 int16_t *dc_val;
0
986e461dc072 Initial revision
glantau
parents:
diff changeset
693
986e461dc072 Initial revision
glantau
parents:
diff changeset
694 /* find prediction */
986e461dc072 Initial revision
glantau
parents:
diff changeset
695 if (n < 4) {
986e461dc072 Initial revision
glantau
parents:
diff changeset
696 scale = s->y_dc_scale;
986e461dc072 Initial revision
glantau
parents:
diff changeset
697 } else {
986e461dc072 Initial revision
glantau
parents:
diff changeset
698 scale = s->c_dc_scale;
986e461dc072 Initial revision
glantau
parents:
diff changeset
699 }
457
583dcee270d2 msmpeg4v1 decoding
michaelni
parents: 440
diff changeset
700
299
fb9e77674bd4 minor optimizations / simplifications
michaelni
parents: 251
diff changeset
701 wrap = s->block_wrap[n];
fb9e77674bd4 minor optimizations / simplifications
michaelni
parents: 251
diff changeset
702 dc_val= s->dc_val[0] + s->block_index[n];
0
986e461dc072 Initial revision
glantau
parents:
diff changeset
703
986e461dc072 Initial revision
glantau
parents:
diff changeset
704 /* B C
986e461dc072 Initial revision
glantau
parents:
diff changeset
705 * A X
986e461dc072 Initial revision
glantau
parents:
diff changeset
706 */
299
fb9e77674bd4 minor optimizations / simplifications
michaelni
parents: 251
diff changeset
707 a = dc_val[ - 1];
fb9e77674bd4 minor optimizations / simplifications
michaelni
parents: 251
diff changeset
708 b = dc_val[ - 1 - wrap];
fb9e77674bd4 minor optimizations / simplifications
michaelni
parents: 251
diff changeset
709 c = dc_val[ - wrap];
745
25d7fb7c89be better/cleaner error resilience (done in a 2nd pass after decoding)
michaelni
parents: 743
diff changeset
710
983
ca2a303ea039 fixed wmv2 slices
michaelni
parents: 936
diff changeset
711 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
712 b=c=1024;
25d7fb7c89be better/cleaner error resilience (done in a 2nd pass after decoding)
michaelni
parents: 743
diff changeset
713 }
0
986e461dc072 Initial revision
glantau
parents:
diff changeset
714
986e461dc072 Initial revision
glantau
parents:
diff changeset
715 /* XXX: the following solution consumes divisions, but it does not
986e461dc072 Initial revision
glantau
parents:
diff changeset
716 necessitate to modify mpegvideo.c. The problem comes from the
986e461dc072 Initial revision
glantau
parents:
diff changeset
717 fact they decided to store the quantized DC (which would lead
986e461dc072 Initial revision
glantau
parents:
diff changeset
718 to problems if Q could vary !) */
2293
15cfba1b97b5 adapting existing mmx/mmx2/sse/3dnow optimizations so they work on x86_64 patch by (Aurelien Jacobs <aurel at gnuage dot org>)
michael
parents: 2031
diff changeset
719 #if (defined(ARCH_X86) || defined(ARCH_X86_64)) && !defined PIC
204
fceb435fae6b (commit by michael)
arpi_esp
parents: 201
diff changeset
720 asm volatile(
fceb435fae6b (commit by michael)
arpi_esp
parents: 201
diff changeset
721 "movl %3, %%eax \n\t"
fceb435fae6b (commit by michael)
arpi_esp
parents: 201
diff changeset
722 "shrl $1, %%eax \n\t"
fceb435fae6b (commit by michael)
arpi_esp
parents: 201
diff changeset
723 "addl %%eax, %2 \n\t"
fceb435fae6b (commit by michael)
arpi_esp
parents: 201
diff changeset
724 "addl %%eax, %1 \n\t"
fceb435fae6b (commit by michael)
arpi_esp
parents: 201
diff changeset
725 "addl %0, %%eax \n\t"
225
ae145876789d use multiply instead of divides for DC prediction on X86
michaelni
parents: 221
diff changeset
726 "mull %4 \n\t"
ae145876789d use multiply instead of divides for DC prediction on X86
michaelni
parents: 221
diff changeset
727 "movl %%edx, %0 \n\t"
204
fceb435fae6b (commit by michael)
arpi_esp
parents: 201
diff changeset
728 "movl %1, %%eax \n\t"
225
ae145876789d use multiply instead of divides for DC prediction on X86
michaelni
parents: 221
diff changeset
729 "mull %4 \n\t"
ae145876789d use multiply instead of divides for DC prediction on X86
michaelni
parents: 221
diff changeset
730 "movl %%edx, %1 \n\t"
204
fceb435fae6b (commit by michael)
arpi_esp
parents: 201
diff changeset
731 "movl %2, %%eax \n\t"
225
ae145876789d use multiply instead of divides for DC prediction on X86
michaelni
parents: 221
diff changeset
732 "mull %4 \n\t"
ae145876789d use multiply instead of divides for DC prediction on X86
michaelni
parents: 221
diff changeset
733 "movl %%edx, %2 \n\t"
228
3c2bad70a196 workaround gcc 2.95.2 bug
michaelni
parents: 225
diff changeset
734 : "+b" (a), "+c" (b), "+D" (c)
3c2bad70a196 workaround gcc 2.95.2 bug
michaelni
parents: 225
diff changeset
735 : "g" (scale), "S" (inverse[scale])
204
fceb435fae6b (commit by michael)
arpi_esp
parents: 201
diff changeset
736 : "%eax", "%edx"
fceb435fae6b (commit by michael)
arpi_esp
parents: 201
diff changeset
737 );
221
fe243b4aec02 * temporal solution for shared lib compilation
kabi
parents: 214
diff changeset
738 #else
fe243b4aec02 * temporal solution for shared lib compilation
kabi
parents: 214
diff changeset
739 /* #elif defined (ARCH_ALPHA) */
214
73df666cacc7 Alpha optimizations by Falk Hueffner <falk.hueffner@student.uni-tuebingen.de>
nickols_k
parents: 208
diff changeset
740 /* Divisions are extremely costly on Alpha; optimize the most
221
fe243b4aec02 * temporal solution for shared lib compilation
kabi
parents: 214
diff changeset
741 common case. But they are costly everywhere...
fe243b4aec02 * temporal solution for shared lib compilation
kabi
parents: 214
diff changeset
742 */
214
73df666cacc7 Alpha optimizations by Falk Hueffner <falk.hueffner@student.uni-tuebingen.de>
nickols_k
parents: 208
diff changeset
743 if (scale == 8) {
73df666cacc7 Alpha optimizations by Falk Hueffner <falk.hueffner@student.uni-tuebingen.de>
nickols_k
parents: 208
diff changeset
744 a = (a + (8 >> 1)) / 8;
73df666cacc7 Alpha optimizations by Falk Hueffner <falk.hueffner@student.uni-tuebingen.de>
nickols_k
parents: 208
diff changeset
745 b = (b + (8 >> 1)) / 8;
73df666cacc7 Alpha optimizations by Falk Hueffner <falk.hueffner@student.uni-tuebingen.de>
nickols_k
parents: 208
diff changeset
746 c = (c + (8 >> 1)) / 8;
73df666cacc7 Alpha optimizations by Falk Hueffner <falk.hueffner@student.uni-tuebingen.de>
nickols_k
parents: 208
diff changeset
747 } else {
1261
362947395f5c fastdiv patch by (BERO <bero at geocities dot co dot jp>) with fixes & cleanup by me
michaelni
parents: 1255
diff changeset
748 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
749 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
750 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
751 }
204
fceb435fae6b (commit by michael)
arpi_esp
parents: 201
diff changeset
752 #endif
0
986e461dc072 Initial revision
glantau
parents:
diff changeset
753 /* XXX: WARNING: they did not choose the same test as MPEG4. This
986e461dc072 Initial revision
glantau
parents:
diff changeset
754 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
755 if(s->msmpeg4_version>3){
519
55b4e2248a45 wmv1 slice_height != mb_height support
michaelni
parents: 501
diff changeset
756 if(s->inter_intra_pred){
55b4e2248a45 wmv1 slice_height != mb_height support
michaelni
parents: 501
diff changeset
757 uint8_t *dest;
55b4e2248a45 wmv1 slice_height != mb_height support
michaelni
parents: 501
diff changeset
758 int wrap;
55b4e2248a45 wmv1 slice_height != mb_height support
michaelni
parents: 501
diff changeset
759
55b4e2248a45 wmv1 slice_height != mb_height support
michaelni
parents: 501
diff changeset
760 if(n==1){
55b4e2248a45 wmv1 slice_height != mb_height support
michaelni
parents: 501
diff changeset
761 pred=a;
55b4e2248a45 wmv1 slice_height != mb_height support
michaelni
parents: 501
diff changeset
762 *dir_ptr = 0;
55b4e2248a45 wmv1 slice_height != mb_height support
michaelni
parents: 501
diff changeset
763 }else if(n==2){
55b4e2248a45 wmv1 slice_height != mb_height support
michaelni
parents: 501
diff changeset
764 pred=c;
55b4e2248a45 wmv1 slice_height != mb_height support
michaelni
parents: 501
diff changeset
765 *dir_ptr = 1;
55b4e2248a45 wmv1 slice_height != mb_height support
michaelni
parents: 501
diff changeset
766 }else if(n==3){
55b4e2248a45 wmv1 slice_height != mb_height support
michaelni
parents: 501
diff changeset
767 if (abs(a - b) < abs(b - c)) {
55b4e2248a45 wmv1 slice_height != mb_height support
michaelni
parents: 501
diff changeset
768 pred = c;
55b4e2248a45 wmv1 slice_height != mb_height support
michaelni
parents: 501
diff changeset
769 *dir_ptr = 1;
55b4e2248a45 wmv1 slice_height != mb_height support
michaelni
parents: 501
diff changeset
770 } else {
55b4e2248a45 wmv1 slice_height != mb_height support
michaelni
parents: 501
diff changeset
771 pred = a;
55b4e2248a45 wmv1 slice_height != mb_height support
michaelni
parents: 501
diff changeset
772 *dir_ptr = 0;
55b4e2248a45 wmv1 slice_height != mb_height support
michaelni
parents: 501
diff changeset
773 }
55b4e2248a45 wmv1 slice_height != mb_height support
michaelni
parents: 501
diff changeset
774 }else{
55b4e2248a45 wmv1 slice_height != mb_height support
michaelni
parents: 501
diff changeset
775 if(n<4){
55b4e2248a45 wmv1 slice_height != mb_height support
michaelni
parents: 501
diff changeset
776 wrap= s->linesize;
903
22ee74da2cd3 cleanup
michaelni
parents: 847
diff changeset
777 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
778 }else{
556
762c67fd4078 uvlinesize
michaelni
parents: 542
diff changeset
779 wrap= s->uvlinesize;
903
22ee74da2cd3 cleanup
michaelni
parents: 847
diff changeset
780 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
781 }
55b4e2248a45 wmv1 slice_height != mb_height support
michaelni
parents: 501
diff changeset
782 if(s->mb_x==0) a= (1024 + (scale>>1))/scale;
55b4e2248a45 wmv1 slice_height != mb_height support
michaelni
parents: 501
diff changeset
783 else a= get_dc(dest-8, wrap, scale*8);
55b4e2248a45 wmv1 slice_height != mb_height support
michaelni
parents: 501
diff changeset
784 if(s->mb_y==0) c= (1024 + (scale>>1))/scale;
55b4e2248a45 wmv1 slice_height != mb_height support
michaelni
parents: 501
diff changeset
785 else c= get_dc(dest-8*wrap, wrap, scale*8);
55b4e2248a45 wmv1 slice_height != mb_height support
michaelni
parents: 501
diff changeset
786
55b4e2248a45 wmv1 slice_height != mb_height support
michaelni
parents: 501
diff changeset
787 if (s->h263_aic_dir==0) {
55b4e2248a45 wmv1 slice_height != mb_height support
michaelni
parents: 501
diff changeset
788 pred= a;
55b4e2248a45 wmv1 slice_height != mb_height support
michaelni
parents: 501
diff changeset
789 *dir_ptr = 0;
55b4e2248a45 wmv1 slice_height != mb_height support
michaelni
parents: 501
diff changeset
790 }else if (s->h263_aic_dir==1) {
55b4e2248a45 wmv1 slice_height != mb_height support
michaelni
parents: 501
diff changeset
791 if(n==0){
55b4e2248a45 wmv1 slice_height != mb_height support
michaelni
parents: 501
diff changeset
792 pred= c;
55b4e2248a45 wmv1 slice_height != mb_height support
michaelni
parents: 501
diff changeset
793 *dir_ptr = 1;
55b4e2248a45 wmv1 slice_height != mb_height support
michaelni
parents: 501
diff changeset
794 }else{
55b4e2248a45 wmv1 slice_height != mb_height support
michaelni
parents: 501
diff changeset
795 pred= a;
55b4e2248a45 wmv1 slice_height != mb_height support
michaelni
parents: 501
diff changeset
796 *dir_ptr = 0;
55b4e2248a45 wmv1 slice_height != mb_height support
michaelni
parents: 501
diff changeset
797 }
55b4e2248a45 wmv1 slice_height != mb_height support
michaelni
parents: 501
diff changeset
798 }else if (s->h263_aic_dir==2) {
55b4e2248a45 wmv1 slice_height != mb_height support
michaelni
parents: 501
diff changeset
799 if(n==0){
55b4e2248a45 wmv1 slice_height != mb_height support
michaelni
parents: 501
diff changeset
800 pred= a;
55b4e2248a45 wmv1 slice_height != mb_height support
michaelni
parents: 501
diff changeset
801 *dir_ptr = 0;
55b4e2248a45 wmv1 slice_height != mb_height support
michaelni
parents: 501
diff changeset
802 }else{
55b4e2248a45 wmv1 slice_height != mb_height support
michaelni
parents: 501
diff changeset
803 pred= c;
55b4e2248a45 wmv1 slice_height != mb_height support
michaelni
parents: 501
diff changeset
804 *dir_ptr = 1;
55b4e2248a45 wmv1 slice_height != mb_height support
michaelni
parents: 501
diff changeset
805 }
55b4e2248a45 wmv1 slice_height != mb_height support
michaelni
parents: 501
diff changeset
806 } else {
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 }
55b4e2248a45 wmv1 slice_height != mb_height support
michaelni
parents: 501
diff changeset
810 }
55b4e2248a45 wmv1 slice_height != mb_height support
michaelni
parents: 501
diff changeset
811 }else{
55b4e2248a45 wmv1 slice_height != mb_height support
michaelni
parents: 501
diff changeset
812 if (abs(a - b) < abs(b - c)) {
55b4e2248a45 wmv1 slice_height != mb_height support
michaelni
parents: 501
diff changeset
813 pred = c;
55b4e2248a45 wmv1 slice_height != mb_height support
michaelni
parents: 501
diff changeset
814 *dir_ptr = 1;
55b4e2248a45 wmv1 slice_height != mb_height support
michaelni
parents: 501
diff changeset
815 } else {
55b4e2248a45 wmv1 slice_height != mb_height support
michaelni
parents: 501
diff changeset
816 pred = a;
55b4e2248a45 wmv1 slice_height != mb_height support
michaelni
parents: 501
diff changeset
817 *dir_ptr = 0;
55b4e2248a45 wmv1 slice_height != mb_height support
michaelni
parents: 501
diff changeset
818 }
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
819 }
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
820 }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
821 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
822 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
823 *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
824 } 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
825 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
826 *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
827 }
0
986e461dc072 Initial revision
glantau
parents:
diff changeset
828 }
986e461dc072 Initial revision
glantau
parents:
diff changeset
829
986e461dc072 Initial revision
glantau
parents:
diff changeset
830 /* update predictor */
299
fb9e77674bd4 minor optimizations / simplifications
michaelni
parents: 251
diff changeset
831 *dc_val_ptr = &dc_val[0];
0
986e461dc072 Initial revision
glantau
parents:
diff changeset
832 return pred;
986e461dc072 Initial revision
glantau
parents:
diff changeset
833 }
986e461dc072 Initial revision
glantau
parents:
diff changeset
834
986e461dc072 Initial revision
glantau
parents:
diff changeset
835 #define DC_MAX 119
986e461dc072 Initial revision
glantau
parents:
diff changeset
836
986e461dc072 Initial revision
glantau
parents:
diff changeset
837 static void msmpeg4_encode_dc(MpegEncContext * s, int level, int n, int *dir_ptr)
986e461dc072 Initial revision
glantau
parents:
diff changeset
838 {
986e461dc072 Initial revision
glantau
parents:
diff changeset
839 int sign, code;
986e461dc072 Initial revision
glantau
parents:
diff changeset
840 int pred;
986e461dc072 Initial revision
glantau
parents:
diff changeset
841
457
583dcee270d2 msmpeg4v1 decoding
michaelni
parents: 440
diff changeset
842 if(s->msmpeg4_version==1){
1064
b32afefe7d33 * UINTX -> uintx_t INTX -> intx_t
kabi
parents: 1063
diff changeset
843 int32_t *dc_val;
457
583dcee270d2 msmpeg4v1 decoding
michaelni
parents: 440
diff changeset
844 pred = msmpeg4v1_pred_dc(s, n, &dc_val);
583dcee270d2 msmpeg4v1 decoding
michaelni
parents: 440
diff changeset
845
583dcee270d2 msmpeg4v1 decoding
michaelni
parents: 440
diff changeset
846 /* update predictor */
583dcee270d2 msmpeg4v1 decoding
michaelni
parents: 440
diff changeset
847 *dc_val= level;
583dcee270d2 msmpeg4v1 decoding
michaelni
parents: 440
diff changeset
848 }else{
1064
b32afefe7d33 * UINTX -> uintx_t INTX -> intx_t
kabi
parents: 1063
diff changeset
849 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
850 pred = msmpeg4_pred_dc(s, n, &dc_val, dir_ptr);
457
583dcee270d2 msmpeg4v1 decoding
michaelni
parents: 440
diff changeset
851
583dcee270d2 msmpeg4v1 decoding
michaelni
parents: 440
diff changeset
852 /* update predictor */
583dcee270d2 msmpeg4v1 decoding
michaelni
parents: 440
diff changeset
853 if (n < 4) {
583dcee270d2 msmpeg4v1 decoding
michaelni
parents: 440
diff changeset
854 *dc_val = level * s->y_dc_scale;
583dcee270d2 msmpeg4v1 decoding
michaelni
parents: 440
diff changeset
855 } else {
583dcee270d2 msmpeg4v1 decoding
michaelni
parents: 440
diff changeset
856 *dc_val = level * s->c_dc_scale;
583dcee270d2 msmpeg4v1 decoding
michaelni
parents: 440
diff changeset
857 }
0
986e461dc072 Initial revision
glantau
parents:
diff changeset
858 }
986e461dc072 Initial revision
glantau
parents:
diff changeset
859
986e461dc072 Initial revision
glantau
parents:
diff changeset
860 /* do the prediction */
986e461dc072 Initial revision
glantau
parents:
diff changeset
861 level -= pred;
986e461dc072 Initial revision
glantau
parents:
diff changeset
862
457
583dcee270d2 msmpeg4v1 decoding
michaelni
parents: 440
diff changeset
863 if(s->msmpeg4_version<=2){
310
49e73229a5e6 msmpeg4v2 encoding
michaelni
parents: 309
diff changeset
864 if (n < 4) {
49e73229a5e6 msmpeg4v2 encoding
michaelni
parents: 309
diff changeset
865 put_bits(&s->pb,
49e73229a5e6 msmpeg4v2 encoding
michaelni
parents: 309
diff changeset
866 v2_dc_lum_table[level+256][1],
49e73229a5e6 msmpeg4v2 encoding
michaelni
parents: 309
diff changeset
867 v2_dc_lum_table[level+256][0]);
49e73229a5e6 msmpeg4v2 encoding
michaelni
parents: 309
diff changeset
868 }else{
49e73229a5e6 msmpeg4v2 encoding
michaelni
parents: 309
diff changeset
869 put_bits(&s->pb,
49e73229a5e6 msmpeg4v2 encoding
michaelni
parents: 309
diff changeset
870 v2_dc_chroma_table[level+256][1],
49e73229a5e6 msmpeg4v2 encoding
michaelni
parents: 309
diff changeset
871 v2_dc_chroma_table[level+256][0]);
49e73229a5e6 msmpeg4v2 encoding
michaelni
parents: 309
diff changeset
872 }
49e73229a5e6 msmpeg4v2 encoding
michaelni
parents: 309
diff changeset
873 }else{
49e73229a5e6 msmpeg4v2 encoding
michaelni
parents: 309
diff changeset
874 sign = 0;
49e73229a5e6 msmpeg4v2 encoding
michaelni
parents: 309
diff changeset
875 if (level < 0) {
49e73229a5e6 msmpeg4v2 encoding
michaelni
parents: 309
diff changeset
876 level = -level;
49e73229a5e6 msmpeg4v2 encoding
michaelni
parents: 309
diff changeset
877 sign = 1;
49e73229a5e6 msmpeg4v2 encoding
michaelni
parents: 309
diff changeset
878 }
49e73229a5e6 msmpeg4v2 encoding
michaelni
parents: 309
diff changeset
879 code = level;
49e73229a5e6 msmpeg4v2 encoding
michaelni
parents: 309
diff changeset
880 if (code > DC_MAX)
49e73229a5e6 msmpeg4v2 encoding
michaelni
parents: 309
diff changeset
881 code = DC_MAX;
0
986e461dc072 Initial revision
glantau
parents:
diff changeset
882
310
49e73229a5e6 msmpeg4v2 encoding
michaelni
parents: 309
diff changeset
883 if (s->dc_table_index == 0) {
49e73229a5e6 msmpeg4v2 encoding
michaelni
parents: 309
diff changeset
884 if (n < 4) {
49e73229a5e6 msmpeg4v2 encoding
michaelni
parents: 309
diff changeset
885 put_bits(&s->pb, table0_dc_lum[code][1], table0_dc_lum[code][0]);
49e73229a5e6 msmpeg4v2 encoding
michaelni
parents: 309
diff changeset
886 } else {
49e73229a5e6 msmpeg4v2 encoding
michaelni
parents: 309
diff changeset
887 put_bits(&s->pb, table0_dc_chroma[code][1], table0_dc_chroma[code][0]);
49e73229a5e6 msmpeg4v2 encoding
michaelni
parents: 309
diff changeset
888 }
0
986e461dc072 Initial revision
glantau
parents:
diff changeset
889 } else {
310
49e73229a5e6 msmpeg4v2 encoding
michaelni
parents: 309
diff changeset
890 if (n < 4) {
49e73229a5e6 msmpeg4v2 encoding
michaelni
parents: 309
diff changeset
891 put_bits(&s->pb, table1_dc_lum[code][1], table1_dc_lum[code][0]);
49e73229a5e6 msmpeg4v2 encoding
michaelni
parents: 309
diff changeset
892 } else {
49e73229a5e6 msmpeg4v2 encoding
michaelni
parents: 309
diff changeset
893 put_bits(&s->pb, table1_dc_chroma[code][1], table1_dc_chroma[code][0]);
49e73229a5e6 msmpeg4v2 encoding
michaelni
parents: 309
diff changeset
894 }
0
986e461dc072 Initial revision
glantau
parents:
diff changeset
895 }
310
49e73229a5e6 msmpeg4v2 encoding
michaelni
parents: 309
diff changeset
896
49e73229a5e6 msmpeg4v2 encoding
michaelni
parents: 309
diff changeset
897 if (code == DC_MAX)
49e73229a5e6 msmpeg4v2 encoding
michaelni
parents: 309
diff changeset
898 put_bits(&s->pb, 8, level);
49e73229a5e6 msmpeg4v2 encoding
michaelni
parents: 309
diff changeset
899
49e73229a5e6 msmpeg4v2 encoding
michaelni
parents: 309
diff changeset
900 if (level != 0) {
49e73229a5e6 msmpeg4v2 encoding
michaelni
parents: 309
diff changeset
901 put_bits(&s->pb, 1, sign);
49e73229a5e6 msmpeg4v2 encoding
michaelni
parents: 309
diff changeset
902 }
0
986e461dc072 Initial revision
glantau
parents:
diff changeset
903 }
986e461dc072 Initial revision
glantau
parents:
diff changeset
904 }
986e461dc072 Initial revision
glantau
parents:
diff changeset
905
986e461dc072 Initial revision
glantau
parents:
diff changeset
906 /* Encoding of a block. Very similar to MPEG4 except for a different
986e461dc072 Initial revision
glantau
parents:
diff changeset
907 escape coding (same as H263) and more vlc tables.
986e461dc072 Initial revision
glantau
parents:
diff changeset
908 */
499
8b7a54d58549 wmv1 support
michaelni
parents: 483
diff changeset
909 static inline void msmpeg4_encode_block(MpegEncContext * s, DCTELEM * block, int n)
0
986e461dc072 Initial revision
glantau
parents:
diff changeset
910 {
986e461dc072 Initial revision
glantau
parents:
diff changeset
911 int level, run, last, i, j, last_index;
986e461dc072 Initial revision
glantau
parents:
diff changeset
912 int last_non_zero, sign, slevel;
986e461dc072 Initial revision
glantau
parents:
diff changeset
913 int code, run_diff, dc_pred_dir;
986e461dc072 Initial revision
glantau
parents:
diff changeset
914 const RLTable *rl;
1064
b32afefe7d33 * UINTX -> uintx_t INTX -> intx_t
kabi
parents: 1063
diff changeset
915 const uint8_t *scantable;
0
986e461dc072 Initial revision
glantau
parents:
diff changeset
916
986e461dc072 Initial revision
glantau
parents:
diff changeset
917 if (s->mb_intra) {
986e461dc072 Initial revision
glantau
parents:
diff changeset
918 set_stat(ST_DC);
986e461dc072 Initial revision
glantau
parents:
diff changeset
919 msmpeg4_encode_dc(s, block[0], n, &dc_pred_dir);
986e461dc072 Initial revision
glantau
parents:
diff changeset
920 i = 1;
986e461dc072 Initial revision
glantau
parents:
diff changeset
921 if (n < 4) {
986e461dc072 Initial revision
glantau
parents:
diff changeset
922 rl = &rl_table[s->rl_table_index];
986e461dc072 Initial revision
glantau
parents:
diff changeset
923 } else {
986e461dc072 Initial revision
glantau
parents:
diff changeset
924 rl = &rl_table[3 + s->rl_chroma_table_index];
986e461dc072 Initial revision
glantau
parents:
diff changeset
925 }
986e461dc072 Initial revision
glantau
parents:
diff changeset
926 run_diff = 0;
706
e65798d228ea idct permutation cleanup, idct can be selected per context now
michaelni
parents: 601
diff changeset
927 scantable= s->intra_scantable.permutated;
0
986e461dc072 Initial revision
glantau
parents:
diff changeset
928 set_stat(ST_INTRA_AC);
986e461dc072 Initial revision
glantau
parents:
diff changeset
929 } else {
986e461dc072 Initial revision
glantau
parents:
diff changeset
930 i = 0;
986e461dc072 Initial revision
glantau
parents:
diff changeset
931 rl = &rl_table[3 + s->rl_table_index];
457
583dcee270d2 msmpeg4v1 decoding
michaelni
parents: 440
diff changeset
932 if(s->msmpeg4_version<=2)
310
49e73229a5e6 msmpeg4v2 encoding
michaelni
parents: 309
diff changeset
933 run_diff = 0;
49e73229a5e6 msmpeg4v2 encoding
michaelni
parents: 309
diff changeset
934 else
49e73229a5e6 msmpeg4v2 encoding
michaelni
parents: 309
diff changeset
935 run_diff = 1;
706
e65798d228ea idct permutation cleanup, idct can be selected per context now
michaelni
parents: 601
diff changeset
936 scantable= s->inter_scantable.permutated;
0
986e461dc072 Initial revision
glantau
parents:
diff changeset
937 set_stat(ST_INTER_AC);
986e461dc072 Initial revision
glantau
parents:
diff changeset
938 }
986e461dc072 Initial revision
glantau
parents:
diff changeset
939
499
8b7a54d58549 wmv1 support
michaelni
parents: 483
diff changeset
940 /* recalculate block_last_index for M$ wmv1 */
936
caa77cd960c0 qpel encoding
michaelni
parents: 903
diff changeset
941 if(s->msmpeg4_version>=4 && s->block_last_index[n]>0){
499
8b7a54d58549 wmv1 support
michaelni
parents: 483
diff changeset
942 for(last_index=63; last_index>=0; last_index--){
8b7a54d58549 wmv1 support
michaelni
parents: 483
diff changeset
943 if(block[scantable[last_index]]) break;
8b7a54d58549 wmv1 support
michaelni
parents: 483
diff changeset
944 }
745
25d7fb7c89be better/cleaner error resilience (done in a 2nd pass after decoding)
michaelni
parents: 743
diff changeset
945 s->block_last_index[n]= last_index;
499
8b7a54d58549 wmv1 support
michaelni
parents: 483
diff changeset
946 }else
8b7a54d58549 wmv1 support
michaelni
parents: 483
diff changeset
947 last_index = s->block_last_index[n];
0
986e461dc072 Initial revision
glantau
parents:
diff changeset
948 /* AC coefs */
986e461dc072 Initial revision
glantau
parents:
diff changeset
949 last_non_zero = i - 1;
986e461dc072 Initial revision
glantau
parents:
diff changeset
950 for (; i <= last_index; i++) {
499
8b7a54d58549 wmv1 support
michaelni
parents: 483
diff changeset
951 j = scantable[i];
0
986e461dc072 Initial revision
glantau
parents:
diff changeset
952 level = block[j];
986e461dc072 Initial revision
glantau
parents:
diff changeset
953 if (level) {
986e461dc072 Initial revision
glantau
parents:
diff changeset
954 run = i - last_non_zero - 1;
986e461dc072 Initial revision
glantau
parents:
diff changeset
955 last = (i == last_index);
986e461dc072 Initial revision
glantau
parents:
diff changeset
956 sign = 0;
986e461dc072 Initial revision
glantau
parents:
diff changeset
957 slevel = level;
986e461dc072 Initial revision
glantau
parents:
diff changeset
958 if (level < 0) {
986e461dc072 Initial revision
glantau
parents:
diff changeset
959 sign = 1;
986e461dc072 Initial revision
glantau
parents:
diff changeset
960 level = -level;
986e461dc072 Initial revision
glantau
parents:
diff changeset
961 }
601
76e9b51cccda faster vlc table selection
michaelni
parents: 596
diff changeset
962
499
8b7a54d58549 wmv1 support
michaelni
parents: 483
diff changeset
963 if(level<=MAX_LEVEL && run<=MAX_RUN){
8b7a54d58549 wmv1 support
michaelni
parents: 483
diff changeset
964 s->ac_stats[s->mb_intra][n>3][level][run][last]++;
8b7a54d58549 wmv1 support
michaelni
parents: 483
diff changeset
965 }
8b7a54d58549 wmv1 support
michaelni
parents: 483
diff changeset
966 #if 0
8b7a54d58549 wmv1 support
michaelni
parents: 483
diff changeset
967 else
8b7a54d58549 wmv1 support
michaelni
parents: 483
diff changeset
968 s->ac_stats[s->mb_intra][n>3][40][63][0]++; //esc3 like
8b7a54d58549 wmv1 support
michaelni
parents: 483
diff changeset
969 #endif
0
986e461dc072 Initial revision
glantau
parents:
diff changeset
970 code = get_rl_index(rl, last, run, level);
986e461dc072 Initial revision
glantau
parents:
diff changeset
971 put_bits(&s->pb, rl->table_vlc[code][1], rl->table_vlc[code][0]);
986e461dc072 Initial revision
glantau
parents:
diff changeset
972 if (code == rl->n) {
986e461dc072 Initial revision
glantau
parents:
diff changeset
973 int level1, run1;
986e461dc072 Initial revision
glantau
parents:
diff changeset
974
986e461dc072 Initial revision
glantau
parents:
diff changeset
975 level1 = level - rl->max_level[last][run];
986e461dc072 Initial revision
glantau
parents:
diff changeset
976 if (level1 < 1)
986e461dc072 Initial revision
glantau
parents:
diff changeset
977 goto esc2;
986e461dc072 Initial revision
glantau
parents:
diff changeset
978 code = get_rl_index(rl, last, run, level1);
986e461dc072 Initial revision
glantau
parents:
diff changeset
979 if (code == rl->n) {
986e461dc072 Initial revision
glantau
parents:
diff changeset
980 esc2:
986e461dc072 Initial revision
glantau
parents:
diff changeset
981 put_bits(&s->pb, 1, 0);
986e461dc072 Initial revision
glantau
parents:
diff changeset
982 if (level > MAX_LEVEL)
986e461dc072 Initial revision
glantau
parents:
diff changeset
983 goto esc3;
986e461dc072 Initial revision
glantau
parents:
diff changeset
984 run1 = run - rl->max_run[last][level] - run_diff;
986e461dc072 Initial revision
glantau
parents:
diff changeset
985 if (run1 < 0)
986e461dc072 Initial revision
glantau
parents:
diff changeset
986 goto esc3;
986e461dc072 Initial revision
glantau
parents:
diff changeset
987 code = get_rl_index(rl, last, run1, level);
986e461dc072 Initial revision
glantau
parents:
diff changeset
988 if (code == rl->n) {
986e461dc072 Initial revision
glantau
parents:
diff changeset
989 esc3:
986e461dc072 Initial revision
glantau
parents:
diff changeset
990 /* third escape */
986e461dc072 Initial revision
glantau
parents:
diff changeset
991 put_bits(&s->pb, 1, 0);
986e461dc072 Initial revision
glantau
parents:
diff changeset
992 put_bits(&s->pb, 1, last);
936
caa77cd960c0 qpel encoding
michaelni
parents: 903
diff changeset
993 if(s->msmpeg4_version>=4){
499
8b7a54d58549 wmv1 support
michaelni
parents: 483
diff changeset
994 if(s->esc3_level_length==0){
8b7a54d58549 wmv1 support
michaelni
parents: 483
diff changeset
995 s->esc3_level_length=8;
8b7a54d58549 wmv1 support
michaelni
parents: 483
diff changeset
996 s->esc3_run_length= 6;
8b7a54d58549 wmv1 support
michaelni
parents: 483
diff changeset
997 if(s->qscale<8)
8b7a54d58549 wmv1 support
michaelni
parents: 483
diff changeset
998 put_bits(&s->pb, 6, 3);
8b7a54d58549 wmv1 support
michaelni
parents: 483
diff changeset
999 else
8b7a54d58549 wmv1 support
michaelni
parents: 483
diff changeset
1000 put_bits(&s->pb, 8, 3);
8b7a54d58549 wmv1 support
michaelni
parents: 483
diff changeset
1001 }
8b7a54d58549 wmv1 support
michaelni
parents: 483
diff changeset
1002 put_bits(&s->pb, s->esc3_run_length, run);
8b7a54d58549 wmv1 support
michaelni
parents: 483
diff changeset
1003 put_bits(&s->pb, 1, sign);
8b7a54d58549 wmv1 support
michaelni
parents: 483
diff changeset
1004 put_bits(&s->pb, s->esc3_level_length, level);
8b7a54d58549 wmv1 support
michaelni
parents: 483
diff changeset
1005 }else{
8b7a54d58549 wmv1 support
michaelni
parents: 483
diff changeset
1006 put_bits(&s->pb, 6, run);
8b7a54d58549 wmv1 support
michaelni
parents: 483
diff changeset
1007 put_bits(&s->pb, 8, slevel & 0xff);
8b7a54d58549 wmv1 support
michaelni
parents: 483
diff changeset
1008 }
0
986e461dc072 Initial revision
glantau
parents:
diff changeset
1009 } else {
986e461dc072 Initial revision
glantau
parents:
diff changeset
1010 /* second escape */
986e461dc072 Initial revision
glantau
parents:
diff changeset
1011 put_bits(&s->pb, 1, 1);
986e461dc072 Initial revision
glantau
parents:
diff changeset
1012 put_bits(&s->pb, rl->table_vlc[code][1], rl->table_vlc[code][0]);
986e461dc072 Initial revision
glantau
parents:
diff changeset
1013 put_bits(&s->pb, 1, sign);
986e461dc072 Initial revision
glantau
parents:
diff changeset
1014 }
986e461dc072 Initial revision
glantau
parents:
diff changeset
1015 } else {
986e461dc072 Initial revision
glantau
parents:
diff changeset
1016 /* first escape */
986e461dc072 Initial revision
glantau
parents:
diff changeset
1017 put_bits(&s->pb, 1, 1);
986e461dc072 Initial revision
glantau
parents:
diff changeset
1018 put_bits(&s->pb, rl->table_vlc[code][1], rl->table_vlc[code][0]);
986e461dc072 Initial revision
glantau
parents:
diff changeset
1019 put_bits(&s->pb, 1, sign);
986e461dc072 Initial revision
glantau
parents:
diff changeset
1020 }
986e461dc072 Initial revision
glantau
parents:
diff changeset
1021 } else {
986e461dc072 Initial revision
glantau
parents:
diff changeset
1022 put_bits(&s->pb, 1, sign);
986e461dc072 Initial revision
glantau
parents:
diff changeset
1023 }
986e461dc072 Initial revision
glantau
parents:
diff changeset
1024 last_non_zero = i;
986e461dc072 Initial revision
glantau
parents:
diff changeset
1025 }
986e461dc072 Initial revision
glantau
parents:
diff changeset
1026 }
986e461dc072 Initial revision
glantau
parents:
diff changeset
1027 }
986e461dc072 Initial revision
glantau
parents:
diff changeset
1028
986e461dc072 Initial revision
glantau
parents:
diff changeset
1029 /****************************************/
986e461dc072 Initial revision
glantau
parents:
diff changeset
1030 /* decoding stuff */
986e461dc072 Initial revision
glantau
parents:
diff changeset
1031
936
caa77cd960c0 qpel encoding
michaelni
parents: 903
diff changeset
1032 static VLC mb_non_intra_vlc[4];
0
986e461dc072 Initial revision
glantau
parents:
diff changeset
1033 static VLC mb_intra_vlc;
986e461dc072 Initial revision
glantau
parents:
diff changeset
1034 static VLC dc_lum_vlc[2];
986e461dc072 Initial revision
glantau
parents:
diff changeset
1035 static VLC dc_chroma_vlc[2];
307
764aeec1320e msmpeg4v2 decoding (no encoding yet)
michaelni
parents: 300
diff changeset
1036 static VLC v2_dc_lum_vlc;
764aeec1320e msmpeg4v2 decoding (no encoding yet)
michaelni
parents: 300
diff changeset
1037 static VLC v2_dc_chroma_vlc;
764aeec1320e msmpeg4v2 decoding (no encoding yet)
michaelni
parents: 300
diff changeset
1038 static VLC cbpy_vlc;
764aeec1320e msmpeg4v2 decoding (no encoding yet)
michaelni
parents: 300
diff changeset
1039 static VLC v2_intra_cbpc_vlc;
764aeec1320e msmpeg4v2 decoding (no encoding yet)
michaelni
parents: 300
diff changeset
1040 static VLC v2_mb_type_vlc;
764aeec1320e msmpeg4v2 decoding (no encoding yet)
michaelni
parents: 300
diff changeset
1041 static VLC v2_mv_vlc;
457
583dcee270d2 msmpeg4v1 decoding
michaelni
parents: 440
diff changeset
1042 static VLC v1_intra_cbpc_vlc;
583dcee270d2 msmpeg4v1 decoding
michaelni
parents: 440
diff changeset
1043 static VLC v1_inter_cbpc_vlc;
519
55b4e2248a45 wmv1 slice_height != mb_height support
michaelni
parents: 501
diff changeset
1044 static VLC inter_intra_vlc;
307
764aeec1320e msmpeg4v2 decoding (no encoding yet)
michaelni
parents: 300
diff changeset
1045
764aeec1320e msmpeg4v2 decoding (no encoding yet)
michaelni
parents: 300
diff changeset
1046 /* this table is practically identical to the one from h263 except that its inverted */
468
1e23eae32087 Minor warning cleanup.
mellum
parents: 457
diff changeset
1047 static void init_h263_dc_for_msmpeg4(void)
307
764aeec1320e msmpeg4v2 decoding (no encoding yet)
michaelni
parents: 300
diff changeset
1048 {
764aeec1320e msmpeg4v2 decoding (no encoding yet)
michaelni
parents: 300
diff changeset
1049 int level, uni_code, uni_len;
764aeec1320e msmpeg4v2 decoding (no encoding yet)
michaelni
parents: 300
diff changeset
1050
309
32485ad4cc4e fixing msmpeg4v2 bugs (is bugfree now afaik)
michaelni
parents: 307
diff changeset
1051 for(level=-256; level<256; level++){
307
764aeec1320e msmpeg4v2 decoding (no encoding yet)
michaelni
parents: 300
diff changeset
1052 int size, v, l;
764aeec1320e msmpeg4v2 decoding (no encoding yet)
michaelni
parents: 300
diff changeset
1053 /* find number of bits */
764aeec1320e msmpeg4v2 decoding (no encoding yet)
michaelni
parents: 300
diff changeset
1054 size = 0;
764aeec1320e msmpeg4v2 decoding (no encoding yet)
michaelni
parents: 300
diff changeset
1055 v = abs(level);
764aeec1320e msmpeg4v2 decoding (no encoding yet)
michaelni
parents: 300
diff changeset
1056 while (v) {
764aeec1320e msmpeg4v2 decoding (no encoding yet)
michaelni
parents: 300
diff changeset
1057 v >>= 1;
764aeec1320e msmpeg4v2 decoding (no encoding yet)
michaelni
parents: 300
diff changeset
1058 size++;
764aeec1320e msmpeg4v2 decoding (no encoding yet)
michaelni
parents: 300
diff changeset
1059 }
764aeec1320e msmpeg4v2 decoding (no encoding yet)
michaelni
parents: 300
diff changeset
1060
764aeec1320e msmpeg4v2 decoding (no encoding yet)
michaelni
parents: 300
diff changeset
1061 if (level < 0)
764aeec1320e msmpeg4v2 decoding (no encoding yet)
michaelni
parents: 300
diff changeset
1062 l= (-level) ^ ((1 << size) - 1);
764aeec1320e msmpeg4v2 decoding (no encoding yet)
michaelni
parents: 300
diff changeset
1063 else
764aeec1320e msmpeg4v2 decoding (no encoding yet)
michaelni
parents: 300
diff changeset
1064 l= level;
764aeec1320e msmpeg4v2 decoding (no encoding yet)
michaelni
parents: 300
diff changeset
1065
764aeec1320e msmpeg4v2 decoding (no encoding yet)
michaelni
parents: 300
diff changeset
1066 /* luminance h263 */
764aeec1320e msmpeg4v2 decoding (no encoding yet)
michaelni
parents: 300
diff changeset
1067 uni_code= DCtab_lum[size][0];
764aeec1320e msmpeg4v2 decoding (no encoding yet)
michaelni
parents: 300
diff changeset
1068 uni_len = DCtab_lum[size][1];
764aeec1320e msmpeg4v2 decoding (no encoding yet)
michaelni
parents: 300
diff changeset
1069 uni_code ^= (1<<uni_len)-1; //M$ doesnt like compatibility
764aeec1320e msmpeg4v2 decoding (no encoding yet)
michaelni
parents: 300
diff changeset
1070
764aeec1320e msmpeg4v2 decoding (no encoding yet)
michaelni
parents: 300
diff changeset
1071 if (size > 0) {
764aeec1320e msmpeg4v2 decoding (no encoding yet)
michaelni
parents: 300
diff changeset
1072 uni_code<<=size; uni_code|=l;
764aeec1320e msmpeg4v2 decoding (no encoding yet)
michaelni
parents: 300
diff changeset
1073 uni_len+=size;
764aeec1320e msmpeg4v2 decoding (no encoding yet)
michaelni
parents: 300
diff changeset
1074 if (size > 8){
764aeec1320e msmpeg4v2 decoding (no encoding yet)
michaelni
parents: 300
diff changeset
1075 uni_code<<=1; uni_code|=1;
764aeec1320e msmpeg4v2 decoding (no encoding yet)
michaelni
parents: 300
diff changeset
1076 uni_len++;
764aeec1320e msmpeg4v2 decoding (no encoding yet)
michaelni
parents: 300
diff changeset
1077 }
764aeec1320e msmpeg4v2 decoding (no encoding yet)
michaelni
parents: 300
diff changeset
1078 }
764aeec1320e msmpeg4v2 decoding (no encoding yet)
michaelni
parents: 300
diff changeset
1079 v2_dc_lum_table[level+256][0]= uni_code;
764aeec1320e msmpeg4v2 decoding (no encoding yet)
michaelni
parents: 300
diff changeset
1080 v2_dc_lum_table[level+256][1]= uni_len;
764aeec1320e msmpeg4v2 decoding (no encoding yet)
michaelni
parents: 300
diff changeset
1081
764aeec1320e msmpeg4v2 decoding (no encoding yet)
michaelni
parents: 300
diff changeset
1082 /* chrominance h263 */
764aeec1320e msmpeg4v2 decoding (no encoding yet)
michaelni
parents: 300
diff changeset
1083 uni_code= DCtab_chrom[size][0];
764aeec1320e msmpeg4v2 decoding (no encoding yet)
michaelni
parents: 300
diff changeset
1084 uni_len = DCtab_chrom[size][1];
764aeec1320e msmpeg4v2 decoding (no encoding yet)
michaelni
parents: 300
diff changeset
1085 uni_code ^= (1<<uni_len)-1; //M$ doesnt like compatibility
764aeec1320e msmpeg4v2 decoding (no encoding yet)
michaelni
parents: 300
diff changeset
1086
764aeec1320e msmpeg4v2 decoding (no encoding yet)
michaelni
parents: 300
diff changeset
1087 if (size > 0) {
764aeec1320e msmpeg4v2 decoding (no encoding yet)
michaelni
parents: 300
diff changeset
1088 uni_code<<=size; uni_code|=l;
764aeec1320e msmpeg4v2 decoding (no encoding yet)
michaelni
parents: 300
diff changeset
1089 uni_len+=size;
764aeec1320e msmpeg4v2 decoding (no encoding yet)
michaelni
parents: 300
diff changeset
1090 if (size > 8){
764aeec1320e msmpeg4v2 decoding (no encoding yet)
michaelni
parents: 300
diff changeset
1091 uni_code<<=1; uni_code|=1;
764aeec1320e msmpeg4v2 decoding (no encoding yet)
michaelni
parents: 300
diff changeset
1092 uni_len++;
764aeec1320e msmpeg4v2 decoding (no encoding yet)
michaelni
parents: 300
diff changeset
1093 }
764aeec1320e msmpeg4v2 decoding (no encoding yet)
michaelni
parents: 300
diff changeset
1094 }
764aeec1320e msmpeg4v2 decoding (no encoding yet)
michaelni
parents: 300
diff changeset
1095 v2_dc_chroma_table[level+256][0]= uni_code;
764aeec1320e msmpeg4v2 decoding (no encoding yet)
michaelni
parents: 300
diff changeset
1096 v2_dc_chroma_table[level+256][1]= uni_len;
764aeec1320e msmpeg4v2 decoding (no encoding yet)
michaelni
parents: 300
diff changeset
1097
764aeec1320e msmpeg4v2 decoding (no encoding yet)
michaelni
parents: 300
diff changeset
1098 }
764aeec1320e msmpeg4v2 decoding (no encoding yet)
michaelni
parents: 300
diff changeset
1099 }
0
986e461dc072 Initial revision
glantau
parents:
diff changeset
1100
986e461dc072 Initial revision
glantau
parents:
diff changeset
1101 /* init all vlc decoding tables */
499
8b7a54d58549 wmv1 support
michaelni
parents: 483
diff changeset
1102 int ff_msmpeg4_decode_init(MpegEncContext *s)
0
986e461dc072 Initial revision
glantau
parents:
diff changeset
1103 {
483
97da217aed7f fixed multiple allocation bug
bellard
parents: 468
diff changeset
1104 static int done = 0;
0
986e461dc072 Initial revision
glantau
parents:
diff changeset
1105 int i;
986e461dc072 Initial revision
glantau
parents:
diff changeset
1106 MVTable *mv;
986e461dc072 Initial revision
glantau
parents:
diff changeset
1107
499
8b7a54d58549 wmv1 support
michaelni
parents: 483
diff changeset
1108 common_init(s);
483
97da217aed7f fixed multiple allocation bug
bellard
parents: 468
diff changeset
1109
97da217aed7f fixed multiple allocation bug
bellard
parents: 468
diff changeset
1110 if (!done) {
97da217aed7f fixed multiple allocation bug
bellard
parents: 468
diff changeset
1111 done = 1;
0
986e461dc072 Initial revision
glantau
parents:
diff changeset
1112
483
97da217aed7f fixed multiple allocation bug
bellard
parents: 468
diff changeset
1113 for(i=0;i<NB_RL_TABLES;i++) {
2370
26560d4fdb1f Memory leak fix patch by (Burkhard Plaum <plaum >at< ipf.uni-stuttgart )dot( de>)
michael
parents: 2293
diff changeset
1114 init_rl(&rl_table[i], 1);
26560d4fdb1f Memory leak fix patch by (Burkhard Plaum <plaum >at< ipf.uni-stuttgart )dot( de>)
michael
parents: 2293
diff changeset
1115 init_vlc_rl(&rl_table[i], 1);
483
97da217aed7f fixed multiple allocation bug
bellard
parents: 468
diff changeset
1116 }
97da217aed7f fixed multiple allocation bug
bellard
parents: 468
diff changeset
1117 for(i=0;i<2;i++) {
97da217aed7f fixed multiple allocation bug
bellard
parents: 468
diff changeset
1118 mv = &mv_tables[i];
531
f5d7fcc81787 get_vlc() optimizations
michaelni
parents: 519
diff changeset
1119 init_vlc(&mv->vlc, MV_VLC_BITS, mv->n + 1,
483
97da217aed7f fixed multiple allocation bug
bellard
parents: 468
diff changeset
1120 mv->table_mv_bits, 1, 1,
2370
26560d4fdb1f Memory leak fix patch by (Burkhard Plaum <plaum >at< ipf.uni-stuttgart )dot( de>)
michael
parents: 2293
diff changeset
1121 mv->table_mv_code, 2, 2, 1);
483
97da217aed7f fixed multiple allocation bug
bellard
parents: 468
diff changeset
1122 }
97da217aed7f fixed multiple allocation bug
bellard
parents: 468
diff changeset
1123
531
f5d7fcc81787 get_vlc() optimizations
michaelni
parents: 519
diff changeset
1124 init_vlc(&dc_lum_vlc[0], DC_VLC_BITS, 120,
483
97da217aed7f fixed multiple allocation bug
bellard
parents: 468
diff changeset
1125 &table0_dc_lum[0][1], 8, 4,
2370
26560d4fdb1f Memory leak fix patch by (Burkhard Plaum <plaum >at< ipf.uni-stuttgart )dot( de>)
michael
parents: 2293
diff changeset
1126 &table0_dc_lum[0][0], 8, 4, 1);
531
f5d7fcc81787 get_vlc() optimizations
michaelni
parents: 519
diff changeset
1127 init_vlc(&dc_chroma_vlc[0], DC_VLC_BITS, 120,
483
97da217aed7f fixed multiple allocation bug
bellard
parents: 468
diff changeset
1128 &table0_dc_chroma[0][1], 8, 4,
2370
26560d4fdb1f Memory leak fix patch by (Burkhard Plaum <plaum >at< ipf.uni-stuttgart )dot( de>)
michael
parents: 2293
diff changeset
1129 &table0_dc_chroma[0][0], 8, 4, 1);
531
f5d7fcc81787 get_vlc() optimizations
michaelni
parents: 519
diff changeset
1130 init_vlc(&dc_lum_vlc[1], DC_VLC_BITS, 120,
483
97da217aed7f fixed multiple allocation bug
bellard
parents: 468
diff changeset
1131 &table1_dc_lum[0][1], 8, 4,
2370
26560d4fdb1f Memory leak fix patch by (Burkhard Plaum <plaum >at< ipf.uni-stuttgart )dot( de>)
michael
parents: 2293
diff changeset
1132 &table1_dc_lum[0][0], 8, 4, 1);
531
f5d7fcc81787 get_vlc() optimizations
michaelni
parents: 519
diff changeset
1133 init_vlc(&dc_chroma_vlc[1], DC_VLC_BITS, 120,
483
97da217aed7f fixed multiple allocation bug
bellard
parents: 468
diff changeset
1134 &table1_dc_chroma[0][1], 8, 4,
2370
26560d4fdb1f Memory leak fix patch by (Burkhard Plaum <plaum >at< ipf.uni-stuttgart )dot( de>)
michael
parents: 2293
diff changeset
1135 &table1_dc_chroma[0][0], 8, 4, 1);
307
764aeec1320e msmpeg4v2 decoding (no encoding yet)
michaelni
parents: 300
diff changeset
1136
531
f5d7fcc81787 get_vlc() optimizations
michaelni
parents: 519
diff changeset
1137 init_vlc(&v2_dc_lum_vlc, DC_VLC_BITS, 512,
483
97da217aed7f fixed multiple allocation bug
bellard
parents: 468
diff changeset
1138 &v2_dc_lum_table[0][1], 8, 4,
2370
26560d4fdb1f Memory leak fix patch by (Burkhard Plaum <plaum >at< ipf.uni-stuttgart )dot( de>)
michael
parents: 2293
diff changeset
1139 &v2_dc_lum_table[0][0], 8, 4, 1);
531
f5d7fcc81787 get_vlc() optimizations
michaelni
parents: 519
diff changeset
1140 init_vlc(&v2_dc_chroma_vlc, DC_VLC_BITS, 512,
483
97da217aed7f fixed multiple allocation bug
bellard
parents: 468
diff changeset
1141 &v2_dc_chroma_table[0][1], 8, 4,
2370
26560d4fdb1f Memory leak fix patch by (Burkhard Plaum <plaum >at< ipf.uni-stuttgart )dot( de>)
michael
parents: 2293
diff changeset
1142 &v2_dc_chroma_table[0][0], 8, 4, 1);
307
764aeec1320e msmpeg4v2 decoding (no encoding yet)
michaelni
parents: 300
diff changeset
1143
531
f5d7fcc81787 get_vlc() optimizations
michaelni
parents: 519
diff changeset
1144 init_vlc(&cbpy_vlc, CBPY_VLC_BITS, 16,
483
97da217aed7f fixed multiple allocation bug
bellard
parents: 468
diff changeset
1145 &cbpy_tab[0][1], 2, 1,
2370
26560d4fdb1f Memory leak fix patch by (Burkhard Plaum <plaum >at< ipf.uni-stuttgart )dot( de>)
michael
parents: 2293
diff changeset
1146 &cbpy_tab[0][0], 2, 1, 1);
531
f5d7fcc81787 get_vlc() optimizations
michaelni
parents: 519
diff changeset
1147 init_vlc(&v2_intra_cbpc_vlc, V2_INTRA_CBPC_VLC_BITS, 4,
483
97da217aed7f fixed multiple allocation bug
bellard
parents: 468
diff changeset
1148 &v2_intra_cbpc[0][1], 2, 1,
2370
26560d4fdb1f Memory leak fix patch by (Burkhard Plaum <plaum >at< ipf.uni-stuttgart )dot( de>)
michael
parents: 2293
diff changeset
1149 &v2_intra_cbpc[0][0], 2, 1, 1);
531
f5d7fcc81787 get_vlc() optimizations
michaelni
parents: 519
diff changeset
1150 init_vlc(&v2_mb_type_vlc, V2_MB_TYPE_VLC_BITS, 8,
483
97da217aed7f fixed multiple allocation bug
bellard
parents: 468
diff changeset
1151 &v2_mb_type[0][1], 2, 1,
2370
26560d4fdb1f Memory leak fix patch by (Burkhard Plaum <plaum >at< ipf.uni-stuttgart )dot( de>)
michael
parents: 2293
diff changeset
1152 &v2_mb_type[0][0], 2, 1, 1);
531
f5d7fcc81787 get_vlc() optimizations
michaelni
parents: 519
diff changeset
1153 init_vlc(&v2_mv_vlc, V2_MV_VLC_BITS, 33,
483
97da217aed7f fixed multiple allocation bug
bellard
parents: 468
diff changeset
1154 &mvtab[0][1], 2, 1,
2370
26560d4fdb1f Memory leak fix patch by (Burkhard Plaum <plaum >at< ipf.uni-stuttgart )dot( de>)
michael
parents: 2293
diff changeset
1155 &mvtab[0][0], 2, 1, 1);
0
986e461dc072 Initial revision
glantau
parents:
diff changeset
1156
936
caa77cd960c0 qpel encoding
michaelni
parents: 903
diff changeset
1157 for(i=0; i<4; i++){
caa77cd960c0 qpel encoding
michaelni
parents: 903
diff changeset
1158 init_vlc(&mb_non_intra_vlc[i], MB_NON_INTRA_VLC_BITS, 128,
caa77cd960c0 qpel encoding
michaelni
parents: 903
diff changeset
1159 &wmv2_inter_table[i][0][1], 8, 4,
2370
26560d4fdb1f Memory leak fix patch by (Burkhard Plaum <plaum >at< ipf.uni-stuttgart )dot( de>)
michael
parents: 2293
diff changeset
1160 &wmv2_inter_table[i][0][0], 8, 4, 1); //FIXME name?
936
caa77cd960c0 qpel encoding
michaelni
parents: 903
diff changeset
1161 }
caa77cd960c0 qpel encoding
michaelni
parents: 903
diff changeset
1162
531
f5d7fcc81787 get_vlc() optimizations
michaelni
parents: 519
diff changeset
1163 init_vlc(&mb_intra_vlc, MB_INTRA_VLC_BITS, 64,
483
97da217aed7f fixed multiple allocation bug
bellard
parents: 468
diff changeset
1164 &table_mb_intra[0][1], 4, 2,
2370
26560d4fdb1f Memory leak fix patch by (Burkhard Plaum <plaum >at< ipf.uni-stuttgart )dot( de>)
michael
parents: 2293
diff changeset
1165 &table_mb_intra[0][0], 4, 2, 1);
457
583dcee270d2 msmpeg4v1 decoding
michaelni
parents: 440
diff changeset
1166
531
f5d7fcc81787 get_vlc() optimizations
michaelni
parents: 519
diff changeset
1167 init_vlc(&v1_intra_cbpc_vlc, V1_INTRA_CBPC_VLC_BITS, 8,
483
97da217aed7f fixed multiple allocation bug
bellard
parents: 468
diff changeset
1168 intra_MCBPC_bits, 1, 1,
2370
26560d4fdb1f Memory leak fix patch by (Burkhard Plaum <plaum >at< ipf.uni-stuttgart )dot( de>)
michael
parents: 2293
diff changeset
1169 intra_MCBPC_code, 1, 1, 1);
531
f5d7fcc81787 get_vlc() optimizations
michaelni
parents: 519
diff changeset
1170 init_vlc(&v1_inter_cbpc_vlc, V1_INTER_CBPC_VLC_BITS, 25,
483
97da217aed7f fixed multiple allocation bug
bellard
parents: 468
diff changeset
1171 inter_MCBPC_bits, 1, 1,
2370
26560d4fdb1f Memory leak fix patch by (Burkhard Plaum <plaum >at< ipf.uni-stuttgart )dot( de>)
michael
parents: 2293
diff changeset
1172 inter_MCBPC_code, 1, 1, 1);
519
55b4e2248a45 wmv1 slice_height != mb_height support
michaelni
parents: 501
diff changeset
1173
531
f5d7fcc81787 get_vlc() optimizations
michaelni
parents: 519
diff changeset
1174 init_vlc(&inter_intra_vlc, INTER_INTRA_VLC_BITS, 4,
519
55b4e2248a45 wmv1 slice_height != mb_height support
michaelni
parents: 501
diff changeset
1175 &table_inter_intra[0][1], 2, 1,
2370
26560d4fdb1f Memory leak fix patch by (Burkhard Plaum <plaum >at< ipf.uni-stuttgart )dot( de>)
michael
parents: 2293
diff changeset
1176 &table_inter_intra[0][0], 2, 1, 1);
483
97da217aed7f fixed multiple allocation bug
bellard
parents: 468
diff changeset
1177 }
745
25d7fb7c89be better/cleaner error resilience (done in a 2nd pass after decoding)
michaelni
parents: 743
diff changeset
1178
25d7fb7c89be better/cleaner error resilience (done in a 2nd pass after decoding)
michaelni
parents: 743
diff changeset
1179 switch(s->msmpeg4_version){
25d7fb7c89be better/cleaner error resilience (done in a 2nd pass after decoding)
michaelni
parents: 743
diff changeset
1180 case 1:
25d7fb7c89be better/cleaner error resilience (done in a 2nd pass after decoding)
michaelni
parents: 743
diff changeset
1181 case 2:
25d7fb7c89be better/cleaner error resilience (done in a 2nd pass after decoding)
michaelni
parents: 743
diff changeset
1182 s->decode_mb= msmpeg4v12_decode_mb;
25d7fb7c89be better/cleaner error resilience (done in a 2nd pass after decoding)
michaelni
parents: 743
diff changeset
1183 break;
25d7fb7c89be better/cleaner error resilience (done in a 2nd pass after decoding)
michaelni
parents: 743
diff changeset
1184 case 3:
25d7fb7c89be better/cleaner error resilience (done in a 2nd pass after decoding)
michaelni
parents: 743
diff changeset
1185 case 4:
25d7fb7c89be better/cleaner error resilience (done in a 2nd pass after decoding)
michaelni
parents: 743
diff changeset
1186 s->decode_mb= msmpeg4v34_decode_mb;
25d7fb7c89be better/cleaner error resilience (done in a 2nd pass after decoding)
michaelni
parents: 743
diff changeset
1187 break;
936
caa77cd960c0 qpel encoding
michaelni
parents: 903
diff changeset
1188 case 5:
caa77cd960c0 qpel encoding
michaelni
parents: 903
diff changeset
1189 s->decode_mb= wmv2_decode_mb;
caa77cd960c0 qpel encoding
michaelni
parents: 903
diff changeset
1190 break;
745
25d7fb7c89be better/cleaner error resilience (done in a 2nd pass after decoding)
michaelni
parents: 743
diff changeset
1191 }
25d7fb7c89be better/cleaner error resilience (done in a 2nd pass after decoding)
michaelni
parents: 743
diff changeset
1192
769
9f8c4905928b fixing decoding of streams with no keyframe at the start
michaelni
parents: 759
diff changeset
1193 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
1194
0
986e461dc072 Initial revision
glantau
parents:
diff changeset
1195 return 0;
986e461dc072 Initial revision
glantau
parents:
diff changeset
1196 }
986e461dc072 Initial revision
glantau
parents:
diff changeset
1197
986e461dc072 Initial revision
glantau
parents:
diff changeset
1198 static int decode012(GetBitContext *gb)
986e461dc072 Initial revision
glantau
parents:
diff changeset
1199 {
986e461dc072 Initial revision
glantau
parents:
diff changeset
1200 int n;
21
20e680e7a490 get_bits() specialization, gives 4\speedup
arpi_esp
parents: 7
diff changeset
1201 n = get_bits1(gb);
0
986e461dc072 Initial revision
glantau
parents:
diff changeset
1202 if (n == 0)
986e461dc072 Initial revision
glantau
parents:
diff changeset
1203 return 0;
986e461dc072 Initial revision
glantau
parents:
diff changeset
1204 else
21
20e680e7a490 get_bits() specialization, gives 4\speedup
arpi_esp
parents: 7
diff changeset
1205 return get_bits1(gb) + 1;
0
986e461dc072 Initial revision
glantau
parents:
diff changeset
1206 }
986e461dc072 Initial revision
glantau
parents:
diff changeset
1207
307
764aeec1320e msmpeg4v2 decoding (no encoding yet)
michaelni
parents: 300
diff changeset
1208 int msmpeg4_decode_picture_header(MpegEncContext * s)
300
d874359e58f1 msmpeg4v2 header parser & some dump bits code behind #if 0
michaelni
parents: 299
diff changeset
1209 {
499
8b7a54d58549 wmv1 support
michaelni
parents: 483
diff changeset
1210 int code;
300
d874359e58f1 msmpeg4v2 header parser & some dump bits code behind #if 0
michaelni
parents: 299
diff changeset
1211
311
ac677a84d5df wmv1 header parser (unfinished)
michaelni
parents: 310
diff changeset
1212 #if 0
ac677a84d5df wmv1 header parser (unfinished)
michaelni
parents: 310
diff changeset
1213 {
ac677a84d5df wmv1 header parser (unfinished)
michaelni
parents: 310
diff changeset
1214 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
1215 for(i=0; i<s->gb.size_in_bits; i++)
311
ac677a84d5df wmv1 header parser (unfinished)
michaelni
parents: 310
diff changeset
1216 printf("%d", get_bits1(&s->gb));
ac677a84d5df wmv1 header parser (unfinished)
michaelni
parents: 310
diff changeset
1217 // get_bits1(&s->gb);
ac677a84d5df wmv1 header parser (unfinished)
michaelni
parents: 310
diff changeset
1218 printf("END\n");
ac677a84d5df wmv1 header parser (unfinished)
michaelni
parents: 310
diff changeset
1219 return -1;
ac677a84d5df wmv1 header parser (unfinished)
michaelni
parents: 310
diff changeset
1220 }
ac677a84d5df wmv1 header parser (unfinished)
michaelni
parents: 310
diff changeset
1221 #endif
457
583dcee270d2 msmpeg4v1 decoding
michaelni
parents: 440
diff changeset
1222
583dcee270d2 msmpeg4v1 decoding
michaelni
parents: 440
diff changeset
1223 if(s->msmpeg4_version==1){
583dcee270d2 msmpeg4v1 decoding
michaelni
parents: 440
diff changeset
1224 int start_code, num;
583dcee270d2 msmpeg4v1 decoding
michaelni
parents: 440
diff changeset
1225 start_code = (get_bits(&s->gb, 16)<<16) | get_bits(&s->gb, 16);
583dcee270d2 msmpeg4v1 decoding
michaelni
parents: 440
diff changeset
1226 if(start_code!=0x00000100){
1598
932d306bf1dc av_log() patch by (Michel Bardiaux <mbardiaux at peaktime dot be>)
michael
parents: 1399
diff changeset
1227 av_log(s->avctx, AV_LOG_ERROR, "invalid startcode\n");
457
583dcee270d2 msmpeg4v1 decoding
michaelni
parents: 440
diff changeset
1228 return -1;
583dcee270d2 msmpeg4v1 decoding
michaelni
parents: 440
diff changeset
1229 }
583dcee270d2 msmpeg4v1 decoding
michaelni
parents: 440
diff changeset
1230
583dcee270d2 msmpeg4v1 decoding
michaelni
parents: 440
diff changeset
1231 num= get_bits(&s->gb, 5); // frame number */
583dcee270d2 msmpeg4v1 decoding
michaelni
parents: 440
diff changeset
1232 }
583dcee270d2 msmpeg4v1 decoding
michaelni
parents: 440
diff changeset
1233
300
d874359e58f1 msmpeg4v2 header parser & some dump bits code behind #if 0
michaelni
parents: 299
diff changeset
1234 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
1235 if (s->pict_type != I_TYPE &&
457
583dcee270d2 msmpeg4v1 decoding
michaelni
parents: 440
diff changeset
1236 s->pict_type != P_TYPE){
1598
932d306bf1dc av_log() patch by (Michel Bardiaux <mbardiaux at peaktime dot be>)
michael
parents: 1399
diff changeset
1237 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
1238 return -1;
457
583dcee270d2 msmpeg4v1 decoding
michaelni
parents: 440
diff changeset
1239 }
519
55b4e2248a45 wmv1 slice_height != mb_height support
michaelni
parents: 501
diff changeset
1240 #if 0
55b4e2248a45 wmv1 slice_height != mb_height support
michaelni
parents: 501
diff changeset
1241 {
55b4e2248a45 wmv1 slice_height != mb_height support
michaelni
parents: 501
diff changeset
1242 static int had_i=0;
55b4e2248a45 wmv1 slice_height != mb_height support
michaelni
parents: 501
diff changeset
1243 if(s->pict_type == I_TYPE) had_i=1;
55b4e2248a45 wmv1 slice_height != mb_height support
michaelni
parents: 501
diff changeset
1244 if(!had_i) return -1;
55b4e2248a45 wmv1 slice_height != mb_height support
michaelni
parents: 501
diff changeset
1245 }
55b4e2248a45 wmv1 slice_height != mb_height support
michaelni
parents: 501
diff changeset
1246 #endif
1651
ccf7c96a630f h263 modified quantization fix
michael
parents: 1598
diff changeset
1247 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
1248 if(s->qscale==0){
1598
932d306bf1dc av_log() patch by (Michel Bardiaux <mbardiaux at peaktime dot be>)
michael
parents: 1399
diff changeset
1249 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
1250 return -1;
fdeac9642346 check for qscale==0 (fixes 1/0 on one corrupted stream)
michaelni
parents: 1057
diff changeset
1251 }
300
d874359e58f1 msmpeg4v2 header parser & some dump bits code behind #if 0
michaelni
parents: 299
diff changeset
1252
d874359e58f1 msmpeg4v2 header parser & some dump bits code behind #if 0
michaelni
parents: 299
diff changeset
1253 if (s->pict_type == I_TYPE) {
d874359e58f1 msmpeg4v2 header parser & some dump bits code behind #if 0
michaelni
parents: 299
diff changeset
1254 code = get_bits(&s->gb, 5);
457
583dcee270d2 msmpeg4v1 decoding
michaelni
parents: 440
diff changeset
1255 if(s->msmpeg4_version==1){
583dcee270d2 msmpeg4v1 decoding
michaelni
parents: 440
diff changeset
1256 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
1257 av_log(s->avctx, AV_LOG_ERROR, "invalid slice height %d\n", code);
457
583dcee270d2 msmpeg4v1 decoding
michaelni
parents: 440
diff changeset
1258 return -1;
583dcee270d2 msmpeg4v1 decoding
michaelni
parents: 440
diff changeset
1259 }
583dcee270d2 msmpeg4v1 decoding
michaelni
parents: 440
diff changeset
1260
583dcee270d2 msmpeg4v1 decoding
michaelni
parents: 440
diff changeset
1261 s->slice_height = code;
583dcee270d2 msmpeg4v1 decoding
michaelni
parents: 440
diff changeset
1262 }else{
583dcee270d2 msmpeg4v1 decoding
michaelni
parents: 440
diff changeset
1263 /* 0x17: one slice, 0x18: two slices, ... */
519
55b4e2248a45 wmv1 slice_height != mb_height support
michaelni
parents: 501
diff changeset
1264 if (code < 0x17){
1598
932d306bf1dc av_log() patch by (Michel Bardiaux <mbardiaux at peaktime dot be>)
michael
parents: 1399
diff changeset
1265 av_log(s->avctx, AV_LOG_ERROR, "error, slice code was %X\n", code);
457
583dcee270d2 msmpeg4v1 decoding
michaelni
parents: 440
diff changeset
1266 return -1;
519
55b4e2248a45 wmv1 slice_height != mb_height support
michaelni
parents: 501
diff changeset
1267 }
457
583dcee270d2 msmpeg4v1 decoding
michaelni
parents: 440
diff changeset
1268
583dcee270d2 msmpeg4v1 decoding
michaelni
parents: 440
diff changeset
1269 s->slice_height = s->mb_height / (code - 0x16);
583dcee270d2 msmpeg4v1 decoding
michaelni
parents: 440
diff changeset
1270 }
311
ac677a84d5df wmv1 header parser (unfinished)
michaelni
parents: 310
diff changeset
1271
ac677a84d5df wmv1 header parser (unfinished)
michaelni
parents: 310
diff changeset
1272 switch(s->msmpeg4_version){
457
583dcee270d2 msmpeg4v1 decoding
michaelni
parents: 440
diff changeset
1273 case 1:
311
ac677a84d5df wmv1 header parser (unfinished)
michaelni
parents: 310
diff changeset
1274 case 2:
307
764aeec1320e msmpeg4v2 decoding (no encoding yet)
michaelni
parents: 300
diff changeset
1275 s->rl_chroma_table_index = 2;
764aeec1320e msmpeg4v2 decoding (no encoding yet)
michaelni
parents: 300
diff changeset
1276 s->rl_table_index = 2;
300
d874359e58f1 msmpeg4v2 header parser & some dump bits code behind #if 0
michaelni
parents: 299
diff changeset
1277
307
764aeec1320e msmpeg4v2 decoding (no encoding yet)
michaelni
parents: 300
diff changeset
1278 s->dc_table_index = 0; //not used
311
ac677a84d5df wmv1 header parser (unfinished)
michaelni
parents: 310
diff changeset
1279 break;
ac677a84d5df wmv1 header parser (unfinished)
michaelni
parents: 310
diff changeset
1280 case 3:
307
764aeec1320e msmpeg4v2 decoding (no encoding yet)
michaelni
parents: 300
diff changeset
1281 s->rl_chroma_table_index = decode012(&s->gb);
764aeec1320e msmpeg4v2 decoding (no encoding yet)
michaelni
parents: 300
diff changeset
1282 s->rl_table_index = decode012(&s->gb);
0
986e461dc072 Initial revision
glantau
parents:
diff changeset
1283
307
764aeec1320e msmpeg4v2 decoding (no encoding yet)
michaelni
parents: 300
diff changeset
1284 s->dc_table_index = get_bits1(&s->gb);
311
ac677a84d5df wmv1 header parser (unfinished)
michaelni
parents: 310
diff changeset
1285 break;
ac677a84d5df wmv1 header parser (unfinished)
michaelni
parents: 310
diff changeset
1286 case 4:
499
8b7a54d58549 wmv1 support
michaelni
parents: 483
diff changeset
1287 msmpeg4_decode_ext_header(s, (2+5+5+17+7)/8);
8b7a54d58549 wmv1 support
michaelni
parents: 483
diff changeset
1288
578
32c142b10263 fixing bitrate vs. kbitrate in header
michaelni
parents: 563
diff changeset
1289 if(s->bit_rate > MBAC_BITRATE) s->per_mb_rl_table= get_bits1(&s->gb);
32c142b10263 fixing bitrate vs. kbitrate in header
michaelni
parents: 563
diff changeset
1290 else s->per_mb_rl_table= 0;
519
55b4e2248a45 wmv1 slice_height != mb_height support
michaelni
parents: 501
diff changeset
1291
499
8b7a54d58549 wmv1 support
michaelni
parents: 483
diff changeset
1292 if(!s->per_mb_rl_table){
8b7a54d58549 wmv1 support
michaelni
parents: 483
diff changeset
1293 s->rl_chroma_table_index = decode012(&s->gb);
8b7a54d58549 wmv1 support
michaelni
parents: 483
diff changeset
1294 s->rl_table_index = decode012(&s->gb);
311
ac677a84d5df wmv1 header parser (unfinished)
michaelni
parents: 310
diff changeset
1295 }
ac677a84d5df wmv1 header parser (unfinished)
michaelni
parents: 310
diff changeset
1296
499
8b7a54d58549 wmv1 support
michaelni
parents: 483
diff changeset
1297 s->dc_table_index = get_bits1(&s->gb);
519
55b4e2248a45 wmv1 slice_height != mb_height support
michaelni
parents: 501
diff changeset
1298 s->inter_intra_pred= 0;
311
ac677a84d5df wmv1 header parser (unfinished)
michaelni
parents: 310
diff changeset
1299 break;
307
764aeec1320e msmpeg4v2 decoding (no encoding yet)
michaelni
parents: 300
diff changeset
1300 }
0
986e461dc072 Initial revision
glantau
parents:
diff changeset
1301 s->no_rounding = 1;
1388
b5c65adac96a debug stuff
michaelni
parents: 1325
diff changeset
1302 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
1303 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
1304 s->qscale,
6ab301aaa652 (commit by michael)
arpi_esp
parents: 195
diff changeset
1305 s->rl_chroma_table_index,
6ab301aaa652 (commit by michael)
arpi_esp
parents: 195
diff changeset
1306 s->rl_table_index,
499
8b7a54d58549 wmv1 support
michaelni
parents: 483
diff changeset
1307 s->dc_table_index,
519
55b4e2248a45 wmv1 slice_height != mb_height support
michaelni
parents: 501
diff changeset
1308 s->per_mb_rl_table,
1388
b5c65adac96a debug stuff
michaelni
parents: 1325
diff changeset
1309 s->slice_height);
0
986e461dc072 Initial revision
glantau
parents:
diff changeset
1310 } else {
457
583dcee270d2 msmpeg4v1 decoding
michaelni
parents: 440
diff changeset
1311 switch(s->msmpeg4_version){
583dcee270d2 msmpeg4v1 decoding
michaelni
parents: 440
diff changeset
1312 case 1:
583dcee270d2 msmpeg4v1 decoding
michaelni
parents: 440
diff changeset
1313 case 2:
583dcee270d2 msmpeg4v1 decoding
michaelni
parents: 440
diff changeset
1314 if(s->msmpeg4_version==1)
583dcee270d2 msmpeg4v1 decoding
michaelni
parents: 440
diff changeset
1315 s->use_skip_mb_code = 1;
583dcee270d2 msmpeg4v1 decoding
michaelni
parents: 440
diff changeset
1316 else
583dcee270d2 msmpeg4v1 decoding
michaelni
parents: 440
diff changeset
1317 s->use_skip_mb_code = get_bits1(&s->gb);
307
764aeec1320e msmpeg4v2 decoding (no encoding yet)
michaelni
parents: 300
diff changeset
1318 s->rl_table_index = 2;
764aeec1320e msmpeg4v2 decoding (no encoding yet)
michaelni
parents: 300
diff changeset
1319 s->rl_chroma_table_index = s->rl_table_index;
764aeec1320e msmpeg4v2 decoding (no encoding yet)
michaelni
parents: 300
diff changeset
1320 s->dc_table_index = 0; //not used
764aeec1320e msmpeg4v2 decoding (no encoding yet)
michaelni
parents: 300
diff changeset
1321 s->mv_table_index = 0;
457
583dcee270d2 msmpeg4v1 decoding
michaelni
parents: 440
diff changeset
1322 break;
583dcee270d2 msmpeg4v1 decoding
michaelni
parents: 440
diff changeset
1323 case 3:
583dcee270d2 msmpeg4v1 decoding
michaelni
parents: 440
diff changeset
1324 s->use_skip_mb_code = get_bits1(&s->gb);
307
764aeec1320e msmpeg4v2 decoding (no encoding yet)
michaelni
parents: 300
diff changeset
1325 s->rl_table_index = decode012(&s->gb);
764aeec1320e msmpeg4v2 decoding (no encoding yet)
michaelni
parents: 300
diff changeset
1326 s->rl_chroma_table_index = s->rl_table_index;
0
986e461dc072 Initial revision
glantau
parents:
diff changeset
1327
307
764aeec1320e msmpeg4v2 decoding (no encoding yet)
michaelni
parents: 300
diff changeset
1328 s->dc_table_index = get_bits1(&s->gb);
764aeec1320e msmpeg4v2 decoding (no encoding yet)
michaelni
parents: 300
diff changeset
1329
764aeec1320e msmpeg4v2 decoding (no encoding yet)
michaelni
parents: 300
diff changeset
1330 s->mv_table_index = get_bits1(&s->gb);
457
583dcee270d2 msmpeg4v1 decoding
michaelni
parents: 440
diff changeset
1331 break;
499
8b7a54d58549 wmv1 support
michaelni
parents: 483
diff changeset
1332 case 4:
8b7a54d58549 wmv1 support
michaelni
parents: 483
diff changeset
1333 s->use_skip_mb_code = get_bits1(&s->gb);
519
55b4e2248a45 wmv1 slice_height != mb_height support
michaelni
parents: 501
diff changeset
1334
578
32c142b10263 fixing bitrate vs. kbitrate in header
michaelni
parents: 563
diff changeset
1335 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
1336 else s->per_mb_rl_table= 0;
519
55b4e2248a45 wmv1 slice_height != mb_height support
michaelni
parents: 501
diff changeset
1337
499
8b7a54d58549 wmv1 support
michaelni
parents: 483
diff changeset
1338 if(!s->per_mb_rl_table){
8b7a54d58549 wmv1 support
michaelni
parents: 483
diff changeset
1339 s->rl_table_index = decode012(&s->gb);
8b7a54d58549 wmv1 support
michaelni
parents: 483
diff changeset
1340 s->rl_chroma_table_index = s->rl_table_index;
8b7a54d58549 wmv1 support
michaelni
parents: 483
diff changeset
1341 }
8b7a54d58549 wmv1 support
michaelni
parents: 483
diff changeset
1342
8b7a54d58549 wmv1 support
michaelni
parents: 483
diff changeset
1343 s->dc_table_index = get_bits1(&s->gb);
8b7a54d58549 wmv1 support
michaelni
parents: 483
diff changeset
1344
8b7a54d58549 wmv1 support
michaelni
parents: 483
diff changeset
1345 s->mv_table_index = get_bits1(&s->gb);
578
32c142b10263 fixing bitrate vs. kbitrate in header
michaelni
parents: 563
diff changeset
1346 s->inter_intra_pred= (s->width*s->height < 320*240 && s->bit_rate<=II_BITRATE);
499
8b7a54d58549 wmv1 support
michaelni
parents: 483
diff changeset
1347 break;
307
764aeec1320e msmpeg4v2 decoding (no encoding yet)
michaelni
parents: 300
diff changeset
1348 }
1388
b5c65adac96a debug stuff
michaelni
parents: 1325
diff changeset
1349
b5c65adac96a debug stuff
michaelni
parents: 1325
diff changeset
1350 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
1351 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
1352 s->use_skip_mb_code,
6ab301aaa652 (commit by michael)
arpi_esp
parents: 195
diff changeset
1353 s->rl_table_index,
6ab301aaa652 (commit by michael)
arpi_esp
parents: 195
diff changeset
1354 s->rl_chroma_table_index,
6ab301aaa652 (commit by michael)
arpi_esp
parents: 195
diff changeset
1355 s->dc_table_index,
499
8b7a54d58549 wmv1 support
michaelni
parents: 483
diff changeset
1356 s->mv_table_index,
519
55b4e2248a45 wmv1 slice_height != mb_height support
michaelni
parents: 501
diff changeset
1357 s->per_mb_rl_table,
1388
b5c65adac96a debug stuff
michaelni
parents: 1325
diff changeset
1358 s->qscale);
b5c65adac96a debug stuff
michaelni
parents: 1325
diff changeset
1359
208
2eb04d6be309 (commit by michael)
arpi_esp
parents: 204
diff changeset
1360 if(s->flipflop_rounding){
2eb04d6be309 (commit by michael)
arpi_esp
parents: 204
diff changeset
1361 s->no_rounding ^= 1;
2eb04d6be309 (commit by michael)
arpi_esp
parents: 204
diff changeset
1362 }else{
2eb04d6be309 (commit by michael)
arpi_esp
parents: 204
diff changeset
1363 s->no_rounding = 0;
2eb04d6be309 (commit by michael)
arpi_esp
parents: 204
diff changeset
1364 }
0
986e461dc072 Initial revision
glantau
parents:
diff changeset
1365 }
936
caa77cd960c0 qpel encoding
michaelni
parents: 903
diff changeset
1366 //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
1367
8b7a54d58549 wmv1 support
michaelni
parents: 483
diff changeset
1368 s->esc3_level_length= 0;
8b7a54d58549 wmv1 support
michaelni
parents: 483
diff changeset
1369 s->esc3_run_length= 0;
307
764aeec1320e msmpeg4v2 decoding (no encoding yet)
michaelni
parents: 300
diff changeset
1370
0
986e461dc072 Initial revision
glantau
parents:
diff changeset
1371 #ifdef DEBUG
986e461dc072 Initial revision
glantau
parents:
diff changeset
1372 printf("*****frame %d:\n", frame_count++);
986e461dc072 Initial revision
glantau
parents:
diff changeset
1373 #endif
986e461dc072 Initial revision
glantau
parents:
diff changeset
1374 return 0;
986e461dc072 Initial revision
glantau
parents:
diff changeset
1375 }
986e461dc072 Initial revision
glantau
parents:
diff changeset
1376
208
2eb04d6be309 (commit by michael)
arpi_esp
parents: 204
diff changeset
1377 int msmpeg4_decode_ext_header(MpegEncContext * s, int buf_size)
2eb04d6be309 (commit by michael)
arpi_esp
parents: 204
diff changeset
1378 {
457
583dcee270d2 msmpeg4v1 decoding
michaelni
parents: 440
diff changeset
1379 int left= buf_size*8 - get_bits_count(&s->gb);
583dcee270d2 msmpeg4v1 decoding
michaelni
parents: 440
diff changeset
1380 int length= s->msmpeg4_version>=3 ? 17 : 16;
208
2eb04d6be309 (commit by michael)
arpi_esp
parents: 204
diff changeset
1381 /* the alt_bitstream reader could read over the end so we need to check it */
457
583dcee270d2 msmpeg4v1 decoding
michaelni
parents: 440
diff changeset
1382 if(left>=length && left<length+8)
208
2eb04d6be309 (commit by michael)
arpi_esp
parents: 204
diff changeset
1383 {
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
1384 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
1385
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
1386 fps= get_bits(&s->gb, 5);
578
32c142b10263 fixing bitrate vs. kbitrate in header
michaelni
parents: 563
diff changeset
1387 s->bit_rate= get_bits(&s->gb, 11)*1024;
457
583dcee270d2 msmpeg4v1 decoding
michaelni
parents: 440
diff changeset
1388 if(s->msmpeg4_version>=3)
583dcee270d2 msmpeg4v1 decoding
michaelni
parents: 440
diff changeset
1389 s->flipflop_rounding= get_bits1(&s->gb);
583dcee270d2 msmpeg4v1 decoding
michaelni
parents: 440
diff changeset
1390 else
583dcee270d2 msmpeg4v1 decoding
michaelni
parents: 440
diff changeset
1391 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
1392
578
32c142b10263 fixing bitrate vs. kbitrate in header
michaelni
parents: 563
diff changeset
1393 // 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
1394 }
583dcee270d2 msmpeg4v1 decoding
michaelni
parents: 440
diff changeset
1395 else if(left<length+8)
583dcee270d2 msmpeg4v1 decoding
michaelni
parents: 440
diff changeset
1396 {
583dcee270d2 msmpeg4v1 decoding
michaelni
parents: 440
diff changeset
1397 s->flipflop_rounding= 0;
1399
08f82699fc71 skip ext header missing message for msmpeg4v2
michaelni
parents: 1388
diff changeset
1398 if(s->msmpeg4_version != 2)
1598
932d306bf1dc av_log() patch by (Michel Bardiaux <mbardiaux at peaktime dot be>)
michael
parents: 1399
diff changeset
1399 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
1400 }
2eb04d6be309 (commit by michael)
arpi_esp
parents: 204
diff changeset
1401 else
2eb04d6be309 (commit by michael)
arpi_esp
parents: 204
diff changeset
1402 {
1598
932d306bf1dc av_log() patch by (Michel Bardiaux <mbardiaux at peaktime dot be>)
michael
parents: 1399
diff changeset
1403 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
1404 }
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
1405
208
2eb04d6be309 (commit by michael)
arpi_esp
parents: 204
diff changeset
1406 return 0;
2eb04d6be309 (commit by michael)
arpi_esp
parents: 204
diff changeset
1407 }
2eb04d6be309 (commit by michael)
arpi_esp
parents: 204
diff changeset
1408
440
000aeeac27a2 * started to cleanup name clashes for onetime compilation
kabi
parents: 429
diff changeset
1409 static inline void msmpeg4_memsetw(short *tab, int val, int n)
0
986e461dc072 Initial revision
glantau
parents:
diff changeset
1410 {
986e461dc072 Initial revision
glantau
parents:
diff changeset
1411 int i;
986e461dc072 Initial revision
glantau
parents:
diff changeset
1412 for(i=0;i<n;i++)
986e461dc072 Initial revision
glantau
parents:
diff changeset
1413 tab[i] = val;
986e461dc072 Initial revision
glantau
parents:
diff changeset
1414 }
986e461dc072 Initial revision
glantau
parents:
diff changeset
1415
310
49e73229a5e6 msmpeg4v2 encoding
michaelni
parents: 309
diff changeset
1416 static void msmpeg4v2_encode_motion(MpegEncContext * s, int val)
49e73229a5e6 msmpeg4v2 encoding
michaelni
parents: 309
diff changeset
1417 {
49e73229a5e6 msmpeg4v2 encoding
michaelni
parents: 309
diff changeset
1418 int range, bit_size, sign, code, bits;
49e73229a5e6 msmpeg4v2 encoding
michaelni
parents: 309
diff changeset
1419
49e73229a5e6 msmpeg4v2 encoding
michaelni
parents: 309
diff changeset
1420 if (val == 0) {
49e73229a5e6 msmpeg4v2 encoding
michaelni
parents: 309
diff changeset
1421 /* zero vector */
49e73229a5e6 msmpeg4v2 encoding
michaelni
parents: 309
diff changeset
1422 code = 0;
49e73229a5e6 msmpeg4v2 encoding
michaelni
parents: 309
diff changeset
1423 put_bits(&s->pb, mvtab[code][1], mvtab[code][0]);
49e73229a5e6 msmpeg4v2 encoding
michaelni
parents: 309
diff changeset
1424 } else {
49e73229a5e6 msmpeg4v2 encoding
michaelni
parents: 309
diff changeset
1425 bit_size = s->f_code - 1;
49e73229a5e6 msmpeg4v2 encoding
michaelni
parents: 309
diff changeset
1426 range = 1 << bit_size;
49e73229a5e6 msmpeg4v2 encoding
michaelni
parents: 309
diff changeset
1427 if (val <= -64)
49e73229a5e6 msmpeg4v2 encoding
michaelni
parents: 309
diff changeset
1428 val += 64;
49e73229a5e6 msmpeg4v2 encoding
michaelni
parents: 309
diff changeset
1429 else if (val >= 64)
49e73229a5e6 msmpeg4v2 encoding
michaelni
parents: 309
diff changeset
1430 val -= 64;
49e73229a5e6 msmpeg4v2 encoding
michaelni
parents: 309
diff changeset
1431
49e73229a5e6 msmpeg4v2 encoding
michaelni
parents: 309
diff changeset
1432 if (val >= 0) {
49e73229a5e6 msmpeg4v2 encoding
michaelni
parents: 309
diff changeset
1433 sign = 0;
49e73229a5e6 msmpeg4v2 encoding
michaelni
parents: 309
diff changeset
1434 } else {
49e73229a5e6 msmpeg4v2 encoding
michaelni
parents: 309
diff changeset
1435 val = -val;
49e73229a5e6 msmpeg4v2 encoding
michaelni
parents: 309
diff changeset
1436 sign = 1;
49e73229a5e6 msmpeg4v2 encoding
michaelni
parents: 309
diff changeset
1437 }
49e73229a5e6 msmpeg4v2 encoding
michaelni
parents: 309
diff changeset
1438 val--;
49e73229a5e6 msmpeg4v2 encoding
michaelni
parents: 309
diff changeset
1439 code = (val >> bit_size) + 1;
49e73229a5e6 msmpeg4v2 encoding
michaelni
parents: 309
diff changeset
1440 bits = val & (range - 1);
49e73229a5e6 msmpeg4v2 encoding
michaelni
parents: 309
diff changeset
1441
49e73229a5e6 msmpeg4v2 encoding
michaelni
parents: 309
diff changeset
1442 put_bits(&s->pb, mvtab[code][1] + 1, (mvtab[code][0] << 1) | sign);
49e73229a5e6 msmpeg4v2 encoding
michaelni
parents: 309
diff changeset
1443 if (bit_size > 0) {
49e73229a5e6 msmpeg4v2 encoding
michaelni
parents: 309
diff changeset
1444 put_bits(&s->pb, bit_size, bits);
49e73229a5e6 msmpeg4v2 encoding
michaelni
parents: 309
diff changeset
1445 }
49e73229a5e6 msmpeg4v2 encoding
michaelni
parents: 309
diff changeset
1446 }
49e73229a5e6 msmpeg4v2 encoding
michaelni
parents: 309
diff changeset
1447 }
49e73229a5e6 msmpeg4v2 encoding
michaelni
parents: 309
diff changeset
1448
307
764aeec1320e msmpeg4v2 decoding (no encoding yet)
michaelni
parents: 300
diff changeset
1449 /* this is identical to h263 except that its range is multiplied by 2 */
764aeec1320e msmpeg4v2 decoding (no encoding yet)
michaelni
parents: 300
diff changeset
1450 static int msmpeg4v2_decode_motion(MpegEncContext * s, int pred, int f_code)
764aeec1320e msmpeg4v2 decoding (no encoding yet)
michaelni
parents: 300
diff changeset
1451 {
764aeec1320e msmpeg4v2 decoding (no encoding yet)
michaelni
parents: 300
diff changeset
1452 int code, val, sign, shift;
764aeec1320e msmpeg4v2 decoding (no encoding yet)
michaelni
parents: 300
diff changeset
1453
531
f5d7fcc81787 get_vlc() optimizations
michaelni
parents: 519
diff changeset
1454 code = get_vlc2(&s->gb, v2_mv_vlc.table, V2_MV_VLC_BITS, 2);
457
583dcee270d2 msmpeg4v1 decoding
michaelni
parents: 440
diff changeset
1455 // 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
1456 if (code < 0)
764aeec1320e msmpeg4v2 decoding (no encoding yet)
michaelni
parents: 300
diff changeset
1457 return 0xffff;
764aeec1320e msmpeg4v2 decoding (no encoding yet)
michaelni
parents: 300
diff changeset
1458
764aeec1320e msmpeg4v2 decoding (no encoding yet)
michaelni
parents: 300
diff changeset
1459 if (code == 0)
764aeec1320e msmpeg4v2 decoding (no encoding yet)
michaelni
parents: 300
diff changeset
1460 return pred;
764aeec1320e msmpeg4v2 decoding (no encoding yet)
michaelni
parents: 300
diff changeset
1461 sign = get_bits1(&s->gb);
764aeec1320e msmpeg4v2 decoding (no encoding yet)
michaelni
parents: 300
diff changeset
1462 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
1463 val = code;
625ccacd1113 decode motion & modulo optimize patch by (BERO <bero at geocities dot co dot jp>)
michaelni
parents: 1216
diff changeset
1464 if (shift) {
625ccacd1113 decode motion & modulo optimize patch by (BERO <bero at geocities dot co dot jp>)
michaelni
parents: 1216
diff changeset
1465 val = (val - 1) << shift;
307
764aeec1320e msmpeg4v2 decoding (no encoding yet)
michaelni
parents: 300
diff changeset
1466 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
1467 val++;
625ccacd1113 decode motion & modulo optimize patch by (BERO <bero at geocities dot co dot jp>)
michaelni
parents: 1216
diff changeset
1468 }
307
764aeec1320e msmpeg4v2 decoding (no encoding yet)
michaelni
parents: 300
diff changeset
1469 if (sign)
764aeec1320e msmpeg4v2 decoding (no encoding yet)
michaelni
parents: 300
diff changeset
1470 val = -val;
457
583dcee270d2 msmpeg4v1 decoding
michaelni
parents: 440
diff changeset
1471
307
764aeec1320e msmpeg4v2 decoding (no encoding yet)
michaelni
parents: 300
diff changeset
1472 val += pred;
764aeec1320e msmpeg4v2 decoding (no encoding yet)
michaelni
parents: 300
diff changeset
1473 if (val <= -64)
764aeec1320e msmpeg4v2 decoding (no encoding yet)
michaelni
parents: 300
diff changeset
1474 val += 64;
764aeec1320e msmpeg4v2 decoding (no encoding yet)
michaelni
parents: 300
diff changeset
1475 else if (val >= 64)
764aeec1320e msmpeg4v2 decoding (no encoding yet)
michaelni
parents: 300
diff changeset
1476 val -= 64;
764aeec1320e msmpeg4v2 decoding (no encoding yet)
michaelni
parents: 300
diff changeset
1477
764aeec1320e msmpeg4v2 decoding (no encoding yet)
michaelni
parents: 300
diff changeset
1478 return val;
764aeec1320e msmpeg4v2 decoding (no encoding yet)
michaelni
parents: 300
diff changeset
1479 }
764aeec1320e msmpeg4v2 decoding (no encoding yet)
michaelni
parents: 300
diff changeset
1480
745
25d7fb7c89be better/cleaner error resilience (done in a 2nd pass after decoding)
michaelni
parents: 743
diff changeset
1481 static int msmpeg4v12_decode_mb(MpegEncContext *s, DCTELEM block[6][64])
307
764aeec1320e msmpeg4v2 decoding (no encoding yet)
michaelni
parents: 300
diff changeset
1482 {
764aeec1320e msmpeg4v2 decoding (no encoding yet)
michaelni
parents: 300
diff changeset
1483 int cbp, code, i;
745
25d7fb7c89be better/cleaner error resilience (done in a 2nd pass after decoding)
michaelni
parents: 743
diff changeset
1484
307
764aeec1320e msmpeg4v2 decoding (no encoding yet)
michaelni
parents: 300
diff changeset
1485 if (s->pict_type == P_TYPE) {
764aeec1320e msmpeg4v2 decoding (no encoding yet)
michaelni
parents: 300
diff changeset
1486 if (s->use_skip_mb_code) {
764aeec1320e msmpeg4v2 decoding (no encoding yet)
michaelni
parents: 300
diff changeset
1487 if (get_bits1(&s->gb)) {
764aeec1320e msmpeg4v2 decoding (no encoding yet)
michaelni
parents: 300
diff changeset
1488 /* skip mb */
764aeec1320e msmpeg4v2 decoding (no encoding yet)
michaelni
parents: 300
diff changeset
1489 s->mb_intra = 0;
764aeec1320e msmpeg4v2 decoding (no encoding yet)
michaelni
parents: 300
diff changeset
1490 for(i=0;i<6;i++)
764aeec1320e msmpeg4v2 decoding (no encoding yet)
michaelni
parents: 300
diff changeset
1491 s->block_last_index[i] = -1;
764aeec1320e msmpeg4v2 decoding (no encoding yet)
michaelni
parents: 300
diff changeset
1492 s->mv_dir = MV_DIR_FORWARD;
764aeec1320e msmpeg4v2 decoding (no encoding yet)
michaelni
parents: 300
diff changeset
1493 s->mv_type = MV_TYPE_16X16;
764aeec1320e msmpeg4v2 decoding (no encoding yet)
michaelni
parents: 300
diff changeset
1494 s->mv[0][0][0] = 0;
764aeec1320e msmpeg4v2 decoding (no encoding yet)
michaelni
parents: 300
diff changeset
1495 s->mv[0][0][1] = 0;
764aeec1320e msmpeg4v2 decoding (no encoding yet)
michaelni
parents: 300
diff changeset
1496 s->mb_skiped = 1;
764aeec1320e msmpeg4v2 decoding (no encoding yet)
michaelni
parents: 300
diff changeset
1497 return 0;
764aeec1320e msmpeg4v2 decoding (no encoding yet)
michaelni
parents: 300
diff changeset
1498 }
764aeec1320e msmpeg4v2 decoding (no encoding yet)
michaelni
parents: 300
diff changeset
1499 }
764aeec1320e msmpeg4v2 decoding (no encoding yet)
michaelni
parents: 300
diff changeset
1500
457
583dcee270d2 msmpeg4v1 decoding
michaelni
parents: 440
diff changeset
1501 if(s->msmpeg4_version==2)
531
f5d7fcc81787 get_vlc() optimizations
michaelni
parents: 519
diff changeset
1502 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
1503 else
531
f5d7fcc81787 get_vlc() optimizations
michaelni
parents: 519
diff changeset
1504 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
1505 if(code<0 || code>7){
1598
932d306bf1dc av_log() patch by (Michel Bardiaux <mbardiaux at peaktime dot be>)
michael
parents: 1399
diff changeset
1506 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
1507 return -1;
583dcee270d2 msmpeg4v1 decoding
michaelni
parents: 440
diff changeset
1508 }
583dcee270d2 msmpeg4v1 decoding
michaelni
parents: 440
diff changeset
1509
307
764aeec1320e msmpeg4v2 decoding (no encoding yet)
michaelni
parents: 300
diff changeset
1510 s->mb_intra = code >>2;
764aeec1320e msmpeg4v2 decoding (no encoding yet)
michaelni
parents: 300
diff changeset
1511
764aeec1320e msmpeg4v2 decoding (no encoding yet)
michaelni
parents: 300
diff changeset
1512 cbp = code & 0x3;
764aeec1320e msmpeg4v2 decoding (no encoding yet)
michaelni
parents: 300
diff changeset
1513 } else {
764aeec1320e msmpeg4v2 decoding (no encoding yet)
michaelni
parents: 300
diff changeset
1514 s->mb_intra = 1;
457
583dcee270d2 msmpeg4v1 decoding
michaelni
parents: 440
diff changeset
1515 if(s->msmpeg4_version==2)
531
f5d7fcc81787 get_vlc() optimizations
michaelni
parents: 519
diff changeset
1516 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
1517 else
531
f5d7fcc81787 get_vlc() optimizations
michaelni
parents: 519
diff changeset
1518 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
1519 if(cbp<0 || cbp>3){
1598
932d306bf1dc av_log() patch by (Michel Bardiaux <mbardiaux at peaktime dot be>)
michael
parents: 1399
diff changeset
1520 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
1521 return -1;
583dcee270d2 msmpeg4v1 decoding
michaelni
parents: 440
diff changeset
1522 }
307
764aeec1320e msmpeg4v2 decoding (no encoding yet)
michaelni
parents: 300
diff changeset
1523 }
764aeec1320e msmpeg4v2 decoding (no encoding yet)
michaelni
parents: 300
diff changeset
1524
764aeec1320e msmpeg4v2 decoding (no encoding yet)
michaelni
parents: 300
diff changeset
1525 if (!s->mb_intra) {
457
583dcee270d2 msmpeg4v1 decoding
michaelni
parents: 440
diff changeset
1526 int mx, my, cbpy;
583dcee270d2 msmpeg4v1 decoding
michaelni
parents: 440
diff changeset
1527
531
f5d7fcc81787 get_vlc() optimizations
michaelni
parents: 519
diff changeset
1528 cbpy= get_vlc2(&s->gb, cbpy_vlc.table, CBPY_VLC_BITS, 1);
457
583dcee270d2 msmpeg4v1 decoding
michaelni
parents: 440
diff changeset
1529 if(cbpy<0){
1598
932d306bf1dc av_log() patch by (Michel Bardiaux <mbardiaux at peaktime dot be>)
michael
parents: 1399
diff changeset
1530 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
1531 return -1;
583dcee270d2 msmpeg4v1 decoding
michaelni
parents: 440
diff changeset
1532 }
307
764aeec1320e msmpeg4v2 decoding (no encoding yet)
michaelni
parents: 300
diff changeset
1533
457
583dcee270d2 msmpeg4v1 decoding
michaelni
parents: 440
diff changeset
1534 cbp|= cbpy<<2;
583dcee270d2 msmpeg4v1 decoding
michaelni
parents: 440
diff changeset
1535 if(s->msmpeg4_version==1 || (cbp&3) != 3) cbp^= 0x3C;
307
764aeec1320e msmpeg4v2 decoding (no encoding yet)
michaelni
parents: 300
diff changeset
1536
1938
e2501e6e7ff7 unify table indexing (motion_val,dc_val,ac_val,coded_block changed)
michael
parents: 1739
diff changeset
1537 h263_pred_motion(s, 0, 0, &mx, &my);
307
764aeec1320e msmpeg4v2 decoding (no encoding yet)
michaelni
parents: 300
diff changeset
1538 mx= msmpeg4v2_decode_motion(s, mx, 1);
764aeec1320e msmpeg4v2 decoding (no encoding yet)
michaelni
parents: 300
diff changeset
1539 my= msmpeg4v2_decode_motion(s, my, 1);
764aeec1320e msmpeg4v2 decoding (no encoding yet)
michaelni
parents: 300
diff changeset
1540
764aeec1320e msmpeg4v2 decoding (no encoding yet)
michaelni
parents: 300
diff changeset
1541 s->mv_dir = MV_DIR_FORWARD;
764aeec1320e msmpeg4v2 decoding (no encoding yet)
michaelni
parents: 300
diff changeset
1542 s->mv_type = MV_TYPE_16X16;
764aeec1320e msmpeg4v2 decoding (no encoding yet)
michaelni
parents: 300
diff changeset
1543 s->mv[0][0][0] = mx;
764aeec1320e msmpeg4v2 decoding (no encoding yet)
michaelni
parents: 300
diff changeset
1544 s->mv[0][0][1] = my;
764aeec1320e msmpeg4v2 decoding (no encoding yet)
michaelni
parents: 300
diff changeset
1545 } else {
457
583dcee270d2 msmpeg4v1 decoding
michaelni
parents: 440
diff changeset
1546 if(s->msmpeg4_version==2){
583dcee270d2 msmpeg4v1 decoding
michaelni
parents: 440
diff changeset
1547 s->ac_pred = get_bits1(&s->gb);
531
f5d7fcc81787 get_vlc() optimizations
michaelni
parents: 519
diff changeset
1548 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
1549 } else{
583dcee270d2 msmpeg4v1 decoding
michaelni
parents: 440
diff changeset
1550 s->ac_pred = 0;
531
f5d7fcc81787 get_vlc() optimizations
michaelni
parents: 519
diff changeset
1551 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
1552 if(s->pict_type==P_TYPE) cbp^=0x3C;
583dcee270d2 msmpeg4v1 decoding
michaelni
parents: 440
diff changeset
1553 }
307
764aeec1320e msmpeg4v2 decoding (no encoding yet)
michaelni
parents: 300
diff changeset
1554 }
764aeec1320e msmpeg4v2 decoding (no encoding yet)
michaelni
parents: 300
diff changeset
1555
764aeec1320e msmpeg4v2 decoding (no encoding yet)
michaelni
parents: 300
diff changeset
1556 for (i = 0; i < 6; i++) {
936
caa77cd960c0 qpel encoding
michaelni
parents: 903
diff changeset
1557 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
1558 {
1598
932d306bf1dc av_log() patch by (Michel Bardiaux <mbardiaux at peaktime dot be>)
michael
parents: 1399
diff changeset
1559 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
1560 return -1;
764aeec1320e msmpeg4v2 decoding (no encoding yet)
michaelni
parents: 300
diff changeset
1561 }
764aeec1320e msmpeg4v2 decoding (no encoding yet)
michaelni
parents: 300
diff changeset
1562 }
764aeec1320e msmpeg4v2 decoding (no encoding yet)
michaelni
parents: 300
diff changeset
1563 return 0;
764aeec1320e msmpeg4v2 decoding (no encoding yet)
michaelni
parents: 300
diff changeset
1564 }
764aeec1320e msmpeg4v2 decoding (no encoding yet)
michaelni
parents: 300
diff changeset
1565
745
25d7fb7c89be better/cleaner error resilience (done in a 2nd pass after decoding)
michaelni
parents: 743
diff changeset
1566 static int msmpeg4v34_decode_mb(MpegEncContext *s, DCTELEM block[6][64])
0
986e461dc072 Initial revision
glantau
parents:
diff changeset
1567 {
986e461dc072 Initial revision
glantau
parents:
diff changeset
1568 int cbp, code, i;
1064
b32afefe7d33 * UINTX -> uintx_t INTX -> intx_t
kabi
parents: 1063
diff changeset
1569 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
1570 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
1571
986e461dc072 Initial revision
glantau
parents:
diff changeset
1572 if (s->pict_type == P_TYPE) {
986e461dc072 Initial revision
glantau
parents:
diff changeset
1573 set_stat(ST_INTER_MB);
986e461dc072 Initial revision
glantau
parents:
diff changeset
1574 if (s->use_skip_mb_code) {
21
20e680e7a490 get_bits() specialization, gives 4\speedup
arpi_esp
parents: 7
diff changeset
1575 if (get_bits1(&s->gb)) {
0
986e461dc072 Initial revision
glantau
parents:
diff changeset
1576 /* skip mb */
986e461dc072 Initial revision
glantau
parents:
diff changeset
1577 s->mb_intra = 0;
986e461dc072 Initial revision
glantau
parents:
diff changeset
1578 for(i=0;i<6;i++)
986e461dc072 Initial revision
glantau
parents:
diff changeset
1579 s->block_last_index[i] = -1;
986e461dc072 Initial revision
glantau
parents:
diff changeset
1580 s->mv_dir = MV_DIR_FORWARD;
986e461dc072 Initial revision
glantau
parents:
diff changeset
1581 s->mv_type = MV_TYPE_16X16;
986e461dc072 Initial revision
glantau
parents:
diff changeset
1582 s->mv[0][0][0] = 0;
986e461dc072 Initial revision
glantau
parents:
diff changeset
1583 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
1584 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
1585 *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
1586
0
986e461dc072 Initial revision
glantau
parents:
diff changeset
1587 return 0;
986e461dc072 Initial revision
glantau
parents:
diff changeset
1588 }
986e461dc072 Initial revision
glantau
parents:
diff changeset
1589 }
986e461dc072 Initial revision
glantau
parents:
diff changeset
1590
936
caa77cd960c0 qpel encoding
michaelni
parents: 903
diff changeset
1591 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
1592 if (code < 0)
986e461dc072 Initial revision
glantau
parents:
diff changeset
1593 return -1;
246
214ac77c0948 * simplified indexing
kabi
parents: 228
diff changeset
1594 //s->mb_intra = (code & 0x40) ? 0 : 1;
214ac77c0948 * simplified indexing
kabi
parents: 228
diff changeset
1595 s->mb_intra = (~code & 0x40) >> 6;
0
986e461dc072 Initial revision
glantau
parents:
diff changeset
1596
986e461dc072 Initial revision
glantau
parents:
diff changeset
1597 cbp = code & 0x3f;
986e461dc072 Initial revision
glantau
parents:
diff changeset
1598 } else {
986e461dc072 Initial revision
glantau
parents:
diff changeset
1599 set_stat(ST_INTRA_MB);
986e461dc072 Initial revision
glantau
parents:
diff changeset
1600 s->mb_intra = 1;
531
f5d7fcc81787 get_vlc() optimizations
michaelni
parents: 519
diff changeset
1601 code = get_vlc2(&s->gb, mb_intra_vlc.table, MB_INTRA_VLC_BITS, 2);
0
986e461dc072 Initial revision
glantau
parents:
diff changeset
1602 if (code < 0)
986e461dc072 Initial revision
glantau
parents:
diff changeset
1603 return -1;
986e461dc072 Initial revision
glantau
parents:
diff changeset
1604 /* predict coded block pattern */
986e461dc072 Initial revision
glantau
parents:
diff changeset
1605 cbp = 0;
986e461dc072 Initial revision
glantau
parents:
diff changeset
1606 for(i=0;i<6;i++) {
246
214ac77c0948 * simplified indexing
kabi
parents: 228
diff changeset
1607 int val = ((code >> (5 - i)) & 1);
0
986e461dc072 Initial revision
glantau
parents:
diff changeset
1608 if (i < 4) {
246
214ac77c0948 * simplified indexing
kabi
parents: 228
diff changeset
1609 int pred = coded_block_pred(s, i, &coded_val);
0
986e461dc072 Initial revision
glantau
parents:
diff changeset
1610 val = val ^ pred;
986e461dc072 Initial revision
glantau
parents:
diff changeset
1611 *coded_val = val;
986e461dc072 Initial revision
glantau
parents:
diff changeset
1612 }
986e461dc072 Initial revision
glantau
parents:
diff changeset
1613 cbp |= val << (5 - i);
986e461dc072 Initial revision
glantau
parents:
diff changeset
1614 }
986e461dc072 Initial revision
glantau
parents:
diff changeset
1615 }
986e461dc072 Initial revision
glantau
parents:
diff changeset
1616
986e461dc072 Initial revision
glantau
parents:
diff changeset
1617 if (!s->mb_intra) {
986e461dc072 Initial revision
glantau
parents:
diff changeset
1618 int mx, my;
499
8b7a54d58549 wmv1 support
michaelni
parents: 483
diff changeset
1619 //printf("P at %d %d\n", s->mb_x, s->mb_y);
8b7a54d58549 wmv1 support
michaelni
parents: 483
diff changeset
1620 if(s->per_mb_rl_table && cbp){
8b7a54d58549 wmv1 support
michaelni
parents: 483
diff changeset
1621 s->rl_table_index = decode012(&s->gb);
8b7a54d58549 wmv1 support
michaelni
parents: 483
diff changeset
1622 s->rl_chroma_table_index = s->rl_table_index;
8b7a54d58549 wmv1 support
michaelni
parents: 483
diff changeset
1623 }
0
986e461dc072 Initial revision
glantau
parents:
diff changeset
1624 set_stat(ST_MV);
1938
e2501e6e7ff7 unify table indexing (motion_val,dc_val,ac_val,coded_block changed)
michael
parents: 1739
diff changeset
1625 h263_pred_motion(s, 0, 0, &mx, &my);
0
986e461dc072 Initial revision
glantau
parents:
diff changeset
1626 if (msmpeg4_decode_motion(s, &mx, &my) < 0)
986e461dc072 Initial revision
glantau
parents:
diff changeset
1627 return -1;
986e461dc072 Initial revision
glantau
parents:
diff changeset
1628 s->mv_dir = MV_DIR_FORWARD;
986e461dc072 Initial revision
glantau
parents:
diff changeset
1629 s->mv_type = MV_TYPE_16X16;
986e461dc072 Initial revision
glantau
parents:
diff changeset
1630 s->mv[0][0][0] = mx;
986e461dc072 Initial revision
glantau
parents:
diff changeset
1631 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
1632 *mb_type_ptr = MB_TYPE_L0 | MB_TYPE_16x16;
0
986e461dc072 Initial revision
glantau
parents:
diff changeset
1633 } else {
499
8b7a54d58549 wmv1 support
michaelni
parents: 483
diff changeset
1634 //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
1635 set_stat(ST_INTRA_MB);
21
20e680e7a490 get_bits() specialization, gives 4\speedup
arpi_esp
parents: 7
diff changeset
1636 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
1637 *mb_type_ptr = MB_TYPE_INTRA;
519
55b4e2248a45 wmv1 slice_height != mb_height support
michaelni
parents: 501
diff changeset
1638 if(s->inter_intra_pred){
531
f5d7fcc81787 get_vlc() optimizations
michaelni
parents: 519
diff changeset
1639 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
1640 // 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
1641 }
499
8b7a54d58549 wmv1 support
michaelni
parents: 483
diff changeset
1642 if(s->per_mb_rl_table && cbp){
8b7a54d58549 wmv1 support
michaelni
parents: 483
diff changeset
1643 s->rl_table_index = decode012(&s->gb);
8b7a54d58549 wmv1 support
michaelni
parents: 483
diff changeset
1644 s->rl_chroma_table_index = s->rl_table_index;
8b7a54d58549 wmv1 support
michaelni
parents: 483
diff changeset
1645 }
0
986e461dc072 Initial revision
glantau
parents:
diff changeset
1646 }
986e461dc072 Initial revision
glantau
parents:
diff changeset
1647
986e461dc072 Initial revision
glantau
parents:
diff changeset
1648 for (i = 0; i < 6; i++) {
936
caa77cd960c0 qpel encoding
michaelni
parents: 903
diff changeset
1649 if (msmpeg4_decode_block(s, block[i], i, (cbp >> (5 - i)) & 1, NULL) < 0)
246
214ac77c0948 * simplified indexing
kabi
parents: 228
diff changeset
1650 {
1598
932d306bf1dc av_log() patch by (Michel Bardiaux <mbardiaux at peaktime dot be>)
michael
parents: 1399
diff changeset
1651 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
1652 return -1;
246
214ac77c0948 * simplified indexing
kabi
parents: 228
diff changeset
1653 }
0
986e461dc072 Initial revision
glantau
parents:
diff changeset
1654 }
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
1655
0
986e461dc072 Initial revision
glantau
parents:
diff changeset
1656 return 0;
986e461dc072 Initial revision
glantau
parents:
diff changeset
1657 }
563
61442627f857 fixes fire.avi & subtitles.avi
michaelni
parents: 556
diff changeset
1658 //#define ERROR_DETAILS
499
8b7a54d58549 wmv1 support
michaelni
parents: 483
diff changeset
1659 static inline int msmpeg4_decode_block(MpegEncContext * s, DCTELEM * block,
936
caa77cd960c0 qpel encoding
michaelni
parents: 903
diff changeset
1660 int n, int coded, const uint8_t *scan_table)
0
986e461dc072 Initial revision
glantau
parents:
diff changeset
1661 {
542
d55978a3c369 rl vlc decoding optimizations
michaelni
parents: 531
diff changeset
1662 int level, i, last, run, run_diff;
0
986e461dc072 Initial revision
glantau
parents:
diff changeset
1663 int dc_pred_dir;
986e461dc072 Initial revision
glantau
parents:
diff changeset
1664 RLTable *rl;
542
d55978a3c369 rl vlc decoding optimizations
michaelni
parents: 531
diff changeset
1665 RL_VLC_ELEM *rl_vlc;
200
6ab301aaa652 (commit by michael)
arpi_esp
parents: 195
diff changeset
1666 int qmul, qadd;
0
986e461dc072 Initial revision
glantau
parents:
diff changeset
1667
986e461dc072 Initial revision
glantau
parents:
diff changeset
1668 if (s->mb_intra) {
200
6ab301aaa652 (commit by michael)
arpi_esp
parents: 195
diff changeset
1669 qmul=1;
6ab301aaa652 (commit by michael)
arpi_esp
parents: 195
diff changeset
1670 qadd=0;
6ab301aaa652 (commit by michael)
arpi_esp
parents: 195
diff changeset
1671
0
986e461dc072 Initial revision
glantau
parents:
diff changeset
1672 /* DC coef */
986e461dc072 Initial revision
glantau
parents:
diff changeset
1673 set_stat(ST_DC);
986e461dc072 Initial revision
glantau
parents:
diff changeset
1674 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
1675
457
583dcee270d2 msmpeg4v1 decoding
michaelni
parents: 440
diff changeset
1676 if (level < 0){
1598
932d306bf1dc av_log() patch by (Michel Bardiaux <mbardiaux at peaktime dot be>)
michael
parents: 1399
diff changeset
1677 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
1678 if(s->inter_intra_pred) level=0;
55b4e2248a45 wmv1 slice_height != mb_height support
michaelni
parents: 501
diff changeset
1679 else return -1;
457
583dcee270d2 msmpeg4v1 decoding
michaelni
parents: 440
diff changeset
1680 }
0
986e461dc072 Initial revision
glantau
parents:
diff changeset
1681 if (n < 4) {
986e461dc072 Initial revision
glantau
parents:
diff changeset
1682 rl = &rl_table[s->rl_table_index];
457
583dcee270d2 msmpeg4v1 decoding
michaelni
parents: 440
diff changeset
1683 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
1684 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
1685 if(!s->inter_intra_pred) return -1;
457
583dcee270d2 msmpeg4v1 decoding
michaelni
parents: 440
diff changeset
1686 }
0
986e461dc072 Initial revision
glantau
parents:
diff changeset
1687 } else {
986e461dc072 Initial revision
glantau
parents:
diff changeset
1688 rl = &rl_table[3 + s->rl_chroma_table_index];
457
583dcee270d2 msmpeg4v1 decoding
michaelni
parents: 440
diff changeset
1689 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
1690 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
1691 if(!s->inter_intra_pred) return -1;
457
583dcee270d2 msmpeg4v1 decoding
michaelni
parents: 440
diff changeset
1692 }
0
986e461dc072 Initial revision
glantau
parents:
diff changeset
1693 }
457
583dcee270d2 msmpeg4v1 decoding
michaelni
parents: 440
diff changeset
1694 block[0] = level;
200
6ab301aaa652 (commit by michael)
arpi_esp
parents: 195
diff changeset
1695
0
986e461dc072 Initial revision
glantau
parents:
diff changeset
1696 run_diff = 0;
542
d55978a3c369 rl vlc decoding optimizations
michaelni
parents: 531
diff changeset
1697 i = 0;
0
986e461dc072 Initial revision
glantau
parents:
diff changeset
1698 if (!coded) {
986e461dc072 Initial revision
glantau
parents:
diff changeset
1699 goto not_coded;
986e461dc072 Initial revision
glantau
parents:
diff changeset
1700 }
986e461dc072 Initial revision
glantau
parents:
diff changeset
1701 if (s->ac_pred) {
986e461dc072 Initial revision
glantau
parents:
diff changeset
1702 if (dc_pred_dir == 0)
706
e65798d228ea idct permutation cleanup, idct can be selected per context now
michaelni
parents: 601
diff changeset
1703 scan_table = s->intra_v_scantable.permutated; /* left */
0
986e461dc072 Initial revision
glantau
parents:
diff changeset
1704 else
706
e65798d228ea idct permutation cleanup, idct can be selected per context now
michaelni
parents: 601
diff changeset
1705 scan_table = s->intra_h_scantable.permutated; /* top */
0
986e461dc072 Initial revision
glantau
parents:
diff changeset
1706 } else {
706
e65798d228ea idct permutation cleanup, idct can be selected per context now
michaelni
parents: 601
diff changeset
1707 scan_table = s->intra_scantable.permutated;
0
986e461dc072 Initial revision
glantau
parents:
diff changeset
1708 }
986e461dc072 Initial revision
glantau
parents:
diff changeset
1709 set_stat(ST_INTRA_AC);
542
d55978a3c369 rl vlc decoding optimizations
michaelni
parents: 531
diff changeset
1710 rl_vlc= rl->rl_vlc[0];
0
986e461dc072 Initial revision
glantau
parents:
diff changeset
1711 } else {
200
6ab301aaa652 (commit by michael)
arpi_esp
parents: 195
diff changeset
1712 qmul = s->qscale << 1;
6ab301aaa652 (commit by michael)
arpi_esp
parents: 195
diff changeset
1713 qadd = (s->qscale - 1) | 1;
542
d55978a3c369 rl vlc decoding optimizations
michaelni
parents: 531
diff changeset
1714 i = -1;
0
986e461dc072 Initial revision
glantau
parents:
diff changeset
1715 rl = &rl_table[3 + s->rl_table_index];
307
764aeec1320e msmpeg4v2 decoding (no encoding yet)
michaelni
parents: 300
diff changeset
1716
764aeec1320e msmpeg4v2 decoding (no encoding yet)
michaelni
parents: 300
diff changeset
1717 if(s->msmpeg4_version==2)
764aeec1320e msmpeg4v2 decoding (no encoding yet)
michaelni
parents: 300
diff changeset
1718 run_diff = 0;
764aeec1320e msmpeg4v2 decoding (no encoding yet)
michaelni
parents: 300
diff changeset
1719 else
764aeec1320e msmpeg4v2 decoding (no encoding yet)
michaelni
parents: 300
diff changeset
1720 run_diff = 1;
764aeec1320e msmpeg4v2 decoding (no encoding yet)
michaelni
parents: 300
diff changeset
1721
0
986e461dc072 Initial revision
glantau
parents:
diff changeset
1722 if (!coded) {
542
d55978a3c369 rl vlc decoding optimizations
michaelni
parents: 531
diff changeset
1723 s->block_last_index[n] = i;
0
986e461dc072 Initial revision
glantau
parents:
diff changeset
1724 return 0;
986e461dc072 Initial revision
glantau
parents:
diff changeset
1725 }
936
caa77cd960c0 qpel encoding
michaelni
parents: 903
diff changeset
1726 if(!scan_table)
caa77cd960c0 qpel encoding
michaelni
parents: 903
diff changeset
1727 scan_table = s->inter_scantable.permutated;
0
986e461dc072 Initial revision
glantau
parents:
diff changeset
1728 set_stat(ST_INTER_AC);
542
d55978a3c369 rl vlc decoding optimizations
michaelni
parents: 531
diff changeset
1729 rl_vlc= rl->rl_vlc[s->qscale];
0
986e461dc072 Initial revision
glantau
parents:
diff changeset
1730 }
542
d55978a3c369 rl vlc decoding optimizations
michaelni
parents: 531
diff changeset
1731 {
d55978a3c369 rl vlc decoding optimizations
michaelni
parents: 531
diff changeset
1732 OPEN_READER(re, &s->gb);
0
986e461dc072 Initial revision
glantau
parents:
diff changeset
1733 for(;;) {
542
d55978a3c369 rl vlc decoding optimizations
michaelni
parents: 531
diff changeset
1734 UPDATE_CACHE(re, &s->gb);
d55978a3c369 rl vlc decoding optimizations
michaelni
parents: 531
diff changeset
1735 GET_RL_VLC(level, run, re, &s->gb, rl_vlc, TEX_VLC_BITS, 2);
d55978a3c369 rl vlc decoding optimizations
michaelni
parents: 531
diff changeset
1736 if (level==0) {
d55978a3c369 rl vlc decoding optimizations
michaelni
parents: 531
diff changeset
1737 int cache;
d55978a3c369 rl vlc decoding optimizations
michaelni
parents: 531
diff changeset
1738 cache= GET_CACHE(re, &s->gb);
0
986e461dc072 Initial revision
glantau
parents:
diff changeset
1739 /* escape */
542
d55978a3c369 rl vlc decoding optimizations
michaelni
parents: 531
diff changeset
1740 if (s->msmpeg4_version==1 || (cache&0x80000000)==0) {
d55978a3c369 rl vlc decoding optimizations
michaelni
parents: 531
diff changeset
1741 if (s->msmpeg4_version==1 || (cache&0x40000000)==0) {
0
986e461dc072 Initial revision
glantau
parents:
diff changeset
1742 /* third escape */
542
d55978a3c369 rl vlc decoding optimizations
michaelni
parents: 531
diff changeset
1743 if(s->msmpeg4_version!=1) LAST_SKIP_BITS(re, &s->gb, 2);
d55978a3c369 rl vlc decoding optimizations
michaelni
parents: 531
diff changeset
1744 UPDATE_CACHE(re, &s->gb);
499
8b7a54d58549 wmv1 support
michaelni
parents: 483
diff changeset
1745 if(s->msmpeg4_version<=3){
542
d55978a3c369 rl vlc decoding optimizations
michaelni
parents: 531
diff changeset
1746 last= SHOW_UBITS(re, &s->gb, 1); SKIP_CACHE(re, &s->gb, 1);
d55978a3c369 rl vlc decoding optimizations
michaelni
parents: 531
diff changeset
1747 run= SHOW_UBITS(re, &s->gb, 6); SKIP_CACHE(re, &s->gb, 6);
d55978a3c369 rl vlc decoding optimizations
michaelni
parents: 531
diff changeset
1748 level= SHOW_SBITS(re, &s->gb, 8); LAST_SKIP_CACHE(re, &s->gb, 8);
d55978a3c369 rl vlc decoding optimizations
michaelni
parents: 531
diff changeset
1749 SKIP_COUNTER(re, &s->gb, 1+6+8);
d55978a3c369 rl vlc decoding optimizations
michaelni
parents: 531
diff changeset
1750 }else{
499
8b7a54d58549 wmv1 support
michaelni
parents: 483
diff changeset
1751 int sign;
542
d55978a3c369 rl vlc decoding optimizations
michaelni
parents: 531
diff changeset
1752 last= SHOW_UBITS(re, &s->gb, 1); SKIP_BITS(re, &s->gb, 1);
499
8b7a54d58549 wmv1 support
michaelni
parents: 483
diff changeset
1753 if(!s->esc3_level_length){
8b7a54d58549 wmv1 support
michaelni
parents: 483
diff changeset
1754 int ll;
8b7a54d58549 wmv1 support
michaelni
parents: 483
diff changeset
1755 //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
1756 if(s->qscale<8){
542
d55978a3c369 rl vlc decoding optimizations
michaelni
parents: 531
diff changeset
1757 ll= SHOW_UBITS(re, &s->gb, 3); SKIP_BITS(re, &s->gb, 3);
499
8b7a54d58549 wmv1 support
michaelni
parents: 483
diff changeset
1758 if(ll==0){
1598
932d306bf1dc av_log() patch by (Michel Bardiaux <mbardiaux at peaktime dot be>)
michael
parents: 1399
diff changeset
1759 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
1760 SKIP_BITS(re, &s->gb, 1);
499
8b7a54d58549 wmv1 support
michaelni
parents: 483
diff changeset
1761 ll=8;
8b7a54d58549 wmv1 support
michaelni
parents: 483
diff changeset
1762 }
8b7a54d58549 wmv1 support
michaelni
parents: 483
diff changeset
1763 }else{
8b7a54d58549 wmv1 support
michaelni
parents: 483
diff changeset
1764 ll=2;
542
d55978a3c369 rl vlc decoding optimizations
michaelni
parents: 531
diff changeset
1765 while(ll<8 && SHOW_UBITS(re, &s->gb, 1)==0){
d55978a3c369 rl vlc decoding optimizations
michaelni
parents: 531
diff changeset
1766 ll++;
d55978a3c369 rl vlc decoding optimizations
michaelni
parents: 531
diff changeset
1767 SKIP_BITS(re, &s->gb, 1);
d55978a3c369 rl vlc decoding optimizations
michaelni
parents: 531
diff changeset
1768 }
578
32c142b10263 fixing bitrate vs. kbitrate in header
michaelni
parents: 563
diff changeset
1769 if(ll<8) SKIP_BITS(re, &s->gb, 1);
499
8b7a54d58549 wmv1 support
michaelni
parents: 483
diff changeset
1770 }
8b7a54d58549 wmv1 support
michaelni
parents: 483
diff changeset
1771
8b7a54d58549 wmv1 support
michaelni
parents: 483
diff changeset
1772 s->esc3_level_length= ll;
542
d55978a3c369 rl vlc decoding optimizations
michaelni
parents: 531
diff changeset
1773 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
1774 //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
1775 UPDATE_CACHE(re, &s->gb);
499
8b7a54d58549 wmv1 support
michaelni
parents: 483
diff changeset
1776 }
542
d55978a3c369 rl vlc decoding optimizations
michaelni
parents: 531
diff changeset
1777 run= SHOW_UBITS(re, &s->gb, s->esc3_run_length);
d55978a3c369 rl vlc decoding optimizations
michaelni
parents: 531
diff changeset
1778 SKIP_BITS(re, &s->gb, s->esc3_run_length);
d55978a3c369 rl vlc decoding optimizations
michaelni
parents: 531
diff changeset
1779
d55978a3c369 rl vlc decoding optimizations
michaelni
parents: 531
diff changeset
1780 sign= SHOW_UBITS(re, &s->gb, 1);
d55978a3c369 rl vlc decoding optimizations
michaelni
parents: 531
diff changeset
1781 SKIP_BITS(re, &s->gb, 1);
d55978a3c369 rl vlc decoding optimizations
michaelni
parents: 531
diff changeset
1782
d55978a3c369 rl vlc decoding optimizations
michaelni
parents: 531
diff changeset
1783 level= SHOW_UBITS(re, &s->gb, s->esc3_level_length);
d55978a3c369 rl vlc decoding optimizations
michaelni
parents: 531
diff changeset
1784 SKIP_BITS(re, &s->gb, s->esc3_level_length);
499
8b7a54d58549 wmv1 support
michaelni
parents: 483
diff changeset
1785 if(sign) level= -level;
8b7a54d58549 wmv1 support
michaelni
parents: 483
diff changeset
1786 }
8b7a54d58549 wmv1 support
michaelni
parents: 483
diff changeset
1787 //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
1788 #if 0 // waste of time / this will detect very few errors
583dcee270d2 msmpeg4v1 decoding
michaelni
parents: 440
diff changeset
1789 {
583dcee270d2 msmpeg4v1 decoding
michaelni
parents: 440
diff changeset
1790 const int abs_level= ABS(level);
583dcee270d2 msmpeg4v1 decoding
michaelni
parents: 440
diff changeset
1791 const int run1= run - rl->max_run[last][abs_level] - run_diff;
583dcee270d2 msmpeg4v1 decoding
michaelni
parents: 440
diff changeset
1792 if(abs_level<=MAX_LEVEL && run<=MAX_RUN){
583dcee270d2 msmpeg4v1 decoding
michaelni
parents: 440
diff changeset
1793 if(abs_level <= rl->max_level[last][run]){
583dcee270d2 msmpeg4v1 decoding
michaelni
parents: 440
diff changeset
1794 fprintf(stderr, "illegal 3. esc, vlc encoding possible\n");
583dcee270d2 msmpeg4v1 decoding
michaelni
parents: 440
diff changeset
1795 return DECODING_AC_LOST;
583dcee270d2 msmpeg4v1 decoding
michaelni
parents: 440
diff changeset
1796 }
583dcee270d2 msmpeg4v1 decoding
michaelni
parents: 440
diff changeset
1797 if(abs_level <= rl->max_level[last][run]*2){
583dcee270d2 msmpeg4v1 decoding
michaelni
parents: 440
diff changeset
1798 fprintf(stderr, "illegal 3. esc, esc 1 encoding possible\n");
583dcee270d2 msmpeg4v1 decoding
michaelni
parents: 440
diff changeset
1799 return DECODING_AC_LOST;
583dcee270d2 msmpeg4v1 decoding
michaelni
parents: 440
diff changeset
1800 }
499
8b7a54d58549 wmv1 support
michaelni
parents: 483
diff changeset
1801 if(run1>=0 && abs_level <= rl->max_level[last][run1]){
457
583dcee270d2 msmpeg4v1 decoding
michaelni
parents: 440
diff changeset
1802 fprintf(stderr, "illegal 3. esc, esc 2 encoding possible\n");
583dcee270d2 msmpeg4v1 decoding
michaelni
parents: 440
diff changeset
1803 return DECODING_AC_LOST;
583dcee270d2 msmpeg4v1 decoding
michaelni
parents: 440
diff changeset
1804 }
583dcee270d2 msmpeg4v1 decoding
michaelni
parents: 440
diff changeset
1805 }
583dcee270d2 msmpeg4v1 decoding
michaelni
parents: 440
diff changeset
1806 }
583dcee270d2 msmpeg4v1 decoding
michaelni
parents: 440
diff changeset
1807 #endif
246
214ac77c0948 * simplified indexing
kabi
parents: 228
diff changeset
1808 //level = level * qmul + (level>0) * qadd - (level<=0) * qadd ;
214ac77c0948 * simplified indexing
kabi
parents: 228
diff changeset
1809 if (level>0) level= level * qmul + qadd;
457
583dcee270d2 msmpeg4v1 decoding
michaelni
parents: 440
diff changeset
1810 else level= level * qmul - qadd;
583dcee270d2 msmpeg4v1 decoding
michaelni
parents: 440
diff changeset
1811 #if 0 // waste of time too :(
583dcee270d2 msmpeg4v1 decoding
michaelni
parents: 440
diff changeset
1812 if(level>2048 || level<-2048){
583dcee270d2 msmpeg4v1 decoding
michaelni
parents: 440
diff changeset
1813 fprintf(stderr, "|level| overflow in 3. esc\n");
583dcee270d2 msmpeg4v1 decoding
michaelni
parents: 440
diff changeset
1814 return DECODING_AC_LOST;
583dcee270d2 msmpeg4v1 decoding
michaelni
parents: 440
diff changeset
1815 }
583dcee270d2 msmpeg4v1 decoding
michaelni
parents: 440
diff changeset
1816 #endif
542
d55978a3c369 rl vlc decoding optimizations
michaelni
parents: 531
diff changeset
1817 i+= run + 1;
d55978a3c369 rl vlc decoding optimizations
michaelni
parents: 531
diff changeset
1818 if(last) i+=192;
563
61442627f857 fixes fire.avi & subtitles.avi
michaelni
parents: 556
diff changeset
1819 #ifdef ERROR_DETAILS
61442627f857 fixes fire.avi & subtitles.avi
michaelni
parents: 556
diff changeset
1820 if(run==66)
61442627f857 fixes fire.avi & subtitles.avi
michaelni
parents: 556
diff changeset
1821 fprintf(stderr, "illegal vlc code in ESC3 level=%d\n", level);
61442627f857 fixes fire.avi & subtitles.avi
michaelni
parents: 556
diff changeset
1822 else if((i>62 && i<192) || i>192+63)
61442627f857 fixes fire.avi & subtitles.avi
michaelni
parents: 556
diff changeset
1823 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
1824 #endif
0
986e461dc072 Initial revision
glantau
parents:
diff changeset
1825 } else {
986e461dc072 Initial revision
glantau
parents:
diff changeset
1826 /* second escape */
542
d55978a3c369 rl vlc decoding optimizations
michaelni
parents: 531
diff changeset
1827 #if MIN_CACHE_BITS < 23
d55978a3c369 rl vlc decoding optimizations
michaelni
parents: 531
diff changeset
1828 LAST_SKIP_BITS(re, &s->gb, 2);
d55978a3c369 rl vlc decoding optimizations
michaelni
parents: 531
diff changeset
1829 UPDATE_CACHE(re, &s->gb);
d55978a3c369 rl vlc decoding optimizations
michaelni
parents: 531
diff changeset
1830 #else
d55978a3c369 rl vlc decoding optimizations
michaelni
parents: 531
diff changeset
1831 SKIP_BITS(re, &s->gb, 2);
d55978a3c369 rl vlc decoding optimizations
michaelni
parents: 531
diff changeset
1832 #endif
d55978a3c369 rl vlc decoding optimizations
michaelni
parents: 531
diff changeset
1833 GET_RL_VLC(level, run, re, &s->gb, rl_vlc, TEX_VLC_BITS, 2);
d55978a3c369 rl vlc decoding optimizations
michaelni
parents: 531
diff changeset
1834 i+= run + rl->max_run[run>>7][level/qmul] + run_diff; //FIXME opt indexing
d55978a3c369 rl vlc decoding optimizations
michaelni
parents: 531
diff changeset
1835 level = (level ^ SHOW_SBITS(re, &s->gb, 1)) - SHOW_SBITS(re, &s->gb, 1);
d55978a3c369 rl vlc decoding optimizations
michaelni
parents: 531
diff changeset
1836 LAST_SKIP_BITS(re, &s->gb, 1);
563
61442627f857 fixes fire.avi & subtitles.avi
michaelni
parents: 556
diff changeset
1837 #ifdef ERROR_DETAILS
61442627f857 fixes fire.avi & subtitles.avi
michaelni
parents: 556
diff changeset
1838 if(run==66)
61442627f857 fixes fire.avi & subtitles.avi
michaelni
parents: 556
diff changeset
1839 fprintf(stderr, "illegal vlc code in ESC2 level=%d\n", level);
61442627f857 fixes fire.avi & subtitles.avi
michaelni
parents: 556
diff changeset
1840 else if((i>62 && i<192) || i>192+63)
61442627f857 fixes fire.avi & subtitles.avi
michaelni
parents: 556
diff changeset
1841 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
1842 #endif
0
986e461dc072 Initial revision
glantau
parents:
diff changeset
1843 }
986e461dc072 Initial revision
glantau
parents:
diff changeset
1844 } else {
986e461dc072 Initial revision
glantau
parents:
diff changeset
1845 /* first escape */
542
d55978a3c369 rl vlc decoding optimizations
michaelni
parents: 531
diff changeset
1846 #if MIN_CACHE_BITS < 22
d55978a3c369 rl vlc decoding optimizations
michaelni
parents: 531
diff changeset
1847 LAST_SKIP_BITS(re, &s->gb, 1);
d55978a3c369 rl vlc decoding optimizations
michaelni
parents: 531
diff changeset
1848 UPDATE_CACHE(re, &s->gb);
d55978a3c369 rl vlc decoding optimizations
michaelni
parents: 531
diff changeset
1849 #else
d55978a3c369 rl vlc decoding optimizations
michaelni
parents: 531
diff changeset
1850 SKIP_BITS(re, &s->gb, 1);
d55978a3c369 rl vlc decoding optimizations
michaelni
parents: 531
diff changeset
1851 #endif
d55978a3c369 rl vlc decoding optimizations
michaelni
parents: 531
diff changeset
1852 GET_RL_VLC(level, run, re, &s->gb, rl_vlc, TEX_VLC_BITS, 2);
d55978a3c369 rl vlc decoding optimizations
michaelni
parents: 531
diff changeset
1853 i+= run;
d55978a3c369 rl vlc decoding optimizations
michaelni
parents: 531
diff changeset
1854 level = level + rl->max_level[run>>7][(run-1)&63] * qmul;//FIXME opt indexing
d55978a3c369 rl vlc decoding optimizations
michaelni
parents: 531
diff changeset
1855 level = (level ^ SHOW_SBITS(re, &s->gb, 1)) - SHOW_SBITS(re, &s->gb, 1);
d55978a3c369 rl vlc decoding optimizations
michaelni
parents: 531
diff changeset
1856 LAST_SKIP_BITS(re, &s->gb, 1);
563
61442627f857 fixes fire.avi & subtitles.avi
michaelni
parents: 556
diff changeset
1857 #ifdef ERROR_DETAILS
61442627f857 fixes fire.avi & subtitles.avi
michaelni
parents: 556
diff changeset
1858 if(run==66)
61442627f857 fixes fire.avi & subtitles.avi
michaelni
parents: 556
diff changeset
1859 fprintf(stderr, "illegal vlc code in ESC1 level=%d\n", level);
61442627f857 fixes fire.avi & subtitles.avi
michaelni
parents: 556
diff changeset
1860 else if((i>62 && i<192) || i>192+63)
61442627f857 fixes fire.avi & subtitles.avi
michaelni
parents: 556
diff changeset
1861 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
1862 #endif
0
986e461dc072 Initial revision
glantau
parents:
diff changeset
1863 }
986e461dc072 Initial revision
glantau
parents:
diff changeset
1864 } else {
542
d55978a3c369 rl vlc decoding optimizations
michaelni
parents: 531
diff changeset
1865 i+= run;
d55978a3c369 rl vlc decoding optimizations
michaelni
parents: 531
diff changeset
1866 level = (level ^ SHOW_SBITS(re, &s->gb, 1)) - SHOW_SBITS(re, &s->gb, 1);
d55978a3c369 rl vlc decoding optimizations
michaelni
parents: 531
diff changeset
1867 LAST_SKIP_BITS(re, &s->gb, 1);
563
61442627f857 fixes fire.avi & subtitles.avi
michaelni
parents: 556
diff changeset
1868 #ifdef ERROR_DETAILS
61442627f857 fixes fire.avi & subtitles.avi
michaelni
parents: 556
diff changeset
1869 if(run==66)
61442627f857 fixes fire.avi & subtitles.avi
michaelni
parents: 556
diff changeset
1870 fprintf(stderr, "illegal vlc code level=%d\n", level);
61442627f857 fixes fire.avi & subtitles.avi
michaelni
parents: 556
diff changeset
1871 else if((i>62 && i<192) || i>192+63)
61442627f857 fixes fire.avi & subtitles.avi
michaelni
parents: 556
diff changeset
1872 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
1873 #endif
0
986e461dc072 Initial revision
glantau
parents:
diff changeset
1874 }
542
d55978a3c369 rl vlc decoding optimizations
michaelni
parents: 531
diff changeset
1875 if (i > 62){
d55978a3c369 rl vlc decoding optimizations
michaelni
parents: 531
diff changeset
1876 i-= 192;
d55978a3c369 rl vlc decoding optimizations
michaelni
parents: 531
diff changeset
1877 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
1878 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
1879 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
1880 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
1881 break;
61442627f857 fixes fire.avi & subtitles.avi
michaelni
parents: 556
diff changeset
1882 }else{
1598
932d306bf1dc av_log() patch by (Michel Bardiaux <mbardiaux at peaktime dot be>)
michael
parents: 1399
diff changeset
1883 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
1884 return -1;
61442627f857 fixes fire.avi & subtitles.avi
michaelni
parents: 556
diff changeset
1885 }
542
d55978a3c369 rl vlc decoding optimizations
michaelni
parents: 531
diff changeset
1886 }
d55978a3c369 rl vlc decoding optimizations
michaelni
parents: 531
diff changeset
1887
d55978a3c369 rl vlc decoding optimizations
michaelni
parents: 531
diff changeset
1888 block[scan_table[i]] = level;
d55978a3c369 rl vlc decoding optimizations
michaelni
parents: 531
diff changeset
1889 break;
499
8b7a54d58549 wmv1 support
michaelni
parents: 483
diff changeset
1890 }
457
583dcee270d2 msmpeg4v1 decoding
michaelni
parents: 440
diff changeset
1891
542
d55978a3c369 rl vlc decoding optimizations
michaelni
parents: 531
diff changeset
1892 block[scan_table[i]] = level;
0
986e461dc072 Initial revision
glantau
parents:
diff changeset
1893 }
542
d55978a3c369 rl vlc decoding optimizations
michaelni
parents: 531
diff changeset
1894 CLOSE_READER(re, &s->gb);
d55978a3c369 rl vlc decoding optimizations
michaelni
parents: 531
diff changeset
1895 }
0
986e461dc072 Initial revision
glantau
parents:
diff changeset
1896 not_coded:
986e461dc072 Initial revision
glantau
parents:
diff changeset
1897 if (s->mb_intra) {
986e461dc072 Initial revision
glantau
parents:
diff changeset
1898 mpeg4_pred_ac(s, block, n, dc_pred_dir);
986e461dc072 Initial revision
glantau
parents:
diff changeset
1899 if (s->ac_pred) {
542
d55978a3c369 rl vlc decoding optimizations
michaelni
parents: 531
diff changeset
1900 i = 63; /* XXX: not optimal */
0
986e461dc072 Initial revision
glantau
parents:
diff changeset
1901 }
986e461dc072 Initial revision
glantau
parents:
diff changeset
1902 }
936
caa77cd960c0 qpel encoding
michaelni
parents: 903
diff changeset
1903 if(s->msmpeg4_version>=4 && i>0) i=63; //FIXME/XXX optimize
542
d55978a3c369 rl vlc decoding optimizations
michaelni
parents: 531
diff changeset
1904 s->block_last_index[n] = i;
499
8b7a54d58549 wmv1 support
michaelni
parents: 483
diff changeset
1905
0
986e461dc072 Initial revision
glantau
parents:
diff changeset
1906 return 0;
986e461dc072 Initial revision
glantau
parents:
diff changeset
1907 }
986e461dc072 Initial revision
glantau
parents:
diff changeset
1908
986e461dc072 Initial revision
glantau
parents:
diff changeset
1909 static int msmpeg4_decode_dc(MpegEncContext * s, int n, int *dir_ptr)
986e461dc072 Initial revision
glantau
parents:
diff changeset
1910 {
986e461dc072 Initial revision
glantau
parents:
diff changeset
1911 int level, pred;
986e461dc072 Initial revision
glantau
parents:
diff changeset
1912
457
583dcee270d2 msmpeg4v1 decoding
michaelni
parents: 440
diff changeset
1913 if(s->msmpeg4_version<=2){
307
764aeec1320e msmpeg4v2 decoding (no encoding yet)
michaelni
parents: 300
diff changeset
1914 if (n < 4) {
531
f5d7fcc81787 get_vlc() optimizations
michaelni
parents: 519
diff changeset
1915 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
1916 } else {
531
f5d7fcc81787 get_vlc() optimizations
michaelni
parents: 519
diff changeset
1917 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
1918 }
309
32485ad4cc4e fixing msmpeg4v2 bugs (is bugfree now afaik)
michaelni
parents: 307
diff changeset
1919 if (level < 0)
307
764aeec1320e msmpeg4v2 decoding (no encoding yet)
michaelni
parents: 300
diff changeset
1920 return -1;
764aeec1320e msmpeg4v2 decoding (no encoding yet)
michaelni
parents: 300
diff changeset
1921 level-=256;
764aeec1320e msmpeg4v2 decoding (no encoding yet)
michaelni
parents: 300
diff changeset
1922 }else{ //FIXME optimize use unified tables & index
764aeec1320e msmpeg4v2 decoding (no encoding yet)
michaelni
parents: 300
diff changeset
1923 if (n < 4) {
531
f5d7fcc81787 get_vlc() optimizations
michaelni
parents: 519
diff changeset
1924 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
1925 } else {
531
f5d7fcc81787 get_vlc() optimizations
michaelni
parents: 519
diff changeset
1926 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
1927 }
457
583dcee270d2 msmpeg4v1 decoding
michaelni
parents: 440
diff changeset
1928 if (level < 0){
1598
932d306bf1dc av_log() patch by (Michel Bardiaux <mbardiaux at peaktime dot be>)
michael
parents: 1399
diff changeset
1929 av_log(s->avctx, AV_LOG_ERROR, "illegal dc vlc\n");
307
764aeec1320e msmpeg4v2 decoding (no encoding yet)
michaelni
parents: 300
diff changeset
1930 return -1;
457
583dcee270d2 msmpeg4v1 decoding
michaelni
parents: 440
diff changeset
1931 }
307
764aeec1320e msmpeg4v2 decoding (no encoding yet)
michaelni
parents: 300
diff changeset
1932
764aeec1320e msmpeg4v2 decoding (no encoding yet)
michaelni
parents: 300
diff changeset
1933 if (level == DC_MAX) {
764aeec1320e msmpeg4v2 decoding (no encoding yet)
michaelni
parents: 300
diff changeset
1934 level = get_bits(&s->gb, 8);
764aeec1320e msmpeg4v2 decoding (no encoding yet)
michaelni
parents: 300
diff changeset
1935 if (get_bits1(&s->gb))
764aeec1320e msmpeg4v2 decoding (no encoding yet)
michaelni
parents: 300
diff changeset
1936 level = -level;
764aeec1320e msmpeg4v2 decoding (no encoding yet)
michaelni
parents: 300
diff changeset
1937 } else if (level != 0) {
764aeec1320e msmpeg4v2 decoding (no encoding yet)
michaelni
parents: 300
diff changeset
1938 if (get_bits1(&s->gb))
764aeec1320e msmpeg4v2 decoding (no encoding yet)
michaelni
parents: 300
diff changeset
1939 level = -level;
764aeec1320e msmpeg4v2 decoding (no encoding yet)
michaelni
parents: 300
diff changeset
1940 }
0
986e461dc072 Initial revision
glantau
parents:
diff changeset
1941 }
986e461dc072 Initial revision
glantau
parents:
diff changeset
1942
457
583dcee270d2 msmpeg4v1 decoding
michaelni
parents: 440
diff changeset
1943 if(s->msmpeg4_version==1){
1064
b32afefe7d33 * UINTX -> uintx_t INTX -> intx_t
kabi
parents: 1063
diff changeset
1944 int32_t *dc_val;
457
583dcee270d2 msmpeg4v1 decoding
michaelni
parents: 440
diff changeset
1945 pred = msmpeg4v1_pred_dc(s, n, &dc_val);
583dcee270d2 msmpeg4v1 decoding
michaelni
parents: 440
diff changeset
1946 level += pred;
583dcee270d2 msmpeg4v1 decoding
michaelni
parents: 440
diff changeset
1947
583dcee270d2 msmpeg4v1 decoding
michaelni
parents: 440
diff changeset
1948 /* update predictor */
583dcee270d2 msmpeg4v1 decoding
michaelni
parents: 440
diff changeset
1949 *dc_val= level;
583dcee270d2 msmpeg4v1 decoding
michaelni
parents: 440
diff changeset
1950 }else{
1064
b32afefe7d33 * UINTX -> uintx_t INTX -> intx_t
kabi
parents: 1063
diff changeset
1951 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
1952 pred = msmpeg4_pred_dc(s, n, &dc_val, dir_ptr);
457
583dcee270d2 msmpeg4v1 decoding
michaelni
parents: 440
diff changeset
1953 level += pred;
0
986e461dc072 Initial revision
glantau
parents:
diff changeset
1954
457
583dcee270d2 msmpeg4v1 decoding
michaelni
parents: 440
diff changeset
1955 /* update predictor */
583dcee270d2 msmpeg4v1 decoding
michaelni
parents: 440
diff changeset
1956 if (n < 4) {
583dcee270d2 msmpeg4v1 decoding
michaelni
parents: 440
diff changeset
1957 *dc_val = level * s->y_dc_scale;
583dcee270d2 msmpeg4v1 decoding
michaelni
parents: 440
diff changeset
1958 } else {
583dcee270d2 msmpeg4v1 decoding
michaelni
parents: 440
diff changeset
1959 *dc_val = level * s->c_dc_scale;
583dcee270d2 msmpeg4v1 decoding
michaelni
parents: 440
diff changeset
1960 }
0
986e461dc072 Initial revision
glantau
parents:
diff changeset
1961 }
986e461dc072 Initial revision
glantau
parents:
diff changeset
1962
986e461dc072 Initial revision
glantau
parents:
diff changeset
1963 return level;
986e461dc072 Initial revision
glantau
parents:
diff changeset
1964 }
986e461dc072 Initial revision
glantau
parents:
diff changeset
1965
986e461dc072 Initial revision
glantau
parents:
diff changeset
1966 static int msmpeg4_decode_motion(MpegEncContext * s,
986e461dc072 Initial revision
glantau
parents:
diff changeset
1967 int *mx_ptr, int *my_ptr)
986e461dc072 Initial revision
glantau
parents:
diff changeset
1968 {
986e461dc072 Initial revision
glantau
parents:
diff changeset
1969 MVTable *mv;
986e461dc072 Initial revision
glantau
parents:
diff changeset
1970 int code, mx, my;
986e461dc072 Initial revision
glantau
parents:
diff changeset
1971
986e461dc072 Initial revision
glantau
parents:
diff changeset
1972 mv = &mv_tables[s->mv_table_index];
986e461dc072 Initial revision
glantau
parents:
diff changeset
1973
531
f5d7fcc81787 get_vlc() optimizations
michaelni
parents: 519
diff changeset
1974 code = get_vlc2(&s->gb, mv->vlc.table, MV_VLC_BITS, 2);
499
8b7a54d58549 wmv1 support
michaelni
parents: 483
diff changeset
1975 if (code < 0){
1598
932d306bf1dc av_log() patch by (Michel Bardiaux <mbardiaux at peaktime dot be>)
michael
parents: 1399
diff changeset
1976 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
1977 return -1;
499
8b7a54d58549 wmv1 support
michaelni
parents: 483
diff changeset
1978 }
0
986e461dc072 Initial revision
glantau
parents:
diff changeset
1979 if (code == mv->n) {
499
8b7a54d58549 wmv1 support
michaelni
parents: 483
diff changeset
1980 //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
1981 mx = get_bits(&s->gb, 6);
986e461dc072 Initial revision
glantau
parents:
diff changeset
1982 my = get_bits(&s->gb, 6);
986e461dc072 Initial revision
glantau
parents:
diff changeset
1983 } else {
986e461dc072 Initial revision
glantau
parents:
diff changeset
1984 mx = mv->table_mvx[code];
986e461dc072 Initial revision
glantau
parents:
diff changeset
1985 my = mv->table_mvy[code];
986e461dc072 Initial revision
glantau
parents:
diff changeset
1986 }
986e461dc072 Initial revision
glantau
parents:
diff changeset
1987
986e461dc072 Initial revision
glantau
parents:
diff changeset
1988 mx += *mx_ptr - 32;
986e461dc072 Initial revision
glantau
parents:
diff changeset
1989 my += *my_ptr - 32;
986e461dc072 Initial revision
glantau
parents:
diff changeset
1990 /* WARNING : they do not do exactly modulo encoding */
986e461dc072 Initial revision
glantau
parents:
diff changeset
1991 if (mx <= -64)
986e461dc072 Initial revision
glantau
parents:
diff changeset
1992 mx += 64;
986e461dc072 Initial revision
glantau
parents:
diff changeset
1993 else if (mx >= 64)
986e461dc072 Initial revision
glantau
parents:
diff changeset
1994 mx -= 64;
986e461dc072 Initial revision
glantau
parents:
diff changeset
1995
986e461dc072 Initial revision
glantau
parents:
diff changeset
1996 if (my <= -64)
986e461dc072 Initial revision
glantau
parents:
diff changeset
1997 my += 64;
986e461dc072 Initial revision
glantau
parents:
diff changeset
1998 else if (my >= 64)
986e461dc072 Initial revision
glantau
parents:
diff changeset
1999 my -= 64;
986e461dc072 Initial revision
glantau
parents:
diff changeset
2000 *mx_ptr = mx;
986e461dc072 Initial revision
glantau
parents:
diff changeset
2001 *my_ptr = my;
986e461dc072 Initial revision
glantau
parents:
diff changeset
2002 return 0;
986e461dc072 Initial revision
glantau
parents:
diff changeset
2003 }
936
caa77cd960c0 qpel encoding
michaelni
parents: 903
diff changeset
2004
caa77cd960c0 qpel encoding
michaelni
parents: 903
diff changeset
2005 /* cleanest way to support it
caa77cd960c0 qpel encoding
michaelni
parents: 903
diff changeset
2006 * 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
2007 * as allmost everything would be in the common file
caa77cd960c0 qpel encoding
michaelni
parents: 903
diff changeset
2008 */
caa77cd960c0 qpel encoding
michaelni
parents: 903
diff changeset
2009 #include "wmv2.c"