1 /*
2 * MSMPEG4 backend for encoder and decoder
3 * Copyright (c) 2001 Fabrice Bellard
4 * Copyright (c) 2002-2004 Michael Niedermayer <michaelni@gmx.at>
5 *
6 * msmpeg4v1 & v2 stuff by Michael Niedermayer <michaelni@gmx.at>
7 *
8 * This file is part of FFmpeg.
9 *
10 * FFmpeg is free software; you can redistribute it and/or
11 * modify it under the terms of the GNU Lesser General Public
12 * License as published by the Free Software Foundation; either
13 * version 2.1 of the License, or (at your option) any later version.
14 *
15 * FFmpeg is distributed in the hope that it will be useful,
16 * but WITHOUT ANY WARRANTY; without even the implied warranty of
17 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
18 * Lesser General Public License for more details.
19 *
20 * You should have received a copy of the GNU Lesser General Public
21 * License along with FFmpeg; if not, write to the Free Software
22 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
23 */
24
25 /**
26 * @file
27 * MSMPEG4 backend for encoder and decoder
28 */
29
31
43
44 /*
45 * You can also call this codec: MPEG-4 with a twist!
46 *
47 * TODO:
48 * - (encoding) select best mv table (two choices)
49 * - (encoding) select best vlc/dc table
50 */
51
52 /* This table is practically identical to the one from H.263
53 * except that it is inverted. */
55 {
57 int uni_code, uni_len;
59 /* find number of bits */
62 while (v) {
63 v >>= 1;
65 }
66
69 else
71
72 /* luminance H.263 */
75 uni_code ^= (1 << uni_len) - 1; //M$ does not like compatibility
76
78 uni_code <<=
size; uni_code |= l;
81 uni_code <<= 1; uni_code |= 1;
82 uni_len++;
83 }
84 }
87
88 /* chrominance H.263 */
91 uni_code ^= (1 << uni_len) - 1; //M$ does not like compatibility
92
94 uni_code <<=
size; uni_code |= l;
97 uni_code <<= 1; uni_code |= 1;
98 uni_len++;
99 }
100 }
103 }
104 }
105
107 {
109
112
114 }
115
117 {
119
120 switch(
s->msmpeg4_version){
121 case 1:
122 case 2:
125 break;
126 case 3:
127 if(
s->workaround_bugs){
130 } else{
133 }
134 break;
135 case 4:
136 case 5:
139 break;
140 #if CONFIG_VC1_DECODER
141 case 6:
144 break;
145 #endif
146
147 }
148
149
150 if(
s->msmpeg4_version>=4){
155 }
156 //Note the default tables are set in common_init in mpegvideo.c
157
159 }
160
161 /* predict coded block */
163 {
165
166 xy =
s->block_index[n];
168
169 /* B C
170 * A X
171 */
172 a =
s->coded_block[xy - 1 ];
173 b =
s->coded_block[xy - 1 -
wrap];
174 c =
s->coded_block[xy -
wrap];
175
178 } else {
180 }
181
182 /* store value */
183 *coded_block_ptr = &
s->coded_block[xy];
184
186 }
187
189 {
190 int y;
191 int sum=0;
192 for(y=0; y<block_size; y++){
193 int x;
194 for(x=0; x<block_size; x++){
196 }
197 }
199 }
200
201 /* dir = 0: left, dir = 1: top prediction */
203 int16_t **dc_val_ptr, int *dir_ptr)
204 {
206 int16_t *dc_val;
207
208 /* find prediction */
209 if (n < 4) {
211 } else {
213 }
214
215 wrap =
s->block_wrap[n];
216 dc_val=
s->dc_val[0] +
s->block_index[n];
217
218 /* B C
219 * A X
220 */
222 b = dc_val[ - 1 -
wrap];
224
225 if(
s->first_slice_line && (n&2)==0 &&
s->msmpeg4_version<4){
227 }
228
229 /* XXX: the following solution consumes divisions, but it does not
230 necessitate to modify mpegvideo.c. The problem comes from the
231 fact they decided to store the quantized DC (which would lead
232 to problems if Q could vary !) */
233 #if ARCH_X86 && HAVE_7REGS && HAVE_EBX_AVAILABLE
235 "movl %3, %%eax \n\t"
236 "shrl 1,ドル %%eax \n\t"
237 "addl %%eax, %2 \n\t"
238 "addl %%eax, %1 \n\t"
239 "addl %0, %%eax \n\t"
240 "imull %4 \n\t"
241 "movl %%edx, %0 \n\t"
242 "movl %1, %%eax \n\t"
243 "imull %4 \n\t"
244 "movl %%edx, %1 \n\t"
245 "movl %2, %%eax \n\t"
246 "imull %4 \n\t"
247 "movl %%edx, %2 \n\t"
248 :
"+b" (
a),
"+c" (
b),
"+D" (
c)
250 : "%eax", "%edx"
251 );
252 #else
253 /* Divisions are costly everywhere; optimize the most common case. */
255 a = (
a + (8 >> 1)) / 8;
256 b = (
b + (8 >> 1)) / 8;
257 c = (
c + (8 >> 1)) / 8;
258 } else {
262 }
263 #endif
264 /* XXX: WARNING: they did not choose the same test as MPEG-4. This
265 is very important ! */
266 if(
s->msmpeg4_version>3){
267 if(
s->inter_intra_pred){
268 uint8_t *dest;
270
271 if(n==1){
273 *dir_ptr = 0;
274 }else if(n==2){
276 *dir_ptr = 1;
277 }else if(n==3){
280 *dir_ptr = 1;
281 } else {
283 *dir_ptr = 0;
284 }
285 }else{
286 int bs = 8 >>
s->avctx->lowres;
287 if(n<4){
289 dest=
s->current_picture.f->data[0] + (((n >> 1) + 2*
s->mb_y) * bs*
wrap ) + ((n & 1) + 2*
s->mb_x) * bs;
290 }else{
292 dest=
s->current_picture.f->data[n - 3] + (
s->mb_y * bs *
wrap) +
s->mb_x * bs;
293 }
298
299 if (
s->h263_aic_dir==0) {
301 *dir_ptr = 0;
302 }
else if (
s->h263_aic_dir==1) {
303 if(n==0){
305 *dir_ptr = 1;
306 }else{
308 *dir_ptr = 0;
309 }
310 }
else if (
s->h263_aic_dir==2) {
311 if(n==0){
313 *dir_ptr = 0;
314 }else{
316 *dir_ptr = 1;
317 }
318 } else {
320 *dir_ptr = 1;
321 }
322 }
323 }else{
326 *dir_ptr = 1;
327 } else {
329 *dir_ptr = 0;
330 }
331 }
332 }else{
335 *dir_ptr = 1;
336 } else {
338 *dir_ptr = 0;
339 }
340 }
341
342 /* update predictor */
343 *dc_val_ptr = &dc_val[0];
345 }
346