mpeg12enc.c 41.1 KB
Newer Older
1 2
/*
 * MPEG1/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 26 27
 * MPEG1/2 encoder
 */

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 139 140
    if (find_frame_rate_index(s) < 0) {
        if (s->strict_std_compliance > FF_COMPLIANCE_EXPERIMENTAL) {
            av_log(avctx, AV_LOG_ERROR, "MPEG1/2 does not support %d/%d fps\n",
                   avctx->time_base.den, avctx->time_base.num);
141
            return -1;
142 143 144 145
        } else {
            av_log(avctx, AV_LOG_INFO,
                   "MPEG1/2 does not support %d/%d fps, there may be AV sync issues\n",
                   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 185 186 187 188 189
        return -1;
    }

    return 0;
}

static void put_header(MpegEncContext *s, int header)
{
190
    avpriv_align_put_bits(&s->pb);
191
    put_bits(&s->pb, 16, header >> 16);
192
    put_sbits(&s->pb, 16, header);
193 194 195 196 197
}

/* put sequence header if needed */
static void mpeg1_encode_sequence_header(MpegEncContext *s)
{
198 199 200 201 202
    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);
203

204 205
    if (aspect_ratio == 0.0)
        aspect_ratio = 1.0;             // pixel aspect 1.1 (VGA)
206

207
    if (s->current_picture.f->key_frame) {
208
        AVRational framerate = ff_mpeg12_frame_rate_tab[s->frame_rate_index];
209

210 211
        /* mpeg1 header repeated every gop */
        put_header(s, SEQ_START_CODE);
212

213 214
        put_sbits(&s->pb, 12, s->width);
        put_sbits(&s->pb, 12, s->height);
215

216 217 218 219 220 221
        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;
222

223
            error = FFABS(error);
224

225 226 227
            if (error < best_aspect_error) {
                best_aspect_error    = error;
                s->aspect_ratio_info = i;
228
            }
229
        }
230

231 232
        put_bits(&s->pb, 4, s->aspect_ratio_info);
        put_bits(&s->pb, 4, s->frame_rate_index);
233

234 235 236 237 238 239 240
        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;
        }
241

242 243 244 245 246 247 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
        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
290 291 292 293 294 295 296 297 298 299 300 301

            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
302
        }
303

304 305 306 307 308
        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;
309
        time_code = s->current_picture_ptr->f->coded_picture_number +
310 311
                    s->avctx->timecode_frame_start;

312
        s->gop_picture_number = s->current_picture_ptr->f->coded_picture_number;
313 314 315 316 317 318 319 320
        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);
321
        }
322 323 324 325 326
        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)));
327
        put_bits(&s->pb, 1, !!(s->avctx->flags & AV_CODEC_FLAG_CLOSED_GOP));
328 329
        put_bits(&s->pb, 1, 0);                     // broken link
    }
330 331
}

332 333
static inline void encode_mb_skip_run(MpegEncContext *s, int run)
{
334 335 336 337
    while (run >= 33) {
        put_bits(&s->pb, 11, 0x008);
        run -= 33;
    }
338 339
    put_bits(&s->pb, ff_mpeg12_mbAddrIncrTable[run][1],
             ff_mpeg12_mbAddrIncrTable[run][0]);
340 341 342 343
}

static av_always_inline void put_qscale(MpegEncContext *s)
{
344 345
    if (s->q_scale_type) {
        assert(s->qscale >= 1 && s->qscale <= 12);
346
        put_bits(&s->pb, 5, inv_non_linear_qscale[s->qscale]);
347
    } else {
348 349 350 351
        put_bits(&s->pb, 5, s->qscale);
    }
}

352 353
void ff_mpeg1_encode_slice_header(MpegEncContext *s)
{
354 355
    if (s->height > 2800) {
        put_header(s, SLICE_MIN_START_CODE + (s->mb_y & 127));
356 357
        /* slice_vertical_position_extension */
        put_bits(&s->pb, 3, s->mb_y >> 7);
358
    } else {
359
        put_header(s, SLICE_MIN_START_CODE + s->mb_y);
360
    }
361
    put_qscale(s);
362 363
    /* slice extra information */
    put_bits(&s->pb, 1, 0);
364 365
}

