Statistics
| Branch: | Revision:

ffmpeg / libavcodec / h263.c @ 94d85eaf

History | View | Annotate | Download (212 KB)

1 de6d9b64 Fabrice Bellard
/*
2
 * H263/MPEG4 backend for ffmpeg encoder and decoder
3 ff4ec49e Fabrice Bellard
 * Copyright (c) 2000,2001 Fabrice Bellard.
4 6dbd39fe Juanjo
 * H263+ support.
5 de6d9b64 Fabrice Bellard
 * Copyright (c) 2001 Juan J. Sierralta P.
6 8f2ab833 Michael Niedermayer
 * Copyright (c) 2002-2004 Michael Niedermayer <michaelni@gmx.at>
7 de6d9b64 Fabrice Bellard
 *
8 ff4ec49e Fabrice Bellard
 * This library is free software; you can redistribute it and/or
9
 * modify it under the terms of the GNU Lesser General Public
10
 * License as published by the Free Software Foundation; either
11
 * version 2 of the License, or (at your option) any later version.
12 de6d9b64 Fabrice Bellard
 *
13 ff4ec49e Fabrice Bellard
 * This library is distributed in the hope that it will be useful,
14 de6d9b64 Fabrice Bellard
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
15 ff4ec49e Fabrice Bellard
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
16
 * Lesser General Public License for more details.
17 de6d9b64 Fabrice Bellard
 *
18 ff4ec49e Fabrice Bellard
 * You should have received a copy of the GNU Lesser General Public
19
 * License along with this library; if not, write to the Free Software
20 5509bffa Diego Biurrun
 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
21 45870f57 Michael Niedermayer
 *
22 66370d3f Michael Niedermayer
 * ac prediction encoding, b-frame support, error resilience, optimizations,
23 115329f1 Diego Biurrun
 * qpel decoding, gmc decoding, interlaced decoding,
24 66370d3f Michael Niedermayer
 * by Michael Niedermayer <michaelni@gmx.at>
25 de6d9b64 Fabrice Bellard
 */
26 2ba8f6b8 Michael Niedermayer
27
/**
28
 * @file h263.c
29 983e3246 Michael Niedermayer
 * h263/mpeg4 codec.
30 2ba8f6b8 Michael Niedermayer
 */
31 115329f1 Diego Biurrun
32 1e209222 Juanjo
//#define DEBUG
33 f2f6134b Michael Niedermayer
#include <limits.h>
34
35 de6d9b64 Fabrice Bellard
#include "common.h"
36
#include "dsputil.h"
37
#include "avcodec.h"
38
#include "mpegvideo.h"
39
#include "h263data.h"
40
#include "mpeg4data.h"
41
42 c5d309f2 Michael Niedermayer
//#undef NDEBUG
43
//#include <assert.h>
44
45 edcf9890 Michael Niedermayer
#define INTRA_MCBPC_VLC_BITS 6
46 7af75e6c Michael Niedermayer
#define INTER_MCBPC_VLC_BITS 7
47 edcf9890 Michael Niedermayer
#define CBPY_VLC_BITS 6
48
#define MV_VLC_BITS 9
49
#define DC_VLC_BITS 9
50
#define SPRITE_TRAJ_VLC_BITS 6
51
#define MB_TYPE_B_VLC_BITS 4
52
#define TEX_VLC_BITS 9
53 b40cd4e0 Michael Niedermayer
#define H263_MBTYPE_B_VLC_BITS 6
54
#define CBPC_B_VLC_BITS 3
55 edcf9890 Michael Niedermayer
56 bbed9259 Michael Niedermayer
#ifdef CONFIG_ENCODERS
57 de6d9b64 Fabrice Bellard
static void h263_encode_block(MpegEncContext * s, DCTELEM * block,
58 d4f5d74a Garrick Meeker
                              int n);
59 6dbd39fe Juanjo
static void h263p_encode_umotion(MpegEncContext * s, int val);
60 3db48188 Michael Niedermayer
static inline void mpeg4_encode_block(MpegEncContext * s, DCTELEM * block,
61 115329f1 Diego Biurrun
                               int n, int dc, uint8_t *scan_table,
62 92073d01 Michael Niedermayer
                               PutBitContext *dc_pb, PutBitContext *ac_pb);
63 bbed9259 Michael Niedermayer
#endif
64
65 6f91bcd1 Michael Niedermayer
static int h263_decode_motion(MpegEncContext * s, int pred, int fcode);
66 6dbd39fe Juanjo
static int h263p_decode_umotion(MpegEncContext * s, int pred);
67 de6d9b64 Fabrice Bellard
static int h263_decode_block(MpegEncContext * s, DCTELEM * block,
68
                             int n, int coded);
69 92073d01 Michael Niedermayer
static inline int mpeg4_decode_dc(MpegEncContext * s, int n, int *dir_ptr);
70
static inline int mpeg4_decode_block(MpegEncContext * s, DCTELEM * block,
71 a4e8b587 Michael Niedermayer
                              int n, int coded, int intra, int rvlc);
72 115329f1 Diego Biurrun
static int mpeg4_get_block_length(MpegEncContext * s, DCTELEM * block, int n, int intra_dc,
73 1b781f82 Michael Niedermayer
                               uint8_t *scan_table);
74 0c1a9eda Zdenek Kabelac
static int h263_pred_dc(MpegEncContext * s, int n, uint16_t **dc_val_ptr);
75 7604246d Wolfgang Hesseler
#ifdef CONFIG_ENCODERS
76 22ddd60b Michael Niedermayer
static void mpeg4_encode_visual_object_header(MpegEncContext * s);
77
static void mpeg4_encode_vol_header(MpegEncContext * s, int vo_number, int vol_number);
78 7604246d Wolfgang Hesseler
#endif //CONFIG_ENCODERS
79 3f9d89c6 Michael Niedermayer
static void mpeg4_decode_sprite_trajectory(MpegEncContext * s, GetBitContext *gb);
80 a7137a04 Michael Niedermayer
static inline int ff_mpeg4_pred_dc(MpegEncContext * s, int n, int level, int *dir_ptr, int encoding);
81 4d2858de Michael Niedermayer
82 7604246d Wolfgang Hesseler
#ifdef CONFIG_ENCODERS
83 0c1a9eda Zdenek Kabelac
static uint8_t uni_DCtab_lum_len[512];
84
static uint8_t uni_DCtab_chrom_len[512];
85
static uint16_t uni_DCtab_lum_bits[512];
86
static uint16_t uni_DCtab_chrom_bits[512];
87 bbed9259 Michael Niedermayer
88 30952237 Michael Niedermayer
static uint8_t (*mv_penalty)[MAX_MV*2+1]= NULL;
89 0c1a9eda Zdenek Kabelac
static uint8_t fcode_tab[MAX_MV*2+1];
90
static uint8_t umv_fcode_tab[MAX_MV*2+1];
91 45870f57 Michael Niedermayer
92 477ab036 Michael Niedermayer
static uint32_t uni_mpeg4_intra_rl_bits[64*64*2*2];
93
static uint8_t  uni_mpeg4_intra_rl_len [64*64*2*2];
94
static uint32_t uni_mpeg4_inter_rl_bits[64*64*2*2];
95
static uint8_t  uni_mpeg4_inter_rl_len [64*64*2*2];
96 15c5fa7b Michael Niedermayer
static uint8_t  uni_h263_intra_aic_rl_len [64*64*2*2];
97
static uint8_t  uni_h263_inter_rl_len [64*64*2*2];
98 477ab036 Michael Niedermayer
//#define UNI_MPEG4_ENC_INDEX(last,run,level) ((last)*128 + (run)*256 + (level))
99 3db48188 Michael Niedermayer
//#define UNI_MPEG4_ENC_INDEX(last,run,level) ((last)*128*64 + (run) + (level)*64)
100 477ab036 Michael Niedermayer
#define UNI_MPEG4_ENC_INDEX(last,run,level) ((last)*128*64 + (run)*128 + (level))
101 3db48188 Michael Niedermayer
102
/* mpeg4
103
inter
104
max level: 24/6
105
max run: 53/63
106

107
intra
108
max level: 53/16
109
max run: 29/41
110
*/
111 bbed9259 Michael Niedermayer
#endif
112
113 893bc624 Kevin Baragona
#if 0 //3IV1 is quite rare and it slows things down a tiny bit
114 6d71b382 Michael Niedermayer
#define IS_3IV1 s->avctx->codec_tag == ff_get_fourcc("3IV1")
115 115329f1 Diego Biurrun
#else
116 6d71b382 Michael Niedermayer
#define IS_3IV1 0
117
#endif
118 2a164b25 Michael Niedermayer
119 de6d9b64 Fabrice Bellard
int h263_get_picture_format(int width, int height)
120
{
121
    int format;
122
123
    if (width == 128 && height == 96)
124 1e209222 Juanjo
        format = 1;
125 de6d9b64 Fabrice Bellard
    else if (width == 176 && height == 144)
126 1e209222 Juanjo
        format = 2;
127 de6d9b64 Fabrice Bellard
    else if (width == 352 && height == 288)
128 1e209222 Juanjo
        format = 3;
129 de6d9b64 Fabrice Bellard
    else if (width == 704 && height == 576)
130 1e209222 Juanjo
        format = 4;
131 de6d9b64 Fabrice Bellard
    else if (width == 1408 && height == 1152)
132 1e209222 Juanjo
        format = 5;
133 de6d9b64 Fabrice Bellard
    else
134
        format = 7;
135
    return format;
136
}
137
138 7604246d Wolfgang Hesseler
#ifdef CONFIG_ENCODERS
139
140 5ff85f1d Michael Niedermayer
static void aspect_to_info(MpegEncContext * s, AVRational aspect){
141 58b0b0dd Michael Niedermayer
    int i;
142
143 5ff85f1d Michael Niedermayer
    if(aspect.num==0) aspect= (AVRational){1,1};
144 58b0b0dd Michael Niedermayer
145
    for(i=1; i<6; i++){
146 5ff85f1d Michael Niedermayer
        if(av_cmp_q(pixel_aspect[i], aspect) == 0){
147 58b0b0dd Michael Niedermayer
            s->aspect_ratio_info=i;
148
            return;
149
        }
150
    }
151 115329f1 Diego Biurrun
152 58b0b0dd Michael Niedermayer
    s->aspect_ratio_info= FF_ASPECT_EXTENDED;
153 5d3cea3a Michael Niedermayer
}
154
155 44a2950f Michael Niedermayer
void ff_flv_encode_picture_header(MpegEncContext * s, int picture_number)
156 de6d9b64 Fabrice Bellard
{
157 44a2950f Michael Niedermayer
      int format;
158 de6d9b64 Fabrice Bellard
159 44a2950f Michael Niedermayer
      align_put_bits(&s->pb);
160 81401c1f Juanjo
161 d4f5d74a Garrick Meeker
      put_bits(&s->pb, 17, 1);
162
      put_bits(&s->pb, 5, (s->h263_flv-1)); /* 0: h263 escape codes 1: 11-bit escape codes */
163 c0df9d75 Michael Niedermayer
      put_bits(&s->pb, 8, (((int64_t)s->picture_number * 30 * s->avctx->time_base.num) / //FIXME use timestamp
164
                           s->avctx->time_base.den) & 0xff); /* TemporalReference */
165 d4f5d74a Garrick Meeker
      if (s->width == 352 && s->height == 288)
166
        format = 2;
167
      else if (s->width == 176 && s->height == 144)
168
        format = 3;
169
      else if (s->width == 128 && s->height == 96)
170
        format = 4;
171
      else if (s->width == 320 && s->height == 240)
172
        format = 5;
173
      else if (s->width == 160 && s->height == 120)
174
        format = 6;
175
      else if (s->width <= 255 && s->height <= 255)
176
        format = 0; /* use 1 byte width & height */
177
      else
178
        format = 1; /* use 2 bytes width & height */
179
      put_bits(&s->pb, 3, format); /* PictureSize */
180
      if (format == 0) {
181
        put_bits(&s->pb, 8, s->width);
182
        put_bits(&s->pb, 8, s->height);
183
      } else if (format == 1) {
184
        put_bits(&s->pb, 16, s->width);
185
        put_bits(&s->pb, 16, s->height);
186
      }
187
      put_bits(&s->pb, 2, s->pict_type == P_TYPE); /* PictureType */
188 f5ea4461 Michael Niedermayer
      put_bits(&s->pb, 1, 1); /* DeblockingFlag: on */
189 d4f5d74a Garrick Meeker
      put_bits(&s->pb, 5, s->qscale); /* Quantizer */
190
      put_bits(&s->pb, 1, 0); /* ExtraInformation */
191
192
      if(s->h263_aic){
193 115329f1 Diego Biurrun
        s->y_dc_scale_table=
194 68b94c35 Michael Niedermayer
          s->c_dc_scale_table= ff_aic_dc_scale_table;
195 d4f5d74a Garrick Meeker
      }else{
196
        s->y_dc_scale_table=
197
          s->c_dc_scale_table= ff_mpeg1_dc_scale_table;
198
      }
199 44a2950f Michael Niedermayer
}
200
201
void h263_encode_picture_header(MpegEncContext * s, int picture_number)
202
{
203 b056e73c Michael Niedermayer
    int format, coded_frame_rate, coded_frame_rate_base, i, temp_ref;
204
    int best_clock_code=1;
205
    int best_divisor=60;
206
    int best_error= INT_MAX;
207 115329f1 Diego Biurrun
208 b056e73c Michael Niedermayer
    if(s->h263_plus){
209
        for(i=0; i<2; i++){
210
            int div, error;
211 c0df9d75 Michael Niedermayer
            div= (s->avctx->time_base.num*1800000LL + 500LL*s->avctx->time_base.den) / ((1000LL+i)*s->avctx->time_base.den);
212 b056e73c Michael Niedermayer
            div= clip(1, div, 127);
213 c0df9d75 Michael Niedermayer
            error= ABS(s->avctx->time_base.num*1800000LL - (1000LL+i)*s->avctx->time_base.den*div);
214 b056e73c Michael Niedermayer
            if(error < best_error){
215
                best_error= error;
216
                best_divisor= div;
217
                best_clock_code= i;
218
            }
219
        }
220
    }
221
    s->custom_pcf= best_clock_code!=1 || best_divisor!=60;
222
    coded_frame_rate= 1800000;
223
    coded_frame_rate_base= (1000+best_clock_code)*best_divisor;
224 44a2950f Michael Niedermayer
225
    align_put_bits(&s->pb);
226 d4f5d74a Garrick Meeker
227 81401c1f Juanjo
    /* Update the pointer to last GOB */
228 17592475 Michael Niedermayer
    s->ptr_lastgob = pbBufPtr(&s->pb);
229 81401c1f Juanjo
    put_bits(&s->pb, 22, 0x20); /* PSC */
230 c0df9d75 Michael Niedermayer
    temp_ref= s->picture_number * (int64_t)coded_frame_rate * s->avctx->time_base.num / //FIXME use timestamp
231
                         (coded_frame_rate_base * (int64_t)s->avctx->time_base.den);
232 b056e73c Michael Niedermayer
    put_bits(&s->pb, 8, temp_ref & 0xff); /* TemporalReference */
233 de6d9b64 Fabrice Bellard
234 bb270c08 Diego Biurrun
    put_bits(&s->pb, 1, 1);     /* marker */
235
    put_bits(&s->pb, 1, 0);     /* h263 id */
236
    put_bits(&s->pb, 1, 0);     /* split screen off */
237
    put_bits(&s->pb, 1, 0);     /* camera  off */
238
    put_bits(&s->pb, 1, 0);     /* freeze picture release off */
239 115329f1 Diego Biurrun
240 6dbd39fe Juanjo
    format = h263_get_picture_format(s->width, s->height);
241 de6d9b64 Fabrice Bellard
    if (!s->h263_plus) {
242
        /* H.263v1 */
243
        put_bits(&s->pb, 3, format);
244
        put_bits(&s->pb, 1, (s->pict_type == P_TYPE));
245
        /* By now UMV IS DISABLED ON H.263v1, since the restrictions
246
        of H.263v1 UMV implies to check the predicted MV after
247
        calculation of the current MB to see if we're on the limits */
248 bb270c08 Diego Biurrun
        put_bits(&s->pb, 1, 0);         /* Unrestricted Motion Vector: off */
249
        put_bits(&s->pb, 1, 0);         /* SAC: off */
250
        put_bits(&s->pb, 1, s->obmc);   /* Advanced Prediction */
251
        put_bits(&s->pb, 1, 0);         /* only I/P frames, no PB frame */
252 de6d9b64 Fabrice Bellard
        put_bits(&s->pb, 5, s->qscale);
253 bb270c08 Diego Biurrun
        put_bits(&s->pb, 1, 0);         /* Continuous Presence Multipoint mode: off */
254 de6d9b64 Fabrice Bellard
    } else {
255 b056e73c Michael Niedermayer
        int ufep=1;
256 de6d9b64 Fabrice Bellard
        /* H.263v2 */
257
        /* H.263 Plus PTYPE */
258 115329f1 Diego Biurrun
259 de6d9b64 Fabrice Bellard
        put_bits(&s->pb, 3, 7);
260 b056e73c Michael Niedermayer
        put_bits(&s->pb,3,ufep); /* Update Full Extended PTYPE */
261 6dbd39fe Juanjo
        if (format == 7)
262
            put_bits(&s->pb,3,6); /* Custom Source Format */
263
        else
264
            put_bits(&s->pb, 3, format);
265 115329f1 Diego Biurrun
266 b056e73c Michael Niedermayer
        put_bits(&s->pb,1, s->custom_pcf);
267 ba58dabc Michael Niedermayer
        put_bits(&s->pb,1, s->umvplus); /* Unrestricted Motion Vector */
268 de6d9b64 Fabrice Bellard
        put_bits(&s->pb,1,0); /* SAC: off */
269 f7190f73 Michael Niedermayer
        put_bits(&s->pb,1,s->obmc); /* Advanced Prediction Mode */
270 ef5b1b5a Juanjo
        put_bits(&s->pb,1,s->h263_aic); /* Advanced Intra Coding */
271 332f9ac4 Michael Niedermayer
        put_bits(&s->pb,1,s->loop_filter); /* Deblocking Filter */
272 ba58dabc Michael Niedermayer
        put_bits(&s->pb,1,s->h263_slice_structured); /* Slice Structured */
273 de6d9b64 Fabrice Bellard
        put_bits(&s->pb,1,0); /* Reference Picture Selection: off */
274
        put_bits(&s->pb,1,0); /* Independent Segment Decoding: off */
275 dba019da Michael Niedermayer
        put_bits(&s->pb,1,s->alt_inter_vlc); /* Alternative Inter VLC */
276 332f9ac4 Michael Niedermayer
        put_bits(&s->pb,1,s->modified_quant); /* Modified Quantization: */
277 de6d9b64 Fabrice Bellard
        put_bits(&s->pb,1,1); /* "1" to prevent start code emulation */
278
        put_bits(&s->pb,3,0); /* Reserved */
279 115329f1 Diego Biurrun
280 de6d9b64 Fabrice Bellard
        put_bits(&s->pb, 3, s->pict_type == P_TYPE);
281 115329f1 Diego Biurrun
282 de6d9b64 Fabrice Bellard
        put_bits(&s->pb,1,0); /* Reference Picture Resampling: off */
283
        put_bits(&s->pb,1,0); /* Reduced-Resolution Update: off */
284 ef5b1b5a Juanjo
        put_bits(&s->pb,1,s->no_rounding); /* Rounding Type */
285 de6d9b64 Fabrice Bellard
        put_bits(&s->pb,2,0); /* Reserved */
286
        put_bits(&s->pb,1,1); /* "1" to prevent start code emulation */
287 115329f1 Diego Biurrun
288 de6d9b64 Fabrice Bellard
        /* This should be here if PLUSPTYPE */
289 bb270c08 Diego Biurrun
        put_bits(&s->pb, 1, 0); /* Continuous Presence Multipoint mode: off */
290 115329f1 Diego Biurrun
291 bb270c08 Diego Biurrun
                if (format == 7) {
292 6dbd39fe Juanjo
            /* Custom Picture Format (CPFMT) */
293 5ff85f1d Michael Niedermayer
            aspect_to_info(s, s->avctx->sample_aspect_ratio);
294 5d3cea3a Michael Niedermayer
295
            put_bits(&s->pb,4,s->aspect_ratio_info);
296 6dbd39fe Juanjo
            put_bits(&s->pb,9,(s->width >> 2) - 1);
297
            put_bits(&s->pb,1,1); /* "1" to prevent start code emulation */
298
            put_bits(&s->pb,9,(s->height >> 2));
299 5ff85f1d Michael Niedermayer
            if (s->aspect_ratio_info == FF_ASPECT_EXTENDED){
300
                put_bits(&s->pb, 8, s->avctx->sample_aspect_ratio.num);
301
                put_bits(&s->pb, 8, s->avctx->sample_aspect_ratio.den);
302 bb270c08 Diego Biurrun
            }
303 6dbd39fe Juanjo
        }
304 b056e73c Michael Niedermayer
        if(s->custom_pcf){
305
            if(ufep){
306
                put_bits(&s->pb, 1, best_clock_code);
307
                put_bits(&s->pb, 7, best_divisor);
308
            }
309
            put_bits(&s->pb, 2, (temp_ref>>8)&3);
310
        }
311 115329f1 Diego Biurrun
312 de6d9b64 Fabrice Bellard
        /* Unlimited Unrestricted Motion Vectors Indicator (UUI) */
313 544286b3 Juanjo
        if (s->umvplus)
314 e51d6d27 Michael Niedermayer
//            put_bits(&s->pb,1,1); /* Limited according tables of Annex D */
315 332f9ac4 Michael Niedermayer
//FIXME check actual requested range
316 e51d6d27 Michael Niedermayer
            put_bits(&s->pb,2,1); /* unlimited */
317 ba58dabc Michael Niedermayer
        if(s->h263_slice_structured)
318
            put_bits(&s->pb,2,0); /* no weird submodes */
319 e51d6d27 Michael Niedermayer
320 de6d9b64 Fabrice Bellard
        put_bits(&s->pb, 5, s->qscale);
321
    }
322
323 bb270c08 Diego Biurrun
    put_bits(&s->pb, 1, 0);     /* no PEI */
324 8f8402e4 Michael Niedermayer
325 0ed714a7 Michael Niedermayer
    if(s->h263_slice_structured){
326
        put_bits(&s->pb, 1, 1);
327 115329f1 Diego Biurrun
328 0ed714a7 Michael Niedermayer
        assert(s->mb_x == 0 && s->mb_y == 0);
329
        ff_h263_encode_mba(s);
330
331
        put_bits(&s->pb, 1, 1);
332
    }
333
334 8f8402e4 Michael Niedermayer
    if(s->h263_aic){
335 115329f1 Diego Biurrun
         s->y_dc_scale_table=
336 68b94c35 Michael Niedermayer
         s->c_dc_scale_table= ff_aic_dc_scale_table;
337 8f8402e4 Michael Niedermayer
    }else{
338
        s->y_dc_scale_table=
339
        s->c_dc_scale_table= ff_mpeg1_dc_scale_table;
340
    }
341 de6d9b64 Fabrice Bellard
}
342
343 945eeee1 Michael Niedermayer
/**
344
 * Encodes a group of blocks header.
345
 */
