mpegvideo_enc.c 165.3 KB
Newer Older
B
Benoit Fouet 已提交
1 2
/*
 * The simplest mpeg encoder (well, it was the simplest!)
3
 * Copyright (c) 2000,2001 Fabrice Bellard
B
Benoit Fouet 已提交
4 5
 * Copyright (c) 2002-2004 Michael Niedermayer <michaelni@gmx.at>
 *
6 7
 * 4MV & hq & B-frame encoding stuff by Michael Niedermayer <michaelni@gmx.at>
 *
B
Benoit Fouet 已提交
8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25
 * This file is part of FFmpeg.
 *
 * FFmpeg is free software; you can redistribute it and/or
 * modify it under the terms of the GNU Lesser General Public
 * License as published by the Free Software Foundation; either
 * version 2.1 of the License, or (at your option) any later version.
 *
 * FFmpeg is distributed in the hope that it will be useful,
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
 * Lesser General Public License for more details.
 *
 * You should have received a copy of the GNU Lesser General Public
 * License along with FFmpeg; if not, write to the Free Software
 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
 */

/**
26
 * @file
B
Benoit Fouet 已提交
27 28 29
 * The simplest mpeg encoder (well, it was the simplest!).
 */

30 31
#include <stdint.h>

32
#include "libavutil/internal.h"
33
#include "libavutil/intmath.h"
34
#include "libavutil/mathematics.h"
35
#include "libavutil/pixdesc.h"
36
#include "libavutil/opt.h"
37
#include "libavutil/timer.h"
B
Benoit Fouet 已提交
38
#include "avcodec.h"
39
#include "dct.h"
B
Benoit Fouet 已提交
40
#include "dsputil.h"
41
#include "mpeg12.h"
B
Benoit Fouet 已提交
42
#include "mpegvideo.h"
43
#include "h261.h"
44
#include "h263.h"
45
#include "mathops.h"
46
#include "mpegutils.h"
B
Benoit Fouet 已提交
47 48
#include "mjpegenc.h"
#include "msmpeg4.h"
49
#include "qpeldsp.h"
B
Benoit Fouet 已提交
50
#include "faandct.h"
51
#include "thread.h"
52
#include "aandcttab.h"
M
Michael Niedermayer 已提交
53
#include "flv.h"
54
#include "mpeg4video.h"
55
#include "internal.h"
56
#include "bytestream.h"
B
Benoit Fouet 已提交
57
#include <limits.h>
M
Michael Niedermayer 已提交
58
#include "sp5x.h"
B
Benoit Fouet 已提交
59 60

static int encode_picture(MpegEncContext *s, int picture_number);
D
Diego Biurrun 已提交
61
static int dct_quantize_refine(MpegEncContext *s, int16_t *block, int16_t *weight, int16_t *orig, int n, int qscale);
B
Benoit Fouet 已提交
62
static int sse_mb(MpegEncContext *s);
D
Diego Biurrun 已提交
63 64
static void denoise_dct_c(MpegEncContext *s, int16_t *block);
static int dct_quantize_trellis_c(MpegEncContext *s, int16_t *block, int n, int qscale, int *overflow);
B
Benoit Fouet 已提交
65

A
Aneesh Dogra 已提交
66 67
static uint8_t default_mv_penalty[MAX_FCODE + 1][MAX_MV * 2 + 1];
static uint8_t default_fcode_tab[MAX_MV * 2 + 1];
B
Benoit Fouet 已提交
68

69 70 71 72 73
const AVOption ff_mpv_generic_options[] = {
    FF_MPV_COMMON_OPTS
    { NULL },
};

A
Aneesh Dogra 已提交
74 75 76 77
void ff_convert_matrix(DSPContext *dsp, int (*qmat)[64],
                       uint16_t (*qmat16)[2][64],
                       const uint16_t *quant_matrix,
                       int bias, int qmin, int qmax, int intra)
B
Benoit Fouet 已提交
78 79
{
    int qscale;
A
Aneesh Dogra 已提交
80
    int shift = 0;
B
Benoit Fouet 已提交
81

A
Aneesh Dogra 已提交
82
    for (qscale = qmin; qscale <= qmax; qscale++) {
B
Benoit Fouet 已提交
83
        int i;
M
Mans Rullgard 已提交
84
        if (dsp->fdct == ff_jpeg_fdct_islow_8 ||
85 86
            dsp->fdct == ff_jpeg_fdct_islow_10 ||
            dsp->fdct == ff_faandct) {
A
Aneesh Dogra 已提交
87 88 89 90 91 92 93
            for (i = 0; i < 64; i++) {
                const int j = dsp->idct_permutation[i];
                /* 16 <= qscale * quant_matrix[i] <= 7905
                 * Assume x = ff_aanscales[i] * qscale * quant_matrix[i]
                 *             19952 <=              x  <= 249205026
                 * (1 << 36) / 19952 >= (1 << 36) / (x) >= (1 << 36) / 249205026
                 *           3444240 >= (1 << 36) / (x) >= 275 */
B
Benoit Fouet 已提交
94 95

                qmat[qscale][i] = (int)((UINT64_C(1) << QMAT_SHIFT) /
A
Aneesh Dogra 已提交
96
                                        (qscale * quant_matrix[j]));
B
Benoit Fouet 已提交
97
            }
98
        } else if (dsp->fdct == ff_fdct_ifast) {
A
Aneesh Dogra 已提交
99 100 101 102 103 104 105
            for (i = 0; i < 64; i++) {
                const int j = dsp->idct_permutation[i];
                /* 16 <= qscale * quant_matrix[i] <= 7905
                 * Assume x = ff_aanscales[i] * qscale * quant_matrix[i]
                 *             19952 <=              x  <= 249205026
                 * (1 << 36) / 19952 >= (1 << 36) / (x) >= (1 << 36) / 249205026
                 *           3444240 >= (1 << 36) / (x) >= 275 */
B
Benoit Fouet 已提交
106 107

                qmat[qscale][i] = (int)((UINT64_C(1) << (QMAT_SHIFT + 14)) /
108
                                        (ff_aanscales[i] * (int64_t)qscale * quant_matrix[j]));
B
Benoit Fouet 已提交
109 110
            }
        } else {
A
Aneesh Dogra 已提交
111 112
            for (i = 0; i < 64; i++) {
                const int j = dsp->idct_permutation[i];
B
Benoit Fouet 已提交
113
                /* We can safely suppose that 16 <= quant_matrix[i] <= 255
A
Aneesh Dogra 已提交
114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130
                 * Assume x = qscale * quant_matrix[i]
                 * So             16 <=              x  <= 7905
                 * so (1 << 19) / 16 >= (1 << 19) / (x) >= (1 << 19) / 7905
                 * so          32768 >= (1 << 19) / (x) >= 67 */
                qmat[qscale][i] = (int)((UINT64_C(1) << QMAT_SHIFT) /
                                        (qscale * quant_matrix[j]));
                //qmat  [qscale][i] = (1 << QMAT_SHIFT_MMX) /
                //                    (qscale * quant_matrix[i]);
                qmat16[qscale][0][i] = (1 << QMAT_SHIFT_MMX) /
                                       (qscale * quant_matrix[j]);

                if (qmat16[qscale][0][i] == 0 ||
                    qmat16[qscale][0][i] == 128 * 256)
                    qmat16[qscale][0][i] = 128 * 256 - 1;
                qmat16[qscale][1][i] =
                    ROUNDED_DIV(bias << (16 - QUANT_BIAS_SHIFT),
                                qmat16[qscale][0][i]);
B
Benoit Fouet 已提交
131 132 133
            }
        }

A
Aneesh Dogra 已提交
134 135
        for (i = intra; i < 64; i++) {
            int64_t max = 8191;
136
            if (dsp->fdct == ff_fdct_ifast) {
A
Aneesh Dogra 已提交
137
                max = (8191LL * ff_aanscales[i]) >> 14;
B
Benoit Fouet 已提交
138
            }
A
Aneesh Dogra 已提交
139
            while (((max * qmat[qscale][i]) >> shift) > INT_MAX) {
B
Benoit Fouet 已提交
140 141 142 143
                shift++;
            }
        }
    }
A
Aneesh Dogra 已提交
144 145 146 147
    if (shift) {
        av_log(NULL, AV_LOG_INFO,
               "Warning, QMAT_SHIFT is larger than %d, overflows possible\n",
               QMAT_SHIFT - shift);
B
Benoit Fouet 已提交
148 149 150
    }
}

A
Aneesh Dogra 已提交
151 152 153 154 155
static inline void update_qscale(MpegEncContext *s)
{
    s->qscale = (s->lambda * 139 + FF_LAMBDA_SCALE * 64) >>
                (FF_LAMBDA_SHIFT + 7);
    s->qscale = av_clip(s->qscale, s->avctx->qmin, s->avctx->qmax);
B
Benoit Fouet 已提交
156

A
Aneesh Dogra 已提交
157 158
    s->lambda2 = (s->lambda * s->lambda + FF_LAMBDA_SCALE / 2) >>
                 FF_LAMBDA_SHIFT;
B
Benoit Fouet 已提交
159 160
}

A
Aneesh Dogra 已提交
161 162
void ff_write_quant_matrix(PutBitContext *pb, uint16_t *matrix)
{
B
Benoit Fouet 已提交
163 164
    int i;

A
Aneesh Dogra 已提交
165
    if (matrix) {
B
Benoit Fouet 已提交
166
        put_bits(pb, 1, 1);
A
Aneesh Dogra 已提交
167 168
        for (i = 0; i < 64; i++) {
            put_bits(pb, 8, matrix[ff_zigzag_direct[i]]);
B
Benoit Fouet 已提交
169
        }
A
Aneesh Dogra 已提交
170
    } else
B
Benoit Fouet 已提交
171 172 173
        put_bits(pb, 1, 0);
}

174 175 176
/**
 * init s->current_picture.qscale_table from s->lambda_table
 */
A
Aneesh Dogra 已提交
177 178
void ff_init_qscale_tab(MpegEncContext *s)
{
179
    int8_t * const qscale_table = s->current_picture.qscale_table;
180 181
    int i;

A
Aneesh Dogra 已提交
182 183 184 185 186
    for (i = 0; i < s->mb_num; i++) {
        unsigned int lam = s->lambda_table[s->mb_index2xy[i]];
        int qp = (lam * 139 + FF_LAMBDA_SCALE * 64) >> (FF_LAMBDA_SHIFT + 7);
        qscale_table[s->mb_index2xy[i]] = av_clip(qp, s->avctx->qmin,
                                                  s->avctx->qmax);
187 188 189
    }
}

A
Aneesh Dogra 已提交
190 191 192
static void update_duplicate_context_after_me(MpegEncContext *dst,
                                              MpegEncContext *src)
{
B
Benoit Fouet 已提交
193 194 195 196 197 198 199 200 201 202
#define COPY(a) dst->a= src->a
    COPY(pict_type);
    COPY(current_picture);
    COPY(f_code);
    COPY(b_code);
    COPY(qscale);
    COPY(lambda);
    COPY(lambda2);
    COPY(picture_in_gop_number);
    COPY(gop_picture_number);
A
Aneesh Dogra 已提交
203 204 205
    COPY(frame_pred_frame_dct); // FIXME don't set in encode_header
    COPY(progressive_frame);    // FIXME don't set in encode_header
    COPY(partitioned_frame);    // FIXME don't set in encode_header
B
Benoit Fouet 已提交
206 207 208 209
#undef COPY
}

/**
210
 * Set the given MpegEncContext to defaults for encoding.
B
Benoit Fouet 已提交
211 212
 * the changed fields will not depend upon the prior state of the MpegEncContext.
 */
A
Aneesh Dogra 已提交
213 214
static void MPV_encode_defaults(MpegEncContext *s)
{
B
Benoit Fouet 已提交
215
    int i;
216
    ff_MPV_common_defaults(s);
B
Benoit Fouet 已提交
217

A
Aneesh Dogra 已提交
218 219
    for (i = -16; i < 16; i++) {
        default_fcode_tab[i + MAX_MV] = 1;
B
Benoit Fouet 已提交
220
    }
A
Aneesh Dogra 已提交
221 222
    s->me.mv_penalty = default_mv_penalty;
    s->fcode_tab     = default_fcode_tab;
223 224 225

    s->input_picture_number  = 0;
    s->picture_in_gop_number = 0;
B
Benoit Fouet 已提交
226 227
}

228 229 230 231
av_cold int ff_dct_encode_init(MpegEncContext *s) {
    if (ARCH_X86)
        ff_dct_encode_init_x86(s);

232 233
    if (CONFIG_H263_ENCODER)
        ff_h263dsp_init(&s->h263dsp);
234 235 236 237 238 239 240 241 242 243 244
    if (!s->dct_quantize)
        s->dct_quantize = ff_dct_quantize_c;
    if (!s->denoise_dct)
        s->denoise_dct  = denoise_dct_c;
    s->fast_dct_quantize = s->dct_quantize;
    if (s->avctx->trellis)
        s->dct_quantize  = dct_quantize_trellis_c;

    return 0;
}