366
void ff_mpeg1_encode_picture_header(MpegEncContext *s, int picture_number)
367
{
368
    AVFrameSideData *side_data;
369 370 371 372 373 374 375
    mpeg1_encode_sequence_header(s);

    /* mpeg1 picture header */
    put_header(s, PICTURE_START_CODE);
    /* temporal reference */

    // RAL: s->picture_number instead of s->fake_picture_number
376 377
    put_bits(&s->pb, 10,
             (s->picture_number - s->gop_picture_number) & 0x3ff);
378 379
    put_bits(&s->pb, 3, s->pict_type);

380 381
    s->vbv_delay_ptr = s->pb.buf + put_bits_count(&s->pb) / 8;
    put_bits(&s->pb, 16, 0xFFFF);               /* vbv_delay */
382

383 384 385 386 387 388
    // 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 */
389
        else
390
            put_bits(&s->pb, 3, 7);             /* forward_f_code */
391 392
    }

393
    // RAL: Backward f_code necessary for B-frames
394
    if (s->pict_type == AV_PICTURE_TYPE_B) {
395 396 397
        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 */
398
        else
399
            put_bits(&s->pb, 3, 7);             /* backward_f_code */
400 401
    }

402
    put_bits(&s->pb, 1, 0);                     /* extra bit picture */
403 404

    s->frame_pred_frame_dct = 1;
405
    if (s->codec_id == AV_CODEC_ID_MPEG2VIDEO) {
406
        put_header(s, EXT_START_CODE);
407 408 409
        put_bits(&s->pb, 4, 8);                 /* pic ext */
        if (s->pict_type == AV_PICTURE_TYPE_P ||
            s->pict_type == AV_PICTURE_TYPE_B) {
410 411
            put_bits(&s->pb, 4, s->f_code);
            put_bits(&s->pb, 4, s->f_code);
412
        } else {
413 414
            put_bits(&s->pb, 8, 255);
        }
415
        if (s->pict_type == AV_PICTURE_TYPE_B) {
416 417
            put_bits(&s->pb, 4, s->b_code);
            put_bits(&s->pb, 4, s->b_code);
418
        } else {
419 420 421 422 423 424
            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);
425 426 427
        if (s->progressive_sequence)
            put_bits(&s->pb, 1, 0);             /* no repeat */
        else
428
            put_bits(&s->pb, 1, s->current_picture_ptr->f->top_field_first);
429
        /* XXX: optimize the generation of this flag with entropy measures */
430 431 432 433 434 435 436 437 438
        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;
439 440 441
        /* chroma_420_type */
        put_bits(&s->pb, 1, s->chroma_format ==
                            CHROMA_420 ? s->progressive_frame : 0);
442
        put_bits(&s->pb, 1, s->progressive_frame);
443
        put_bits(&s->pb, 1, 0);                 /* composite_display_flag */
444
    }
445
    if (s->scan_offset) {
446 447 448
        int i;

        put_header(s, USER_START_CODE);
449
        for (i = 0; i < sizeof(svcd_scan_offset_placeholder); i++)
450 451
            put_bits(&s->pb, 8, svcd_scan_offset_placeholder[i]);
    }
452
    side_data = av_frame_get_side_data(s->current_picture_ptr->f,
453 454 455 456 457 458 459 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
                                       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]
        }
    }
490

491
    s->mb_y = 0;
492 493 494 495 496 497 498 499 500
    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)
501 502
            /* motion_type: frame/field */
            put_bits(&s->pb, 2, 2 - field_motion);
503 504 505 506
        put_bits(&s->pb, 1, s->interlaced_dct);
    }
}

507 508 509 510 511 512 513 514 515 516 517
// 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;
518
        int range    = 1 << bit_size;
519 520 521 522 523 524 525 526 527 528 529 530 531 532 533 534 535 536 537 538 539 540 541
        /* 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);
542
        if (bit_size > 0)
543 544 545 546 547 548
            put_bits(&s->pb, bit_size, bits);
    }
}

static inline void encode_dc(MpegEncContext *s, int diff, int component)
{
549 550
    unsigned int diff_u = diff + 255;
    if (diff_u >= 511) {
551 552
        int index;

553 554
        if (diff < 0) {
            index = av_log2_16bit(-2 * diff);
555
            diff--;
556 557
        } else {
            index = av_log2_16bit(2 * diff);
558
        }
559 560 561 562 563 564 565 566 567 568
        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)));
569
    } else {
570 571 572 573 574 575 576 577
        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);
578 579 580
    }
}

581
static void mpeg1_encode_block(MpegEncContext *s, int16_t *block, int n)
582 583 584 585 586 587 588 589 590
{
    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) {
591 592 593
        component = (n <= 3 ? 0 : (n & 1) + 1);
        dc        = block[0];                   /* overflow is impossible */
        diff      = dc - s->last_dc[component];