346 ba58dabc Michael Niedermayer
void h263_encode_gob_header(MpegEncContext * s, int mb_line)
347 644d98a4 Juanjo
{
348 ba58dabc Michael Niedermayer
    put_bits(&s->pb, 17, 1); /* GBSC */
349
350
    if(s->h263_slice_structured){
351
        put_bits(&s->pb, 1, 1);
352
353
        ff_h263_encode_mba(s);
354
355
        if(s->mb_num > 1583)
356
            put_bits(&s->pb, 1, 1);
357
        put_bits(&s->pb, 5, s->qscale); /* GQUANT */
358
        put_bits(&s->pb, 1, 1);
359
        put_bits(&s->pb, 2, s->pict_type == I_TYPE); /* GFID */
360
    }else{
361
        int gob_number= mb_line / s->gob_index;
362
363
        put_bits(&s->pb, 5, gob_number); /* GN */
364
        put_bits(&s->pb, 2, s->pict_type == I_TYPE); /* GFID */
365
        put_bits(&s->pb, 5, s->qscale); /* GQUANT */
366
    }
367 644d98a4 Juanjo
}
368 d6231b9e Michael Niedermayer
369 8d8c0294 Michael Niedermayer
static inline int get_block_rate(MpegEncContext * s, DCTELEM block[64], int block_last_index, uint8_t scantable[64]){
370
    int last=0;
371
    int j;
372
    int rate=0;
373
374
    for(j=1; j<=block_last_index; j++){
375
        const int index= scantable[j];
376
        int level= block[index];
377
        if(level){
378
            level+= 64;
379
            if((level&(~127)) == 0){
380
                if(j<block_last_index) rate+= s->intra_ac_vlc_length     [UNI_AC_ENC_INDEX(j-last-1, level)];
381
                else                   rate+= s->intra_ac_vlc_last_length[UNI_AC_ENC_INDEX(j-last-1, level)];
382
            }else
383
                rate += s->ac_esc_length;
384
            level-= 64;
385
386
            last= j;
387
        }
388
    }
389 115329f1 Diego Biurrun
390 8d8c0294 Michael Niedermayer
    return rate;
391
}
392
393
static inline int decide_ac_pred(MpegEncContext * s, DCTELEM block[6][64], int dir[6], uint8_t *st[6], int zigzag_last_index[6])
394 d6231b9e Michael Niedermayer
{
395 8d8c0294 Michael Niedermayer
    int score= 0;
396 d6231b9e Michael Niedermayer
    int i, n;
397 1e491e29 Michael Niedermayer
    int8_t * const qscale_table= s->current_picture.qscale_table;
398 d6231b9e Michael Niedermayer
399 8d8c0294 Michael Niedermayer
    memcpy(zigzag_last_index, s->block_last_index, sizeof(int)*6);
400 115329f1 Diego Biurrun
401 d6231b9e Michael Niedermayer
    for(n=0; n<6; n++){
402 0c1a9eda Zdenek Kabelac
        int16_t *ac_val, *ac_val1;
403 115329f1 Diego Biurrun
404 8d8c0294 Michael Niedermayer
        score -= get_block_rate(s, block[n], s->block_last_index[n], s->intra_scantable.permutated);
405 d6231b9e Michael Niedermayer
406 4278e7a6 Michael Niedermayer
        ac_val = s->ac_val[0][0] + s->block_index[n] * 16;
407 d6231b9e Michael Niedermayer
        ac_val1= ac_val;
408
        if(dir[n]){
409 7bc9090a Michael Niedermayer
            const int xy= s->mb_x + s->mb_y*s->mb_stride - s->mb_stride;
410 99609036 Michael Niedermayer
            /* top prediction */
411 4278e7a6 Michael Niedermayer
            ac_val-= s->block_wrap[n]*16;
412 1e491e29 Michael Niedermayer
            if(s->mb_y==0 || s->qscale == qscale_table[xy] || n==2 || n==3){
413 99609036 Michael Niedermayer
                /* same qscale */
414
                for(i=1; i<8; i++){
415 b0368839 Michael Niedermayer
                    const int level= block[n][s->dsp.idct_permutation[i   ]];
416 8d8c0294 Michael Niedermayer
                    block[n][s->dsp.idct_permutation[i   ]] = level - ac_val[i+8];
417 b0368839 Michael Niedermayer
                    ac_val1[i  ]=    block[n][s->dsp.idct_permutation[i<<3]];
418 99609036 Michael Niedermayer
                    ac_val1[i+8]= level;
419
                }
420
            }else{
421
                /* different qscale, we must rescale */
422
                for(i=1; i<8; i++){
423 b0368839 Michael Niedermayer
                    const int level= block[n][s->dsp.idct_permutation[i   ]];
424 8d8c0294 Michael Niedermayer
                    block[n][s->dsp.idct_permutation[i   ]] = level - ROUNDED_DIV(ac_val[i + 8]*qscale_table[xy], s->qscale);
425 b0368839 Michael Niedermayer
                    ac_val1[i  ]=    block[n][s->dsp.idct_permutation[i<<3]];
426 99609036 Michael Niedermayer
                    ac_val1[i+8]= level;
427
                }
428 d6231b9e Michael Niedermayer
            }
429 8d8c0294 Michael Niedermayer
            st[n]= s->intra_h_scantable.permutated;
430 d6231b9e Michael Niedermayer
        }else{
431 7bc9090a Michael Niedermayer
            const int xy= s->mb_x-1 + s->mb_y*s->mb_stride;
432 99609036 Michael Niedermayer
            /* left prediction */
433 d6231b9e Michael Niedermayer
            ac_val-= 16;
434 1e491e29 Michael Niedermayer
            if(s->mb_x==0 || s->qscale == qscale_table[xy] || n==1 || n==3){
435 99609036 Michael Niedermayer
                /* same qscale */
436
                for(i=1; i<8; i++){
437 b0368839 Michael Niedermayer
                    const int level= block[n][s->dsp.idct_permutation[i<<3]];
438 8d8c0294 Michael Niedermayer
                    block[n][s->dsp.idct_permutation[i<<3]]= level - ac_val[i];
439 99609036 Michael Niedermayer
                    ac_val1[i  ]= level;
440 b0368839 Michael Niedermayer
                    ac_val1[i+8]=    block[n][s->dsp.idct_permutation[i   ]];
441 99609036 Michael Niedermayer
                }
442
            }else{
443
                /* different qscale, we must rescale */
444
                for(i=1; i<8; i++){
445 b0368839 Michael Niedermayer
                    const int level= block[n][s->dsp.idct_permutation[i<<3]];
446 8d8c0294 Michael Niedermayer
                    block[n][s->dsp.idct_permutation[i<<3]]= level - ROUNDED_DIV(ac_val[i]*qscale_table[xy], s->qscale);
447 99609036 Michael Niedermayer
                    ac_val1[i  ]= level;
448 b0368839 Michael Niedermayer
                    ac_val1[i+8]=    block[n][s->dsp.idct_permutation[i   ]];
449 99609036 Michael Niedermayer
                }
450 d6231b9e Michael Niedermayer
            }
451 8d8c0294 Michael Niedermayer
            st[n]= s->intra_v_scantable.permutated;
452 d6231b9e Michael Niedermayer
        }
453 8d8c0294 Michael Niedermayer
454
        for(i=63; i>0; i--) //FIXME optimize
455
            if(block[n][ st[n][i] ]) break;
456
        s->block_last_index[n]= i;
457
458
        score += get_block_rate(s, block[n], s->block_last_index[n], st[n]);
459 d6231b9e Michael Niedermayer
    }
460
461 8d8c0294 Michael Niedermayer
    return score < 0;
462
}
463
464
static inline void restore_ac_coeffs(MpegEncContext * s, DCTELEM block[6][64], int dir[6], uint8_t *st[6], int zigzag_last_index[6])
465
{
466
    int i, n;
467
    memcpy(s->block_last_index, zigzag_last_index, sizeof(int)*6);
468
469
    for(n=0; n<6; n++){
470
        int16_t *ac_val = s->ac_val[0][0] + s->block_index[n] * 16;
471
472
        st[n]= s->intra_scantable.permutated;
473
        if(dir[n]){
474
            /* top prediction */
475
            for(i=1; i<8; i++){
476
                block[n][s->dsp.idct_permutation[i   ]] = ac_val[i+8];
477
            }
478
        }else{
479
            /* left prediction */
480
            for(i=1; i<8; i++){
481
                block[n][s->dsp.idct_permutation[i<<3]]= ac_val[i  ];
482
            }
483
        }
484
    }
485 d6231b9e Michael Niedermayer
}
486
487 4d2858de Michael Niedermayer
/**
488
 * modify qscale so that encoding is acually possible in h263 (limit difference to -2..2)
489
 */
490 9e4c6948 Michael Niedermayer
void ff_clean_h263_qscales(MpegEncContext *s){
491 c5d309f2 Michael Niedermayer
    int i;
492 1e491e29 Michael Niedermayer
    int8_t * const qscale_table= s->current_picture.qscale_table;
493 115329f1 Diego Biurrun
494 c5d309f2 Michael Niedermayer
    for(i=1; i<s->mb_num; i++){
495 7bc9090a Michael Niedermayer
        if(qscale_table[ s->mb_index2xy[i] ] - qscale_table[ s->mb_index2xy[i-1] ] >2)
496
            qscale_table[ s->mb_index2xy[i] ]= qscale_table[ s->mb_index2xy[i-1] ]+2;
497 c5d309f2 Michael Niedermayer
    }
498
    for(i=s->mb_num-2; i>=0; i--){
499 7bc9090a Michael Niedermayer
        if(qscale_table[ s->mb_index2xy[i] ] - qscale_table[ s->mb_index2xy[i+1] ] >2)
500
            qscale_table[ s->mb_index2xy[i] ]= qscale_table[ s->mb_index2xy[i+1] ]+2;
501 c5d309f2 Michael Niedermayer
    }
502 ae4b7d59 Michael Niedermayer
503
    if(s->codec_id != CODEC_ID_H263P){
504
        for(i=1; i<s->mb_num; i++){
505
            int mb_xy= s->mb_index2xy[i];
506 115329f1 Diego Biurrun
507 ae4b7d59 Michael Niedermayer
            if(qscale_table[mb_xy] != qscale_table[s->mb_index2xy[i-1]] && (s->mb_type[mb_xy]&CANDIDATE_MB_TYPE_INTER4V)){
508
                s->mb_type[mb_xy]&= ~CANDIDATE_MB_TYPE_INTER4V;
509
                s->mb_type[mb_xy]|= CANDIDATE_MB_TYPE_INTER;
510
            }
511
        }
512
    }
513 9e4c6948 Michael Niedermayer
}
514
515 4d2858de Michael Niedermayer
/**
516
 * modify mb_type & qscale so that encoding is acually possible in mpeg4
517
 */
518 9e4c6948 Michael Niedermayer
void ff_clean_mpeg4_qscales(MpegEncContext *s){
519
    int i;
520 1e491e29 Michael Niedermayer
    int8_t * const qscale_table= s->current_picture.qscale_table;
521
522 9e4c6948 Michael Niedermayer
    ff_clean_h263_qscales(s);
523 115329f1 Diego Biurrun
524 c5d309f2 Michael Niedermayer
    if(s->pict_type== B_TYPE){
525
        int odd=0;
526 893bc624 Kevin Baragona
        /* ok, come on, this isn't funny anymore, there's more code for handling this mpeg4 mess than for the actual adaptive quantization */
527 115329f1 Diego Biurrun
528 c5d309f2 Michael Niedermayer
        for(i=0; i<s->mb_num; i++){
529 7bc9090a Michael Niedermayer
            int mb_xy= s->mb_index2xy[i];
530
            odd += qscale_table[mb_xy]&1;
531 c5d309f2 Michael Niedermayer
        }
532 115329f1 Diego Biurrun
533 c5d309f2 Michael Niedermayer
        if(2*odd > s->mb_num) odd=1;
534
        else                  odd=0;
535 115329f1 Diego Biurrun
536 c5d309f2 Michael Niedermayer
        for(i=0; i<s->mb_num; i++){
537 7bc9090a Michael Niedermayer
            int mb_xy= s->mb_index2xy[i];
538
            if((qscale_table[mb_xy]&1) != odd)
539
                qscale_table[mb_xy]++;
540
            if(qscale_table[mb_xy] > 31)
541
                qscale_table[mb_xy]= 31;
542 115329f1 Diego Biurrun
        }
543
544 c5d309f2 Michael Niedermayer
        for(i=1; i<s->mb_num; i++){
545 7bc9090a Michael Niedermayer
            int mb_xy= s->mb_index2xy[i];
546 bb198e19 Michael Niedermayer
            if(qscale_table[mb_xy] != qscale_table[s->mb_index2xy[i-1]] && (s->mb_type[mb_xy]&CANDIDATE_MB_TYPE_DIRECT)){
547
                s->mb_type[mb_xy]&= ~CANDIDATE_MB_TYPE_DIRECT;
548
                s->mb_type[mb_xy]|= CANDIDATE_MB_TYPE_BIDIR;
549 c5d309f2 Michael Niedermayer
            }
550
        }
551
    }
552
}
553
554 7604246d Wolfgang Hesseler
#endif //CONFIG_ENCODERS
555 841f65f2 Loren Merritt
556 7b98bcbd D Richard Felker III
#define tab_size ((signed)(sizeof(s->direct_scale_mv[0])/sizeof(int16_t)))
557 c4e2a535 D Richard Felker III
#define tab_bias (tab_size/2)
558
559 841f65f2 Loren Merritt
static void ff_mpeg4_init_direct_mv(MpegEncContext *s){
560
    int i;
561
    for(i=0; i<tab_size; i++){
562
        s->direct_scale_mv[0][i] = (i-tab_bias)*s->pb_time/s->pp_time;
563
        s->direct_scale_mv[1][i] = (i-tab_bias)*(s->pb_time-s->pp_time)/s->pp_time;
564
    }
565
}
566
567
static inline void ff_mpeg4_set_one_direct_mv(MpegEncContext *s, int mx, int my, int i){
568
    int xy= s->block_index[i];
569
    uint16_t time_pp= s->pp_time;
570
    uint16_t time_pb= s->pb_time;
571
    int p_mx, p_my;
572
573
    p_mx= s->next_picture.motion_val[0][xy][0];
574
    if((unsigned)(p_mx + tab_bias) < tab_size){
575
        s->mv[0][i][0] = s->direct_scale_mv[0][p_mx + tab_bias] + mx;
576
        s->mv[1][i][0] = mx ? s->mv[0][i][0] - p_mx
577
                            : s->direct_scale_mv[1][p_mx + tab_bias];
578
    }else{
579
        s->mv[0][i][0] = p_mx*time_pb/time_pp + mx;
580
        s->mv[1][i][0] = mx ? s->mv[0][i][0] - p_mx
581
                            : p_mx*(time_pb - time_pp)/time_pp;
582
    }
583
    p_my= s->next_picture.motion_val[0][xy][1];
584
    if((unsigned)(p_my + tab_bias) < tab_size){
585
        s->mv[0][i][1] = s->direct_scale_mv[0][p_my + tab_bias] + my;
586
        s->mv[1][i][1] = my ? s->mv[0][i][1] - p_my
587
                            : s->direct_scale_mv[1][p_my + tab_bias];
588
    }else{
589
        s->mv[0][i][1] = p_my*time_pb/time_pp + my;
590
        s->mv[1][i][1] = my ? s->mv[0][i][1] - p_my
591
                            : p_my*(time_pb - time_pp)/time_pp;
592
    }
593
}
594
595 c4e2a535 D Richard Felker III
#undef tab_size
596
#undef tab_bias
597
598 7bc9090a Michael Niedermayer
/**
599
 *
600
 * @return the mb_type
601
 */
