FFmpeg coverage


Directory: ../../../ffmpeg/
File: src/libavcodec/ituh263enc.c
Date: 2025-03-08 20:38:41
Exec Total Coverage
Lines: 407 471 86.4%
Functions: 16 16 100.0%
Branches: 215 272 79.0%

Line Branch Exec Source
1 /*
2 * ITU H.263 bitstream encoder
3 * Copyright (c) 2000,2001 Fabrice Bellard
4 * H.263+ support.
5 * Copyright (c) 2001 Juan J. Sierralta P
6 * Copyright (c) 2002-2004 Michael Niedermayer <michaelni@gmx.at>
7 *
8 * This file is part of FFmpeg.
9 *
10 * FFmpeg is free software; you can redistribute it and/or
11 * modify it under the terms of the GNU Lesser General Public
12 * License as published by the Free Software Foundation; either
13 * version 2.1 of the License, or (at your option) any later version.
14 *
15 * FFmpeg is distributed in the hope that it will be useful,
16 * but WITHOUT ANY WARRANTY; without even the implied warranty of
17 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
18 * Lesser General Public License for more details.
19 *
20 * You should have received a copy of the GNU Lesser General Public
21 * License along with FFmpeg; if not, write to the Free Software
22 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
23 */
24
25 /**
26 * @file
27 * H.263 bitstream encoder.
28 */
29
30 #include "config_components.h"
31
32 #include <limits.h>
33 #include <string.h>
34
35 #include "libavutil/attributes.h"
36 #include "libavutil/thread.h"
37 #include "avcodec.h"
38 #include "codec_internal.h"
39 #include "mpegvideo.h"
40 #include "flvenc.h"
41 #include "mpegvideoenc.h"
42 #include "h263.h"
43 #include "h263enc.h"
44 #include "h263data.h"
45 #include "h263dsp.h"
46 #include "mathops.h"
47 #include "mpegutils.h"
48 #include "internal.h"
49
50 /**
51 * Table of number of bits a motion vector component needs.
52 */
53 static uint8_t mv_penalty[MAX_FCODE+1][MAX_DMV*2+1];
54
55 /**
56 * Minimal fcode that a motion vector component would need in umv.
57 * All entries in this table are 1.
58 */
59 static uint8_t umv_fcode_tab[MAX_MV*2+1];
60
61 //unified encoding tables for run length encoding of coefficients
62 //unified in the sense that the specification specifies the encoding in several steps.
63 static uint8_t uni_h263_intra_aic_rl_len [64*64*2*2];
64 static uint8_t uni_h263_inter_rl_len [64*64*2*2];
65 //#define UNI_MPEG4_ENC_INDEX(last,run,level) ((last)*128 + (run)*256 + (level))
66 //#define UNI_MPEG4_ENC_INDEX(last,run,level) ((last)*128*64 + (run) + (level)*64)
67 #define UNI_MPEG4_ENC_INDEX(last,run,level) ((last)*128*64 + (run)*128 + (level))
68
69 118 static av_cold void init_mv_penalty_and_fcode(void)
70 {
71
2/2
✓ Branch 0 taken 826 times.
✓ Branch 1 taken 118 times.
944 for (int f_code = 1; f_code <= MAX_FCODE; f_code++) {
72
2/2
✓ Branch 0 taken 13534010 times.
✓ Branch 1 taken 826 times.
13534836 for (int mv = -MAX_DMV; mv <= MAX_DMV; mv++) {
73 int len;
74
75
2/2
✓ Branch 0 taken 826 times.
✓ Branch 1 taken 13533184 times.
13534010 if (mv == 0) len = 1; // ff_mvtab[0][1]
76 else {
77 int val, bit_size, code;
78
79 13533184 bit_size = f_code - 1;
80
81 13533184 val = mv;
82
2/2
✓ Branch 0 taken 6766592 times.
✓ Branch 1 taken 6766592 times.
13533184 if (val < 0)
83 6766592 val = -val;
84 13533184 val--;
85 13533184 code = (val >> bit_size) + 1;
86
2/2
✓ Branch 0 taken 959104 times.
✓ Branch 1 taken 12574080 times.
13533184 if (code < 33) {
87 959104 len = ff_mvtab[code][1] + 1 + bit_size;
88 } else {
89 12574080 len = 12 /* ff_mvtab[32][1] */ + av_log2(code>>5) + 2 + bit_size;
90 }
91 }
92
93 13534010 mv_penalty[f_code][mv + MAX_DMV] = len;
94 }
95 }
96
97 118 memset(umv_fcode_tab, 1, sizeof(umv_fcode_tab));
98 118 }
99
100 236 static av_cold void init_uni_h263_rl_tab(const RLTable *rl, uint8_t *len_tab)
101 {
102 av_assert0(MAX_LEVEL >= 64);
103 av_assert0(MAX_RUN >= 63);
104
105
2/2
✓ Branch 0 taken 30208 times.
✓ Branch 1 taken 236 times.
30444 for (int slevel = -64; slevel < 64; slevel++) {
106
2/2
✓ Branch 0 taken 236 times.
✓ Branch 1 taken 29972 times.
30208 if (slevel == 0) continue;
107
2/2
✓ Branch 0 taken 1918208 times.
✓ Branch 1 taken 29972 times.
1948180 for (int run = 0; run < 64; run++) {
108
2/2
✓ Branch 0 taken 3836416 times.
✓ Branch 1 taken 1918208 times.
5754624 for (int last = 0; last <= 1; last++) {
109 3836416 const int index = UNI_MPEG4_ENC_INDEX(last, run, slevel + 64);
110 3836416 int level = slevel < 0 ? -slevel : slevel;
111 3836416 int sign = slevel < 0 ? 1 : 0;
112 int bits, len, code;
113
114 3836416 len_tab[index] = 100;
115
116 /* ESC0 */
117 3836416 code = get_rl_index(rl, last, run, level);
118 3836416 bits = rl->table_vlc[code][0];
119 3836416 len = rl->table_vlc[code][1];
120 3836416 bits = bits * 2 + sign;
121 3836416 len++;
122
123
3/4
✓ Branch 0 taken 48144 times.
✓ Branch 1 taken 3788272 times.
✓ Branch 2 taken 48144 times.
✗ Branch 3 not taken.
3836416 if (code != rl->n && len < len_tab[index])
124 48144 len_tab[index] = len;
125
126 /* ESC */
127 3836416 bits = rl->table_vlc[rl->n][0];
128 3836416 len = rl->table_vlc[rl->n][1];
129 3836416 bits = bits * 2 + last; len++;
130 3836416 bits = bits * 64 + run; len += 6;
131 3836416 bits = bits * 256 + (level & 0xff); len += 8;
132
133
2/2
✓ Branch 0 taken 3788272 times.
✓ Branch 1 taken 48144 times.
3836416 if (len < len_tab[index])
134 3788272 len_tab[index] = len;
135 }
136 }
137 }
138 236 }
139
140 118 static av_cold void h263_encode_init_static(void)
141 {
142 static uint8_t rl_intra_table[2][2 * MAX_RUN + MAX_LEVEL + 3];
143
144 118 ff_rl_init(&ff_rl_intra_aic, rl_intra_table);
145 118 ff_h263_init_rl_inter();
146
147 118 init_uni_h263_rl_tab(&ff_rl_intra_aic, uni_h263_intra_aic_rl_len);
148 118 init_uni_h263_rl_tab(&ff_h263_rl_inter, uni_h263_inter_rl_len);
149
150 118 init_mv_penalty_and_fcode();
151 118 }
152
153 118 av_cold const uint8_t (*ff_h263_get_mv_penalty(void))[MAX_DMV*2+1]
154 {
155 static AVOnce init_static_once = AV_ONCE_INIT;
156
157 118 ff_thread_once(&init_static_once, h263_encode_init_static);
158
159 118 return mv_penalty;
160 }
161
162 5426330 void ff_h263_encode_motion(PutBitContext *pb, int val, int f_code)
163 {
164
2/2
✓ Branch 0 taken 2272448 times.
✓ Branch 1 taken 3153882 times.
5426330 if (val == 0) {
165 /* zero vector -- corresponds to ff_mvtab[0] */
166 2272448 put_bits(pb, 1, 1);
167 } else {
168 int sign, code, bits;
169 3153882 int bit_size = f_code - 1;
170 3153882 int range = 1 << bit_size;
171 /* modulo encoding */
172 3153882 val = sign_extend(val, 6 + bit_size);
173 3153882 sign = val>>31;
174 3153882 val= (val^sign)-sign;
175 3153882 sign&=1;
176
177 3153882 val--;
178 3153882 code = (val >> bit_size) + 1;
179 3153882 bits = val & (range - 1);
180
181 3153882 put_bits(pb, ff_mvtab[code][1] + 1, (ff_mvtab[code][0] << 1) | sign);
182
2/2
✓ Branch 0 taken 428549 times.
✓ Branch 1 taken 2725333 times.
3153882 if (bit_size > 0) {
183 428549 put_bits(pb, bit_size, bits);
184 }
185 }
186 5426330 }
187
188 #if CONFIG_H263_ENCODER // Snow and SVQ1 need the above
189 static const uint8_t wrong_run[102] = {
190 1, 2, 3, 5, 4, 10, 9, 8,
191 11, 15, 17, 16, 23, 22, 21, 20,
192 19, 18, 25, 24, 27, 26, 11, 7,
193 6, 1, 2, 13, 2, 2, 2, 2,
194 6, 12, 3, 9, 1, 3, 4, 3,
195 7, 4, 1, 1, 5, 5, 14, 6,
196 1, 7, 1, 8, 1, 1, 1, 1,
197 10, 1, 1, 5, 9, 17, 25, 24,
198 29, 33, 32, 41, 2, 23, 28, 31,
199 3, 22, 30, 4, 27, 40, 8, 26,
200 6, 39, 7, 38, 16, 37, 15, 10,
201 11, 12, 13, 14, 1, 21, 20, 18,
202 19, 2, 1, 34, 35, 36
203 };
204
205 /**
206 * Return the 4 bit value that specifies the given aspect ratio.
207 * This may be one of the standard aspect ratios or it specifies
208 * that the aspect will be stored explicitly later.
209 */
210 222 av_const int ff_h263_aspect_to_info(AVRational aspect){
211 int i;
212
213
3/4
✓ Branch 0 taken 9 times.
✓ Branch 1 taken 213 times.
✗ Branch 2 not taken.
✓ Branch 3 taken 9 times.
222 if(aspect.num==0 || aspect.den==0) aspect= (AVRational){1,1};
214
215
1/2
✓ Branch 0 taken 222 times.
✗ Branch 1 not taken.
222 for(i=1; i<6; i++){
216
1/2
✓ Branch 1 taken 222 times.
✗ Branch 2 not taken.
222 if(av_cmp_q(ff_h263_pixel_aspect[i], aspect) == 0){
217 222 return i;
218 }
219 }
220
221 return FF_ASPECT_EXTENDED;
222 }
223
224 450 void ff_h263_encode_picture_header(MpegEncContext * s)
225 {
226 int format, coded_frame_rate, coded_frame_rate_base, i, temp_ref;
227 450 int best_clock_code=1;
228 450 int best_divisor=60;
229 450 int best_error= INT_MAX;
230 int custom_pcf;
231
232
2/2
✓ Branch 0 taken 150 times.
✓ Branch 1 taken 300 times.
450 if(s->h263_plus){
233
2/2
✓ Branch 0 taken 300 times.
✓ Branch 1 taken 150 times.
450 for(i=0; i<2; i++){
234 int div, error;
235 300 div= (s->avctx->time_base.num*1800000LL + 500LL*s->avctx->time_base.den) / ((1000LL+i)*s->avctx->time_base.den);
236 300 div= av_clip(div, 1, 127);
237
2/2
✓ Branch 0 taken 150 times.
✓ Branch 1 taken 150 times.
300 error= FFABS(s->avctx->time_base.num*1800000LL - (1000LL+i)*s->avctx->time_base.den*div);
238
2/2
✓ Branch 0 taken 150 times.
✓ Branch 1 taken 150 times.
300 if(error < best_error){
239 150 best_error= error;
240 150 best_divisor= div;
241 150 best_clock_code= i;
242 }
243 }
244 }
245
3/4
✓ Branch 0 taken 300 times.
✓ Branch 1 taken 150 times.
✗ Branch 2 not taken.
✓ Branch 3 taken 300 times.
450 custom_pcf = best_clock_code != 1 || best_divisor != 60;
246 450 coded_frame_rate= 1800000;
247 450 coded_frame_rate_base= (1000+best_clock_code)*best_divisor;
248
249 450 align_put_bits(&s->pb);
250
251 /* Update the pointer to last GOB */
252 450 s->ptr_lastgob = put_bits_ptr(&s->pb);
253 450 put_bits(&s->pb, 22, 0x20); /* PSC */
254 450 temp_ref= s->picture_number * (int64_t)coded_frame_rate * s->avctx->time_base.num / //FIXME use timestamp
255 450 (coded_frame_rate_base * (int64_t)s->avctx->time_base.den);
256 450 put_sbits(&s->pb, 8, temp_ref); /* TemporalReference */
257
258 450 put_bits(&s->pb, 1, 1); /* marker */
259 450 put_bits(&s->pb, 1, 0); /* H.263 id */
260 450 put_bits(&s->pb, 1, 0); /* split screen off */
261 450 put_bits(&s->pb, 1, 0); /* camera off */
262 450 put_bits(&s->pb, 1, 0); /* freeze picture release off */
263
264 450 format = ff_match_2uint16(ff_h263_format, FF_ARRAY_ELEMS(ff_h263_format), s->width, s->height);
265
2/2
✓ Branch 0 taken 300 times.
✓ Branch 1 taken 150 times.
450 if (!s->h263_plus) {
266 /* H.263v1 */
267 300 put_bits(&s->pb, 3, format);
268 300 put_bits(&s->pb, 1, (s->pict_type == AV_PICTURE_TYPE_P));
269 /* By now UMV IS DISABLED ON H.263v1, since the restrictions
270 of H.263v1 UMV implies to check the predicted MV after
271 calculation of the current MB to see if we're on the limits */
272 300 put_bits(&s->pb, 1, 0); /* Unrestricted Motion Vector: off */
273 300 put_bits(&s->pb, 1, 0); /* SAC: off */
274 300 put_bits(&s->pb, 1, s->obmc); /* Advanced Prediction */
275 300 put_bits(&s->pb, 1, 0); /* only I/P-frames, no PB-frame */
276 300 put_bits(&s->pb, 5, s->qscale);
277 300 put_bits(&s->pb, 1, 0); /* Continuous Presence Multipoint mode: off */
278 } else {
279 150 int ufep=1;
280 /* H.263v2 */
281 /* H.263 Plus PTYPE */
282
283 150 put_bits(&s->pb, 3, 7);
284 150 put_bits(&s->pb,3,ufep); /* Update Full Extended PTYPE */
285
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 150 times.
150 if (format == 8)
286 put_bits(&s->pb,3,6); /* Custom Source Format */
287 else
288 150 put_bits(&s->pb, 3, format);
289
290 150 put_bits(&s->pb,1, custom_pcf);
291 150 put_bits(&s->pb,1, s->umvplus); /* Unrestricted Motion Vector */
292 150 put_bits(&s->pb,1,0); /* SAC: off */
293 150 put_bits(&s->pb,1,s->obmc); /* Advanced Prediction Mode */
294 150 put_bits(&s->pb,1,s->h263_aic); /* Advanced Intra Coding */
295 150 put_bits(&s->pb,1,s->loop_filter); /* Deblocking Filter */
296 150 put_bits(&s->pb,1,s->h263_slice_structured); /* Slice Structured */
297 150 put_bits(&s->pb,1,0); /* Reference Picture Selection: off */
298 150 put_bits(&s->pb,1,0); /* Independent Segment Decoding: off */
299 150 put_bits(&s->pb,1,s->alt_inter_vlc); /* Alternative Inter VLC */
300 150 put_bits(&s->pb,1,s->modified_quant); /* Modified Quantization: */
301 150 put_bits(&s->pb,1,1); /* "1" to prevent start code emulation */
302 150 put_bits(&s->pb,3,0); /* Reserved */
303
304 150 put_bits(&s->pb, 3, s->pict_type == AV_PICTURE_TYPE_P);
305
306 150 put_bits(&s->pb,1,0); /* Reference Picture Resampling: off */
307 150 put_bits(&s->pb,1,0); /* Reduced-Resolution Update: off */
308 150 put_bits(&s->pb,1,s->no_rounding); /* Rounding Type */
309 150 put_bits(&s->pb,2,0); /* Reserved */
310 150 put_bits(&s->pb,1,1); /* "1" to prevent start code emulation */
311
312 /* This should be here if PLUSPTYPE */
313 150 put_bits(&s->pb, 1, 0); /* Continuous Presence Multipoint mode: off */
314
315
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 150 times.
150 if (format == 8) {
316 /* Custom Picture Format (CPFMT) */
317 unsigned aspect_ratio_info = ff_h263_aspect_to_info(s->avctx->sample_aspect_ratio);
318
319 put_bits(&s->pb,4, aspect_ratio_info);
320 put_bits(&s->pb,9,(s->width >> 2) - 1);
321 put_bits(&s->pb,1,1); /* "1" to prevent start code emulation */
322 put_bits(&s->pb,9,(s->height >> 2));
323 if (aspect_ratio_info == FF_ASPECT_EXTENDED){
324 put_bits(&s->pb, 8, s->avctx->sample_aspect_ratio.num);
325 put_bits(&s->pb, 8, s->avctx->sample_aspect_ratio.den);
326 }
327 }
328
1/2
✓ Branch 0 taken 150 times.
✗ Branch 1 not taken.
150 if (custom_pcf) {
329
1/2
✓ Branch 0 taken 150 times.
✗ Branch 1 not taken.
150 if(ufep){
330 150 put_bits(&s->pb, 1, best_clock_code);
331 150 put_bits(&s->pb, 7, best_divisor);
332 }
333 150 put_sbits(&s->pb, 2, temp_ref>>8);
334 }
335
336 /* Unlimited Unrestricted Motion Vectors Indicator (UUI) */
337
1/2
✓ Branch 0 taken 150 times.
✗ Branch 1 not taken.
150 if (s->umvplus)
338 // put_bits(&s->pb,1,1); /* Limited according tables of Annex D */
339 //FIXME check actual requested range
340 150 put_bits(&s->pb,2,1); /* unlimited */
341
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 150 times.
150 if(s->h263_slice_structured)
342 put_bits(&s->pb,2,0); /* no weird submodes */
343
344 150 put_bits(&s->pb, 5, s->qscale);
345 }
346
347 450 put_bits(&s->pb, 1, 0); /* no PEI */
348
349
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 450 times.
450 if(s->h263_slice_structured){
350 put_bits(&s->pb, 1, 1);
351
352 av_assert1(s->mb_x == 0 && s->mb_y == 0);
353 ff_h263_encode_mba(s);
354
355 put_bits(&s->pb, 1, 1);
356 }
357 450 }
358
359 /**
360 * Encode a group of blocks header.
361 */
362 2544 void ff_h263_encode_gob_header(MpegEncContext * s, int mb_line)
363 {
364 2544 put_bits(&s->pb, 17, 1); /* GBSC */
365
366
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 2544 times.
2544 if(s->h263_slice_structured){
367 put_bits(&s->pb, 1, 1);
368
369 ff_h263_encode_mba(s);
370
371 if(s->mb_num > 1583)
372 put_bits(&s->pb, 1, 1);
373 put_bits(&s->pb, 5, s->qscale); /* GQUANT */
374 put_bits(&s->pb, 1, 1);
375 put_bits(&s->pb, 2, s->pict_type == AV_PICTURE_TYPE_I); /* GFID */
376 }else{
377 2544 int gob_number= mb_line / s->gob_index;
378
379 2544 put_bits(&s->pb, 5, gob_number); /* GN */
380 2544 put_bits(&s->pb, 2, s->pict_type == AV_PICTURE_TYPE_I); /* GFID */
381 2544 put_bits(&s->pb, 5, s->qscale); /* GQUANT */
382 }
383 2544 }
384
385 /**
386 * modify qscale so that encoding is actually possible in H.263 (limit difference to -2..2)
387 */
388 400 void ff_clean_h263_qscales(MpegEncContext *s){
389 int i;
390 400 int8_t * const qscale_table = s->cur_pic.qscale_table;
391
392
2/2
✓ Branch 0 taken 119300 times.
✓ Branch 1 taken 400 times.
119700 for(i=1; i<s->mb_num; i++){
393
2/2
✓ Branch 0 taken 3531 times.
✓ Branch 1 taken 115769 times.
119300 if(qscale_table[ s->mb_index2xy[i] ] - qscale_table[ s->mb_index2xy[i-1] ] >2)
394 3531 qscale_table[ s->mb_index2xy[i] ]= qscale_table[ s->mb_index2xy[i-1] ]+2;
395 }
396
2/2
✓ Branch 0 taken 119300 times.
✓ Branch 1 taken 400 times.
119700 for(i=s->mb_num-2; i>=0; i--){
397
2/2
✓ Branch 0 taken 2965 times.
✓ Branch 1 taken 116335 times.
119300 if(qscale_table[ s->mb_index2xy[i] ] - qscale_table[ s->mb_index2xy[i+1] ] >2)
398 2965 qscale_table[ s->mb_index2xy[i] ]= qscale_table[ s->mb_index2xy[i+1] ]+2;
399 }
400
401
1/2
✓ Branch 0 taken 400 times.
✗ Branch 1 not taken.
400 if(s->codec_id != AV_CODEC_ID_H263P){
402
2/2
✓ Branch 0 taken 119300 times.
✓ Branch 1 taken 400 times.
119700 for(i=1; i<s->mb_num; i++){
403 119300 int mb_xy= s->mb_index2xy[i];
404
405
4/4
✓ Branch 0 taken 32193 times.
✓ Branch 1 taken 87107 times.
✓ Branch 2 taken 7147 times.
✓ Branch 3 taken 25046 times.
119300 if(qscale_table[mb_xy] != qscale_table[s->mb_index2xy[i-1]] && (s->mb_type[mb_xy]&CANDIDATE_MB_TYPE_INTER4V)){
406 7147 s->mb_type[mb_xy]|= CANDIDATE_MB_TYPE_INTER;
407 }
408 }
409 }
410 400 }
411
412 static const int dquant_code[5]= {1,0,9,2,3};
413
414 /**
415 * Encode an 8x8 block.
416 * @param block the 8x8 block
417 * @param n block index (0-3 are luma, 4-5 are chroma)
418 */
419 2388636 static void h263_encode_block(MpegEncContext * s, int16_t * block, int n)
420 {
421 int level, run, last, i, j, last_index, last_non_zero, sign, slevel, code;
422 const RLTable *rl;
423
424 2388636 rl = &ff_h263_rl_inter;
425
4/4
✓ Branch 0 taken 348792 times.
✓ Branch 1 taken 2039844 times.
✓ Branch 2 taken 266694 times.
✓ Branch 3 taken 82098 times.
2388636 if (s->mb_intra && !s->h263_aic) {
426 /* DC coef */
427 266694 level = block[0];
428 /* 255 cannot be represented, so we clamp */
429
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 266694 times.
266694 if (level > 254) {
430 level = 254;
431 block[0] = 254;
432 }
433 /* 0 cannot be represented also */
434
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 266694 times.
266694 else if (level < 1) {
435 level = 1;
436 block[0] = 1;
437 }
438
2/2
✓ Branch 0 taken 5826 times.
✓ Branch 1 taken 260868 times.
266694 if (level == 128) //FIXME check rv10
439 5826 put_bits(&s->pb, 8, 0xff);
440 else
441 260868 put_bits(&s->pb, 8, level);
442 266694 i = 1;
443 } else {
444 2121942 i = 0;
445
4/4
✓ Branch 0 taken 391992 times.
✓ Branch 1 taken 1729950 times.
✓ Branch 2 taken 82098 times.
✓ Branch 3 taken 309894 times.
2121942 if (s->h263_aic && s->mb_intra)
446 82098 rl = &ff_rl_intra_aic;
447
448
4/4
✓ Branch 0 taken 356352 times.
✓ Branch 1 taken 1765590 times.
✓ Branch 2 taken 309894 times.
✓ Branch 3 taken 46458 times.
2121942 if(s->alt_inter_vlc && !s->mb_intra){
449 309894 int aic_vlc_bits=0;
450 309894 int inter_vlc_bits=0;
451 309894 int wrong_pos=-1;
452 int aic_code;
453
454 309894 last_index = s->block_last_index[n];
455 309894 last_non_zero = i - 1;
456
2/2
✓ Branch 0 taken 9817100 times.
✓ Branch 1 taken 309894 times.
10126994 for (; i <= last_index; i++) {
457 9817100 j = s->intra_scantable.permutated[i];
458 9817100 level = block[j];
459
2/2
✓ Branch 0 taken 3646040 times.
✓ Branch 1 taken 6171060 times.
9817100 if (level) {
460 3646040 run = i - last_non_zero - 1;
461 3646040 last = (i == last_index);
462
463
2/2
✓ Branch 0 taken 1800387 times.
✓ Branch 1 taken 1845653 times.
3646040 if(level<0) level= -level;
464
465 3646040 code = get_rl_index(rl, last, run, level);
466 3646040 aic_code = get_rl_index(&ff_rl_intra_aic, last, run, level);
467 3646040 inter_vlc_bits += rl->table_vlc[code][1]+1;
468 3646040 aic_vlc_bits += ff_rl_intra_aic.table_vlc[aic_code][1]+1;
469
470
2/2
✓ Branch 0 taken 238217 times.
✓ Branch 1 taken 3407823 times.
3646040 if (code == rl->n) {
471 238217 inter_vlc_bits += 1+6+8-1;
472 }
473
2/2
✓ Branch 0 taken 160580 times.
✓ Branch 1 taken 3485460 times.
3646040 if (aic_code == ff_rl_intra_aic.n) {
474 160580 aic_vlc_bits += 1+6+8-1;
475 160580 wrong_pos += run + 1;
476 }else
477 3485460 wrong_pos += wrong_run[aic_code];
478 3646040 last_non_zero = i;
479 }
480 }
481 309894 i = 0;
482
4/4
✓ Branch 0 taken 102063 times.
✓ Branch 1 taken 207831 times.
✓ Branch 2 taken 66459 times.
✓ Branch 3 taken 35604 times.
309894 if(aic_vlc_bits < inter_vlc_bits && wrong_pos > 63)
483 66459 rl = &ff_rl_intra_aic;
484 }
485 }
486
487 /* AC coefs */
488 2388636 last_index = s->block_last_index[n];
489 2388636 last_non_zero = i - 1;
490
2/2
✓ Branch 0 taken 37329308 times.
✓ Branch 1 taken 2388636 times.
39717944 for (; i <= last_index; i++) {
491 37329308 j = s->intra_scantable.permutated[i];
492 37329308 level = block[j];
493
2/2
✓ Branch 0 taken 11712914 times.
✓ Branch 1 taken 25616394 times.
37329308 if (level) {
494 11712914 run = i - last_non_zero - 1;
495 11712914 last = (i == last_index);
496 11712914 sign = 0;
497 11712914 slevel = level;
498
2/2
✓ Branch 0 taken 5838423 times.
✓ Branch 1 taken 5874491 times.
11712914 if (level < 0) {
499 5838423 sign = 1;
500 5838423 level = -level;
501 }
502 11712914 code = get_rl_index(rl, last, run, level);
503 11712914 put_bits(&s->pb, rl->table_vlc[code][1], rl->table_vlc[code][0]);
504
2/2
✓ Branch 0 taken 590306 times.
✓ Branch 1 taken 11122608 times.
11712914 if (code == rl->n) {
505
2/2
✓ Branch 0 taken 402806 times.
✓ Branch 1 taken 187500 times.
590306 if(!CONFIG_FLV_ENCODER || s->h263_flv <= 1){
506 402806 put_bits(&s->pb, 1, last);
507 402806 put_bits(&s->pb, 6, run);
508
509 av_assert2(slevel != 0);
510
511
2/2
✓ Branch 0 taken 400394 times.
✓ Branch 1 taken 2412 times.
402806 if(level < 128)
512 400394 put_sbits(&s->pb, 8, slevel);
513 else{
514 2412 put_bits(&s->pb, 8, 128);
515 2412 put_sbits(&s->pb, 5, slevel);
516 2412 put_sbits(&s->pb, 6, slevel>>5);
517 }
518 }else{
519 187500 ff_flv2_encode_ac_esc(&s->pb, slevel, level, run, last);
520 }
521 } else {
522 11122608 put_bits(&s->pb, 1, sign);
523 }
524 11712914 last_non_zero = i;
525 }
526 }
527 2388636 }
528
529 /* Encode MV differences on H.263+ with Unrestricted MV mode */
530 103298 static void h263p_encode_umotion(PutBitContext *pb, int val)
531 {
532 103298 short sval = 0;
533 103298 short i = 0;
534 103298 short n_bits = 0;
535 short temp_val;
536 103298 int code = 0;
537 int tcode;
538
539
2/2
✓ Branch 0 taken 51255 times.
✓ Branch 1 taken 52043 times.
103298 if ( val == 0)
540 51255 put_bits(pb, 1, 1);
541
2/2
✓ Branch 0 taken 12904 times.
✓ Branch 1 taken 39139 times.
52043 else if (val == 1)
542 12904 put_bits(pb, 3, 0);
543
2/2
✓ Branch 0 taken 20988 times.
✓ Branch 1 taken 18151 times.
39139 else if (val == -1)
544 20988 put_bits(pb, 3, 2);
545 else {
546
547
2/2
✓ Branch 0 taken 9429 times.
✓ Branch 1 taken 8722 times.
18151 sval = ((val < 0) ? (short)(-val):(short)val);
548 18151 temp_val = sval;
549
550
2/2
✓ Branch 0 taken 46910 times.
✓ Branch 1 taken 18151 times.
65061 while (temp_val != 0) {
551 46910 temp_val = temp_val >> 1;
552 46910 n_bits++;
553 }
554
555 18151 i = n_bits - 1;
556
2/2
✓ Branch 0 taken 28759 times.
✓ Branch 1 taken 18151 times.
46910 while (i > 0) {
557 28759 tcode = (sval & (1 << (i-1))) >> (i-1);
558 28759 tcode = (tcode << 1) | 1;
559 28759 code = (code << 2) | tcode;
560 28759 i--;
561 }
562 18151 code = ((code << 1) | (val < 0)) << 1;
563 18151 put_bits(pb, (2*n_bits)+1, code);
564 }
565 103298 }
566
567 82098 static int h263_pred_dc(MpegEncContext * s, int n, int16_t **dc_val_ptr)
568 {
569 int x, y, wrap, a, c, pred_dc;
570 int16_t *dc_val;
571
572 /* find prediction */
573
2/2
✓ Branch 0 taken 54732 times.
✓ Branch 1 taken 27366 times.
82098 if (n < 4) {
574 54732 x = 2 * s->mb_x + (n & 1);
575 54732 y = 2 * s->mb_y + ((n & 2) >> 1);
576 54732 wrap = s->b8_stride;
577 54732 dc_val = s->dc_val[0];
578 } else {
579 27366 x = s->mb_x;
580 27366 y = s->mb_y;
581 27366 wrap = s->mb_stride;
582 27366 dc_val = s->dc_val[n - 4 + 1];
583 }
584 /* B C
585 * A X
586 */
587 82098 a = dc_val[(x - 1) + (y) * wrap];
588 82098 c = dc_val[(x) + (y - 1) * wrap];
589
590 /* No prediction outside GOB boundary */
591
4/4
✓ Branch 0 taken 48438 times.
✓ Branch 1 taken 33660 times.
✓ Branch 2 taken 40365 times.
✓ Branch 3 taken 8073 times.
82098 if (s->first_slice_line && n != 3) {
592
2/2
✓ Branch 0 taken 32292 times.
✓ Branch 1 taken 8073 times.
40365 if (n != 2) c = 1024;
593
4/4
✓ Branch 0 taken 32292 times.
✓ Branch 1 taken 8073 times.
✓ Branch 2 taken 1140 times.
✓ Branch 3 taken 31152 times.
40365 if (n != 1 && s->mb_x == s->resync_mb_x) a = 1024;
594 }
595 /* just DC prediction */
596
4/4
✓ Branch 0 taken 76882 times.
✓ Branch 1 taken 5216 times.
✓ Branch 2 taken 47737 times.
✓ Branch 3 taken 29145 times.
82098 if (a != 1024 && c != 1024)
597 47737 pred_dc = (a + c) >> 1;
598
2/2
✓ Branch 0 taken 29145 times.
✓ Branch 1 taken 5216 times.
34361 else if (a != 1024)
599 29145 pred_dc = a;
600 else
601 5216 pred_dc = c;
602
603 /* we assume pred is positive */
604 82098 *dc_val_ptr = &dc_val[x + y * wrap];
605 82098 return pred_dc;
606 }
607
608 428550 void ff_h263_encode_mb(MpegEncContext * s,
609 int16_t block[6][64],
610 int motion_x, int motion_y)
611 {
612 int cbpc, cbpy, i, cbp, pred_x, pred_y;
613 int16_t pred_dc;
614 int16_t rec_intradc[6];
615 int16_t *dc_ptr[6];
616 428550 const int interleaved_stats = s->avctx->flags & AV_CODEC_FLAG_PASS1;
617
618
2/2
✓ Branch 0 taken 370418 times.
✓ Branch 1 taken 58132 times.
428550 if (!s->mb_intra) {
619 /* compute cbp */
620 370418 cbp= get_p_cbp(s, block, motion_x, motion_y);
621
622
2/2
✓ Branch 0 taken 30444 times.
✓ Branch 1 taken 339974 times.
370418 if ((cbp | motion_x | motion_y | s->dquant | (s->mv_type - MV_TYPE_16X16)) == 0) {
623 /* skip macroblock */
624 30444 put_bits(&s->pb, 1, 1);
625
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 30444 times.
30444 if(interleaved_stats){
626 s->misc_bits++;
627 s->last_bits++;
628 }
629
630 30444 return;
631 }
632 339974 put_bits(&s->pb, 1, 0); /* mb coded */
633
634 339974 cbpc = cbp & 3;
635 339974 cbpy = cbp >> 2;
636
4/4
✓ Branch 0 taken 51649 times.
✓ Branch 1 taken 288325 times.
✓ Branch 2 taken 13805 times.
✓ Branch 3 taken 37844 times.
339974 if(s->alt_inter_vlc==0 || cbpc!=3)
637 302130 cbpy ^= 0xF;
638
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 339974 times.
339974 if(s->dquant) cbpc+= 8;
639
1/2
✓ Branch 0 taken 339974 times.
✗ Branch 1 not taken.
339974 if(s->mv_type==MV_TYPE_16X16){
640 339974 put_bits(&s->pb,
641 339974 ff_h263_inter_MCBPC_bits[cbpc],
642 339974 ff_h263_inter_MCBPC_code[cbpc]);
643
644 339974 put_bits(&s->pb, ff_h263_cbpy_tab[cbpy][1], ff_h263_cbpy_tab[cbpy][0]);
645
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 339974 times.
339974 if(s->dquant)
646 put_bits(&s->pb, 2, dquant_code[s->dquant+2]);
647
648
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 339974 times.
339974 if(interleaved_stats){
649 s->misc_bits+= get_bits_diff(s);
650 }
651
652 /* motion vectors: 16x16 mode */
653 339974 ff_h263_pred_motion(s, 0, 0, &pred_x, &pred_y);
654
655
2/2
✓ Branch 0 taken 288325 times.
✓ Branch 1 taken 51649 times.
339974 if (!s->umvplus) {
656 288325 ff_h263_encode_motion_vector(s, motion_x - pred_x,
657 motion_y - pred_y, 1);
658 }
659 else {
660 51649 h263p_encode_umotion(&s->pb, motion_x - pred_x);
661 51649 h263p_encode_umotion(&s->pb, motion_y - pred_y);
662
4/4
✓ Branch 0 taken 10131 times.
✓ Branch 1 taken 41518 times.
✓ Branch 2 taken 340 times.
✓ Branch 3 taken 9791 times.
51649 if (((motion_x - pred_x) == 1) && ((motion_y - pred_y) == 1))
663 /* To prevent Start Code emulation */
664 340 put_bits(&s->pb,1,1);
665 }
666 }else{
667 put_bits(&s->pb,
668 ff_h263_inter_MCBPC_bits[cbpc+16],
669 ff_h263_inter_MCBPC_code[cbpc+16]);
670 put_bits(&s->pb, ff_h263_cbpy_tab[cbpy][1], ff_h263_cbpy_tab[cbpy][0]);
671 if(s->dquant)
672 put_bits(&s->pb, 2, dquant_code[s->dquant+2]);
673
674 if(interleaved_stats){
675 s->misc_bits+= get_bits_diff(s);
676 }
677
678 for(i=0; i<4; i++){
679 /* motion vectors: 8x8 mode*/
680 ff_h263_pred_motion(s, i, 0, &pred_x, &pred_y);
681
682 motion_x = s->cur_pic.motion_val[0][s->block_index[i]][0];
683 motion_y = s->cur_pic.motion_val[0][s->block_index[i]][1];
684 if (!s->umvplus) {
685 ff_h263_encode_motion_vector(s, motion_x - pred_x,
686 motion_y - pred_y, 1);
687 }
688 else {
689 h263p_encode_umotion(&s->pb, motion_x - pred_x);
690 h263p_encode_umotion(&s->pb, motion_y - pred_y);
691 if (((motion_x - pred_x) == 1) && ((motion_y - pred_y) == 1))
692 /* To prevent Start Code emulation */
693 put_bits(&s->pb,1,1);
694 }
695 }
696 }
697
698
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 339974 times.
339974 if(interleaved_stats){
699 s->mv_bits+= get_bits_diff(s);
700 }
701 } else {
702 av_assert2(s->mb_intra);
703
704 58132 cbp = 0;
705
2/2
✓ Branch 0 taken 13683 times.
✓ Branch 1 taken 44449 times.
58132 if (s->h263_aic) {
706 /* Predict DC */
707
2/2
✓ Branch 0 taken 82098 times.
✓ Branch 1 taken 13683 times.
95781 for(i=0; i<6; i++) {
708 82098 int16_t level = block[i][0];
709 int scale;
710
711
2/2
✓ Branch 0 taken 54732 times.
✓ Branch 1 taken 27366 times.
82098 if(i<4) scale= s->y_dc_scale;
712 27366 else scale= s->c_dc_scale;
713
714 82098 pred_dc = h263_pred_dc(s, i, &dc_ptr[i]);
715 82098 level -= pred_dc;
716 /* Quant */
717
2/2
✓ Branch 0 taken 43407 times.
✓ Branch 1 taken 38691 times.
82098 if (level >= 0)
718 43407 level = (level + (scale>>1))/scale;
719 else
720 38691 level = (level - (scale>>1))/scale;
721
722
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 82098 times.
82098 if(!s->modified_quant){
723 if (level < -127)
724 level = -127;
725 else if (level > 127)
726 level = 127;
727 }
728
729 82098 block[i][0] = level;
730 /* Reconstruction */
731 82098 rec_intradc[i] = scale*level + pred_dc;
732 /* Oddify */
733 82098 rec_intradc[i] |= 1;
734 //if ((rec_intradc[i] % 2) == 0)
735 // rec_intradc[i]++;
736 /* Clipping */
737
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 82098 times.
82098 if (rec_intradc[i] < 0)
738 rec_intradc[i] = 0;
739
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 82098 times.
82098 else if (rec_intradc[i] > 2047)
740 rec_intradc[i] = 2047;
741
742 /* Update AC/DC tables */
743 82098 *dc_ptr[i] = rec_intradc[i];
744 /* AIC can change CBP */
745
2/2
✓ Branch 0 taken 6224 times.
✓ Branch 1 taken 75874 times.
82098 if (s->block_last_index[i] > 0 ||
746
3/4
✓ Branch 0 taken 6224 times.
✗ Branch 1 not taken.
✓ Branch 2 taken 4973 times.
✓ Branch 3 taken 1251 times.
6224 (s->block_last_index[i] == 0 && level !=0))
747 80847 cbp |= 1 << (5 - i);
748 }
749 }else{
750
2/2
✓ Branch 0 taken 266694 times.
✓ Branch 1 taken 44449 times.
311143 for(i=0; i<6; i++) {
751 /* compute cbp */
752
2/2
✓ Branch 0 taken 206994 times.
✓ Branch 1 taken 59700 times.
266694 if (s->block_last_index[i] >= 1)
753 206994 cbp |= 1 << (5 - i);
754 }
755 }
756
757 58132 cbpc = cbp & 3;
758
2/2
✓ Branch 0 taken 45249 times.
✓ Branch 1 taken 12883 times.
58132 if (s->pict_type == AV_PICTURE_TYPE_I) {
759
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 45249 times.
45249 if(s->dquant) cbpc+=4;
760 45249 put_bits(&s->pb,
761 45249 ff_h263_intra_MCBPC_bits[cbpc],
762 45249 ff_h263_intra_MCBPC_code[cbpc]);
763 } else {
764
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 12883 times.
12883 if(s->dquant) cbpc+=8;
765 12883 put_bits(&s->pb, 1, 0); /* mb coded */
766 12883 put_bits(&s->pb,
767 12883 ff_h263_inter_MCBPC_bits[cbpc + 4],
768 12883 ff_h263_inter_MCBPC_code[cbpc + 4]);
769 }
770
2/2
✓ Branch 0 taken 13683 times.
✓ Branch 1 taken 44449 times.
58132 if (s->h263_aic) {
771 /* XXX: currently, we do not try to use ac prediction */
772 13683 put_bits(&s->pb, 1, 0); /* no AC prediction */
773 }
774 58132 cbpy = cbp >> 2;
775 58132 put_bits(&s->pb, ff_h263_cbpy_tab[cbpy][1], ff_h263_cbpy_tab[cbpy][0]);
776
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 58132 times.
58132 if(s->dquant)
777 put_bits(&s->pb, 2, dquant_code[s->dquant+2]);
778
779
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 58132 times.
58132 if(interleaved_stats){
780 s->misc_bits+= get_bits_diff(s);
781 }
782 }
783
784
2/2
✓ Branch 0 taken 2388636 times.
✓ Branch 1 taken 398106 times.
2786742 for(i=0; i<6; i++) {
785 /* encode each block */
786 2388636 h263_encode_block(s, block[i], i);
787
788 /* Update INTRADC for decoding */
789
4/4
✓ Branch 0 taken 391992 times.
✓ Branch 1 taken 1996644 times.
✓ Branch 2 taken 82098 times.
✓ Branch 3 taken 309894 times.
2388636 if (s->h263_aic && s->mb_intra) {
790 82098 block[i][0] = rec_intradc[i];
791
792 }
793 }
794
795
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 398106 times.
398106 if(interleaved_stats){
796 if (!s->mb_intra) {
797 s->p_tex_bits+= get_bits_diff(s);
798 }else{
799 s->i_tex_bits+= get_bits_diff(s);
800 s->i_count++;
801 }
802 }
803 }
804
805 1369095 void ff_h263_update_mb(MpegEncContext *s)
806 {
807 1369095 const int mb_xy = s->mb_y * s->mb_stride + s->mb_x;
808
809
2/2
✓ Branch 0 taken 691245 times.
✓ Branch 1 taken 677850 times.
1369095 if (s->cur_pic.mbskip_table)
810 691245 s->cur_pic.mbskip_table[mb_xy] = s->mb_skipped;
811
812
2/2
✓ Branch 0 taken 79473 times.
✓ Branch 1 taken 1289622 times.
1369095 if (s->mv_type == MV_TYPE_8X8)
813 79473 s->cur_pic.mb_type[mb_xy] = MB_TYPE_FORWARD_MV | MB_TYPE_8x8;
814
2/2
✓ Branch 0 taken 220986 times.
✓ Branch 1 taken 1068636 times.
1289622 else if(s->mb_intra)
815 220986 s->cur_pic.mb_type[mb_xy] = MB_TYPE_INTRA;
816 else
817 1068636 s->cur_pic.mb_type[mb_xy] = MB_TYPE_FORWARD_MV | MB_TYPE_16x16;
818
819 1369095 ff_h263_update_motion_val(s);
820 1369095 }
821
822 103 av_cold void ff_h263_encode_init(MpegEncContext *s)
823 {
824 103 s->me.mv_penalty = ff_h263_get_mv_penalty(); // FIXME exact table for MSMPEG4 & H.263+
825
826 103 s->intra_ac_vlc_length =s->inter_ac_vlc_length = uni_h263_inter_rl_len;
827 103 s->intra_ac_vlc_last_length=s->inter_ac_vlc_last_length= uni_h263_inter_rl_len + 128*64;
828
2/2
✓ Branch 0 taken 6 times.
✓ Branch 1 taken 97 times.
103 if(s->h263_aic){
829 6 s->intra_ac_vlc_length = uni_h263_intra_aic_rl_len;
830 6 s->intra_ac_vlc_last_length= uni_h263_intra_aic_rl_len + 128*64;
831
832 6 s->y_dc_scale_table =
833 6 s->c_dc_scale_table = ff_aic_dc_scale_table;
834 }
835 103 s->ac_esc_length= 7+1+6+8;
836
837
2/2
✓ Branch 0 taken 6 times.
✓ Branch 1 taken 97 times.
103 if (s->modified_quant)
838 6 s->chroma_qscale_table = ff_h263_chroma_qscale_table;
839
840 // use fcodes >1 only for MPEG-4 & H.263 & H.263+ FIXME
841
4/4
✓ Branch 0 taken 63 times.
✓ Branch 1 taken 3 times.
✓ Branch 2 taken 7 times.
✓ Branch 3 taken 30 times.
103 switch(s->codec_id){
842 63 case AV_CODEC_ID_MPEG4:
843 63 break;
844 3 case AV_CODEC_ID_H263P:
845
1/2
✓ Branch 0 taken 3 times.
✗ Branch 1 not taken.
3 if(s->umvplus)
846 3 s->fcode_tab = umv_fcode_tab + MAX_MV;
847
1/2
✓ Branch 0 taken 3 times.
✗ Branch 1 not taken.
3 if(s->modified_quant){
848 3 s->min_qcoeff= -2047;
849 3 s->max_qcoeff= 2047;
850 }else{
851 s->min_qcoeff= -127;
852 s->max_qcoeff= 127;
853 }
854 3 break;
855 // Note for MPEG-4 & H.263 the dc-scale table will be set per frame as needed later
856 7 case AV_CODEC_ID_FLV1:
857
1/2
✓ Branch 0 taken 7 times.
✗ Branch 1 not taken.
7 if (s->h263_flv > 1) {
858 7 s->min_qcoeff= -1023;
859 7 s->max_qcoeff= 1023;
860 } else {
861 s->min_qcoeff= -127;
862 s->max_qcoeff= 127;
863 }
864 7 break;
865 30 default: //nothing needed - default table already set in mpegvideo.c
866 30 s->min_qcoeff= -127;
867 30 s->max_qcoeff= 127;
868 }
869
870 103 ff_h263dsp_init(&s->h263dsp);
871 103 }
872
873 150 void ff_h263_encode_mba(MpegEncContext *s)
874 {
875 int i, mb_pos;
876
877
1/2
✓ Branch 0 taken 450 times.
✗ Branch 1 not taken.
450 for(i=0; i<6; i++){
878
2/2
✓ Branch 0 taken 150 times.
✓ Branch 1 taken 300 times.
450 if(s->mb_num-1 <= ff_mba_max[i]) break;
879 }
880 150 mb_pos= s->mb_x + s->mb_width*s->mb_y;
881 150 put_bits(&s->pb, ff_mba_length[i], mb_pos);
882 150 }
883
884 #define OFFSET(x) offsetof(MpegEncContext, x)
885 #define VE AV_OPT_FLAG_VIDEO_PARAM | AV_OPT_FLAG_ENCODING_PARAM
886 static const AVOption h263_options[] = {
887 { "obmc", "use overlapped block motion compensation.", OFFSET(obmc), AV_OPT_TYPE_BOOL, { .i64 = 0 }, 0, 1, VE },
888 { "mb_info", "emit macroblock info for RFC 2190 packetization, the parameter value is the maximum payload size", OFFSET(mb_info), AV_OPT_TYPE_INT, { .i64 = 0 }, 0, INT_MAX, VE },
889 FF_MPV_COMMON_OPTS
890 FF_MPV_COMMON_MOTION_EST_OPTS
891 { NULL },
892 };
893
894 static const AVClass h263_class = {
895 .class_name = "H.263 encoder",
896 .item_name = av_default_item_name,
897 .option = h263_options,
898 .version = LIBAVUTIL_VERSION_INT,
899 };
900
901 const FFCodec ff_h263_encoder = {
902 .p.name = "h263",
903 CODEC_LONG_NAME("H.263 / H.263-1996"),
904 .p.type = AVMEDIA_TYPE_VIDEO,
905 .p.id = AV_CODEC_ID_H263,
906 .p.pix_fmts = (const enum AVPixelFormat[]){AV_PIX_FMT_YUV420P, AV_PIX_FMT_NONE},
907 .color_ranges = AVCOL_RANGE_MPEG,
908 .p.priv_class = &h263_class,
909 .p.capabilities = AV_CODEC_CAP_DR1 | AV_CODEC_CAP_ENCODER_REORDERED_OPAQUE,
910 .caps_internal = FF_CODEC_CAP_INIT_CLEANUP,
911 .priv_data_size = sizeof(MpegEncContext),
912 .init = ff_mpv_encode_init,
913 FF_CODEC_ENCODE_CB(ff_mpv_encode_picture),
914 .close = ff_mpv_encode_end,
915 };
916
917 static const AVOption h263p_options[] = {
918 { "umv", "Use unlimited motion vectors.", OFFSET(umvplus), AV_OPT_TYPE_BOOL, { .i64 = 0 }, 0, 1, VE },
919 { "aiv", "Use alternative inter VLC.", OFFSET(alt_inter_vlc), AV_OPT_TYPE_BOOL, { .i64 = 0 }, 0, 1, VE },
920 { "obmc", "use overlapped block motion compensation.", OFFSET(obmc), AV_OPT_TYPE_BOOL, { .i64 = 0 }, 0, 1, VE },
921 { "structured_slices", "Write slice start position at every GOB header instead of just GOB number.", OFFSET(h263_slice_structured), AV_OPT_TYPE_BOOL, { .i64 = 0 }, 0, 1, VE},
922 FF_MPV_COMMON_OPTS
923 FF_MPV_COMMON_MOTION_EST_OPTS
924 { NULL },
925 };
926 static const AVClass h263p_class = {
927 .class_name = "H.263p encoder",
928 .item_name = av_default_item_name,
929 .option = h263p_options,
930 .version = LIBAVUTIL_VERSION_INT,
931 };
932
933 const FFCodec ff_h263p_encoder = {
934 .p.name = "h263p",
935 CODEC_LONG_NAME("H.263+ / H.263-1998 / H.263 version 2"),
936 .p.type = AVMEDIA_TYPE_VIDEO,
937 .p.id = AV_CODEC_ID_H263P,
938 .p.pix_fmts = (const enum AVPixelFormat[]){ AV_PIX_FMT_YUV420P, AV_PIX_FMT_NONE },
939 .color_ranges = AVCOL_RANGE_MPEG,
940 .p.priv_class = &h263p_class,
941 .p.capabilities = AV_CODEC_CAP_DR1 | AV_CODEC_CAP_SLICE_THREADS |
942 AV_CODEC_CAP_ENCODER_REORDERED_OPAQUE,
943 .caps_internal = FF_CODEC_CAP_INIT_CLEANUP,
944 .priv_data_size = sizeof(MpegEncContext),
945 .init = ff_mpv_encode_init,
946 FF_CODEC_ENCODE_CB(ff_mpv_encode_picture),
947 .close = ff_mpv_encode_end,
948 };
949 #endif
950