mpeg12enc.c 41.5 KB
Newer Older
1
/*
2
 * MPEG-1/2 encoder
3
 * Copyright (c) 2000,2001 Fabrice Bellard
4 5
 * Copyright (c) 2002-2004 Michael Niedermayer <michaelni@gmx.at>
 *
6
 * This file is part of Libav.
7
 *
8
 * Libav is free software; you can redistribute it and/or
9 10 11 12
 * 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.
 *
13
 * Libav is distributed in the hope that it will be useful,
14 15 16 17 18
 * 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
19
 * License along with Libav; if not, write to the Free Software
20 21 22 23
 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
 */

/**
24
 * @file
25
 * MPEG-1/2 encoder
26 27
 */

28 29
#include <stdint.h>

30 31 32
#include "libavutil/attributes.h"
#include "libavutil/log.h"
#include "libavutil/opt.h"
33 34
#include "libavutil/stereo3d.h"

35
#include "avcodec.h"
36
#include "bytestream.h"
37
#include "mathops.h"
38 39
#include "mpeg12.h"
#include "mpeg12data.h"
40
#include "mpegutils.h"
41
#include "mpegvideo.h"
42 43


44 45
static const uint8_t inv_non_linear_qscale[] = {
    0, 2, 4, 6, 8, 9, 10, 11, 12, 13, 14, 15, 16,
46 47
};

48 49 50
static const uint8_t svcd_scan_offset_placeholder[] = {
    0x10, 0x0E, 0x00, 0x80, 0x81, 0x00, 0x80,
    0x81, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
51 52
};

53 54
static uint8_t mv_penalty[MAX_FCODE + 1][MAX_MV * 2 + 1];
static uint8_t fcode_tab[MAX_MV * 2 + 1];
55

56 57
static uint8_t uni_mpeg1_ac_vlc_len[64 * 64 * 2];
static uint8_t uni_mpeg2_ac_vlc_len[64 * 64 * 2];
58

59 60
/* simple include everything table for dc, first byte is bits
 * number next 3 are code */
61 62 63 64
static uint32_t mpeg1_lum_dc_uni[512];
static uint32_t mpeg1_chr_dc_uni[512];

static uint8_t mpeg1_index_run[2][64];
65
static int8_t  mpeg1_max_level[2][64];
66

67 68
static av_cold void init_uni_ac_vlc(RLTable *rl, uint8_t *uni_ac_vlc_len)
{
69 70
    int i;

71 72
    for (i = 0; i < 128; i++) {
        int level = i - 64;
73
        int run;
74 75
        if (!level)
            continue;
76
        for (run = 0; run < 64; run++) {
77
            int len, code;
78
            int alevel = FFABS(level);
79 80

            if (alevel > rl->max_level[0][run])
81
                code = 111;                         /* rl->n */
82
            else
83
                code = rl->index_run[0][run] + alevel - 1;
84

85 86 87
            if (code < 111) {                       /* rl->n */
                /* length of VLC and sign */
                len = rl->table_vlc[code][1] + 1;
88
            } else {
89
                len = rl->table_vlc[111][1] + 6;    /* rl->n */
90

91
                if (alevel < 128)
92
                    len += 8;
93
                else
94
                    len += 16;
95 96
            }

97
            uni_ac_vlc_len[UNI_AC_ENC_INDEX(run, i)] = len;
98 99 100 101
        }
    }
}

102 103
static int find_frame_rate_index(MpegEncContext *s)
{
104
    int i;
105
    int64_t dmin = INT64_MAX;
106 107
    int64_t d;

108 109 110 111 112 113 114 115
    for (i = 1; i < 14; i++) {
        int64_t n0 = 1001LL / ff_mpeg12_frame_rate_tab[i].den *
                     ff_mpeg12_frame_rate_tab[i].num * s->avctx->time_base.num;
        int64_t n1 = 1001LL * s->avctx->time_base.den;

        if (s->avctx->strict_std_compliance > FF_COMPLIANCE_UNOFFICIAL &&
            i >= 9)
            break;
116 117

        d = FFABS(n0 - n1);
118 119 120
        if (d < dmin) {
            dmin                = d;
            s->frame_rate_index = i;
121 122
        }
    }
123 124

    if (dmin)
125 126 127 128 129
        return -1;
    else
        return 0;
}

130
static av_cold int encode_init(AVCodecContext *avctx)
131 132 133
{
    MpegEncContext *s = avctx->priv_data;

134
    if (ff_mpv_encode_init(avctx) < 0)
135 136
        return -1;

137 138
    if (find_frame_rate_index(s) < 0) {
        if (s->strict_std_compliance > FF_COMPLIANCE_EXPERIMENTAL) {
139
            av_log(avctx, AV_LOG_ERROR, "MPEG-1/2 does not support %d/%d fps\n",
140
                   avctx->time_base.den, avctx->time_base.num);
141
            return -1;
142 143
        } else {
            av_log(avctx, AV_LOG_INFO,
144
                   "MPEG-1/2 does not support %d/%d fps, there may be AV sync issues\n",
145
                   avctx->time_base.den, avctx->time_base.num);
146 147 148
        }
    }

149 150
    if (avctx->profile == FF_PROFILE_UNKNOWN) {
        if (avctx->level != FF_LEVEL_UNKNOWN) {
151 152 153
            av_log(avctx, AV_LOG_ERROR, "Set profile and level\n");
            return -1;
        }
154 155
        /* Main or 4:2:2 */
        avctx->profile = s->chroma_format == CHROMA_420 ? 4 : 0;
156 157
    }

158 159 160 161 162 163 164 165 166 167
    if (avctx->level == FF_LEVEL_UNKNOWN) {
        if (avctx->profile == 0) {                  /* 4:2:2 */
            if (avctx->width <= 720 && avctx->height <= 608)
                avctx->level = 5;                   /* Main */
            else
                avctx->level = 2;                   /* High */
        } else {
            if (avctx->profile != 1 && s->chroma_format != CHROMA_420) {
                av_log(avctx, AV_LOG_ERROR,
                       "Only High(1) and 4:2:2(0) profiles support 4:2:2 color sampling\n");
168 169
                return -1;
            }
170 171 172 173 174 175
            if (avctx->width <= 720 && avctx->height <= 576)
                avctx->level = 8;                   /* Main */
            else if (avctx->width <= 1440)
                avctx->level = 6;                   /* High 1440 */
            else
                avctx->level = 4;                   /* High */
176 177 178
        }
    }

179
    if (s->drop_frame_timecode && s->frame_rate_index != 4) {
180 181
        av_log(avctx, AV_LOG_ERROR,
               "Drop frame time code only allowed with 1001/30000 fps\n");
182 183 184
        return -1;
    }

185 186 187 188 189 190 191
#if FF_API_PRIVATE_OPT
FF_DISABLE_DEPRECATION_WARNINGS
    if (avctx->timecode_frame_start)
        s->timecode_frame_start = avctx->timecode_frame_start;
FF_ENABLE_DEPRECATION_WARNINGS
#endif

192 193 194 195 196
    return 0;
}

