blob: ba58798e7da0edc2e5bbf444d06f8bf39e6dbb0d [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
Denis Fortinc68a1732007-06-21 07:53:4864void ff_msmpeg4_encode_block(MpegEncContext * s, DCTELEM * block, int n);
Michael Niedermayerf5957f32002-06-18 00:49:0065static 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
Diego Biurrun90b5b512007-06-12 18:50:5091#ifdef CONFIG_ENCODERS //strangely gcc includes this even if it is 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
Denis Fortinc68a1732007-06-21 07:53:48250void ff_find_best_tables(MpegEncContext * s)
Michael Niedermayerf5957f32002-06-18 00:49:00251{
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{
Denis Fortinc68a1732007-06-21 07:53:48320 ff_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) {
Diego Biurrun90b5b512007-06-12 18:50:50457 /* escape : code literally */
Fabrice Bellardde6d9b62001-07-22 14:18:56458 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++) {
Denis Fortinc68a1732007-06-21 07:53:48537 ff_msmpeg4_encode_block(s, block[i], i);
Michael Niedermayer4d2a4832003-04-02 09:57:34538 }
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++) {
Denis Fortinc68a1732007-06-21 07:53:48596 ff_msmpeg4_encode_block(s, block[i], i);
Michael Niedermayer4d2a4832003-04-02 09:57:34597 }
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;
Fortin Denisb05b1932007-06-22 08:35:21786 int pred, extquant;
787 int extrabits = 0;
Fabrice Bellardde6d9b62001-07-22 14:18:56788
Michael Niedermayer287229e2002-06-02 12:22:30789 if(s->msmpeg4_version==1){
Zdenek Kabelac0c1a9ed2003-02-11 16:35:48790 int32_t *dc_val;
Michael Niedermayer287229e2002-06-02 12:22:30791 pred = msmpeg4v1_pred_dc(s, n, &dc_val);
Diego Biurrun115329f2005-12-17 18:14:38792
Michael Niedermayer287229e2002-06-02 12:22:30793 /* update predictor */
794 *dc_val= level;
795 }else{
Måns Rullgårdb86216d2006-09-27 22:13:44796 int16_t *dc_val;
Michael Niedermayerbd5e1c72002-06-22 15:52:25797 pred = msmpeg4_pred_dc(s, n, &dc_val, dir_ptr);
Fabrice Bellardde6d9b62001-07-22 14:18:56798
Michael Niedermayer287229e2002-06-02 12:22:30799 /* update predictor */
800 if (n < 4) {
801 *dc_val = level * s->y_dc_scale;
802 } else {
803 *dc_val = level * s->c_dc_scale;
804 }
Fabrice Bellardde6d9b62001-07-22 14:18:56805 }
806
807 /* do the prediction */
808 level -= pred;
809
Michael Niedermayer287229e2002-06-02 12:22:30810 if(s->msmpeg4_version<=2){
Michael Niedermayer3825cd12002-04-05 21:04:09811 if (n < 4) {
Diego Biurrun115329f2005-12-17 18:14:38812 put_bits(&s->pb,
Michael Niedermayer3825cd12002-04-05 21:04:09813 v2_dc_lum_table[level+256][1],
814 v2_dc_lum_table[level+256][0]);
815 }else{
Diego Biurrun115329f2005-12-17 18:14:38816 put_bits(&s->pb,
Michael Niedermayer3825cd12002-04-05 21:04:09817 v2_dc_chroma_table[level+256][1],
818 v2_dc_chroma_table[level+256][0]);
819 }
820 }else{
821 sign = 0;
822 if (level < 0) {
823 level = -level;
824 sign = 1;
825 }
826 code = level;
Diego Biurrun115329f2005-12-17 18:14:38827 if (code > DC_MAX)
Michael Niedermayer3825cd12002-04-05 21:04:09828 code = DC_MAX;
Fortin Denisb05b1932007-06-22 08:35:21829 else if( s->msmpeg4_version>=6 ) {
830 if( s->qscale == 1 ) {
831 extquant = (level + 3) & 0x3;
832 code = ((level+3)>>2);
833 } else if( s->qscale == 2 ) {
834 extquant = (level + 1) & 0x1;
835 code = ((level+1)>>1);
836 }
837 }
Fabrice Bellardde6d9b62001-07-22 14:18:56838
Michael Niedermayer3825cd12002-04-05 21:04:09839 if (s->dc_table_index == 0) {
840 if (n < 4) {
anonymous0c040aa2005-01-26 12:01:35841 put_bits(&s->pb, ff_table0_dc_lum[code][1], ff_table0_dc_lum[code][0]);
Michael Niedermayer3825cd12002-04-05 21:04:09842 } else {
anonymous0c040aa2005-01-26 12:01:35843 put_bits(&s->pb, ff_table0_dc_chroma[code][1], ff_table0_dc_chroma[code][0]);
Michael Niedermayer3825cd12002-04-05 21:04:09844 }
Fabrice Bellardde6d9b62001-07-22 14:18:56845 } else {
Michael Niedermayer3825cd12002-04-05 21:04:09846 if (n < 4) {
anonymous0c040aa2005-01-26 12:01:35847 put_bits(&s->pb, ff_table1_dc_lum[code][1], ff_table1_dc_lum[code][0]);
Michael Niedermayer3825cd12002-04-05 21:04:09848 } else {
anonymous0c040aa2005-01-26 12:01:35849 put_bits(&s->pb, ff_table1_dc_chroma[code][1], ff_table1_dc_chroma[code][0]);
Michael Niedermayer3825cd12002-04-05 21:04:09850 }
Fabrice Bellardde6d9b62001-07-22 14:18:56851 }
Diego Biurrun115329f2005-12-17 18:14:38852
Fortin Denisb05b1932007-06-22 08:35:21853 if(s->msmpeg4_version>=6 && s->qscale<=2)
854 extrabits = 3 - s->qscale;
855
Michael Niedermayer3825cd12002-04-05 21:04:09856 if (code == DC_MAX)
Fortin Denisb05b1932007-06-22 08:35:21857 put_bits(&s->pb, 8 + extrabits, level);
858 else if(extrabits > 0)//== VC1 && s->qscale<=2
859 put_bits(&s->pb, extrabits, extquant);
Diego Biurrun115329f2005-12-17 18:14:38860
Michael Niedermayer3825cd12002-04-05 21:04:09861 if (level != 0) {
862 put_bits(&s->pb, 1, sign);
Fabrice Bellardde6d9b62001-07-22 14:18:56863 }
864 }
Fabrice Bellardde6d9b62001-07-22 14:18:56865}
866
867/* Encoding of a block. Very similar to MPEG4 except for a different
868 escape coding (same as H263) and more vlc tables.
869 */
Denis Fortinc68a1732007-06-21 07:53:48870void ff_msmpeg4_encode_block(MpegEncContext * s, DCTELEM * block, int n)
Fabrice Bellardde6d9b62001-07-22 14:18:56871{
872 int level, run, last, i, j, last_index;
873 int last_non_zero, sign, slevel;
874 int code, run_diff, dc_pred_dir;
875 const RLTable *rl;
Zdenek Kabelac0c1a9ed2003-02-11 16:35:48876 const uint8_t *scantable;
Fabrice Bellardde6d9b62001-07-22 14:18:56877
878 if (s->mb_intra) {
Fabrice Bellardde6d9b62001-07-22 14:18:56879 msmpeg4_encode_dc(s, block[0], n, &dc_pred_dir);
880 i = 1;
881 if (n < 4) {
882 rl = &rl_table[s->rl_table_index];
883 } else {
884 rl = &rl_table[3 + s->rl_chroma_table_index];
885 }
Fortin Denisb05b1932007-06-22 08:35:21886 run_diff = s->msmpeg4_version>=6;
Michael Niedermayer2ad15162002-09-29 22:44:22887 scantable= s->intra_scantable.permutated;
Fabrice Bellardde6d9b62001-07-22 14:18:56888 } else {
889 i = 0;
890 rl = &rl_table[3 + s->rl_table_index];
Michael Niedermayer287229e2002-06-02 12:22:30891 if(s->msmpeg4_version<=2)
Michael Niedermayer3825cd12002-04-05 21:04:09892 run_diff = 0;
893 else
894 run_diff = 1;
Michael Niedermayer2ad15162002-09-29 22:44:22895 scantable= s->inter_scantable.permutated;
Fabrice Bellardde6d9b62001-07-22 14:18:56896 }
897
Michael Niedermayerf5957f32002-06-18 00:49:00898 /* recalculate block_last_index for M$ wmv1 */
Fortin Denisb05b1932007-06-22 08:35:21899 if(s->msmpeg4_version>=4 && s->msmpeg4_version<6 && s->block_last_index[n]>0){
Michael Niedermayerf5957f32002-06-18 00:49:00900 for(last_index=63; last_index>=0; last_index--){
901 if(block[scantable[last_index]]) break;
902 }
Michael Niedermayer4d2858d2002-10-13 13:16:04903 s->block_last_index[n]= last_index;
Michael Niedermayerf5957f32002-06-18 00:49:00904 }else
905 last_index = s->block_last_index[n];
Fabrice Bellardde6d9b62001-07-22 14:18:56906 /* AC coefs */
Fabrice Bellardde6d9b62001-07-22 14:18:56907 last_non_zero = i - 1;
908 for (; i <= last_index; i++) {
Diego Biurrunbb270c02005-12-22 01:10:11909 j = scantable[i];
910 level = block[j];
911 if (level) {
912 run = i - last_non_zero - 1;
913 last = (i == last_index);
914 sign = 0;
915 slevel = level;
916 if (level < 0) {
917 sign = 1;
918 level = -level;
919 }
Michael Niedermayer62959862002-08-09 00:13:54920
Michael Niedermayerf5957f32002-06-18 00:49:00921 if(level<=MAX_LEVEL && run<=MAX_RUN){
922 s->ac_stats[s->mb_intra][n>3][level][run][last]++;
923 }
924#if 0
925else
926 s->ac_stats[s->mb_intra][n>3][40][63][0]++; //esc3 like
927#endif
Fabrice Bellardde6d9b62001-07-22 14:18:56928 code = get_rl_index(rl, last, run, level);
929 put_bits(&s->pb, rl->table_vlc[code][1], rl->table_vlc[code][0]);
930 if (code == rl->n) {
931 int level1, run1;
932
933 level1 = level - rl->max_level[last][run];
Diego Biurrun115329f2005-12-17 18:14:38934 if (level1 < 1)
Fabrice Bellardde6d9b62001-07-22 14:18:56935 goto esc2;
936 code = get_rl_index(rl, last, run, level1);
937 if (code == rl->n) {
938 esc2:
939 put_bits(&s->pb, 1, 0);
940 if (level > MAX_LEVEL)
941 goto esc3;
942 run1 = run - rl->max_run[last][level] - run_diff;
943 if (run1 < 0)
944 goto esc3;
945 code = get_rl_index(rl, last, run1, level);
946 if (code == rl->n) {
947 esc3:
948 /* third escape */
949 put_bits(&s->pb, 1, 0);
950 put_bits(&s->pb, 1, last);
Michael Niedermayer1457ab52002-12-27 23:51:46951 if(s->msmpeg4_version>=4){
Michael Niedermayerf5957f32002-06-18 00:49:00952 if(s->esc3_level_length==0){
953 s->esc3_level_length=8;
954 s->esc3_run_length= 6;
Fortin Denisb05b1932007-06-22 08:35:21955 //ESCLVLSZ + ESCRUNSZ
Michael Niedermayerf5957f32002-06-18 00:49:00956 if(s->qscale<8)
Fortin Denisb05b1932007-06-22 08:35:21957 put_bits(&s->pb, 6 + (s->msmpeg4_version>=6), 3);
Michael Niedermayerf5957f32002-06-18 00:49:00958 else
959 put_bits(&s->pb, 8, 3);
960 }
961 put_bits(&s->pb, s->esc3_run_length, run);
962 put_bits(&s->pb, 1, sign);
963 put_bits(&s->pb, s->esc3_level_length, level);
964 }else{
965 put_bits(&s->pb, 6, run);
966 put_bits(&s->pb, 8, slevel & 0xff);
967 }
Fabrice Bellardde6d9b62001-07-22 14:18:56968 } else {
969 /* second escape */
970 put_bits(&s->pb, 1, 1);
971 put_bits(&s->pb, rl->table_vlc[code][1], rl->table_vlc[code][0]);
972 put_bits(&s->pb, 1, sign);
973 }
974 } else {
975 /* first escape */
976 put_bits(&s->pb, 1, 1);
977 put_bits(&s->pb, rl->table_vlc[code][1], rl->table_vlc[code][0]);
978 put_bits(&s->pb, 1, sign);
979 }
980 } else {
981 put_bits(&s->pb, 1, sign);
982 }
Diego Biurrunbb270c02005-12-22 01:10:11983 last_non_zero = i;
984 }
Fabrice Bellardde6d9b62001-07-22 14:18:56985 }
986}
987
988/****************************************/
989/* decoding stuff */
990
Michael Niedermayer1457ab52002-12-27 23:51:46991static VLC mb_non_intra_vlc[4];
Michael Niedermayer84afee32002-04-05 04:09:04992static VLC v2_dc_lum_vlc;
993static VLC v2_dc_chroma_vlc;
994static VLC cbpy_vlc;
995static VLC v2_intra_cbpc_vlc;
996static VLC v2_mb_type_vlc;
997static VLC v2_mv_vlc;
Michael Niedermayer287229e2002-06-02 12:22:30998static VLC v1_intra_cbpc_vlc;
999static VLC v1_inter_cbpc_vlc;
Michael Niedermayerde0f2f42002-07-07 08:34:461000static VLC inter_intra_vlc;
Michael Niedermayer84afee32002-04-05 04:09:041001
Diego Biurrun90b5b512007-06-12 18:50:501002/* This table is practically identical to the one from h263
1003 * except that it is inverted. */
Falk Hüffner20695ec2002-06-03 11:16:111004static void init_h263_dc_for_msmpeg4(void)
Michael Niedermayer84afee32002-04-05 04:09:041005{
Michael Niedermayer84afee32002-04-05 04:09:041006 int level, uni_code, uni_len;
Michael Niedermayer84afee32002-04-05 04:09:041007
Michael Niedermayer2ed627e2002-04-05 16:51:121008 for(level=-256; level<256; level++){
Michael Niedermayer84afee32002-04-05 04:09:041009 int size, v, l;
1010 /* find number of bits */
1011 size = 0;
1012 v = abs(level);
1013 while (v) {
1014 v >>= 1;
Diego Biurrunbb270c02005-12-22 01:10:111015 size++;
Michael Niedermayer84afee32002-04-05 04:09:041016 }
1017
1018 if (level < 0)
1019 l= (-level) ^ ((1 << size) - 1);
1020 else
1021 l= level;
1022
1023 /* luminance h263 */
1024 uni_code= DCtab_lum[size][0];
1025 uni_len = DCtab_lum[size][1];
Diego Biurrun755bfea2007-06-12 09:29:251026 uni_code ^= (1<<uni_len)-1; //M$ does not like compatibility
Michael Niedermayer84afee32002-04-05 04:09:041027
1028 if (size > 0) {
1029 uni_code<<=size; uni_code|=l;
1030 uni_len+=size;
1031 if (size > 8){
1032 uni_code<<=1; uni_code|=1;
1033 uni_len++;
1034 }
1035 }
1036 v2_dc_lum_table[level+256][0]= uni_code;
1037 v2_dc_lum_table[level+256][1]= uni_len;
1038
1039 /* chrominance h263 */
1040 uni_code= DCtab_chrom[size][0];
1041 uni_len = DCtab_chrom[size][1];
Diego Biurrun755bfea2007-06-12 09:29:251042 uni_code ^= (1<<uni_len)-1; //M$ does not like compatibility
Diego Biurrun115329f2005-12-17 18:14:381043
Michael Niedermayer84afee32002-04-05 04:09:041044 if (size > 0) {
1045 uni_code<<=size; uni_code|=l;
1046 uni_len+=size;
1047 if (size > 8){
1048 uni_code<<=1; uni_code|=1;
1049 uni_len++;
1050 }
1051 }
1052 v2_dc_chroma_table[level+256][0]= uni_code;
1053 v2_dc_chroma_table[level+256][1]= uni_len;
1054
1055 }
Michael Niedermayer84afee32002-04-05 04:09:041056}
Fabrice Bellardde6d9b62001-07-22 14:18:561057
1058/* init all vlc decoding tables */
Michael Niedermayerf5957f32002-06-18 00:49:001059int ff_msmpeg4_decode_init(MpegEncContext *s)
Fabrice Bellardde6d9b62001-07-22 14:18:561060{
Fabrice Bellardd81c5982002-06-06 14:31:181061 static int done = 0;
Fabrice Bellardde6d9b62001-07-22 14:18:561062 int i;
1063 MVTable *mv;
1064
Michael Niedermayerf5957f32002-06-18 00:49:001065 common_init(s);
Fabrice Bellardde6d9b62001-07-22 14:18:561066
Fabrice Bellardd81c5982002-06-06 14:31:181067 if (!done) {
1068 done = 1;
Fabrice Bellardde6d9b62001-07-22 14:18:561069
Fabrice Bellardd81c5982002-06-06 14:31:181070 for(i=0;i<NB_RL_TABLES;i++) {
Michael Niedermayer3502a542007-03-14 13:19:191071 init_rl(&rl_table[i], static_rl_table_store[i]);
Burkhard Plaum073c2592004-11-27 18:10:061072 init_vlc_rl(&rl_table[i], 1);
Fabrice Bellardd81c5982002-06-06 14:31:181073 }
1074 for(i=0;i<2;i++) {
1075 mv = &mv_tables[i];
Diego Biurrun115329f2005-12-17 18:14:381076 init_vlc(&mv->vlc, MV_VLC_BITS, mv->n + 1,
Fabrice Bellardd81c5982002-06-06 14:31:181077 mv->table_mv_bits, 1, 1,
Burkhard Plaum073c2592004-11-27 18:10:061078 mv->table_mv_code, 2, 2, 1);
Fabrice Bellardd81c5982002-06-06 14:31:181079 }
1080
Diego Biurrun115329f2005-12-17 18:14:381081 init_vlc(&ff_msmp4_dc_luma_vlc[0], DC_VLC_BITS, 120,
anonymous0c040aa2005-01-26 12:01:351082 &ff_table0_dc_lum[0][1], 8, 4,
1083 &ff_table0_dc_lum[0][0], 8, 4, 1);
Diego Biurrun115329f2005-12-17 18:14:381084 init_vlc(&ff_msmp4_dc_chroma_vlc[0], DC_VLC_BITS, 120,
anonymous0c040aa2005-01-26 12:01:351085 &ff_table0_dc_chroma[0][1], 8, 4,
1086 &ff_table0_dc_chroma[0][0], 8, 4, 1);
Diego Biurrun115329f2005-12-17 18:14:381087 init_vlc(&ff_msmp4_dc_luma_vlc[1], DC_VLC_BITS, 120,
anonymous0c040aa2005-01-26 12:01:351088 &ff_table1_dc_lum[0][1], 8, 4,
1089 &ff_table1_dc_lum[0][0], 8, 4, 1);
Diego Biurrun115329f2005-12-17 18:14:381090 init_vlc(&ff_msmp4_dc_chroma_vlc[1], DC_VLC_BITS, 120,
anonymous0c040aa2005-01-26 12:01:351091 &ff_table1_dc_chroma[0][1], 8, 4,
1092 &ff_table1_dc_chroma[0][0], 8, 4, 1);
Diego Biurrun115329f2005-12-17 18:14:381093
1094 init_vlc(&v2_dc_lum_vlc, DC_VLC_BITS, 512,
Fabrice Bellardd81c5982002-06-06 14:31:181095 &v2_dc_lum_table[0][1], 8, 4,
Burkhard Plaum073c2592004-11-27 18:10:061096 &v2_dc_lum_table[0][0], 8, 4, 1);
Diego Biurrun115329f2005-12-17 18:14:381097 init_vlc(&v2_dc_chroma_vlc, DC_VLC_BITS, 512,
Fabrice Bellardd81c5982002-06-06 14:31:181098 &v2_dc_chroma_table[0][1], 8, 4,
Burkhard Plaum073c2592004-11-27 18:10:061099 &v2_dc_chroma_table[0][0], 8, 4, 1);
Diego Biurrun115329f2005-12-17 18:14:381100
Michael Niedermayer08dce7b2002-07-10 20:05:421101 init_vlc(&cbpy_vlc, CBPY_VLC_BITS, 16,
Fabrice Bellardd81c5982002-06-06 14:31:181102 &cbpy_tab[0][1], 2, 1,
Burkhard Plaum073c2592004-11-27 18:10:061103 &cbpy_tab[0][0], 2, 1, 1);
Michael Niedermayer08dce7b2002-07-10 20:05:421104 init_vlc(&v2_intra_cbpc_vlc, V2_INTRA_CBPC_VLC_BITS, 4,
Fabrice Bellardd81c5982002-06-06 14:31:181105 &v2_intra_cbpc[0][1], 2, 1,
Burkhard Plaum073c2592004-11-27 18:10:061106 &v2_intra_cbpc[0][0], 2, 1, 1);
Michael Niedermayer08dce7b2002-07-10 20:05:421107 init_vlc(&v2_mb_type_vlc, V2_MB_TYPE_VLC_BITS, 8,
Fabrice Bellardd81c5982002-06-06 14:31:181108 &v2_mb_type[0][1], 2, 1,
Burkhard Plaum073c2592004-11-27 18:10:061109 &v2_mb_type[0][0], 2, 1, 1);
Michael Niedermayer08dce7b2002-07-10 20:05:421110 init_vlc(&v2_mv_vlc, V2_MV_VLC_BITS, 33,
Fabrice Bellardd81c5982002-06-06 14:31:181111 &mvtab[0][1], 2, 1,
Burkhard Plaum073c2592004-11-27 18:10:061112 &mvtab[0][0], 2, 1, 1);
Fabrice Bellardd81c5982002-06-06 14:31:181113
Michael Niedermayer1457ab52002-12-27 23:51:461114 for(i=0; i<4; i++){
Diego Biurrun115329f2005-12-17 18:14:381115 init_vlc(&mb_non_intra_vlc[i], MB_NON_INTRA_VLC_BITS, 128,
Michael Niedermayer1457ab52002-12-27 23:51:461116 &wmv2_inter_table[i][0][1], 8, 4,
Burkhard Plaum073c2592004-11-27 18:10:061117 &wmv2_inter_table[i][0][0], 8, 4, 1); //FIXME name?
Michael Niedermayer1457ab52002-12-27 23:51:461118 }
Diego Biurrun115329f2005-12-17 18:14:381119
1120 init_vlc(&ff_msmp4_mb_i_vlc, MB_INTRA_VLC_BITS, 64,
anonymous0d33db82005-01-30 16:34:571121 &ff_msmp4_mb_i_table[0][1], 4, 2,
1122 &ff_msmp4_mb_i_table[0][0], 4, 2, 1);
Diego Biurrun115329f2005-12-17 18:14:381123
1124 init_vlc(&v1_intra_cbpc_vlc, V1_INTRA_CBPC_VLC_BITS, 8,
Fabrice Bellardd81c5982002-06-06 14:31:181125 intra_MCBPC_bits, 1, 1,
Burkhard Plaum073c2592004-11-27 18:10:061126 intra_MCBPC_code, 1, 1, 1);
Diego Biurrun115329f2005-12-17 18:14:381127 init_vlc(&v1_inter_cbpc_vlc, V1_INTER_CBPC_VLC_BITS, 25,
Fabrice Bellardd81c5982002-06-06 14:31:181128 inter_MCBPC_bits, 1, 1,
Burkhard Plaum073c2592004-11-27 18:10:061129 inter_MCBPC_code, 1, 1, 1);
Diego Biurrun115329f2005-12-17 18:14:381130
1131 init_vlc(&inter_intra_vlc, INTER_INTRA_VLC_BITS, 4,
Michael Niedermayerde0f2f42002-07-07 08:34:461132 &table_inter_intra[0][1], 2, 1,
Burkhard Plaum073c2592004-11-27 18:10:061133 &table_inter_intra[0][0], 2, 1, 1);
Fabrice Bellardd81c5982002-06-06 14:31:181134 }
Diego Biurrun115329f2005-12-17 18:14:381135
Michael Niedermayer4d2858d2002-10-13 13:16:041136 switch(s->msmpeg4_version){
1137 case 1:
1138 case 2:
1139 s->decode_mb= msmpeg4v12_decode_mb;
1140 break;
1141 case 3:
1142 case 4:
1143 s->decode_mb= msmpeg4v34_decode_mb;
1144 break;
Michael Niedermayer1457ab52002-12-27 23:51:461145 case 5:
1146 s->decode_mb= wmv2_decode_mb;
anonymous0d33db82005-01-30 16:34:571147 case 6:
Kostya Shishkov10b9c372006-06-27 02:55:541148 //FIXME + TODO VC1 decode mb
Michael Niedermayer1457ab52002-12-27 23:51:461149 break;
Michael Niedermayer4d2858d2002-10-13 13:16:041150 }
Diego Biurrun115329f2005-12-17 18:14:381151
Diego Biurrun755bfea2007-06-12 09:29:251152 s->slice_height= s->mb_height; //to avoid 1/0 if the first frame is not a keyframe
Diego Biurrun115329f2005-12-17 18:14:381153
Fabrice Bellardde6d9b62001-07-22 14:18:561154 return 0;
1155}
1156
Michael Niedermayer7f89b6f2002-03-29 02:07:251157int msmpeg4_decode_picture_header(MpegEncContext * s)
1158{
Michael Niedermayerf5957f32002-06-18 00:49:001159 int code;
Michael Niedermayer84afee32002-04-05 04:09:041160
Michael Niedermayere1a9dbf2002-04-06 22:29:371161#if 0
1162{
1163int i;
Michael Niedermayer68f593b2003-01-21 17:34:121164for(i=0; i<s->gb.size_in_bits; i++)
Steve L'Homme267f7ed2006-03-08 11:43:101165 av_log(s->avctx, AV_LOG_DEBUG, "%d", get_bits1(&s->gb));
Michael Niedermayere1a9dbf2002-04-06 22:29:371166// get_bits1(&s->gb);
Steve L'Homme267f7ed2006-03-08 11:43:101167av_log(s->avctx, AV_LOG_DEBUG, "END\n");
Michael Niedermayere1a9dbf2002-04-06 22:29:371168return -1;
1169}
1170#endif
Michael Niedermayer287229e2002-06-02 12:22:301171
1172 if(s->msmpeg4_version==1){
1173 int start_code, num;
1174 start_code = (get_bits(&s->gb, 16)<<16) | get_bits(&s->gb, 16);
1175 if(start_code!=0x00000100){
Michel Bardiaux9b879562003-11-03 13:26:221176 av_log(s->avctx, AV_LOG_ERROR, "invalid startcode\n");
Michael Niedermayer287229e2002-06-02 12:22:301177 return -1;
1178 }
1179
1180 num= get_bits(&s->gb, 5); // frame number */
1181 }
1182
Michael Niedermayer7f89b6f2002-03-29 02:07:251183 s->pict_type = get_bits(&s->gb, 2) + 1;
1184 if (s->pict_type != I_TYPE &&
Michael Niedermayer287229e2002-06-02 12:22:301185 s->pict_type != P_TYPE){
Michel Bardiaux9b879562003-11-03 13:26:221186 av_log(s->avctx, AV_LOG_ERROR, "invalid picture type\n");
Michael Niedermayer7f89b6f2002-03-29 02:07:251187 return -1;
Michael Niedermayer287229e2002-06-02 12:22:301188 }
Michael Niedermayerde0f2f42002-07-07 08:34:461189#if 0
1190{
1191 static int had_i=0;
1192 if(s->pict_type == I_TYPE) had_i=1;
1193 if(!had_i) return -1;
1194}
1195#endif
Michael Niedermayer6beeb962003-12-03 16:07:411196 s->chroma_qscale= s->qscale = get_bits(&s->gb, 5);
Michael Niedermayerae2d2d62003-02-10 22:43:301197 if(s->qscale==0){
Michel Bardiaux9b879562003-11-03 13:26:221198 av_log(s->avctx, AV_LOG_ERROR, "invalid qscale\n");
Michael Niedermayerae2d2d62003-02-10 22:43:301199 return -1;
1200 }
Michael Niedermayer7f89b6f2002-03-29 02:07:251201
1202 if (s->pict_type == I_TYPE) {
Diego Biurrun115329f2005-12-17 18:14:381203 code = get_bits(&s->gb, 5);
Michael Niedermayer287229e2002-06-02 12:22:301204 if(s->msmpeg4_version==1){
1205 if(code==0 || code>s->mb_height){
Michel Bardiaux9b879562003-11-03 13:26:221206 av_log(s->avctx, AV_LOG_ERROR, "invalid slice height %d\n", code);
Michael Niedermayer287229e2002-06-02 12:22:301207 return -1;
1208 }
1209
1210 s->slice_height = code;
1211 }else{
1212 /* 0x17: one slice, 0x18: two slices, ... */
Michael Niedermayerde0f2f42002-07-07 08:34:461213 if (code < 0x17){
Michel Bardiaux9b879562003-11-03 13:26:221214 av_log(s->avctx, AV_LOG_ERROR, "error, slice code was %X\n", code);
Michael Niedermayer287229e2002-06-02 12:22:301215 return -1;
Michael Niedermayerde0f2f42002-07-07 08:34:461216 }
Michael Niedermayer287229e2002-06-02 12:22:301217
1218 s->slice_height = s->mb_height / (code - 0x16);
1219 }
Michael Niedermayere1a9dbf2002-04-06 22:29:371220
1221 switch(s->msmpeg4_version){
Michael Niedermayer287229e2002-06-02 12:22:301222 case 1:
Michael Niedermayere1a9dbf2002-04-06 22:29:371223 case 2:
Michael Niedermayer84afee32002-04-05 04:09:041224 s->rl_chroma_table_index = 2;
1225 s->rl_table_index = 2;
Fabrice Bellardde6d9b62001-07-22 14:18:561226
Michael Niedermayer84afee32002-04-05 04:09:041227 s->dc_table_index = 0; //not used
Michael Niedermayere1a9dbf2002-04-06 22:29:371228 break;
1229 case 3:
Michael Niedermayer84afee32002-04-05 04:09:041230 s->rl_chroma_table_index = decode012(&s->gb);
1231 s->rl_table_index = decode012(&s->gb);
1232
1233 s->dc_table_index = get_bits1(&s->gb);
Michael Niedermayere1a9dbf2002-04-06 22:29:371234 break;
1235 case 4:
Michael Niedermayerf5957f32002-06-18 00:49:001236 msmpeg4_decode_ext_header(s, (2+5+5+17+7)/8);
Michael Niedermayere1a9dbf2002-04-06 22:29:371237
Michael Niedermayer05174fd2002-07-22 08:15:271238 if(s->bit_rate > MBAC_BITRATE) s->per_mb_rl_table= get_bits1(&s->gb);
1239 else s->per_mb_rl_table= 0;
Diego Biurrun115329f2005-12-17 18:14:381240
Michael Niedermayerf5957f32002-06-18 00:49:001241 if(!s->per_mb_rl_table){
1242 s->rl_chroma_table_index = decode012(&s->gb);
1243 s->rl_table_index = decode012(&s->gb);
1244 }
1245
1246 s->dc_table_index = get_bits1(&s->gb);
Michael Niedermayerde0f2f42002-07-07 08:34:461247 s->inter_intra_pred= 0;
Michael Niedermayere1a9dbf2002-04-06 22:29:371248 break;
Michael Niedermayer84afee32002-04-05 04:09:041249 }
Fabrice Bellardde6d9b62001-07-22 14:18:561250 s->no_rounding = 1;
Michael Niedermayer80adda82003-07-29 01:45:191251 if(s->avctx->debug&FF_DEBUG_PICT_INFO)
Diego Biurrunbb270c02005-12-22 01:10:111252 av_log(s->avctx, AV_LOG_DEBUG, "qscale:%d rlc:%d rl:%d dc:%d mbrl:%d slice:%d \n",
1253 s->qscale,
1254 s->rl_chroma_table_index,
1255 s->rl_table_index,
1256 s->dc_table_index,
Michael Niedermayerde0f2f42002-07-07 08:34:461257 s->per_mb_rl_table,
Michael Niedermayer80adda82003-07-29 01:45:191258 s->slice_height);
Fabrice Bellardde6d9b62001-07-22 14:18:561259 } else {
Michael Niedermayer287229e2002-06-02 12:22:301260 switch(s->msmpeg4_version){
1261 case 1:
1262 case 2:
1263 if(s->msmpeg4_version==1)
1264 s->use_skip_mb_code = 1;
1265 else
1266 s->use_skip_mb_code = get_bits1(&s->gb);
Michael Niedermayer84afee32002-04-05 04:09:041267 s->rl_table_index = 2;
1268 s->rl_chroma_table_index = s->rl_table_index;
Michael Niedermayer84afee32002-04-05 04:09:041269 s->dc_table_index = 0; //not used
Michael Niedermayer84afee32002-04-05 04:09:041270 s->mv_table_index = 0;
Michael Niedermayer287229e2002-06-02 12:22:301271 break;
1272 case 3:
1273 s->use_skip_mb_code = get_bits1(&s->gb);
Michael Niedermayer84afee32002-04-05 04:09:041274 s->rl_table_index = decode012(&s->gb);
1275 s->rl_chroma_table_index = s->rl_table_index;
1276
1277 s->dc_table_index = get_bits1(&s->gb);
1278
1279 s->mv_table_index = get_bits1(&s->gb);
Michael Niedermayer287229e2002-06-02 12:22:301280 break;
Michael Niedermayerf5957f32002-06-18 00:49:001281 case 4:
1282 s->use_skip_mb_code = get_bits1(&s->gb);
Michael Niedermayerde0f2f42002-07-07 08:34:461283
Michael Niedermayer05174fd2002-07-22 08:15:271284 if(s->bit_rate > MBAC_BITRATE) s->per_mb_rl_table= get_bits1(&s->gb);
1285 else s->per_mb_rl_table= 0;
Michael Niedermayerde0f2f42002-07-07 08:34:461286
Michael Niedermayerf5957f32002-06-18 00:49:001287 if(!s->per_mb_rl_table){
1288 s->rl_table_index = decode012(&s->gb);
1289 s->rl_chroma_table_index = s->rl_table_index;
1290 }
1291
1292 s->dc_table_index = get_bits1(&s->gb);
1293
1294 s->mv_table_index = get_bits1(&s->gb);
Michael Niedermayer05174fd2002-07-22 08:15:271295 s->inter_intra_pred= (s->width*s->height < 320*240 && s->bit_rate<=II_BITRATE);
Michael Niedermayerf5957f32002-06-18 00:49:001296 break;
Michael Niedermayer84afee32002-04-05 04:09:041297 }
Diego Biurrun115329f2005-12-17 18:14:381298
Michael Niedermayer80adda82003-07-29 01:45:191299 if(s->avctx->debug&FF_DEBUG_PICT_INFO)
Diego Biurrunbb270c02005-12-22 01:10:111300 av_log(s->avctx, AV_LOG_DEBUG, "skip:%d rl:%d rlc:%d dc:%d mv:%d mbrl:%d qp:%d \n",
1301 s->use_skip_mb_code,
1302 s->rl_table_index,
1303 s->rl_chroma_table_index,
1304 s->dc_table_index,
1305 s->mv_table_index,
Michael Niedermayerde0f2f42002-07-07 08:34:461306 s->per_mb_rl_table,
Michael Niedermayer80adda82003-07-29 01:45:191307 s->qscale);
1308
Diego Biurrunbb270c02005-12-22 01:10:111309 if(s->flipflop_rounding){
1310 s->no_rounding ^= 1;
1311 }else{
1312 s->no_rounding = 0;
1313 }
Fabrice Bellardde6d9b62001-07-22 14:18:561314 }
Michael Niedermayer1457ab52002-12-27 23:51:461315//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:001316
1317 s->esc3_level_length= 0;
1318 s->esc3_run_length= 0;
Michael Niedermayer84afee32002-04-05 04:09:041319
Fabrice Bellardde6d9b62001-07-22 14:18:561320#ifdef DEBUG
Steve L'Homme267f7ed2006-03-08 11:43:101321 av_log(s->avctx, AV_LOG_DEBUG, "*****frame %d:\n", frame_count++);
Fabrice Bellardde6d9b62001-07-22 14:18:561322#endif
1323 return 0;
1324}
1325
Michael Niedermayerae404842002-01-15 22:22:411326int msmpeg4_decode_ext_header(MpegEncContext * s, int buf_size)
1327{
Michael Niedermayer287229e2002-06-02 12:22:301328 int left= buf_size*8 - get_bits_count(&s->gb);
1329 int length= s->msmpeg4_version>=3 ? 17 : 16;
Michael Niedermayerae404842002-01-15 22:22:411330 /* the alt_bitstream reader could read over the end so we need to check it */
Michael Niedermayer287229e2002-06-02 12:22:301331 if(left>=length && left<length+8)
Michael Niedermayerae404842002-01-15 22:22:411332 {
Michael Niedermayer2b9ab1d2002-02-22 19:19:011333 int fps;
1334
1335 fps= get_bits(&s->gb, 5);
Michael Niedermayer05174fd2002-07-22 08:15:271336 s->bit_rate= get_bits(&s->gb, 11)*1024;
Michael Niedermayer287229e2002-06-02 12:22:301337 if(s->msmpeg4_version>=3)
1338 s->flipflop_rounding= get_bits1(&s->gb);
1339 else
1340 s->flipflop_rounding= 0;
Michael Niedermayer2b9ab1d2002-02-22 19:19:011341
Michael Niedermayer05174fd2002-07-22 08:15:271342// printf("fps:%2d bps:%2d roundingType:%1d\n", fps, s->bit_rate/1024, s->flipflop_rounding);
Michael Niedermayer287229e2002-06-02 12:22:301343 }
1344 else if(left<length+8)
1345 {
1346 s->flipflop_rounding= 0;
Michael Niedermayer62563c32003-08-10 21:11:451347 if(s->msmpeg4_version != 2)
Michel Bardiaux9b879562003-11-03 13:26:221348 av_log(s->avctx, AV_LOG_ERROR, "ext header missing, %d left\n", left);
Michael Niedermayerae404842002-01-15 22:22:411349 }
1350 else
1351 {
Michel Bardiaux9b879562003-11-03 13:26:221352 av_log(s->avctx, AV_LOG_ERROR, "I frame too long, ignoring ext header\n");
Michael Niedermayerae404842002-01-15 22:22:411353 }
Michael Niedermayer2b9ab1d2002-02-22 19:19:011354
Michael Niedermayerae404842002-01-15 22:22:411355 return 0;
1356}
1357
Zdenek Kabelaccd4af682002-05-27 16:42:141358static inline void msmpeg4_memsetw(short *tab, int val, int n)
Fabrice Bellardde6d9b62001-07-22 14:18:561359{
1360 int i;
1361 for(i=0;i<n;i++)
1362 tab[i] = val;
1363}
1364
Måns Rullgård62bb4892006-09-27 19:54:071365#ifdef CONFIG_ENCODERS
Michael Niedermayer3825cd12002-04-05 21:04:091366static void msmpeg4v2_encode_motion(MpegEncContext * s, int val)
1367{
1368 int range, bit_size, sign, code, bits;
1369
1370 if (val == 0) {
1371 /* zero vector */
1372 code = 0;
1373 put_bits(&s->pb, mvtab[code][1], mvtab[code][0]);
1374 } else {
1375 bit_size = s->f_code - 1;
1376 range = 1 << bit_size;
1377 if (val <= -64)
1378 val += 64;
1379 else if (val >= 64)
1380 val -= 64;
1381
1382 if (val >= 0) {
1383 sign = 0;
1384 } else {
1385 val = -val;
1386 sign = 1;
1387 }
1388 val--;
1389 code = (val >> bit_size) + 1;
1390 bits = val & (range - 1);
1391
Diego Biurrun115329f2005-12-17 18:14:381392 put_bits(&s->pb, mvtab[code][1] + 1, (mvtab[code][0] << 1) | sign);
Michael Niedermayer3825cd12002-04-05 21:04:091393 if (bit_size > 0) {
1394 put_bits(&s->pb, bit_size, bits);
1395 }
1396 }
1397}
Måns Rullgård62bb4892006-09-27 19:54:071398#endif
Michael Niedermayer3825cd12002-04-05 21:04:091399
Diego Biurrun90b5b512007-06-12 18:50:501400/* This is identical to h263 except that its range is multiplied by 2. */
Michael Niedermayer84afee32002-04-05 04:09:041401static int msmpeg4v2_decode_motion(MpegEncContext * s, int pred, int f_code)
1402{
1403 int code, val, sign, shift;
1404
Michael Niedermayer08dce7b2002-07-10 20:05:421405 code = get_vlc2(&s->gb, v2_mv_vlc.table, V2_MV_VLC_BITS, 2);
Michael Niedermayer287229e2002-06-02 12:22:301406// printf("MV code %d at %d %d pred: %d\n", code, s->mb_x,s->mb_y, pred);
Michael Niedermayer84afee32002-04-05 04:09:041407 if (code < 0)
1408 return 0xffff;
1409
1410 if (code == 0)
1411 return pred;
1412 sign = get_bits1(&s->gb);
1413 shift = f_code - 1;
BERO05858882003-05-14 01:08:021414 val = code;
1415 if (shift) {
1416 val = (val - 1) << shift;
Michael Niedermayer84afee32002-04-05 04:09:041417 val |= get_bits(&s->gb, shift);
BERO05858882003-05-14 01:08:021418 val++;
1419 }
Michael Niedermayer84afee32002-04-05 04:09:041420 if (sign)
1421 val = -val;
Michael Niedermayer84afee32002-04-05 04:09:041422
Michael Niedermayer287229e2002-06-02 12:22:301423 val += pred;
Michael Niedermayer84afee32002-04-05 04:09:041424 if (val <= -64)
1425 val += 64;
1426 else if (val >= 64)
1427 val -= 64;
1428
1429 return val;
1430}
1431
Michael Niedermayer4d2858d2002-10-13 13:16:041432static int msmpeg4v12_decode_mb(MpegEncContext *s, DCTELEM block[6][64])
Michael Niedermayer84afee32002-04-05 04:09:041433{
1434 int cbp, code, i;
Diego Biurrun115329f2005-12-17 18:14:381435
Michael Niedermayer84afee32002-04-05 04:09:041436 if (s->pict_type == P_TYPE) {
1437 if (s->use_skip_mb_code) {
1438 if (get_bits1(&s->gb)) {
1439 /* skip mb */
1440 s->mb_intra = 0;
1441 for(i=0;i<6;i++)
1442 s->block_last_index[i] = -1;
1443 s->mv_dir = MV_DIR_FORWARD;
1444 s->mv_type = MV_TYPE_16X16;
1445 s->mv[0][0][0] = 0;
1446 s->mv[0][0][1] = 0;
Mike Melanson160d6792005-04-24 17:21:111447 s->mb_skipped = 1;
Michael Niedermayer84afee32002-04-05 04:09:041448 return 0;
1449 }
1450 }
1451
Michael Niedermayer287229e2002-06-02 12:22:301452 if(s->msmpeg4_version==2)
Michael Niedermayer08dce7b2002-07-10 20:05:421453 code = get_vlc2(&s->gb, v2_mb_type_vlc.table, V2_MB_TYPE_VLC_BITS, 1);
Michael Niedermayer287229e2002-06-02 12:22:301454 else
Michael Niedermayer08dce7b2002-07-10 20:05:421455 code = get_vlc2(&s->gb, v1_inter_cbpc_vlc.table, V1_INTER_CBPC_VLC_BITS, 3);
Michael Niedermayer287229e2002-06-02 12:22:301456 if(code<0 || code>7){
Michel Bardiaux9b879562003-11-03 13:26:221457 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:301458 return -1;
1459 }
1460
Michael Niedermayer84afee32002-04-05 04:09:041461 s->mb_intra = code >>2;
Diego Biurrun115329f2005-12-17 18:14:381462
Michael Niedermayer84afee32002-04-05 04:09:041463 cbp = code & 0x3;
1464 } else {
1465 s->mb_intra = 1;
Michael Niedermayer287229e2002-06-02 12:22:301466 if(s->msmpeg4_version==2)
Michael Niedermayer08dce7b2002-07-10 20:05:421467 cbp= get_vlc2(&s->gb, v2_intra_cbpc_vlc.table, V2_INTRA_CBPC_VLC_BITS, 1);
Michael Niedermayer287229e2002-06-02 12:22:301468 else
Michael Niedermayer08dce7b2002-07-10 20:05:421469 cbp= get_vlc2(&s->gb, v1_intra_cbpc_vlc.table, V1_INTRA_CBPC_VLC_BITS, 1);
Michael Niedermayer287229e2002-06-02 12:22:301470 if(cbp<0 || cbp>3){
Michel Bardiaux9b879562003-11-03 13:26:221471 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:301472 return -1;
1473 }
Michael Niedermayer84afee32002-04-05 04:09:041474 }
1475
1476 if (!s->mb_intra) {
Michael Niedermayer287229e2002-06-02 12:22:301477 int mx, my, cbpy;
Diego Biurrun115329f2005-12-17 18:14:381478
Michael Niedermayer08dce7b2002-07-10 20:05:421479 cbpy= get_vlc2(&s->gb, cbpy_vlc.table, CBPY_VLC_BITS, 1);
Michael Niedermayer287229e2002-06-02 12:22:301480 if(cbpy<0){
Michel Bardiaux9b879562003-11-03 13:26:221481 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:301482 return -1;
1483 }
Michael Niedermayer84afee32002-04-05 04:09:041484
Michael Niedermayer287229e2002-06-02 12:22:301485 cbp|= cbpy<<2;
1486 if(s->msmpeg4_version==1 || (cbp&3) != 3) cbp^= 0x3C;
Diego Biurrun115329f2005-12-17 18:14:381487
Michael Niedermayer137c8462004-04-16 01:01:451488 h263_pred_motion(s, 0, 0, &mx, &my);
Michael Niedermayer84afee32002-04-05 04:09:041489 mx= msmpeg4v2_decode_motion(s, mx, 1);
1490 my= msmpeg4v2_decode_motion(s, my, 1);
Diego Biurrun115329f2005-12-17 18:14:381491
Michael Niedermayer84afee32002-04-05 04:09:041492 s->mv_dir = MV_DIR_FORWARD;
1493 s->mv_type = MV_TYPE_16X16;
1494 s->mv[0][0][0] = mx;
1495 s->mv[0][0][1] = my;
1496 } else {
Michael Niedermayer287229e2002-06-02 12:22:301497 if(s->msmpeg4_version==2){
1498 s->ac_pred = get_bits1(&s->gb);
Michael Niedermayer08dce7b2002-07-10 20:05:421499 cbp|= get_vlc2(&s->gb, cbpy_vlc.table, CBPY_VLC_BITS, 1)<<2; //FIXME check errors
Michael Niedermayer287229e2002-06-02 12:22:301500 } else{
1501 s->ac_pred = 0;
Michael Niedermayer08dce7b2002-07-10 20:05:421502 cbp|= get_vlc2(&s->gb, cbpy_vlc.table, CBPY_VLC_BITS, 1)<<2; //FIXME check errors
Michael Niedermayer287229e2002-06-02 12:22:301503 if(s->pict_type==P_TYPE) cbp^=0x3C;
1504 }
Michael Niedermayer84afee32002-04-05 04:09:041505 }
1506
Michael Niedermayerdee6dde2005-04-25 00:57:481507 s->dsp.clear_blocks(s->block[0]);
Michael Niedermayer84afee32002-04-05 04:09:041508 for (i = 0; i < 6; i++) {
Michael Niedermayer1457ab52002-12-27 23:51:461509 if (msmpeg4_decode_block(s, block[i], i, (cbp >> (5 - i)) & 1, NULL) < 0)
Diego Biurrunbb270c02005-12-22 01:10:111510 {
Michel Bardiaux9b879562003-11-03 13:26:221511 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:041512 return -1;
Diego Biurrunbb270c02005-12-22 01:10:111513 }
Michael Niedermayer84afee32002-04-05 04:09:041514 }
1515 return 0;
1516}
1517
Michael Niedermayer4d2858d2002-10-13 13:16:041518static int msmpeg4v34_decode_mb(MpegEncContext *s, DCTELEM block[6][64])
Fabrice Bellardde6d9b62001-07-22 14:18:561519{
1520 int cbp, code, i;
Zdenek Kabelac0c1a9ed2003-02-11 16:35:481521 uint8_t *coded_val;
Michael Niedermayer7bc90902003-04-10 13:18:381522 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:561523
1524 if (s->pict_type == P_TYPE) {
Fabrice Bellardde6d9b62001-07-22 14:18:561525 if (s->use_skip_mb_code) {
Arpi612476e2001-08-04 00:46:501526 if (get_bits1(&s->gb)) {
Fabrice Bellardde6d9b62001-07-22 14:18:561527 /* skip mb */
1528 s->mb_intra = 0;
1529 for(i=0;i<6;i++)
1530 s->block_last_index[i] = -1;
1531 s->mv_dir = MV_DIR_FORWARD;
1532 s->mv_type = MV_TYPE_16X16;
1533 s->mv[0][0][0] = 0;
1534 s->mv[0][0][1] = 0;
Mike Melanson160d6792005-04-24 17:21:111535 s->mb_skipped = 1;
Michael Niedermayer7bc90902003-04-10 13:18:381536 *mb_type_ptr = MB_TYPE_SKIP | MB_TYPE_L0 | MB_TYPE_16x16;
1537
Fabrice Bellardde6d9b62001-07-22 14:18:561538 return 0;
1539 }
1540 }
Diego Biurrun115329f2005-12-17 18:14:381541
Michael Niedermayer1457ab52002-12-27 23:51:461542 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:561543 if (code < 0)
1544 return -1;
Diego Biurrunbb270c02005-12-22 01:10:111545 //s->mb_intra = (code & 0x40) ? 0 : 1;
1546 s->mb_intra = (~code & 0x40) >> 6;
Diego Biurrun115329f2005-12-17 18:14:381547
Fabrice Bellardde6d9b62001-07-22 14:18:561548 cbp = code & 0x3f;
1549 } else {
Fabrice Bellardde6d9b62001-07-22 14:18:561550 s->mb_intra = 1;
anonymous0d33db82005-01-30 16:34:571551 code = get_vlc2(&s->gb, ff_msmp4_mb_i_vlc.table, MB_INTRA_VLC_BITS, 2);
Fabrice Bellardde6d9b62001-07-22 14:18:561552 if (code < 0)
1553 return -1;
1554 /* predict coded block pattern */
1555 cbp = 0;
1556 for(i=0;i<6;i++) {
Zdenek Kabelac38d171e2002-02-18 09:34:541557 int val = ((code >> (5 - i)) & 1);
Fabrice Bellardde6d9b62001-07-22 14:18:561558 if (i < 4) {
Zdenek Kabelac38d171e2002-02-18 09:34:541559 int pred = coded_block_pred(s, i, &coded_val);
Fabrice Bellardde6d9b62001-07-22 14:18:561560 val = val ^ pred;
1561 *coded_val = val;
1562 }
1563 cbp |= val << (5 - i);
1564 }
1565 }
1566
1567 if (!s->mb_intra) {
1568 int mx, my;
Michael Niedermayerf5957f32002-06-18 00:49:001569//printf("P at %d %d\n", s->mb_x, s->mb_y);
1570 if(s->per_mb_rl_table && cbp){
1571 s->rl_table_index = decode012(&s->gb);
1572 s->rl_chroma_table_index = s->rl_table_index;
1573 }
Michael Niedermayer137c8462004-04-16 01:01:451574 h263_pred_motion(s, 0, 0, &mx, &my);
Fabrice Bellardde6d9b62001-07-22 14:18:561575 if (msmpeg4_decode_motion(s, &mx, &my) < 0)
1576 return -1;
1577 s->mv_dir = MV_DIR_FORWARD;
1578 s->mv_type = MV_TYPE_16X16;
1579 s->mv[0][0][0] = mx;
1580 s->mv[0][0][1] = my;
Michael Niedermayer7bc90902003-04-10 13:18:381581 *mb_type_ptr = MB_TYPE_L0 | MB_TYPE_16x16;
Fabrice Bellardde6d9b62001-07-22 14:18:561582 } else {
Michael Niedermayerf5957f32002-06-18 00:49:001583//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:501584 s->ac_pred = get_bits1(&s->gb);
Michael Niedermayer7bc90902003-04-10 13:18:381585 *mb_type_ptr = MB_TYPE_INTRA;
Michael Niedermayerde0f2f42002-07-07 08:34:461586 if(s->inter_intra_pred){
Michael Niedermayer08dce7b2002-07-10 20:05:421587 s->h263_aic_dir= get_vlc2(&s->gb, inter_intra_vlc.table, INTER_INTRA_VLC_BITS, 1);
Michael Niedermayerde0f2f42002-07-07 08:34:461588// printf("%d%d %d %d/", s->ac_pred, s->h263_aic_dir, s->mb_x, s->mb_y);
1589 }
Michael Niedermayerf5957f32002-06-18 00:49:001590 if(s->per_mb_rl_table && cbp){
1591 s->rl_table_index = decode012(&s->gb);
1592 s->rl_chroma_table_index = s->rl_table_index;
1593 }
Fabrice Bellardde6d9b62001-07-22 14:18:561594 }
1595
Michael Niedermayerdee6dde2005-04-25 00:57:481596 s->dsp.clear_blocks(s->block[0]);
Fabrice Bellardde6d9b62001-07-22 14:18:561597 for (i = 0; i < 6; i++) {
Michael Niedermayer1457ab52002-12-27 23:51:461598 if (msmpeg4_decode_block(s, block[i], i, (cbp >> (5 - i)) & 1, NULL) < 0)
Diego Biurrunbb270c02005-12-22 01:10:111599 {
1600 av_log(s->avctx, AV_LOG_ERROR, "\nerror while decoding block: %d x %d (%d)\n", s->mb_x, s->mb_y, i);
1601 return -1;
1602 }
Fabrice Bellardde6d9b62001-07-22 14:18:561603 }
Diego Biurrun115329f2005-12-17 18:14:381604
Fabrice Bellardde6d9b62001-07-22 14:18:561605 return 0;
1606}
Michael Niedermayer1a013242002-07-17 09:15:141607//#define ERROR_DETAILS
Michael Niedermayerf5957f32002-06-18 00:49:001608static inline int msmpeg4_decode_block(MpegEncContext * s, DCTELEM * block,
Michael Niedermayer1457ab52002-12-27 23:51:461609 int n, int coded, const uint8_t *scan_table)
Fabrice Bellardde6d9b62001-07-22 14:18:561610{
Michael Niedermayer45a82ed2002-07-13 14:55:121611 int level, i, last, run, run_diff;
Fabrice Bellardde6d9b62001-07-22 14:18:561612 int dc_pred_dir;
1613 RLTable *rl;
Michael Niedermayer45a82ed2002-07-13 14:55:121614 RL_VLC_ELEM *rl_vlc;
Michael Niedermayerbadaf882002-01-13 04:59:371615 int qmul, qadd;
Fabrice Bellardde6d9b62001-07-22 14:18:561616
1617 if (s->mb_intra) {
Michael Niedermayerbadaf882002-01-13 04:59:371618 qmul=1;
1619 qadd=0;
1620
Diego Biurrunbb270c02005-12-22 01:10:111621 /* DC coef */
Fabrice Bellardde6d9b62001-07-22 14:18:561622 level = msmpeg4_decode_dc(s, n, &dc_pred_dir);
Diego Biurrun115329f2005-12-17 18:14:381623
Michael Niedermayer287229e2002-06-02 12:22:301624 if (level < 0){
Michel Bardiaux9b879562003-11-03 13:26:221625 av_log(s->avctx, AV_LOG_ERROR, "dc overflow- block: %d qscale: %d//\n", n, s->qscale);
Michael Niedermayerde0f2f42002-07-07 08:34:461626 if(s->inter_intra_pred) level=0;
1627 else return -1;
Michael Niedermayer287229e2002-06-02 12:22:301628 }
Fabrice Bellardde6d9b62001-07-22 14:18:561629 if (n < 4) {
1630 rl = &rl_table[s->rl_table_index];
Michael Niedermayer287229e2002-06-02 12:22:301631 if(level > 256*s->y_dc_scale){
Michel Bardiaux9b879562003-11-03 13:26:221632 av_log(s->avctx, AV_LOG_ERROR, "dc overflow+ L qscale: %d//\n", s->qscale);
Michael Niedermayerde0f2f42002-07-07 08:34:461633 if(!s->inter_intra_pred) return -1;
Michael Niedermayer287229e2002-06-02 12:22:301634 }
Fabrice Bellardde6d9b62001-07-22 14:18:561635 } else {
1636 rl = &rl_table[3 + s->rl_chroma_table_index];
Michael Niedermayer287229e2002-06-02 12:22:301637 if(level > 256*s->c_dc_scale){
Michel Bardiaux9b879562003-11-03 13:26:221638 av_log(s->avctx, AV_LOG_ERROR, "dc overflow+ C qscale: %d//\n", s->qscale);
Michael Niedermayerde0f2f42002-07-07 08:34:461639 if(!s->inter_intra_pred) return -1;
Michael Niedermayer287229e2002-06-02 12:22:301640 }
Fabrice Bellardde6d9b62001-07-22 14:18:561641 }
Michael Niedermayer287229e2002-06-02 12:22:301642 block[0] = level;
Michael Niedermayerbadaf882002-01-13 04:59:371643
Fabrice Bellardde6d9b62001-07-22 14:18:561644 run_diff = 0;
Michael Niedermayer45a82ed2002-07-13 14:55:121645 i = 0;
Fabrice Bellardde6d9b62001-07-22 14:18:561646 if (!coded) {
1647 goto not_coded;
1648 }
1649 if (s->ac_pred) {
Diego Biurrun115329f2005-12-17 18:14:381650 if (dc_pred_dir == 0)
Michael Niedermayer2ad15162002-09-29 22:44:221651 scan_table = s->intra_v_scantable.permutated; /* left */
Fabrice Bellardde6d9b62001-07-22 14:18:561652 else
Michael Niedermayer2ad15162002-09-29 22:44:221653 scan_table = s->intra_h_scantable.permutated; /* top */
Fabrice Bellardde6d9b62001-07-22 14:18:561654 } else {
Michael Niedermayer2ad15162002-09-29 22:44:221655 scan_table = s->intra_scantable.permutated;
Fabrice Bellardde6d9b62001-07-22 14:18:561656 }
Michael Niedermayer45a82ed2002-07-13 14:55:121657 rl_vlc= rl->rl_vlc[0];
Fabrice Bellardde6d9b62001-07-22 14:18:561658 } else {
Michael Niedermayerbadaf882002-01-13 04:59:371659 qmul = s->qscale << 1;
1660 qadd = (s->qscale - 1) | 1;
Michael Niedermayer45a82ed2002-07-13 14:55:121661 i = -1;
Fabrice Bellardde6d9b62001-07-22 14:18:561662 rl = &rl_table[3 + s->rl_table_index];
Michael Niedermayer84afee32002-04-05 04:09:041663
1664 if(s->msmpeg4_version==2)
1665 run_diff = 0;
1666 else
1667 run_diff = 1;
1668
Fabrice Bellardde6d9b62001-07-22 14:18:561669 if (!coded) {
Michael Niedermayer45a82ed2002-07-13 14:55:121670 s->block_last_index[n] = i;
Fabrice Bellardde6d9b62001-07-22 14:18:561671 return 0;
1672 }
Michael Niedermayer1457ab52002-12-27 23:51:461673 if(!scan_table)
1674 scan_table = s->inter_scantable.permutated;
Michael Niedermayer45a82ed2002-07-13 14:55:121675 rl_vlc= rl->rl_vlc[s->qscale];
Fabrice Bellardde6d9b62001-07-22 14:18:561676 }
Michael Niedermayer45a82ed2002-07-13 14:55:121677 {
1678 OPEN_READER(re, &s->gb);
Fabrice Bellardde6d9b62001-07-22 14:18:561679 for(;;) {
Michael Niedermayer45a82ed2002-07-13 14:55:121680 UPDATE_CACHE(re, &s->gb);
Michael Niedermayere91f4bf2005-04-18 20:07:481681 GET_RL_VLC(level, run, re, &s->gb, rl_vlc, TEX_VLC_BITS, 2, 0);
Michael Niedermayer45a82ed2002-07-13 14:55:121682 if (level==0) {
1683 int cache;
1684 cache= GET_CACHE(re, &s->gb);
Fabrice Bellardde6d9b62001-07-22 14:18:561685 /* escape */
Michael Niedermayer45a82ed2002-07-13 14:55:121686 if (s->msmpeg4_version==1 || (cache&0x80000000)==0) {
1687 if (s->msmpeg4_version==1 || (cache&0x40000000)==0) {
Fabrice Bellardde6d9b62001-07-22 14:18:561688 /* third escape */
Michael Niedermayer45a82ed2002-07-13 14:55:121689 if(s->msmpeg4_version!=1) LAST_SKIP_BITS(re, &s->gb, 2);
1690 UPDATE_CACHE(re, &s->gb);
Michael Niedermayerf5957f32002-06-18 00:49:001691 if(s->msmpeg4_version<=3){
Michael Niedermayer45a82ed2002-07-13 14:55:121692 last= SHOW_UBITS(re, &s->gb, 1); SKIP_CACHE(re, &s->gb, 1);
1693 run= SHOW_UBITS(re, &s->gb, 6); SKIP_CACHE(re, &s->gb, 6);
1694 level= SHOW_SBITS(re, &s->gb, 8); LAST_SKIP_CACHE(re, &s->gb, 8);
1695 SKIP_COUNTER(re, &s->gb, 1+6+8);
Diego Biurrun115329f2005-12-17 18:14:381696 }else{
Michael Niedermayerf5957f32002-06-18 00:49:001697 int sign;
Michael Niedermayer45a82ed2002-07-13 14:55:121698 last= SHOW_UBITS(re, &s->gb, 1); SKIP_BITS(re, &s->gb, 1);
Michael Niedermayerf5957f32002-06-18 00:49:001699 if(!s->esc3_level_length){
1700 int ll;
1701 //printf("ESC-3 %X at %d %d\n", show_bits(&s->gb, 24), s->mb_x, s->mb_y);
1702 if(s->qscale<8){
Michael Niedermayer45a82ed2002-07-13 14:55:121703 ll= SHOW_UBITS(re, &s->gb, 3); SKIP_BITS(re, &s->gb, 3);
Michael Niedermayerf5957f32002-06-18 00:49:001704 if(ll==0){
Michel Bardiaux9b879562003-11-03 13:26:221705 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:121706 SKIP_BITS(re, &s->gb, 1);
Michael Niedermayerf5957f32002-06-18 00:49:001707 ll=8;
1708 }
1709 }else{
1710 ll=2;
Michael Niedermayer45a82ed2002-07-13 14:55:121711 while(ll<8 && SHOW_UBITS(re, &s->gb, 1)==0){
1712 ll++;
1713 SKIP_BITS(re, &s->gb, 1);
1714 }
Michael Niedermayer05174fd2002-07-22 08:15:271715 if(ll<8) SKIP_BITS(re, &s->gb, 1);
Michael Niedermayerf5957f32002-06-18 00:49:001716 }
1717
1718 s->esc3_level_length= ll;
Michael Niedermayer45a82ed2002-07-13 14:55:121719 s->esc3_run_length= SHOW_UBITS(re, &s->gb, 2) + 3; SKIP_BITS(re, &s->gb, 2);
Michael Niedermayerf5957f32002-06-18 00:49:001720//printf("level length:%d, run length: %d\n", ll, s->esc3_run_length);
Michael Niedermayer05174fd2002-07-22 08:15:271721 UPDATE_CACHE(re, &s->gb);
Michael Niedermayerf5957f32002-06-18 00:49:001722 }
Diego Biurrun115329f2005-12-17 18:14:381723 run= SHOW_UBITS(re, &s->gb, s->esc3_run_length);
Michael Niedermayer45a82ed2002-07-13 14:55:121724 SKIP_BITS(re, &s->gb, s->esc3_run_length);
Diego Biurrun115329f2005-12-17 18:14:381725
1726 sign= SHOW_UBITS(re, &s->gb, 1);
Michael Niedermayer45a82ed2002-07-13 14:55:121727 SKIP_BITS(re, &s->gb, 1);
Diego Biurrun115329f2005-12-17 18:14:381728
1729 level= SHOW_UBITS(re, &s->gb, s->esc3_level_length);
Michael Niedermayer45a82ed2002-07-13 14:55:121730 SKIP_BITS(re, &s->gb, s->esc3_level_length);
Michael Niedermayerf5957f32002-06-18 00:49:001731 if(sign) level= -level;
1732 }
1733//printf("level: %d, run: %d at %d %d\n", level, run, s->mb_x, s->mb_y);
Michael Niedermayer287229e2002-06-02 12:22:301734#if 0 // waste of time / this will detect very few errors
1735 {
Diego Biurrunc26abfa2006-10-11 23:17:581736 const int abs_level= FFABS(level);
Michael Niedermayer287229e2002-06-02 12:22:301737 const int run1= run - rl->max_run[last][abs_level] - run_diff;
1738 if(abs_level<=MAX_LEVEL && run<=MAX_RUN){
1739 if(abs_level <= rl->max_level[last][run]){
Steve L'Homme267f7ed2006-03-08 11:43:101740 av_log(s->avctx, AV_LOG_ERROR, "illegal 3. esc, vlc encoding possible\n");
Michael Niedermayer287229e2002-06-02 12:22:301741 return DECODING_AC_LOST;
1742 }
1743 if(abs_level <= rl->max_level[last][run]*2){
Steve L'Homme267f7ed2006-03-08 11:43:101744 av_log(s->avctx, AV_LOG_ERROR, "illegal 3. esc, esc 1 encoding possible\n");
Michael Niedermayer287229e2002-06-02 12:22:301745 return DECODING_AC_LOST;
1746 }
Michael Niedermayerf5957f32002-06-18 00:49:001747 if(run1>=0 && abs_level <= rl->max_level[last][run1]){
Steve L'Homme267f7ed2006-03-08 11:43:101748 av_log(s->avctx, AV_LOG_ERROR, "illegal 3. esc, esc 2 encoding possible\n");
Michael Niedermayer287229e2002-06-02 12:22:301749 return DECODING_AC_LOST;
1750 }
1751 }
1752 }
1753#endif
Diego Biurrunbb270c02005-12-22 01:10:111754 //level = level * qmul + (level>0) * qadd - (level<=0) * qadd ;
1755 if (level>0) level= level * qmul + qadd;
Michael Niedermayer287229e2002-06-02 12:22:301756 else level= level * qmul - qadd;
1757#if 0 // waste of time too :(
1758 if(level>2048 || level<-2048){
Steve L'Homme267f7ed2006-03-08 11:43:101759 av_log(s->avctx, AV_LOG_ERROR, "|level| overflow in 3. esc\n");
Michael Niedermayer287229e2002-06-02 12:22:301760 return DECODING_AC_LOST;
1761 }
1762#endif
Michael Niedermayer45a82ed2002-07-13 14:55:121763 i+= run + 1;
1764 if(last) i+=192;
Michael Niedermayer1a013242002-07-17 09:15:141765#ifdef ERROR_DETAILS
1766 if(run==66)
Michael Niedermayer95ae72b2005-08-26 19:05:441767 av_log(s->avctx, AV_LOG_ERROR, "illegal vlc code in ESC3 level=%d\n", level);
Michael Niedermayer1a013242002-07-17 09:15:141768 else if((i>62 && i<192) || i>192+63)
Michael Niedermayer95ae72b2005-08-26 19:05:441769 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:141770#endif
Fabrice Bellardde6d9b62001-07-22 14:18:561771 } else {
1772 /* second escape */
Michael Niedermayer45a82ed2002-07-13 14:55:121773#if MIN_CACHE_BITS < 23
1774 LAST_SKIP_BITS(re, &s->gb, 2);
1775 UPDATE_CACHE(re, &s->gb);
1776#else
1777 SKIP_BITS(re, &s->gb, 2);
1778#endif
Michael Niedermayere91f4bf2005-04-18 20:07:481779 GET_RL_VLC(level, run, re, &s->gb, rl_vlc, TEX_VLC_BITS, 2, 1);
Michael Niedermayer45a82ed2002-07-13 14:55:121780 i+= run + rl->max_run[run>>7][level/qmul] + run_diff; //FIXME opt indexing
1781 level = (level ^ SHOW_SBITS(re, &s->gb, 1)) - SHOW_SBITS(re, &s->gb, 1);
1782 LAST_SKIP_BITS(re, &s->gb, 1);
Michael Niedermayer1a013242002-07-17 09:15:141783#ifdef ERROR_DETAILS
1784 if(run==66)
Michael Niedermayer95ae72b2005-08-26 19:05:441785 av_log(s->avctx, AV_LOG_ERROR, "illegal vlc code in ESC2 level=%d\n", level);
Michael Niedermayer1a013242002-07-17 09:15:141786 else if((i>62 && i<192) || i>192+63)
Michael Niedermayer95ae72b2005-08-26 19:05:441787 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:141788#endif
Fabrice Bellardde6d9b62001-07-22 14:18:561789 }
1790 } else {
1791 /* first escape */
Michael Niedermayer45a82ed2002-07-13 14:55:121792#if MIN_CACHE_BITS < 22
1793 LAST_SKIP_BITS(re, &s->gb, 1);
1794 UPDATE_CACHE(re, &s->gb);
1795#else
1796 SKIP_BITS(re, &s->gb, 1);
1797#endif
Michael Niedermayere91f4bf2005-04-18 20:07:481798 GET_RL_VLC(level, run, re, &s->gb, rl_vlc, TEX_VLC_BITS, 2, 1);
Michael Niedermayer45a82ed2002-07-13 14:55:121799 i+= run;
1800 level = level + rl->max_level[run>>7][(run-1)&63] * qmul;//FIXME opt indexing
1801 level = (level ^ SHOW_SBITS(re, &s->gb, 1)) - SHOW_SBITS(re, &s->gb, 1);
1802 LAST_SKIP_BITS(re, &s->gb, 1);
Michael Niedermayer1a013242002-07-17 09:15:141803#ifdef ERROR_DETAILS
1804 if(run==66)
Michael Niedermayer95ae72b2005-08-26 19:05:441805 av_log(s->avctx, AV_LOG_ERROR, "illegal vlc code in ESC1 level=%d\n", level);
Michael Niedermayer1a013242002-07-17 09:15:141806 else if((i>62 && i<192) || i>192+63)
Michael Niedermayer95ae72b2005-08-26 19:05:441807 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:141808#endif
Fabrice Bellardde6d9b62001-07-22 14:18:561809 }
1810 } else {
Michael Niedermayer45a82ed2002-07-13 14:55:121811 i+= run;
1812 level = (level ^ SHOW_SBITS(re, &s->gb, 1)) - SHOW_SBITS(re, &s->gb, 1);
1813 LAST_SKIP_BITS(re, &s->gb, 1);
Michael Niedermayer1a013242002-07-17 09:15:141814#ifdef ERROR_DETAILS
1815 if(run==66)
Michael Niedermayer95ae72b2005-08-26 19:05:441816 av_log(s->avctx, AV_LOG_ERROR, "illegal vlc code level=%d\n", level);
Michael Niedermayer1a013242002-07-17 09:15:141817 else if((i>62 && i<192) || i>192+63)
Michael Niedermayer95ae72b2005-08-26 19:05:441818 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:141819#endif
Fabrice Bellardde6d9b62001-07-22 14:18:561820 }
Michael Niedermayer45a82ed2002-07-13 14:55:121821 if (i > 62){
1822 i-= 192;
1823 if(i&(~63)){
Michael Niedermayer68f593b2003-01-21 17:34:121824 const int left= s->gb.size_in_bits - get_bits_count(&s->gb);
Michael Niedermayer4d2858d2002-10-13 13:16:041825 if(((i+192 == 64 && level/qmul==-1) || s->error_resilience<=1) && left>=0){
Michel Bardiaux9b879562003-11-03 13:26:221826 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:141827 break;
1828 }else{
Michel Bardiaux9b879562003-11-03 13:26:221829 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:141830 return -1;
1831 }
Michael Niedermayer45a82ed2002-07-13 14:55:121832 }
1833
1834 block[scan_table[i]] = level;
1835 break;
Michael Niedermayerf5957f32002-06-18 00:49:001836 }
Michael Niedermayer287229e2002-06-02 12:22:301837
Michael Niedermayer45a82ed2002-07-13 14:55:121838 block[scan_table[i]] = level;
Fabrice Bellardde6d9b62001-07-22 14:18:561839 }
Michael Niedermayer45a82ed2002-07-13 14:55:121840 CLOSE_READER(re, &s->gb);
1841 }
Fabrice Bellardde6d9b62001-07-22 14:18:561842 not_coded:
1843 if (s->mb_intra) {
1844 mpeg4_pred_ac(s, block, n, dc_pred_dir);
1845 if (s->ac_pred) {
Michael Niedermayer45a82ed2002-07-13 14:55:121846 i = 63; /* XXX: not optimal */
Fabrice Bellardde6d9b62001-07-22 14:18:561847 }
1848 }
Michael Niedermayer1457ab52002-12-27 23:51:461849 if(s->msmpeg4_version>=4 && i>0) i=63; //FIXME/XXX optimize
Michael Niedermayer45a82ed2002-07-13 14:55:121850 s->block_last_index[n] = i;
Diego Biurrun115329f2005-12-17 18:14:381851
Fabrice Bellardde6d9b62001-07-22 14:18:561852 return 0;
1853}
1854
1855static int msmpeg4_decode_dc(MpegEncContext * s, int n, int *dir_ptr)
1856{
1857 int level, pred;
Fabrice Bellardde6d9b62001-07-22 14:18:561858
Michael Niedermayer287229e2002-06-02 12:22:301859 if(s->msmpeg4_version<=2){
Michael Niedermayer84afee32002-04-05 04:09:041860 if (n < 4) {
Michael Niedermayer08dce7b2002-07-10 20:05:421861 level = get_vlc2(&s->gb, v2_dc_lum_vlc.table, DC_VLC_BITS, 3);
Michael Niedermayer84afee32002-04-05 04:09:041862 } else {
Michael Niedermayer08dce7b2002-07-10 20:05:421863 level = get_vlc2(&s->gb, v2_dc_chroma_vlc.table, DC_VLC_BITS, 3);
Michael Niedermayer84afee32002-04-05 04:09:041864 }
Diego Biurrun115329f2005-12-17 18:14:381865 if (level < 0)
Michael Niedermayer84afee32002-04-05 04:09:041866 return -1;
Michael Niedermayer84afee32002-04-05 04:09:041867 level-=256;
1868 }else{ //FIXME optimize use unified tables & index
1869 if (n < 4) {
anonymous0d33db82005-01-30 16:34:571870 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:041871 } else {
anonymous0d33db82005-01-30 16:34:571872 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:041873 }
Michael Niedermayer287229e2002-06-02 12:22:301874 if (level < 0){
Michel Bardiaux9b879562003-11-03 13:26:221875 av_log(s->avctx, AV_LOG_ERROR, "illegal dc vlc\n");
Michael Niedermayer84afee32002-04-05 04:09:041876 return -1;
Michael Niedermayer287229e2002-06-02 12:22:301877 }
Michael Niedermayer84afee32002-04-05 04:09:041878
1879 if (level == DC_MAX) {
1880 level = get_bits(&s->gb, 8);
1881 if (get_bits1(&s->gb))
1882 level = -level;
1883 } else if (level != 0) {
1884 if (get_bits1(&s->gb))
1885 level = -level;
1886 }
Fabrice Bellardde6d9b62001-07-22 14:18:561887 }
1888
Michael Niedermayer287229e2002-06-02 12:22:301889 if(s->msmpeg4_version==1){
Zdenek Kabelac0c1a9ed2003-02-11 16:35:481890 int32_t *dc_val;
Michael Niedermayer287229e2002-06-02 12:22:301891 pred = msmpeg4v1_pred_dc(s, n, &dc_val);
1892 level += pred;
Diego Biurrun115329f2005-12-17 18:14:381893
Michael Niedermayer287229e2002-06-02 12:22:301894 /* update predictor */
1895 *dc_val= level;
1896 }else{
Måns Rullgårdb86216d2006-09-27 22:13:441897 int16_t *dc_val;
Michael Niedermayerbd5e1c72002-06-22 15:52:251898 pred = msmpeg4_pred_dc(s, n, &dc_val, dir_ptr);
Michael Niedermayer287229e2002-06-02 12:22:301899 level += pred;
Fabrice Bellardde6d9b62001-07-22 14:18:561900
Michael Niedermayer287229e2002-06-02 12:22:301901 /* update predictor */
1902 if (n < 4) {
1903 *dc_val = level * s->y_dc_scale;
1904 } else {
1905 *dc_val = level * s->c_dc_scale;
1906 }
Fabrice Bellardde6d9b62001-07-22 14:18:561907 }
1908
1909 return level;
1910}
1911
Diego Biurrun115329f2005-12-17 18:14:381912static int msmpeg4_decode_motion(MpegEncContext * s,
Fabrice Bellardde6d9b62001-07-22 14:18:561913 int *mx_ptr, int *my_ptr)
1914{
1915 MVTable *mv;
1916 int code, mx, my;
1917
1918 mv = &mv_tables[s->mv_table_index];
1919
Michael Niedermayer08dce7b2002-07-10 20:05:421920 code = get_vlc2(&s->gb, mv->vlc.table, MV_VLC_BITS, 2);
Michael Niedermayerf5957f32002-06-18 00:49:001921 if (code < 0){
Michel Bardiaux9b879562003-11-03 13:26:221922 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:561923 return -1;
Michael Niedermayerf5957f32002-06-18 00:49:001924 }
Fabrice Bellardde6d9b62001-07-22 14:18:561925 if (code == mv->n) {
Michael Niedermayerf5957f32002-06-18 00:49:001926//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:561927 mx = get_bits(&s->gb, 6);
1928 my = get_bits(&s->gb, 6);
1929 } else {
1930 mx = mv->table_mvx[code];
1931 my = mv->table_mvy[code];
1932 }
1933
1934 mx += *mx_ptr - 32;
1935 my += *my_ptr - 32;
1936 /* WARNING : they do not do exactly modulo encoding */
1937 if (mx <= -64)
1938 mx += 64;
1939 else if (mx >= 64)
1940 mx -= 64;
1941
1942 if (my <= -64)
1943 my += 64;
1944 else if (my >= 64)
1945 my -= 64;
1946 *mx_ptr = mx;
1947 *my_ptr = my;
1948 return 0;
1949}
Michael Niedermayer1457ab52002-12-27 23:51:461950
1951/* cleanest way to support it
1952 * there is too much shared between versions so that we cant have 1 file per version & 1 common
Diego Biurrun115329f2005-12-17 18:14:381953 * as allmost everything would be in the common file
Michael Niedermayer1457ab52002-12-27 23:51:461954 */
1955#include "wmv2.c"