B
Benoit Fouet 已提交
245
/* init video encoder */
246
av_cold int ff_MPV_encode_init(AVCodecContext *avctx)
B
Benoit Fouet 已提交
247 248
{
    MpegEncContext *s = avctx->priv_data;
249
    int i, ret, format_supported;
B
Benoit Fouet 已提交
250 251 252 253

    MPV_encode_defaults(s);

    switch (avctx->codec_id) {
254
    case AV_CODEC_ID_MPEG2VIDEO:
255 256
        if (avctx->pix_fmt != AV_PIX_FMT_YUV420P &&
            avctx->pix_fmt != AV_PIX_FMT_YUV422P) {
A
Aneesh Dogra 已提交
257 258
            av_log(avctx, AV_LOG_ERROR,
                   "only YUV420 and YUV422 are supported\n");
B
Benoit Fouet 已提交
259 260 261
            return -1;
        }
        break;
262
    case AV_CODEC_ID_MJPEG:
263
    case AV_CODEC_ID_AMV:
264 265 266 267
        format_supported = 0;
        /* JPEG color space */
        if (avctx->pix_fmt == AV_PIX_FMT_YUVJ420P ||
            avctx->pix_fmt == AV_PIX_FMT_YUVJ422P ||
268
            avctx->pix_fmt == AV_PIX_FMT_YUVJ444P ||
269 270
            (avctx->color_range == AVCOL_RANGE_JPEG &&
             (avctx->pix_fmt == AV_PIX_FMT_YUV420P ||
271 272
              avctx->pix_fmt == AV_PIX_FMT_YUV422P ||
              avctx->pix_fmt == AV_PIX_FMT_YUV444P)))
273 274 275 276
            format_supported = 1;
        /* MPEG color space */
        else if (avctx->strict_std_compliance <= FF_COMPLIANCE_UNOFFICIAL &&
                 (avctx->pix_fmt == AV_PIX_FMT_YUV420P ||
277 278
                  avctx->pix_fmt == AV_PIX_FMT_YUV422P ||
                  avctx->pix_fmt == AV_PIX_FMT_YUV444P))
279 280 281
            format_supported = 1;

        if (!format_supported) {
B
Benoit Fouet 已提交
282 283 284 285 286
            av_log(avctx, AV_LOG_ERROR, "colorspace not supported in jpeg\n");
            return -1;
        }
        break;
    default:
287
        if (avctx->pix_fmt != AV_PIX_FMT_YUV420P) {
B
Benoit Fouet 已提交
288 289 290 291 292 293
            av_log(avctx, AV_LOG_ERROR, "only YUV420 is supported\n");
            return -1;
        }
    }

    switch (avctx->pix_fmt) {
P
Paul B Mahol 已提交
294 295 296 297
    case AV_PIX_FMT_YUVJ444P:
    case AV_PIX_FMT_YUV444P:
        s->chroma_format = CHROMA_444;
        break;
298 299
    case AV_PIX_FMT_YUVJ422P:
    case AV_PIX_FMT_YUV422P:
B
Benoit Fouet 已提交
300 301
        s->chroma_format = CHROMA_422;
        break;
302 303
    case AV_PIX_FMT_YUVJ420P:
    case AV_PIX_FMT_YUV420P:
B
Benoit Fouet 已提交
304 305 306 307 308 309
    default:
        s->chroma_format = CHROMA_420;
        break;
    }

    s->bit_rate = avctx->bit_rate;
A
Aneesh Dogra 已提交
310 311 312 313
    s->width    = avctx->width;
    s->height   = avctx->height;
    if (avctx->gop_size > 600 &&
        avctx->strict_std_compliance > FF_COMPLIANCE_EXPERIMENTAL) {
314 315 316
        av_log(avctx, AV_LOG_WARNING,
               "keyframe interval too large!, reducing it from %d to %d\n",
               avctx->gop_size, 600);
A
Aneesh Dogra 已提交
317
        avctx->gop_size = 600;
B
Benoit Fouet 已提交
318
    }
A
Aneesh Dogra 已提交
319 320 321 322
    s->gop_size     = avctx->gop_size;
    s->avctx        = avctx;
    s->flags        = avctx->flags;
    s->flags2       = avctx->flags2;
A
Anton Khirnov 已提交
323 324 325
    if (avctx->max_b_frames > MAX_B_FRAMES) {
        av_log(avctx, AV_LOG_ERROR, "Too many B-frames requested, maximum "
               "is %d.\n", MAX_B_FRAMES);
326
        avctx->max_b_frames = MAX_B_FRAMES;
A
Anton Khirnov 已提交
327
    }
A
Aneesh Dogra 已提交
328 329 330 331 332 333 334
    s->max_b_frames = avctx->max_b_frames;
    s->codec_id     = avctx->codec->id;
    s->strict_std_compliance = avctx->strict_std_compliance;
    s->quarter_sample     = (avctx->flags & CODEC_FLAG_QPEL) != 0;
    s->mpeg_quant         = avctx->mpeg_quant;
    s->rtp_mode           = !!avctx->rtp_payload_size;
    s->intra_dc_precision = avctx->intra_dc_precision;
B
Benoit Fouet 已提交
335 336 337 338
    s->user_specified_pts = AV_NOPTS_VALUE;

    if (s->gop_size <= 1) {
        s->intra_only = 1;
A
Aneesh Dogra 已提交
339
        s->gop_size   = 12;
B
Benoit Fouet 已提交
340 341 342 343 344 345 346 347 348
    } else {
        s->intra_only = 0;
    }

    s->me_method = avctx->me_method;

    /* Fixed QSCALE */
    s->fixed_qscale = !!(avctx->flags & CODEC_FLAG_QSCALE);

A
Aneesh Dogra 已提交
349 350 351 352 353 354
    s->adaptive_quant = (s->avctx->lumi_masking ||
                         s->avctx->dark_masking ||
                         s->avctx->temporal_cplx_masking ||
                         s->avctx->spatial_cplx_masking  ||
                         s->avctx->p_masking      ||
                         s->avctx->border_masking ||
355
                         (s->mpv_flags & FF_MPV_FLAG_QP_RD)) &&
A
Aneesh Dogra 已提交
356
                        !s->fixed_qscale;
B
Benoit Fouet 已提交
357

A
Aneesh Dogra 已提交
358
    s->loop_filter      = !!(s->flags & CODEC_FLAG_LOOP_FILTER);
B
Benoit Fouet 已提交
359

360 361 362 363 364 365
    if (avctx->rc_max_rate && !avctx->rc_buffer_size) {
        switch(avctx->codec_id) {
        case AV_CODEC_ID_MPEG1VIDEO:
        case AV_CODEC_ID_MPEG2VIDEO:
            avctx->rc_buffer_size = FFMAX(avctx->rc_max_rate, 15000000) * 112L / 15000000 * 16384;
            break;
366 367 368 369 370 371 372 373 374 375 376 377 378 379
        case AV_CODEC_ID_MPEG4:
        case AV_CODEC_ID_MSMPEG4V1:
        case AV_CODEC_ID_MSMPEG4V2:
        case AV_CODEC_ID_MSMPEG4V3:
            if       (avctx->rc_max_rate >= 15000000) {
                avctx->rc_buffer_size = 320 + (avctx->rc_max_rate - 15000000L) * (760-320) / (38400000 - 15000000);
            } else if(avctx->rc_max_rate >=  2000000) {
                avctx->rc_buffer_size =  80 + (avctx->rc_max_rate -  2000000L) * (320- 80) / (15000000 -  2000000);
            } else if(avctx->rc_max_rate >=   384000) {
                avctx->rc_buffer_size =  40 + (avctx->rc_max_rate -   384000L) * ( 80- 40) / ( 2000000 -   384000);
            } else
                avctx->rc_buffer_size = 40;
            avctx->rc_buffer_size *= 16384;
            break;
380 381 382 383 384 385
        }
        if (avctx->rc_buffer_size) {
            av_log(avctx, AV_LOG_INFO, "Automatically choosing VBV buffer size of %d kbyte\n", avctx->rc_buffer_size/8192);
        }
    }

386 387
    if ((!avctx->rc_max_rate) != (!avctx->rc_buffer_size)) {
        av_log(avctx, AV_LOG_ERROR, "Either both buffer size and max rate or neither must be specified\n");
388 389
        if (avctx->rc_max_rate && !avctx->rc_buffer_size)
            return -1;
B
Benoit Fouet 已提交
390 391
    }

A
Aneesh Dogra 已提交
392 393 394
    if (avctx->rc_min_rate && avctx->rc_max_rate != avctx->rc_min_rate) {
        av_log(avctx, AV_LOG_INFO,
               "Warning min_rate > 0 but min_rate != max_rate isn't recommended!\n");
B
Benoit Fouet 已提交
395 396
    }

A
Aneesh Dogra 已提交
397
    if (avctx->rc_min_rate && avctx->rc_min_rate > avctx->bit_rate) {
B
Benoit Fouet 已提交
398 399 400 401
        av_log(avctx, AV_LOG_ERROR, "bitrate below min bitrate\n");
        return -1;
    }

A
Aneesh Dogra 已提交
402
    if (avctx->rc_max_rate && avctx->rc_max_rate < avctx->bit_rate) {
403
        av_log(avctx, AV_LOG_ERROR, "bitrate above max bitrate\n");
B
Benoit Fouet 已提交
404 405 406
        return -1;
    }

A
Aneesh Dogra 已提交
407 408 409 410 411
    if (avctx->rc_max_rate &&
        avctx->rc_max_rate == avctx->bit_rate &&
        avctx->rc_max_rate != avctx->rc_min_rate) {
        av_log(avctx, AV_LOG_INFO,
               "impossible bitrate constraints, this will fail\n");
412 413
    }

A
Aneesh Dogra 已提交
414 415 416
    if (avctx->rc_buffer_size &&
        avctx->bit_rate * (int64_t)avctx->time_base.num >
            avctx->rc_buffer_size * (int64_t)avctx->time_base.den) {
B
Benoit Fouet 已提交
417 418 419 420
        av_log(avctx, AV_LOG_ERROR, "VBV buffer too small for bitrate\n");
        return -1;
    }

A
Aneesh Dogra 已提交
421 422 423
    if (!s->fixed_qscale &&
        avctx->bit_rate * av_q2d(avctx->time_base) >
            avctx->bit_rate_tolerance) {
424 425 426
        av_log(avctx, AV_LOG_WARNING,
               "bitrate tolerance %d too small for bitrate %d, overriding\n", avctx->bit_rate_tolerance, avctx->bit_rate);
        avctx->bit_rate_tolerance = 5 * avctx->bit_rate * av_q2d(avctx->time_base);
B
Benoit Fouet 已提交
427 428
    }

A
Aneesh Dogra 已提交
429 430
    if (s->avctx->rc_max_rate &&
        s->avctx->rc_min_rate == s->avctx->rc_max_rate &&
431 432
        (s->codec_id == AV_CODEC_ID_MPEG1VIDEO ||
         s->codec_id == AV_CODEC_ID_MPEG2VIDEO) &&
A
Aneesh Dogra 已提交
433 434 435 436 437
        90000LL * (avctx->rc_buffer_size - 1) >
            s->avctx->rc_max_rate * 0xFFFFLL) {
        av_log(avctx, AV_LOG_INFO,
               "Warning vbv_delay will be set to 0xFFFF (=VBR) as the "
               "specified vbv buffer is too large for the given bitrate!\n");
B
Benoit Fouet 已提交
438 439
    }

440 441 442
    if ((s->flags & CODEC_FLAG_4MV)  && s->codec_id != AV_CODEC_ID_MPEG4 &&
        s->codec_id != AV_CODEC_ID_H263 && s->codec_id != AV_CODEC_ID_H263P &&
        s->codec_id != AV_CODEC_ID_FLV1) {
B
Benoit Fouet 已提交
443 444 445 446
        av_log(avctx, AV_LOG_ERROR, "4MV not supported by codec\n");
        return -1;
    }

A
Aneesh Dogra 已提交
447 448 449
    if (s->obmc && s->avctx->mb_decision != FF_MB_DECISION_SIMPLE) {
        av_log(avctx, AV_LOG_ERROR,
               "OBMC is only supported with simple mb decision\n");
B
Benoit Fouet 已提交
450 451 452
        return -1;
    }

453
    if (s->quarter_sample && s->codec_id != AV_CODEC_ID_MPEG4) {
B
Benoit Fouet 已提交
454 455 456 457
        av_log(avctx, AV_LOG_ERROR, "qpel not supported by codec\n");
        return -1;
    }

A
Aneesh Dogra 已提交
458
    if (s->max_b_frames                    &&
459 460 461
        s->codec_id != AV_CODEC_ID_MPEG4      &&
        s->codec_id != AV_CODEC_ID_MPEG1VIDEO &&
        s->codec_id != AV_CODEC_ID_MPEG2VIDEO) {
B
Benoit Fouet 已提交
462 463 464
        av_log(avctx, AV_LOG_ERROR, "b frames not supported by codec\n");
        return -1;
    }
465 466
    if (s->max_b_frames < 0) {
        av_log(avctx, AV_LOG_ERROR,
S
Stefano Sabatini 已提交
467
               "max b frames must be 0 or positive for mpegvideo based encoders\n");
468 469
        return -1;
    }
B
Benoit Fouet 已提交
470

471 472 473
    if ((s->codec_id == AV_CODEC_ID_MPEG4 ||
         s->codec_id == AV_CODEC_ID_H263  ||
         s->codec_id == AV_CODEC_ID_H263P) &&
A
Aneesh Dogra 已提交
474 475
        (avctx->sample_aspect_ratio.num > 255 ||
         avctx->sample_aspect_ratio.den > 255)) {
476 477
        av_log(avctx, AV_LOG_WARNING,
               "Invalid pixel aspect ratio %i/%i, limit is 255/255 reducing\n",
478
               avctx->sample_aspect_ratio.num, avctx->sample_aspect_ratio.den);
479 480
        av_reduce(&avctx->sample_aspect_ratio.num, &avctx->sample_aspect_ratio.den,
                   avctx->sample_aspect_ratio.num,  avctx->sample_aspect_ratio.den, 255);
481 482
    }

483 484
    if ((s->codec_id == AV_CODEC_ID_H263  ||
         s->codec_id == AV_CODEC_ID_H263P) &&
485 486 487 488 489
        (avctx->width  > 2048 ||
         avctx->height > 1152 )) {
        av_log(avctx, AV_LOG_ERROR, "H.263 does not support resolutions above 2048x1152\n");
        return -1;
    }
490 491
    if ((s->codec_id == AV_CODEC_ID_H263  ||
         s->codec_id == AV_CODEC_ID_H263P) &&
492 493 494 495 496
        ((avctx->width &3) ||
         (avctx->height&3) )) {
        av_log(avctx, AV_LOG_ERROR, "w/h must be a multiple of 4\n");
        return -1;
    }
497

498
    if (s->codec_id == AV_CODEC_ID_MPEG1VIDEO &&
499 500 501 502 503 504
        (avctx->width  > 4095 ||
         avctx->height > 4095 )) {
        av_log(avctx, AV_LOG_ERROR, "MPEG-1 does not support resolutions above 4095x4095\n");
        return -1;
    }

505
    if (s->codec_id == AV_CODEC_ID_MPEG2VIDEO &&
506 507 508 509 510
        (avctx->width  > 16383 ||
         avctx->height > 16383 )) {
        av_log(avctx, AV_LOG_ERROR, "MPEG-2 does not support resolutions above 16383x16383\n");
        return -1;
    }
511

512 513 514 515 516 517 518
    if (s->codec_id == AV_CODEC_ID_RV10 &&
        (avctx->width &15 ||
         avctx->height&15 )) {
        av_log(avctx, AV_LOG_ERROR, "width and height must be a multiple of 16\n");
        return AVERROR(EINVAL);
    }

519 520 521 522 523 524 525
    if (s->codec_id == AV_CODEC_ID_RV20 &&
        (avctx->width &3 ||
         avctx->height&3 )) {
        av_log(avctx, AV_LOG_ERROR, "width and height must be a multiple of 4\n");
        return AVERROR(EINVAL);
    }

526 527
    if ((s->codec_id == AV_CODEC_ID_WMV1 ||
         s->codec_id == AV_CODEC_ID_WMV2) &&
528 529 530 531 532
         avctx->width & 1) {
         av_log(avctx, AV_LOG_ERROR, "width must be multiple of 2\n");
         return -1;
    }

533
    if ((s->flags & (CODEC_FLAG_INTERLACED_DCT | CODEC_FLAG_INTERLACED_ME)) &&
534
        s->codec_id != AV_CODEC_ID_MPEG4 && s->codec_id != AV_CODEC_ID_MPEG2VIDEO) {
B
Benoit Fouet 已提交
535 536 537 538
        av_log(avctx, AV_LOG_ERROR, "interlacing not supported by codec\n");
        return -1;
    }

A
Aneesh Dogra 已提交
539
    // FIXME mpeg2 uses that too
540 541
    if (s->mpeg_quant && (   s->codec_id != AV_CODEC_ID_MPEG4
                          && s->codec_id != AV_CODEC_ID_MPEG2VIDEO)) {
A
Aneesh Dogra 已提交
542 543
        av_log(avctx, AV_LOG_ERROR,
               "mpeg2 style quantization not supported by codec\n");
B
Benoit Fouet 已提交
544 545 546
        return -1;
    }

547
    if ((s->mpv_flags & FF_MPV_FLAG_CBP_RD) && !avctx->trellis) {
B
Benoit Fouet 已提交
548 549 550 551
        av_log(avctx, AV_LOG_ERROR, "CBP RD needs trellis quant\n");
        return -1;
    }

552
    if ((s->mpv_flags & FF_MPV_FLAG_QP_RD) &&
A
Aneesh Dogra 已提交
553
        s->avctx->mb_decision != FF_MB_DECISION_RD) {
B
Benoit Fouet 已提交
554 555 556 557
        av_log(avctx, AV_LOG_ERROR, "QP RD needs mbd=2\n");
        return -1;
    }

A
Aneesh Dogra 已提交
558 559 560 561 562
    if (s->avctx->scenechange_threshold < 1000000000 &&
        (s->flags & CODEC_FLAG_CLOSED_GOP)) {
        av_log(avctx, AV_LOG_ERROR,
               "closed gop with scene change detection are not supported yet, "
               "set threshold to 1000000000\n");
B
Benoit Fouet 已提交
563 564 565
        return -1;
    }

A
Aneesh Dogra 已提交
566
    if (s->flags & CODEC_FLAG_LOW_DELAY) {
567
        if (s->codec_id != AV_CODEC_ID_MPEG2VIDEO) {
A
Aneesh Dogra 已提交
568 569
            av_log(avctx, AV_LOG_ERROR,
                  "low delay forcing is only available for mpeg2\n");
B
Benoit Fouet 已提交
570 571
            return -1;
        }
A
Aneesh Dogra 已提交
572 573 574
        if (s->max_b_frames != 0) {
            av_log(avctx, AV_LOG_ERROR,
                   "b frames cannot be used with low delay\n");
B
Benoit Fouet 已提交
575 576 577 578
            return -1;
        }
    }

A
Aneesh Dogra 已提交
579 580 581 582
    if (s->q_scale_type == 1) {
        if (avctx->qmax > 12) {
            av_log(avctx, AV_LOG_ERROR,
                   "non linear quant only supports qmax <= 12 currently\n");
B
Benoit Fouet 已提交
583 584 585 586
            return -1;
        }
    }

A
Aneesh Dogra 已提交
587
    if (s->avctx->thread_count > 1         &&
588 589 590
        s->codec_id != AV_CODEC_ID_MPEG4      &&
        s->codec_id != AV_CODEC_ID_MPEG1VIDEO &&
        s->codec_id != AV_CODEC_ID_MPEG2VIDEO &&
591
        s->codec_id != AV_CODEC_ID_MJPEG      &&
592
        (s->codec_id != AV_CODEC_ID_H263P)) {
A
Aneesh Dogra 已提交
593 594
        av_log(avctx, AV_LOG_ERROR,
               "multi threaded encoding not supported by codec\n");
B
Benoit Fouet 已提交
595 596 597
        return -1;
    }

A
Aneesh Dogra 已提交
598
    if (s->avctx->thread_count < 1) {
599
        av_log(avctx, AV_LOG_ERROR,
600
               "automatic thread number detection not supported by codec, "
A
Aneesh Dogra 已提交
601
               "patch welcome\n");
602
        return -1;
M
Michael Niedermayer 已提交
603 604
    }

605
    if (s->avctx->slices > 1 || s->avctx->thread_count > 1)
A
Aneesh Dogra 已提交
606
        s->rtp_mode = 1;
B
Benoit Fouet 已提交
607

608 609 610
    if (s->avctx->thread_count > 1 && s->codec_id == AV_CODEC_ID_H263P)
        s->h263_slice_structured = 1;

A
Aneesh Dogra 已提交
611
    if (!avctx->time_base.den || !avctx->time_base.num) {
B
Benoit Fouet 已提交
612 613 614 615
        av_log(avctx, AV_LOG_ERROR, "framerate not set\n");
        return -1;
    }

A
Aneesh Dogra 已提交
616 617 618 619
    i = (INT_MAX / 2 + 128) >> 8;
    if (avctx->mb_threshold >= i) {
        av_log(avctx, AV_LOG_ERROR, "mb_threshold too large, max is %d\n",
               i - 1);
B
Benoit Fouet 已提交
620 621 622
        return -1;
    }

A
Aneesh Dogra 已提交
623 624 625
    if (avctx->b_frame_strategy && (avctx->flags & CODEC_FLAG_PASS2)) {
        av_log(avctx, AV_LOG_INFO,
               "notice: b_frame_strategy only affects the first pass\n");
B
Benoit Fouet 已提交
626 627 628
        avctx->b_frame_strategy = 0;
    }

A
Aneesh Dogra 已提交
629 630
    i = av_gcd(avctx->time_base.den, avctx->time_base.num);
    if (i > 1) {
B
Benoit Fouet 已提交
631 632 633
        av_log(avctx, AV_LOG_INFO, "removing common factors from framerate\n");
        avctx->time_base.den /= i;
        avctx->time_base.num /= i;
A
Aneesh Dogra 已提交
634
        //return -1;
B
Benoit Fouet 已提交
635 636
    }

637
    if (s->mpeg_quant || s->codec_id == AV_CODEC_ID_MPEG1VIDEO || s->codec_id == AV_CODEC_ID_MPEG2VIDEO || s->codec_id == AV_CODEC_ID_MJPEG || s->codec_id==AV_CODEC_ID_AMV) {
A
Aneesh Dogra 已提交
638 639 640 641 642 643 644
        // (a + x * 3 / 8) / x
        s->intra_quant_bias = 3 << (QUANT_BIAS_SHIFT - 3);
        s->inter_quant_bias = 0;
    } else {
        s->intra_quant_bias = 0;
        // (a - x / 4) / x
        s->inter_quant_bias = -(1 << (QUANT_BIAS_SHIFT - 2));
B
Benoit Fouet 已提交
645 646
    }

647 648 649 650 651
    if (avctx->qmin > avctx->qmax || avctx->qmin <= 0) {
        av_log(avctx, AV_LOG_ERROR, "qmin and or qmax are invalid, they must be 0 < min <= max\n");
        return AVERROR(EINVAL);
    }

A
Aneesh Dogra 已提交
652 653 654 655
    if (avctx->intra_quant_bias != FF_DEFAULT_QUANT_BIAS)
        s->intra_quant_bias = avctx->intra_quant_bias;
    if (avctx->inter_quant_bias != FF_DEFAULT_QUANT_BIAS)
        s->inter_quant_bias = avctx->inter_quant_bias;
B
Benoit Fouet 已提交
656

M
Michael Niedermayer 已提交
657 658
    av_log(avctx, AV_LOG_DEBUG, "intra_quant_bias = %d inter_quant_bias = %d\n",s->intra_quant_bias,s->inter_quant_bias);

659
    if (avctx->codec_id == AV_CODEC_ID_MPEG4 &&
A
Aneesh Dogra 已提交
660 661 662 663 664 665
        s->avctx->time_base.den > (1 << 16) - 1) {
        av_log(avctx, AV_LOG_ERROR,
               "timebase %d/%d not supported by MPEG 4 standard, "
               "the maximum admitted value for the timebase denominator "
               "is %d\n", s->avctx->time_base.num, s->avctx->time_base.den,
               (1 << 16) - 1);
B
Benoit Fouet 已提交
666 667 668 669
        return -1;
    }
    s->time_increment_bits = av_log2(s->avctx->time_base.den - 1) + 1;

A
Aneesh Dogra 已提交
670
    switch (avctx->codec->id) {
671
    case AV_CODEC_ID_MPEG1VIDEO:
B
Benoit Fouet 已提交
672
        s->out_format = FMT_MPEG1;
A
Aneesh Dogra 已提交
673 674
        s->low_delay  = !!(s->flags & CODEC_FLAG_LOW_DELAY);
        avctx->delay  = s->low_delay ? 0 : (s->max_b_frames + 1);
B
Benoit Fouet 已提交
675
        break;
676
    case AV_CODEC_ID_MPEG2VIDEO:
B
Benoit Fouet 已提交
677
        s->out_format = FMT_MPEG1;
A
Aneesh Dogra 已提交
678 679 680
        s->low_delay  = !!(s->flags & CODEC_FLAG_LOW_DELAY);
        avctx->delay  = s->low_delay ? 0 : (s->max_b_frames + 1);
        s->rtp_mode   = 1;
B
Benoit Fouet 已提交
681
        break;
682
    case AV_CODEC_ID_MJPEG:
683
    case AV_CODEC_ID_AMV:
B
Benoit Fouet 已提交
684 685
        s->out_format = FMT_MJPEG;
        s->intra_only = 1; /* force intra only for jpeg */
A
Anton Khirnov 已提交
686
        if (!CONFIG_MJPEG_ENCODER ||
A
Aneesh Dogra 已提交
687
            ff_mjpeg_encode_init(s) < 0)
B
Benoit Fouet 已提交
688
            return -1;
A
Aneesh Dogra 已提交
689 690
        avctx->delay = 0;
        s->low_delay = 1;
B
Benoit Fouet 已提交
691
        break;
692
    case AV_CODEC_ID_H261:
A
Aneesh Dogra 已提交
693 694
        if (!CONFIG_H261_ENCODER)
            return -1;
B
Benoit Fouet 已提交
695
        if (ff_h261_get_picture_format(s->width, s->height) < 0) {
A
Aneesh Dogra 已提交
696 697 698 699
            av_log(avctx, AV_LOG_ERROR,
                   "The specified picture size of %dx%d is not valid for the "
                   "H.261 codec.\nValid sizes are 176x144, 352x288\n",
                    s->width, s->height);
B
Benoit Fouet 已提交
700 701 702
            return -1;
        }
        s->out_format = FMT_H261;
A
Aneesh Dogra 已提交
703 704
        avctx->delay  = 0;
        s->low_delay  = 1;
B
Benoit Fouet 已提交
705
        break;
706
    case AV_CODEC_ID_H263:
A
Aneesh Dogra 已提交
707
        if (!CONFIG_H263_ENCODER)
708
            return -1;
709
        if (ff_match_2uint16(ff_h263_format, FF_ARRAY_ELEMS(ff_h263_format),
A
Aneesh Dogra 已提交
710
                             s->width, s->height) == 8) {
711
            av_log(avctx, AV_LOG_ERROR,
A
Aneesh Dogra 已提交
712 713
                   "The specified picture size of %dx%d is not valid for "
                   "the H.263 codec.\nValid sizes are 128x96, 176x144, "
714
                   "352x288, 704x576, and 1408x1152. "
A
Aneesh Dogra 已提交
715
                   "Try H.263+.\n", s->width, s->height);
B
Benoit Fouet 已提交
716 717 718
            return -1;
        }
        s->out_format = FMT_H263;
A
Aneesh Dogra 已提交
719 720
        avctx->delay  = 0;
        s->low_delay  = 1;
B
Benoit Fouet 已提交
721
        break;
722
    case AV_CODEC_ID_H263P:
B
Benoit Fouet 已提交
723
        s->out_format = FMT_H263;
A
Aneesh Dogra 已提交
724
        s->h263_plus  = 1;
B
Benoit Fouet 已提交
725
        /* Fx */
A
Aneesh Dogra 已提交
726 727 728 729
        s->h263_aic        = (avctx->flags & CODEC_FLAG_AC_PRED) ? 1 : 0;
        s->modified_quant  = s->h263_aic;
        s->loop_filter     = (avctx->flags & CODEC_FLAG_LOOP_FILTER) ? 1 : 0;
        s->unrestricted_mv = s->obmc || s->loop_filter || s->umvplus;
B
Benoit Fouet 已提交
730 731 732

        /* /Fx */
        /* These are just to be sure */
A
Aneesh Dogra 已提交
733 734
        avctx->delay = 0;
        s->low_delay = 1;
B
Benoit Fouet 已提交
735
        break;
736
    case AV_CODEC_ID_FLV1:
A
Aneesh Dogra 已提交
737 738
        s->out_format      = FMT_H263;
        s->h263_flv        = 2; /* format = 1; 11-bit codes */
B
Benoit Fouet 已提交
739
        s->unrestricted_mv = 1;
A
Aneesh Dogra 已提交
740 741 742
        s->rtp_mode  = 0; /* don't allow GOB */
        avctx->delay = 0;
        s->low_delay = 1;
B
Benoit Fouet 已提交
743
        break;
744
    case AV_CODEC_ID_RV10:
B
Benoit Fouet 已提交
745
        s->out_format = FMT_H263;
A
Aneesh Dogra 已提交
746 747
        avctx->delay  = 0;
        s->low_delay  = 1;
B
Benoit Fouet 已提交
748
        break;
749
    case AV_CODEC_ID_RV20:
A
Aneesh Dogra 已提交
750 751 752 753 754 755 756 757
        s->out_format      = FMT_H263;
        avctx->delay       = 0;
        s->low_delay       = 1;
        s->modified_quant  = 1;
        s->h263_aic        = 1;
        s->h263_plus       = 1;
        s->loop_filter     = 1;
        s->unrestricted_mv = 0;
B
Benoit Fouet 已提交
758
        break;
759
    case AV_CODEC_ID_MPEG4:
A
Aneesh Dogra 已提交
760 761
        s->out_format      = FMT_H263;
        s->h263_pred       = 1;
B
Benoit Fouet 已提交
762
        s->unrestricted_mv = 1;
A
Aneesh Dogra 已提交
763 764
        s->low_delay       = s->max_b_frames ? 0 : 1;
        avctx->delay       = s->low_delay ? 0 : (s->max_b_frames + 1);
B
Benoit Fouet 已提交
765
        break;
766
    case AV_CODEC_ID_MSMPEG4V2:
A
Aneesh Dogra 已提交
767 768
        s->out_format      = FMT_H263;
        s->h263_pred       = 1;
B
Benoit Fouet 已提交
769
        s->unrestricted_mv = 1;
A
Aneesh Dogra 已提交
770 771 772
        s->msmpeg4_version = 2;
        avctx->delay       = 0;
        s->low_delay       = 1;
B
Benoit Fouet 已提交
773
        break;
774
    case AV_CODEC_ID_MSMPEG4V3:
A
Aneesh Dogra 已提交
775 776 777 778 779 780 781
        s->out_format        = FMT_H263;
        s->h263_pred         = 1;
        s->unrestricted_mv   = 1;
        s->msmpeg4_version   = 3;
        s->flipflop_rounding = 1;
        avctx->delay         = 0;
        s->low_delay         = 1;
B
Benoit Fouet 已提交
782
        break;
783
    case AV_CODEC_ID_WMV1:
A
Aneesh Dogra 已提交
784 785 786 787 788 789 790
        s->out_format        = FMT_H263;
        s->h263_pred         = 1;
        s->unrestricted_mv   = 1;
        s->msmpeg4_version   = 4;
        s->flipflop_rounding = 1;
        avctx->delay         = 0;
        s->low_delay         = 1;
B
Benoit Fouet 已提交
791
        break;
792
    case AV_CODEC_ID_WMV2:
A
Aneesh Dogra 已提交
793 794 795 796 797 798 799
        s->out_format        = FMT_H263;
        s->h263_pred         = 1;
        s->unrestricted_mv   = 1;
        s->msmpeg4_version   = 5;
        s->flipflop_rounding = 1;
        avctx->delay         = 0;
        s->low_delay         = 1;
B
Benoit Fouet 已提交
800 801 802 803 804
        break;
    default:
        return -1;
    }

A
Aneesh Dogra 已提交
805
    avctx->has_b_frames = !s->low_delay;
B
Benoit Fouet 已提交
806 807 808

    s->encoding = 1;

A
Aneesh Dogra 已提交
809 810
    s->progressive_frame    =
    s->progressive_sequence = !(avctx->flags & (CODEC_FLAG_INTERLACED_DCT |
811 812
                                                CODEC_FLAG_INTERLACED_ME) ||
                                s->alternate_scan);
813

B
Benoit Fouet 已提交
814
    /* init */
815
    if (ff_MPV_common_init(s) < 0)
B
Benoit Fouet 已提交
816 817
        return -1;

818 819
    ff_qpeldsp_init(&s->qdsp);

820
    s->avctx->coded_frame = s->current_picture.f;
821 822 823 824 825 826 827 828 829

    if (s->msmpeg4_version) {
        FF_ALLOCZ_OR_GOTO(s->avctx, s->ac_stats,
                          2 * 2 * (MAX_LEVEL + 1) *
                          (MAX_RUN + 1) * 2 * sizeof(int), fail);
    }
    FF_ALLOCZ_OR_GOTO(s->avctx, s->avctx->stats_out, 256, fail);

    FF_ALLOCZ_OR_GOTO(s->avctx, s->q_intra_matrix,   64 * 32 * sizeof(int), fail);
830
    FF_ALLOCZ_OR_GOTO(s->avctx, s->q_chroma_intra_matrix, 64 * 32 * sizeof(int), fail);
831 832
    FF_ALLOCZ_OR_GOTO(s->avctx, s->q_inter_matrix,   64 * 32 * sizeof(int), fail);
    FF_ALLOCZ_OR_GOTO(s->avctx, s->q_intra_matrix16, 64 * 32 * 2 * sizeof(uint16_t), fail);
833
    FF_ALLOCZ_OR_GOTO(s->avctx, s->q_chroma_intra_matrix16, 64 * 32 * 2 * sizeof(uint16_t), fail);
834 835 836 837 838 839 840 841 842 843 844
    FF_ALLOCZ_OR_GOTO(s->avctx, s->q_inter_matrix16, 64 * 32 * 2 * sizeof(uint16_t), fail);
    FF_ALLOCZ_OR_GOTO(s->avctx, s->input_picture,
                      MAX_PICTURE_COUNT * sizeof(Picture *), fail);
    FF_ALLOCZ_OR_GOTO(s->avctx, s->reordered_input_picture,
                      MAX_PICTURE_COUNT * sizeof(Picture *), fail);

    if (s->avctx->noise_reduction) {
        FF_ALLOCZ_OR_GOTO(s->avctx, s->dct_offset,
                          2 * 64 * sizeof(uint16_t), fail);
    }

845
    ff_dct_encode_init(s);
846

A
Aneesh Dogra 已提交
847 848
    if ((CONFIG_H263P_ENCODER || CONFIG_RV20_ENCODER) && s->modified_quant)
        s->chroma_qscale_table = ff_h263_chroma_qscale_table;
849

A
Aneesh Dogra 已提交
850
    s->quant_precision = 5;
B
Benoit Fouet 已提交
851 852 853 854

    ff_set_cmp(&s->dsp, s->dsp.ildct_cmp, s->avctx->ildct_cmp);
    ff_set_cmp(&s->dsp, s->dsp.frame_skip_cmp, s->avctx->frame_skip_cmp);

855
    if (CONFIG_H261_ENCODER && s->out_format == FMT_H261)
B
Benoit Fouet 已提交
856
        ff_h261_encode_init(s);
857
    if (CONFIG_H263_ENCODER && s->out_format == FMT_H263)
858
        ff_h263_encode_init(s);
859
    if (CONFIG_MSMPEG4_ENCODER && s->msmpeg4_version)
B
Benoit Fouet 已提交
860
        ff_msmpeg4_encode_init(s);
861
    if ((CONFIG_MPEG1VIDEO_ENCODER || CONFIG_MPEG2VIDEO_ENCODER)
862
        && s->out_format == FMT_MPEG1)
B
Benoit Fouet 已提交
863 864 865
        ff_mpeg1_encode_init(s);

    /* init q matrix */
A
Aneesh Dogra 已提交
866 867
    for (i = 0; i < 64; i++) {
        int j = s->dsp.idct_permutation[i];
868
        if (CONFIG_MPEG4_ENCODER && s->codec_id == AV_CODEC_ID_MPEG4 &&
A
Aneesh Dogra 已提交
869
            s->mpeg_quant) {
B
Benoit Fouet 已提交
870 871
            s->intra_matrix[j] = ff_mpeg4_default_intra_matrix[i];
            s->inter_matrix[j] = ff_mpeg4_default_non_intra_matrix[i];
A
Aneesh Dogra 已提交
872
        } else if (s->out_format == FMT_H263 || s->out_format == FMT_H261) {
B
Benoit Fouet 已提交
873 874
            s->intra_matrix[j] =
            s->inter_matrix[j] = ff_mpeg1_default_non_intra_matrix[i];
A
Aneesh Dogra 已提交
875 876
        } else {
            /* mpeg1/2 */
B
Benoit Fouet 已提交
877 878 879
            s->intra_matrix[j] = ff_mpeg1_default_intra_matrix[i];
            s->inter_matrix[j] = ff_mpeg1_default_non_intra_matrix[i];
        }
A
Aneesh Dogra 已提交
880
        if (s->avctx->intra_matrix)
B
Benoit Fouet 已提交
881
            s->intra_matrix[j] = s->avctx->intra_matrix[i];
A
Aneesh Dogra 已提交
882
        if (s->avctx->inter_matrix)
B
Benoit Fouet 已提交
883 884 885 886 887 888
            s->inter_matrix[j] = s->avctx->inter_matrix[i];
    }

    /* precompute matrix */
    /* for mjpeg, we do include qscale in the matrix */
    if (s->out_format != FMT_MJPEG) {
889
        ff_convert_matrix(&s->dsp, s->q_intra_matrix, s->q_intra_matrix16,
A
Aneesh Dogra 已提交
890 891
                          s->intra_matrix, s->intra_quant_bias, avctx->qmin,
                          31, 1);
892
        ff_convert_matrix(&s->dsp, s->q_inter_matrix, s->q_inter_matrix16,
A
Aneesh Dogra 已提交
893 894
                          s->inter_matrix, s->inter_quant_bias, avctx->qmin,
                          31, 0);
B
Benoit Fouet 已提交
895 896
    }

A
Aneesh Dogra 已提交
897
    if (ff_rate_control_init(s) < 0)
B
Benoit Fouet 已提交
898 899
        return -1;

900 901 902 903 904 905 906
#if FF_API_ERROR_RATE
    FF_DISABLE_DEPRECATION_WARNINGS
    if (avctx->error_rate)
        s->error_rate = avctx->error_rate;
    FF_ENABLE_DEPRECATION_WARNINGS;
#endif

907 908 909 910 911 912 913
#if FF_API_NORMALIZE_AQP
    FF_DISABLE_DEPRECATION_WARNINGS
    if (avctx->flags & CODEC_FLAG_NORMALIZE_AQP)
        s->mpv_flags |= FF_MPV_FLAG_NAQ;
    FF_ENABLE_DEPRECATION_WARNINGS;
#endif

914 915 916 917 918 919 920
#if FF_API_MV0
    FF_DISABLE_DEPRECATION_WARNINGS
    if (avctx->flags & CODEC_FLAG_MV0)
        s->mpv_flags |= FF_MPV_FLAG_MV0;
    FF_ENABLE_DEPRECATION_WARNINGS
#endif

921 922 923 924 925 926 927 928 929 930 931 932 933 934 935 936
    if (avctx->b_frame_strategy == 2) {
        for (i = 0; i < s->max_b_frames + 2; i++) {
            s->tmp_frames[i] = av_frame_alloc();
            if (!s->tmp_frames[i])
                return AVERROR(ENOMEM);

            s->tmp_frames[i]->format = AV_PIX_FMT_YUV420P;
            s->tmp_frames[i]->width  = s->width  >> avctx->brd_scale;
            s->tmp_frames[i]->height = s->height >> avctx->brd_scale;

            ret = av_frame_get_buffer(s->tmp_frames[i], 32);
            if (ret < 0)
                return ret;
        }
    }

B
Benoit Fouet 已提交
937
    return 0;
938 939 940
fail:
    ff_MPV_encode_end(avctx);
    return AVERROR_UNKNOWN;
B
Benoit Fouet 已提交
941 942
}

943
av_cold int ff_MPV_encode_end(AVCodecContext *avctx)
B
Benoit Fouet 已提交
944 945
{
    MpegEncContext *s = avctx->priv_data;
946
    int i;
B
Benoit Fouet 已提交
947 948 949

    ff_rate_control_uninit(s);

950
    ff_MPV_common_end(s);
A
Anton Khirnov 已提交
951
    if (CONFIG_MJPEG_ENCODER &&
A
Aneesh Dogra 已提交
952
        s->out_format == FMT_MJPEG)
B
Benoit Fouet 已提交
953 954 955 956
        ff_mjpeg_encode_close(s);

    av_freep(&avctx->extradata);

957 958 959
    for (i = 0; i < FF_ARRAY_ELEMS(s->tmp_frames); i++)
        av_frame_free(&s->tmp_frames[i]);

960 961 962 963 964 965
    ff_free_picture_tables(&s->new_picture);
    ff_mpeg_unref_picture(s, &s->new_picture);

    av_freep(&s->avctx->stats_out);
    av_freep(&s->ac_stats);

966 967 968 969
    if(s->q_chroma_intra_matrix   != s->q_intra_matrix  ) av_freep(&s->q_chroma_intra_matrix);
    if(s->q_chroma_intra_matrix16 != s->q_intra_matrix16) av_freep(&s->q_chroma_intra_matrix16);
    s->q_chroma_intra_matrix=   NULL;
    s->q_chroma_intra_matrix16= NULL;
970 971 972 973 974 975 976 977
    av_freep(&s->q_intra_matrix);
    av_freep(&s->q_inter_matrix);
    av_freep(&s->q_intra_matrix16);
    av_freep(&s->q_inter_matrix16);
    av_freep(&s->input_picture);
    av_freep(&s->reordered_input_picture);
    av_freep(&s->dct_offset);

B
Benoit Fouet 已提交
978 979 980
    return 0;
}

A
Aneesh Dogra 已提交
981 982
static int get_sae(uint8_t *src, int ref, int stride)
{
B
Benoit Fouet 已提交
983
    int x,y;
A
Aneesh Dogra 已提交
984
    int acc = 0;
B
Benoit Fouet 已提交
985

A
Aneesh Dogra 已提交
986 987 988
    for (y = 0; y < 16; y++) {
        for (x = 0; x < 16; x++) {
            acc += FFABS(src[x + y * stride] - ref);
B
Benoit Fouet 已提交
989 990 991 992 993 994
        }
    }

    return acc;
}

A
Aneesh Dogra 已提交
995 996 997
static int get_intra_count(MpegEncContext *s, uint8_t *src,
                           uint8_t *ref, int stride)
{
B
Benoit Fouet 已提交
998
    int x, y, w, h;
A
Aneesh Dogra 已提交
999
    int acc = 0;
B
Benoit Fouet 已提交
1000

A
Aneesh Dogra 已提交
1001 1002
    w = s->width  & ~15;
    h = s->height & ~15;
B
Benoit Fouet 已提交
1003

A
Aneesh Dogra 已提交
1004 1005 1006 1007 1008 1009 1010
    for (y = 0; y < h; y += 16) {
        for (x = 0; x < w; x += 16) {
            int offset = x + y * stride;
            int sad  = s->dsp.sad[0](NULL, src + offset, ref + offset, stride,
                                     16);
            int mean = (s->dsp.pix_sum(src + offset, stride) + 128) >> 8;
            int sae  = get_sae(src + offset, mean, stride);
B
Benoit Fouet 已提交
1011

A
Aneesh Dogra 已提交
1012
            acc += sae + 500 < sad;
B
Benoit Fouet 已提交
1013 1014 1015 1016 1017 1018
        }
    }
    return acc;
}