594 595 596 597 598 599
        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 {
600 601
        /* encode the first coefficient: needs to be done here because
         * it is handled slightly differently */
602 603
        level = block[0];
        if (abs(level) == 1) {
604 605 606
            code = ((uint32_t)level >> 31);     /* the sign bit */
            put_bits(&s->pb, 2, code | 0x02);
            i = 1;
607
        } else {
608
            i             = 0;
609 610 611 612 613 614 615 616
            last_non_zero = -1;
            goto next_coef;
        }
    }

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

617 618
    for (; i <= last_index; i++) {
        j     = s->intra_scantable.permutated[i];
619
        level = block[j];
620 621

next_coef:
622 623 624 625
        /* encode using VLC */
        if (level != 0) {
            run = i - last_non_zero - 1;

626
            alevel = level;
627
            MASK_ABS(sign, alevel);
628
            sign &= 1;
629

630 631 632 633 634
            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);
635 636 637 638 639
            } 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);
640
                if (s->codec_id == AV_CODEC_ID_MPEG1VIDEO) {
641 642 643
                    if (alevel < 128) {
                        put_sbits(&s->pb, 8, level);
                    } else {
644
                        if (level < 0)
645
                            put_bits(&s->pb, 16, 0x8001 + level + 255);
646
                        else
647 648
                            put_sbits(&s->pb, 16, level);
                    }
649
                } else {
650 651 652 653 654 655 656 657 658 659
                    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]);
}

660
static av_always_inline void mpeg1_encode_mb_internal(MpegEncContext *s,
661
                                                      int16_t block[8][64],
662 663
                                                      int motion_x, int motion_y,
                                                      int mb_block_count)
664 665
{
    int i, cbp;
666 667 668
    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;
669 670 671

    /* compute cbp */
    cbp = 0;
672
    for (i = 0; i < mb_block_count; i++)
673 674 675 676
        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 &&
677 678
        (mb_x != s->mb_width - 1 ||
         (mb_y != s->mb_height - 1 && s->codec_id == AV_CODEC_ID_MPEG1VIDEO)) &&
679
        ((s->pict_type == AV_PICTURE_TYPE_P && (motion_x | motion_y) == 0) ||
680 681 682 683 684 685 686
         (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))) {
687 688 689 690 691
        s->mb_skip_run++;
        s->qscale -= s->dquant;
        s->skip_count++;
        s->misc_bits++;
        s->last_bits++;
692 693 694 695 696
        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;
697 698
        }
    } else {
699
        if (first_mb) {
700 701
            assert(s->mb_skip_run == 0);
            encode_mb_skip_run(s, s->mb_x);
702
        } else {
703 704 705
            encode_mb_skip_run(s, s->mb_skip_run);
        }

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

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

938
void ff_mpeg1_encode_mb(MpegEncContext *s, int16_t block[8][64],
939
                        int motion_x, int motion_y)
940
{
941 942 943 944
    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);
945 946
}

947
av_cold void ff_mpeg1_encode_init(MpegEncContext *s)
948
{
949
    static int done = 0;
950

951
    ff_mpeg12_common_init(s);
952

953
    if (!done) {
954 955 956 957
        int f_code;
        int mv;
        int i;

958
        done = 1;
959 960
        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]);
961

962 963 964
        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];
965 966
        }

967
        init_uni_ac_vlc(&ff_rl_mpeg1, uni_mpeg1_ac_vlc_len);
968
        if (s->intra_vlc_format)
969
            init_uni_ac_vlc(&ff_rl_mpeg2, uni_mpeg2_ac_vlc_len);
970 971

        /* build unified dc encoding tables */
972 973 974 975 976 977 978 979 980 981 982 983 984 985 986 987 988 989 990
        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);
991 992
        }