602
int ff_mpeg4_set_direct_mv(MpegEncContext *s, int mx, int my){
603
    const int mb_index= s->mb_x + s->mb_y*s->mb_stride;
604 bb198e19 Michael Niedermayer
    const int colocated_mb_type= s->next_picture.mb_type[mb_index];
605 1457ab52 Michael Niedermayer
    uint16_t time_pp= s->pp_time;
606
    uint16_t time_pb= s->pb_time;
607
    int i;
608 115329f1 Diego Biurrun
609 1457ab52 Michael Niedermayer
    //FIXME avoid divides
610 841f65f2 Loren Merritt
    // try special case with shifts for 1 and 3 B-frames?
611 115329f1 Diego Biurrun
612 7bc9090a Michael Niedermayer
    if(IS_8X8(colocated_mb_type)){
613 1457ab52 Michael Niedermayer
        s->mv_type = MV_TYPE_8X8;
614
        for(i=0; i<4; i++){
615 841f65f2 Loren Merritt
            ff_mpeg4_set_one_direct_mv(s, mx, my, i);
616 1457ab52 Michael Niedermayer
        }
617 7bc9090a Michael Niedermayer
        return MB_TYPE_DIRECT2 | MB_TYPE_8x8 | MB_TYPE_L0L1;
618
    } else if(IS_INTERLACED(colocated_mb_type)){
619 1457ab52 Michael Niedermayer
        s->mv_type = MV_TYPE_FIELD;
620
        for(i=0; i<2; i++){
621 7c4f71c4 Michael Niedermayer
            int field_select= s->next_picture.ref_index[0][s->block_index[2*i]];
622 1956e166 Michael Niedermayer
            s->field_select[0][i]= field_select;
623
            s->field_select[1][i]= i;
624 1457ab52 Michael Niedermayer
            if(s->top_field_first){
625 7c4f71c4 Michael Niedermayer
                time_pp= s->pp_field_time - field_select + i;
626
                time_pb= s->pb_field_time - field_select + i;
627 1457ab52 Michael Niedermayer
            }else{
628 7c4f71c4 Michael Niedermayer
                time_pp= s->pp_field_time + field_select - i;
629
                time_pb= s->pb_field_time + field_select - i;
630 1457ab52 Michael Niedermayer
            }
631 bb198e19 Michael Niedermayer
            s->mv[0][i][0] = s->p_field_mv_table[i][0][mb_index][0]*time_pb/time_pp + mx;
632
            s->mv[0][i][1] = s->p_field_mv_table[i][0][mb_index][1]*time_pb/time_pp + my;
633
            s->mv[1][i][0] = mx ? s->mv[0][i][0] - s->p_field_mv_table[i][0][mb_index][0]
634
                                : s->p_field_mv_table[i][0][mb_index][0]*(time_pb - time_pp)/time_pp;
635 115329f1 Diego Biurrun
            s->mv[1][i][1] = my ? s->mv[0][i][1] - s->p_field_mv_table[i][0][mb_index][1]
636 bb198e19 Michael Niedermayer
                                : s->p_field_mv_table[i][0][mb_index][1]*(time_pb - time_pp)/time_pp;
637 1457ab52 Michael Niedermayer
        }
638 7bc9090a Michael Niedermayer
        return MB_TYPE_DIRECT2 | MB_TYPE_16x8 | MB_TYPE_L0L1 | MB_TYPE_INTERLACED;
639
    }else{
640 841f65f2 Loren Merritt
        ff_mpeg4_set_one_direct_mv(s, mx, my, 0);
641
        s->mv[0][1][0] = s->mv[0][2][0] = s->mv[0][3][0] = s->mv[0][0][0];
642
        s->mv[0][1][1] = s->mv[0][2][1] = s->mv[0][3][1] = s->mv[0][0][1];
643
        s->mv[1][1][0] = s->mv[1][2][0] = s->mv[1][3][0] = s->mv[1][0][0];
644
        s->mv[1][1][1] = s->mv[1][2][1] = s->mv[1][3][1] = s->mv[1][0][1];
645 7bc9090a Michael Niedermayer
        if((s->avctx->workaround_bugs & FF_BUG_DIRECT_BLOCKSIZE) || !s->quarter_sample)
646
            s->mv_type= MV_TYPE_16X16;
647
        else
648
            s->mv_type= MV_TYPE_8X8;
649
        return MB_TYPE_DIRECT2 | MB_TYPE_16x16 | MB_TYPE_L0L1; //Note see prev line
650 1457ab52 Michael Niedermayer
    }
651
}
652
653 7d1c3fc1 Michael Niedermayer
void ff_h263_update_motion_val(MpegEncContext * s){
654
    const int mb_xy = s->mb_y * s->mb_stride + s->mb_x;
655 893bc624 Kevin Baragona
               //FIXME a lot of that is only needed for !low_delay
656 137c8468 Michael Niedermayer
    const int wrap = s->b8_stride;
657 7d1c3fc1 Michael Niedermayer
    const int xy = s->block_index[0];
658 115329f1 Diego Biurrun
659
    s->current_picture.mbskip_table[mb_xy]= s->mb_skipped;
660 7d1c3fc1 Michael Niedermayer
661
    if(s->mv_type != MV_TYPE_8X8){
662
        int motion_x, motion_y;
663
        if (s->mb_intra) {
664
            motion_x = 0;
665
            motion_y = 0;
666
        } else if (s->mv_type == MV_TYPE_16X16) {
667
            motion_x = s->mv[0][0][0];
668
            motion_y = s->mv[0][0][1];
669
        } else /*if (s->mv_type == MV_TYPE_FIELD)*/ {
670
            int i;
671
            motion_x = s->mv[0][0][0] + s->mv[0][1][0];
672
            motion_y = s->mv[0][0][1] + s->mv[0][1][1];
673
            motion_x = (motion_x>>1) | (motion_x&1);
674
            for(i=0; i<2; i++){
675 bb198e19 Michael Niedermayer
                s->p_field_mv_table[i][0][mb_xy][0]= s->mv[0][i][0];
676
                s->p_field_mv_table[i][0][mb_xy][1]= s->mv[0][i][1];
677 7d1c3fc1 Michael Niedermayer
            }
678 7c4f71c4 Michael Niedermayer
            s->current_picture.ref_index[0][xy           ]=
679
            s->current_picture.ref_index[0][xy        + 1]= s->field_select[0][0];
680
            s->current_picture.ref_index[0][xy + wrap    ]=
681
            s->current_picture.ref_index[0][xy + wrap + 1]= s->field_select[0][1];
682 7d1c3fc1 Michael Niedermayer
        }
683 7c4f71c4 Michael Niedermayer
684 7d1c3fc1 Michael Niedermayer
        /* no update if 8X8 because it has been done during parsing */
685 8d7ec294 Wolfgang Hesseler
        s->current_picture.motion_val[0][xy][0] = motion_x;
686
        s->current_picture.motion_val[0][xy][1] = motion_y;
687
        s->current_picture.motion_val[0][xy + 1][0] = motion_x;
688
        s->current_picture.motion_val[0][xy + 1][1] = motion_y;
689
        s->current_picture.motion_val[0][xy + wrap][0] = motion_x;
690
        s->current_picture.motion_val[0][xy + wrap][1] = motion_y;
691
        s->current_picture.motion_val[0][xy + 1 + wrap][0] = motion_x;
692
        s->current_picture.motion_val[0][xy + 1 + wrap][1] = motion_y;
693 7d1c3fc1 Michael Niedermayer
    }
694
695
    if(s->encoding){ //FIXME encoding MUST be cleaned up
696 115329f1 Diego Biurrun
        if (s->mv_type == MV_TYPE_8X8)
697 7d1c3fc1 Michael Niedermayer
            s->current_picture.mb_type[mb_xy]= MB_TYPE_L0 | MB_TYPE_8x8;
698 f7190f73 Michael Niedermayer
        else if(s->mb_intra)
699
            s->current_picture.mb_type[mb_xy]= MB_TYPE_INTRA;
700 7d1c3fc1 Michael Niedermayer
        else
701
            s->current_picture.mb_type[mb_xy]= MB_TYPE_L0 | MB_TYPE_16x16;
702
    }
703
}
704
705 bbed9259 Michael Niedermayer
#ifdef CONFIG_ENCODERS
706 f2f6134b Michael Niedermayer
707 1b781f82 Michael Niedermayer
static inline int h263_get_motion_length(MpegEncContext * s, int val, int f_code){
708
    int l, bit_size, code;
709
710
    if (val == 0) {
711
        return mvtab[0][1];
712
    } else {
713
        bit_size = f_code - 1;
714
        /* modulo encoding */
715
        l= INT_BIT - 6 - bit_size;
716
        val = (val<<l)>>l;
717
        val--;
718
        code = (val >> bit_size) + 1;
719
720
        return mvtab[code][1] + 1 + bit_size;
721
    }
722
}
723
724
static inline void ff_h263_encode_motion_vector(MpegEncContext * s, int x, int y, int f_code){
725
    if(s->flags2 & CODEC_FLAG2_NO_OUTPUT){
726 115329f1 Diego Biurrun
        skip_put_bits(&s->pb,
727 1b781f82 Michael Niedermayer
            h263_get_motion_length(s, x, f_code)
728
           +h263_get_motion_length(s, y, f_code));
729
    }else{
730
        ff_h263_encode_motion(s, x, f_code);
731
        ff_h263_encode_motion(s, y, f_code);
732
    }
733
}
734
735 f2f6134b Michael Niedermayer
static inline int get_p_cbp(MpegEncContext * s,
736
                      DCTELEM block[6][64],
737
                      int motion_x, int motion_y){
738
    int cbp, i;
739
740
    if(s->flags & CODEC_FLAG_CBP_RD){
741
        int best_cbpy_score= INT_MAX;
742
        int best_cbpc_score= INT_MAX;
743 9b879566 Michel Bardiaux
        int cbpc = (-1), cbpy= (-1);
744 f2f6134b Michael Niedermayer
        const int offset= (s->mv_type==MV_TYPE_16X16 ? 0 : 16) + (s->dquant ? 8 : 0);
745 158c7f05 Michael Niedermayer
        const int lambda= s->lambda2 >> (FF_LAMBDA_SHIFT - 6);
746 f2f6134b Michael Niedermayer
747
        for(i=0; i<4; i++){
748
            int score= inter_MCBPC_bits[i + offset] * lambda;
749
            if(i&1) score += s->coded_score[5];
750
            if(i&2) score += s->coded_score[4];
751
752
            if(score < best_cbpc_score){
753
                best_cbpc_score= score;
754
                cbpc= i;
755
            }
756
        }
757
758
        for(i=0; i<16; i++){
759
            int score= cbpy_tab[i ^ 0xF][1] * lambda;
760
            if(i&1) score += s->coded_score[3];
761
            if(i&2) score += s->coded_score[2];
762
            if(i&4) score += s->coded_score[1];
763
            if(i&8) score += s->coded_score[0];
764
765
            if(score < best_cbpy_score){
766
                best_cbpy_score= score;
767
                cbpy= i;
768
            }
769
        }
770
        cbp= cbpc + 4*cbpy;
771
        if ((motion_x | motion_y | s->dquant) == 0 && s->mv_type==MV_TYPE_16X16){
772
            if(best_cbpy_score + best_cbpc_score + 2*lambda >= 0)
773
                cbp= 0;
774
        }
775
776
        for (i = 0; i < 6; i++) {
777
            if (s->block_last_index[i] >= 0 && ((cbp >> (5 - i))&1)==0 ){
778
                s->block_last_index[i]= -1;
779
                memset(s->block[i], 0, sizeof(DCTELEM)*64);
780
            }
781
        }
782
    }else{
783
        cbp= 0;
784
        for (i = 0; i < 6; i++) {
785
            if (s->block_last_index[i] >= 0)
786
                cbp |= 1 << (5 - i);
787
        }
788
    }
789
    return cbp;
790
}
791
792
static inline int get_b_cbp(MpegEncContext * s, DCTELEM block[6][64],
793
                            int motion_x, int motion_y, int mb_type){
794
    int cbp=0, i;
795
796
    if(s->flags & CODEC_FLAG_CBP_RD){
797
        int score=0;
798 158c7f05 Michael Niedermayer
        const int lambda= s->lambda2 >> (FF_LAMBDA_SHIFT - 6);
799 115329f1 Diego Biurrun
800 f2f6134b Michael Niedermayer
        for(i=0; i<6; i++){
801
            if(s->coded_score[i] < 0){
802
                score += s->coded_score[i];
803
                cbp |= 1 << (5 - i);
804
            }
805
        }
806 115329f1 Diego Biurrun
807 f2f6134b Michael Niedermayer
        if(cbp){
808
            int zero_score= -6;
809
            if ((motion_x | motion_y | s->dquant | mb_type) == 0){
810
                zero_score-= 4; //2*MV + mb_type + cbp bit
811
            }
812
813
            zero_score*= lambda;
814
            if(zero_score <= score){
815
                cbp=0;
816
            }
817
        }
818
819
        for (i = 0; i < 6; i++) {
820
            if (s->block_last_index[i] >= 0 && ((cbp >> (5 - i))&1)==0 ){
821
                s->block_last_index[i]= -1;
822
                memset(s->block[i], 0, sizeof(DCTELEM)*64);
823
            }
824
        }
825
    }else{
826
        for (i = 0; i < 6; i++) {
827
            if (s->block_last_index[i] >= 0)
828
                cbp |= 1 << (5 - i);
829
        }
830
    }
831
    return cbp;
832
}
833
834 115329f1 Diego Biurrun
static inline void mpeg4_encode_blocks(MpegEncContext * s, DCTELEM block[6][64], int intra_dc[6],
835 1b781f82 Michael Niedermayer
                               uint8_t **scan_table, PutBitContext *dc_pb, PutBitContext *ac_pb){
836
    int i;
837 115329f1 Diego Biurrun
838 1b781f82 Michael Niedermayer
    if(scan_table){
839
        if(s->flags2 & CODEC_FLAG2_NO_OUTPUT){
840
            for (i = 0; i < 6; i++) {
841
                skip_put_bits(&s->pb, mpeg4_get_block_length(s, block[i], i, intra_dc[i], scan_table[i]));
842
            }
843
        }else{
844
            /* encode each block */
845
            for (i = 0; i < 6; i++) {
846
                mpeg4_encode_block(s, block[i], i, intra_dc[i], scan_table[i], dc_pb, ac_pb);
847
            }
848
        }
849
    }else{
850
        if(s->flags2 & CODEC_FLAG2_NO_OUTPUT){
851
            for (i = 0; i < 6; i++) {
852
                skip_put_bits(&s->pb, mpeg4_get_block_length(s, block[i], i, 0, s->intra_scantable.permutated));
853
            }
854
        }else{
855
            /* encode each block */
856
            for (i = 0; i < 6; i++) {
857
                mpeg4_encode_block(s, block[i], i, 0, s->intra_scantable.permutated, dc_pb, ac_pb);
858
            }
859
        }
860
    }
861
}
862
863 d6231b9e Michael Niedermayer
void mpeg4_encode_mb(MpegEncContext * s,
864 bb270c08 Diego Biurrun
                    DCTELEM block[6][64],
865
                    int motion_x, int motion_y)