1019
static int load_input_picture(MpegEncContext *s, const AVFrame *pic_arg)
A
Aneesh Dogra 已提交
1020
{
1021
    Picture *pic = NULL;
B
Benoit Fouet 已提交
1022
    int64_t pts;
1023
    int i, display_picture_number = 0, ret;
1024 1025
    const int encoding_delay = s->max_b_frames ? s->max_b_frames :
                                                 (s->low_delay ? 0 : 1);
A
Aneesh Dogra 已提交
1026 1027 1028 1029
    int direct = 1;

    if (pic_arg) {
        pts = pic_arg->pts;
1030
        display_picture_number = s->input_picture_number++;
A
Aneesh Dogra 已提交
1031 1032 1033 1034 1035

        if (pts != AV_NOPTS_VALUE) {
            if (s->user_specified_pts != AV_NOPTS_VALUE) {
                int64_t last = s->user_specified_pts;

1036
                if (pts <= last) {
A
Aneesh Dogra 已提交
1037
                    av_log(s->avctx, AV_LOG_ERROR,
1038 1039 1040
                           "Invalid pts (%"PRId64") <= last (%"PRId64")\n",
                           pts, last);
                    return AVERROR(EINVAL);
B
Benoit Fouet 已提交
1041
                }
1042

1043
                if (!s->low_delay && display_picture_number == 1)
1044
                    s->dts_delta = pts - last;
B
Benoit Fouet 已提交
1045
            }
A
Aneesh Dogra 已提交
1046 1047 1048 1049 1050 1051 1052 1053 1054
            s->user_specified_pts = pts;
        } else {
            if (s->user_specified_pts != AV_NOPTS_VALUE) {
                s->user_specified_pts =
                pts = s->user_specified_pts + 1;
                av_log(s->avctx, AV_LOG_INFO,
                       "Warning: AVFrame.pts=? trying to guess (%"PRId64")\n",
                       pts);
            } else {
1055
                pts = display_picture_number;
B
Benoit Fouet 已提交
1056 1057 1058 1059
            }
        }
    }

1060
    if (pic_arg) {
1061
        if (!pic_arg->buf[0])
1062 1063 1064 1065 1066 1067 1068
            direct = 0;
        if (pic_arg->linesize[0] != s->linesize)
            direct = 0;
        if (pic_arg->linesize[1] != s->uvlinesize)
            direct = 0;
        if (pic_arg->linesize[2] != s->uvlinesize)
            direct = 0;
1069 1070
        if ((s->width & 15) || (s->height & 15))
            direct = 0;
1071 1072 1073 1074
        if (((intptr_t)(pic_arg->data[0])) & (STRIDE_ALIGN-1))
            direct = 0;
        if (s->linesize & (STRIDE_ALIGN-1))
            direct = 0;
1075

1076
        av_dlog(s->avctx, "%d %d %"PTRDIFF_SPECIFIER" %"PTRDIFF_SPECIFIER"\n", pic_arg->linesize[0],
1077 1078 1079 1080 1081 1082 1083
                pic_arg->linesize[1], s->linesize, s->uvlinesize);

        if (direct) {
            i = ff_find_unused_picture(s, 1);
            if (i < 0)
                return i;

1084
            pic = &s->picture[i];
1085 1086
            pic->reference = 3;

1087
            if ((ret = av_frame_ref(pic->f, pic_arg)) < 0)
1088 1089
                return ret;
            if (ff_alloc_picture(s, pic, 1) < 0) {
1090 1091 1092 1093 1094 1095
                return -1;
            }
        } else {
            i = ff_find_unused_picture(s, 0);
            if (i < 0)
                return i;
B
Benoit Fouet 已提交
1096

1097
            pic = &s->picture[i];
1098
            pic->reference = 3;
B
Benoit Fouet 已提交
1099

1100
            if (ff_alloc_picture(s, pic, 0) < 0) {
1101 1102
                return -1;
            }
1103

1104 1105 1106
            if (pic->f->data[0] + INPLACE_OFFSET == pic_arg->data[0] &&
                pic->f->data[1] + INPLACE_OFFSET == pic_arg->data[1] &&
                pic->f->data[2] + INPLACE_OFFSET == pic_arg->data[2]) {
1107 1108 1109 1110 1111 1112 1113 1114 1115 1116 1117 1118 1119 1120 1121
                // empty
            } else {
                int h_chroma_shift, v_chroma_shift;
                av_pix_fmt_get_chroma_sub_sample(s->avctx->pix_fmt,
                                                 &h_chroma_shift,
                                                 &v_chroma_shift);

                for (i = 0; i < 3; i++) {
                    int src_stride = pic_arg->linesize[i];
                    int dst_stride = i ? s->uvlinesize : s->linesize;
                    int h_shift = i ? h_chroma_shift : 0;
                    int v_shift = i ? v_chroma_shift : 0;
                    int w = s->width  >> h_shift;
                    int h = s->height >> v_shift;
                    uint8_t *src = pic_arg->data[i];
1122
                    uint8_t *dst = pic->f->data[i];
1123 1124 1125 1126 1127
                    int vpad = 16;

                    if (   s->codec_id == AV_CODEC_ID_MPEG2VIDEO
                        && !s->progressive_sequence)
                        vpad = 32;
1128 1129 1130 1131 1132 1133 1134

                    if (!s->avctx->rc_buffer_size)
                        dst += INPLACE_OFFSET;

                    if (src_stride == dst_stride)
                        memcpy(dst, src, src_stride * h);
                    else {
1135 1136 1137 1138 1139
                        int h2 = h;
                        uint8_t *dst2 = dst;
                        while (h2--) {
                            memcpy(dst2, src, w);
                            dst2 += dst_stride;
1140 1141
                            src += src_stride;
                        }
B
Benoit Fouet 已提交
1142
                    }
1143
                    if ((s->width & 15) || (s->height & (vpad-1))) {
1144 1145 1146
                        s->dsp.draw_edges(dst, dst_stride,
                                          w, h,
                                          16>>h_shift,
1147
                                          vpad>>v_shift,
1148 1149
                                          EDGE_BOTTOM);
                    }
B
Benoit Fouet 已提交
1150 1151 1152
                }
            }
        }
1153
        ret = av_frame_copy_props(pic->f, pic_arg);
1154 1155 1156
        if (ret < 0)
            return ret;

1157 1158
        pic->f->display_picture_number = display_picture_number;
        pic->f->pts = pts; // we set this here to avoid modifiying pic_arg
B
Benoit Fouet 已提交
1159 1160 1161
    }

    /* shift buffer entries */
A
Aneesh Dogra 已提交
1162 1163
    for (i = 1; i < MAX_PICTURE_COUNT /*s->encoding_delay + 1*/; i++)
        s->input_picture[i - 1] = s->input_picture[i];
B
Benoit Fouet 已提交
1164

A
Aneesh Dogra 已提交
1165
    s->input_picture[encoding_delay] = (Picture*) pic;
B
Benoit Fouet 已提交
1166 1167 1168 1169

    return 0;
}

A
Aneesh Dogra 已提交
1170 1171
static int skip_check(MpegEncContext *s, Picture *p, Picture *ref)
{
B
Benoit Fouet 已提交
1172
    int x, y, plane;
A
Aneesh Dogra 已提交
1173 1174
    int score = 0;
    int64_t score64 = 0;
B
Benoit Fouet 已提交
1175

A
Aneesh Dogra 已提交
1176
    for (plane = 0; plane < 3; plane++) {
1177
        const int stride = p->f->linesize[plane];
A
Aneesh Dogra 已提交
1178 1179 1180
        const int bw = plane ? 1 : 2;
        for (y = 0; y < s->mb_height * bw; y++) {
            for (x = 0; x < s->mb_width * bw; x++) {
1181
                int off = p->shared ? 0 : 16;
1182 1183
                uint8_t *dptr = p->f->data[plane] + 8 * (x + y * stride) + off;
                uint8_t *rptr = ref->f->data[plane] + 8 * (x + y * stride);
A
Aneesh Dogra 已提交
1184 1185
                int v   = s->dsp.frame_skip_cmp[1](s, dptr, rptr, stride, 8);

1186
                switch (FFABS(s->avctx->frame_skip_exp)) {
A
Aneesh Dogra 已提交
1187 1188
                case 0: score    =  FFMAX(score, v);          break;
                case 1: score   += FFABS(v);                  break;
1189 1190 1191
                case 2: score64 += v * (int64_t)v;                       break;
                case 3: score64 += FFABS(v * (int64_t)v * v);            break;
                case 4: score64 += (v * (int64_t)v) * (v * (int64_t)v);  break;
B
Benoit Fouet 已提交
1192 1193 1194 1195
                }
            }
        }
    }
1196
    emms_c();
B
Benoit Fouet 已提交
1197

A
Aneesh Dogra 已提交
1198 1199
    if (score)
        score64 = score;
1200 1201 1202
    if (s->avctx->frame_skip_exp < 0)
        score64 = pow(score64 / (double)(s->mb_width * s->mb_height),
                      -1.0/s->avctx->frame_skip_exp);
B
Benoit Fouet 已提交
1203

A
Aneesh Dogra 已提交
1204
    if (score64 < s->avctx->frame_skip_threshold)
B
Benoit Fouet 已提交
1205
        return 1;
A
Aneesh Dogra 已提交
1206
    if (score64 < ((s->avctx->frame_skip_factor * (int64_t)s->lambda) >> 8))
B
Benoit Fouet 已提交
1207 1208 1209 1210
        return 1;
    return 0;
}

1211 1212 1213 1214 1215 1216 1217 1218 1219 1220 1221 1222 1223 1224 1225
static int encode_frame(AVCodecContext *c, AVFrame *frame)
{
    AVPacket pkt = { 0 };
    int ret, got_output;

    av_init_packet(&pkt);
    ret = avcodec_encode_video2(c, &pkt, frame, &got_output);
    if (ret < 0)
        return ret;

    ret = pkt.size;
    av_free_packet(&pkt);
    return ret;
}

A
Aneesh Dogra 已提交
1226 1227
static int estimate_best_b_count(MpegEncContext *s)
{
1228
    AVCodec *codec    = avcodec_find_encoder(s->avctx->codec_id);
1229
    AVCodecContext *c = avcodec_alloc_context3(NULL);
A
Aneesh Dogra 已提交
1230
    const int scale = s->avctx->brd_scale;
B
Benoit Fouet 已提交
1231
    int i, j, out_size, p_lambda, b_lambda, lambda2;
A
Aneesh Dogra 已提交
1232 1233 1234
    int64_t best_rd  = INT64_MAX;
    int best_b_count = -1;

1235
    av_assert0(scale >= 0 && scale <= 3);
A
Aneesh Dogra 已提交
1236 1237 1238 1239 1240 1241 1242 1243 1244 1245 1246 1247 1248

    //emms_c();
    //s->next_picture_ptr->quality;
    p_lambda = s->last_lambda_for[AV_PICTURE_TYPE_P];
    //p_lambda * FFABS(s->avctx->b_quant_factor) + s->avctx->b_quant_offset;
    b_lambda = s->last_lambda_for[AV_PICTURE_TYPE_B];
    if (!b_lambda) // FIXME we should do this somewhere else
        b_lambda = p_lambda;
    lambda2  = (b_lambda * b_lambda + (1 << FF_LAMBDA_SHIFT) / 2) >>
               FF_LAMBDA_SHIFT;

    c->width        = s->width  >> scale;
    c->height       = s->height >> scale;
1249
    c->flags        = CODEC_FLAG_QSCALE | CODEC_FLAG_PSNR;
A
Aneesh Dogra 已提交
1250 1251 1252 1253 1254
    c->flags       |= s->avctx->flags & CODEC_FLAG_QPEL;
    c->mb_decision  = s->avctx->mb_decision;
    c->me_cmp       = s->avctx->me_cmp;
    c->mb_cmp       = s->avctx->mb_cmp;
    c->me_sub_cmp   = s->avctx->me_sub_cmp;
1255
    c->pix_fmt      = AV_PIX_FMT_YUV420P;
A
Aneesh Dogra 已提交
1256 1257
    c->time_base    = s->avctx->time_base;
    c->max_b_frames = s->max_b_frames;
B
Benoit Fouet 已提交
1258

1259
    if (avcodec_open2(c, codec, NULL) < 0)
B
Benoit Fouet 已提交
1260 1261
        return -1;

1262 1263 1264
    for (i = 0; i < s->max_b_frames + 2; i++) {
        Picture pre_input, *pre_input_ptr = i ? s->input_picture[i - 1] :
                                                s->next_picture_ptr;
B
Benoit Fouet 已提交
1265

1266 1267
        if (pre_input_ptr && (!i || s->input_picture[i - 1])) {
            pre_input = *pre_input_ptr;
B
Benoit Fouet 已提交
1268

1269
            if (!pre_input.shared && i) {
1270 1271 1272
                pre_input.f->data[0] += INPLACE_OFFSET;
                pre_input.f->data[1] += INPLACE_OFFSET;
                pre_input.f->data[2] += INPLACE_OFFSET;
B
Benoit Fouet 已提交
1273 1274
            }

1275
            s->dsp.shrink[scale](s->tmp_frames[i]->data[0], s->tmp_frames[i]->linesize[0],
1276
                                 pre_input.f->data[0], pre_input.f->linesize[0],
1277
                                 c->width,      c->height);
1278
            s->dsp.shrink[scale](s->tmp_frames[i]->data[1], s->tmp_frames[i]->linesize[1],
1279
                                 pre_input.f->data[1], pre_input.f->linesize[1],
1280
                                 c->width >> 1, c->height >> 1);
1281
            s->dsp.shrink[scale](s->tmp_frames[i]->data[2], s->tmp_frames[i]->linesize[2],
1282
                                 pre_input.f->data[2], pre_input.f->linesize[2],
1283
                                 c->width >> 1, c->height >> 1);
B
Benoit Fouet 已提交
1284 1285 1286
        }
    }

1287 1288
    for (j = 0; j < s->max_b_frames + 1; j++) {
        int64_t rd = 0;
B
Benoit Fouet 已提交
1289

1290
        if (!s->input_picture[j])
B
Benoit Fouet 已提交
1291 1292
            break;

1293
        c->error[0] = c->error[1] = c->error[2] = 0;
B
Benoit Fouet 已提交
1294

1295 1296
        s->tmp_frames[0]->pict_type = AV_PICTURE_TYPE_I;
        s->tmp_frames[0]->quality   = 1 * FF_QP2LAMBDA;
1297

1298
        out_size = encode_frame(c, s->tmp_frames[0]);
1299

1300
        //rd += (out_size * lambda2) >> FF_LAMBDA_SHIFT;
B
Benoit Fouet 已提交
1301

1302 1303
        for (i = 0; i < s->max_b_frames + 1; i++) {
            int is_p = i % (j + 1) == j || i == s->max_b_frames;
B
Benoit Fouet 已提交
1304

1305
            s->tmp_frames[i + 1]->pict_type = is_p ?
1306
                                     AV_PICTURE_TYPE_P : AV_PICTURE_TYPE_B;
1307
            s->tmp_frames[i + 1]->quality   = is_p ? p_lambda : b_lambda;
1308

1309
            out_size = encode_frame(c, s->tmp_frames[i + 1]);
1310

B
Benoit Fouet 已提交
1311 1312 1313 1314
            rd += (out_size * lambda2) >> (FF_LAMBDA_SHIFT - 3);
        }

        /* get the delayed frames */
1315
        while (out_size) {
1316
            out_size = encode_frame(c, NULL);
B
Benoit Fouet 已提交
1317 1318 1319 1320 1321
            rd += (out_size * lambda2) >> (FF_LAMBDA_SHIFT - 3);
        }

        rd += c->error[0] + c->error[1] + c->error[2];

1322 1323 1324
        if (rd < best_rd) {
            best_rd = rd;
            best_b_count = j;
B
Benoit Fouet 已提交
1325 1326 1327 1328 1329 1330 1331 1332 1333
        }
    }

    avcodec_close(c);
    av_freep(&c);

    return best_b_count;
}

1334 1335
static int select_input_picture(MpegEncContext *s)
{
1336
    int i, ret;
B
Benoit Fouet 已提交
1337

1338 1339 1340
    for (i = 1; i < MAX_PICTURE_COUNT; i++)
        s->reordered_input_picture[i - 1] = s->reordered_input_picture[i];
    s->reordered_input_picture[MAX_PICTURE_COUNT - 1] = NULL;
B
Benoit Fouet 已提交
1341 1342

    /* set next picture type & ordering */
1343
    if (s->reordered_input_picture[0] == NULL && s->input_picture[0]) {
1344 1345 1346 1347 1348
        if (s->avctx->frame_skip_threshold || s->avctx->frame_skip_factor) {
            if (s->picture_in_gop_number < s->gop_size &&
                s->next_picture_ptr &&
                skip_check(s, s->input_picture[0], s->next_picture_ptr)) {
                // FIXME check that te gop check above is +-1 correct
1349
                av_frame_unref(s->input_picture[0]->f);
1350 1351 1352 1353 1354 1355 1356

                ff_vbv_update(s, 0);

                goto no_output_pic;
            }
        }

1357 1358 1359
        if (/*s->picture_in_gop_number >= s->gop_size ||*/
            s->next_picture_ptr == NULL || s->intra_only) {
            s->reordered_input_picture[0] = s->input_picture[0];
1360 1361
            s->reordered_input_picture[0]->f->pict_type = AV_PICTURE_TYPE_I;
            s->reordered_input_picture[0]->f->coded_picture_number =
1362 1363
                s->coded_picture_number++;
        } else {
B
Benoit Fouet 已提交
1364 1365
            int b_frames;

1366 1367
            if (s->flags & CODEC_FLAG_PASS2) {
                for (i = 0; i < s->max_b_frames + 1; i++) {
1368
                    int pict_num = s->input_picture[0]->f->display_picture_number + i;
B
Benoit Fouet 已提交
1369

1370
                    if (pict_num >= s->rc_context.num_entries)
B
Benoit Fouet 已提交
1371
                        break;
1372 1373
                    if (!s->input_picture[i]) {
                        s->rc_context.entry[pict_num - 1].new_pict_type = AV_PICTURE_TYPE_P;
B
Benoit Fouet 已提交
1374 1375 1376
                        break;
                    }

1377
                    s->input_picture[i]->f->pict_type =
B
Benoit Fouet 已提交
1378 1379 1380 1381
                        s->rc_context.entry[pict_num].new_pict_type;
                }
            }

1382 1383 1384 1385 1386 1387 1388 1389 1390 1391
            if (s->avctx->b_frame_strategy == 0) {
                b_frames = s->max_b_frames;
                while (b_frames && !s->input_picture[b_frames])
                    b_frames--;
            } else if (s->avctx->b_frame_strategy == 1) {
                for (i = 1; i < s->max_b_frames + 1; i++) {
                    if (s->input_picture[i] &&
                        s->input_picture[i]->b_frame_score == 0) {
                        s->input_picture[i]->b_frame_score =
                            get_intra_count(s,
1392 1393
                                            s->input_picture[i    ]->f->data[0],
                                            s->input_picture[i - 1]->f->data[0],
1394
                                            s->linesize) + 1;
B
Benoit Fouet 已提交
1395 1396
                    }
                }
1397 1398 1399 1400 1401
                for (i = 0; i < s->max_b_frames + 1; i++) {
                    if (s->input_picture[i] == NULL ||
                        s->input_picture[i]->b_frame_score - 1 >
                            s->mb_num / s->avctx->b_sensitivity)
                        break;
B
Benoit Fouet 已提交
1402 1403
                }

1404
                b_frames = FFMAX(0, i - 1);
B
Benoit Fouet 已提交
1405 1406

                /* reset scores */
1407 1408
                for (i = 0; i < b_frames + 1; i++) {
                    s->input_picture[i]->b_frame_score = 0;
B
Benoit Fouet 已提交
1409
                }
1410 1411 1412
            } else if (s->avctx->b_frame_strategy == 2) {
                b_frames = estimate_best_b_count(s);
            } else {
B
Benoit Fouet 已提交
1413
                av_log(s->avctx, AV_LOG_ERROR, "illegal b frame strategy\n");
1414
                b_frames = 0;
B
Benoit Fouet 已提交
1415 1416 1417 1418
            }

            emms_c();

1419
            for (i = b_frames - 1; i >= 0; i--) {
1420
                int type = s->input_picture[i]->f->pict_type;
1421 1422
                if (type && type != AV_PICTURE_TYPE_B)
                    b_frames = i;
B
Benoit Fouet 已提交
1423
            }
1424
            if (s->input_picture[b_frames]->f->pict_type == AV_PICTURE_TYPE_B &&
1425 1426 1427
                b_frames == s->max_b_frames) {
                av_log(s->avctx, AV_LOG_ERROR,
                       "warning, too many b frames in a row\n");
B
Benoit Fouet 已提交
1428 1429
            }

1430
            if (s->picture_in_gop_number + b_frames >= s->gop_size) {
1431
                if ((s->mpv_flags & FF_MPV_FLAG_STRICT_GOP) &&
1432 1433 1434 1435 1436
                    s->gop_size > s->picture_in_gop_number) {
                    b_frames = s->gop_size - s->picture_in_gop_number - 1;
                } else {
                    if (s->flags & CODEC_FLAG_CLOSED_GOP)
                        b_frames = 0;
1437
                    s->input_picture[b_frames]->f->pict_type = AV_PICTURE_TYPE_I;
1438
                }
B
Benoit Fouet 已提交
1439 1440
            }

1441
            if ((s->flags & CODEC_FLAG_CLOSED_GOP) && b_frames &&
1442
                s->input_picture[b_frames]->f->pict_type == AV_PICTURE_TYPE_I)
B
Benoit Fouet 已提交
1443 1444
                b_frames--;

1445
            s->reordered_input_picture[0] = s->input_picture[b_frames];
1446 1447 1448
            if (s->reordered_input_picture[0]->f->pict_type != AV_PICTURE_TYPE_I)
                s->reordered_input_picture[0]->f->pict_type = AV_PICTURE_TYPE_P;
            s->reordered_input_picture[0]->f->coded_picture_number =
1449 1450
                s->coded_picture_number++;
            for (i = 0; i < b_frames; i++) {
D
Diego Biurrun 已提交
1451
                s->reordered_input_picture[i + 1] = s->input_picture[i];
1452
                s->reordered_input_picture[i + 1]->f->pict_type =
1453
                    AV_PICTURE_TYPE_B;
1454
                s->reordered_input_picture[i + 1]->f->coded_picture_number =
1455
                    s->coded_picture_number++;
B
Benoit Fouet 已提交
1456 1457 1458 1459
            }
        }
    }
no_output_pic:
1460
    if (s->reordered_input_picture[0]) {
1461
        s->reordered_input_picture[0]->reference =
1462
           s->reordered_input_picture[0]->f->pict_type !=
1463
               AV_PICTURE_TYPE_B ? 3 : 0;
B
Benoit Fouet 已提交
1464

1465 1466 1467
        ff_mpeg_unref_picture(s, &s->new_picture);
        if ((ret = ff_mpeg_ref_picture(s, &s->new_picture, s->reordered_input_picture[0])))
            return ret;
B
Benoit Fouet 已提交
1468

1469
        if (s->reordered_input_picture[0]->shared || s->avctx->rc_buffer_size) {
1470 1471
            // input is a shared pix, so we can't modifiy it -> alloc a new
            // one & ensure that the shared one is reuseable
B
Benoit Fouet 已提交
1472

1473
            Picture *pic;
1474
            int i = ff_find_unused_picture(s, 0);
1475 1476
            if (i < 0)
                return i;
1477
            pic = &s->picture[i];
B
Benoit Fouet 已提交
1478

1479
            pic->reference = s->reordered_input_picture[0]->reference;
1480
            if (ff_alloc_picture(s, pic, 0) < 0) {
1481 1482
                return -1;
            }
B
Benoit Fouet 已提交
1483

1484
            ret = av_frame_copy_props(pic->f, s->reordered_input_picture[0]->f);
1485 1486
            if (ret < 0)
                return ret;
B
Benoit Fouet 已提交
1487

1488
            /* mark us unused / free shared pic */
1489
            av_frame_unref(s->reordered_input_picture[0]->f);
1490 1491
            s->reordered_input_picture[0]->shared = 0;

1492 1493
            s->current_picture_ptr = pic;
        } else {
B
Benoit Fouet 已提交
1494
            // input is not a shared pix -> reuse buffer for current_pix
1495 1496
            s->current_picture_ptr = s->reordered_input_picture[0];
            for (i = 0; i < 4; i++) {
1497
                s->new_picture.f->data[i] += INPLACE_OFFSET;
B
Benoit Fouet 已提交
1498 1499
            }
        }
1500 1501 1502 1503
        ff_mpeg_unref_picture(s, &s->current_picture);
        if ((ret = ff_mpeg_ref_picture(s, &s->current_picture,
                                       s->current_picture_ptr)) < 0)
            return ret;
B
Benoit Fouet 已提交
1504

1505
        s->picture_number = s->new_picture.f->display_picture_number;
1506
    } else {
1507
        ff_mpeg_unref_picture(s, &s->new_picture);
B
Benoit Fouet 已提交
1508
    }
1509
    return 0;
B
Benoit Fouet 已提交
1510 1511
}

1512 1513 1514 1515 1516 1517 1518 1519
static void frame_end(MpegEncContext *s)
{
    if (s->unrestricted_mv &&
        s->current_picture.reference &&
        !s->intra_only) {
        const AVPixFmtDescriptor *desc = av_pix_fmt_desc_get(s->avctx->pix_fmt);
        int hshift = desc->log2_chroma_w;
        int vshift = desc->log2_chroma_h;
1520
        s->dsp.draw_edges(s->current_picture.f->data[0], s->current_picture.f->linesize[0],
1521 1522 1523
                          s->h_edge_pos, s->v_edge_pos,
                          EDGE_WIDTH, EDGE_WIDTH,
                          EDGE_TOP | EDGE_BOTTOM);
1524
        s->dsp.draw_edges(s->current_picture.f->data[1], s->current_picture.f->linesize[1],
1525 1526 1527
                          s->h_edge_pos >> hshift, s->v_edge_pos >> vshift,
                          EDGE_WIDTH >> hshift, EDGE_WIDTH >> vshift,
                          EDGE_TOP | EDGE_BOTTOM);
1528
        s->dsp.draw_edges(s->current_picture.f->data[2], s->current_picture.f->linesize[2],
1529 1530 1531 1532 1533 1534 1535 1536
                          s->h_edge_pos >> hshift, s->v_edge_pos >> vshift,
                          EDGE_WIDTH >> hshift, EDGE_WIDTH >> vshift,
                          EDGE_TOP | EDGE_BOTTOM);
    }

    emms_c();

    s->last_pict_type                 = s->pict_type;
1537
    s->last_lambda_for [s->pict_type] = s->current_picture_ptr->f->quality;
1538 1539 1540
    if (s->pict_type!= AV_PICTURE_TYPE_B)
        s->last_non_b_pict_type = s->pict_type;

1541
    s->avctx->coded_frame = s->current_picture_ptr->f;
1542 1543 1544

}

1545 1546 1547 1548 1549 1550 1551 1552 1553 1554 1555 1556 1557 1558 1559 1560 1561 1562 1563 1564 1565 1566 1567 1568 1569 1570 1571 1572
static void update_noise_reduction(MpegEncContext *s)
{
    int intra, i;

    for (intra = 0; intra < 2; intra++) {
        if (s->dct_count[intra] > (1 << 16)) {
            for (i = 0; i < 64; i++) {
                s->dct_error_sum[intra][i] >>= 1;
            }
            s->dct_count[intra] >>= 1;
        }

        for (i = 0; i < 64; i++) {
            s->dct_offset[intra][i] = (s->avctx->noise_reduction *
                                       s->dct_count[intra] +
                                       s->dct_error_sum[intra][i] / 2) /
                                      (s->dct_error_sum[intra][i] + 1);
        }
    }
}

static int frame_start(MpegEncContext *s)
{
    int ret;

    /* mark & release old frames */
    if (s->pict_type != AV_PICTURE_TYPE_B && s->last_picture_ptr &&
        s->last_picture_ptr != s->next_picture_ptr &&
1573
        s->last_picture_ptr->f->buf[0]) {
1574 1575 1576
        ff_mpeg_unref_picture(s, s->last_picture_ptr);
    }

1577 1578
    s->current_picture_ptr->f->pict_type = s->pict_type;
    s->current_picture_ptr->f->key_frame = s->pict_type == AV_PICTURE_TYPE_I;
1579 1580 1581 1582 1583 1584 1585 1586 1587 1588 1589 1590 1591 1592

    ff_mpeg_unref_picture(s, &s->current_picture);
    if ((ret = ff_mpeg_ref_picture(s, &s->current_picture,
                                   s->current_picture_ptr)) < 0)
        return ret;

    if (s->pict_type != AV_PICTURE_TYPE_B) {
        s->last_picture_ptr = s->next_picture_ptr;
        if (!s->droppable)
            s->next_picture_ptr = s->current_picture_ptr;
    }

    if (s->last_picture_ptr) {
        ff_mpeg_unref_picture(s, &s->last_picture);
1593
        if (s->last_picture_ptr->f->buf[0] &&
1594 1595 1596 1597 1598 1599
            (ret = ff_mpeg_ref_picture(s, &s->last_picture,
                                       s->last_picture_ptr)) < 0)
            return ret;
    }
    if (s->next_picture_ptr) {
        ff_mpeg_unref_picture(s, &s->next_picture);
1600
        if (s->next_picture_ptr->f->buf[0] &&
1601 1602 1603 1604 1605 1606 1607 1608 1609
            (ret = ff_mpeg_ref_picture(s, &s->next_picture,
                                       s->next_picture_ptr)) < 0)
            return ret;
    }

    if (s->picture_structure!= PICT_FRAME) {
        int i;
        for (i = 0; i < 4; i++) {
            if (s->picture_structure == PICT_BOTTOM_FIELD) {
1610 1611
                s->current_picture.f->data[i] +=
                    s->current_picture.f->linesize[i];
1612
            }
1613 1614 1615
            s->current_picture.f->linesize[i] *= 2;
            s->last_picture.f->linesize[i]    *= 2;
            s->next_picture.f->linesize[i]    *= 2;
1616 1617 1618 1619 1620 1621 1622 1623 1624 1625 1626 1627 1628 1629 1630
        }
    }

    if (s->mpeg_quant || s->codec_id == AV_CODEC_ID_MPEG2VIDEO) {
        s->dct_unquantize_intra = s->dct_unquantize_mpeg2_intra;
        s->dct_unquantize_inter = s->dct_unquantize_mpeg2_inter;
    } else if (s->out_format == FMT_H263 || s->out_format == FMT_H261) {
        s->dct_unquantize_intra = s->dct_unquantize_h263_intra;
        s->dct_unquantize_inter = s->dct_unquantize_h263_inter;
    } else {
        s->dct_unquantize_intra = s->dct_unquantize_mpeg1_intra;
        s->dct_unquantize_inter = s->dct_unquantize_mpeg1_inter;
    }

    if (s->dct_error_sum) {
1631
        av_assert2(s->avctx->noise_reduction && s->encoding);
1632 1633 1634 1635 1636 1637
        update_noise_reduction(s);
    }

    return 0;
}

1638
int ff_MPV_encode_picture(AVCodecContext *avctx, AVPacket *pkt,
L
Lukasz Marek 已提交
1639
                          const AVFrame *pic_arg, int *got_packet)