static void put_header(MpegEncContext *s, int header)
{
197
    avpriv_align_put_bits(&s->pb);
198
    put_bits(&s->pb, 16, header >> 16);
199
    put_sbits(&s->pb, 16, header);
200 201 202 203 204
}

/* put sequence header if needed */
static void mpeg1_encode_sequence_header(MpegEncContext *s)
{
205 206 207 208 209
    unsigned int vbv_buffer_size, fps, v;
    int i, constraint_parameter_flag;
    uint64_t time_code;
    float best_aspect_error = 1E10;
    float aspect_ratio      = av_q2d(s->avctx->sample_aspect_ratio);
210

211 212
    if (aspect_ratio == 0.0)
        aspect_ratio = 1.0;             // pixel aspect 1.1 (VGA)
213

214
    if (s->current_picture.f->key_frame) {
215
        AVRational framerate = ff_mpeg12_frame_rate_tab[s->frame_rate_index];
216

217
        /* MPEG-1 header repeated every GOP */
218
        put_header(s, SEQ_START_CODE);
219

220 221
        put_sbits(&s->pb, 12, s->width);
        put_sbits(&s->pb, 12, s->height);
222

223 224 225 226 227 228
        for (i = 1; i < 15; i++) {
            float error = aspect_ratio;
            if (s->codec_id == AV_CODEC_ID_MPEG1VIDEO || i <= 1)
                error -= 1.0 / ff_mpeg1_aspect[i];
            else
                error -= av_q2d(ff_mpeg2_aspect[i]) * s->height / s->width;
229

230
            error = FFABS(error);
231

232 233 234
            if (error < best_aspect_error) {
                best_aspect_error    = error;
                s->aspect_ratio_info = i;
235
            }
236
        }
237

238 239
        put_bits(&s->pb, 4, s->aspect_ratio_info);
        put_bits(&s->pb, 4, s->frame_rate_index);
240

241 242 243 244 245 246 247
        if (s->avctx->rc_max_rate) {
            v = (s->avctx->rc_max_rate + 399) / 400;
            if (v > 0x3ffff && s->codec_id == AV_CODEC_ID_MPEG1VIDEO)
                v = 0x3ffff;
        } else {
            v = 0x3FFFF;
        }
248

249 250 251 252 253 254 255 256 257 258 259 260 261 262 263 264 265 266 267 268 269 270 271 272 273 274 275 276 277 278 279 280 281 282 283 284 285 286 287 288 289 290 291 292 293 294 295 296
        if (s->avctx->rc_buffer_size)
            vbv_buffer_size = s->avctx->rc_buffer_size;
        else
            /* VBV calculation: Scaled so that a VCD has the proper
             * VBV size of 40 kilobytes */
            vbv_buffer_size = ((20 * s->bit_rate) / (1151929 / 2)) * 8 * 1024;
        vbv_buffer_size = (vbv_buffer_size + 16383) / 16384;

        put_sbits(&s->pb, 18, v);
        put_bits(&s->pb, 1, 1);         // marker
        put_sbits(&s->pb, 10, vbv_buffer_size);

        constraint_parameter_flag =
            s->width  <= 768                                    &&
            s->height <= 576                                    &&
            s->mb_width * s->mb_height                 <= 396   &&
            s->mb_width * s->mb_height * framerate.num <= 396 * 25 * framerate.den &&
            framerate.num <= framerate.den * 30                 &&
            s->avctx->me_range                                  &&
            s->avctx->me_range < 128                            &&
            vbv_buffer_size <= 20                               &&
            v <= 1856000 / 400                                  &&
            s->codec_id == AV_CODEC_ID_MPEG1VIDEO;

        put_bits(&s->pb, 1, constraint_parameter_flag);

        ff_write_quant_matrix(&s->pb, s->avctx->intra_matrix);
        ff_write_quant_matrix(&s->pb, s->avctx->inter_matrix);

        if (s->codec_id == AV_CODEC_ID_MPEG2VIDEO) {
            put_header(s, EXT_START_CODE);
            put_bits(&s->pb, 4, 1);                 // seq ext

            put_bits(&s->pb, 1, s->avctx->profile == 0); // escx 1 for 4:2:2 profile

            put_bits(&s->pb, 3, s->avctx->profile); // profile
            put_bits(&s->pb, 4, s->avctx->level);   // level

            put_bits(&s->pb, 1, s->progressive_sequence);
            put_bits(&s->pb, 2, s->chroma_format);
            put_bits(&s->pb, 2, s->width  >> 12);
            put_bits(&s->pb, 2, s->height >> 12);
            put_bits(&s->pb, 12, v >> 18);          // bitrate ext
            put_bits(&s->pb, 1, 1);                 // marker
            put_bits(&s->pb, 8, vbv_buffer_size >> 10); // vbv buffer ext
            put_bits(&s->pb, 1, s->low_delay);
            put_bits(&s->pb, 2, 0);                 // frame_rate_ext_n
            put_bits(&s->pb, 5, 0);                 // frame_rate_ext_d
297 298 299 300 301 302 303 304 305 306 307 308

            put_header(s, EXT_START_CODE);
            put_bits(&s->pb, 4, 2);                         // sequence display extension
            put_bits(&s->pb, 3, 0);                         // video_format: 0 is components
            put_bits(&s->pb, 1, 1);                         // colour_description
            put_bits(&s->pb, 8, s->avctx->color_primaries); // colour_primaries
            put_bits(&s->pb, 8, s->avctx->color_trc);       // transfer_characteristics
            put_bits(&s->pb, 8, s->avctx->colorspace);      // matrix_coefficients
            put_bits(&s->pb, 14, s->width);                 // display_horizontal_size
            put_bits(&s->pb, 1, 1);                         // marker_bit
            put_bits(&s->pb, 14, s->height);                // display_vertical_size
            put_bits(&s->pb, 3, 0);                         // remaining 3 bits are zero padding
309
        }
310

311 312 313 314 315
        put_header(s, GOP_START_CODE);
        put_bits(&s->pb, 1, s->drop_frame_timecode);    // drop frame flag
        /* time code: we must convert from the real frame rate to a
         * fake MPEG frame rate in case of low frame rate */
        fps       = (framerate.num + framerate.den / 2) / framerate.den;
316
        time_code = s->current_picture_ptr->f->coded_picture_number +
317
                    s->timecode_frame_start;
318

319
        s->gop_picture_number = s->current_picture_ptr->f->coded_picture_number;
320 321 322 323 324 325 326 327
        if (s->drop_frame_timecode) {
            /* only works for NTSC 29.97 */
            int d = time_code / 17982;
            int m = time_code % 17982;
            /* not needed since -2,-1 / 1798 in C returns 0 */
            // if (m < 2)
            //     m += 2;
            time_code += 18 * d + 2 * ((m - 2) / 1798);
328
        }
329 330 331 332 333
        put_bits(&s->pb, 5, (uint32_t)((time_code / (fps * 3600)) % 24));
        put_bits(&s->pb, 6, (uint32_t)((time_code / (fps *   60)) % 60));
        put_bits(&s->pb, 1, 1);
        put_bits(&s->pb, 6, (uint32_t)((time_code / fps) % 60));
        put_bits(&s->pb, 6, (uint32_t)((time_code % fps)));
334
        put_bits(&s->pb, 1, !!(s->avctx->flags & AV_CODEC_FLAG_CLOSED_GOP) || s->intra_only);
335 336
        put_bits(&s->pb, 1, 0);                     // broken link
    }
337 338
}