866 d6231b9e Michael Niedermayer
{
867 5c91a675 Zdenek Kabelac
    int cbpc, cbpy, pred_x, pred_y;
868 92073d01 Michael Niedermayer
    PutBitContext * const pb2    = s->data_partitioning                         ? &s->pb2    : &s->pb;
869
    PutBitContext * const tex_pb = s->data_partitioning && s->pict_type!=B_TYPE ? &s->tex_pb : &s->pb;
870
    PutBitContext * const dc_pb  = s->data_partitioning && s->pict_type!=I_TYPE ? &s->pb2    : &s->pb;
871
    const int interleaved_stats= (s->flags&CODEC_FLAG_PASS1) && !s->data_partitioning ? 1 : 0;
872 c5d309f2 Michael Niedermayer
    const int dquant_code[5]= {1,0,9,2,3};
873 115329f1 Diego Biurrun
874 d6231b9e Michael Niedermayer
    //    printf("**mb x=%d y=%d\n", s->mb_x, s->mb_y);
875
    if (!s->mb_intra) {
876 f2f6134b Michael Niedermayer
        int i, cbp;
877 115329f1 Diego Biurrun
878 9dbcbd92 Michael Niedermayer
        if(s->pict_type==B_TYPE){
879
            static const int mb_type_table[8]= {-1, 2, 3, 1,-1,-1,-1, 0}; /* convert from mv_dir to type */
880
            int mb_type=  mb_type_table[s->mv_dir];
881 bb198e19 Michael Niedermayer
882 9dbcbd92 Michael Niedermayer
            if(s->mb_x==0){
883 bb198e19 Michael Niedermayer
                for(i=0; i<2; i++){
884 115329f1 Diego Biurrun
                    s->last_mv[i][0][0]=
885
                    s->last_mv[i][0][1]=
886
                    s->last_mv[i][1][0]=
887 bb198e19 Michael Niedermayer
                    s->last_mv[i][1][1]= 0;
888
                }
889 9dbcbd92 Michael Niedermayer
            }
890 115329f1 Diego Biurrun
891 c5d309f2 Michael Niedermayer
            assert(s->dquant>=-2 && s->dquant<=2);
892
            assert((s->dquant&1)==0);
893
            assert(mb_type>=0);
894 9dbcbd92 Michael Niedermayer
895 160d679c Mike Melanson
            /* nothing to do if this MB was skipped in the next P Frame */
896 7bc9090a Michael Niedermayer
            if(s->next_picture.mbskip_table[s->mb_y * s->mb_stride + s->mb_x]){ //FIXME avoid DCT & ...
897 9dbcbd92 Michael Niedermayer
                s->skip_count++;
898 115329f1 Diego Biurrun
                s->mv[0][0][0]=
899
                s->mv[0][0][1]=
900
                s->mv[1][0][0]=
901 9dbcbd92 Michael Niedermayer
                s->mv[1][0][1]= 0;
902 893bc624 Kevin Baragona
                s->mv_dir= MV_DIR_FORWARD; //doesn't matter
903 c5d309f2 Michael Niedermayer
                s->qscale -= s->dquant;
904 160d679c Mike Melanson
//                s->mb_skipped=1;
905 1e491e29 Michael Niedermayer
906 9dbcbd92 Michael Niedermayer
                return;
907
            }
908 115329f1 Diego Biurrun
909 f2f6134b Michael Niedermayer
            cbp= get_b_cbp(s, block, motion_x, motion_y, mb_type);
910 115329f1 Diego Biurrun
911 9dbcbd92 Michael Niedermayer
            if ((cbp | motion_x | motion_y | mb_type) ==0) {
912
                /* direct MB with MV={0,0} */
913 c5d309f2 Michael Niedermayer
                assert(s->dquant==0);
914 115329f1 Diego Biurrun
915 9dbcbd92 Michael Niedermayer
                put_bits(&s->pb, 1, 1); /* mb not coded modb1=1 */
916 92073d01 Michael Niedermayer
917
                if(interleaved_stats){
918
                    s->misc_bits++;
919
                    s->last_bits++;
920
                }
921 9dbcbd92 Michael Niedermayer
                s->skip_count++;
922
                return;
923
            }
924 115329f1 Diego Biurrun
925 bb270c08 Diego Biurrun
            put_bits(&s->pb, 1, 0);     /* mb coded modb1=0 */
926 9dbcbd92 Michael Niedermayer
            put_bits(&s->pb, 1, cbp ? 0 : 1); /* modb2 */ //FIXME merge
927 893bc624 Kevin Baragona
            put_bits(&s->pb, mb_type+1, 1); // this table is so simple that we don't need it :)
928 9dbcbd92 Michael Niedermayer
            if(cbp) put_bits(&s->pb, 6, cbp);
929 115329f1 Diego Biurrun
930 c5d309f2 Michael Niedermayer
            if(cbp && mb_type){
931
                if(s->dquant)
932
                    put_bits(&s->pb, 2, (s->dquant>>2)+3);
933
                else
934
                    put_bits(&s->pb, 1, 0);
935
            }else
936
                s->qscale -= s->dquant;
937 115329f1 Diego Biurrun
938 fcb48651 Michael Niedermayer
            if(!s->progressive_sequence){
939
                if(cbp)
940
                    put_bits(&s->pb, 1, s->interlaced_dct);
941 893bc624 Kevin Baragona
                if(mb_type) // not direct mode
942 bb198e19 Michael Niedermayer
                    put_bits(&s->pb, 1, s->mv_type == MV_TYPE_FIELD);
943 fcb48651 Michael Niedermayer
            }
944 9dbcbd92 Michael Niedermayer
945 92073d01 Michael Niedermayer
            if(interleaved_stats){
946 4d2a4834 Michael Niedermayer
                s->misc_bits+= get_bits_diff(s);
947 92073d01 Michael Niedermayer
            }
948 cf8039b2 Michael Niedermayer
949 bb198e19 Michael Niedermayer
            if(mb_type == 0){
950
                assert(s->mv_dir & MV_DIRECT);
951 1b781f82 Michael Niedermayer
                ff_h263_encode_motion_vector(s, motion_x, motion_y, 1);
952 66370d3f Michael Niedermayer
                s->b_count++;
953
                s->f_count++;
954 bb198e19 Michael Niedermayer
            }else{
955
                assert(mb_type > 0 && mb_type < 4);
956
                if(s->mv_type != MV_TYPE_FIELD){
957
                    if(s->mv_dir & MV_DIR_FORWARD){
958 1b781f82 Michael Niedermayer
                        ff_h263_encode_motion_vector(s, s->mv[0][0][0] - s->last_mv[0][0][0],
959
                                                        s->mv[0][0][1] - s->last_mv[0][0][1], s->f_code);
960 bb198e19 Michael Niedermayer
                        s->last_mv[0][0][0]= s->last_mv[0][1][0]= s->mv[0][0][0];
961
                        s->last_mv[0][0][1]= s->last_mv[0][1][1]= s->mv[0][0][1];
962
                        s->f_count++;
963
                    }
964
                    if(s->mv_dir & MV_DIR_BACKWARD){
965 1b781f82 Michael Niedermayer
                        ff_h263_encode_motion_vector(s, s->mv[1][0][0] - s->last_mv[1][0][0],
966
                                                        s->mv[1][0][1] - s->last_mv[1][0][1], s->b_code);
967 bb198e19 Michael Niedermayer
                        s->last_mv[1][0][0]= s->last_mv[1][1][0]= s->mv[1][0][0];
968
                        s->last_mv[1][0][1]= s->last_mv[1][1][1]= s->mv[1][0][1];
969
                        s->b_count++;
970
                    }
971
                }else{
972
                    if(s->mv_dir & MV_DIR_FORWARD){
973
                        put_bits(&s->pb, 1, s->field_select[0][0]);
974
                        put_bits(&s->pb, 1, s->field_select[0][1]);
975
                    }
976
                    if(s->mv_dir & MV_DIR_BACKWARD){
977
                        put_bits(&s->pb, 1, s->field_select[1][0]);
978
                        put_bits(&s->pb, 1, s->field_select[1][1]);
979
                    }
980
                    if(s->mv_dir & MV_DIR_FORWARD){
981
                        for(i=0; i<2; i++){
982 1b781f82 Michael Niedermayer
                            ff_h263_encode_motion_vector(s, s->mv[0][i][0] - s->last_mv[0][i][0]  ,
983
                                                            s->mv[0][i][1] - s->last_mv[0][i][1]/2, s->f_code);
984 bb198e19 Michael Niedermayer
                            s->last_mv[0][i][0]= s->mv[0][i][0];
985
                            s->last_mv[0][i][1]= s->mv[0][i][1]*2;
986
                        }
987
                        s->f_count++;
988
                    }
989
                    if(s->mv_dir & MV_DIR_BACKWARD){
990
                        for(i=0; i<2; i++){
991 1b781f82 Michael Niedermayer
                            ff_h263_encode_motion_vector(s, s->mv[1][i][0] - s->last_mv[1][i][0]  ,
992
                                                            s->mv[1][i][1] - s->last_mv[1][i][1]/2, s->b_code);
993 bb198e19 Michael Niedermayer
                            s->last_mv[1][i][0]= s->mv[1][i][0];
994
                            s->last_mv[1][i][1]= s->mv[1][i][1]*2;
995
                        }
996
                        s->b_count++;
997
                    }
998
                }
999 9dbcbd92 Michael Niedermayer
            }
1000 92073d01 Michael Niedermayer
1001
            if(interleaved_stats){
1002 4d2a4834 Michael Niedermayer
                s->mv_bits+= get_bits_diff(s);
1003 92073d01 Michael Niedermayer
            }
1004 d6231b9e Michael Niedermayer
1005 1b781f82 Michael Niedermayer
            mpeg4_encode_blocks(s, block, NULL, NULL, NULL, &s->pb);
1006 92073d01 Michael Niedermayer
1007
            if(interleaved_stats){
1008 4d2a4834 Michael Niedermayer
                s->p_tex_bits+= get_bits_diff(s);
1009 9dbcbd92 Michael Niedermayer
            }
1010 bb198e19 Michael Niedermayer
1011 9dbcbd92 Michael Niedermayer
        }else{ /* s->pict_type==B_TYPE */
1012 f2f6134b Michael Niedermayer
            cbp= get_p_cbp(s, block, motion_x, motion_y);
1013 115329f1 Diego Biurrun
1014 c5d309f2 Michael Niedermayer
            if ((cbp | motion_x | motion_y | s->dquant) == 0 && s->mv_type==MV_TYPE_16X16) {
1015 115329f1 Diego Biurrun
                /* check if the B frames can skip it too, as we must skip it if we skip here
1016 893bc624 Kevin Baragona
                   why didn't they just compress the skip-mb bits instead of reusing them ?! */
1017 ee6f7861 Michael Niedermayer
                if(s->max_b_frames>0){
1018
                    int i;
1019 e71a4f74 Michael Niedermayer
                    int x,y, offset;
1020
                    uint8_t *p_pic;
1021
1022
                    x= s->mb_x*16;
1023
                    y= s->mb_y*16;
1024
                    if(x+16 > s->width)  x= s->width-16;
1025
                    if(y+16 > s->height) y= s->height-16;
1026
1027
                    offset= x + y*s->linesize;
1028 1e491e29 Michael Niedermayer
                    p_pic= s->new_picture.data[0] + offset;
1029 115329f1 Diego Biurrun
1030 160d679c Mike Melanson
                    s->mb_skipped=1;
1031 ee6f7861 Michael Niedermayer
                    for(i=0; i<s->max_b_frames; i++){
1032 d697b89b Michael Niedermayer
                        uint8_t *b_pic;
1033
                        int diff;
1034 1e491e29 Michael Niedermayer
                        Picture *pic= s->reordered_input_picture[i+1];
1035 d697b89b Michael Niedermayer
1036 1e491e29 Michael Niedermayer
                        if(pic==NULL || pic->pict_type!=B_TYPE) break;
1037 d697b89b Michael Niedermayer
1038 07fc2b82 Michael Niedermayer
                        b_pic= pic->data[0] + offset;
1039
                        if(pic->type != FF_BUFFER_TYPE_SHARED)
1040
                            b_pic+= INPLACE_OFFSET;
1041 bb270c08 Diego Biurrun
                        diff= s->dsp.sad[0](NULL, p_pic, b_pic, s->linesize, 16);
1042 e71a4f74 Michael Niedermayer
                        if(diff>s->qscale*70){ //FIXME check that 70 is optimal
1043 160d679c Mike Melanson
                            s->mb_skipped=0;
1044 ee6f7861 Michael Niedermayer
                            break;
1045
                        }
1046
                    }
1047
                }else
1048 115329f1 Diego Biurrun
                    s->mb_skipped=1;
1049 ee6f7861 Michael Niedermayer
1050 160d679c Mike Melanson
                if(s->mb_skipped==1){
1051 ee6f7861 Michael Niedermayer
                    /* skip macroblock */
1052
                    put_bits(&s->pb, 1, 1);
1053 92073d01 Michael Niedermayer
1054
                    if(interleaved_stats){
1055
                        s->misc_bits++;
1056
                        s->last_bits++;
1057
                    }
1058 ee6f7861 Michael Niedermayer
                    s->skip_count++;
1059 115329f1 Diego Biurrun
1060 ee6f7861 Michael Niedermayer
                    return;
1061
                }
1062 9dbcbd92 Michael Niedermayer
            }
1063 e71a4f74 Michael Niedermayer
1064 bb270c08 Diego Biurrun
            put_bits(&s->pb, 1, 0);     /* mb coded */
1065 f7190f73 Michael Niedermayer
            cbpc = cbp & 3;
1066
            cbpy = cbp >> 2;
1067
            cbpy ^= 0xf;
1068 9dbcbd92 Michael Niedermayer
            if(s->mv_type==MV_TYPE_16X16){
1069 c5d309f2 Michael Niedermayer
                if(s->dquant) cbpc+= 8;
1070 9dbcbd92 Michael Niedermayer
                put_bits(&s->pb,
1071
                        inter_MCBPC_bits[cbpc],
1072
                        inter_MCBPC_code[cbpc]);
1073 c5d309f2 Michael Niedermayer
1074 92073d01 Michael Niedermayer
                put_bits(pb2, cbpy_tab[cbpy][1], cbpy_tab[cbpy][0]);
1075 c5d309f2 Michael Niedermayer
                if(s->dquant)
1076
                    put_bits(pb2, 2, dquant_code[s->dquant+2]);
1077 fcb48651 Michael Niedermayer
1078
                if(!s->progressive_sequence){
1079
                    if(cbp)
1080
                        put_bits(pb2, 1, s->interlaced_dct);
1081 bb198e19 Michael Niedermayer
                    put_bits(pb2, 1, 0);
1082 fcb48651 Michael Niedermayer
                }
1083 115329f1 Diego Biurrun
1084 92073d01 Michael Niedermayer
                if(interleaved_stats){
1085 4d2a4834 Michael Niedermayer
                    s->misc_bits+= get_bits_diff(s);
1086 92073d01 Michael Niedermayer
                }
1087 d6231b9e Michael Niedermayer
1088 9dbcbd92 Michael Niedermayer
                /* motion vectors: 16x16 mode */
1089 137c8468 Michael Niedermayer
                h263_pred_motion(s, 0, 0, &pred_x, &pred_y);
1090 115329f1 Diego Biurrun
1091 1b781f82 Michael Niedermayer
                ff_h263_encode_motion_vector(s, motion_x - pred_x,
1092
                                                motion_y - pred_y, s->f_code);
1093 bb198e19 Michael Niedermayer
            }else if(s->mv_type==MV_TYPE_FIELD){
1094
                if(s->dquant) cbpc+= 8;
1095
                put_bits(&s->pb,
1096
                        inter_MCBPC_bits[cbpc],
1097
                        inter_MCBPC_code[cbpc]);
1098
1099
                put_bits(pb2, cbpy_tab[cbpy][1], cbpy_tab[cbpy][0]);
1100
                if(s->dquant)
1101
                    put_bits(pb2, 2, dquant_code[s->dquant+2]);
1102
1103
                assert(!s->progressive_sequence);
1104
                if(cbp)
1105
                    put_bits(pb2, 1, s->interlaced_dct);
1106
                put_bits(pb2, 1, 1);
1107 115329f1 Diego Biurrun
1108 bb198e19 Michael Niedermayer
                if(interleaved_stats){
1109
                    s->misc_bits+= get_bits_diff(s);
1110
                }
1111
1112
                /* motion vectors: 16x8 interlaced mode */
1113 137c8468 Michael Niedermayer
                h263_pred_motion(s, 0, 0, &pred_x, &pred_y);
1114 bb198e19 Michael Niedermayer
                pred_y /=2;
1115 115329f1 Diego Biurrun
1116 bb198e19 Michael Niedermayer
                put_bits(&s->pb, 1, s->field_select[0][0]);
1117
                put_bits(&s->pb, 1, s->field_select[0][1]);
1118 115329f1 Diego Biurrun
1119 1b781f82 Michael Niedermayer
                ff_h263_encode_motion_vector(s, s->mv[0][0][0] - pred_x,
1120
                                                s->mv[0][0][1] - pred_y, s->f_code);
1121
                ff_h263_encode_motion_vector(s, s->mv[0][1][0] - pred_x,
1122
                                                s->mv[0][1][1] - pred_y, s->f_code);
1123 9dbcbd92 Michael Niedermayer
            }else{
1124 bb198e19 Michael Niedermayer
                assert(s->mv_type==MV_TYPE_8X8);
1125 9dbcbd92 Michael Niedermayer
                put_bits(&s->pb,
1126 f7190f73 Michael Niedermayer
                        inter_MCBPC_bits[cbpc+16],
1127
                        inter_MCBPC_code[cbpc+16]);
1128 92073d01 Michael Niedermayer
                put_bits(pb2, cbpy_tab[cbpy][1], cbpy_tab[cbpy][0]);
1129 9dbcbd92 Michael Niedermayer
1130 49943a18 Michael Niedermayer
                if(!s->progressive_sequence){
1131
                    if(cbp)
1132
                        put_bits(pb2, 1, s->interlaced_dct);
1133
                }
1134 115329f1 Diego Biurrun
1135 92073d01 Michael Niedermayer
                if(interleaved_stats){
1136 4d2a4834 Michael Niedermayer
                    s->misc_bits+= get_bits_diff(s);
1137 92073d01 Michael Niedermayer
                }
1138 9dbcbd92 Michael Niedermayer
1139
                for(i=0; i<4; i++){
1140
                    /* motion vectors: 8x8 mode*/
1141 137c8468 Michael Niedermayer
                    h263_pred_motion(s, i, 0, &pred_x, &pred_y);
1142 9dbcbd92 Michael Niedermayer
1143 1b781f82 Michael Niedermayer
                    ff_h263_encode_motion_vector(s, s->current_picture.motion_val[0][ s->block_index[i] ][0] - pred_x,
1144
                                                    s->current_picture.motion_val[0][ s->block_index[i] ][1] - pred_y, s->f_code);
1145 9dbcbd92 Michael Niedermayer
                }
1146 cf8039b2 Michael Niedermayer
            }
1147 92073d01 Michael Niedermayer
1148 115329f1 Diego Biurrun
            if(interleaved_stats){
1149 4d2a4834 Michael Niedermayer
                s->mv_bits+= get_bits_diff(s);
1150 92073d01 Michael Niedermayer
            }
1151 098eefe1 Michael Niedermayer
1152 1b781f82 Michael Niedermayer
            mpeg4_encode_blocks(s, block, NULL, NULL, NULL, tex_pb);
1153 92073d01 Michael Niedermayer
1154
            if(interleaved_stats){
1155 4d2a4834 Michael Niedermayer
                s->p_tex_bits+= get_bits_diff(s);
1156 9dbcbd92 Michael Niedermayer
            }
1157 66370d3f Michael Niedermayer
            s->f_count++;
1158 d6231b9e Michael Niedermayer
        }
1159
    } else {
1160 9dbcbd92 Michael Niedermayer
        int cbp;
1161 115329f1 Diego Biurrun
        int dc_diff[6];   //dc values with the dc prediction subtracted
1162 d6231b9e Michael Niedermayer
        int dir[6];  //prediction direction
1163
        int zigzag_last_index[6];
1164 bb270c08 Diego Biurrun
        uint8_t *scan_table[6];
1165 5c91a675 Zdenek Kabelac
        int i;
1166 d6231b9e Michael Niedermayer
1167
        for(i=0; i<6; i++){
1168 a7137a04 Michael Niedermayer
            dc_diff[i]= ff_mpeg4_pred_dc(s, i, block[i][0], &dir[i], 1);
1169 d6231b9e Michael Niedermayer
        }
1170
1171 8d8c0294 Michael Niedermayer
        if(s->flags & CODEC_FLAG_AC_PRED){
1172
            s->ac_pred= decide_ac_pred(s, block, dir, scan_table, zigzag_last_index);
1173
            if(!s->ac_pred)
1174
                restore_ac_coeffs(s, block, dir, scan_table, zigzag_last_index);
1175 d6231b9e Michael Niedermayer
        }else{
1176
            for(i=0; i<6; i++)
1177 2ad1516a Michael Niedermayer
                scan_table[i]= s->intra_scantable.permutated;
1178 d6231b9e Michael Niedermayer
        }
1179
1180
        /* compute cbp */
1181
        cbp = 0;
1182
        for (i = 0; i < 6; i++) {
1183
            if (s->block_last_index[i] >= 1)
1184
                cbp |= 1 << (5 - i);
1185
        }
1186
1187
        cbpc = cbp & 3;
1188
        if (s->pict_type == I_TYPE) {
1189 c5d309f2 Michael Niedermayer
            if(s->dquant) cbpc+=4;
1190 d6231b9e Michael Niedermayer
            put_bits(&s->pb,
1191
                intra_MCBPC_bits[cbpc],
1192
                intra_MCBPC_code[cbpc]);
1193
        } else {
1194 c5d309f2 Michael Niedermayer
            if(s->dquant) cbpc+=8;
1195 bb270c08 Diego Biurrun
            put_bits(&s->pb, 1, 0);     /* mb coded */
1196 d6231b9e Michael Niedermayer
            put_bits(&s->pb,
1197
                inter_MCBPC_bits[cbpc + 4],
1198
                inter_MCBPC_code[cbpc + 4]);
1199
        }
1200 92073d01 Michael Niedermayer
        put_bits(pb2, 1, s->ac_pred);
1201 d6231b9e Michael Niedermayer
        cbpy = cbp >> 2;
1202 92073d01 Michael Niedermayer
        put_bits(pb2, cbpy_tab[cbpy][1], cbpy_tab[cbpy][0]);
1203 c5d309f2 Michael Niedermayer
        if(s->dquant)
1204
            put_bits(dc_pb, 2, dquant_code[s->dquant+2]);
1205 d6231b9e Michael Niedermayer
1206 fcb48651 Michael Niedermayer
        if(!s->progressive_sequence){
1207
            put_bits(dc_pb, 1, s->interlaced_dct);
1208
        }
1209
1210 92073d01 Michael Niedermayer
        if(interleaved_stats){
1211 4d2a4834 Michael Niedermayer
            s->misc_bits+= get_bits_diff(s);
1212 92073d01 Michael Niedermayer
        }
1213 098eefe1 Michael Niedermayer
1214 1b781f82 Michael Niedermayer
        mpeg4_encode_blocks(s, block, dc_diff, scan_table, dc_pb, tex_pb);
1215 d6231b9e Michael Niedermayer
1216 92073d01 Michael Niedermayer
        if(interleaved_stats){
1217 4d2a4834 Michael Niedermayer
            s->i_tex_bits+= get_bits_diff(s);
1218 92073d01 Michael Niedermayer
        }
1219 098eefe1 Michael Niedermayer
        s->i_count++;
1220
1221 d6231b9e Michael Niedermayer
        /* restore ac coeffs & last_index stuff if we messed them up with the prediction */
1222 8d8c0294 Michael Niedermayer
        if(s->ac_pred)
1223
            restore_ac_coeffs(s, block, dir, scan_table, zigzag_last_index);
1224 d6231b9e Michael Niedermayer
    }
1225
}
1226
1227 de6d9b64 Fabrice Bellard
void h263_encode_mb(MpegEncContext * s,
1228 bb270c08 Diego Biurrun
                    DCTELEM block[6][64],
1229
                    int motion_x, int motion_y)