993 994
        for (f_code = 1; f_code <= MAX_FCODE; f_code++)
            for (mv = -MAX_MV; mv <= MAX_MV; mv++) {
995 996
                int len;

997 998 999
                if (mv == 0) {
                    len = ff_mpeg12_mbMotionVectorTable[0][1];
                } else {
Mans Rullgard's avatar
Mans Rullgard committed
1000
                    int val, bit_size, code;
1001 1002 1003

                    bit_size = f_code - 1;

1004
                    val = mv;
1005 1006 1007 1008
                    if (val < 0)
                        val = -val;
                    val--;
                    code = (val >> bit_size) + 1;
1009 1010 1011 1012 1013 1014
                    if (code < 17)
                        len = ff_mpeg12_mbMotionVectorTable[code][1] +
                              1 + bit_size;
                    else
                        len = ff_mpeg12_mbMotionVectorTable[16][1] +
                              2 + bit_size;
1015 1016
                }

1017
                mv_penalty[f_code][mv + MAX_MV] = len;
1018 1019 1020
            }


1021 1022 1023
        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;
1024
    }
1025 1026 1027 1028 1029 1030 1031 1032
    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;
1033 1034
    }
    if (s->intra_vlc_format) {
1035 1036
        s->intra_ac_vlc_length      =
        s->intra_ac_vlc_last_length = uni_mpeg2_ac_vlc_len;
1037
    } else {
1038 1039
        s->intra_ac_vlc_length      =
        s->intra_ac_vlc_last_length = uni_mpeg1_ac_vlc_len;
1040
    }
1041 1042
    s->inter_ac_vlc_length      =
    s->inter_ac_vlc_last_length = uni_mpeg1_ac_vlc_len;
1043 1044
}

1045 1046
#define OFFSET(x) offsetof(MpegEncContext, x)
#define VE AV_OPT_FLAG_ENCODING_PARAM | AV_OPT_FLAG_VIDEO_PARAM
1047 1048 1049 1050 1051 1052 1053
#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.", \
      OFFSET(scan_offset),         AV_OPT_TYPE_INT, { .i64 = 0 }, 0, 1, VE },
1054 1055 1056

static const AVOption mpeg1_options[] = {
    COMMON_OPTS
1057
    FF_MPV_COMMON_OPTS
1058 1059 1060 1061 1062
    { NULL },
};

static const AVOption mpeg2_options[] = {
    COMMON_OPTS
1063 1064
    { "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 },
1065
    FF_MPV_COMMON_OPTS
1066 1067 1068
    { NULL },
};

1069 1070 1071 1072 1073 1074
#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,                \
1075 1076 1077 1078 1079
};

mpeg12_class(1)
mpeg12_class(2)

1080
AVCodec ff_mpeg1video_encoder = {
1081
    .name                 = "mpeg1video",
1082
    .long_name            = NULL_IF_CONFIG_SMALL("MPEG-1 video"),
1083
    .type                 = AVMEDIA_TYPE_VIDEO,
1084
    .id                   = AV_CODEC_ID_MPEG1VIDEO,
1085 1086
    .priv_data_size       = sizeof(MpegEncContext),
    .init                 = encode_init,
1087 1088
    .encode2              = ff_mpv_encode_picture,
    .close                = ff_mpv_encode_end,
1089
    .supported_framerates = ff_mpeg12_frame_rate_tab + 1,
1090 1091
    .pix_fmts             = (const enum AVPixelFormat[]) { AV_PIX_FMT_YUV420P,
                                                           AV_PIX_FMT_NONE },
1092
    .capabilities         = AV_CODEC_CAP_DELAY | AV_CODEC_CAP_SLICE_THREADS,
1093
    .priv_class           = &mpeg1_class,
1094 1095
};

1096
AVCodec ff_mpeg2video_encoder = {
1097
    .name                 = "mpeg2video",
1098
    .long_name            = NULL_IF_CONFIG_SMALL("MPEG-2 video"),
1099
    .type                 = AVMEDIA_TYPE_VIDEO,
1100
    .id                   = AV_CODEC_ID_MPEG2VIDEO,
1101 1102
    .priv_data_size       = sizeof(MpegEncContext),
    .init                 = encode_init,
1103 1104
    .encode2              = ff_mpv_encode_picture,
    .close                = ff_mpv_encode_end,
1105
    .supported_framerates = ff_mpeg12_frame_rate_tab + 1,
1106 1107 1108
    .pix_fmts             = (const enum AVPixelFormat[]) { AV_PIX_FMT_YUV420P,
                                                           AV_PIX_FMT_YUV422P,
                                                           AV_PIX_FMT_NONE },
1109
    .capabilities         = AV_CODEC_CAP_DELAY | AV_CODEC_CAP_SLICE_THREADS,
1110
    .priv_class           = &mpeg2_class,
1111
};