FFmpeg coverage


Directory: ../../../ffmpeg/
File: src/libavcodec/mpeg12enc.c
Date: 2021-09-23 20:34:37
Exec Total Coverage
Lines: 596 685 87.0%
Branches: 319 411 77.6%

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