339 340
static inline void encode_mb_skip_run(MpegEncContext *s, int run)
{
341 342 343 344
    while (run >= 33) {
        put_bits(&s->pb, 11, 0x008);
        run -= 33;
    }
345 346
    put_bits(&s->pb, ff_mpeg12_mbAddrIncrTable[run][1],
             ff_mpeg12_mbAddrIncrTable[run][0]);
347 348 349 350
}

static av_always_inline void put_qscale(MpegEncContext *s)
{
351 352
    if (s->q_scale_type) {
        assert(s->qscale >= 1 && s->qscale <= 12);
353
        put_bits(&s->pb, 5, inv_non_linear_qscale[s->qscale]);
354
    } else {
355 356 357 358
        put_bits(&s->pb, 5, s->qscale);
    }
}

359 360
void ff_mpeg1_encode_slice_header(MpegEncContext *s)
{
361 362
    if (s->height > 2800) {
        put_header(s, SLICE_MIN_START_CODE + (s->mb_y & 127));
363 364
        /* slice_vertical_position_extension */
        put_bits(&s->pb, 3, s->mb_y >> 7);
365
    } else {
366
        put_header(s, SLICE_MIN_START_CODE + s->mb_y);
367
    }
368
    put_qscale(s);
369 370
    /* slice extra information */
    put_bits(&s->pb, 1, 0);
371 372
}

373
void ff_mpeg1_encode_picture_header(MpegEncContext *s, int picture_number)
374
{
375
    AVFrameSideData *side_data;
376 377
    mpeg1_encode_sequence_header(s);

378
    /* MPEG-1 picture header */
379 380 381 382
    put_header(s, PICTURE_START_CODE);
    /* temporal reference */

    // RAL: s->picture_number instead of s->fake_picture_number
383 384
    put_bits(&s->pb, 10,
             (s->picture_number - s->gop_picture_number) & 0x3ff);
385 386
    put_bits(&s->pb, 3, s->pict_type);

387 388
    s->vbv_delay_ptr = s->pb.buf + put_bits_count(&s->pb) / 8;
    put_bits(&s->pb, 16, 0xFFFF);               /* vbv_delay */
389

390 391 392 393 394 395
    // RAL: Forward f_code also needed for B-frames
    if (s->pict_type == AV_PICTURE_TYPE_P ||
        s->pict_type == AV_PICTURE_TYPE_B) {
        put_bits(&s->pb, 1, 0);                 /* half pel coordinates */
        if (s->codec_id == AV_CODEC_ID_MPEG1VIDEO)
            put_bits(&s->pb, 3, s->f_code);     /* forward_f_code */
396
        else
397
            put_bits(&s->pb, 3, 7);             /* forward_f_code */
398 399
    }

400
    // RAL: Backward f_code necessary for B-frames
401
    if (s->pict_type == AV_PICTURE_TYPE_B) {
402 403 404
        put_bits(&s->pb, 1, 0);                 /* half pel coordinates */
        if (s->codec_id == AV_CODEC_ID_MPEG1VIDEO)
            put_bits(&s->pb, 3, s->b_code);     /* backward_f_code */
405
        else
406
            put_bits(&s->pb, 3, 7);             /* backward_f_code */
407 408
    }

409
    put_bits(&s->pb, 1, 0);                     /* extra bit picture */
410 411

    s->frame_pred_frame_dct = 1;
412
    if (s->codec_id == AV_CODEC_ID_MPEG2VIDEO) {
413
        put_header(s, EXT_START_CODE);
414 415 416
        put_bits(&s->pb, 4, 8);                 /* pic ext */
        if (s->pict_type == AV_PICTURE_TYPE_P ||
            s->pict_type == AV_PICTURE_TYPE_B) {
417 418
            put_bits(&s->pb, 4, s->f_code);
            put_bits(&s->pb, 4, s->f_code);
419
        } else {
420 421
            put_bits(&s->pb, 8, 255);
        }
422
        if (s->pict_type == AV_PICTURE_TYPE_B) {
423 424
            put_bits(&s->pb, 4, s->b_code);
            put_bits(&s->pb, 4, s->b_code);
425
        } else {
426 427 428 429 430 431
            put_bits(&s->pb, 8, 255);
        }
        put_bits(&s->pb, 2, s->intra_dc_precision);

        assert(s->picture_structure == PICT_FRAME);
        put_bits(&s->pb, 2, s->picture_structure);
432 433 434
        if (s->progressive_sequence)
            put_bits(&s->pb, 1, 0);             /* no repeat */
        else
435
            put_bits(&s->pb, 1, s->current_picture_ptr->f->top_field_first);
436
        /* XXX: optimize the generation of this flag with entropy measures */
437 438 439 440 441 442 443 444 445
        s->frame_pred_frame_dct = s->progressive_sequence;

        put_bits(&s->pb, 1, s->frame_pred_frame_dct);
        put_bits(&s->pb, 1, s->concealment_motion_vectors);
        put_bits(&s->pb, 1, s->q_scale_type);
        put_bits(&s->pb, 1, s->intra_vlc_format);
        put_bits(&s->pb, 1, s->alternate_scan);
        put_bits(&s->pb, 1, s->repeat_first_field);
        s->progressive_frame = s->progressive_sequence;
446 447 448
        /* chroma_420_type */
        put_bits(&s->pb, 1, s->chroma_format ==
                            CHROMA_420 ? s->progressive_frame : 0);
449
        put_bits(&s->pb, 1, s->progressive_frame);
450
        put_bits(&s->pb, 1, 0);                 /* composite_display_flag */
451
    }
452
    if (s->scan_offset) {
453 454 455
        int i;

        put_header(s, USER_START_CODE);
456
        for (i = 0; i < sizeof(svcd_scan_offset_placeholder); i++)
457 458
            put_bits(&s->pb, 8, svcd_scan_offset_placeholder[i]);
    }
459
    side_data = av_frame_get_side_data(s->current_picture_ptr->f,
460 461 462 463 464 465 466 467 468 469 470 471 472 473 474 475 476 477 478 479 480 481 482 483 484 485 486 487 488 489 490 491 492 493 494 495 496
                                       AV_FRAME_DATA_STEREO3D);
    if (side_data) {
        AVStereo3D *stereo = (AVStereo3D *)side_data->data;
        uint8_t fpa_type;

        switch (stereo->type) {
        case AV_STEREO3D_SIDEBYSIDE:
            fpa_type = 0x03;
            break;
        case AV_STEREO3D_TOPBOTTOM:
            fpa_type = 0x04;
            break;
        case AV_STEREO3D_2D:
            fpa_type = 0x08;
            break;
        case AV_STEREO3D_SIDEBYSIDE_QUINCUNX:
            fpa_type = 0x23;
            break;
        default:
            fpa_type = 0;
            break;
        }

        if (fpa_type != 0) {
            put_header(s, USER_START_CODE);
            put_bits(&s->pb, 8, 'J');   // S3D_video_format_signaling_identifier
            put_bits(&s->pb, 8, 'P');
            put_bits(&s->pb, 8, '3');
            put_bits(&s->pb, 8, 'D');
            put_bits(&s->pb, 8, 0x03);  // S3D_video_format_length

            put_bits(&s->pb, 1, 1);     // reserved_bit
            put_bits(&s->pb, 7, fpa_type); // S3D_video_format_type
            put_bits(&s->pb, 8, 0x04);  // reserved_data[0]
            put_bits(&s->pb, 8, 0xFF);  // reserved_data[1]
        }
    }
497

498
    s->mb_y = 0;
499 500 501 502 503 504 505 506 507
    ff_mpeg1_encode_slice_header(s);
}