B
Benoit Fouet 已提交
1640 1641
{
    MpegEncContext *s = avctx->priv_data;
1642
    int i, stuffing_count, ret;
1643
    int context_count = s->slice_context_count;
B
Benoit Fouet 已提交
1644 1645 1646

    s->picture_in_gop_number++;

1647
    if (load_input_picture(s, pic_arg) < 0)
B
Benoit Fouet 已提交
1648 1649
        return -1;

1650
    if (select_input_picture(s) < 0) {
1651 1652
        return -1;
    }
B
Benoit Fouet 已提交
1653 1654

    /* output? */
1655
    if (s->new_picture.f->data[0]) {
1656
        if ((ret = ff_alloc_packet2(avctx, pkt, s->mb_width*s->mb_height*(MAX_MB_BYTES+100)+10000)) < 0)
1657
            return ret;
1658 1659 1660 1661 1662 1663
        if (s->mb_info) {
            s->mb_info_ptr = av_packet_new_side_data(pkt,
                                 AV_PKT_DATA_H263_MB_INFO,
                                 s->mb_width*s->mb_height*12);
            s->prev_mb_info = s->last_mb_info = s->mb_info_size = 0;
        }
1664 1665 1666 1667 1668 1669 1670 1671 1672 1673 1674

        for (i = 0; i < context_count; i++) {
            int start_y = s->thread_context[i]->start_mb_y;
            int   end_y = s->thread_context[i]->  end_mb_y;
            int h       = s->mb_height;
            uint8_t *start = pkt->data + (size_t)(((int64_t) pkt->size) * start_y / h);
            uint8_t *end   = pkt->data + (size_t)(((int64_t) pkt->size) *   end_y / h);

            init_put_bits(&s->thread_context[i]->pb, start, end - start);
        }

1675
        s->pict_type = s->new_picture.f->pict_type;
1676
        //emms_c();
1677 1678 1679
        ret = frame_start(s);
        if (ret < 0)
            return ret;
B
Benoit Fouet 已提交
1680 1681 1682 1683 1684 1685 1686 1687 1688 1689
vbv_retry:
        if (encode_picture(s, s->picture_number) < 0)
            return -1;

        avctx->header_bits = s->header_bits;
        avctx->mv_bits     = s->mv_bits;
        avctx->misc_bits   = s->misc_bits;
        avctx->i_tex_bits  = s->i_tex_bits;
        avctx->p_tex_bits  = s->p_tex_bits;
        avctx->i_count     = s->i_count;
1690 1691
        // FIXME f/b_count in avctx
        avctx->p_count     = s->mb_num - s->i_count - s->skip_count;
B
Benoit Fouet 已提交
1692 1693
        avctx->skip_count  = s->skip_count;

1694
        frame_end(s);
B
Benoit Fouet 已提交
1695

1696
        if (CONFIG_MJPEG_ENCODER && s->out_format == FMT_MJPEG)
1697
            ff_mjpeg_encode_picture_trailer(&s->pb, s->header_bits);
B
Benoit Fouet 已提交
1698

1699 1700 1701
        if (avctx->rc_buffer_size) {
            RateControlContext *rcc = &s->rc_context;
            int max_size = rcc->buffer_index * avctx->rc_max_available_vbv_use;
B
Benoit Fouet 已提交
1702

1703 1704 1705 1706 1707
            if (put_bits_count(&s->pb) > max_size &&
                s->lambda < s->avctx->lmax) {
                s->next_lambda = FFMAX(s->lambda + 1, s->lambda *
                                       (s->qscale + 1) / s->qscale);
                if (s->adaptive_quant) {
B
Benoit Fouet 已提交
1708
                    int i;
1709 1710 1711 1712 1713
                    for (i = 0; i < s->mb_height * s->mb_stride; i++)
                        s->lambda_table[i] =
                            FFMAX(s->lambda_table[i] + 1,
                                  s->lambda_table[i] * (s->qscale + 1) /
                                  s->qscale);
B
Benoit Fouet 已提交
1714
                }
1715
                s->mb_skipped = 0;        // done in frame_start()
1716 1717 1718
                // done in encode_picture() so we must undo it
                if (s->pict_type == AV_PICTURE_TYPE_P) {
                    if (s->flipflop_rounding          ||
1719 1720
                        s->codec_id == AV_CODEC_ID_H263P ||
                        s->codec_id == AV_CODEC_ID_MPEG4)
B
Benoit Fouet 已提交
1721 1722
                        s->no_rounding ^= 1;
                }
1723 1724 1725
                if (s->pict_type != AV_PICTURE_TYPE_B) {
                    s->time_base       = s->last_time_base;
                    s->last_non_b_time = s->time - s->pp_time;
B
Benoit Fouet 已提交
1726
                }
1727 1728
                for (i = 0; i < context_count; i++) {
                    PutBitContext *pb = &s->thread_context[i]->pb;
B
Benoit Fouet 已提交
1729 1730 1731 1732 1733
                    init_put_bits(pb, pb->buf, pb->buf_end - pb->buf);
                }
                goto vbv_retry;
            }

1734
            av_assert0(s->avctx->rc_max_rate);
B
Benoit Fouet 已提交
1735 1736
        }

1737
        if (s->flags & CODEC_FLAG_PASS1)
B
Benoit Fouet 已提交
1738 1739
            ff_write_pass1_stats(s);

1740
        for (i = 0; i < 4; i++) {
1741 1742
            s->current_picture_ptr->f->error[i] = s->current_picture.f->error[i];
            avctx->error[i] += s->current_picture_ptr->f->error[i];
B
Benoit Fouet 已提交
1743 1744
        }

1745 1746 1747 1748
        if (s->flags & CODEC_FLAG_PASS1)
            assert(avctx->header_bits + avctx->mv_bits + avctx->misc_bits +
                   avctx->i_tex_bits + avctx->p_tex_bits ==
                       put_bits_count(&s->pb));
B
Benoit Fouet 已提交
1749 1750 1751
        flush_put_bits(&s->pb);
        s->frame_bits  = put_bits_count(&s->pb);

1752
        stuffing_count = ff_vbv_update(s, s->frame_bits);
1753
        s->stuffing_bits = 8*stuffing_count;
1754 1755 1756
        if (stuffing_count) {
            if (s->pb.buf_end - s->pb.buf - (put_bits_count(&s->pb) >> 3) <
                    stuffing_count + 50) {
B
Benoit Fouet 已提交
1757 1758 1759 1760
                av_log(s->avctx, AV_LOG_ERROR, "stuffing too large\n");
                return -1;
            }

1761
            switch (s->codec_id) {
1762 1763
            case AV_CODEC_ID_MPEG1VIDEO:
            case AV_CODEC_ID_MPEG2VIDEO:
1764
                while (stuffing_count--) {
B
Benoit Fouet 已提交
1765 1766 1767
                    put_bits(&s->pb, 8, 0);
                }
            break;
1768
            case AV_CODEC_ID_MPEG4:
B
Benoit Fouet 已提交
1769 1770 1771
                put_bits(&s->pb, 16, 0);
                put_bits(&s->pb, 16, 0x1C3);
                stuffing_count -= 4;
1772
                while (stuffing_count--) {
B
Benoit Fouet 已提交
1773 1774 1775 1776 1777 1778 1779 1780 1781 1782 1783
                    put_bits(&s->pb, 8, 0xFF);
                }
            break;
            default:
                av_log(s->avctx, AV_LOG_ERROR, "vbv buffer overflow\n");
            }
            flush_put_bits(&s->pb);
            s->frame_bits  = put_bits_count(&s->pb);
        }

        /* update mpeg1/2 vbv_delay for CBR */
1784 1785 1786 1787 1788
        if (s->avctx->rc_max_rate                          &&
            s->avctx->rc_min_rate == s->avctx->rc_max_rate &&
            s->out_format == FMT_MPEG1                     &&
            90000LL * (avctx->rc_buffer_size - 1) <=
                s->avctx->rc_max_rate * 0xFFFFLL) {
1789
            int vbv_delay, min_delay;
1790 1791 1792 1793 1794
            double inbits  = s->avctx->rc_max_rate *
                             av_q2d(s->avctx->time_base);
            int    minbits = s->frame_bits - 8 *
                             (s->vbv_delay_ptr - s->pb.buf - 1);
            double bits    = s->rc_context.buffer_index + minbits - inbits;
1795

1796 1797 1798
            if (bits < 0)
                av_log(s->avctx, AV_LOG_ERROR,
                       "Internal error, negative bits\n");
B
Benoit Fouet 已提交
1799

1800
            assert(s->repeat_first_field == 0);
B
Benoit Fouet 已提交
1801

1802 1803 1804
            vbv_delay = bits * 90000 / s->avctx->rc_max_rate;
            min_delay = (minbits * 90000LL + s->avctx->rc_max_rate - 1) /
                        s->avctx->rc_max_rate;
1805

1806
            vbv_delay = FFMAX(vbv_delay, min_delay);
1807

1808
            av_assert0(vbv_delay < 0xFFFF);
B
Benoit Fouet 已提交
1809 1810

            s->vbv_delay_ptr[0] &= 0xF8;
1811 1812
            s->vbv_delay_ptr[0] |= vbv_delay >> 13;
            s->vbv_delay_ptr[1]  = vbv_delay >> 5;
B
Benoit Fouet 已提交
1813
            s->vbv_delay_ptr[2] &= 0x07;
1814 1815
            s->vbv_delay_ptr[2] |= vbv_delay << 3;
            avctx->vbv_delay     = vbv_delay * 300;
B
Benoit Fouet 已提交
1816
        }
1817
        s->total_bits     += s->frame_bits;
B
Benoit Fouet 已提交
1818
        avctx->frame_bits  = s->frame_bits;
1819

1820
        pkt->pts = s->current_picture.f->pts;
M
Michael Niedermayer 已提交
1821
        if (!s->low_delay && s->pict_type != AV_PICTURE_TYPE_B) {
1822
            if (!s->current_picture.f->coded_picture_number)
1823 1824 1825
                pkt->dts = pkt->pts - s->dts_delta;
            else
                pkt->dts = s->reordered_pts;
M
Michael Niedermayer 已提交
1826
            s->reordered_pts = pkt->pts;
1827 1828
        } else
            pkt->dts = pkt->pts;
1829
        if (s->current_picture.f->key_frame)
1830
            pkt->flags |= AV_PKT_FLAG_KEY;
1831 1832
        if (s->mb_info)
            av_packet_shrink_side_data(pkt, AV_PKT_DATA_H263_MB_INFO, s->mb_info_size);
1833 1834
    } else {
        s->frame_bits = 0;
B
Benoit Fouet 已提交
1835
    }
1836 1837 1838 1839 1840 1841 1842

    /* release non-reference frames */
    for (i = 0; i < MAX_PICTURE_COUNT; i++) {
        if (!s->picture[i].reference)
            ff_mpeg_unref_picture(s, &s->picture[i]);
    }

1843
    av_assert1((s->frame_bits & 7) == 0);
B
Benoit Fouet 已提交
1844

1845 1846 1847
    pkt->size = s->frame_bits / 8;
    *got_packet = !!pkt->size;
    return 0;
B
Benoit Fouet 已提交
1848 1849
}

1850 1851
static inline void dct_single_coeff_elimination(MpegEncContext *s,
                                                int n, int threshold)
B
Benoit Fouet 已提交
1852
{
1853 1854 1855 1856 1857 1858 1859 1860 1861 1862 1863 1864
    static const char tab[64] = {
        3, 2, 2, 1, 1, 1, 1, 1,
        1, 1, 1, 1, 1, 1, 1, 1,
        1, 1, 1, 1, 1, 1, 1, 1,
        0, 0, 0, 0, 0, 0, 0, 0,
        0, 0, 0, 0, 0, 0, 0, 0,
        0, 0, 0, 0, 0, 0, 0, 0,
        0, 0, 0, 0, 0, 0, 0, 0,
        0, 0, 0, 0, 0, 0, 0, 0
    };
    int score = 0;
    int run = 0;
B
Benoit Fouet 已提交
1865
    int i;
D
Diego Biurrun 已提交
1866
    int16_t *block = s->block[n];
1867
    const int last_index = s->block_last_index[n];
B
Benoit Fouet 已提交
1868 1869
    int skip_dc;

1870 1871 1872 1873 1874
    if (threshold < 0) {
        skip_dc = 0;
        threshold = -threshold;
    } else
        skip_dc = 1;
B
Benoit Fouet 已提交
1875

D
Diego Biurrun 已提交
1876
    /* Are all we could set to zero already zero? */
1877 1878
    if (last_index <= skip_dc - 1)
        return;
B
Benoit Fouet 已提交
1879

1880
    for (i = 0; i <= last_index; i++) {
B
Benoit Fouet 已提交
1881 1882
        const int j = s->intra_scantable.permutated[i];
        const int level = FFABS(block[j]);
1883 1884 1885 1886 1887 1888
        if (level == 1) {
            if (skip_dc && i == 0)
                continue;
            score += tab[run];
            run = 0;
        } else if (level > 1) {
B
Benoit Fouet 已提交
1889
            return;
1890
        } else {
B
Benoit Fouet 已提交
1891 1892 1893
            run++;
        }
    }
1894 1895 1896
    if (score >= threshold)
        return;
    for (i = skip_dc; i <= last_index; i++) {
B
Benoit Fouet 已提交
1897
        const int j = s->intra_scantable.permutated[i];
1898
        block[j] = 0;
B
Benoit Fouet 已提交
1899
    }
1900 1901 1902 1903
    if (block[0])
        s->block_last_index[n] = 0;
    else
        s->block_last_index[n] = -1;
B
Benoit Fouet 已提交
1904 1905
}

D
Diego Biurrun 已提交
1906
static inline void clip_coeffs(MpegEncContext *s, int16_t *block,
1907
                               int last_index)
B
Benoit Fouet 已提交
1908 1909
{
    int i;
1910 1911 1912
    const int maxlevel = s->max_qcoeff;
    const int minlevel = s->min_qcoeff;
    int overflow = 0;
B
Benoit Fouet 已提交
1913

1914 1915 1916 1917
    if (s->mb_intra) {
        i = 1; // skip clipping of intra dc
    } else
        i = 0;
B
Benoit Fouet 已提交
1918

1919 1920
    for (; i <= last_index; i++) {
        const int j = s->intra_scantable.permutated[i];
B
Benoit Fouet 已提交
1921 1922
        int level = block[j];

1923 1924
        if (level > maxlevel) {
            level = maxlevel;
B
Benoit Fouet 已提交
1925
            overflow++;
1926 1927
        } else if (level < minlevel) {
            level = minlevel;
B
Benoit Fouet 已提交
1928 1929 1930
            overflow++;
        }

1931
        block[j] = level;
B
Benoit Fouet 已提交
1932 1933
    }

1934 1935 1936 1937
    if (overflow && s->avctx->mb_decision == FF_MB_DECISION_SIMPLE)
        av_log(s->avctx, AV_LOG_INFO,
               "warning, clipping %d dct coefficients to %d..%d\n",
               overflow, minlevel, maxlevel);
B
Benoit Fouet 已提交
1938 1939
}

1940 1941
static void get_visual_weight(int16_t *weight, uint8_t *ptr, int stride)
{
B
Benoit Fouet 已提交
1942
    int x, y;
1943 1944 1945
    // FIXME optimize
    for (y = 0; y < 8; y++) {
        for (x = 0; x < 8; x++) {
B
Benoit Fouet 已提交
1946
            int x2, y2;
1947 1948 1949
            int sum = 0;
            int sqr = 0;
            int count = 0;
B
Benoit Fouet 已提交
1950

1951 1952 1953
            for (y2 = FFMAX(y - 1, 0); y2 < FFMIN(8, y + 2); y2++) {
                for (x2= FFMAX(x - 1, 0); x2 < FFMIN(8, x + 2); x2++) {
                    int v = ptr[x2 + y2 * stride];
B
Benoit Fouet 已提交
1954
                    sum += v;
1955
                    sqr += v * v;
B
Benoit Fouet 已提交
1956 1957 1958
                    count++;
                }
            }
1959
            weight[x + 8 * y]= (36 * ff_sqrt(count * sqr - sum * sum)) / count;
B
Benoit Fouet 已提交
1960 1961 1962 1963
        }
    }
}

1964 1965 1966
static av_always_inline void encode_mb_internal(MpegEncContext *s,
                                                int motion_x, int motion_y,
                                                int mb_block_height,
P
Paul B Mahol 已提交
1967
                                                int mb_block_width,
1968
                                                int mb_block_count)
B
Benoit Fouet 已提交
1969
{
P
Paul B Mahol 已提交
1970
    int16_t weight[12][64];
1971
    int16_t orig[12][64];
1972 1973
    const int mb_x = s->mb_x;
    const int mb_y = s->mb_y;
B
Benoit Fouet 已提交
1974
    int i;
P
Paul B Mahol 已提交
1975
    int skip_dct[12];
1976
    int dct_offset = s->linesize * 8; // default for progressive frames
P
Paul B Mahol 已提交
1977
    int uv_dct_offset = s->uvlinesize * 8;
B
Benoit Fouet 已提交
1978
    uint8_t *ptr_y, *ptr_cb, *ptr_cr;
1979
    ptrdiff_t wrap_y, wrap_c;
B
Benoit Fouet 已提交
1980

1981 1982
    for (i = 0; i < mb_block_count; i++)
        skip_dct[i] = s->skipdct;
B
Benoit Fouet 已提交
1983

1984 1985 1986
    if (s->adaptive_quant) {
        const int last_qp = s->qscale;
        const int mb_xy = mb_x + mb_y * s->mb_stride;
B
Benoit Fouet 已提交
1987

1988
        s->lambda = s->lambda_table[mb_xy];
B
Benoit Fouet 已提交
1989 1990
        update_qscale(s);

1991
        if (!(s->mpv_flags & FF_MPV_FLAG_QP_RD)) {
1992
            s->qscale = s->current_picture_ptr->qscale_table[mb_xy];
1993
            s->dquant = s->qscale - last_qp;
B
Benoit Fouet 已提交
1994

1995 1996
            if (s->out_format == FMT_H263) {
                s->dquant = av_clip(s->dquant, -2, 2);
B
Benoit Fouet 已提交
1997

1998
                if (s->codec_id == AV_CODEC_ID_MPEG4) {
1999 2000 2001 2002
                    if (!s->mb_intra) {
                        if (s->pict_type == AV_PICTURE_TYPE_B) {
                            if (s->dquant & 1 || s->mv_dir & MV_DIRECT)
                                s->dquant = 0;
B
Benoit Fouet 已提交
2003
                        }
2004 2005
                        if (s->mv_type == MV_TYPE_8X8)
                            s->dquant = 0;
B
Benoit Fouet 已提交
2006 2007 2008 2009 2010
                    }
                }
            }
        }
        ff_set_qscale(s, last_qp + s->dquant);
2011
    } else if (s->mpv_flags & FF_MPV_FLAG_QP_RD)
B
Benoit Fouet 已提交
2012 2013 2014 2015
        ff_set_qscale(s, s->qscale + s->dquant);

    wrap_y = s->linesize;
    wrap_c = s->uvlinesize;
2016
    ptr_y  = s->new_picture.f->data[0] +
2017
             (mb_y * 16 * wrap_y)              + mb_x * 16;
2018
    ptr_cb = s->new_picture.f->data[1] +
P
Paul B Mahol 已提交
2019
             (mb_y * mb_block_height * wrap_c) + mb_x * mb_block_width;
2020
    ptr_cr = s->new_picture.f->data[2] +
P
Paul B Mahol 已提交
2021
             (mb_y * mb_block_height * wrap_c) + mb_x * mb_block_width;
B
Benoit Fouet 已提交
2022

2023
    if((mb_x * 16 + 16 > s->width || mb_y * 16 + 16 > s->height) && s->codec_id != AV_CODEC_ID_AMV){
2024
        uint8_t *ebuf = s->edge_emu_buffer + 32;
2025 2026
        int cw = (s->width  + s->chroma_x_shift) >> s->chroma_x_shift;
        int ch = (s->height + s->chroma_y_shift) >> s->chroma_y_shift;
2027 2028 2029 2030
        s->vdsp.emulated_edge_mc(ebuf, ptr_y,
                                 wrap_y, wrap_y,
                                 16, 16, mb_x * 16, mb_y * 16,
                                 s->width, s->height);
2031
        ptr_y = ebuf;
2032 2033
        s->vdsp.emulated_edge_mc(ebuf + 18 * wrap_y, ptr_cb,
                                 wrap_c, wrap_c,
2034 2035
                                 mb_block_width, mb_block_height,
                                 mb_x * mb_block_width, mb_y * mb_block_height,
2036
                                 cw, ch);
2037
        ptr_cb = ebuf + 18 * wrap_y;
2038
        s->vdsp.emulated_edge_mc(ebuf + 18 * wrap_y + 16, ptr_cr,
2039
                                 wrap_c, wrap_c,
2040 2041
                                 mb_block_width, mb_block_height,
                                 mb_x * mb_block_width, mb_y * mb_block_height,
2042 2043
                                 cw, ch);
        ptr_cr = ebuf + 18 * wrap_y + 16;
B
Benoit Fouet 已提交
2044 2045 2046
    }

    if (s->mb_intra) {
2047
        if (s->flags & CODEC_FLAG_INTERLACED_DCT) {
B
Benoit Fouet 已提交
2048 2049
            int progressive_score, interlaced_score;

2050 2051 2052 2053 2054 2055 2056 2057 2058 2059 2060 2061 2062 2063 2064
            s->interlaced_dct = 0;
            progressive_score = s->dsp.ildct_cmp[4](s, ptr_y,
                                                    NULL, wrap_y, 8) +
                                s->dsp.ildct_cmp[4](s, ptr_y + wrap_y * 8,
                                                    NULL, wrap_y, 8) - 400;

            if (progressive_score > 0) {
                interlaced_score = s->dsp.ildct_cmp[4](s, ptr_y,
                                                       NULL, wrap_y * 2, 8) +
                                   s->dsp.ildct_cmp[4](s, ptr_y + wrap_y,
                                                       NULL, wrap_y * 2, 8);
                if (progressive_score > interlaced_score) {
                    s->interlaced_dct = 1;

                    dct_offset = wrap_y;
P
Paul B Mahol 已提交
2065
                    uv_dct_offset = wrap_c;
2066
                    wrap_y <<= 1;
P
Paul B Mahol 已提交
2067 2068
                    if (s->chroma_format == CHROMA_422 ||
                        s->chroma_format == CHROMA_444)
2069
                        wrap_c <<= 1;
B
Benoit Fouet 已提交
2070 2071 2072 2073
                }
            }
        }

2074 2075 2076 2077
        s->dsp.get_pixels(s->block[0], ptr_y                  , wrap_y);
        s->dsp.get_pixels(s->block[1], ptr_y              + 8 , wrap_y);
        s->dsp.get_pixels(s->block[2], ptr_y + dct_offset     , wrap_y);
        s->dsp.get_pixels(s->block[3], ptr_y + dct_offset + 8 , wrap_y);
B
Benoit Fouet 已提交
2078

2079 2080 2081 2082
        if (s->flags & CODEC_FLAG_GRAY) {
            skip_dct[4] = 1;
            skip_dct[5] = 1;
        } else {
B
Benoit Fouet 已提交
2083 2084
            s->dsp.get_pixels(s->block[4], ptr_cb, wrap_c);
            s->dsp.get_pixels(s->block[5], ptr_cr, wrap_c);
P
Paul B Mahol 已提交
2085 2086 2087 2088 2089 2090 2091 2092 2093 2094
            if (!s->chroma_y_shift && s->chroma_x_shift) { /* 422 */
                s->dsp.get_pixels(s->block[6], ptr_cb + uv_dct_offset, wrap_c);
                s->dsp.get_pixels(s->block[7], ptr_cr + uv_dct_offset, wrap_c);
            } else if (!s->chroma_y_shift && !s->chroma_x_shift) { /* 444 */
                s->dsp.get_pixels(s->block[6], ptr_cb + 8, wrap_c);
                s->dsp.get_pixels(s->block[7], ptr_cr + 8, wrap_c);
                s->dsp.get_pixels(s->block[8], ptr_cb + uv_dct_offset, wrap_c);
                s->dsp.get_pixels(s->block[9], ptr_cr + uv_dct_offset, wrap_c);
                s->dsp.get_pixels(s->block[10], ptr_cb + uv_dct_offset + 8, wrap_c);
                s->dsp.get_pixels(s->block[11], ptr_cr + uv_dct_offset + 8, wrap_c);
B
Benoit Fouet 已提交
2095 2096
            }
        }
2097
    } else {
B
Benoit Fouet 已提交
2098 2099 2100 2101 2102 2103 2104 2105
        op_pixels_func (*op_pix)[4];
        qpel_mc_func (*op_qpix)[16];
        uint8_t *dest_y, *dest_cb, *dest_cr;

        dest_y  = s->dest[0];
        dest_cb = s->dest[1];
        dest_cr = s->dest[2];

2106
        if ((!s->no_rounding) || s->pict_type == AV_PICTURE_TYPE_B) {
2107
            op_pix  = s->hdsp.put_pixels_tab;
2108
            op_qpix = s->qdsp.put_qpel_pixels_tab;
2109
        } else {
2110
            op_pix  = s->hdsp.put_no_rnd_pixels_tab;
2111
            op_qpix = s->qdsp.put_no_rnd_qpel_pixels_tab;
B
Benoit Fouet 已提交
2112 2113 2114
        }

        if (s->mv_dir & MV_DIR_FORWARD) {
2115
            ff_MPV_motion(s, dest_y, dest_cb, dest_cr, 0,
2116
                          s->last_picture.f->data,
2117
                          op_pix, op_qpix);
2118
            op_pix  = s->hdsp.avg_pixels_tab;
2119
            op_qpix = s->qdsp.avg_qpel_pixels_tab;
B
Benoit Fouet 已提交
2120 2121
        }
        if (s->mv_dir & MV_DIR_BACKWARD) {
2122
            ff_MPV_motion(s, dest_y, dest_cb, dest_cr, 1,
2123
                          s->next_picture.f->data,
2124
                          op_pix, op_qpix);
B
Benoit Fouet 已提交
2125 2126
        }

2127
        if (s->flags & CODEC_FLAG_INTERLACED_DCT) {
B
Benoit Fouet 已提交
2128 2129
            int progressive_score, interlaced_score;

2130 2131 2132 2133 2134 2135 2136 2137 2138 2139 2140 2141 2142 2143 2144 2145 2146 2147 2148 2149 2150 2151 2152
            s->interlaced_dct = 0;
            progressive_score = s->dsp.ildct_cmp[0](s, dest_y,
                                                    ptr_y,              wrap_y,
                                                    8) +
                                s->dsp.ildct_cmp[0](s, dest_y + wrap_y * 8,
                                                    ptr_y + wrap_y * 8, wrap_y,
                                                    8) - 400;

            if (s->avctx->ildct_cmp == FF_CMP_VSSE)
                progressive_score -= 400;

            if (progressive_score > 0) {
                interlaced_score = s->dsp.ildct_cmp[0](s, dest_y,
                                                       ptr_y,
                                                       wrap_y * 2, 8) +
                                   s->dsp.ildct_cmp[0](s, dest_y + wrap_y,
                                                       ptr_y + wrap_y,
                                                       wrap_y * 2, 8);

                if (progressive_score > interlaced_score) {
                    s->interlaced_dct = 1;

                    dct_offset = wrap_y;
P
Paul B Mahol 已提交
2153
                    uv_dct_offset = wrap_c;
2154
                    wrap_y <<= 1;
B
Benoit Fouet 已提交
2155
                    if (s->chroma_format == CHROMA_422)
2156
                        wrap_c <<= 1;
B
Benoit Fouet 已提交
2157 2158 2159 2160
                }
            }
        }

2161 2162 2163 2164 2165 2166
        s->dsp.diff_pixels(s->block[0], ptr_y, dest_y, wrap_y);
        s->dsp.diff_pixels(s->block[1], ptr_y + 8, dest_y + 8, wrap_y);
        s->dsp.diff_pixels(s->block[2], ptr_y + dct_offset,
                           dest_y + dct_offset, wrap_y);
        s->dsp.diff_pixels(s->block[3], ptr_y + dct_offset + 8,
                           dest_y + dct_offset + 8, wrap_y);
B
Benoit Fouet 已提交
2167

2168 2169 2170 2171
        if (s->flags & CODEC_FLAG_GRAY) {
            skip_dct[4] = 1;
            skip_dct[5] = 1;
        } else {
B
Benoit Fouet 已提交
2172 2173
            s->dsp.diff_pixels(s->block[4], ptr_cb, dest_cb, wrap_c);
            s->dsp.diff_pixels(s->block[5], ptr_cr, dest_cr, wrap_c);
2174
            if (!s->chroma_y_shift) { /* 422 */
P
Paul B Mahol 已提交
2175 2176 2177 2178
                s->dsp.diff_pixels(s->block[6], ptr_cb + uv_dct_offset,
                                   dest_cb + uv_dct_offset, wrap_c);
                s->dsp.diff_pixels(s->block[7], ptr_cr + uv_dct_offset,
                                   dest_cr + uv_dct_offset, wrap_c);
B
Benoit Fouet 已提交
2179 2180 2181
            }
        }
        /* pre quantization */
2182 2183 2184 2185 2186 2187 2188 2189 2190 2191 2192 2193 2194 2195 2196 2197 2198 2199 2200 2201 2202 2203 2204
        if (s->current_picture.mc_mb_var[s->mb_stride * mb_y + mb_x] <
                2 * s->qscale * s->qscale) {
            // FIXME optimize
            if (s->dsp.sad[1](NULL, ptr_y , dest_y,
                              wrap_y, 8) < 20 * s->qscale)
                skip_dct[0] = 1;
            if (s->dsp.sad[1](NULL, ptr_y + 8,
                              dest_y + 8, wrap_y, 8) < 20 * s->qscale)
                skip_dct[1] = 1;
            if (s->dsp.sad[1](NULL, ptr_y + dct_offset,
                              dest_y + dct_offset, wrap_y, 8) < 20 * s->qscale)
                skip_dct[2] = 1;
            if (s->dsp.sad[1](NULL, ptr_y + dct_offset + 8,
                              dest_y + dct_offset + 8,
                              wrap_y, 8) < 20 * s->qscale)
                skip_dct[3] = 1;
            if (s->dsp.sad[1](NULL, ptr_cb, dest_cb,
                              wrap_c, 8) < 20 * s->qscale)
                skip_dct[4] = 1;
            if (s->dsp.sad[1](NULL, ptr_cr, dest_cr,
                              wrap_c, 8) < 20 * s->qscale)
                skip_dct[5] = 1;
            if (!s->chroma_y_shift) { /* 422 */
P
Paul B Mahol 已提交
2205 2206
                if (s->dsp.sad[1](NULL, ptr_cb + uv_dct_offset,
                                  dest_cb + uv_dct_offset,
2207 2208
                                  wrap_c, 8) < 20 * s->qscale)
                    skip_dct[6] = 1;
P
Paul B Mahol 已提交
2209 2210
                if (s->dsp.sad[1](NULL, ptr_cr + uv_dct_offset,
                                  dest_cr + uv_dct_offset,
2211 2212
                                  wrap_c, 8) < 20 * s->qscale)
                    skip_dct[7] = 1;
B
Benoit Fouet 已提交
2213 2214 2215 2216
            }
        }
    }

2217
    if (s->quantizer_noise_shaping) {
2218 2219 2220 2221 2222 2223 2224 2225 2226 2227 2228 2229 2230 2231
        if (!skip_dct[0])
            get_visual_weight(weight[0], ptr_y                 , wrap_y);
        if (!skip_dct[1])
            get_visual_weight(weight[1], ptr_y              + 8, wrap_y);
        if (!skip_dct[2])
            get_visual_weight(weight[2], ptr_y + dct_offset    , wrap_y);
        if (!skip_dct[3])
            get_visual_weight(weight[3], ptr_y + dct_offset + 8, wrap_y);
        if (!skip_dct[4])
            get_visual_weight(weight[4], ptr_cb                , wrap_c);
        if (!skip_dct[5])
            get_visual_weight(weight[5], ptr_cr                , wrap_c);
        if (!s->chroma_y_shift) { /* 422 */
            if (!skip_dct[6])
P
Paul B Mahol 已提交
2232
                get_visual_weight(weight[6], ptr_cb + uv_dct_offset,
2233 2234
                                  wrap_c);
            if (!skip_dct[7])
P
Paul B Mahol 已提交
2235
                get_visual_weight(weight[7], ptr_cr + uv_dct_offset,
2236
                                  wrap_c);
B
Benoit Fouet 已提交
2237
        }
D
Diego Biurrun 已提交
2238
        memcpy(orig[0], s->block[0], sizeof(int16_t) * 64 * mb_block_count);
B
Benoit Fouet 已提交
2239 2240 2241
    }

    /* DCT & quantize */
2242
    av_assert2(s->out_format != FMT_MJPEG || s->qscale == 8);
B
Benoit Fouet 已提交
2243
    {
2244 2245
        for (i = 0; i < mb_block_count; i++) {
            if (!skip_dct[i]) {
B
Benoit Fouet 已提交
2246 2247
                int overflow;
                s->block_last_index[i] = s->dct_quantize(s, s->block[i], i, s->qscale, &overflow);
2248 2249 2250 2251 2252 2253 2254 2255 2256
                // FIXME we could decide to change to quantizer instead of
                // clipping
                // JS: I don't think that would be a good idea it could lower
                //     quality instead of improve it. Just INTRADC clipping
                //     deserves changes in quantizer
                if (overflow)
                    clip_coeffs(s, s->block[i], s->block_last_index[i]);
            } else
                s->block_last_index[i] = -1;
B
Benoit Fouet 已提交
2257
        }
2258
        if (s->quantizer_noise_shaping) {
2259 2260 2261 2262 2263
            for (i = 0; i < mb_block_count; i++) {
                if (!skip_dct[i]) {
                    s->block_last_index[i] =
                        dct_quantize_refine(s, s->block[i], weight[i],
                                            orig[i], i, s->qscale);
B
Benoit Fouet 已提交
2264 2265 2266 2267
                }
            }
        }

2268 2269
        if (s->luma_elim_threshold && !s->mb_intra)
            for (i = 0; i < 4; i++)
B
Benoit Fouet 已提交
2270
                dct_single_coeff_elimination(s, i, s->luma_elim_threshold);
2271 2272
        if (s->chroma_elim_threshold && !s->mb_intra)
            for (i = 4; i < mb_block_count; i++)
B
Benoit Fouet 已提交
2273 2274
                dct_single_coeff_elimination(s, i, s->chroma_elim_threshold);

2275
        if (s->mpv_flags & FF_MPV_FLAG_CBP_RD) {
2276 2277 2278
            for (i = 0; i < mb_block_count; i++) {
                if (s->block_last_index[i] == -1)
                    s->coded_score[i] = INT_MAX / 256;
B
Benoit Fouet 已提交
2279 2280 2281 2282
            }
        }
    }

2283 2284 2285 2286 2287
    if ((s->flags & CODEC_FLAG_GRAY) && s->mb_intra) {
        s->block_last_index[4] =
        s->block_last_index[5] = 0;
        s->block[4][0] =
        s->block[5][0] = (1024 + s->c_dc_scale / 2) / s->c_dc_scale;
2288 2289 2290 2291 2292 2293
        if (!s->chroma_y_shift) { /* 422 / 444 */
            for (i=6; i<12; i++) {
                s->block_last_index[i] = 0;
                s->block[i][0] = s->block[4][0];
            }
        }
B
Benoit Fouet 已提交
2294 2295
    }

2296
    // non c quantize code returns incorrect block_last_index FIXME
2297
    if (s->alternate_scan && s->dct_quantize != ff_dct_quantize_c) {
2298
        for (i = 0; i < mb_block_count; i++) {
B
Benoit Fouet 已提交
2299
            int j;
2300 2301 2302 2303
            if (s->block_last_index[i] > 0) {
                for (j = 63; j > 0; j--) {
                    if (s->block[i][s->intra_scantable.permutated[j]])
                        break;
B
Benoit Fouet 已提交
2304
                }
2305
                s->block_last_index[i] = j;
B
Benoit Fouet 已提交
2306 2307 2308 2309 2310 2311
            }
        }
    }

    /* huffman encode */
    switch(s->codec_id){ //FIXME funct ptr could be slightly faster
2312 2313
    case AV_CODEC_ID_MPEG1VIDEO:
    case AV_CODEC_ID_MPEG2VIDEO:
2314
        if (CONFIG_MPEG1VIDEO_ENCODER || CONFIG_MPEG2VIDEO_ENCODER)
2315
            ff_mpeg1_encode_mb(s, s->block, motion_x, motion_y);
A
Aurelien Jacobs 已提交
2316
        break;
2317
    case AV_CODEC_ID_MPEG4:
2318
        if (CONFIG_MPEG4_ENCODER)
2319
            ff_mpeg4_encode_mb(s, s->block, motion_x, motion_y);
A
Aurelien Jacobs 已提交
2320
        break;
2321 2322 2323
    case AV_CODEC_ID_MSMPEG4V2:
    case AV_CODEC_ID_MSMPEG4V3:
    case AV_CODEC_ID_WMV1:
2324
        if (CONFIG_MSMPEG4_ENCODER)
2325
            ff_msmpeg4_encode_mb(s, s->block, motion_x, motion_y);
B
Benoit Fouet 已提交
2326
        break;
2327
    case AV_CODEC_ID_WMV2:
2328
        if (CONFIG_WMV2_ENCODER)
B
Benoit Fouet 已提交
2329 2330
            ff_wmv2_encode_mb(s, s->block, motion_x, motion_y);
        break;
2331
    case AV_CODEC_ID_H261:
2332
        if (CONFIG_H261_ENCODER)
B
Benoit Fouet 已提交
2333 2334
            ff_h261_encode_mb(s, s->block, motion_x, motion_y);
        break;
2335 2336 2337 2338 2339
    case AV_CODEC_ID_H263:
    case AV_CODEC_ID_H263P:
    case AV_CODEC_ID_FLV1:
    case AV_CODEC_ID_RV10:
    case AV_CODEC_ID_RV20:
2340
        if (CONFIG_H263_ENCODER)
2341
            ff_h263_encode_mb(s, s->block, motion_x, motion_y);
A
Aurelien Jacobs 已提交
2342
        break;
2343
    case AV_CODEC_ID_MJPEG:
2344
    case AV_CODEC_ID_AMV:
2345
        if (CONFIG_MJPEG_ENCODER)
B
Benoit Fouet 已提交
2346 2347 2348
            ff_mjpeg_encode_mb(s, s->block);
        break;
    default:
2349
        av_assert1(0);
B
Benoit Fouet 已提交
2350 2351 2352 2353 2354
    }
}