1230 de6d9b64 Fabrice Bellard
{
1231
    int cbpc, cbpy, i, cbp, pred_x, pred_y;
1232 0c1a9eda Zdenek Kabelac
    int16_t pred_dc;
1233
    int16_t rec_intradc[6];
1234
    uint16_t *dc_ptr[6];
1235 d4f5d74a Garrick Meeker
    const int interleaved_stats= (s->flags&CODEC_FLAG_PASS1);
1236 9e4c6948 Michael Niedermayer
    const int dquant_code[5]= {1,0,9,2,3};
1237 115329f1 Diego Biurrun
1238 ef5b1b5a Juanjo
    //printf("**mb x=%d y=%d\n", s->mb_x, s->mb_y);
1239 9dbcbd92 Michael Niedermayer
    if (!s->mb_intra) {
1240 ef5b1b5a Juanjo
        /* compute cbp */
1241 f2f6134b Michael Niedermayer
        cbp= get_p_cbp(s, block, motion_x, motion_y);
1242
1243 8cb5d4c0 Michael Niedermayer
        if ((cbp | motion_x | motion_y | s->dquant | (s->mv_type - MV_TYPE_16X16)) == 0) {
1244 9dbcbd92 Michael Niedermayer
            /* skip macroblock */
1245
            put_bits(&s->pb, 1, 1);
1246 d4f5d74a Garrick Meeker
            if(interleaved_stats){
1247
                s->misc_bits++;
1248
                s->last_bits++;
1249
            }
1250 65a24d0b Michael Niedermayer
            s->skip_count++;
1251
1252 9dbcbd92 Michael Niedermayer
            return;
1253
        }
1254 bb270c08 Diego Biurrun
        put_bits(&s->pb, 1, 0);         /* mb coded */
1255 115329f1 Diego Biurrun
1256 9dbcbd92 Michael Niedermayer
        cbpc = cbp & 3;
1257
        cbpy = cbp >> 2;
1258 dba019da Michael Niedermayer
        if(s->alt_inter_vlc==0 || cbpc!=3)
1259
            cbpy ^= 0xF;
1260
        if(s->dquant) cbpc+= 8;
1261 f7190f73 Michael Niedermayer
        if(s->mv_type==MV_TYPE_16X16){
1262
            put_bits(&s->pb,
1263
                    inter_MCBPC_bits[cbpc],
1264
                    inter_MCBPC_code[cbpc]);
1265 9dbcbd92 Michael Niedermayer
1266 f7190f73 Michael Niedermayer
            put_bits(&s->pb, cbpy_tab[cbpy][1], cbpy_tab[cbpy][0]);
1267
            if(s->dquant)
1268
                put_bits(&s->pb, 2, dquant_code[s->dquant+2]);
1269 115329f1 Diego Biurrun
1270 f7190f73 Michael Niedermayer
            if(interleaved_stats){
1271
                s->misc_bits+= get_bits_diff(s);
1272
            }
1273 d4f5d74a Garrick Meeker
1274 f7190f73 Michael Niedermayer
            /* motion vectors: 16x16 mode */
1275 137c8468 Michael Niedermayer
            h263_pred_motion(s, 0, 0, &pred_x, &pred_y);
1276 115329f1 Diego Biurrun
1277
            if (!s->umvplus) {
1278 1b781f82 Michael Niedermayer
                ff_h263_encode_motion_vector(s, motion_x - pred_x,
1279
                                                motion_y - pred_y, 1);
1280 f7190f73 Michael Niedermayer
            }
1281
            else {
1282
                h263p_encode_umotion(s, motion_x - pred_x);
1283
                h263p_encode_umotion(s, motion_y - pred_y);
1284
                if (((motion_x - pred_x) == 1) && ((motion_y - pred_y) == 1))
1285
                    /* To prevent Start Code emulation */
1286
                    put_bits(&s->pb,1,1);
1287
            }
1288
        }else{
1289
            put_bits(&s->pb,
1290
                    inter_MCBPC_bits[cbpc+16],
1291
                    inter_MCBPC_code[cbpc+16]);
1292
            put_bits(&s->pb, cbpy_tab[cbpy][1], cbpy_tab[cbpy][0]);
1293
            if(s->dquant)
1294
                put_bits(&s->pb, 2, dquant_code[s->dquant+2]);
1295
1296
            if(interleaved_stats){
1297
                s->misc_bits+= get_bits_diff(s);
1298
            }
1299
1300
            for(i=0; i<4; i++){
1301
                /* motion vectors: 8x8 mode*/
1302 137c8468 Michael Niedermayer
                h263_pred_motion(s, i, 0, &pred_x, &pred_y);
1303 f7190f73 Michael Niedermayer
1304 8d7ec294 Wolfgang Hesseler
                motion_x= s->current_picture.motion_val[0][ s->block_index[i] ][0];
1305
                motion_y= s->current_picture.motion_val[0][ s->block_index[i] ][1];
1306 115329f1 Diego Biurrun
                if (!s->umvplus) {
1307 1b781f82 Michael Niedermayer
                    ff_h263_encode_motion_vector(s, motion_x - pred_x,
1308
                                                    motion_y - pred_y, 1);
1309 f7190f73 Michael Niedermayer
                }
1310
                else {
1311
                    h263p_encode_umotion(s, motion_x - pred_x);
1312
                    h263p_encode_umotion(s, motion_y - pred_y);
1313
                    if (((motion_x - pred_x) == 1) && ((motion_y - pred_y) == 1))
1314
                        /* To prevent Start Code emulation */
1315
                        put_bits(&s->pb,1,1);
1316
                }
1317
            }
1318 9dbcbd92 Michael Niedermayer
        }
1319 d4f5d74a Garrick Meeker
1320
        if(interleaved_stats){
1321
            s->mv_bits+= get_bits_diff(s);
1322
        }
1323 ef5b1b5a Juanjo
    } else {
1324 68b94c35 Michael Niedermayer
        assert(s->mb_intra);
1325 115329f1 Diego Biurrun
1326 ef5b1b5a Juanjo
        cbp = 0;
1327 fb079883 Michael Niedermayer
        if (s->h263_aic) {
1328 ef5b1b5a Juanjo
            /* Predict DC */
1329 fb079883 Michael Niedermayer
            for(i=0; i<6; i++) {
1330 0c1a9eda Zdenek Kabelac
                int16_t level = block[i][0];
1331 fb079883 Michael Niedermayer
                int scale;
1332 115329f1 Diego Biurrun
1333 fb079883 Michael Niedermayer
                if(i<4) scale= s->y_dc_scale;
1334
                else    scale= s->c_dc_scale;
1335
1336 ef5b1b5a Juanjo
                pred_dc = h263_pred_dc(s, i, &dc_ptr[i]);
1337
                level -= pred_dc;
1338
                /* Quant */
1339 fb079883 Michael Niedermayer
                if (level >= 0)
1340
                    level = (level + (scale>>1))/scale;
1341 ef5b1b5a Juanjo
                else
1342 fb079883 Michael Niedermayer
                    level = (level - (scale>>1))/scale;
1343 115329f1 Diego Biurrun
1344 ef5b1b5a Juanjo
                /* AIC can change CBP */
1345
                if (level == 0 && s->block_last_index[i] == 0)
1346
                    s->block_last_index[i] = -1;
1347 fb079883 Michael Niedermayer
1348
                if(!s->modified_quant){
1349
                    if (level < -127)
1350
                        level = -127;
1351
                    else if (level > 127)
1352
                        level = 127;
1353
                }
1354
1355 ef5b1b5a Juanjo
                block[i][0] = level;
1356 115329f1 Diego Biurrun
                /* Reconstruction */
1357 fb079883 Michael Niedermayer
                rec_intradc[i] = scale*level + pred_dc;
1358 ef5b1b5a Juanjo
                /* Oddify */
1359
                rec_intradc[i] |= 1;
1360
                //if ((rec_intradc[i] % 2) == 0)
1361
                //    rec_intradc[i]++;
1362
                /* Clipping */
1363
                if (rec_intradc[i] < 0)
1364
                    rec_intradc[i] = 0;
1365
                else if (rec_intradc[i] > 2047)
1366
                    rec_intradc[i] = 2047;
1367 115329f1 Diego Biurrun
1368 ef5b1b5a Juanjo
                /* Update AC/DC tables */
1369
                *dc_ptr[i] = rec_intradc[i];
1370 fb079883 Michael Niedermayer
                if (s->block_last_index[i] >= 0)
1371
                    cbp |= 1 << (5 - i);
1372
            }
1373
        }else{
1374
            for(i=0; i<6; i++) {
1375
                /* compute cbp */
1376
                if (s->block_last_index[i] >= 1)
1377
                    cbp |= 1 << (5 - i);
1378 ef5b1b5a Juanjo
            }
1379
        }
1380 de6d9b64 Fabrice Bellard
1381 ef5b1b5a Juanjo
        cbpc = cbp & 3;
1382
        if (s->pict_type == I_TYPE) {
1383 9e4c6948 Michael Niedermayer
            if(s->dquant) cbpc+=4;
1384 ef5b1b5a Juanjo
            put_bits(&s->pb,
1385
                intra_MCBPC_bits[cbpc],
1386
                intra_MCBPC_code[cbpc]);
1387
        } else {
1388 9e4c6948 Michael Niedermayer
            if(s->dquant) cbpc+=8;
1389 bb270c08 Diego Biurrun
            put_bits(&s->pb, 1, 0);     /* mb coded */
1390 ef5b1b5a Juanjo
            put_bits(&s->pb,
1391
                inter_MCBPC_bits[cbpc + 4],
1392
                inter_MCBPC_code[cbpc + 4]);
1393
        }
1394
        if (s->h263_aic) {
1395
            /* XXX: currently, we do not try to use ac prediction */
1396 bb270c08 Diego Biurrun
            put_bits(&s->pb, 1, 0);     /* no AC prediction */
1397 ef5b1b5a Juanjo
        }
1398
        cbpy = cbp >> 2;
1399
        put_bits(&s->pb, cbpy_tab[cbpy][1], cbpy_tab[cbpy][0]);
1400 9e4c6948 Michael Niedermayer
        if(s->dquant)
1401
            put_bits(&s->pb, 2, dquant_code[s->dquant+2]);
1402 d4f5d74a Garrick Meeker
1403
        if(interleaved_stats){
1404
            s->misc_bits+= get_bits_diff(s);
1405
        }
1406 de6d9b64 Fabrice Bellard
    }
1407
1408 ef5b1b5a Juanjo
    for(i=0; i<6; i++) {
1409
        /* encode each block */
1410 44a2950f Michael Niedermayer
        h263_encode_block(s, block[i], i);
1411 115329f1 Diego Biurrun
1412 ef5b1b5a Juanjo
        /* Update INTRADC for decoding */
1413
        if (s->h263_aic && s->mb_intra) {
1414
            block[i][0] = rec_intradc[i];
1415 115329f1 Diego Biurrun
1416 ef5b1b5a Juanjo
        }
1417
    }
1418 d4f5d74a Garrick Meeker
1419
    if(interleaved_stats){
1420
        if (!s->mb_intra) {
1421
            s->p_tex_bits+= get_bits_diff(s);
1422
            s->f_count++;
1423
        }else{
1424
            s->i_tex_bits+= get_bits_diff(s);
1425
            s->i_count++;
1426
        }
1427
    }
1428 ef5b1b5a Juanjo
}
1429 bbed9259 Michael Niedermayer
#endif
1430 ef5b1b5a Juanjo
1431 cdb4e730 Michael Niedermayer
void ff_h263_loop_filter(MpegEncContext * s){
1432 332f9ac4 Michael Niedermayer
    int qp_c;
1433
    const int linesize  = s->linesize;
1434
    const int uvlinesize= s->uvlinesize;
1435
    const int xy = s->mb_y * s->mb_stride + s->mb_x;
1436
    uint8_t *dest_y = s->dest[0];
1437
    uint8_t *dest_cb= s->dest[1];
1438
    uint8_t *dest_cr= s->dest[2];
1439 115329f1 Diego Biurrun
1440 332f9ac4 Michael Niedermayer
//    if(s->pict_type==B_TYPE && !s->readable) return;
1441
1442
    /*
1443
       Diag Top
1444
       Left Center
1445
    */
1446
    if(!IS_SKIP(s->current_picture.mb_type[xy])){
1447
        qp_c= s->qscale;
1448
        s->dsp.h263_v_loop_filter(dest_y+8*linesize  , linesize, qp_c);
1449
        s->dsp.h263_v_loop_filter(dest_y+8*linesize+8, linesize, qp_c);
1450
    }else
1451
        qp_c= 0;
1452
1453
    if(s->mb_y){
1454
        int qp_dt, qp_t, qp_tc;
1455
1456
        if(IS_SKIP(s->current_picture.mb_type[xy-s->mb_stride]))
1457
            qp_t=0;
1458 115329f1 Diego Biurrun
        else
1459 332f9ac4 Michael Niedermayer
            qp_t= s->current_picture.qscale_table[xy-s->mb_stride];
1460
1461 115329f1 Diego Biurrun
        if(qp_c)
1462 332f9ac4 Michael Niedermayer
            qp_tc= qp_c;
1463
        else
1464
            qp_tc= qp_t;
1465 115329f1 Diego Biurrun
1466 332f9ac4 Michael Niedermayer
        if(qp_tc){
1467
            const int chroma_qp= s->chroma_qscale_table[qp_tc];
1468
            s->dsp.h263_v_loop_filter(dest_y  ,   linesize, qp_tc);
1469
            s->dsp.h263_v_loop_filter(dest_y+8,   linesize, qp_tc);
1470 115329f1 Diego Biurrun
1471 332f9ac4 Michael Niedermayer
            s->dsp.h263_v_loop_filter(dest_cb , uvlinesize, chroma_qp);
1472
            s->dsp.h263_v_loop_filter(dest_cr , uvlinesize, chroma_qp);
1473
        }
1474 115329f1 Diego Biurrun
1475 332f9ac4 Michael Niedermayer
        if(qp_t)
1476
            s->dsp.h263_h_loop_filter(dest_y-8*linesize+8  ,   linesize, qp_t);
1477 115329f1 Diego Biurrun
1478 332f9ac4 Michael Niedermayer
        if(s->mb_x){
1479
            if(qp_t || IS_SKIP(s->current_picture.mb_type[xy-1-s->mb_stride]))
1480
                qp_dt= qp_t;
1481
            else
1482
                qp_dt= s->current_picture.qscale_table[xy-1-s->mb_stride];
1483 115329f1 Diego Biurrun
1484 332f9ac4 Michael Niedermayer
            if(qp_dt){
1485
                const int chroma_qp= s->chroma_qscale_table[qp_dt];
1486
                s->dsp.h263_h_loop_filter(dest_y -8*linesize  ,   linesize, qp_dt);
1487
                s->dsp.h263_h_loop_filter(dest_cb-8*uvlinesize, uvlinesize, chroma_qp);
1488 b1114f18 Michael Niedermayer
                s->dsp.h263_h_loop_filter(dest_cr-8*uvlinesize, uvlinesize, chroma_qp);
1489 332f9ac4 Michael Niedermayer
            }
1490
        }
1491
    }
1492
1493
    if(qp_c){
1494
        s->dsp.h263_h_loop_filter(dest_y +8,   linesize, qp_c);
1495
        if(s->mb_y + 1 == s->mb_height)
1496
            s->dsp.h263_h_loop_filter(dest_y+8*linesize+8,   linesize, qp_c);
1497
    }
1498 115329f1 Diego Biurrun
1499 332f9ac4 Michael Niedermayer
    if(s->mb_x){
1500
        int qp_lc;
1501
        if(qp_c || IS_SKIP(s->current_picture.mb_type[xy-1]))
1502
            qp_lc= qp_c;
1503
        else
1504
            qp_lc= s->current_picture.qscale_table[xy-1];
1505 115329f1 Diego Biurrun
1506 332f9ac4 Michael Niedermayer
        if(qp_lc){
1507
            s->dsp.h263_h_loop_filter(dest_y,   linesize, qp_lc);
1508
            if(s->mb_y + 1 == s->mb_height){
1509
                const int chroma_qp= s->chroma_qscale_table[qp_lc];
1510
                s->dsp.h263_h_loop_filter(dest_y +8*  linesize,   linesize, qp_lc);
1511
                s->dsp.h263_h_loop_filter(dest_cb             , uvlinesize, chroma_qp);
1512
                s->dsp.h263_h_loop_filter(dest_cr             , uvlinesize, chroma_qp);
1513
            }
1514
        }
1515
    }
1516
}
1517
1518 0c1a9eda Zdenek Kabelac
static int h263_pred_dc(MpegEncContext * s, int n, uint16_t **dc_val_ptr)
1519 ef5b1b5a Juanjo
{
1520
    int x, y, wrap, a, c, pred_dc, scale;
1521 f7287c42 Michael Niedermayer
    int16_t *dc_val;
1522 ef5b1b5a Juanjo
1523
    /* find prediction */
1524
    if (n < 4) {
1525 137c8468 Michael Niedermayer
        x = 2 * s->mb_x + (n & 1);
1526
        y = 2 * s->mb_y + ((n & 2) >> 1);
1527
        wrap = s->b8_stride;
1528 ef5b1b5a Juanjo
        dc_val = s->dc_val[0];
1529
        scale = s->y_dc_scale;
1530
    } else {
1531 137c8468 Michael Niedermayer
        x = s->mb_x;
1532
        y = s->mb_y;
1533
        wrap = s->mb_stride;
1534 ef5b1b5a Juanjo
        dc_val = s->dc_val[n - 4 + 1];
1535
        scale = s->c_dc_scale;
1536 de6d9b64 Fabrice Bellard
    }
1537 ef5b1b5a Juanjo
    /* B C
1538 115329f1 Diego Biurrun
     * A X
1539 ef5b1b5a Juanjo
     */
1540
    a = dc_val[(x - 1) + (y) * wrap];
1541
    c = dc_val[(x) + (y - 1) * wrap];
1542 115329f1 Diego Biurrun
1543 ef5b1b5a Juanjo
    /* No prediction outside GOB boundary */
1544 204b5c9e Michael Niedermayer
    if(s->first_slice_line && n!=3){
1545
        if(n!=2) c= 1024;
1546
        if(n!=1 && s->mb_x == s->resync_mb_x) a= 1024;
1547
    }
1548 ef5b1b5a Juanjo
    pred_dc = 1024;
1549
    /* just DC prediction */
1550
    if (a != 1024 && c != 1024)
1551
        pred_dc = (a + c) >> 1;
1552
    else if (a != 1024)
1553
        pred_dc = a;
1554
    else
1555
        pred_dc = c;
1556 115329f1 Diego Biurrun
1557 ef5b1b5a Juanjo
    /* we assume pred is positive */
1558
    //pred_dc = (pred_dc + (scale >> 1)) / scale;
1559
    *dc_val_ptr = &dc_val[x + y * wrap];
1560
    return pred_dc;
1561 de6d9b64 Fabrice Bellard
}
1562
1563 5c91a675 Zdenek Kabelac
static void h263_pred_acdc(MpegEncContext * s, DCTELEM *block, int n)
1564 d140623f Juanjo
{
1565 9e15ad28 Juanjo
    int x, y, wrap, a, c, pred_dc, scale, i;
1566 0c1a9eda Zdenek Kabelac
    int16_t *dc_val, *ac_val, *ac_val1;
1567 d140623f Juanjo
1568
    /* find prediction */
1569
    if (n < 4) {
1570 137c8468 Michael Niedermayer
        x = 2 * s->mb_x + (n & 1);
1571
        y = 2 * s->mb_y + (n>> 1);
1572
        wrap = s->b8_stride;
1573 d140623f Juanjo
        dc_val = s->dc_val[0];
1574 9e15ad28 Juanjo
        ac_val = s->ac_val[0][0];
1575 d140623f Juanjo
        scale = s->y_dc_scale;
1576
    } else {
1577 137c8468 Michael Niedermayer
        x = s->mb_x;
1578
        y = s->mb_y;
1579
        wrap = s->mb_stride;
1580 d140623f Juanjo
        dc_val = s->dc_val[n - 4 + 1];
1581 9e15ad28 Juanjo
        ac_val = s->ac_val[n - 4 + 1][0];
1582 d140623f Juanjo
        scale = s->c_dc_scale;
1583
    }
1584 115329f1 Diego Biurrun
1585 9e15ad28 Juanjo
    ac_val += ((y) * wrap + (x)) * 16;
1586
    ac_val1 = ac_val;
1587 115329f1 Diego Biurrun
1588 d140623f Juanjo
    /* B C
1589 115329f1 Diego Biurrun
     * A X
1590 d140623f Juanjo
     */
1591
    a = dc_val[(x - 1) + (y) * wrap];
1592
    c = dc_val[(x) + (y - 1) * wrap];
1593 115329f1 Diego Biurrun
1594 ef5b1b5a Juanjo
    /* No prediction outside GOB boundary */
1595 68b94c35 Michael Niedermayer
    if(s->first_slice_line && n!=3){
1596
        if(n!=2) c= 1024;
1597
        if(n!=1 && s->mb_x == s->resync_mb_x) a= 1024;
1598
    }
1599 115329f1 Diego Biurrun
1600 d140623f Juanjo
    if (s->ac_pred) {
1601 68b94c35 Michael Niedermayer
        pred_dc = 1024;
1602 d140623f Juanjo
        if (s->h263_aic_dir) {
1603
            /* left prediction */
1604 9e15ad28 Juanjo
            if (a != 1024) {
1605
                ac_val -= 16;
1606
                for(i=1;i<8;i++) {
1607 b0368839 Michael Niedermayer
                    block[s->dsp.idct_permutation[i<<3]] += ac_val[i];
1608 9e15ad28 Juanjo
                }
1609
                pred_dc = a;
1610 d140623f Juanjo
            }
1611
        } else {
1612
            /* top prediction */
1613 9e15ad28 Juanjo
            if (c != 1024) {
1614
                ac_val -= 16 * wrap;
1615
                for(i=1;i<8;i++) {
1616 b0368839 Michael Niedermayer
                    block[s->dsp.idct_permutation[i   ]] += ac_val[i + 8];
1617 9e15ad28 Juanjo
                }
1618
                pred_dc = c;
1619 d140623f Juanjo
            }
1620
        }
1621 9e15ad28 Juanjo
    } else {
1622
        /* just DC prediction */
1623
        if (a != 1024 && c != 1024)
1624
            pred_dc = (a + c) >> 1;
1625
        else if (a != 1024)
1626
            pred_dc = a;
1627
        else
1628
            pred_dc = c;
1629 d140623f Juanjo
    }
1630 115329f1 Diego Biurrun
1631 9e15ad28 Juanjo
    /* we assume pred is positive */
1632
    block[0]=block[0]*scale + pred_dc;
1633 115329f1 Diego Biurrun
1634 9e15ad28 Juanjo
    if (block[0] < 0)
1635
        block[0] = 0;
1636 115329f1 Diego Biurrun
    else
1637 68b94c35 Michael Niedermayer
        block[0] |= 1;
1638 115329f1 Diego Biurrun
1639 9e15ad28 Juanjo
    /* Update AC/DC tables */
1640
    dc_val[(x) + (y) * wrap] = block[0];
1641 115329f1 Diego Biurrun
1642 d140623f Juanjo
    /* left copy */
1643
    for(i=1;i<8;i++)
1644 b0368839 Michael Niedermayer
        ac_val1[i    ] = block[s->dsp.idct_permutation[i<<3]];
1645 d140623f Juanjo
    /* top copy */
1646
    for(i=1;i<8;i++)
1647 b0368839 Michael Niedermayer
        ac_val1[8 + i] = block[s->dsp.idct_permutation[i   ]];
1648 d140623f Juanjo
}
1649
1650 137c8468 Michael Niedermayer
int16_t *h263_pred_motion(MpegEncContext * s, int block, int dir,
1651 de6d9b64 Fabrice Bellard
                        int *px, int *py)