static inline void put_mb_modes(MpegEncContext *s, int n, int bits,
                                int has_mv, int field_motion)
{
    put_bits(&s->pb, n, bits);
    if (!s->frame_pred_frame_dct) {
        if (has_mv)
508 509
            /* motion_type: frame/field */
            put_bits(&s->pb, 2, 2 - field_motion);
510 511 512 513
        put_bits(&s->pb, 1, s->interlaced_dct);
    }
}

514 515 516 517 518 519 520 521 522 523 524
// RAL: Parameter added: f_or_b_code
static void mpeg1_encode_motion(MpegEncContext *s, int val, int f_or_b_code)
{
    if (val == 0) {
        /* zero vector */
        put_bits(&s->pb,
                 ff_mpeg12_mbMotionVectorTable[0][1],
                 ff_mpeg12_mbMotionVectorTable[0][0]);
    } else {
        int code, sign, bits;
        int bit_size = f_or_b_code - 1;
525
        int range    = 1 << bit_size;
526 527 528 529 530 531 532 533 534 535 536 537 538 539 540 541 542 543 544 545 546 547 548
        /* modulo encoding */
        val = sign_extend(val, 5 + bit_size);

        if (val >= 0) {
            val--;
            code = (val >> bit_size) + 1;
            bits = val & (range - 1);
            sign = 0;
        } else {
            val = -val;
            val--;
            code = (val >> bit_size) + 1;
            bits = val & (range - 1);
            sign = 1;
        }

        assert(code > 0 && code <= 16);

        put_bits(&s->pb,
                 ff_mpeg12_mbMotionVectorTable[code][1],
                 ff_mpeg12_mbMotionVectorTable[code][0]);

        put_bits(&s->pb, 1, sign);
549
        if (bit_size > 0)
550 551 552 553 554 555
            put_bits(&s->pb, bit_size, bits);
    }
}

static inline void encode_dc(MpegEncContext *s, int diff, int component)
{
556 557
    unsigned int diff_u = diff + 255;
    if (diff_u >= 511) {
558 559
        int index;

560 561
        if (diff < 0) {
            index = av_log2_16bit(-2 * diff);
562
            diff--;
563 564
        } else {
            index = av_log2_16bit(2 * diff);
565
        }
566 567 568 569 570 571 572 573 574 575
        if (component == 0)
            put_bits(&s->pb,
                     ff_mpeg12_vlc_dc_lum_bits[index] + index,
                     (ff_mpeg12_vlc_dc_lum_code[index] << index) +
                     (diff & ((1 << index) - 1)));
        else
            put_bits(&s->pb,
                     ff_mpeg12_vlc_dc_chroma_bits[index] + index,
                     (ff_mpeg12_vlc_dc_chroma_code[index] << index) +
                     (diff & ((1 << index) - 1)));
576
    } else {
577 578 579 580 581 582 583 584
        if (component == 0)
            put_bits(&s->pb,
                     mpeg1_lum_dc_uni[diff + 255] & 0xFF,
                     mpeg1_lum_dc_uni[diff + 255] >> 8);
        else
            put_bits(&s->pb,
                     mpeg1_chr_dc_uni[diff + 255] & 0xFF,
                     mpeg1_chr_dc_uni[diff + 255] >> 8);
585 586 587
    }
}