static av_always_inline void encode_mb(MpegEncContext *s, int motion_x, int motion_y)
{
P
Paul B Mahol 已提交
2355 2356 2357
    if (s->chroma_format == CHROMA_420) encode_mb_internal(s, motion_x, motion_y,  8, 8, 6);
    else if (s->chroma_format == CHROMA_422) encode_mb_internal(s, motion_x, motion_y, 16, 8, 8);
    else encode_mb_internal(s, motion_x, motion_y, 16, 16, 12);
B
Benoit Fouet 已提交
2358 2359 2360 2361 2362
}

static inline void copy_context_before_encode(MpegEncContext *d, MpegEncContext *s, int type){
    int i;

2363
    memcpy(d->last_mv, s->last_mv, 2*2*2*sizeof(int)); //FIXME is memcpy faster than a loop?
B
Benoit Fouet 已提交
2364 2365 2366 2367

    /* mpeg1 */
    d->mb_skip_run= s->mb_skip_run;
    for(i=0; i<3; i++)
2368
        d->last_dc[i] = s->last_dc[i];
B
Benoit Fouet 已提交
2369 2370 2371 2372 2373 2374 2375 2376 2377 2378 2379 2380 2381 2382 2383

    /* statistics */
    d->mv_bits= s->mv_bits;
    d->i_tex_bits= s->i_tex_bits;
    d->p_tex_bits= s->p_tex_bits;
    d->i_count= s->i_count;
    d->f_count= s->f_count;
    d->b_count= s->b_count;
    d->skip_count= s->skip_count;
    d->misc_bits= s->misc_bits;
    d->last_bits= 0;

    d->mb_skipped= 0;
    d->qscale= s->qscale;
    d->dquant= s->dquant;
2384 2385

    d->esc3_level_length= s->esc3_level_length;
B
Benoit Fouet 已提交
2386 2387 2388 2389 2390 2391
}

static inline void copy_context_after_encode(MpegEncContext *d, MpegEncContext *s, int type){
    int i;

    memcpy(d->mv, s->mv, 2*4*2*sizeof(int));
2392
    memcpy(d->last_mv, s->last_mv, 2*2*2*sizeof(int)); //FIXME is memcpy faster than a loop?
B
Benoit Fouet 已提交
2393 2394 2395 2396

    /* mpeg1 */
    d->mb_skip_run= s->mb_skip_run;
    for(i=0; i<3; i++)
2397
        d->last_dc[i] = s->last_dc[i];
B
Benoit Fouet 已提交
2398 2399 2400 2401 2402 2403 2404 2405 2406 2407 2408 2409 2410 2411 2412 2413 2414 2415 2416 2417 2418 2419 2420 2421 2422

    /* statistics */
    d->mv_bits= s->mv_bits;
    d->i_tex_bits= s->i_tex_bits;
    d->p_tex_bits= s->p_tex_bits;
    d->i_count= s->i_count;
    d->f_count= s->f_count;
    d->b_count= s->b_count;
    d->skip_count= s->skip_count;
    d->misc_bits= s->misc_bits;

    d->mb_intra= s->mb_intra;
    d->mb_skipped= s->mb_skipped;
    d->mv_type= s->mv_type;
    d->mv_dir= s->mv_dir;
    d->pb= s->pb;
    if(s->data_partitioning){
        d->pb2= s->pb2;
        d->tex_pb= s->tex_pb;
    }
    d->block= s->block;
    for(i=0; i<8; i++)
        d->block_last_index[i]= s->block_last_index[i];
    d->interlaced_dct= s->interlaced_dct;
    d->qscale= s->qscale;
2423 2424

    d->esc3_level_length= s->esc3_level_length;
B
Benoit Fouet 已提交
2425 2426 2427 2428 2429 2430 2431 2432 2433 2434 2435 2436 2437 2438 2439 2440 2441 2442 2443 2444 2445 2446 2447
}

static inline void encode_mb_hq(MpegEncContext *s, MpegEncContext *backup, MpegEncContext *best, int type,
                           PutBitContext pb[2], PutBitContext pb2[2], PutBitContext tex_pb[2],
                           int *dmin, int *next_block, int motion_x, int motion_y)
{
    int score;
    uint8_t *dest_backup[3];

    copy_context_before_encode(s, backup, type);

    s->block= s->blocks[*next_block];
    s->pb= pb[*next_block];
    if(s->data_partitioning){
        s->pb2   = pb2   [*next_block];
        s->tex_pb= tex_pb[*next_block];
    }

    if(*next_block){
        memcpy(dest_backup, s->dest, sizeof(s->dest));
        s->dest[0] = s->rd_scratchpad;
        s->dest[1] = s->rd_scratchpad + 16*s->linesize;
        s->dest[2] = s->rd_scratchpad + 16*s->linesize + 8;
2448
        av_assert0(s->linesize >= 32); //FIXME
B
Benoit Fouet 已提交
2449 2450 2451 2452 2453 2454 2455 2456 2457 2458 2459
    }

    encode_mb(s, motion_x, motion_y);

    score= put_bits_count(&s->pb);
    if(s->data_partitioning){
        score+= put_bits_count(&s->pb2);
        score+= put_bits_count(&s->tex_pb);
    }

    if(s->avctx->mb_decision == FF_MB_DECISION_RD){
2460
        ff_MPV_decode_mb(s, s->block);
B
Benoit Fouet 已提交
2461 2462 2463 2464 2465 2466 2467 2468 2469 2470 2471 2472 2473 2474 2475 2476 2477 2478

        score *= s->lambda2;
        score += sse_mb(s) << FF_LAMBDA_SHIFT;
    }

    if(*next_block){
        memcpy(s->dest, dest_backup, sizeof(s->dest));
    }

    if(score<*dmin){
        *dmin= score;
        *next_block^=1;

        copy_context_after_encode(best, s, type);
    }
}

static int sse(MpegEncContext *s, uint8_t *src1, uint8_t *src2, int w, int h, int stride){
2479
    uint32_t *sq = ff_square_tab + 256;
B
Benoit Fouet 已提交
2480 2481 2482 2483 2484 2485 2486 2487 2488 2489 2490 2491 2492 2493
    int acc=0;
    int x,y;

    if(w==16 && h==16)
        return s->dsp.sse[0](NULL, src1, src2, stride, 16);
    else if(w==8 && h==8)
        return s->dsp.sse[1](NULL, src1, src2, stride, 8);

    for(y=0; y<h; y++){
        for(x=0; x<w; x++){
            acc+= sq[src1[x + y*stride] - src2[x + y*stride]];
        }
    }

2494
    av_assert2(acc>=0);
B
Benoit Fouet 已提交
2495 2496 2497 2498 2499 2500 2501 2502 2503 2504 2505 2506 2507

    return acc;
}

static int sse_mb(MpegEncContext *s){
    int w= 16;
    int h= 16;

    if(s->mb_x*16 + 16 > s->width ) w= s->width - s->mb_x*16;
    if(s->mb_y*16 + 16 > s->height) h= s->height- s->mb_y*16;

    if(w==16 && h==16)
      if(s->avctx->mb_cmp == FF_CMP_NSSE){
2508 2509 2510
        return  s->dsp.nsse[0](s, s->new_picture.f->data[0] + s->mb_x*16 + s->mb_y*s->linesize*16, s->dest[0], s->linesize, 16)
               +s->dsp.nsse[1](s, s->new_picture.f->data[1] + s->mb_x*8  + s->mb_y*s->uvlinesize*8,s->dest[1], s->uvlinesize, 8)
               +s->dsp.nsse[1](s, s->new_picture.f->data[2] + s->mb_x*8  + s->mb_y*s->uvlinesize*8,s->dest[2], s->uvlinesize, 8);
B
Benoit Fouet 已提交
2511
      }else{
2512 2513 2514
        return  s->dsp.sse[0](NULL, s->new_picture.f->data[0] + s->mb_x*16 + s->mb_y*s->linesize*16, s->dest[0], s->linesize, 16)
               +s->dsp.sse[1](NULL, s->new_picture.f->data[1] + s->mb_x*8  + s->mb_y*s->uvlinesize*8,s->dest[1], s->uvlinesize, 8)
               +s->dsp.sse[1](NULL, s->new_picture.f->data[2] + s->mb_x*8  + s->mb_y*s->uvlinesize*8,s->dest[2], s->uvlinesize, 8);
B
Benoit Fouet 已提交
2515 2516
      }
    else
2517 2518 2519
        return  sse(s, s->new_picture.f->data[0] + s->mb_x*16 + s->mb_y*s->linesize*16, s->dest[0], w, h, s->linesize)
               +sse(s, s->new_picture.f->data[1] + s->mb_x*8  + s->mb_y*s->uvlinesize*8,s->dest[1], w>>1, h>>1, s->uvlinesize)
               +sse(s, s->new_picture.f->data[2] + s->mb_x*8  + s->mb_y*s->uvlinesize*8,s->dest[2], w>>1, h>>1, s->uvlinesize);
B
Benoit Fouet 已提交
2520 2521 2522
}

static int pre_estimate_motion_thread(AVCodecContext *c, void *arg){
2523
    MpegEncContext *s= *(void**)arg;
B
Benoit Fouet 已提交
2524 2525 2526 2527 2528 2529 2530 2531 2532 2533 2534 2535 2536 2537 2538 2539 2540 2541


    s->me.pre_pass=1;
    s->me.dia_size= s->avctx->pre_dia_size;
    s->first_slice_line=1;
    for(s->mb_y= s->end_mb_y-1; s->mb_y >= s->start_mb_y; s->mb_y--) {
        for(s->mb_x=s->mb_width-1; s->mb_x >=0 ;s->mb_x--) {
            ff_pre_estimate_p_frame_motion(s, s->mb_x, s->mb_y);
        }
        s->first_slice_line=0;
    }

    s->me.pre_pass=0;

    return 0;
}

static int estimate_motion_thread(AVCodecContext *c, void *arg){
2542
    MpegEncContext *s= *(void**)arg;
B
Benoit Fouet 已提交
2543 2544 2545 2546 2547 2548 2549 2550 2551 2552 2553 2554 2555 2556 2557

    ff_check_alignment();

    s->me.dia_size= s->avctx->dia_size;
    s->first_slice_line=1;
    for(s->mb_y= s->start_mb_y; s->mb_y < s->end_mb_y; s->mb_y++) {
        s->mb_x=0; //for block init below
        ff_init_block_index(s);
        for(s->mb_x=0; s->mb_x < s->mb_width; s->mb_x++) {
            s->block_index[0]+=2;
            s->block_index[1]+=2;
            s->block_index[2]+=2;
            s->block_index[3]+=2;

            /* compute motion vector & mb_type and store in context */
2558
            if(s->pict_type==AV_PICTURE_TYPE_B)
B
Benoit Fouet 已提交
2559 2560 2561 2562 2563 2564 2565 2566 2567 2568
                ff_estimate_b_frame_motion(s, s->mb_x, s->mb_y);
            else
                ff_estimate_p_frame_motion(s, s->mb_x, s->mb_y);
        }
        s->first_slice_line=0;
    }
    return 0;
}

static int mb_var_thread(AVCodecContext *c, void *arg){
2569
    MpegEncContext *s= *(void**)arg;
B
Benoit Fouet 已提交
2570 2571 2572 2573 2574 2575 2576 2577
    int mb_x, mb_y;

    ff_check_alignment();

    for(mb_y=s->start_mb_y; mb_y < s->end_mb_y; mb_y++) {
        for(mb_x=0; mb_x < s->mb_width; mb_x++) {
            int xx = mb_x * 16;
            int yy = mb_y * 16;
2578
            uint8_t *pix = s->new_picture.f->data[0] + (yy * s->linesize) + xx;
B
Benoit Fouet 已提交
2579 2580 2581
            int varc;
            int sum = s->dsp.pix_sum(pix, s->linesize);

2582
            varc = (s->dsp.pix_norm1(pix, s->linesize) - (((unsigned)sum*sum)>>8) + 500 + 128)>>8;
B
Benoit Fouet 已提交
2583 2584 2585 2586 2587 2588 2589 2590 2591 2592

            s->current_picture.mb_var [s->mb_stride * mb_y + mb_x] = varc;
            s->current_picture.mb_mean[s->mb_stride * mb_y + mb_x] = (sum+128)>>8;
            s->me.mb_var_sum_temp    += varc;
        }
    }
    return 0;
}

static void write_slice_end(MpegEncContext *s){
2593
    if(CONFIG_MPEG4_ENCODER && s->codec_id==AV_CODEC_ID_MPEG4){
B
Benoit Fouet 已提交
2594 2595 2596 2597 2598
        if(s->partitioned_frame){
            ff_mpeg4_merge_partitions(s);
        }

        ff_mpeg4_stuffing(&s->pb);
2599
    }else if(CONFIG_MJPEG_ENCODER && s->out_format == FMT_MJPEG){
2600
        ff_mjpeg_encode_stuffing(s);
B
Benoit Fouet 已提交
2601 2602
    }

2603
    avpriv_align_put_bits(&s->pb);
B
Benoit Fouet 已提交
2604 2605 2606 2607 2608 2609
    flush_put_bits(&s->pb);

    if((s->flags&CODEC_FLAG_PASS1) && !s->partitioned_frame)
        s->misc_bits+= get_bits_diff(s);
}

2610 2611 2612 2613 2614 2615 2616 2617 2618 2619 2620 2621 2622 2623 2624 2625 2626 2627 2628 2629 2630 2631 2632 2633 2634 2635 2636 2637 2638 2639 2640 2641 2642 2643 2644 2645 2646 2647 2648 2649 2650 2651 2652
static void write_mb_info(MpegEncContext *s)
{
    uint8_t *ptr = s->mb_info_ptr + s->mb_info_size - 12;
    int offset = put_bits_count(&s->pb);
    int mba  = s->mb_x + s->mb_width * (s->mb_y % s->gob_index);
    int gobn = s->mb_y / s->gob_index;
    int pred_x, pred_y;
    if (CONFIG_H263_ENCODER)
        ff_h263_pred_motion(s, 0, 0, &pred_x, &pred_y);
    bytestream_put_le32(&ptr, offset);
    bytestream_put_byte(&ptr, s->qscale);
    bytestream_put_byte(&ptr, gobn);
    bytestream_put_le16(&ptr, mba);
    bytestream_put_byte(&ptr, pred_x); /* hmv1 */
    bytestream_put_byte(&ptr, pred_y); /* vmv1 */
    /* 4MV not implemented */
    bytestream_put_byte(&ptr, 0); /* hmv2 */
    bytestream_put_byte(&ptr, 0); /* vmv2 */
}

static void update_mb_info(MpegEncContext *s, int startcode)
{
    if (!s->mb_info)
        return;
    if (put_bits_count(&s->pb) - s->prev_mb_info*8 >= s->mb_info*8) {
        s->mb_info_size += 12;
        s->prev_mb_info = s->last_mb_info;
    }
    if (startcode) {
        s->prev_mb_info = put_bits_count(&s->pb)/8;
        /* This might have incremented mb_info_size above, and we return without
         * actually writing any info into that slot yet. But in that case,
         * this will be called again at the start of the after writing the
         * start code, actually writing the mb info. */
        return;
    }

    s->last_mb_info = put_bits_count(&s->pb)/8;
    if (!s->mb_info_size)
        s->mb_info_size += 12;
    write_mb_info(s);
}

