2 * The simplest mpeg encoder (well, it was the simplest!)
3 * Copyright (c) 2000,2001 Fabrice Bellard.
5 * This library is free software; you can redistribute it and/or
6 * modify it under the terms of the GNU Lesser General Public
7 * License as published by the Free Software Foundation; either
8 * version 2 of the License, or (at your option) any later version.
10 * This library is distributed in the hope that it will be useful,
11 * but WITHOUT ANY WARRANTY; without even the implied warranty of
12 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
13 * Lesser General Public License for more details.
15 * You should have received a copy of the GNU Lesser General Public
16 * License along with this library; if not, write to the Free Software
17 * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
19 * 4MV & hq & b-frame encoding stuff by Michael Niedermayer <michaelni@gmx.at>
25 #include "mpegvideo.h"
26 #include "simple_idct.h"
29 #include "fastmemcpy.h"
35 static void encode_picture(MpegEncContext *s, int picture_number);
36 static void dct_unquantize_mpeg1_c(MpegEncContext *s,
37 DCTELEM *block, int n, int qscale);
38 static void dct_unquantize_mpeg2_c(MpegEncContext *s,
39 DCTELEM *block, int n, int qscale);
40 static void dct_unquantize_h263_c(MpegEncContext *s,
41 DCTELEM *block, int n, int qscale);
42 static void draw_edges_c(UINT8 *buf, int wrap, int width, int height, int w);
43 static int dct_quantize_c(MpegEncContext *s, DCTELEM *block, int n, int qscale, int *overflow);
45 void (*draw_edges)(UINT8 *buf, int wrap, int width, int height, int w)= draw_edges_c;
46 static void emulated_edge_mc(MpegEncContext *s, UINT8 *src, int linesize, int block_w, int block_h,
47 int src_x, int src_y, int w, int h);
50 /* enable all paranoid tests for rounding, overflows, etc... */
56 /* for jpeg fast DCT */
59 static const uint16_t aanscales[64] = {
60 /* precomputed values scaled up by 14 bits */
61 16384, 22725, 21407, 19266, 16384, 12873, 8867, 4520,
62 22725, 31521, 29692, 26722, 22725, 17855, 12299, 6270,
63 21407, 29692, 27969, 25172, 21407, 16819, 11585, 5906,
64 19266, 26722, 25172, 22654, 19266, 15137, 10426, 5315,
65 16384, 22725, 21407, 19266, 16384, 12873, 8867, 4520,
66 12873, 17855, 16819, 15137, 12873, 10114, 6967, 3552,
67 8867, 12299, 11585, 10426, 8867, 6967, 4799, 2446,
68 4520, 6270, 5906, 5315, 4520, 3552, 2446, 1247
71 /* Input permutation for the simple_idct_mmx */
72 static const uint8_t simple_mmx_permutation[64]={
73 0x00, 0x08, 0x04, 0x09, 0x01, 0x0C, 0x05, 0x0D,
74 0x10, 0x18, 0x14, 0x19, 0x11, 0x1C, 0x15, 0x1D,
75 0x20, 0x28, 0x24, 0x29, 0x21, 0x2C, 0x25, 0x2D,
76 0x12, 0x1A, 0x16, 0x1B, 0x13, 0x1E, 0x17, 0x1F,
77 0x02, 0x0A, 0x06, 0x0B, 0x03, 0x0E, 0x07, 0x0F,
78 0x30, 0x38, 0x34, 0x39, 0x31, 0x3C, 0x35, 0x3D,
79 0x22, 0x2A, 0x26, 0x2B, 0x23, 0x2E, 0x27, 0x2F,
80 0x32, 0x3A, 0x36, 0x3B, 0x33, 0x3E, 0x37, 0x3F,
83 static const uint8_t h263_chroma_roundtab[16] = {
84 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 2, 2,
87 static UINT16 (*default_mv_penalty)[MAX_MV*2+1]=NULL;
88 static UINT8 default_fcode_tab[MAX_MV*2+1];
90 /* default motion estimation */
91 int motion_estimation_method = ME_EPZS;
93 static void convert_matrix(MpegEncContext *s, int (*qmat)[64], uint16_t (*qmat16)[64], uint16_t (*qmat16_bias)[64],
94 const UINT16 *quant_matrix, int bias, int qmin, int qmax)
98 for(qscale=qmin; qscale<=qmax; qscale++){
100 if (s->fdct == ff_jpeg_fdct_islow) {
102 const int j= s->idct_permutation[i];
103 /* 16 <= qscale * quant_matrix[i] <= 7905 */
104 /* 19952 <= aanscales[i] * qscale * quant_matrix[i] <= 249205026 */
105 /* (1<<36)/19952 >= (1<<36)/(aanscales[i] * qscale * quant_matrix[i]) >= (1<<36)/249205026 */
106 /* 3444240 >= (1<<36)/(aanscales[i] * qscale * quant_matrix[i]) >= 275 */
108 qmat[qscale][i] = (int)((UINT64_C(1) << QMAT_SHIFT) /
109 (qscale * quant_matrix[j]));
111 } else if (s->fdct == fdct_ifast) {
113 const int j= s->idct_permutation[i];
114 /* 16 <= qscale * quant_matrix[i] <= 7905 */
115 /* 19952 <= aanscales[i] * qscale * quant_matrix[i] <= 249205026 */
116 /* (1<<36)/19952 >= (1<<36)/(aanscales[i] * qscale * quant_matrix[i]) >= (1<<36)/249205026 */
117 /* 3444240 >= (1<<36)/(aanscales[i] * qscale * quant_matrix[i]) >= 275 */
119 qmat[qscale][i] = (int)((UINT64_C(1) << (QMAT_SHIFT + 14)) /
120 (aanscales[i] * qscale * quant_matrix[j]));
124 const int j= s->idct_permutation[i];
125 /* We can safely suppose that 16 <= quant_matrix[i] <= 255
126 So 16 <= qscale * quant_matrix[i] <= 7905
127 so (1<<19) / 16 >= (1<<19) / (qscale * quant_matrix[i]) >= (1<<19) / 7905
128 so 32768 >= (1<<19) / (qscale * quant_matrix[i]) >= 67
130 qmat [qscale][i] = (1 << QMAT_SHIFT_MMX) / (qscale * quant_matrix[i]);
131 qmat16[qscale][i] = (1 << QMAT_SHIFT_MMX) / (qscale * quant_matrix[j]);
133 if(qmat16[qscale][i]==0 || qmat16[qscale][i]==128*256) qmat16[qscale][i]=128*256-1;
134 qmat16_bias[qscale][i]= ROUNDED_DIV(bias<<(16-QUANT_BIAS_SHIFT), qmat16[qscale][i]);
139 // move into common.c perhaps
140 #define CHECKED_ALLOCZ(p, size)\
142 p= av_mallocz(size);\
149 void ff_init_scantable(MpegEncContext *s, ScanTable *st, const UINT8 *src_scantable){
153 st->scantable= src_scantable;
157 j = src_scantable[i];
158 st->permutated[i] = s->idct_permutation[j];
167 j = st->permutated[i];
169 st->raster_end[i]= end;
173 /* XXX: those functions should be suppressed ASAP when all IDCTs are
175 // *FIXME* this is ugly hack using local static
176 static void (*ff_put_pixels_clamped)(const DCTELEM *block, UINT8 *pixels, int line_size);
177 static void (*ff_add_pixels_clamped)(const DCTELEM *block, UINT8 *pixels, int line_size);
178 static void ff_jref_idct_put(UINT8 *dest, int line_size, DCTELEM *block)
181 ff_put_pixels_clamped(block, dest, line_size);
183 static void ff_jref_idct_add(UINT8 *dest, int line_size, DCTELEM *block)
186 ff_add_pixels_clamped(block, dest, line_size);
189 /* init common dct for both encoder and decoder */
190 int DCT_common_init(MpegEncContext *s)
194 ff_put_pixels_clamped = s->dsp.put_pixels_clamped;
195 ff_add_pixels_clamped = s->dsp.add_pixels_clamped;
197 s->dct_unquantize_h263 = dct_unquantize_h263_c;
198 s->dct_unquantize_mpeg1 = dct_unquantize_mpeg1_c;
199 s->dct_unquantize_mpeg2 = dct_unquantize_mpeg2_c;
200 s->dct_quantize= dct_quantize_c;
202 if(s->avctx->dct_algo==FF_DCT_FASTINT)
203 s->fdct = fdct_ifast;
205 s->fdct = ff_jpeg_fdct_islow; //slow/accurate/default
207 if(s->avctx->idct_algo==FF_IDCT_INT){
208 s->idct_put= ff_jref_idct_put;
209 s->idct_add= ff_jref_idct_add;
210 s->idct_permutation_type= FF_LIBMPEG2_IDCT_PERM;
211 }else{ //accurate/default
212 s->idct_put= simple_idct_put;
213 s->idct_add= simple_idct_add;
214 s->idct_permutation_type= FF_NO_IDCT_PERM;
218 MPV_common_init_mmx(s);
221 MPV_common_init_axp(s);
224 MPV_common_init_mlib(s);
227 MPV_common_init_mmi(s);
230 MPV_common_init_armv4l(s);
233 MPV_common_init_ppc(s);
236 switch(s->idct_permutation_type){
237 case FF_NO_IDCT_PERM:
239 s->idct_permutation[i]= i;
241 case FF_LIBMPEG2_IDCT_PERM:
243 s->idct_permutation[i]= (i & 0x38) | ((i & 6) >> 1) | ((i & 1) << 2);
245 case FF_SIMPLE_IDCT_PERM:
247 s->idct_permutation[i]= simple_mmx_permutation[i];
249 case FF_TRANSPOSE_IDCT_PERM:
251 s->idct_permutation[i]= ((i&7)<<3) | (i>>3);
254 fprintf(stderr, "Internal error, IDCT permutation not set\n");
259 /* load & permutate scantables
260 note: only wmv uses differnt ones
262 ff_init_scantable(s, &s->inter_scantable , ff_zigzag_direct);
263 ff_init_scantable(s, &s->intra_scantable , ff_zigzag_direct);
264 ff_init_scantable(s, &s->intra_h_scantable, ff_alternate_horizontal_scan);
265 ff_init_scantable(s, &s->intra_v_scantable, ff_alternate_vertical_scan);
271 * allocates various arrays for a Picture structure, except the pixels themself.
272 * The pixels are allocated/set in te get_buffer()
274 static int alloc_picture(MpegEncContext *s, Picture *pic){
276 CHECKED_ALLOCZ(pic->mb_var , s->mb_num * sizeof(INT16))
277 CHECKED_ALLOCZ(pic->mc_mb_var, s->mb_num * sizeof(INT16))
278 CHECKED_ALLOCZ(pic->mb_mean , s->mb_num * sizeof(INT8))
281 CHECKED_ALLOCZ(pic->mbskip_table , s->mb_num * sizeof(UINT8)+1) //the +1 is for the slice end check
282 CHECKED_ALLOCZ(pic->qscale_table , s->mb_num * sizeof(UINT8))
283 pic->qstride= s->mb_width;
286 fail: //for the CHECKED_ALLOCZ macro
290 static void free_picture(MpegEncContext *s, Picture *pic){
293 av_freep(&pic->mb_var);
294 av_freep(&pic->mc_mb_var);
295 av_freep(&pic->mb_mean);
296 av_freep(&pic->mbskip_table);
297 av_freep(&pic->qscale_table);
299 if(s->avctx->get_buffer == avcodec_default_get_buffer){
301 av_freep(&pic->base[i]);
304 av_freep(&pic->opaque);
308 /* init common structure for both encoder and decoder */
309 int MPV_common_init(MpegEncContext *s)
311 int y_size, c_size, yc_size, i;
313 dsputil_init(&s->dsp, s->avctx->dsp_mask);
316 s->flags= s->avctx->flags;
318 s->mb_width = (s->width + 15) / 16;
319 s->mb_height = (s->height + 15) / 16;
321 /* set default edge pos, will be overriden in decode_header if needed */
322 s->h_edge_pos= s->mb_width*16;
323 s->v_edge_pos= s->mb_height*16;
325 s->mb_num = s->mb_width * s->mb_height;
327 y_size = (2 * s->mb_width + 2) * (2 * s->mb_height + 2);
328 c_size = (s->mb_width + 2) * (s->mb_height + 2);
329 yc_size = y_size + 2 * c_size;
331 /* convert fourcc to upper case */
332 s->avctx->fourcc= toupper( s->avctx->fourcc &0xFF)
333 + (toupper((s->avctx->fourcc>>8 )&0xFF)<<8 )
334 + (toupper((s->avctx->fourcc>>16)&0xFF)<<16)
335 + (toupper((s->avctx->fourcc>>24)&0xFF)<<24);
337 CHECKED_ALLOCZ(s->edge_emu_buffer, (s->width+64)*2*17*2); //(width + edge + align)*interlaced*MBsize*tolerance
339 s->avctx->coded_picture= (AVVideoFrame*)&s->current_picture;
342 int mv_table_size= (s->mb_width+2)*(s->mb_height+2);
344 /* Allocate MV tables */
345 CHECKED_ALLOCZ(s->p_mv_table , mv_table_size * 2 * sizeof(INT16))
346 CHECKED_ALLOCZ(s->b_forw_mv_table , mv_table_size * 2 * sizeof(INT16))
347 CHECKED_ALLOCZ(s->b_back_mv_table , mv_table_size * 2 * sizeof(INT16))
348 CHECKED_ALLOCZ(s->b_bidir_forw_mv_table , mv_table_size * 2 * sizeof(INT16))
349 CHECKED_ALLOCZ(s->b_bidir_back_mv_table , mv_table_size * 2 * sizeof(INT16))
350 CHECKED_ALLOCZ(s->b_direct_forw_mv_table, mv_table_size * 2 * sizeof(INT16))
351 CHECKED_ALLOCZ(s->b_direct_back_mv_table, mv_table_size * 2 * sizeof(INT16))
352 CHECKED_ALLOCZ(s->b_direct_mv_table , mv_table_size * 2 * sizeof(INT16))
354 //FIXME should be linesize instead of s->width*2 but that isnt known before get_buffer()
355 CHECKED_ALLOCZ(s->me_scratchpad, s->width*2*16*3*sizeof(uint8_t))
357 CHECKED_ALLOCZ(s->me_map , ME_MAP_SIZE*sizeof(uint32_t))
358 CHECKED_ALLOCZ(s->me_score_map, ME_MAP_SIZE*sizeof(uint16_t))
360 if(s->codec_id==CODEC_ID_MPEG4){
361 CHECKED_ALLOCZ(s->tex_pb_buffer, PB_BUFFER_SIZE);
362 CHECKED_ALLOCZ( s->pb2_buffer, PB_BUFFER_SIZE);
365 if(s->msmpeg4_version){
366 CHECKED_ALLOCZ(s->ac_stats, 2*2*(MAX_LEVEL+1)*(MAX_RUN+1)*2*sizeof(int));
368 CHECKED_ALLOCZ(s->avctx->stats_out, 256);
371 CHECKED_ALLOCZ(s->error_status_table, s->mb_num*sizeof(UINT8))
373 if (s->out_format == FMT_H263 || s->encoding) {
375 /* Allocate MB type table */
376 CHECKED_ALLOCZ(s->mb_type , s->mb_num * sizeof(UINT8))
379 size = (2 * s->mb_width + 2) * (2 * s->mb_height + 2);
380 CHECKED_ALLOCZ(s->motion_val, size * 2 * sizeof(INT16));
383 if(s->codec_id==CODEC_ID_MPEG4){
384 /* interlaced direct mode decoding tables */
385 CHECKED_ALLOCZ(s->field_mv_table, s->mb_num*2*2 * sizeof(INT16))
386 CHECKED_ALLOCZ(s->field_select_table, s->mb_num*2* sizeof(INT8))
388 /* 4mv b frame decoding table */
389 //note this is needed for h263 without b frames too (segfault on damaged streams otherwise)
390 CHECKED_ALLOCZ(s->co_located_type_table, s->mb_num * sizeof(UINT8))
391 if (s->out_format == FMT_H263) {
393 CHECKED_ALLOCZ(s->ac_val[0], yc_size * sizeof(INT16) * 16);
394 s->ac_val[1] = s->ac_val[0] + y_size;
395 s->ac_val[2] = s->ac_val[1] + c_size;
398 CHECKED_ALLOCZ(s->coded_block, y_size);
400 /* divx501 bitstream reorder buffer */
401 CHECKED_ALLOCZ(s->bitstream_buffer, BITSTREAM_BUFFER_SIZE);
403 /* cbp, ac_pred, pred_dir */
404 CHECKED_ALLOCZ(s->cbp_table , s->mb_num * sizeof(UINT8))
405 CHECKED_ALLOCZ(s->pred_dir_table, s->mb_num * sizeof(UINT8))
408 if (s->h263_pred || s->h263_plus || !s->encoding) {
410 //MN: we need these for error resilience of intra-frames
411 CHECKED_ALLOCZ(s->dc_val[0], yc_size * sizeof(INT16));
412 s->dc_val[1] = s->dc_val[0] + y_size;
413 s->dc_val[2] = s->dc_val[1] + c_size;
414 for(i=0;i<yc_size;i++)
415 s->dc_val[0][i] = 1024;
418 /* which mb is a intra block */
419 CHECKED_ALLOCZ(s->mbintra_table, s->mb_num);
420 memset(s->mbintra_table, 1, s->mb_num);
422 /* default structure is frame */
423 s->picture_structure = PICT_FRAME;
425 /* init macroblock skip table */
426 CHECKED_ALLOCZ(s->mbskip_table, s->mb_num+1);
427 //Note the +1 is for a quicker mpeg4 slice_end detection
429 s->block= s->blocks[0];
431 s->parse_context.state= -1;
433 s->context_initialized = 1;
443 /* init common structure for both encoder and decoder */
444 void MPV_common_end(MpegEncContext *s)
448 for(i=0; i<MAX_PICTURE_COUNT; i++){
449 if(s->picture[i].data[0]){
450 s->avctx->release_buffer(s->avctx, (AVVideoFrame*)&s->picture[i]);
454 av_freep(&s->mb_type);
455 av_freep(&s->p_mv_table);
456 av_freep(&s->b_forw_mv_table);
457 av_freep(&s->b_back_mv_table);
458 av_freep(&s->b_bidir_forw_mv_table);
459 av_freep(&s->b_bidir_back_mv_table);
460 av_freep(&s->b_direct_forw_mv_table);
461 av_freep(&s->b_direct_back_mv_table);
462 av_freep(&s->b_direct_mv_table);
463 av_freep(&s->motion_val);
464 av_freep(&s->dc_val[0]);
465 av_freep(&s->ac_val[0]);
466 av_freep(&s->coded_block);
467 av_freep(&s->mbintra_table);
468 av_freep(&s->cbp_table);
469 av_freep(&s->pred_dir_table);
470 av_freep(&s->me_scratchpad);
471 av_freep(&s->me_map);
472 av_freep(&s->me_score_map);
474 av_freep(&s->mbskip_table);
475 av_freep(&s->bitstream_buffer);
476 av_freep(&s->tex_pb_buffer);
477 av_freep(&s->pb2_buffer);
478 av_freep(&s->edge_emu_buffer);
479 av_freep(&s->co_located_type_table);
480 av_freep(&s->field_mv_table);
481 av_freep(&s->field_select_table);
482 av_freep(&s->avctx->stats_out);
483 av_freep(&s->ac_stats);
484 av_freep(&s->error_status_table);
486 for(i=0; i<MAX_PICTURE_COUNT; i++){
487 free_picture(s, &s->picture[i]);
489 s->context_initialized = 0;
492 /* init video encoder */
493 int MPV_encode_init(AVCodecContext *avctx)
495 MpegEncContext *s = avctx->priv_data;
498 avctx->pix_fmt = PIX_FMT_YUV420P;
500 s->bit_rate = avctx->bit_rate;
501 s->bit_rate_tolerance = avctx->bit_rate_tolerance;
502 s->frame_rate = avctx->frame_rate;
503 s->width = avctx->width;
504 s->height = avctx->height;
505 if(avctx->gop_size > 600){
506 fprintf(stderr, "Warning keyframe interval too large! reducing it ...\n");
509 s->gop_size = avctx->gop_size;
510 s->rtp_mode = avctx->rtp_mode;
511 s->rtp_payload_size = avctx->rtp_payload_size;
512 if (avctx->rtp_callback)
513 s->rtp_callback = avctx->rtp_callback;
514 s->qmin= avctx->qmin;
515 s->qmax= avctx->qmax;
516 s->max_qdiff= avctx->max_qdiff;
517 s->qcompress= avctx->qcompress;
518 s->qblur= avctx->qblur;
520 s->flags= avctx->flags;
521 s->max_b_frames= avctx->max_b_frames;
522 s->b_frame_strategy= avctx->b_frame_strategy;
523 s->codec_id= avctx->codec->id;
524 s->luma_elim_threshold = avctx->luma_elim_threshold;
525 s->chroma_elim_threshold= avctx->chroma_elim_threshold;
526 s->strict_std_compliance= avctx->strict_std_compliance;
527 s->data_partitioning= avctx->flags & CODEC_FLAG_PART;
528 s->mpeg_quant= avctx->mpeg_quant;
530 if (s->gop_size <= 1) {
538 if (avctx->me_method == 0)
539 /* For compatibility */
540 s->me_method = motion_estimation_method;
542 s->me_method = avctx->me_method;
545 s->fixed_qscale = (avctx->flags & CODEC_FLAG_QSCALE);
547 s->adaptive_quant= ( s->avctx->lumi_masking
548 || s->avctx->dark_masking
549 || s->avctx->temporal_cplx_masking
550 || s->avctx->spatial_cplx_masking
551 || s->avctx->p_masking)
554 s->progressive_sequence= !(avctx->flags & CODEC_FLAG_INTERLACED_DCT);
556 switch(avctx->codec->id) {
557 case CODEC_ID_MPEG1VIDEO:
558 s->out_format = FMT_MPEG1;
559 avctx->delay=0; //FIXME not sure, should check the spec
562 s->out_format = FMT_MJPEG;
563 s->intra_only = 1; /* force intra only for jpeg */
564 s->mjpeg_write_tables = 1; /* write all tables */
565 s->mjpeg_data_only_frames = 0; /* write all the needed headers */
566 s->mjpeg_vsample[0] = 2; /* set up default sampling factors */
567 s->mjpeg_vsample[1] = 1; /* the only currently supported values */
568 s->mjpeg_vsample[2] = 1;
569 s->mjpeg_hsample[0] = 2;
570 s->mjpeg_hsample[1] = 1;
571 s->mjpeg_hsample[2] = 1;
572 if (mjpeg_init(s) < 0)
577 if (h263_get_picture_format(s->width, s->height) == 7) {
578 printf("Input picture size isn't suitable for h263 codec! try h263+\n");
581 s->out_format = FMT_H263;
585 s->out_format = FMT_H263;
587 s->unrestricted_mv = 1;
590 /* These are just to be sure */
596 s->out_format = FMT_H263;
601 s->out_format = FMT_H263;
603 s->unrestricted_mv = 1;
604 s->has_b_frames= s->max_b_frames ? 1 : 0;
605 s->low_delay= !s->has_b_frames;
606 avctx->delay= s->low_delay ? 0 : (s->max_b_frames + 1);
608 case CODEC_ID_MSMPEG4V1:
609 s->out_format = FMT_H263;
612 s->unrestricted_mv = 1;
613 s->msmpeg4_version= 1;
616 case CODEC_ID_MSMPEG4V2:
617 s->out_format = FMT_H263;
620 s->unrestricted_mv = 1;
621 s->msmpeg4_version= 2;
624 case CODEC_ID_MSMPEG4V3:
625 s->out_format = FMT_H263;
628 s->unrestricted_mv = 1;
629 s->msmpeg4_version= 3;
633 s->out_format = FMT_H263;
636 s->unrestricted_mv = 1;
637 s->msmpeg4_version= 4;
641 s->out_format = FMT_H263;
644 s->unrestricted_mv = 1;
645 s->msmpeg4_version= 5;
652 { /* set up some save defaults, some codecs might override them later */
658 default_mv_penalty= av_mallocz( sizeof(UINT16)*(MAX_FCODE+1)*(2*MAX_MV+1) );
659 memset(default_mv_penalty, 0, sizeof(UINT16)*(MAX_FCODE+1)*(2*MAX_MV+1));
660 memset(default_fcode_tab , 0, sizeof(UINT8)*(2*MAX_MV+1));
662 for(i=-16; i<16; i++){
663 default_fcode_tab[i + MAX_MV]= 1;
667 s->mv_penalty= default_mv_penalty;
668 s->fcode_tab= default_fcode_tab;
670 s->c_dc_scale_table= ff_mpeg1_dc_scale_table;
672 /* dont use mv_penalty table for crap MV as it would be confused */
673 if (s->me_method < ME_EPZS) s->mv_penalty = default_mv_penalty;
678 if (MPV_common_init(s) < 0)
681 #ifdef CONFIG_ENCODERS
682 if (s->out_format == FMT_H263)
684 else if (s->out_format == FMT_MPEG1)
685 ff_mpeg1_encode_init(s);
686 if(s->msmpeg4_version)
687 ff_msmpeg4_encode_init(s);
690 /* init default q matrix */
692 int j= s->idct_permutation[i];
693 if(s->codec_id==CODEC_ID_MPEG4 && s->mpeg_quant){
694 s->intra_matrix[j] = ff_mpeg4_default_intra_matrix[i];
695 s->inter_matrix[j] = ff_mpeg4_default_non_intra_matrix[i];
696 }else if(s->out_format == FMT_H263){
698 s->inter_matrix[j] = ff_mpeg1_default_non_intra_matrix[i];
700 s->intra_matrix[j] = ff_mpeg1_default_intra_matrix[i];
701 s->inter_matrix[j] = ff_mpeg1_default_non_intra_matrix[i];
705 /* precompute matrix */
706 /* for mjpeg, we do include qscale in the matrix */
707 if (s->out_format != FMT_MJPEG) {
708 convert_matrix(s, s->q_intra_matrix, s->q_intra_matrix16, s->q_intra_matrix16_bias,
709 s->intra_matrix, s->intra_quant_bias, 1, 31);
710 convert_matrix(s, s->q_inter_matrix, s->q_inter_matrix16, s->q_inter_matrix16_bias,
711 s->inter_matrix, s->inter_quant_bias, 1, 31);
714 if(ff_rate_control_init(s) < 0)
717 s->picture_number = 0;
718 s->picture_in_gop_number = 0;
719 s->fake_picture_number = 0;
720 /* motion detector init */
727 int MPV_encode_end(AVCodecContext *avctx)
729 MpegEncContext *s = avctx->priv_data;
735 ff_rate_control_uninit(s);
738 if (s->out_format == FMT_MJPEG)
744 /* draw the edges of width 'w' of an image of size width, height */
745 //FIXME check that this is ok for mpeg4 interlaced
746 static void draw_edges_c(UINT8 *buf, int wrap, int width, int height, int w)
748 UINT8 *ptr, *last_line;
751 last_line = buf + (height - 1) * wrap;
754 memcpy(buf - (i + 1) * wrap, buf, width);
755 memcpy(last_line + (i + 1) * wrap, last_line, width);
759 for(i=0;i<height;i++) {
760 memset(ptr - w, ptr[0], w);
761 memset(ptr + width, ptr[width-1], w);
766 memset(buf - (i + 1) * wrap - w, buf[0], w); /* top left */
767 memset(buf - (i + 1) * wrap + width, buf[width-1], w); /* top right */
768 memset(last_line + (i + 1) * wrap - w, last_line[0], w); /* top left */
769 memset(last_line + (i + 1) * wrap + width, last_line[width-1], w); /* top right */
773 /* generic function for encode/decode called before a frame is coded/decoded */
774 int MPV_frame_start(MpegEncContext *s, AVCodecContext *avctx)
781 /* mark&release old frames */
782 if (s->pict_type != B_TYPE && s->last_picture.data[0]) {
784 for(i=0; i<MAX_PICTURE_COUNT; i++){
785 if(s->picture[i].data[0] == s->last_picture.data[0]){
786 // s->picture[i].reference=0;
787 avctx->release_buffer(avctx, (AVVideoFrame*)&s->picture[i]);
791 assert(i<MAX_PICTURE_COUNT);
793 /* release forgotten pictures */
794 /* if(mpeg124/h263) */
796 for(i=0; i<MAX_PICTURE_COUNT; i++){
797 if(s->picture[i].data[0] && s->picture[i].data[0] != s->next_picture.data[0] && s->picture[i].reference){
798 fprintf(stderr, "releasing zombie picture\n");
799 avctx->release_buffer(avctx, (AVVideoFrame*)&s->picture[i]);
806 /* find unused Picture */
807 for(i=0; i<MAX_PICTURE_COUNT; i++){
808 if(s->picture[i].data[0]==NULL) break;
810 assert(i<MAX_PICTURE_COUNT);
812 pic= (AVVideoFrame*)&s->picture[i];
813 pic->reference= s->pict_type != B_TYPE;
814 pic->coded_picture_number= s->current_picture.coded_picture_number+1;
816 r= avctx->get_buffer(avctx, pic);
818 if(r<0 || (s->linesize && (s->linesize != pic->linesize[0] || s->uvlinesize != pic->linesize[1]))){
819 fprintf(stderr, "get_buffer() failed (stride changed), bye bye\n");
823 s->linesize = pic->linesize[0];
824 s->uvlinesize= pic->linesize[1];
826 if(pic->qscale_table==NULL)
827 alloc_picture(s, (Picture*)pic);
829 s->current_picture= s->picture[i];
832 s->hurry_up= s->avctx->hurry_up;
833 s->error_resilience= avctx->error_resilience;
835 if (s->pict_type != B_TYPE) {
836 s->last_picture= s->next_picture;
837 s->next_picture= s->current_picture;
840 /* set dequantizer, we cant do it during init as it might change for mpeg4
841 and we cant do it in the header decode as init isnt called for mpeg4 there yet */
842 if(s->out_format == FMT_H263){
844 s->dct_unquantize = s->dct_unquantize_mpeg2;
846 s->dct_unquantize = s->dct_unquantize_h263;
848 s->dct_unquantize = s->dct_unquantize_mpeg1;
853 /* generic function for encode/decode called after a frame has been coded/decoded */
854 void MPV_frame_end(MpegEncContext *s)
858 /* draw edge for correct motion prediction if outside */
859 if(s->codec_id!=CODEC_ID_SVQ1){
860 if (s->pict_type != B_TYPE && !s->intra_only && !(s->flags&CODEC_FLAG_EMU_EDGE)) {
861 draw_edges(s->current_picture.data[0], s->linesize , s->h_edge_pos , s->v_edge_pos , EDGE_WIDTH );
862 draw_edges(s->current_picture.data[1], s->uvlinesize, s->h_edge_pos>>1, s->v_edge_pos>>1, EDGE_WIDTH/2);
863 draw_edges(s->current_picture.data[2], s->uvlinesize, s->h_edge_pos>>1, s->v_edge_pos>>1, EDGE_WIDTH/2);
868 s->last_pict_type = s->pict_type;
869 if(s->pict_type!=B_TYPE){
870 s->last_non_b_pict_type= s->pict_type;
871 s->num_available_buffers++;
872 if(s->num_available_buffers>2) s->num_available_buffers= 2;
875 s->current_picture.quality= s->qscale; //FIXME get average of qscale_table
876 s->current_picture.pict_type= s->pict_type;
877 s->current_picture.key_frame= s->pict_type == I_TYPE;
879 /* copy back current_picture variables */
880 for(i=0; i<MAX_PICTURE_COUNT; i++){
881 if(s->picture[i].data[0] == s->current_picture.data[0]){
882 s->picture[i]= s->current_picture;
886 assert(i<MAX_PICTURE_COUNT);
888 /* release non refernce frames */
889 for(i=0; i<MAX_PICTURE_COUNT; i++){
890 if(s->picture[i].data[0] && !s->picture[i].reference)
891 s->avctx->release_buffer(s->avctx, (AVVideoFrame*)&s->picture[i]);
895 static int load_input_picture(MpegEncContext *s, AVVideoFrame *pic_arg){
898 const int encoding_delay= s->max_b_frames;
900 /* find unused Picture */
901 for(i=0; i<MAX_PICTURE_COUNT; i++){
902 if(s->picture[i].data[0]==NULL) break;
904 assert(i<MAX_PICTURE_COUNT);
906 pic= (AVVideoFrame*)&s->picture[i];
909 // assert(avctx->get_buffer == default_get_buffer || avctx->get_buffer==NULL);
910 r= s->avctx->get_buffer(s->avctx, pic);
912 if(r<0 || (s->linesize && (s->linesize != pic->linesize[0] || s->uvlinesize != pic->linesize[1]))){
913 fprintf(stderr, "get_buffer() failed (stride changed), bye bye\n");
917 assert(s->linesize==0 || s->linesize ==pic->linesize[0]);
918 assert(s->uvlinesize==0 || s->uvlinesize==pic->linesize[1]);
919 assert(pic->linesize[1] == pic->linesize[2]);
920 s->linesize = pic->linesize[0];
921 s->uvlinesize= pic->linesize[1];
923 if(pic->qscale_table==NULL)
924 alloc_picture(s, (Picture*)pic);
926 // assert(s->input_picture[0]==NULL || s->input_picture[0]->data[0]==NULL);
928 if(s->input_picture[encoding_delay])
929 pic->display_picture_number= s->input_picture[encoding_delay]->display_picture_number + 1;
930 //printf("dpn2:%d\n", pic->display_picture_number);
932 /* shift buffer entries */
933 for(i=1; i<MAX_PICTURE_COUNT /*s->encoding_delay+1*/; i++)
934 s->input_picture[i-1]= s->input_picture[i];
936 s->input_picture[encoding_delay]= (Picture*)pic;
937 pic->pict_type= pic_arg->pict_type;
938 pic->quality= pic_arg->quality;
940 if( pic->data[0] == pic_arg->data[0]
941 && pic->data[1] == pic_arg->data[1]
942 && pic->data[2] == pic_arg->data[2]){
945 int h_chroma_shift, v_chroma_shift;
947 avcodec_get_chroma_sub_sample(s->avctx->pix_fmt, &h_chroma_shift, &v_chroma_shift);
950 int src_stride= pic_arg->linesize[i];
951 int dst_stride= i ? s->uvlinesize : s->linesize;
952 int h_shift= i ? h_chroma_shift : 0;
953 int v_shift= i ? v_chroma_shift : 0;
954 int w= s->width >>h_shift;
955 int h= s->height>>v_shift;
956 uint8_t *src= pic_arg->data[i];
957 uint8_t *dst= pic->data[i] + 16;
959 if(src_stride==dst_stride)
960 memcpy(dst, src, src_stride*h);
974 static void select_input_picture(MpegEncContext *s){
976 const int encoding_delay= s->max_b_frames;
979 if(s->reordered_input_picture[0])
980 coded_pic_num= s->reordered_input_picture[0]->coded_picture_number + 1;
981 //printf("cpn:%d\n", coded_pic_num);
982 for(i=1; i<MAX_PICTURE_COUNT; i++)
983 s->reordered_input_picture[i-1]= s->reordered_input_picture[i];
984 s->reordered_input_picture[MAX_PICTURE_COUNT-1]= NULL;
986 /* set next picture types & ordering */
987 if(s->reordered_input_picture[0]==NULL && s->input_picture[0]){
988 if(s->input_picture[0]->pict_type){
989 /* user selected pict_type */
990 if(s->input_picture[0]->pict_type == I_TYPE){
991 s->reordered_input_picture[0]= s->input_picture[0];
992 s->reordered_input_picture[0]->coded_picture_number= coded_pic_num;
996 for(b_frames=0; b_frames<s->max_b_frames+1; b_frames++){
997 if(s->input_picture[b_frames]->pict_type!=B_TYPE) break;
1000 if(b_frames > s->max_b_frames){
1001 fprintf(stderr, "warning, too many bframes in a row\n");
1002 b_frames = s->max_b_frames;
1003 s->input_picture[b_frames]->pict_type= I_TYPE;
1006 s->reordered_input_picture[0]= s->input_picture[b_frames];
1007 s->reordered_input_picture[0]->coded_picture_number= coded_pic_num;
1008 for(i=0; i<b_frames; i++){
1010 s->reordered_input_picture[i+1]= s->input_picture[i];
1011 s->reordered_input_picture[i+1]->coded_picture_number= coded_pic_num;
1015 if(/*s->picture_in_gop_number >= s->gop_size ||*/ s->next_picture.data[0]==NULL || s->intra_only){
1016 s->reordered_input_picture[0]= s->input_picture[0];
1017 s->reordered_input_picture[0]->pict_type= I_TYPE;
1018 s->reordered_input_picture[0]->coded_picture_number= coded_pic_num;
1020 s->reordered_input_picture[0]= s->input_picture[s->max_b_frames];
1021 if(s->picture_in_gop_number + s->max_b_frames >= s->gop_size)
1022 s->reordered_input_picture[0]->pict_type= I_TYPE;
1024 s->reordered_input_picture[0]->pict_type= P_TYPE;
1025 s->reordered_input_picture[0]->coded_picture_number= coded_pic_num;
1026 for(i=0; i<s->max_b_frames; i++){
1028 s->reordered_input_picture[i+1]= s->input_picture[i];
1029 s->reordered_input_picture[i+1]->pict_type= B_TYPE;
1030 s->reordered_input_picture[i+1]->coded_picture_number= coded_pic_num;
1036 if(s->reordered_input_picture[0]){
1037 if(s->reordered_input_picture[0]->pict_type==B_TYPE){
1038 s->reordered_input_picture[0]->reference=0;
1040 s->current_picture= *s->reordered_input_picture[0];
1041 s->new_picture= s->current_picture;
1042 s->new_picture.data[0]+=16;
1043 s->new_picture.data[1]+=16;
1044 s->new_picture.data[2]+=16;
1046 s->picture_number= s->new_picture.display_picture_number;
1047 //printf("dpn:%d\n", s->picture_number);
1049 memset(&s->new_picture, 0, sizeof(Picture));
1053 int MPV_encode_picture(AVCodecContext *avctx,
1054 unsigned char *buf, int buf_size, void *data)
1056 MpegEncContext *s = avctx->priv_data;
1057 AVVideoFrame *pic_arg = data;
1060 init_put_bits(&s->pb, buf, buf_size, NULL, NULL);
1062 s->picture_in_gop_number++;
1064 load_input_picture(s, pic_arg);
1066 select_input_picture(s);
1069 if(s->new_picture.data[0]){
1071 s->pict_type= s->new_picture.pict_type;
1072 if (s->fixed_qscale){ /* the ratecontrol needs the last qscale so we dont touch it for CBR */
1073 s->qscale= (int)(s->new_picture.quality+0.5);
1077 //printf("qs:%f %f %d\n", s->new_picture.quality, s->current_picture.quality, s->qscale);
1078 MPV_frame_start(s, avctx);
1080 encode_picture(s, s->picture_number);
1082 avctx->real_pict_num = s->picture_number;
1083 avctx->header_bits = s->header_bits;
1084 avctx->mv_bits = s->mv_bits;
1085 avctx->misc_bits = s->misc_bits;
1086 avctx->i_tex_bits = s->i_tex_bits;
1087 avctx->p_tex_bits = s->p_tex_bits;
1088 avctx->i_count = s->i_count;
1089 avctx->p_count = s->mb_num - s->i_count - s->skip_count; //FIXME f/b_count in avctx
1090 avctx->skip_count = s->skip_count;
1094 if (s->out_format == FMT_MJPEG)
1095 mjpeg_picture_trailer(s);
1097 if(s->flags&CODEC_FLAG_PASS1)
1098 ff_write_pass1_stats(s);
1101 s->input_picture_number++;
1103 flush_put_bits(&s->pb);
1104 s->frame_bits = (pbBufPtr(&s->pb) - s->pb.buf) * 8;
1106 s->total_bits += s->frame_bits;
1107 avctx->frame_bits = s->frame_bits;
1110 avctx->error[i] += s->current_picture.error[i];
1113 return pbBufPtr(&s->pb) - s->pb.buf;
1116 static inline void gmc1_motion(MpegEncContext *s,
1117 UINT8 *dest_y, UINT8 *dest_cb, UINT8 *dest_cr,
1119 UINT8 **ref_picture, int src_offset)
1122 int offset, src_x, src_y, linesize, uvlinesize;
1123 int motion_x, motion_y;
1126 motion_x= s->sprite_offset[0][0];
1127 motion_y= s->sprite_offset[0][1];
1128 src_x = s->mb_x * 16 + (motion_x >> (s->sprite_warping_accuracy+1));
1129 src_y = s->mb_y * 16 + (motion_y >> (s->sprite_warping_accuracy+1));
1130 motion_x<<=(3-s->sprite_warping_accuracy);
1131 motion_y<<=(3-s->sprite_warping_accuracy);
1132 src_x = clip(src_x, -16, s->width);
1133 if (src_x == s->width)
1135 src_y = clip(src_y, -16, s->height);
1136 if (src_y == s->height)
1139 linesize = s->linesize;
1140 uvlinesize = s->uvlinesize;
1142 ptr = ref_picture[0] + (src_y * linesize) + src_x + src_offset;
1144 dest_y+=dest_offset;
1145 if(s->flags&CODEC_FLAG_EMU_EDGE){
1146 if(src_x<0 || src_y<0 || src_x + (motion_x&15) + 16 > s->h_edge_pos
1147 || src_y + (motion_y&15) + 16 > s->v_edge_pos){
1148 emulated_edge_mc(s, ptr, linesize, 17, 17, src_x, src_y, s->h_edge_pos, s->v_edge_pos);
1149 ptr= s->edge_emu_buffer;
1154 if((motion_x|motion_y)&7){
1155 s->dsp.gmc1(dest_y , ptr , linesize, 16, motion_x&15, motion_y&15, 128 - s->no_rounding);
1156 s->dsp.gmc1(dest_y+8, ptr+8, linesize, 16, motion_x&15, motion_y&15, 128 - s->no_rounding);
1160 dxy= ((motion_x>>3)&1) | ((motion_y>>2)&2);
1161 if (s->no_rounding){
1162 s->dsp.put_no_rnd_pixels_tab[0][dxy](dest_y, ptr, linesize, 16);
1164 s->dsp.put_pixels_tab [0][dxy](dest_y, ptr, linesize, 16);
1168 if(s->flags&CODEC_FLAG_GRAY) return;
1170 motion_x= s->sprite_offset[1][0];
1171 motion_y= s->sprite_offset[1][1];
1172 src_x = s->mb_x * 8 + (motion_x >> (s->sprite_warping_accuracy+1));
1173 src_y = s->mb_y * 8 + (motion_y >> (s->sprite_warping_accuracy+1));
1174 motion_x<<=(3-s->sprite_warping_accuracy);
1175 motion_y<<=(3-s->sprite_warping_accuracy);
1176 src_x = clip(src_x, -8, s->width>>1);
1177 if (src_x == s->width>>1)
1179 src_y = clip(src_y, -8, s->height>>1);
1180 if (src_y == s->height>>1)
1183 offset = (src_y * uvlinesize) + src_x + (src_offset>>1);
1184 ptr = ref_picture[1] + offset;
1186 emulated_edge_mc(s, ptr, uvlinesize, 9, 9, src_x, src_y, s->h_edge_pos>>1, s->v_edge_pos>>1);
1187 ptr= s->edge_emu_buffer;
1189 s->dsp.gmc1(dest_cb + (dest_offset>>1), ptr, uvlinesize, 8, motion_x&15, motion_y&15, 128 - s->no_rounding);
1191 ptr = ref_picture[2] + offset;
1193 emulated_edge_mc(s, ptr, uvlinesize, 9, 9, src_x, src_y, s->h_edge_pos>>1, s->v_edge_pos>>1);
1194 ptr= s->edge_emu_buffer;
1196 s->dsp.gmc1(dest_cr + (dest_offset>>1), ptr, uvlinesize, 8, motion_x&15, motion_y&15, 128 - s->no_rounding);
1201 static inline void gmc_motion(MpegEncContext *s,
1202 UINT8 *dest_y, UINT8 *dest_cb, UINT8 *dest_cr,
1204 UINT8 **ref_picture, int src_offset)
1207 int linesize, uvlinesize;
1208 const int a= s->sprite_warping_accuracy;
1211 linesize = s->linesize;
1212 uvlinesize = s->uvlinesize;
1214 ptr = ref_picture[0] + src_offset;
1216 dest_y+=dest_offset;
1218 ox= s->sprite_offset[0][0] + s->sprite_delta[0][0]*s->mb_x*16 + s->sprite_delta[0][1]*s->mb_y*16;
1219 oy= s->sprite_offset[0][1] + s->sprite_delta[1][0]*s->mb_x*16 + s->sprite_delta[1][1]*s->mb_y*16;
1221 s->dsp.gmc(dest_y, ptr, linesize, 16,
1224 s->sprite_delta[0][0], s->sprite_delta[0][1],
1225 s->sprite_delta[1][0], s->sprite_delta[1][1],
1226 a+1, (1<<(2*a+1)) - s->no_rounding,
1227 s->h_edge_pos, s->v_edge_pos);
1228 s->dsp.gmc(dest_y+8, ptr, linesize, 16,
1229 ox + s->sprite_delta[0][0]*8,
1230 oy + s->sprite_delta[1][0]*8,
1231 s->sprite_delta[0][0], s->sprite_delta[0][1],
1232 s->sprite_delta[1][0], s->sprite_delta[1][1],
1233 a+1, (1<<(2*a+1)) - s->no_rounding,
1234 s->h_edge_pos, s->v_edge_pos);
1236 if(s->flags&CODEC_FLAG_GRAY) return;
1239 dest_cb+=dest_offset>>1;
1240 dest_cr+=dest_offset>>1;
1242 ox= s->sprite_offset[1][0] + s->sprite_delta[0][0]*s->mb_x*8 + s->sprite_delta[0][1]*s->mb_y*8;
1243 oy= s->sprite_offset[1][1] + s->sprite_delta[1][0]*s->mb_x*8 + s->sprite_delta[1][1]*s->mb_y*8;
1245 ptr = ref_picture[1] + (src_offset>>1);
1246 s->dsp.gmc(dest_cb, ptr, uvlinesize, 8,
1249 s->sprite_delta[0][0], s->sprite_delta[0][1],
1250 s->sprite_delta[1][0], s->sprite_delta[1][1],
1251 a+1, (1<<(2*a+1)) - s->no_rounding,
1252 s->h_edge_pos>>1, s->v_edge_pos>>1);
1254 ptr = ref_picture[2] + (src_offset>>1);
1255 s->dsp.gmc(dest_cr, ptr, uvlinesize, 8,
1258 s->sprite_delta[0][0], s->sprite_delta[0][1],
1259 s->sprite_delta[1][0], s->sprite_delta[1][1],
1260 a+1, (1<<(2*a+1)) - s->no_rounding,
1261 s->h_edge_pos>>1, s->v_edge_pos>>1);
1265 static void emulated_edge_mc(MpegEncContext *s, UINT8 *src, int linesize, int block_w, int block_h,
1266 int src_x, int src_y, int w, int h){
1268 int start_y, start_x, end_y, end_x;
1269 UINT8 *buf= s->edge_emu_buffer;
1272 src+= (h-1-src_y)*linesize;
1274 }else if(src_y<=-block_h){
1275 src+= (1-block_h-src_y)*linesize;
1281 }else if(src_x<=-block_w){
1282 src+= (1-block_w-src_x);
1286 start_y= FFMAX(0, -src_y);
1287 start_x= FFMAX(0, -src_x);
1288 end_y= FFMIN(block_h, h-src_y);
1289 end_x= FFMIN(block_w, w-src_x);
1291 // copy existing part
1292 for(y=start_y; y<end_y; y++){
1293 for(x=start_x; x<end_x; x++){
1294 buf[x + y*linesize]= src[x + y*linesize];
1299 for(y=0; y<start_y; y++){
1300 for(x=start_x; x<end_x; x++){
1301 buf[x + y*linesize]= buf[x + start_y*linesize];
1306 for(y=end_y; y<block_h; y++){
1307 for(x=start_x; x<end_x; x++){
1308 buf[x + y*linesize]= buf[x + (end_y-1)*linesize];
1312 for(y=0; y<block_h; y++){
1314 for(x=0; x<start_x; x++){
1315 buf[x + y*linesize]= buf[start_x + y*linesize];
1319 for(x=end_x; x<block_w; x++){
1320 buf[x + y*linesize]= buf[end_x - 1 + y*linesize];
1326 /* apply one mpeg motion vector to the three components */
1327 static inline void mpeg_motion(MpegEncContext *s,
1328 UINT8 *dest_y, UINT8 *dest_cb, UINT8 *dest_cr,
1330 UINT8 **ref_picture, int src_offset,
1331 int field_based, op_pixels_func (*pix_op)[4],
1332 int motion_x, int motion_y, int h)
1335 int dxy, offset, mx, my, src_x, src_y, height, v_edge_pos, linesize, uvlinesize;
1338 if(s->quarter_sample)
1344 dxy = ((motion_y & 1) << 1) | (motion_x & 1);
1345 src_x = s->mb_x * 16 + (motion_x >> 1);
1346 src_y = s->mb_y * (16 >> field_based) + (motion_y >> 1);
1348 /* WARNING: do no forget half pels */
1349 height = s->height >> field_based;
1350 v_edge_pos = s->v_edge_pos >> field_based;
1351 src_x = clip(src_x, -16, s->width);
1352 if (src_x == s->width)
1354 src_y = clip(src_y, -16, height);
1355 if (src_y == height)
1357 linesize = s->linesize << field_based;
1358 uvlinesize = s->uvlinesize << field_based;
1359 ptr = ref_picture[0] + (src_y * linesize) + (src_x) + src_offset;
1360 dest_y += dest_offset;
1362 if(s->flags&CODEC_FLAG_EMU_EDGE){
1363 if(src_x<0 || src_y<0 || src_x + (motion_x&1) + 16 > s->h_edge_pos
1364 || src_y + (motion_y&1) + h > v_edge_pos){
1365 emulated_edge_mc(s, ptr - src_offset, s->linesize, 17, 17+field_based,
1366 src_x, src_y<<field_based, s->h_edge_pos, s->v_edge_pos);
1367 ptr= s->edge_emu_buffer + src_offset;
1371 pix_op[0][dxy](dest_y, ptr, linesize, h);
1373 if(s->flags&CODEC_FLAG_GRAY) return;
1375 if (s->out_format == FMT_H263) {
1377 if ((motion_x & 3) != 0)
1379 if ((motion_y & 3) != 0)
1386 dxy = ((my & 1) << 1) | (mx & 1);
1391 src_x = s->mb_x * 8 + mx;
1392 src_y = s->mb_y * (8 >> field_based) + my;
1393 src_x = clip(src_x, -8, s->width >> 1);
1394 if (src_x == (s->width >> 1))
1396 src_y = clip(src_y, -8, height >> 1);
1397 if (src_y == (height >> 1))
1399 offset = (src_y * uvlinesize) + src_x + (src_offset >> 1);
1400 ptr = ref_picture[1] + offset;
1402 emulated_edge_mc(s, ptr - (src_offset >> 1), s->uvlinesize, 9, 9+field_based,
1403 src_x, src_y<<field_based, s->h_edge_pos>>1, s->v_edge_pos>>1);
1404 ptr= s->edge_emu_buffer + (src_offset >> 1);
1406 pix_op[1][dxy](dest_cb + (dest_offset >> 1), ptr, uvlinesize, h >> 1);
1408 ptr = ref_picture[2] + offset;
1410 emulated_edge_mc(s, ptr - (src_offset >> 1), s->uvlinesize, 9, 9+field_based,
1411 src_x, src_y<<field_based, s->h_edge_pos>>1, s->v_edge_pos>>1);
1412 ptr= s->edge_emu_buffer + (src_offset >> 1);
1414 pix_op[1][dxy](dest_cr + (dest_offset >> 1), ptr, uvlinesize, h >> 1);
1417 static inline void qpel_motion(MpegEncContext *s,
1418 UINT8 *dest_y, UINT8 *dest_cb, UINT8 *dest_cr,
1420 UINT8 **ref_picture, int src_offset,
1421 int field_based, op_pixels_func (*pix_op)[4],
1422 qpel_mc_func (*qpix_op)[16],
1423 int motion_x, int motion_y, int h)
1426 int dxy, offset, mx, my, src_x, src_y, height, v_edge_pos, linesize, uvlinesize;
1429 dxy = ((motion_y & 3) << 2) | (motion_x & 3);
1430 src_x = s->mb_x * 16 + (motion_x >> 2);
1431 src_y = s->mb_y * (16 >> field_based) + (motion_y >> 2);
1433 height = s->height >> field_based;
1434 v_edge_pos = s->v_edge_pos >> field_based;
1435 src_x = clip(src_x, -16, s->width);
1436 if (src_x == s->width)
1438 src_y = clip(src_y, -16, height);
1439 if (src_y == height)
1441 linesize = s->linesize << field_based;
1442 uvlinesize = s->uvlinesize << field_based;
1443 ptr = ref_picture[0] + (src_y * linesize) + src_x + src_offset;
1444 dest_y += dest_offset;
1445 //printf("%d %d %d\n", src_x, src_y, dxy);
1447 if(s->flags&CODEC_FLAG_EMU_EDGE){
1448 if(src_x<0 || src_y<0 || src_x + (motion_x&3) + 16 > s->h_edge_pos
1449 || src_y + (motion_y&3) + h > v_edge_pos){
1450 emulated_edge_mc(s, ptr - src_offset, s->linesize, 17, 17+field_based,
1451 src_x, src_y<<field_based, s->h_edge_pos, s->v_edge_pos);
1452 ptr= s->edge_emu_buffer + src_offset;
1457 qpix_op[0][dxy](dest_y, ptr, linesize);
1459 //damn interlaced mode
1460 //FIXME boundary mirroring is not exactly correct here
1461 qpix_op[1][dxy](dest_y , ptr , linesize);
1462 qpix_op[1][dxy](dest_y+8, ptr+8, linesize);
1465 if(s->flags&CODEC_FLAG_GRAY) return;
1470 }else if(s->workaround_bugs&FF_BUG_QPEL_CHROMA){
1471 mx= (motion_x>>1)|(motion_x&1);
1472 my= (motion_y>>1)|(motion_y&1);
1479 dxy= (mx&1) | ((my&1)<<1);
1483 src_x = s->mb_x * 8 + mx;
1484 src_y = s->mb_y * (8 >> field_based) + my;
1485 src_x = clip(src_x, -8, s->width >> 1);
1486 if (src_x == (s->width >> 1))
1488 src_y = clip(src_y, -8, height >> 1);
1489 if (src_y == (height >> 1))
1492 offset = (src_y * uvlinesize) + src_x + (src_offset >> 1);
1493 ptr = ref_picture[1] + offset;
1495 emulated_edge_mc(s, ptr - (src_offset >> 1), s->uvlinesize, 9, 9 + field_based,
1496 src_x, src_y<<field_based, s->h_edge_pos>>1, s->v_edge_pos>>1);
1497 ptr= s->edge_emu_buffer + (src_offset >> 1);
1499 pix_op[1][dxy](dest_cb + (dest_offset >> 1), ptr, uvlinesize, h >> 1);
1501 ptr = ref_picture[2] + offset;
1503 emulated_edge_mc(s, ptr - (src_offset >> 1), s->uvlinesize, 9, 9 + field_based,
1504 src_x, src_y<<field_based, s->h_edge_pos>>1, s->v_edge_pos>>1);
1505 ptr= s->edge_emu_buffer + (src_offset >> 1);
1507 pix_op[1][dxy](dest_cr + (dest_offset >> 1), ptr, uvlinesize, h >> 1);
1511 static inline void MPV_motion(MpegEncContext *s,
1512 UINT8 *dest_y, UINT8 *dest_cb, UINT8 *dest_cr,
1513 int dir, UINT8 **ref_picture,
1514 op_pixels_func (*pix_op)[4], qpel_mc_func (*qpix_op)[16])
1516 int dxy, offset, mx, my, src_x, src_y, motion_x, motion_y;
1524 switch(s->mv_type) {
1527 if(s->real_sprite_warping_points==1){
1528 gmc1_motion(s, dest_y, dest_cb, dest_cr, 0,
1531 gmc_motion(s, dest_y, dest_cb, dest_cr, 0,
1534 }else if(s->quarter_sample){
1535 qpel_motion(s, dest_y, dest_cb, dest_cr, 0,
1538 s->mv[dir][0][0], s->mv[dir][0][1], 16);
1540 mpeg_motion(s, dest_y, dest_cb, dest_cr, 0,
1543 s->mv[dir][0][0], s->mv[dir][0][1], 16);
1549 if(s->quarter_sample){
1551 motion_x = s->mv[dir][i][0];
1552 motion_y = s->mv[dir][i][1];
1554 dxy = ((motion_y & 3) << 2) | (motion_x & 3);
1555 src_x = mb_x * 16 + (motion_x >> 2) + (i & 1) * 8;
1556 src_y = mb_y * 16 + (motion_y >> 2) + (i >>1) * 8;
1558 /* WARNING: do no forget half pels */
1559 src_x = clip(src_x, -16, s->width);
1560 if (src_x == s->width)
1562 src_y = clip(src_y, -16, s->height);
1563 if (src_y == s->height)
1566 ptr = ref_picture[0] + (src_y * s->linesize) + (src_x);
1567 if(s->flags&CODEC_FLAG_EMU_EDGE){
1568 if(src_x<0 || src_y<0 || src_x + (motion_x&3) + 8 > s->h_edge_pos
1569 || src_y + (motion_y&3) + 8 > s->v_edge_pos){
1570 emulated_edge_mc(s, ptr, s->linesize, 9, 9, src_x, src_y, s->h_edge_pos, s->v_edge_pos);
1571 ptr= s->edge_emu_buffer;
1574 dest = dest_y + ((i & 1) * 8) + (i >> 1) * 8 * s->linesize;
1575 qpix_op[1][dxy](dest, ptr, s->linesize);
1577 mx += s->mv[dir][i][0]/2;
1578 my += s->mv[dir][i][1]/2;
1582 motion_x = s->mv[dir][i][0];
1583 motion_y = s->mv[dir][i][1];
1585 dxy = ((motion_y & 1) << 1) | (motion_x & 1);
1586 src_x = mb_x * 16 + (motion_x >> 1) + (i & 1) * 8;
1587 src_y = mb_y * 16 + (motion_y >> 1) + (i >>1) * 8;
1589 /* WARNING: do no forget half pels */
1590 src_x = clip(src_x, -16, s->width);
1591 if (src_x == s->width)
1593 src_y = clip(src_y, -16, s->height);
1594 if (src_y == s->height)
1597 ptr = ref_picture[0] + (src_y * s->linesize) + (src_x);
1598 if(s->flags&CODEC_FLAG_EMU_EDGE){
1599 if(src_x<0 || src_y<0 || src_x + (motion_x&1) + 8 > s->h_edge_pos
1600 || src_y + (motion_y&1) + 8 > s->v_edge_pos){
1601 emulated_edge_mc(s, ptr, s->linesize, 9, 9, src_x, src_y, s->h_edge_pos, s->v_edge_pos);
1602 ptr= s->edge_emu_buffer;
1605 dest = dest_y + ((i & 1) * 8) + (i >> 1) * 8 * s->linesize;
1606 pix_op[1][dxy](dest, ptr, s->linesize, 8);
1608 mx += s->mv[dir][i][0];
1609 my += s->mv[dir][i][1];
1613 if(s->flags&CODEC_FLAG_GRAY) break;
1614 /* In case of 8X8, we construct a single chroma motion vector
1615 with a special rounding */
1619 mx = (h263_chroma_roundtab[mx & 0xf] + ((mx >> 3) & ~1));
1622 mx = -(h263_chroma_roundtab[mx & 0xf] + ((mx >> 3) & ~1));
1625 my = (h263_chroma_roundtab[my & 0xf] + ((my >> 3) & ~1));
1628 my = -(h263_chroma_roundtab[my & 0xf] + ((my >> 3) & ~1));
1630 dxy = ((my & 1) << 1) | (mx & 1);
1634 src_x = mb_x * 8 + mx;
1635 src_y = mb_y * 8 + my;
1636 src_x = clip(src_x, -8, s->width/2);
1637 if (src_x == s->width/2)
1639 src_y = clip(src_y, -8, s->height/2);
1640 if (src_y == s->height/2)
1643 offset = (src_y * (s->uvlinesize)) + src_x;
1644 ptr = ref_picture[1] + offset;
1645 if(s->flags&CODEC_FLAG_EMU_EDGE){
1646 if(src_x<0 || src_y<0 || src_x + (dxy &1) + 8 > s->h_edge_pos>>1
1647 || src_y + (dxy>>1) + 8 > s->v_edge_pos>>1){
1648 emulated_edge_mc(s, ptr, s->uvlinesize, 9, 9, src_x, src_y, s->h_edge_pos>>1, s->v_edge_pos>>1);
1649 ptr= s->edge_emu_buffer;
1653 pix_op[1][dxy](dest_cb, ptr, s->uvlinesize, 8);
1655 ptr = ref_picture[2] + offset;
1657 emulated_edge_mc(s, ptr, s->uvlinesize, 9, 9, src_x, src_y, s->h_edge_pos>>1, s->v_edge_pos>>1);
1658 ptr= s->edge_emu_buffer;
1660 pix_op[1][dxy](dest_cr, ptr, s->uvlinesize, 8);
1663 if (s->picture_structure == PICT_FRAME) {
1664 if(s->quarter_sample){
1666 qpel_motion(s, dest_y, dest_cb, dest_cr, 0,
1667 ref_picture, s->field_select[dir][0] ? s->linesize : 0,
1669 s->mv[dir][0][0], s->mv[dir][0][1], 8);
1671 qpel_motion(s, dest_y, dest_cb, dest_cr, s->linesize,
1672 ref_picture, s->field_select[dir][1] ? s->linesize : 0,
1674 s->mv[dir][1][0], s->mv[dir][1][1], 8);
1677 mpeg_motion(s, dest_y, dest_cb, dest_cr, 0,
1678 ref_picture, s->field_select[dir][0] ? s->linesize : 0,
1680 s->mv[dir][0][0], s->mv[dir][0][1], 8);
1682 mpeg_motion(s, dest_y, dest_cb, dest_cr, s->linesize,
1683 ref_picture, s->field_select[dir][1] ? s->linesize : 0,
1685 s->mv[dir][1][0], s->mv[dir][1][1], 8);
1696 /* put block[] to dest[] */
1697 static inline void put_dct(MpegEncContext *s,
1698 DCTELEM *block, int i, UINT8 *dest, int line_size)
1700 s->dct_unquantize(s, block, i, s->qscale);
1701 s->idct_put (dest, line_size, block);
1704 /* add block[] to dest[] */
1705 static inline void add_dct(MpegEncContext *s,
1706 DCTELEM *block, int i, UINT8 *dest, int line_size)
1708 if (s->block_last_index[i] >= 0) {
1709 s->idct_add (dest, line_size, block);
1713 static inline void add_dequant_dct(MpegEncContext *s,
1714 DCTELEM *block, int i, UINT8 *dest, int line_size)
1716 if (s->block_last_index[i] >= 0) {
1717 s->dct_unquantize(s, block, i, s->qscale);
1719 s->idct_add (dest, line_size, block);
1724 * cleans dc, ac, coded_block for the current non intra MB
1726 void ff_clean_intra_table_entries(MpegEncContext *s)
1728 int wrap = s->block_wrap[0];
1729 int xy = s->block_index[0];
1732 s->dc_val[0][xy + 1 ] =
1733 s->dc_val[0][xy + wrap] =
1734 s->dc_val[0][xy + 1 + wrap] = 1024;
1736 memset(s->ac_val[0][xy ], 0, 32 * sizeof(INT16));
1737 memset(s->ac_val[0][xy + wrap], 0, 32 * sizeof(INT16));
1738 if (s->msmpeg4_version>=3) {
1739 s->coded_block[xy ] =
1740 s->coded_block[xy + 1 ] =
1741 s->coded_block[xy + wrap] =
1742 s->coded_block[xy + 1 + wrap] = 0;
1745 wrap = s->block_wrap[4];
1746 xy = s->mb_x + 1 + (s->mb_y + 1) * wrap;
1748 s->dc_val[2][xy] = 1024;
1750 memset(s->ac_val[1][xy], 0, 16 * sizeof(INT16));
1751 memset(s->ac_val[2][xy], 0, 16 * sizeof(INT16));
1753 s->mbintra_table[s->mb_x + s->mb_y*s->mb_width]= 0;
1756 /* generic function called after a macroblock has been parsed by the
1757 decoder or after it has been encoded by the encoder.
1759 Important variables used:
1760 s->mb_intra : true if intra macroblock
1761 s->mv_dir : motion vector direction
1762 s->mv_type : motion vector type
1763 s->mv : motion vector
1764 s->interlaced_dct : true if interlaced dct used (mpeg2)
1766 void MPV_decode_mb(MpegEncContext *s, DCTELEM block[6][64])
1769 const int mb_xy = s->mb_y * s->mb_width + s->mb_x;
1774 s->current_picture.qscale_table[mb_xy]= s->qscale;
1776 /* update DC predictors for P macroblocks */
1778 if (s->h263_pred || s->h263_aic) {
1779 if(s->mbintra_table[mb_xy])
1780 ff_clean_intra_table_entries(s);
1784 s->last_dc[2] = 128 << s->intra_dc_precision;
1787 else if (s->h263_pred || s->h263_aic)
1788 s->mbintra_table[mb_xy]=1;
1790 /* update motion predictor, not for B-frames as they need the motion_val from the last P/S-Frame */
1791 if (s->out_format == FMT_H263 && s->pict_type!=B_TYPE) { //FIXME move into h263.c if possible, format specific stuff shouldnt be here
1793 const int wrap = s->block_wrap[0];
1794 const int xy = s->block_index[0];
1795 const int mb_index= s->mb_x + s->mb_y*s->mb_width;
1796 if(s->mv_type == MV_TYPE_8X8){
1797 s->co_located_type_table[mb_index]= CO_LOCATED_TYPE_4MV;
1799 int motion_x, motion_y;
1803 if(s->co_located_type_table)
1804 s->co_located_type_table[mb_index]= 0;
1805 } else if (s->mv_type == MV_TYPE_16X16) {
1806 motion_x = s->mv[0][0][0];
1807 motion_y = s->mv[0][0][1];
1808 if(s->co_located_type_table)
1809 s->co_located_type_table[mb_index]= 0;
1810 } else /*if (s->mv_type == MV_TYPE_FIELD)*/ {
1812 motion_x = s->mv[0][0][0] + s->mv[0][1][0];
1813 motion_y = s->mv[0][0][1] + s->mv[0][1][1];
1814 motion_x = (motion_x>>1) | (motion_x&1);
1816 s->field_mv_table[mb_index][i][0]= s->mv[0][i][0];
1817 s->field_mv_table[mb_index][i][1]= s->mv[0][i][1];
1818 s->field_select_table[mb_index][i]= s->field_select[0][i];
1820 s->co_located_type_table[mb_index]= CO_LOCATED_TYPE_FIELDMV;
1822 /* no update if 8X8 because it has been done during parsing */
1823 s->motion_val[xy][0] = motion_x;
1824 s->motion_val[xy][1] = motion_y;
1825 s->motion_val[xy + 1][0] = motion_x;
1826 s->motion_val[xy + 1][1] = motion_y;
1827 s->motion_val[xy + wrap][0] = motion_x;
1828 s->motion_val[xy + wrap][1] = motion_y;
1829 s->motion_val[xy + 1 + wrap][0] = motion_x;
1830 s->motion_val[xy + 1 + wrap][1] = motion_y;
1834 if ((s->flags&CODEC_FLAG_PSNR) || !(s->encoding && (s->intra_only || s->pict_type==B_TYPE))) { //FIXME precalc
1835 UINT8 *dest_y, *dest_cb, *dest_cr;
1836 int dct_linesize, dct_offset;
1837 op_pixels_func (*op_pix)[4];
1838 qpel_mc_func (*op_qpix)[16];
1840 /* avoid copy if macroblock skipped in last frame too */
1841 if (s->pict_type != B_TYPE) {
1842 s->current_picture.mbskip_table[mb_xy]= s->mb_skiped;
1845 /* skip only during decoding as we might trash the buffers during encoding a bit */
1847 UINT8 *mbskip_ptr = &s->mbskip_table[mb_xy];
1848 const int age= s->current_picture.age;
1854 assert(s->pict_type!=I_TYPE);
1856 (*mbskip_ptr) ++; /* indicate that this time we skiped it */
1857 if(*mbskip_ptr >99) *mbskip_ptr= 99;
1859 /* if previous was skipped too, then nothing to do ! */
1860 if (*mbskip_ptr >= age){
1861 //if(s->pict_type!=B_TYPE && s->mb_x==0) printf("\n");
1862 //if(s->pict_type!=B_TYPE) printf("%d%d ", *mbskip_ptr, age);
1863 if(s->pict_type!=B_TYPE) return;
1864 if(s->avctx->draw_horiz_band==NULL && *mbskip_ptr > age) return;
1865 /* we dont draw complete frames here so we cant skip */
1868 *mbskip_ptr = 0; /* not skipped */
1873 if(s->pict_type==B_TYPE && s->avctx->draw_horiz_band){
1874 dest_y = s->current_picture.data[0] + mb_x * 16;
1875 dest_cb = s->current_picture.data[1] + mb_x * 8;
1876 dest_cr = s->current_picture.data[2] + mb_x * 8;
1878 dest_y = s->current_picture.data[0] + (mb_y * 16* s->linesize ) + mb_x * 16;
1879 dest_cb = s->current_picture.data[1] + (mb_y * 8 * s->uvlinesize) + mb_x * 8;
1880 dest_cr = s->current_picture.data[2] + (mb_y * 8 * s->uvlinesize) + mb_x * 8;
1883 if (s->interlaced_dct) {
1884 dct_linesize = s->linesize * 2;
1885 dct_offset = s->linesize;
1887 dct_linesize = s->linesize;
1888 dct_offset = s->linesize * 8;
1892 /* motion handling */
1893 /* decoding or more than one mb_type (MC was allready done otherwise) */
1894 if((!s->encoding) || (s->mb_type[mb_xy]&(s->mb_type[mb_xy]-1))){
1895 if ((!s->no_rounding) || s->pict_type==B_TYPE){
1896 op_pix = s->dsp.put_pixels_tab;
1897 op_qpix= s->dsp.put_qpel_pixels_tab;
1899 op_pix = s->dsp.put_no_rnd_pixels_tab;
1900 op_qpix= s->dsp.put_no_rnd_qpel_pixels_tab;
1903 if (s->mv_dir & MV_DIR_FORWARD) {
1904 MPV_motion(s, dest_y, dest_cb, dest_cr, 0, s->last_picture.data, op_pix, op_qpix);
1905 op_pix = s->dsp.avg_pixels_tab;
1906 op_qpix= s->dsp.avg_qpel_pixels_tab;
1908 if (s->mv_dir & MV_DIR_BACKWARD) {
1909 MPV_motion(s, dest_y, dest_cb, dest_cr, 1, s->next_picture.data, op_pix, op_qpix);
1913 /* skip dequant / idct if we are really late ;) */
1914 if(s->hurry_up>1) return;
1916 /* add dct residue */
1917 if(s->encoding || !( s->mpeg2 || s->h263_msmpeg4 || s->codec_id==CODEC_ID_MPEG1VIDEO
1918 || (s->codec_id==CODEC_ID_MPEG4 && !s->mpeg_quant))){
1919 add_dequant_dct(s, block[0], 0, dest_y, dct_linesize);
1920 add_dequant_dct(s, block[1], 1, dest_y + 8, dct_linesize);
1921 add_dequant_dct(s, block[2], 2, dest_y + dct_offset, dct_linesize);
1922 add_dequant_dct(s, block[3], 3, dest_y + dct_offset + 8, dct_linesize);
1924 if(!(s->flags&CODEC_FLAG_GRAY)){
1925 add_dequant_dct(s, block[4], 4, dest_cb, s->uvlinesize);
1926 add_dequant_dct(s, block[5], 5, dest_cr, s->uvlinesize);
1929 add_dct(s, block[0], 0, dest_y, dct_linesize);
1930 add_dct(s, block[1], 1, dest_y + 8, dct_linesize);
1931 add_dct(s, block[2], 2, dest_y + dct_offset, dct_linesize);
1932 add_dct(s, block[3], 3, dest_y + dct_offset + 8, dct_linesize);
1934 if(!(s->flags&CODEC_FLAG_GRAY)){
1935 add_dct(s, block[4], 4, dest_cb, s->uvlinesize);
1936 add_dct(s, block[5], 5, dest_cr, s->uvlinesize);
1940 /* dct only in intra block */
1941 if(s->encoding || !(s->mpeg2 || s->codec_id==CODEC_ID_MPEG1VIDEO)){
1942 put_dct(s, block[0], 0, dest_y, dct_linesize);
1943 put_dct(s, block[1], 1, dest_y + 8, dct_linesize);
1944 put_dct(s, block[2], 2, dest_y + dct_offset, dct_linesize);
1945 put_dct(s, block[3], 3, dest_y + dct_offset + 8, dct_linesize);
1947 if(!(s->flags&CODEC_FLAG_GRAY)){
1948 put_dct(s, block[4], 4, dest_cb, s->uvlinesize);
1949 put_dct(s, block[5], 5, dest_cr, s->uvlinesize);
1952 s->idct_put(dest_y , dct_linesize, block[0]);
1953 s->idct_put(dest_y + 8, dct_linesize, block[1]);
1954 s->idct_put(dest_y + dct_offset , dct_linesize, block[2]);
1955 s->idct_put(dest_y + dct_offset + 8, dct_linesize, block[3]);
1957 if(!(s->flags&CODEC_FLAG_GRAY)){
1958 s->idct_put(dest_cb, s->uvlinesize, block[4]);
1959 s->idct_put(dest_cr, s->uvlinesize, block[5]);
1966 static inline void dct_single_coeff_elimination(MpegEncContext *s, int n, int threshold)
1968 static const char tab[64]=
1980 DCTELEM *block= s->block[n];
1981 const int last_index= s->block_last_index[n];
1986 threshold= -threshold;
1990 /* are all which we could set to zero are allready zero? */
1991 if(last_index<=skip_dc - 1) return;
1993 for(i=0; i<=last_index; i++){
1994 const int j = s->intra_scantable.permutated[i];
1995 const int level = ABS(block[j]);
1997 if(skip_dc && i==0) continue;
2006 if(score >= threshold) return;
2007 for(i=skip_dc; i<=last_index; i++){
2008 const int j = s->intra_scantable.permutated[i];
2011 if(block[0]) s->block_last_index[n]= 0;
2012 else s->block_last_index[n]= -1;
2015 static inline void clip_coeffs(MpegEncContext *s, DCTELEM *block, int last_index)
2018 const int maxlevel= s->max_qcoeff;
2019 const int minlevel= s->min_qcoeff;
2022 i=1; //skip clipping of intra dc
2026 for(;i<=last_index; i++){
2027 const int j= s->intra_scantable.permutated[i];
2028 int level = block[j];
2030 if (level>maxlevel) level=maxlevel;
2031 else if(level<minlevel) level=minlevel;
2036 static inline void requantize_coeffs(MpegEncContext *s, DCTELEM block[64], int oldq, int newq, int n)
2041 i=1; //skip clipping of intra dc
2042 //FIXME requantize, note (mpeg1/h263/h263p-aic dont need it,...)
2046 for(;i<=s->block_last_index[n]; i++){
2047 const int j = s->intra_scantable.permutated[i];
2048 int level = block[j];
2050 block[j]= ROUNDED_DIV(level*oldq, newq);
2053 for(i=s->block_last_index[n]; i>=0; i--){
2054 const int j = s->intra_scantable.permutated[i];
2057 s->block_last_index[n]= i;
2060 static inline void auto_requantize_coeffs(MpegEncContext *s, DCTELEM block[6][64])
2063 const int maxlevel= s->max_qcoeff;
2064 const int minlevel= s->min_qcoeff;
2065 int largest=0, smallest=0;
2067 assert(s->adaptive_quant);
2071 i=1; //skip clipping of intra dc
2072 //FIXME requantize, note (mpeg1/h263/h263p-aic dont need it,...)
2076 for(;i<=s->block_last_index[n]; i++){
2077 const int j = s->intra_scantable.permutated[i];
2078 int level = block[n][j];
2079 if(largest < level) largest = level;
2080 if(smallest > level) smallest= level;
2084 for(newq=s->qscale+1; newq<32; newq++){
2085 if( ROUNDED_DIV(smallest*s->qscale, newq) >= minlevel
2086 && ROUNDED_DIV(largest *s->qscale, newq) <= maxlevel)
2090 if(s->out_format==FMT_H263){
2091 /* h263 like formats cannot change qscale by more than 2 easiely */
2092 if(s->avctx->qmin + 2 < newq)
2093 newq= s->avctx->qmin + 2;
2097 requantize_coeffs(s, block[n], s->qscale, newq, n);
2098 clip_coeffs(s, block[n], s->block_last_index[n]);
2101 s->dquant+= newq - s->qscale;
2105 static int pix_vcmp16x8(UINT8 *s, int stride){ //FIXME move to dsputil & optimize
2110 for(x=0; x<16; x+=4){
2111 score+= ABS(s[x ] - s[x +stride]) + ABS(s[x+1] - s[x+1+stride])
2112 +ABS(s[x+2] - s[x+2+stride]) + ABS(s[x+3] - s[x+3+stride]);
2120 static int pix_diff_vcmp16x8(UINT8 *s1, UINT8*s2, int stride){ //FIXME move to dsputil & optimize
2125 for(x=0; x<16; x++){
2126 score+= ABS(s1[x ] - s2[x ] - s1[x +stride] + s2[x +stride]);
2135 #define SQ(a) ((a)*(a))
2137 static int pix_vcmp16x8(UINT8 *s, int stride){ //FIXME move to dsputil & optimize
2142 for(x=0; x<16; x+=4){
2143 score+= SQ(s[x ] - s[x +stride]) + SQ(s[x+1] - s[x+1+stride])
2144 +SQ(s[x+2] - s[x+2+stride]) + SQ(s[x+3] - s[x+3+stride]);
2152 static int pix_diff_vcmp16x8(UINT8 *s1, UINT8*s2, int stride){ //FIXME move to dsputil & optimize
2157 for(x=0; x<16; x++){
2158 score+= SQ(s1[x ] - s2[x ] - s1[x +stride] + s2[x +stride]);
2169 void ff_draw_horiz_band(MpegEncContext *s){
2170 if ( s->avctx->draw_horiz_band
2171 && (s->num_available_buffers>=1 || (!s->has_b_frames)) ) {
2179 if(s->pict_type==B_TYPE)
2182 offset = y * s->linesize;
2184 if(s->pict_type==B_TYPE || (!s->has_b_frames)){
2185 src_ptr[0] = s->current_picture.data[0] + offset;
2186 src_ptr[1] = s->current_picture.data[1] + (offset >> 2);
2187 src_ptr[2] = s->current_picture.data[2] + (offset >> 2);
2189 src_ptr[0] = s->last_picture.data[0] + offset;
2190 src_ptr[1] = s->last_picture.data[1] + (offset >> 2);
2191 src_ptr[2] = s->last_picture.data[2] + (offset >> 2);
2195 s->avctx->draw_horiz_band(s->avctx, src_ptr, s->linesize,
2200 static void encode_mb(MpegEncContext *s, int motion_x, int motion_y)
2202 const int mb_x= s->mb_x;
2203 const int mb_y= s->mb_y;
2206 int dct_offset = s->linesize*8; //default for progressive frames
2208 for(i=0; i<6; i++) skip_dct[i]=0;
2210 if(s->adaptive_quant){
2211 s->dquant= s->current_picture.qscale_table[mb_x + mb_y*s->mb_width] - s->qscale;
2213 if(s->out_format==FMT_H263){
2214 if (s->dquant> 2) s->dquant= 2;
2215 else if(s->dquant<-2) s->dquant=-2;
2218 if(s->codec_id==CODEC_ID_MPEG4){
2220 assert(s->dquant==0 || s->mv_type!=MV_TYPE_8X8);
2222 if(s->mv_dir&MV_DIRECT)
2226 s->qscale+= s->dquant;
2227 s->y_dc_scale= s->y_dc_scale_table[ s->qscale ];
2228 s->c_dc_scale= s->c_dc_scale_table[ s->qscale ];
2236 wrap_y = s->linesize;
2237 ptr = s->new_picture.data[0] + (mb_y * 16 * wrap_y) + mb_x * 16;
2239 if(mb_x*16+16 > s->width || mb_y*16+16 > s->height){
2240 emulated_edge_mc(s, ptr, wrap_y, 16, 16, mb_x*16, mb_y*16, s->width, s->height);
2241 ptr= s->edge_emu_buffer;
2245 if(s->flags&CODEC_FLAG_INTERLACED_DCT){
2246 int progressive_score, interlaced_score;
2248 progressive_score= pix_vcmp16x8(ptr, wrap_y ) + pix_vcmp16x8(ptr + wrap_y*8, wrap_y );
2249 interlaced_score = pix_vcmp16x8(ptr, wrap_y*2) + pix_vcmp16x8(ptr + wrap_y , wrap_y*2);
2251 if(progressive_score > interlaced_score + 100){
2252 s->interlaced_dct=1;
2257 s->interlaced_dct=0;
2260 s->dsp.get_pixels(s->block[0], ptr , wrap_y);
2261 s->dsp.get_pixels(s->block[1], ptr + 8, wrap_y);
2262 s->dsp.get_pixels(s->block[2], ptr + dct_offset , wrap_y);
2263 s->dsp.get_pixels(s->block[3], ptr + dct_offset + 8, wrap_y);
2265 if(s->flags&CODEC_FLAG_GRAY){
2269 int wrap_c = s->uvlinesize;
2270 ptr = s->new_picture.data[1] + (mb_y * 8 * wrap_c) + mb_x * 8;
2272 emulated_edge_mc(s, ptr, wrap_c, 8, 8, mb_x*8, mb_y*8, s->width>>1, s->height>>1);
2273 ptr= s->edge_emu_buffer;
2275 s->dsp.get_pixels(s->block[4], ptr, wrap_c);
2277 ptr = s->new_picture.data[2] + (mb_y * 8 * wrap_c) + mb_x * 8;
2279 emulated_edge_mc(s, ptr, wrap_c, 8, 8, mb_x*8, mb_y*8, s->width>>1, s->height>>1);
2280 ptr= s->edge_emu_buffer;
2282 s->dsp.get_pixels(s->block[5], ptr, wrap_c);
2285 op_pixels_func (*op_pix)[4];
2286 qpel_mc_func (*op_qpix)[16];
2287 UINT8 *dest_y, *dest_cb, *dest_cr;
2288 UINT8 *ptr_y, *ptr_cb, *ptr_cr;
2292 dest_y = s->current_picture.data[0] + (mb_y * 16 * s->linesize ) + mb_x * 16;
2293 dest_cb = s->current_picture.data[1] + (mb_y * 8 * (s->uvlinesize)) + mb_x * 8;
2294 dest_cr = s->current_picture.data[2] + (mb_y * 8 * (s->uvlinesize)) + mb_x * 8;
2295 wrap_y = s->linesize;
2296 wrap_c = s->uvlinesize;
2297 ptr_y = s->new_picture.data[0] + (mb_y * 16 * wrap_y) + mb_x * 16;
2298 ptr_cb = s->new_picture.data[1] + (mb_y * 8 * wrap_c) + mb_x * 8;
2299 ptr_cr = s->new_picture.data[2] + (mb_y * 8 * wrap_c) + mb_x * 8;
2301 if ((!s->no_rounding) || s->pict_type==B_TYPE){
2302 op_pix = s->dsp.put_pixels_tab;
2303 op_qpix= s->dsp.put_qpel_pixels_tab;
2305 op_pix = s->dsp.put_no_rnd_pixels_tab;
2306 op_qpix= s->dsp.put_no_rnd_qpel_pixels_tab;
2309 if (s->mv_dir & MV_DIR_FORWARD) {
2310 MPV_motion(s, dest_y, dest_cb, dest_cr, 0, s->last_picture.data, op_pix, op_qpix);
2311 op_pix = s->dsp.avg_pixels_tab;
2312 op_qpix= s->dsp.avg_qpel_pixels_tab;
2314 if (s->mv_dir & MV_DIR_BACKWARD) {
2315 MPV_motion(s, dest_y, dest_cb, dest_cr, 1, s->next_picture.data, op_pix, op_qpix);
2318 if(mb_x*16+16 > s->width || mb_y*16+16 > s->height){
2319 emulated_edge_mc(s, ptr_y, wrap_y, 16, 16, mb_x*16, mb_y*16, s->width, s->height);
2320 ptr_y= s->edge_emu_buffer;
2324 if(s->flags&CODEC_FLAG_INTERLACED_DCT){
2325 int progressive_score, interlaced_score;
2327 progressive_score= pix_diff_vcmp16x8(ptr_y , dest_y , wrap_y )
2328 + pix_diff_vcmp16x8(ptr_y + wrap_y*8, dest_y + wrap_y*8, wrap_y );
2329 interlaced_score = pix_diff_vcmp16x8(ptr_y , dest_y , wrap_y*2)
2330 + pix_diff_vcmp16x8(ptr_y + wrap_y , dest_y + wrap_y , wrap_y*2);
2332 if(progressive_score > interlaced_score + 600){
2333 s->interlaced_dct=1;
2338 s->interlaced_dct=0;
2341 s->dsp.diff_pixels(s->block[0], ptr_y , dest_y , wrap_y);
2342 s->dsp.diff_pixels(s->block[1], ptr_y + 8, dest_y + 8, wrap_y);
2343 s->dsp.diff_pixels(s->block[2], ptr_y + dct_offset , dest_y + dct_offset , wrap_y);
2344 s->dsp.diff_pixels(s->block[3], ptr_y + dct_offset + 8, dest_y + dct_offset + 8, wrap_y);
2346 if(s->flags&CODEC_FLAG_GRAY){
2351 emulated_edge_mc(s, ptr_cb, wrap_c, 8, 8, mb_x*8, mb_y*8, s->width>>1, s->height>>1);
2352 ptr_cb= s->edge_emu_buffer;
2354 s->dsp.diff_pixels(s->block[4], ptr_cb, dest_cb, wrap_c);
2356 emulated_edge_mc(s, ptr_cr, wrap_c, 8, 8, mb_x*8, mb_y*8, s->width>>1, s->height>>1);
2357 ptr_cr= s->edge_emu_buffer;
2359 s->dsp.diff_pixels(s->block[5], ptr_cr, dest_cr, wrap_c);
2361 /* pre quantization */
2362 if(s->current_picture.mc_mb_var[s->mb_width*mb_y+ mb_x]<2*s->qscale*s->qscale){
2364 if(s->dsp.pix_abs8x8(ptr_y , dest_y , wrap_y) < 20*s->qscale) skip_dct[0]= 1;
2365 if(s->dsp.pix_abs8x8(ptr_y + 8, dest_y + 8, wrap_y) < 20*s->qscale) skip_dct[1]= 1;
2366 if(s->dsp.pix_abs8x8(ptr_y +dct_offset , dest_y +dct_offset , wrap_y) < 20*s->qscale) skip_dct[2]= 1;
2367 if(s->dsp.pix_abs8x8(ptr_y +dct_offset+ 8, dest_y +dct_offset+ 8, wrap_y) < 20*s->qscale) skip_dct[3]= 1;
2368 if(s->dsp.pix_abs8x8(ptr_cb , dest_cb , wrap_c) < 20*s->qscale) skip_dct[4]= 1;
2369 if(s->dsp.pix_abs8x8(ptr_cr , dest_cr , wrap_c) < 20*s->qscale) skip_dct[5]= 1;
2375 if(skip_dct[i]) num++;
2378 if(s->mb_x==0 && s->mb_y==0){
2380 printf("%6d %1d\n", stat[i], i);
2393 adap_parm = ((s->avg_mb_var << 1) + s->mb_var[s->mb_width*mb_y+mb_x] + 1.0) /
2394 ((s->mb_var[s->mb_width*mb_y+mb_x] << 1) + s->avg_mb_var + 1.0);
2396 printf("\ntype=%c qscale=%2d adap=%0.2f dquant=%4.2f var=%4d avgvar=%4d",
2397 (s->mb_type[s->mb_width*mb_y+mb_x] > 0) ? 'I' : 'P',
2398 s->qscale, adap_parm, s->qscale*adap_parm,
2399 s->mb_var[s->mb_width*mb_y+mb_x], s->avg_mb_var);
2402 /* DCT & quantize */
2403 if(s->out_format==FMT_MJPEG){
2406 s->block_last_index[i] = s->dct_quantize(s, s->block[i], i, 8, &overflow);
2407 if (overflow) clip_coeffs(s, s->block[i], s->block_last_index[i]);
2413 s->block_last_index[i] = s->dct_quantize(s, s->block[i], i, s->qscale, &overflow);
2414 // FIXME we could decide to change to quantizer instead of clipping
2415 // JS: I don't think that would be a good idea it could lower quality instead
2416 // of improve it. Just INTRADC clipping deserves changes in quantizer
2417 if (overflow) clip_coeffs(s, s->block[i], s->block_last_index[i]);
2419 s->block_last_index[i]= -1;
2421 if(s->luma_elim_threshold && !s->mb_intra)
2423 dct_single_coeff_elimination(s, i, s->luma_elim_threshold);
2424 if(s->chroma_elim_threshold && !s->mb_intra)
2426 dct_single_coeff_elimination(s, i, s->chroma_elim_threshold);
2429 if((s->flags&CODEC_FLAG_GRAY) && s->mb_intra){
2430 s->block_last_index[4]=
2431 s->block_last_index[5]= 0;
2433 s->block[5][0]= 128;
2436 #ifdef CONFIG_ENCODERS
2437 /* huffman encode */
2438 switch(s->out_format) {
2440 mpeg1_encode_mb(s, s->block, motion_x, motion_y);
2443 if (s->h263_msmpeg4)
2444 msmpeg4_encode_mb(s, s->block, motion_x, motion_y);
2445 else if(s->h263_pred)
2446 mpeg4_encode_mb(s, s->block, motion_x, motion_y);
2448 h263_encode_mb(s, s->block, motion_x, motion_y);
2451 mjpeg_encode_mb(s, s->block);
2457 void ff_copy_bits(PutBitContext *pb, UINT8 *src, int length)
2459 int bytes= length>>4;
2460 int bits= length&15;
2463 if(length==0) return;
2465 for(i=0; i<bytes; i++) put_bits(pb, 16, be2me_16(((uint16_t*)src)[i]));
2466 put_bits(pb, bits, be2me_16(((uint16_t*)src)[i])>>(16-bits));
2469 static inline void copy_context_before_encode(MpegEncContext *d, MpegEncContext *s, int type){
2472 memcpy(d->last_mv, s->last_mv, 2*2*2*sizeof(int)); //FIXME is memcpy faster then a loop?
2475 d->mb_incr= s->mb_incr;
2477 d->last_dc[i]= s->last_dc[i];
2480 d->mv_bits= s->mv_bits;
2481 d->i_tex_bits= s->i_tex_bits;
2482 d->p_tex_bits= s->p_tex_bits;
2483 d->i_count= s->i_count;
2484 d->f_count= s->f_count;
2485 d->b_count= s->b_count;
2486 d->skip_count= s->skip_count;
2487 d->misc_bits= s->misc_bits;
2490 d->mb_skiped= s->mb_skiped;
2493 static inline void copy_context_after_encode(MpegEncContext *d, MpegEncContext *s, int type){
2496 memcpy(d->mv, s->mv, 2*4*2*sizeof(int));
2497 memcpy(d->last_mv, s->last_mv, 2*2*2*sizeof(int)); //FIXME is memcpy faster then a loop?
2500 d->mb_incr= s->mb_incr;
2502 d->last_dc[i]= s->last_dc[i];
2505 d->mv_bits= s->mv_bits;
2506 d->i_tex_bits= s->i_tex_bits;
2507 d->p_tex_bits= s->p_tex_bits;
2508 d->i_count= s->i_count;
2509 d->f_count= s->f_count;
2510 d->b_count= s->b_count;
2511 d->skip_count= s->skip_count;
2512 d->misc_bits= s->misc_bits;
2514 d->mb_intra= s->mb_intra;
2515 d->mb_skiped= s->mb_skiped;
2516 d->mv_type= s->mv_type;
2517 d->mv_dir= s->mv_dir;
2519 if(s->data_partitioning){
2521 d->tex_pb= s->tex_pb;
2525 d->block_last_index[i]= s->block_last_index[i];
2526 d->interlaced_dct= s->interlaced_dct;
2529 static inline void encode_mb_hq(MpegEncContext *s, MpegEncContext *backup, MpegEncContext *best, int type,
2530 PutBitContext pb[2], PutBitContext pb2[2], PutBitContext tex_pb[2],
2531 int *dmin, int *next_block, int motion_x, int motion_y)
2535 copy_context_before_encode(s, backup, type);
2537 s->block= s->blocks[*next_block];
2538 s->pb= pb[*next_block];
2539 if(s->data_partitioning){
2540 s->pb2 = pb2 [*next_block];
2541 s->tex_pb= tex_pb[*next_block];
2544 encode_mb(s, motion_x, motion_y);
2546 bits_count= get_bit_count(&s->pb);
2547 if(s->data_partitioning){
2548 bits_count+= get_bit_count(&s->pb2);
2549 bits_count+= get_bit_count(&s->tex_pb);
2552 if(bits_count<*dmin){
2556 copy_context_after_encode(best, s, type);
2560 static inline int sse(MpegEncContext *s, uint8_t *src1, uint8_t *src2, int w, int h, int stride){
2561 uint32_t *sq = squareTbl + 256;
2566 return s->dsp.pix_norm(src1, src2, stride);
2570 acc+= sq[src1[x + y*stride] - src2[x + y*stride]];
2576 static void encode_picture(MpegEncContext *s, int picture_number)
2578 int mb_x, mb_y, pdif = 0;
2581 MpegEncContext best_s, backup_s;
2582 UINT8 bit_buf[2][3000];
2583 UINT8 bit_buf2[2][3000];
2584 UINT8 bit_buf_tex[2][3000];
2585 PutBitContext pb[2], pb2[2], tex_pb[2];
2588 init_put_bits(&pb [i], bit_buf [i], 3000, NULL, NULL);
2589 init_put_bits(&pb2 [i], bit_buf2 [i], 3000, NULL, NULL);
2590 init_put_bits(&tex_pb[i], bit_buf_tex[i], 3000, NULL, NULL);
2593 s->picture_number = picture_number;
2598 s->block_wrap[3]= s->mb_width*2 + 2;
2600 s->block_wrap[5]= s->mb_width + 2;
2602 /* Reset the average MB variance */
2603 s->current_picture.mb_var_sum = 0;
2604 s->current_picture.mc_mb_var_sum = 0;
2606 /* we need to initialize some time vars before we can encode b-frames */
2607 if (s->h263_pred && !s->h263_msmpeg4)
2608 ff_set_mpeg4_time(s, s->picture_number);
2610 s->scene_change_score=0;
2612 s->qscale= (int)(s->frame_qscale + 0.5); //FIXME qscale / ... stuff for ME ratedistoration
2614 /* Estimate motion for every MB */
2615 if(s->pict_type != I_TYPE){
2616 for(mb_y=0; mb_y < s->mb_height; mb_y++) {
2617 s->block_index[0]= s->block_wrap[0]*(mb_y*2 + 1) - 1;
2618 s->block_index[1]= s->block_wrap[0]*(mb_y*2 + 1);
2619 s->block_index[2]= s->block_wrap[0]*(mb_y*2 + 2) - 1;
2620 s->block_index[3]= s->block_wrap[0]*(mb_y*2 + 2);
2621 for(mb_x=0; mb_x < s->mb_width; mb_x++) {
2624 s->block_index[0]+=2;
2625 s->block_index[1]+=2;
2626 s->block_index[2]+=2;
2627 s->block_index[3]+=2;
2629 /* compute motion vector & mb_type and store in context */
2630 if(s->pict_type==B_TYPE)
2631 ff_estimate_b_frame_motion(s, mb_x, mb_y);
2633 ff_estimate_p_frame_motion(s, mb_x, mb_y);
2634 // s->mb_type[mb_y*s->mb_width + mb_x]=MB_TYPE_INTER;
2637 }else /* if(s->pict_type == I_TYPE) */{
2639 //FIXME do we need to zero them?
2640 memset(s->motion_val[0], 0, sizeof(INT16)*(s->mb_width*2 + 2)*(s->mb_height*2 + 2)*2);
2641 memset(s->p_mv_table , 0, sizeof(INT16)*(s->mb_width+2)*(s->mb_height+2)*2);
2642 memset(s->mb_type , MB_TYPE_INTRA, sizeof(UINT8)*s->mb_width*s->mb_height);
2644 if(!s->fixed_qscale){
2645 /* finding spatial complexity for I-frame rate control */
2646 for(mb_y=0; mb_y < s->mb_height; mb_y++) {
2647 for(mb_x=0; mb_x < s->mb_width; mb_x++) {
2650 uint8_t *pix = s->new_picture.data[0] + (yy * s->linesize) + xx;
2652 int sum = s->dsp.pix_sum(pix, s->linesize);
2654 varc = (s->dsp.pix_norm1(pix, s->linesize) - (((unsigned)(sum*sum))>>8) + 500 + 128)>>8;
2656 s->current_picture.mb_var [s->mb_width * mb_y + mb_x] = varc;
2657 s->current_picture.mb_mean[s->mb_width * mb_y + mb_x] = (sum+128)>>8;
2658 s->current_picture.mb_var_sum += varc;
2665 if(s->scene_change_score > 0 && s->pict_type == P_TYPE){
2666 s->pict_type= I_TYPE;
2667 memset(s->mb_type , MB_TYPE_INTRA, sizeof(UINT8)*s->mb_width*s->mb_height);
2668 //printf("Scene change detected, encoding as I Frame %d %d\n", s->current_picture.mb_var_sum, s->current_picture.mc_mb_var_sum);
2671 if(s->pict_type==P_TYPE || s->pict_type==S_TYPE)
2672 s->f_code= ff_get_best_fcode(s, s->p_mv_table, MB_TYPE_INTER);
2673 ff_fix_long_p_mvs(s);
2674 if(s->pict_type==B_TYPE){
2675 s->f_code= ff_get_best_fcode(s, s->b_forw_mv_table, MB_TYPE_FORWARD);
2676 s->b_code= ff_get_best_fcode(s, s->b_back_mv_table, MB_TYPE_BACKWARD);
2678 ff_fix_long_b_mvs(s, s->b_forw_mv_table, s->f_code, MB_TYPE_FORWARD);
2679 ff_fix_long_b_mvs(s, s->b_back_mv_table, s->b_code, MB_TYPE_BACKWARD);
2680 ff_fix_long_b_mvs(s, s->b_bidir_forw_mv_table, s->f_code, MB_TYPE_BIDIR);
2681 ff_fix_long_b_mvs(s, s->b_bidir_back_mv_table, s->b_code, MB_TYPE_BIDIR);
2684 if (s->fixed_qscale)
2685 s->frame_qscale = s->current_picture.quality;
2687 s->frame_qscale = ff_rate_estimate_qscale(s);
2689 if(s->adaptive_quant){
2690 switch(s->codec_id){
2691 case CODEC_ID_MPEG4:
2692 ff_clean_mpeg4_qscales(s);
2695 case CODEC_ID_H263P:
2696 ff_clean_h263_qscales(s);
2700 s->qscale= s->current_picture.qscale_table[0];
2702 s->qscale= (int)(s->frame_qscale + 0.5);
2704 if (s->out_format == FMT_MJPEG) {
2705 /* for mjpeg, we do include qscale in the matrix */
2706 s->intra_matrix[0] = ff_mpeg1_default_intra_matrix[0];
2708 int j= s->idct_permutation[i];
2710 s->intra_matrix[j] = CLAMP_TO_8BIT((ff_mpeg1_default_intra_matrix[i] * s->qscale) >> 3);
2712 convert_matrix(s, s->q_intra_matrix, s->q_intra_matrix16,
2713 s->q_intra_matrix16_bias, s->intra_matrix, s->intra_quant_bias, 8, 8);
2716 //FIXME var duplication
2717 s->current_picture.key_frame= s->pict_type == I_TYPE;
2718 s->current_picture.pict_type= s->pict_type;
2720 if(s->current_picture.key_frame)
2721 s->picture_in_gop_number=0;
2723 s->last_bits= get_bit_count(&s->pb);
2724 switch(s->out_format) {
2726 mjpeg_picture_header(s);
2729 if (s->h263_msmpeg4)
2730 msmpeg4_encode_picture_header(s, picture_number);
2731 else if (s->h263_pred)
2732 mpeg4_encode_picture_header(s, picture_number);
2733 else if (s->h263_rv10)
2734 rv10_encode_picture_header(s, picture_number);
2736 h263_encode_picture_header(s, picture_number);
2739 mpeg1_encode_picture_header(s, picture_number);
2742 bits= get_bit_count(&s->pb);
2743 s->header_bits= bits - s->last_bits;
2755 /* init last dc values */
2756 /* note: quant matrix value (8) is implied here */
2757 s->last_dc[i] = 128;
2759 s->current_picture.error[i] = 0;
2762 s->last_mv[0][0][0] = 0;
2763 s->last_mv[0][0][1] = 0;
2765 if (s->codec_id==CODEC_ID_H263 || s->codec_id==CODEC_ID_H263P)
2766 s->gob_index = ff_h263_get_gob_height(s);
2768 if(s->codec_id==CODEC_ID_MPEG4 && s->partitioned_frame)
2769 ff_mpeg4_init_partitions(s);
2773 s->first_slice_line = 1;
2774 s->ptr_lastgob = s->pb.buf;
2775 s->ptr_last_mb_line = s->pb.buf;
2776 for(mb_y=0; mb_y < s->mb_height; mb_y++) {
2777 s->y_dc_scale= s->y_dc_scale_table[ s->qscale ];
2778 s->c_dc_scale= s->c_dc_scale_table[ s->qscale ];
2780 s->block_index[0]= s->block_wrap[0]*(mb_y*2 + 1) - 1;
2781 s->block_index[1]= s->block_wrap[0]*(mb_y*2 + 1);
2782 s->block_index[2]= s->block_wrap[0]*(mb_y*2 + 2) - 1;
2783 s->block_index[3]= s->block_wrap[0]*(mb_y*2 + 2);
2784 s->block_index[4]= s->block_wrap[4]*(mb_y + 1) + s->block_wrap[0]*(s->mb_height*2 + 2);
2785 s->block_index[5]= s->block_wrap[4]*(mb_y + 1 + s->mb_height + 2) + s->block_wrap[0]*(s->mb_height*2 + 2);
2786 for(mb_x=0; mb_x < s->mb_width; mb_x++) {
2787 const int mb_type= s->mb_type[mb_y * s->mb_width + mb_x];
2788 const int xy= (mb_y+1) * (s->mb_width+2) + mb_x + 1;
2794 s->block_index[0]+=2;
2795 s->block_index[1]+=2;
2796 s->block_index[2]+=2;
2797 s->block_index[3]+=2;
2798 s->block_index[4]++;
2799 s->block_index[5]++;
2801 /* write gob / video packet header */
2803 int current_packet_size, is_gob_start;
2805 current_packet_size= pbBufPtr(&s->pb) - s->ptr_lastgob;
2808 if(s->codec_id==CODEC_ID_MPEG4){
2809 if(current_packet_size + s->mb_line_avgsize/s->mb_width >= s->rtp_payload_size
2810 && s->mb_y + s->mb_x>0){
2812 if(s->partitioned_frame){
2813 ff_mpeg4_merge_partitions(s);
2814 ff_mpeg4_init_partitions(s);
2816 ff_mpeg4_encode_video_packet_header(s);
2818 if(s->flags&CODEC_FLAG_PASS1){
2819 int bits= get_bit_count(&s->pb);
2820 s->misc_bits+= bits - s->last_bits;
2823 ff_mpeg4_clean_buffers(s);
2827 if(current_packet_size + s->mb_line_avgsize*s->gob_index >= s->rtp_payload_size
2828 && s->mb_x==0 && s->mb_y>0 && s->mb_y%s->gob_index==0){
2830 h263_encode_gob_header(s, mb_y);
2836 s->ptr_lastgob = pbBufPtr(&s->pb);
2837 s->first_slice_line=1;
2838 s->resync_mb_x=mb_x;
2839 s->resync_mb_y=mb_y;
2843 if( (s->resync_mb_x == s->mb_x)
2844 && s->resync_mb_y+1 == s->mb_y){
2845 s->first_slice_line=0;
2848 if(mb_type & (mb_type-1)){ // more than 1 MB type possible
2850 int pb_bits_count, pb2_bits_count, tex_pb_bits_count;
2852 copy_context_before_encode(&backup_s, s, -1);
2854 best_s.data_partitioning= s->data_partitioning;
2855 best_s.partitioned_frame= s->partitioned_frame;
2856 if(s->data_partitioning){
2857 backup_s.pb2= s->pb2;
2858 backup_s.tex_pb= s->tex_pb;
2861 if(mb_type&MB_TYPE_INTER){
2862 s->mv_dir = MV_DIR_FORWARD;
2863 s->mv_type = MV_TYPE_16X16;
2865 s->mv[0][0][0] = s->p_mv_table[xy][0];
2866 s->mv[0][0][1] = s->p_mv_table[xy][1];
2867 encode_mb_hq(s, &backup_s, &best_s, MB_TYPE_INTER, pb, pb2, tex_pb,
2868 &dmin, &next_block, s->mv[0][0][0], s->mv[0][0][1]);
2870 if(mb_type&MB_TYPE_INTER4V){
2871 s->mv_dir = MV_DIR_FORWARD;
2872 s->mv_type = MV_TYPE_8X8;
2875 s->mv[0][i][0] = s->motion_val[s->block_index[i]][0];
2876 s->mv[0][i][1] = s->motion_val[s->block_index[i]][1];
2878 encode_mb_hq(s, &backup_s, &best_s, MB_TYPE_INTER4V, pb, pb2, tex_pb,
2879 &dmin, &next_block, 0, 0);
2881 if(mb_type&MB_TYPE_FORWARD){
2882 s->mv_dir = MV_DIR_FORWARD;
2883 s->mv_type = MV_TYPE_16X16;
2885 s->mv[0][0][0] = s->b_forw_mv_table[xy][0];
2886 s->mv[0][0][1] = s->b_forw_mv_table[xy][1];
2887 encode_mb_hq(s, &backup_s, &best_s, MB_TYPE_FORWARD, pb, pb2, tex_pb,
2888 &dmin, &next_block, s->mv[0][0][0], s->mv[0][0][1]);
2890 if(mb_type&MB_TYPE_BACKWARD){
2891 s->mv_dir = MV_DIR_BACKWARD;
2892 s->mv_type = MV_TYPE_16X16;
2894 s->mv[1][0][0] = s->b_back_mv_table[xy][0];
2895 s->mv[1][0][1] = s->b_back_mv_table[xy][1];
2896 encode_mb_hq(s, &backup_s, &best_s, MB_TYPE_BACKWARD, pb, pb2, tex_pb,
2897 &dmin, &next_block, s->mv[1][0][0], s->mv[1][0][1]);
2899 if(mb_type&MB_TYPE_BIDIR){
2900 s->mv_dir = MV_DIR_FORWARD | MV_DIR_BACKWARD;
2901 s->mv_type = MV_TYPE_16X16;
2903 s->mv[0][0][0] = s->b_bidir_forw_mv_table[xy][0];
2904 s->mv[0][0][1] = s->b_bidir_forw_mv_table[xy][1];
2905 s->mv[1][0][0] = s->b_bidir_back_mv_table[xy][0];
2906 s->mv[1][0][1] = s->b_bidir_back_mv_table[xy][1];
2907 encode_mb_hq(s, &backup_s, &best_s, MB_TYPE_BIDIR, pb, pb2, tex_pb,
2908 &dmin, &next_block, 0, 0);
2910 if(mb_type&MB_TYPE_DIRECT){
2911 s->mv_dir = MV_DIR_FORWARD | MV_DIR_BACKWARD | MV_DIRECT;
2912 s->mv_type = MV_TYPE_16X16; //FIXME
2914 s->mv[0][0][0] = s->b_direct_forw_mv_table[xy][0];
2915 s->mv[0][0][1] = s->b_direct_forw_mv_table[xy][1];
2916 s->mv[1][0][0] = s->b_direct_back_mv_table[xy][0];
2917 s->mv[1][0][1] = s->b_direct_back_mv_table[xy][1];
2918 encode_mb_hq(s, &backup_s, &best_s, MB_TYPE_DIRECT, pb, pb2, tex_pb,
2919 &dmin, &next_block, s->b_direct_mv_table[xy][0], s->b_direct_mv_table[xy][1]);
2921 if(mb_type&MB_TYPE_INTRA){
2922 s->mv_dir = MV_DIR_FORWARD;
2923 s->mv_type = MV_TYPE_16X16;
2927 encode_mb_hq(s, &backup_s, &best_s, MB_TYPE_INTRA, pb, pb2, tex_pb,
2928 &dmin, &next_block, 0, 0);
2929 /* force cleaning of ac/dc pred stuff if needed ... */
2930 if(s->h263_pred || s->h263_aic)
2931 s->mbintra_table[mb_x + mb_y*s->mb_width]=1;
2933 copy_context_after_encode(s, &best_s, -1);
2935 pb_bits_count= get_bit_count(&s->pb);
2936 flush_put_bits(&s->pb);
2937 ff_copy_bits(&backup_s.pb, bit_buf[next_block^1], pb_bits_count);
2940 if(s->data_partitioning){
2941 pb2_bits_count= get_bit_count(&s->pb2);
2942 flush_put_bits(&s->pb2);
2943 ff_copy_bits(&backup_s.pb2, bit_buf2[next_block^1], pb2_bits_count);
2944 s->pb2= backup_s.pb2;
2946 tex_pb_bits_count= get_bit_count(&s->tex_pb);
2947 flush_put_bits(&s->tex_pb);
2948 ff_copy_bits(&backup_s.tex_pb, bit_buf_tex[next_block^1], tex_pb_bits_count);
2949 s->tex_pb= backup_s.tex_pb;
2951 s->last_bits= get_bit_count(&s->pb);
2953 int motion_x, motion_y;
2954 s->mv_type=MV_TYPE_16X16;
2955 // only one MB-Type possible
2958 s->mv_dir = MV_DIR_FORWARD;
2960 motion_x= s->mv[0][0][0] = 0;
2961 motion_y= s->mv[0][0][1] = 0;
2964 s->mv_dir = MV_DIR_FORWARD;
2966 motion_x= s->mv[0][0][0] = s->p_mv_table[xy][0];
2967 motion_y= s->mv[0][0][1] = s->p_mv_table[xy][1];
2969 case MB_TYPE_INTER4V:
2970 s->mv_dir = MV_DIR_FORWARD;
2971 s->mv_type = MV_TYPE_8X8;
2974 s->mv[0][i][0] = s->motion_val[s->block_index[i]][0];
2975 s->mv[0][i][1] = s->motion_val[s->block_index[i]][1];
2977 motion_x= motion_y= 0;
2979 case MB_TYPE_DIRECT:
2980 s->mv_dir = MV_DIR_FORWARD | MV_DIR_BACKWARD | MV_DIRECT;
2982 motion_x=s->b_direct_mv_table[xy][0];
2983 motion_y=s->b_direct_mv_table[xy][1];
2984 s->mv[0][0][0] = s->b_direct_forw_mv_table[xy][0];
2985 s->mv[0][0][1] = s->b_direct_forw_mv_table[xy][1];
2986 s->mv[1][0][0] = s->b_direct_back_mv_table[xy][0];
2987 s->mv[1][0][1] = s->b_direct_back_mv_table[xy][1];
2990 s->mv_dir = MV_DIR_FORWARD | MV_DIR_BACKWARD;
2994 s->mv[0][0][0] = s->b_bidir_forw_mv_table[xy][0];
2995 s->mv[0][0][1] = s->b_bidir_forw_mv_table[xy][1];
2996 s->mv[1][0][0] = s->b_bidir_back_mv_table[xy][0];
2997 s->mv[1][0][1] = s->b_bidir_back_mv_table[xy][1];
2999 case MB_TYPE_BACKWARD:
3000 s->mv_dir = MV_DIR_BACKWARD;
3002 motion_x= s->mv[1][0][0] = s->b_back_mv_table[xy][0];
3003 motion_y= s->mv[1][0][1] = s->b_back_mv_table[xy][1];
3005 case MB_TYPE_FORWARD:
3006 s->mv_dir = MV_DIR_FORWARD;
3008 motion_x= s->mv[0][0][0] = s->b_forw_mv_table[xy][0];
3009 motion_y= s->mv[0][0][1] = s->b_forw_mv_table[xy][1];
3010 // printf(" %d %d ", motion_x, motion_y);
3013 motion_x=motion_y=0; //gcc warning fix
3014 printf("illegal MB type\n");
3016 encode_mb(s, motion_x, motion_y);
3018 /* clean the MV table in IPS frames for direct mode in B frames */
3019 if(s->mb_intra /* && I,P,S_TYPE */){
3020 s->p_mv_table[xy][0]=0;
3021 s->p_mv_table[xy][1]=0;
3024 MPV_decode_mb(s, s->block);
3026 if(s->flags&CODEC_FLAG_PSNR){
3030 if(s->mb_x*16 + 16 > s->width ) w= s->width - s->mb_x*16;
3031 if(s->mb_y*16 + 16 > s->height) h= s->height- s->mb_y*16;
3033 s->current_picture.error[0] += sse(
3035 s->new_picture .data[0] + s->mb_x*16 + s->mb_y*s->linesize*16,
3036 s->current_picture.data[0] + s->mb_x*16 + s->mb_y*s->linesize*16,
3038 s->current_picture.error[1] += sse(
3040 s->new_picture .data[1] + s->mb_x*8 + s->mb_y*s->uvlinesize*8,
3041 s->current_picture.data[1] + s->mb_x*8 + s->mb_y*s->uvlinesize*8,
3042 w>>1, h>>1, s->uvlinesize);
3043 s->current_picture.error[2] += sse(
3045 s->new_picture .data[2] + s->mb_x*8 + s->mb_y*s->uvlinesize*8,
3046 s->current_picture.data[2] + s->mb_x*8 + s->mb_y*s->uvlinesize*8,
3047 w>>1, h>>1, s->uvlinesize);
3049 //printf("MB %d %d bits\n", s->mb_x+s->mb_y*s->mb_width, get_bit_count(&s->pb));
3053 /* Obtain average mb_row size for RTP */
3056 s->mb_line_avgsize = pbBufPtr(&s->pb) - s->ptr_last_mb_line;
3058 s->mb_line_avgsize = (s->mb_line_avgsize + pbBufPtr(&s->pb) - s->ptr_last_mb_line) >> 1;
3060 s->ptr_last_mb_line = pbBufPtr(&s->pb);
3065 if(s->codec_id==CODEC_ID_MPEG4 && s->partitioned_frame)
3066 ff_mpeg4_merge_partitions(s);
3068 if (s->msmpeg4_version && s->msmpeg4_version<4 && s->pict_type == I_TYPE)
3069 msmpeg4_encode_ext_header(s);
3071 if(s->codec_id==CODEC_ID_MPEG4)
3072 ff_mpeg4_stuffing(&s->pb);
3074 //if (s->gob_number)
3075 // fprintf(stderr,"\nNumber of GOB: %d", s->gob_number);
3077 /* Send the last GOB if RTP */
3079 flush_put_bits(&s->pb);
3080 pdif = pbBufPtr(&s->pb) - s->ptr_lastgob;
3081 /* Call the RTP callback to send the last GOB */
3082 if (s->rtp_callback)
3083 s->rtp_callback(s->ptr_lastgob, pdif, s->gob_number);
3084 s->ptr_lastgob = pbBufPtr(&s->pb);
3085 //fprintf(stderr,"\nGOB: %2d size: %d (last)", s->gob_number, pdif);
3089 static int dct_quantize_c(MpegEncContext *s,
3090 DCTELEM *block, int n,
3091 int qscale, int *overflow)
3093 int i, j, level, last_non_zero, q;
3095 const UINT8 *scantable= s->intra_scantable.scantable;
3098 unsigned int threshold1, threshold2;
3110 /* For AIC we skip quant/dequant of INTRADC */
3113 /* note: block[0] is assumed to be positive */
3114 block[0] = (block[0] + (q >> 1)) / q;
3117 qmat = s->q_intra_matrix[qscale];
3118 bias= s->intra_quant_bias<<(QMAT_SHIFT - QUANT_BIAS_SHIFT);
3122 qmat = s->q_inter_matrix[qscale];
3123 bias= s->inter_quant_bias<<(QMAT_SHIFT - QUANT_BIAS_SHIFT);
3125 threshold1= (1<<QMAT_SHIFT) - bias - 1;
3126 threshold2= (threshold1<<1);
3131 level = level * qmat[j];
3133 // if( bias+level >= (1<<(QMAT_SHIFT - 3))
3134 // || bias-level >= (1<<(QMAT_SHIFT - 3))){
3135 if(((unsigned)(level+threshold1))>threshold2){
3137 level= (bias + level)>>QMAT_SHIFT;
3140 level= (bias - level)>>QMAT_SHIFT;
3149 *overflow= s->max_qcoeff < max; //overflow might have happend
3151 /* we need this permutation so that we correct the IDCT, we only permute the !=0 elements */
3152 if (s->idct_permutation_type != FF_NO_IDCT_PERM)
3153 ff_block_permute(block, s->idct_permutation, scantable, last_non_zero);
3155 return last_non_zero;
3158 static void dct_unquantize_mpeg1_c(MpegEncContext *s,
3159 DCTELEM *block, int n, int qscale)
3161 int i, level, nCoeffs;
3162 const UINT16 *quant_matrix;
3164 nCoeffs= s->block_last_index[n];
3168 block[0] = block[0] * s->y_dc_scale;
3170 block[0] = block[0] * s->c_dc_scale;
3171 /* XXX: only mpeg1 */
3172 quant_matrix = s->intra_matrix;
3173 for(i=1;i<=nCoeffs;i++) {
3174 int j= s->intra_scantable.permutated[i];
3179 level = (int)(level * qscale * quant_matrix[j]) >> 3;
3180 level = (level - 1) | 1;
3183 level = (int)(level * qscale * quant_matrix[j]) >> 3;
3184 level = (level - 1) | 1;
3187 if (level < -2048 || level > 2047)
3188 fprintf(stderr, "unquant error %d %d\n", i, level);
3195 quant_matrix = s->inter_matrix;
3196 for(;i<=nCoeffs;i++) {
3197 int j= s->intra_scantable.permutated[i];
3202 level = (((level << 1) + 1) * qscale *
3203 ((int) (quant_matrix[j]))) >> 4;
3204 level = (level - 1) | 1;
3207 level = (((level << 1) + 1) * qscale *
3208 ((int) (quant_matrix[j]))) >> 4;
3209 level = (level - 1) | 1;
3212 if (level < -2048 || level > 2047)
3213 fprintf(stderr, "unquant error %d %d\n", i, level);
3221 static void dct_unquantize_mpeg2_c(MpegEncContext *s,
3222 DCTELEM *block, int n, int qscale)
3224 int i, level, nCoeffs;
3225 const UINT16 *quant_matrix;
3227 if(s->alternate_scan) nCoeffs= 63;
3228 else nCoeffs= s->block_last_index[n];
3232 block[0] = block[0] * s->y_dc_scale;
3234 block[0] = block[0] * s->c_dc_scale;
3235 quant_matrix = s->intra_matrix;
3236 for(i=1;i<=nCoeffs;i++) {
3237 int j= s->intra_scantable.permutated[i];
3242 level = (int)(level * qscale * quant_matrix[j]) >> 3;
3245 level = (int)(level * qscale * quant_matrix[j]) >> 3;
3248 if (level < -2048 || level > 2047)
3249 fprintf(stderr, "unquant error %d %d\n", i, level);
3257 quant_matrix = s->inter_matrix;
3258 for(;i<=nCoeffs;i++) {
3259 int j= s->intra_scantable.permutated[i];
3264 level = (((level << 1) + 1) * qscale *
3265 ((int) (quant_matrix[j]))) >> 4;
3268 level = (((level << 1) + 1) * qscale *
3269 ((int) (quant_matrix[j]))) >> 4;
3272 if (level < -2048 || level > 2047)
3273 fprintf(stderr, "unquant error %d %d\n", i, level);
3284 static void dct_unquantize_h263_c(MpegEncContext *s,
3285 DCTELEM *block, int n, int qscale)
3287 int i, level, qmul, qadd;
3290 assert(s->block_last_index[n]>=0);
3292 qadd = (qscale - 1) | 1;
3298 block[0] = block[0] * s->y_dc_scale;
3300 block[0] = block[0] * s->c_dc_scale;
3304 nCoeffs= 63; //does not allways use zigzag table
3307 nCoeffs= s->intra_scantable.raster_end[ s->block_last_index[n] ];
3310 for(;i<=nCoeffs;i++) {
3314 level = level * qmul - qadd;
3316 level = level * qmul + qadd;
3319 if (level < -2048 || level > 2047)
3320 fprintf(stderr, "unquant error %d %d\n", i, level);
3327 AVCodec mpeg1video_encoder = {
3330 CODEC_ID_MPEG1VIDEO,
3331 sizeof(MpegEncContext),
3337 AVCodec h263_encoder = {
3341 sizeof(MpegEncContext),
3347 AVCodec h263p_encoder = {
3351 sizeof(MpegEncContext),
3357 AVCodec rv10_encoder = {
3361 sizeof(MpegEncContext),
3367 AVCodec mjpeg_encoder = {
3371 sizeof(MpegEncContext),
3377 AVCodec mpeg4_encoder = {
3381 sizeof(MpegEncContext),
3387 AVCodec msmpeg4v1_encoder = {
3391 sizeof(MpegEncContext),
3397 AVCodec msmpeg4v2_encoder = {
3401 sizeof(MpegEncContext),
3407 AVCodec msmpeg4v3_encoder = {
3411 sizeof(MpegEncContext),
3417 AVCodec wmv1_encoder = {
3421 sizeof(MpegEncContext),
3427 AVCodec wmv2_encoder = {
3431 sizeof(MpegEncContext),