588
static void mpeg1_encode_block(MpegEncContext *s, int16_t *block, int n)
589 590 591 592 593 594 595 596 597
{
    int alevel, level, last_non_zero, dc, diff, i, j, run, last_index, sign;
    int code, component;
    const uint16_t (*table_vlc)[2] = ff_rl_mpeg1.table_vlc;

    last_index = s->block_last_index[n];

    /* DC coef */
    if (s->mb_intra) {
598 599 600
        component = (n <= 3 ? 0 : (n & 1) + 1);
        dc        = block[0];                   /* overflow is impossible */
        diff      = dc - s->last_dc[component];
601 602 603 604 605 606
        encode_dc(s, diff, component);
        s->last_dc[component] = dc;
        i = 1;
        if (s->intra_vlc_format)
            table_vlc = ff_rl_mpeg2.table_vlc;
    } else {
607 608
        /* encode the first coefficient: needs to be done here because
         * it is handled slightly differently */
609 610
        level = block[0];
        if (abs(level) == 1) {
611 612 613
            code = ((uint32_t)level >> 31);     /* the sign bit */
            put_bits(&s->pb, 2, code | 0x02);
            i = 1;
614
        } else {
615
            i             = 0;
616 617 618 619 620 621 622 623
            last_non_zero = -1;
            goto next_coef;
        }
    }

    /* now quantify & encode AC coefs */
    last_non_zero = i - 1;

624 625
    for (; i <= last_index; i++) {
        j     = s->intra_scantable.permutated[i];
626
        level = block[j];
627 628

next_coef:
629 630 631 632
        /* encode using VLC */
        if (level != 0) {
            run = i - last_non_zero - 1;

633
            alevel = level;
634
            MASK_ABS(sign, alevel);
635
            sign &= 1;
636

637 638 639 640 641
            if (alevel <= mpeg1_max_level[0][run]) {
                code = mpeg1_index_run[0][run] + alevel - 1;
                /* store the VLC & sign at once */
                put_bits(&s->pb, table_vlc[code][1] + 1,
                         (table_vlc[code][0] << 1) + sign);
642 643 644 645 646
            } else {
                /* escape seems to be pretty rare <5% so I do not optimize it */
                put_bits(&s->pb, table_vlc[111][1], table_vlc[111][0]);
                /* escape: only clip in this case */
                put_bits(&s->pb, 6, run);
647
                if (s->codec_id == AV_CODEC_ID_MPEG1VIDEO) {
648 649 650
                    if (alevel < 128) {
                        put_sbits(&s->pb, 8, level);
                    } else {
651
                        if (level < 0)
652
                            put_bits(&s->pb, 16, 0x8001 + level + 255);
653
                        else
654 655
                            put_sbits(&s->pb, 16, level);
                    }
656
                } else {
657 658 659 660 661 662 663 664 665 666
                    put_sbits(&s->pb, 12, level);
                }
            }
            last_non_zero = i;
        }
    }
    /* end of block */
    put_bits(&s->pb, table_vlc[112][1], table_vlc[112][0]);
}

667
static av_always_inline void mpeg1_encode_mb_internal(MpegEncContext *s,
668
                                                      int16_t block[8][64],
669 670
                                                      int motion_x, int motion_y,
                                                      int mb_block_count)
