blob: 35d1330c9081b65ca508f15840075abeed92c570 [file] [log] [blame]
Fabrice Bellardde6d9b62001-07-22 14:18:561/*
2 * MSMPEG4 backend for ffmpeg encoder and decoder
Fabrice Bellardff4ec492002-05-25 22:45:333 * Copyright (c) 2001 Fabrice Bellard.
Michael Niedermayer8f2ab832004-01-10 16:04:554 * Copyright (c) 2002-2004 Michael Niedermayer <[email protected]>
Fabrice Bellardde6d9b62001-07-22 14:18:565 *
Diego Biurrunb78e7192006-10-07 15:30:466 * This file is part of FFmpeg.
7 *
8 * FFmpeg is free software; you can redistribute it and/or
Fabrice Bellardff4ec492002-05-25 22:45:339 * modify it under the terms of the GNU Lesser General Public
10 * License as published by the Free Software Foundation; either
Diego Biurrunb78e7192006-10-07 15:30:4611 * version 2.1 of the License, or (at your option) any later version.
Fabrice Bellardde6d9b62001-07-22 14:18:5612 *
Diego Biurrunb78e7192006-10-07 15:30:4613 * FFmpeg is distributed in the hope that it will be useful,
Fabrice Bellardde6d9b62001-07-22 14:18:5614 * but WITHOUT ANY WARRANTY; without even the implied warranty of
Fabrice Bellardff4ec492002-05-25 22:45:3315 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
16 * Lesser General Public License for more details.
Fabrice Bellardde6d9b62001-07-22 14:18:5617 *
Fabrice Bellardff4ec492002-05-25 22:45:3318 * You should have received a copy of the GNU Lesser General Public
Diego Biurrunb78e7192006-10-07 15:30:4619 * License along with FFmpeg; if not, write to the Free Software
Diego Biurrun5509bff2006-01-12 22:43:2620 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
Michael Niedermayer92ba5ff2002-05-21 23:13:5721 *
Michael Niedermayer287229e2002-06-02 12:22:3022 * msmpeg4v1 & v2 stuff by Michael Niedermayer <[email protected]>
Fabrice Bellardde6d9b62001-07-22 14:18:5623 */
Michael Niedermayer983e3242003-03-06 11:32:0424
25/**
26 * @file msmpeg4.c
27 * MSMPEG4 backend for ffmpeg encoder and decoder.
28 */
29
Fabrice Bellard6000abf2002-05-18 23:03:2930#include "avcodec.h"
Fabrice Bellardde6d9b62001-07-22 14:18:5631#include "dsputil.h"
32#include "mpegvideo.h"
Michael Niedermayer92ba5ff2002-05-21 23:13:5733
Fabrice Bellardde6d9b62001-07-22 14:18:5634/*
Diego Biurrun115329f2005-12-17 18:14:3835 * You can also call this codec : MPEG4 with a twist !
Fabrice Bellardde6d9b62001-07-22 14:18:5636 *
Diego Biurrun115329f2005-12-17 18:14:3837 * TODO:
Fabrice Bellardde6d9b62001-07-22 14:18:5638 * - (encoding) select best mv table (two choices)
Diego Biurrun115329f2005-12-17 18:14:3839 * - (encoding) select best vlc/dc table
Fabrice Bellardde6d9b62001-07-22 14:18:5640 */
41//#define DEBUG
42
Michael Niedermayer08dce7b2002-07-10 20:05:4243#define DC_VLC_BITS 9
44#define CBPY_VLC_BITS 6
45#define INTER_INTRA_VLC_BITS 3
46#define V1_INTRA_CBPC_VLC_BITS 6
47#define V1_INTER_CBPC_VLC_BITS 6
48#define V2_INTRA_CBPC_VLC_BITS 3
49#define V2_MB_TYPE_VLC_BITS 7
50#define MV_VLC_BITS 9
51#define V2_MV_VLC_BITS 9
52#define TEX_VLC_BITS 9
53#define MB_NON_INTRA_VLC_BITS 9
54#define MB_INTRA_VLC_BITS 9
55
Michael Niedermayer05174fd2002-07-22 08:15:2756#define II_BITRATE 128*1024
57#define MBAC_BITRATE 50*1024
58
Michael Niedermayer1457ab52002-12-27 23:51:4659#define DEFAULT_INTER_INDEX 3
60
Zdenek Kabelac0c1a9ed2003-02-11 16:35:4861static uint32_t v2_dc_lum_table[512][2];
62static uint32_t v2_dc_chroma_table[512][2];
Michael Niedermayer84afee32002-04-05 04:09:0463
Michael Niedermayerf5957f32002-06-18 00:49:0064static inline void msmpeg4_encode_block(MpegEncContext * s, DCTELEM * block, int n);
65static inline int msmpeg4_decode_block(MpegEncContext * s, DCTELEM * block,
Michael Niedermayer1457ab52002-12-27 23:51:4666 int n, int coded, const uint8_t *scantable);
Fabrice Bellardde6d9b62001-07-22 14:18:5667static int msmpeg4_decode_dc(MpegEncContext * s, int n, int *dir_ptr);
Diego Biurrun115329f2005-12-17 18:14:3868static int msmpeg4_decode_motion(MpegEncContext * s,
Fabrice Bellardde6d9b62001-07-22 14:18:5669 int *mx_ptr, int *my_ptr);
Falk Hüffner20695ec2002-06-03 11:16:1170static void init_h263_dc_for_msmpeg4(void);
Michael Niedermayerde0f2f42002-07-07 08:34:4671static inline void msmpeg4_memsetw(short *tab, int val, int n);
Wolfgang Hesseler76042462003-02-16 23:05:3872#ifdef CONFIG_ENCODERS
Måns Rullgård62bb4892006-09-27 19:54:0773static void msmpeg4v2_encode_motion(MpegEncContext * s, int val);
Michael Niedermayer62959862002-08-09 00:13:5474static int get_size_of_code(MpegEncContext * s, RLTable *rl, int last, int run, int level, int intra);
Wolfgang Hesseler76042462003-02-16 23:05:3875#endif //CONFIG_ENCODERS
Michael Niedermayer4d2858d2002-10-13 13:16:0476static int msmpeg4v12_decode_mb(MpegEncContext *s, DCTELEM block[6][64]);
77static int msmpeg4v34_decode_mb(MpegEncContext *s, DCTELEM block[6][64]);
Michael Niedermayer1457ab52002-12-27 23:51:4678static int wmv2_decode_mb(MpegEncContext *s, DCTELEM block[6][64]);
Fabrice Bellardde6d9b62001-07-22 14:18:5679
Kostya Shishkov10b9c372006-06-27 02:55:5480/* vc1 externs */
anonymous0d33db82005-01-30 16:34:5781extern uint8_t wmv3_dc_scale_table[32];
Michael Niedermayer62959862002-08-09 00:13:5482
Fabrice Bellardde6d9b62001-07-22 14:18:5683#ifdef DEBUG
84int intra_count = 0;
85int frame_count = 0;
86#endif
Fabrice Bellardde6d9b62001-07-22 14:18:5687
88#include "msmpeg4data.h"
Aurelien Jacobs42ef2db2007-05-10 10:03:1689#include "msmpeg4tab.h"
Fabrice Bellardde6d9b62001-07-22 14:18:5690
Michael Niedermayer2a250222003-06-22 11:08:2291#ifdef CONFIG_ENCODERS //strangely gcc includes this even if its not references
Zdenek Kabelac0c1a9ed2003-02-11 16:35:4892static uint8_t rl_length[NB_RL_TABLES][MAX_LEVEL+1][MAX_RUN+1][2];
Michael Niedermayer2a250222003-06-22 11:08:2293#endif //CONFIG_ENCODERS
Michael Niedermayer62959862002-08-09 00:13:5494
Michael Niedermayer3502a542007-03-14 13:19:1995static uint8_t static_rl_table_store[NB_RL_TABLES][2][2*MAX_RUN + MAX_LEVEL + 3];
96
Michael Niedermayerf5957f32002-06-18 00:49:0097static void common_init(MpegEncContext * s)
98{
99 static int inited=0;
Diego Biurrun115329f2005-12-17 18:14:38100
Michael Niedermayerf5957f32002-06-18 00:49:00101 switch(s->msmpeg4_version){
102 case 1:
103 case 2:
104 s->y_dc_scale_table=
105 s->c_dc_scale_table= ff_mpeg1_dc_scale_table;
106 break;
107 case 3:
108 if(s->workaround_bugs){
109 s->y_dc_scale_table= old_ff_y_dc_scale_table;
110 s->c_dc_scale_table= old_ff_c_dc_scale_table;
111 } else{
112 s->y_dc_scale_table= ff_mpeg4_y_dc_scale_table;
113 s->c_dc_scale_table= ff_mpeg4_c_dc_scale_table;
114 }
115 break;
116 case 4:
Michael Niedermayer1457ab52002-12-27 23:51:46117 case 5:
Michael Niedermayerf5957f32002-06-18 00:49:00118 s->y_dc_scale_table= wmv1_y_dc_scale_table;
119 s->c_dc_scale_table= wmv1_c_dc_scale_table;
120 break;
Kostya Shishkov10b9c372006-06-27 02:55:54121#if defined(CONFIG_WMV3_DECODER)||defined(CONFIG_VC1_DECODER)
anonymous0d33db82005-01-30 16:34:57122 case 6:
123 s->y_dc_scale_table= wmv3_dc_scale_table;
124 s->c_dc_scale_table= wmv3_dc_scale_table;
125 break;
Michael Niedermayer8b975b72005-05-02 22:14:42126#endif
anonymous0d33db82005-01-30 16:34:57127
Michael Niedermayerf5957f32002-06-18 00:49:00128 }
129
Diego Biurrun115329f2005-12-17 18:14:38130
Michael Niedermayer1457ab52002-12-27 23:51:46131 if(s->msmpeg4_version>=4){
Michael Niedermayer3d2e8cc2003-05-19 13:30:59132 ff_init_scantable(s->dsp.idct_permutation, &s->intra_scantable , wmv1_scantable[1]);
133 ff_init_scantable(s->dsp.idct_permutation, &s->intra_h_scantable, wmv1_scantable[2]);
134 ff_init_scantable(s->dsp.idct_permutation, &s->intra_v_scantable, wmv1_scantable[3]);
135 ff_init_scantable(s->dsp.idct_permutation, &s->inter_scantable , wmv1_scantable[0]);
Michael Niedermayerf5957f32002-06-18 00:49:00136 }
Michael Niedermayer2ad15162002-09-29 22:44:22137 //Note the default tables are set in common_init in mpegvideo.c
Diego Biurrun115329f2005-12-17 18:14:38138
Michael Niedermayerf5957f32002-06-18 00:49:00139 if(!inited){
Michael Niedermayerf5957f32002-06-18 00:49:00140 inited=1;
141
142 init_h263_dc_for_msmpeg4();
Michael Niedermayerf5957f32002-06-18 00:49:00143 }
144}
145
Wolfgang Hesseler76042462003-02-16 23:05:38146#ifdef CONFIG_ENCODERS
147
Fabrice Bellardde6d9b62001-07-22 14:18:56148/* build the table which associate a (x,y) motion vector to a vlc */
149static void init_mv_table(MVTable *tab)
150{
151 int i, x, y;
152
Zdenek Kabelac0c1a9ed2003-02-11 16:35:48153 tab->table_mv_index = av_malloc(sizeof(uint16_t) * 4096);
Fabrice Bellardde6d9b62001-07-22 14:18:56154 /* mark all entries as not used */
155 for(i=0;i<4096;i++)
156 tab->table_mv_index[i] = tab->n;
Diego Biurrun115329f2005-12-17 18:14:38157
Fabrice Bellardde6d9b62001-07-22 14:18:56158 for(i=0;i<tab->n;i++) {
159 x = tab->table_mvx[i];
160 y = tab->table_mvy[i];
161 tab->table_mv_index[(x << 6) | y] = i;
162 }
163}
164
Denis Fortinf0edfda2007-06-05 07:18:29165void ff_code012(PutBitContext *pb, int n)
Fabrice Bellardde6d9b62001-07-22 14:18:56166{
167 if (n == 0) {
168 put_bits(pb, 1, 0);
169 } else {
170 put_bits(pb, 1, 1);
171 put_bits(pb, 1, (n >= 2));
172 }
173}
174
Michael Niedermayerf5957f32002-06-18 00:49:00175void ff_msmpeg4_encode_init(MpegEncContext *s)
176{
177 static int init_done=0;
178 int i;
179
180 common_init(s);
181 if(s->msmpeg4_version>=4){
182 s->min_qcoeff= -255;
183 s->max_qcoeff= 255;
184 }
185
186 if (!init_done) {
187 /* init various encoding tables */
188 init_done = 1;
189 init_mv_table(&mv_tables[0]);
190 init_mv_table(&mv_tables[1]);
191 for(i=0;i<NB_RL_TABLES;i++)
Michael Niedermayer3502a542007-03-14 13:19:19192 init_rl(&rl_table[i], static_rl_table_store[i]);
Michael Niedermayer62959862002-08-09 00:13:54193
194 for(i=0; i<NB_RL_TABLES; i++){
195 int level;
196 for(level=0; level<=MAX_LEVEL; level++){
197 int run;
198 for(run=0; run<=MAX_RUN; run++){
199 int last;
200 for(last=0; last<2; last++){
Michael Niedermayer060f89b2002-10-27 12:20:58201 rl_length[i][level][run][last]= get_size_of_code(s, &rl_table[ i], last, run, level, 0);
Michael Niedermayer62959862002-08-09 00:13:54202 }
203 }
204 }
205 }
Michael Niedermayerf5957f32002-06-18 00:49:00206 }
207}
208
209static int get_size_of_code(MpegEncContext * s, RLTable *rl, int last, int run, int level, int intra){
210 int size=0;
211 int code;
212 int run_diff= intra ? 0 : 1;
Diego Biurrun115329f2005-12-17 18:14:38213
Michael Niedermayerf5957f32002-06-18 00:49:00214 code = get_rl_index(rl, last, run, level);
215 size+= rl->table_vlc[code][1];
216 if (code == rl->n) {
217 int level1, run1;
218
219 level1 = level - rl->max_level[last][run];
Diego Biurrun115329f2005-12-17 18:14:38220 if (level1 < 1)
Michael Niedermayerf5957f32002-06-18 00:49:00221 goto esc2;
222 code = get_rl_index(rl, last, run, level1);
223 if (code == rl->n) {
224 esc2:
225 size++;
226 if (level > MAX_LEVEL)
227 goto esc3;
228 run1 = run - rl->max_run[last][level] - run_diff;
229 if (run1 < 0)
230 goto esc3;
231 code = get_rl_index(rl, last, run1, level);
232 if (code == rl->n) {
233 esc3:
234 /* third escape */
235 size+=1+1+6+8;
236 } else {
237 /* second escape */
238 size+= 1+1+ rl->table_vlc[code][1];
239 }
240 } else {
241 /* first escape */
242 size+= 1+1+ rl->table_vlc[code][1];
243 }
244 } else {
245 size++;
246 }
247 return size;
248}
249
250static void find_best_tables(MpegEncContext * s)
251{
252 int i;
253 int best =-1, best_size =9999999;
254 int chroma_best=-1, best_chroma_size=9999999;
Michael Niedermayer62959862002-08-09 00:13:54255
Michael Niedermayerf5957f32002-06-18 00:49:00256 for(i=0; i<3; i++){
257 int level;
258 int chroma_size=0;
259 int size=0;
260
261 if(i>0){// ;)
Diego Biurrun115329f2005-12-17 18:14:38262 size++;
Michael Niedermayerf5957f32002-06-18 00:49:00263 chroma_size++;
264 }
265 for(level=0; level<=MAX_LEVEL; level++){
266 int run;
267 for(run=0; run<=MAX_RUN; run++){
268 int last;
Michael Niedermayer62959862002-08-09 00:13:54269 const int last_size= size + chroma_size;
Michael Niedermayerf5957f32002-06-18 00:49:00270 for(last=0; last<2; last++){
271 int inter_count = s->ac_stats[0][0][level][run][last] + s->ac_stats[0][1][level][run][last];
272 int intra_luma_count = s->ac_stats[1][0][level][run][last];
273 int intra_chroma_count= s->ac_stats[1][1][level][run][last];
Diego Biurrun115329f2005-12-17 18:14:38274
Michael Niedermayerf5957f32002-06-18 00:49:00275 if(s->pict_type==I_TYPE){
Michael Niedermayer060f89b2002-10-27 12:20:58276 size += intra_luma_count *rl_length[i ][level][run][last];
277 chroma_size+= intra_chroma_count*rl_length[i+3][level][run][last];
Michael Niedermayerf5957f32002-06-18 00:49:00278 }else{
Michael Niedermayer060f89b2002-10-27 12:20:58279 size+= intra_luma_count *rl_length[i ][level][run][last]
280 +intra_chroma_count*rl_length[i+3][level][run][last]
281 +inter_count *rl_length[i+3][level][run][last];
Diego Biurrun115329f2005-12-17 18:14:38282 }
Michael Niedermayerf5957f32002-06-18 00:49:00283 }
Michael Niedermayer62959862002-08-09 00:13:54284 if(last_size == size+chroma_size) break;
Michael Niedermayerf5957f32002-06-18 00:49:00285 }
286 }
287 if(size<best_size){
288 best_size= size;
289 best= i;
290 }
291 if(chroma_size<best_chroma_size){
292 best_chroma_size= chroma_size;
293 chroma_best= i;
294 }
295 }
Michael Niedermayer62959862002-08-09 00:13:54296
Diego Biurrun115329f2005-12-17 18:14:38297// printf("type:%d, best:%d, qp:%d, var:%d, mcvar:%d, size:%d //\n",
Michael Niedermayerf5957f32002-06-18 00:49:00298// s->pict_type, best, s->qscale, s->mb_var_sum, s->mc_mb_var_sum, best_size);
Diego Biurrun115329f2005-12-17 18:14:38299
Michael Niedermayerf5957f32002-06-18 00:49:00300 if(s->pict_type==P_TYPE) chroma_best= best;
301
302 memset(s->ac_stats, 0, sizeof(int)*(MAX_LEVEL+1)*(MAX_RUN+1)*2*2*2);
303
304 s->rl_table_index = best;
305 s->rl_chroma_table_index= chroma_best;
Diego Biurrun115329f2005-12-17 18:14:38306
Michael Niedermayerf5957f32002-06-18 00:49:00307 if(s->pict_type != s->last_non_b_pict_type){
308 s->rl_table_index= 2;
309 if(s->pict_type==I_TYPE)
310 s->rl_chroma_table_index= 1;
311 else
312 s->rl_chroma_table_index= 2;
313 }
314
315}
316
Michael Niedermayer287229e2002-06-02 12:22:30317/* write MSMPEG4 compatible frame header */
Fabrice Bellardde6d9b62001-07-22 14:18:56318void msmpeg4_encode_picture_header(MpegEncContext * s, int picture_number)
319{
Michael Niedermayerf5957f32002-06-18 00:49:00320 find_best_tables(s);
Fabrice Bellardde6d9b62001-07-22 14:18:56321
322 align_put_bits(&s->pb);
Fabrice Bellardde6d9b62001-07-22 14:18:56323 put_bits(&s->pb, 2, s->pict_type - 1);
324
325 put_bits(&s->pb, 5, s->qscale);
Michael Niedermayerf5957f32002-06-18 00:49:00326 if(s->msmpeg4_version<=2){
327 s->rl_table_index = 2;
328 s->rl_chroma_table_index = 2;
329 }
Michael Niedermayer3825cd12002-04-05 21:04:09330
Fabrice Bellardde6d9b62001-07-22 14:18:56331 s->dc_table_index = 1;
332 s->mv_table_index = 1; /* only if P frame */
333 s->use_skip_mb_code = 1; /* only if P frame */
Michael Niedermayerf5957f32002-06-18 00:49:00334 s->per_mb_rl_table = 0;
Michael Niedermayerfc48cba2002-10-20 17:02:41335 if(s->msmpeg4_version==4)
336 s->inter_intra_pred= (s->width*s->height < 320*240 && s->bit_rate<=II_BITRATE && s->pict_type==P_TYPE);
Michael Niedermayer1457ab52002-12-27 23:51:46337//printf("%d %d %d %d %d\n", s->pict_type, s->bit_rate, s->inter_intra_pred, s->width, s->height);
Michael Niedermayerf5957f32002-06-18 00:49:00338
Fabrice Bellardde6d9b62001-07-22 14:18:56339 if (s->pict_type == I_TYPE) {
Michael Niedermayerde0f2f42002-07-07 08:34:46340 s->slice_height= s->mb_height/1;
341 put_bits(&s->pb, 5, 0x16 + s->mb_height/s->slice_height);
Diego Biurrun115329f2005-12-17 18:14:38342
Michael Niedermayerf5957f32002-06-18 00:49:00343 if(s->msmpeg4_version==4){
344 msmpeg4_encode_ext_header(s);
Michael Niedermayer05174fd2002-07-22 08:15:27345 if(s->bit_rate>MBAC_BITRATE)
Michael Niedermayerde0f2f42002-07-07 08:34:46346 put_bits(&s->pb, 1, s->per_mb_rl_table);
Michael Niedermayerf5957f32002-06-18 00:49:00347 }
Fabrice Bellardde6d9b62001-07-22 14:18:56348
Michael Niedermayer287229e2002-06-02 12:22:30349 if(s->msmpeg4_version>2){
Michael Niedermayerf5957f32002-06-18 00:49:00350 if(!s->per_mb_rl_table){
Denis Fortinf0edfda2007-06-05 07:18:29351 ff_code012(&s->pb, s->rl_chroma_table_index);
352 ff_code012(&s->pb, s->rl_table_index);
Michael Niedermayerf5957f32002-06-18 00:49:00353 }
Fabrice Bellardde6d9b62001-07-22 14:18:56354
Michael Niedermayer3825cd12002-04-05 21:04:09355 put_bits(&s->pb, 1, s->dc_table_index);
356 }
Fabrice Bellardde6d9b62001-07-22 14:18:56357 } else {
358 put_bits(&s->pb, 1, s->use_skip_mb_code);
Diego Biurrun115329f2005-12-17 18:14:38359
Michael Niedermayer05174fd2002-07-22 08:15:27360 if(s->msmpeg4_version==4 && s->bit_rate>MBAC_BITRATE)
Michael Niedermayerf5957f32002-06-18 00:49:00361 put_bits(&s->pb, 1, s->per_mb_rl_table);
362
Michael Niedermayer287229e2002-06-02 12:22:30363 if(s->msmpeg4_version>2){
Michael Niedermayerf5957f32002-06-18 00:49:00364 if(!s->per_mb_rl_table)
Denis Fortinf0edfda2007-06-05 07:18:29365 ff_code012(&s->pb, s->rl_table_index);
Fabrice Bellardde6d9b62001-07-22 14:18:56366
Michael Niedermayer3825cd12002-04-05 21:04:09367 put_bits(&s->pb, 1, s->dc_table_index);
Fabrice Bellardde6d9b62001-07-22 14:18:56368
Michael Niedermayer3825cd12002-04-05 21:04:09369 put_bits(&s->pb, 1, s->mv_table_index);
370 }
Fabrice Bellardde6d9b62001-07-22 14:18:56371 }
372
Michael Niedermayerf5957f32002-06-18 00:49:00373 s->esc3_level_length= 0;
374 s->esc3_run_length= 0;
Fabrice Bellardde6d9b62001-07-22 14:18:56375
376#ifdef DEBUG
377 intra_count = 0;
Steve L'Homme267f7ed2006-03-08 11:43:10378 av_log(s->avctx, AV_LOG_DEBUG, "*****frame %d:\n", frame_count++);
Fabrice Bellardde6d9b62001-07-22 14:18:56379#endif
380}
381
Michael Niedermayerae404842002-01-15 22:22:41382void msmpeg4_encode_ext_header(MpegEncContext * s)
383{
Michael Niedermayerc0df9d72005-04-30 21:43:59384 put_bits(&s->pb, 5, s->avctx->time_base.den / s->avctx->time_base.num); //yes 29.97 -> 29
Michael Niedermayerae404842002-01-15 22:22:41385
Michael Niedermayerb8a78f42002-11-10 11:46:59386 put_bits(&s->pb, 11, FFMIN(s->bit_rate/1024, 2047));
Michael Niedermayerae404842002-01-15 22:22:41387
Michael Niedermayer1f9aea92003-04-01 15:38:01388 if(s->msmpeg4_version>=3)
Michael Niedermayer287229e2002-06-02 12:22:30389 put_bits(&s->pb, 1, s->flipflop_rounding);
Michael Niedermayer1f9aea92003-04-01 15:38:01390 else
391 assert(s->flipflop_rounding==0);
Michael Niedermayerae404842002-01-15 22:22:41392}
393
Wolfgang Hesseler76042462003-02-16 23:05:38394#endif //CONFIG_ENCODERS
395
Fabrice Bellardde6d9b62001-07-22 14:18:56396/* predict coded block */
Zdenek Kabelac0c1a9ed2003-02-11 16:35:48397static inline int coded_block_pred(MpegEncContext * s, int n, uint8_t **coded_block_ptr)
Fabrice Bellardde6d9b62001-07-22 14:18:56398{
Michael Niedermayerdbbe8992002-03-29 01:53:59399 int xy, wrap, pred, a, b, c;
Fabrice Bellardde6d9b62001-07-22 14:18:56400
Michael Niedermayerdbbe8992002-03-29 01:53:59401 xy = s->block_index[n];
Michael Niedermayer137c8462004-04-16 01:01:45402 wrap = s->b8_stride;
Fabrice Bellardde6d9b62001-07-22 14:18:56403
404 /* B C
Diego Biurrun115329f2005-12-17 18:14:38405 * A X
Fabrice Bellardde6d9b62001-07-22 14:18:56406 */
Michael Niedermayerdbbe8992002-03-29 01:53:59407 a = s->coded_block[xy - 1 ];
408 b = s->coded_block[xy - 1 - wrap];
409 c = s->coded_block[xy - wrap];
Diego Biurrun115329f2005-12-17 18:14:38410
Fabrice Bellardde6d9b62001-07-22 14:18:56411 if (b == c) {
412 pred = a;
413 } else {
414 pred = c;
415 }
Diego Biurrun115329f2005-12-17 18:14:38416
Fabrice Bellardde6d9b62001-07-22 14:18:56417 /* store value */
Michael Niedermayerdbbe8992002-03-29 01:53:59418 *coded_block_ptr = &s->coded_block[xy];
Fabrice Bellardde6d9b62001-07-22 14:18:56419
420 return pred;
421}
422
Wolfgang Hesseler76042462003-02-16 23:05:38423#ifdef CONFIG_ENCODERS
424
Diego Biurrun115329f2005-12-17 18:14:38425static void msmpeg4_encode_motion(MpegEncContext * s,
Fabrice Bellardde6d9b62001-07-22 14:18:56426 int mx, int my)
427{
428 int code;
429 MVTable *mv;
430
431 /* modulo encoding */
432 /* WARNING : you cannot reach all the MVs even with the modulo
433 encoding. This is a somewhat strange compromise they took !!! */
434 if (mx <= -64)
435 mx += 64;
436 else if (mx >= 64)
437 mx -= 64;
438 if (my <= -64)
439 my += 64;
440 else if (my >= 64)
441 my -= 64;
Diego Biurrun115329f2005-12-17 18:14:38442
Fabrice Bellardde6d9b62001-07-22 14:18:56443 mx += 32;
444 my += 32;
445#if 0
446 if ((unsigned)mx >= 64 ||
Diego Biurrun115329f2005-12-17 18:14:38447 (unsigned)my >= 64)
Steve L'Homme267f7ed2006-03-08 11:43:10448 av_log(s->avctx, AV_LOG_ERROR, "error mx=%d my=%d\n", mx, my);
Fabrice Bellardde6d9b62001-07-22 14:18:56449#endif
450 mv = &mv_tables[s->mv_table_index];
451
452 code = mv->table_mv_index[(mx << 6) | my];
Diego Biurrun115329f2005-12-17 18:14:38453 put_bits(&s->pb,
454 mv->table_mv_bits[code],
Fabrice Bellardde6d9b62001-07-22 14:18:56455 mv->table_mv_code[code]);
456 if (code == mv->n) {
457 /* escape : code litterally */
458 put_bits(&s->pb, 6, mx);
459 put_bits(&s->pb, 6, my);
460 }
461}
462
Michael Niedermayerde0f2f42002-07-07 08:34:46463static inline void handle_slices(MpegEncContext *s){
464 if (s->mb_x == 0) {
465 if (s->slice_height && (s->mb_y % s->slice_height) == 0) {
Michael Niedermayer28269842003-01-09 11:37:08466 if(s->msmpeg4_version < 4){
Michael Niedermayer4d2858d2002-10-13 13:16:04467 ff_mpeg4_clean_buffers(s);
Michael Niedermayerde0f2f42002-07-07 08:34:46468 }
469 s->first_slice_line = 1;
470 } else {
Diego Biurrun115329f2005-12-17 18:14:38471 s->first_slice_line = 0;
Michael Niedermayerde0f2f42002-07-07 08:34:46472 }
473 }
474}
475
Diego Biurrun115329f2005-12-17 18:14:38476void msmpeg4_encode_mb(MpegEncContext * s,
Fabrice Bellardde6d9b62001-07-22 14:18:56477 DCTELEM block[6][64],
478 int motion_x, int motion_y)
479{
480 int cbp, coded_cbp, i;
481 int pred_x, pred_y;
Zdenek Kabelac0c1a9ed2003-02-11 16:35:48482 uint8_t *coded_block;
Fabrice Bellardde6d9b62001-07-22 14:18:56483
Michael Niedermayerde0f2f42002-07-07 08:34:46484 handle_slices(s);
Diego Biurrun115329f2005-12-17 18:14:38485
Fabrice Bellardde6d9b62001-07-22 14:18:56486 if (!s->mb_intra) {
Diego Biurrunbb270c02005-12-22 01:10:11487 /* compute cbp */
Diego Biurrunbb270c02005-12-22 01:10:11488 cbp = 0;
489 for (i = 0; i < 6; i++) {
490 if (s->block_last_index[i] >= 0)
491 cbp |= 1 << (5 - i);
492 }
493 if (s->use_skip_mb_code && (cbp | motion_x | motion_y) == 0) {
494 /* skip macroblock */
495 put_bits(&s->pb, 1, 1);
Michael Niedermayer4d2a4832003-04-02 09:57:34496 s->last_bits++;
Diego Biurrunbb270c02005-12-22 01:10:11497 s->misc_bits++;
Michael Niedermayera0c83172003-04-25 19:46:00498 s->skip_count++;
Michael Niedermayer4d2a4832003-04-02 09:57:34499
Diego Biurrunbb270c02005-12-22 01:10:11500 return;
501 }
Fabrice Bellardde6d9b62001-07-22 14:18:56502 if (s->use_skip_mb_code)
Diego Biurrunbb270c02005-12-22 01:10:11503 put_bits(&s->pb, 1, 0); /* mb coded */
Diego Biurrun115329f2005-12-17 18:14:38504
Michael Niedermayer287229e2002-06-02 12:22:30505 if(s->msmpeg4_version<=2){
Diego Biurrun115329f2005-12-17 18:14:38506 put_bits(&s->pb,
507 v2_mb_type[cbp&3][1],
Michael Niedermayer3825cd12002-04-05 21:04:09508 v2_mb_type[cbp&3][0]);
509 if((cbp&3) != 3) coded_cbp= cbp ^ 0x3C;
510 else coded_cbp= cbp;
Fabrice Bellardde6d9b62001-07-22 14:18:56511
Diego Biurrun115329f2005-12-17 18:14:38512 put_bits(&s->pb,
513 cbpy_tab[coded_cbp>>2][1],
Michael Niedermayer3825cd12002-04-05 21:04:09514 cbpy_tab[coded_cbp>>2][0]);
Michael Niedermayer4d2a4832003-04-02 09:57:34515
516 s->misc_bits += get_bits_diff(s);
517
Michael Niedermayer137c8462004-04-16 01:01:45518 h263_pred_motion(s, 0, 0, &pred_x, &pred_y);
Michael Niedermayer3825cd12002-04-05 21:04:09519 msmpeg4v2_encode_motion(s, motion_x - pred_x);
520 msmpeg4v2_encode_motion(s, motion_y - pred_y);
521 }else{
Diego Biurrun115329f2005-12-17 18:14:38522 put_bits(&s->pb,
523 table_mb_non_intra[cbp + 64][1],
Michael Niedermayer3825cd12002-04-05 21:04:09524 table_mb_non_intra[cbp + 64][0]);
525
Michael Niedermayer4d2a4832003-04-02 09:57:34526 s->misc_bits += get_bits_diff(s);
527
Michael Niedermayer3825cd12002-04-05 21:04:09528 /* motion vector */
Michael Niedermayer137c8462004-04-16 01:01:45529 h263_pred_motion(s, 0, 0, &pred_x, &pred_y);
Diego Biurrun115329f2005-12-17 18:14:38530 msmpeg4_encode_motion(s, motion_x - pred_x,
Michael Niedermayer3825cd12002-04-05 21:04:09531 motion_y - pred_y);
532 }
Michael Niedermayer4d2a4832003-04-02 09:57:34533
534 s->mv_bits += get_bits_diff(s);
535
536 for (i = 0; i < 6; i++) {
537 msmpeg4_encode_block(s, block[i], i);
538 }
539 s->p_tex_bits += get_bits_diff(s);
Fabrice Bellardde6d9b62001-07-22 14:18:56540 } else {
Diego Biurrunbb270c02005-12-22 01:10:11541 /* compute cbp */
542 cbp = 0;
Fabrice Bellardde6d9b62001-07-22 14:18:56543 coded_cbp = 0;
Diego Biurrunbb270c02005-12-22 01:10:11544 for (i = 0; i < 6; i++) {
Fabrice Bellardde6d9b62001-07-22 14:18:56545 int val, pred;
546 val = (s->block_last_index[i] >= 1);
547 cbp |= val << (5 - i);
548 if (i < 4) {
549 /* predict value for close blocks only for luma */
550 pred = coded_block_pred(s, i, &coded_block);
551 *coded_block = val;
552 val = val ^ pred;
553 }
554 coded_cbp |= val << (5 - i);
Diego Biurrunbb270c02005-12-22 01:10:11555 }
Fabrice Bellardde6d9b62001-07-22 14:18:56556#if 0
557 if (coded_cbp)
558 printf("cbp=%x %x\n", cbp, coded_cbp);
559#endif
560
Michael Niedermayer287229e2002-06-02 12:22:30561 if(s->msmpeg4_version<=2){
Michael Niedermayer3825cd12002-04-05 21:04:09562 if (s->pict_type == I_TYPE) {
Diego Biurrun115329f2005-12-17 18:14:38563 put_bits(&s->pb,
Michael Niedermayer3825cd12002-04-05 21:04:09564 v2_intra_cbpc[cbp&3][1], v2_intra_cbpc[cbp&3][0]);
565 } else {
566 if (s->use_skip_mb_code)
Diego Biurrunbb270c02005-12-22 01:10:11567 put_bits(&s->pb, 1, 0); /* mb coded */
Diego Biurrun115329f2005-12-17 18:14:38568 put_bits(&s->pb,
569 v2_mb_type[(cbp&3) + 4][1],
Michael Niedermayer3825cd12002-04-05 21:04:09570 v2_mb_type[(cbp&3) + 4][0]);
571 }
Diego Biurrunbb270c02005-12-22 01:10:11572 put_bits(&s->pb, 1, 0); /* no AC prediction yet */
Diego Biurrun115329f2005-12-17 18:14:38573 put_bits(&s->pb,
574 cbpy_tab[cbp>>2][1],
Michael Niedermayer3825cd12002-04-05 21:04:09575 cbpy_tab[cbp>>2][0]);
576 }else{
577 if (s->pict_type == I_TYPE) {
Diego Biurrun115329f2005-12-17 18:14:38578 put_bits(&s->pb,
anonymous0d33db82005-01-30 16:34:57579 ff_msmp4_mb_i_table[coded_cbp][1], ff_msmp4_mb_i_table[coded_cbp][0]);
Michael Niedermayer3825cd12002-04-05 21:04:09580 } else {
581 if (s->use_skip_mb_code)
Diego Biurrunbb270c02005-12-22 01:10:11582 put_bits(&s->pb, 1, 0); /* mb coded */
Diego Biurrun115329f2005-12-17 18:14:38583 put_bits(&s->pb,
584 table_mb_non_intra[cbp][1],
Michael Niedermayer3825cd12002-04-05 21:04:09585 table_mb_non_intra[cbp][0]);
586 }
Diego Biurrunbb270c02005-12-22 01:10:11587 put_bits(&s->pb, 1, 0); /* no AC prediction yet */
Michael Niedermayer05174fd2002-07-22 08:15:27588 if(s->inter_intra_pred){
589 s->h263_aic_dir=0;
590 put_bits(&s->pb, table_inter_intra[s->h263_aic_dir][1], table_inter_intra[s->h263_aic_dir][0]);
591 }
Fabrice Bellardde6d9b62001-07-22 14:18:56592 }
Michael Niedermayer4d2a4832003-04-02 09:57:34593 s->misc_bits += get_bits_diff(s);
Fabrice Bellardde6d9b62001-07-22 14:18:56594
Michael Niedermayer4d2a4832003-04-02 09:57:34595 for (i = 0; i < 6; i++) {
596 msmpeg4_encode_block(s, block[i], i);
597 }
598 s->i_tex_bits += get_bits_diff(s);
Michael Niedermayera0c83172003-04-25 19:46:00599 s->i_count++;
Fabrice Bellardde6d9b62001-07-22 14:18:56600 }
601}
602
Wolfgang Hesseler76042462003-02-16 23:05:38603#endif //CONFIG_ENCODERS
604
Diego Biurrun115329f2005-12-17 18:14:38605static inline int msmpeg4v1_pred_dc(MpegEncContext * s, int n,
Zdenek Kabelac0c1a9ed2003-02-11 16:35:48606 int32_t **dc_val_ptr)
Michael Niedermayer287229e2002-06-02 12:22:30607{
608 int i;
609
610 if (n < 4) {
611 i= 0;
612 } else {
613 i= n-3;
614 }
Diego Biurrun115329f2005-12-17 18:14:38615
Michael Niedermayer287229e2002-06-02 12:22:30616 *dc_val_ptr= &s->last_dc[i];
Diego Biurrun115329f2005-12-17 18:14:38617 return s->last_dc[i];
Michael Niedermayer287229e2002-06-02 12:22:30618}
619
Michael Niedermayerde0f2f42002-07-07 08:34:46620static int get_dc(uint8_t *src, int stride, int scale)
621{
622 int y;
623 int sum=0;
624 for(y=0; y<8; y++){
625 int x;
626 for(x=0; x<8; x++){
627 sum+=src[x + y*stride];
628 }
629 }
BEROd4961b32003-05-14 15:12:13630 return FASTDIV((sum + (scale>>1)), scale);
Michael Niedermayerde0f2f42002-07-07 08:34:46631}
632
Fabrice Bellardde6d9b62001-07-22 14:18:56633/* dir = 0: left, dir = 1: top prediction */
Diego Biurrun115329f2005-12-17 18:14:38634static inline int msmpeg4_pred_dc(MpegEncContext * s, int n,
Måns Rullgårdb86216d2006-09-27 22:13:44635 int16_t **dc_val_ptr, int *dir_ptr)
Fabrice Bellardde6d9b62001-07-22 14:18:56636{
Michael Niedermayerdbbe8992002-03-29 01:53:59637 int a, b, c, wrap, pred, scale;
Måns Rullgårdb86216d2006-09-27 22:13:44638 int16_t *dc_val;
Fabrice Bellardde6d9b62001-07-22 14:18:56639
640 /* find prediction */
641 if (n < 4) {
Diego Biurrunbb270c02005-12-22 01:10:11642 scale = s->y_dc_scale;
Fabrice Bellardde6d9b62001-07-22 14:18:56643 } else {
Diego Biurrunbb270c02005-12-22 01:10:11644 scale = s->c_dc_scale;
Fabrice Bellardde6d9b62001-07-22 14:18:56645 }
Diego Biurrun115329f2005-12-17 18:14:38646
Michael Niedermayerdbbe8992002-03-29 01:53:59647 wrap = s->block_wrap[n];
648 dc_val= s->dc_val[0] + s->block_index[n];
Fabrice Bellardde6d9b62001-07-22 14:18:56649
650 /* B C
Diego Biurrun115329f2005-12-17 18:14:38651 * A X
Fabrice Bellardde6d9b62001-07-22 14:18:56652 */
Michael Niedermayerdbbe8992002-03-29 01:53:59653 a = dc_val[ - 1];
654 b = dc_val[ - 1 - wrap];
655 c = dc_val[ - wrap];
Diego Biurrun115329f2005-12-17 18:14:38656
Michael Niedermayer28269842003-01-09 11:37:08657 if(s->first_slice_line && (n&2)==0 && s->msmpeg4_version<4){
Michael Niedermayer4d2858d2002-10-13 13:16:04658 b=c=1024;
659 }
Fabrice Bellardde6d9b62001-07-22 14:18:56660
661 /* XXX: the following solution consumes divisions, but it does not
662 necessitate to modify mpegvideo.c. The problem comes from the
663 fact they decided to store the quantized DC (which would lead
664 to problems if Q could vary !) */
Diego Biurrun3cd52272006-11-01 18:34:40665#if (defined(ARCH_X86)) && !defined PIC
Michael Niedermayer6f903d82002-01-14 04:34:52666 asm volatile(
Diego Biurrunbb270c02005-12-22 01:10:11667 "movl %3, %%eax \n\t"
668 "shrl $1, %%eax \n\t"
669 "addl %%eax, %2 \n\t"
670 "addl %%eax, %1 \n\t"
671 "addl %0, %%eax \n\t"
672 "mull %4 \n\t"
673 "movl %%edx, %0 \n\t"
674 "movl %1, %%eax \n\t"
675 "mull %4 \n\t"
676 "movl %%edx, %1 \n\t"
677 "movl %2, %%eax \n\t"
678 "mull %4 \n\t"
679 "movl %%edx, %2 \n\t"
680 : "+b" (a), "+c" (b), "+D" (c)
Måns Rullgård36cd3062006-11-12 18:49:36681 : "g" (scale), "S" (ff_inverse[scale])
Diego Biurrunbb270c02005-12-22 01:10:11682 : "%eax", "%edx"
Michael Niedermayer6f903d82002-01-14 04:34:52683 );
Zdenek Kabelac320680d2002-01-28 18:06:28684#else
685 /* #elif defined (ARCH_ALPHA) */
Nick Kurshev1e98dff2002-01-20 14:48:02686 /* Divisions are extremely costly on Alpha; optimize the most
Zdenek Kabelac320680d2002-01-28 18:06:28687 common case. But they are costly everywhere...
688 */
Nick Kurshev1e98dff2002-01-20 14:48:02689 if (scale == 8) {
Diego Biurrunbb270c02005-12-22 01:10:11690 a = (a + (8 >> 1)) / 8;
691 b = (b + (8 >> 1)) / 8;
692 c = (c + (8 >> 1)) / 8;
Nick Kurshev1e98dff2002-01-20 14:48:02693 } else {
Diego Biurrunbb270c02005-12-22 01:10:11694 a = FASTDIV((a + (scale >> 1)), scale);
695 b = FASTDIV((b + (scale >> 1)), scale);
696 c = FASTDIV((c + (scale >> 1)), scale);
Nick Kurshev1e98dff2002-01-20 14:48:02697 }
Michael Niedermayer6f903d82002-01-14 04:34:52698#endif
Fabrice Bellardde6d9b62001-07-22 14:18:56699 /* XXX: WARNING: they did not choose the same test as MPEG4. This
700 is very important ! */
Michael Niedermayerbd5e1c72002-06-22 15:52:25701 if(s->msmpeg4_version>3){
Michael Niedermayerde0f2f42002-07-07 08:34:46702 if(s->inter_intra_pred){
703 uint8_t *dest;
704 int wrap;
Diego Biurrun115329f2005-12-17 18:14:38705
Michael Niedermayerde0f2f42002-07-07 08:34:46706 if(n==1){
707 pred=a;
708 *dir_ptr = 0;
709 }else if(n==2){
710 pred=c;
711 *dir_ptr = 1;
712 }else if(n==3){
713 if (abs(a - b) < abs(b - c)) {
714 pred = c;
715 *dir_ptr = 1;
716 } else {
717 pred = a;
718 *dir_ptr = 0;
719 }
720 }else{
721 if(n<4){
722 wrap= s->linesize;
Michael Niedermayer1e491e22002-12-04 10:04:03723 dest= s->current_picture.data[0] + (((n>>1) + 2*s->mb_y) * 8* wrap ) + ((n&1) + 2*s->mb_x) * 8;
Michael Niedermayerde0f2f42002-07-07 08:34:46724 }else{
Michael Niedermayer0fd90452002-07-15 14:15:10725 wrap= s->uvlinesize;
Michael Niedermayer1e491e22002-12-04 10:04:03726 dest= s->current_picture.data[n-3] + (s->mb_y * 8 * wrap) + s->mb_x * 8;
Michael Niedermayerde0f2f42002-07-07 08:34:46727 }
728 if(s->mb_x==0) a= (1024 + (scale>>1))/scale;
729 else a= get_dc(dest-8, wrap, scale*8);
730 if(s->mb_y==0) c= (1024 + (scale>>1))/scale;
731 else c= get_dc(dest-8*wrap, wrap, scale*8);
Diego Biurrun115329f2005-12-17 18:14:38732
Michael Niedermayerde0f2f42002-07-07 08:34:46733 if (s->h263_aic_dir==0) {
734 pred= a;
735 *dir_ptr = 0;
736 }else if (s->h263_aic_dir==1) {
737 if(n==0){
738 pred= c;
739 *dir_ptr = 1;
740 }else{
741 pred= a;
742 *dir_ptr = 0;
743 }
744 }else if (s->h263_aic_dir==2) {
745 if(n==0){
746 pred= a;
747 *dir_ptr = 0;
748 }else{
749 pred= c;
750 *dir_ptr = 1;
751 }
752 } else {
753 pred= c;
754 *dir_ptr = 1;
755 }
756 }
757 }else{
758 if (abs(a - b) < abs(b - c)) {
759 pred = c;
760 *dir_ptr = 1;
761 } else {
762 pred = a;
763 *dir_ptr = 0;
764 }
Michael Niedermayerbd5e1c72002-06-22 15:52:25765 }
766 }else{
767 if (abs(a - b) <= abs(b - c)) {
768 pred = c;
769 *dir_ptr = 1;
770 } else {
771 pred = a;
772 *dir_ptr = 0;
773 }
Fabrice Bellardde6d9b62001-07-22 14:18:56774 }
775
776 /* update predictor */
Michael Niedermayerdbbe8992002-03-29 01:53:59777 *dc_val_ptr = &dc_val[0];
Fabrice Bellardde6d9b62001-07-22 14:18:56778 return pred;
779}
780
781#define DC_MAX 119
782
783static void msmpeg4_encode_dc(MpegEncContext * s, int level, int n, int *dir_ptr)
784{
785 int sign, code;
786 int pred;
Fabrice Bellardde6d9b62001-07-22 14:18:56787
Michael Niedermayer287229e2002-06-02 12:22:30788 if(s->msmpeg4_version==1){
Zdenek Kabelac0c1a9ed2003-02-11 16:35:48789 int32_t *dc_val;
Michael Niedermayer287229e2002-06-02 12:22:30790 pred = msmpeg4v1_pred_dc(s, n, &dc_val);
Diego Biurrun115329f2005-12-17 18:14:38791
Michael Niedermayer287229e2002-06-02 12:22:30792 /* update predictor */
793 *dc_val= level;
794 }else{
Måns Rullgårdb86216d2006-09-27 22:13:44795 int16_t *dc_val;
Michael Niedermayerbd5e1c72002-06-22 15:52:25796 pred = msmpeg4_pred_dc(s, n, &dc_val, dir_ptr);
Fabrice Bellardde6d9b62001-07-22 14:18:56797
Michael Niedermayer287229e2002-06-02 12:22:30798 /* update predictor */
799 if (n < 4) {
800 *dc_val = level * s->y_dc_scale;
801 } else {
802 *dc_val = level * s->c_dc_scale;
803 }
Fabrice Bellardde6d9b62001-07-22 14:18:56804 }
805
806 /* do the prediction */
807 level -= pred;
808
Michael Niedermayer287229e2002-06-02 12:22:30809 if(s->msmpeg4_version<=2){
Michael Niedermayer3825cd12002-04-05 21:04:09810 if (n < 4) {
Diego Biurrun115329f2005-12-17 18:14:38811 put_bits(&s->pb,
Michael Niedermayer3825cd12002-04-05 21:04:09812 v2_dc_lum_table[level+256][1],
813 v2_dc_lum_table[level+256][0]);
814 }else{
Diego Biurrun115329f2005-12-17 18:14:38815 put_bits(&s->pb,
Michael Niedermayer3825cd12002-04-05 21:04:09816 v2_dc_chroma_table[level+256][1],
817 v2_dc_chroma_table[level+256][0]);
818 }
819 }else{
820 sign = 0;
821 if (level < 0) {
822 level = -level;
823 sign = 1;
824 }
825 code = level;
Diego Biurrun115329f2005-12-17 18:14:38826 if (code > DC_MAX)
Michael Niedermayer3825cd12002-04-05 21:04:09827 code = DC_MAX;
Fabrice Bellardde6d9b62001-07-22 14:18:56828
Michael Niedermayer3825cd12002-04-05 21:04:09829 if (s->dc_table_index == 0) {
830 if (n < 4) {
anonymous0c040aa2005-01-26 12:01:35831 put_bits(&s->pb, ff_table0_dc_lum[code][1], ff_table0_dc_lum[code][0]);
Michael Niedermayer3825cd12002-04-05 21:04:09832 } else {
anonymous0c040aa2005-01-26 12:01:35833 put_bits(&s->pb, ff_table0_dc_chroma[code][1], ff_table0_dc_chroma[code][0]);
Michael Niedermayer3825cd12002-04-05 21:04:09834 }
Fabrice Bellardde6d9b62001-07-22 14:18:56835 } else {
Michael Niedermayer3825cd12002-04-05 21:04:09836 if (n < 4) {
anonymous0c040aa2005-01-26 12:01:35837 put_bits(&s->pb, ff_table1_dc_lum[code][1], ff_table1_dc_lum[code][0]);
Michael Niedermayer3825cd12002-04-05 21:04:09838 } else {
anonymous0c040aa2005-01-26 12:01:35839 put_bits(&s->pb, ff_table1_dc_chroma[code][1], ff_table1_dc_chroma[code][0]);
Michael Niedermayer3825cd12002-04-05 21:04:09840 }
Fabrice Bellardde6d9b62001-07-22 14:18:56841 }
Diego Biurrun115329f2005-12-17 18:14:38842
Michael Niedermayer3825cd12002-04-05 21:04:09843 if (code == DC_MAX)
844 put_bits(&s->pb, 8, level);
Diego Biurrun115329f2005-12-17 18:14:38845
Michael Niedermayer3825cd12002-04-05 21:04:09846 if (level != 0) {
847 put_bits(&s->pb, 1, sign);
Fabrice Bellardde6d9b62001-07-22 14:18:56848 }
849 }
Fabrice Bellardde6d9b62001-07-22 14:18:56850}
851
852/* Encoding of a block. Very similar to MPEG4 except for a different
853 escape coding (same as H263) and more vlc tables.
854 */
Michael Niedermayerf5957f32002-06-18 00:49:00855static inline void msmpeg4_encode_block(MpegEncContext * s, DCTELEM * block, int n)
Fabrice Bellardde6d9b62001-07-22 14:18:56856{
857 int level, run, last, i, j, last_index;
858 int last_non_zero, sign, slevel;
859 int code, run_diff, dc_pred_dir;
860 const RLTable *rl;
Zdenek Kabelac0c1a9ed2003-02-11 16:35:48861 const uint8_t *scantable;
Fabrice Bellardde6d9b62001-07-22 14:18:56862
863 if (s->mb_intra) {
Fabrice Bellardde6d9b62001-07-22 14:18:56864 msmpeg4_encode_dc(s, block[0], n, &dc_pred_dir);
865 i = 1;
866 if (n < 4) {
867 rl = &rl_table[s->rl_table_index];
868 } else {
869 rl = &rl_table[3 + s->rl_chroma_table_index];
870 }
871 run_diff = 0;
Michael Niedermayer2ad15162002-09-29 22:44:22872 scantable= s->intra_scantable.permutated;
Fabrice Bellardde6d9b62001-07-22 14:18:56873 } else {
874 i = 0;
875 rl = &rl_table[3 + s->rl_table_index];
Michael Niedermayer287229e2002-06-02 12:22:30876 if(s->msmpeg4_version<=2)
Michael Niedermayer3825cd12002-04-05 21:04:09877 run_diff = 0;
878 else
879 run_diff = 1;
Michael Niedermayer2ad15162002-09-29 22:44:22880 scantable= s->inter_scantable.permutated;
Fabrice Bellardde6d9b62001-07-22 14:18:56881 }
882
Michael Niedermayerf5957f32002-06-18 00:49:00883 /* recalculate block_last_index for M$ wmv1 */
Michael Niedermayer1457ab52002-12-27 23:51:46884 if(s->msmpeg4_version>=4 && s->block_last_index[n]>0){
Michael Niedermayerf5957f32002-06-18 00:49:00885 for(last_index=63; last_index>=0; last_index--){
886 if(block[scantable[last_index]]) break;
887 }
Michael Niedermayer4d2858d2002-10-13 13:16:04888 s->block_last_index[n]= last_index;
Michael Niedermayerf5957f32002-06-18 00:49:00889 }else
890 last_index = s->block_last_index[n];
Fabrice Bellardde6d9b62001-07-22 14:18:56891 /* AC coefs */
Fabrice Bellardde6d9b62001-07-22 14:18:56892 last_non_zero = i - 1;
893 for (; i <= last_index; i++) {
Diego Biurrunbb270c02005-12-22 01:10:11894 j = scantable[i];
895 level = block[j];
896 if (level) {
897 run = i - last_non_zero - 1;
898 last = (i == last_index);
899 sign = 0;
900 slevel = level;
901 if (level < 0) {
902 sign = 1;
903 level = -level;
904 }
Michael Niedermayer62959862002-08-09 00:13:54905
Michael Niedermayerf5957f32002-06-18 00:49:00906 if(level<=MAX_LEVEL && run<=MAX_RUN){
907 s->ac_stats[s->mb_intra][n>3][level][run][last]++;
908 }
909#if 0
910else
911 s->ac_stats[s->mb_intra][n>3][40][63][0]++; //esc3 like
912#endif
Fabrice Bellardde6d9b62001-07-22 14:18:56913 code = get_rl_index(rl, last, run, level);
914 put_bits(&s->pb, rl->table_vlc[code][1], rl->table_vlc[code][0]);
915 if (code == rl->n) {
916 int level1, run1;
917
918 level1 = level - rl->max_level[last][run];
Diego Biurrun115329f2005-12-17 18:14:38919 if (level1 < 1)
Fabrice Bellardde6d9b62001-07-22 14:18:56920 goto esc2;
921 code = get_rl_index(rl, last, run, level1);
922 if (code == rl->n) {
923 esc2:
924 put_bits(&s->pb, 1, 0);
925 if (level > MAX_LEVEL)
926 goto esc3;
927 run1 = run - rl->max_run[last][level] - run_diff;
928 if (run1 < 0)
929 goto esc3;
930 code = get_rl_index(rl, last, run1, level);
931 if (code == rl->n) {
932 esc3:
933 /* third escape */
934 put_bits(&s->pb, 1, 0);
935 put_bits(&s->pb, 1, last);
Michael Niedermayer1457ab52002-12-27 23:51:46936 if(s->msmpeg4_version>=4){
Michael Niedermayerf5957f32002-06-18 00:49:00937 if(s->esc3_level_length==0){
938 s->esc3_level_length=8;
939 s->esc3_run_length= 6;
940 if(s->qscale<8)
941 put_bits(&s->pb, 6, 3);
942 else
943 put_bits(&s->pb, 8, 3);
944 }
945 put_bits(&s->pb, s->esc3_run_length, run);
946 put_bits(&s->pb, 1, sign);
947 put_bits(&s->pb, s->esc3_level_length, level);
948 }else{
949 put_bits(&s->pb, 6, run);
950 put_bits(&s->pb, 8, slevel & 0xff);
951 }
Fabrice Bellardde6d9b62001-07-22 14:18:56952 } else {
953 /* second escape */
954 put_bits(&s->pb, 1, 1);
955 put_bits(&s->pb, rl->table_vlc[code][1], rl->table_vlc[code][0]);
956 put_bits(&s->pb, 1, sign);
957 }
958 } else {
959 /* first escape */
960 put_bits(&s->pb, 1, 1);
961 put_bits(&s->pb, rl->table_vlc[code][1], rl->table_vlc[code][0]);
962 put_bits(&s->pb, 1, sign);
963 }
964 } else {
965 put_bits(&s->pb, 1, sign);
966 }
Diego Biurrunbb270c02005-12-22 01:10:11967 last_non_zero = i;
968 }
Fabrice Bellardde6d9b62001-07-22 14:18:56969 }
970}
971
972/****************************************/
973/* decoding stuff */
974
Michael Niedermayer1457ab52002-12-27 23:51:46975static VLC mb_non_intra_vlc[4];
Michael Niedermayer84afee32002-04-05 04:09:04976static VLC v2_dc_lum_vlc;
977static VLC v2_dc_chroma_vlc;
978static VLC cbpy_vlc;
979static VLC v2_intra_cbpc_vlc;
980static VLC v2_mb_type_vlc;
981static VLC v2_mv_vlc;
Michael Niedermayer287229e2002-06-02 12:22:30982static VLC v1_intra_cbpc_vlc;
983static VLC v1_inter_cbpc_vlc;
Michael Niedermayerde0f2f42002-07-07 08:34:46984static VLC inter_intra_vlc;
Michael Niedermayer84afee32002-04-05 04:09:04985
986/* this table is practically identical to the one from h263 except that its inverted */
Falk Hüffner20695ec2002-06-03 11:16:11987static void init_h263_dc_for_msmpeg4(void)
Michael Niedermayer84afee32002-04-05 04:09:04988{
Michael Niedermayer84afee32002-04-05 04:09:04989 int level, uni_code, uni_len;
Michael Niedermayer84afee32002-04-05 04:09:04990
Michael Niedermayer2ed627e2002-04-05 16:51:12991 for(level=-256; level<256; level++){
Michael Niedermayer84afee32002-04-05 04:09:04992 int size, v, l;
993 /* find number of bits */
994 size = 0;
995 v = abs(level);
996 while (v) {
997 v >>= 1;
Diego Biurrunbb270c02005-12-22 01:10:11998 size++;
Michael Niedermayer84afee32002-04-05 04:09:04999 }
1000
1001 if (level < 0)
1002 l= (-level) ^ ((1 << size) - 1);
1003 else
1004 l= level;
1005
1006 /* luminance h263 */
1007 uni_code= DCtab_lum[size][0];
1008 uni_len = DCtab_lum[size][1];
1009 uni_code ^= (1<<uni_len)-1; //M$ doesnt like compatibility
1010
1011 if (size > 0) {
1012 uni_code<<=size; uni_code|=l;
1013 uni_len+=size;
1014 if (size > 8){
1015 uni_code<<=1; uni_code|=1;
1016 uni_len++;
1017 }
1018 }
1019 v2_dc_lum_table[level+256][0]= uni_code;
1020 v2_dc_lum_table[level+256][1]= uni_len;
1021
1022 /* chrominance h263 */
1023 uni_code= DCtab_chrom[size][0];
1024 uni_len = DCtab_chrom[size][1];
1025 uni_code ^= (1<<uni_len)-1; //M$ doesnt like compatibility
Diego Biurrun115329f2005-12-17 18:14:381026
Michael Niedermayer84afee32002-04-05 04:09:041027 if (size > 0) {
1028 uni_code<<=size; uni_code|=l;
1029 uni_len+=size;
1030 if (size > 8){
1031 uni_code<<=1; uni_code|=1;
1032 uni_len++;
1033 }
1034 }
1035 v2_dc_chroma_table[level+256][0]= uni_code;
1036 v2_dc_chroma_table[level+256][1]= uni_len;
1037
1038 }
Michael Niedermayer84afee32002-04-05 04:09:041039}
Fabrice Bellardde6d9b62001-07-22 14:18:561040
1041/* init all vlc decoding tables */
Michael Niedermayerf5957f32002-06-18 00:49:001042int ff_msmpeg4_decode_init(MpegEncContext *s)
Fabrice Bellardde6d9b62001-07-22 14:18:561043{
Fabrice Bellardd81c5982002-06-06 14:31:181044 static int done = 0;
Fabrice Bellardde6d9b62001-07-22 14:18:561045 int i;
1046 MVTable *mv;
1047
Michael Niedermayerf5957f32002-06-18 00:49:001048 common_init(s);
Fabrice Bellardde6d9b62001-07-22 14:18:561049
Fabrice Bellardd81c5982002-06-06 14:31:181050 if (!done) {
1051 done = 1;
Fabrice Bellardde6d9b62001-07-22 14:18:561052
Fabrice Bellardd81c5982002-06-06 14:31:181053 for(i=0;i<NB_RL_TABLES;i++) {
Michael Niedermayer3502a542007-03-14 13:19:191054 init_rl(&rl_table[i], static_rl_table_store[i]);
Burkhard Plaum073c2592004-11-27 18:10:061055 init_vlc_rl(&rl_table[i], 1);
Fabrice Bellardd81c5982002-06-06 14:31:181056 }
1057 for(i=0;i<2;i++) {
1058 mv = &mv_tables[i];
Diego Biurrun115329f2005-12-17 18:14:381059 init_vlc(&mv->vlc, MV_VLC_BITS, mv->n + 1,
Fabrice Bellardd81c5982002-06-06 14:31:181060 mv->table_mv_bits, 1, 1,
Burkhard Plaum073c2592004-11-27 18:10:061061 mv->table_mv_code, 2, 2, 1);
Fabrice Bellardd81c5982002-06-06 14:31:181062 }
1063
Diego Biurrun115329f2005-12-17 18:14:381064 init_vlc(&ff_msmp4_dc_luma_vlc[0], DC_VLC_BITS, 120,
anonymous0c040aa2005-01-26 12:01:351065 &ff_table0_dc_lum[0][1], 8, 4,
1066 &ff_table0_dc_lum[0][0], 8, 4, 1);
Diego Biurrun115329f2005-12-17 18:14:381067 init_vlc(&ff_msmp4_dc_chroma_vlc[0], DC_VLC_BITS, 120,
anonymous0c040aa2005-01-26 12:01:351068 &ff_table0_dc_chroma[0][1], 8, 4,
1069 &ff_table0_dc_chroma[0][0], 8, 4, 1);
Diego Biurrun115329f2005-12-17 18:14:381070 init_vlc(&ff_msmp4_dc_luma_vlc[1], DC_VLC_BITS, 120,
anonymous0c040aa2005-01-26 12:01:351071 &ff_table1_dc_lum[0][1], 8, 4,
1072 &ff_table1_dc_lum[0][0], 8, 4, 1);
Diego Biurrun115329f2005-12-17 18:14:381073 init_vlc(&ff_msmp4_dc_chroma_vlc[1], DC_VLC_BITS, 120,
anonymous0c040aa2005-01-26 12:01:351074 &ff_table1_dc_chroma[0][1], 8, 4,
1075 &ff_table1_dc_chroma[0][0], 8, 4, 1);
Diego Biurrun115329f2005-12-17 18:14:381076
1077 init_vlc(&v2_dc_lum_vlc, DC_VLC_BITS, 512,
Fabrice Bellardd81c5982002-06-06 14:31:181078 &v2_dc_lum_table[0][1], 8, 4,
Burkhard Plaum073c2592004-11-27 18:10:061079 &v2_dc_lum_table[0][0], 8, 4, 1);
Diego Biurrun115329f2005-12-17 18:14:381080 init_vlc(&v2_dc_chroma_vlc, DC_VLC_BITS, 512,
Fabrice Bellardd81c5982002-06-06 14:31:181081 &v2_dc_chroma_table[0][1], 8, 4,
Burkhard Plaum073c2592004-11-27 18:10:061082 &v2_dc_chroma_table[0][0], 8, 4, 1);
Diego Biurrun115329f2005-12-17 18:14:381083
Michael Niedermayer08dce7b2002-07-10 20:05:421084 init_vlc(&cbpy_vlc, CBPY_VLC_BITS, 16,
Fabrice Bellardd81c5982002-06-06 14:31:181085 &cbpy_tab[0][1], 2, 1,
Burkhard Plaum073c2592004-11-27 18:10:061086 &cbpy_tab[0][0], 2, 1, 1);
Michael Niedermayer08dce7b2002-07-10 20:05:421087 init_vlc(&v2_intra_cbpc_vlc, V2_INTRA_CBPC_VLC_BITS, 4,
Fabrice Bellardd81c5982002-06-06 14:31:181088 &v2_intra_cbpc[0][1], 2, 1,
Burkhard Plaum073c2592004-11-27 18:10:061089 &v2_intra_cbpc[0][0], 2, 1, 1);
Michael Niedermayer08dce7b2002-07-10 20:05:421090 init_vlc(&v2_mb_type_vlc, V2_MB_TYPE_VLC_BITS, 8,
Fabrice Bellardd81c5982002-06-06 14:31:181091 &v2_mb_type[0][1], 2, 1,
Burkhard Plaum073c2592004-11-27 18:10:061092 &v2_mb_type[0][0], 2, 1, 1);
Michael Niedermayer08dce7b2002-07-10 20:05:421093 init_vlc(&v2_mv_vlc, V2_MV_VLC_BITS, 33,
Fabrice Bellardd81c5982002-06-06 14:31:181094 &mvtab[0][1], 2, 1,
Burkhard Plaum073c2592004-11-27 18:10:061095 &mvtab[0][0], 2, 1, 1);
Fabrice Bellardd81c5982002-06-06 14:31:181096
Michael Niedermayer1457ab52002-12-27 23:51:461097 for(i=0; i<4; i++){
Diego Biurrun115329f2005-12-17 18:14:381098 init_vlc(&mb_non_intra_vlc[i], MB_NON_INTRA_VLC_BITS, 128,
Michael Niedermayer1457ab52002-12-27 23:51:461099 &wmv2_inter_table[i][0][1], 8, 4,
Burkhard Plaum073c2592004-11-27 18:10:061100 &wmv2_inter_table[i][0][0], 8, 4, 1); //FIXME name?
Michael Niedermayer1457ab52002-12-27 23:51:461101 }
Diego Biurrun115329f2005-12-17 18:14:381102
1103 init_vlc(&ff_msmp4_mb_i_vlc, MB_INTRA_VLC_BITS, 64,
anonymous0d33db82005-01-30 16:34:571104 &ff_msmp4_mb_i_table[0][1], 4, 2,
1105 &ff_msmp4_mb_i_table[0][0], 4, 2, 1);
Diego Biurrun115329f2005-12-17 18:14:381106
1107 init_vlc(&v1_intra_cbpc_vlc, V1_INTRA_CBPC_VLC_BITS, 8,
Fabrice Bellardd81c5982002-06-06 14:31:181108 intra_MCBPC_bits, 1, 1,
Burkhard Plaum073c2592004-11-27 18:10:061109 intra_MCBPC_code, 1, 1, 1);
Diego Biurrun115329f2005-12-17 18:14:381110 init_vlc(&v1_inter_cbpc_vlc, V1_INTER_CBPC_VLC_BITS, 25,
Fabrice Bellardd81c5982002-06-06 14:31:181111 inter_MCBPC_bits, 1, 1,
Burkhard Plaum073c2592004-11-27 18:10:061112 inter_MCBPC_code, 1, 1, 1);
Diego Biurrun115329f2005-12-17 18:14:381113
1114 init_vlc(&inter_intra_vlc, INTER_INTRA_VLC_BITS, 4,
Michael Niedermayerde0f2f42002-07-07 08:34:461115 &table_inter_intra[0][1], 2, 1,
Burkhard Plaum073c2592004-11-27 18:10:061116 &table_inter_intra[0][0], 2, 1, 1);
Fabrice Bellardd81c5982002-06-06 14:31:181117 }
Diego Biurrun115329f2005-12-17 18:14:381118
Michael Niedermayer4d2858d2002-10-13 13:16:041119 switch(s->msmpeg4_version){
1120 case 1:
1121 case 2:
1122 s->decode_mb= msmpeg4v12_decode_mb;
1123 break;
1124 case 3:
1125 case 4:
1126 s->decode_mb= msmpeg4v34_decode_mb;
1127 break;
Michael Niedermayer1457ab52002-12-27 23:51:461128 case 5:
1129 s->decode_mb= wmv2_decode_mb;
anonymous0d33db82005-01-30 16:34:571130 case 6:
Kostya Shishkov10b9c372006-06-27 02:55:541131 //FIXME + TODO VC1 decode mb
Michael Niedermayer1457ab52002-12-27 23:51:461132 break;
Michael Niedermayer4d2858d2002-10-13 13:16:041133 }
Diego Biurrun115329f2005-12-17 18:14:381134
Michael Niedermayer917f5822002-10-25 16:06:321135 s->slice_height= s->mb_height; //to avoid 1/0 if the first frame isnt a keyframe
Diego Biurrun115329f2005-12-17 18:14:381136
Fabrice Bellardde6d9b62001-07-22 14:18:561137 return 0;
1138}
1139
Michael Niedermayer7f89b6f2002-03-29 02:07:251140int msmpeg4_decode_picture_header(MpegEncContext * s)
1141{
Michael Niedermayerf5957f32002-06-18 00:49:001142 int code;
Michael Niedermayer84afee32002-04-05 04:09:041143
Michael Niedermayere1a9dbf2002-04-06 22:29:371144#if 0
1145{
1146int i;
Michael Niedermayer68f593b2003-01-21 17:34:121147for(i=0; i<s->gb.size_in_bits; i++)
Steve L'Homme267f7ed2006-03-08 11:43:101148 av_log(s->avctx, AV_LOG_DEBUG, "%d", get_bits1(&s->gb));
Michael Niedermayere1a9dbf2002-04-06 22:29:371149// get_bits1(&s->gb);
Steve L'Homme267f7ed2006-03-08 11:43:101150av_log(s->avctx, AV_LOG_DEBUG, "END\n");
Michael Niedermayere1a9dbf2002-04-06 22:29:371151return -1;
1152}
1153#endif
Michael Niedermayer287229e2002-06-02 12:22:301154
1155 if(s->msmpeg4_version==1){
1156 int start_code, num;
1157 start_code = (get_bits(&s->gb, 16)<<16) | get_bits(&s->gb, 16);
1158 if(start_code!=0x00000100){
Michel Bardiaux9b879562003-11-03 13:26:221159 av_log(s->avctx, AV_LOG_ERROR, "invalid startcode\n");
Michael Niedermayer287229e2002-06-02 12:22:301160 return -1;
1161 }
1162
1163 num= get_bits(&s->gb, 5); // frame number */
1164 }
1165
Michael Niedermayer7f89b6f2002-03-29 02:07:251166 s->pict_type = get_bits(&s->gb, 2) + 1;
1167 if (s->pict_type != I_TYPE &&
Michael Niedermayer287229e2002-06-02 12:22:301168 s->pict_type != P_TYPE){
Michel Bardiaux9b879562003-11-03 13:26:221169 av_log(s->avctx, AV_LOG_ERROR, "invalid picture type\n");
Michael Niedermayer7f89b6f2002-03-29 02:07:251170 return -1;
Michael Niedermayer287229e2002-06-02 12:22:301171 }
Michael Niedermayerde0f2f42002-07-07 08:34:461172#if 0
1173{
1174 static int had_i=0;
1175 if(s->pict_type == I_TYPE) had_i=1;
1176 if(!had_i) return -1;
1177}
1178#endif
Michael Niedermayer6beeb962003-12-03 16:07:411179 s->chroma_qscale= s->qscale = get_bits(&s->gb, 5);
Michael Niedermayerae2d2d62003-02-10 22:43:301180 if(s->qscale==0){
Michel Bardiaux9b879562003-11-03 13:26:221181 av_log(s->avctx, AV_LOG_ERROR, "invalid qscale\n");
Michael Niedermayerae2d2d62003-02-10 22:43:301182 return -1;
1183 }
Michael Niedermayer7f89b6f2002-03-29 02:07:251184
1185 if (s->pict_type == I_TYPE) {
Diego Biurrun115329f2005-12-17 18:14:381186 code = get_bits(&s->gb, 5);
Michael Niedermayer287229e2002-06-02 12:22:301187 if(s->msmpeg4_version==1){
1188 if(code==0 || code>s->mb_height){
Michel Bardiaux9b879562003-11-03 13:26:221189 av_log(s->avctx, AV_LOG_ERROR, "invalid slice height %d\n", code);
Michael Niedermayer287229e2002-06-02 12:22:301190 return -1;
1191 }
1192
1193 s->slice_height = code;
1194 }else{
1195 /* 0x17: one slice, 0x18: two slices, ... */
Michael Niedermayerde0f2f42002-07-07 08:34:461196 if (code < 0x17){
Michel Bardiaux9b879562003-11-03 13:26:221197 av_log(s->avctx, AV_LOG_ERROR, "error, slice code was %X\n", code);
Michael Niedermayer287229e2002-06-02 12:22:301198 return -1;
Michael Niedermayerde0f2f42002-07-07 08:34:461199 }
Michael Niedermayer287229e2002-06-02 12:22:301200
1201 s->slice_height = s->mb_height / (code - 0x16);
1202 }
Michael Niedermayere1a9dbf2002-04-06 22:29:371203
1204 switch(s->msmpeg4_version){
Michael Niedermayer287229e2002-06-02 12:22:301205 case 1:
Michael Niedermayere1a9dbf2002-04-06 22:29:371206 case 2:
Michael Niedermayer84afee32002-04-05 04:09:041207 s->rl_chroma_table_index = 2;
1208 s->rl_table_index = 2;
Fabrice Bellardde6d9b62001-07-22 14:18:561209
Michael Niedermayer84afee32002-04-05 04:09:041210 s->dc_table_index = 0; //not used
Michael Niedermayere1a9dbf2002-04-06 22:29:371211 break;
1212 case 3:
Michael Niedermayer84afee32002-04-05 04:09:041213 s->rl_chroma_table_index = decode012(&s->gb);
1214 s->rl_table_index = decode012(&s->gb);
1215
1216 s->dc_table_index = get_bits1(&s->gb);
Michael Niedermayere1a9dbf2002-04-06 22:29:371217 break;
1218 case 4:
Michael Niedermayerf5957f32002-06-18 00:49:001219 msmpeg4_decode_ext_header(s, (2+5+5+17+7)/8);
Michael Niedermayere1a9dbf2002-04-06 22:29:371220
Michael Niedermayer05174fd2002-07-22 08:15:271221 if(s->bit_rate > MBAC_BITRATE) s->per_mb_rl_table= get_bits1(&s->gb);
1222 else s->per_mb_rl_table= 0;
Diego Biurrun115329f2005-12-17 18:14:381223
Michael Niedermayerf5957f32002-06-18 00:49:001224 if(!s->per_mb_rl_table){
1225 s->rl_chroma_table_index = decode012(&s->gb);
1226 s->rl_table_index = decode012(&s->gb);
1227 }
1228
1229 s->dc_table_index = get_bits1(&s->gb);
Michael Niedermayerde0f2f42002-07-07 08:34:461230 s->inter_intra_pred= 0;
Michael Niedermayere1a9dbf2002-04-06 22:29:371231 break;
Michael Niedermayer84afee32002-04-05 04:09:041232 }
Fabrice Bellardde6d9b62001-07-22 14:18:561233 s->no_rounding = 1;
Michael Niedermayer80adda82003-07-29 01:45:191234 if(s->avctx->debug&FF_DEBUG_PICT_INFO)
Diego Biurrunbb270c02005-12-22 01:10:111235 av_log(s->avctx, AV_LOG_DEBUG, "qscale:%d rlc:%d rl:%d dc:%d mbrl:%d slice:%d \n",
1236 s->qscale,
1237 s->rl_chroma_table_index,
1238 s->rl_table_index,
1239 s->dc_table_index,
Michael Niedermayerde0f2f42002-07-07 08:34:461240 s->per_mb_rl_table,
Michael Niedermayer80adda82003-07-29 01:45:191241 s->slice_height);
Fabrice Bellardde6d9b62001-07-22 14:18:561242 } else {
Michael Niedermayer287229e2002-06-02 12:22:301243 switch(s->msmpeg4_version){
1244 case 1:
1245 case 2:
1246 if(s->msmpeg4_version==1)
1247 s->use_skip_mb_code = 1;
1248 else
1249 s->use_skip_mb_code = get_bits1(&s->gb);
Michael Niedermayer84afee32002-04-05 04:09:041250 s->rl_table_index = 2;
1251 s->rl_chroma_table_index = s->rl_table_index;
Michael Niedermayer84afee32002-04-05 04:09:041252 s->dc_table_index = 0; //not used
Michael Niedermayer84afee32002-04-05 04:09:041253 s->mv_table_index = 0;
Michael Niedermayer287229e2002-06-02 12:22:301254 break;
1255 case 3:
1256 s->use_skip_mb_code = get_bits1(&s->gb);
Michael Niedermayer84afee32002-04-05 04:09:041257 s->rl_table_index = decode012(&s->gb);
1258 s->rl_chroma_table_index = s->rl_table_index;
1259
1260 s->dc_table_index = get_bits1(&s->gb);
1261
1262 s->mv_table_index = get_bits1(&s->gb);
Michael Niedermayer287229e2002-06-02 12:22:301263 break;
Michael Niedermayerf5957f32002-06-18 00:49:001264 case 4:
1265 s->use_skip_mb_code = get_bits1(&s->gb);
Michael Niedermayerde0f2f42002-07-07 08:34:461266
Michael Niedermayer05174fd2002-07-22 08:15:271267 if(s->bit_rate > MBAC_BITRATE) s->per_mb_rl_table= get_bits1(&s->gb);
1268 else s->per_mb_rl_table= 0;
Michael Niedermayerde0f2f42002-07-07 08:34:461269
Michael Niedermayerf5957f32002-06-18 00:49:001270 if(!s->per_mb_rl_table){
1271 s->rl_table_index = decode012(&s->gb);
1272 s->rl_chroma_table_index = s->rl_table_index;
1273 }
1274
1275 s->dc_table_index = get_bits1(&s->gb);
1276
1277 s->mv_table_index = get_bits1(&s->gb);
Michael Niedermayer05174fd2002-07-22 08:15:271278 s->inter_intra_pred= (s->width*s->height < 320*240 && s->bit_rate<=II_BITRATE);
Michael Niedermayerf5957f32002-06-18 00:49:001279 break;
Michael Niedermayer84afee32002-04-05 04:09:041280 }
Diego Biurrun115329f2005-12-17 18:14:381281
Michael Niedermayer80adda82003-07-29 01:45:191282 if(s->avctx->debug&FF_DEBUG_PICT_INFO)
Diego Biurrunbb270c02005-12-22 01:10:111283 av_log(s->avctx, AV_LOG_DEBUG, "skip:%d rl:%d rlc:%d dc:%d mv:%d mbrl:%d qp:%d \n",
1284 s->use_skip_mb_code,
1285 s->rl_table_index,
1286 s->rl_chroma_table_index,
1287 s->dc_table_index,
1288 s->mv_table_index,
Michael Niedermayerde0f2f42002-07-07 08:34:461289 s->per_mb_rl_table,
Michael Niedermayer80adda82003-07-29 01:45:191290 s->qscale);
1291
Diego Biurrunbb270c02005-12-22 01:10:111292 if(s->flipflop_rounding){
1293 s->no_rounding ^= 1;
1294 }else{
1295 s->no_rounding = 0;
1296 }
Fabrice Bellardde6d9b62001-07-22 14:18:561297 }
Michael Niedermayer1457ab52002-12-27 23:51:461298//printf("%d %d %d %d %d\n", s->pict_type, s->bit_rate, s->inter_intra_pred, s->width, s->height);
Michael Niedermayerf5957f32002-06-18 00:49:001299
1300 s->esc3_level_length= 0;
1301 s->esc3_run_length= 0;
Michael Niedermayer84afee32002-04-05 04:09:041302
Fabrice Bellardde6d9b62001-07-22 14:18:561303#ifdef DEBUG
Steve L'Homme267f7ed2006-03-08 11:43:101304 av_log(s->avctx, AV_LOG_DEBUG, "*****frame %d:\n", frame_count++);
Fabrice Bellardde6d9b62001-07-22 14:18:561305#endif
1306 return 0;
1307}
1308
Michael Niedermayerae404842002-01-15 22:22:411309int msmpeg4_decode_ext_header(MpegEncContext * s, int buf_size)
1310{
Michael Niedermayer287229e2002-06-02 12:22:301311 int left= buf_size*8 - get_bits_count(&s->gb);
1312 int length= s->msmpeg4_version>=3 ? 17 : 16;
Michael Niedermayerae404842002-01-15 22:22:411313 /* the alt_bitstream reader could read over the end so we need to check it */
Michael Niedermayer287229e2002-06-02 12:22:301314 if(left>=length && left<length+8)
Michael Niedermayerae404842002-01-15 22:22:411315 {
Michael Niedermayer2b9ab1d2002-02-22 19:19:011316 int fps;
1317
1318 fps= get_bits(&s->gb, 5);
Michael Niedermayer05174fd2002-07-22 08:15:271319 s->bit_rate= get_bits(&s->gb, 11)*1024;
Michael Niedermayer287229e2002-06-02 12:22:301320 if(s->msmpeg4_version>=3)
1321 s->flipflop_rounding= get_bits1(&s->gb);
1322 else
1323 s->flipflop_rounding= 0;
Michael Niedermayer2b9ab1d2002-02-22 19:19:011324
Michael Niedermayer05174fd2002-07-22 08:15:271325// printf("fps:%2d bps:%2d roundingType:%1d\n", fps, s->bit_rate/1024, s->flipflop_rounding);
Michael Niedermayer287229e2002-06-02 12:22:301326 }
1327 else if(left<length+8)
1328 {
1329 s->flipflop_rounding= 0;
Michael Niedermayer62563c32003-08-10 21:11:451330 if(s->msmpeg4_version != 2)
Michel Bardiaux9b879562003-11-03 13:26:221331 av_log(s->avctx, AV_LOG_ERROR, "ext header missing, %d left\n", left);
Michael Niedermayerae404842002-01-15 22:22:411332 }
1333 else
1334 {
Michel Bardiaux9b879562003-11-03 13:26:221335 av_log(s->avctx, AV_LOG_ERROR, "I frame too long, ignoring ext header\n");
Michael Niedermayerae404842002-01-15 22:22:411336 }
Michael Niedermayer2b9ab1d2002-02-22 19:19:011337
Michael Niedermayerae404842002-01-15 22:22:411338 return 0;
1339}
1340
Zdenek Kabelaccd4af682002-05-27 16:42:141341static inline void msmpeg4_memsetw(short *tab, int val, int n)
Fabrice Bellardde6d9b62001-07-22 14:18:561342{
1343 int i;
1344 for(i=0;i<n;i++)
1345 tab[i] = val;
1346}
1347
Måns Rullgård62bb4892006-09-27 19:54:071348#ifdef CONFIG_ENCODERS
Michael Niedermayer3825cd12002-04-05 21:04:091349static void msmpeg4v2_encode_motion(MpegEncContext * s, int val)
1350{
1351 int range, bit_size, sign, code, bits;
1352
1353 if (val == 0) {
1354 /* zero vector */
1355 code = 0;
1356 put_bits(&s->pb, mvtab[code][1], mvtab[code][0]);
1357 } else {
1358 bit_size = s->f_code - 1;
1359 range = 1 << bit_size;
1360 if (val <= -64)
1361 val += 64;
1362 else if (val >= 64)
1363 val -= 64;
1364
1365 if (val >= 0) {
1366 sign = 0;
1367 } else {
1368 val = -val;
1369 sign = 1;
1370 }
1371 val--;
1372 code = (val >> bit_size) + 1;
1373 bits = val & (range - 1);
1374
Diego Biurrun115329f2005-12-17 18:14:381375 put_bits(&s->pb, mvtab[code][1] + 1, (mvtab[code][0] << 1) | sign);
Michael Niedermayer3825cd12002-04-05 21:04:091376 if (bit_size > 0) {
1377 put_bits(&s->pb, bit_size, bits);
1378 }
1379 }
1380}
Måns Rullgård62bb4892006-09-27 19:54:071381#endif
Michael Niedermayer3825cd12002-04-05 21:04:091382
Michael Niedermayer84afee32002-04-05 04:09:041383/* this is identical to h263 except that its range is multiplied by 2 */
1384static int msmpeg4v2_decode_motion(MpegEncContext * s, int pred, int f_code)
1385{
1386 int code, val, sign, shift;
1387
Michael Niedermayer08dce7b2002-07-10 20:05:421388 code = get_vlc2(&s->gb, v2_mv_vlc.table, V2_MV_VLC_BITS, 2);
Michael Niedermayer287229e2002-06-02 12:22:301389// printf("MV code %d at %d %d pred: %d\n", code, s->mb_x,s->mb_y, pred);
Michael Niedermayer84afee32002-04-05 04:09:041390 if (code < 0)
1391 return 0xffff;
1392
1393 if (code == 0)
1394 return pred;
1395 sign = get_bits1(&s->gb);
1396 shift = f_code - 1;
BERO05858882003-05-14 01:08:021397 val = code;
1398 if (shift) {
1399 val = (val - 1) << shift;
Michael Niedermayer84afee32002-04-05 04:09:041400 val |= get_bits(&s->gb, shift);
BERO05858882003-05-14 01:08:021401 val++;
1402 }
Michael Niedermayer84afee32002-04-05 04:09:041403 if (sign)
1404 val = -val;
Michael Niedermayer84afee32002-04-05 04:09:041405
Michael Niedermayer287229e2002-06-02 12:22:301406 val += pred;
Michael Niedermayer84afee32002-04-05 04:09:041407 if (val <= -64)
1408 val += 64;
1409 else if (val >= 64)
1410 val -= 64;
1411
1412 return val;
1413}
1414
Michael Niedermayer4d2858d2002-10-13 13:16:041415static int msmpeg4v12_decode_mb(MpegEncContext *s, DCTELEM block[6][64])
Michael Niedermayer84afee32002-04-05 04:09:041416{
1417 int cbp, code, i;
Diego Biurrun115329f2005-12-17 18:14:381418
Michael Niedermayer84afee32002-04-05 04:09:041419 if (s->pict_type == P_TYPE) {
1420 if (s->use_skip_mb_code) {
1421 if (get_bits1(&s->gb)) {
1422 /* skip mb */
1423 s->mb_intra = 0;
1424 for(i=0;i<6;i++)
1425 s->block_last_index[i] = -1;
1426 s->mv_dir = MV_DIR_FORWARD;
1427 s->mv_type = MV_TYPE_16X16;
1428 s->mv[0][0][0] = 0;
1429 s->mv[0][0][1] = 0;
Mike Melanson160d6792005-04-24 17:21:111430 s->mb_skipped = 1;
Michael Niedermayer84afee32002-04-05 04:09:041431 return 0;
1432 }
1433 }
1434
Michael Niedermayer287229e2002-06-02 12:22:301435 if(s->msmpeg4_version==2)
Michael Niedermayer08dce7b2002-07-10 20:05:421436 code = get_vlc2(&s->gb, v2_mb_type_vlc.table, V2_MB_TYPE_VLC_BITS, 1);
Michael Niedermayer287229e2002-06-02 12:22:301437 else
Michael Niedermayer08dce7b2002-07-10 20:05:421438 code = get_vlc2(&s->gb, v1_inter_cbpc_vlc.table, V1_INTER_CBPC_VLC_BITS, 3);
Michael Niedermayer287229e2002-06-02 12:22:301439 if(code<0 || code>7){
Michel Bardiaux9b879562003-11-03 13:26:221440 av_log(s->avctx, AV_LOG_ERROR, "cbpc %d invalid at %d %d\n", code, s->mb_x, s->mb_y);
Michael Niedermayer287229e2002-06-02 12:22:301441 return -1;
1442 }
1443
Michael Niedermayer84afee32002-04-05 04:09:041444 s->mb_intra = code >>2;
Diego Biurrun115329f2005-12-17 18:14:381445
Michael Niedermayer84afee32002-04-05 04:09:041446 cbp = code & 0x3;
1447 } else {
1448 s->mb_intra = 1;
Michael Niedermayer287229e2002-06-02 12:22:301449 if(s->msmpeg4_version==2)
Michael Niedermayer08dce7b2002-07-10 20:05:421450 cbp= get_vlc2(&s->gb, v2_intra_cbpc_vlc.table, V2_INTRA_CBPC_VLC_BITS, 1);
Michael Niedermayer287229e2002-06-02 12:22:301451 else
Michael Niedermayer08dce7b2002-07-10 20:05:421452 cbp= get_vlc2(&s->gb, v1_intra_cbpc_vlc.table, V1_INTRA_CBPC_VLC_BITS, 1);
Michael Niedermayer287229e2002-06-02 12:22:301453 if(cbp<0 || cbp>3){
Michel Bardiaux9b879562003-11-03 13:26:221454 av_log(s->avctx, AV_LOG_ERROR, "cbpc %d invalid at %d %d\n", cbp, s->mb_x, s->mb_y);
Michael Niedermayer287229e2002-06-02 12:22:301455 return -1;
1456 }
Michael Niedermayer84afee32002-04-05 04:09:041457 }
1458
1459 if (!s->mb_intra) {
Michael Niedermayer287229e2002-06-02 12:22:301460 int mx, my, cbpy;
Diego Biurrun115329f2005-12-17 18:14:381461
Michael Niedermayer08dce7b2002-07-10 20:05:421462 cbpy= get_vlc2(&s->gb, cbpy_vlc.table, CBPY_VLC_BITS, 1);
Michael Niedermayer287229e2002-06-02 12:22:301463 if(cbpy<0){
Michel Bardiaux9b879562003-11-03 13:26:221464 av_log(s->avctx, AV_LOG_ERROR, "cbpy %d invalid at %d %d\n", cbp, s->mb_x, s->mb_y);
Michael Niedermayer287229e2002-06-02 12:22:301465 return -1;
1466 }
Michael Niedermayer84afee32002-04-05 04:09:041467
Michael Niedermayer287229e2002-06-02 12:22:301468 cbp|= cbpy<<2;
1469 if(s->msmpeg4_version==1 || (cbp&3) != 3) cbp^= 0x3C;
Diego Biurrun115329f2005-12-17 18:14:381470
Michael Niedermayer137c8462004-04-16 01:01:451471 h263_pred_motion(s, 0, 0, &mx, &my);
Michael Niedermayer84afee32002-04-05 04:09:041472 mx= msmpeg4v2_decode_motion(s, mx, 1);
1473 my= msmpeg4v2_decode_motion(s, my, 1);
Diego Biurrun115329f2005-12-17 18:14:381474
Michael Niedermayer84afee32002-04-05 04:09:041475 s->mv_dir = MV_DIR_FORWARD;
1476 s->mv_type = MV_TYPE_16X16;
1477 s->mv[0][0][0] = mx;
1478 s->mv[0][0][1] = my;
1479 } else {
Michael Niedermayer287229e2002-06-02 12:22:301480 if(s->msmpeg4_version==2){
1481 s->ac_pred = get_bits1(&s->gb);
Michael Niedermayer08dce7b2002-07-10 20:05:421482 cbp|= get_vlc2(&s->gb, cbpy_vlc.table, CBPY_VLC_BITS, 1)<<2; //FIXME check errors
Michael Niedermayer287229e2002-06-02 12:22:301483 } else{
1484 s->ac_pred = 0;
Michael Niedermayer08dce7b2002-07-10 20:05:421485 cbp|= get_vlc2(&s->gb, cbpy_vlc.table, CBPY_VLC_BITS, 1)<<2; //FIXME check errors
Michael Niedermayer287229e2002-06-02 12:22:301486 if(s->pict_type==P_TYPE) cbp^=0x3C;
1487 }
Michael Niedermayer84afee32002-04-05 04:09:041488 }
1489
Michael Niedermayerdee6dde2005-04-25 00:57:481490 s->dsp.clear_blocks(s->block[0]);
Michael Niedermayer84afee32002-04-05 04:09:041491 for (i = 0; i < 6; i++) {
Michael Niedermayer1457ab52002-12-27 23:51:461492 if (msmpeg4_decode_block(s, block[i], i, (cbp >> (5 - i)) & 1, NULL) < 0)
Diego Biurrunbb270c02005-12-22 01:10:111493 {
Michel Bardiaux9b879562003-11-03 13:26:221494 av_log(s->avctx, AV_LOG_ERROR, "\nerror while decoding block: %d x %d (%d)\n", s->mb_x, s->mb_y, i);
Michael Niedermayer84afee32002-04-05 04:09:041495 return -1;
Diego Biurrunbb270c02005-12-22 01:10:111496 }
Michael Niedermayer84afee32002-04-05 04:09:041497 }
1498 return 0;
1499}
1500
Michael Niedermayer4d2858d2002-10-13 13:16:041501static int msmpeg4v34_decode_mb(MpegEncContext *s, DCTELEM block[6][64])
Fabrice Bellardde6d9b62001-07-22 14:18:561502{
1503 int cbp, code, i;
Zdenek Kabelac0c1a9ed2003-02-11 16:35:481504 uint8_t *coded_val;
Michael Niedermayer7bc90902003-04-10 13:18:381505 uint32_t * const mb_type_ptr= &s->current_picture.mb_type[ s->mb_x + s->mb_y*s->mb_stride ];
Fabrice Bellardde6d9b62001-07-22 14:18:561506
1507 if (s->pict_type == P_TYPE) {
Fabrice Bellardde6d9b62001-07-22 14:18:561508 if (s->use_skip_mb_code) {
Arpi612476e2001-08-04 00:46:501509 if (get_bits1(&s->gb)) {
Fabrice Bellardde6d9b62001-07-22 14:18:561510 /* skip mb */
1511 s->mb_intra = 0;
1512 for(i=0;i<6;i++)
1513 s->block_last_index[i] = -1;
1514 s->mv_dir = MV_DIR_FORWARD;
1515 s->mv_type = MV_TYPE_16X16;
1516 s->mv[0][0][0] = 0;
1517 s->mv[0][0][1] = 0;
Mike Melanson160d6792005-04-24 17:21:111518 s->mb_skipped = 1;
Michael Niedermayer7bc90902003-04-10 13:18:381519 *mb_type_ptr = MB_TYPE_SKIP | MB_TYPE_L0 | MB_TYPE_16x16;
1520
Fabrice Bellardde6d9b62001-07-22 14:18:561521 return 0;
1522 }
1523 }
Diego Biurrun115329f2005-12-17 18:14:381524
Michael Niedermayer1457ab52002-12-27 23:51:461525 code = get_vlc2(&s->gb, mb_non_intra_vlc[DEFAULT_INTER_INDEX].table, MB_NON_INTRA_VLC_BITS, 3);
Fabrice Bellardde6d9b62001-07-22 14:18:561526 if (code < 0)
1527 return -1;
Diego Biurrunbb270c02005-12-22 01:10:111528 //s->mb_intra = (code & 0x40) ? 0 : 1;
1529 s->mb_intra = (~code & 0x40) >> 6;
Diego Biurrun115329f2005-12-17 18:14:381530
Fabrice Bellardde6d9b62001-07-22 14:18:561531 cbp = code & 0x3f;
1532 } else {
Fabrice Bellardde6d9b62001-07-22 14:18:561533 s->mb_intra = 1;
anonymous0d33db82005-01-30 16:34:571534 code = get_vlc2(&s->gb, ff_msmp4_mb_i_vlc.table, MB_INTRA_VLC_BITS, 2);
Fabrice Bellardde6d9b62001-07-22 14:18:561535 if (code < 0)
1536 return -1;
1537 /* predict coded block pattern */
1538 cbp = 0;
1539 for(i=0;i<6;i++) {
Zdenek Kabelac38d171e2002-02-18 09:34:541540 int val = ((code >> (5 - i)) & 1);
Fabrice Bellardde6d9b62001-07-22 14:18:561541 if (i < 4) {
Zdenek Kabelac38d171e2002-02-18 09:34:541542 int pred = coded_block_pred(s, i, &coded_val);
Fabrice Bellardde6d9b62001-07-22 14:18:561543 val = val ^ pred;
1544 *coded_val = val;
1545 }
1546 cbp |= val << (5 - i);
1547 }
1548 }
1549
1550 if (!s->mb_intra) {
1551 int mx, my;
Michael Niedermayerf5957f32002-06-18 00:49:001552//printf("P at %d %d\n", s->mb_x, s->mb_y);
1553 if(s->per_mb_rl_table && cbp){
1554 s->rl_table_index = decode012(&s->gb);
1555 s->rl_chroma_table_index = s->rl_table_index;
1556 }
Michael Niedermayer137c8462004-04-16 01:01:451557 h263_pred_motion(s, 0, 0, &mx, &my);
Fabrice Bellardde6d9b62001-07-22 14:18:561558 if (msmpeg4_decode_motion(s, &mx, &my) < 0)
1559 return -1;
1560 s->mv_dir = MV_DIR_FORWARD;
1561 s->mv_type = MV_TYPE_16X16;
1562 s->mv[0][0][0] = mx;
1563 s->mv[0][0][1] = my;
Michael Niedermayer7bc90902003-04-10 13:18:381564 *mb_type_ptr = MB_TYPE_L0 | MB_TYPE_16x16;
Fabrice Bellardde6d9b62001-07-22 14:18:561565 } else {
Michael Niedermayerf5957f32002-06-18 00:49:001566//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));
Arpi612476e2001-08-04 00:46:501567 s->ac_pred = get_bits1(&s->gb);
Michael Niedermayer7bc90902003-04-10 13:18:381568 *mb_type_ptr = MB_TYPE_INTRA;
Michael Niedermayerde0f2f42002-07-07 08:34:461569 if(s->inter_intra_pred){
Michael Niedermayer08dce7b2002-07-10 20:05:421570 s->h263_aic_dir= get_vlc2(&s->gb, inter_intra_vlc.table, INTER_INTRA_VLC_BITS, 1);
Michael Niedermayerde0f2f42002-07-07 08:34:461571// printf("%d%d %d %d/", s->ac_pred, s->h263_aic_dir, s->mb_x, s->mb_y);
1572 }
Michael Niedermayerf5957f32002-06-18 00:49:001573 if(s->per_mb_rl_table && cbp){
1574 s->rl_table_index = decode012(&s->gb);
1575 s->rl_chroma_table_index = s->rl_table_index;
1576 }
Fabrice Bellardde6d9b62001-07-22 14:18:561577 }
1578
Michael Niedermayerdee6dde2005-04-25 00:57:481579 s->dsp.clear_blocks(s->block[0]);
Fabrice Bellardde6d9b62001-07-22 14:18:561580 for (i = 0; i < 6; i++) {
Michael Niedermayer1457ab52002-12-27 23:51:461581 if (msmpeg4_decode_block(s, block[i], i, (cbp >> (5 - i)) & 1, NULL) < 0)
Diego Biurrunbb270c02005-12-22 01:10:111582 {
1583 av_log(s->avctx, AV_LOG_ERROR, "\nerror while decoding block: %d x %d (%d)\n", s->mb_x, s->mb_y, i);
1584 return -1;
1585 }
Fabrice Bellardde6d9b62001-07-22 14:18:561586 }
Diego Biurrun115329f2005-12-17 18:14:381587
Fabrice Bellardde6d9b62001-07-22 14:18:561588 return 0;
1589}
Michael Niedermayer1a013242002-07-17 09:15:141590//#define ERROR_DETAILS
Michael Niedermayerf5957f32002-06-18 00:49:001591static inline int msmpeg4_decode_block(MpegEncContext * s, DCTELEM * block,
Michael Niedermayer1457ab52002-12-27 23:51:461592 int n, int coded, const uint8_t *scan_table)
Fabrice Bellardde6d9b62001-07-22 14:18:561593{
Michael Niedermayer45a82ed2002-07-13 14:55:121594 int level, i, last, run, run_diff;
Fabrice Bellardde6d9b62001-07-22 14:18:561595 int dc_pred_dir;
1596 RLTable *rl;
Michael Niedermayer45a82ed2002-07-13 14:55:121597 RL_VLC_ELEM *rl_vlc;
Michael Niedermayerbadaf882002-01-13 04:59:371598 int qmul, qadd;
Fabrice Bellardde6d9b62001-07-22 14:18:561599
1600 if (s->mb_intra) {
Michael Niedermayerbadaf882002-01-13 04:59:371601 qmul=1;
1602 qadd=0;
1603
Diego Biurrunbb270c02005-12-22 01:10:111604 /* DC coef */
Fabrice Bellardde6d9b62001-07-22 14:18:561605 level = msmpeg4_decode_dc(s, n, &dc_pred_dir);
Diego Biurrun115329f2005-12-17 18:14:381606
Michael Niedermayer287229e2002-06-02 12:22:301607 if (level < 0){
Michel Bardiaux9b879562003-11-03 13:26:221608 av_log(s->avctx, AV_LOG_ERROR, "dc overflow- block: %d qscale: %d//\n", n, s->qscale);
Michael Niedermayerde0f2f42002-07-07 08:34:461609 if(s->inter_intra_pred) level=0;
1610 else return -1;
Michael Niedermayer287229e2002-06-02 12:22:301611 }
Fabrice Bellardde6d9b62001-07-22 14:18:561612 if (n < 4) {
1613 rl = &rl_table[s->rl_table_index];
Michael Niedermayer287229e2002-06-02 12:22:301614 if(level > 256*s->y_dc_scale){
Michel Bardiaux9b879562003-11-03 13:26:221615 av_log(s->avctx, AV_LOG_ERROR, "dc overflow+ L qscale: %d//\n", s->qscale);
Michael Niedermayerde0f2f42002-07-07 08:34:461616 if(!s->inter_intra_pred) return -1;
Michael Niedermayer287229e2002-06-02 12:22:301617 }
Fabrice Bellardde6d9b62001-07-22 14:18:561618 } else {
1619 rl = &rl_table[3 + s->rl_chroma_table_index];
Michael Niedermayer287229e2002-06-02 12:22:301620 if(level > 256*s->c_dc_scale){
Michel Bardiaux9b879562003-11-03 13:26:221621 av_log(s->avctx, AV_LOG_ERROR, "dc overflow+ C qscale: %d//\n", s->qscale);
Michael Niedermayerde0f2f42002-07-07 08:34:461622 if(!s->inter_intra_pred) return -1;
Michael Niedermayer287229e2002-06-02 12:22:301623 }
Fabrice Bellardde6d9b62001-07-22 14:18:561624 }
Michael Niedermayer287229e2002-06-02 12:22:301625 block[0] = level;
Michael Niedermayerbadaf882002-01-13 04:59:371626
Fabrice Bellardde6d9b62001-07-22 14:18:561627 run_diff = 0;
Michael Niedermayer45a82ed2002-07-13 14:55:121628 i = 0;
Fabrice Bellardde6d9b62001-07-22 14:18:561629 if (!coded) {
1630 goto not_coded;
1631 }
1632 if (s->ac_pred) {
Diego Biurrun115329f2005-12-17 18:14:381633 if (dc_pred_dir == 0)
Michael Niedermayer2ad15162002-09-29 22:44:221634 scan_table = s->intra_v_scantable.permutated; /* left */
Fabrice Bellardde6d9b62001-07-22 14:18:561635 else
Michael Niedermayer2ad15162002-09-29 22:44:221636 scan_table = s->intra_h_scantable.permutated; /* top */
Fabrice Bellardde6d9b62001-07-22 14:18:561637 } else {
Michael Niedermayer2ad15162002-09-29 22:44:221638 scan_table = s->intra_scantable.permutated;
Fabrice Bellardde6d9b62001-07-22 14:18:561639 }
Michael Niedermayer45a82ed2002-07-13 14:55:121640 rl_vlc= rl->rl_vlc[0];
Fabrice Bellardde6d9b62001-07-22 14:18:561641 } else {
Michael Niedermayerbadaf882002-01-13 04:59:371642 qmul = s->qscale << 1;
1643 qadd = (s->qscale - 1) | 1;
Michael Niedermayer45a82ed2002-07-13 14:55:121644 i = -1;
Fabrice Bellardde6d9b62001-07-22 14:18:561645 rl = &rl_table[3 + s->rl_table_index];
Michael Niedermayer84afee32002-04-05 04:09:041646
1647 if(s->msmpeg4_version==2)
1648 run_diff = 0;
1649 else
1650 run_diff = 1;
1651
Fabrice Bellardde6d9b62001-07-22 14:18:561652 if (!coded) {
Michael Niedermayer45a82ed2002-07-13 14:55:121653 s->block_last_index[n] = i;
Fabrice Bellardde6d9b62001-07-22 14:18:561654 return 0;
1655 }
Michael Niedermayer1457ab52002-12-27 23:51:461656 if(!scan_table)
1657 scan_table = s->inter_scantable.permutated;
Michael Niedermayer45a82ed2002-07-13 14:55:121658 rl_vlc= rl->rl_vlc[s->qscale];
Fabrice Bellardde6d9b62001-07-22 14:18:561659 }
Michael Niedermayer45a82ed2002-07-13 14:55:121660 {
1661 OPEN_READER(re, &s->gb);
Fabrice Bellardde6d9b62001-07-22 14:18:561662 for(;;) {
Michael Niedermayer45a82ed2002-07-13 14:55:121663 UPDATE_CACHE(re, &s->gb);
Michael Niedermayere91f4bf2005-04-18 20:07:481664 GET_RL_VLC(level, run, re, &s->gb, rl_vlc, TEX_VLC_BITS, 2, 0);
Michael Niedermayer45a82ed2002-07-13 14:55:121665 if (level==0) {
1666 int cache;
1667 cache= GET_CACHE(re, &s->gb);
Fabrice Bellardde6d9b62001-07-22 14:18:561668 /* escape */
Michael Niedermayer45a82ed2002-07-13 14:55:121669 if (s->msmpeg4_version==1 || (cache&0x80000000)==0) {
1670 if (s->msmpeg4_version==1 || (cache&0x40000000)==0) {
Fabrice Bellardde6d9b62001-07-22 14:18:561671 /* third escape */
Michael Niedermayer45a82ed2002-07-13 14:55:121672 if(s->msmpeg4_version!=1) LAST_SKIP_BITS(re, &s->gb, 2);
1673 UPDATE_CACHE(re, &s->gb);
Michael Niedermayerf5957f32002-06-18 00:49:001674 if(s->msmpeg4_version<=3){
Michael Niedermayer45a82ed2002-07-13 14:55:121675 last= SHOW_UBITS(re, &s->gb, 1); SKIP_CACHE(re, &s->gb, 1);
1676 run= SHOW_UBITS(re, &s->gb, 6); SKIP_CACHE(re, &s->gb, 6);
1677 level= SHOW_SBITS(re, &s->gb, 8); LAST_SKIP_CACHE(re, &s->gb, 8);
1678 SKIP_COUNTER(re, &s->gb, 1+6+8);
Diego Biurrun115329f2005-12-17 18:14:381679 }else{
Michael Niedermayerf5957f32002-06-18 00:49:001680 int sign;
Michael Niedermayer45a82ed2002-07-13 14:55:121681 last= SHOW_UBITS(re, &s->gb, 1); SKIP_BITS(re, &s->gb, 1);
Michael Niedermayerf5957f32002-06-18 00:49:001682 if(!s->esc3_level_length){
1683 int ll;
1684 //printf("ESC-3 %X at %d %d\n", show_bits(&s->gb, 24), s->mb_x, s->mb_y);
1685 if(s->qscale<8){
Michael Niedermayer45a82ed2002-07-13 14:55:121686 ll= SHOW_UBITS(re, &s->gb, 3); SKIP_BITS(re, &s->gb, 3);
Michael Niedermayerf5957f32002-06-18 00:49:001687 if(ll==0){
Michel Bardiaux9b879562003-11-03 13:26:221688 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");
Michael Niedermayer45a82ed2002-07-13 14:55:121689 SKIP_BITS(re, &s->gb, 1);
Michael Niedermayerf5957f32002-06-18 00:49:001690 ll=8;
1691 }
1692 }else{
1693 ll=2;
Michael Niedermayer45a82ed2002-07-13 14:55:121694 while(ll<8 && SHOW_UBITS(re, &s->gb, 1)==0){
1695 ll++;
1696 SKIP_BITS(re, &s->gb, 1);
1697 }
Michael Niedermayer05174fd2002-07-22 08:15:271698 if(ll<8) SKIP_BITS(re, &s->gb, 1);
Michael Niedermayerf5957f32002-06-18 00:49:001699 }
1700
1701 s->esc3_level_length= ll;
Michael Niedermayer45a82ed2002-07-13 14:55:121702 s->esc3_run_length= SHOW_UBITS(re, &s->gb, 2) + 3; SKIP_BITS(re, &s->gb, 2);
Michael Niedermayerf5957f32002-06-18 00:49:001703//printf("level length:%d, run length: %d\n", ll, s->esc3_run_length);
Michael Niedermayer05174fd2002-07-22 08:15:271704 UPDATE_CACHE(re, &s->gb);
Michael Niedermayerf5957f32002-06-18 00:49:001705 }
Diego Biurrun115329f2005-12-17 18:14:381706 run= SHOW_UBITS(re, &s->gb, s->esc3_run_length);
Michael Niedermayer45a82ed2002-07-13 14:55:121707 SKIP_BITS(re, &s->gb, s->esc3_run_length);
Diego Biurrun115329f2005-12-17 18:14:381708
1709 sign= SHOW_UBITS(re, &s->gb, 1);
Michael Niedermayer45a82ed2002-07-13 14:55:121710 SKIP_BITS(re, &s->gb, 1);
Diego Biurrun115329f2005-12-17 18:14:381711
1712 level= SHOW_UBITS(re, &s->gb, s->esc3_level_length);
Michael Niedermayer45a82ed2002-07-13 14:55:121713 SKIP_BITS(re, &s->gb, s->esc3_level_length);
Michael Niedermayerf5957f32002-06-18 00:49:001714 if(sign) level= -level;
1715 }
1716//printf("level: %d, run: %d at %d %d\n", level, run, s->mb_x, s->mb_y);
Michael Niedermayer287229e2002-06-02 12:22:301717#if 0 // waste of time / this will detect very few errors
1718 {
Diego Biurrunc26abfa2006-10-11 23:17:581719 const int abs_level= FFABS(level);
Michael Niedermayer287229e2002-06-02 12:22:301720 const int run1= run - rl->max_run[last][abs_level] - run_diff;
1721 if(abs_level<=MAX_LEVEL && run<=MAX_RUN){
1722 if(abs_level <= rl->max_level[last][run]){
Steve L'Homme267f7ed2006-03-08 11:43:101723 av_log(s->avctx, AV_LOG_ERROR, "illegal 3. esc, vlc encoding possible\n");
Michael Niedermayer287229e2002-06-02 12:22:301724 return DECODING_AC_LOST;
1725 }
1726 if(abs_level <= rl->max_level[last][run]*2){
Steve L'Homme267f7ed2006-03-08 11:43:101727 av_log(s->avctx, AV_LOG_ERROR, "illegal 3. esc, esc 1 encoding possible\n");
Michael Niedermayer287229e2002-06-02 12:22:301728 return DECODING_AC_LOST;
1729 }
Michael Niedermayerf5957f32002-06-18 00:49:001730 if(run1>=0 && abs_level <= rl->max_level[last][run1]){
Steve L'Homme267f7ed2006-03-08 11:43:101731 av_log(s->avctx, AV_LOG_ERROR, "illegal 3. esc, esc 2 encoding possible\n");
Michael Niedermayer287229e2002-06-02 12:22:301732 return DECODING_AC_LOST;
1733 }
1734 }
1735 }
1736#endif
Diego Biurrunbb270c02005-12-22 01:10:111737 //level = level * qmul + (level>0) * qadd - (level<=0) * qadd ;
1738 if (level>0) level= level * qmul + qadd;
Michael Niedermayer287229e2002-06-02 12:22:301739 else level= level * qmul - qadd;
1740#if 0 // waste of time too :(
1741 if(level>2048 || level<-2048){
Steve L'Homme267f7ed2006-03-08 11:43:101742 av_log(s->avctx, AV_LOG_ERROR, "|level| overflow in 3. esc\n");
Michael Niedermayer287229e2002-06-02 12:22:301743 return DECODING_AC_LOST;
1744 }
1745#endif
Michael Niedermayer45a82ed2002-07-13 14:55:121746 i+= run + 1;
1747 if(last) i+=192;
Michael Niedermayer1a013242002-07-17 09:15:141748#ifdef ERROR_DETAILS
1749 if(run==66)
Michael Niedermayer95ae72b2005-08-26 19:05:441750 av_log(s->avctx, AV_LOG_ERROR, "illegal vlc code in ESC3 level=%d\n", level);
Michael Niedermayer1a013242002-07-17 09:15:141751 else if((i>62 && i<192) || i>192+63)
Michael Niedermayer95ae72b2005-08-26 19:05:441752 av_log(s->avctx, AV_LOG_ERROR, "run overflow in ESC3 i=%d run=%d level=%d\n", i, run, level);
Michael Niedermayer1a013242002-07-17 09:15:141753#endif
Fabrice Bellardde6d9b62001-07-22 14:18:561754 } else {
1755 /* second escape */
Michael Niedermayer45a82ed2002-07-13 14:55:121756#if MIN_CACHE_BITS < 23
1757 LAST_SKIP_BITS(re, &s->gb, 2);
1758 UPDATE_CACHE(re, &s->gb);
1759#else
1760 SKIP_BITS(re, &s->gb, 2);
1761#endif
Michael Niedermayere91f4bf2005-04-18 20:07:481762 GET_RL_VLC(level, run, re, &s->gb, rl_vlc, TEX_VLC_BITS, 2, 1);
Michael Niedermayer45a82ed2002-07-13 14:55:121763 i+= run + rl->max_run[run>>7][level/qmul] + run_diff; //FIXME opt indexing
1764 level = (level ^ SHOW_SBITS(re, &s->gb, 1)) - SHOW_SBITS(re, &s->gb, 1);
1765 LAST_SKIP_BITS(re, &s->gb, 1);
Michael Niedermayer1a013242002-07-17 09:15:141766#ifdef ERROR_DETAILS
1767 if(run==66)
Michael Niedermayer95ae72b2005-08-26 19:05:441768 av_log(s->avctx, AV_LOG_ERROR, "illegal vlc code in ESC2 level=%d\n", level);
Michael Niedermayer1a013242002-07-17 09:15:141769 else if((i>62 && i<192) || i>192+63)
Michael Niedermayer95ae72b2005-08-26 19:05:441770 av_log(s->avctx, AV_LOG_ERROR, "run overflow in ESC2 i=%d run=%d level=%d\n", i, run, level);
Michael Niedermayer1a013242002-07-17 09:15:141771#endif
Fabrice Bellardde6d9b62001-07-22 14:18:561772 }
1773 } else {
1774 /* first escape */
Michael Niedermayer45a82ed2002-07-13 14:55:121775#if MIN_CACHE_BITS < 22
1776 LAST_SKIP_BITS(re, &s->gb, 1);
1777 UPDATE_CACHE(re, &s->gb);
1778#else
1779 SKIP_BITS(re, &s->gb, 1);
1780#endif
Michael Niedermayere91f4bf2005-04-18 20:07:481781 GET_RL_VLC(level, run, re, &s->gb, rl_vlc, TEX_VLC_BITS, 2, 1);
Michael Niedermayer45a82ed2002-07-13 14:55:121782 i+= run;
1783 level = level + rl->max_level[run>>7][(run-1)&63] * qmul;//FIXME opt indexing
1784 level = (level ^ SHOW_SBITS(re, &s->gb, 1)) - SHOW_SBITS(re, &s->gb, 1);
1785 LAST_SKIP_BITS(re, &s->gb, 1);
Michael Niedermayer1a013242002-07-17 09:15:141786#ifdef ERROR_DETAILS
1787 if(run==66)
Michael Niedermayer95ae72b2005-08-26 19:05:441788 av_log(s->avctx, AV_LOG_ERROR, "illegal vlc code in ESC1 level=%d\n", level);
Michael Niedermayer1a013242002-07-17 09:15:141789 else if((i>62 && i<192) || i>192+63)
Michael Niedermayer95ae72b2005-08-26 19:05:441790 av_log(s->avctx, AV_LOG_ERROR, "run overflow in ESC1 i=%d run=%d level=%d\n", i, run, level);
Michael Niedermayer1a013242002-07-17 09:15:141791#endif
Fabrice Bellardde6d9b62001-07-22 14:18:561792 }
1793 } else {
Michael Niedermayer45a82ed2002-07-13 14:55:121794 i+= run;
1795 level = (level ^ SHOW_SBITS(re, &s->gb, 1)) - SHOW_SBITS(re, &s->gb, 1);
1796 LAST_SKIP_BITS(re, &s->gb, 1);
Michael Niedermayer1a013242002-07-17 09:15:141797#ifdef ERROR_DETAILS
1798 if(run==66)
Michael Niedermayer95ae72b2005-08-26 19:05:441799 av_log(s->avctx, AV_LOG_ERROR, "illegal vlc code level=%d\n", level);
Michael Niedermayer1a013242002-07-17 09:15:141800 else if((i>62 && i<192) || i>192+63)
Michael Niedermayer95ae72b2005-08-26 19:05:441801 av_log(s->avctx, AV_LOG_ERROR, "run overflow i=%d run=%d level=%d\n", i, run, level);
Michael Niedermayer1a013242002-07-17 09:15:141802#endif
Fabrice Bellardde6d9b62001-07-22 14:18:561803 }
Michael Niedermayer45a82ed2002-07-13 14:55:121804 if (i > 62){
1805 i-= 192;
1806 if(i&(~63)){
Michael Niedermayer68f593b2003-01-21 17:34:121807 const int left= s->gb.size_in_bits - get_bits_count(&s->gb);
Michael Niedermayer4d2858d2002-10-13 13:16:041808 if(((i+192 == 64 && level/qmul==-1) || s->error_resilience<=1) && left>=0){
Michel Bardiaux9b879562003-11-03 13:26:221809 av_log(s->avctx, AV_LOG_ERROR, "ignoring overflow at %d %d\n", s->mb_x, s->mb_y);
Michael Niedermayer1a013242002-07-17 09:15:141810 break;
1811 }else{
Michel Bardiaux9b879562003-11-03 13:26:221812 av_log(s->avctx, AV_LOG_ERROR, "ac-tex damaged at %d %d\n", s->mb_x, s->mb_y);
Michael Niedermayer1a013242002-07-17 09:15:141813 return -1;
1814 }
Michael Niedermayer45a82ed2002-07-13 14:55:121815 }
1816
1817 block[scan_table[i]] = level;
1818 break;
Michael Niedermayerf5957f32002-06-18 00:49:001819 }
Michael Niedermayer287229e2002-06-02 12:22:301820
Michael Niedermayer45a82ed2002-07-13 14:55:121821 block[scan_table[i]] = level;
Fabrice Bellardde6d9b62001-07-22 14:18:561822 }
Michael Niedermayer45a82ed2002-07-13 14:55:121823 CLOSE_READER(re, &s->gb);
1824 }
Fabrice Bellardde6d9b62001-07-22 14:18:561825 not_coded:
1826 if (s->mb_intra) {
1827 mpeg4_pred_ac(s, block, n, dc_pred_dir);
1828 if (s->ac_pred) {
Michael Niedermayer45a82ed2002-07-13 14:55:121829 i = 63; /* XXX: not optimal */
Fabrice Bellardde6d9b62001-07-22 14:18:561830 }
1831 }
Michael Niedermayer1457ab52002-12-27 23:51:461832 if(s->msmpeg4_version>=4 && i>0) i=63; //FIXME/XXX optimize
Michael Niedermayer45a82ed2002-07-13 14:55:121833 s->block_last_index[n] = i;
Diego Biurrun115329f2005-12-17 18:14:381834
Fabrice Bellardde6d9b62001-07-22 14:18:561835 return 0;
1836}
1837
1838static int msmpeg4_decode_dc(MpegEncContext * s, int n, int *dir_ptr)
1839{
1840 int level, pred;
Fabrice Bellardde6d9b62001-07-22 14:18:561841
Michael Niedermayer287229e2002-06-02 12:22:301842 if(s->msmpeg4_version<=2){
Michael Niedermayer84afee32002-04-05 04:09:041843 if (n < 4) {
Michael Niedermayer08dce7b2002-07-10 20:05:421844 level = get_vlc2(&s->gb, v2_dc_lum_vlc.table, DC_VLC_BITS, 3);
Michael Niedermayer84afee32002-04-05 04:09:041845 } else {
Michael Niedermayer08dce7b2002-07-10 20:05:421846 level = get_vlc2(&s->gb, v2_dc_chroma_vlc.table, DC_VLC_BITS, 3);
Michael Niedermayer84afee32002-04-05 04:09:041847 }
Diego Biurrun115329f2005-12-17 18:14:381848 if (level < 0)
Michael Niedermayer84afee32002-04-05 04:09:041849 return -1;
Michael Niedermayer84afee32002-04-05 04:09:041850 level-=256;
1851 }else{ //FIXME optimize use unified tables & index
1852 if (n < 4) {
anonymous0d33db82005-01-30 16:34:571853 level = get_vlc2(&s->gb, ff_msmp4_dc_luma_vlc[s->dc_table_index].table, DC_VLC_BITS, 3);
Michael Niedermayer84afee32002-04-05 04:09:041854 } else {
anonymous0d33db82005-01-30 16:34:571855 level = get_vlc2(&s->gb, ff_msmp4_dc_chroma_vlc[s->dc_table_index].table, DC_VLC_BITS, 3);
Michael Niedermayer84afee32002-04-05 04:09:041856 }
Michael Niedermayer287229e2002-06-02 12:22:301857 if (level < 0){
Michel Bardiaux9b879562003-11-03 13:26:221858 av_log(s->avctx, AV_LOG_ERROR, "illegal dc vlc\n");
Michael Niedermayer84afee32002-04-05 04:09:041859 return -1;
Michael Niedermayer287229e2002-06-02 12:22:301860 }
Michael Niedermayer84afee32002-04-05 04:09:041861
1862 if (level == DC_MAX) {
1863 level = get_bits(&s->gb, 8);
1864 if (get_bits1(&s->gb))
1865 level = -level;
1866 } else if (level != 0) {
1867 if (get_bits1(&s->gb))
1868 level = -level;
1869 }
Fabrice Bellardde6d9b62001-07-22 14:18:561870 }
1871
Michael Niedermayer287229e2002-06-02 12:22:301872 if(s->msmpeg4_version==1){
Zdenek Kabelac0c1a9ed2003-02-11 16:35:481873 int32_t *dc_val;
Michael Niedermayer287229e2002-06-02 12:22:301874 pred = msmpeg4v1_pred_dc(s, n, &dc_val);
1875 level += pred;
Diego Biurrun115329f2005-12-17 18:14:381876
Michael Niedermayer287229e2002-06-02 12:22:301877 /* update predictor */
1878 *dc_val= level;
1879 }else{
Måns Rullgårdb86216d2006-09-27 22:13:441880 int16_t *dc_val;
Michael Niedermayerbd5e1c72002-06-22 15:52:251881 pred = msmpeg4_pred_dc(s, n, &dc_val, dir_ptr);
Michael Niedermayer287229e2002-06-02 12:22:301882 level += pred;
Fabrice Bellardde6d9b62001-07-22 14:18:561883
Michael Niedermayer287229e2002-06-02 12:22:301884 /* update predictor */
1885 if (n < 4) {
1886 *dc_val = level * s->y_dc_scale;
1887 } else {
1888 *dc_val = level * s->c_dc_scale;
1889 }
Fabrice Bellardde6d9b62001-07-22 14:18:561890 }
1891
1892 return level;
1893}
1894
Diego Biurrun115329f2005-12-17 18:14:381895static int msmpeg4_decode_motion(MpegEncContext * s,
Fabrice Bellardde6d9b62001-07-22 14:18:561896 int *mx_ptr, int *my_ptr)
1897{
1898 MVTable *mv;
1899 int code, mx, my;
1900
1901 mv = &mv_tables[s->mv_table_index];
1902
Michael Niedermayer08dce7b2002-07-10 20:05:421903 code = get_vlc2(&s->gb, mv->vlc.table, MV_VLC_BITS, 2);
Michael Niedermayerf5957f32002-06-18 00:49:001904 if (code < 0){
Michel Bardiaux9b879562003-11-03 13:26:221905 av_log(s->avctx, AV_LOG_ERROR, "illegal MV code at %d %d\n", s->mb_x, s->mb_y);
Fabrice Bellardde6d9b62001-07-22 14:18:561906 return -1;
Michael Niedermayerf5957f32002-06-18 00:49:001907 }
Fabrice Bellardde6d9b62001-07-22 14:18:561908 if (code == mv->n) {
Michael Niedermayerf5957f32002-06-18 00:49:001909//printf("MV ESC %X at %d %d\n", show_bits(&s->gb, 24), s->mb_x, s->mb_y);
Fabrice Bellardde6d9b62001-07-22 14:18:561910 mx = get_bits(&s->gb, 6);
1911 my = get_bits(&s->gb, 6);
1912 } else {
1913 mx = mv->table_mvx[code];
1914 my = mv->table_mvy[code];
1915 }
1916
1917 mx += *mx_ptr - 32;
1918 my += *my_ptr - 32;
1919 /* WARNING : they do not do exactly modulo encoding */
1920 if (mx <= -64)
1921 mx += 64;
1922 else if (mx >= 64)
1923 mx -= 64;
1924
1925 if (my <= -64)
1926 my += 64;
1927 else if (my >= 64)
1928 my -= 64;
1929 *mx_ptr = mx;
1930 *my_ptr = my;
1931 return 0;
1932}
Michael Niedermayer1457ab52002-12-27 23:51:461933
1934/* cleanest way to support it
1935 * there is too much shared between versions so that we cant have 1 file per version & 1 common
Diego Biurrun115329f2005-12-17 18:14:381936 * as allmost everything would be in the common file
Michael Niedermayer1457ab52002-12-27 23:51:461937 */
1938#include "wmv2.c"