B
Benoit Fouet 已提交
2653
static int encode_thread(AVCodecContext *c, void *arg){
2654
    MpegEncContext *s= *(void**)arg;
B
Benoit Fouet 已提交
2655
    int mb_x, mb_y, pdif = 0;
B
Baptiste Coudurier 已提交
2656
    int chr_h= 16>>s->chroma_y_shift;
B
Benoit Fouet 已提交
2657 2658 2659 2660 2661 2662 2663 2664 2665 2666 2667 2668 2669 2670 2671 2672 2673 2674 2675 2676 2677 2678 2679 2680 2681 2682 2683 2684 2685 2686
    int i, j;
    MpegEncContext best_s, backup_s;
    uint8_t bit_buf[2][MAX_MB_BYTES];
    uint8_t bit_buf2[2][MAX_MB_BYTES];
    uint8_t bit_buf_tex[2][MAX_MB_BYTES];
    PutBitContext pb[2], pb2[2], tex_pb[2];

    ff_check_alignment();

    for(i=0; i<2; i++){
        init_put_bits(&pb    [i], bit_buf    [i], MAX_MB_BYTES);
        init_put_bits(&pb2   [i], bit_buf2   [i], MAX_MB_BYTES);
        init_put_bits(&tex_pb[i], bit_buf_tex[i], MAX_MB_BYTES);
    }

    s->last_bits= put_bits_count(&s->pb);
    s->mv_bits=0;
    s->misc_bits=0;
    s->i_tex_bits=0;
    s->p_tex_bits=0;
    s->i_count=0;
    s->f_count=0;
    s->b_count=0;
    s->skip_count=0;

    for(i=0; i<3; i++){
        /* init last dc values */
        /* note: quant matrix value (8) is implied here */
        s->last_dc[i] = 128 << s->intra_dc_precision;

2687
        s->current_picture.f->error[i] = 0;
B
Benoit Fouet 已提交
2688
    }
2689
    if(s->codec_id==AV_CODEC_ID_AMV){
M
Michael Niedermayer 已提交
2690 2691 2692 2693
        s->last_dc[0] = 128*8/13;
        s->last_dc[1] = 128*8/14;
        s->last_dc[2] = 128*8/14;
    }
B
Benoit Fouet 已提交
2694 2695 2696 2697 2698 2699
    s->mb_skip_run = 0;
    memset(s->last_mv, 0, sizeof(s->last_mv));

    s->last_mv_dir = 0;

    switch(s->codec_id){
2700 2701 2702
    case AV_CODEC_ID_H263:
    case AV_CODEC_ID_H263P:
    case AV_CODEC_ID_FLV1:
2703
        if (CONFIG_H263_ENCODER)
A
Aurelien Jacobs 已提交
2704
            s->gob_index = ff_h263_get_gob_height(s);
B
Benoit Fouet 已提交
2705
        break;
2706
    case AV_CODEC_ID_MPEG4:
2707
        if(CONFIG_MPEG4_ENCODER && s->partitioned_frame)
B
Benoit Fouet 已提交
2708 2709 2710 2711 2712 2713 2714 2715 2716 2717 2718 2719 2720 2721 2722 2723 2724 2725 2726 2727 2728 2729 2730 2731 2732 2733 2734 2735 2736
            ff_mpeg4_init_partitions(s);
        break;
    }

    s->resync_mb_x=0;
    s->resync_mb_y=0;
    s->first_slice_line = 1;
    s->ptr_lastgob = s->pb.buf;
    for(mb_y= s->start_mb_y; mb_y < s->end_mb_y; mb_y++) {
        s->mb_x=0;
        s->mb_y= mb_y;

        ff_set_qscale(s, s->qscale);
        ff_init_block_index(s);

        for(mb_x=0; mb_x < s->mb_width; mb_x++) {
            int xy= mb_y*s->mb_stride + mb_x; // removed const, H261 needs to adjust this
            int mb_type= s->mb_type[xy];
//            int d;
            int dmin= INT_MAX;
            int dir;

            if(s->pb.buf_end - s->pb.buf - (put_bits_count(&s->pb)>>3) < MAX_MB_BYTES){
                av_log(s->avctx, AV_LOG_ERROR, "encoded frame too large\n");
                return -1;
            }
            if(s->data_partitioning){
                if(   s->pb2   .buf_end - s->pb2   .buf - (put_bits_count(&s->    pb2)>>3) < MAX_MB_BYTES
                   || s->tex_pb.buf_end - s->tex_pb.buf - (put_bits_count(&s->tex_pb )>>3) < MAX_MB_BYTES){
2737
                    av_log(s->avctx, AV_LOG_ERROR, "encoded partitioned frame too large\n");
B
Benoit Fouet 已提交
2738 2739 2740 2741 2742 2743 2744 2745
                    return -1;
                }
            }

            s->mb_x = mb_x;
            s->mb_y = mb_y;  // moved into loop, can get changed by H.261
            ff_update_block_index(s);

2746
            if(CONFIG_H261_ENCODER && s->codec_id == AV_CODEC_ID_H261){
B
Benoit Fouet 已提交
2747 2748 2749 2750 2751 2752 2753 2754 2755 2756 2757 2758 2759 2760 2761 2762
                ff_h261_reorder_mb_index(s);
                xy= s->mb_y*s->mb_stride + s->mb_x;
                mb_type= s->mb_type[xy];
            }

            /* write gob / video packet header  */
            if(s->rtp_mode){
                int current_packet_size, is_gob_start;

                current_packet_size= ((put_bits_count(&s->pb)+7)>>3) - (s->ptr_lastgob - s->pb.buf);

                is_gob_start= s->avctx->rtp_payload_size && current_packet_size >= s->avctx->rtp_payload_size && mb_y + mb_x>0;

                if(s->start_mb_y == mb_y && mb_y > 0 && mb_x==0) is_gob_start=1;

                switch(s->codec_id){
2763 2764
                case AV_CODEC_ID_H263:
                case AV_CODEC_ID_H263P:
B
Benoit Fouet 已提交
2765 2766 2767
                    if(!s->h263_slice_structured)
                        if(s->mb_x || s->mb_y%s->gob_index) is_gob_start=0;
                    break;
2768
                case AV_CODEC_ID_MPEG2VIDEO:
B
Benoit Fouet 已提交
2769
                    if(s->mb_x==0 && s->mb_y!=0) is_gob_start=1;
2770
                case AV_CODEC_ID_MPEG1VIDEO:
B
Benoit Fouet 已提交
2771 2772
                    if(s->mb_skip_run) is_gob_start=0;
                    break;
2773
                case AV_CODEC_ID_MJPEG:
2774 2775
                    if(s->mb_x==0 && s->mb_y!=0) is_gob_start=1;
                    break;
B
Benoit Fouet 已提交
2776 2777 2778 2779 2780
                }

                if(is_gob_start){
                    if(s->start_mb_y != mb_y || mb_x!=0){
                        write_slice_end(s);
2781

2782
                        if(CONFIG_MPEG4_ENCODER && s->codec_id==AV_CODEC_ID_MPEG4 && s->partitioned_frame){
B
Benoit Fouet 已提交
2783 2784 2785 2786
                            ff_mpeg4_init_partitions(s);
                        }
                    }

2787
                    av_assert2((put_bits_count(&s->pb)&7) == 0);
2788
                    current_packet_size= put_bits_ptr(&s->pb) - s->ptr_lastgob;
B
Benoit Fouet 已提交
2789

2790
                    if (s->error_rate && s->resync_mb_x + s->resync_mb_y > 0) {
B
Benoit Fouet 已提交
2791
                        int r= put_bits_count(&s->pb)/8 + s->picture_number + 16 + s->mb_x + s->mb_y;
2792
                        int d = 100 / s->error_rate;
B
Benoit Fouet 已提交
2793 2794 2795
                        if(r % d == 0){
                            current_packet_size=0;
                            s->pb.buf_ptr= s->ptr_lastgob;
2796
                            assert(put_bits_ptr(&s->pb) == s->ptr_lastgob);
B
Benoit Fouet 已提交
2797 2798 2799 2800 2801 2802 2803
                        }
                    }

                    if (s->avctx->rtp_callback){
                        int number_mb = (mb_y - s->resync_mb_y)*s->mb_width + mb_x - s->resync_mb_x;
                        s->avctx->rtp_callback(s->avctx, s->ptr_lastgob, current_packet_size, number_mb);
                    }
2804
                    update_mb_info(s, 1);
B
Benoit Fouet 已提交
2805 2806

                    switch(s->codec_id){
2807
                    case AV_CODEC_ID_MPEG4:
2808
                        if (CONFIG_MPEG4_ENCODER) {
A
Aurelien Jacobs 已提交
2809 2810
                            ff_mpeg4_encode_video_packet_header(s);
                            ff_mpeg4_clean_buffers(s);
2811
                        }
B
Benoit Fouet 已提交
2812
                    break;
2813 2814
                    case AV_CODEC_ID_MPEG1VIDEO:
                    case AV_CODEC_ID_MPEG2VIDEO:
2815
                        if (CONFIG_MPEG1VIDEO_ENCODER || CONFIG_MPEG2VIDEO_ENCODER) {
A
Aurelien Jacobs 已提交
2816 2817
                            ff_mpeg1_encode_slice_header(s);
                            ff_mpeg1_clean_buffers(s);
2818
                        }
B
Benoit Fouet 已提交
2819
                    break;
2820 2821
                    case AV_CODEC_ID_H263:
                    case AV_CODEC_ID_H263P:
2822
                        if (CONFIG_H263_ENCODER)
2823
                            ff_h263_encode_gob_header(s, mb_y);
B
Benoit Fouet 已提交
2824 2825 2826 2827 2828 2829 2830 2831 2832 2833 2834 2835 2836 2837 2838 2839 2840 2841 2842 2843 2844 2845 2846 2847
                    break;
                    }

                    if(s->flags&CODEC_FLAG_PASS1){
                        int bits= put_bits_count(&s->pb);
                        s->misc_bits+= bits - s->last_bits;
                        s->last_bits= bits;
                    }

                    s->ptr_lastgob += current_packet_size;
                    s->first_slice_line=1;
                    s->resync_mb_x=mb_x;
                    s->resync_mb_y=mb_y;
                }
            }

            if(  (s->resync_mb_x   == s->mb_x)
               && s->resync_mb_y+1 == s->mb_y){
                s->first_slice_line=0;
            }

            s->mb_skipped=0;
            s->dquant=0; //only for QP_RD

2848 2849
            update_mb_info(s, 0);

2850
            if (mb_type & (mb_type-1) || (s->mpv_flags & FF_MPV_FLAG_QP_RD)) { // more than 1 MB type possible or FF_MPV_FLAG_QP_RD
B
Benoit Fouet 已提交
2851 2852 2853 2854 2855 2856 2857 2858 2859 2860 2861 2862 2863 2864 2865 2866 2867 2868 2869 2870 2871 2872 2873 2874 2875 2876 2877 2878 2879 2880 2881 2882 2883 2884 2885 2886 2887 2888 2889 2890 2891 2892 2893 2894 2895 2896 2897
                int next_block=0;
                int pb_bits_count, pb2_bits_count, tex_pb_bits_count;

                copy_context_before_encode(&backup_s, s, -1);
                backup_s.pb= s->pb;
                best_s.data_partitioning= s->data_partitioning;
                best_s.partitioned_frame= s->partitioned_frame;
                if(s->data_partitioning){
                    backup_s.pb2= s->pb2;
                    backup_s.tex_pb= s->tex_pb;
                }

                if(mb_type&CANDIDATE_MB_TYPE_INTER){
                    s->mv_dir = MV_DIR_FORWARD;
                    s->mv_type = MV_TYPE_16X16;
                    s->mb_intra= 0;
                    s->mv[0][0][0] = s->p_mv_table[xy][0];
                    s->mv[0][0][1] = s->p_mv_table[xy][1];
                    encode_mb_hq(s, &backup_s, &best_s, CANDIDATE_MB_TYPE_INTER, pb, pb2, tex_pb,
                                 &dmin, &next_block, s->mv[0][0][0], s->mv[0][0][1]);
                }
                if(mb_type&CANDIDATE_MB_TYPE_INTER_I){
                    s->mv_dir = MV_DIR_FORWARD;
                    s->mv_type = MV_TYPE_FIELD;
                    s->mb_intra= 0;
                    for(i=0; i<2; i++){
                        j= s->field_select[0][i] = s->p_field_select_table[i][xy];
                        s->mv[0][i][0] = s->p_field_mv_table[i][j][xy][0];
                        s->mv[0][i][1] = s->p_field_mv_table[i][j][xy][1];
                    }
                    encode_mb_hq(s, &backup_s, &best_s, CANDIDATE_MB_TYPE_INTER_I, pb, pb2, tex_pb,
                                 &dmin, &next_block, 0, 0);
                }
                if(mb_type&CANDIDATE_MB_TYPE_SKIPPED){
                    s->mv_dir = MV_DIR_FORWARD;
                    s->mv_type = MV_TYPE_16X16;
                    s->mb_intra= 0;
                    s->mv[0][0][0] = 0;
                    s->mv[0][0][1] = 0;
                    encode_mb_hq(s, &backup_s, &best_s, CANDIDATE_MB_TYPE_SKIPPED, pb, pb2, tex_pb,
                                 &dmin, &next_block, s->mv[0][0][0], s->mv[0][0][1]);
                }
                if(mb_type&CANDIDATE_MB_TYPE_INTER4V){
                    s->mv_dir = MV_DIR_FORWARD;
                    s->mv_type = MV_TYPE_8X8;
                    s->mb_intra= 0;
                    for(i=0; i<4; i++){
2898 2899
                        s->mv[0][i][0] = s->current_picture.motion_val[0][s->block_index[i]][0];
                        s->mv[0][i][1] = s->current_picture.motion_val[0][s->block_index[i]][1];
B
Benoit Fouet 已提交
2900 2901 2902 2903 2904 2905 2906 2907 2908 2909 2910 2911 2912 2913 2914 2915 2916 2917 2918 2919 2920 2921 2922 2923 2924 2925 2926 2927 2928 2929 2930 2931 2932 2933 2934 2935 2936 2937 2938 2939 2940 2941 2942 2943 2944 2945 2946 2947 2948 2949 2950 2951 2952 2953 2954 2955 2956 2957 2958 2959 2960 2961 2962 2963 2964 2965 2966 2967 2968 2969 2970 2971 2972 2973 2974 2975 2976 2977 2978 2979 2980 2981 2982 2983 2984 2985 2986
                    }
                    encode_mb_hq(s, &backup_s, &best_s, CANDIDATE_MB_TYPE_INTER4V, pb, pb2, tex_pb,
                                 &dmin, &next_block, 0, 0);
                }
                if(mb_type&CANDIDATE_MB_TYPE_FORWARD){
                    s->mv_dir = MV_DIR_FORWARD;
                    s->mv_type = MV_TYPE_16X16;
                    s->mb_intra= 0;
                    s->mv[0][0][0] = s->b_forw_mv_table[xy][0];
                    s->mv[0][0][1] = s->b_forw_mv_table[xy][1];
                    encode_mb_hq(s, &backup_s, &best_s, CANDIDATE_MB_TYPE_FORWARD, pb, pb2, tex_pb,
                                 &dmin, &next_block, s->mv[0][0][0], s->mv[0][0][1]);
                }
                if(mb_type&CANDIDATE_MB_TYPE_BACKWARD){
                    s->mv_dir = MV_DIR_BACKWARD;
                    s->mv_type = MV_TYPE_16X16;
                    s->mb_intra= 0;
                    s->mv[1][0][0] = s->b_back_mv_table[xy][0];
                    s->mv[1][0][1] = s->b_back_mv_table[xy][1];
                    encode_mb_hq(s, &backup_s, &best_s, CANDIDATE_MB_TYPE_BACKWARD, pb, pb2, tex_pb,
                                 &dmin, &next_block, s->mv[1][0][0], s->mv[1][0][1]);
                }
                if(mb_type&CANDIDATE_MB_TYPE_BIDIR){
                    s->mv_dir = MV_DIR_FORWARD | MV_DIR_BACKWARD;
                    s->mv_type = MV_TYPE_16X16;
                    s->mb_intra= 0;
                    s->mv[0][0][0] = s->b_bidir_forw_mv_table[xy][0];
                    s->mv[0][0][1] = s->b_bidir_forw_mv_table[xy][1];
                    s->mv[1][0][0] = s->b_bidir_back_mv_table[xy][0];
                    s->mv[1][0][1] = s->b_bidir_back_mv_table[xy][1];
                    encode_mb_hq(s, &backup_s, &best_s, CANDIDATE_MB_TYPE_BIDIR, pb, pb2, tex_pb,
                                 &dmin, &next_block, 0, 0);
                }
                if(mb_type&CANDIDATE_MB_TYPE_FORWARD_I){
                    s->mv_dir = MV_DIR_FORWARD;
                    s->mv_type = MV_TYPE_FIELD;
                    s->mb_intra= 0;
                    for(i=0; i<2; i++){
                        j= s->field_select[0][i] = s->b_field_select_table[0][i][xy];
                        s->mv[0][i][0] = s->b_field_mv_table[0][i][j][xy][0];
                        s->mv[0][i][1] = s->b_field_mv_table[0][i][j][xy][1];
                    }
                    encode_mb_hq(s, &backup_s, &best_s, CANDIDATE_MB_TYPE_FORWARD_I, pb, pb2, tex_pb,
                                 &dmin, &next_block, 0, 0);
                }
                if(mb_type&CANDIDATE_MB_TYPE_BACKWARD_I){
                    s->mv_dir = MV_DIR_BACKWARD;
                    s->mv_type = MV_TYPE_FIELD;
                    s->mb_intra= 0;
                    for(i=0; i<2; i++){
                        j= s->field_select[1][i] = s->b_field_select_table[1][i][xy];
                        s->mv[1][i][0] = s->b_field_mv_table[1][i][j][xy][0];
                        s->mv[1][i][1] = s->b_field_mv_table[1][i][j][xy][1];
                    }
                    encode_mb_hq(s, &backup_s, &best_s, CANDIDATE_MB_TYPE_BACKWARD_I, pb, pb2, tex_pb,
                                 &dmin, &next_block, 0, 0);
                }
                if(mb_type&CANDIDATE_MB_TYPE_BIDIR_I){
                    s->mv_dir = MV_DIR_FORWARD | MV_DIR_BACKWARD;
                    s->mv_type = MV_TYPE_FIELD;
                    s->mb_intra= 0;
                    for(dir=0; dir<2; dir++){
                        for(i=0; i<2; i++){
                            j= s->field_select[dir][i] = s->b_field_select_table[dir][i][xy];
                            s->mv[dir][i][0] = s->b_field_mv_table[dir][i][j][xy][0];
                            s->mv[dir][i][1] = s->b_field_mv_table[dir][i][j][xy][1];
                        }
                    }
                    encode_mb_hq(s, &backup_s, &best_s, CANDIDATE_MB_TYPE_BIDIR_I, pb, pb2, tex_pb,
                                 &dmin, &next_block, 0, 0);
                }
                if(mb_type&CANDIDATE_MB_TYPE_INTRA){
                    s->mv_dir = 0;
                    s->mv_type = MV_TYPE_16X16;
                    s->mb_intra= 1;
                    s->mv[0][0][0] = 0;
                    s->mv[0][0][1] = 0;
                    encode_mb_hq(s, &backup_s, &best_s, CANDIDATE_MB_TYPE_INTRA, pb, pb2, tex_pb,
                                 &dmin, &next_block, 0, 0);
                    if(s->h263_pred || s->h263_aic){
                        if(best_s.mb_intra)
                            s->mbintra_table[mb_x + mb_y*s->mb_stride]=1;
                        else
                            ff_clean_intra_table_entries(s); //old mode?
                    }
                }

2987
                if ((s->mpv_flags & FF_MPV_FLAG_QP_RD) && dmin < INT_MAX) {
B
Benoit Fouet 已提交
2988 2989 2990
                    if(best_s.mv_type==MV_TYPE_16X16){ //FIXME move 4mv after QPRD
                        const int last_qp= backup_s.qscale;
                        int qpi, qp, dc[6];
D
Diego Biurrun 已提交
2991
                        int16_t ac[6][16];
B
Benoit Fouet 已提交
2992 2993
                        const int mvdir= (best_s.mv_dir&MV_DIR_BACKWARD) ? 1 : 0;
                        static const int dquant_tab[4]={-1,1,-2,2};
2994
                        int storecoefs = s->mb_intra && s->dc_val[0];
B
Benoit Fouet 已提交
2995

2996
                        av_assert2(backup_s.dquant == 0);
B
Benoit Fouet 已提交
2997 2998 2999 3000 3001 3002 3003 3004 3005 3006

                        //FIXME intra
                        s->mv_dir= best_s.mv_dir;
                        s->mv_type = MV_TYPE_16X16;
                        s->mb_intra= best_s.mb_intra;
                        s->mv[0][0][0] = best_s.mv[0][0][0];
                        s->mv[0][0][1] = best_s.mv[0][0][1];
                        s->mv[1][0][0] = best_s.mv[1][0][0];
                        s->mv[1][0][1] = best_s.mv[1][0][1];

3007
                        qpi = s->pict_type == AV_PICTURE_TYPE_B ? 2 : 0;
B
Benoit Fouet 已提交
3008 3009 3010 3011 3012 3013
                        for(; qpi<4; qpi++){
                            int dquant= dquant_tab[qpi];
                            qp= last_qp + dquant;
                            if(qp < s->avctx->qmin || qp > s->avctx->qmax)
                                continue;
                            backup_s.dquant= dquant;
3014
                            if(storecoefs){
B
Benoit Fouet 已提交
3015 3016
                                for(i=0; i<6; i++){
                                    dc[i]= s->dc_val[0][ s->block_index[i] ];
D
Diego Biurrun 已提交
3017
                                    memcpy(ac[i], s->ac_val[0][s->block_index[i]], sizeof(int16_t)*16);
B
Benoit Fouet 已提交
3018 3019 3020 3021 3022 3023
                                }
                            }

                            encode_mb_hq(s, &backup_s, &best_s, CANDIDATE_MB_TYPE_INTER /* wrong but unused */, pb, pb2, tex_pb,
                                         &dmin, &next_block, s->mv[mvdir][0][0], s->mv[mvdir][0][1]);
                            if(best_s.qscale != qp){
3024
                                if(storecoefs){
B
Benoit Fouet 已提交
3025 3026
                                    for(i=0; i<6; i++){
                                        s->dc_val[0][ s->block_index[i] ]= dc[i];
D
Diego Biurrun 已提交
3027
                                        memcpy(s->ac_val[0][s->block_index[i]], ac[i], sizeof(int16_t)*16);
B
Benoit Fouet 已提交
3028 3029 3030 3031 3032 3033
                                    }
                                }
                            }
                        }
                    }
                }
3034
                if(CONFIG_MPEG4_ENCODER && mb_type&CANDIDATE_MB_TYPE_DIRECT){
B
Benoit Fouet 已提交
3035 3036 3037 3038 3039 3040 3041 3042 3043 3044
                    int mx= s->b_direct_mv_table[xy][0];
                    int my= s->b_direct_mv_table[xy][1];

                    backup_s.dquant = 0;
                    s->mv_dir = MV_DIR_FORWARD | MV_DIR_BACKWARD | MV_DIRECT;
                    s->mb_intra= 0;
                    ff_mpeg4_set_direct_mv(s, mx, my);
                    encode_mb_hq(s, &backup_s, &best_s, CANDIDATE_MB_TYPE_DIRECT, pb, pb2, tex_pb,
                                 &dmin, &next_block, mx, my);
                }
3045
                if(CONFIG_MPEG4_ENCODER && mb_type&CANDIDATE_MB_TYPE_DIRECT0){
B
Benoit Fouet 已提交
3046 3047 3048 3049 3050 3051 3052
                    backup_s.dquant = 0;
                    s->mv_dir = MV_DIR_FORWARD | MV_DIR_BACKWARD | MV_DIRECT;
                    s->mb_intra= 0;
                    ff_mpeg4_set_direct_mv(s, 0, 0);
                    encode_mb_hq(s, &backup_s, &best_s, CANDIDATE_MB_TYPE_DIRECT, pb, pb2, tex_pb,
                                 &dmin, &next_block, 0, 0);
                }
3053
                if (!best_s.mb_intra && s->mpv_flags & FF_MPV_FLAG_SKIP_RD) {
B
Benoit Fouet 已提交
3054 3055 3056 3057 3058 3059
                    int coded=0;
                    for(i=0; i<6; i++)
                        coded |= s->block_last_index[i];
                    if(coded){
                        int mx,my;
                        memcpy(s->mv, best_s.mv, sizeof(s->mv));
3060
                        if(CONFIG_MPEG4_ENCODER && best_s.mv_dir & MV_DIRECT){
B
Benoit Fouet 已提交
3061 3062 3063 3064 3065 3066 3067 3068 3069 3070 3071 3072 3073 3074 3075 3076 3077 3078 3079 3080 3081 3082 3083 3084 3085
                            mx=my=0; //FIXME find the one we actually used
                            ff_mpeg4_set_direct_mv(s, mx, my);
                        }else if(best_s.mv_dir&MV_DIR_BACKWARD){
                            mx= s->mv[1][0][0];
                            my= s->mv[1][0][1];
                        }else{
                            mx= s->mv[0][0][0];
                            my= s->mv[0][0][1];
                        }

                        s->mv_dir= best_s.mv_dir;
                        s->mv_type = best_s.mv_type;
                        s->mb_intra= 0;
/*                        s->mv[0][0][0] = best_s.mv[0][0][0];
                        s->mv[0][0][1] = best_s.mv[0][0][1];
                        s->mv[1][0][0] = best_s.mv[1][0][0];
                        s->mv[1][0][1] = best_s.mv[1][0][1];*/
                        backup_s.dquant= 0;
                        s->skipdct=1;
                        encode_mb_hq(s, &backup_s, &best_s, CANDIDATE_MB_TYPE_INTER /* wrong but unused */, pb, pb2, tex_pb,
                                        &dmin, &next_block, mx, my);
                        s->skipdct=0;
                    }
                }

3086
                s->current_picture.qscale_table[xy] = best_s.qscale;
B
Benoit Fouet 已提交
3087 3088 3089 3090 3091

                copy_context_after_encode(s, &best_s, -1);

                pb_bits_count= put_bits_count(&s->pb);
                flush_put_bits(&s->pb);
3092
                avpriv_copy_bits(&backup_s.pb, bit_buf[next_block^1], pb_bits_count);
B
Benoit Fouet 已提交
3093 3094 3095 3096 3097
                s->pb= backup_s.pb;

                if(s->data_partitioning){
                    pb2_bits_count= put_bits_count(&s->pb2);
                    flush_put_bits(&s->pb2);
3098
                    avpriv_copy_bits(&backup_s.pb2, bit_buf2[next_block^1], pb2_bits_count);
B
Benoit Fouet 已提交
3099 3100 3101 3102
                    s->pb2= backup_s.pb2;

                    tex_pb_bits_count= put_bits_count(&s->tex_pb);
                    flush_put_bits(&s->tex_pb);
3103
                    avpriv_copy_bits(&backup_s.tex_pb, bit_buf_tex[next_block^1], tex_pb_bits_count);
B
Benoit Fouet 已提交
3104 3105 3106 3107
                    s->tex_pb= backup_s.tex_pb;
                }
                s->last_bits= put_bits_count(&s->pb);

3108
                if (CONFIG_H263_ENCODER &&
3109
                    s->out_format == FMT_H263 && s->pict_type!=AV_PICTURE_TYPE_B)
B
Benoit Fouet 已提交
3110 3111 3112
                    ff_h263_update_motion_val(s);

                if(next_block==0){ //FIXME 16 vs linesize16
3113 3114 3115
                    s->hdsp.put_pixels_tab[0][0](s->dest[0], s->rd_scratchpad                     , s->linesize  ,16);
                    s->hdsp.put_pixels_tab[1][0](s->dest[1], s->rd_scratchpad + 16*s->linesize    , s->uvlinesize, 8);
                    s->hdsp.put_pixels_tab[1][0](s->dest[2], s->rd_scratchpad + 16*s->linesize + 8, s->uvlinesize, 8);
B
Benoit Fouet 已提交
3116 3117 3118
                }

                if(s->avctx->mb_decision == FF_MB_DECISION_BITS)
3119
                    ff_MPV_decode_mb(s, s->block);
B
Benoit Fouet 已提交
3120 3121 3122 3123 3124 3125 3126 3127 3128 3129 3130 3131 3132 3133 3134 3135 3136 3137 3138 3139 3140 3141 3142 3143 3144 3145 3146 3147 3148 3149 3150 3151 3152
            } else {
                int motion_x = 0, motion_y = 0;
                s->mv_type=MV_TYPE_16X16;
                // only one MB-Type possible

                switch(mb_type){
                case CANDIDATE_MB_TYPE_INTRA:
                    s->mv_dir = 0;
                    s->mb_intra= 1;
                    motion_x= s->mv[0][0][0] = 0;
                    motion_y= s->mv[0][0][1] = 0;
                    break;
                case CANDIDATE_MB_TYPE_INTER:
                    s->mv_dir = MV_DIR_FORWARD;
                    s->mb_intra= 0;
                    motion_x= s->mv[0][0][0] = s->p_mv_table[xy][0];
                    motion_y= s->mv[0][0][1] = s->p_mv_table[xy][1];
                    break;
                case CANDIDATE_MB_TYPE_INTER_I:
                    s->mv_dir = MV_DIR_FORWARD;
                    s->mv_type = MV_TYPE_FIELD;
                    s->mb_intra= 0;
                    for(i=0; i<2; i++){
                        j= s->field_select[0][i] = s->p_field_select_table[i][xy];
                        s->mv[0][i][0] = s->p_field_mv_table[i][j][xy][0];
                        s->mv[0][i][1] = s->p_field_mv_table[i][j][xy][1];
                    }
                    break;
                case CANDIDATE_MB_TYPE_INTER4V:
                    s->mv_dir = MV_DIR_FORWARD;
                    s->mv_type = MV_TYPE_8X8;
                    s->mb_intra= 0;
                    for(i=0; i<4; i++){
3153 3154
                        s->mv[0][i][0] = s->current_picture.motion_val[0][s->block_index[i]][0];
                        s->mv[0][i][1] = s->current_picture.motion_val[0][s->block_index[i]][1];
B
Benoit Fouet 已提交
3155 3156 3157
                    }
                    break;
                case CANDIDATE_MB_TYPE_DIRECT:
3158
                    if (CONFIG_MPEG4_ENCODER) {
A
Aurelien Jacobs 已提交
3159 3160 3161 3162 3163
                        s->mv_dir = MV_DIR_FORWARD|MV_DIR_BACKWARD|MV_DIRECT;
                        s->mb_intra= 0;
                        motion_x=s->b_direct_mv_table[xy][0];
                        motion_y=s->b_direct_mv_table[xy][1];
                        ff_mpeg4_set_direct_mv(s, motion_x, motion_y);
3164
                    }
B
Benoit Fouet 已提交
3165 3166
                    break;
                case CANDIDATE_MB_TYPE_DIRECT0:
3167
                    if (CONFIG_MPEG4_ENCODER) {
A
Aurelien Jacobs 已提交
3168 3169 3170
                        s->mv_dir = MV_DIR_FORWARD|MV_DIR_BACKWARD|MV_DIRECT;
                        s->mb_intra= 0;
                        ff_mpeg4_set_direct_mv(s, 0, 0);
3171
                    }
B
Benoit Fouet 已提交
3172 3173 3174 3175 3176 3177 3178 3179 3180 3181 3182 3183 3184 3185 3186 3187 3188 3189 3190 3191 3192 3193 3194 3195 3196 3197 3198 3199 3200 3201 3202 3203 3204 3205 3206 3207 3208 3209 3210 3211 3212 3213 3214 3215 3216 3217 3218 3219 3220 3221 3222 3223 3224 3225 3226 3227 3228 3229 3230 3231 3232 3233
                    break;
                case CANDIDATE_MB_TYPE_BIDIR:
                    s->mv_dir = MV_DIR_FORWARD | MV_DIR_BACKWARD;
                    s->mb_intra= 0;
                    s->mv[0][0][0] = s->b_bidir_forw_mv_table[xy][0];
                    s->mv[0][0][1] = s->b_bidir_forw_mv_table[xy][1];
                    s->mv[1][0][0] = s->b_bidir_back_mv_table[xy][0];
                    s->mv[1][0][1] = s->b_bidir_back_mv_table[xy][1];
                    break;
                case CANDIDATE_MB_TYPE_BACKWARD:
                    s->mv_dir = MV_DIR_BACKWARD;
                    s->mb_intra= 0;
                    motion_x= s->mv[1][0][0] = s->b_back_mv_table[xy][0];
                    motion_y= s->mv[1][0][1] = s->b_back_mv_table[xy][1];
                    break;
                case CANDIDATE_MB_TYPE_FORWARD:
                    s->mv_dir = MV_DIR_FORWARD;
                    s->mb_intra= 0;
                    motion_x= s->mv[0][0][0] = s->b_forw_mv_table[xy][0];
                    motion_y= s->mv[0][0][1] = s->b_forw_mv_table[xy][1];
                    break;
                case CANDIDATE_MB_TYPE_FORWARD_I:
                    s->mv_dir = MV_DIR_FORWARD;
                    s->mv_type = MV_TYPE_FIELD;
                    s->mb_intra= 0;
                    for(i=0; i<2; i++){
                        j= s->field_select[0][i] = s->b_field_select_table[0][i][xy];
                        s->mv[0][i][0] = s->b_field_mv_table[0][i][j][xy][0];
                        s->mv[0][i][1] = s->b_field_mv_table[0][i][j][xy][1];
                    }
                    break;
                case CANDIDATE_MB_TYPE_BACKWARD_I:
                    s->mv_dir = MV_DIR_BACKWARD;
                    s->mv_type = MV_TYPE_FIELD;
                    s->mb_intra= 0;
                    for(i=0; i<2; i++){
                        j= s->field_select[1][i] = s->b_field_select_table[1][i][xy];
                        s->mv[1][i][0] = s->b_field_mv_table[1][i][j][xy][0];
                        s->mv[1][i][1] = s->b_field_mv_table[1][i][j][xy][1];
                    }
                    break;
                case CANDIDATE_MB_TYPE_BIDIR_I:
                    s->mv_dir = MV_DIR_FORWARD | MV_DIR_BACKWARD;
                    s->mv_type = MV_TYPE_FIELD;
                    s->mb_intra= 0;
                    for(dir=0; dir<2; dir++){
                        for(i=0; i<2; i++){
                            j= s->field_select[dir][i] = s->b_field_select_table[dir][i][xy];
                            s->mv[dir][i][0] = s->b_field_mv_table[dir][i][j][xy][0];
                            s->mv[dir][i][1] = s->b_field_mv_table[dir][i][j][xy][1];
                        }
                    }
                    break;
                default:
                    av_log(s->avctx, AV_LOG_ERROR, "illegal MB type\n");
                }

                encode_mb(s, motion_x, motion_y);

                // RAL: Update last macroblock type
                s->last_mv_dir = s->mv_dir;

3234
                if (CONFIG_H263_ENCODER &&
3235
                    s->out_format == FMT_H263 && s->pict_type!=AV_PICTURE_TYPE_B)
B
Benoit Fouet 已提交
3236 3237
                    ff_h263_update_motion_val(s);

3238
                ff_MPV_decode_mb(s, s->block);
B
Benoit Fouet 已提交
3239 3240 3241 3242 3243 3244 3245 3246 3247 3248 3249 3250 3251 3252 3253
            }

            /* clean the MV table in IPS frames for direct mode in B frames */
            if(s->mb_intra /* && I,P,S_TYPE */){
                s->p_mv_table[xy][0]=0;
                s->p_mv_table[xy][1]=0;
            }

            if(s->flags&CODEC_FLAG_PSNR){
                int w= 16;
                int h= 16;

                if(s->mb_x*16 + 16 > s->width ) w= s->width - s->mb_x*16;
                if(s->mb_y*16 + 16 > s->height) h= s->height- s->mb_y*16;

3254 3255
                s->current_picture.f->error[0] += sse(
                    s, s->new_picture.f->data[0] + s->mb_x*16 + s->mb_y*s->linesize*16,
B
Benoit Fouet 已提交
3256
                    s->dest[0], w, h, s->linesize);
3257 3258
                s->current_picture.f->error[1] += sse(
                    s, s->new_picture.f->data[1] + s->mb_x*8  + s->mb_y*s->uvlinesize*chr_h,
B
Baptiste Coudurier 已提交
3259
                    s->dest[1], w>>1, h>>s->chroma_y_shift, s->uvlinesize);
3260 3261
                s->current_picture.f->error[2] += sse(
                    s, s->new_picture.f->data[2] + s->mb_x*8  + s->mb_y*s->uvlinesize*chr_h,
B
Baptiste Coudurier 已提交
3262
                    s->dest[2], w>>1, h>>s->chroma_y_shift, s->uvlinesize);
B
Benoit Fouet 已提交
3263 3264
            }
            if(s->loop_filter){
3265
                if(CONFIG_H263_ENCODER && s->out_format == FMT_H263)
B
Benoit Fouet 已提交
3266 3267
                    ff_h263_loop_filter(s);
            }
3268 3269
            av_dlog(s->avctx, "MB %d %d bits\n",
                    s->mb_x + s->mb_y * s->mb_stride, put_bits_count(&s->pb));
B
Benoit Fouet 已提交
3270 3271 3272 3273
        }
    }

    //not beautiful here but we must write it before flushing so it has to be here
3274
    if (CONFIG_MSMPEG4_ENCODER && s->msmpeg4_version && s->msmpeg4_version<4 && s->pict_type == AV_PICTURE_TYPE_I)
3275
        ff_msmpeg4_encode_ext_header(s);
B
Benoit Fouet 已提交
3276 3277 3278 3279 3280 3281

    write_slice_end(s);

    /* Send the last GOB if RTP */
    if (s->avctx->rtp_callback) {
        int number_mb = (mb_y - s->resync_mb_y)*s->mb_width - s->resync_mb_x;
3282
        pdif = put_bits_ptr(&s->pb) - s->ptr_lastgob;
B
Benoit Fouet 已提交
3283 3284 3285 3286 3287 3288 3289 3290 3291 3292 3293 3294 3295 3296 3297 3298 3299 3300 3301 3302 3303 3304 3305 3306 3307 3308 3309 3310
        /* Call the RTP callback to send the last GOB */
        emms_c();
        s->avctx->rtp_callback(s->avctx, s->ptr_lastgob, pdif, number_mb);
    }

    return 0;
}

#define MERGE(field) dst->field += src->field; src->field=0
static void merge_context_after_me(MpegEncContext *dst, MpegEncContext *src){
    MERGE(me.scene_change_score);
    MERGE(me.mc_mb_var_sum_temp);
    MERGE(me.mb_var_sum_temp);
}