671 672
{
    int i, cbp;
673 674 675
    const int mb_x     = s->mb_x;
    const int mb_y     = s->mb_y;
    const int first_mb = mb_x == s->resync_mb_x && mb_y == s->resync_mb_y;
676 677 678

    /* compute cbp */
    cbp = 0;
679
    for (i = 0; i < mb_block_count; i++)
680 681 682 683
        if (s->block_last_index[i] >= 0)
            cbp |= 1 << (mb_block_count - 1 - i);

    if (cbp == 0 && !first_mb && s->mv_type == MV_TYPE_16X16 &&
684 685
        (mb_x != s->mb_width - 1 ||
         (mb_y != s->mb_height - 1 && s->codec_id == AV_CODEC_ID_MPEG1VIDEO)) &&
686
        ((s->pict_type == AV_PICTURE_TYPE_P && (motion_x | motion_y) == 0) ||
687 688 689 690 691 692 693
         (s->pict_type == AV_PICTURE_TYPE_B && s->mv_dir == s->last_mv_dir &&
          (((s->mv_dir & MV_DIR_FORWARD)
            ? ((s->mv[0][0][0] - s->last_mv[0][0][0]) |
               (s->mv[0][0][1] - s->last_mv[0][0][1])) : 0) |
           ((s->mv_dir & MV_DIR_BACKWARD)
            ? ((s->mv[1][0][0] - s->last_mv[1][0][0]) |
               (s->mv[1][0][1] - s->last_mv[1][0][1])) : 0)) == 0))) {
694 695 696 697 698
        s->mb_skip_run++;
        s->qscale -= s->dquant;
        s->skip_count++;
        s->misc_bits++;
        s->last_bits++;
699 700 701 702 703
        if (s->pict_type == AV_PICTURE_TYPE_P) {
            s->last_mv[0][0][0] =
            s->last_mv[0][0][1] =
            s->last_mv[0][1][0] =
            s->last_mv[0][1][1] = 0;
704 705
        }
    } else {
706
        if (first_mb) {
707 708
            assert(s->mb_skip_run == 0);
            encode_mb_skip_run(s, s->mb_x);
709
        } else {
710 711 712
            encode_mb_skip_run(s, s->mb_skip_run);
        }

713
        if (s->pict_type == AV_PICTURE_TYPE_I) {
714 715 716
            if (s->dquant && cbp) {
                /* macroblock_type: macroblock_quant = 1 */
                put_mb_modes(s, 2, 1, 0, 0);
717
                put_qscale(s);
718 719 720
            } else {
                /* macroblock_type: macroblock_quant = 0 */
                put_mb_modes(s, 1, 1, 0, 0);
721 722
                s->qscale -= s->dquant;
            }
723
            s->misc_bits += get_bits_diff(s);
724 725
            s->i_count++;
        } else if (s->mb_intra) {
726
            if (s->dquant && cbp) {
727 728
                put_mb_modes(s, 6, 0x01, 0, 0);
                put_qscale(s);
729
            } else {
730 731 732
                put_mb_modes(s, 5, 0x03, 0, 0);
                s->qscale -= s->dquant;
            }
733
            s->misc_bits += get_bits_diff(s);
734 735
            s->i_count++;
            memset(s->last_mv, 0, sizeof(s->last_mv));
736
        } else if (s->pict_type == AV_PICTURE_TYPE_P) {
737
            if (s->mv_type == MV_TYPE_16X16) {
738
                if (cbp != 0) {
739 740 741 742
                    if ((motion_x | motion_y) == 0) {
                        if (s->dquant) {
                            /* macroblock_pattern & quant */
                            put_mb_modes(s, 5, 1, 0, 0);
743
                            put_qscale(s);
744 745 746
                        } else {
                            /* macroblock_pattern only */
                            put_mb_modes(s, 2, 1, 0, 0);
747
                        }
748
                        s->misc_bits += get_bits_diff(s);
749
                    } else {
750 751
                        if (s->dquant) {
                            put_mb_modes(s, 5, 2, 1, 0);    /* motion + cbp */
752
                            put_qscale(s);
753 754
                        } else {
                            put_mb_modes(s, 1, 1, 1, 0);    /* motion + cbp */
755
                        }
756 757 758 759 760 761 762 763 764 765
                        s->misc_bits += get_bits_diff(s);
                        // RAL: f_code parameter added
                        mpeg1_encode_motion(s,
                                            motion_x - s->last_mv[0][0][0],
                                            s->f_code);
                        // RAL: f_code parameter added
                        mpeg1_encode_motion(s,
                                            motion_y - s->last_mv[0][0][1],
                                            s->f_code);
                        s->mv_bits += get_bits_diff(s);
766 767
                    }
                } else {
768
                    put_bits(&s->pb, 3, 1);         /* motion only */
769
                    if (!s->frame_pred_frame_dct)
770 771 772 773 774 775 776 777 778 779 780 781
                        put_bits(&s->pb, 2, 2);     /* motion_type: frame */
                    s->misc_bits += get_bits_diff(s);
                    // RAL: f_code parameter added
                    mpeg1_encode_motion(s,
                                        motion_x - s->last_mv[0][0][0],
                                        s->f_code);
                    // RAL: f_code parameter added
                    mpeg1_encode_motion(s,
                                        motion_y - s->last_mv[0][0][1],
                                        s->f_code);
                    s->qscale  -= s->dquant;
                    s->mv_bits += get_bits_diff(s);
782
                }
783 784 785
                s->last_mv[0][1][0] = s->last_mv[0][0][0] = motion_x;
                s->last_mv[0][1][1] = s->last_mv[0][0][1] = motion_y;
            } else {
786 787 788
                assert(!s->frame_pred_frame_dct && s->mv_type == MV_TYPE_FIELD);

                if (cbp) {
789 790
                    if (s->dquant) {
                        put_mb_modes(s, 5, 2, 1, 1);    /* motion + cbp */
791
                        put_qscale(s);
792 793
                    } else {
                        put_mb_modes(s, 1, 1, 1, 1);    /* motion + cbp */
794 795
                    }
                } else {
796 797
                    put_bits(&s->pb, 3, 1);             /* motion only */
                    put_bits(&s->pb, 2, 1);             /* motion_type: field */
798 799
                    s->qscale -= s->dquant;
                }
800 801
                s->misc_bits += get_bits_diff(s);
                for (i = 0; i < 2; i++) {
802
                    put_bits(&s->pb, 1, s->field_select[0][i]);
803 804 805 806 807 808 809 810
                    mpeg1_encode_motion(s,
                                        s->mv[0][i][0] - s->last_mv[0][i][0],
                                        s->f_code);
                    mpeg1_encode_motion(s,
                                        s->mv[0][i][1] - (s->last_mv[0][i][1] >> 1),
                                        s->f_code);
                    s->last_mv[0][i][0] = s->mv[0][i][0];
                    s->last_mv[0][i][1] = 2 * s->mv[0][i][1];
811
                }
812
                s->mv_bits += get_bits_diff(s);
813
            }
814
            if (cbp) {
815
                if (s->chroma_y_shift) {
816 817 818
                    put_bits(&s->pb,
                             ff_mpeg12_mbPatTable[cbp][1],
                             ff_mpeg12_mbPatTable[cbp][0]);
819
                } else {
820 821 822
                    put_bits(&s->pb,
                             ff_mpeg12_mbPatTable[cbp >> 2][1],
                             ff_mpeg12_mbPatTable[cbp >> 2][0]);
823
                    put_sbits(&s->pb, 2, cbp);
824 825 826
                }
            }
            s->f_count++;
827 828 829
        } else {
            if (s->mv_type == MV_TYPE_16X16) {
                if (cbp) {                      // With coded bloc pattern
830
                    if (s->dquant) {
831
                        if (s->mv_dir == MV_DIR_FORWARD)
832 833
                            put_mb_modes(s, 6, 3, 1, 0);
                        else
834
                            put_mb_modes(s, 8 - s->mv_dir, 2, 1, 0);
835 836
                        put_qscale(s);
                    } else {
837
                        put_mb_modes(s, 5 - s->mv_dir, 3, 1, 0);
838
                    }
839 840
                } else {                        // No coded bloc pattern
                    put_bits(&s->pb, 5 - s->mv_dir, 2);
841 842 843 844 845
                    if (!s->frame_pred_frame_dct)
                        put_bits(&s->pb, 2, 2); /* motion_type: frame */
                    s->qscale -= s->dquant;
                }
                s->misc_bits += get_bits_diff(s);
846 847 848 849 850 851 852 853 854 855 856
                if (s->mv_dir & MV_DIR_FORWARD) {
                    mpeg1_encode_motion(s,
                                        s->mv[0][0][0] - s->last_mv[0][0][0],
                                        s->f_code);
                    mpeg1_encode_motion(s,
                                        s->mv[0][0][1] - s->last_mv[0][0][1],
                                        s->f_code);
                    s->last_mv[0][0][0] =
                    s->last_mv[0][1][0] = s->mv[0][0][0];
                    s->last_mv[0][0][1] =
                    s->last_mv[0][1][1] = s->mv[0][0][1];
857 858
                    s->f_count++;
                }
859 860 861 862 863 864 865 866 867 868 869
                if (s->mv_dir & MV_DIR_BACKWARD) {
                    mpeg1_encode_motion(s,
                                        s->mv[1][0][0] - s->last_mv[1][0][0],
                                        s->b_code);
                    mpeg1_encode_motion(s,
                                        s->mv[1][0][1] - s->last_mv[1][0][1],
                                        s->b_code);
                    s->last_mv[1][0][0] =
                    s->last_mv[1][1][0] = s->mv[1][0][0];
                    s->last_mv[1][0][1] =
                    s->last_mv[1][1][1] = s->mv[1][0][1];
870 871
                    s->b_count++;
                }
872
            } else {
873 874
                assert(s->mv_type == MV_TYPE_FIELD);
                assert(!s->frame_pred_frame_dct);
875
                if (cbp) {                      // With coded bloc pattern
876
                    if (s->dquant) {
877
                        if (s->mv_dir == MV_DIR_FORWARD)
878 879
                            put_mb_modes(s, 6, 3, 1, 1);
                        else
880
                            put_mb_modes(s, 8 - s->mv_dir, 2, 1, 1);
881 882
                        put_qscale(s);
                    } else {
883
                        put_mb_modes(s, 5 - s->mv_dir, 3, 1, 1);
884
                    }
885 886 887
                } else {                        // No coded bloc pattern
                    put_bits(&s->pb, 5 - s->mv_dir, 2);
                    put_bits(&s->pb, 2, 1);     /* motion_type: field */
888 889 890
                    s->qscale -= s->dquant;
                }
                s->misc_bits += get_bits_diff(s);
891 892
                if (s->mv_dir & MV_DIR_FORWARD) {
                    for (i = 0; i < 2; i++) {
893
                        put_bits(&s->pb, 1, s->field_select[0][i]);
894 895 896 897 898 899 900 901
                        mpeg1_encode_motion(s,
                                            s->mv[0][i][0] - s->last_mv[0][i][0],
                                            s->f_code);
                        mpeg1_encode_motion(s,
                                            s->mv[0][i][1] - (s->last_mv[0][i][1] >> 1),
                                            s->f_code);
                        s->last_mv[0][i][0] = s->mv[0][i][0];
                        s->last_mv[0][i][1] = s->mv[0][i][1] * 2;
902 903 904
                    }
                    s->f_count++;
                }
905 906
                if (s->mv_dir & MV_DIR_BACKWARD) {
                    for (i = 0; i < 2; i++) {
907
                        put_bits(&s->pb, 1, s->field_select[1][i]);
908 909 910 911 912 913 914 915
                        mpeg1_encode_motion(s,
                                            s->mv[1][i][0] - s->last_mv[1][i][0],
                                            s->b_code);
                        mpeg1_encode_motion(s,
                                            s->mv[1][i][1] - (s->last_mv[1][i][1] >> 1),
                                            s->b_code);
                        s->last_mv[1][i][0] = s->mv[1][i][0];
                        s->last_mv[1][i][1] = s->mv[1][i][1] * 2;
916 917 918 919 920
                    }
                    s->b_count++;
                }
            }
            s->mv_bits += get_bits_diff(s);
921
            if (cbp) {
922
                if (s->chroma_y_shift) {
923 924 925
                    put_bits(&s->pb,
                             ff_mpeg12_mbPatTable[cbp][1],
                             ff_mpeg12_mbPatTable[cbp][0]);
926
                } else {
927 928 929
                    put_bits(&s->pb,
                             ff_mpeg12_mbPatTable[cbp >> 2][1],
                             ff_mpeg12_mbPatTable[cbp >> 2][0]);
930
                    put_sbits(&s->pb, 2, cbp);
931 932 933
                }
            }
        }
934 935
        for (i = 0; i < mb_block_count; i++)
            if (cbp & (1 << (mb_block_count - 1 - i)))
936 937
                mpeg1_encode_block(s, block[i], i);
        s->mb_skip_run = 0;
938 939
        if (s->mb_intra)
            s->i_tex_bits += get_bits_diff(s);
940
        else
941
            s->p_tex_bits += get_bits_diff(s);
942 943 944
    }
}