1652
{
1653 137c8468 Michael Niedermayer
    int wrap;
1654 b40cd4e0 Michael Niedermayer
    int16_t *A, *B, *C, (*mot_val)[2];
1655
    static const int off[4]= {2, 1, 1, -1};
1656
1657
    wrap = s->b8_stride;
1658 137c8468 Michael Niedermayer
    mot_val = s->current_picture.motion_val[dir] + s->block_index[block];
1659 b40cd4e0 Michael Niedermayer
1660
    A = mot_val[ - 1];
1661
    /* special case for first (slice) line */
1662
    if (s->first_slice_line && block<3) {
1663 893bc624 Kevin Baragona
        // we can't just change some MVs to simulate that as we need them for the B frames (and ME)
1664 b40cd4e0 Michael Niedermayer
        // and if we ever support non rectangular objects than we need to do a few ifs here anyway :(
1665
        if(block==0){ //most common case
1666
            if(s->mb_x  == s->resync_mb_x){ //rare
1667
                *px= *py = 0;
1668
            }else if(s->mb_x + 1 == s->resync_mb_x && s->h263_pred){ //rare
1669
                C = mot_val[off[block] - wrap];
1670
                if(s->mb_x==0){
1671
                    *px = C[0];
1672
                    *py = C[1];
1673
                }else{
1674
                    *px = mid_pred(A[0], 0, C[0]);
1675
                    *py = mid_pred(A[1], 0, C[1]);
1676
                }
1677
            }else{
1678
                *px = A[0];
1679
                *py = A[1];
1680
            }
1681
        }else if(block==1){
1682
            if(s->mb_x + 1 == s->resync_mb_x && s->h263_pred){ //rare
1683
                C = mot_val[off[block] - wrap];
1684
                *px = mid_pred(A[0], 0, C[0]);
1685
                *py = mid_pred(A[1], 0, C[1]);
1686
            }else{
1687
                *px = A[0];
1688
                *py = A[1];
1689
            }
1690
        }else{ /* block==2*/
1691
            B = mot_val[ - wrap];
1692
            C = mot_val[off[block] - wrap];
1693
            if(s->mb_x == s->resync_mb_x) //rare
1694
                A[0]=A[1]=0;
1695 115329f1 Diego Biurrun
1696 b40cd4e0 Michael Niedermayer
            *px = mid_pred(A[0], B[0], C[0]);
1697
            *py = mid_pred(A[1], B[1], C[1]);
1698
        }
1699
    } else {
1700
        B = mot_val[ - wrap];
1701
        C = mot_val[off[block] - wrap];
1702
        *px = mid_pred(A[0], B[0], C[0]);
1703
        *py = mid_pred(A[1], B[1], C[1]);
1704
    }
1705
    return *mot_val;
1706
}
1707
1708 bbed9259 Michael Niedermayer
#ifdef CONFIG_ENCODERS
1709 5e13a730 Michael Niedermayer
void ff_h263_encode_motion(MpegEncContext * s, int val, int f_code)
1710 de6d9b64 Fabrice Bellard
{
1711 a9c68306 Michael Niedermayer
    int range, l, bit_size, sign, code, bits;
1712 de6d9b64 Fabrice Bellard
1713
    if (val == 0) {
1714
        /* zero vector */
1715
        code = 0;
1716
        put_bits(&s->pb, mvtab[code][1], mvtab[code][0]);
1717
    } else {
1718 9dbcbd92 Michael Niedermayer
        bit_size = f_code - 1;
1719 de6d9b64 Fabrice Bellard
        range = 1 << bit_size;
1720
        /* modulo encoding */
1721 0ff93477 Michael Niedermayer
        l= INT_BIT - 6 - bit_size;
1722
        val = (val<<l)>>l;
1723 a9c68306 Michael Niedermayer
        sign = val>>31;
1724
        val= (val^sign)-sign;
1725
        sign&=1;
1726 de6d9b64 Fabrice Bellard
1727 3bf43d42 Michael Niedermayer
        val--;
1728
        code = (val >> bit_size) + 1;
1729
        bits = val & (range - 1);
1730 de6d9b64 Fabrice Bellard
1731 115329f1 Diego Biurrun
        put_bits(&s->pb, mvtab[code][1] + 1, (mvtab[code][0] << 1) | sign);
1732 de6d9b64 Fabrice Bellard
        if (bit_size > 0) {
1733
            put_bits(&s->pb, bit_size, bits);
1734
        }
1735
    }
1736
}
1737
1738 6dbd39fe Juanjo
/* Encode MV differences on H.263+ with Unrestricted MV mode */
1739
static void h263p_encode_umotion(MpegEncContext * s, int val)
1740
{
1741 115329f1 Diego Biurrun
    short sval = 0;
1742 6dbd39fe Juanjo
    short i = 0;
1743
    short n_bits = 0;
1744
    short temp_val;
1745
    int code = 0;
1746
    int tcode;
1747 115329f1 Diego Biurrun
1748 6dbd39fe Juanjo
    if ( val == 0)
1749
        put_bits(&s->pb, 1, 1);
1750
    else if (val == 1)
1751
        put_bits(&s->pb, 3, 0);
1752
    else if (val == -1)
1753
        put_bits(&s->pb, 3, 2);
1754
    else {
1755 115329f1 Diego Biurrun
1756 6dbd39fe Juanjo
        sval = ((val < 0) ? (short)(-val):(short)val);
1757
        temp_val = sval;
1758 115329f1 Diego Biurrun
1759 6dbd39fe Juanjo
        while (temp_val != 0) {
1760
            temp_val = temp_val >> 1;
1761
            n_bits++;
1762
        }
1763 115329f1 Diego Biurrun
1764 6dbd39fe Juanjo
        i = n_bits - 1;
1765
        while (i > 0) {
1766
            tcode = (sval & (1 << (i-1))) >> (i-1);
1767
            tcode = (tcode << 1) | 1;
1768
            code = (code << 2) | tcode;
1769
            i--;
1770
        }
1771
        code = ((code << 1) | (val < 0)) << 1;
1772
        put_bits(&s->pb, (2*n_bits)+1, code);
1773
        //printf("\nVal = %d\tCode = %d", sval, code);
1774
    }
1775
}
1776
1777 45870f57 Michael Niedermayer
static void init_mv_penalty_and_fcode(MpegEncContext *s)
1778
{
1779
    int f_code;
1780
    int mv;
1781 115329f1 Diego Biurrun
1782 bbed9259 Michael Niedermayer
    if(mv_penalty==NULL)
1783 30952237 Michael Niedermayer
        mv_penalty= av_mallocz( sizeof(uint8_t)*(MAX_FCODE+1)*(2*MAX_MV+1) );
1784 115329f1 Diego Biurrun
1785 45870f57 Michael Niedermayer
    for(f_code=1; f_code<=MAX_FCODE; f_code++){
1786
        for(mv=-MAX_MV; mv<=MAX_MV; mv++){
1787
            int len;
1788
1789
            if(mv==0) len= mvtab[0][1];
1790
            else{
1791
                int val, bit_size, range, code;
1792
1793 7813d6a3 Michael Niedermayer
                bit_size = f_code - 1;
1794 45870f57 Michael Niedermayer
                range = 1 << bit_size;
1795
1796
                val=mv;
1797 115329f1 Diego Biurrun
                if (val < 0)
1798 45870f57 Michael Niedermayer
                    val = -val;
1799
                val--;
1800
                code = (val >> bit_size) + 1;
1801
                if(code<33){
1802
                    len= mvtab[code][1] + 1 + bit_size;
1803
                }else{
1804 b7c51ebc Michael Niedermayer
                    len= mvtab[32][1] + av_log2(code>>5) + 2 + bit_size;
1805 45870f57 Michael Niedermayer
                }
1806
            }
1807
1808
            mv_penalty[f_code][mv+MAX_MV]= len;
1809
        }
1810
    }
1811
1812
    for(f_code=MAX_FCODE; f_code>0; f_code--){
1813
        for(mv=-(16<<f_code); mv<(16<<f_code); mv++){
1814
            fcode_tab[mv+MAX_MV]= f_code;
1815
        }
1816
    }
1817 9d2a0355 Michael Niedermayer
1818
    for(mv=0; mv<MAX_MV*2+1; mv++){
1819
        umv_fcode_tab[mv]= 1;
1820
    }
1821 45870f57 Michael Niedermayer
}
1822 bbed9259 Michael Niedermayer
#endif
1823 45870f57 Michael Niedermayer
1824 7604246d Wolfgang Hesseler
#ifdef CONFIG_ENCODERS
1825
1826 20695ec9 Falk H├╝ffner
static void init_uni_dc_tab(void)
1827 2a164b25 Michael Niedermayer
{
1828
    int level, uni_code, uni_len;
1829
1830 3bf43d42 Michael Niedermayer
    for(level=-256; level<256; level++){
1831 2a164b25 Michael Niedermayer
        int size, v, l;
1832
        /* find number of bits */
1833
        size = 0;
1834
        v = abs(level);
1835
        while (v) {
1836
            v >>= 1;
1837 bb270c08 Diego Biurrun
            size++;
1838 2a164b25 Michael Niedermayer
        }
1839
1840
        if (level < 0)
1841
            l= (-level) ^ ((1 << size) - 1);
1842
        else
1843
            l= level;
1844
1845
        /* luminance */
1846
        uni_code= DCtab_lum[size][0];
1847
        uni_len = DCtab_lum[size][1];
1848
1849
        if (size > 0) {
1850
            uni_code<<=size; uni_code|=l;
1851
            uni_len+=size;
1852
            if (size > 8){
1853
                uni_code<<=1; uni_code|=1;
1854
                uni_len++;
1855
            }
1856
        }
1857 67725183 Michael Niedermayer
        uni_DCtab_lum_bits[level+256]= uni_code;
1858
        uni_DCtab_lum_len [level+256]= uni_len;
1859 2a164b25 Michael Niedermayer
1860
        /* chrominance */
1861
        uni_code= DCtab_chrom[size][0];
1862
        uni_len = DCtab_chrom[size][1];
1863 115329f1 Diego Biurrun
1864 2a164b25 Michael Niedermayer
        if (size > 0) {
1865
            uni_code<<=size; uni_code|=l;
1866
            uni_len+=size;
1867
            if (size > 8){
1868
                uni_code<<=1; uni_code|=1;
1869
                uni_len++;
1870
            }
1871
        }
1872 67725183 Michael Niedermayer
        uni_DCtab_chrom_bits[level+256]= uni_code;
1873
        uni_DCtab_chrom_len [level+256]= uni_len;
1874 2a164b25 Michael Niedermayer
1875
    }
1876
}
1877
1878 7604246d Wolfgang Hesseler
#endif //CONFIG_ENCODERS
1879
1880 bbed9259 Michael Niedermayer
#ifdef CONFIG_ENCODERS
1881 0c1a9eda Zdenek Kabelac
static void init_uni_mpeg4_rl_tab(RLTable *rl, uint32_t *bits_tab, uint8_t *len_tab){
1882 3db48188 Michael Niedermayer
    int slevel, run, last;
1883 115329f1 Diego Biurrun
1884 3db48188 Michael Niedermayer
    assert(MAX_LEVEL >= 64);
1885
    assert(MAX_RUN   >= 63);
1886
1887
    for(slevel=-64; slevel<64; slevel++){
1888
        if(slevel==0) continue;
1889
        for(run=0; run<64; run++){
1890
            for(last=0; last<=1; last++){
1891
                const int index= UNI_MPEG4_ENC_INDEX(last, run, slevel+64);
1892
                int level= slevel < 0 ? -slevel : slevel;
1893
                int sign= slevel < 0 ? 1 : 0;
1894
                int bits, len, code;
1895
                int level1, run1;
1896 115329f1 Diego Biurrun
1897 3db48188 Michael Niedermayer
                len_tab[index]= 100;
1898 115329f1 Diego Biurrun
1899 3db48188 Michael Niedermayer
                /* ESC0 */
1900
                code= get_rl_index(rl, last, run, level);
1901
                bits= rl->table_vlc[code][0];
1902
                len=  rl->table_vlc[code][1];
1903
                bits=bits*2+sign; len++;
1904 115329f1 Diego Biurrun
1905 3db48188 Michael Niedermayer
                if(code!=rl->n && len < len_tab[index]){
1906
                    bits_tab[index]= bits;
1907
                    len_tab [index]= len;
1908
                }
1909
#if 1
1910
                /* ESC1 */
1911
                bits= rl->table_vlc[rl->n][0];
1912
                len=  rl->table_vlc[rl->n][1];
1913
                bits=bits*2;    len++; //esc1
1914
                level1= level - rl->max_level[last][run];
1915
                if(level1>0){
1916
                    code= get_rl_index(rl, last, run, level1);
1917
                    bits<<= rl->table_vlc[code][1];
1918
                    len  += rl->table_vlc[code][1];
1919
                    bits += rl->table_vlc[code][0];
1920
                    bits=bits*2+sign; len++;
1921 115329f1 Diego Biurrun
1922 3db48188 Michael Niedermayer
                    if(code!=rl->n && len < len_tab[index]){
1923
                        bits_tab[index]= bits;
1924
                        len_tab [index]= len;
1925
                    }
1926
                }
1927 115329f1 Diego Biurrun
#endif
1928 3db48188 Michael Niedermayer
#if 1
1929
                /* ESC2 */
1930
                bits= rl->table_vlc[rl->n][0];
1931
                len=  rl->table_vlc[rl->n][1];
1932
                bits=bits*4+2;    len+=2; //esc2
1933
                run1 = run - rl->max_run[last][level] - 1;
1934
                if(run1>=0){
1935
                    code= get_rl_index(rl, last, run1, level);
1936
                    bits<<= rl->table_vlc[code][1];
1937
                    len  += rl->table_vlc[code][1];
1938
                    bits += rl->table_vlc[code][0];
1939
                    bits=bits*2+sign; len++;
1940 115329f1 Diego Biurrun
1941 3db48188 Michael Niedermayer
                    if(code!=rl->n && len < len_tab[index]){
1942
                        bits_tab[index]= bits;
1943
                        len_tab [index]= len;
1944
                    }
1945
                }
1946 115329f1 Diego Biurrun
#endif
1947
                /* ESC3 */
1948 3db48188 Michael Niedermayer
                bits= rl->table_vlc[rl->n][0];
1949
                len = rl->table_vlc[rl->n][1];
1950
                bits=bits*4+3;    len+=2; //esc3
1951
                bits=bits*2+last; len++;
1952
                bits=bits*64+run; len+=6;
1953
                bits=bits*2+1;    len++;  //marker
1954
                bits=bits*4096+(slevel&0xfff); len+=12;
1955
                bits=bits*2+1;    len++;  //marker
1956 115329f1 Diego Biurrun
1957 3db48188 Michael Niedermayer
                if(len < len_tab[index]){
1958
                    bits_tab[index]= bits;
1959
                    len_tab [index]= len;
1960
                }
1961
            }
1962
        }
1963
    }
1964
}
1965
1966 15c5fa7b Michael Niedermayer
static void init_uni_h263_rl_tab(RLTable *rl, uint32_t *bits_tab, uint8_t *len_tab){
1967
    int slevel, run, last;
1968 115329f1 Diego Biurrun
1969 15c5fa7b Michael Niedermayer
    assert(MAX_LEVEL >= 64);
1970
    assert(MAX_RUN   >= 63);
1971
1972
    for(slevel=-64; slevel<64; slevel++){
1973
        if(slevel==0) continue;
1974
        for(run=0; run<64; run++){
1975
            for(last=0; last<=1; last++){
1976
                const int index= UNI_MPEG4_ENC_INDEX(last, run, slevel+64);
1977
                int level= slevel < 0 ? -slevel : slevel;
1978
                int sign= slevel < 0 ? 1 : 0;
1979
                int bits, len, code;
1980 115329f1 Diego Biurrun
1981 15c5fa7b Michael Niedermayer
                len_tab[index]= 100;
1982 115329f1 Diego Biurrun
1983 15c5fa7b Michael Niedermayer
                /* ESC0 */
1984
                code= get_rl_index(rl, last, run, level);
1985
                bits= rl->table_vlc[code][0];
1986
                len=  rl->table_vlc[code][1];
1987
                bits=bits*2+sign; len++;
1988 115329f1 Diego Biurrun
1989 15c5fa7b Michael Niedermayer
                if(code!=rl->n && len < len_tab[index]){
1990
                    if(bits_tab) bits_tab[index]= bits;
1991
                    len_tab [index]= len;
1992
                }
1993
                /* ESC */
1994
                bits= rl->table_vlc[rl->n][0];
1995
                len = rl->table_vlc[rl->n][1];
1996
                bits=bits*2+last; len++;
1997
                bits=bits*64+run; len+=6;
1998
                bits=bits*256+(level&0xff); len+=8;
1999 115329f1 Diego Biurrun
2000 15c5fa7b Michael Niedermayer
                if(len < len_tab[index]){
2001
                    if(bits_tab) bits_tab[index]= bits;
2002
                    len_tab [index]= len;
2003
                }
2004
            }
2005
        }
2006
    }
2007
}
2008
2009 45870f57 Michael Niedermayer
void h263_encode_init(MpegEncContext *s)
2010 de6d9b64 Fabrice Bellard
{
2011
    static int done = 0;
2012
2013
    if (!done) {
2014
        done = 1;
2015 2a164b25 Michael Niedermayer
2016
        init_uni_dc_tab();
2017
2018 073c2593 Burkhard Plaum
        init_rl(&rl_inter, 1);
2019
        init_rl(&rl_intra, 1);
2020
        init_rl(&rl_intra_aic, 1);
2021 115329f1 Diego Biurrun
2022 3db48188 Michael Niedermayer
        init_uni_mpeg4_rl_tab(&rl_intra, uni_mpeg4_intra_rl_bits, uni_mpeg4_intra_rl_len);
2023
        init_uni_mpeg4_rl_tab(&rl_inter, uni_mpeg4_inter_rl_bits, uni_mpeg4_inter_rl_len);
2024 45870f57 Michael Niedermayer
2025 15c5fa7b Michael Niedermayer
        init_uni_h263_rl_tab(&rl_intra_aic, NULL, uni_h263_intra_aic_rl_len);
2026
        init_uni_h263_rl_tab(&rl_inter    , NULL, uni_h263_inter_rl_len);
2027
2028 45870f57 Michael Niedermayer
        init_mv_penalty_and_fcode(s);
2029 de6d9b64 Fabrice Bellard
    }
2030 1457ab52 Michael Niedermayer
    s->me.mv_penalty= mv_penalty; //FIXME exact table for msmpeg4 & h263p
2031 115329f1 Diego Biurrun
2032 15c5fa7b Michael Niedermayer
    s->intra_ac_vlc_length     =s->inter_ac_vlc_length     = uni_h263_inter_rl_len;
2033
    s->intra_ac_vlc_last_length=s->inter_ac_vlc_last_length= uni_h263_inter_rl_len + 128*64;
2034
    if(s->h263_aic){
2035
        s->intra_ac_vlc_length     = uni_h263_intra_aic_rl_len;
2036
        s->intra_ac_vlc_last_length= uni_h263_intra_aic_rl_len + 128*64;
2037
    }
2038
    s->ac_esc_length= 7+1+6+8;
2039
2040 9d2a0355 Michael Niedermayer
    // use fcodes >1 only for mpeg4 & h263 & h263p FIXME
2041 d7e9533a Michael Niedermayer
    switch(s->codec_id){
2042
    case CODEC_ID_MPEG4:
2043
        s->fcode_tab= fcode_tab;
2044
        s->min_qcoeff= -2048;
2045
        s->max_qcoeff=  2047;
2046 477ab036 Michael Niedermayer
        s->intra_ac_vlc_length     = uni_mpeg4_intra_rl_len;
2047
        s->intra_ac_vlc_last_length= uni_mpeg4_intra_rl_len + 128*64;
2048
        s->inter_ac_vlc_length     = uni_mpeg4_inter_rl_len;
2049
        s->inter_ac_vlc_last_length= uni_mpeg4_inter_rl_len + 128*64;
2050 67725183 Michael Niedermayer
        s->luma_dc_vlc_length= uni_DCtab_lum_len;
2051
        s->chroma_dc_vlc_length= uni_DCtab_chrom_len;
2052 477ab036 Michael Niedermayer
        s->ac_esc_length= 7+2+1+6+1+12+1;
2053 9c3d33d6 Michael Niedermayer
        s->y_dc_scale_table= ff_mpeg4_y_dc_scale_table;
2054
        s->c_dc_scale_table= ff_mpeg4_c_dc_scale_table;
2055
2056 22ddd60b Michael Niedermayer
        if(s->flags & CODEC_FLAG_GLOBAL_HEADER){
2057 8b76418a Michael Niedermayer
2058 22ddd60b Michael Niedermayer
            s->avctx->extradata= av_malloc(1024);
2059 ed7debda Alex Beregszaszi
            init_put_bits(&s->pb, s->avctx->extradata, 1024);
2060 115329f1 Diego Biurrun
2061 59fa3f96 Michael Niedermayer
            if(!(s->workaround_bugs & FF_BUG_MS))
2062
                mpeg4_encode_visual_object_header(s);
2063 22ddd60b Michael Niedermayer
            mpeg4_encode_vol_header(s, 0, 0);
2064
2065
//            ff_mpeg4_stuffing(&s->pb); ?
2066
            flush_put_bits(&s->pb);
2067 fe455f33 Alex Beregszaszi
            s->avctx->extradata_size= (put_bits_count(&s->pb)+7)>>3;
2068 22ddd60b Michael Niedermayer
        }
2069 115329f1 Diego Biurrun
2070 d7e9533a Michael Niedermayer
        break;
2071
    case CODEC_ID_H263P:
2072 fb079883 Michael Niedermayer
        if(s->umvplus)
2073
            s->fcode_tab= umv_fcode_tab;
2074
        if(s->modified_quant){
2075
            s->min_qcoeff= -2047;
2076
            s->max_qcoeff=  2047;
2077
        }else{
2078
            s->min_qcoeff= -127;
2079
            s->max_qcoeff=  127;
2080
        }
2081 d7e9533a Michael Niedermayer
        break;
2082 115329f1 Diego Biurrun
        //Note for mpeg4 & h263 the dc-scale table will be set per frame as needed later
2083 d4f5d74a Garrick Meeker
    case CODEC_ID_FLV1:
2084
        if (s->h263_flv > 1) {
2085
            s->min_qcoeff= -1023;
2086
            s->max_qcoeff=  1023;
2087
        } else {
2088
            s->min_qcoeff= -127;
2089
            s->max_qcoeff=  127;
2090
        }
2091
        s->y_dc_scale_table=
2092
        s->c_dc_scale_table= ff_mpeg1_dc_scale_table;
2093
        break;
2094 893bc624 Kevin Baragona
    default: //nothing needed - default table already set in mpegvideo.c
2095 e51d6d27 Michael Niedermayer
        s->min_qcoeff= -127;
2096 d7e9533a Michael Niedermayer
        s->max_qcoeff=  127;
2097 8f8402e4 Michael Niedermayer
        s->y_dc_scale_table=
2098
        s->c_dc_scale_table= ff_mpeg1_dc_scale_table;
2099 d7e9533a Michael Niedermayer
    }
2100 de6d9b64 Fabrice Bellard
}
2101
2102 2ba8f6b8 Michael Niedermayer
/**
2103
 * encodes a 8x8 block.
2104
 * @param block the 8x8 block
2105
 * @param n block index (0-3 are luma, 4-5 are chroma)
2106
 */