static void merge_context_after_encode(MpegEncContext *dst, MpegEncContext *src){
    int i;

    MERGE(dct_count[0]); //note, the other dct vars are not part of the context
    MERGE(dct_count[1]);
    MERGE(mv_bits);
    MERGE(i_tex_bits);
    MERGE(p_tex_bits);
    MERGE(i_count);
    MERGE(f_count);
    MERGE(b_count);
    MERGE(skip_count);
    MERGE(misc_bits);
3311
    MERGE(er.error_count);
B
Benoit Fouet 已提交
3312
    MERGE(padding_bug_score);
3313 3314 3315
    MERGE(current_picture.f->error[0]);
    MERGE(current_picture.f->error[1]);
    MERGE(current_picture.f->error[2]);
B
Benoit Fouet 已提交
3316 3317 3318 3319 3320 3321 3322 3323 3324 3325

    if(dst->avctx->noise_reduction){
        for(i=0; i<64; i++){
            MERGE(dct_error_sum[0][i]);
            MERGE(dct_error_sum[1][i]);
        }
    }

    assert(put_bits_count(&src->pb) % 8 ==0);
    assert(put_bits_count(&dst->pb) % 8 ==0);
3326
    avpriv_copy_bits(&dst->pb, src->pb.buf, put_bits_count(&src->pb));
B
Benoit Fouet 已提交
3327 3328 3329 3330 3331
    flush_put_bits(&dst->pb);
}

static int estimate_qp(MpegEncContext *s, int dry_run){
    if (s->next_lambda){
3332 3333
        s->current_picture_ptr->f->quality =
        s->current_picture.f->quality = s->next_lambda;
B
Benoit Fouet 已提交
3334 3335
        if(!dry_run) s->next_lambda= 0;
    } else if (!s->fixed_qscale) {
3336 3337 3338
        s->current_picture_ptr->f->quality =
        s->current_picture.f->quality = ff_rate_estimate_qscale(s, dry_run);
        if (s->current_picture.f->quality < 0)
B
Benoit Fouet 已提交
3339 3340 3341 3342 3343
            return -1;
    }

    if(s->adaptive_quant){
        switch(s->codec_id){
3344
        case AV_CODEC_ID_MPEG4:
3345
            if (CONFIG_MPEG4_ENCODER)
A
Aurelien Jacobs 已提交
3346
                ff_clean_mpeg4_qscales(s);
B
Benoit Fouet 已提交
3347
            break;
3348 3349 3350
        case AV_CODEC_ID_H263:
        case AV_CODEC_ID_H263P:
        case AV_CODEC_ID_FLV1:
3351
            if (CONFIG_H263_ENCODER)
A
Aurelien Jacobs 已提交
3352
                ff_clean_h263_qscales(s);
B
Benoit Fouet 已提交
3353
            break;
3354 3355
        default:
            ff_init_qscale_tab(s);
B
Benoit Fouet 已提交
3356 3357 3358 3359 3360
        }

        s->lambda= s->lambda_table[0];
        //FIXME broken
    }else
3361
        s->lambda = s->current_picture.f->quality;
B
Benoit Fouet 已提交
3362 3363 3364 3365
    update_qscale(s);
    return 0;
}

3366 3367
/* must be called before writing the header */
static void set_frame_distances(MpegEncContext * s){
3368
    av_assert1(s->current_picture_ptr->f->pts != AV_NOPTS_VALUE);
3369
    s->time = s->current_picture_ptr->f->pts * s->avctx->time_base.num;
3370

3371
    if(s->pict_type==AV_PICTURE_TYPE_B){
3372 3373 3374 3375 3376 3377 3378 3379 3380
        s->pb_time= s->pp_time - (s->last_non_b_time - s->time);
        assert(s->pb_time > 0 && s->pb_time < s->pp_time);
    }else{
        s->pp_time= s->time - s->last_non_b_time;
        s->last_non_b_time= s->time;
        assert(s->picture_number==0 || s->pp_time > 0);
    }
}

B
Benoit Fouet 已提交
3381 3382
static int encode_picture(MpegEncContext *s, int picture_number)
{
3383
    int i, ret;
B
Benoit Fouet 已提交
3384
    int bits;
3385
    int context_count = s->slice_context_count;
B
Benoit Fouet 已提交
3386 3387 3388 3389 3390 3391 3392 3393 3394

    s->picture_number = picture_number;

    /* Reset the average MB variance */
    s->me.mb_var_sum_temp    =
    s->me.mc_mb_var_sum_temp = 0;

    /* we need to initialize some time vars before we can encode b-frames */
    // RAL: Condition added for MPEG1VIDEO
3395
    if (s->codec_id == AV_CODEC_ID_MPEG1VIDEO || s->codec_id == AV_CODEC_ID_MPEG2VIDEO || (s->h263_pred && !s->msmpeg4_version))
3396
        set_frame_distances(s);
3397
    if(CONFIG_MPEG4_ENCODER && s->codec_id == AV_CODEC_ID_MPEG4)
3398
        ff_set_mpeg4_time(s);
B
Benoit Fouet 已提交
3399 3400 3401

    s->me.scene_change_score=0;

R
Ramiro Polla 已提交
3402
//    s->lambda= s->current_picture_ptr->quality; //FIXME qscale / ... stuff for ME rate distortion
B
Benoit Fouet 已提交
3403

3404
    if(s->pict_type==AV_PICTURE_TYPE_I){
B
Benoit Fouet 已提交
3405 3406
        if(s->msmpeg4_version >= 3) s->no_rounding=1;
        else                        s->no_rounding=0;
3407
    }else if(s->pict_type!=AV_PICTURE_TYPE_B){
3408
        if(s->flipflop_rounding || s->codec_id == AV_CODEC_ID_H263P || s->codec_id == AV_CODEC_ID_MPEG4)
B
Benoit Fouet 已提交
3409 3410 3411 3412 3413 3414 3415 3416
            s->no_rounding ^= 1;
    }

    if(s->flags & CODEC_FLAG_PASS2){
        if (estimate_qp(s,1) < 0)
            return -1;
        ff_get_2pass_fcode(s);
    }else if(!(s->flags & CODEC_FLAG_QSCALE)){
3417
        if(s->pict_type==AV_PICTURE_TYPE_B)
B
Benoit Fouet 已提交
3418 3419 3420 3421 3422 3423
            s->lambda= s->last_lambda_for[s->pict_type];
        else
            s->lambda= s->last_lambda_for[s->last_non_b_pict_type];
        update_qscale(s);
    }

3424
    if(s->codec_id != AV_CODEC_ID_AMV && s->codec_id != AV_CODEC_ID_MJPEG){
3425 3426 3427 3428 3429 3430
        if(s->q_chroma_intra_matrix   != s->q_intra_matrix  ) av_freep(&s->q_chroma_intra_matrix);
        if(s->q_chroma_intra_matrix16 != s->q_intra_matrix16) av_freep(&s->q_chroma_intra_matrix16);
        s->q_chroma_intra_matrix   = s->q_intra_matrix;
        s->q_chroma_intra_matrix16 = s->q_intra_matrix16;
    }

B
Benoit Fouet 已提交
3431
    s->mb_intra=0; //for the rate distortion & bit compare functions
3432
    for(i=1; i<context_count; i++){
3433 3434 3435
        ret = ff_update_duplicate_context(s->thread_context[i], s);
        if (ret < 0)
            return ret;
B
Benoit Fouet 已提交
3436 3437
    }

3438 3439
    if(ff_init_me(s)<0)
        return -1;
B
Benoit Fouet 已提交
3440 3441

    /* Estimate motion for every MB */
3442
    if(s->pict_type != AV_PICTURE_TYPE_I){
B
Benoit Fouet 已提交
3443 3444
        s->lambda = (s->lambda * s->avctx->me_penalty_compensation + 128)>>8;
        s->lambda2= (s->lambda2* (int64_t)s->avctx->me_penalty_compensation + 128)>>8;
3445
        if (s->pict_type != AV_PICTURE_TYPE_B) {
3446
            if((s->avctx->pre_me && s->last_non_b_pict_type==AV_PICTURE_TYPE_I) || s->avctx->pre_me==2){
3447
                s->avctx->execute(s->avctx, pre_estimate_motion_thread, &s->thread_context[0], NULL, context_count, sizeof(void*));
B
Benoit Fouet 已提交
3448 3449 3450
            }
        }

3451
        s->avctx->execute(s->avctx, estimate_motion_thread, &s->thread_context[0], NULL, context_count, sizeof(void*));
3452
    }else /* if(s->pict_type == AV_PICTURE_TYPE_I) */{
B
Benoit Fouet 已提交
3453 3454 3455 3456 3457 3458
        /* I-Frame */
        for(i=0; i<s->mb_stride*s->mb_height; i++)
            s->mb_type[i]= CANDIDATE_MB_TYPE_INTRA;

        if(!s->fixed_qscale){
            /* finding spatial complexity for I-frame rate control */
3459
            s->avctx->execute(s->avctx, mb_var_thread, &s->thread_context[0], NULL, context_count, sizeof(void*));
B
Benoit Fouet 已提交
3460 3461
        }
    }
3462
    for(i=1; i<context_count; i++){
B
Benoit Fouet 已提交
3463 3464 3465 3466 3467 3468
        merge_context_after_me(s, s->thread_context[i]);
    }
    s->current_picture.mc_mb_var_sum= s->current_picture_ptr->mc_mb_var_sum= s->me.mc_mb_var_sum_temp;
    s->current_picture.   mb_var_sum= s->current_picture_ptr->   mb_var_sum= s->me.   mb_var_sum_temp;
    emms_c();

3469 3470
    if(s->me.scene_change_score > s->avctx->scenechange_threshold && s->pict_type == AV_PICTURE_TYPE_P){
        s->pict_type= AV_PICTURE_TYPE_I;
B
Benoit Fouet 已提交
3471 3472
        for(i=0; i<s->mb_stride*s->mb_height; i++)
            s->mb_type[i]= CANDIDATE_MB_TYPE_INTRA;
3473 3474
        if(s->msmpeg4_version >= 3)
            s->no_rounding=1;
3475
        av_dlog(s, "Scene change detected, encoding as I Frame %"PRId64" %"PRId64"\n",
3476
                s->current_picture.mb_var_sum, s->current_picture.mc_mb_var_sum);
B
Benoit Fouet 已提交
3477 3478 3479
    }

    if(!s->umvplus){
3480
        if(s->pict_type==AV_PICTURE_TYPE_P || s->pict_type==AV_PICTURE_TYPE_S) {
B
Benoit Fouet 已提交
3481 3482 3483 3484 3485 3486
            s->f_code= ff_get_best_fcode(s, s->p_mv_table, CANDIDATE_MB_TYPE_INTER);

            if(s->flags & CODEC_FLAG_INTERLACED_ME){
                int a,b;
                a= ff_get_best_fcode(s, s->p_field_mv_table[0][0], CANDIDATE_MB_TYPE_INTER_I); //FIXME field_select
                b= ff_get_best_fcode(s, s->p_field_mv_table[1][1], CANDIDATE_MB_TYPE_INTER_I);
3487
                s->f_code= FFMAX3(s->f_code, a, b);
B
Benoit Fouet 已提交
3488 3489 3490 3491 3492 3493 3494 3495 3496 3497 3498 3499 3500 3501
            }

            ff_fix_long_p_mvs(s);
            ff_fix_long_mvs(s, NULL, 0, s->p_mv_table, s->f_code, CANDIDATE_MB_TYPE_INTER, 0);
            if(s->flags & CODEC_FLAG_INTERLACED_ME){
                int j;
                for(i=0; i<2; i++){
                    for(j=0; j<2; j++)
                        ff_fix_long_mvs(s, s->p_field_select_table[i], j,
                                        s->p_field_mv_table[i][j], s->f_code, CANDIDATE_MB_TYPE_INTER_I, 0);
                }
            }
        }

3502
        if(s->pict_type==AV_PICTURE_TYPE_B){
B
Benoit Fouet 已提交
3503 3504 3505 3506 3507 3508 3509 3510 3511 3512 3513 3514 3515 3516 3517 3518 3519 3520 3521 3522 3523 3524 3525 3526 3527 3528 3529 3530 3531 3532 3533 3534 3535
            int a, b;

            a = ff_get_best_fcode(s, s->b_forw_mv_table, CANDIDATE_MB_TYPE_FORWARD);
            b = ff_get_best_fcode(s, s->b_bidir_forw_mv_table, CANDIDATE_MB_TYPE_BIDIR);
            s->f_code = FFMAX(a, b);

            a = ff_get_best_fcode(s, s->b_back_mv_table, CANDIDATE_MB_TYPE_BACKWARD);
            b = ff_get_best_fcode(s, s->b_bidir_back_mv_table, CANDIDATE_MB_TYPE_BIDIR);
            s->b_code = FFMAX(a, b);

            ff_fix_long_mvs(s, NULL, 0, s->b_forw_mv_table, s->f_code, CANDIDATE_MB_TYPE_FORWARD, 1);
            ff_fix_long_mvs(s, NULL, 0, s->b_back_mv_table, s->b_code, CANDIDATE_MB_TYPE_BACKWARD, 1);
            ff_fix_long_mvs(s, NULL, 0, s->b_bidir_forw_mv_table, s->f_code, CANDIDATE_MB_TYPE_BIDIR, 1);
            ff_fix_long_mvs(s, NULL, 0, s->b_bidir_back_mv_table, s->b_code, CANDIDATE_MB_TYPE_BIDIR, 1);
            if(s->flags & CODEC_FLAG_INTERLACED_ME){
                int dir, j;
                for(dir=0; dir<2; dir++){
                    for(i=0; i<2; i++){
                        for(j=0; j<2; j++){
                            int type= dir ? (CANDIDATE_MB_TYPE_BACKWARD_I|CANDIDATE_MB_TYPE_BIDIR_I)
                                          : (CANDIDATE_MB_TYPE_FORWARD_I |CANDIDATE_MB_TYPE_BIDIR_I);
                            ff_fix_long_mvs(s, s->b_field_select_table[dir][i], j,
                                            s->b_field_mv_table[dir][i][j], dir ? s->b_code : s->f_code, type, 1);
                        }
                    }
                }
            }
        }
    }

    if (estimate_qp(s, 0) < 0)
        return -1;

3536
    if(s->qscale < 3 && s->max_qcoeff<=128 && s->pict_type==AV_PICTURE_TYPE_I && !(s->flags & CODEC_FLAG_QSCALE))
B
Benoit Fouet 已提交
3537 3538 3539
        s->qscale= 3; //reduce clipping problems

    if (s->out_format == FMT_MJPEG) {
3540 3541 3542 3543 3544 3545 3546
        const uint16_t *  luma_matrix = ff_mpeg1_default_intra_matrix;
        const uint16_t *chroma_matrix = ff_mpeg1_default_intra_matrix;

        if (s->avctx->intra_matrix) {
            chroma_matrix =
            luma_matrix = s->avctx->intra_matrix;
        }
3547 3548
        if (s->avctx->chroma_intra_matrix)
            chroma_matrix = s->avctx->chroma_intra_matrix;
3549

B
Benoit Fouet 已提交
3550 3551 3552 3553
        /* for mjpeg, we do include qscale in the matrix */
        for(i=1;i<64;i++){
            int j= s->dsp.idct_permutation[i];

3554 3555
            s->chroma_intra_matrix[j] = av_clip_uint8((chroma_matrix[i] * s->qscale) >> 3);
            s->       intra_matrix[j] = av_clip_uint8((  luma_matrix[i] * s->qscale) >> 3);
B
Benoit Fouet 已提交
3556
        }
3557
        s->y_dc_scale_table=
3558
        s->c_dc_scale_table= ff_mpeg2_dc_scale_table[s->intra_dc_precision];
3559
        s->chroma_intra_matrix[0] =
3560
        s->intra_matrix[0] = ff_mpeg2_dc_scale_table[s->intra_dc_precision][8];
3561
        ff_convert_matrix(&s->dsp, s->q_intra_matrix, s->q_intra_matrix16,
B
Benoit Fouet 已提交
3562
                       s->intra_matrix, s->intra_quant_bias, 8, 8, 1);
3563 3564
        ff_convert_matrix(&s->dsp, s->q_chroma_intra_matrix, s->q_chroma_intra_matrix16,
                       s->chroma_intra_matrix, s->intra_quant_bias, 8, 8, 1);
B
Benoit Fouet 已提交
3565 3566
        s->qscale= 8;
    }
3567
    if(s->codec_id == AV_CODEC_ID_AMV){
M
Michael Niedermayer 已提交
3568 3569 3570 3571 3572
        static const uint8_t y[32]={13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13};
        static const uint8_t c[32]={14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14};
        for(i=1;i<64;i++){
            int j= s->dsp.idct_permutation[ff_zigzag_direct[i]];

3573 3574
            s->intra_matrix[j] = sp5x_quant_table[5*2+0][i];
            s->chroma_intra_matrix[j] = sp5x_quant_table[5*2+1][i];
M
Michael Niedermayer 已提交
3575 3576 3577
        }
        s->y_dc_scale_table= y;
        s->c_dc_scale_table= c;
3578 3579
        s->intra_matrix[0] = 13;
        s->chroma_intra_matrix[0] = 14;
M
Michael Niedermayer 已提交
3580 3581
        ff_convert_matrix(&s->dsp, s->q_intra_matrix, s->q_intra_matrix16,
                       s->intra_matrix, s->intra_quant_bias, 8, 8, 1);
3582 3583
        ff_convert_matrix(&s->dsp, s->q_chroma_intra_matrix, s->q_chroma_intra_matrix16,
                       s->chroma_intra_matrix, s->intra_quant_bias, 8, 8, 1);
M
Michael Niedermayer 已提交
3584 3585
        s->qscale= 8;
    }
B
Benoit Fouet 已提交
3586 3587

    //FIXME var duplication
3588 3589 3590 3591
    s->current_picture_ptr->f->key_frame =
    s->current_picture.f->key_frame = s->pict_type == AV_PICTURE_TYPE_I; //FIXME pic_ptr
    s->current_picture_ptr->f->pict_type =
    s->current_picture.f->pict_type = s->pict_type;
B
Benoit Fouet 已提交
3592

3593
    if (s->current_picture.f->key_frame)
B
Benoit Fouet 已提交
3594 3595
        s->picture_in_gop_number=0;

3596
    s->mb_x = s->mb_y = 0;
B
Benoit Fouet 已提交
3597 3598 3599
    s->last_bits= put_bits_count(&s->pb);
    switch(s->out_format) {
    case FMT_MJPEG:
3600
        if (CONFIG_MJPEG_ENCODER)
3601
            ff_mjpeg_encode_picture_header(s->avctx, &s->pb, &s->intra_scantable,
3602
                                           s->intra_matrix, s->chroma_intra_matrix);
B
Benoit Fouet 已提交
3603 3604
        break;
    case FMT_H261:
3605
        if (CONFIG_H261_ENCODER)
B
Benoit Fouet 已提交
3606 3607 3608
            ff_h261_encode_picture_header(s, picture_number);
        break;
    case FMT_H263:
3609
        if (CONFIG_WMV2_ENCODER && s->codec_id == AV_CODEC_ID_WMV2)
B
Benoit Fouet 已提交
3610
            ff_wmv2_encode_picture_header(s, picture_number);
3611
        else if (CONFIG_MSMPEG4_ENCODER && s->msmpeg4_version)
3612
            ff_msmpeg4_encode_picture_header(s, picture_number);
3613
        else if (CONFIG_MPEG4_ENCODER && s->h263_pred)
3614
            ff_mpeg4_encode_picture_header(s, picture_number);
3615
        else if (CONFIG_RV10_ENCODER && s->codec_id == AV_CODEC_ID_RV10)
3616
            ff_rv10_encode_picture_header(s, picture_number);
3617
        else if (CONFIG_RV20_ENCODER && s->codec_id == AV_CODEC_ID_RV20)
3618
            ff_rv20_encode_picture_header(s, picture_number);
3619
        else if (CONFIG_FLV_ENCODER && s->codec_id == AV_CODEC_ID_FLV1)
B
Benoit Fouet 已提交
3620
            ff_flv_encode_picture_header(s, picture_number);
3621
        else if (CONFIG_H263_ENCODER)
3622
            ff_h263_encode_picture_header(s, picture_number);
B
Benoit Fouet 已提交
3623 3624
        break;
    case FMT_MPEG1:
3625
        if (CONFIG_MPEG1VIDEO_ENCODER || CONFIG_MPEG2VIDEO_ENCODER)
3626
            ff_mpeg1_encode_picture_header(s, picture_number);
B
Benoit Fouet 已提交
3627 3628
        break;
    default:
3629
        av_assert0(0);
B
Benoit Fouet 已提交
3630 3631 3632 3633
    }
    bits= put_bits_count(&s->pb);
    s->header_bits= bits - s->last_bits;

3634
    for(i=1; i<context_count; i++){
B
Benoit Fouet 已提交
3635 3636
        update_duplicate_context_after_me(s->thread_context[i], s);
    }
3637 3638
    s->avctx->execute(s->avctx, encode_thread, &s->thread_context[0], NULL, context_count, sizeof(void*));
    for(i=1; i<context_count; i++){
B
Benoit Fouet 已提交
3639 3640 3641 3642 3643 3644
        merge_context_after_encode(s, s->thread_context[i]);
    }
    emms_c();
    return 0;
}

D
Diego Biurrun 已提交
3645
static void denoise_dct_c(MpegEncContext *s, int16_t *block){
B
Benoit Fouet 已提交
3646 3647 3648 3649 3650 3651 3652 3653 3654 3655 3656 3657 3658 3659 3660 3661 3662 3663 3664 3665 3666 3667 3668
    const int intra= s->mb_intra;
    int i;

    s->dct_count[intra]++;

    for(i=0; i<64; i++){
        int level= block[i];

        if(level){
            if(level>0){
                s->dct_error_sum[intra][i] += level;
                level -= s->dct_offset[intra][i];
                if(level<0) level=0;
            }else{
                s->dct_error_sum[intra][i] -= level;
                level += s->dct_offset[intra][i];
                if(level>0) level=0;
            }
            block[i]= level;
        }
    }
}

3669
static int dct_quantize_trellis_c(MpegEncContext *s,
D
Diego Biurrun 已提交
3670
                                  int16_t *block, int n,
3671
                                  int qscale, int *overflow){
B
Benoit Fouet 已提交
3672 3673 3674 3675 3676 3677 3678 3679 3680 3681 3682 3683 3684 3685 3686 3687 3688 3689 3690 3691 3692 3693 3694 3695 3696 3697 3698 3699 3700 3701 3702 3703 3704 3705 3706 3707 3708 3709 3710 3711 3712 3713 3714 3715 3716 3717 3718 3719
    const int *qmat;
    const uint8_t *scantable= s->intra_scantable.scantable;
    const uint8_t *perm_scantable= s->intra_scantable.permutated;
    int max=0;
    unsigned int threshold1, threshold2;
    int bias=0;
    int run_tab[65];
    int level_tab[65];
    int score_tab[65];
    int survivor[65];
    int survivor_count;
    int last_run=0;
    int last_level=0;
    int last_score= 0;
    int last_i;
    int coeff[2][64];
    int coeff_count[64];
    int qmul, qadd, start_i, last_non_zero, i, dc;
    const int esc_length= s->ac_esc_length;
    uint8_t * length;
    uint8_t * last_length;
    const int lambda= s->lambda2 >> (FF_LAMBDA_SHIFT - 6);

    s->dsp.fdct (block);

    if(s->dct_error_sum)
        s->denoise_dct(s, block);
    qmul= qscale*16;
    qadd= ((qscale-1)|1)*8;

    if (s->mb_intra) {
        int q;
        if (!s->h263_aic) {
            if (n < 4)
                q = s->y_dc_scale;
            else
                q = s->c_dc_scale;
            q = q << 3;
        } else{
            /* For AIC we skip quant/dequant of INTRADC */
            q = 1 << 3;
            qadd=0;
        }

        /* note: block[0] is assumed to be positive */
        block[0] = (block[0] + (q >> 1)) / q;
        start_i = 1;
        last_non_zero = 0;
3720
        qmat = n < 4 ? s->q_intra_matrix[qscale] : s->q_chroma_intra_matrix[qscale];
B
Benoit Fouet 已提交
3721 3722 3723 3724 3725 3726 3727 3728 3729 3730 3731 3732 3733 3734 3735 3736 3737 3738 3739 3740 3741 3742 3743 3744 3745 3746 3747 3748 3749 3750 3751 3752 3753 3754 3755 3756 3757 3758 3759 3760 3761 3762 3763 3764 3765
        if(s->mpeg_quant || s->out_format == FMT_MPEG1)
            bias= 1<<(QMAT_SHIFT-1);
        length     = s->intra_ac_vlc_length;
        last_length= s->intra_ac_vlc_last_length;
    } else {
        start_i = 0;
        last_non_zero = -1;
        qmat = s->q_inter_matrix[qscale];
        length     = s->inter_ac_vlc_length;
        last_length= s->inter_ac_vlc_last_length;
    }
    last_i= start_i;

    threshold1= (1<<QMAT_SHIFT) - bias - 1;
    threshold2= (threshold1<<1);

    for(i=63; i>=start_i; i--) {
        const int j = scantable[i];
        int level = block[j] * qmat[j];

        if(((unsigned)(level+threshold1))>threshold2){
            last_non_zero = i;
            break;
        }
    }

    for(i=start_i; i<=last_non_zero; i++) {
        const int j = scantable[i];
        int level = block[j] * qmat[j];

//        if(   bias+level >= (1<<(QMAT_SHIFT - 3))
//           || bias-level >= (1<<(QMAT_SHIFT - 3))){
        if(((unsigned)(level+threshold1))>threshold2){
            if(level>0){
                level= (bias + level)>>QMAT_SHIFT;
                coeff[0][i]= level;
                coeff[1][i]= level-1;
//                coeff[2][k]= level-2;
            }else{
                level= (bias - level)>>QMAT_SHIFT;
                coeff[0][i]= -level;
                coeff[1][i]= -level+1;
//                coeff[2][k]= -level+2;
            }
            coeff_count[i]= FFMIN(level, 2);
3766
            av_assert2(coeff_count[i]);
B
Benoit Fouet 已提交
3767 3768 3769 3770 3771 3772 3773 3774 3775 3776
            max |=level;
        }else{
            coeff[0][i]= (level>>31)|1;
            coeff_count[i]= 1;
        }
    }

    *overflow= s->max_qcoeff < max; //overflow might have happened

    if(last_non_zero < start_i){
D
Diego Biurrun 已提交
3777
        memset(block + start_i, 0, (64-start_i)*sizeof(int16_t));
B
Benoit Fouet 已提交
3778 3779 3780 3781 3782 3783 3784 3785
        return last_non_zero;
    }

    score_tab[start_i]= 0;
    survivor[0]= start_i;
    survivor_count= 1;

    for(i=start_i; i<=last_non_zero; i++){
R
Ramiro Polla 已提交
3786
        int level_index, j, zero_distortion;
3787
        int dct_coeff= FFABS(block[ scantable[i] ]);
B
Benoit Fouet 已提交
3788
        int best_score=256*256*256*120;
3789

3790
        if (s->dsp.fdct == ff_fdct_ifast)
3791
            dct_coeff= (dct_coeff*ff_inv_aanscales[ scantable[i] ]) >> 12;
R
Ramiro Polla 已提交
3792
        zero_distortion= dct_coeff*dct_coeff;
3793

B
Benoit Fouet 已提交
3794
        for(level_index=0; level_index < coeff_count[i]; level_index++){
R
Ramiro Polla 已提交
3795
            int distortion;
B
Benoit Fouet 已提交
3796 3797 3798 3799
            int level= coeff[level_index][i];
            const int alevel= FFABS(level);
            int unquant_coeff;

3800
            av_assert2(level);
B
Benoit Fouet 已提交
3801

3802
            if(s->out_format == FMT_H263 || s->out_format == FMT_H261){
B
Benoit Fouet 已提交
3803 3804 3805 3806 3807 3808 3809 3810 3811 3812 3813 3814 3815
                unquant_coeff= alevel*qmul + qadd;
            }else{ //MPEG1
                j= s->dsp.idct_permutation[ scantable[i] ]; //FIXME optimize
                if(s->mb_intra){
                        unquant_coeff = (int)(  alevel  * qscale * s->intra_matrix[j]) >> 3;
                        unquant_coeff =   (unquant_coeff - 1) | 1;
                }else{
                        unquant_coeff = (((  alevel  << 1) + 1) * qscale * ((int) s->inter_matrix[j])) >> 4;
                        unquant_coeff =   (unquant_coeff - 1) | 1;
                }
                unquant_coeff<<= 3;
            }

R
Ramiro Polla 已提交
3816
            distortion= (unquant_coeff - dct_coeff) * (unquant_coeff - dct_coeff) - zero_distortion;
B
Benoit Fouet 已提交
3817 3818 3819 3820
            level+=64;
            if((level&(~127)) == 0){
                for(j=survivor_count-1; j>=0; j--){
                    int run= i - survivor[j];
R
Ramiro Polla 已提交
3821
                    int score= distortion + length[UNI_AC_ENC_INDEX(run, level)]*lambda;
B
Benoit Fouet 已提交
3822 3823 3824 3825 3826 3827 3828 3829 3830
                    score += score_tab[i-run];

                    if(score < best_score){
                        best_score= score;
                        run_tab[i+1]= run;
                        level_tab[i+1]= level-64;
                    }
                }

3831
                if(s->out_format == FMT_H263 || s->out_format == FMT_H261){
B
Benoit Fouet 已提交
3832 3833
                    for(j=survivor_count-1; j>=0; j--){
                        int run= i - survivor[j];
R
Ramiro Polla 已提交
3834
                        int score= distortion + last_length[UNI_AC_ENC_INDEX(run, level)]*lambda;
B
Benoit Fouet 已提交
3835 3836 3837 3838 3839 3840 3841 3842 3843 3844
                        score += score_tab[i-run];
                        if(score < last_score){
                            last_score= score;
                            last_run= run;
                            last_level= level-64;
                            last_i= i+1;
                        }
                    }
                }
            }else{
R
Ramiro Polla 已提交
3845
                distortion += esc_length*lambda;
B
Benoit Fouet 已提交
3846 3847
                for(j=survivor_count-1; j>=0; j--){
                    int run= i - survivor[j];
R
Ramiro Polla 已提交
3848
                    int score= distortion + score_tab[i-run];
B
Benoit Fouet 已提交
3849 3850 3851 3852 3853 3854 3855 3856

                    if(score < best_score){
                        best_score= score;
                        run_tab[i+1]= run;
                        level_tab[i+1]= level-64;
                    }
                }

3857
                if(s->out_format == FMT_H263 || s->out_format == FMT_H261){
B
Benoit Fouet 已提交
3858 3859
                  for(j=survivor_count-1; j>=0; j--){
                        int run= i - survivor[j];
R
Ramiro Polla 已提交
3860
                        int score= distortion + score_tab[i-run];
B
Benoit Fouet 已提交
3861 3862 3863 3864 3865 3866 3867 3868 3869 3870 3871 3872 3873 3874 3875 3876 3877 3878 3879 3880 3881 3882 3883 3884 3885 3886 3887 3888 3889
                        if(score < last_score){
                            last_score= score;
                            last_run= run;
                            last_level= level-64;
                            last_i= i+1;
                        }
                    }
                }
            }
        }

        score_tab[i+1]= best_score;

        //Note: there is a vlc code in mpeg4 which is 1 bit shorter then another one with a shorter run and the same level
        if(last_non_zero <= 27){
            for(; survivor_count; survivor_count--){
                if(score_tab[ survivor[survivor_count-1] ] <= best_score)
                    break;
            }
        }else{
            for(; survivor_count; survivor_count--){
                if(score_tab[ survivor[survivor_count-1] ] <= best_score + lambda)
                    break;
            }
        }

        survivor[ survivor_count++ ]= i+1;
    }

3890
    if(s->out_format != FMT_H263 && s->out_format != FMT_H261){
B
Benoit Fouet 已提交
3891 3892 3893 3894 3895 3896 3897 3898 3899 3900 3901 3902 3903 3904 3905 3906 3907 3908
        last_score= 256*256*256*120;
        for(i= survivor[0]; i<=last_non_zero + 1; i++){
            int score= score_tab[i];
            if(i) score += lambda*2; //FIXME exacter?

            if(score < last_score){
                last_score= score;
                last_i= i;
                last_level= level_tab[i];
                last_run= run_tab[i];
            }
        }
    }

    s->coded_score[n] = last_score;

    dc= FFABS(block[0]);
    last_non_zero= last_i - 1;
D
Diego Biurrun 已提交
3909
    memset(block + start_i, 0, (64-start_i)*sizeof(int16_t));
B
Benoit Fouet 已提交
3910 3911 3912 3913 3914 3915 3916 3917 3918 3919 3920 3921 3922

    if(last_non_zero < start_i)
        return last_non_zero;

    if(last_non_zero == 0 && start_i == 0){
        int best_level= 0;
        int best_score= dc * dc;

        for(i=0; i<coeff_count[0]; i++){
            int level= coeff[i][0];
            int alevel= FFABS(level);
            int unquant_coeff, score, distortion;

3923
            if(s->out_format == FMT_H263 || s->out_format == FMT_H261){
B
Benoit Fouet 已提交
3924 3925 3926 3927 3928 3929 3930 3931 3932 3933 3934 3935 3936 3937 3938 3939 3940 3941 3942 3943 3944 3945 3946 3947 3948
                    unquant_coeff= (alevel*qmul + qadd)>>3;
            }else{ //MPEG1
                    unquant_coeff = (((  alevel  << 1) + 1) * qscale * ((int) s->inter_matrix[0])) >> 4;
                    unquant_coeff =   (unquant_coeff - 1) | 1;
            }
            unquant_coeff = (unquant_coeff + 4) >> 3;
            unquant_coeff<<= 3 + 3;

            distortion= (unquant_coeff - dc) * (unquant_coeff - dc);
            level+=64;
            if((level&(~127)) == 0) score= distortion + last_length[UNI_AC_ENC_INDEX(0, level)]*lambda;
            else                    score= distortion + esc_length*lambda;

            if(score < best_score){
                best_score= score;
                best_level= level - 64;
            }
        }
        block[0]= best_level;
        s->coded_score[n] = best_score - dc*dc;
        if(best_level == 0) return -1;
        else                return last_non_zero;
    }

    i= last_i;
3949
    av_assert2(last_level);
B
Benoit Fouet 已提交
3950 3951 3952 3953 3954 3955 3956 3957 3958 3959 3960 3961 3962 3963 3964 3965 3966 3967 3968 3969 3970 3971 3972 3973 3974 3975 3976 3977 3978 3979 3980 3981 3982 3983

    block[ perm_scantable[last_non_zero] ]= last_level;
    i -= last_run + 1;

    for(; i>start_i; i -= run_tab[i] + 1){
        block[ perm_scantable[i-1] ]= level_tab[i];
    }

    return last_non_zero;
}