945
void ff_mpeg1_encode_mb(MpegEncContext *s, int16_t block[8][64],
946
                        int motion_x, int motion_y)
947
{
948 949 950 951
    if (s->chroma_format == CHROMA_420)
        mpeg1_encode_mb_internal(s, block, motion_x, motion_y, 6);
    else
        mpeg1_encode_mb_internal(s, block, motion_x, motion_y, 8);
952 953
}

954
av_cold void ff_mpeg1_encode_init(MpegEncContext *s)
955
{
956
    static int done = 0;
957

958
    ff_mpeg12_common_init(s);
959

960
    if (!done) {
961 962 963 964
        int f_code;
        int mv;
        int i;

965
        done = 1;
966 967
        ff_rl_init(&ff_rl_mpeg1, ff_mpeg12_static_rl_table_store[0]);
        ff_rl_init(&ff_rl_mpeg2, ff_mpeg12_static_rl_table_store[1]);
968

969 970 971
        for (i = 0; i < 64; i++) {
            mpeg1_max_level[0][i] = ff_rl_mpeg1.max_level[0][i];
            mpeg1_index_run[0][i] = ff_rl_mpeg1.index_run[0][i];
972 973
        }

974
        init_uni_ac_vlc(&ff_rl_mpeg1, uni_mpeg1_ac_vlc_len);
975
        if (s->intra_vlc_format)
976
            init_uni_ac_vlc(&ff_rl_mpeg2, uni_mpeg2_ac_vlc_len);
977 978

        /* build unified dc encoding tables */
979 980 981 982 983 984 985 986 987 988 989 990 991 992 993 994 995 996 997
        for (i = -255; i < 256; i++) {
            int adiff, index;
            int bits, code;
            int diff = i;

            adiff = FFABS(diff);
            if (diff < 0)
                diff--;
            index = av_log2(2 * adiff);

            bits = ff_mpeg12_vlc_dc_lum_bits[index] + index;
            code = (ff_mpeg12_vlc_dc_lum_code[index] << index) +
                   (diff & ((1 << index) - 1));
            mpeg1_lum_dc_uni[i + 255] = bits + (code << 8);

            bits = ff_mpeg12_vlc_dc_chroma_bits[index] + index;
            code = (ff_mpeg12_vlc_dc_chroma_code[index] << index) +
                   (diff & ((1 << index) - 1));
            mpeg1_chr_dc_uni[i + 255] = bits + (code << 8);
998 999
        }

1000 1001
        for (f_code = 1; f_code <= MAX_FCODE; f_code++)
            for (mv = -MAX_MV; mv <= MAX_MV; mv++) {
1002 1003
                int len;

1004 1005 1006
                if (mv == 0) {
                    len = ff_mpeg12_mbMotionVectorTable[0][1];
                } else {
Mans Rullgard's avatar
Mans Rullgard committed
1007
                    int val, bit_size, code;
1008 1009 1010

                    bit_size = f_code - 1;

1011
                    val = mv;
1012 1013 1014 1015
                    if (val < 0)
                        val = -val;
                    val--;
                    code = (val >> bit_size) + 1;
1016 1017 1018 1019 1020 1021
                    if (code < 17)
                        len = ff_mpeg12_mbMotionVectorTable[code][1] +
                              1 + bit_size;
                    else
                        len = ff_mpeg12_mbMotionVectorTable[16][1] +
                              2 + bit_size;
1022 1023
                }

1024
                mv_penalty[f_code][mv + MAX_MV] = len;
1025 1026 1027
            }


1028 1029 1030
        for (f_code = MAX_FCODE; f_code > 0; f_code--)
            for (mv = -(8 << f_code); mv < (8 << f_code); mv++)
                fcode_tab[mv + MAX_MV] = f_code;
1031
    }
1032 1033 1034 1035 1036 1037 1038 1039
    s->me.mv_penalty = mv_penalty;
    s->fcode_tab     = fcode_tab;
    if (s->codec_id == AV_CODEC_ID_MPEG1VIDEO) {
        s->min_qcoeff = -255;
        s->max_qcoeff = 255;
    } else {
        s->min_qcoeff = -2047;
        s->max_qcoeff = 2047;
1040 1041
    }
    if (s->intra_vlc_format) {
1042 1043
        s->intra_ac_vlc_length      =
        s->intra_ac_vlc_last_length = uni_mpeg2_ac_vlc_len;
1044
    } else {
1045 1046
        s->intra_ac_vlc_length      =
        s->intra_ac_vlc_last_length = uni_mpeg1_ac_vlc_len;
1047
    }
1048 1049
    s->inter_ac_vlc_length      =
    s->inter_ac_vlc_last_length = uni_mpeg1_ac_vlc_len;
1050 1051
}

