1cabdff1aSopenharmony_ci/* 2cabdff1aSopenharmony_ci * MPEG-1/2 encoder 3cabdff1aSopenharmony_ci * Copyright (c) 2000,2001 Fabrice Bellard 4cabdff1aSopenharmony_ci * Copyright (c) 2002-2004 Michael Niedermayer <michaelni@gmx.at> 5cabdff1aSopenharmony_ci * 6cabdff1aSopenharmony_ci * This file is part of FFmpeg. 7cabdff1aSopenharmony_ci * 8cabdff1aSopenharmony_ci * FFmpeg is free software; you can redistribute it and/or 9cabdff1aSopenharmony_ci * modify it under the terms of the GNU Lesser General Public 10cabdff1aSopenharmony_ci * License as published by the Free Software Foundation; either 11cabdff1aSopenharmony_ci * version 2.1 of the License, or (at your option) any later version. 12cabdff1aSopenharmony_ci * 13cabdff1aSopenharmony_ci * FFmpeg is distributed in the hope that it will be useful, 14cabdff1aSopenharmony_ci * but WITHOUT ANY WARRANTY; without even the implied warranty of 15cabdff1aSopenharmony_ci * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU 16cabdff1aSopenharmony_ci * Lesser General Public License for more details. 17cabdff1aSopenharmony_ci * 18cabdff1aSopenharmony_ci * You should have received a copy of the GNU Lesser General Public 19cabdff1aSopenharmony_ci * License along with FFmpeg; if not, write to the Free Software 20cabdff1aSopenharmony_ci * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA 21cabdff1aSopenharmony_ci */ 22cabdff1aSopenharmony_ci 23cabdff1aSopenharmony_ci/** 24cabdff1aSopenharmony_ci * @file 25cabdff1aSopenharmony_ci * MPEG-1/2 encoder 26cabdff1aSopenharmony_ci */ 27cabdff1aSopenharmony_ci 28cabdff1aSopenharmony_ci#include <stdint.h> 29cabdff1aSopenharmony_ci 30cabdff1aSopenharmony_ci#include "config.h" 31cabdff1aSopenharmony_ci#include "config_components.h" 32cabdff1aSopenharmony_ci#include "libavutil/attributes.h" 33cabdff1aSopenharmony_ci#include "libavutil/avassert.h" 34cabdff1aSopenharmony_ci#include "libavutil/log.h" 35cabdff1aSopenharmony_ci#include "libavutil/opt.h" 36cabdff1aSopenharmony_ci#include "libavutil/thread.h" 37cabdff1aSopenharmony_ci#include "libavutil/timecode.h" 38cabdff1aSopenharmony_ci#include "libavutil/stereo3d.h" 39cabdff1aSopenharmony_ci 40cabdff1aSopenharmony_ci#include "avcodec.h" 41cabdff1aSopenharmony_ci#include "codec_internal.h" 42cabdff1aSopenharmony_ci#include "mathops.h" 43cabdff1aSopenharmony_ci#include "mpeg12.h" 44cabdff1aSopenharmony_ci#include "mpeg12data.h" 45cabdff1aSopenharmony_ci#include "mpeg12enc.h" 46cabdff1aSopenharmony_ci#include "mpegutils.h" 47cabdff1aSopenharmony_ci#include "mpegvideo.h" 48cabdff1aSopenharmony_ci#include "mpegvideoenc.h" 49cabdff1aSopenharmony_ci#include "profiles.h" 50cabdff1aSopenharmony_ci 51cabdff1aSopenharmony_ci#if CONFIG_MPEG1VIDEO_ENCODER || CONFIG_MPEG2VIDEO_ENCODER 52cabdff1aSopenharmony_cistatic const uint8_t svcd_scan_offset_placeholder[] = { 53cabdff1aSopenharmony_ci 0x10, 0x0E, 0x00, 0x80, 0x81, 0x00, 0x80, 54cabdff1aSopenharmony_ci 0x81, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 55cabdff1aSopenharmony_ci}; 56cabdff1aSopenharmony_ci 57cabdff1aSopenharmony_cistatic uint8_t mv_penalty[MAX_FCODE + 1][MAX_DMV * 2 + 1]; 58cabdff1aSopenharmony_cistatic uint8_t fcode_tab[MAX_MV * 2 + 1]; 59cabdff1aSopenharmony_ci 60cabdff1aSopenharmony_cistatic uint8_t uni_mpeg1_ac_vlc_len[64 * 64 * 2]; 61cabdff1aSopenharmony_cistatic uint8_t uni_mpeg2_ac_vlc_len[64 * 64 * 2]; 62cabdff1aSopenharmony_ci 63cabdff1aSopenharmony_ci/* simple include everything table for dc, first byte is bits 64cabdff1aSopenharmony_ci * number next 3 are code */ 65cabdff1aSopenharmony_cistatic uint32_t mpeg1_lum_dc_uni[512]; 66cabdff1aSopenharmony_cistatic uint32_t mpeg1_chr_dc_uni[512]; 67cabdff1aSopenharmony_ci 68cabdff1aSopenharmony_citypedef struct MPEG12EncContext { 69cabdff1aSopenharmony_ci MpegEncContext mpeg; 70cabdff1aSopenharmony_ci AVRational frame_rate_ext; 71cabdff1aSopenharmony_ci unsigned frame_rate_index; 72cabdff1aSopenharmony_ci 73cabdff1aSopenharmony_ci int gop_picture_number; ///< index of the first picture of a GOP based on fake_pic_num 74cabdff1aSopenharmony_ci 75cabdff1aSopenharmony_ci int64_t timecode_frame_start; ///< GOP timecode frame start number, in non drop frame format 76cabdff1aSopenharmony_ci AVTimecode tc; ///< timecode context 77cabdff1aSopenharmony_ci char *tc_opt_str; ///< timecode option string 78cabdff1aSopenharmony_ci int drop_frame_timecode; ///< timecode is in drop frame format. 79cabdff1aSopenharmony_ci int scan_offset; ///< reserve space for SVCD scan offset user data. 80cabdff1aSopenharmony_ci 81cabdff1aSopenharmony_ci int a53_cc; 82cabdff1aSopenharmony_ci int seq_disp_ext; 83cabdff1aSopenharmony_ci int video_format; 84cabdff1aSopenharmony_ci} MPEG12EncContext; 85cabdff1aSopenharmony_ci 86cabdff1aSopenharmony_ci#define A53_MAX_CC_COUNT 0x1f 87cabdff1aSopenharmony_ci#endif /* CONFIG_MPEG1VIDEO_ENCODER || CONFIG_MPEG2VIDEO_ENCODER */ 88cabdff1aSopenharmony_ci 89cabdff1aSopenharmony_ciav_cold void ff_mpeg1_init_uni_ac_vlc(const RLTable *rl, uint8_t *uni_ac_vlc_len) 90cabdff1aSopenharmony_ci{ 91cabdff1aSopenharmony_ci int i; 92cabdff1aSopenharmony_ci 93cabdff1aSopenharmony_ci for (i = 0; i < 128; i++) { 94cabdff1aSopenharmony_ci int level = i - 64; 95cabdff1aSopenharmony_ci int run; 96cabdff1aSopenharmony_ci if (!level) 97cabdff1aSopenharmony_ci continue; 98cabdff1aSopenharmony_ci for (run = 0; run < 64; run++) { 99cabdff1aSopenharmony_ci int len, code; 100cabdff1aSopenharmony_ci int alevel = FFABS(level); 101cabdff1aSopenharmony_ci 102cabdff1aSopenharmony_ci if (alevel > rl->max_level[0][run]) 103cabdff1aSopenharmony_ci code = 111; /* rl->n */ 104cabdff1aSopenharmony_ci else 105cabdff1aSopenharmony_ci code = rl->index_run[0][run] + alevel - 1; 106cabdff1aSopenharmony_ci 107cabdff1aSopenharmony_ci if (code < 111) { /* rl->n */ 108cabdff1aSopenharmony_ci /* length of VLC and sign */ 109cabdff1aSopenharmony_ci len = rl->table_vlc[code][1] + 1; 110cabdff1aSopenharmony_ci } else { 111cabdff1aSopenharmony_ci len = rl->table_vlc[111 /* rl->n */][1] + 6; 112cabdff1aSopenharmony_ci 113cabdff1aSopenharmony_ci if (alevel < 128) 114cabdff1aSopenharmony_ci len += 8; 115cabdff1aSopenharmony_ci else 116cabdff1aSopenharmony_ci len += 16; 117cabdff1aSopenharmony_ci } 118cabdff1aSopenharmony_ci 119cabdff1aSopenharmony_ci uni_ac_vlc_len[UNI_AC_ENC_INDEX(run, i)] = len; 120cabdff1aSopenharmony_ci } 121cabdff1aSopenharmony_ci } 122cabdff1aSopenharmony_ci} 123cabdff1aSopenharmony_ci 124cabdff1aSopenharmony_ci#if CONFIG_MPEG1VIDEO_ENCODER || CONFIG_MPEG2VIDEO_ENCODER 125cabdff1aSopenharmony_cistatic int find_frame_rate_index(MPEG12EncContext *mpeg12) 126cabdff1aSopenharmony_ci{ 127cabdff1aSopenharmony_ci MpegEncContext *const s = &mpeg12->mpeg; 128cabdff1aSopenharmony_ci int i; 129cabdff1aSopenharmony_ci AVRational bestq = (AVRational) {0, 0}; 130cabdff1aSopenharmony_ci AVRational ext; 131cabdff1aSopenharmony_ci AVRational target = av_inv_q(s->avctx->time_base); 132cabdff1aSopenharmony_ci 133cabdff1aSopenharmony_ci for (i = 1; i < 14; i++) { 134cabdff1aSopenharmony_ci if (s->avctx->strict_std_compliance > FF_COMPLIANCE_UNOFFICIAL && 135cabdff1aSopenharmony_ci i >= 9) 136cabdff1aSopenharmony_ci break; 137cabdff1aSopenharmony_ci 138cabdff1aSopenharmony_ci for (ext.num=1; ext.num <= 4; ext.num++) { 139cabdff1aSopenharmony_ci for (ext.den=1; ext.den <= 32; ext.den++) { 140cabdff1aSopenharmony_ci AVRational q = av_mul_q(ext, ff_mpeg12_frame_rate_tab[i]); 141cabdff1aSopenharmony_ci 142cabdff1aSopenharmony_ci if (s->codec_id != AV_CODEC_ID_MPEG2VIDEO && (ext.den!=1 || ext.num!=1)) 143cabdff1aSopenharmony_ci continue; 144cabdff1aSopenharmony_ci if (av_gcd(ext.den, ext.num) != 1) 145cabdff1aSopenharmony_ci continue; 146cabdff1aSopenharmony_ci 147cabdff1aSopenharmony_ci if ( bestq.num==0 148cabdff1aSopenharmony_ci || av_nearer_q(target, bestq, q) < 0 149cabdff1aSopenharmony_ci || ext.num==1 && ext.den==1 && av_nearer_q(target, bestq, q) == 0) { 150cabdff1aSopenharmony_ci bestq = q; 151cabdff1aSopenharmony_ci mpeg12->frame_rate_index = i; 152cabdff1aSopenharmony_ci mpeg12->frame_rate_ext.num = ext.num; 153cabdff1aSopenharmony_ci mpeg12->frame_rate_ext.den = ext.den; 154cabdff1aSopenharmony_ci } 155cabdff1aSopenharmony_ci } 156cabdff1aSopenharmony_ci } 157cabdff1aSopenharmony_ci } 158cabdff1aSopenharmony_ci 159cabdff1aSopenharmony_ci if (av_cmp_q(target, bestq)) 160cabdff1aSopenharmony_ci return -1; 161cabdff1aSopenharmony_ci else 162cabdff1aSopenharmony_ci return 0; 163cabdff1aSopenharmony_ci} 164cabdff1aSopenharmony_ci 165cabdff1aSopenharmony_cistatic av_cold int encode_init(AVCodecContext *avctx) 166cabdff1aSopenharmony_ci{ 167cabdff1aSopenharmony_ci MPEG12EncContext *const mpeg12 = avctx->priv_data; 168cabdff1aSopenharmony_ci MpegEncContext *const s = &mpeg12->mpeg; 169cabdff1aSopenharmony_ci int ret; 170cabdff1aSopenharmony_ci int max_size = avctx->codec_id == AV_CODEC_ID_MPEG2VIDEO ? 16383 : 4095; 171cabdff1aSopenharmony_ci 172cabdff1aSopenharmony_ci if (avctx->width > max_size || avctx->height > max_size) { 173cabdff1aSopenharmony_ci av_log(avctx, AV_LOG_ERROR, "%s does not support resolutions above %dx%d\n", 174cabdff1aSopenharmony_ci CONFIG_SMALL ? avctx->codec->name : avctx->codec->long_name, 175cabdff1aSopenharmony_ci max_size, max_size); 176cabdff1aSopenharmony_ci return AVERROR(EINVAL); 177cabdff1aSopenharmony_ci } 178cabdff1aSopenharmony_ci if ((avctx->width & 0xFFF) == 0 && (avctx->height & 0xFFF) == 1) { 179cabdff1aSopenharmony_ci av_log(avctx, AV_LOG_ERROR, "Width / Height is invalid for MPEG2\n"); 180cabdff1aSopenharmony_ci return AVERROR(EINVAL); 181cabdff1aSopenharmony_ci } 182cabdff1aSopenharmony_ci 183cabdff1aSopenharmony_ci if (avctx->strict_std_compliance > FF_COMPLIANCE_UNOFFICIAL) { 184cabdff1aSopenharmony_ci if ((avctx->width & 0xFFF) == 0 || (avctx->height & 0xFFF) == 0) { 185cabdff1aSopenharmony_ci av_log(avctx, AV_LOG_ERROR, "Width or Height are not allowed to be multiples of 4096\n" 186cabdff1aSopenharmony_ci "add '-strict %d' if you want to use them anyway.\n", FF_COMPLIANCE_UNOFFICIAL); 187cabdff1aSopenharmony_ci return AVERROR(EINVAL); 188cabdff1aSopenharmony_ci } 189cabdff1aSopenharmony_ci } 190cabdff1aSopenharmony_ci 191cabdff1aSopenharmony_ci if (avctx->profile == FF_PROFILE_UNKNOWN) { 192cabdff1aSopenharmony_ci if (avctx->level != FF_LEVEL_UNKNOWN) { 193cabdff1aSopenharmony_ci av_log(avctx, AV_LOG_ERROR, "Set profile and level\n"); 194cabdff1aSopenharmony_ci return AVERROR(EINVAL); 195cabdff1aSopenharmony_ci } 196cabdff1aSopenharmony_ci /* Main or 4:2:2 */ 197cabdff1aSopenharmony_ci avctx->profile = avctx->pix_fmt == AV_PIX_FMT_YUV420P ? FF_PROFILE_MPEG2_MAIN 198cabdff1aSopenharmony_ci : FF_PROFILE_MPEG2_422; 199cabdff1aSopenharmony_ci } 200cabdff1aSopenharmony_ci if (avctx->level == FF_LEVEL_UNKNOWN) { 201cabdff1aSopenharmony_ci if (avctx->profile == FF_PROFILE_MPEG2_422) { /* 4:2:2 */ 202cabdff1aSopenharmony_ci if (avctx->width <= 720 && avctx->height <= 608) 203cabdff1aSopenharmony_ci avctx->level = 5; /* Main */ 204cabdff1aSopenharmony_ci else 205cabdff1aSopenharmony_ci avctx->level = 2; /* High */ 206cabdff1aSopenharmony_ci } else { 207cabdff1aSopenharmony_ci if (avctx->profile != FF_PROFILE_MPEG2_HIGH && 208cabdff1aSopenharmony_ci avctx->pix_fmt != AV_PIX_FMT_YUV420P) { 209cabdff1aSopenharmony_ci av_log(avctx, AV_LOG_ERROR, 210cabdff1aSopenharmony_ci "Only High(1) and 4:2:2(0) profiles support 4:2:2 color sampling\n"); 211cabdff1aSopenharmony_ci return AVERROR(EINVAL); 212cabdff1aSopenharmony_ci } 213cabdff1aSopenharmony_ci if (avctx->width <= 720 && avctx->height <= 576) 214cabdff1aSopenharmony_ci avctx->level = 8; /* Main */ 215cabdff1aSopenharmony_ci else if (avctx->width <= 1440) 216cabdff1aSopenharmony_ci avctx->level = 6; /* High 1440 */ 217cabdff1aSopenharmony_ci else 218cabdff1aSopenharmony_ci avctx->level = 4; /* High */ 219cabdff1aSopenharmony_ci } 220cabdff1aSopenharmony_ci } 221cabdff1aSopenharmony_ci 222cabdff1aSopenharmony_ci if ((ret = ff_mpv_encode_init(avctx)) < 0) 223cabdff1aSopenharmony_ci return ret; 224cabdff1aSopenharmony_ci 225cabdff1aSopenharmony_ci if (find_frame_rate_index(mpeg12) < 0) { 226cabdff1aSopenharmony_ci if (avctx->strict_std_compliance > FF_COMPLIANCE_EXPERIMENTAL) { 227cabdff1aSopenharmony_ci av_log(avctx, AV_LOG_ERROR, "MPEG-1/2 does not support %d/%d fps\n", 228cabdff1aSopenharmony_ci avctx->time_base.den, avctx->time_base.num); 229cabdff1aSopenharmony_ci return AVERROR(EINVAL); 230cabdff1aSopenharmony_ci } else { 231cabdff1aSopenharmony_ci av_log(avctx, AV_LOG_INFO, 232cabdff1aSopenharmony_ci "MPEG-1/2 does not support %d/%d fps, there may be AV sync issues\n", 233cabdff1aSopenharmony_ci avctx->time_base.den, avctx->time_base.num); 234cabdff1aSopenharmony_ci } 235cabdff1aSopenharmony_ci } 236cabdff1aSopenharmony_ci 237cabdff1aSopenharmony_ci mpeg12->drop_frame_timecode = mpeg12->drop_frame_timecode || !!(avctx->flags2 & AV_CODEC_FLAG2_DROP_FRAME_TIMECODE); 238cabdff1aSopenharmony_ci if (mpeg12->drop_frame_timecode) 239cabdff1aSopenharmony_ci mpeg12->tc.flags |= AV_TIMECODE_FLAG_DROPFRAME; 240cabdff1aSopenharmony_ci if (mpeg12->drop_frame_timecode && mpeg12->frame_rate_index != 4) { 241cabdff1aSopenharmony_ci av_log(avctx, AV_LOG_ERROR, 242cabdff1aSopenharmony_ci "Drop frame time code only allowed with 1001/30000 fps\n"); 243cabdff1aSopenharmony_ci return AVERROR(EINVAL); 244cabdff1aSopenharmony_ci } 245cabdff1aSopenharmony_ci 246cabdff1aSopenharmony_ci if (mpeg12->tc_opt_str) { 247cabdff1aSopenharmony_ci AVRational rate = ff_mpeg12_frame_rate_tab[mpeg12->frame_rate_index]; 248cabdff1aSopenharmony_ci int ret = av_timecode_init_from_string(&mpeg12->tc, rate, mpeg12->tc_opt_str, s); 249cabdff1aSopenharmony_ci if (ret < 0) 250cabdff1aSopenharmony_ci return ret; 251cabdff1aSopenharmony_ci mpeg12->drop_frame_timecode = !!(mpeg12->tc.flags & AV_TIMECODE_FLAG_DROPFRAME); 252cabdff1aSopenharmony_ci mpeg12->timecode_frame_start = mpeg12->tc.start; 253cabdff1aSopenharmony_ci } else { 254cabdff1aSopenharmony_ci mpeg12->timecode_frame_start = 0; // default is -1 255cabdff1aSopenharmony_ci } 256cabdff1aSopenharmony_ci 257cabdff1aSopenharmony_ci return 0; 258cabdff1aSopenharmony_ci} 259cabdff1aSopenharmony_ci 260cabdff1aSopenharmony_cistatic void put_header(MpegEncContext *s, int header) 261cabdff1aSopenharmony_ci{ 262cabdff1aSopenharmony_ci align_put_bits(&s->pb); 263cabdff1aSopenharmony_ci put_bits(&s->pb, 16, header >> 16); 264cabdff1aSopenharmony_ci put_sbits(&s->pb, 16, header); 265cabdff1aSopenharmony_ci} 266cabdff1aSopenharmony_ci 267cabdff1aSopenharmony_ci/* put sequence header if needed */ 268cabdff1aSopenharmony_cistatic void mpeg1_encode_sequence_header(MpegEncContext *s) 269cabdff1aSopenharmony_ci{ 270cabdff1aSopenharmony_ci MPEG12EncContext *const mpeg12 = (MPEG12EncContext*)s; 271cabdff1aSopenharmony_ci unsigned int vbv_buffer_size, fps, v; 272cabdff1aSopenharmony_ci int constraint_parameter_flag; 273cabdff1aSopenharmony_ci AVRational framerate = ff_mpeg12_frame_rate_tab[mpeg12->frame_rate_index]; 274cabdff1aSopenharmony_ci uint64_t time_code; 275cabdff1aSopenharmony_ci int64_t best_aspect_error = INT64_MAX; 276cabdff1aSopenharmony_ci AVRational aspect_ratio = s->avctx->sample_aspect_ratio; 277cabdff1aSopenharmony_ci int aspect_ratio_info; 278cabdff1aSopenharmony_ci 279cabdff1aSopenharmony_ci if (!s->current_picture.f->key_frame) 280cabdff1aSopenharmony_ci return; 281cabdff1aSopenharmony_ci 282cabdff1aSopenharmony_ci if (aspect_ratio.num == 0 || aspect_ratio.den == 0) 283cabdff1aSopenharmony_ci aspect_ratio = (AVRational){1,1}; // pixel aspect 1.1 (VGA) 284cabdff1aSopenharmony_ci 285cabdff1aSopenharmony_ci /* MPEG-1 header repeated every GOP */ 286cabdff1aSopenharmony_ci put_header(s, SEQ_START_CODE); 287cabdff1aSopenharmony_ci 288cabdff1aSopenharmony_ci put_sbits(&s->pb, 12, s->width & 0xFFF); 289cabdff1aSopenharmony_ci put_sbits(&s->pb, 12, s->height & 0xFFF); 290cabdff1aSopenharmony_ci 291cabdff1aSopenharmony_ci for (int i = 1; i < 15; i++) { 292cabdff1aSopenharmony_ci int64_t error = aspect_ratio.num * (1LL<<32) / aspect_ratio.den; 293cabdff1aSopenharmony_ci if (s->codec_id == AV_CODEC_ID_MPEG1VIDEO || i <= 1) 294cabdff1aSopenharmony_ci error -= (1LL<<32) / ff_mpeg1_aspect[i]; 295cabdff1aSopenharmony_ci else 296cabdff1aSopenharmony_ci error -= (1LL<<32)*ff_mpeg2_aspect[i].num * s->height / s->width / ff_mpeg2_aspect[i].den; 297cabdff1aSopenharmony_ci 298cabdff1aSopenharmony_ci error = FFABS(error); 299cabdff1aSopenharmony_ci 300cabdff1aSopenharmony_ci if (error - 2 <= best_aspect_error) { 301cabdff1aSopenharmony_ci best_aspect_error = error; 302cabdff1aSopenharmony_ci aspect_ratio_info = i; 303cabdff1aSopenharmony_ci } 304cabdff1aSopenharmony_ci } 305cabdff1aSopenharmony_ci 306cabdff1aSopenharmony_ci put_bits(&s->pb, 4, aspect_ratio_info); 307cabdff1aSopenharmony_ci put_bits(&s->pb, 4, mpeg12->frame_rate_index); 308cabdff1aSopenharmony_ci 309cabdff1aSopenharmony_ci if (s->avctx->rc_max_rate) { 310cabdff1aSopenharmony_ci v = (s->avctx->rc_max_rate + 399) / 400; 311cabdff1aSopenharmony_ci if (v > 0x3ffff && s->codec_id == AV_CODEC_ID_MPEG1VIDEO) 312cabdff1aSopenharmony_ci v = 0x3ffff; 313cabdff1aSopenharmony_ci } else { 314cabdff1aSopenharmony_ci v = 0x3FFFF; 315cabdff1aSopenharmony_ci } 316cabdff1aSopenharmony_ci 317cabdff1aSopenharmony_ci if (s->avctx->rc_buffer_size) 318cabdff1aSopenharmony_ci vbv_buffer_size = s->avctx->rc_buffer_size; 319cabdff1aSopenharmony_ci else 320cabdff1aSopenharmony_ci /* VBV calculation: Scaled so that a VCD has the proper 321cabdff1aSopenharmony_ci * VBV size of 40 kilobytes */ 322cabdff1aSopenharmony_ci vbv_buffer_size = ((20 * s->bit_rate) / (1151929 / 2)) * 8 * 1024; 323cabdff1aSopenharmony_ci vbv_buffer_size = (vbv_buffer_size + 16383) / 16384; 324cabdff1aSopenharmony_ci 325cabdff1aSopenharmony_ci put_sbits(&s->pb, 18, v); 326cabdff1aSopenharmony_ci put_bits(&s->pb, 1, 1); // marker 327cabdff1aSopenharmony_ci put_sbits(&s->pb, 10, vbv_buffer_size); 328cabdff1aSopenharmony_ci 329cabdff1aSopenharmony_ci constraint_parameter_flag = 330cabdff1aSopenharmony_ci s->width <= 768 && 331cabdff1aSopenharmony_ci s->height <= 576 && 332cabdff1aSopenharmony_ci s->mb_width * s->mb_height <= 396 && 333cabdff1aSopenharmony_ci s->mb_width * s->mb_height * framerate.num <= 396 * 25 * framerate.den && 334cabdff1aSopenharmony_ci framerate.num <= framerate.den * 30 && 335cabdff1aSopenharmony_ci s->avctx->me_range && 336cabdff1aSopenharmony_ci s->avctx->me_range < 128 && 337cabdff1aSopenharmony_ci vbv_buffer_size <= 20 && 338cabdff1aSopenharmony_ci v <= 1856000 / 400 && 339cabdff1aSopenharmony_ci s->codec_id == AV_CODEC_ID_MPEG1VIDEO; 340cabdff1aSopenharmony_ci 341cabdff1aSopenharmony_ci put_bits(&s->pb, 1, constraint_parameter_flag); 342cabdff1aSopenharmony_ci 343cabdff1aSopenharmony_ci ff_write_quant_matrix(&s->pb, s->avctx->intra_matrix); 344cabdff1aSopenharmony_ci ff_write_quant_matrix(&s->pb, s->avctx->inter_matrix); 345cabdff1aSopenharmony_ci 346cabdff1aSopenharmony_ci if (s->codec_id == AV_CODEC_ID_MPEG2VIDEO) { 347cabdff1aSopenharmony_ci const AVFrameSideData *side_data; 348cabdff1aSopenharmony_ci int width = s->width; 349cabdff1aSopenharmony_ci int height = s->height; 350cabdff1aSopenharmony_ci int use_seq_disp_ext; 351cabdff1aSopenharmony_ci 352cabdff1aSopenharmony_ci put_header(s, EXT_START_CODE); 353cabdff1aSopenharmony_ci put_bits(&s->pb, 4, 1); // seq ext 354cabdff1aSopenharmony_ci 355cabdff1aSopenharmony_ci put_bits(&s->pb, 1, s->avctx->profile == FF_PROFILE_MPEG2_422); // escx 1 for 4:2:2 profile 356cabdff1aSopenharmony_ci 357cabdff1aSopenharmony_ci put_bits(&s->pb, 3, s->avctx->profile); // profile 358cabdff1aSopenharmony_ci put_bits(&s->pb, 4, s->avctx->level); // level 359cabdff1aSopenharmony_ci 360cabdff1aSopenharmony_ci put_bits(&s->pb, 1, s->progressive_sequence); 361cabdff1aSopenharmony_ci put_bits(&s->pb, 2, s->chroma_format); 362cabdff1aSopenharmony_ci put_bits(&s->pb, 2, s->width >> 12); 363cabdff1aSopenharmony_ci put_bits(&s->pb, 2, s->height >> 12); 364cabdff1aSopenharmony_ci put_bits(&s->pb, 12, v >> 18); // bitrate ext 365cabdff1aSopenharmony_ci put_bits(&s->pb, 1, 1); // marker 366cabdff1aSopenharmony_ci put_bits(&s->pb, 8, vbv_buffer_size >> 10); // vbv buffer ext 367cabdff1aSopenharmony_ci put_bits(&s->pb, 1, s->low_delay); 368cabdff1aSopenharmony_ci put_bits(&s->pb, 2, mpeg12->frame_rate_ext.num-1); // frame_rate_ext_n 369cabdff1aSopenharmony_ci put_bits(&s->pb, 5, mpeg12->frame_rate_ext.den-1); // frame_rate_ext_d 370cabdff1aSopenharmony_ci 371cabdff1aSopenharmony_ci side_data = av_frame_get_side_data(s->current_picture_ptr->f, AV_FRAME_DATA_PANSCAN); 372cabdff1aSopenharmony_ci if (side_data) { 373cabdff1aSopenharmony_ci const AVPanScan *pan_scan = (AVPanScan *)side_data->data; 374cabdff1aSopenharmony_ci if (pan_scan->width && pan_scan->height) { 375cabdff1aSopenharmony_ci width = pan_scan->width >> 4; 376cabdff1aSopenharmony_ci height = pan_scan->height >> 4; 377cabdff1aSopenharmony_ci } 378cabdff1aSopenharmony_ci } 379cabdff1aSopenharmony_ci 380cabdff1aSopenharmony_ci use_seq_disp_ext = (width != s->width || 381cabdff1aSopenharmony_ci height != s->height || 382cabdff1aSopenharmony_ci s->avctx->color_primaries != AVCOL_PRI_UNSPECIFIED || 383cabdff1aSopenharmony_ci s->avctx->color_trc != AVCOL_TRC_UNSPECIFIED || 384cabdff1aSopenharmony_ci s->avctx->colorspace != AVCOL_SPC_UNSPECIFIED || 385cabdff1aSopenharmony_ci mpeg12->video_format != VIDEO_FORMAT_UNSPECIFIED); 386cabdff1aSopenharmony_ci 387cabdff1aSopenharmony_ci if (mpeg12->seq_disp_ext == 1 || 388cabdff1aSopenharmony_ci (mpeg12->seq_disp_ext == -1 && use_seq_disp_ext)) { 389cabdff1aSopenharmony_ci put_header(s, EXT_START_CODE); 390cabdff1aSopenharmony_ci put_bits(&s->pb, 4, 2); // sequence display extension 391cabdff1aSopenharmony_ci put_bits(&s->pb, 3, mpeg12->video_format); // video_format 392cabdff1aSopenharmony_ci put_bits(&s->pb, 1, 1); // colour_description 393cabdff1aSopenharmony_ci put_bits(&s->pb, 8, s->avctx->color_primaries); // colour_primaries 394cabdff1aSopenharmony_ci put_bits(&s->pb, 8, s->avctx->color_trc); // transfer_characteristics 395cabdff1aSopenharmony_ci put_bits(&s->pb, 8, s->avctx->colorspace); // matrix_coefficients 396cabdff1aSopenharmony_ci put_bits(&s->pb, 14, width); // display_horizontal_size 397cabdff1aSopenharmony_ci put_bits(&s->pb, 1, 1); // marker_bit 398cabdff1aSopenharmony_ci put_bits(&s->pb, 14, height); // display_vertical_size 399cabdff1aSopenharmony_ci put_bits(&s->pb, 3, 0); // remaining 3 bits are zero padding 400cabdff1aSopenharmony_ci } 401cabdff1aSopenharmony_ci } 402cabdff1aSopenharmony_ci 403cabdff1aSopenharmony_ci put_header(s, GOP_START_CODE); 404cabdff1aSopenharmony_ci put_bits(&s->pb, 1, mpeg12->drop_frame_timecode); // drop frame flag 405cabdff1aSopenharmony_ci /* time code: we must convert from the real frame rate to a 406cabdff1aSopenharmony_ci * fake MPEG frame rate in case of low frame rate */ 407cabdff1aSopenharmony_ci fps = (framerate.num + framerate.den / 2) / framerate.den; 408cabdff1aSopenharmony_ci time_code = s->current_picture_ptr->f->coded_picture_number + 409cabdff1aSopenharmony_ci mpeg12->timecode_frame_start; 410cabdff1aSopenharmony_ci 411cabdff1aSopenharmony_ci mpeg12->gop_picture_number = s->current_picture_ptr->f->coded_picture_number; 412cabdff1aSopenharmony_ci 413cabdff1aSopenharmony_ci av_assert0(mpeg12->drop_frame_timecode == !!(mpeg12->tc.flags & AV_TIMECODE_FLAG_DROPFRAME)); 414cabdff1aSopenharmony_ci if (mpeg12->drop_frame_timecode) 415cabdff1aSopenharmony_ci time_code = av_timecode_adjust_ntsc_framenum2(time_code, fps); 416cabdff1aSopenharmony_ci 417cabdff1aSopenharmony_ci put_bits(&s->pb, 5, (uint32_t)((time_code / (fps * 3600)) % 24)); 418cabdff1aSopenharmony_ci put_bits(&s->pb, 6, (uint32_t)((time_code / (fps * 60)) % 60)); 419cabdff1aSopenharmony_ci put_bits(&s->pb, 1, 1); 420cabdff1aSopenharmony_ci put_bits(&s->pb, 6, (uint32_t)((time_code / fps) % 60)); 421cabdff1aSopenharmony_ci put_bits(&s->pb, 6, (uint32_t)((time_code % fps))); 422cabdff1aSopenharmony_ci put_bits(&s->pb, 1, !!(s->avctx->flags & AV_CODEC_FLAG_CLOSED_GOP) || 423cabdff1aSopenharmony_ci s->intra_only || !mpeg12->gop_picture_number); 424cabdff1aSopenharmony_ci put_bits(&s->pb, 1, 0); // broken link 425cabdff1aSopenharmony_ci} 426cabdff1aSopenharmony_ci 427cabdff1aSopenharmony_cistatic inline void encode_mb_skip_run(MpegEncContext *s, int run) 428cabdff1aSopenharmony_ci{ 429cabdff1aSopenharmony_ci while (run >= 33) { 430cabdff1aSopenharmony_ci put_bits(&s->pb, 11, 0x008); 431cabdff1aSopenharmony_ci run -= 33; 432cabdff1aSopenharmony_ci } 433cabdff1aSopenharmony_ci put_bits(&s->pb, ff_mpeg12_mbAddrIncrTable[run][1], 434cabdff1aSopenharmony_ci ff_mpeg12_mbAddrIncrTable[run][0]); 435cabdff1aSopenharmony_ci} 436cabdff1aSopenharmony_ci 437cabdff1aSopenharmony_cistatic av_always_inline void put_qscale(MpegEncContext *s) 438cabdff1aSopenharmony_ci{ 439cabdff1aSopenharmony_ci put_bits(&s->pb, 5, s->qscale); 440cabdff1aSopenharmony_ci} 441cabdff1aSopenharmony_ci 442cabdff1aSopenharmony_civoid ff_mpeg1_encode_slice_header(MpegEncContext *s) 443cabdff1aSopenharmony_ci{ 444cabdff1aSopenharmony_ci if (s->codec_id == AV_CODEC_ID_MPEG2VIDEO && s->height > 2800) { 445cabdff1aSopenharmony_ci put_header(s, SLICE_MIN_START_CODE + (s->mb_y & 127)); 446cabdff1aSopenharmony_ci /* slice_vertical_position_extension */ 447cabdff1aSopenharmony_ci put_bits(&s->pb, 3, s->mb_y >> 7); 448cabdff1aSopenharmony_ci } else { 449cabdff1aSopenharmony_ci put_header(s, SLICE_MIN_START_CODE + s->mb_y); 450cabdff1aSopenharmony_ci } 451cabdff1aSopenharmony_ci put_qscale(s); 452cabdff1aSopenharmony_ci /* slice extra information */ 453cabdff1aSopenharmony_ci put_bits(&s->pb, 1, 0); 454cabdff1aSopenharmony_ci} 455cabdff1aSopenharmony_ci 456cabdff1aSopenharmony_civoid ff_mpeg1_encode_picture_header(MpegEncContext *s, int picture_number) 457cabdff1aSopenharmony_ci{ 458cabdff1aSopenharmony_ci MPEG12EncContext *const mpeg12 = (MPEG12EncContext*)s; 459cabdff1aSopenharmony_ci AVFrameSideData *side_data; 460cabdff1aSopenharmony_ci mpeg1_encode_sequence_header(s); 461cabdff1aSopenharmony_ci 462cabdff1aSopenharmony_ci /* MPEG-1 picture header */ 463cabdff1aSopenharmony_ci put_header(s, PICTURE_START_CODE); 464cabdff1aSopenharmony_ci /* temporal reference */ 465cabdff1aSopenharmony_ci 466cabdff1aSopenharmony_ci // RAL: s->picture_number instead of s->fake_picture_number 467cabdff1aSopenharmony_ci put_bits(&s->pb, 10, 468cabdff1aSopenharmony_ci (s->picture_number - mpeg12->gop_picture_number) & 0x3ff); 469cabdff1aSopenharmony_ci put_bits(&s->pb, 3, s->pict_type); 470cabdff1aSopenharmony_ci 471cabdff1aSopenharmony_ci s->vbv_delay_pos = put_bytes_count(&s->pb, 0); 472cabdff1aSopenharmony_ci put_bits(&s->pb, 16, 0xFFFF); /* vbv_delay */ 473cabdff1aSopenharmony_ci 474cabdff1aSopenharmony_ci // RAL: Forward f_code also needed for B-frames 475cabdff1aSopenharmony_ci if (s->pict_type == AV_PICTURE_TYPE_P || 476cabdff1aSopenharmony_ci s->pict_type == AV_PICTURE_TYPE_B) { 477cabdff1aSopenharmony_ci put_bits(&s->pb, 1, 0); /* half pel coordinates */ 478cabdff1aSopenharmony_ci if (s->codec_id == AV_CODEC_ID_MPEG1VIDEO) 479cabdff1aSopenharmony_ci put_bits(&s->pb, 3, s->f_code); /* forward_f_code */ 480cabdff1aSopenharmony_ci else 481cabdff1aSopenharmony_ci put_bits(&s->pb, 3, 7); /* forward_f_code */ 482cabdff1aSopenharmony_ci } 483cabdff1aSopenharmony_ci 484cabdff1aSopenharmony_ci // RAL: Backward f_code necessary for B-frames 485cabdff1aSopenharmony_ci if (s->pict_type == AV_PICTURE_TYPE_B) { 486cabdff1aSopenharmony_ci put_bits(&s->pb, 1, 0); /* half pel coordinates */ 487cabdff1aSopenharmony_ci if (s->codec_id == AV_CODEC_ID_MPEG1VIDEO) 488cabdff1aSopenharmony_ci put_bits(&s->pb, 3, s->b_code); /* backward_f_code */ 489cabdff1aSopenharmony_ci else 490cabdff1aSopenharmony_ci put_bits(&s->pb, 3, 7); /* backward_f_code */ 491cabdff1aSopenharmony_ci } 492cabdff1aSopenharmony_ci 493cabdff1aSopenharmony_ci put_bits(&s->pb, 1, 0); /* extra bit picture */ 494cabdff1aSopenharmony_ci 495cabdff1aSopenharmony_ci s->frame_pred_frame_dct = 1; 496cabdff1aSopenharmony_ci if (s->codec_id == AV_CODEC_ID_MPEG2VIDEO) { 497cabdff1aSopenharmony_ci put_header(s, EXT_START_CODE); 498cabdff1aSopenharmony_ci put_bits(&s->pb, 4, 8); /* pic ext */ 499cabdff1aSopenharmony_ci if (s->pict_type == AV_PICTURE_TYPE_P || 500cabdff1aSopenharmony_ci s->pict_type == AV_PICTURE_TYPE_B) { 501cabdff1aSopenharmony_ci put_bits(&s->pb, 4, s->f_code); 502cabdff1aSopenharmony_ci put_bits(&s->pb, 4, s->f_code); 503cabdff1aSopenharmony_ci } else { 504cabdff1aSopenharmony_ci put_bits(&s->pb, 8, 255); 505cabdff1aSopenharmony_ci } 506cabdff1aSopenharmony_ci if (s->pict_type == AV_PICTURE_TYPE_B) { 507cabdff1aSopenharmony_ci put_bits(&s->pb, 4, s->b_code); 508cabdff1aSopenharmony_ci put_bits(&s->pb, 4, s->b_code); 509cabdff1aSopenharmony_ci } else { 510cabdff1aSopenharmony_ci put_bits(&s->pb, 8, 255); 511cabdff1aSopenharmony_ci } 512cabdff1aSopenharmony_ci put_bits(&s->pb, 2, s->intra_dc_precision); 513cabdff1aSopenharmony_ci 514cabdff1aSopenharmony_ci av_assert0(s->picture_structure == PICT_FRAME); 515cabdff1aSopenharmony_ci put_bits(&s->pb, 2, s->picture_structure); 516cabdff1aSopenharmony_ci if (s->progressive_sequence) 517cabdff1aSopenharmony_ci put_bits(&s->pb, 1, 0); /* no repeat */ 518cabdff1aSopenharmony_ci else 519cabdff1aSopenharmony_ci put_bits(&s->pb, 1, s->current_picture_ptr->f->top_field_first); 520cabdff1aSopenharmony_ci /* XXX: optimize the generation of this flag with entropy measures */ 521cabdff1aSopenharmony_ci s->frame_pred_frame_dct = s->progressive_sequence; 522cabdff1aSopenharmony_ci 523cabdff1aSopenharmony_ci put_bits(&s->pb, 1, s->frame_pred_frame_dct); 524cabdff1aSopenharmony_ci put_bits(&s->pb, 1, s->concealment_motion_vectors); 525cabdff1aSopenharmony_ci put_bits(&s->pb, 1, s->q_scale_type); 526cabdff1aSopenharmony_ci put_bits(&s->pb, 1, s->intra_vlc_format); 527cabdff1aSopenharmony_ci put_bits(&s->pb, 1, s->alternate_scan); 528cabdff1aSopenharmony_ci put_bits(&s->pb, 1, s->repeat_first_field); 529cabdff1aSopenharmony_ci s->progressive_frame = s->progressive_sequence; 530cabdff1aSopenharmony_ci /* chroma_420_type */ 531cabdff1aSopenharmony_ci put_bits(&s->pb, 1, s->chroma_format == 532cabdff1aSopenharmony_ci CHROMA_420 ? s->progressive_frame : 0); 533cabdff1aSopenharmony_ci put_bits(&s->pb, 1, s->progressive_frame); 534cabdff1aSopenharmony_ci put_bits(&s->pb, 1, 0); /* composite_display_flag */ 535cabdff1aSopenharmony_ci } 536cabdff1aSopenharmony_ci if (mpeg12->scan_offset) { 537cabdff1aSopenharmony_ci int i; 538cabdff1aSopenharmony_ci 539cabdff1aSopenharmony_ci put_header(s, USER_START_CODE); 540cabdff1aSopenharmony_ci for (i = 0; i < sizeof(svcd_scan_offset_placeholder); i++) 541cabdff1aSopenharmony_ci put_bits(&s->pb, 8, svcd_scan_offset_placeholder[i]); 542cabdff1aSopenharmony_ci } 543cabdff1aSopenharmony_ci side_data = av_frame_get_side_data(s->current_picture_ptr->f, 544cabdff1aSopenharmony_ci AV_FRAME_DATA_STEREO3D); 545cabdff1aSopenharmony_ci if (side_data) { 546cabdff1aSopenharmony_ci AVStereo3D *stereo = (AVStereo3D *)side_data->data; 547cabdff1aSopenharmony_ci uint8_t fpa_type; 548cabdff1aSopenharmony_ci 549cabdff1aSopenharmony_ci switch (stereo->type) { 550cabdff1aSopenharmony_ci case AV_STEREO3D_SIDEBYSIDE: 551cabdff1aSopenharmony_ci fpa_type = 0x03; 552cabdff1aSopenharmony_ci break; 553cabdff1aSopenharmony_ci case AV_STEREO3D_TOPBOTTOM: 554cabdff1aSopenharmony_ci fpa_type = 0x04; 555cabdff1aSopenharmony_ci break; 556cabdff1aSopenharmony_ci case AV_STEREO3D_2D: 557cabdff1aSopenharmony_ci fpa_type = 0x08; 558cabdff1aSopenharmony_ci break; 559cabdff1aSopenharmony_ci case AV_STEREO3D_SIDEBYSIDE_QUINCUNX: 560cabdff1aSopenharmony_ci fpa_type = 0x23; 561cabdff1aSopenharmony_ci break; 562cabdff1aSopenharmony_ci default: 563cabdff1aSopenharmony_ci fpa_type = 0; 564cabdff1aSopenharmony_ci break; 565cabdff1aSopenharmony_ci } 566cabdff1aSopenharmony_ci 567cabdff1aSopenharmony_ci if (fpa_type != 0) { 568cabdff1aSopenharmony_ci put_header(s, USER_START_CODE); 569cabdff1aSopenharmony_ci put_bits(&s->pb, 8, 'J'); // S3D_video_format_signaling_identifier 570cabdff1aSopenharmony_ci put_bits(&s->pb, 8, 'P'); 571cabdff1aSopenharmony_ci put_bits(&s->pb, 8, '3'); 572cabdff1aSopenharmony_ci put_bits(&s->pb, 8, 'D'); 573cabdff1aSopenharmony_ci put_bits(&s->pb, 8, 0x03); // S3D_video_format_length 574cabdff1aSopenharmony_ci 575cabdff1aSopenharmony_ci put_bits(&s->pb, 1, 1); // reserved_bit 576cabdff1aSopenharmony_ci put_bits(&s->pb, 7, fpa_type); // S3D_video_format_type 577cabdff1aSopenharmony_ci put_bits(&s->pb, 8, 0x04); // reserved_data[0] 578cabdff1aSopenharmony_ci put_bits(&s->pb, 8, 0xFF); // reserved_data[1] 579cabdff1aSopenharmony_ci } 580cabdff1aSopenharmony_ci } 581cabdff1aSopenharmony_ci 582cabdff1aSopenharmony_ci if (CONFIG_MPEG2VIDEO_ENCODER && mpeg12->a53_cc) { 583cabdff1aSopenharmony_ci side_data = av_frame_get_side_data(s->current_picture_ptr->f, 584cabdff1aSopenharmony_ci AV_FRAME_DATA_A53_CC); 585cabdff1aSopenharmony_ci if (side_data) { 586cabdff1aSopenharmony_ci if (side_data->size <= A53_MAX_CC_COUNT * 3 && side_data->size % 3 == 0) { 587cabdff1aSopenharmony_ci int i = 0; 588cabdff1aSopenharmony_ci 589cabdff1aSopenharmony_ci put_header (s, USER_START_CODE); 590cabdff1aSopenharmony_ci 591cabdff1aSopenharmony_ci put_bits(&s->pb, 8, 'G'); // user_identifier 592cabdff1aSopenharmony_ci put_bits(&s->pb, 8, 'A'); 593cabdff1aSopenharmony_ci put_bits(&s->pb, 8, '9'); 594cabdff1aSopenharmony_ci put_bits(&s->pb, 8, '4'); 595cabdff1aSopenharmony_ci put_bits(&s->pb, 8, 3); // user_data_type_code 596cabdff1aSopenharmony_ci put_bits(&s->pb, 8, 597cabdff1aSopenharmony_ci (side_data->size / 3 & A53_MAX_CC_COUNT) | 0x40); // flags, cc_count 598cabdff1aSopenharmony_ci put_bits(&s->pb, 8, 0xff); // em_data 599cabdff1aSopenharmony_ci 600cabdff1aSopenharmony_ci for (i = 0; i < side_data->size; i++) 601cabdff1aSopenharmony_ci put_bits(&s->pb, 8, side_data->data[i]); 602cabdff1aSopenharmony_ci 603cabdff1aSopenharmony_ci put_bits(&s->pb, 8, 0xff); // marker_bits 604cabdff1aSopenharmony_ci } else { 605cabdff1aSopenharmony_ci av_log(s->avctx, AV_LOG_WARNING, 606cabdff1aSopenharmony_ci "Closed Caption size (%"SIZE_SPECIFIER") can not exceed " 607cabdff1aSopenharmony_ci "93 bytes and must be a multiple of 3\n", side_data->size); 608cabdff1aSopenharmony_ci } 609cabdff1aSopenharmony_ci } 610cabdff1aSopenharmony_ci } 611cabdff1aSopenharmony_ci 612cabdff1aSopenharmony_ci s->mb_y = 0; 613cabdff1aSopenharmony_ci ff_mpeg1_encode_slice_header(s); 614cabdff1aSopenharmony_ci} 615cabdff1aSopenharmony_ci 616cabdff1aSopenharmony_cistatic inline void put_mb_modes(MpegEncContext *s, int n, int bits, 617cabdff1aSopenharmony_ci int has_mv, int field_motion) 618cabdff1aSopenharmony_ci{ 619cabdff1aSopenharmony_ci put_bits(&s->pb, n, bits); 620cabdff1aSopenharmony_ci if (!s->frame_pred_frame_dct) { 621cabdff1aSopenharmony_ci if (has_mv) 622cabdff1aSopenharmony_ci /* motion_type: frame/field */ 623cabdff1aSopenharmony_ci put_bits(&s->pb, 2, 2 - field_motion); 624cabdff1aSopenharmony_ci put_bits(&s->pb, 1, s->interlaced_dct); 625cabdff1aSopenharmony_ci } 626cabdff1aSopenharmony_ci} 627cabdff1aSopenharmony_ci 628cabdff1aSopenharmony_ci// RAL: Parameter added: f_or_b_code 629cabdff1aSopenharmony_cistatic void mpeg1_encode_motion(MpegEncContext *s, int val, int f_or_b_code) 630cabdff1aSopenharmony_ci{ 631cabdff1aSopenharmony_ci if (val == 0) { 632cabdff1aSopenharmony_ci /* zero vector, corresponds to ff_mpeg12_mbMotionVectorTable[0] */ 633cabdff1aSopenharmony_ci put_bits(&s->pb, 1, 0x01); 634cabdff1aSopenharmony_ci } else { 635cabdff1aSopenharmony_ci int code, sign, bits; 636cabdff1aSopenharmony_ci int bit_size = f_or_b_code - 1; 637cabdff1aSopenharmony_ci int range = 1 << bit_size; 638cabdff1aSopenharmony_ci /* modulo encoding */ 639cabdff1aSopenharmony_ci val = sign_extend(val, 5 + bit_size); 640cabdff1aSopenharmony_ci 641cabdff1aSopenharmony_ci if (val >= 0) { 642cabdff1aSopenharmony_ci val--; 643cabdff1aSopenharmony_ci code = (val >> bit_size) + 1; 644cabdff1aSopenharmony_ci bits = val & (range - 1); 645cabdff1aSopenharmony_ci sign = 0; 646cabdff1aSopenharmony_ci } else { 647cabdff1aSopenharmony_ci val = -val; 648cabdff1aSopenharmony_ci val--; 649cabdff1aSopenharmony_ci code = (val >> bit_size) + 1; 650cabdff1aSopenharmony_ci bits = val & (range - 1); 651cabdff1aSopenharmony_ci sign = 1; 652cabdff1aSopenharmony_ci } 653cabdff1aSopenharmony_ci 654cabdff1aSopenharmony_ci av_assert2(code > 0 && code <= 16); 655cabdff1aSopenharmony_ci 656cabdff1aSopenharmony_ci put_bits(&s->pb, 657cabdff1aSopenharmony_ci ff_mpeg12_mbMotionVectorTable[code][1], 658cabdff1aSopenharmony_ci ff_mpeg12_mbMotionVectorTable[code][0]); 659cabdff1aSopenharmony_ci 660cabdff1aSopenharmony_ci put_bits(&s->pb, 1, sign); 661cabdff1aSopenharmony_ci if (bit_size > 0) 662cabdff1aSopenharmony_ci put_bits(&s->pb, bit_size, bits); 663cabdff1aSopenharmony_ci } 664cabdff1aSopenharmony_ci} 665cabdff1aSopenharmony_ci 666cabdff1aSopenharmony_cistatic inline void encode_dc(MpegEncContext *s, int diff, int component) 667cabdff1aSopenharmony_ci{ 668cabdff1aSopenharmony_ci unsigned int diff_u = diff + 255; 669cabdff1aSopenharmony_ci if (diff_u >= 511) { 670cabdff1aSopenharmony_ci int index; 671cabdff1aSopenharmony_ci 672cabdff1aSopenharmony_ci if (diff < 0) { 673cabdff1aSopenharmony_ci index = av_log2_16bit(-2 * diff); 674cabdff1aSopenharmony_ci diff--; 675cabdff1aSopenharmony_ci } else { 676cabdff1aSopenharmony_ci index = av_log2_16bit(2 * diff); 677cabdff1aSopenharmony_ci } 678cabdff1aSopenharmony_ci if (component == 0) 679cabdff1aSopenharmony_ci put_bits(&s->pb, 680cabdff1aSopenharmony_ci ff_mpeg12_vlc_dc_lum_bits[index] + index, 681cabdff1aSopenharmony_ci (ff_mpeg12_vlc_dc_lum_code[index] << index) + 682cabdff1aSopenharmony_ci av_mod_uintp2(diff, index)); 683cabdff1aSopenharmony_ci else 684cabdff1aSopenharmony_ci put_bits(&s->pb, 685cabdff1aSopenharmony_ci ff_mpeg12_vlc_dc_chroma_bits[index] + index, 686cabdff1aSopenharmony_ci (ff_mpeg12_vlc_dc_chroma_code[index] << index) + 687cabdff1aSopenharmony_ci av_mod_uintp2(diff, index)); 688cabdff1aSopenharmony_ci } else { 689cabdff1aSopenharmony_ci if (component == 0) 690cabdff1aSopenharmony_ci put_bits(&s->pb, 691cabdff1aSopenharmony_ci mpeg1_lum_dc_uni[diff + 255] & 0xFF, 692cabdff1aSopenharmony_ci mpeg1_lum_dc_uni[diff + 255] >> 8); 693cabdff1aSopenharmony_ci else 694cabdff1aSopenharmony_ci put_bits(&s->pb, 695cabdff1aSopenharmony_ci mpeg1_chr_dc_uni[diff + 255] & 0xFF, 696cabdff1aSopenharmony_ci mpeg1_chr_dc_uni[diff + 255] >> 8); 697cabdff1aSopenharmony_ci } 698cabdff1aSopenharmony_ci} 699cabdff1aSopenharmony_ci 700cabdff1aSopenharmony_cistatic void mpeg1_encode_block(MpegEncContext *s, int16_t *block, int n) 701cabdff1aSopenharmony_ci{ 702cabdff1aSopenharmony_ci int alevel, level, last_non_zero, dc, diff, i, j, run, last_index, sign; 703cabdff1aSopenharmony_ci int code, component; 704cabdff1aSopenharmony_ci const uint16_t (*table_vlc)[2] = ff_rl_mpeg1.table_vlc; 705cabdff1aSopenharmony_ci 706cabdff1aSopenharmony_ci last_index = s->block_last_index[n]; 707cabdff1aSopenharmony_ci 708cabdff1aSopenharmony_ci /* DC coef */ 709cabdff1aSopenharmony_ci if (s->mb_intra) { 710cabdff1aSopenharmony_ci component = (n <= 3 ? 0 : (n & 1) + 1); 711cabdff1aSopenharmony_ci dc = block[0]; /* overflow is impossible */ 712cabdff1aSopenharmony_ci diff = dc - s->last_dc[component]; 713cabdff1aSopenharmony_ci encode_dc(s, diff, component); 714cabdff1aSopenharmony_ci s->last_dc[component] = dc; 715cabdff1aSopenharmony_ci i = 1; 716cabdff1aSopenharmony_ci if (s->intra_vlc_format) 717cabdff1aSopenharmony_ci table_vlc = ff_rl_mpeg2.table_vlc; 718cabdff1aSopenharmony_ci } else { 719cabdff1aSopenharmony_ci /* encode the first coefficient: needs to be done here because 720cabdff1aSopenharmony_ci * it is handled slightly differently */ 721cabdff1aSopenharmony_ci level = block[0]; 722cabdff1aSopenharmony_ci if (abs(level) == 1) { 723cabdff1aSopenharmony_ci code = ((uint32_t)level >> 31); /* the sign bit */ 724cabdff1aSopenharmony_ci put_bits(&s->pb, 2, code | 0x02); 725cabdff1aSopenharmony_ci i = 1; 726cabdff1aSopenharmony_ci } else { 727cabdff1aSopenharmony_ci i = 0; 728cabdff1aSopenharmony_ci last_non_zero = -1; 729cabdff1aSopenharmony_ci goto next_coef; 730cabdff1aSopenharmony_ci } 731cabdff1aSopenharmony_ci } 732cabdff1aSopenharmony_ci 733cabdff1aSopenharmony_ci /* now quantify & encode AC coefs */ 734cabdff1aSopenharmony_ci last_non_zero = i - 1; 735cabdff1aSopenharmony_ci 736cabdff1aSopenharmony_ci for (; i <= last_index; i++) { 737cabdff1aSopenharmony_ci j = s->intra_scantable.permutated[i]; 738cabdff1aSopenharmony_ci level = block[j]; 739cabdff1aSopenharmony_ci 740cabdff1aSopenharmony_cinext_coef: 741cabdff1aSopenharmony_ci /* encode using VLC */ 742cabdff1aSopenharmony_ci if (level != 0) { 743cabdff1aSopenharmony_ci run = i - last_non_zero - 1; 744cabdff1aSopenharmony_ci 745cabdff1aSopenharmony_ci alevel = level; 746cabdff1aSopenharmony_ci MASK_ABS(sign, alevel); 747cabdff1aSopenharmony_ci sign &= 1; 748cabdff1aSopenharmony_ci 749cabdff1aSopenharmony_ci if (alevel <= ff_rl_mpeg1.max_level[0][run]) { 750cabdff1aSopenharmony_ci code = ff_rl_mpeg1.index_run[0][run] + alevel - 1; 751cabdff1aSopenharmony_ci /* store the VLC & sign at once */ 752cabdff1aSopenharmony_ci put_bits(&s->pb, table_vlc[code][1] + 1, 753cabdff1aSopenharmony_ci (table_vlc[code][0] << 1) + sign); 754cabdff1aSopenharmony_ci } else { 755cabdff1aSopenharmony_ci /* Escape seems to be pretty rare <5% so I do not optimize it; 756cabdff1aSopenharmony_ci * the following value is the common escape value for both 757cabdff1aSopenharmony_ci * possible tables (i.e. table_vlc[111]). */ 758cabdff1aSopenharmony_ci put_bits(&s->pb, 6, 0x01); 759cabdff1aSopenharmony_ci /* escape: only clip in this case */ 760cabdff1aSopenharmony_ci put_bits(&s->pb, 6, run); 761cabdff1aSopenharmony_ci if (s->codec_id == AV_CODEC_ID_MPEG1VIDEO) { 762cabdff1aSopenharmony_ci if (alevel < 128) { 763cabdff1aSopenharmony_ci put_sbits(&s->pb, 8, level); 764cabdff1aSopenharmony_ci } else { 765cabdff1aSopenharmony_ci if (level < 0) 766cabdff1aSopenharmony_ci put_bits(&s->pb, 16, 0x8001 + level + 255); 767cabdff1aSopenharmony_ci else 768cabdff1aSopenharmony_ci put_sbits(&s->pb, 16, level); 769cabdff1aSopenharmony_ci } 770cabdff1aSopenharmony_ci } else { 771cabdff1aSopenharmony_ci put_sbits(&s->pb, 12, level); 772cabdff1aSopenharmony_ci } 773cabdff1aSopenharmony_ci } 774cabdff1aSopenharmony_ci last_non_zero = i; 775cabdff1aSopenharmony_ci } 776cabdff1aSopenharmony_ci } 777cabdff1aSopenharmony_ci /* end of block */ 778cabdff1aSopenharmony_ci put_bits(&s->pb, table_vlc[112][1], table_vlc[112][0]); 779cabdff1aSopenharmony_ci} 780cabdff1aSopenharmony_ci 781cabdff1aSopenharmony_cistatic av_always_inline void mpeg1_encode_mb_internal(MpegEncContext *s, 782cabdff1aSopenharmony_ci int16_t block[8][64], 783cabdff1aSopenharmony_ci int motion_x, int motion_y, 784cabdff1aSopenharmony_ci int mb_block_count, 785cabdff1aSopenharmony_ci int chroma_y_shift) 786cabdff1aSopenharmony_ci{ 787cabdff1aSopenharmony_ci/* MPEG-1 is always 420. */ 788cabdff1aSopenharmony_ci#define IS_MPEG1(s) (chroma_y_shift == 1 && (s)->codec_id == AV_CODEC_ID_MPEG1VIDEO) 789cabdff1aSopenharmony_ci int i, cbp; 790cabdff1aSopenharmony_ci const int mb_x = s->mb_x; 791cabdff1aSopenharmony_ci const int mb_y = s->mb_y; 792cabdff1aSopenharmony_ci const int first_mb = mb_x == s->resync_mb_x && mb_y == s->resync_mb_y; 793cabdff1aSopenharmony_ci 794cabdff1aSopenharmony_ci /* compute cbp */ 795cabdff1aSopenharmony_ci cbp = 0; 796cabdff1aSopenharmony_ci for (i = 0; i < mb_block_count; i++) 797cabdff1aSopenharmony_ci if (s->block_last_index[i] >= 0) 798cabdff1aSopenharmony_ci cbp |= 1 << (mb_block_count - 1 - i); 799cabdff1aSopenharmony_ci 800cabdff1aSopenharmony_ci if (cbp == 0 && !first_mb && s->mv_type == MV_TYPE_16X16 && 801cabdff1aSopenharmony_ci (mb_x != s->mb_width - 1 || 802cabdff1aSopenharmony_ci (mb_y != s->end_mb_y - 1 && IS_MPEG1(s))) && 803cabdff1aSopenharmony_ci ((s->pict_type == AV_PICTURE_TYPE_P && (motion_x | motion_y) == 0) || 804cabdff1aSopenharmony_ci (s->pict_type == AV_PICTURE_TYPE_B && s->mv_dir == s->last_mv_dir && 805cabdff1aSopenharmony_ci (((s->mv_dir & MV_DIR_FORWARD) 806cabdff1aSopenharmony_ci ? ((s->mv[0][0][0] - s->last_mv[0][0][0]) | 807cabdff1aSopenharmony_ci (s->mv[0][0][1] - s->last_mv[0][0][1])) : 0) | 808cabdff1aSopenharmony_ci ((s->mv_dir & MV_DIR_BACKWARD) 809cabdff1aSopenharmony_ci ? ((s->mv[1][0][0] - s->last_mv[1][0][0]) | 810cabdff1aSopenharmony_ci (s->mv[1][0][1] - s->last_mv[1][0][1])) : 0)) == 0))) { 811cabdff1aSopenharmony_ci s->mb_skip_run++; 812cabdff1aSopenharmony_ci s->qscale -= s->dquant; 813cabdff1aSopenharmony_ci s->skip_count++; 814cabdff1aSopenharmony_ci s->misc_bits++; 815cabdff1aSopenharmony_ci s->last_bits++; 816cabdff1aSopenharmony_ci if (s->pict_type == AV_PICTURE_TYPE_P) { 817cabdff1aSopenharmony_ci s->last_mv[0][0][0] = 818cabdff1aSopenharmony_ci s->last_mv[0][0][1] = 819cabdff1aSopenharmony_ci s->last_mv[0][1][0] = 820cabdff1aSopenharmony_ci s->last_mv[0][1][1] = 0; 821cabdff1aSopenharmony_ci } 822cabdff1aSopenharmony_ci } else { 823cabdff1aSopenharmony_ci if (first_mb) { 824cabdff1aSopenharmony_ci av_assert0(s->mb_skip_run == 0); 825cabdff1aSopenharmony_ci encode_mb_skip_run(s, s->mb_x); 826cabdff1aSopenharmony_ci } else { 827cabdff1aSopenharmony_ci encode_mb_skip_run(s, s->mb_skip_run); 828cabdff1aSopenharmony_ci } 829cabdff1aSopenharmony_ci 830cabdff1aSopenharmony_ci if (s->pict_type == AV_PICTURE_TYPE_I) { 831cabdff1aSopenharmony_ci if (s->dquant && cbp) { 832cabdff1aSopenharmony_ci /* macroblock_type: macroblock_quant = 1 */ 833cabdff1aSopenharmony_ci put_mb_modes(s, 2, 1, 0, 0); 834cabdff1aSopenharmony_ci put_qscale(s); 835cabdff1aSopenharmony_ci } else { 836cabdff1aSopenharmony_ci /* macroblock_type: macroblock_quant = 0 */ 837cabdff1aSopenharmony_ci put_mb_modes(s, 1, 1, 0, 0); 838cabdff1aSopenharmony_ci s->qscale -= s->dquant; 839cabdff1aSopenharmony_ci } 840cabdff1aSopenharmony_ci s->misc_bits += get_bits_diff(s); 841cabdff1aSopenharmony_ci s->i_count++; 842cabdff1aSopenharmony_ci } else if (s->mb_intra) { 843cabdff1aSopenharmony_ci if (s->dquant && cbp) { 844cabdff1aSopenharmony_ci put_mb_modes(s, 6, 0x01, 0, 0); 845cabdff1aSopenharmony_ci put_qscale(s); 846cabdff1aSopenharmony_ci } else { 847cabdff1aSopenharmony_ci put_mb_modes(s, 5, 0x03, 0, 0); 848cabdff1aSopenharmony_ci s->qscale -= s->dquant; 849cabdff1aSopenharmony_ci } 850cabdff1aSopenharmony_ci s->misc_bits += get_bits_diff(s); 851cabdff1aSopenharmony_ci s->i_count++; 852cabdff1aSopenharmony_ci memset(s->last_mv, 0, sizeof(s->last_mv)); 853cabdff1aSopenharmony_ci } else if (s->pict_type == AV_PICTURE_TYPE_P) { 854cabdff1aSopenharmony_ci if (s->mv_type == MV_TYPE_16X16) { 855cabdff1aSopenharmony_ci if (cbp != 0) { 856cabdff1aSopenharmony_ci if ((motion_x | motion_y) == 0) { 857cabdff1aSopenharmony_ci if (s->dquant) { 858cabdff1aSopenharmony_ci /* macroblock_pattern & quant */ 859cabdff1aSopenharmony_ci put_mb_modes(s, 5, 1, 0, 0); 860cabdff1aSopenharmony_ci put_qscale(s); 861cabdff1aSopenharmony_ci } else { 862cabdff1aSopenharmony_ci /* macroblock_pattern only */ 863cabdff1aSopenharmony_ci put_mb_modes(s, 2, 1, 0, 0); 864cabdff1aSopenharmony_ci } 865cabdff1aSopenharmony_ci s->misc_bits += get_bits_diff(s); 866cabdff1aSopenharmony_ci } else { 867cabdff1aSopenharmony_ci if (s->dquant) { 868cabdff1aSopenharmony_ci put_mb_modes(s, 5, 2, 1, 0); /* motion + cbp */ 869cabdff1aSopenharmony_ci put_qscale(s); 870cabdff1aSopenharmony_ci } else { 871cabdff1aSopenharmony_ci put_mb_modes(s, 1, 1, 1, 0); /* motion + cbp */ 872cabdff1aSopenharmony_ci } 873cabdff1aSopenharmony_ci s->misc_bits += get_bits_diff(s); 874cabdff1aSopenharmony_ci // RAL: f_code parameter added 875cabdff1aSopenharmony_ci mpeg1_encode_motion(s, 876cabdff1aSopenharmony_ci motion_x - s->last_mv[0][0][0], 877cabdff1aSopenharmony_ci s->f_code); 878cabdff1aSopenharmony_ci // RAL: f_code parameter added 879cabdff1aSopenharmony_ci mpeg1_encode_motion(s, 880cabdff1aSopenharmony_ci motion_y - s->last_mv[0][0][1], 881cabdff1aSopenharmony_ci s->f_code); 882cabdff1aSopenharmony_ci s->mv_bits += get_bits_diff(s); 883cabdff1aSopenharmony_ci } 884cabdff1aSopenharmony_ci } else { 885cabdff1aSopenharmony_ci put_bits(&s->pb, 3, 1); /* motion only */ 886cabdff1aSopenharmony_ci if (!s->frame_pred_frame_dct) 887cabdff1aSopenharmony_ci put_bits(&s->pb, 2, 2); /* motion_type: frame */ 888cabdff1aSopenharmony_ci s->misc_bits += get_bits_diff(s); 889cabdff1aSopenharmony_ci // RAL: f_code parameter added 890cabdff1aSopenharmony_ci mpeg1_encode_motion(s, 891cabdff1aSopenharmony_ci motion_x - s->last_mv[0][0][0], 892cabdff1aSopenharmony_ci s->f_code); 893cabdff1aSopenharmony_ci // RAL: f_code parameter added 894cabdff1aSopenharmony_ci mpeg1_encode_motion(s, 895cabdff1aSopenharmony_ci motion_y - s->last_mv[0][0][1], 896cabdff1aSopenharmony_ci s->f_code); 897cabdff1aSopenharmony_ci s->qscale -= s->dquant; 898cabdff1aSopenharmony_ci s->mv_bits += get_bits_diff(s); 899cabdff1aSopenharmony_ci } 900cabdff1aSopenharmony_ci s->last_mv[0][1][0] = s->last_mv[0][0][0] = motion_x; 901cabdff1aSopenharmony_ci s->last_mv[0][1][1] = s->last_mv[0][0][1] = motion_y; 902cabdff1aSopenharmony_ci } else { 903cabdff1aSopenharmony_ci av_assert2(!s->frame_pred_frame_dct && s->mv_type == MV_TYPE_FIELD); 904cabdff1aSopenharmony_ci 905cabdff1aSopenharmony_ci if (cbp) { 906cabdff1aSopenharmony_ci if (s->dquant) { 907cabdff1aSopenharmony_ci put_mb_modes(s, 5, 2, 1, 1); /* motion + cbp */ 908cabdff1aSopenharmony_ci put_qscale(s); 909cabdff1aSopenharmony_ci } else { 910cabdff1aSopenharmony_ci put_mb_modes(s, 1, 1, 1, 1); /* motion + cbp */ 911cabdff1aSopenharmony_ci } 912cabdff1aSopenharmony_ci } else { 913cabdff1aSopenharmony_ci put_bits(&s->pb, 3, 1); /* motion only */ 914cabdff1aSopenharmony_ci put_bits(&s->pb, 2, 1); /* motion_type: field */ 915cabdff1aSopenharmony_ci s->qscale -= s->dquant; 916cabdff1aSopenharmony_ci } 917cabdff1aSopenharmony_ci s->misc_bits += get_bits_diff(s); 918cabdff1aSopenharmony_ci for (i = 0; i < 2; i++) { 919cabdff1aSopenharmony_ci put_bits(&s->pb, 1, s->field_select[0][i]); 920cabdff1aSopenharmony_ci mpeg1_encode_motion(s, 921cabdff1aSopenharmony_ci s->mv[0][i][0] - s->last_mv[0][i][0], 922cabdff1aSopenharmony_ci s->f_code); 923cabdff1aSopenharmony_ci mpeg1_encode_motion(s, 924cabdff1aSopenharmony_ci s->mv[0][i][1] - (s->last_mv[0][i][1] >> 1), 925cabdff1aSopenharmony_ci s->f_code); 926cabdff1aSopenharmony_ci s->last_mv[0][i][0] = s->mv[0][i][0]; 927cabdff1aSopenharmony_ci s->last_mv[0][i][1] = 2 * s->mv[0][i][1]; 928cabdff1aSopenharmony_ci } 929cabdff1aSopenharmony_ci s->mv_bits += get_bits_diff(s); 930cabdff1aSopenharmony_ci } 931cabdff1aSopenharmony_ci if (cbp) { 932cabdff1aSopenharmony_ci if (chroma_y_shift) { 933cabdff1aSopenharmony_ci put_bits(&s->pb, 934cabdff1aSopenharmony_ci ff_mpeg12_mbPatTable[cbp][1], 935cabdff1aSopenharmony_ci ff_mpeg12_mbPatTable[cbp][0]); 936cabdff1aSopenharmony_ci } else { 937cabdff1aSopenharmony_ci put_bits(&s->pb, 938cabdff1aSopenharmony_ci ff_mpeg12_mbPatTable[cbp >> 2][1], 939cabdff1aSopenharmony_ci ff_mpeg12_mbPatTable[cbp >> 2][0]); 940cabdff1aSopenharmony_ci put_sbits(&s->pb, 2, cbp); 941cabdff1aSopenharmony_ci } 942cabdff1aSopenharmony_ci } 943cabdff1aSopenharmony_ci } else { 944cabdff1aSopenharmony_ci if (s->mv_type == MV_TYPE_16X16) { 945cabdff1aSopenharmony_ci if (cbp) { // With coded bloc pattern 946cabdff1aSopenharmony_ci if (s->dquant) { 947cabdff1aSopenharmony_ci if (s->mv_dir == MV_DIR_FORWARD) 948cabdff1aSopenharmony_ci put_mb_modes(s, 6, 3, 1, 0); 949cabdff1aSopenharmony_ci else 950cabdff1aSopenharmony_ci put_mb_modes(s, 8 - s->mv_dir, 2, 1, 0); 951cabdff1aSopenharmony_ci put_qscale(s); 952cabdff1aSopenharmony_ci } else { 953cabdff1aSopenharmony_ci put_mb_modes(s, 5 - s->mv_dir, 3, 1, 0); 954cabdff1aSopenharmony_ci } 955cabdff1aSopenharmony_ci } else { // No coded bloc pattern 956cabdff1aSopenharmony_ci put_bits(&s->pb, 5 - s->mv_dir, 2); 957cabdff1aSopenharmony_ci if (!s->frame_pred_frame_dct) 958cabdff1aSopenharmony_ci put_bits(&s->pb, 2, 2); /* motion_type: frame */ 959cabdff1aSopenharmony_ci s->qscale -= s->dquant; 960cabdff1aSopenharmony_ci } 961cabdff1aSopenharmony_ci s->misc_bits += get_bits_diff(s); 962cabdff1aSopenharmony_ci if (s->mv_dir & MV_DIR_FORWARD) { 963cabdff1aSopenharmony_ci mpeg1_encode_motion(s, 964cabdff1aSopenharmony_ci s->mv[0][0][0] - s->last_mv[0][0][0], 965cabdff1aSopenharmony_ci s->f_code); 966cabdff1aSopenharmony_ci mpeg1_encode_motion(s, 967cabdff1aSopenharmony_ci s->mv[0][0][1] - s->last_mv[0][0][1], 968cabdff1aSopenharmony_ci s->f_code); 969cabdff1aSopenharmony_ci s->last_mv[0][0][0] = 970cabdff1aSopenharmony_ci s->last_mv[0][1][0] = s->mv[0][0][0]; 971cabdff1aSopenharmony_ci s->last_mv[0][0][1] = 972cabdff1aSopenharmony_ci s->last_mv[0][1][1] = s->mv[0][0][1]; 973cabdff1aSopenharmony_ci } 974cabdff1aSopenharmony_ci if (s->mv_dir & MV_DIR_BACKWARD) { 975cabdff1aSopenharmony_ci mpeg1_encode_motion(s, 976cabdff1aSopenharmony_ci s->mv[1][0][0] - s->last_mv[1][0][0], 977cabdff1aSopenharmony_ci s->b_code); 978cabdff1aSopenharmony_ci mpeg1_encode_motion(s, 979cabdff1aSopenharmony_ci s->mv[1][0][1] - s->last_mv[1][0][1], 980cabdff1aSopenharmony_ci s->b_code); 981cabdff1aSopenharmony_ci s->last_mv[1][0][0] = 982cabdff1aSopenharmony_ci s->last_mv[1][1][0] = s->mv[1][0][0]; 983cabdff1aSopenharmony_ci s->last_mv[1][0][1] = 984cabdff1aSopenharmony_ci s->last_mv[1][1][1] = s->mv[1][0][1]; 985cabdff1aSopenharmony_ci } 986cabdff1aSopenharmony_ci } else { 987cabdff1aSopenharmony_ci av_assert2(s->mv_type == MV_TYPE_FIELD); 988cabdff1aSopenharmony_ci av_assert2(!s->frame_pred_frame_dct); 989cabdff1aSopenharmony_ci if (cbp) { // With coded bloc pattern 990cabdff1aSopenharmony_ci if (s->dquant) { 991cabdff1aSopenharmony_ci if (s->mv_dir == MV_DIR_FORWARD) 992cabdff1aSopenharmony_ci put_mb_modes(s, 6, 3, 1, 1); 993cabdff1aSopenharmony_ci else 994cabdff1aSopenharmony_ci put_mb_modes(s, 8 - s->mv_dir, 2, 1, 1); 995cabdff1aSopenharmony_ci put_qscale(s); 996cabdff1aSopenharmony_ci } else { 997cabdff1aSopenharmony_ci put_mb_modes(s, 5 - s->mv_dir, 3, 1, 1); 998cabdff1aSopenharmony_ci } 999cabdff1aSopenharmony_ci } else { // No coded bloc pattern 1000cabdff1aSopenharmony_ci put_bits(&s->pb, 5 - s->mv_dir, 2); 1001cabdff1aSopenharmony_ci put_bits(&s->pb, 2, 1); /* motion_type: field */ 1002cabdff1aSopenharmony_ci s->qscale -= s->dquant; 1003cabdff1aSopenharmony_ci } 1004cabdff1aSopenharmony_ci s->misc_bits += get_bits_diff(s); 1005cabdff1aSopenharmony_ci if (s->mv_dir & MV_DIR_FORWARD) { 1006cabdff1aSopenharmony_ci for (i = 0; i < 2; i++) { 1007cabdff1aSopenharmony_ci put_bits(&s->pb, 1, s->field_select[0][i]); 1008cabdff1aSopenharmony_ci mpeg1_encode_motion(s, 1009cabdff1aSopenharmony_ci s->mv[0][i][0] - s->last_mv[0][i][0], 1010cabdff1aSopenharmony_ci s->f_code); 1011cabdff1aSopenharmony_ci mpeg1_encode_motion(s, 1012cabdff1aSopenharmony_ci s->mv[0][i][1] - (s->last_mv[0][i][1] >> 1), 1013cabdff1aSopenharmony_ci s->f_code); 1014cabdff1aSopenharmony_ci s->last_mv[0][i][0] = s->mv[0][i][0]; 1015cabdff1aSopenharmony_ci s->last_mv[0][i][1] = s->mv[0][i][1] * 2; 1016cabdff1aSopenharmony_ci } 1017cabdff1aSopenharmony_ci } 1018cabdff1aSopenharmony_ci if (s->mv_dir & MV_DIR_BACKWARD) { 1019cabdff1aSopenharmony_ci for (i = 0; i < 2; i++) { 1020cabdff1aSopenharmony_ci put_bits(&s->pb, 1, s->field_select[1][i]); 1021cabdff1aSopenharmony_ci mpeg1_encode_motion(s, 1022cabdff1aSopenharmony_ci s->mv[1][i][0] - s->last_mv[1][i][0], 1023cabdff1aSopenharmony_ci s->b_code); 1024cabdff1aSopenharmony_ci mpeg1_encode_motion(s, 1025cabdff1aSopenharmony_ci s->mv[1][i][1] - (s->last_mv[1][i][1] >> 1), 1026cabdff1aSopenharmony_ci s->b_code); 1027cabdff1aSopenharmony_ci s->last_mv[1][i][0] = s->mv[1][i][0]; 1028cabdff1aSopenharmony_ci s->last_mv[1][i][1] = s->mv[1][i][1] * 2; 1029cabdff1aSopenharmony_ci } 1030cabdff1aSopenharmony_ci } 1031cabdff1aSopenharmony_ci } 1032cabdff1aSopenharmony_ci s->mv_bits += get_bits_diff(s); 1033cabdff1aSopenharmony_ci if (cbp) { 1034cabdff1aSopenharmony_ci if (chroma_y_shift) { 1035cabdff1aSopenharmony_ci put_bits(&s->pb, 1036cabdff1aSopenharmony_ci ff_mpeg12_mbPatTable[cbp][1], 1037cabdff1aSopenharmony_ci ff_mpeg12_mbPatTable[cbp][0]); 1038cabdff1aSopenharmony_ci } else { 1039cabdff1aSopenharmony_ci put_bits(&s->pb, 1040cabdff1aSopenharmony_ci ff_mpeg12_mbPatTable[cbp >> 2][1], 1041cabdff1aSopenharmony_ci ff_mpeg12_mbPatTable[cbp >> 2][0]); 1042cabdff1aSopenharmony_ci put_sbits(&s->pb, 2, cbp); 1043cabdff1aSopenharmony_ci } 1044cabdff1aSopenharmony_ci } 1045cabdff1aSopenharmony_ci } 1046cabdff1aSopenharmony_ci for (i = 0; i < mb_block_count; i++) 1047cabdff1aSopenharmony_ci if (cbp & (1 << (mb_block_count - 1 - i))) 1048cabdff1aSopenharmony_ci mpeg1_encode_block(s, block[i], i); 1049cabdff1aSopenharmony_ci s->mb_skip_run = 0; 1050cabdff1aSopenharmony_ci if (s->mb_intra) 1051cabdff1aSopenharmony_ci s->i_tex_bits += get_bits_diff(s); 1052cabdff1aSopenharmony_ci else 1053cabdff1aSopenharmony_ci s->p_tex_bits += get_bits_diff(s); 1054cabdff1aSopenharmony_ci } 1055cabdff1aSopenharmony_ci} 1056cabdff1aSopenharmony_ci 1057cabdff1aSopenharmony_civoid ff_mpeg1_encode_mb(MpegEncContext *s, int16_t block[8][64], 1058cabdff1aSopenharmony_ci int motion_x, int motion_y) 1059cabdff1aSopenharmony_ci{ 1060cabdff1aSopenharmony_ci if (s->chroma_format == CHROMA_420) 1061cabdff1aSopenharmony_ci mpeg1_encode_mb_internal(s, block, motion_x, motion_y, 6, 1); 1062cabdff1aSopenharmony_ci else 1063cabdff1aSopenharmony_ci mpeg1_encode_mb_internal(s, block, motion_x, motion_y, 8, 0); 1064cabdff1aSopenharmony_ci} 1065cabdff1aSopenharmony_ci 1066cabdff1aSopenharmony_cistatic av_cold void mpeg12_encode_init_static(void) 1067cabdff1aSopenharmony_ci{ 1068cabdff1aSopenharmony_ci static uint8_t mpeg12_static_rl_table_store[2][2][2*MAX_RUN + MAX_LEVEL + 3]; 1069cabdff1aSopenharmony_ci 1070cabdff1aSopenharmony_ci ff_rl_init(&ff_rl_mpeg1, mpeg12_static_rl_table_store[0]); 1071cabdff1aSopenharmony_ci ff_rl_init(&ff_rl_mpeg2, mpeg12_static_rl_table_store[1]); 1072cabdff1aSopenharmony_ci 1073cabdff1aSopenharmony_ci ff_mpeg1_init_uni_ac_vlc(&ff_rl_mpeg1, uni_mpeg1_ac_vlc_len); 1074cabdff1aSopenharmony_ci ff_mpeg1_init_uni_ac_vlc(&ff_rl_mpeg2, uni_mpeg2_ac_vlc_len); 1075cabdff1aSopenharmony_ci 1076cabdff1aSopenharmony_ci /* build unified dc encoding tables */ 1077cabdff1aSopenharmony_ci for (int i = -255; i < 256; i++) { 1078cabdff1aSopenharmony_ci int adiff, index; 1079cabdff1aSopenharmony_ci int bits, code; 1080cabdff1aSopenharmony_ci int diff = i; 1081cabdff1aSopenharmony_ci 1082cabdff1aSopenharmony_ci adiff = FFABS(diff); 1083cabdff1aSopenharmony_ci if (diff < 0) 1084cabdff1aSopenharmony_ci diff--; 1085cabdff1aSopenharmony_ci index = av_log2(2 * adiff); 1086cabdff1aSopenharmony_ci 1087cabdff1aSopenharmony_ci bits = ff_mpeg12_vlc_dc_lum_bits[index] + index; 1088cabdff1aSopenharmony_ci code = (ff_mpeg12_vlc_dc_lum_code[index] << index) + 1089cabdff1aSopenharmony_ci av_mod_uintp2(diff, index); 1090cabdff1aSopenharmony_ci mpeg1_lum_dc_uni[i + 255] = bits + (code << 8); 1091cabdff1aSopenharmony_ci 1092cabdff1aSopenharmony_ci bits = ff_mpeg12_vlc_dc_chroma_bits[index] + index; 1093cabdff1aSopenharmony_ci code = (ff_mpeg12_vlc_dc_chroma_code[index] << index) + 1094cabdff1aSopenharmony_ci av_mod_uintp2(diff, index); 1095cabdff1aSopenharmony_ci mpeg1_chr_dc_uni[i + 255] = bits + (code << 8); 1096cabdff1aSopenharmony_ci } 1097cabdff1aSopenharmony_ci 1098cabdff1aSopenharmony_ci for (int f_code = 1; f_code <= MAX_FCODE; f_code++) 1099cabdff1aSopenharmony_ci for (int mv = -MAX_DMV; mv <= MAX_DMV; mv++) { 1100cabdff1aSopenharmony_ci int len; 1101cabdff1aSopenharmony_ci 1102cabdff1aSopenharmony_ci if (mv == 0) { 1103cabdff1aSopenharmony_ci len = 1; /* ff_mpeg12_mbMotionVectorTable[0][1] */ 1104cabdff1aSopenharmony_ci } else { 1105cabdff1aSopenharmony_ci int val, bit_size, code; 1106cabdff1aSopenharmony_ci 1107cabdff1aSopenharmony_ci bit_size = f_code - 1; 1108cabdff1aSopenharmony_ci 1109cabdff1aSopenharmony_ci val = mv; 1110cabdff1aSopenharmony_ci if (val < 0) 1111cabdff1aSopenharmony_ci val = -val; 1112cabdff1aSopenharmony_ci val--; 1113cabdff1aSopenharmony_ci code = (val >> bit_size) + 1; 1114cabdff1aSopenharmony_ci if (code < 17) 1115cabdff1aSopenharmony_ci len = ff_mpeg12_mbMotionVectorTable[code][1] + 1116cabdff1aSopenharmony_ci 1 + bit_size; 1117cabdff1aSopenharmony_ci else 1118cabdff1aSopenharmony_ci len = 10 /* ff_mpeg12_mbMotionVectorTable[16][1] */ + 1119cabdff1aSopenharmony_ci 2 + bit_size; 1120cabdff1aSopenharmony_ci } 1121cabdff1aSopenharmony_ci 1122cabdff1aSopenharmony_ci mv_penalty[f_code][mv + MAX_DMV] = len; 1123cabdff1aSopenharmony_ci } 1124cabdff1aSopenharmony_ci 1125cabdff1aSopenharmony_ci 1126cabdff1aSopenharmony_ci for (int f_code = MAX_FCODE; f_code > 0; f_code--) 1127cabdff1aSopenharmony_ci for (int mv = -(8 << f_code); mv < (8 << f_code); mv++) 1128cabdff1aSopenharmony_ci fcode_tab[mv + MAX_MV] = f_code; 1129cabdff1aSopenharmony_ci} 1130cabdff1aSopenharmony_ci 1131cabdff1aSopenharmony_ciav_cold void ff_mpeg1_encode_init(MpegEncContext *s) 1132cabdff1aSopenharmony_ci{ 1133cabdff1aSopenharmony_ci static AVOnce init_static_once = AV_ONCE_INIT; 1134cabdff1aSopenharmony_ci 1135cabdff1aSopenharmony_ci ff_mpeg12_common_init(s); 1136cabdff1aSopenharmony_ci 1137cabdff1aSopenharmony_ci s->me.mv_penalty = mv_penalty; 1138cabdff1aSopenharmony_ci s->fcode_tab = fcode_tab; 1139cabdff1aSopenharmony_ci if (s->codec_id == AV_CODEC_ID_MPEG1VIDEO) { 1140cabdff1aSopenharmony_ci s->min_qcoeff = -255; 1141cabdff1aSopenharmony_ci s->max_qcoeff = 255; 1142cabdff1aSopenharmony_ci } else { 1143cabdff1aSopenharmony_ci s->min_qcoeff = -2047; 1144cabdff1aSopenharmony_ci s->max_qcoeff = 2047; 1145cabdff1aSopenharmony_ci s->mpeg_quant = 1; 1146cabdff1aSopenharmony_ci } 1147cabdff1aSopenharmony_ci if (s->intra_vlc_format) { 1148cabdff1aSopenharmony_ci s->intra_ac_vlc_length = 1149cabdff1aSopenharmony_ci s->intra_ac_vlc_last_length = uni_mpeg2_ac_vlc_len; 1150cabdff1aSopenharmony_ci } else { 1151cabdff1aSopenharmony_ci s->intra_ac_vlc_length = 1152cabdff1aSopenharmony_ci s->intra_ac_vlc_last_length = uni_mpeg1_ac_vlc_len; 1153cabdff1aSopenharmony_ci } 1154cabdff1aSopenharmony_ci s->inter_ac_vlc_length = 1155cabdff1aSopenharmony_ci s->inter_ac_vlc_last_length = uni_mpeg1_ac_vlc_len; 1156cabdff1aSopenharmony_ci 1157cabdff1aSopenharmony_ci ff_thread_once(&init_static_once, mpeg12_encode_init_static); 1158cabdff1aSopenharmony_ci} 1159cabdff1aSopenharmony_ci 1160cabdff1aSopenharmony_ci#define OFFSET(x) offsetof(MPEG12EncContext, x) 1161cabdff1aSopenharmony_ci#define VE AV_OPT_FLAG_ENCODING_PARAM | AV_OPT_FLAG_VIDEO_PARAM 1162cabdff1aSopenharmony_ci#define COMMON_OPTS \ 1163cabdff1aSopenharmony_ci { "gop_timecode", "MPEG GOP Timecode in hh:mm:ss[:;.]ff format. Overrides timecode_frame_start.", \ 1164cabdff1aSopenharmony_ci OFFSET(tc_opt_str), AV_OPT_TYPE_STRING, {.str=NULL}, 0, 0, VE },\ 1165cabdff1aSopenharmony_ci { "drop_frame_timecode", "Timecode is in drop frame format.", \ 1166cabdff1aSopenharmony_ci OFFSET(drop_frame_timecode), AV_OPT_TYPE_BOOL, { .i64 = 0 }, 0, 1, VE }, \ 1167cabdff1aSopenharmony_ci { "scan_offset", "Reserve space for SVCD scan offset user data.", \ 1168cabdff1aSopenharmony_ci OFFSET(scan_offset), AV_OPT_TYPE_BOOL, { .i64 = 0 }, 0, 1, VE }, \ 1169cabdff1aSopenharmony_ci { "timecode_frame_start", "GOP timecode frame start number, in non-drop-frame format", \ 1170cabdff1aSopenharmony_ci OFFSET(timecode_frame_start), AV_OPT_TYPE_INT64, {.i64 = -1 }, -1, INT64_MAX, VE}, \ 1171cabdff1aSopenharmony_ci FF_MPV_COMMON_BFRAME_OPTS 1172cabdff1aSopenharmony_ci 1173cabdff1aSopenharmony_cistatic const AVOption mpeg1_options[] = { 1174cabdff1aSopenharmony_ci COMMON_OPTS 1175cabdff1aSopenharmony_ci FF_MPV_COMMON_OPTS 1176cabdff1aSopenharmony_ci FF_MPV_COMMON_MOTION_EST_OPTS 1177cabdff1aSopenharmony_ci { NULL }, 1178cabdff1aSopenharmony_ci}; 1179cabdff1aSopenharmony_ci 1180cabdff1aSopenharmony_cistatic const AVOption mpeg2_options[] = { 1181cabdff1aSopenharmony_ci COMMON_OPTS 1182cabdff1aSopenharmony_ci { "intra_vlc", "Use MPEG-2 intra VLC table.", 1183cabdff1aSopenharmony_ci FF_MPV_OFFSET(intra_vlc_format), AV_OPT_TYPE_BOOL, { .i64 = 0 }, 0, 1, VE }, 1184cabdff1aSopenharmony_ci { "non_linear_quant", "Use nonlinear quantizer.", FF_MPV_OFFSET(q_scale_type), AV_OPT_TYPE_BOOL, { .i64 = 0 }, 0, 1, VE }, 1185cabdff1aSopenharmony_ci { "alternate_scan", "Enable alternate scantable.", FF_MPV_OFFSET(alternate_scan), AV_OPT_TYPE_BOOL, { .i64 = 0 }, 0, 1, VE }, 1186cabdff1aSopenharmony_ci { "a53cc", "Use A53 Closed Captions (if available)", OFFSET(a53_cc), AV_OPT_TYPE_BOOL, { .i64 = 1 }, 0, 1, VE }, 1187cabdff1aSopenharmony_ci { "seq_disp_ext", "Write sequence_display_extension blocks.", OFFSET(seq_disp_ext), AV_OPT_TYPE_INT, { .i64 = -1 }, -1, 1, VE, "seq_disp_ext" }, 1188cabdff1aSopenharmony_ci { "auto", NULL, 0, AV_OPT_TYPE_CONST, {.i64 = -1}, 0, 0, VE, "seq_disp_ext" }, 1189cabdff1aSopenharmony_ci { "never", NULL, 0, AV_OPT_TYPE_CONST, {.i64 = 0 }, 0, 0, VE, "seq_disp_ext" }, 1190cabdff1aSopenharmony_ci { "always", NULL, 0, AV_OPT_TYPE_CONST, {.i64 = 1 }, 0, 0, VE, "seq_disp_ext" }, 1191cabdff1aSopenharmony_ci { "video_format", "Video_format in the sequence_display_extension indicating the source of the video.", OFFSET(video_format), AV_OPT_TYPE_INT, { .i64 = VIDEO_FORMAT_UNSPECIFIED }, 0, 7, VE, "video_format" }, 1192cabdff1aSopenharmony_ci { "component", NULL, 0, AV_OPT_TYPE_CONST, {.i64 = VIDEO_FORMAT_COMPONENT }, 0, 0, VE, "video_format" }, 1193cabdff1aSopenharmony_ci { "pal", NULL, 0, AV_OPT_TYPE_CONST, {.i64 = VIDEO_FORMAT_PAL }, 0, 0, VE, "video_format" }, 1194cabdff1aSopenharmony_ci { "ntsc", NULL, 0, AV_OPT_TYPE_CONST, {.i64 = VIDEO_FORMAT_NTSC }, 0, 0, VE, "video_format" }, 1195cabdff1aSopenharmony_ci { "secam", NULL, 0, AV_OPT_TYPE_CONST, {.i64 = VIDEO_FORMAT_SECAM }, 0, 0, VE, "video_format" }, 1196cabdff1aSopenharmony_ci { "mac", NULL, 0, AV_OPT_TYPE_CONST, {.i64 = VIDEO_FORMAT_MAC }, 0, 0, VE, "video_format" }, 1197cabdff1aSopenharmony_ci { "unspecified", NULL, 0, AV_OPT_TYPE_CONST, {.i64 = VIDEO_FORMAT_UNSPECIFIED}, 0, 0, VE, "video_format" }, 1198cabdff1aSopenharmony_ci#define LEVEL(name, value) name, NULL, 0, AV_OPT_TYPE_CONST, { .i64 = value }, 0, 0, VE, "avctx.level" 1199cabdff1aSopenharmony_ci { LEVEL("high", 4) }, 1200cabdff1aSopenharmony_ci { LEVEL("high1440", 6) }, 1201cabdff1aSopenharmony_ci { LEVEL("main", 8) }, 1202cabdff1aSopenharmony_ci { LEVEL("low", 10) }, 1203cabdff1aSopenharmony_ci#undef LEVEL 1204cabdff1aSopenharmony_ci FF_MPV_COMMON_OPTS 1205cabdff1aSopenharmony_ci FF_MPV_COMMON_MOTION_EST_OPTS 1206cabdff1aSopenharmony_ci FF_MPEG2_PROFILE_OPTS 1207cabdff1aSopenharmony_ci { NULL }, 1208cabdff1aSopenharmony_ci}; 1209cabdff1aSopenharmony_ci 1210cabdff1aSopenharmony_ci#define mpeg12_class(x) \ 1211cabdff1aSopenharmony_cistatic const AVClass mpeg ## x ## _class = { \ 1212cabdff1aSopenharmony_ci .class_name = "mpeg" # x "video encoder", \ 1213cabdff1aSopenharmony_ci .item_name = av_default_item_name, \ 1214cabdff1aSopenharmony_ci .option = mpeg ## x ## _options, \ 1215cabdff1aSopenharmony_ci .version = LIBAVUTIL_VERSION_INT, \ 1216cabdff1aSopenharmony_ci}; 1217cabdff1aSopenharmony_ci 1218cabdff1aSopenharmony_cimpeg12_class(1) 1219cabdff1aSopenharmony_cimpeg12_class(2) 1220cabdff1aSopenharmony_ci 1221cabdff1aSopenharmony_ciconst FFCodec ff_mpeg1video_encoder = { 1222cabdff1aSopenharmony_ci .p.name = "mpeg1video", 1223cabdff1aSopenharmony_ci .p.long_name = NULL_IF_CONFIG_SMALL("MPEG-1 video"), 1224cabdff1aSopenharmony_ci .p.type = AVMEDIA_TYPE_VIDEO, 1225cabdff1aSopenharmony_ci .p.id = AV_CODEC_ID_MPEG1VIDEO, 1226cabdff1aSopenharmony_ci .priv_data_size = sizeof(MPEG12EncContext), 1227cabdff1aSopenharmony_ci .init = encode_init, 1228cabdff1aSopenharmony_ci FF_CODEC_ENCODE_CB(ff_mpv_encode_picture), 1229cabdff1aSopenharmony_ci .close = ff_mpv_encode_end, 1230cabdff1aSopenharmony_ci .p.supported_framerates = ff_mpeg12_frame_rate_tab + 1, 1231cabdff1aSopenharmony_ci .p.pix_fmts = (const enum AVPixelFormat[]) { AV_PIX_FMT_YUV420P, 1232cabdff1aSopenharmony_ci AV_PIX_FMT_NONE }, 1233cabdff1aSopenharmony_ci .p.capabilities = AV_CODEC_CAP_DELAY | AV_CODEC_CAP_SLICE_THREADS, 1234cabdff1aSopenharmony_ci .caps_internal = FF_CODEC_CAP_INIT_THREADSAFE | FF_CODEC_CAP_INIT_CLEANUP, 1235cabdff1aSopenharmony_ci .p.priv_class = &mpeg1_class, 1236cabdff1aSopenharmony_ci}; 1237cabdff1aSopenharmony_ci 1238cabdff1aSopenharmony_ciconst FFCodec ff_mpeg2video_encoder = { 1239cabdff1aSopenharmony_ci .p.name = "mpeg2video", 1240cabdff1aSopenharmony_ci .p.long_name = NULL_IF_CONFIG_SMALL("MPEG-2 video"), 1241cabdff1aSopenharmony_ci .p.type = AVMEDIA_TYPE_VIDEO, 1242cabdff1aSopenharmony_ci .p.id = AV_CODEC_ID_MPEG2VIDEO, 1243cabdff1aSopenharmony_ci .priv_data_size = sizeof(MPEG12EncContext), 1244cabdff1aSopenharmony_ci .init = encode_init, 1245cabdff1aSopenharmony_ci FF_CODEC_ENCODE_CB(ff_mpv_encode_picture), 1246cabdff1aSopenharmony_ci .close = ff_mpv_encode_end, 1247cabdff1aSopenharmony_ci .p.supported_framerates = ff_mpeg2_frame_rate_tab, 1248cabdff1aSopenharmony_ci .p.pix_fmts = (const enum AVPixelFormat[]) { AV_PIX_FMT_YUV420P, 1249cabdff1aSopenharmony_ci AV_PIX_FMT_YUV422P, 1250cabdff1aSopenharmony_ci AV_PIX_FMT_NONE }, 1251cabdff1aSopenharmony_ci .p.capabilities = AV_CODEC_CAP_DELAY | AV_CODEC_CAP_SLICE_THREADS, 1252cabdff1aSopenharmony_ci .caps_internal = FF_CODEC_CAP_INIT_THREADSAFE | FF_CODEC_CAP_INIT_CLEANUP, 1253cabdff1aSopenharmony_ci .p.priv_class = &mpeg2_class, 1254cabdff1aSopenharmony_ci}; 1255cabdff1aSopenharmony_ci#endif /* CONFIG_MPEG1VIDEO_ENCODER || CONFIG_MPEG2VIDEO_ENCODER */ 1256