2 * ITU H.263 bitstream encoder
3 * Copyright (c) 2000,2001 Fabrice Bellard
5 * Copyright (c) 2001 Juan J. Sierralta P
6 * Copyright (c) 2002-2004 Michael Niedermayer <michaelni@gmx.at>
8 * This file is part of FFmpeg.
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.
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.
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
27 * H.263 bitstream encoder.
30 #include "config_components.h"
34 #include "libavutil/attributes.h"
35 #include "libavutil/thread.h"
37 #include "codec_internal.h"
38 #include "mpegvideo.h"
39 #include "mpegvideodata.h"
41 #include "mpegvideoenc.h"
47 #include "mpegutils.h"
51 * Table of number of bits a motion vector component needs.
53 static uint8_t mv_penalty
[MAX_FCODE
+1][MAX_DMV
*2+1];
56 * Minimal fcode that a motion vector component would need.
58 static uint8_t fcode_tab
[MAX_MV
*2+1];
61 * Minimal fcode that a motion vector component would need in umv.
62 * All entries in this table are 1.
64 static uint8_t umv_fcode_tab
[MAX_MV
*2+1];
66 //unified encoding tables for run length encoding of coefficients
67 //unified in the sense that the specification specifies the encoding in several steps.
68 static uint8_t uni_h263_intra_aic_rl_len
[64*64*2*2];
69 static uint8_t uni_h263_inter_rl_len
[64*64*2*2];
70 //#define UNI_MPEG4_ENC_INDEX(last,run,level) ((last)*128 + (run)*256 + (level))
71 //#define UNI_MPEG4_ENC_INDEX(last,run,level) ((last)*128*64 + (run) + (level)*64)
72 #define UNI_MPEG4_ENC_INDEX(last,run,level) ((last)*128*64 + (run)*128 + (level))
74 static const uint8_t wrong_run
[102] = {
75 1, 2, 3, 5, 4, 10, 9, 8,
76 11, 15, 17, 16, 23, 22, 21, 20,
77 19, 18, 25, 24, 27, 26, 11, 7,
78 6, 1, 2, 13, 2, 2, 2, 2,
79 6, 12, 3, 9, 1, 3, 4, 3,
80 7, 4, 1, 1, 5, 5, 14, 6,
81 1, 7, 1, 8, 1, 1, 1, 1,
82 10, 1, 1, 5, 9, 17, 25, 24,
83 29, 33, 32, 41, 2, 23, 28, 31,
84 3, 22, 30, 4, 27, 40, 8, 26,
85 6, 39, 7, 38, 16, 37, 15, 10,
86 11, 12, 13, 14, 1, 21, 20, 18,
91 * Return the 4 bit value that specifies the given aspect ratio.
92 * This may be one of the standard aspect ratios or it specifies
93 * that the aspect will be stored explicitly later.
95 av_const
int ff_h263_aspect_to_info(AVRational aspect
){
98 if(aspect
.num
==0 || aspect
.den
==0) aspect
= (AVRational
){1,1};
101 if(av_cmp_q(ff_h263_pixel_aspect
[i
], aspect
) == 0){
106 return FF_ASPECT_EXTENDED
;
109 void ff_h263_encode_picture_header(MpegEncContext
* s
)
111 int format
, coded_frame_rate
, coded_frame_rate_base
, i
, temp_ref
;
112 int best_clock_code
=1;
114 int best_error
= INT_MAX
;
120 div
= (s
->avctx
->time_base
.num
*1800000LL + 500LL*s
->avctx
->time_base
.den
) / ((1000LL+i
)*s
->avctx
->time_base
.den
);
121 div
= av_clip(div
, 1, 127);
122 error
= FFABS(s
->avctx
->time_base
.num
*1800000LL - (1000LL+i
)*s
->avctx
->time_base
.den
*div
);
123 if(error
< best_error
){
130 custom_pcf
= best_clock_code
!= 1 || best_divisor
!= 60;
131 coded_frame_rate
= 1800000;
132 coded_frame_rate_base
= (1000+best_clock_code
)*best_divisor
;
134 align_put_bits(&s
->pb
);
136 /* Update the pointer to last GOB */
137 s
->ptr_lastgob
= put_bits_ptr(&s
->pb
);
138 put_bits(&s
->pb
, 22, 0x20); /* PSC */
139 temp_ref
= s
->picture_number
* (int64_t)coded_frame_rate
* s
->avctx
->time_base
.num
/ //FIXME use timestamp
140 (coded_frame_rate_base
* (int64_t)s
->avctx
->time_base
.den
);
141 put_sbits(&s
->pb
, 8, temp_ref
); /* TemporalReference */
143 put_bits(&s
->pb
, 1, 1); /* marker */
144 put_bits(&s
->pb
, 1, 0); /* H.263 id */
145 put_bits(&s
->pb
, 1, 0); /* split screen off */
146 put_bits(&s
->pb
, 1, 0); /* camera off */
147 put_bits(&s
->pb
, 1, 0); /* freeze picture release off */
149 format
= ff_match_2uint16(ff_h263_format
, FF_ARRAY_ELEMS(ff_h263_format
), s
->width
, s
->height
);
152 put_bits(&s
->pb
, 3, format
);
153 put_bits(&s
->pb
, 1, (s
->pict_type
== AV_PICTURE_TYPE_P
));
154 /* By now UMV IS DISABLED ON H.263v1, since the restrictions
155 of H.263v1 UMV implies to check the predicted MV after
156 calculation of the current MB to see if we're on the limits */
157 put_bits(&s
->pb
, 1, 0); /* Unrestricted Motion Vector: off */
158 put_bits(&s
->pb
, 1, 0); /* SAC: off */
159 put_bits(&s
->pb
, 1, s
->obmc
); /* Advanced Prediction */
160 put_bits(&s
->pb
, 1, 0); /* only I/P-frames, no PB-frame */
161 put_bits(&s
->pb
, 5, s
->qscale
);
162 put_bits(&s
->pb
, 1, 0); /* Continuous Presence Multipoint mode: off */
166 /* H.263 Plus PTYPE */
168 put_bits(&s
->pb
, 3, 7);
169 put_bits(&s
->pb
,3,ufep
); /* Update Full Extended PTYPE */
171 put_bits(&s
->pb
,3,6); /* Custom Source Format */
173 put_bits(&s
->pb
, 3, format
);
175 put_bits(&s
->pb
,1, custom_pcf
);
176 put_bits(&s
->pb
,1, s
->umvplus
); /* Unrestricted Motion Vector */
177 put_bits(&s
->pb
,1,0); /* SAC: off */
178 put_bits(&s
->pb
,1,s
->obmc
); /* Advanced Prediction Mode */
179 put_bits(&s
->pb
,1,s
->h263_aic
); /* Advanced Intra Coding */
180 put_bits(&s
->pb
,1,s
->loop_filter
); /* Deblocking Filter */
181 put_bits(&s
->pb
,1,s
->h263_slice_structured
); /* Slice Structured */
182 put_bits(&s
->pb
,1,0); /* Reference Picture Selection: off */
183 put_bits(&s
->pb
,1,0); /* Independent Segment Decoding: off */
184 put_bits(&s
->pb
,1,s
->alt_inter_vlc
); /* Alternative Inter VLC */
185 put_bits(&s
->pb
,1,s
->modified_quant
); /* Modified Quantization: */
186 put_bits(&s
->pb
,1,1); /* "1" to prevent start code emulation */
187 put_bits(&s
->pb
,3,0); /* Reserved */
189 put_bits(&s
->pb
, 3, s
->pict_type
== AV_PICTURE_TYPE_P
);
191 put_bits(&s
->pb
,1,0); /* Reference Picture Resampling: off */
192 put_bits(&s
->pb
,1,0); /* Reduced-Resolution Update: off */
193 put_bits(&s
->pb
,1,s
->no_rounding
); /* Rounding Type */
194 put_bits(&s
->pb
,2,0); /* Reserved */
195 put_bits(&s
->pb
,1,1); /* "1" to prevent start code emulation */
197 /* This should be here if PLUSPTYPE */
198 put_bits(&s
->pb
, 1, 0); /* Continuous Presence Multipoint mode: off */
201 /* Custom Picture Format (CPFMT) */
202 unsigned aspect_ratio_info
= ff_h263_aspect_to_info(s
->avctx
->sample_aspect_ratio
);
204 put_bits(&s
->pb
,4, aspect_ratio_info
);
205 put_bits(&s
->pb
,9,(s
->width
>> 2) - 1);
206 put_bits(&s
->pb
,1,1); /* "1" to prevent start code emulation */
207 put_bits(&s
->pb
,9,(s
->height
>> 2));
208 if (aspect_ratio_info
== FF_ASPECT_EXTENDED
){
209 put_bits(&s
->pb
, 8, s
->avctx
->sample_aspect_ratio
.num
);
210 put_bits(&s
->pb
, 8, s
->avctx
->sample_aspect_ratio
.den
);
215 put_bits(&s
->pb
, 1, best_clock_code
);
216 put_bits(&s
->pb
, 7, best_divisor
);
218 put_sbits(&s
->pb
, 2, temp_ref
>>8);
221 /* Unlimited Unrestricted Motion Vectors Indicator (UUI) */
223 // put_bits(&s->pb,1,1); /* Limited according tables of Annex D */
224 //FIXME check actual requested range
225 put_bits(&s
->pb
,2,1); /* unlimited */
226 if(s
->h263_slice_structured
)
227 put_bits(&s
->pb
,2,0); /* no weird submodes */
229 put_bits(&s
->pb
, 5, s
->qscale
);
232 put_bits(&s
->pb
, 1, 0); /* no PEI */
234 if(s
->h263_slice_structured
){
235 put_bits(&s
->pb
, 1, 1);
237 av_assert1(s
->mb_x
== 0 && s
->mb_y
== 0);
238 ff_h263_encode_mba(s
);
240 put_bits(&s
->pb
, 1, 1);
245 * Encode a group of blocks header.
247 void ff_h263_encode_gob_header(MpegEncContext
* s
, int mb_line
)
249 put_bits(&s
->pb
, 17, 1); /* GBSC */
251 if(s
->h263_slice_structured
){
252 put_bits(&s
->pb
, 1, 1);
254 ff_h263_encode_mba(s
);
257 put_bits(&s
->pb
, 1, 1);
258 put_bits(&s
->pb
, 5, s
->qscale
); /* GQUANT */
259 put_bits(&s
->pb
, 1, 1);
260 put_bits(&s
->pb
, 2, s
->pict_type
== AV_PICTURE_TYPE_I
); /* GFID */
262 int gob_number
= mb_line
/ s
->gob_index
;
264 put_bits(&s
->pb
, 5, gob_number
); /* GN */
265 put_bits(&s
->pb
, 2, s
->pict_type
== AV_PICTURE_TYPE_I
); /* GFID */
266 put_bits(&s
->pb
, 5, s
->qscale
); /* GQUANT */
271 * modify qscale so that encoding is actually possible in H.263 (limit difference to -2..2)
273 void ff_clean_h263_qscales(MpegEncContext
*s
){
275 int8_t * const qscale_table
= s
->cur_pic
.qscale_table
;
277 for(i
=1; i
<s
->mb_num
; i
++){
278 if(qscale_table
[ s
->mb_index2xy
[i
] ] - qscale_table
[ s
->mb_index2xy
[i
-1] ] >2)
279 qscale_table
[ s
->mb_index2xy
[i
] ]= qscale_table
[ s
->mb_index2xy
[i
-1] ]+2;
281 for(i
=s
->mb_num
-2; i
>=0; i
--){
282 if(qscale_table
[ s
->mb_index2xy
[i
] ] - qscale_table
[ s
->mb_index2xy
[i
+1] ] >2)
283 qscale_table
[ s
->mb_index2xy
[i
] ]= qscale_table
[ s
->mb_index2xy
[i
+1] ]+2;
286 if(s
->codec_id
!= AV_CODEC_ID_H263P
){
287 for(i
=1; i
<s
->mb_num
; i
++){
288 int mb_xy
= s
->mb_index2xy
[i
];
290 if(qscale_table
[mb_xy
] != qscale_table
[s
->mb_index2xy
[i
-1]] && (s
->mb_type
[mb_xy
]&CANDIDATE_MB_TYPE_INTER4V
)){
291 s
->mb_type
[mb_xy
]|= CANDIDATE_MB_TYPE_INTER
;
297 static const int dquant_code
[5]= {1,0,9,2,3};
300 * Encode an 8x8 block.
301 * @param block the 8x8 block
302 * @param n block index (0-3 are luma, 4-5 are chroma)
304 static void h263_encode_block(MpegEncContext
* s
, int16_t * block
, int n
)
306 int level
, run
, last
, i
, j
, last_index
, last_non_zero
, sign
, slevel
, code
;
309 rl
= &ff_h263_rl_inter
;
310 if (s
->mb_intra
&& !s
->h263_aic
) {
313 /* 255 cannot be represented, so we clamp */
318 /* 0 cannot be represented also */
319 else if (level
< 1) {
323 if (level
== 128) //FIXME check rv10
324 put_bits(&s
->pb
, 8, 0xff);
326 put_bits(&s
->pb
, 8, level
);
330 if (s
->h263_aic
&& s
->mb_intra
)
331 rl
= &ff_rl_intra_aic
;
333 if(s
->alt_inter_vlc
&& !s
->mb_intra
){
335 int inter_vlc_bits
=0;
339 last_index
= s
->block_last_index
[n
];
340 last_non_zero
= i
- 1;
341 for (; i
<= last_index
; i
++) {
342 j
= s
->intra_scantable
.permutated
[i
];
345 run
= i
- last_non_zero
- 1;
346 last
= (i
== last_index
);
348 if(level
<0) level
= -level
;
350 code
= get_rl_index(rl
, last
, run
, level
);
351 aic_code
= get_rl_index(&ff_rl_intra_aic
, last
, run
, level
);
352 inter_vlc_bits
+= rl
->table_vlc
[code
][1]+1;
353 aic_vlc_bits
+= ff_rl_intra_aic
.table_vlc
[aic_code
][1]+1;
356 inter_vlc_bits
+= 1+6+8-1;
358 if (aic_code
== ff_rl_intra_aic
.n
) {
359 aic_vlc_bits
+= 1+6+8-1;
360 wrong_pos
+= run
+ 1;
362 wrong_pos
+= wrong_run
[aic_code
];
367 if(aic_vlc_bits
< inter_vlc_bits
&& wrong_pos
> 63)
368 rl
= &ff_rl_intra_aic
;
373 last_index
= s
->block_last_index
[n
];
374 last_non_zero
= i
- 1;
375 for (; i
<= last_index
; i
++) {
376 j
= s
->intra_scantable
.permutated
[i
];
379 run
= i
- last_non_zero
- 1;
380 last
= (i
== last_index
);
387 code
= get_rl_index(rl
, last
, run
, level
);
388 put_bits(&s
->pb
, rl
->table_vlc
[code
][1], rl
->table_vlc
[code
][0]);
390 if(!CONFIG_FLV_ENCODER
|| s
->h263_flv
<= 1){
391 put_bits(&s
->pb
, 1, last
);
392 put_bits(&s
->pb
, 6, run
);
394 av_assert2(slevel
!= 0);
397 put_sbits(&s
->pb
, 8, slevel
);
399 put_bits(&s
->pb
, 8, 128);
400 put_sbits(&s
->pb
, 5, slevel
);
401 put_sbits(&s
->pb
, 6, slevel
>>5);
404 ff_flv2_encode_ac_esc(&s
->pb
, slevel
, level
, run
, last
);
407 put_bits(&s
->pb
, 1, sign
);
414 /* Encode MV differences on H.263+ with Unrestricted MV mode */
415 static void h263p_encode_umotion(PutBitContext
*pb
, int val
)
432 sval
= ((val
< 0) ? (short)(-val
):(short)val
);
435 while (temp_val
!= 0) {
436 temp_val
= temp_val
>> 1;
442 tcode
= (sval
& (1 << (i
-1))) >> (i
-1);
443 tcode
= (tcode
<< 1) | 1;
444 code
= (code
<< 2) | tcode
;
447 code
= ((code
<< 1) | (val
< 0)) << 1;
448 put_bits(pb
, (2*n_bits
)+1, code
);
452 static int h263_pred_dc(MpegEncContext
* s
, int n
, int16_t **dc_val_ptr
)
454 int x
, y
, wrap
, a
, c
, pred_dc
;
457 /* find prediction */
459 x
= 2 * s
->mb_x
+ (n
& 1);
460 y
= 2 * s
->mb_y
+ ((n
& 2) >> 1);
462 dc_val
= s
->dc_val
[0];
467 dc_val
= s
->dc_val
[n
- 4 + 1];
472 a
= dc_val
[(x
- 1) + (y
) * wrap
];
473 c
= dc_val
[(x
) + (y
- 1) * wrap
];
475 /* No prediction outside GOB boundary */
476 if (s
->first_slice_line
&& n
!= 3) {
477 if (n
!= 2) c
= 1024;
478 if (n
!= 1 && s
->mb_x
== s
->resync_mb_x
) a
= 1024;
480 /* just DC prediction */
481 if (a
!= 1024 && c
!= 1024)
482 pred_dc
= (a
+ c
) >> 1;
488 /* we assume pred is positive */
489 *dc_val_ptr
= &dc_val
[x
+ y
* wrap
];
493 void ff_h263_encode_mb(MpegEncContext
* s
,
494 int16_t block
[6][64],
495 int motion_x
, int motion_y
)
497 int cbpc
, cbpy
, i
, cbp
, pred_x
, pred_y
;
499 int16_t rec_intradc
[6];
501 const int interleaved_stats
= s
->avctx
->flags
& AV_CODEC_FLAG_PASS1
;
505 cbp
= get_p_cbp(s
, block
, motion_x
, motion_y
);
507 if ((cbp
| motion_x
| motion_y
| s
->dquant
| (s
->mv_type
- MV_TYPE_16X16
)) == 0) {
508 /* skip macroblock */
509 put_bits(&s
->pb
, 1, 1);
510 if(interleaved_stats
){
517 put_bits(&s
->pb
, 1, 0); /* mb coded */
521 if(s
->alt_inter_vlc
==0 || cbpc
!=3)
523 if(s
->dquant
) cbpc
+= 8;
524 if(s
->mv_type
==MV_TYPE_16X16
){
526 ff_h263_inter_MCBPC_bits
[cbpc
],
527 ff_h263_inter_MCBPC_code
[cbpc
]);
529 put_bits(&s
->pb
, ff_h263_cbpy_tab
[cbpy
][1], ff_h263_cbpy_tab
[cbpy
][0]);
531 put_bits(&s
->pb
, 2, dquant_code
[s
->dquant
+2]);
533 if(interleaved_stats
){
534 s
->misc_bits
+= get_bits_diff(s
);
537 /* motion vectors: 16x16 mode */
538 ff_h263_pred_motion(s
, 0, 0, &pred_x
, &pred_y
);
541 ff_h263_encode_motion_vector(s
, motion_x
- pred_x
,
542 motion_y
- pred_y
, 1);
545 h263p_encode_umotion(&s
->pb
, motion_x
- pred_x
);
546 h263p_encode_umotion(&s
->pb
, motion_y
- pred_y
);
547 if (((motion_x
- pred_x
) == 1) && ((motion_y
- pred_y
) == 1))
548 /* To prevent Start Code emulation */
549 put_bits(&s
->pb
,1,1);
553 ff_h263_inter_MCBPC_bits
[cbpc
+16],
554 ff_h263_inter_MCBPC_code
[cbpc
+16]);
555 put_bits(&s
->pb
, ff_h263_cbpy_tab
[cbpy
][1], ff_h263_cbpy_tab
[cbpy
][0]);
557 put_bits(&s
->pb
, 2, dquant_code
[s
->dquant
+2]);
559 if(interleaved_stats
){
560 s
->misc_bits
+= get_bits_diff(s
);
564 /* motion vectors: 8x8 mode*/
565 ff_h263_pred_motion(s
, i
, 0, &pred_x
, &pred_y
);
567 motion_x
= s
->cur_pic
.motion_val
[0][s
->block_index
[i
]][0];
568 motion_y
= s
->cur_pic
.motion_val
[0][s
->block_index
[i
]][1];
570 ff_h263_encode_motion_vector(s
, motion_x
- pred_x
,
571 motion_y
- pred_y
, 1);
574 h263p_encode_umotion(&s
->pb
, motion_x
- pred_x
);
575 h263p_encode_umotion(&s
->pb
, motion_y
- pred_y
);
576 if (((motion_x
- pred_x
) == 1) && ((motion_y
- pred_y
) == 1))
577 /* To prevent Start Code emulation */
578 put_bits(&s
->pb
,1,1);
583 if(interleaved_stats
){
584 s
->mv_bits
+= get_bits_diff(s
);
587 av_assert2(s
->mb_intra
);
593 int16_t level
= block
[i
][0];
596 if(i
<4) scale
= s
->y_dc_scale
;
597 else scale
= s
->c_dc_scale
;
599 pred_dc
= h263_pred_dc(s
, i
, &dc_ptr
[i
]);
603 level
= (level
+ (scale
>>1))/scale
;
605 level
= (level
- (scale
>>1))/scale
;
607 if(!s
->modified_quant
){
610 else if (level
> 127)
616 rec_intradc
[i
] = scale
*level
+ pred_dc
;
619 //if ((rec_intradc[i] % 2) == 0)
622 if (rec_intradc
[i
] < 0)
624 else if (rec_intradc
[i
] > 2047)
625 rec_intradc
[i
] = 2047;
627 /* Update AC/DC tables */
628 *dc_ptr
[i
] = rec_intradc
[i
];
629 /* AIC can change CBP */
630 if (s
->block_last_index
[i
] > 0 ||
631 (s
->block_last_index
[i
] == 0 && level
!=0))
637 if (s
->block_last_index
[i
] >= 1)
643 if (s
->pict_type
== AV_PICTURE_TYPE_I
) {
644 if(s
->dquant
) cbpc
+=4;
646 ff_h263_intra_MCBPC_bits
[cbpc
],
647 ff_h263_intra_MCBPC_code
[cbpc
]);
649 if(s
->dquant
) cbpc
+=8;
650 put_bits(&s
->pb
, 1, 0); /* mb coded */
652 ff_h263_inter_MCBPC_bits
[cbpc
+ 4],
653 ff_h263_inter_MCBPC_code
[cbpc
+ 4]);
656 /* XXX: currently, we do not try to use ac prediction */
657 put_bits(&s
->pb
, 1, 0); /* no AC prediction */
660 put_bits(&s
->pb
, ff_h263_cbpy_tab
[cbpy
][1], ff_h263_cbpy_tab
[cbpy
][0]);
662 put_bits(&s
->pb
, 2, dquant_code
[s
->dquant
+2]);
664 if(interleaved_stats
){
665 s
->misc_bits
+= get_bits_diff(s
);
670 /* encode each block */
671 h263_encode_block(s
, block
[i
], i
);
673 /* Update INTRADC for decoding */
674 if (s
->h263_aic
&& s
->mb_intra
) {
675 block
[i
][0] = rec_intradc
[i
];
680 if(interleaved_stats
){
682 s
->p_tex_bits
+= get_bits_diff(s
);
684 s
->i_tex_bits
+= get_bits_diff(s
);
690 void ff_h263_update_mb(MpegEncContext
*s
)
692 const int mb_xy
= s
->mb_y
* s
->mb_stride
+ s
->mb_x
;
694 if (s
->cur_pic
.mbskip_table
)
695 s
->cur_pic
.mbskip_table
[mb_xy
] = s
->mb_skipped
;
697 if (s
->mv_type
== MV_TYPE_8X8
)
698 s
->cur_pic
.mb_type
[mb_xy
] = MB_TYPE_FORWARD_MV
| MB_TYPE_8x8
;
700 s
->cur_pic
.mb_type
[mb_xy
] = MB_TYPE_INTRA
;
702 s
->cur_pic
.mb_type
[mb_xy
] = MB_TYPE_FORWARD_MV
| MB_TYPE_16x16
;
704 ff_h263_update_motion_val(s
);
707 void ff_h263_encode_motion(PutBitContext
*pb
, int val
, int f_code
)
709 int range
, bit_size
, sign
, code
, bits
;
712 /* zero vector -- corresponds to ff_mvtab[0] */
715 bit_size
= f_code
- 1;
716 range
= 1 << bit_size
;
717 /* modulo encoding */
718 val
= sign_extend(val
, 6 + bit_size
);
720 val
= (val
^sign
)-sign
;
724 code
= (val
>> bit_size
) + 1;
725 bits
= val
& (range
- 1);
727 put_bits(pb
, ff_mvtab
[code
][1] + 1, (ff_mvtab
[code
][0] << 1) | sign
);
729 put_bits(pb
, bit_size
, bits
);
734 static av_cold
void init_mv_penalty_and_fcode(void)
739 for(f_code
=1; f_code
<=MAX_FCODE
; f_code
++){
740 for(mv
=-MAX_DMV
; mv
<=MAX_DMV
; mv
++){
743 if (mv
==0) len
= 1; // ff_mvtab[0][1]
745 int val
, bit_size
, code
;
747 bit_size
= f_code
- 1;
753 code
= (val
>> bit_size
) + 1;
755 len
= ff_mvtab
[code
][1] + 1 + bit_size
;
757 len
= 12 /* ff_mvtab[32][1] */ + av_log2(code
>>5) + 2 + bit_size
;
761 mv_penalty
[f_code
][mv
+MAX_DMV
]= len
;
765 for(f_code
=MAX_FCODE
; f_code
>0; f_code
--){
766 for(mv
=-(16<<f_code
); mv
<(16<<f_code
); mv
++){
767 fcode_tab
[mv
+MAX_MV
]= f_code
;
771 for(mv
=0; mv
<MAX_MV
*2+1; mv
++){
772 umv_fcode_tab
[mv
]= 1;
776 static av_cold
void init_uni_h263_rl_tab(const RLTable
*rl
, uint8_t *len_tab
)
778 int slevel
, run
, last
;
780 av_assert0(MAX_LEVEL
>= 64);
781 av_assert0(MAX_RUN
>= 63);
783 for(slevel
=-64; slevel
<64; slevel
++){
784 if(slevel
==0) continue;
785 for(run
=0; run
<64; run
++){
786 for(last
=0; last
<=1; last
++){
787 const int index
= UNI_MPEG4_ENC_INDEX(last
, run
, slevel
+64);
788 int level
= slevel
< 0 ? -slevel
: slevel
;
789 int sign
= slevel
< 0 ? 1 : 0;
795 code
= get_rl_index(rl
, last
, run
, level
);
796 bits
= rl
->table_vlc
[code
][0];
797 len
= rl
->table_vlc
[code
][1];
798 bits
=bits
*2+sign
; len
++;
800 if (code
!= rl
->n
&& len
< len_tab
[index
])
801 len_tab
[index
]= len
;
804 bits
= rl
->table_vlc
[rl
->n
][0];
805 len
= rl
->table_vlc
[rl
->n
][1];
806 bits
=bits
*2+last
; len
++;
807 bits
=bits
*64+run
; len
+=6;
808 bits
=bits
*256+(level
&0xff); len
+=8;
810 if (len
< len_tab
[index
])
811 len_tab
[index
]= len
;
817 static av_cold
void h263_encode_init_static(void)
819 static uint8_t rl_intra_table
[2][2 * MAX_RUN
+ MAX_LEVEL
+ 3];
821 ff_rl_init(&ff_rl_intra_aic
, rl_intra_table
);
822 ff_h263_init_rl_inter();
824 init_uni_h263_rl_tab(&ff_rl_intra_aic
, uni_h263_intra_aic_rl_len
);
825 init_uni_h263_rl_tab(&ff_h263_rl_inter
, uni_h263_inter_rl_len
);
827 init_mv_penalty_and_fcode();
830 av_cold
void ff_h263_encode_init(MpegEncContext
*s
)
832 static AVOnce init_static_once
= AV_ONCE_INIT
;
834 s
->me
.mv_penalty
= mv_penalty
; // FIXME exact table for MSMPEG4 & H.263+
836 s
->intra_ac_vlc_length
=s
->inter_ac_vlc_length
= uni_h263_inter_rl_len
;
837 s
->intra_ac_vlc_last_length
=s
->inter_ac_vlc_last_length
= uni_h263_inter_rl_len
+ 128*64;
839 s
->intra_ac_vlc_length
= uni_h263_intra_aic_rl_len
;
840 s
->intra_ac_vlc_last_length
= uni_h263_intra_aic_rl_len
+ 128*64;
842 s
->ac_esc_length
= 7+1+6+8;
844 // use fcodes >1 only for MPEG-4 & H.263 & H.263+ FIXME
846 case AV_CODEC_ID_MPEG4
:
847 s
->fcode_tab
= fcode_tab
;
849 case AV_CODEC_ID_H263P
:
851 s
->fcode_tab
= umv_fcode_tab
;
852 if(s
->modified_quant
){
853 s
->min_qcoeff
= -2047;
860 // Note for MPEG-4 & H.263 the dc-scale table will be set per frame as needed later
861 case AV_CODEC_ID_FLV1
:
862 if (s
->h263_flv
> 1) {
863 s
->min_qcoeff
= -1023;
870 default: //nothing needed - default table already set in mpegvideo.c
876 s
->c_dc_scale_table
= ff_aic_dc_scale_table
;
879 s
->c_dc_scale_table
= ff_mpeg1_dc_scale_table
;
882 #if CONFIG_H263_ENCODER // Snow and SVQ1 call this
883 ff_h263dsp_init(&s
->h263dsp
);
886 ff_thread_once(&init_static_once
, h263_encode_init_static
);
889 void ff_h263_encode_mba(MpegEncContext
*s
)
894 if(s
->mb_num
-1 <= ff_mba_max
[i
]) break;
896 mb_pos
= s
->mb_x
+ s
->mb_width
*s
->mb_y
;
897 put_bits(&s
->pb
, ff_mba_length
[i
], mb_pos
);
900 #define OFFSET(x) offsetof(MpegEncContext, x)
901 #define VE AV_OPT_FLAG_VIDEO_PARAM | AV_OPT_FLAG_ENCODING_PARAM
902 static const AVOption h263_options
[] = {
903 { "obmc", "use overlapped block motion compensation.", OFFSET(obmc
), AV_OPT_TYPE_BOOL
, { .i64
= 0 }, 0, 1, VE
},
904 { "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
},
906 FF_MPV_COMMON_MOTION_EST_OPTS
910 static const AVClass h263_class
= {
911 .class_name
= "H.263 encoder",
912 .item_name
= av_default_item_name
,
913 .option
= h263_options
,
914 .version
= LIBAVUTIL_VERSION_INT
,
917 const FFCodec ff_h263_encoder
= {
919 CODEC_LONG_NAME("H.263 / H.263-1996"),
920 .p
.type
= AVMEDIA_TYPE_VIDEO
,
921 .p
.id
= AV_CODEC_ID_H263
,
922 .p
.pix_fmts
= (const enum AVPixelFormat
[]){AV_PIX_FMT_YUV420P
, AV_PIX_FMT_NONE
},
923 .color_ranges
= AVCOL_RANGE_MPEG
,
924 .p
.priv_class
= &h263_class
,
925 .p
.capabilities
= AV_CODEC_CAP_ENCODER_REORDERED_OPAQUE
,
926 .caps_internal
= FF_CODEC_CAP_INIT_CLEANUP
,
927 .priv_data_size
= sizeof(MpegEncContext
),
928 .init
= ff_mpv_encode_init
,
929 FF_CODEC_ENCODE_CB(ff_mpv_encode_picture
),
930 .close
= ff_mpv_encode_end
,
933 static const AVOption h263p_options
[] = {
934 { "umv", "Use unlimited motion vectors.", OFFSET(umvplus
), AV_OPT_TYPE_BOOL
, { .i64
= 0 }, 0, 1, VE
},
935 { "aiv", "Use alternative inter VLC.", OFFSET(alt_inter_vlc
), AV_OPT_TYPE_BOOL
, { .i64
= 0 }, 0, 1, VE
},
936 { "obmc", "use overlapped block motion compensation.", OFFSET(obmc
), AV_OPT_TYPE_BOOL
, { .i64
= 0 }, 0, 1, VE
},
937 { "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
},
939 FF_MPV_COMMON_MOTION_EST_OPTS
942 static const AVClass h263p_class
= {
943 .class_name
= "H.263p encoder",
944 .item_name
= av_default_item_name
,
945 .option
= h263p_options
,
946 .version
= LIBAVUTIL_VERSION_INT
,
949 const FFCodec ff_h263p_encoder
= {
951 CODEC_LONG_NAME("H.263+ / H.263-1998 / H.263 version 2"),
952 .p
.type
= AVMEDIA_TYPE_VIDEO
,
953 .p
.id
= AV_CODEC_ID_H263P
,
954 .p
.pix_fmts
= (const enum AVPixelFormat
[]){ AV_PIX_FMT_YUV420P
, AV_PIX_FMT_NONE
},
955 .color_ranges
= AVCOL_RANGE_MPEG
,
956 .p
.priv_class
= &h263p_class
,
957 .p
.capabilities
= AV_CODEC_CAP_SLICE_THREADS
| AV_CODEC_CAP_ENCODER_REORDERED_OPAQUE
,
958 .caps_internal
= FF_CODEC_CAP_INIT_CLEANUP
,
959 .priv_data_size
= sizeof(MpegEncContext
),
960 .init
= ff_mpv_encode_init
,
961 FF_CODEC_ENCODE_CB(ff_mpv_encode_picture
),
962 .close
= ff_mpv_encode_end
,