2107 de6d9b64 Fabrice Bellard
static void h263_encode_block(MpegEncContext * s, DCTELEM * block, int n)
2108
{
2109 ef5b1b5a Juanjo
    int level, run, last, i, j, last_index, last_non_zero, sign, slevel, code;
2110
    RLTable *rl;
2111 de6d9b64 Fabrice Bellard
2112 ef5b1b5a Juanjo
    rl = &rl_inter;
2113
    if (s->mb_intra && !s->h263_aic) {
2114 81401c1f Juanjo
        /* DC coef */
2115 e51d6d27 Michael Niedermayer
        level = block[0];
2116 de6d9b64 Fabrice Bellard
        /* 255 cannot be represented, so we clamp */
2117
        if (level > 254) {
2118
            level = 254;
2119
            block[0] = 254;
2120
        }
2121 81401c1f Juanjo
        /* 0 cannot be represented also */
2122 e51d6d27 Michael Niedermayer
        else if (level < 1) {
2123 81401c1f Juanjo
            level = 1;
2124
            block[0] = 1;
2125
        }
2126 17938602 Michael Niedermayer
        if (level == 128) //FIXME check rv10
2127 e51d6d27 Michael Niedermayer
            put_bits(&s->pb, 8, 0xff);
2128
        else
2129 65a24d0b Michael Niedermayer
            put_bits(&s->pb, 8, level);
2130 e51d6d27 Michael Niedermayer
        i = 1;
2131 de6d9b64 Fabrice Bellard
    } else {
2132 e51d6d27 Michael Niedermayer
        i = 0;
2133
        if (s->h263_aic && s->mb_intra)
2134
            rl = &rl_intra_aic;
2135 115329f1 Diego Biurrun
2136 dba019da Michael Niedermayer
        if(s->alt_inter_vlc && !s->mb_intra){
2137
            int aic_vlc_bits=0;
2138
            int inter_vlc_bits=0;
2139
            int wrong_pos=-1;
2140
            int aic_code;
2141 115329f1 Diego Biurrun
2142 dba019da Michael Niedermayer
            last_index = s->block_last_index[n];
2143
            last_non_zero = i - 1;
2144
            for (; i <= last_index; i++) {
2145
                j = s->intra_scantable.permutated[i];
2146
                level = block[j];
2147
                if (level) {
2148
                    run = i - last_non_zero - 1;
2149
                    last = (i == last_index);
2150 115329f1 Diego Biurrun
2151 ecfc44e6 Michael Niedermayer
                    if(level<0) level= -level;
2152 115329f1 Diego Biurrun
2153 dba019da Michael Niedermayer
                    code = get_rl_index(rl, last, run, level);
2154
                    aic_code = get_rl_index(&rl_intra_aic, last, run, level);
2155
                    inter_vlc_bits += rl->table_vlc[code][1]+1;
2156
                    aic_vlc_bits   += rl_intra_aic.table_vlc[aic_code][1]+1;
2157
2158
                    if (code == rl->n) {
2159 ecfc44e6 Michael Niedermayer
                        inter_vlc_bits += 1+6+8-1;
2160 115329f1 Diego Biurrun
                    }
2161 dba019da Michael Niedermayer
                    if (aic_code == rl_intra_aic.n) {
2162 ecfc44e6 Michael Niedermayer
                        aic_vlc_bits += 1+6+8-1;
2163 dba019da Michael Niedermayer
                        wrong_pos += run + 1;
2164
                    }else
2165
                        wrong_pos += wrong_run[aic_code];
2166
                    last_non_zero = i;
2167 115329f1 Diego Biurrun
                }
2168 dba019da Michael Niedermayer
            }
2169
            i = 0;
2170
            if(aic_vlc_bits < inter_vlc_bits && wrong_pos > 63)
2171
                rl = &rl_intra_aic;
2172
        }
2173 de6d9b64 Fabrice Bellard
    }
2174 115329f1 Diego Biurrun
2175 de6d9b64 Fabrice Bellard
    /* AC coefs */
2176
    last_index = s->block_last_index[n];
2177
    last_non_zero = i - 1;
2178
    for (; i <= last_index; i++) {
2179 2ad1516a Michael Niedermayer
        j = s->intra_scantable.permutated[i];
2180 ef5b1b5a Juanjo
        level = block[j];
2181
        if (level) {
2182
            run = i - last_non_zero - 1;
2183
            last = (i == last_index);
2184
            sign = 0;
2185
            slevel = level;
2186
            if (level < 0) {
2187
                sign = 1;
2188
                level = -level;
2189
            }
2190 de6d9b64 Fabrice Bellard
            code = get_rl_index(rl, last, run, level);
2191
            put_bits(&s->pb, rl->table_vlc[code][1], rl->table_vlc[code][0]);
2192
            if (code == rl->n) {
2193 44a2950f Michael Niedermayer
              if(s->h263_flv <= 1){
2194 de6d9b64 Fabrice Bellard
                put_bits(&s->pb, 1, last);
2195
                put_bits(&s->pb, 6, run);
2196 115329f1 Diego Biurrun
2197 e51d6d27 Michael Niedermayer
                assert(slevel != 0);
2198
2199 115329f1 Diego Biurrun
                if(level < 128)
2200 e51d6d27 Michael Niedermayer
                    put_bits(&s->pb, 8, slevel & 0xff);
2201
                else{
2202
                    put_bits(&s->pb, 8, 128);
2203
                    put_bits(&s->pb, 5, slevel & 0x1f);
2204
                    put_bits(&s->pb, 6, (slevel>>5)&0x3f);
2205
                }
2206 44a2950f Michael Niedermayer
              }else{
2207 65a24d0b Michael Niedermayer
                if(level < 64) { // 7-bit level
2208 44a2950f Michael Niedermayer
                        put_bits(&s->pb, 1, 0);
2209
                        put_bits(&s->pb, 1, last);
2210
                        put_bits(&s->pb, 6, run);
2211
2212
                        put_bits(&s->pb, 7, slevel & 0x7f);
2213
                    } else {
2214
                        /* 11-bit level */
2215
                        put_bits(&s->pb, 1, 1);
2216
                        put_bits(&s->pb, 1, last);
2217
                        put_bits(&s->pb, 6, run);
2218
2219
                        put_bits(&s->pb, 11, slevel & 0x7ff);
2220
                    }
2221
              }
2222 d4f5d74a Garrick Meeker
            } else {
2223
                put_bits(&s->pb, 1, sign);
2224
            }
2225
            last_non_zero = i;
2226
        }
2227
    }
2228
}
2229 bbed9259 Michael Niedermayer
#endif
2230 de6d9b64 Fabrice Bellard
2231 7604246d Wolfgang Hesseler
#ifdef CONFIG_ENCODERS
2232
2233 de6d9b64 Fabrice Bellard
/***************************************************/
2234 4d2858de Michael Niedermayer
/**
2235
 * add mpeg4 stuffing bits (01...1)
2236
 */
