blob: 8ca17c99d8f20dfb749f624ff1888d80fdd52e79 [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 Biurrun7b941772007-07-05 10:37:296 * msmpeg4v1 & v2 stuff by Michael Niedermayer <[email protected]>
7 *
Diego Biurrunb78e7192006-10-07 15:30:468 * This file is part of FFmpeg.
9 *
10 * FFmpeg is free software; you can redistribute it and/or
Fabrice Bellardff4ec492002-05-25 22:45:3311 * modify it under the terms of the GNU Lesser General Public
12 * License as published by the Free Software Foundation; either
Diego Biurrunb78e7192006-10-07 15:30:4613 * version 2.1 of the License, or (at your option) any later version.
Fabrice Bellardde6d9b62001-07-22 14:18:5614 *
Diego Biurrunb78e7192006-10-07 15:30:4615 * FFmpeg is distributed in the hope that it will be useful,
Fabrice Bellardde6d9b62001-07-22 14:18:5616 * but WITHOUT ANY WARRANTY; without even the implied warranty of
Fabrice Bellardff4ec492002-05-25 22:45:3317 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
18 * Lesser General Public License for more details.
Fabrice Bellardde6d9b62001-07-22 14:18:5619 *
Fabrice Bellardff4ec492002-05-25 22:45:3320 * You should have received a copy of the GNU Lesser General Public
Diego Biurrunb78e7192006-10-07 15:30:4621 * License along with FFmpeg; if not, write to the Free Software
Diego Biurrun5509bff2006-01-12 22:43:2622 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
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"
Aurelien Jacobscc6de102007-11-07 23:41:3933#include "msmpeg4.h"
Michael Niedermayer92ba5ff2002-05-21 23:13:5734
Fabrice Bellardde6d9b62001-07-22 14:18:5635/*
Diego Biurrun115329f2005-12-17 18:14:3836 * You can also call this codec : MPEG4 with a twist !
Fabrice Bellardde6d9b62001-07-22 14:18:5637 *
Diego Biurrun115329f2005-12-17 18:14:3838 * TODO:
Fabrice Bellardde6d9b62001-07-22 14:18:5639 * - (encoding) select best mv table (two choices)
Diego Biurrun115329f2005-12-17 18:14:3840 * - (encoding) select best vlc/dc table
Fabrice Bellardde6d9b62001-07-22 14:18:5641 */
42//#define DEBUG
43
Michael Niedermayer08dce7b2002-07-10 20:05:4244#define DC_VLC_BITS 9
45#define CBPY_VLC_BITS 6
Michael Niedermayer08dce7b2002-07-10 20:05:4246#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
Michael Niedermayer08dce7b2002-07-10 20:05:4253
Michael Niedermayer05174fd2002-07-22 08:15:2754#define II_BITRATE 128*1024
55#define MBAC_BITRATE 50*1024
56
Michael Niedermayer1457ab52002-12-27 23:51:4657#define DEFAULT_INTER_INDEX 3
58
Zdenek Kabelac0c1a9ed2003-02-11 16:35:4859static uint32_t v2_dc_lum_table[512][2];
60static uint32_t v2_dc_chroma_table[512][2];
Michael Niedermayer84afee32002-04-05 04:09:0461
Fabrice Bellardde6d9b62001-07-22 14:18:5662static int msmpeg4_decode_dc(MpegEncContext * s, int n, int *dir_ptr);
Falk Hüffner20695ec2002-06-03 11:16:1163static void init_h263_dc_for_msmpeg4(void);
Michael Niedermayerde0f2f42002-07-07 08:34:4664static inline void msmpeg4_memsetw(short *tab, int val, int n);
Wolfgang Hesseler76042462003-02-16 23:05:3865#ifdef CONFIG_ENCODERS
Måns Rullgård62bb4892006-09-27 19:54:0766static void msmpeg4v2_encode_motion(MpegEncContext * s, int val);
Michael Niedermayer62959862002-08-09 00:13:5467static int get_size_of_code(MpegEncContext * s, RLTable *rl, int last, int run, int level, int intra);
Wolfgang Hesseler76042462003-02-16 23:05:3868#endif //CONFIG_ENCODERS
Michael Niedermayer4d2858d2002-10-13 13:16:0469static int msmpeg4v12_decode_mb(MpegEncContext *s, DCTELEM block[6][64]);
70static int msmpeg4v34_decode_mb(MpegEncContext *s, DCTELEM block[6][64]);
Fabrice Bellardde6d9b62001-07-22 14:18:5671
Kostya Shishkov10b9c372006-06-27 02:55:5472/* vc1 externs */
Sigbjørn Skjæret9ad56752008-01-14 22:10:1973extern const uint8_t wmv3_dc_scale_table[32];
Michael Niedermayer62959862002-08-09 00:13:5474
Fabrice Bellardde6d9b62001-07-22 14:18:5675#ifdef DEBUG
76int intra_count = 0;
77int frame_count = 0;
78#endif
Fabrice Bellardde6d9b62001-07-22 14:18:5679
80#include "msmpeg4data.h"
Fabrice Bellardde6d9b62001-07-22 14:18:5681
Diego Biurrun90b5b512007-06-12 18:50:5082#ifdef CONFIG_ENCODERS //strangely gcc includes this even if it is not references
Zdenek Kabelac0c1a9ed2003-02-11 16:35:4883static uint8_t rl_length[NB_RL_TABLES][MAX_LEVEL+1][MAX_RUN+1][2];
Michael Niedermayer2a250222003-06-22 11:08:2284#endif //CONFIG_ENCODERS
Michael Niedermayer62959862002-08-09 00:13:5485
Michael Niedermayer3502a542007-03-14 13:19:1986static uint8_t static_rl_table_store[NB_RL_TABLES][2][2*MAX_RUN + MAX_LEVEL + 3];
87
Michael Niedermayerf5957f32002-06-18 00:49:0088static void common_init(MpegEncContext * s)
89{
90 static int inited=0;
Diego Biurrun115329f2005-12-17 18:14:3891
Michael Niedermayerf5957f32002-06-18 00:49:0092 switch(s->msmpeg4_version){
93 case 1:
94 case 2:
95 s->y_dc_scale_table=
96 s->c_dc_scale_table= ff_mpeg1_dc_scale_table;
97 break;
98 case 3:
99 if(s->workaround_bugs){
100 s->y_dc_scale_table= old_ff_y_dc_scale_table;
101 s->c_dc_scale_table= old_ff_c_dc_scale_table;
102 } else{
103 s->y_dc_scale_table= ff_mpeg4_y_dc_scale_table;
104 s->c_dc_scale_table= ff_mpeg4_c_dc_scale_table;
105 }
106 break;
107 case 4:
Michael Niedermayer1457ab52002-12-27 23:51:46108 case 5:
Michael Niedermayerf5957f32002-06-18 00:49:00109 s->y_dc_scale_table= wmv1_y_dc_scale_table;
110 s->c_dc_scale_table= wmv1_c_dc_scale_table;
111 break;
Kostya Shishkov10b9c372006-06-27 02:55:54112#if defined(CONFIG_WMV3_DECODER)||defined(CONFIG_VC1_DECODER)
anonymous0d33db82005-01-30 16:34:57113 case 6:
114 s->y_dc_scale_table= wmv3_dc_scale_table;
115 s->c_dc_scale_table= wmv3_dc_scale_table;
116 break;
Michael Niedermayer8b975b72005-05-02 22:14:42117#endif
anonymous0d33db82005-01-30 16:34:57118
Michael Niedermayerf5957f32002-06-18 00:49:00119 }
120
Diego Biurrun115329f2005-12-17 18:14:38121
Michael Niedermayer1457ab52002-12-27 23:51:46122 if(s->msmpeg4_version>=4){
Michael Niedermayer3d2e8cc2003-05-19 13:30:59123 ff_init_scantable(s->dsp.idct_permutation, &s->intra_scantable , wmv1_scantable[1]);
124 ff_init_scantable(s->dsp.idct_permutation, &s->intra_h_scantable, wmv1_scantable[2]);
125 ff_init_scantable(s->dsp.idct_permutation, &s->intra_v_scantable, wmv1_scantable[3]);
126 ff_init_scantable(s->dsp.idct_permutation, &s->inter_scantable , wmv1_scantable[0]);
Michael Niedermayerf5957f32002-06-18 00:49:00127 }
Michael Niedermayer2ad15162002-09-29 22:44:22128 //Note the default tables are set in common_init in mpegvideo.c
Diego Biurrun115329f2005-12-17 18:14:38129
Michael Niedermayerf5957f32002-06-18 00:49:00130 if(!inited){
Michael Niedermayerf5957f32002-06-18 00:49:00131 inited=1;
132
133 init_h263_dc_for_msmpeg4();
Michael Niedermayerf5957f32002-06-18 00:49:00134 }
135}
136
Wolfgang Hesseler76042462003-02-16 23:05:38137#ifdef CONFIG_ENCODERS
138
Fabrice Bellardde6d9b62001-07-22 14:18:56139/* build the table which associate a (x,y) motion vector to a vlc */
140static void init_mv_table(MVTable *tab)
141{
142 int i, x, y;
143
Zdenek Kabelac0c1a9ed2003-02-11 16:35:48144 tab->table_mv_index = av_malloc(sizeof(uint16_t) * 4096);
Fabrice Bellardde6d9b62001-07-22 14:18:56145 /* mark all entries as not used */
146 for(i=0;i<4096;i++)
147 tab->table_mv_index[i] = tab->n;
Diego Biurrun115329f2005-12-17 18:14:38148
Fabrice Bellardde6d9b62001-07-22 14:18:56149 for(i=0;i<tab->n;i++) {
150 x = tab->table_mvx[i];
151 y = tab->table_mvy[i];
152 tab->table_mv_index[(x << 6) | y] = i;
153 }
154}
155
Aurelien Jacobs85f601e2007-11-07 23:23:35156void ff_msmpeg4_code012(PutBitContext *pb, int n)
Fabrice Bellardde6d9b62001-07-22 14:18:56157{
158 if (n == 0) {
159 put_bits(pb, 1, 0);
160 } else {
161 put_bits(pb, 1, 1);
162 put_bits(pb, 1, (n >= 2));
163 }
164}
165
Michael Niedermayerf5957f32002-06-18 00:49:00166void ff_msmpeg4_encode_init(MpegEncContext *s)
167{
168 static int init_done=0;
169 int i;
170
171 common_init(s);
172 if(s->msmpeg4_version>=4){
173 s->min_qcoeff= -255;
174 s->max_qcoeff= 255;
175 }
176
177 if (!init_done) {
178 /* init various encoding tables */
179 init_done = 1;
180 init_mv_table(&mv_tables[0]);
181 init_mv_table(&mv_tables[1]);
182 for(i=0;i<NB_RL_TABLES;i++)
Michael Niedermayer3502a542007-03-14 13:19:19183 init_rl(&rl_table[i], static_rl_table_store[i]);
Michael Niedermayer62959862002-08-09 00:13:54184
185 for(i=0; i<NB_RL_TABLES; i++){
186 int level;
187 for(level=0; level<=MAX_LEVEL; level++){
188 int run;
189 for(run=0; run<=MAX_RUN; run++){
190 int last;
191 for(last=0; last<2; last++){
Michael Niedermayer060f89b2002-10-27 12:20:58192 rl_length[i][level][run][last]= get_size_of_code(s, &rl_table[ i], last, run, level, 0);
Michael Niedermayer62959862002-08-09 00:13:54193 }
194 }
195 }
196 }
Michael Niedermayerf5957f32002-06-18 00:49:00197 }
198}
199
200static int get_size_of_code(MpegEncContext * s, RLTable *rl, int last, int run, int level, int intra){
201 int size=0;
202 int code;
203 int run_diff= intra ? 0 : 1;
Diego Biurrun115329f2005-12-17 18:14:38204
Michael Niedermayerf5957f32002-06-18 00:49:00205 code = get_rl_index(rl, last, run, level);
206 size+= rl->table_vlc[code][1];
207 if (code == rl->n) {
208 int level1, run1;
209
210 level1 = level - rl->max_level[last][run];
Diego Biurrun115329f2005-12-17 18:14:38211 if (level1 < 1)
Michael Niedermayerf5957f32002-06-18 00:49:00212 goto esc2;
213 code = get_rl_index(rl, last, run, level1);
214 if (code == rl->n) {
215 esc2:
216 size++;
217 if (level > MAX_LEVEL)
218 goto esc3;
219 run1 = run - rl->max_run[last][level] - run_diff;
220 if (run1 < 0)
221 goto esc3;
222 code = get_rl_index(rl, last, run1, level);
223 if (code == rl->n) {
224 esc3:
225 /* third escape */
226 size+=1+1+6+8;
227 } else {
228 /* second escape */
229 size+= 1+1+ rl->table_vlc[code][1];
230 }
231 } else {
232 /* first escape */
233 size+= 1+1+ rl->table_vlc[code][1];
234 }
235 } else {
236 size++;
237 }
238 return size;
239}
240
Denis Fortinc68a1732007-06-21 07:53:48241void ff_find_best_tables(MpegEncContext * s)
Michael Niedermayerf5957f32002-06-18 00:49:00242{
243 int i;
244 int best =-1, best_size =9999999;
245 int chroma_best=-1, best_chroma_size=9999999;
Michael Niedermayer62959862002-08-09 00:13:54246
Michael Niedermayerf5957f32002-06-18 00:49:00247 for(i=0; i<3; i++){
248 int level;
249 int chroma_size=0;
250 int size=0;
251
252 if(i>0){// ;)
Diego Biurrun115329f2005-12-17 18:14:38253 size++;
Michael Niedermayerf5957f32002-06-18 00:49:00254 chroma_size++;
255 }
256 for(level=0; level<=MAX_LEVEL; level++){
257 int run;
258 for(run=0; run<=MAX_RUN; run++){
259 int last;
Michael Niedermayer62959862002-08-09 00:13:54260 const int last_size= size + chroma_size;
Michael Niedermayerf5957f32002-06-18 00:49:00261 for(last=0; last<2; last++){
262 int inter_count = s->ac_stats[0][0][level][run][last] + s->ac_stats[0][1][level][run][last];
263 int intra_luma_count = s->ac_stats[1][0][level][run][last];
264 int intra_chroma_count= s->ac_stats[1][1][level][run][last];
Diego Biurrun115329f2005-12-17 18:14:38265
Michael Niedermayerf5957f32002-06-18 00:49:00266 if(s->pict_type==I_TYPE){
Michael Niedermayer060f89b2002-10-27 12:20:58267 size += intra_luma_count *rl_length[i ][level][run][last];
268 chroma_size+= intra_chroma_count*rl_length[i+3][level][run][last];
Michael Niedermayerf5957f32002-06-18 00:49:00269 }else{
Michael Niedermayer060f89b2002-10-27 12:20:58270 size+= intra_luma_count *rl_length[i ][level][run][last]
271 +intra_chroma_count*rl_length[i+3][level][run][last]
272 +inter_count *rl_length[i+3][level][run][last];
Diego Biurrun115329f2005-12-17 18:14:38273 }
Michael Niedermayerf5957f32002-06-18 00:49:00274 }
Michael Niedermayer62959862002-08-09 00:13:54275 if(last_size == size+chroma_size) break;
Michael Niedermayerf5957f32002-06-18 00:49:00276 }
277 }
278 if(size<best_size){
279 best_size= size;
280 best= i;
281 }
282 if(chroma_size<best_chroma_size){
283 best_chroma_size= chroma_size;
284 chroma_best= i;
285 }
286 }
Michael Niedermayer62959862002-08-09 00:13:54287
Diego Biurrun115329f2005-12-17 18:14:38288// printf("type:%d, best:%d, qp:%d, var:%d, mcvar:%d, size:%d //\n",
Michael Niedermayerf5957f32002-06-18 00:49:00289// s->pict_type, best, s->qscale, s->mb_var_sum, s->mc_mb_var_sum, best_size);
Diego Biurrun115329f2005-12-17 18:14:38290
Michael Niedermayerf5957f32002-06-18 00:49:00291 if(s->pict_type==P_TYPE) chroma_best= best;
292
293 memset(s->ac_stats, 0, sizeof(int)*(MAX_LEVEL+1)*(MAX_RUN+1)*2*2*2);
294
295 s->rl_table_index = best;
296 s->rl_chroma_table_index= chroma_best;
Diego Biurrun115329f2005-12-17 18:14:38297
Michael Niedermayerf5957f32002-06-18 00:49:00298 if(s->pict_type != s->last_non_b_pict_type){
299 s->rl_table_index= 2;
300 if(s->pict_type==I_TYPE)
301 s->rl_chroma_table_index= 1;
302 else
303 s->rl_chroma_table_index= 2;
304 }
305
306}
307
Michael Niedermayer287229e2002-06-02 12:22:30308/* write MSMPEG4 compatible frame header */
Fabrice Bellardde6d9b62001-07-22 14:18:56309void msmpeg4_encode_picture_header(MpegEncContext * s, int picture_number)
310{
Denis Fortinc68a1732007-06-21 07:53:48311 ff_find_best_tables(s);
Fabrice Bellardde6d9b62001-07-22 14:18:56312
313 align_put_bits(&s->pb);
Fabrice Bellardde6d9b62001-07-22 14:18:56314 put_bits(&s->pb, 2, s->pict_type - 1);
315
316 put_bits(&s->pb, 5, s->qscale);
Michael Niedermayerf5957f32002-06-18 00:49:00317 if(s->msmpeg4_version<=2){
318 s->rl_table_index = 2;
319 s->rl_chroma_table_index = 2;
320 }
Michael Niedermayer3825cd12002-04-05 21:04:09321
Fabrice Bellardde6d9b62001-07-22 14:18:56322 s->dc_table_index = 1;
323 s->mv_table_index = 1; /* only if P frame */
324 s->use_skip_mb_code = 1; /* only if P frame */
Michael Niedermayerf5957f32002-06-18 00:49:00325 s->per_mb_rl_table = 0;
Michael Niedermayerfc48cba2002-10-20 17:02:41326 if(s->msmpeg4_version==4)
327 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:46328//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:00329
Fabrice Bellardde6d9b62001-07-22 14:18:56330 if (s->pict_type == I_TYPE) {
Michael Niedermayerde0f2f42002-07-07 08:34:46331 s->slice_height= s->mb_height/1;
332 put_bits(&s->pb, 5, 0x16 + s->mb_height/s->slice_height);
Diego Biurrun115329f2005-12-17 18:14:38333
Michael Niedermayerf5957f32002-06-18 00:49:00334 if(s->msmpeg4_version==4){
335 msmpeg4_encode_ext_header(s);
Michael Niedermayer05174fd2002-07-22 08:15:27336 if(s->bit_rate>MBAC_BITRATE)
Michael Niedermayerde0f2f42002-07-07 08:34:46337 put_bits(&s->pb, 1, s->per_mb_rl_table);
Michael Niedermayerf5957f32002-06-18 00:49:00338 }
Fabrice Bellardde6d9b62001-07-22 14:18:56339
Michael Niedermayer287229e2002-06-02 12:22:30340 if(s->msmpeg4_version>2){
Michael Niedermayerf5957f32002-06-18 00:49:00341 if(!s->per_mb_rl_table){
Aurelien Jacobs85f601e2007-11-07 23:23:35342 ff_msmpeg4_code012(&s->pb, s->rl_chroma_table_index);
343 ff_msmpeg4_code012(&s->pb, s->rl_table_index);
Michael Niedermayerf5957f32002-06-18 00:49:00344 }
Fabrice Bellardde6d9b62001-07-22 14:18:56345
Michael Niedermayer3825cd12002-04-05 21:04:09346 put_bits(&s->pb, 1, s->dc_table_index);
347 }
Fabrice Bellardde6d9b62001-07-22 14:18:56348 } else {
349 put_bits(&s->pb, 1, s->use_skip_mb_code);
Diego Biurrun115329f2005-12-17 18:14:38350
Michael Niedermayer05174fd2002-07-22 08:15:27351 if(s->msmpeg4_version==4 && s->bit_rate>MBAC_BITRATE)
Michael Niedermayerf5957f32002-06-18 00:49:00352 put_bits(&s->pb, 1, s->per_mb_rl_table);
353
Michael Niedermayer287229e2002-06-02 12:22:30354 if(s->msmpeg4_version>2){
Michael Niedermayerf5957f32002-06-18 00:49:00355 if(!s->per_mb_rl_table)
Aurelien Jacobs85f601e2007-11-07 23:23:35356 ff_msmpeg4_code012(&s->pb, s->rl_table_index);
Fabrice Bellardde6d9b62001-07-22 14:18:56357
Michael Niedermayer3825cd12002-04-05 21:04:09358 put_bits(&s->pb, 1, s->dc_table_index);
Fabrice Bellardde6d9b62001-07-22 14:18:56359
Michael Niedermayer3825cd12002-04-05 21:04:09360 put_bits(&s->pb, 1, s->mv_table_index);
361 }
Fabrice Bellardde6d9b62001-07-22 14:18:56362 }
363
Michael Niedermayerf5957f32002-06-18 00:49:00364 s->esc3_level_length= 0;
365 s->esc3_run_length= 0;
Fabrice Bellardde6d9b62001-07-22 14:18:56366
367#ifdef DEBUG
368 intra_count = 0;
Steve L'Homme267f7ed2006-03-08 11:43:10369 av_log(s->avctx, AV_LOG_DEBUG, "*****frame %d:\n", frame_count++);
Fabrice Bellardde6d9b62001-07-22 14:18:56370#endif
371}
372
Michael Niedermayerae404842002-01-15 22:22:41373void msmpeg4_encode_ext_header(MpegEncContext * s)
374{
Michael Niedermayerc0df9d72005-04-30 21:43:59375 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:41376
Michael Niedermayerb8a78f42002-11-10 11:46:59377 put_bits(&s->pb, 11, FFMIN(s->bit_rate/1024, 2047));
Michael Niedermayerae404842002-01-15 22:22:41378
Michael Niedermayer1f9aea92003-04-01 15:38:01379 if(s->msmpeg4_version>=3)
Michael Niedermayer287229e2002-06-02 12:22:30380 put_bits(&s->pb, 1, s->flipflop_rounding);
Michael Niedermayer1f9aea92003-04-01 15:38:01381 else
382 assert(s->flipflop_rounding==0);
Michael Niedermayerae404842002-01-15 22:22:41383}
384
Wolfgang Hesseler76042462003-02-16 23:05:38385#endif //CONFIG_ENCODERS
386
Fabrice Bellardde6d9b62001-07-22 14:18:56387/* predict coded block */
Aurelien Jacobs85f601e2007-11-07 23:23:35388int ff_msmpeg4_coded_block_pred(MpegEncContext * s, int n, uint8_t **coded_block_ptr)
Fabrice Bellardde6d9b62001-07-22 14:18:56389{
Michael Niedermayerdbbe8992002-03-29 01:53:59390 int xy, wrap, pred, a, b, c;
Fabrice Bellardde6d9b62001-07-22 14:18:56391
Michael Niedermayerdbbe8992002-03-29 01:53:59392 xy = s->block_index[n];
Michael Niedermayer137c8462004-04-16 01:01:45393 wrap = s->b8_stride;
Fabrice Bellardde6d9b62001-07-22 14:18:56394
395 /* B C
Diego Biurrun115329f2005-12-17 18:14:38396 * A X
Fabrice Bellardde6d9b62001-07-22 14:18:56397 */
Michael Niedermayerdbbe8992002-03-29 01:53:59398 a = s->coded_block[xy - 1 ];
399 b = s->coded_block[xy - 1 - wrap];
400 c = s->coded_block[xy - wrap];
Diego Biurrun115329f2005-12-17 18:14:38401
Fabrice Bellardde6d9b62001-07-22 14:18:56402 if (b == c) {
403 pred = a;
404 } else {
405 pred = c;
406 }
Diego Biurrun115329f2005-12-17 18:14:38407
Fabrice Bellardde6d9b62001-07-22 14:18:56408 /* store value */
Michael Niedermayerdbbe8992002-03-29 01:53:59409 *coded_block_ptr = &s->coded_block[xy];
Fabrice Bellardde6d9b62001-07-22 14:18:56410
411 return pred;
412}
413
Wolfgang Hesseler76042462003-02-16 23:05:38414#ifdef CONFIG_ENCODERS
415
Aurelien Jacobs85f601e2007-11-07 23:23:35416void ff_msmpeg4_encode_motion(MpegEncContext * s,
Fabrice Bellardde6d9b62001-07-22 14:18:56417 int mx, int my)
418{
419 int code;
420 MVTable *mv;
421
422 /* modulo encoding */
423 /* WARNING : you cannot reach all the MVs even with the modulo
424 encoding. This is a somewhat strange compromise they took !!! */
425 if (mx <= -64)
426 mx += 64;
427 else if (mx >= 64)
428 mx -= 64;
429 if (my <= -64)
430 my += 64;
431 else if (my >= 64)
432 my -= 64;
Diego Biurrun115329f2005-12-17 18:14:38433
Fabrice Bellardde6d9b62001-07-22 14:18:56434 mx += 32;
435 my += 32;
436#if 0
437 if ((unsigned)mx >= 64 ||
Diego Biurrun115329f2005-12-17 18:14:38438 (unsigned)my >= 64)
Steve L'Homme267f7ed2006-03-08 11:43:10439 av_log(s->avctx, AV_LOG_ERROR, "error mx=%d my=%d\n", mx, my);
Fabrice Bellardde6d9b62001-07-22 14:18:56440#endif
441 mv = &mv_tables[s->mv_table_index];
442
443 code = mv->table_mv_index[(mx << 6) | my];
Diego Biurrun115329f2005-12-17 18:14:38444 put_bits(&s->pb,
445 mv->table_mv_bits[code],
Fabrice Bellardde6d9b62001-07-22 14:18:56446 mv->table_mv_code[code]);
447 if (code == mv->n) {
Diego Biurrun90b5b512007-06-12 18:50:50448 /* escape : code literally */
Fabrice Bellardde6d9b62001-07-22 14:18:56449 put_bits(&s->pb, 6, mx);
450 put_bits(&s->pb, 6, my);
451 }
452}
453
Aurelien Jacobs85f601e2007-11-07 23:23:35454void ff_msmpeg4_handle_slices(MpegEncContext *s){
Michael Niedermayerde0f2f42002-07-07 08:34:46455 if (s->mb_x == 0) {
456 if (s->slice_height && (s->mb_y % s->slice_height) == 0) {
Michael Niedermayer28269842003-01-09 11:37:08457 if(s->msmpeg4_version < 4){
Michael Niedermayer4d2858d2002-10-13 13:16:04458 ff_mpeg4_clean_buffers(s);
Michael Niedermayerde0f2f42002-07-07 08:34:46459 }
460 s->first_slice_line = 1;
461 } else {
Diego Biurrun115329f2005-12-17 18:14:38462 s->first_slice_line = 0;
Michael Niedermayerde0f2f42002-07-07 08:34:46463 }
464 }
465}
466
Diego Biurrun115329f2005-12-17 18:14:38467void msmpeg4_encode_mb(MpegEncContext * s,
Fabrice Bellardde6d9b62001-07-22 14:18:56468 DCTELEM block[6][64],
469 int motion_x, int motion_y)
470{
471 int cbp, coded_cbp, i;
472 int pred_x, pred_y;
Zdenek Kabelac0c1a9ed2003-02-11 16:35:48473 uint8_t *coded_block;
Fabrice Bellardde6d9b62001-07-22 14:18:56474
Aurelien Jacobs85f601e2007-11-07 23:23:35475 ff_msmpeg4_handle_slices(s);
Diego Biurrun115329f2005-12-17 18:14:38476
Fabrice Bellardde6d9b62001-07-22 14:18:56477 if (!s->mb_intra) {
Diego Biurrunbb270c02005-12-22 01:10:11478 /* compute cbp */
Diego Biurrunbb270c02005-12-22 01:10:11479 cbp = 0;
480 for (i = 0; i < 6; i++) {
481 if (s->block_last_index[i] >= 0)
482 cbp |= 1 << (5 - i);
483 }
484 if (s->use_skip_mb_code && (cbp | motion_x | motion_y) == 0) {
485 /* skip macroblock */
486 put_bits(&s->pb, 1, 1);
Michael Niedermayer4d2a4832003-04-02 09:57:34487 s->last_bits++;
Diego Biurrunbb270c02005-12-22 01:10:11488 s->misc_bits++;
Michael Niedermayera0c83172003-04-25 19:46:00489 s->skip_count++;
Michael Niedermayer4d2a4832003-04-02 09:57:34490
Diego Biurrunbb270c02005-12-22 01:10:11491 return;
492 }
Fabrice Bellardde6d9b62001-07-22 14:18:56493 if (s->use_skip_mb_code)
Diego Biurrunbb270c02005-12-22 01:10:11494 put_bits(&s->pb, 1, 0); /* mb coded */
Diego Biurrun115329f2005-12-17 18:14:38495
Michael Niedermayer287229e2002-06-02 12:22:30496 if(s->msmpeg4_version<=2){
Diego Biurrun115329f2005-12-17 18:14:38497 put_bits(&s->pb,
498 v2_mb_type[cbp&3][1],
Michael Niedermayer3825cd12002-04-05 21:04:09499 v2_mb_type[cbp&3][0]);
500 if((cbp&3) != 3) coded_cbp= cbp ^ 0x3C;
501 else coded_cbp= cbp;
Fabrice Bellardde6d9b62001-07-22 14:18:56502
Diego Biurrun115329f2005-12-17 18:14:38503 put_bits(&s->pb,
504 cbpy_tab[coded_cbp>>2][1],
Michael Niedermayer3825cd12002-04-05 21:04:09505 cbpy_tab[coded_cbp>>2][0]);
Michael Niedermayer4d2a4832003-04-02 09:57:34506
507 s->misc_bits += get_bits_diff(s);
508
Michael Niedermayer137c8462004-04-16 01:01:45509 h263_pred_motion(s, 0, 0, &pred_x, &pred_y);
Michael Niedermayer3825cd12002-04-05 21:04:09510 msmpeg4v2_encode_motion(s, motion_x - pred_x);
511 msmpeg4v2_encode_motion(s, motion_y - pred_y);
512 }else{
Diego Biurrun115329f2005-12-17 18:14:38513 put_bits(&s->pb,
514 table_mb_non_intra[cbp + 64][1],
Michael Niedermayer3825cd12002-04-05 21:04:09515 table_mb_non_intra[cbp + 64][0]);
516
Michael Niedermayer4d2a4832003-04-02 09:57:34517 s->misc_bits += get_bits_diff(s);
518
Michael Niedermayer3825cd12002-04-05 21:04:09519 /* motion vector */
Michael Niedermayer137c8462004-04-16 01:01:45520 h263_pred_motion(s, 0, 0, &pred_x, &pred_y);
Aurelien Jacobs85f601e2007-11-07 23:23:35521 ff_msmpeg4_encode_motion(s, motion_x - pred_x,
Michael Niedermayer3825cd12002-04-05 21:04:09522 motion_y - pred_y);
523 }
Michael Niedermayer4d2a4832003-04-02 09:57:34524
525 s->mv_bits += get_bits_diff(s);
526
527 for (i = 0; i < 6; i++) {
Denis Fortinc68a1732007-06-21 07:53:48528 ff_msmpeg4_encode_block(s, block[i], i);
Michael Niedermayer4d2a4832003-04-02 09:57:34529 }
530 s->p_tex_bits += get_bits_diff(s);
Fabrice Bellardde6d9b62001-07-22 14:18:56531 } else {
Diego Biurrunbb270c02005-12-22 01:10:11532 /* compute cbp */
533 cbp = 0;
Fabrice Bellardde6d9b62001-07-22 14:18:56534 coded_cbp = 0;
Diego Biurrunbb270c02005-12-22 01:10:11535 for (i = 0; i < 6; i++) {
Fabrice Bellardde6d9b62001-07-22 14:18:56536 int val, pred;
537 val = (s->block_last_index[i] >= 1);
538 cbp |= val << (5 - i);
539 if (i < 4) {
540 /* predict value for close blocks only for luma */
Aurelien Jacobs85f601e2007-11-07 23:23:35541 pred = ff_msmpeg4_coded_block_pred(s, i, &coded_block);
Fabrice Bellardde6d9b62001-07-22 14:18:56542 *coded_block = val;
543 val = val ^ pred;
544 }
545 coded_cbp |= val << (5 - i);
Diego Biurrunbb270c02005-12-22 01:10:11546 }
Fabrice Bellardde6d9b62001-07-22 14:18:56547#if 0
548 if (coded_cbp)
549 printf("cbp=%x %x\n", cbp, coded_cbp);
550#endif
551
Michael Niedermayer287229e2002-06-02 12:22:30552 if(s->msmpeg4_version<=2){
Michael Niedermayer3825cd12002-04-05 21:04:09553 if (s->pict_type == I_TYPE) {
Diego Biurrun115329f2005-12-17 18:14:38554 put_bits(&s->pb,
Michael Niedermayer3825cd12002-04-05 21:04:09555 v2_intra_cbpc[cbp&3][1], v2_intra_cbpc[cbp&3][0]);
556 } else {
557 if (s->use_skip_mb_code)
Diego Biurrunbb270c02005-12-22 01:10:11558 put_bits(&s->pb, 1, 0); /* mb coded */
Diego Biurrun115329f2005-12-17 18:14:38559 put_bits(&s->pb,
560 v2_mb_type[(cbp&3) + 4][1],
Michael Niedermayer3825cd12002-04-05 21:04:09561 v2_mb_type[(cbp&3) + 4][0]);
562 }
Diego Biurrunbb270c02005-12-22 01:10:11563 put_bits(&s->pb, 1, 0); /* no AC prediction yet */
Diego Biurrun115329f2005-12-17 18:14:38564 put_bits(&s->pb,
565 cbpy_tab[cbp>>2][1],
Michael Niedermayer3825cd12002-04-05 21:04:09566 cbpy_tab[cbp>>2][0]);
567 }else{
568 if (s->pict_type == I_TYPE) {
Diego Biurrun115329f2005-12-17 18:14:38569 put_bits(&s->pb,
anonymous0d33db82005-01-30 16:34:57570 ff_msmp4_mb_i_table[coded_cbp][1], ff_msmp4_mb_i_table[coded_cbp][0]);
Michael Niedermayer3825cd12002-04-05 21:04:09571 } else {
572 if (s->use_skip_mb_code)
Diego Biurrunbb270c02005-12-22 01:10:11573 put_bits(&s->pb, 1, 0); /* mb coded */
Diego Biurrun115329f2005-12-17 18:14:38574 put_bits(&s->pb,
575 table_mb_non_intra[cbp][1],
Michael Niedermayer3825cd12002-04-05 21:04:09576 table_mb_non_intra[cbp][0]);
577 }
Diego Biurrunbb270c02005-12-22 01:10:11578 put_bits(&s->pb, 1, 0); /* no AC prediction yet */
Michael Niedermayer05174fd2002-07-22 08:15:27579 if(s->inter_intra_pred){
580 s->h263_aic_dir=0;
581 put_bits(&s->pb, table_inter_intra[s->h263_aic_dir][1], table_inter_intra[s->h263_aic_dir][0]);
582 }
Fabrice Bellardde6d9b62001-07-22 14:18:56583 }
Michael Niedermayer4d2a4832003-04-02 09:57:34584 s->misc_bits += get_bits_diff(s);
Fabrice Bellardde6d9b62001-07-22 14:18:56585
Michael Niedermayer4d2a4832003-04-02 09:57:34586 for (i = 0; i < 6; i++) {
Denis Fortinc68a1732007-06-21 07:53:48587 ff_msmpeg4_encode_block(s, block[i], i);
Michael Niedermayer4d2a4832003-04-02 09:57:34588 }
589 s->i_tex_bits += get_bits_diff(s);
Michael Niedermayera0c83172003-04-25 19:46:00590 s->i_count++;
Fabrice Bellardde6d9b62001-07-22 14:18:56591 }
592}
593
Wolfgang Hesseler76042462003-02-16 23:05:38594#endif //CONFIG_ENCODERS
595
Diego Biurrun115329f2005-12-17 18:14:38596static inline int msmpeg4v1_pred_dc(MpegEncContext * s, int n,
Zdenek Kabelac0c1a9ed2003-02-11 16:35:48597 int32_t **dc_val_ptr)
Michael Niedermayer287229e2002-06-02 12:22:30598{
599 int i;
600
601 if (n < 4) {
602 i= 0;
603 } else {
604 i= n-3;
605 }
Diego Biurrun115329f2005-12-17 18:14:38606
Michael Niedermayer287229e2002-06-02 12:22:30607 *dc_val_ptr= &s->last_dc[i];
Diego Biurrun115329f2005-12-17 18:14:38608 return s->last_dc[i];
Michael Niedermayer287229e2002-06-02 12:22:30609}
610
Michael Niedermayerde0f2f42002-07-07 08:34:46611static int get_dc(uint8_t *src, int stride, int scale)
612{
613 int y;
614 int sum=0;
615 for(y=0; y<8; y++){
616 int x;
617 for(x=0; x<8; x++){
618 sum+=src[x + y*stride];
619 }
620 }
BEROd4961b32003-05-14 15:12:13621 return FASTDIV((sum + (scale>>1)), scale);
Michael Niedermayerde0f2f42002-07-07 08:34:46622}
623
Fabrice Bellardde6d9b62001-07-22 14:18:56624/* dir = 0: left, dir = 1: top prediction */
Diego Biurrun115329f2005-12-17 18:14:38625static inline int msmpeg4_pred_dc(MpegEncContext * s, int n,
Måns Rullgårdb86216d2006-09-27 22:13:44626 int16_t **dc_val_ptr, int *dir_ptr)
Fabrice Bellardde6d9b62001-07-22 14:18:56627{
Michael Niedermayerdbbe8992002-03-29 01:53:59628 int a, b, c, wrap, pred, scale;
Måns Rullgårdb86216d2006-09-27 22:13:44629 int16_t *dc_val;
Fabrice Bellardde6d9b62001-07-22 14:18:56630
631 /* find prediction */
632 if (n < 4) {
Diego Biurrunbb270c02005-12-22 01:10:11633 scale = s->y_dc_scale;
Fabrice Bellardde6d9b62001-07-22 14:18:56634 } else {
Diego Biurrunbb270c02005-12-22 01:10:11635 scale = s->c_dc_scale;
Fabrice Bellardde6d9b62001-07-22 14:18:56636 }
Diego Biurrun115329f2005-12-17 18:14:38637
Michael Niedermayerdbbe8992002-03-29 01:53:59638 wrap = s->block_wrap[n];
639 dc_val= s->dc_val[0] + s->block_index[n];
Fabrice Bellardde6d9b62001-07-22 14:18:56640
641 /* B C
Diego Biurrun115329f2005-12-17 18:14:38642 * A X
Fabrice Bellardde6d9b62001-07-22 14:18:56643 */
Michael Niedermayerdbbe8992002-03-29 01:53:59644 a = dc_val[ - 1];
645 b = dc_val[ - 1 - wrap];
646 c = dc_val[ - wrap];
Diego Biurrun115329f2005-12-17 18:14:38647
Michael Niedermayer28269842003-01-09 11:37:08648 if(s->first_slice_line && (n&2)==0 && s->msmpeg4_version<4){
Michael Niedermayer4d2858d2002-10-13 13:16:04649 b=c=1024;
650 }
Fabrice Bellardde6d9b62001-07-22 14:18:56651
652 /* XXX: the following solution consumes divisions, but it does not
653 necessitate to modify mpegvideo.c. The problem comes from the
654 fact they decided to store the quantized DC (which would lead
655 to problems if Q could vary !) */
Diego Biurrun3cd52272006-11-01 18:34:40656#if (defined(ARCH_X86)) && !defined PIC
Michael Niedermayer6f903d82002-01-14 04:34:52657 asm volatile(
Diego Biurrunbb270c02005-12-22 01:10:11658 "movl %3, %%eax \n\t"
659 "shrl $1, %%eax \n\t"
660 "addl %%eax, %2 \n\t"
661 "addl %%eax, %1 \n\t"
662 "addl %0, %%eax \n\t"
663 "mull %4 \n\t"
664 "movl %%edx, %0 \n\t"
665 "movl %1, %%eax \n\t"
666 "mull %4 \n\t"
667 "movl %%edx, %1 \n\t"
668 "movl %2, %%eax \n\t"
669 "mull %4 \n\t"
670 "movl %%edx, %2 \n\t"
671 : "+b" (a), "+c" (b), "+D" (c)
Måns Rullgård36cd3062006-11-12 18:49:36672 : "g" (scale), "S" (ff_inverse[scale])
Diego Biurrunbb270c02005-12-22 01:10:11673 : "%eax", "%edx"
Michael Niedermayer6f903d82002-01-14 04:34:52674 );
Zdenek Kabelac320680d2002-01-28 18:06:28675#else
676 /* #elif defined (ARCH_ALPHA) */
Nick Kurshev1e98dff2002-01-20 14:48:02677 /* Divisions are extremely costly on Alpha; optimize the most
Zdenek Kabelac320680d2002-01-28 18:06:28678 common case. But they are costly everywhere...
679 */
Nick Kurshev1e98dff2002-01-20 14:48:02680 if (scale == 8) {
Diego Biurrunbb270c02005-12-22 01:10:11681 a = (a + (8 >> 1)) / 8;
682 b = (b + (8 >> 1)) / 8;
683 c = (c + (8 >> 1)) / 8;
Nick Kurshev1e98dff2002-01-20 14:48:02684 } else {
Diego Biurrunbb270c02005-12-22 01:10:11685 a = FASTDIV((a + (scale >> 1)), scale);
686 b = FASTDIV((b + (scale >> 1)), scale);
687 c = FASTDIV((c + (scale >> 1)), scale);
Nick Kurshev1e98dff2002-01-20 14:48:02688 }
Michael Niedermayer6f903d82002-01-14 04:34:52689#endif
Fabrice Bellardde6d9b62001-07-22 14:18:56690 /* XXX: WARNING: they did not choose the same test as MPEG4. This
691 is very important ! */
Michael Niedermayerbd5e1c72002-06-22 15:52:25692 if(s->msmpeg4_version>3){
Michael Niedermayerde0f2f42002-07-07 08:34:46693 if(s->inter_intra_pred){
694 uint8_t *dest;
695 int wrap;
Diego Biurrun115329f2005-12-17 18:14:38696
Michael Niedermayerde0f2f42002-07-07 08:34:46697 if(n==1){
698 pred=a;
699 *dir_ptr = 0;
700 }else if(n==2){
701 pred=c;
702 *dir_ptr = 1;
703 }else if(n==3){
704 if (abs(a - b) < abs(b - c)) {
705 pred = c;
706 *dir_ptr = 1;
707 } else {
708 pred = a;
709 *dir_ptr = 0;
710 }
711 }else{
712 if(n<4){
713 wrap= s->linesize;
Michael Niedermayer1e491e22002-12-04 10:04:03714 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:46715 }else{
Michael Niedermayer0fd90452002-07-15 14:15:10716 wrap= s->uvlinesize;
Michael Niedermayer1e491e22002-12-04 10:04:03717 dest= s->current_picture.data[n-3] + (s->mb_y * 8 * wrap) + s->mb_x * 8;
Michael Niedermayerde0f2f42002-07-07 08:34:46718 }
719 if(s->mb_x==0) a= (1024 + (scale>>1))/scale;
720 else a= get_dc(dest-8, wrap, scale*8);
721 if(s->mb_y==0) c= (1024 + (scale>>1))/scale;
722 else c= get_dc(dest-8*wrap, wrap, scale*8);
Diego Biurrun115329f2005-12-17 18:14:38723
Michael Niedermayerde0f2f42002-07-07 08:34:46724 if (s->h263_aic_dir==0) {
725 pred= a;
726 *dir_ptr = 0;
727 }else if (s->h263_aic_dir==1) {
728 if(n==0){
729 pred= c;
730 *dir_ptr = 1;
731 }else{
732 pred= a;
733 *dir_ptr = 0;
734 }
735 }else if (s->h263_aic_dir==2) {
736 if(n==0){
737 pred= a;
738 *dir_ptr = 0;
739 }else{
740 pred= c;
741 *dir_ptr = 1;
742 }
743 } else {
744 pred= c;
745 *dir_ptr = 1;
746 }
747 }
748 }else{
749 if (abs(a - b) < abs(b - c)) {
750 pred = c;
751 *dir_ptr = 1;
752 } else {
753 pred = a;
754 *dir_ptr = 0;
755 }
Michael Niedermayerbd5e1c72002-06-22 15:52:25756 }
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 }
Fabrice Bellardde6d9b62001-07-22 14:18:56765 }
766
767 /* update predictor */
Michael Niedermayerdbbe8992002-03-29 01:53:59768 *dc_val_ptr = &dc_val[0];
Fabrice Bellardde6d9b62001-07-22 14:18:56769 return pred;
770}
771
772#define DC_MAX 119
773
774static void msmpeg4_encode_dc(MpegEncContext * s, int level, int n, int *dir_ptr)
775{
776 int sign, code;
Fortin Denisb05b1932007-06-22 08:35:21777 int pred, extquant;
778 int extrabits = 0;
Fabrice Bellardde6d9b62001-07-22 14:18:56779
Michael Niedermayer287229e2002-06-02 12:22:30780 if(s->msmpeg4_version==1){
Zdenek Kabelac0c1a9ed2003-02-11 16:35:48781 int32_t *dc_val;
Michael Niedermayer287229e2002-06-02 12:22:30782 pred = msmpeg4v1_pred_dc(s, n, &dc_val);
Diego Biurrun115329f2005-12-17 18:14:38783
Michael Niedermayer287229e2002-06-02 12:22:30784 /* update predictor */
785 *dc_val= level;
786 }else{
Måns Rullgårdb86216d2006-09-27 22:13:44787 int16_t *dc_val;
Michael Niedermayerbd5e1c72002-06-22 15:52:25788 pred = msmpeg4_pred_dc(s, n, &dc_val, dir_ptr);
Fabrice Bellardde6d9b62001-07-22 14:18:56789
Michael Niedermayer287229e2002-06-02 12:22:30790 /* update predictor */
791 if (n < 4) {
792 *dc_val = level * s->y_dc_scale;
793 } else {
794 *dc_val = level * s->c_dc_scale;
795 }
Fabrice Bellardde6d9b62001-07-22 14:18:56796 }
797
798 /* do the prediction */
799 level -= pred;
800
Michael Niedermayer287229e2002-06-02 12:22:30801 if(s->msmpeg4_version<=2){
Michael Niedermayer3825cd12002-04-05 21:04:09802 if (n < 4) {
Diego Biurrun115329f2005-12-17 18:14:38803 put_bits(&s->pb,
Michael Niedermayer3825cd12002-04-05 21:04:09804 v2_dc_lum_table[level+256][1],
805 v2_dc_lum_table[level+256][0]);
806 }else{
Diego Biurrun115329f2005-12-17 18:14:38807 put_bits(&s->pb,
Michael Niedermayer3825cd12002-04-05 21:04:09808 v2_dc_chroma_table[level+256][1],
809 v2_dc_chroma_table[level+256][0]);
810 }
811 }else{
812 sign = 0;
813 if (level < 0) {
814 level = -level;
815 sign = 1;
816 }
817 code = level;
Diego Biurrun115329f2005-12-17 18:14:38818 if (code > DC_MAX)
Michael Niedermayer3825cd12002-04-05 21:04:09819 code = DC_MAX;
Fortin Denisb05b1932007-06-22 08:35:21820 else if( s->msmpeg4_version>=6 ) {
821 if( s->qscale == 1 ) {
822 extquant = (level + 3) & 0x3;
823 code = ((level+3)>>2);
824 } else if( s->qscale == 2 ) {
825 extquant = (level + 1) & 0x1;
826 code = ((level+1)>>1);
827 }
828 }
Fabrice Bellardde6d9b62001-07-22 14:18:56829
Michael Niedermayer3825cd12002-04-05 21:04:09830 if (s->dc_table_index == 0) {
831 if (n < 4) {
anonymous0c040aa2005-01-26 12:01:35832 put_bits(&s->pb, ff_table0_dc_lum[code][1], ff_table0_dc_lum[code][0]);
Michael Niedermayer3825cd12002-04-05 21:04:09833 } else {
anonymous0c040aa2005-01-26 12:01:35834 put_bits(&s->pb, ff_table0_dc_chroma[code][1], ff_table0_dc_chroma[code][0]);
Michael Niedermayer3825cd12002-04-05 21:04:09835 }
Fabrice Bellardde6d9b62001-07-22 14:18:56836 } else {
Michael Niedermayer3825cd12002-04-05 21:04:09837 if (n < 4) {
anonymous0c040aa2005-01-26 12:01:35838 put_bits(&s->pb, ff_table1_dc_lum[code][1], ff_table1_dc_lum[code][0]);
Michael Niedermayer3825cd12002-04-05 21:04:09839 } else {
anonymous0c040aa2005-01-26 12:01:35840 put_bits(&s->pb, ff_table1_dc_chroma[code][1], ff_table1_dc_chroma[code][0]);
Michael Niedermayer3825cd12002-04-05 21:04:09841 }
Fabrice Bellardde6d9b62001-07-22 14:18:56842 }
Diego Biurrun115329f2005-12-17 18:14:38843
Fortin Denisb05b1932007-06-22 08:35:21844 if(s->msmpeg4_version>=6 && s->qscale<=2)
845 extrabits = 3 - s->qscale;
846
Michael Niedermayer3825cd12002-04-05 21:04:09847 if (code == DC_MAX)
Fortin Denisb05b1932007-06-22 08:35:21848 put_bits(&s->pb, 8 + extrabits, level);
849 else if(extrabits > 0)//== VC1 && s->qscale<=2
850 put_bits(&s->pb, extrabits, extquant);
Diego Biurrun115329f2005-12-17 18:14:38851
Michael Niedermayer3825cd12002-04-05 21:04:09852 if (level != 0) {
853 put_bits(&s->pb, 1, sign);
Fabrice Bellardde6d9b62001-07-22 14:18:56854 }
855 }
Fabrice Bellardde6d9b62001-07-22 14:18:56856}
857
858/* Encoding of a block. Very similar to MPEG4 except for a different
859 escape coding (same as H263) and more vlc tables.
860 */
Denis Fortinc68a1732007-06-21 07:53:48861void ff_msmpeg4_encode_block(MpegEncContext * s, DCTELEM * block, int n)
Fabrice Bellardde6d9b62001-07-22 14:18:56862{
863 int level, run, last, i, j, last_index;
864 int last_non_zero, sign, slevel;
865 int code, run_diff, dc_pred_dir;
866 const RLTable *rl;
Zdenek Kabelac0c1a9ed2003-02-11 16:35:48867 const uint8_t *scantable;
Fabrice Bellardde6d9b62001-07-22 14:18:56868
869 if (s->mb_intra) {
Fabrice Bellardde6d9b62001-07-22 14:18:56870 msmpeg4_encode_dc(s, block[0], n, &dc_pred_dir);
871 i = 1;
872 if (n < 4) {
873 rl = &rl_table[s->rl_table_index];
874 } else {
875 rl = &rl_table[3 + s->rl_chroma_table_index];
876 }
Michael Niedermayerd7826b52007-08-05 20:03:37877 run_diff = s->msmpeg4_version>=4;
Michael Niedermayer2ad15162002-09-29 22:44:22878 scantable= s->intra_scantable.permutated;
Fabrice Bellardde6d9b62001-07-22 14:18:56879 } else {
880 i = 0;
881 rl = &rl_table[3 + s->rl_table_index];
Michael Niedermayer287229e2002-06-02 12:22:30882 if(s->msmpeg4_version<=2)
Michael Niedermayer3825cd12002-04-05 21:04:09883 run_diff = 0;
884 else
885 run_diff = 1;
Michael Niedermayer2ad15162002-09-29 22:44:22886 scantable= s->inter_scantable.permutated;
Fabrice Bellardde6d9b62001-07-22 14:18:56887 }
888
Michael Niedermayerf5957f32002-06-18 00:49:00889 /* recalculate block_last_index for M$ wmv1 */
Fortin Denisb05b1932007-06-22 08:35:21890 if(s->msmpeg4_version>=4 && s->msmpeg4_version<6 && s->block_last_index[n]>0){
Michael Niedermayerf5957f32002-06-18 00:49:00891 for(last_index=63; last_index>=0; last_index--){
892 if(block[scantable[last_index]]) break;
893 }
Michael Niedermayer4d2858d2002-10-13 13:16:04894 s->block_last_index[n]= last_index;
Michael Niedermayerf5957f32002-06-18 00:49:00895 }else
896 last_index = s->block_last_index[n];
Fabrice Bellardde6d9b62001-07-22 14:18:56897 /* AC coefs */
Fabrice Bellardde6d9b62001-07-22 14:18:56898 last_non_zero = i - 1;
899 for (; i <= last_index; i++) {
Diego Biurrunbb270c02005-12-22 01:10:11900 j = scantable[i];
901 level = block[j];
902 if (level) {
903 run = i - last_non_zero - 1;
904 last = (i == last_index);
905 sign = 0;
906 slevel = level;
907 if (level < 0) {
908 sign = 1;
909 level = -level;
910 }
Michael Niedermayer62959862002-08-09 00:13:54911
Michael Niedermayerf5957f32002-06-18 00:49:00912 if(level<=MAX_LEVEL && run<=MAX_RUN){
913 s->ac_stats[s->mb_intra][n>3][level][run][last]++;
914 }
915#if 0
916else
917 s->ac_stats[s->mb_intra][n>3][40][63][0]++; //esc3 like
918#endif
Fabrice Bellardde6d9b62001-07-22 14:18:56919 code = get_rl_index(rl, last, run, level);
920 put_bits(&s->pb, rl->table_vlc[code][1], rl->table_vlc[code][0]);
921 if (code == rl->n) {
922 int level1, run1;
923
924 level1 = level - rl->max_level[last][run];
Diego Biurrun115329f2005-12-17 18:14:38925 if (level1 < 1)
Fabrice Bellardde6d9b62001-07-22 14:18:56926 goto esc2;
927 code = get_rl_index(rl, last, run, level1);
928 if (code == rl->n) {
929 esc2:
930 put_bits(&s->pb, 1, 0);
931 if (level > MAX_LEVEL)
932 goto esc3;
933 run1 = run - rl->max_run[last][level] - run_diff;
934 if (run1 < 0)
935 goto esc3;
Michael Niedermayerd7826b52007-08-05 20:03:37936 code = get_rl_index(rl, last, run1+1, level);
937 if (s->msmpeg4_version == 4 && code == rl->n)
938 goto esc3;
Fabrice Bellardde6d9b62001-07-22 14:18:56939 code = get_rl_index(rl, last, run1, level);
940 if (code == rl->n) {
941 esc3:
942 /* third escape */
943 put_bits(&s->pb, 1, 0);
944 put_bits(&s->pb, 1, last);
Michael Niedermayer1457ab52002-12-27 23:51:46945 if(s->msmpeg4_version>=4){
Michael Niedermayerf5957f32002-06-18 00:49:00946 if(s->esc3_level_length==0){
947 s->esc3_level_length=8;
948 s->esc3_run_length= 6;
Fortin Denisb05b1932007-06-22 08:35:21949 //ESCLVLSZ + ESCRUNSZ
Michael Niedermayerf5957f32002-06-18 00:49:00950 if(s->qscale<8)
Fortin Denisb05b1932007-06-22 08:35:21951 put_bits(&s->pb, 6 + (s->msmpeg4_version>=6), 3);
Michael Niedermayerf5957f32002-06-18 00:49:00952 else
953 put_bits(&s->pb, 8, 3);
954 }
955 put_bits(&s->pb, s->esc3_run_length, run);
956 put_bits(&s->pb, 1, sign);
957 put_bits(&s->pb, s->esc3_level_length, level);
958 }else{
959 put_bits(&s->pb, 6, run);
960 put_bits(&s->pb, 8, slevel & 0xff);
961 }
Fabrice Bellardde6d9b62001-07-22 14:18:56962 } else {
963 /* second escape */
964 put_bits(&s->pb, 1, 1);
965 put_bits(&s->pb, rl->table_vlc[code][1], rl->table_vlc[code][0]);
966 put_bits(&s->pb, 1, sign);
967 }
968 } else {
969 /* first 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 put_bits(&s->pb, 1, sign);
976 }
Diego Biurrunbb270c02005-12-22 01:10:11977 last_non_zero = i;
978 }
Fabrice Bellardde6d9b62001-07-22 14:18:56979 }
980}
981
982/****************************************/
983/* decoding stuff */
984
Aurelien Jacobs85f601e2007-11-07 23:23:35985VLC ff_mb_non_intra_vlc[4];
Michael Niedermayer84afee32002-04-05 04:09:04986static VLC v2_dc_lum_vlc;
987static VLC v2_dc_chroma_vlc;
988static VLC cbpy_vlc;
989static VLC v2_intra_cbpc_vlc;
990static VLC v2_mb_type_vlc;
991static VLC v2_mv_vlc;
Michael Niedermayer287229e2002-06-02 12:22:30992static VLC v1_intra_cbpc_vlc;
993static VLC v1_inter_cbpc_vlc;
Aurelien Jacobs85f601e2007-11-07 23:23:35994VLC ff_inter_intra_vlc;
Michael Niedermayer84afee32002-04-05 04:09:04995
Diego Biurrun90b5b512007-06-12 18:50:50996/* This table is practically identical to the one from h263
997 * except that it is inverted. */
Falk Hüffner20695ec2002-06-03 11:16:11998static void init_h263_dc_for_msmpeg4(void)
Michael Niedermayer84afee32002-04-05 04:09:04999{
Michael Niedermayer84afee32002-04-05 04:09:041000 int level, uni_code, uni_len;
Michael Niedermayer84afee32002-04-05 04:09:041001
Michael Niedermayer2ed627e2002-04-05 16:51:121002 for(level=-256; level<256; level++){
Michael Niedermayer84afee32002-04-05 04:09:041003 int size, v, l;
1004 /* find number of bits */
1005 size = 0;
1006 v = abs(level);
1007 while (v) {
1008 v >>= 1;
Diego Biurrunbb270c02005-12-22 01:10:111009 size++;
Michael Niedermayer84afee32002-04-05 04:09:041010 }
1011
1012 if (level < 0)
1013 l= (-level) ^ ((1 << size) - 1);
1014 else
1015 l= level;
1016
1017 /* luminance h263 */
1018 uni_code= DCtab_lum[size][0];
1019 uni_len = DCtab_lum[size][1];
Diego Biurrun755bfea2007-06-12 09:29:251020 uni_code ^= (1<<uni_len)-1; //M$ does not like compatibility
Michael Niedermayer84afee32002-04-05 04:09:041021
1022 if (size > 0) {
1023 uni_code<<=size; uni_code|=l;
1024 uni_len+=size;
1025 if (size > 8){
1026 uni_code<<=1; uni_code|=1;
1027 uni_len++;
1028 }
1029 }
1030 v2_dc_lum_table[level+256][0]= uni_code;
1031 v2_dc_lum_table[level+256][1]= uni_len;
1032
1033 /* chrominance h263 */
1034 uni_code= DCtab_chrom[size][0];
1035 uni_len = DCtab_chrom[size][1];
Diego Biurrun755bfea2007-06-12 09:29:251036 uni_code ^= (1<<uni_len)-1; //M$ does not like compatibility
Diego Biurrun115329f2005-12-17 18:14:381037
Michael Niedermayer84afee32002-04-05 04:09:041038 if (size > 0) {
1039 uni_code<<=size; uni_code|=l;
1040 uni_len+=size;
1041 if (size > 8){
1042 uni_code<<=1; uni_code|=1;
1043 uni_len++;
1044 }
1045 }
1046 v2_dc_chroma_table[level+256][0]= uni_code;
1047 v2_dc_chroma_table[level+256][1]= uni_len;
1048
1049 }
Michael Niedermayer84afee32002-04-05 04:09:041050}
Fabrice Bellardde6d9b62001-07-22 14:18:561051
1052/* init all vlc decoding tables */
Michael Niedermayerf5957f32002-06-18 00:49:001053int ff_msmpeg4_decode_init(MpegEncContext *s)
Fabrice Bellardde6d9b62001-07-22 14:18:561054{
Fabrice Bellardd81c5982002-06-06 14:31:181055 static int done = 0;
Fabrice Bellardde6d9b62001-07-22 14:18:561056 int i;
1057 MVTable *mv;
1058
Michael Niedermayerf5957f32002-06-18 00:49:001059 common_init(s);
Fabrice Bellardde6d9b62001-07-22 14:18:561060
Fabrice Bellardd81c5982002-06-06 14:31:181061 if (!done) {
1062 done = 1;
Fabrice Bellardde6d9b62001-07-22 14:18:561063
Fabrice Bellardd81c5982002-06-06 14:31:181064 for(i=0;i<NB_RL_TABLES;i++) {
Michael Niedermayer3502a542007-03-14 13:19:191065 init_rl(&rl_table[i], static_rl_table_store[i]);
Burkhard Plaum073c2592004-11-27 18:10:061066 init_vlc_rl(&rl_table[i], 1);
Fabrice Bellardd81c5982002-06-06 14:31:181067 }
1068 for(i=0;i<2;i++) {
1069 mv = &mv_tables[i];
Diego Biurrun115329f2005-12-17 18:14:381070 init_vlc(&mv->vlc, MV_VLC_BITS, mv->n + 1,
Fabrice Bellardd81c5982002-06-06 14:31:181071 mv->table_mv_bits, 1, 1,
Burkhard Plaum073c2592004-11-27 18:10:061072 mv->table_mv_code, 2, 2, 1);
Fabrice Bellardd81c5982002-06-06 14:31:181073 }
1074
Diego Biurrun115329f2005-12-17 18:14:381075 init_vlc(&ff_msmp4_dc_luma_vlc[0], DC_VLC_BITS, 120,
anonymous0c040aa2005-01-26 12:01:351076 &ff_table0_dc_lum[0][1], 8, 4,
1077 &ff_table0_dc_lum[0][0], 8, 4, 1);
Diego Biurrun115329f2005-12-17 18:14:381078 init_vlc(&ff_msmp4_dc_chroma_vlc[0], DC_VLC_BITS, 120,
anonymous0c040aa2005-01-26 12:01:351079 &ff_table0_dc_chroma[0][1], 8, 4,
1080 &ff_table0_dc_chroma[0][0], 8, 4, 1);
Diego Biurrun115329f2005-12-17 18:14:381081 init_vlc(&ff_msmp4_dc_luma_vlc[1], DC_VLC_BITS, 120,
anonymous0c040aa2005-01-26 12:01:351082 &ff_table1_dc_lum[0][1], 8, 4,
1083 &ff_table1_dc_lum[0][0], 8, 4, 1);
Diego Biurrun115329f2005-12-17 18:14:381084 init_vlc(&ff_msmp4_dc_chroma_vlc[1], DC_VLC_BITS, 120,
anonymous0c040aa2005-01-26 12:01:351085 &ff_table1_dc_chroma[0][1], 8, 4,
1086 &ff_table1_dc_chroma[0][0], 8, 4, 1);
Diego Biurrun115329f2005-12-17 18:14:381087
1088 init_vlc(&v2_dc_lum_vlc, DC_VLC_BITS, 512,
Fabrice Bellardd81c5982002-06-06 14:31:181089 &v2_dc_lum_table[0][1], 8, 4,
Burkhard Plaum073c2592004-11-27 18:10:061090 &v2_dc_lum_table[0][0], 8, 4, 1);
Diego Biurrun115329f2005-12-17 18:14:381091 init_vlc(&v2_dc_chroma_vlc, DC_VLC_BITS, 512,
Fabrice Bellardd81c5982002-06-06 14:31:181092 &v2_dc_chroma_table[0][1], 8, 4,
Burkhard Plaum073c2592004-11-27 18:10:061093 &v2_dc_chroma_table[0][0], 8, 4, 1);
Diego Biurrun115329f2005-12-17 18:14:381094
Michael Niedermayer08dce7b2002-07-10 20:05:421095 init_vlc(&cbpy_vlc, CBPY_VLC_BITS, 16,
Fabrice Bellardd81c5982002-06-06 14:31:181096 &cbpy_tab[0][1], 2, 1,
Burkhard Plaum073c2592004-11-27 18:10:061097 &cbpy_tab[0][0], 2, 1, 1);
Michael Niedermayer08dce7b2002-07-10 20:05:421098 init_vlc(&v2_intra_cbpc_vlc, V2_INTRA_CBPC_VLC_BITS, 4,
Fabrice Bellardd81c5982002-06-06 14:31:181099 &v2_intra_cbpc[0][1], 2, 1,
Burkhard Plaum073c2592004-11-27 18:10:061100 &v2_intra_cbpc[0][0], 2, 1, 1);
Michael Niedermayer08dce7b2002-07-10 20:05:421101 init_vlc(&v2_mb_type_vlc, V2_MB_TYPE_VLC_BITS, 8,
Fabrice Bellardd81c5982002-06-06 14:31:181102 &v2_mb_type[0][1], 2, 1,
Burkhard Plaum073c2592004-11-27 18:10:061103 &v2_mb_type[0][0], 2, 1, 1);
Michael Niedermayer08dce7b2002-07-10 20:05:421104 init_vlc(&v2_mv_vlc, V2_MV_VLC_BITS, 33,
Fabrice Bellardd81c5982002-06-06 14:31:181105 &mvtab[0][1], 2, 1,
Burkhard Plaum073c2592004-11-27 18:10:061106 &mvtab[0][0], 2, 1, 1);
Fabrice Bellardd81c5982002-06-06 14:31:181107
Michael Niedermayer1457ab52002-12-27 23:51:461108 for(i=0; i<4; i++){
Aurelien Jacobs85f601e2007-11-07 23:23:351109 init_vlc(&ff_mb_non_intra_vlc[i], MB_NON_INTRA_VLC_BITS, 128,
Michael Niedermayer1457ab52002-12-27 23:51:461110 &wmv2_inter_table[i][0][1], 8, 4,
Burkhard Plaum073c2592004-11-27 18:10:061111 &wmv2_inter_table[i][0][0], 8, 4, 1); //FIXME name?
Michael Niedermayer1457ab52002-12-27 23:51:461112 }
Diego Biurrun115329f2005-12-17 18:14:381113
1114 init_vlc(&ff_msmp4_mb_i_vlc, MB_INTRA_VLC_BITS, 64,
anonymous0d33db82005-01-30 16:34:571115 &ff_msmp4_mb_i_table[0][1], 4, 2,
1116 &ff_msmp4_mb_i_table[0][0], 4, 2, 1);
Diego Biurrun115329f2005-12-17 18:14:381117
1118 init_vlc(&v1_intra_cbpc_vlc, V1_INTRA_CBPC_VLC_BITS, 8,
Fabrice Bellardd81c5982002-06-06 14:31:181119 intra_MCBPC_bits, 1, 1,
Burkhard Plaum073c2592004-11-27 18:10:061120 intra_MCBPC_code, 1, 1, 1);
Diego Biurrun115329f2005-12-17 18:14:381121 init_vlc(&v1_inter_cbpc_vlc, V1_INTER_CBPC_VLC_BITS, 25,
Fabrice Bellardd81c5982002-06-06 14:31:181122 inter_MCBPC_bits, 1, 1,
Burkhard Plaum073c2592004-11-27 18:10:061123 inter_MCBPC_code, 1, 1, 1);
Diego Biurrun115329f2005-12-17 18:14:381124
Aurelien Jacobs85f601e2007-11-07 23:23:351125 init_vlc(&ff_inter_intra_vlc, INTER_INTRA_VLC_BITS, 4,
Michael Niedermayerde0f2f42002-07-07 08:34:461126 &table_inter_intra[0][1], 2, 1,
Burkhard Plaum073c2592004-11-27 18:10:061127 &table_inter_intra[0][0], 2, 1, 1);
Fabrice Bellardd81c5982002-06-06 14:31:181128 }
Diego Biurrun115329f2005-12-17 18:14:381129
Michael Niedermayer4d2858d2002-10-13 13:16:041130 switch(s->msmpeg4_version){
1131 case 1:
1132 case 2:
1133 s->decode_mb= msmpeg4v12_decode_mb;
1134 break;
1135 case 3:
1136 case 4:
1137 s->decode_mb= msmpeg4v34_decode_mb;
1138 break;
Michael Niedermayer1457ab52002-12-27 23:51:461139 case 5:
Aurelien Jacobscc6de102007-11-07 23:41:391140 if (ENABLE_WMV2_DECODER)
Aurelien Jacobsc16d6c52007-11-07 23:42:241141 s->decode_mb= ff_wmv2_decode_mb;
anonymous0d33db82005-01-30 16:34:571142 case 6:
Kostya Shishkov10b9c372006-06-27 02:55:541143 //FIXME + TODO VC1 decode mb
Michael Niedermayer1457ab52002-12-27 23:51:461144 break;
Michael Niedermayer4d2858d2002-10-13 13:16:041145 }
Diego Biurrun115329f2005-12-17 18:14:381146
Diego Biurrun755bfea2007-06-12 09:29:251147 s->slice_height= s->mb_height; //to avoid 1/0 if the first frame is not a keyframe
Diego Biurrun115329f2005-12-17 18:14:381148
Fabrice Bellardde6d9b62001-07-22 14:18:561149 return 0;
1150}
1151
Michael Niedermayer7f89b6f2002-03-29 02:07:251152int msmpeg4_decode_picture_header(MpegEncContext * s)
1153{
Michael Niedermayerf5957f32002-06-18 00:49:001154 int code;
Michael Niedermayer84afee32002-04-05 04:09:041155
Michael Niedermayere1a9dbf2002-04-06 22:29:371156#if 0
1157{
1158int i;
Michael Niedermayer68f593b2003-01-21 17:34:121159for(i=0; i<s->gb.size_in_bits; i++)
Steve L'Homme267f7ed2006-03-08 11:43:101160 av_log(s->avctx, AV_LOG_DEBUG, "%d", get_bits1(&s->gb));
Michael Niedermayere1a9dbf2002-04-06 22:29:371161// get_bits1(&s->gb);
Steve L'Homme267f7ed2006-03-08 11:43:101162av_log(s->avctx, AV_LOG_DEBUG, "END\n");
Michael Niedermayere1a9dbf2002-04-06 22:29:371163return -1;
1164}
1165#endif
Michael Niedermayer287229e2002-06-02 12:22:301166
1167 if(s->msmpeg4_version==1){
1168 int start_code, num;
1169 start_code = (get_bits(&s->gb, 16)<<16) | get_bits(&s->gb, 16);
1170 if(start_code!=0x00000100){
Michel Bardiaux9b879562003-11-03 13:26:221171 av_log(s->avctx, AV_LOG_ERROR, "invalid startcode\n");
Michael Niedermayer287229e2002-06-02 12:22:301172 return -1;
1173 }
1174
1175 num= get_bits(&s->gb, 5); // frame number */
1176 }
1177
Michael Niedermayer7f89b6f2002-03-29 02:07:251178 s->pict_type = get_bits(&s->gb, 2) + 1;
1179 if (s->pict_type != I_TYPE &&
Michael Niedermayer287229e2002-06-02 12:22:301180 s->pict_type != P_TYPE){
Michel Bardiaux9b879562003-11-03 13:26:221181 av_log(s->avctx, AV_LOG_ERROR, "invalid picture type\n");
Michael Niedermayer7f89b6f2002-03-29 02:07:251182 return -1;
Michael Niedermayer287229e2002-06-02 12:22:301183 }
Michael Niedermayerde0f2f42002-07-07 08:34:461184#if 0
1185{
1186 static int had_i=0;
1187 if(s->pict_type == I_TYPE) had_i=1;
1188 if(!had_i) return -1;
1189}
1190#endif
Michael Niedermayer6beeb962003-12-03 16:07:411191 s->chroma_qscale= s->qscale = get_bits(&s->gb, 5);
Michael Niedermayerae2d2d62003-02-10 22:43:301192 if(s->qscale==0){
Michel Bardiaux9b879562003-11-03 13:26:221193 av_log(s->avctx, AV_LOG_ERROR, "invalid qscale\n");
Michael Niedermayerae2d2d62003-02-10 22:43:301194 return -1;
1195 }
Michael Niedermayer7f89b6f2002-03-29 02:07:251196
1197 if (s->pict_type == I_TYPE) {
Diego Biurrun115329f2005-12-17 18:14:381198 code = get_bits(&s->gb, 5);
Michael Niedermayer287229e2002-06-02 12:22:301199 if(s->msmpeg4_version==1){
1200 if(code==0 || code>s->mb_height){
Michel Bardiaux9b879562003-11-03 13:26:221201 av_log(s->avctx, AV_LOG_ERROR, "invalid slice height %d\n", code);
Michael Niedermayer287229e2002-06-02 12:22:301202 return -1;
1203 }
1204
1205 s->slice_height = code;
1206 }else{
1207 /* 0x17: one slice, 0x18: two slices, ... */
Michael Niedermayerde0f2f42002-07-07 08:34:461208 if (code < 0x17){
Michel Bardiaux9b879562003-11-03 13:26:221209 av_log(s->avctx, AV_LOG_ERROR, "error, slice code was %X\n", code);
Michael Niedermayer287229e2002-06-02 12:22:301210 return -1;
Michael Niedermayerde0f2f42002-07-07 08:34:461211 }
Michael Niedermayer287229e2002-06-02 12:22:301212
1213 s->slice_height = s->mb_height / (code - 0x16);
1214 }
Michael Niedermayere1a9dbf2002-04-06 22:29:371215
1216 switch(s->msmpeg4_version){
Michael Niedermayer287229e2002-06-02 12:22:301217 case 1:
Michael Niedermayere1a9dbf2002-04-06 22:29:371218 case 2:
Michael Niedermayer84afee32002-04-05 04:09:041219 s->rl_chroma_table_index = 2;
1220 s->rl_table_index = 2;
Fabrice Bellardde6d9b62001-07-22 14:18:561221
Michael Niedermayer84afee32002-04-05 04:09:041222 s->dc_table_index = 0; //not used
Michael Niedermayere1a9dbf2002-04-06 22:29:371223 break;
1224 case 3:
Michael Niedermayer84afee32002-04-05 04:09:041225 s->rl_chroma_table_index = decode012(&s->gb);
1226 s->rl_table_index = decode012(&s->gb);
1227
1228 s->dc_table_index = get_bits1(&s->gb);
Michael Niedermayere1a9dbf2002-04-06 22:29:371229 break;
1230 case 4:
Michael Niedermayerf5957f32002-06-18 00:49:001231 msmpeg4_decode_ext_header(s, (2+5+5+17+7)/8);
Michael Niedermayere1a9dbf2002-04-06 22:29:371232
Michael Niedermayer05174fd2002-07-22 08:15:271233 if(s->bit_rate > MBAC_BITRATE) s->per_mb_rl_table= get_bits1(&s->gb);
1234 else s->per_mb_rl_table= 0;
Diego Biurrun115329f2005-12-17 18:14:381235
Michael Niedermayerf5957f32002-06-18 00:49:001236 if(!s->per_mb_rl_table){
1237 s->rl_chroma_table_index = decode012(&s->gb);
1238 s->rl_table_index = decode012(&s->gb);
1239 }
1240
1241 s->dc_table_index = get_bits1(&s->gb);
Michael Niedermayerde0f2f42002-07-07 08:34:461242 s->inter_intra_pred= 0;
Michael Niedermayere1a9dbf2002-04-06 22:29:371243 break;
Michael Niedermayer84afee32002-04-05 04:09:041244 }
Fabrice Bellardde6d9b62001-07-22 14:18:561245 s->no_rounding = 1;
Michael Niedermayer80adda82003-07-29 01:45:191246 if(s->avctx->debug&FF_DEBUG_PICT_INFO)
Diego Biurrunbb270c02005-12-22 01:10:111247 av_log(s->avctx, AV_LOG_DEBUG, "qscale:%d rlc:%d rl:%d dc:%d mbrl:%d slice:%d \n",
1248 s->qscale,
1249 s->rl_chroma_table_index,
1250 s->rl_table_index,
1251 s->dc_table_index,
Michael Niedermayerde0f2f42002-07-07 08:34:461252 s->per_mb_rl_table,
Michael Niedermayer80adda82003-07-29 01:45:191253 s->slice_height);
Fabrice Bellardde6d9b62001-07-22 14:18:561254 } else {
Michael Niedermayer287229e2002-06-02 12:22:301255 switch(s->msmpeg4_version){
1256 case 1:
1257 case 2:
1258 if(s->msmpeg4_version==1)
1259 s->use_skip_mb_code = 1;
1260 else
1261 s->use_skip_mb_code = get_bits1(&s->gb);
Michael Niedermayer84afee32002-04-05 04:09:041262 s->rl_table_index = 2;
1263 s->rl_chroma_table_index = s->rl_table_index;
Michael Niedermayer84afee32002-04-05 04:09:041264 s->dc_table_index = 0; //not used
Michael Niedermayer84afee32002-04-05 04:09:041265 s->mv_table_index = 0;
Michael Niedermayer287229e2002-06-02 12:22:301266 break;
1267 case 3:
1268 s->use_skip_mb_code = get_bits1(&s->gb);
Michael Niedermayer84afee32002-04-05 04:09:041269 s->rl_table_index = decode012(&s->gb);
1270 s->rl_chroma_table_index = s->rl_table_index;
1271
1272 s->dc_table_index = get_bits1(&s->gb);
1273
1274 s->mv_table_index = get_bits1(&s->gb);
Michael Niedermayer287229e2002-06-02 12:22:301275 break;
Michael Niedermayerf5957f32002-06-18 00:49:001276 case 4:
1277 s->use_skip_mb_code = get_bits1(&s->gb);
Michael Niedermayerde0f2f42002-07-07 08:34:461278
Michael Niedermayer05174fd2002-07-22 08:15:271279 if(s->bit_rate > MBAC_BITRATE) s->per_mb_rl_table= get_bits1(&s->gb);
1280 else s->per_mb_rl_table= 0;
Michael Niedermayerde0f2f42002-07-07 08:34:461281
Michael Niedermayerf5957f32002-06-18 00:49:001282 if(!s->per_mb_rl_table){
1283 s->rl_table_index = decode012(&s->gb);
1284 s->rl_chroma_table_index = s->rl_table_index;
1285 }
1286
1287 s->dc_table_index = get_bits1(&s->gb);
1288
1289 s->mv_table_index = get_bits1(&s->gb);
Michael Niedermayer05174fd2002-07-22 08:15:271290 s->inter_intra_pred= (s->width*s->height < 320*240 && s->bit_rate<=II_BITRATE);
Michael Niedermayerf5957f32002-06-18 00:49:001291 break;
Michael Niedermayer84afee32002-04-05 04:09:041292 }
Diego Biurrun115329f2005-12-17 18:14:381293
Michael Niedermayer80adda82003-07-29 01:45:191294 if(s->avctx->debug&FF_DEBUG_PICT_INFO)
Diego Biurrunbb270c02005-12-22 01:10:111295 av_log(s->avctx, AV_LOG_DEBUG, "skip:%d rl:%d rlc:%d dc:%d mv:%d mbrl:%d qp:%d \n",
1296 s->use_skip_mb_code,
1297 s->rl_table_index,
1298 s->rl_chroma_table_index,
1299 s->dc_table_index,
1300 s->mv_table_index,
Michael Niedermayerde0f2f42002-07-07 08:34:461301 s->per_mb_rl_table,
Michael Niedermayer80adda82003-07-29 01:45:191302 s->qscale);
1303
Diego Biurrunbb270c02005-12-22 01:10:111304 if(s->flipflop_rounding){
1305 s->no_rounding ^= 1;
1306 }else{
1307 s->no_rounding = 0;
1308 }
Fabrice Bellardde6d9b62001-07-22 14:18:561309 }
Michael Niedermayer1457ab52002-12-27 23:51:461310//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:001311
1312 s->esc3_level_length= 0;
1313 s->esc3_run_length= 0;
Michael Niedermayer84afee32002-04-05 04:09:041314
Fabrice Bellardde6d9b62001-07-22 14:18:561315#ifdef DEBUG
Steve L'Homme267f7ed2006-03-08 11:43:101316 av_log(s->avctx, AV_LOG_DEBUG, "*****frame %d:\n", frame_count++);
Fabrice Bellardde6d9b62001-07-22 14:18:561317#endif
1318 return 0;
1319}
1320
Michael Niedermayerae404842002-01-15 22:22:411321int msmpeg4_decode_ext_header(MpegEncContext * s, int buf_size)
1322{
Michael Niedermayer287229e2002-06-02 12:22:301323 int left= buf_size*8 - get_bits_count(&s->gb);
1324 int length= s->msmpeg4_version>=3 ? 17 : 16;
Michael Niedermayerae404842002-01-15 22:22:411325 /* the alt_bitstream reader could read over the end so we need to check it */
Michael Niedermayer287229e2002-06-02 12:22:301326 if(left>=length && left<length+8)
Michael Niedermayerae404842002-01-15 22:22:411327 {
Michael Niedermayer2b9ab1d2002-02-22 19:19:011328 int fps;
1329
1330 fps= get_bits(&s->gb, 5);
Michael Niedermayer05174fd2002-07-22 08:15:271331 s->bit_rate= get_bits(&s->gb, 11)*1024;
Michael Niedermayer287229e2002-06-02 12:22:301332 if(s->msmpeg4_version>=3)
1333 s->flipflop_rounding= get_bits1(&s->gb);
1334 else
1335 s->flipflop_rounding= 0;
Michael Niedermayer2b9ab1d2002-02-22 19:19:011336
Michael Niedermayer05174fd2002-07-22 08:15:271337// printf("fps:%2d bps:%2d roundingType:%1d\n", fps, s->bit_rate/1024, s->flipflop_rounding);
Michael Niedermayer287229e2002-06-02 12:22:301338 }
1339 else if(left<length+8)
1340 {
1341 s->flipflop_rounding= 0;
Michael Niedermayer62563c32003-08-10 21:11:451342 if(s->msmpeg4_version != 2)
Michel Bardiaux9b879562003-11-03 13:26:221343 av_log(s->avctx, AV_LOG_ERROR, "ext header missing, %d left\n", left);
Michael Niedermayerae404842002-01-15 22:22:411344 }
1345 else
1346 {
Michel Bardiaux9b879562003-11-03 13:26:221347 av_log(s->avctx, AV_LOG_ERROR, "I frame too long, ignoring ext header\n");
Michael Niedermayerae404842002-01-15 22:22:411348 }
Michael Niedermayer2b9ab1d2002-02-22 19:19:011349
Michael Niedermayerae404842002-01-15 22:22:411350 return 0;
1351}
1352
Zdenek Kabelaccd4af682002-05-27 16:42:141353static inline void msmpeg4_memsetw(short *tab, int val, int n)
Fabrice Bellardde6d9b62001-07-22 14:18:561354{
1355 int i;
1356 for(i=0;i<n;i++)
1357 tab[i] = val;
1358}
1359
Måns Rullgård62bb4892006-09-27 19:54:071360#ifdef CONFIG_ENCODERS
Michael Niedermayer3825cd12002-04-05 21:04:091361static void msmpeg4v2_encode_motion(MpegEncContext * s, int val)
1362{
1363 int range, bit_size, sign, code, bits;
1364
1365 if (val == 0) {
1366 /* zero vector */
1367 code = 0;
1368 put_bits(&s->pb, mvtab[code][1], mvtab[code][0]);
1369 } else {
1370 bit_size = s->f_code - 1;
1371 range = 1 << bit_size;
1372 if (val <= -64)
1373 val += 64;
1374 else if (val >= 64)
1375 val -= 64;
1376
1377 if (val >= 0) {
1378 sign = 0;
1379 } else {
1380 val = -val;
1381 sign = 1;
1382 }
1383 val--;
1384 code = (val >> bit_size) + 1;
1385 bits = val & (range - 1);
1386
Diego Biurrun115329f2005-12-17 18:14:381387 put_bits(&s->pb, mvtab[code][1] + 1, (mvtab[code][0] << 1) | sign);
Michael Niedermayer3825cd12002-04-05 21:04:091388 if (bit_size > 0) {
1389 put_bits(&s->pb, bit_size, bits);
1390 }
1391 }
1392}
Måns Rullgård62bb4892006-09-27 19:54:071393#endif
Michael Niedermayer3825cd12002-04-05 21:04:091394
Diego Biurrun90b5b512007-06-12 18:50:501395/* This is identical to h263 except that its range is multiplied by 2. */
Michael Niedermayer84afee32002-04-05 04:09:041396static int msmpeg4v2_decode_motion(MpegEncContext * s, int pred, int f_code)
1397{
1398 int code, val, sign, shift;
1399
Michael Niedermayer08dce7b2002-07-10 20:05:421400 code = get_vlc2(&s->gb, v2_mv_vlc.table, V2_MV_VLC_BITS, 2);
Michael Niedermayer287229e2002-06-02 12:22:301401// printf("MV code %d at %d %d pred: %d\n", code, s->mb_x,s->mb_y, pred);
Michael Niedermayer84afee32002-04-05 04:09:041402 if (code < 0)
1403 return 0xffff;
1404
1405 if (code == 0)
1406 return pred;
1407 sign = get_bits1(&s->gb);
1408 shift = f_code - 1;
BERO05858882003-05-14 01:08:021409 val = code;
1410 if (shift) {
1411 val = (val - 1) << shift;
Michael Niedermayer84afee32002-04-05 04:09:041412 val |= get_bits(&s->gb, shift);
BERO05858882003-05-14 01:08:021413 val++;
1414 }
Michael Niedermayer84afee32002-04-05 04:09:041415 if (sign)
1416 val = -val;
Michael Niedermayer84afee32002-04-05 04:09:041417
Michael Niedermayer287229e2002-06-02 12:22:301418 val += pred;
Michael Niedermayer84afee32002-04-05 04:09:041419 if (val <= -64)
1420 val += 64;
1421 else if (val >= 64)
1422 val -= 64;
1423
1424 return val;
1425}
1426
Michael Niedermayer4d2858d2002-10-13 13:16:041427static int msmpeg4v12_decode_mb(MpegEncContext *s, DCTELEM block[6][64])
Michael Niedermayer84afee32002-04-05 04:09:041428{
1429 int cbp, code, i;
Diego Biurrun115329f2005-12-17 18:14:381430
Michael Niedermayer84afee32002-04-05 04:09:041431 if (s->pict_type == P_TYPE) {
1432 if (s->use_skip_mb_code) {
1433 if (get_bits1(&s->gb)) {
1434 /* skip mb */
1435 s->mb_intra = 0;
1436 for(i=0;i<6;i++)
1437 s->block_last_index[i] = -1;
1438 s->mv_dir = MV_DIR_FORWARD;
1439 s->mv_type = MV_TYPE_16X16;
1440 s->mv[0][0][0] = 0;
1441 s->mv[0][0][1] = 0;
Mike Melanson160d6792005-04-24 17:21:111442 s->mb_skipped = 1;
Michael Niedermayer84afee32002-04-05 04:09:041443 return 0;
1444 }
1445 }
1446
Michael Niedermayer287229e2002-06-02 12:22:301447 if(s->msmpeg4_version==2)
Michael Niedermayer08dce7b2002-07-10 20:05:421448 code = get_vlc2(&s->gb, v2_mb_type_vlc.table, V2_MB_TYPE_VLC_BITS, 1);
Michael Niedermayer287229e2002-06-02 12:22:301449 else
Michael Niedermayer08dce7b2002-07-10 20:05:421450 code = get_vlc2(&s->gb, v1_inter_cbpc_vlc.table, V1_INTER_CBPC_VLC_BITS, 3);
Michael Niedermayer287229e2002-06-02 12:22:301451 if(code<0 || code>7){
Michel Bardiaux9b879562003-11-03 13:26:221452 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:301453 return -1;
1454 }
1455
Michael Niedermayer84afee32002-04-05 04:09:041456 s->mb_intra = code >>2;
Diego Biurrun115329f2005-12-17 18:14:381457
Michael Niedermayer84afee32002-04-05 04:09:041458 cbp = code & 0x3;
1459 } else {
1460 s->mb_intra = 1;
Michael Niedermayer287229e2002-06-02 12:22:301461 if(s->msmpeg4_version==2)
Michael Niedermayer08dce7b2002-07-10 20:05:421462 cbp= get_vlc2(&s->gb, v2_intra_cbpc_vlc.table, V2_INTRA_CBPC_VLC_BITS, 1);
Michael Niedermayer287229e2002-06-02 12:22:301463 else
Michael Niedermayer08dce7b2002-07-10 20:05:421464 cbp= get_vlc2(&s->gb, v1_intra_cbpc_vlc.table, V1_INTRA_CBPC_VLC_BITS, 1);
Michael Niedermayer287229e2002-06-02 12:22:301465 if(cbp<0 || cbp>3){
Michel Bardiaux9b879562003-11-03 13:26:221466 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:301467 return -1;
1468 }
Michael Niedermayer84afee32002-04-05 04:09:041469 }
1470
1471 if (!s->mb_intra) {
Michael Niedermayer287229e2002-06-02 12:22:301472 int mx, my, cbpy;
Diego Biurrun115329f2005-12-17 18:14:381473
Michael Niedermayer08dce7b2002-07-10 20:05:421474 cbpy= get_vlc2(&s->gb, cbpy_vlc.table, CBPY_VLC_BITS, 1);
Michael Niedermayer287229e2002-06-02 12:22:301475 if(cbpy<0){
Michel Bardiaux9b879562003-11-03 13:26:221476 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:301477 return -1;
1478 }
Michael Niedermayer84afee32002-04-05 04:09:041479
Michael Niedermayer287229e2002-06-02 12:22:301480 cbp|= cbpy<<2;
1481 if(s->msmpeg4_version==1 || (cbp&3) != 3) cbp^= 0x3C;
Diego Biurrun115329f2005-12-17 18:14:381482
Michael Niedermayer137c8462004-04-16 01:01:451483 h263_pred_motion(s, 0, 0, &mx, &my);
Michael Niedermayer84afee32002-04-05 04:09:041484 mx= msmpeg4v2_decode_motion(s, mx, 1);
1485 my= msmpeg4v2_decode_motion(s, my, 1);
Diego Biurrun115329f2005-12-17 18:14:381486
Michael Niedermayer84afee32002-04-05 04:09:041487 s->mv_dir = MV_DIR_FORWARD;
1488 s->mv_type = MV_TYPE_16X16;
1489 s->mv[0][0][0] = mx;
1490 s->mv[0][0][1] = my;
1491 } else {
Michael Niedermayer287229e2002-06-02 12:22:301492 if(s->msmpeg4_version==2){
1493 s->ac_pred = get_bits1(&s->gb);
Michael Niedermayer08dce7b2002-07-10 20:05:421494 cbp|= get_vlc2(&s->gb, cbpy_vlc.table, CBPY_VLC_BITS, 1)<<2; //FIXME check errors
Michael Niedermayer287229e2002-06-02 12:22:301495 } else{
1496 s->ac_pred = 0;
Michael Niedermayer08dce7b2002-07-10 20:05:421497 cbp|= get_vlc2(&s->gb, cbpy_vlc.table, CBPY_VLC_BITS, 1)<<2; //FIXME check errors
Michael Niedermayer287229e2002-06-02 12:22:301498 if(s->pict_type==P_TYPE) cbp^=0x3C;
1499 }
Michael Niedermayer84afee32002-04-05 04:09:041500 }
1501
Michael Niedermayerdee6dde2005-04-25 00:57:481502 s->dsp.clear_blocks(s->block[0]);
Michael Niedermayer84afee32002-04-05 04:09:041503 for (i = 0; i < 6; i++) {
Aurelien Jacobs85f601e2007-11-07 23:23:351504 if (ff_msmpeg4_decode_block(s, block[i], i, (cbp >> (5 - i)) & 1, NULL) < 0)
Diego Biurrunbb270c02005-12-22 01:10:111505 {
Michel Bardiaux9b879562003-11-03 13:26:221506 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:041507 return -1;
Diego Biurrunbb270c02005-12-22 01:10:111508 }
Michael Niedermayer84afee32002-04-05 04:09:041509 }
1510 return 0;
1511}
1512
Michael Niedermayer4d2858d2002-10-13 13:16:041513static int msmpeg4v34_decode_mb(MpegEncContext *s, DCTELEM block[6][64])
Fabrice Bellardde6d9b62001-07-22 14:18:561514{
1515 int cbp, code, i;
Zdenek Kabelac0c1a9ed2003-02-11 16:35:481516 uint8_t *coded_val;
Michael Niedermayer7bc90902003-04-10 13:18:381517 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:561518
1519 if (s->pict_type == P_TYPE) {
Fabrice Bellardde6d9b62001-07-22 14:18:561520 if (s->use_skip_mb_code) {
Arpi612476e2001-08-04 00:46:501521 if (get_bits1(&s->gb)) {
Fabrice Bellardde6d9b62001-07-22 14:18:561522 /* skip mb */
1523 s->mb_intra = 0;
1524 for(i=0;i<6;i++)
1525 s->block_last_index[i] = -1;
1526 s->mv_dir = MV_DIR_FORWARD;
1527 s->mv_type = MV_TYPE_16X16;
1528 s->mv[0][0][0] = 0;
1529 s->mv[0][0][1] = 0;
Mike Melanson160d6792005-04-24 17:21:111530 s->mb_skipped = 1;
Michael Niedermayer7bc90902003-04-10 13:18:381531 *mb_type_ptr = MB_TYPE_SKIP | MB_TYPE_L0 | MB_TYPE_16x16;
1532
Fabrice Bellardde6d9b62001-07-22 14:18:561533 return 0;
1534 }
1535 }
Diego Biurrun115329f2005-12-17 18:14:381536
Aurelien Jacobs85f601e2007-11-07 23:23:351537 code = get_vlc2(&s->gb, ff_mb_non_intra_vlc[DEFAULT_INTER_INDEX].table, MB_NON_INTRA_VLC_BITS, 3);
Fabrice Bellardde6d9b62001-07-22 14:18:561538 if (code < 0)
1539 return -1;
Diego Biurrunbb270c02005-12-22 01:10:111540 //s->mb_intra = (code & 0x40) ? 0 : 1;
1541 s->mb_intra = (~code & 0x40) >> 6;
Diego Biurrun115329f2005-12-17 18:14:381542
Fabrice Bellardde6d9b62001-07-22 14:18:561543 cbp = code & 0x3f;
1544 } else {
Fabrice Bellardde6d9b62001-07-22 14:18:561545 s->mb_intra = 1;
anonymous0d33db82005-01-30 16:34:571546 code = get_vlc2(&s->gb, ff_msmp4_mb_i_vlc.table, MB_INTRA_VLC_BITS, 2);
Fabrice Bellardde6d9b62001-07-22 14:18:561547 if (code < 0)
1548 return -1;
1549 /* predict coded block pattern */
1550 cbp = 0;
1551 for(i=0;i<6;i++) {
Zdenek Kabelac38d171e2002-02-18 09:34:541552 int val = ((code >> (5 - i)) & 1);
Fabrice Bellardde6d9b62001-07-22 14:18:561553 if (i < 4) {
Aurelien Jacobs85f601e2007-11-07 23:23:351554 int pred = ff_msmpeg4_coded_block_pred(s, i, &coded_val);
Fabrice Bellardde6d9b62001-07-22 14:18:561555 val = val ^ pred;
1556 *coded_val = val;
1557 }
1558 cbp |= val << (5 - i);
1559 }
1560 }
1561
1562 if (!s->mb_intra) {
1563 int mx, my;
Michael Niedermayerf5957f32002-06-18 00:49:001564//printf("P at %d %d\n", s->mb_x, s->mb_y);
1565 if(s->per_mb_rl_table && cbp){
1566 s->rl_table_index = decode012(&s->gb);
1567 s->rl_chroma_table_index = s->rl_table_index;
1568 }
Michael Niedermayer137c8462004-04-16 01:01:451569 h263_pred_motion(s, 0, 0, &mx, &my);
Aurelien Jacobs85f601e2007-11-07 23:23:351570 if (ff_msmpeg4_decode_motion(s, &mx, &my) < 0)
Fabrice Bellardde6d9b62001-07-22 14:18:561571 return -1;
1572 s->mv_dir = MV_DIR_FORWARD;
1573 s->mv_type = MV_TYPE_16X16;
1574 s->mv[0][0][0] = mx;
1575 s->mv[0][0][1] = my;
Michael Niedermayer7bc90902003-04-10 13:18:381576 *mb_type_ptr = MB_TYPE_L0 | MB_TYPE_16x16;
Fabrice Bellardde6d9b62001-07-22 14:18:561577 } else {
Michael Niedermayerf5957f32002-06-18 00:49:001578//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:501579 s->ac_pred = get_bits1(&s->gb);
Michael Niedermayer7bc90902003-04-10 13:18:381580 *mb_type_ptr = MB_TYPE_INTRA;
Michael Niedermayerde0f2f42002-07-07 08:34:461581 if(s->inter_intra_pred){
Aurelien Jacobs85f601e2007-11-07 23:23:351582 s->h263_aic_dir= get_vlc2(&s->gb, ff_inter_intra_vlc.table, INTER_INTRA_VLC_BITS, 1);
Michael Niedermayerde0f2f42002-07-07 08:34:461583// printf("%d%d %d %d/", s->ac_pred, s->h263_aic_dir, s->mb_x, s->mb_y);
1584 }
Michael Niedermayerf5957f32002-06-18 00:49:001585 if(s->per_mb_rl_table && cbp){
1586 s->rl_table_index = decode012(&s->gb);
1587 s->rl_chroma_table_index = s->rl_table_index;
1588 }
Fabrice Bellardde6d9b62001-07-22 14:18:561589 }
1590
Michael Niedermayerdee6dde2005-04-25 00:57:481591 s->dsp.clear_blocks(s->block[0]);
Fabrice Bellardde6d9b62001-07-22 14:18:561592 for (i = 0; i < 6; i++) {
Aurelien Jacobs85f601e2007-11-07 23:23:351593 if (ff_msmpeg4_decode_block(s, block[i], i, (cbp >> (5 - i)) & 1, NULL) < 0)
Diego Biurrunbb270c02005-12-22 01:10:111594 {
1595 av_log(s->avctx, AV_LOG_ERROR, "\nerror while decoding block: %d x %d (%d)\n", s->mb_x, s->mb_y, i);
1596 return -1;
1597 }
Fabrice Bellardde6d9b62001-07-22 14:18:561598 }
Diego Biurrun115329f2005-12-17 18:14:381599
Fabrice Bellardde6d9b62001-07-22 14:18:561600 return 0;
1601}
Michael Niedermayer1a013242002-07-17 09:15:141602//#define ERROR_DETAILS
Aurelien Jacobs85f601e2007-11-07 23:23:351603int ff_msmpeg4_decode_block(MpegEncContext * s, DCTELEM * block,
Michael Niedermayer1457ab52002-12-27 23:51:461604 int n, int coded, const uint8_t *scan_table)
Fabrice Bellardde6d9b62001-07-22 14:18:561605{
Michael Niedermayer45a82ed2002-07-13 14:55:121606 int level, i, last, run, run_diff;
Fabrice Bellardde6d9b62001-07-22 14:18:561607 int dc_pred_dir;
1608 RLTable *rl;
Michael Niedermayer45a82ed2002-07-13 14:55:121609 RL_VLC_ELEM *rl_vlc;
Michael Niedermayerbadaf882002-01-13 04:59:371610 int qmul, qadd;
Fabrice Bellardde6d9b62001-07-22 14:18:561611
1612 if (s->mb_intra) {
Michael Niedermayerbadaf882002-01-13 04:59:371613 qmul=1;
1614 qadd=0;
1615
Diego Biurrunbb270c02005-12-22 01:10:111616 /* DC coef */
Fabrice Bellardde6d9b62001-07-22 14:18:561617 level = msmpeg4_decode_dc(s, n, &dc_pred_dir);
Diego Biurrun115329f2005-12-17 18:14:381618
Michael Niedermayer287229e2002-06-02 12:22:301619 if (level < 0){
Michel Bardiaux9b879562003-11-03 13:26:221620 av_log(s->avctx, AV_LOG_ERROR, "dc overflow- block: %d qscale: %d//\n", n, s->qscale);
Michael Niedermayerde0f2f42002-07-07 08:34:461621 if(s->inter_intra_pred) level=0;
1622 else return -1;
Michael Niedermayer287229e2002-06-02 12:22:301623 }
Fabrice Bellardde6d9b62001-07-22 14:18:561624 if (n < 4) {
1625 rl = &rl_table[s->rl_table_index];
Michael Niedermayer287229e2002-06-02 12:22:301626 if(level > 256*s->y_dc_scale){
Michel Bardiaux9b879562003-11-03 13:26:221627 av_log(s->avctx, AV_LOG_ERROR, "dc overflow+ L qscale: %d//\n", s->qscale);
Michael Niedermayerde0f2f42002-07-07 08:34:461628 if(!s->inter_intra_pred) return -1;
Michael Niedermayer287229e2002-06-02 12:22:301629 }
Fabrice Bellardde6d9b62001-07-22 14:18:561630 } else {
1631 rl = &rl_table[3 + s->rl_chroma_table_index];
Michael Niedermayer287229e2002-06-02 12:22:301632 if(level > 256*s->c_dc_scale){
Michel Bardiaux9b879562003-11-03 13:26:221633 av_log(s->avctx, AV_LOG_ERROR, "dc overflow+ C qscale: %d//\n", s->qscale);
Michael Niedermayerde0f2f42002-07-07 08:34:461634 if(!s->inter_intra_pred) return -1;
Michael Niedermayer287229e2002-06-02 12:22:301635 }
Fabrice Bellardde6d9b62001-07-22 14:18:561636 }
Michael Niedermayer287229e2002-06-02 12:22:301637 block[0] = level;
Michael Niedermayerbadaf882002-01-13 04:59:371638
Michael Niedermayerd7826b52007-08-05 20:03:371639 run_diff = s->msmpeg4_version >= 4;
Michael Niedermayer45a82ed2002-07-13 14:55:121640 i = 0;
Fabrice Bellardde6d9b62001-07-22 14:18:561641 if (!coded) {
1642 goto not_coded;
1643 }
1644 if (s->ac_pred) {
Diego Biurrun115329f2005-12-17 18:14:381645 if (dc_pred_dir == 0)
Michael Niedermayer2ad15162002-09-29 22:44:221646 scan_table = s->intra_v_scantable.permutated; /* left */
Fabrice Bellardde6d9b62001-07-22 14:18:561647 else
Michael Niedermayer2ad15162002-09-29 22:44:221648 scan_table = s->intra_h_scantable.permutated; /* top */
Fabrice Bellardde6d9b62001-07-22 14:18:561649 } else {
Michael Niedermayer2ad15162002-09-29 22:44:221650 scan_table = s->intra_scantable.permutated;
Fabrice Bellardde6d9b62001-07-22 14:18:561651 }
Michael Niedermayer45a82ed2002-07-13 14:55:121652 rl_vlc= rl->rl_vlc[0];
Fabrice Bellardde6d9b62001-07-22 14:18:561653 } else {
Michael Niedermayerbadaf882002-01-13 04:59:371654 qmul = s->qscale << 1;
1655 qadd = (s->qscale - 1) | 1;
Michael Niedermayer45a82ed2002-07-13 14:55:121656 i = -1;
Fabrice Bellardde6d9b62001-07-22 14:18:561657 rl = &rl_table[3 + s->rl_table_index];
Michael Niedermayer84afee32002-04-05 04:09:041658
1659 if(s->msmpeg4_version==2)
1660 run_diff = 0;
1661 else
1662 run_diff = 1;
1663
Fabrice Bellardde6d9b62001-07-22 14:18:561664 if (!coded) {
Michael Niedermayer45a82ed2002-07-13 14:55:121665 s->block_last_index[n] = i;
Fabrice Bellardde6d9b62001-07-22 14:18:561666 return 0;
1667 }
Michael Niedermayer1457ab52002-12-27 23:51:461668 if(!scan_table)
1669 scan_table = s->inter_scantable.permutated;
Michael Niedermayer45a82ed2002-07-13 14:55:121670 rl_vlc= rl->rl_vlc[s->qscale];
Fabrice Bellardde6d9b62001-07-22 14:18:561671 }
Michael Niedermayer45a82ed2002-07-13 14:55:121672 {
1673 OPEN_READER(re, &s->gb);
Fabrice Bellardde6d9b62001-07-22 14:18:561674 for(;;) {
Michael Niedermayer45a82ed2002-07-13 14:55:121675 UPDATE_CACHE(re, &s->gb);
Michael Niedermayere91f4bf2005-04-18 20:07:481676 GET_RL_VLC(level, run, re, &s->gb, rl_vlc, TEX_VLC_BITS, 2, 0);
Michael Niedermayer45a82ed2002-07-13 14:55:121677 if (level==0) {
1678 int cache;
1679 cache= GET_CACHE(re, &s->gb);
Fabrice Bellardde6d9b62001-07-22 14:18:561680 /* escape */
Michael Niedermayer45a82ed2002-07-13 14:55:121681 if (s->msmpeg4_version==1 || (cache&0x80000000)==0) {
1682 if (s->msmpeg4_version==1 || (cache&0x40000000)==0) {
Fabrice Bellardde6d9b62001-07-22 14:18:561683 /* third escape */
Michael Niedermayer45a82ed2002-07-13 14:55:121684 if(s->msmpeg4_version!=1) LAST_SKIP_BITS(re, &s->gb, 2);
1685 UPDATE_CACHE(re, &s->gb);
Michael Niedermayerf5957f32002-06-18 00:49:001686 if(s->msmpeg4_version<=3){
Michael Niedermayer45a82ed2002-07-13 14:55:121687 last= SHOW_UBITS(re, &s->gb, 1); SKIP_CACHE(re, &s->gb, 1);
1688 run= SHOW_UBITS(re, &s->gb, 6); SKIP_CACHE(re, &s->gb, 6);
1689 level= SHOW_SBITS(re, &s->gb, 8); LAST_SKIP_CACHE(re, &s->gb, 8);
1690 SKIP_COUNTER(re, &s->gb, 1+6+8);
Diego Biurrun115329f2005-12-17 18:14:381691 }else{
Michael Niedermayerf5957f32002-06-18 00:49:001692 int sign;
Michael Niedermayer45a82ed2002-07-13 14:55:121693 last= SHOW_UBITS(re, &s->gb, 1); SKIP_BITS(re, &s->gb, 1);
Michael Niedermayerf5957f32002-06-18 00:49:001694 if(!s->esc3_level_length){
1695 int ll;
1696 //printf("ESC-3 %X at %d %d\n", show_bits(&s->gb, 24), s->mb_x, s->mb_y);
1697 if(s->qscale<8){
Michael Niedermayer45a82ed2002-07-13 14:55:121698 ll= SHOW_UBITS(re, &s->gb, 3); SKIP_BITS(re, &s->gb, 3);
Michael Niedermayerf5957f32002-06-18 00:49:001699 if(ll==0){
Michel Bardiaux9b879562003-11-03 13:26:221700 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:121701 SKIP_BITS(re, &s->gb, 1);
Michael Niedermayerf5957f32002-06-18 00:49:001702 ll=8;
1703 }
1704 }else{
1705 ll=2;
Michael Niedermayer45a82ed2002-07-13 14:55:121706 while(ll<8 && SHOW_UBITS(re, &s->gb, 1)==0){
1707 ll++;
1708 SKIP_BITS(re, &s->gb, 1);
1709 }
Michael Niedermayer05174fd2002-07-22 08:15:271710 if(ll<8) SKIP_BITS(re, &s->gb, 1);
Michael Niedermayerf5957f32002-06-18 00:49:001711 }
1712
1713 s->esc3_level_length= ll;
Michael Niedermayer45a82ed2002-07-13 14:55:121714 s->esc3_run_length= SHOW_UBITS(re, &s->gb, 2) + 3; SKIP_BITS(re, &s->gb, 2);
Michael Niedermayerf5957f32002-06-18 00:49:001715//printf("level length:%d, run length: %d\n", ll, s->esc3_run_length);
Michael Niedermayer05174fd2002-07-22 08:15:271716 UPDATE_CACHE(re, &s->gb);
Michael Niedermayerf5957f32002-06-18 00:49:001717 }
Diego Biurrun115329f2005-12-17 18:14:381718 run= SHOW_UBITS(re, &s->gb, s->esc3_run_length);
Michael Niedermayer45a82ed2002-07-13 14:55:121719 SKIP_BITS(re, &s->gb, s->esc3_run_length);
Diego Biurrun115329f2005-12-17 18:14:381720
1721 sign= SHOW_UBITS(re, &s->gb, 1);
Michael Niedermayer45a82ed2002-07-13 14:55:121722 SKIP_BITS(re, &s->gb, 1);
Diego Biurrun115329f2005-12-17 18:14:381723
1724 level= SHOW_UBITS(re, &s->gb, s->esc3_level_length);
Michael Niedermayer45a82ed2002-07-13 14:55:121725 SKIP_BITS(re, &s->gb, s->esc3_level_length);
Michael Niedermayerf5957f32002-06-18 00:49:001726 if(sign) level= -level;
1727 }
1728//printf("level: %d, run: %d at %d %d\n", level, run, s->mb_x, s->mb_y);
Michael Niedermayer287229e2002-06-02 12:22:301729#if 0 // waste of time / this will detect very few errors
1730 {
Diego Biurrunc26abfa2006-10-11 23:17:581731 const int abs_level= FFABS(level);
Michael Niedermayer287229e2002-06-02 12:22:301732 const int run1= run - rl->max_run[last][abs_level] - run_diff;
1733 if(abs_level<=MAX_LEVEL && run<=MAX_RUN){
1734 if(abs_level <= rl->max_level[last][run]){
Steve L'Homme267f7ed2006-03-08 11:43:101735 av_log(s->avctx, AV_LOG_ERROR, "illegal 3. esc, vlc encoding possible\n");
Michael Niedermayer287229e2002-06-02 12:22:301736 return DECODING_AC_LOST;
1737 }
1738 if(abs_level <= rl->max_level[last][run]*2){
Steve L'Homme267f7ed2006-03-08 11:43:101739 av_log(s->avctx, AV_LOG_ERROR, "illegal 3. esc, esc 1 encoding possible\n");
Michael Niedermayer287229e2002-06-02 12:22:301740 return DECODING_AC_LOST;
1741 }
Michael Niedermayerf5957f32002-06-18 00:49:001742 if(run1>=0 && abs_level <= rl->max_level[last][run1]){
Steve L'Homme267f7ed2006-03-08 11:43:101743 av_log(s->avctx, AV_LOG_ERROR, "illegal 3. esc, esc 2 encoding possible\n");
Michael Niedermayer287229e2002-06-02 12:22:301744 return DECODING_AC_LOST;
1745 }
1746 }
1747 }
1748#endif
Diego Biurrunbb270c02005-12-22 01:10:111749 //level = level * qmul + (level>0) * qadd - (level<=0) * qadd ;
1750 if (level>0) level= level * qmul + qadd;
Michael Niedermayer287229e2002-06-02 12:22:301751 else level= level * qmul - qadd;
1752#if 0 // waste of time too :(
1753 if(level>2048 || level<-2048){
Steve L'Homme267f7ed2006-03-08 11:43:101754 av_log(s->avctx, AV_LOG_ERROR, "|level| overflow in 3. esc\n");
Michael Niedermayer287229e2002-06-02 12:22:301755 return DECODING_AC_LOST;
1756 }
1757#endif
Michael Niedermayer45a82ed2002-07-13 14:55:121758 i+= run + 1;
1759 if(last) i+=192;
Michael Niedermayer1a013242002-07-17 09:15:141760#ifdef ERROR_DETAILS
1761 if(run==66)
Michael Niedermayer95ae72b2005-08-26 19:05:441762 av_log(s->avctx, AV_LOG_ERROR, "illegal vlc code in ESC3 level=%d\n", level);
Michael Niedermayer1a013242002-07-17 09:15:141763 else if((i>62 && i<192) || i>192+63)
Michael Niedermayer95ae72b2005-08-26 19:05:441764 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:141765#endif
Fabrice Bellardde6d9b62001-07-22 14:18:561766 } else {
1767 /* second escape */
Michael Niedermayer45a82ed2002-07-13 14:55:121768#if MIN_CACHE_BITS < 23
1769 LAST_SKIP_BITS(re, &s->gb, 2);
1770 UPDATE_CACHE(re, &s->gb);
1771#else
1772 SKIP_BITS(re, &s->gb, 2);
1773#endif
Michael Niedermayere91f4bf2005-04-18 20:07:481774 GET_RL_VLC(level, run, re, &s->gb, rl_vlc, TEX_VLC_BITS, 2, 1);
Michael Niedermayer45a82ed2002-07-13 14:55:121775 i+= run + rl->max_run[run>>7][level/qmul] + run_diff; //FIXME opt indexing
1776 level = (level ^ SHOW_SBITS(re, &s->gb, 1)) - SHOW_SBITS(re, &s->gb, 1);
1777 LAST_SKIP_BITS(re, &s->gb, 1);
Michael Niedermayer1a013242002-07-17 09:15:141778#ifdef ERROR_DETAILS
1779 if(run==66)
Michael Niedermayer95ae72b2005-08-26 19:05:441780 av_log(s->avctx, AV_LOG_ERROR, "illegal vlc code in ESC2 level=%d\n", level);
Michael Niedermayer1a013242002-07-17 09:15:141781 else if((i>62 && i<192) || i>192+63)
Michael Niedermayer95ae72b2005-08-26 19:05:441782 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:141783#endif
Fabrice Bellardde6d9b62001-07-22 14:18:561784 }
1785 } else {
1786 /* first escape */
Michael Niedermayer45a82ed2002-07-13 14:55:121787#if MIN_CACHE_BITS < 22
1788 LAST_SKIP_BITS(re, &s->gb, 1);
1789 UPDATE_CACHE(re, &s->gb);
1790#else
1791 SKIP_BITS(re, &s->gb, 1);
1792#endif
Michael Niedermayere91f4bf2005-04-18 20:07:481793 GET_RL_VLC(level, run, re, &s->gb, rl_vlc, TEX_VLC_BITS, 2, 1);
Michael Niedermayer45a82ed2002-07-13 14:55:121794 i+= run;
1795 level = level + rl->max_level[run>>7][(run-1)&63] * qmul;//FIXME opt indexing
1796 level = (level ^ SHOW_SBITS(re, &s->gb, 1)) - SHOW_SBITS(re, &s->gb, 1);
1797 LAST_SKIP_BITS(re, &s->gb, 1);
Michael Niedermayer1a013242002-07-17 09:15:141798#ifdef ERROR_DETAILS
1799 if(run==66)
Michael Niedermayer95ae72b2005-08-26 19:05:441800 av_log(s->avctx, AV_LOG_ERROR, "illegal vlc code in ESC1 level=%d\n", level);
Michael Niedermayer1a013242002-07-17 09:15:141801 else if((i>62 && i<192) || i>192+63)
Michael Niedermayer95ae72b2005-08-26 19:05:441802 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:141803#endif
Fabrice Bellardde6d9b62001-07-22 14:18:561804 }
1805 } else {
Michael Niedermayer45a82ed2002-07-13 14:55:121806 i+= run;
1807 level = (level ^ SHOW_SBITS(re, &s->gb, 1)) - SHOW_SBITS(re, &s->gb, 1);
1808 LAST_SKIP_BITS(re, &s->gb, 1);
Michael Niedermayer1a013242002-07-17 09:15:141809#ifdef ERROR_DETAILS
1810 if(run==66)
Michael Niedermayer95ae72b2005-08-26 19:05:441811 av_log(s->avctx, AV_LOG_ERROR, "illegal vlc code level=%d\n", level);
Michael Niedermayer1a013242002-07-17 09:15:141812 else if((i>62 && i<192) || i>192+63)
Michael Niedermayer95ae72b2005-08-26 19:05:441813 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:141814#endif
Fabrice Bellardde6d9b62001-07-22 14:18:561815 }
Michael Niedermayer45a82ed2002-07-13 14:55:121816 if (i > 62){
1817 i-= 192;
1818 if(i&(~63)){
Michael Niedermayer68f593b2003-01-21 17:34:121819 const int left= s->gb.size_in_bits - get_bits_count(&s->gb);
Michael Niedermayer4d2858d2002-10-13 13:16:041820 if(((i+192 == 64 && level/qmul==-1) || s->error_resilience<=1) && left>=0){
Michel Bardiaux9b879562003-11-03 13:26:221821 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:141822 break;
1823 }else{
Michel Bardiaux9b879562003-11-03 13:26:221824 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:141825 return -1;
1826 }
Michael Niedermayer45a82ed2002-07-13 14:55:121827 }
1828
1829 block[scan_table[i]] = level;
1830 break;
Michael Niedermayerf5957f32002-06-18 00:49:001831 }
Michael Niedermayer287229e2002-06-02 12:22:301832
Michael Niedermayer45a82ed2002-07-13 14:55:121833 block[scan_table[i]] = level;
Fabrice Bellardde6d9b62001-07-22 14:18:561834 }
Michael Niedermayer45a82ed2002-07-13 14:55:121835 CLOSE_READER(re, &s->gb);
1836 }
Fabrice Bellardde6d9b62001-07-22 14:18:561837 not_coded:
1838 if (s->mb_intra) {
1839 mpeg4_pred_ac(s, block, n, dc_pred_dir);
1840 if (s->ac_pred) {
Michael Niedermayer45a82ed2002-07-13 14:55:121841 i = 63; /* XXX: not optimal */
Fabrice Bellardde6d9b62001-07-22 14:18:561842 }
1843 }
Michael Niedermayer1457ab52002-12-27 23:51:461844 if(s->msmpeg4_version>=4 && i>0) i=63; //FIXME/XXX optimize
Michael Niedermayer45a82ed2002-07-13 14:55:121845 s->block_last_index[n] = i;
Diego Biurrun115329f2005-12-17 18:14:381846
Fabrice Bellardde6d9b62001-07-22 14:18:561847 return 0;
1848}
1849
1850static int msmpeg4_decode_dc(MpegEncContext * s, int n, int *dir_ptr)
1851{
1852 int level, pred;
Fabrice Bellardde6d9b62001-07-22 14:18:561853
Michael Niedermayer287229e2002-06-02 12:22:301854 if(s->msmpeg4_version<=2){
Michael Niedermayer84afee32002-04-05 04:09:041855 if (n < 4) {
Michael Niedermayer08dce7b2002-07-10 20:05:421856 level = get_vlc2(&s->gb, v2_dc_lum_vlc.table, DC_VLC_BITS, 3);
Michael Niedermayer84afee32002-04-05 04:09:041857 } else {
Michael Niedermayer08dce7b2002-07-10 20:05:421858 level = get_vlc2(&s->gb, v2_dc_chroma_vlc.table, DC_VLC_BITS, 3);
Michael Niedermayer84afee32002-04-05 04:09:041859 }
Diego Biurrun115329f2005-12-17 18:14:381860 if (level < 0)
Michael Niedermayer84afee32002-04-05 04:09:041861 return -1;
Michael Niedermayer84afee32002-04-05 04:09:041862 level-=256;
1863 }else{ //FIXME optimize use unified tables & index
1864 if (n < 4) {
anonymous0d33db82005-01-30 16:34:571865 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:041866 } else {
anonymous0d33db82005-01-30 16:34:571867 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:041868 }
Michael Niedermayer287229e2002-06-02 12:22:301869 if (level < 0){
Michel Bardiaux9b879562003-11-03 13:26:221870 av_log(s->avctx, AV_LOG_ERROR, "illegal dc vlc\n");
Michael Niedermayer84afee32002-04-05 04:09:041871 return -1;
Michael Niedermayer287229e2002-06-02 12:22:301872 }
Michael Niedermayer84afee32002-04-05 04:09:041873
1874 if (level == DC_MAX) {
1875 level = get_bits(&s->gb, 8);
1876 if (get_bits1(&s->gb))
1877 level = -level;
1878 } else if (level != 0) {
1879 if (get_bits1(&s->gb))
1880 level = -level;
1881 }
Fabrice Bellardde6d9b62001-07-22 14:18:561882 }
1883
Michael Niedermayer287229e2002-06-02 12:22:301884 if(s->msmpeg4_version==1){
Zdenek Kabelac0c1a9ed2003-02-11 16:35:481885 int32_t *dc_val;
Michael Niedermayer287229e2002-06-02 12:22:301886 pred = msmpeg4v1_pred_dc(s, n, &dc_val);
1887 level += pred;
Diego Biurrun115329f2005-12-17 18:14:381888
Michael Niedermayer287229e2002-06-02 12:22:301889 /* update predictor */
1890 *dc_val= level;
1891 }else{
Måns Rullgårdb86216d2006-09-27 22:13:441892 int16_t *dc_val;
Michael Niedermayerbd5e1c72002-06-22 15:52:251893 pred = msmpeg4_pred_dc(s, n, &dc_val, dir_ptr);
Michael Niedermayer287229e2002-06-02 12:22:301894 level += pred;
Fabrice Bellardde6d9b62001-07-22 14:18:561895
Michael Niedermayer287229e2002-06-02 12:22:301896 /* update predictor */
1897 if (n < 4) {
1898 *dc_val = level * s->y_dc_scale;
1899 } else {
1900 *dc_val = level * s->c_dc_scale;
1901 }
Fabrice Bellardde6d9b62001-07-22 14:18:561902 }
1903
1904 return level;
1905}
1906
Aurelien Jacobs85f601e2007-11-07 23:23:351907int ff_msmpeg4_decode_motion(MpegEncContext * s,
Fabrice Bellardde6d9b62001-07-22 14:18:561908 int *mx_ptr, int *my_ptr)
1909{
1910 MVTable *mv;
1911 int code, mx, my;
1912
1913 mv = &mv_tables[s->mv_table_index];
1914
Michael Niedermayer08dce7b2002-07-10 20:05:421915 code = get_vlc2(&s->gb, mv->vlc.table, MV_VLC_BITS, 2);
Michael Niedermayerf5957f32002-06-18 00:49:001916 if (code < 0){
Michel Bardiaux9b879562003-11-03 13:26:221917 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:561918 return -1;
Michael Niedermayerf5957f32002-06-18 00:49:001919 }
Fabrice Bellardde6d9b62001-07-22 14:18:561920 if (code == mv->n) {
Michael Niedermayerf5957f32002-06-18 00:49:001921//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:561922 mx = get_bits(&s->gb, 6);
1923 my = get_bits(&s->gb, 6);
1924 } else {
1925 mx = mv->table_mvx[code];
1926 my = mv->table_mvy[code];
1927 }
1928
1929 mx += *mx_ptr - 32;
1930 my += *my_ptr - 32;
1931 /* WARNING : they do not do exactly modulo encoding */
1932 if (mx <= -64)
1933 mx += 64;
1934 else if (mx >= 64)
1935 mx -= 64;
1936
1937 if (my <= -64)
1938 my += 64;
1939 else if (my >= 64)
1940 my -= 64;
1941 *mx_ptr = mx;
1942 *my_ptr = my;
1943 return 0;
1944}