//#define REFINE_STATS 1
static int16_t basis[64][64];

static void build_basis(uint8_t *perm){
    int i, j, x, y;
    emms_c();
    for(i=0; i<8; i++){
        for(j=0; j<8; j++){
            for(y=0; y<8; y++){
                for(x=0; x<8; x++){
                    double s= 0.25*(1<<BASIS_SHIFT);
                    int index= 8*i + j;
                    int perm_index= perm[index];
                    if(i==0) s*= sqrt(0.5);
                    if(j==0) s*= sqrt(0.5);
                    basis[perm_index][8*x + y]= lrintf(s * cos((M_PI/8.0)*i*(x+0.5)) * cos((M_PI/8.0)*j*(y+0.5)));
                }
            }
        }
    }
}

static int dct_quantize_refine(MpegEncContext *s, //FIXME breaks denoise?
D
Diego Biurrun 已提交
3984
                        int16_t *block, int16_t *weight, int16_t *orig,
B
Benoit Fouet 已提交
3985 3986
                        int n, int qscale){
    int16_t rem[64];
D
Diego Biurrun 已提交
3987
    LOCAL_ALIGNED_16(int16_t, d1, [64]);
B
Benoit Fouet 已提交
3988 3989 3990 3991 3992 3993 3994 3995 3996 3997 3998 3999 4000 4001 4002 4003 4004 4005 4006 4007 4008 4009 4010 4011 4012 4013 4014 4015 4016 4017 4018 4019 4020 4021 4022 4023 4024 4025 4026 4027 4028 4029 4030 4031 4032 4033 4034 4035 4036 4037 4038 4039 4040 4041 4042 4043 4044 4045 4046 4047 4048 4049 4050 4051 4052 4053 4054 4055 4056 4057 4058 4059 4060 4061 4062 4063 4064
    const uint8_t *scantable= s->intra_scantable.scantable;
    const uint8_t *perm_scantable= s->intra_scantable.permutated;
//    unsigned int threshold1, threshold2;
//    int bias=0;
    int run_tab[65];
    int prev_run=0;
    int prev_level=0;
    int qmul, qadd, start_i, last_non_zero, i, dc;
    uint8_t * length;
    uint8_t * last_length;
    int lambda;
    int rle_index, run, q = 1, sum; //q is only used when s->mb_intra is true
#ifdef REFINE_STATS
static int count=0;
static int after_last=0;
static int to_zero=0;
static int from_zero=0;
static int raise=0;
static int lower=0;
static int messed_sign=0;
#endif

    if(basis[0][0] == 0)
        build_basis(s->dsp.idct_permutation);

    qmul= qscale*2;
    qadd= (qscale-1)|1;
    if (s->mb_intra) {
        if (!s->h263_aic) {
            if (n < 4)
                q = s->y_dc_scale;
            else
                q = s->c_dc_scale;
        } else{
            /* For AIC we skip quant/dequant of INTRADC */
            q = 1;
            qadd=0;
        }
        q <<= RECON_SHIFT-3;
        /* note: block[0] is assumed to be positive */
        dc= block[0]*q;
//        block[0] = (block[0] + (q >> 1)) / q;
        start_i = 1;
//        if(s->mpeg_quant || s->out_format == FMT_MPEG1)
//            bias= 1<<(QMAT_SHIFT-1);
        length     = s->intra_ac_vlc_length;
        last_length= s->intra_ac_vlc_last_length;
    } else {
        dc= 0;
        start_i = 0;
        length     = s->inter_ac_vlc_length;
        last_length= s->inter_ac_vlc_last_length;
    }
    last_non_zero = s->block_last_index[n];

#ifdef REFINE_STATS
{START_TIMER
#endif
    dc += (1<<(RECON_SHIFT-1));
    for(i=0; i<64; i++){
        rem[i]= dc - (orig[i]<<RECON_SHIFT); //FIXME  use orig dirrectly instead of copying to rem[]
    }
#ifdef REFINE_STATS
STOP_TIMER("memset rem[]")}
#endif
    sum=0;
    for(i=0; i<64; i++){
        int one= 36;
        int qns=4;
        int w;

        w= FFABS(weight[i]) + qns*one;
        w= 15 + (48*qns*one + w/2)/w; // 16 .. 63

        weight[i] = w;
//        w=weight[i] = (63*qns + (w/2)) / w;

4065 4066
        av_assert2(w>0);
        av_assert2(w<(1<<6));
B
Benoit Fouet 已提交
4067 4068 4069 4070 4071 4072 4073 4074 4075 4076 4077 4078 4079 4080 4081 4082 4083 4084 4085 4086 4087 4088 4089 4090 4091 4092 4093 4094 4095 4096 4097 4098 4099 4100 4101 4102 4103 4104 4105 4106
        sum += w*w;
    }
    lambda= sum*(uint64_t)s->lambda2 >> (FF_LAMBDA_SHIFT - 6 + 6 + 6 + 6);
#ifdef REFINE_STATS
{START_TIMER
#endif
    run=0;
    rle_index=0;
    for(i=start_i; i<=last_non_zero; i++){
        int j= perm_scantable[i];
        const int level= block[j];
        int coeff;

        if(level){
            if(level<0) coeff= qmul*level - qadd;
            else        coeff= qmul*level + qadd;
            run_tab[rle_index++]=run;
            run=0;

            s->dsp.add_8x8basis(rem, basis[j], coeff);
        }else{
            run++;
        }
    }
#ifdef REFINE_STATS
if(last_non_zero>0){
STOP_TIMER("init rem[]")
}
}

{START_TIMER
#endif
    for(;;){
        int best_score=s->dsp.try_8x8basis(rem, weight, basis[0], 0);
        int best_coeff=0;
        int best_change=0;
        int run2, best_unquant_change=0, analyze_gradient;
#ifdef REFINE_STATS
{START_TIMER
#endif
4107
        analyze_gradient = last_non_zero > 2 || s->quantizer_noise_shaping >= 3;
B
Benoit Fouet 已提交
4108 4109 4110 4111 4112 4113 4114 4115 4116 4117 4118 4119 4120 4121 4122 4123 4124 4125 4126 4127 4128 4129 4130 4131

        if(analyze_gradient){
#ifdef REFINE_STATS
{START_TIMER
#endif
            for(i=0; i<64; i++){
                int w= weight[i];

                d1[i] = (rem[i]*w*w + (1<<(RECON_SHIFT+12-1)))>>(RECON_SHIFT+12);
            }
#ifdef REFINE_STATS
STOP_TIMER("rem*w*w")}
{START_TIMER
#endif
            s->dsp.fdct(d1);
#ifdef REFINE_STATS
STOP_TIMER("dct")}
#endif
        }

        if(start_i){
            const int level= block[0];
            int change, old_coeff;

4132
            av_assert2(s->mb_intra);
B
Benoit Fouet 已提交
4133 4134 4135 4136 4137 4138 4139 4140 4141 4142 4143 4144 4145 4146 4147 4148 4149 4150 4151 4152 4153 4154 4155 4156 4157 4158 4159 4160 4161 4162 4163 4164

            old_coeff= q*level;

            for(change=-1; change<=1; change+=2){
                int new_level= level + change;
                int score, new_coeff;

                new_coeff= q*new_level;
                if(new_coeff >= 2048 || new_coeff < 0)
                    continue;

                score= s->dsp.try_8x8basis(rem, weight, basis[0], new_coeff - old_coeff);
                if(score<best_score){
                    best_score= score;
                    best_coeff= 0;
                    best_change= change;
                    best_unquant_change= new_coeff - old_coeff;
                }
            }
        }

        run=0;
        rle_index=0;
        run2= run_tab[rle_index++];
        prev_level=0;
        prev_run=0;

        for(i=start_i; i<64; i++){
            int j= perm_scantable[i];
            const int level= block[j];
            int change, old_coeff;

4165
            if(s->quantizer_noise_shaping < 3 && i > last_non_zero + 1)
B
Benoit Fouet 已提交
4166 4167 4168 4169 4170 4171 4172 4173 4174
                break;

            if(level){
                if(level<0) old_coeff= qmul*level - qadd;
                else        old_coeff= qmul*level + qadd;
                run2= run_tab[rle_index++]; //FIXME ! maybe after last
            }else{
                old_coeff=0;
                run2--;
4175
                av_assert2(run2>=0 || i >= last_non_zero );
B
Benoit Fouet 已提交
4176 4177 4178 4179 4180 4181 4182
            }

            for(change=-1; change<=1; change+=2){
                int new_level= level + change;
                int score, new_coeff, unquant_change;

                score=0;
4183
                if(s->quantizer_noise_shaping < 2 && FFABS(new_level) > FFABS(level))
B
Benoit Fouet 已提交
4184 4185 4186 4187 4188 4189 4190 4191 4192 4193 4194 4195 4196 4197 4198 4199 4200 4201 4202
                   continue;

                if(new_level){
                    if(new_level<0) new_coeff= qmul*new_level - qadd;
                    else            new_coeff= qmul*new_level + qadd;
                    if(new_coeff >= 2048 || new_coeff <= -2048)
                        continue;
                    //FIXME check for overflow

                    if(level){
                        if(level < 63 && level > -63){
                            if(i < last_non_zero)
                                score +=   length[UNI_AC_ENC_INDEX(run, new_level+64)]
                                         - length[UNI_AC_ENC_INDEX(run, level+64)];
                            else
                                score +=   last_length[UNI_AC_ENC_INDEX(run, new_level+64)]
                                         - last_length[UNI_AC_ENC_INDEX(run, level+64)];
                        }
                    }else{
4203
                        av_assert2(FFABS(new_level)==1);
B
Benoit Fouet 已提交
4204 4205 4206 4207 4208 4209 4210 4211 4212 4213 4214 4215 4216 4217 4218 4219 4220 4221 4222 4223 4224 4225 4226 4227 4228 4229 4230 4231 4232 4233 4234 4235

                        if(analyze_gradient){
                            int g= d1[ scantable[i] ];
                            if(g && (g^new_level) >= 0)
                                continue;
                        }

                        if(i < last_non_zero){
                            int next_i= i + run2 + 1;
                            int next_level= block[ perm_scantable[next_i] ] + 64;

                            if(next_level&(~127))
                                next_level= 0;

                            if(next_i < last_non_zero)
                                score +=   length[UNI_AC_ENC_INDEX(run, 65)]
                                         + length[UNI_AC_ENC_INDEX(run2, next_level)]
                                         - length[UNI_AC_ENC_INDEX(run + run2 + 1, next_level)];
                            else
                                score +=  length[UNI_AC_ENC_INDEX(run, 65)]
                                        + last_length[UNI_AC_ENC_INDEX(run2, next_level)]
                                        - last_length[UNI_AC_ENC_INDEX(run + run2 + 1, next_level)];
                        }else{
                            score += last_length[UNI_AC_ENC_INDEX(run, 65)];
                            if(prev_level){
                                score +=  length[UNI_AC_ENC_INDEX(prev_run, prev_level)]
                                        - last_length[UNI_AC_ENC_INDEX(prev_run, prev_level)];
                            }
                        }
                    }
                }else{
                    new_coeff=0;
4236
                    av_assert2(FFABS(level)==1);
B
Benoit Fouet 已提交
4237 4238 4239 4240 4241 4242 4243 4244 4245 4246 4247 4248 4249 4250 4251 4252 4253 4254 4255 4256 4257 4258 4259 4260 4261 4262 4263 4264

                    if(i < last_non_zero){
                        int next_i= i + run2 + 1;
                        int next_level= block[ perm_scantable[next_i] ] + 64;

                        if(next_level&(~127))
                            next_level= 0;

                        if(next_i < last_non_zero)
                            score +=   length[UNI_AC_ENC_INDEX(run + run2 + 1, next_level)]
                                     - length[UNI_AC_ENC_INDEX(run2, next_level)]
                                     - length[UNI_AC_ENC_INDEX(run, 65)];
                        else
                            score +=   last_length[UNI_AC_ENC_INDEX(run + run2 + 1, next_level)]
                                     - last_length[UNI_AC_ENC_INDEX(run2, next_level)]
                                     - length[UNI_AC_ENC_INDEX(run, 65)];
                    }else{
                        score += -last_length[UNI_AC_ENC_INDEX(run, 65)];
                        if(prev_level){
                            score +=  last_length[UNI_AC_ENC_INDEX(prev_run, prev_level)]
                                    - length[UNI_AC_ENC_INDEX(prev_run, prev_level)];
                        }
                    }
                }

                score *= lambda;

                unquant_change= new_coeff - old_coeff;
4265
                av_assert2((score < 100*lambda && score > -100*lambda) || lambda==0);
B
Benoit Fouet 已提交
4266 4267 4268 4269 4270 4271 4272 4273 4274 4275 4276 4277 4278 4279 4280 4281 4282 4283 4284 4285 4286 4287 4288 4289 4290 4291 4292 4293 4294 4295

                score+= s->dsp.try_8x8basis(rem, weight, basis[j], unquant_change);
                if(score<best_score){
                    best_score= score;
                    best_coeff= i;
                    best_change= change;
                    best_unquant_change= unquant_change;
                }
            }
            if(level){
                prev_level= level + 64;
                if(prev_level&(~127))
                    prev_level= 0;
                prev_run= run;
                run=0;
            }else{
                run++;
            }
        }
#ifdef REFINE_STATS
STOP_TIMER("iterative step")}
#endif

        if(best_change){
            int j= perm_scantable[ best_coeff ];

            block[j] += best_change;

            if(best_coeff > last_non_zero){
                last_non_zero= best_coeff;
4296
                av_assert2(block[j]);
B
Benoit Fouet 已提交
4297 4298 4299 4300 4301 4302 4303 4304 4305 4306 4307 4308 4309 4310 4311 4312 4313 4314 4315 4316 4317 4318 4319 4320 4321 4322 4323
#ifdef REFINE_STATS
after_last++;
#endif
            }else{
#ifdef REFINE_STATS
if(block[j]){
    if(block[j] - best_change){
        if(FFABS(block[j]) > FFABS(block[j] - best_change)){
            raise++;
        }else{
            lower++;
        }
    }else{
        from_zero++;
    }
}else{
    to_zero++;
}
#endif
                for(; last_non_zero>=start_i; last_non_zero--){
                    if(block[perm_scantable[last_non_zero]])
                        break;
                }
            }
#ifdef REFINE_STATS
count++;
if(256*256*256*64 % count == 0){
4324
    av_log(s->avctx, AV_LOG_DEBUG, "after_last:%d to_zero:%d from_zero:%d raise:%d lower:%d sign:%d xyp:%d/%d/%d\n", after_last, to_zero, from_zero, raise, lower, messed_sign, s->mb_x, s->mb_y, s->picture_number);
B
Benoit Fouet 已提交
4325 4326 4327 4328 4329 4330 4331 4332 4333 4334 4335 4336 4337 4338 4339 4340 4341 4342 4343 4344 4345 4346 4347 4348 4349 4350 4351 4352 4353 4354 4355
}
#endif
            run=0;
            rle_index=0;
            for(i=start_i; i<=last_non_zero; i++){
                int j= perm_scantable[i];
                const int level= block[j];

                 if(level){
                     run_tab[rle_index++]=run;
                     run=0;
                 }else{
                     run++;
                 }
            }

            s->dsp.add_8x8basis(rem, basis[j], best_unquant_change);
        }else{
            break;
        }
    }
#ifdef REFINE_STATS
if(last_non_zero>0){
STOP_TIMER("iterative search")
}
}
#endif

    return last_non_zero;
}

4356
int ff_dct_quantize_c(MpegEncContext *s,
D
Diego Biurrun 已提交
4357
                        int16_t *block, int n,
B
Benoit Fouet 已提交
4358 4359 4360 4361 4362 4363 4364 4365 4366 4367 4368 4369 4370 4371 4372 4373 4374 4375 4376 4377 4378 4379 4380 4381 4382 4383 4384 4385 4386
                        int qscale, int *overflow)
{
    int i, j, level, last_non_zero, q, start_i;
    const int *qmat;
    const uint8_t *scantable= s->intra_scantable.scantable;
    int bias;
    int max=0;
    unsigned int threshold1, threshold2;

    s->dsp.fdct (block);

    if(s->dct_error_sum)
        s->denoise_dct(s, block);

    if (s->mb_intra) {
        if (!s->h263_aic) {
            if (n < 4)
                q = s->y_dc_scale;
            else
                q = s->c_dc_scale;
            q = q << 3;
        } else
            /* For AIC we skip quant/dequant of INTRADC */
            q = 1 << 3;

        /* note: block[0] is assumed to be positive */
        block[0] = (block[0] + (q >> 1)) / q;
        start_i = 1;
        last_non_zero = 0;
4387
        qmat = n < 4 ? s->q_intra_matrix[qscale] : s->q_chroma_intra_matrix[qscale];
B
Benoit Fouet 已提交
4388 4389 4390 4391 4392 4393 4394 4395 4396 4397 4398 4399 4400 4401 4402 4403 4404 4405 4406 4407 4408 4409 4410 4411 4412 4413 4414 4415 4416 4417 4418 4419 4420 4421 4422 4423 4424 4425 4426 4427 4428 4429 4430 4431 4432 4433 4434 4435
        bias= s->intra_quant_bias<<(QMAT_SHIFT - QUANT_BIAS_SHIFT);
    } else {
        start_i = 0;
        last_non_zero = -1;
        qmat = s->q_inter_matrix[qscale];
        bias= s->inter_quant_bias<<(QMAT_SHIFT - QUANT_BIAS_SHIFT);
    }
    threshold1= (1<<QMAT_SHIFT) - bias - 1;
    threshold2= (threshold1<<1);
    for(i=63;i>=start_i;i--) {
        j = scantable[i];
        level = block[j] * qmat[j];

        if(((unsigned)(level+threshold1))>threshold2){
            last_non_zero = i;
            break;
        }else{
            block[j]=0;
        }
    }
    for(i=start_i; i<=last_non_zero; i++) {
        j = scantable[i];
        level = block[j] * qmat[j];

//        if(   bias+level >= (1<<QMAT_SHIFT)
//           || bias-level >= (1<<QMAT_SHIFT)){
        if(((unsigned)(level+threshold1))>threshold2){
            if(level>0){
                level= (bias + level)>>QMAT_SHIFT;
                block[j]= level;
            }else{
                level= (bias - level)>>QMAT_SHIFT;
                block[j]= -level;
            }
            max |=level;
        }else{
            block[j]=0;
        }
    }
    *overflow= s->max_qcoeff < max; //overflow might have happened

    /* we need this permutation so that we correct the IDCT, we only permute the !=0 elements */
    if (s->dsp.idct_permutation_type != FF_NO_IDCT_PERM)
        ff_block_permute(block, s->dsp.idct_permutation, scantable, last_non_zero);

    return last_non_zero;
}

4436 4437 4438
#define OFFSET(x) offsetof(MpegEncContext, x)
#define VE AV_OPT_FLAG_VIDEO_PARAM | AV_OPT_FLAG_ENCODING_PARAM
static const AVOption h263_options[] = {
4439 4440 4441
    { "obmc",         "use overlapped block motion compensation.", OFFSET(obmc), AV_OPT_TYPE_INT, { .i64 = 0 }, 0, 1, VE },
    { "structured_slices","Write slice start position at every GOB header instead of just GOB number.", OFFSET(h263_slice_structured), AV_OPT_TYPE_INT, { .i64 = 0 }, 0, 1, VE},
    { "mb_info",      "emit macroblock info for RFC 2190 packetization, the parameter value is the maximum payload size", OFFSET(mb_info), AV_OPT_TYPE_INT, { .i64 = 0 }, 0, INT_MAX, VE },
4442
    FF_MPV_COMMON_OPTS
4443 4444 4445 4446 4447 4448 4449 4450 4451 4452
    { NULL },
};

static const AVClass h263_class = {
    .class_name = "H.263 encoder",
    .item_name  = av_default_item_name,
    .option     = h263_options,
    .version    = LIBAVUTIL_VERSION_INT,
};

4453
AVCodec ff_h263_encoder = {
4454
    .name           = "h263",
4455
    .long_name      = NULL_IF_CONFIG_SMALL("H.263 / H.263-1996"),
4456
    .type           = AVMEDIA_TYPE_VIDEO,
4457
    .id             = AV_CODEC_ID_H263,
4458
    .priv_data_size = sizeof(MpegEncContext),
4459
    .init           = ff_MPV_encode_init,
4460
    .encode2        = ff_MPV_encode_picture,
4461
    .close          = ff_MPV_encode_end,
4462
    .pix_fmts= (const enum AVPixelFormat[]){AV_PIX_FMT_YUV420P, AV_PIX_FMT_NONE},
4463
    .priv_class     = &h263_class,
B
Benoit Fouet 已提交
4464 4465
};

4466
static const AVOption h263p_options[] = {
4467 4468 4469 4470
    { "umv",        "Use unlimited motion vectors.",    OFFSET(umvplus), AV_OPT_TYPE_INT, { .i64 = 0 }, 0, 1, VE },
    { "aiv",        "Use alternative inter VLC.",       OFFSET(alt_inter_vlc), AV_OPT_TYPE_INT, { .i64 = 0 }, 0, 1, VE },
    { "obmc",       "use overlapped block motion compensation.", OFFSET(obmc), AV_OPT_TYPE_INT, { .i64 = 0 }, 0, 1, VE },
    { "structured_slices", "Write slice start position at every GOB header instead of just GOB number.", OFFSET(h263_slice_structured), AV_OPT_TYPE_INT, { .i64 = 0 }, 0, 1, VE},
4471
    FF_MPV_COMMON_OPTS
4472 4473 4474 4475 4476
    { NULL },
};
static const AVClass h263p_class = {
    .class_name = "H.263p encoder",
    .item_name  = av_default_item_name,
4477
    .option     = h263p_options,
4478
    .version    = LIBAVUTIL_VERSION_INT,
B
Benoit Fouet 已提交
4479 4480
};

4481
AVCodec ff_h263p_encoder = {
4482
    .name           = "h263p",
4483
    .long_name      = NULL_IF_CONFIG_SMALL("H.263+ / H.263-1998 / H.263 version 2"),
4484
    .type           = AVMEDIA_TYPE_VIDEO,
4485
    .id             = AV_CODEC_ID_H263P,
4486
    .priv_data_size = sizeof(MpegEncContext),
4487
    .init           = ff_MPV_encode_init,
4488
    .encode2        = ff_MPV_encode_picture,
4489
    .close          = ff_MPV_encode_end,
4490
    .capabilities   = CODEC_CAP_SLICE_THREADS,
4491
    .pix_fmts       = (const enum AVPixelFormat[]){ AV_PIX_FMT_YUV420P, AV_PIX_FMT_NONE },
4492
    .priv_class     = &h263p_class,
B
Benoit Fouet 已提交
4493 4494
};

4495 4496
FF_MPV_GENERIC_CLASS(msmpeg4v2)

4497
AVCodec ff_msmpeg4v2_encoder = {
4498
    .name           = "msmpeg4v2",
4499
    .long_name      = NULL_IF_CONFIG_SMALL("MPEG-4 part 2 Microsoft variant version 2"),
4500
    .type           = AVMEDIA_TYPE_VIDEO,
4501
    .id             = AV_CODEC_ID_MSMPEG4V2,
4502
    .priv_data_size = sizeof(MpegEncContext),
4503
    .init           = ff_MPV_encode_init,
4504
    .encode2        = ff_MPV_encode_picture,
4505
    .close          = ff_MPV_encode_end,
4506
    .pix_fmts       = (const enum AVPixelFormat[]){ AV_PIX_FMT_YUV420P, AV_PIX_FMT_NONE },
4507
    .priv_class     = &msmpeg4v2_class,
B
Benoit Fouet 已提交
4508 4509
};

4510 4511
FF_MPV_GENERIC_CLASS(msmpeg4v3)

4512
AVCodec ff_msmpeg4v3_encoder = {
4513
    .name           = "msmpeg4",
4514
    .long_name      = NULL_IF_CONFIG_SMALL("MPEG-4 part 2 Microsoft variant version 3"),
4515
    .type           = AVMEDIA_TYPE_VIDEO,
4516
    .id             = AV_CODEC_ID_MSMPEG4V3,
4517
    .priv_data_size = sizeof(MpegEncContext),
4518
    .init           = ff_MPV_encode_init,
4519
    .encode2        = ff_MPV_encode_picture,
4520
    .close          = ff_MPV_encode_end,
4521
    .pix_fmts       = (const enum AVPixelFormat[]){ AV_PIX_FMT_YUV420P, AV_PIX_FMT_NONE },
4522
    .priv_class     = &msmpeg4v3_class,
B
Benoit Fouet 已提交
4523 4524
};

4525 4526
FF_MPV_GENERIC_CLASS(wmv1)

4527
AVCodec ff_wmv1_encoder = {
4528
    .name           = "wmv1",
4529
    .long_name      = NULL_IF_CONFIG_SMALL("Windows Media Video 7"),
4530
    .type           = AVMEDIA_TYPE_VIDEO,
4531
    .id             = AV_CODEC_ID_WMV1,
4532
    .priv_data_size = sizeof(MpegEncContext),
4533
    .init           = ff_MPV_encode_init,
4534
    .encode2        = ff_MPV_encode_picture,
4535
    .close          = ff_MPV_encode_end,
4536
    .pix_fmts       = (const enum AVPixelFormat[]){ AV_PIX_FMT_YUV420P, AV_PIX_FMT_NONE },
4537
    .priv_class     = &wmv1_class,
B
Benoit Fouet 已提交
4538
};