2237 92073d01 Michael Niedermayer
void ff_mpeg4_stuffing(PutBitContext * pbc)
2238 6f91bcd1 Michael Niedermayer
{
2239
    int length;
2240
    put_bits(pbc, 1, 0);
2241 fe455f33 Alex Beregszaszi
    length= (-put_bits_count(pbc))&7;
2242 92073d01 Michael Niedermayer
    if(length) put_bits(pbc, length, (1<<length)-1);
2243 6f91bcd1 Michael Niedermayer
}
2244
2245 91029be7 Michael Niedermayer
/* must be called before writing the header */
2246
void ff_set_mpeg4_time(MpegEncContext * s, int picture_number){
2247
    int time_div, time_mod;
2248
2249 9740beff Michael Niedermayer
    assert(s->current_picture_ptr->pts != AV_NOPTS_VALUE);
2250 c0df9d75 Michael Niedermayer
    s->time= s->current_picture_ptr->pts*s->avctx->time_base.num;
2251 e51f4948 Michael Niedermayer
2252 c0df9d75 Michael Niedermayer
    time_div= s->time/s->avctx->time_base.den;
2253
    time_mod= s->time%s->avctx->time_base.den;
2254 91029be7 Michael Niedermayer
2255
    if(s->pict_type==B_TYPE){
2256 bea669e5 Michael Niedermayer
        s->pb_time= s->pp_time - (s->last_non_b_time - s->time);
2257 9ebb8e11 Michael Niedermayer
        assert(s->pb_time > 0 && s->pb_time < s->pp_time);
2258 841f65f2 Loren Merritt
        ff_mpeg4_init_direct_mv(s);
2259 91029be7 Michael Niedermayer
    }else{
2260
        s->last_time_base= s->time_base;
2261
        s->time_base= time_div;
2262
        s->pp_time= s->time - s->last_non_b_time;
2263
        s->last_non_b_time= s->time;
2264 1b781f82 Michael Niedermayer
        assert(picture_number==0 || s->pp_time > 0);
2265 91029be7 Michael Niedermayer
    }
2266
}
2267
2268 41773b73 Michael Niedermayer
static void mpeg4_encode_gop_header(MpegEncContext * s){
2269
    int hours, minutes, seconds;
2270 6ff6cff2 Michael Niedermayer
    int64_t time;
2271 115329f1 Diego Biurrun
2272 41773b73 Michael Niedermayer
    put_bits(&s->pb, 16, 0);
2273
    put_bits(&s->pb, 16, GOP_STARTCODE);
2274 115329f1 Diego Biurrun
2275 9740beff Michael Niedermayer
    time= s->current_picture_ptr->pts;
2276
    if(s->reordered_input_picture[1])
2277
        time= FFMIN(time, s->reordered_input_picture[1]->pts);
2278 c0df9d75 Michael Niedermayer
    time= time*s->avctx->time_base.num;
2279 6ff6cff2 Michael Niedermayer
2280 c0df9d75 Michael Niedermayer
    seconds= time/s->avctx->time_base.den;
2281 41773b73 Michael Niedermayer
    minutes= seconds/60; seconds %= 60;
2282
    hours= minutes/60; minutes %= 60;
2283
    hours%=24;
2284
2285
    put_bits(&s->pb, 5, hours);
2286
    put_bits(&s->pb, 6, minutes);
2287
    put_bits(&s->pb, 1, 1);
2288
    put_bits(&s->pb, 6, seconds);
2289 115329f1 Diego Biurrun
2290
    put_bits(&s->pb, 1, !!(s->flags&CODEC_FLAG_CLOSED_GOP));
2291 41773b73 Michael Niedermayer
    put_bits(&s->pb, 1, 0); //broken link == NO
2292 115329f1 Diego Biurrun
2293
    s->last_time_base= time / s->avctx->time_base.den;
2294 41773b73 Michael Niedermayer
2295
    ff_mpeg4_stuffing(&s->pb);
2296
}
2297
2298
static void mpeg4_encode_visual_object_header(MpegEncContext * s){
2299
    int profile_and_level_indication;
2300
    int vo_ver_id;
2301 115329f1 Diego Biurrun
2302 baced9f5 Michael Niedermayer
    if(s->avctx->profile != FF_PROFILE_UNKNOWN){
2303
        profile_and_level_indication = s->avctx->profile << 4;
2304
    }else if(s->max_b_frames || s->quarter_sample){
2305
        profile_and_level_indication= 0xF0; // adv simple
2306
    }else{
2307
        profile_and_level_indication= 0x00; // simple
2308
    }
2309
2310
    if(s->avctx->level != FF_LEVEL_UNKNOWN){
2311
        profile_and_level_indication |= s->avctx->level;
2312
    }else{
2313
        profile_and_level_indication |= 1; //level 1
2314
    }
2315
2316
    if(profile_and_level_indication>>4 == 0xF){
2317 41773b73 Michael Niedermayer
        vo_ver_id= 5;
2318
    }else{
2319
        vo_ver_id= 1;
2320
    }
2321 baced9f5 Michael Niedermayer
2322 41773b73 Michael Niedermayer
    //FIXME levels
2323
2324
    put_bits(&s->pb, 16, 0);
2325
    put_bits(&s->pb, 16, VOS_STARTCODE);
2326 3f6f76af Michael Niedermayer
2327 41773b73 Michael Niedermayer
    put_bits(&s->pb, 8, profile_and_level_indication);
2328 3f6f76af Michael Niedermayer
2329 41773b73 Michael Niedermayer
    put_bits(&s->pb, 16, 0);
2330
    put_bits(&s->pb, 16, VISUAL_OBJ_STARTCODE);
2331 115329f1 Diego Biurrun
2332 41773b73 Michael Niedermayer
    put_bits(&s->pb, 1, 1);
2333
        put_bits(&s->pb, 4, vo_ver_id);
2334
        put_bits(&s->pb, 3, 1); //priority
2335 115329f1 Diego Biurrun
2336 41773b73 Michael Niedermayer
    put_bits(&s->pb, 4, 1); //visual obj type== video obj
2337 115329f1 Diego Biurrun
2338 41773b73 Michael Niedermayer
    put_bits(&s->pb, 1, 0); //video signal type == no clue //FIXME
2339
2340
    ff_mpeg4_stuffing(&s->pb);
2341
}
2342
2343
static void mpeg4_encode_vol_header(MpegEncContext * s, int vo_number, int vol_number)
2344 de6d9b64 Fabrice Bellard
{
2345 41773b73 Michael Niedermayer
    int vo_ver_id;
2346 1ff662cc Michael Niedermayer
2347 41773b73 Michael Niedermayer
    if(s->max_b_frames || s->quarter_sample){
2348
        vo_ver_id= 5;
2349 f8af5cb5 Michael Niedermayer
        s->vo_type= ADV_SIMPLE_VO_TYPE;
2350
    }else{
2351 41773b73 Michael Niedermayer
        vo_ver_id= 1;
2352 f8af5cb5 Michael Niedermayer
        s->vo_type= SIMPLE_VO_TYPE;
2353
    }
2354 1ff662cc Michael Niedermayer
2355 10cd5815 Michael Niedermayer
    put_bits(&s->pb, 16, 0);
2356 41773b73 Michael Niedermayer
    put_bits(&s->pb, 16, 0x100 + vo_number);        /* video obj */
2357 10cd5815 Michael Niedermayer
    put_bits(&s->pb, 16, 0);
2358 41773b73 Michael Niedermayer
    put_bits(&s->pb, 16, 0x120 + vol_number);       /* video obj layer */
2359 10cd5815 Michael Niedermayer
2360 bb270c08 Diego Biurrun
    put_bits(&s->pb, 1, 0);             /* random access vol */
2361
    put_bits(&s->pb, 8, s->vo_type);    /* video obj type indication */
2362 59fa3f96 Michael Niedermayer
    if(s->workaround_bugs & FF_BUG_MS) {
2363 bb270c08 Diego Biurrun
        put_bits(&s->pb, 1, 0);         /* is obj layer id= no */
2364 59fa3f96 Michael Niedermayer
    } else {
2365 bb270c08 Diego Biurrun
        put_bits(&s->pb, 1, 1);         /* is obj layer id= yes */
2366
        put_bits(&s->pb, 4, vo_ver_id); /* is obj layer ver id */
2367
        put_bits(&s->pb, 3, 1);         /* is obj layer priority */
2368 59fa3f96 Michael Niedermayer
    }
2369 115329f1 Diego Biurrun
2370 5ff85f1d Michael Niedermayer
    aspect_to_info(s, s->avctx->sample_aspect_ratio);
2371 5d3cea3a Michael Niedermayer
2372
    put_bits(&s->pb, 4, s->aspect_ratio_info);/* aspect ratio info */
2373 5ff85f1d Michael Niedermayer
    if (s->aspect_ratio_info == FF_ASPECT_EXTENDED){
2374
        put_bits(&s->pb, 8, s->avctx->sample_aspect_ratio.num);
2375
        put_bits(&s->pb, 8, s->avctx->sample_aspect_ratio.den);
2376 050fe8ba Alex Beregszaszi
    }
2377 1ff662cc Michael Niedermayer
2378 59fa3f96 Michael Niedermayer
    if(s->workaround_bugs & FF_BUG_MS) { //
2379 bb270c08 Diego Biurrun
        put_bits(&s->pb, 1, 0);         /* vol control parameters= no @@@ */
2380 59fa3f96 Michael Niedermayer
    } else {
2381 bb270c08 Diego Biurrun
        put_bits(&s->pb, 1, 1);         /* vol control parameters= yes */
2382
        put_bits(&s->pb, 2, 1);         /* chroma format YUV 420/YV12 */
2383 59fa3f96 Michael Niedermayer
        put_bits(&s->pb, 1, s->low_delay);
2384 bb270c08 Diego Biurrun
        put_bits(&s->pb, 1, 0);         /* vbv parameters= no */
2385 59fa3f96 Michael Niedermayer
    }
2386 1ff662cc Michael Niedermayer
2387 bb270c08 Diego Biurrun
    put_bits(&s->pb, 2, RECT_SHAPE);    /* vol shape= rectangle */
2388
    put_bits(&s->pb, 1, 1);             /* marker bit */
2389 115329f1 Diego Biurrun
2390 c0df9d75 Michael Niedermayer
    put_bits(&s->pb, 16, s->avctx->time_base.den);
2391 10cd5815 Michael Niedermayer
    if (s->time_increment_bits < 1)
2392
        s->time_increment_bits = 1;
2393 bb270c08 Diego Biurrun
    put_bits(&s->pb, 1, 1);             /* marker bit */
2394
    put_bits(&s->pb, 1, 0);             /* fixed vop rate=no */
2395
    put_bits(&s->pb, 1, 1);             /* marker bit */
2396
    put_bits(&s->pb, 13, s->width);     /* vol width */
2397
    put_bits(&s->pb, 1, 1);             /* marker bit */
2398
    put_bits(&s->pb, 13, s->height);    /* vol height */
2399
    put_bits(&s->pb, 1, 1);             /* marker bit */
2400 fcb48651 Michael Niedermayer
    put_bits(&s->pb, 1, s->progressive_sequence ? 0 : 1);
2401 bb270c08 Diego Biurrun
    put_bits(&s->pb, 1, 1);             /* obmc disable */
2402 10cd5815 Michael Niedermayer
    if (vo_ver_id == 1) {
2403 bb270c08 Diego Biurrun
        put_bits(&s->pb, 1, s->vol_sprite_usage);       /* sprite enable */
2404 41773b73 Michael Niedermayer
    }else{
2405 bb270c08 Diego Biurrun
        put_bits(&s->pb, 2, s->vol_sprite_usage);       /* sprite enable */
2406 10cd5815 Michael Niedermayer
    }
2407 115329f1 Diego Biurrun
2408 bb270c08 Diego Biurrun
    put_bits(&s->pb, 1, 0);             /* not 8 bit == false */
2409
    put_bits(&s->pb, 1, s->mpeg_quant); /* quant type= (0=h263 style)*/
2410 d6eb3c50 Michael Niedermayer
2411
    if(s->mpeg_quant){
2412
        ff_write_quant_matrix(&s->pb, s->avctx->intra_matrix);
2413
        ff_write_quant_matrix(&s->pb, s->avctx->inter_matrix);
2414
    }
2415 87f8cab4 Michael Niedermayer
2416 10cd5815 Michael Niedermayer
    if (vo_ver_id != 1)
2417 1457ab52 Michael Niedermayer
        put_bits(&s->pb, 1, s->quarter_sample);
2418 bb270c08 Diego Biurrun
    put_bits(&s->pb, 1, 1);             /* complexity estimation disable */
2419 92073d01 Michael Niedermayer
    s->resync_marker= s->rtp_mode;
2420
    put_bits(&s->pb, 1, s->resync_marker ? 0 : 1);/* resync marker disable */
2421
    put_bits(&s->pb, 1, s->data_partitioning ? 1 : 0);
2422
    if(s->data_partitioning){
2423 bb270c08 Diego Biurrun
        put_bits(&s->pb, 1, 0);         /* no rvlc */
2424 92073d01 Michael Niedermayer
    }
2425
2426 10cd5815 Michael Niedermayer
    if (vo_ver_id != 1){
2427 bb270c08 Diego Biurrun
        put_bits(&s->pb, 1, 0);         /* newpred */
2428
        put_bits(&s->pb, 1, 0);         /* reduced res vop */
2429 10cd5815 Michael Niedermayer
    }
2430 bb270c08 Diego Biurrun
    put_bits(&s->pb, 1, 0);             /* scalability */
2431 115329f1 Diego Biurrun
2432 92073d01 Michael Niedermayer
    ff_mpeg4_stuffing(&s->pb);
2433 49c9325f Michael Niedermayer
2434 5596c60c Michael Niedermayer
    /* user data */
2435 b0368839 Michael Niedermayer
    if(!(s->flags & CODEC_FLAG_BITEXACT)){
2436 5596c60c Michael Niedermayer
        put_bits(&s->pb, 16, 0);
2437 bb270c08 Diego Biurrun
        put_bits(&s->pb, 16, 0x1B2);    /* user_data */
2438
        ff_put_string(&s->pb, LIBAVCODEC_IDENT, 0);
2439 5596c60c Michael Niedermayer
    }
2440 10cd5815 Michael Niedermayer
}
2441
2442
/* write mpeg4 VOP header */
2443
void mpeg4_encode_picture_header(MpegEncContext * s, int picture_number)
2444
{
2445 9dbcbd92 Michael Niedermayer
    int time_incr;
2446
    int time_div, time_mod;
2447 115329f1 Diego Biurrun
2448 92073d01 Michael Niedermayer
    if(s->pict_type==I_TYPE){
2449 70ac76c0 Michael Niedermayer
        if(!(s->flags&CODEC_FLAG_GLOBAL_HEADER)){
2450 9cd81798 Michael Niedermayer
            if(s->strict_std_compliance < FF_COMPLIANCE_VERY_STRICT) //HACK, the reference sw is buggy
2451 3f6f76af Michael Niedermayer
                mpeg4_encode_visual_object_header(s);
2452 9cd81798 Michael Niedermayer
            if(s->strict_std_compliance < FF_COMPLIANCE_VERY_STRICT || picture_number==0) //HACK, the reference sw is buggy
2453 3f6f76af Michael Niedermayer
                mpeg4_encode_vol_header(s, 0, 0);
2454 41773b73 Michael Niedermayer
        }
2455 59fa3f96 Michael Niedermayer
        if(!(s->workaround_bugs & FF_BUG_MS))
2456
            mpeg4_encode_gop_header(s);
2457 92073d01 Michael Niedermayer
    }
2458 115329f1 Diego Biurrun
2459 4d2858de Michael Niedermayer
    s->partitioned_frame= s->data_partitioning && s->pict_type!=B_TYPE;
2460
2461 c0df9d75 Michael Niedermayer
//printf("num:%d rate:%d base:%d\n", s->picture_number, s->time_base.den, FRAME_RATE_BASE);
2462 115329f1 Diego Biurrun
2463 bb270c08 Diego Biurrun
    put_bits(&s->pb, 16, 0);                /* vop header */
2464
    put_bits(&s->pb, 16, VOP_STARTCODE);    /* vop header */
2465
    put_bits(&s->pb, 2, s->pict_type - 1);  /* pict type: I = 0 , P = 1 */
2466 9dbcbd92 Michael Niedermayer
2467 cf5c5c8f Michael Niedermayer
    assert(s->time>=0);
2468 c0df9d75 Michael Niedermayer
    time_div= s->time/s->avctx->time_base.den;
2469
    time_mod= s->time%s->avctx->time_base.den;
2470 9dbcbd92 Michael Niedermayer
    time_incr= time_div - s->last_time_base;
2471 6c205de2 Michael Niedermayer
    assert(time_incr >= 0);
2472 9dbcbd92 Michael Niedermayer
    while(time_incr--)
2473
        put_bits(&s->pb, 1, 1);
2474 115329f1 Diego Biurrun
2475 de6d9b64 Fabrice Bellard
    put_bits(&s->pb, 1, 0);
2476
2477 bb270c08 Diego Biurrun
    put_bits(&s->pb, 1, 1);                             /* marker */
2478
    put_bits(&s->pb, s->time_increment_bits, time_mod); /* time increment */
2479
    put_bits(&s->pb, 1, 1);                             /* marker */
2480
    put_bits(&s->pb, 1, 1);                             /* vop coded */
2481 115329f1 Diego Biurrun
    if (    s->pict_type == P_TYPE
2482 10cd5815 Michael Niedermayer
        || (s->pict_type == S_TYPE && s->vol_sprite_usage==GMC_SPRITE)) {
2483 bb270c08 Diego Biurrun
        put_bits(&s->pb, 1, s->no_rounding);    /* rounding type */
2484 de6d9b64 Fabrice Bellard
    }
2485 bb270c08 Diego Biurrun
    put_bits(&s->pb, 3, 0);     /* intra dc VLC threshold */
2486 fcb48651 Michael Niedermayer
    if(!s->progressive_sequence){
2487 2be9f03a Michael Niedermayer
         put_bits(&s->pb, 1, s->current_picture_ptr->top_field_first);
2488 fcb48651 Michael Niedermayer
         put_bits(&s->pb, 1, s->alternate_scan);
2489
    }
2490 10cd5815 Michael Niedermayer
    //FIXME sprite stuff
2491 de6d9b64 Fabrice Bellard
2492
    put_bits(&s->pb, 5, s->qscale);
2493
2494
    if (s->pict_type != I_TYPE)
2495 bb270c08 Diego Biurrun
        put_bits(&s->pb, 3, s->f_code); /* fcode_for */
2496 10cd5815 Michael Niedermayer
    if (s->pict_type == B_TYPE)
2497 bb270c08 Diego Biurrun
        put_bits(&s->pb, 3, s->b_code); /* fcode_back */
2498 de6d9b64 Fabrice Bellard
    //    printf("****frame %d\n", picture_number);
2499
}
2500
2501 7604246d Wolfgang Hesseler
#endif //CONFIG_ENCODERS
2502
2503 4d2858de Michael Niedermayer
/**
2504 554daa24 Michael Niedermayer
 * set qscale and update qscale dependant variables.
2505 4d2858de Michael Niedermayer
 */
2506 554daa24 Michael Niedermayer
void ff_set_qscale(MpegEncContext * s, int qscale)
2507 de6d9b64 Fabrice Bellard
{
2508 554daa24 Michael Niedermayer
    if (qscale < 1)
2509
        qscale = 1;
2510
    else if (qscale > 31)
2511
        qscale = 31;
2512 115329f1 Diego Biurrun
2513 554daa24 Michael Niedermayer
    s->qscale = qscale;
2514
    s->chroma_qscale= s->chroma_qscale_table[qscale];
2515 5482970b Michael Niedermayer
2516 554daa24 Michael Niedermayer
    s->y_dc_scale= s->y_dc_scale_table[ qscale ];
2517 332f9ac4 Michael Niedermayer
    s->c_dc_scale= s->c_dc_scale_table[ s->chroma_qscale ];
2518 de6d9b64 Fabrice Bellard
}
2519
2520 2ba8f6b8 Michael Niedermayer
/**
2521
 * predicts the dc.
2522 a7137a04 Michael Niedermayer
 * encoding quantized level -> quantized diff
2523 115329f1 Diego Biurrun
 * decoding quantized diff -> quantized level
2524 2ba8f6b8 Michael Niedermayer
 * @param n block index (0-3 are luma, 4-5 are chroma)
2525
 * @param dir_ptr pointer to an integer where the prediction direction will be stored
2526
 */
2527 a7137a04 Michael Niedermayer
static inline int ff_mpeg4_pred_dc(MpegEncContext * s, int n, int level, int *dir_ptr, int encoding)
2528 de6d9b64 Fabrice Bellard
{
2529 a7137a04 Michael Niedermayer
    int a, b, c, wrap, pred, scale, ret;
2530 0c1a9eda Zdenek Kabelac
    uint16_t *dc_val;
2531 de6d9b64 Fabrice Bellard
2532
    /* find prediction */
2533
    if (n < 4) {
2534 bb270c08 Diego Biurrun
        scale = s->y_dc_scale;
2535 de6d9b64 Fabrice Bellard
    } else {
2536 bb270c08 Diego Biurrun
        scale = s->c_dc_scale;
2537 de6d9b64 Fabrice Bellard
    }
2538 6d71b382 Michael Niedermayer
    if(IS_3IV1)
2539
        scale= 8;
2540
2541 4278e7a6 Michael Niedermayer
    wrap= s->block_wrap[n];
2542
    dc_val = s->dc_val[0] + s->block_index[n];
2543 de6d9b64 Fabrice Bellard
2544
    /* B C
2545 115329f1 Diego Biurrun
     * A X
2546 de6d9b64 Fabrice Bellard
     */
2547 4278e7a6 Michael Niedermayer
    a = dc_val[ - 1];
2548
    b = dc_val[ - 1 - wrap];
2549
    c = dc_val[ - wrap];
2550 de6d9b64 Fabrice Bellard
2551 893bc624 Kevin Baragona
    /* outside slice handling (we can't do that by memset as we need the dc for error resilience) */
2552 4d2858de Michael Niedermayer
    if(s->first_slice_line && n!=3){
2553
        if(n!=2) b=c= 1024;
2554
        if(n!=1 && s->mb_x == s->resync_mb_x) b=a= 1024;
2555
    }
2556
    if(s->mb_x == s->resync_mb_x && s->mb_y == s->resync_mb_y+1){
2557
        if(n==0 || n==4 || n==5)
2558
            b=1024;
2559
    }
2560
2561 de6d9b64 Fabrice Bellard
    if (abs(a - b) < abs(b - c)) {
2562 bb270c08 Diego Biurrun
        pred = c;
2563 de6d9b64 Fabrice Bellard
        *dir_ptr = 1; /* top */
2564
    } else {
2565 bb270c08 Diego Biurrun
        pred = a;
2566 de6d9b64 Fabrice Bellard
        *dir_ptr = 0; /* left */
2567
    }
2568
    /* we assume pred is positive */
2569 d4961b35 BERO
    pred = FASTDIV((pred + (scale >> 1)), scale);
2570 de6d9b64 Fabrice Bellard
2571 a7137a04 Michael Niedermayer
    if(encoding){
2572
        ret = level - pred;
2573
    }else{
2574
        level += pred;
2575
        ret= level;
2576
        if(s->error_resilience>=3){
2577
            if(level<0){
2578
                av_log(s->avctx, AV_LOG_ERROR, "dc<0 at %dx%d\n", s->mb_x, s->mb_y);
2579
                return -1;
2580
            }
2581
            if(level*scale > 2048 + scale){
2582
                av_log(s->avctx, AV_LOG_ERROR, "dc overflow at %dx%d\n", s->mb_x, s->mb_y);
2583
                return -1;
2584
            }
2585
        }
2586
    }
2587
    level *=scale;
2588 4ccde216 Michael Niedermayer
    if(level&(~2047)){
2589 115329f1 Diego Biurrun
        if(level<0)
2590 4ccde216 Michael Niedermayer
            level=0;
2591
        else if(!(s->workaround_bugs&FF_BUG_DC_CLIP))
2592
            level=2047;
2593
    }
2594 a7137a04 Michael Niedermayer
    dc_val[0]= level;
2595 de6d9b64 Fabrice Bellard
2596 a7137a04 Michael Niedermayer
    return ret;
2597 de6d9b64 Fabrice Bellard
}
2598
2599 2ba8f6b8 Michael Niedermayer
/**
2600
 * predicts the ac.
2601
 * @param n block index (0-3 are luma, 4-5 are chroma)
2602
 * @param dir the ac prediction direction
2603
 */
2604 0e15384d Michael Niedermayer
void mpeg4_pred_ac(MpegEncContext * s, DCTELEM *block, int n,
2605 de6d9b64 Fabrice Bellard
                   int dir)
2606
{
2607 4278e7a6 Michael Niedermayer
    int i;
2608 0c1a9eda Zdenek Kabelac
    int16_t *ac_val, *ac_val1;
2609 1e491e29 Michael Niedermayer
    int8_t * const qscale_table= s->current_picture.qscale_table;
2610 de6d9b64 Fabrice Bellard
2611
    /* find prediction */
2612 4278e7a6 Michael Niedermayer
    ac_val = s->ac_val[0][0] + s->block_index[n] * 16;
2613 de6d9b64 Fabrice Bellard
    ac_val1 = ac_val;
2614
    if (s->ac_pred) {
2615
        if (dir == 0) {
2616 7bc9090a Michael Niedermayer
            const int xy= s->mb_x-1 + s->mb_y*s->mb_stride;
2617 de6d9b64 Fabrice Bellard
            /* left prediction */
2618
            ac_val -= 16;
2619 115329f1 Diego Biurrun
2620 1e491e29 Michael Niedermayer
            if(s->mb_x==0 || s->qscale == qscale_table[xy] || n==1 || n==3){
2621 3e6a20a0 Michael Niedermayer
                /* same qscale */
2622
                for(i=1;i<8;i++) {
2623 b0368839 Michael Niedermayer
                    block[s->dsp.idct_permutation[i<<3]] += ac_val[i];
2624 3e6a20a0 Michael Niedermayer
                }
2625
            }else{
2626
                /* different qscale, we must rescale */
2627
                for(i=1;i<8;i++) {
2628 b0368839 Michael Niedermayer
                    block[s->dsp.idct_permutation[i<<3]] += ROUNDED_DIV(ac_val[i]*qscale_table[xy], s->qscale);
2629 3e6a20a0 Michael Niedermayer
                }
2630 de6d9b64 Fabrice Bellard
            }
2631
        } else {
2632 7bc9090a Michael Niedermayer
            const int xy= s->mb_x + s->mb_y*s->mb_stride - s->mb_stride;
2633 de6d9b64 Fabrice Bellard
            /* top prediction */
2634 4278e7a6 Michael Niedermayer
            ac_val -= 16 * s->block_wrap[n];
2635 3e6a20a0 Michael Niedermayer
2636 1e491e29 Michael Niedermayer
            if(s->mb_y==0 || s->qscale == qscale_table[xy] || n==2 || n==3){
2637 3e6a20a0 Michael Niedermayer
                /* same qscale */
2638
                for(i=1;i<8;i++) {
2639 b0368839 Michael Niedermayer
                    block[s->dsp.idct_permutation[i]] += ac_val[i + 8];
2640 3e6a20a0 Michael Niedermayer
                }
2641
            }else{
2642
                /* different qscale, we must rescale */
2643
                for(i=1;i<8;i++) {
2644 b0368839 Michael Niedermayer
                    block[s->d