1052 1053
#define OFFSET(x) offsetof(MpegEncContext, x)
#define VE AV_OPT_FLAG_ENCODING_PARAM | AV_OPT_FLAG_VIDEO_PARAM
1054 1055 1056 1057 1058 1059
#define COMMON_OPTS                                                           \
    { "intra_vlc",           "Use MPEG-2 intra VLC table.",                   \
      OFFSET(intra_vlc_format),    AV_OPT_TYPE_INT, { .i64 = 0 }, 0, 1, VE }, \
    { "drop_frame_timecode", "Timecode is in drop frame format.",             \
      OFFSET(drop_frame_timecode), AV_OPT_TYPE_INT, { .i64 = 0 }, 0, 1, VE }, \
    { "scan_offset",         "Reserve space for SVCD scan offset user data.", \
1060 1061 1062
      OFFSET(scan_offset),         AV_OPT_TYPE_INT, { .i64 = 0 }, 0, 1, VE }, \
    { "timecode_frame_start", "GOP timecode frame start number, in non-drop-frame format", \
      OFFSET(timecode_frame_start), AV_OPT_TYPE_INT64, {.i64 = 0 }, 0, INT64_MAX, VE}, \
1063 1064 1065

static const AVOption mpeg1_options[] = {
    COMMON_OPTS
1066
    FF_MPV_COMMON_OPTS
1067 1068 1069 1070 1071
    { NULL },
};

static const AVOption mpeg2_options[] = {
    COMMON_OPTS
1072 1073
    { "non_linear_quant", "Use nonlinear quantizer.",    OFFSET(q_scale_type),   AV_OPT_TYPE_INT, { .i64 = 0 }, 0, 1, VE },
    { "alternate_scan",   "Enable alternate scantable.", OFFSET(alternate_scan), AV_OPT_TYPE_INT, { .i64 = 0 }, 0, 1, VE },
1074
    FF_MPV_COMMON_OPTS
1075 1076 1077
    { NULL },
};

1078 1079 1080 1081 1082 1083
#define mpeg12_class(x)                                 \
static const AVClass mpeg ## x ## _class = {            \
    .class_name = "mpeg" # x "video encoder",           \
    .item_name  = av_default_item_name,                 \
    .option     = mpeg ## x ## _options,                \
    .version    = LIBAVUTIL_VERSION_INT,                \
1084 1085 1086 1087 1088
};

mpeg12_class(1)
mpeg12_class(2)

1089
AVCodec ff_mpeg1video_encoder = {
1090
    .name                 = "mpeg1video",
1091
    .long_name            = NULL_IF_CONFIG_SMALL("MPEG-1 video"),
1092
    .type                 = AVMEDIA_TYPE_VIDEO,
1093
    .id                   = AV_CODEC_ID_MPEG1VIDEO,
1094 1095
    .priv_data_size       = sizeof(MpegEncContext),
    .init                 = encode_init,
1096 1097
    .encode2              = ff_mpv_encode_picture,
    .close                = ff_mpv_encode_end,
1098
    .supported_framerates = ff_mpeg12_frame_rate_tab + 1,
1099 1100
    .pix_fmts             = (const enum AVPixelFormat[]) { AV_PIX_FMT_YUV420P,
                                                           AV_PIX_FMT_NONE },
1101
    .capabilities         = AV_CODEC_CAP_DELAY | AV_CODEC_CAP_SLICE_THREADS,
1102
    .priv_class           = &mpeg1_class,
1103 1104
};

1105
AVCodec ff_mpeg2video_encoder = {
1106
    .name                 = "mpeg2video",
1107
    .long_name            = NULL_IF_CONFIG_SMALL("MPEG-2 video"),
1108
    .type                 = AVMEDIA_TYPE_VIDEO,
1109
    .id                   = AV_CODEC_ID_MPEG2VIDEO,
1110 1111
    .priv_data_size       = sizeof(MpegEncContext),
    .init                 = encode_init,
1112 1113
    .encode2              = ff_mpv_encode_picture,
    .close                = ff_mpv_encode_end,
1114
    .supported_framerates = ff_mpeg12_frame_rate_tab + 1,
1115 1116 1117
    .pix_fmts             = (const enum AVPixelFormat[]) { AV_PIX_FMT_YUV420P,
                                                           AV_PIX_FMT_YUV422P,
                                                           AV_PIX_FMT_NONE },
1118
    .capabilities         = AV_CODEC_CAP_DELAY | AV_CODEC_CAP_SLICE_THREADS,
1119
    .priv_class           = &mpeg2_class,
1120
};