avformat/mpeg: demux ivtv captions
[ffmpeg.git] / libavcodec / ituh263enc.c
blob8c41e45ab2691d395a6d466924382f1aa26b5b7e
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>
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
25 /**
26 * @file
27 * H.263 bitstream encoder.
30 #include "config_components.h"
32 #include <limits.h>
34 #include "libavutil/attributes.h"
35 #include "libavutil/thread.h"
36 #include "avcodec.h"
37 #include "codec_internal.h"
38 #include "mpegvideo.h"
39 #include "mpegvideodata.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"
50 /**
51 * Table of number of bits a motion vector component needs.
53 static uint8_t mv_penalty[MAX_FCODE+1][MAX_DMV*2+1];
55 /**
56 * Minimal fcode that a motion vector component would need.
58 static uint8_t fcode_tab[MAX_MV*2+1];
60 /**
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,
87 19, 2, 1, 34, 35, 36
90 /**
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){
96 int i;
98 if(aspect.num==0 || aspect.den==0) aspect= (AVRational){1,1};
100 for(i=1; i<6; i++){
101 if(av_cmp_q(ff_h263_pixel_aspect[i], aspect) == 0){
102 return i;
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;
113 int best_divisor=60;
114 int best_error= INT_MAX;
115 int custom_pcf;
117 if(s->h263_plus){
118 for(i=0; i<2; i++){
119 int div, error;
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){
124 best_error= error;
125 best_divisor= div;
126 best_clock_code= i;
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);
150 if (!s->h263_plus) {
151 /* H.263v1 */
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 */
163 } else {
164 int ufep=1;
165 /* H.263v2 */
166 /* H.263 Plus PTYPE */
168 put_bits(&s->pb, 3, 7);
169 put_bits(&s->pb,3,ufep); /* Update Full Extended PTYPE */
170 if (format == 8)
171 put_bits(&s->pb,3,6); /* Custom Source Format */
172 else
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 */
200 if (format == 8) {
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);
213 if (custom_pcf) {
214 if(ufep){
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) */
222 if (s->umvplus)
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);
256 if(s->mb_num > 1583)
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 */
261 }else{
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){
274 int i;
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;
307 const RLTable *rl;
309 rl = &ff_h263_rl_inter;
310 if (s->mb_intra && !s->h263_aic) {
311 /* DC coef */
312 level = block[0];
313 /* 255 cannot be represented, so we clamp */
314 if (level > 254) {
315 level = 254;
316 block[0] = 254;
318 /* 0 cannot be represented also */
319 else if (level < 1) {
320 level = 1;
321 block[0] = 1;
323 if (level == 128) //FIXME check rv10
324 put_bits(&s->pb, 8, 0xff);
325 else
326 put_bits(&s->pb, 8, level);
327 i = 1;
328 } else {
329 i = 0;
330 if (s->h263_aic && s->mb_intra)
331 rl = &ff_rl_intra_aic;
333 if(s->alt_inter_vlc && !s->mb_intra){
334 int aic_vlc_bits=0;
335 int inter_vlc_bits=0;
336 int wrong_pos=-1;
337 int aic_code;
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];
343 level = block[j];
344 if (level) {
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;
355 if (code == rl->n) {
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;
361 }else
362 wrong_pos += wrong_run[aic_code];
363 last_non_zero = i;
366 i = 0;
367 if(aic_vlc_bits < inter_vlc_bits && wrong_pos > 63)
368 rl = &ff_rl_intra_aic;
372 /* AC coefs */
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];
377 level = block[j];
378 if (level) {
379 run = i - last_non_zero - 1;
380 last = (i == last_index);
381 sign = 0;
382 slevel = level;
383 if (level < 0) {
384 sign = 1;
385 level = -level;
387 code = get_rl_index(rl, last, run, level);
388 put_bits(&s->pb, rl->table_vlc[code][1], rl->table_vlc[code][0]);
389 if (code == rl->n) {
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);
396 if(level < 128)
397 put_sbits(&s->pb, 8, slevel);
398 else{
399 put_bits(&s->pb, 8, 128);
400 put_sbits(&s->pb, 5, slevel);
401 put_sbits(&s->pb, 6, slevel>>5);
403 }else{
404 ff_flv2_encode_ac_esc(&s->pb, slevel, level, run, last);
406 } else {
407 put_bits(&s->pb, 1, sign);
409 last_non_zero = i;
414 /* Encode MV differences on H.263+ with Unrestricted MV mode */
415 static void h263p_encode_umotion(PutBitContext *pb, int val)
417 short sval = 0;
418 short i = 0;
419 short n_bits = 0;
420 short temp_val;
421 int code = 0;
422 int tcode;
424 if ( val == 0)
425 put_bits(pb, 1, 1);
426 else if (val == 1)
427 put_bits(pb, 3, 0);
428 else if (val == -1)
429 put_bits(pb, 3, 2);
430 else {
432 sval = ((val < 0) ? (short)(-val):(short)val);
433 temp_val = sval;
435 while (temp_val != 0) {
436 temp_val = temp_val >> 1;
437 n_bits++;
440 i = n_bits - 1;
441 while (i > 0) {
442 tcode = (sval & (1 << (i-1))) >> (i-1);
443 tcode = (tcode << 1) | 1;
444 code = (code << 2) | tcode;
445 i--;
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;
455 int16_t *dc_val;
457 /* find prediction */
458 if (n < 4) {
459 x = 2 * s->mb_x + (n & 1);
460 y = 2 * s->mb_y + ((n & 2) >> 1);
461 wrap = s->b8_stride;
462 dc_val = s->dc_val[0];
463 } else {
464 x = s->mb_x;
465 y = s->mb_y;
466 wrap = s->mb_stride;
467 dc_val = s->dc_val[n - 4 + 1];
469 /* B C
470 * A X
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;
483 else if (a != 1024)
484 pred_dc = a;
485 else
486 pred_dc = c;
488 /* we assume pred is positive */
489 *dc_val_ptr = &dc_val[x + y * wrap];
490 return pred_dc;
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;
498 int16_t pred_dc;
499 int16_t rec_intradc[6];
500 int16_t *dc_ptr[6];
501 const int interleaved_stats = s->avctx->flags & AV_CODEC_FLAG_PASS1;
503 if (!s->mb_intra) {
504 /* compute cbp */
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){
511 s->misc_bits++;
512 s->last_bits++;
515 return;
517 put_bits(&s->pb, 1, 0); /* mb coded */
519 cbpc = cbp & 3;
520 cbpy = cbp >> 2;
521 if(s->alt_inter_vlc==0 || cbpc!=3)
522 cbpy ^= 0xF;
523 if(s->dquant) cbpc+= 8;
524 if(s->mv_type==MV_TYPE_16X16){
525 put_bits(&s->pb,
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]);
530 if(s->dquant)
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);
540 if (!s->umvplus) {
541 ff_h263_encode_motion_vector(s, motion_x - pred_x,
542 motion_y - pred_y, 1);
544 else {
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);
551 }else{
552 put_bits(&s->pb,
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]);
556 if(s->dquant)
557 put_bits(&s->pb, 2, dquant_code[s->dquant+2]);
559 if(interleaved_stats){
560 s->misc_bits+= get_bits_diff(s);
563 for(i=0; i<4; i++){
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];
569 if (!s->umvplus) {
570 ff_h263_encode_motion_vector(s, motion_x - pred_x,
571 motion_y - pred_y, 1);
573 else {
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);
586 } else {
587 av_assert2(s->mb_intra);
589 cbp = 0;
590 if (s->h263_aic) {
591 /* Predict DC */
592 for(i=0; i<6; i++) {
593 int16_t level = block[i][0];
594 int scale;
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]);
600 level -= pred_dc;
601 /* Quant */
602 if (level >= 0)
603 level = (level + (scale>>1))/scale;
604 else
605 level = (level - (scale>>1))/scale;
607 if(!s->modified_quant){
608 if (level < -127)
609 level = -127;
610 else if (level > 127)
611 level = 127;
614 block[i][0] = level;
615 /* Reconstruction */
616 rec_intradc[i] = scale*level + pred_dc;
617 /* Oddify */
618 rec_intradc[i] |= 1;
619 //if ((rec_intradc[i] % 2) == 0)
620 // rec_intradc[i]++;
621 /* Clipping */
622 if (rec_intradc[i] < 0)
623 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))
632 cbp |= 1 << (5 - i);
634 }else{
635 for(i=0; i<6; i++) {
636 /* compute cbp */
637 if (s->block_last_index[i] >= 1)
638 cbp |= 1 << (5 - i);
642 cbpc = cbp & 3;
643 if (s->pict_type == AV_PICTURE_TYPE_I) {
644 if(s->dquant) cbpc+=4;
645 put_bits(&s->pb,
646 ff_h263_intra_MCBPC_bits[cbpc],
647 ff_h263_intra_MCBPC_code[cbpc]);
648 } else {
649 if(s->dquant) cbpc+=8;
650 put_bits(&s->pb, 1, 0); /* mb coded */
651 put_bits(&s->pb,
652 ff_h263_inter_MCBPC_bits[cbpc + 4],
653 ff_h263_inter_MCBPC_code[cbpc + 4]);
655 if (s->h263_aic) {
656 /* XXX: currently, we do not try to use ac prediction */
657 put_bits(&s->pb, 1, 0); /* no AC prediction */
659 cbpy = cbp >> 2;
660 put_bits(&s->pb, ff_h263_cbpy_tab[cbpy][1], ff_h263_cbpy_tab[cbpy][0]);
661 if(s->dquant)
662 put_bits(&s->pb, 2, dquant_code[s->dquant+2]);
664 if(interleaved_stats){
665 s->misc_bits+= get_bits_diff(s);
669 for(i=0; i<6; i++) {
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){
681 if (!s->mb_intra) {
682 s->p_tex_bits+= get_bits_diff(s);
683 }else{
684 s->i_tex_bits+= get_bits_diff(s);
685 s->i_count++;
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;
699 else if(s->mb_intra)
700 s->cur_pic.mb_type[mb_xy] = MB_TYPE_INTRA;
701 else
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;
711 if (val == 0) {
712 /* zero vector -- corresponds to ff_mvtab[0] */
713 put_bits(pb, 1, 1);
714 } else {
715 bit_size = f_code - 1;
716 range = 1 << bit_size;
717 /* modulo encoding */
718 val = sign_extend(val, 6 + bit_size);
719 sign = val>>31;
720 val= (val^sign)-sign;
721 sign&=1;
723 val--;
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);
728 if (bit_size > 0) {
729 put_bits(pb, bit_size, bits);
734 static av_cold void init_mv_penalty_and_fcode(void)
736 int f_code;
737 int mv;
739 for(f_code=1; f_code<=MAX_FCODE; f_code++){
740 for(mv=-MAX_DMV; mv<=MAX_DMV; mv++){
741 int len;
743 if (mv==0) len = 1; // ff_mvtab[0][1]
744 else{
745 int val, bit_size, code;
747 bit_size = f_code - 1;
749 val=mv;
750 if (val < 0)
751 val = -val;
752 val--;
753 code = (val >> bit_size) + 1;
754 if(code<33){
755 len= ff_mvtab[code][1] + 1 + bit_size;
756 }else{
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;
790 int bits, len, code;
792 len_tab[index]= 100;
794 /* ESC0 */
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;
803 /* ESC */
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;
838 if(s->h263_aic){
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
845 switch(s->codec_id){
846 case AV_CODEC_ID_MPEG4:
847 s->fcode_tab= fcode_tab;
848 break;
849 case AV_CODEC_ID_H263P:
850 if(s->umvplus)
851 s->fcode_tab= umv_fcode_tab;
852 if(s->modified_quant){
853 s->min_qcoeff= -2047;
854 s->max_qcoeff= 2047;
855 }else{
856 s->min_qcoeff= -127;
857 s->max_qcoeff= 127;
859 break;
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;
864 s->max_qcoeff= 1023;
865 } else {
866 s->min_qcoeff= -127;
867 s->max_qcoeff= 127;
869 break;
870 default: //nothing needed - default table already set in mpegvideo.c
871 s->min_qcoeff= -127;
872 s->max_qcoeff= 127;
874 if(s->h263_aic){
875 s->y_dc_scale_table=
876 s->c_dc_scale_table= ff_aic_dc_scale_table;
877 }else{
878 s->y_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);
884 #endif
886 ff_thread_once(&init_static_once, h263_encode_init_static);
889 void ff_h263_encode_mba(MpegEncContext *s)
891 int i, mb_pos;
893 for(i=0; i<6; i++){
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 },
905 FF_MPV_COMMON_OPTS
906 FF_MPV_COMMON_MOTION_EST_OPTS
907 { NULL },
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 = {
918 .p.name = "h263",
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},
938 FF_MPV_COMMON_OPTS
939 FF_MPV_COMMON_MOTION_EST_OPTS
940 { NULL },
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 = {
950 .p.name = "h263p",
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,