blob: 6bb45506988354f500b1deb7413b6763aa7a0e7e [file] [log] [blame]
Fabrice Bellardde6d9b62001-07-22 14:18:561/*
2 * MSMPEG4 backend for ffmpeg encoder and decoder
Diego Biurrun406792e2009-01-19 15:46:403 * 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);
Aurelien Jacobsb250f9c2009-01-13 23:44:1665#if 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"
81
Aurelien Jacobsb250f9c2009-01-13 23:44:1682#if CONFIG_ENCODERS //strangely gcc includes this even if it is not referenced
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{
Diego Biurrun5e534862008-02-13 09:26:1090 static int initialized=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;
Stefan Gehrer5a893962008-06-25 11:33:49101 s->c_dc_scale_table= wmv1_c_dc_scale_table;
Michael Niedermayerf5957f32002-06-18 00:49:00102 } 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;
Aurelien Jacobsb250f9c2009-01-13 23:44:16112#if CONFIG_WMV3_DECODER || 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
Diego Biurrun5e534862008-02-13 09:26:10130 if(!initialized){
131 initialized=1;
Michael Niedermayerf5957f32002-06-18 00:49:00132
133 init_h263_dc_for_msmpeg4();
Michael Niedermayerf5957f32002-06-18 00:49:00134 }
135}
136
Aurelien Jacobsb250f9c2009-01-13 23:44:16137#if CONFIG_ENCODERS
Wolfgang Hesseler76042462003-02-16 23:05:38138
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
Diego Pettenòcb92c522008-10-04 09:43:11241static void 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
Aurelien Jacobs97018402008-03-09 23:31:02266 if(s->pict_type==FF_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
Aurelien Jacobs97018402008-03-09 23:31:02291 if(s->pict_type==FF_P_TYPE) chroma_best= best;
Michael Niedermayerf5957f32002-06-18 00:49:00292
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;
Aurelien Jacobs97018402008-03-09 23:31:02300 if(s->pict_type==FF_I_TYPE)
Michael Niedermayerf5957f32002-06-18 00:49:00301 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{
Diego Pettenòcb92c522008-10-04 09:43:11311 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)
Aurelien Jacobs97018402008-03-09 23:31:02327 s->inter_intra_pred= (s->width*s->height < 320*240 && s->bit_rate<=II_BITRATE && s->pict_type==FF_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
Aurelien Jacobs97018402008-03-09 23:31:02330 if (s->pict_type == FF_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
Aurelien Jacobsb250f9c2009-01-13 23:44:16414#if CONFIG_ENCODERS
Wolfgang Hesseler76042462003-02-16 23:05:38415
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){
Aurelien Jacobs97018402008-03-09 23:31:02553 if (s->pict_type == FF_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{
Aurelien Jacobs97018402008-03-09 23:31:02568 if (s->pict_type == FF_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 !) */
Aurelien Jacobsb250f9c2009-01-13 23:44:16656#if ARCH_X86 && !defined PIC
Diego Pettenòbe449fc2008-10-16 13:34:09657 __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
Aurelien Jacobsb250f9c2009-01-13 23:44:16676 /* #elif 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);
Ramiro Polla6647ab82008-07-13 14:27:48960 put_sbits(&s->pb, 8, slevel);
Michael Niedermayerf5957f32002-06-18 00:49:00961 }
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]);
Fabrice Bellardd81c5982002-06-06 14:31:181066 }
Michael Niedermayerceaaf782008-05-30 21:08:411067 INIT_VLC_RL(rl_table[0], 642);
1068 INIT_VLC_RL(rl_table[1], 1104);
1069 INIT_VLC_RL(rl_table[2], 554);
1070 INIT_VLC_RL(rl_table[3], 940);
1071 INIT_VLC_RL(rl_table[4], 962);
1072 INIT_VLC_RL(rl_table[5], 554);
Fabrice Bellardd81c5982002-06-06 14:31:181073 for(i=0;i<2;i++) {
1074 mv = &mv_tables[i];
Diego Biurrun115329f2005-12-17 18:14:381075 init_vlc(&mv->vlc, MV_VLC_BITS, mv->n + 1,
Fabrice Bellardd81c5982002-06-06 14:31:181076 mv->table_mv_bits, 1, 1,
Burkhard Plaum073c2592004-11-27 18:10:061077 mv->table_mv_code, 2, 2, 1);
Fabrice Bellardd81c5982002-06-06 14:31:181078 }
1079
Diego Biurrun115329f2005-12-17 18:14:381080 init_vlc(&ff_msmp4_dc_luma_vlc[0], DC_VLC_BITS, 120,
anonymous0c040aa2005-01-26 12:01:351081 &ff_table0_dc_lum[0][1], 8, 4,
1082 &ff_table0_dc_lum[0][0], 8, 4, 1);
Diego Biurrun115329f2005-12-17 18:14:381083 init_vlc(&ff_msmp4_dc_chroma_vlc[0], DC_VLC_BITS, 120,
anonymous0c040aa2005-01-26 12:01:351084 &ff_table0_dc_chroma[0][1], 8, 4,
1085 &ff_table0_dc_chroma[0][0], 8, 4, 1);
Diego Biurrun115329f2005-12-17 18:14:381086 init_vlc(&ff_msmp4_dc_luma_vlc[1], DC_VLC_BITS, 120,
anonymous0c040aa2005-01-26 12:01:351087 &ff_table1_dc_lum[0][1], 8, 4,
1088 &ff_table1_dc_lum[0][0], 8, 4, 1);
Diego Biurrun115329f2005-12-17 18:14:381089 init_vlc(&ff_msmp4_dc_chroma_vlc[1], DC_VLC_BITS, 120,
anonymous0c040aa2005-01-26 12:01:351090 &ff_table1_dc_chroma[0][1], 8, 4,
1091 &ff_table1_dc_chroma[0][0], 8, 4, 1);
Diego Biurrun115329f2005-12-17 18:14:381092
1093 init_vlc(&v2_dc_lum_vlc, DC_VLC_BITS, 512,
Fabrice Bellardd81c5982002-06-06 14:31:181094 &v2_dc_lum_table[0][1], 8, 4,
Burkhard Plaum073c2592004-11-27 18:10:061095 &v2_dc_lum_table[0][0], 8, 4, 1);
Diego Biurrun115329f2005-12-17 18:14:381096 init_vlc(&v2_dc_chroma_vlc, DC_VLC_BITS, 512,
Fabrice Bellardd81c5982002-06-06 14:31:181097 &v2_dc_chroma_table[0][1], 8, 4,
Burkhard Plaum073c2592004-11-27 18:10:061098 &v2_dc_chroma_table[0][0], 8, 4, 1);
Diego Biurrun115329f2005-12-17 18:14:381099
Michael Niedermayer08dce7b2002-07-10 20:05:421100 init_vlc(&cbpy_vlc, CBPY_VLC_BITS, 16,
Fabrice Bellardd81c5982002-06-06 14:31:181101 &cbpy_tab[0][1], 2, 1,
Burkhard Plaum073c2592004-11-27 18:10:061102 &cbpy_tab[0][0], 2, 1, 1);
Michael Niedermayer08dce7b2002-07-10 20:05:421103 init_vlc(&v2_intra_cbpc_vlc, V2_INTRA_CBPC_VLC_BITS, 4,
Fabrice Bellardd81c5982002-06-06 14:31:181104 &v2_intra_cbpc[0][1], 2, 1,
Burkhard Plaum073c2592004-11-27 18:10:061105 &v2_intra_cbpc[0][0], 2, 1, 1);
Michael Niedermayer08dce7b2002-07-10 20:05:421106 init_vlc(&v2_mb_type_vlc, V2_MB_TYPE_VLC_BITS, 8,
Fabrice Bellardd81c5982002-06-06 14:31:181107 &v2_mb_type[0][1], 2, 1,
Burkhard Plaum073c2592004-11-27 18:10:061108 &v2_mb_type[0][0], 2, 1, 1);
Michael Niedermayer08dce7b2002-07-10 20:05:421109 init_vlc(&v2_mv_vlc, V2_MV_VLC_BITS, 33,
Fabrice Bellardd81c5982002-06-06 14:31:181110 &mvtab[0][1], 2, 1,
Burkhard Plaum073c2592004-11-27 18:10:061111 &mvtab[0][0], 2, 1, 1);
Fabrice Bellardd81c5982002-06-06 14:31:181112
Michael Niedermayer1457ab52002-12-27 23:51:461113 for(i=0; i<4; i++){
Aurelien Jacobs85f601e2007-11-07 23:23:351114 init_vlc(&ff_mb_non_intra_vlc[i], MB_NON_INTRA_VLC_BITS, 128,
Michael Niedermayer1457ab52002-12-27 23:51:461115 &wmv2_inter_table[i][0][1], 8, 4,
Burkhard Plaum073c2592004-11-27 18:10:061116 &wmv2_inter_table[i][0][0], 8, 4, 1); //FIXME name?
Michael Niedermayer1457ab52002-12-27 23:51:461117 }
Diego Biurrun115329f2005-12-17 18:14:381118
1119 init_vlc(&ff_msmp4_mb_i_vlc, MB_INTRA_VLC_BITS, 64,
anonymous0d33db82005-01-30 16:34:571120 &ff_msmp4_mb_i_table[0][1], 4, 2,
1121 &ff_msmp4_mb_i_table[0][0], 4, 2, 1);
Diego Biurrun115329f2005-12-17 18:14:381122
1123 init_vlc(&v1_intra_cbpc_vlc, V1_INTRA_CBPC_VLC_BITS, 8,
Fabrice Bellardd81c5982002-06-06 14:31:181124 intra_MCBPC_bits, 1, 1,
Burkhard Plaum073c2592004-11-27 18:10:061125 intra_MCBPC_code, 1, 1, 1);
Diego Biurrun115329f2005-12-17 18:14:381126 init_vlc(&v1_inter_cbpc_vlc, V1_INTER_CBPC_VLC_BITS, 25,
Fabrice Bellardd81c5982002-06-06 14:31:181127 inter_MCBPC_bits, 1, 1,
Burkhard Plaum073c2592004-11-27 18:10:061128 inter_MCBPC_code, 1, 1, 1);
Diego Biurrun115329f2005-12-17 18:14:381129
Aurelien Jacobs85f601e2007-11-07 23:23:351130 init_vlc(&ff_inter_intra_vlc, INTER_INTRA_VLC_BITS, 4,
Michael Niedermayerde0f2f42002-07-07 08:34:461131 &table_inter_intra[0][1], 2, 1,
Burkhard Plaum073c2592004-11-27 18:10:061132 &table_inter_intra[0][0], 2, 1, 1);
Fabrice Bellardd81c5982002-06-06 14:31:181133 }
Diego Biurrun115329f2005-12-17 18:14:381134
Michael Niedermayer4d2858d2002-10-13 13:16:041135 switch(s->msmpeg4_version){
1136 case 1:
1137 case 2:
1138 s->decode_mb= msmpeg4v12_decode_mb;
1139 break;
1140 case 3:
1141 case 4:
1142 s->decode_mb= msmpeg4v34_decode_mb;
1143 break;
Michael Niedermayer1457ab52002-12-27 23:51:461144 case 5:
Aurelien Jacobs49fb20c2009-01-14 17:19:171145 if (CONFIG_WMV2_DECODER)
Aurelien Jacobsc16d6c52007-11-07 23:42:241146 s->decode_mb= ff_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;
Aurelien Jacobs97018402008-03-09 23:31:021184 if (s->pict_type != FF_I_TYPE &&
1185 s->pict_type != FF_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;
Aurelien Jacobs97018402008-03-09 23:31:021192 if(s->pict_type == FF_I_TYPE) had_i=1;
Michael Niedermayerde0f2f42002-07-07 08:34:461193 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
Aurelien Jacobs97018402008-03-09 23:31:021202 if (s->pict_type == FF_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
Aurelien Jacobsb250f9c2009-01-13 23:44:161365#if 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
Aurelien Jacobs97018402008-03-09 23:31:021436 if (s->pict_type == FF_P_TYPE) {
Michael Niedermayer84afee32002-04-05 04:09:041437 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
Aurelien Jacobs97018402008-03-09 23:31:021503 if(s->pict_type==FF_P_TYPE) cbp^=0x3C;
Michael Niedermayer287229e2002-06-02 12:22:301504 }
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++) {
Aurelien Jacobs85f601e2007-11-07 23:23:351509 if (ff_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
Aurelien Jacobs97018402008-03-09 23:31:021524 if (s->pict_type == FF_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
Aurelien Jacobs85f601e2007-11-07 23:23:351542 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: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) {
Aurelien Jacobs85f601e2007-11-07 23:23:351559 int pred = ff_msmpeg4_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);
Aurelien Jacobs85f601e2007-11-07 23:23:351575 if (ff_msmpeg4_decode_motion(s, &mx, &my) < 0)
Fabrice Bellardde6d9b62001-07-22 14:18:561576 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){
Aurelien Jacobs85f601e2007-11-07 23:23:351587 s->h263_aic_dir= get_vlc2(&s->gb, ff_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++) {
Aurelien Jacobs85f601e2007-11-07 23:23:351598 if (ff_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
Aurelien Jacobs85f601e2007-11-07 23:23:351608int ff_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
Michael Niedermayerd7826b52007-08-05 20:03:371644 run_diff = s->msmpeg4_version >= 4;
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 Niedermayer047599a2008-09-08 18:18:491825 if(((i+192 == 64 && level/qmul==-1) || s->error_recognition<=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
Aurelien Jacobs85f601e2007-11-07 23:23:351912int ff_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}