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>
24 * The simplest mpeg encoder (well, it was the simplest!).
30 #include "mpegvideo.h"
33 #include "fastmemcpy.h"
39 #ifdef CONFIG_ENCODERS
40 static void encode_picture(MpegEncContext *s, int picture_number);
41 #endif //CONFIG_ENCODERS
42 static void dct_unquantize_mpeg1_c(MpegEncContext *s,
43 DCTELEM *block, int n, int qscale);
44 static void dct_unquantize_mpeg2_c(MpegEncContext *s,
45 DCTELEM *block, int n, int qscale);
46 static void dct_unquantize_h263_c(MpegEncContext *s,
47 DCTELEM *block, int n, int qscale);
48 static void draw_edges_c(uint8_t *buf, int wrap, int width, int height, int w);
49 #ifdef CONFIG_ENCODERS
50 static int dct_quantize_c(MpegEncContext *s, DCTELEM *block, int n, int qscale, int *overflow);
51 static int dct_quantize_trellis_c(MpegEncContext *s, DCTELEM *block, int n, int qscale, int *overflow);
52 static int sse_mb(MpegEncContext *s);
53 #endif //CONFIG_ENCODERS
56 extern int XVMC_field_start(MpegEncContext*s, AVCodecContext *avctx);
57 extern void XVMC_field_end(MpegEncContext *s);
58 extern void XVMC_decode_mb(MpegEncContext *s, DCTELEM block[6][64]);
61 void (*draw_edges)(uint8_t *buf, int wrap, int width, int height, int w)= draw_edges_c;
64 /* enable all paranoid tests for rounding, overflows, etc... */
70 /* for jpeg fast DCT */
73 static const uint16_t aanscales[64] = {
74 /* precomputed values scaled up by 14 bits */
75 16384, 22725, 21407, 19266, 16384, 12873, 8867, 4520,
76 22725, 31521, 29692, 26722, 22725, 17855, 12299, 6270,
77 21407, 29692, 27969, 25172, 21407, 16819, 11585, 5906,
78 19266, 26722, 25172, 22654, 19266, 15137, 10426, 5315,
79 16384, 22725, 21407, 19266, 16384, 12873, 8867, 4520,
80 12873, 17855, 16819, 15137, 12873, 10114, 6967, 3552,
81 8867 , 12299, 11585, 10426, 8867, 6967, 4799, 2446,
82 4520 , 6270, 5906, 5315, 4520, 3552, 2446, 1247
85 static const uint8_t h263_chroma_roundtab[16] = {
86 // 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15
87 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 2, 2,
90 #ifdef CONFIG_ENCODERS
91 static uint8_t (*default_mv_penalty)[MAX_MV*2+1]=NULL;
92 static uint8_t default_fcode_tab[MAX_MV*2+1];
94 enum PixelFormat ff_yuv420p_list[2]= {PIX_FMT_YUV420P, -1};
96 static void convert_matrix(MpegEncContext *s, int (*qmat)[64], uint16_t (*qmat16)[64], uint16_t (*qmat16_bias)[64],
97 const uint16_t *quant_matrix, int bias, int qmin, int qmax)
101 for(qscale=qmin; qscale<=qmax; qscale++){
103 if (s->dsp.fdct == ff_jpeg_fdct_islow) {
105 const int j= s->dsp.idct_permutation[i];
106 /* 16 <= qscale * quant_matrix[i] <= 7905 */
107 /* 19952 <= aanscales[i] * qscale * quant_matrix[i] <= 249205026 */
108 /* (1<<36)/19952 >= (1<<36)/(aanscales[i] * qscale * quant_matrix[i]) >= (1<<36)/249205026 */
109 /* 3444240 >= (1<<36)/(aanscales[i] * qscale * quant_matrix[i]) >= 275 */
111 qmat[qscale][i] = (int)((uint64_t_C(1) << QMAT_SHIFT) /
112 (qscale * quant_matrix[j]));
114 } else if (s->dsp.fdct == fdct_ifast) {
116 const int j= s->dsp.idct_permutation[i];
117 /* 16 <= qscale * quant_matrix[i] <= 7905 */
118 /* 19952 <= aanscales[i] * qscale * quant_matrix[i] <= 249205026 */
119 /* (1<<36)/19952 >= (1<<36)/(aanscales[i] * qscale * quant_matrix[i]) >= (1<<36)/249205026 */
120 /* 3444240 >= (1<<36)/(aanscales[i] * qscale * quant_matrix[i]) >= 275 */
122 qmat[qscale][i] = (int)((uint64_t_C(1) << (QMAT_SHIFT + 14)) /
123 (aanscales[i] * qscale * quant_matrix[j]));
127 const int j= s->dsp.idct_permutation[i];
128 /* We can safely suppose that 16 <= quant_matrix[i] <= 255
129 So 16 <= qscale * quant_matrix[i] <= 7905
130 so (1<<19) / 16 >= (1<<19) / (qscale * quant_matrix[i]) >= (1<<19) / 7905
131 so 32768 >= (1<<19) / (qscale * quant_matrix[i]) >= 67
133 qmat[qscale][i] = (int)((uint64_t_C(1) << QMAT_SHIFT) / (qscale * quant_matrix[j]));
134 // qmat [qscale][i] = (1 << QMAT_SHIFT_MMX) / (qscale * quant_matrix[i]);
135 qmat16[qscale][i] = (1 << QMAT_SHIFT_MMX) / (qscale * quant_matrix[j]);
137 if(qmat16[qscale][i]==0 || qmat16[qscale][i]==128*256) qmat16[qscale][i]=128*256-1;
138 qmat16_bias[qscale][i]= ROUNDED_DIV(bias<<(16-QUANT_BIAS_SHIFT), qmat16[qscale][i]);
143 #endif //CONFIG_ENCODERS
145 void ff_init_scantable(uint8_t *permutation, ScanTable *st, const uint8_t *src_scantable){
149 st->scantable= src_scantable;
153 j = src_scantable[i];
154 st->permutated[i] = permutation[j];
163 j = st->permutated[i];
165 st->raster_end[i]= end;
169 void ff_write_quant_matrix(PutBitContext *pb, int16_t *matrix){
175 put_bits(pb, 8, matrix[ ff_zigzag_direct[i] ]);
181 /* init common dct for both encoder and decoder */
182 int DCT_common_init(MpegEncContext *s)
184 s->dct_unquantize_h263 = dct_unquantize_h263_c;
185 s->dct_unquantize_mpeg1 = dct_unquantize_mpeg1_c;
186 s->dct_unquantize_mpeg2 = dct_unquantize_mpeg2_c;
188 #ifdef CONFIG_ENCODERS
189 s->dct_quantize= dct_quantize_c;
193 MPV_common_init_mmx(s);
196 MPV_common_init_axp(s);
199 MPV_common_init_mlib(s);
202 MPV_common_init_mmi(s);
205 MPV_common_init_armv4l(s);
208 MPV_common_init_ppc(s);
211 #ifdef CONFIG_ENCODERS
212 s->fast_dct_quantize= s->dct_quantize;
214 if(s->flags&CODEC_FLAG_TRELLIS_QUANT){
215 s->dct_quantize= dct_quantize_trellis_c; //move before MPV_common_init_*
218 #endif //CONFIG_ENCODERS
220 /* load & permutate scantables
221 note: only wmv uses differnt ones
223 ff_init_scantable(s->dsp.idct_permutation, &s->inter_scantable , ff_zigzag_direct);
224 ff_init_scantable(s->dsp.idct_permutation, &s->intra_scantable , ff_zigzag_direct);
225 ff_init_scantable(s->dsp.idct_permutation, &s->intra_h_scantable, ff_alternate_horizontal_scan);
226 ff_init_scantable(s->dsp.idct_permutation, &s->intra_v_scantable, ff_alternate_vertical_scan);
228 s->picture_structure= PICT_FRAME;
234 * allocates a Picture
235 * The pixels are allocated/set by calling get_buffer() if shared=0
237 static int alloc_picture(MpegEncContext *s, Picture *pic, int shared){
238 const int big_mb_num= s->mb_stride*(s->mb_height+1) + 1; //the +1 is needed so memset(,,stride*height) doesnt sig11
239 const int mb_array_size= s->mb_stride*s->mb_height;
243 assert(pic->data[0]);
244 assert(pic->type == 0 || pic->type == FF_BUFFER_TYPE_SHARED);
245 pic->type= FF_BUFFER_TYPE_SHARED;
249 assert(!pic->data[0]);
251 r= s->avctx->get_buffer(s->avctx, (AVFrame*)pic);
253 if(r<0 || !pic->age || !pic->type || !pic->data[0]){
254 fprintf(stderr, "get_buffer() failed (%d %d %d %p)\n", r, pic->age, pic->type, pic->data[0]);
258 if(s->linesize && (s->linesize != pic->linesize[0] || s->uvlinesize != pic->linesize[1])){
259 fprintf(stderr, "get_buffer() failed (stride changed)\n");
263 if(pic->linesize[1] != pic->linesize[2]){
264 fprintf(stderr, "get_buffer() failed (uv stride missmatch)\n");
268 s->linesize = pic->linesize[0];
269 s->uvlinesize= pic->linesize[1];
272 if(pic->qscale_table==NULL){
274 CHECKED_ALLOCZ(pic->mb_var , mb_array_size * sizeof(int16_t))
275 CHECKED_ALLOCZ(pic->mc_mb_var, mb_array_size * sizeof(int16_t))
276 CHECKED_ALLOCZ(pic->mb_mean , mb_array_size * sizeof(int8_t))
277 CHECKED_ALLOCZ(pic->mb_cmp_score, mb_array_size * sizeof(int32_t))
280 CHECKED_ALLOCZ(pic->mbskip_table , mb_array_size * sizeof(uint8_t)+2) //the +2 is for the slice end check
281 CHECKED_ALLOCZ(pic->qscale_table , mb_array_size * sizeof(uint8_t))
282 CHECKED_ALLOCZ(pic->mb_type_base , big_mb_num * sizeof(int))
283 pic->mb_type= pic->mb_type_base + s->mb_stride+1;
284 if(s->out_format == FMT_H264){
286 CHECKED_ALLOCZ(pic->motion_val[i], 2 * 16 * s->mb_num * sizeof(uint16_t))
287 CHECKED_ALLOCZ(pic->ref_index[i] , 4 * s->mb_num * sizeof(uint8_t))
290 pic->qstride= s->mb_stride;
293 //it might be nicer if the application would keep track of these but it would require a API change
294 memmove(s->prev_pict_types+1, s->prev_pict_types, PREV_PICT_TYPES_BUFFER_SIZE-1);
295 s->prev_pict_types[0]= s->pict_type;
296 if(pic->age < PREV_PICT_TYPES_BUFFER_SIZE && s->prev_pict_types[pic->age] == B_TYPE)
297 pic->age= INT_MAX; // skiped MBs in b frames are quite rare in mpeg1/2 and its a bit tricky to skip them anyway
300 fail: //for the CHECKED_ALLOCZ macro
305 * deallocates a picture
307 static void free_picture(MpegEncContext *s, Picture *pic){
310 if(pic->data[0] && pic->type!=FF_BUFFER_TYPE_SHARED){
311 s->avctx->release_buffer(s->avctx, (AVFrame*)pic);
314 av_freep(&pic->mb_var);
315 av_freep(&pic->mc_mb_var);
316 av_freep(&pic->mb_mean);
317 av_freep(&pic->mb_cmp_score);
318 av_freep(&pic->mbskip_table);
319 av_freep(&pic->qscale_table);
320 av_freep(&pic->mb_type_base);
323 av_freep(&pic->motion_val[i]);
324 av_freep(&pic->ref_index[i]);
327 if(pic->type == FF_BUFFER_TYPE_SHARED){
336 /* init common structure for both encoder and decoder */
337 int MPV_common_init(MpegEncContext *s)
339 int y_size, c_size, yc_size, i, mb_array_size, x, y;
341 dsputil_init(&s->dsp, s->avctx);
344 s->flags= s->avctx->flags;
346 s->mb_width = (s->width + 15) / 16;
347 s->mb_height = (s->height + 15) / 16;
348 s->mb_stride = s->mb_width + 1;
349 mb_array_size= s->mb_height * s->mb_stride;
351 /* set default edge pos, will be overriden in decode_header if needed */
352 s->h_edge_pos= s->mb_width*16;
353 s->v_edge_pos= s->mb_height*16;
355 s->mb_num = s->mb_width * s->mb_height;
360 s->block_wrap[3]= s->mb_width*2 + 2;
362 s->block_wrap[5]= s->mb_width + 2;
364 y_size = (2 * s->mb_width + 2) * (2 * s->mb_height + 2);
365 c_size = (s->mb_width + 2) * (s->mb_height + 2);
366 yc_size = y_size + 2 * c_size;
368 /* convert fourcc to upper case */
369 s->avctx->codec_tag= toupper( s->avctx->codec_tag &0xFF)
370 + (toupper((s->avctx->codec_tag>>8 )&0xFF)<<8 )
371 + (toupper((s->avctx->codec_tag>>16)&0xFF)<<16)
372 + (toupper((s->avctx->codec_tag>>24)&0xFF)<<24);
374 CHECKED_ALLOCZ(s->allocated_edge_emu_buffer, (s->width+64)*2*17*2); //(width + edge + align)*interlaced*MBsize*tolerance
375 s->edge_emu_buffer= s->allocated_edge_emu_buffer + (s->width+64)*2*17;
377 s->avctx->coded_frame= (AVFrame*)&s->current_picture;
379 CHECKED_ALLOCZ(s->mb_index2xy, (s->mb_num+1)*sizeof(int)) //error ressilience code looks cleaner with this
380 for(y=0; y<s->mb_height; y++){
381 for(x=0; x<s->mb_width; x++){
382 s->mb_index2xy[ x + y*s->mb_width ] = x + y*s->mb_stride;
385 s->mb_index2xy[ s->mb_height*s->mb_width ] = (s->mb_height-1)*s->mb_stride + s->mb_width; //FIXME really needed?
388 int mv_table_size= s->mb_stride * (s->mb_height+2) + 1;
390 /* Allocate MV tables */
391 CHECKED_ALLOCZ(s->p_mv_table_base , mv_table_size * 2 * sizeof(int16_t))
392 CHECKED_ALLOCZ(s->b_forw_mv_table_base , mv_table_size * 2 * sizeof(int16_t))
393 CHECKED_ALLOCZ(s->b_back_mv_table_base , mv_table_size * 2 * sizeof(int16_t))
394 CHECKED_ALLOCZ(s->b_bidir_forw_mv_table_base , mv_table_size * 2 * sizeof(int16_t))
395 CHECKED_ALLOCZ(s->b_bidir_back_mv_table_base , mv_table_size * 2 * sizeof(int16_t))
396 CHECKED_ALLOCZ(s->b_direct_mv_table_base , mv_table_size * 2 * sizeof(int16_t))
397 s->p_mv_table = s->p_mv_table_base + s->mb_stride + 1;
398 s->b_forw_mv_table = s->b_forw_mv_table_base + s->mb_stride + 1;
399 s->b_back_mv_table = s->b_back_mv_table_base + s->mb_stride + 1;
400 s->b_bidir_forw_mv_table= s->b_bidir_forw_mv_table_base + s->mb_stride + 1;
401 s->b_bidir_back_mv_table= s->b_bidir_back_mv_table_base + s->mb_stride + 1;
402 s->b_direct_mv_table = s->b_direct_mv_table_base + s->mb_stride + 1;
404 //FIXME should be linesize instead of s->width*2 but that isnt known before get_buffer()
405 CHECKED_ALLOCZ(s->me.scratchpad, s->width*2*16*3*sizeof(uint8_t))
407 CHECKED_ALLOCZ(s->me.map , ME_MAP_SIZE*sizeof(uint32_t))
408 CHECKED_ALLOCZ(s->me.score_map, ME_MAP_SIZE*sizeof(uint32_t))
410 if(s->codec_id==CODEC_ID_MPEG4){
411 CHECKED_ALLOCZ(s->tex_pb_buffer, PB_BUFFER_SIZE);
412 CHECKED_ALLOCZ( s->pb2_buffer, PB_BUFFER_SIZE);
415 if(s->msmpeg4_version){
416 CHECKED_ALLOCZ(s->ac_stats, 2*2*(MAX_LEVEL+1)*(MAX_RUN+1)*2*sizeof(int));
418 CHECKED_ALLOCZ(s->avctx->stats_out, 256);
420 /* Allocate MB type table */
421 CHECKED_ALLOCZ(s->mb_type , mb_array_size * sizeof(uint8_t)) //needed for encoding
424 CHECKED_ALLOCZ(s->error_status_table, mb_array_size*sizeof(uint8_t))
426 if (s->out_format == FMT_H263 || s->encoding) {
430 size = (2 * s->mb_width + 2) * (2 * s->mb_height + 2);
431 CHECKED_ALLOCZ(s->motion_val, size * 2 * sizeof(int16_t));
434 if(s->codec_id==CODEC_ID_MPEG4){
435 /* interlaced direct mode decoding tables */
436 CHECKED_ALLOCZ(s->field_mv_table, mb_array_size*2*2 * sizeof(int16_t))
437 CHECKED_ALLOCZ(s->field_select_table, mb_array_size*2* sizeof(int8_t))
439 if (s->out_format == FMT_H263) {
441 CHECKED_ALLOCZ(s->ac_val[0], yc_size * sizeof(int16_t) * 16);
442 s->ac_val[1] = s->ac_val[0] + y_size;
443 s->ac_val[2] = s->ac_val[1] + c_size;
446 CHECKED_ALLOCZ(s->coded_block, y_size);
448 /* divx501 bitstream reorder buffer */
449 CHECKED_ALLOCZ(s->bitstream_buffer, BITSTREAM_BUFFER_SIZE);
451 /* cbp, ac_pred, pred_dir */
452 CHECKED_ALLOCZ(s->cbp_table , mb_array_size * sizeof(uint8_t))
453 CHECKED_ALLOCZ(s->pred_dir_table, mb_array_size * sizeof(uint8_t))
456 if (s->h263_pred || s->h263_plus || !s->encoding) {
458 //MN: we need these for error resilience of intra-frames
459 CHECKED_ALLOCZ(s->dc_val[0], yc_size * sizeof(int16_t));
460 s->dc_val[1] = s->dc_val[0] + y_size;
461 s->dc_val[2] = s->dc_val[1] + c_size;
462 for(i=0;i<yc_size;i++)
463 s->dc_val[0][i] = 1024;
466 /* which mb is a intra block */
467 CHECKED_ALLOCZ(s->mbintra_table, mb_array_size);
468 memset(s->mbintra_table, 1, mb_array_size);
470 /* default structure is frame */
471 s->picture_structure = PICT_FRAME;
473 /* init macroblock skip table */
474 CHECKED_ALLOCZ(s->mbskip_table, mb_array_size+2);
475 //Note the +1 is for a quicker mpeg4 slice_end detection
476 CHECKED_ALLOCZ(s->prev_pict_types, PREV_PICT_TYPES_BUFFER_SIZE);
478 s->block= s->blocks[0];
480 s->parse_context.state= -1;
482 s->context_initialized = 1;
492 /* init common structure for both encoder and decoder */
493 void MPV_common_end(MpegEncContext *s)
497 av_freep(&s->parse_context.buffer);
498 s->parse_context.buffer_size=0;
500 av_freep(&s->mb_type);
501 av_freep(&s->p_mv_table_base);
502 av_freep(&s->b_forw_mv_table_base);
503 av_freep(&s->b_back_mv_table_base);
504 av_freep(&s->b_bidir_forw_mv_table_base);
505 av_freep(&s->b_bidir_back_mv_table_base);
506 av_freep(&s->b_direct_mv_table_base);
508 s->b_forw_mv_table= NULL;
509 s->b_back_mv_table= NULL;
510 s->b_bidir_forw_mv_table= NULL;
511 s->b_bidir_back_mv_table= NULL;
512 s->b_direct_mv_table= NULL;
514 av_freep(&s->motion_val);
515 av_freep(&s->dc_val[0]);
516 av_freep(&s->ac_val[0]);
517 av_freep(&s->coded_block);
518 av_freep(&s->mbintra_table);
519 av_freep(&s->cbp_table);
520 av_freep(&s->pred_dir_table);
521 av_freep(&s->me.scratchpad);
522 av_freep(&s->me.map);
523 av_freep(&s->me.score_map);
525 av_freep(&s->mbskip_table);
526 av_freep(&s->prev_pict_types);
527 av_freep(&s->bitstream_buffer);
528 av_freep(&s->tex_pb_buffer);
529 av_freep(&s->pb2_buffer);
530 av_freep(&s->allocated_edge_emu_buffer); s->edge_emu_buffer= NULL;
531 av_freep(&s->field_mv_table);
532 av_freep(&s->field_select_table);
533 av_freep(&s->avctx->stats_out);
534 av_freep(&s->ac_stats);
535 av_freep(&s->error_status_table);
536 av_freep(&s->mb_index2xy);
538 for(i=0; i<MAX_PICTURE_COUNT; i++){
539 free_picture(s, &s->picture[i]);
541 avcodec_default_free_buffers(s->avctx);
542 s->context_initialized = 0;
545 #ifdef CONFIG_ENCODERS
547 /* init video encoder */
548 int MPV_encode_init(AVCodecContext *avctx)
550 MpegEncContext *s = avctx->priv_data;
552 int chroma_h_shift, chroma_v_shift;
554 avctx->pix_fmt = PIX_FMT_YUV420P; // FIXME
556 s->bit_rate = avctx->bit_rate;
557 s->bit_rate_tolerance = avctx->bit_rate_tolerance;
558 s->width = avctx->width;
559 s->height = avctx->height;
560 if(avctx->gop_size > 600){
561 fprintf(stderr, "Warning keyframe interval too large! reducing it ...\n");
564 s->gop_size = avctx->gop_size;
565 s->rtp_mode = avctx->rtp_mode;
566 s->rtp_payload_size = avctx->rtp_payload_size;
567 if (avctx->rtp_callback)
568 s->rtp_callback = avctx->rtp_callback;
569 s->max_qdiff= avctx->max_qdiff;
570 s->qcompress= avctx->qcompress;
571 s->qblur= avctx->qblur;
573 s->flags= avctx->flags;
574 s->max_b_frames= avctx->max_b_frames;
575 s->b_frame_strategy= avctx->b_frame_strategy;
576 s->codec_id= avctx->codec->id;
577 s->luma_elim_threshold = avctx->luma_elim_threshold;
578 s->chroma_elim_threshold= avctx->chroma_elim_threshold;
579 s->strict_std_compliance= avctx->strict_std_compliance;
580 s->data_partitioning= avctx->flags & CODEC_FLAG_PART;
581 s->quarter_sample= (avctx->flags & CODEC_FLAG_QPEL)!=0;
582 s->mpeg_quant= avctx->mpeg_quant;
584 if (s->gop_size <= 1) {
591 s->me_method = avctx->me_method;
594 s->fixed_qscale = (avctx->flags & CODEC_FLAG_QSCALE);
596 s->adaptive_quant= ( s->avctx->lumi_masking
597 || s->avctx->dark_masking
598 || s->avctx->temporal_cplx_masking
599 || s->avctx->spatial_cplx_masking
600 || s->avctx->p_masking)
603 s->progressive_sequence= !(avctx->flags & CODEC_FLAG_INTERLACED_DCT);
605 if((s->flags & CODEC_FLAG_4MV) && s->codec_id != CODEC_ID_MPEG4){
606 fprintf(stderr, "4MV not supporetd by codec\n");
610 if(s->quarter_sample && s->codec_id != CODEC_ID_MPEG4){
611 fprintf(stderr, "qpel not supporetd by codec\n");
615 if(s->data_partitioning && s->codec_id != CODEC_ID_MPEG4){
616 fprintf(stderr, "data partitioning not supporetd by codec\n");
620 if(s->max_b_frames && s->codec_id != CODEC_ID_MPEG4 && s->codec_id != CODEC_ID_MPEG1VIDEO && s->codec_id != CODEC_ID_MPEG2VIDEO){
621 fprintf(stderr, "b frames not supporetd by codec\n");
625 if(s->mpeg_quant && s->codec_id != CODEC_ID_MPEG4){ //FIXME mpeg2 uses that too
626 fprintf(stderr, "mpeg2 style quantization not supporetd by codec\n");
630 if(s->codec_id==CODEC_ID_MJPEG){
631 s->intra_quant_bias= 1<<(QUANT_BIAS_SHIFT-1); //(a + x/2)/x
632 s->inter_quant_bias= 0;
633 }else if(s->mpeg_quant || s->codec_id==CODEC_ID_MPEG1VIDEO || s->codec_id==CODEC_ID_MPEG2VIDEO){
634 s->intra_quant_bias= 3<<(QUANT_BIAS_SHIFT-3); //(a + x*3/8)/x
635 s->inter_quant_bias= 0;
637 s->intra_quant_bias=0;
638 s->inter_quant_bias=-(1<<(QUANT_BIAS_SHIFT-2)); //(a - x/4)/x
641 if(avctx->intra_quant_bias != FF_DEFAULT_QUANT_BIAS)
642 s->intra_quant_bias= avctx->intra_quant_bias;
643 if(avctx->inter_quant_bias != FF_DEFAULT_QUANT_BIAS)
644 s->inter_quant_bias= avctx->inter_quant_bias;
646 avcodec_get_chroma_sub_sample(avctx->pix_fmt, &chroma_h_shift, &chroma_v_shift);
648 av_reduce(&s->time_increment_resolution, &dummy, s->avctx->frame_rate, s->avctx->frame_rate_base, (1<<16)-1);
649 s->time_increment_bits = av_log2(s->time_increment_resolution - 1) + 1;
651 switch(avctx->codec->id) {
652 case CODEC_ID_MPEG1VIDEO:
653 s->out_format = FMT_MPEG1;
654 s->low_delay= 0; //s->max_b_frames ? 0 : 1;
655 avctx->delay= s->low_delay ? 0 : (s->max_b_frames + 1);
657 case CODEC_ID_MPEG2VIDEO:
658 s->out_format = FMT_MPEG1;
659 s->low_delay= 0; //s->max_b_frames ? 0 : 1;
660 avctx->delay= s->low_delay ? 0 : (s->max_b_frames + 1);
661 s->rtp_mode= 1; // mpeg2 must have slices
662 if(s->rtp_payload_size == 0) s->rtp_payload_size= 256*256*256;
666 s->out_format = FMT_MJPEG;
667 s->intra_only = 1; /* force intra only for jpeg */
668 s->mjpeg_write_tables = 1; /* write all tables */
669 s->mjpeg_data_only_frames = 0; /* write all the needed headers */
670 s->mjpeg_vsample[0] = 1<<chroma_v_shift;
671 s->mjpeg_vsample[1] = 1;
672 s->mjpeg_vsample[2] = 1;
673 s->mjpeg_hsample[0] = 1<<chroma_h_shift;
674 s->mjpeg_hsample[1] = 1;
675 s->mjpeg_hsample[2] = 1;
676 if (mjpeg_init(s) < 0)
683 if (h263_get_picture_format(s->width, s->height) == 7) {
684 printf("Input picture size isn't suitable for h263 codec! try h263+\n");
687 s->out_format = FMT_H263;
692 s->out_format = FMT_H263;
695 s->unrestricted_mv=(avctx->flags & CODEC_FLAG_H263P_UMV) ? 1:0;
696 s->h263_aic= (avctx->flags & CODEC_FLAG_H263P_AIC) ? 1:0;
698 /* These are just to be sure */
704 s->out_format = FMT_H263;
705 s->h263_flv = 2; /* format = 1; 11-bit codes */
706 s->unrestricted_mv = 1;
707 s->rtp_mode=0; /* don't allow GOB */
712 s->out_format = FMT_H263;
718 s->out_format = FMT_H263;
720 s->unrestricted_mv = 1;
721 s->low_delay= s->max_b_frames ? 0 : 1;
722 avctx->delay= s->low_delay ? 0 : (s->max_b_frames + 1);
724 case CODEC_ID_MSMPEG4V1:
725 s->out_format = FMT_H263;
728 s->unrestricted_mv = 1;
729 s->msmpeg4_version= 1;
733 case CODEC_ID_MSMPEG4V2:
734 s->out_format = FMT_H263;
737 s->unrestricted_mv = 1;
738 s->msmpeg4_version= 2;
742 case CODEC_ID_MSMPEG4V3:
743 s->out_format = FMT_H263;
746 s->unrestricted_mv = 1;
747 s->msmpeg4_version= 3;
748 s->flipflop_rounding=1;
753 s->out_format = FMT_H263;
756 s->unrestricted_mv = 1;
757 s->msmpeg4_version= 4;
758 s->flipflop_rounding=1;
763 s->out_format = FMT_H263;
766 s->unrestricted_mv = 1;
767 s->msmpeg4_version= 5;
768 s->flipflop_rounding=1;
777 { /* set up some save defaults, some codecs might override them later */
783 default_mv_penalty= av_mallocz( sizeof(uint8_t)*(MAX_FCODE+1)*(2*MAX_MV+1) );
784 memset(default_mv_penalty, 0, sizeof(uint8_t)*(MAX_FCODE+1)*(2*MAX_MV+1));
785 memset(default_fcode_tab , 0, sizeof(uint8_t)*(2*MAX_MV+1));
787 for(i=-16; i<16; i++){
788 default_fcode_tab[i + MAX_MV]= 1;
792 s->me.mv_penalty= default_mv_penalty;
793 s->fcode_tab= default_fcode_tab;
795 s->c_dc_scale_table= ff_mpeg1_dc_scale_table;
797 /* dont use mv_penalty table for crap MV as it would be confused */
798 //FIXME remove after fixing / removing old ME
799 if (s->me_method < ME_EPZS) s->me.mv_penalty = default_mv_penalty;
804 if (MPV_common_init(s) < 0)
809 #ifdef CONFIG_ENCODERS
811 if (s->out_format == FMT_H263)
813 if(s->msmpeg4_version)
814 ff_msmpeg4_encode_init(s);
816 if (s->out_format == FMT_MPEG1)
817 ff_mpeg1_encode_init(s);
820 /* init default q matrix */
822 int j= s->dsp.idct_permutation[i];
824 if(s->codec_id==CODEC_ID_MPEG4 && s->mpeg_quant){
825 s->intra_matrix[j] = ff_mpeg4_default_intra_matrix[i];
826 s->inter_matrix[j] = ff_mpeg4_default_non_intra_matrix[i];
827 }else if(s->out_format == FMT_H263){
829 s->inter_matrix[j] = ff_mpeg1_default_non_intra_matrix[i];
833 s->intra_matrix[j] = ff_mpeg1_default_intra_matrix[i];
834 s->inter_matrix[j] = ff_mpeg1_default_non_intra_matrix[i];
836 if(s->avctx->intra_matrix)
837 s->intra_matrix[j] = s->avctx->intra_matrix[i];
838 if(s->avctx->inter_matrix)
839 s->inter_matrix[j] = s->avctx->inter_matrix[i];
842 /* precompute matrix */
843 /* for mjpeg, we do include qscale in the matrix */
844 if (s->out_format != FMT_MJPEG) {
845 convert_matrix(s, s->q_intra_matrix, s->q_intra_matrix16, s->q_intra_matrix16_bias,
846 s->intra_matrix, s->intra_quant_bias, 1, 31);
847 convert_matrix(s, s->q_inter_matrix, s->q_inter_matrix16, s->q_inter_matrix16_bias,
848 s->inter_matrix, s->inter_quant_bias, 1, 31);
851 if(ff_rate_control_init(s) < 0)
854 s->picture_number = 0;
855 s->picture_in_gop_number = 0;
856 s->fake_picture_number = 0;
857 /* motion detector init */
864 int MPV_encode_end(AVCodecContext *avctx)
866 MpegEncContext *s = avctx->priv_data;
872 ff_rate_control_uninit(s);
875 if (s->out_format == FMT_MJPEG)
878 av_freep(&avctx->extradata);
883 #endif //CONFIG_ENCODERS
885 void init_rl(RLTable *rl)
887 int8_t max_level[MAX_RUN+1], max_run[MAX_LEVEL+1];
888 uint8_t index_run[MAX_RUN+1];
889 int last, run, level, start, end, i;
891 /* compute max_level[], max_run[] and index_run[] */
892 for(last=0;last<2;last++) {
901 memset(max_level, 0, MAX_RUN + 1);
902 memset(max_run, 0, MAX_LEVEL + 1);
903 memset(index_run, rl->n, MAX_RUN + 1);
904 for(i=start;i<end;i++) {
905 run = rl->table_run[i];
906 level = rl->table_level[i];
907 if (index_run[run] == rl->n)
909 if (level > max_level[run])
910 max_level[run] = level;
911 if (run > max_run[level])
912 max_run[level] = run;
914 rl->max_level[last] = av_malloc(MAX_RUN + 1);
915 memcpy(rl->max_level[last], max_level, MAX_RUN + 1);
916 rl->max_run[last] = av_malloc(MAX_LEVEL + 1);
917 memcpy(rl->max_run[last], max_run, MAX_LEVEL + 1);
918 rl->index_run[last] = av_malloc(MAX_RUN + 1);
919 memcpy(rl->index_run[last], index_run, MAX_RUN + 1);
923 /* draw the edges of width 'w' of an image of size width, height */
924 //FIXME check that this is ok for mpeg4 interlaced
925 static void draw_edges_c(uint8_t *buf, int wrap, int width, int height, int w)
927 uint8_t *ptr, *last_line;
930 last_line = buf + (height - 1) * wrap;
933 memcpy(buf - (i + 1) * wrap, buf, width);
934 memcpy(last_line + (i + 1) * wrap, last_line, width);
938 for(i=0;i<height;i++) {
939 memset(ptr - w, ptr[0], w);
940 memset(ptr + width, ptr[width-1], w);
945 memset(buf - (i + 1) * wrap - w, buf[0], w); /* top left */
946 memset(buf - (i + 1) * wrap + width, buf[width-1], w); /* top right */
947 memset(last_line + (i + 1) * wrap - w, last_line[0], w); /* top left */
948 memset(last_line + (i + 1) * wrap + width, last_line[width-1], w); /* top right */
952 static int find_unused_picture(MpegEncContext *s, int shared){
956 for(i=0; i<MAX_PICTURE_COUNT; i++){
957 if(s->picture[i].data[0]==NULL && s->picture[i].type==0) break;
960 for(i=0; i<MAX_PICTURE_COUNT; i++){
961 if(s->picture[i].data[0]==NULL && s->picture[i].type!=0) break; //FIXME
963 for(i=0; i<MAX_PICTURE_COUNT; i++){
964 if(s->picture[i].data[0]==NULL) break;
968 assert(i<MAX_PICTURE_COUNT);
972 /* generic function for encode/decode called before a frame is coded/decoded */
973 int MPV_frame_start(MpegEncContext *s, AVCodecContext *avctx)
980 assert(s->last_picture_ptr==NULL || s->out_format != FMT_H264 || s->codec_id == CODEC_ID_SVQ3);
982 /* mark&release old frames */
983 if (s->pict_type != B_TYPE && s->last_picture_ptr && s->last_picture_ptr->data[0]) {
984 avctx->release_buffer(avctx, (AVFrame*)s->last_picture_ptr);
986 /* release forgotten pictures */
987 /* if(mpeg124/h263) */
989 for(i=0; i<MAX_PICTURE_COUNT; i++){
990 if(s->picture[i].data[0] && &s->picture[i] != s->next_picture_ptr && s->picture[i].reference){
991 fprintf(stderr, "releasing zombie picture\n");
992 avctx->release_buffer(avctx, (AVFrame*)&s->picture[i]);
999 /* release non refernce frames */
1000 for(i=0; i<MAX_PICTURE_COUNT; i++){
1001 if(s->picture[i].data[0] && !s->picture[i].reference /*&& s->picture[i].type!=FF_BUFFER_TYPE_SHARED*/){
1002 s->avctx->release_buffer(s->avctx, (AVFrame*)&s->picture[i]);
1006 i= find_unused_picture(s, 0);
1008 pic= (AVFrame*)&s->picture[i];
1009 pic->reference= s->pict_type != B_TYPE ? 3 : 0;
1011 if(s->current_picture_ptr)
1012 pic->coded_picture_number= s->current_picture_ptr->coded_picture_number+1;
1014 if( alloc_picture(s, (Picture*)pic, 0) < 0)
1017 s->current_picture_ptr= &s->picture[i];
1020 s->current_picture_ptr->pict_type= s->pict_type;
1021 s->current_picture_ptr->quality= s->qscale;
1022 s->current_picture_ptr->key_frame= s->pict_type == I_TYPE;
1024 s->current_picture= *s->current_picture_ptr;
1026 if(s->out_format != FMT_H264 || s->codec_id == CODEC_ID_SVQ3){
1027 if (s->pict_type != B_TYPE) {
1028 s->last_picture_ptr= s->next_picture_ptr;
1029 s->next_picture_ptr= s->current_picture_ptr;
1032 if(s->last_picture_ptr) s->last_picture= *s->last_picture_ptr;
1033 if(s->next_picture_ptr) s->next_picture= *s->next_picture_ptr;
1034 if(s->new_picture_ptr ) s->new_picture = *s->new_picture_ptr;
1036 if(s->pict_type != I_TYPE && s->last_picture_ptr==NULL){
1037 fprintf(stderr, "warning: first frame is no keyframe\n");
1038 assert(s->pict_type != B_TYPE); //these should have been dropped if we dont have a reference
1042 assert(s->pict_type == I_TYPE || (s->last_picture_ptr && s->last_picture_ptr->data[0]));
1044 if(s->picture_structure!=PICT_FRAME){
1047 if(s->picture_structure == PICT_BOTTOM_FIELD){
1048 s->current_picture.data[i] += s->current_picture.linesize[i];
1050 s->current_picture.linesize[i] *= 2;
1051 s->last_picture.linesize[i] *=2;
1052 s->next_picture.linesize[i] *=2;
1057 s->hurry_up= s->avctx->hurry_up;
1058 s->error_resilience= avctx->error_resilience;
1060 /* set dequantizer, we cant do it during init as it might change for mpeg4
1061 and we cant do it in the header decode as init isnt called for mpeg4 there yet */
1062 if(s->mpeg_quant || s->codec_id == CODEC_ID_MPEG2VIDEO)
1063 s->dct_unquantize = s->dct_unquantize_mpeg2;
1064 else if(s->out_format == FMT_H263)
1065 s->dct_unquantize = s->dct_unquantize_h263;
1067 s->dct_unquantize = s->dct_unquantize_mpeg1;
1070 if(s->avctx->xvmc_acceleration)
1071 return XVMC_field_start(s, avctx);
1076 /* generic function for encode/decode called after a frame has been coded/decoded */
1077 void MPV_frame_end(MpegEncContext *s)
1080 /* draw edge for correct motion prediction if outside */
1082 //just to make sure that all data is rendered.
1083 if(s->avctx->xvmc_acceleration){
1087 if(s->codec_id!=CODEC_ID_SVQ1 && s->out_format != FMT_MPEG1){
1088 if (s->pict_type != B_TYPE && !s->intra_only && !(s->flags&CODEC_FLAG_EMU_EDGE)) {
1089 draw_edges(s->current_picture.data[0], s->linesize , s->h_edge_pos , s->v_edge_pos , EDGE_WIDTH );
1090 draw_edges(s->current_picture.data[1], s->uvlinesize, s->h_edge_pos>>1, s->v_edge_pos>>1, EDGE_WIDTH/2);
1091 draw_edges(s->current_picture.data[2], s->uvlinesize, s->h_edge_pos>>1, s->v_edge_pos>>1, EDGE_WIDTH/2);
1096 s->last_pict_type = s->pict_type;
1097 if(s->pict_type!=B_TYPE){
1098 s->last_non_b_pict_type= s->pict_type;
1101 /* copy back current_picture variables */
1102 for(i=0; i<MAX_PICTURE_COUNT; i++){
1103 if(s->picture[i].data[0] == s->current_picture.data[0]){
1104 s->picture[i]= s->current_picture;
1108 assert(i<MAX_PICTURE_COUNT);
1112 /* release non refernce frames */
1113 for(i=0; i<MAX_PICTURE_COUNT; i++){
1114 if(s->picture[i].data[0] && !s->picture[i].reference /*&& s->picture[i].type!=FF_BUFFER_TYPE_SHARED*/){
1115 s->avctx->release_buffer(s->avctx, (AVFrame*)&s->picture[i]);
1119 // clear copies, to avoid confusion
1121 memset(&s->last_picture, 0, sizeof(Picture));
1122 memset(&s->next_picture, 0, sizeof(Picture));
1123 memset(&s->current_picture, 0, sizeof(Picture));
1128 * draws an line from (ex, ey) -> (sx, sy).
1129 * @param w width of the image
1130 * @param h height of the image
1131 * @param stride stride/linesize of the image
1132 * @param color color of the arrow
1134 static void draw_line(uint8_t *buf, int sx, int sy, int ex, int ey, int w, int h, int stride, int color){
1137 sx= clip(sx, 0, w-1);
1138 sy= clip(sy, 0, h-1);
1139 ex= clip(ex, 0, w-1);
1140 ey= clip(ey, 0, h-1);
1142 buf[sy*stride + sx]+= color;
1144 if(ABS(ex - sx) > ABS(ey - sy)){
1149 buf+= sx + sy*stride;
1151 f= ((ey-sy)<<16)/ex;
1152 for(x= 0; x <= ex; x++){
1153 y= ((x*f) + (1<<15))>>16;
1154 buf[y*stride + x]+= color;
1161 buf+= sx + sy*stride;
1163 if(ey) f= ((ex-sx)<<16)/ey;
1165 for(y= 0; y <= ey; y++){
1166 x= ((y*f) + (1<<15))>>16;
1167 buf[y*stride + x]+= color;
1173 * draws an arrow from (ex, ey) -> (sx, sy).
1174 * @param w width of the image
1175 * @param h height of the image
1176 * @param stride stride/linesize of the image
1177 * @param color color of the arrow
1179 static void draw_arrow(uint8_t *buf, int sx, int sy, int ex, int ey, int w, int h, int stride, int color){
1182 sx= clip(sx, -100, w+100);
1183 sy= clip(sy, -100, h+100);
1184 ex= clip(ex, -100, w+100);
1185 ey= clip(ey, -100, h+100);
1190 if(dx*dx + dy*dy > 3*3){
1193 int length= ff_sqrt((rx*rx + ry*ry)<<8);
1195 //FIXME subpixel accuracy
1196 rx= ROUNDED_DIV(rx*3<<4, length);
1197 ry= ROUNDED_DIV(ry*3<<4, length);
1199 draw_line(buf, sx, sy, sx + rx, sy + ry, w, h, stride, color);
1200 draw_line(buf, sx, sy, sx - ry, sy + rx, w, h, stride, color);
1202 draw_line(buf, sx, sy, ex, ey, w, h, stride, color);
1206 * prints debuging info for the given picture.
1208 void ff_print_debug_info(MpegEncContext *s, Picture *pict){
1210 if(!pict || !pict->mb_type) return;
1212 if(s->avctx->debug&(FF_DEBUG_SKIP | FF_DEBUG_QP | FF_DEBUG_MB_TYPE)){
1215 for(y=0; y<s->mb_height; y++){
1216 for(x=0; x<s->mb_width; x++){
1217 if(s->avctx->debug&FF_DEBUG_SKIP){
1218 int count= s->mbskip_table[x + y*s->mb_stride];
1219 if(count>9) count=9;
1220 printf("%1d", count);
1222 if(s->avctx->debug&FF_DEBUG_QP){
1223 printf("%2d", pict->qscale_table[x + y*s->mb_stride]);
1225 if(s->avctx->debug&FF_DEBUG_MB_TYPE){
1226 int mb_type= pict->mb_type[x + y*s->mb_stride];
1228 //Type & MV direction
1231 else if(IS_INTRA(mb_type) && IS_ACPRED(mb_type))
1233 else if(IS_INTRA4x4(mb_type))
1235 else if(IS_INTRA16x16(mb_type))
1237 else if(IS_DIRECT(mb_type) && IS_SKIP(mb_type))
1239 else if(IS_DIRECT(mb_type))
1241 else if(IS_GMC(mb_type) && IS_SKIP(mb_type))
1243 else if(IS_GMC(mb_type))
1245 else if(IS_SKIP(mb_type))
1247 else if(!USES_LIST(mb_type, 1))
1249 else if(!USES_LIST(mb_type, 0))
1252 assert(USES_LIST(mb_type, 0) && USES_LIST(mb_type, 1));
1259 else if(IS_16X8(mb_type))
1261 else if(IS_8X16(mb_type))
1263 else if(IS_INTRA(mb_type) || IS_16X16(mb_type))
1269 if(IS_INTERLACED(mb_type) && s->codec_id == CODEC_ID_H264)
1280 if((s->avctx->debug&FF_DEBUG_VIS_MV) && s->motion_val){
1281 const int shift= 1 + s->quarter_sample;
1283 uint8_t *ptr= pict->data[0];
1284 s->low_delay=0; //needed to see the vectors without trashing the buffers
1286 for(mb_y=0; mb_y<s->mb_height; mb_y++){
1288 for(mb_x=0; mb_x<s->mb_width; mb_x++){
1289 const int mb_index= mb_x + mb_y*s->mb_stride;
1290 if(IS_8X8(s->current_picture.mb_type[mb_index])){
1293 int sx= mb_x*16 + 4 + 8*(i&1);
1294 int sy= mb_y*16 + 4 + 8*(i>>1);
1295 int xy= 1 + mb_x*2 + (i&1) + (mb_y*2 + 1 + (i>>1))*(s->mb_width*2 + 2);
1296 int mx= (s->motion_val[xy][0]>>shift) + sx;
1297 int my= (s->motion_val[xy][1]>>shift) + sy;
1298 draw_arrow(ptr, sx, sy, mx, my, s->width, s->height, s->linesize, 100);
1301 int sx= mb_x*16 + 8;
1302 int sy= mb_y*16 + 8;
1303 int xy= 1 + mb_x*2 + (mb_y*2 + 1)*(s->mb_width*2 + 2);
1304 int mx= (s->motion_val[xy][0]>>shift) + sx;
1305 int my= (s->motion_val[xy][1]>>shift) + sy;
1306 draw_arrow(ptr, sx, sy, mx, my, s->width, s->height, s->linesize, 100);
1308 s->mbskip_table[mb_index]=0;
1314 #ifdef CONFIG_ENCODERS
1316 static int get_sae(uint8_t *src, int ref, int stride){
1320 for(y=0; y<16; y++){
1321 for(x=0; x<16; x++){
1322 acc+= ABS(src[x+y*stride] - ref);
1329 static int get_intra_count(MpegEncContext *s, uint8_t *src, uint8_t *ref, int stride){
1336 for(y=0; y<h; y+=16){
1337 for(x=0; x<w; x+=16){
1338 int offset= x + y*stride;
1339 int sad = s->dsp.pix_abs16x16(src + offset, ref + offset, stride);
1340 int mean= (s->dsp.pix_sum(src + offset, stride) + 128)>>8;
1341 int sae = get_sae(src + offset, mean, stride);
1343 acc+= sae + 500 < sad;
1350 static int load_input_picture(MpegEncContext *s, AVFrame *pic_arg){
1353 const int encoding_delay= s->max_b_frames;
1357 if(encoding_delay && !(s->flags&CODEC_FLAG_INPUT_PRESERVED)) direct=0;
1358 if(pic_arg->linesize[0] != s->linesize) direct=0;
1359 if(pic_arg->linesize[1] != s->uvlinesize) direct=0;
1360 if(pic_arg->linesize[2] != s->uvlinesize) direct=0;
1362 // printf("%d %d %d %d\n",pic_arg->linesize[0], pic_arg->linesize[1], s->linesize, s->uvlinesize);
1365 i= find_unused_picture(s, 1);
1367 pic= (AVFrame*)&s->picture[i];
1371 pic->data[i]= pic_arg->data[i];
1372 pic->linesize[i]= pic_arg->linesize[i];
1374 alloc_picture(s, (Picture*)pic, 1);
1376 i= find_unused_picture(s, 0);
1378 pic= (AVFrame*)&s->picture[i];
1381 alloc_picture(s, (Picture*)pic, 0);
1383 /* the input will be 16 pixels to the right relative to the actual buffer start
1384 * and the current_pic, so the buffer can be reused, yes its not beatifull
1389 if( pic->data[0] == pic_arg->data[0]
1390 && pic->data[1] == pic_arg->data[1]
1391 && pic->data[2] == pic_arg->data[2]){
1394 int h_chroma_shift, v_chroma_shift;
1395 avcodec_get_chroma_sub_sample(s->avctx->pix_fmt, &h_chroma_shift, &v_chroma_shift);
1398 int src_stride= pic_arg->linesize[i];
1399 int dst_stride= i ? s->uvlinesize : s->linesize;
1400 int h_shift= i ? h_chroma_shift : 0;
1401 int v_shift= i ? v_chroma_shift : 0;
1402 int w= s->width >>h_shift;
1403 int h= s->height>>v_shift;
1404 uint8_t *src= pic_arg->data[i];
1405 uint8_t *dst= pic->data[i];
1407 if(src_stride==dst_stride)
1408 memcpy(dst, src, src_stride*h);
1411 memcpy(dst, src, w);
1419 pic->quality= pic_arg->quality;
1420 pic->pict_type= pic_arg->pict_type;
1421 pic->pts = pic_arg->pts;
1423 if(s->input_picture[encoding_delay])
1424 pic->display_picture_number= s->input_picture[encoding_delay]->display_picture_number + 1;
1428 /* shift buffer entries */
1429 for(i=1; i<MAX_PICTURE_COUNT /*s->encoding_delay+1*/; i++)
1430 s->input_picture[i-1]= s->input_picture[i];
1432 s->input_picture[encoding_delay]= (Picture*)pic;
1437 static void select_input_picture(MpegEncContext *s){
1439 int coded_pic_num=0;
1441 if(s->reordered_input_picture[0])
1442 coded_pic_num= s->reordered_input_picture[0]->coded_picture_number + 1;
1444 for(i=1; i<MAX_PICTURE_COUNT; i++)
1445 s->reordered_input_picture[i-1]= s->reordered_input_picture[i];
1446 s->reordered_input_picture[MAX_PICTURE_COUNT-1]= NULL;
1448 /* set next picture types & ordering */
1449 if(s->reordered_input_picture[0]==NULL && s->input_picture[0]){
1450 if(/*s->picture_in_gop_number >= s->gop_size ||*/ s->next_picture_ptr==NULL || s->intra_only){
1451 s->reordered_input_picture[0]= s->input_picture[0];
1452 s->reordered_input_picture[0]->pict_type= I_TYPE;
1453 s->reordered_input_picture[0]->coded_picture_number= coded_pic_num;
1457 if(s->flags&CODEC_FLAG_PASS2){
1458 for(i=0; i<s->max_b_frames+1; i++){
1459 int pict_num= s->input_picture[0]->display_picture_number + i;
1460 int pict_type= s->rc_context.entry[pict_num].new_pict_type;
1461 s->input_picture[i]->pict_type= pict_type;
1463 if(i + 1 >= s->rc_context.num_entries) break;
1467 if(s->input_picture[0]->pict_type){
1468 /* user selected pict_type */
1469 for(b_frames=0; b_frames<s->max_b_frames+1; b_frames++){
1470 if(s->input_picture[b_frames]->pict_type!=B_TYPE) break;
1473 if(b_frames > s->max_b_frames){
1474 fprintf(stderr, "warning, too many bframes in a row\n");
1475 b_frames = s->max_b_frames;
1477 }else if(s->b_frame_strategy==0){
1478 b_frames= s->max_b_frames;
1479 while(b_frames && !s->input_picture[b_frames]) b_frames--;
1480 }else if(s->b_frame_strategy==1){
1481 for(i=1; i<s->max_b_frames+1; i++){
1482 if(s->input_picture[i] && s->input_picture[i]->b_frame_score==0){
1483 s->input_picture[i]->b_frame_score=
1484 get_intra_count(s, s->input_picture[i ]->data[0],
1485 s->input_picture[i-1]->data[0], s->linesize) + 1;
1488 for(i=0; i<s->max_b_frames; i++){
1489 if(s->input_picture[i]==NULL || s->input_picture[i]->b_frame_score - 1 > s->mb_num/40) break;
1492 b_frames= FFMAX(0, i-1);
1495 for(i=0; i<b_frames+1; i++){
1496 s->input_picture[i]->b_frame_score=0;
1499 fprintf(stderr, "illegal b frame strategy\n");
1504 //static int b_count=0;
1505 //b_count+= b_frames;
1506 //printf("b_frames: %d\n", b_count);
1508 s->reordered_input_picture[0]= s->input_picture[b_frames];
1509 if( s->picture_in_gop_number + b_frames >= s->gop_size
1510 || s->reordered_input_picture[0]->pict_type== I_TYPE)
1511 s->reordered_input_picture[0]->pict_type= I_TYPE;
1513 s->reordered_input_picture[0]->pict_type= P_TYPE;
1514 s->reordered_input_picture[0]->coded_picture_number= coded_pic_num;
1515 for(i=0; i<b_frames; i++){
1517 s->reordered_input_picture[i+1]= s->input_picture[i];
1518 s->reordered_input_picture[i+1]->pict_type= B_TYPE;
1519 s->reordered_input_picture[i+1]->coded_picture_number= coded_pic_num;
1524 if(s->reordered_input_picture[0]){
1525 s->reordered_input_picture[0]->reference= s->reordered_input_picture[0]->pict_type!=B_TYPE ? 3 : 0;
1527 s->new_picture= *s->reordered_input_picture[0];
1529 if(s->reordered_input_picture[0]->type == FF_BUFFER_TYPE_SHARED){
1530 // input is a shared pix, so we cant modifiy it -> alloc a new one & ensure that the shared one is reuseable
1532 int i= find_unused_picture(s, 0);
1533 Picture *pic= &s->picture[i];
1535 /* mark us unused / free shared pic */
1537 s->reordered_input_picture[0]->data[i]= NULL;
1538 s->reordered_input_picture[0]->type= 0;
1540 //FIXME bad, copy * except
1541 pic->pict_type = s->reordered_input_picture[0]->pict_type;
1542 pic->quality = s->reordered_input_picture[0]->quality;
1543 pic->coded_picture_number = s->reordered_input_picture[0]->coded_picture_number;
1544 pic->reference = s->reordered_input_picture[0]->reference;
1545 pic->pts = s->reordered_input_picture[0]->pts;
1547 alloc_picture(s, pic, 0);
1549 s->current_picture_ptr= pic;
1551 // input is not a shared pix -> reuse buffer for current_pix
1553 assert( s->reordered_input_picture[0]->type==FF_BUFFER_TYPE_USER
1554 || s->reordered_input_picture[0]->type==FF_BUFFER_TYPE_INTERNAL);
1556 s->current_picture_ptr= s->reordered_input_picture[0];
1558 //reverse the +16 we did before storing the input
1559 s->current_picture_ptr->data[i]-=16;
1562 s->current_picture= *s->current_picture_ptr;
1564 s->picture_number= s->new_picture.display_picture_number;
1565 //printf("dpn:%d\n", s->picture_number);
1567 memset(&s->new_picture, 0, sizeof(Picture));
1571 int MPV_encode_picture(AVCodecContext *avctx,
1572 unsigned char *buf, int buf_size, void *data)
1574 MpegEncContext *s = avctx->priv_data;
1575 AVFrame *pic_arg = data;
1578 if(avctx->pix_fmt != PIX_FMT_YUV420P){
1579 fprintf(stderr, "this codec supports only YUV420P\n");
1583 init_put_bits(&s->pb, buf, buf_size, NULL, NULL);
1585 s->picture_in_gop_number++;
1587 load_input_picture(s, pic_arg);
1589 select_input_picture(s);
1592 if(s->new_picture.data[0]){
1594 s->pict_type= s->new_picture.pict_type;
1595 if (s->fixed_qscale){ /* the ratecontrol needs the last qscale so we dont touch it for CBR */
1596 s->qscale= (int)(s->new_picture.quality+0.5);
1600 //printf("qs:%f %f %d\n", s->new_picture.quality, s->current_picture.quality, s->qscale);
1601 MPV_frame_start(s, avctx);
1603 encode_picture(s, s->picture_number);
1605 avctx->real_pict_num = s->picture_number;
1606 avctx->header_bits = s->header_bits;
1607 avctx->mv_bits = s->mv_bits;
1608 avctx->misc_bits = s->misc_bits;
1609 avctx->i_tex_bits = s->i_tex_bits;
1610 avctx->p_tex_bits = s->p_tex_bits;
1611 avctx->i_count = s->i_count;
1612 avctx->p_count = s->mb_num - s->i_count - s->skip_count; //FIXME f/b_count in avctx
1613 avctx->skip_count = s->skip_count;
1617 if (s->out_format == FMT_MJPEG)
1618 mjpeg_picture_trailer(s);
1620 if(s->flags&CODEC_FLAG_PASS1)
1621 ff_write_pass1_stats(s);
1624 avctx->error[i] += s->current_picture_ptr->error[i];
1628 s->input_picture_number++;
1630 flush_put_bits(&s->pb);
1631 s->frame_bits = (pbBufPtr(&s->pb) - s->pb.buf) * 8;
1633 s->total_bits += s->frame_bits;
1634 avctx->frame_bits = s->frame_bits;
1636 return pbBufPtr(&s->pb) - s->pb.buf;
1639 #endif //CONFIG_ENCODERS
1641 static inline void gmc1_motion(MpegEncContext *s,
1642 uint8_t *dest_y, uint8_t *dest_cb, uint8_t *dest_cr,
1644 uint8_t **ref_picture, int src_offset)
1647 int offset, src_x, src_y, linesize, uvlinesize;
1648 int motion_x, motion_y;
1651 motion_x= s->sprite_offset[0][0];
1652 motion_y= s->sprite_offset[0][1];
1653 src_x = s->mb_x * 16 + (motion_x >> (s->sprite_warping_accuracy+1));
1654 src_y = s->mb_y * 16 + (motion_y >> (s->sprite_warping_accuracy+1));
1655 motion_x<<=(3-s->sprite_warping_accuracy);
1656 motion_y<<=(3-s->sprite_warping_accuracy);
1657 src_x = clip(src_x, -16, s->width);
1658 if (src_x == s->width)
1660 src_y = clip(src_y, -16, s->height);
1661 if (src_y == s->height)
1664 linesize = s->linesize;
1665 uvlinesize = s->uvlinesize;
1667 ptr = ref_picture[0] + (src_y * linesize) + src_x + src_offset;
1669 dest_y+=dest_offset;
1670 if(s->flags&CODEC_FLAG_EMU_EDGE){
1671 if(src_x<0 || src_y<0 || src_x + 17 >= s->h_edge_pos
1672 || src_y + 17 >= s->v_edge_pos){
1673 ff_emulated_edge_mc(s->edge_emu_buffer, ptr, linesize, 17, 17, src_x, src_y, s->h_edge_pos, s->v_edge_pos);
1674 ptr= s->edge_emu_buffer;
1678 if((motion_x|motion_y)&7){
1679 s->dsp.gmc1(dest_y , ptr , linesize, 16, motion_x&15, motion_y&15, 128 - s->no_rounding);
1680 s->dsp.gmc1(dest_y+8, ptr+8, linesize, 16, motion_x&15, motion_y&15, 128 - s->no_rounding);
1684 dxy= ((motion_x>>3)&1) | ((motion_y>>2)&2);
1685 if (s->no_rounding){
1686 s->dsp.put_no_rnd_pixels_tab[0][dxy](dest_y, ptr, linesize, 16);
1688 s->dsp.put_pixels_tab [0][dxy](dest_y, ptr, linesize, 16);
1692 if(s->flags&CODEC_FLAG_GRAY) return;
1694 motion_x= s->sprite_offset[1][0];
1695 motion_y= s->sprite_offset[1][1];
1696 src_x = s->mb_x * 8 + (motion_x >> (s->sprite_warping_accuracy+1));
1697 src_y = s->mb_y * 8 + (motion_y >> (s->sprite_warping_accuracy+1));
1698 motion_x<<=(3-s->sprite_warping_accuracy);
1699 motion_y<<=(3-s->sprite_warping_accuracy);
1700 src_x = clip(src_x, -8, s->width>>1);
1701 if (src_x == s->width>>1)
1703 src_y = clip(src_y, -8, s->height>>1);
1704 if (src_y == s->height>>1)
1707 offset = (src_y * uvlinesize) + src_x + (src_offset>>1);
1708 ptr = ref_picture[1] + offset;
1709 if(s->flags&CODEC_FLAG_EMU_EDGE){
1710 if(src_x<0 || src_y<0 || src_x + 9 >= s->h_edge_pos>>1
1711 || src_y + 9 >= s->v_edge_pos>>1){
1712 ff_emulated_edge_mc(s->edge_emu_buffer, ptr, uvlinesize, 9, 9, src_x, src_y, s->h_edge_pos>>1, s->v_edge_pos>>1);
1713 ptr= s->edge_emu_buffer;
1717 s->dsp.gmc1(dest_cb + (dest_offset>>1), ptr, uvlinesize, 8, motion_x&15, motion_y&15, 128 - s->no_rounding);
1719 ptr = ref_picture[2] + offset;
1721 ff_emulated_edge_mc(s->edge_emu_buffer, ptr, uvlinesize, 9, 9, src_x, src_y, s->h_edge_pos>>1, s->v_edge_pos>>1);
1722 ptr= s->edge_emu_buffer;
1724 s->dsp.gmc1(dest_cr + (dest_offset>>1), ptr, uvlinesize, 8, motion_x&15, motion_y&15, 128 - s->no_rounding);
1729 static inline void gmc_motion(MpegEncContext *s,
1730 uint8_t *dest_y, uint8_t *dest_cb, uint8_t *dest_cr,
1732 uint8_t **ref_picture, int src_offset)
1735 int linesize, uvlinesize;
1736 const int a= s->sprite_warping_accuracy;
1739 linesize = s->linesize;
1740 uvlinesize = s->uvlinesize;
1742 ptr = ref_picture[0] + src_offset;
1744 dest_y+=dest_offset;
1746 ox= s->sprite_offset[0][0] + s->sprite_delta[0][0]*s->mb_x*16 + s->sprite_delta[0][1]*s->mb_y*16;
1747 oy= s->sprite_offset[0][1] + s->sprite_delta[1][0]*s->mb_x*16 + s->sprite_delta[1][1]*s->mb_y*16;
1749 s->dsp.gmc(dest_y, ptr, linesize, 16,
1752 s->sprite_delta[0][0], s->sprite_delta[0][1],
1753 s->sprite_delta[1][0], s->sprite_delta[1][1],
1754 a+1, (1<<(2*a+1)) - s->no_rounding,
1755 s->h_edge_pos, s->v_edge_pos);
1756 s->dsp.gmc(dest_y+8, ptr, linesize, 16,
1757 ox + s->sprite_delta[0][0]*8,
1758 oy + s->sprite_delta[1][0]*8,
1759 s->sprite_delta[0][0], s->sprite_delta[0][1],
1760 s->sprite_delta[1][0], s->sprite_delta[1][1],
1761 a+1, (1<<(2*a+1)) - s->no_rounding,
1762 s->h_edge_pos, s->v_edge_pos);
1764 if(s->flags&CODEC_FLAG_GRAY) return;
1767 dest_cb+=dest_offset>>1;
1768 dest_cr+=dest_offset>>1;
1770 ox= s->sprite_offset[1][0] + s->sprite_delta[0][0]*s->mb_x*8 + s->sprite_delta[0][1]*s->mb_y*8;
1771 oy= s->sprite_offset[1][1] + s->sprite_delta[1][0]*s->mb_x*8 + s->sprite_delta[1][1]*s->mb_y*8;
1773 ptr = ref_picture[1] + (src_offset>>1);
1774 s->dsp.gmc(dest_cb, ptr, uvlinesize, 8,
1777 s->sprite_delta[0][0], s->sprite_delta[0][1],
1778 s->sprite_delta[1][0], s->sprite_delta[1][1],
1779 a+1, (1<<(2*a+1)) - s->no_rounding,
1780 s->h_edge_pos>>1, s->v_edge_pos>>1);
1782 ptr = ref_picture[2] + (src_offset>>1);
1783 s->dsp.gmc(dest_cr, ptr, uvlinesize, 8,
1786 s->sprite_delta[0][0], s->sprite_delta[0][1],
1787 s->sprite_delta[1][0], s->sprite_delta[1][1],
1788 a+1, (1<<(2*a+1)) - s->no_rounding,
1789 s->h_edge_pos>>1, s->v_edge_pos>>1);
1793 * Copies a rectangular area of samples to a temporary buffer and replicates the boarder samples.
1794 * @param buf destination buffer
1795 * @param src source buffer
1796 * @param linesize number of bytes between 2 vertically adjacent samples in both the source and destination buffers
1797 * @param block_w width of block
1798 * @param block_h height of block
1799 * @param src_x x coordinate of the top left sample of the block in the source buffer
1800 * @param src_y y coordinate of the top left sample of the block in the source buffer
1801 * @param w width of the source buffer
1802 * @param h height of the source buffer
1804 void ff_emulated_edge_mc(uint8_t *buf, uint8_t *src, int linesize, int block_w, int block_h,
1805 int src_x, int src_y, int w, int h){
1807 int start_y, start_x, end_y, end_x;
1810 src+= (h-1-src_y)*linesize;
1812 }else if(src_y<=-block_h){
1813 src+= (1-block_h-src_y)*linesize;
1819 }else if(src_x<=-block_w){
1820 src+= (1-block_w-src_x);
1824 start_y= FFMAX(0, -src_y);
1825 start_x= FFMAX(0, -src_x);
1826 end_y= FFMIN(block_h, h-src_y);
1827 end_x= FFMIN(block_w, w-src_x);
1829 // copy existing part
1830 for(y=start_y; y<end_y; y++){
1831 for(x=start_x; x<end_x; x++){
1832 buf[x + y*linesize]= src[x + y*linesize];
1837 for(y=0; y<start_y; y++){
1838 for(x=start_x; x<end_x; x++){
1839 buf[x + y*linesize]= buf[x + start_y*linesize];
1844 for(y=end_y; y<block_h; y++){
1845 for(x=start_x; x<end_x; x++){
1846 buf[x + y*linesize]= buf[x + (end_y-1)*linesize];
1850 for(y=0; y<block_h; y++){
1852 for(x=0; x<start_x; x++){
1853 buf[x + y*linesize]= buf[start_x + y*linesize];
1857 for(x=end_x; x<block_w; x++){
1858 buf[x + y*linesize]= buf[end_x - 1 + y*linesize];
1864 /* apply one mpeg motion vector to the three components */
1865 static inline void mpeg_motion(MpegEncContext *s,
1866 uint8_t *dest_y, uint8_t *dest_cb, uint8_t *dest_cr,
1868 uint8_t **ref_picture, int src_offset,
1869 int field_based, op_pixels_func (*pix_op)[4],
1870 int motion_x, int motion_y, int h)
1873 int dxy, offset, mx, my, src_x, src_y, height, v_edge_pos, linesize, uvlinesize;
1876 if(s->quarter_sample)
1882 dxy = ((motion_y & 1) << 1) | (motion_x & 1);
1883 src_x = s->mb_x * 16 + (motion_x >> 1);
1884 src_y = s->mb_y * (16 >> field_based) + (motion_y >> 1);
1886 /* WARNING: do no forget half pels */
1887 height = s->height >> field_based;
1888 v_edge_pos = s->v_edge_pos >> field_based;
1889 src_x = clip(src_x, -16, s->width);
1890 if (src_x == s->width)
1892 src_y = clip(src_y, -16, height);
1893 if (src_y == height)
1895 linesize = s->current_picture.linesize[0] << field_based;
1896 uvlinesize = s->current_picture.linesize[1] << field_based;
1897 ptr = ref_picture[0] + (src_y * linesize) + (src_x) + src_offset;
1898 dest_y += dest_offset;
1900 if(s->flags&CODEC_FLAG_EMU_EDGE){
1901 if(src_x<0 || src_y<0 || src_x + (motion_x&1) + 16 > s->h_edge_pos
1902 || src_y + (motion_y&1) + h > v_edge_pos){
1903 ff_emulated_edge_mc(s->edge_emu_buffer, ptr - src_offset, s->linesize, 17, 17+field_based, //FIXME linesize? and uv below
1904 src_x, src_y<<field_based, s->h_edge_pos, s->v_edge_pos);
1905 ptr= s->edge_emu_buffer + src_offset;
1909 pix_op[0][dxy](dest_y, ptr, linesize, h);
1911 if(s->flags&CODEC_FLAG_GRAY) return;
1913 if (s->out_format == FMT_H263) {
1915 if ((motion_x & 3) != 0)
1917 if ((motion_y & 3) != 0)
1924 dxy = ((my & 1) << 1) | (mx & 1);
1929 src_x = s->mb_x * 8 + mx;
1930 src_y = s->mb_y * (8 >> field_based) + my;
1931 src_x = clip(src_x, -8, s->width >> 1);
1932 if (src_x == (s->width >> 1))
1934 src_y = clip(src_y, -8, height >> 1);
1935 if (src_y == (height >> 1))
1937 offset = (src_y * uvlinesize) + src_x + (src_offset >> 1);
1938 ptr = ref_picture[1] + offset;
1940 ff_emulated_edge_mc(s->edge_emu_buffer, ptr - (src_offset >> 1), s->uvlinesize, 9, 9+field_based,
1941 src_x, src_y<<field_based, s->h_edge_pos>>1, s->v_edge_pos>>1);
1942 ptr= s->edge_emu_buffer + (src_offset >> 1);
1944 pix_op[1][dxy](dest_cb + (dest_offset >> 1), ptr, uvlinesize, h >> 1);
1946 ptr = ref_picture[2] + offset;
1948 ff_emulated_edge_mc(s->edge_emu_buffer, ptr - (src_offset >> 1), s->uvlinesize, 9, 9+field_based,
1949 src_x, src_y<<field_based, s->h_edge_pos>>1, s->v_edge_pos>>1);
1950 ptr= s->edge_emu_buffer + (src_offset >> 1);
1952 pix_op[1][dxy](dest_cr + (dest_offset >> 1), ptr, uvlinesize, h >> 1);
1955 static inline void qpel_motion(MpegEncContext *s,
1956 uint8_t *dest_y, uint8_t *dest_cb, uint8_t *dest_cr,
1958 uint8_t **ref_picture, int src_offset,
1959 int field_based, op_pixels_func (*pix_op)[4],
1960 qpel_mc_func (*qpix_op)[16],
1961 int motion_x, int motion_y, int h)
1964 int dxy, offset, mx, my, src_x, src_y, height, v_edge_pos, linesize, uvlinesize;
1967 dxy = ((motion_y & 3) << 2) | (motion_x & 3);
1968 src_x = s->mb_x * 16 + (motion_x >> 2);
1969 src_y = s->mb_y * (16 >> field_based) + (motion_y >> 2);
1971 height = s->height >> field_based;
1972 v_edge_pos = s->v_edge_pos >> field_based;
1973 src_x = clip(src_x, -16, s->width);
1974 if (src_x == s->width)
1976 src_y = clip(src_y, -16, height);
1977 if (src_y == height)
1979 linesize = s->linesize << field_based;
1980 uvlinesize = s->uvlinesize << field_based;
1981 ptr = ref_picture[0] + (src_y * linesize) + src_x + src_offset;
1982 dest_y += dest_offset;
1983 //printf("%d %d %d\n", src_x, src_y, dxy);
1985 if(s->flags&CODEC_FLAG_EMU_EDGE){
1986 if(src_x<0 || src_y<0 || src_x + (motion_x&3) + 16 > s->h_edge_pos
1987 || src_y + (motion_y&3) + h > v_edge_pos){
1988 ff_emulated_edge_mc(s->edge_emu_buffer, ptr - src_offset, s->linesize, 17, 17+field_based,
1989 src_x, src_y<<field_based, s->h_edge_pos, s->v_edge_pos);
1990 ptr= s->edge_emu_buffer + src_offset;
1995 qpix_op[0][dxy](dest_y, ptr, linesize);
1997 //damn interlaced mode
1998 //FIXME boundary mirroring is not exactly correct here
1999 qpix_op[1][dxy](dest_y , ptr , linesize);
2000 qpix_op[1][dxy](dest_y+8, ptr+8, linesize);
2003 if(s->flags&CODEC_FLAG_GRAY) return;
2008 }else if(s->workaround_bugs&FF_BUG_QPEL_CHROMA2){
2009 static const int rtab[8]= {0,0,1,1,0,0,0,1};
2010 mx= (motion_x>>1) + rtab[motion_x&7];
2011 my= (motion_y>>1) + rtab[motion_y&7];
2012 }else if(s->workaround_bugs&FF_BUG_QPEL_CHROMA){
2013 mx= (motion_x>>1)|(motion_x&1);
2014 my= (motion_y>>1)|(motion_y&1);
2022 dxy= (mx&1) | ((my&1)<<1);
2026 src_x = s->mb_x * 8 + mx;
2027 src_y = s->mb_y * (8 >> field_based) + my;
2028 src_x = clip(src_x, -8, s->width >> 1);
2029 if (src_x == (s->width >> 1))
2031 src_y = clip(src_y, -8, height >> 1);
2032 if (src_y == (height >> 1))
2035 offset = (src_y * uvlinesize) + src_x + (src_offset >> 1);
2036 ptr = ref_picture[1] + offset;
2038 ff_emulated_edge_mc(s->edge_emu_buffer, ptr - (src_offset >> 1), s->uvlinesize, 9, 9 + field_based,
2039 src_x, src_y<<field_based, s->h_edge_pos>>1, s->v_edge_pos>>1);
2040 ptr= s->edge_emu_buffer + (src_offset >> 1);
2042 pix_op[1][dxy](dest_cb + (dest_offset >> 1), ptr, uvlinesize, h >> 1);
2044 ptr = ref_picture[2] + offset;
2046 ff_emulated_edge_mc(s->edge_emu_buffer, ptr - (src_offset >> 1), s->uvlinesize, 9, 9 + field_based,
2047 src_x, src_y<<field_based, s->h_edge_pos>>1, s->v_edge_pos>>1);
2048 ptr= s->edge_emu_buffer + (src_offset >> 1);
2050 pix_op[1][dxy](dest_cr + (dest_offset >> 1), ptr, uvlinesize, h >> 1);
2053 inline int ff_h263_round_chroma(int x){
2055 return (h263_chroma_roundtab[x & 0xf] + ((x >> 3) & ~1));
2058 return -(h263_chroma_roundtab[x & 0xf] + ((x >> 3) & ~1));
2063 * motion compesation of a single macroblock
2065 * @param dest_y luma destination pointer
2066 * @param dest_cb chroma cb/u destination pointer
2067 * @param dest_cr chroma cr/v destination pointer
2068 * @param dir direction (0->forward, 1->backward)
2069 * @param ref_picture array[3] of pointers to the 3 planes of the reference picture
2070 * @param pic_op halfpel motion compensation function (average or put normally)
2071 * @param pic_op qpel motion compensation function (average or put normally)
2072 * the motion vectors are taken from s->mv and the MV type from s->mv_type
2074 static inline void MPV_motion(MpegEncContext *s,
2075 uint8_t *dest_y, uint8_t *dest_cb, uint8_t *dest_cr,
2076 int dir, uint8_t **ref_picture,
2077 op_pixels_func (*pix_op)[4], qpel_mc_func (*qpix_op)[16])
2079 int dxy, offset, mx, my, src_x, src_y, motion_x, motion_y;
2081 uint8_t *ptr, *dest;
2087 switch(s->mv_type) {
2091 if(s->real_sprite_warping_points==1){
2092 gmc1_motion(s, dest_y, dest_cb, dest_cr, 0,
2095 gmc_motion(s, dest_y, dest_cb, dest_cr, 0,
2098 }else if(s->quarter_sample){
2099 qpel_motion(s, dest_y, dest_cb, dest_cr, 0,
2102 s->mv[dir][0][0], s->mv[dir][0][1], 16);
2104 ff_mspel_motion(s, dest_y, dest_cb, dest_cr,
2105 ref_picture, pix_op,
2106 s->mv[dir][0][0], s->mv[dir][0][1], 16);
2110 mpeg_motion(s, dest_y, dest_cb, dest_cr, 0,
2113 s->mv[dir][0][0], s->mv[dir][0][1], 16);
2119 if(s->quarter_sample){
2121 motion_x = s->mv[dir][i][0];
2122 motion_y = s->mv[dir][i][1];
2124 dxy = ((motion_y & 3) << 2) | (motion_x & 3);
2125 src_x = mb_x * 16 + (motion_x >> 2) + (i & 1) * 8;
2126 src_y = mb_y * 16 + (motion_y >> 2) + (i >>1) * 8;
2128 /* WARNING: do no forget half pels */
2129 src_x = clip(src_x, -16, s->width);
2130 if (src_x == s->width)
2132 src_y = clip(src_y, -16, s->height);
2133 if (src_y == s->height)
2136 ptr = ref_picture[0] + (src_y * s->linesize) + (src_x);
2137 if(s->flags&CODEC_FLAG_EMU_EDGE){
2138 if(src_x<0 || src_y<0 || src_x + (motion_x&3) + 8 > s->h_edge_pos
2139 || src_y + (motion_y&3) + 8 > s->v_edge_pos){
2140 ff_emulated_edge_mc(s->edge_emu_buffer, ptr, s->linesize, 9, 9, src_x, src_y, s->h_edge_pos, s->v_edge_pos);
2141 ptr= s->edge_emu_buffer;
2144 dest = dest_y + ((i & 1) * 8) + (i >> 1) * 8 * s->linesize;
2145 qpix_op[1][dxy](dest, ptr, s->linesize);
2147 mx += s->mv[dir][i][0]/2;
2148 my += s->mv[dir][i][1]/2;
2152 motion_x = s->mv[dir][i][0];
2153 motion_y = s->mv[dir][i][1];
2155 dxy = ((motion_y & 1) << 1) | (motion_x & 1);
2156 src_x = mb_x * 16 + (motion_x >> 1) + (i & 1) * 8;
2157 src_y = mb_y * 16 + (motion_y >> 1) + (i >>1) * 8;
2159 /* WARNING: do no forget half pels */
2160 src_x = clip(src_x, -16, s->width);
2161 if (src_x == s->width)
2163 src_y = clip(src_y, -16, s->height);
2164 if (src_y == s->height)
2167 ptr = ref_picture[0] + (src_y * s->linesize) + (src_x);
2168 if(s->flags&CODEC_FLAG_EMU_EDGE){
2169 if(src_x<0 || src_y<0 || src_x + (motion_x&1) + 8 > s->h_edge_pos
2170 || src_y + (motion_y&1) + 8 > s->v_edge_pos){
2171 ff_emulated_edge_mc(s->edge_emu_buffer, ptr, s->linesize, 9, 9, src_x, src_y, s->h_edge_pos, s->v_edge_pos);
2172 ptr= s->edge_emu_buffer;
2175 dest = dest_y + ((i & 1) * 8) + (i >> 1) * 8 * s->linesize;
2176 pix_op[1][dxy](dest, ptr, s->linesize, 8);
2178 mx += s->mv[dir][i][0];
2179 my += s->mv[dir][i][1];
2183 if(s->flags&CODEC_FLAG_GRAY) break;
2184 /* In case of 8X8, we construct a single chroma motion vector
2185 with a special rounding */
2186 mx= ff_h263_round_chroma(mx);
2187 my= ff_h263_round_chroma(my);
2188 dxy = ((my & 1) << 1) | (mx & 1);
2192 src_x = mb_x * 8 + mx;
2193 src_y = mb_y * 8 + my;
2194 src_x = clip(src_x, -8, s->width/2);
2195 if (src_x == s->width/2)
2197 src_y = clip(src_y, -8, s->height/2);
2198 if (src_y == s->height/2)
2201 offset = (src_y * (s->uvlinesize)) + src_x;
2202 ptr = ref_picture[1] + offset;
2203 if(s->flags&CODEC_FLAG_EMU_EDGE){
2204 if(src_x<0 || src_y<0 || src_x + (dxy &1) + 8 > s->h_edge_pos>>1
2205 || src_y + (dxy>>1) + 8 > s->v_edge_pos>>1){
2206 ff_emulated_edge_mc(s->edge_emu_buffer, ptr, s->uvlinesize, 9, 9, src_x, src_y, s->h_edge_pos>>1, s->v_edge_pos>>1);
2207 ptr= s->edge_emu_buffer;
2211 pix_op[1][dxy](dest_cb, ptr, s->uvlinesize, 8);
2213 ptr = ref_picture[2] + offset;
2215 ff_emulated_edge_mc(s->edge_emu_buffer, ptr, s->uvlinesize, 9, 9, src_x, src_y, s->h_edge_pos>>1, s->v_edge_pos>>1);
2216 ptr= s->edge_emu_buffer;
2218 pix_op[1][dxy](dest_cr, ptr, s->uvlinesize, 8);
2221 if (s->picture_structure == PICT_FRAME) {
2222 if(s->quarter_sample){
2224 qpel_motion(s, dest_y, dest_cb, dest_cr, 0,
2225 ref_picture, s->field_select[dir][0] ? s->linesize : 0,
2227 s->mv[dir][0][0], s->mv[dir][0][1], 8);
2229 qpel_motion(s, dest_y, dest_cb, dest_cr, s->linesize,
2230 ref_picture, s->field_select[dir][1] ? s->linesize : 0,
2232 s->mv[dir][1][0], s->mv[dir][1][1], 8);
2235 mpeg_motion(s, dest_y, dest_cb, dest_cr, 0,
2236 ref_picture, s->field_select[dir][0] ? s->linesize : 0,
2238 s->mv[dir][0][0], s->mv[dir][0][1], 8);
2240 mpeg_motion(s, dest_y, dest_cb, dest_cr, s->linesize,
2241 ref_picture, s->field_select[dir][1] ? s->linesize : 0,
2243 s->mv[dir][1][0], s->mv[dir][1][1], 8);
2247 if(s->picture_structure == s->field_select[dir][0] + 1 || s->pict_type == B_TYPE || s->first_field){
2248 offset= s->field_select[dir][0] ? s->linesize : 0;
2250 ref_picture= s->current_picture.data;
2251 offset= s->field_select[dir][0] ? s->linesize : -s->linesize;
2254 mpeg_motion(s, dest_y, dest_cb, dest_cr, 0,
2255 ref_picture, offset,
2257 s->mv[dir][0][0], s->mv[dir][0][1], 16);
2262 uint8_t ** ref2picture;
2264 if(s->picture_structure == s->field_select[dir][0] + 1 || s->pict_type == B_TYPE || s->first_field){
2265 ref2picture= ref_picture;
2266 offset= s->field_select[dir][0] ? s->linesize : 0;
2268 ref2picture= s->current_picture.data;
2269 offset= s->field_select[dir][0] ? s->linesize : -s->linesize;
2272 mpeg_motion(s, dest_y, dest_cb, dest_cr, 0,
2273 ref2picture, offset,
2275 s->mv[dir][0][0], s->mv[dir][0][1], 8);
2278 if(s->picture_structure == s->field_select[dir][1] + 1 || s->pict_type == B_TYPE || s->first_field){
2279 ref2picture= ref_picture;
2280 offset= s->field_select[dir][1] ? s->linesize : 0;
2282 ref2picture= s->current_picture.data;
2283 offset= s->field_select[dir][1] ? s->linesize : -s->linesize;
2285 // I know it is ugly but this is the only way to fool emu_edge without rewrite mpeg_motion
2286 mpeg_motion(s, dest_y+16*s->linesize, dest_cb+8*s->uvlinesize, dest_cr+8*s->uvlinesize,
2288 ref2picture, offset,
2290 s->mv[dir][1][0], s->mv[dir][1][1]+16, 8);
2296 op_pixels_func (*dmv_pix_op)[4];
2299 dmv_pix_op = s->dsp.put_pixels_tab;
2301 if(s->picture_structure == PICT_FRAME){
2302 //put top field from top field
2303 mpeg_motion(s, dest_y, dest_cb, dest_cr, 0,
2306 s->mv[dir][0][0], s->mv[dir][0][1], 8);
2307 //put bottom field from bottom field
2308 mpeg_motion(s, dest_y, dest_cb, dest_cr, s->linesize,
2309 ref_picture, s->linesize,
2311 s->mv[dir][0][0], s->mv[dir][0][1], 8);
2313 dmv_pix_op = s->dsp.avg_pixels_tab;
2315 //avg top field from bottom field
2316 mpeg_motion(s, dest_y, dest_cb, dest_cr, 0,
2317 ref_picture, s->linesize,
2319 s->mv[dir][2][0], s->mv[dir][2][1], 8);
2320 //avg bottom field from top field
2321 mpeg_motion(s, dest_y, dest_cb, dest_cr, s->linesize,
2324 s->mv[dir][3][0], s->mv[dir][3][1], 8);
2327 offset=(s->picture_structure == PICT_BOTTOM_FIELD)?
2330 //put field from the same parity
2331 //same parity is never in the same frame
2332 mpeg_motion(s, dest_y, dest_cb, dest_cr, 0,
2335 s->mv[dir][0][0],s->mv[dir][0][1],16);
2337 // after put we make avg of the same block
2338 dmv_pix_op=s->dsp.avg_pixels_tab;
2340 //opposite parity is always in the same frame if this is second field
2341 if(!s->first_field){
2342 ref_picture = s->current_picture.data;
2343 //top field is one linesize from frame beginig
2344 offset=(s->picture_structure == PICT_BOTTOM_FIELD)?
2345 -s->linesize : s->linesize;
2347 offset=(s->picture_structure == PICT_BOTTOM_FIELD)?
2350 //avg field from the opposite parity
2351 mpeg_motion(s, dest_y, dest_cb, dest_cr,0,
2352 ref_picture, offset,
2354 s->mv[dir][2][0],s->mv[dir][2][1],16);
2363 /* put block[] to dest[] */
2364 static inline void put_dct(MpegEncContext *s,
2365 DCTELEM *block, int i, uint8_t *dest, int line_size)
2367 s->dct_unquantize(s, block, i, s->qscale);
2368 s->dsp.idct_put (dest, line_size, block);
2371 /* add block[] to dest[] */
2372 static inline void add_dct(MpegEncContext *s,
2373 DCTELEM *block, int i, uint8_t *dest, int line_size)
2375 if (s->block_last_index[i] >= 0) {
2376 s->dsp.idct_add (dest, line_size, block);
2380 static inline void add_dequant_dct(MpegEncContext *s,
2381 DCTELEM *block, int i, uint8_t *dest, int line_size)
2383 if (s->block_last_index[i] >= 0) {
2384 s->dct_unquantize(s, block, i, s->qscale);
2386 s->dsp.idct_add (dest, line_size, block);
2391 * cleans dc, ac, coded_block for the current non intra MB
2393 void ff_clean_intra_table_entries(MpegEncContext *s)
2395 int wrap = s->block_wrap[0];
2396 int xy = s->block_index[0];
2399 s->dc_val[0][xy + 1 ] =
2400 s->dc_val[0][xy + wrap] =
2401 s->dc_val[0][xy + 1 + wrap] = 1024;
2403 memset(s->ac_val[0][xy ], 0, 32 * sizeof(int16_t));
2404 memset(s->ac_val[0][xy + wrap], 0, 32 * sizeof(int16_t));
2405 if (s->msmpeg4_version>=3) {
2406 s->coded_block[xy ] =
2407 s->coded_block[xy + 1 ] =
2408 s->coded_block[xy + wrap] =
2409 s->coded_block[xy + 1 + wrap] = 0;
2412 wrap = s->block_wrap[4];
2413 xy = s->mb_x + 1 + (s->mb_y + 1) * wrap;
2415 s->dc_val[2][xy] = 1024;
2417 memset(s->ac_val[1][xy], 0, 16 * sizeof(int16_t));
2418 memset(s->ac_val[2][xy], 0, 16 * sizeof(int16_t));
2420 s->mbintra_table[s->mb_x + s->mb_y*s->mb_stride]= 0;
2423 /* generic function called after a macroblock has been parsed by the
2424 decoder or after it has been encoded by the encoder.
2426 Important variables used:
2427 s->mb_intra : true if intra macroblock
2428 s->mv_dir : motion vector direction
2429 s->mv_type : motion vector type
2430 s->mv : motion vector
2431 s->interlaced_dct : true if interlaced dct used (mpeg2)
2433 void MPV_decode_mb(MpegEncContext *s, DCTELEM block[6][64])
2436 const int mb_xy = s->mb_y * s->mb_stride + s->mb_x;
2438 if(s->avctx->xvmc_acceleration){
2439 XVMC_decode_mb(s,block);
2447 s->current_picture.qscale_table[mb_xy]= s->qscale;
2449 /* update DC predictors for P macroblocks */
2451 if (s->h263_pred || s->h263_aic) {
2452 if(s->mbintra_table[mb_xy])
2453 ff_clean_intra_table_entries(s);
2457 s->last_dc[2] = 128 << s->intra_dc_precision;
2460 else if (s->h263_pred || s->h263_aic)
2461 s->mbintra_table[mb_xy]=1;
2463 if ((s->flags&CODEC_FLAG_PSNR) || !(s->encoding && (s->intra_only || s->pict_type==B_TYPE))) { //FIXME precalc
2464 uint8_t *dest_y, *dest_cb, *dest_cr;
2465 int dct_linesize, dct_offset;
2466 op_pixels_func (*op_pix)[4];
2467 qpel_mc_func (*op_qpix)[16];
2468 const int linesize= s->current_picture.linesize[0]; //not s->linesize as this woulnd be wrong for field pics
2469 const int uvlinesize= s->current_picture.linesize[1];
2471 /* avoid copy if macroblock skipped in last frame too */
2472 /* skip only during decoding as we might trash the buffers during encoding a bit */
2474 uint8_t *mbskip_ptr = &s->mbskip_table[mb_xy];
2475 const int age= s->current_picture.age;
2481 assert(s->pict_type!=I_TYPE);
2483 (*mbskip_ptr) ++; /* indicate that this time we skiped it */
2484 if(*mbskip_ptr >99) *mbskip_ptr= 99;
2486 /* if previous was skipped too, then nothing to do ! */
2487 if (*mbskip_ptr >= age && s->current_picture.reference){
2490 } else if(!s->current_picture.reference){
2491 (*mbskip_ptr) ++; /* increase counter so the age can be compared cleanly */
2492 if(*mbskip_ptr >99) *mbskip_ptr= 99;
2494 *mbskip_ptr = 0; /* not skipped */
2498 if (s->interlaced_dct) {
2499 dct_linesize = linesize * 2;
2500 dct_offset = linesize;
2502 dct_linesize = linesize;
2503 dct_offset = linesize * 8;
2507 dest_cb= s->dest[1];
2508 dest_cr= s->dest[2];
2511 /* motion handling */
2512 /* decoding or more than one mb_type (MC was allready done otherwise) */
2514 if ((!s->no_rounding) || s->pict_type==B_TYPE){
2515 op_pix = s->dsp.put_pixels_tab;
2516 op_qpix= s->dsp.put_qpel_pixels_tab;
2518 op_pix = s->dsp.put_no_rnd_pixels_tab;
2519 op_qpix= s->dsp.put_no_rnd_qpel_pixels_tab;
2522 if (s->mv_dir & MV_DIR_FORWARD) {
2523 MPV_motion(s, dest_y, dest_cb, dest_cr, 0, s->last_picture.data, op_pix, op_qpix);
2524 op_pix = s->dsp.avg_pixels_tab;
2525 op_qpix= s->dsp.avg_qpel_pixels_tab;
2527 if (s->mv_dir & MV_DIR_BACKWARD) {
2528 MPV_motion(s, dest_y, dest_cb, dest_cr, 1, s->next_picture.data, op_pix, op_qpix);
2532 /* skip dequant / idct if we are really late ;) */
2533 if(s->hurry_up>1) return;
2535 /* add dct residue */
2536 if(s->encoding || !( s->h263_msmpeg4 || s->codec_id==CODEC_ID_MPEG1VIDEO || s->codec_id==CODEC_ID_MPEG2VIDEO
2537 || (s->codec_id==CODEC_ID_MPEG4 && !s->mpeg_quant))){
2538 add_dequant_dct(s, block[0], 0, dest_y, dct_linesize);
2539 add_dequant_dct(s, block[1], 1, dest_y + 8, dct_linesize);
2540 add_dequant_dct(s, block[2], 2, dest_y + dct_offset, dct_linesize);
2541 add_dequant_dct(s, block[3], 3, dest_y + dct_offset + 8, dct_linesize);
2543 if(!(s->flags&CODEC_FLAG_GRAY)){
2544 add_dequant_dct(s, block[4], 4, dest_cb, uvlinesize);
2545 add_dequant_dct(s, block[5], 5, dest_cr, uvlinesize);
2547 } else if(s->codec_id != CODEC_ID_WMV2){
2548 add_dct(s, block[0], 0, dest_y, dct_linesize);
2549 add_dct(s, block[1], 1, dest_y + 8, dct_linesize);
2550 add_dct(s, block[2], 2, dest_y + dct_offset, dct_linesize);
2551 add_dct(s, block[3], 3, dest_y + dct_offset + 8, dct_linesize);
2553 if(!(s->flags&CODEC_FLAG_GRAY)){
2554 add_dct(s, block[4], 4, dest_cb, uvlinesize);
2555 add_dct(s, block[5], 5, dest_cr, uvlinesize);
2560 ff_wmv2_add_mb(s, block, dest_y, dest_cb, dest_cr);
2564 /* dct only in intra block */
2565 if(s->encoding || !(s->codec_id==CODEC_ID_MPEG1VIDEO || s->codec_id==CODEC_ID_MPEG2VIDEO)){
2566 put_dct(s, block[0], 0, dest_y, dct_linesize);
2567 put_dct(s, block[1], 1, dest_y + 8, dct_linesize);
2568 put_dct(s, block[2], 2, dest_y + dct_offset, dct_linesize);
2569 put_dct(s, block[3], 3, dest_y + dct_offset + 8, dct_linesize);
2571 if(!(s->flags&CODEC_FLAG_GRAY)){
2572 put_dct(s, block[4], 4, dest_cb, uvlinesize);
2573 put_dct(s, block[5], 5, dest_cr, uvlinesize);
2576 s->dsp.idct_put(dest_y , dct_linesize, block[0]);
2577 s->dsp.idct_put(dest_y + 8, dct_linesize, block[1]);
2578 s->dsp.idct_put(dest_y + dct_offset , dct_linesize, block[2]);
2579 s->dsp.idct_put(dest_y + dct_offset + 8, dct_linesize, block[3]);
2581 if(!(s->flags&CODEC_FLAG_GRAY)){
2582 s->dsp.idct_put(dest_cb, uvlinesize, block[4]);
2583 s->dsp.idct_put(dest_cr, uvlinesize, block[5]);
2590 #ifdef CONFIG_ENCODERS
2592 static inline void dct_single_coeff_elimination(MpegEncContext *s, int n, int threshold)
2594 static const char tab[64]=
2606 DCTELEM *block= s->block[n];
2607 const int last_index= s->block_last_index[n];
2612 threshold= -threshold;
2616 /* are all which we could set to zero are allready zero? */
2617 if(last_index<=skip_dc - 1) return;
2619 for(i=0; i<=last_index; i++){
2620 const int j = s->intra_scantable.permutated[i];
2621 const int level = ABS(block[j]);
2623 if(skip_dc && i==0) continue;
2632 if(score >= threshold) return;
2633 for(i=skip_dc; i<=last_index; i++){
2634 const int j = s->intra_scantable.permutated[i];
2637 if(block[0]) s->block_last_index[n]= 0;
2638 else s->block_last_index[n]= -1;
2641 static inline void clip_coeffs(MpegEncContext *s, DCTELEM *block, int last_index)
2644 const int maxlevel= s->max_qcoeff;
2645 const int minlevel= s->min_qcoeff;
2648 i=1; //skip clipping of intra dc
2652 for(;i<=last_index; i++){
2653 const int j= s->intra_scantable.permutated[i];
2654 int level = block[j];
2656 if (level>maxlevel) level=maxlevel;
2657 else if(level<minlevel) level=minlevel;
2664 static int pix_vcmp16x8(uint8_t *s, int stride){ //FIXME move to dsputil & optimize
2669 for(x=0; x<16; x+=4){
2670 score+= ABS(s[x ] - s[x +stride]) + ABS(s[x+1] - s[x+1+stride])
2671 +ABS(s[x+2] - s[x+2+stride]) + ABS(s[x+3] - s[x+3+stride]);
2679 static int pix_diff_vcmp16x8(uint8_t *s1, uint8_t*s2, int stride){ //FIXME move to dsputil & optimize
2684 for(x=0; x<16; x++){
2685 score+= ABS(s1[x ] - s2[x ] - s1[x +stride] + s2[x +stride]);
2694 #define SQ(a) ((a)*(a))
2696 static int pix_vcmp16x8(uint8_t *s, int stride){ //FIXME move to dsputil & optimize
2701 for(x=0; x<16; x+=4){
2702 score+= SQ(s[x ] - s[x +stride]) + SQ(s[x+1] - s[x+1+stride])
2703 +SQ(s[x+2] - s[x+2+stride]) + SQ(s[x+3] - s[x+3+stride]);
2711 static int pix_diff_vcmp16x8(uint8_t *s1, uint8_t*s2, int stride){ //FIXME move to dsputil & optimize
2716 for(x=0; x<16; x++){
2717 score+= SQ(s1[x ] - s2[x ] - s1[x +stride] + s2[x +stride]);
2728 #endif //CONFIG_ENCODERS
2732 * @param h is the normal height, this will be reduced automatically if needed for the last row
2734 void ff_draw_horiz_band(MpegEncContext *s, int y, int h){
2735 if (s->avctx->draw_horiz_band) {
2739 if(s->picture_structure != PICT_FRAME){
2742 if(s->first_field && !(s->avctx->slice_flags&SLICE_FLAG_ALLOW_FIELD)) return;
2745 h= FFMIN(h, s->height - y);
2747 if(s->pict_type==B_TYPE || s->low_delay || (s->avctx->slice_flags&SLICE_FLAG_CODED_ORDER))
2748 src= (AVFrame*)s->current_picture_ptr;
2749 else if(s->last_picture_ptr)
2750 src= (AVFrame*)s->last_picture_ptr;
2754 if(s->pict_type==B_TYPE && s->picture_structure == PICT_FRAME && s->out_format != FMT_H264){
2760 offset[0]= y * s->linesize;;
2762 offset[2]= (y>>1) * s->uvlinesize;;
2768 s->avctx->draw_horiz_band(s->avctx, src, offset,
2769 y, s->picture_structure, h);
2773 void ff_init_block_index(MpegEncContext *s){ //FIXME maybe rename
2774 const int linesize= s->current_picture.linesize[0]; //not s->linesize as this woulnd be wrong for field pics
2775 const int uvlinesize= s->current_picture.linesize[1];
2777 s->block_index[0]= s->block_wrap[0]*(s->mb_y*2 + 1) - 1 + s->mb_x*2;
2778 s->block_index[1]= s->block_wrap[0]*(s->mb_y*2 + 1) + s->mb_x*2;
2779 s->block_index[2]= s->block_wrap[0]*(s->mb_y*2 + 2) - 1 + s->mb_x*2;
2780 s->block_index[3]= s->block_wrap[0]*(s->mb_y*2 + 2) + s->mb_x*2;
2781 s->block_index[4]= s->block_wrap[4]*(s->mb_y + 1) + s->block_wrap[0]*(s->mb_height*2 + 2) + s->mb_x;
2782 s->block_index[5]= s->block_wrap[4]*(s->mb_y + 1 + s->mb_height + 2) + s->block_wrap[0]*(s->mb_height*2 + 2) + s->mb_x;
2784 if(s->pict_type==B_TYPE && s->avctx->draw_horiz_band && s->picture_structure==PICT_FRAME){
2785 s->dest[0] = s->current_picture.data[0] + s->mb_x * 16 - 16;
2786 s->dest[1] = s->current_picture.data[1] + s->mb_x * 8 - 8;
2787 s->dest[2] = s->current_picture.data[2] + s->mb_x * 8 - 8;
2789 s->dest[0] = s->current_picture.data[0] + (s->mb_y * 16* linesize ) + s->mb_x * 16 - 16;
2790 s->dest[1] = s->current_picture.data[1] + (s->mb_y * 8 * uvlinesize) + s->mb_x * 8 - 8;
2791 s->dest[2] = s->current_picture.data[2] + (s->mb_y * 8 * uvlinesize) + s->mb_x * 8 - 8;
2795 #ifdef CONFIG_ENCODERS
2797 static void encode_mb(MpegEncContext *s, int motion_x, int motion_y)
2799 const int mb_x= s->mb_x;
2800 const int mb_y= s->mb_y;
2803 int dct_offset = s->linesize*8; //default for progressive frames
2805 for(i=0; i<6; i++) skip_dct[i]=0;
2807 if(s->adaptive_quant){
2808 s->dquant= s->current_picture.qscale_table[mb_x + mb_y*s->mb_stride] - s->qscale;
2810 if(s->out_format==FMT_H263){
2811 if (s->dquant> 2) s->dquant= 2;
2812 else if(s->dquant<-2) s->dquant=-2;
2815 if(s->codec_id==CODEC_ID_MPEG4){
2817 if(s->mv_dir&MV_DIRECT)
2820 assert(s->dquant==0 || s->mv_type!=MV_TYPE_8X8);
2823 s->qscale+= s->dquant;
2824 s->y_dc_scale= s->y_dc_scale_table[ s->qscale ];
2825 s->c_dc_scale= s->c_dc_scale_table[ s->qscale ];
2833 wrap_y = s->linesize;
2834 ptr = s->new_picture.data[0] + (mb_y * 16 * wrap_y) + mb_x * 16;
2836 if(mb_x*16+16 > s->width || mb_y*16+16 > s->height){
2837 ff_emulated_edge_mc(s->edge_emu_buffer, ptr, wrap_y, 16, 16, mb_x*16, mb_y*16, s->width, s->height);
2838 ptr= s->edge_emu_buffer;
2842 if(s->flags&CODEC_FLAG_INTERLACED_DCT){
2843 int progressive_score, interlaced_score;
2845 progressive_score= pix_vcmp16x8(ptr, wrap_y ) + pix_vcmp16x8(ptr + wrap_y*8, wrap_y );
2846 interlaced_score = pix_vcmp16x8(ptr, wrap_y*2) + pix_vcmp16x8(ptr + wrap_y , wrap_y*2);
2848 if(progressive_score > interlaced_score + 100){
2849 s->interlaced_dct=1;
2854 s->interlaced_dct=0;
2857 s->dsp.get_pixels(s->block[0], ptr , wrap_y);
2858 s->dsp.get_pixels(s->block[1], ptr + 8, wrap_y);
2859 s->dsp.get_pixels(s->block[2], ptr + dct_offset , wrap_y);
2860 s->dsp.get_pixels(s->block[3], ptr + dct_offset + 8, wrap_y);
2862 if(s->flags&CODEC_FLAG_GRAY){
2866 int wrap_c = s->uvlinesize;
2867 ptr = s->new_picture.data[1] + (mb_y * 8 * wrap_c) + mb_x * 8;
2869 ff_emulated_edge_mc(s->edge_emu_buffer, ptr, wrap_c, 8, 8, mb_x*8, mb_y*8, s->width>>1, s->height>>1);
2870 ptr= s->edge_emu_buffer;
2872 s->dsp.get_pixels(s->block[4], ptr, wrap_c);
2874 ptr = s->new_picture.data[2] + (mb_y * 8 * wrap_c) + mb_x * 8;
2876 ff_emulated_edge_mc(s->edge_emu_buffer, ptr, wrap_c, 8, 8, mb_x*8, mb_y*8, s->width>>1, s->height>>1);
2877 ptr= s->edge_emu_buffer;
2879 s->dsp.get_pixels(s->block[5], ptr, wrap_c);
2882 op_pixels_func (*op_pix)[4];
2883 qpel_mc_func (*op_qpix)[16];
2884 uint8_t *dest_y, *dest_cb, *dest_cr;
2885 uint8_t *ptr_y, *ptr_cb, *ptr_cr;
2889 dest_y = s->dest[0];
2890 dest_cb = s->dest[1];
2891 dest_cr = s->dest[2];
2892 wrap_y = s->linesize;
2893 wrap_c = s->uvlinesize;
2894 ptr_y = s->new_picture.data[0] + (mb_y * 16 * wrap_y) + mb_x * 16;
2895 ptr_cb = s->new_picture.data[1] + (mb_y * 8 * wrap_c) + mb_x * 8;
2896 ptr_cr = s->new_picture.data[2] + (mb_y * 8 * wrap_c) + mb_x * 8;
2898 if ((!s->no_rounding) || s->pict_type==B_TYPE){
2899 op_pix = s->dsp.put_pixels_tab;
2900 op_qpix= s->dsp.put_qpel_pixels_tab;
2902 op_pix = s->dsp.put_no_rnd_pixels_tab;
2903 op_qpix= s->dsp.put_no_rnd_qpel_pixels_tab;
2906 if (s->mv_dir & MV_DIR_FORWARD) {
2907 MPV_motion(s, dest_y, dest_cb, dest_cr, 0, s->last_picture.data, op_pix, op_qpix);
2908 op_pix = s->dsp.avg_pixels_tab;
2909 op_qpix= s->dsp.avg_qpel_pixels_tab;
2911 if (s->mv_dir & MV_DIR_BACKWARD) {
2912 MPV_motion(s, dest_y, dest_cb, dest_cr, 1, s->next_picture.data, op_pix, op_qpix);
2915 if(mb_x*16+16 > s->width || mb_y*16+16 > s->height){
2916 ff_emulated_edge_mc(s->edge_emu_buffer, ptr_y, wrap_y, 16, 16, mb_x*16, mb_y*16, s->width, s->height);
2917 ptr_y= s->edge_emu_buffer;
2921 if(s->flags&CODEC_FLAG_INTERLACED_DCT){
2922 int progressive_score, interlaced_score;
2924 progressive_score= pix_diff_vcmp16x8(ptr_y , dest_y , wrap_y )
2925 + pix_diff_vcmp16x8(ptr_y + wrap_y*8, dest_y + wrap_y*8, wrap_y );
2926 interlaced_score = pix_diff_vcmp16x8(ptr_y , dest_y , wrap_y*2)
2927 + pix_diff_vcmp16x8(ptr_y + wrap_y , dest_y + wrap_y , wrap_y*2);
2929 if(progressive_score > interlaced_score + 600){
2930 s->interlaced_dct=1;
2935 s->interlaced_dct=0;
2938 s->dsp.diff_pixels(s->block[0], ptr_y , dest_y , wrap_y);
2939 s->dsp.diff_pixels(s->block[1], ptr_y + 8, dest_y + 8, wrap_y);
2940 s->dsp.diff_pixels(s->block[2], ptr_y + dct_offset , dest_y + dct_offset , wrap_y);
2941 s->dsp.diff_pixels(s->block[3], ptr_y + dct_offset + 8, dest_y + dct_offset + 8, wrap_y);
2943 if(s->flags&CODEC_FLAG_GRAY){
2948 ff_emulated_edge_mc(s->edge_emu_buffer, ptr_cb, wrap_c, 8, 8, mb_x*8, mb_y*8, s->width>>1, s->height>>1);
2949 ptr_cb= s->edge_emu_buffer;
2951 s->dsp.diff_pixels(s->block[4], ptr_cb, dest_cb, wrap_c);
2953 ff_emulated_edge_mc(s->edge_emu_buffer, ptr_cr, wrap_c, 8, 8, mb_x*8, mb_y*8, s->width>>1, s->height>>1);
2954 ptr_cr= s->edge_emu_buffer;
2956 s->dsp.diff_pixels(s->block[5], ptr_cr, dest_cr, wrap_c);
2958 /* pre quantization */
2959 if(s->current_picture.mc_mb_var[s->mb_stride*mb_y+ mb_x]<2*s->qscale*s->qscale){
2961 if(s->dsp.pix_abs8x8(ptr_y , dest_y , wrap_y) < 20*s->qscale) skip_dct[0]= 1;
2962 if(s->dsp.pix_abs8x8(ptr_y + 8, dest_y + 8, wrap_y) < 20*s->qscale) skip_dct[1]= 1;
2963 if(s->dsp.pix_abs8x8(ptr_y +dct_offset , dest_y +dct_offset , wrap_y) < 20*s->qscale) skip_dct[2]= 1;
2964 if(s->dsp.pix_abs8x8(ptr_y +dct_offset+ 8, dest_y +dct_offset+ 8, wrap_y) < 20*s->qscale) skip_dct[3]= 1;
2965 if(s->dsp.pix_abs8x8(ptr_cb , dest_cb , wrap_c) < 20*s->qscale) skip_dct[4]= 1;
2966 if(s->dsp.pix_abs8x8(ptr_cr , dest_cr , wrap_c) < 20*s->qscale) skip_dct[5]= 1;
2972 if(skip_dct[i]) num++;
2975 if(s->mb_x==0 && s->mb_y==0){
2977 printf("%6d %1d\n", stat[i], i);
2990 adap_parm = ((s->avg_mb_var << 1) + s->mb_var[s->mb_stride*mb_y+mb_x] + 1.0) /
2991 ((s->mb_var[s->mb_stride*mb_y+mb_x] << 1) + s->avg_mb_var + 1.0);
2993 printf("\ntype=%c qscale=%2d adap=%0.2f dquant=%4.2f var=%4d avgvar=%4d",
2994 (s->mb_type[s->mb_stride*mb_y+mb_x] > 0) ? 'I' : 'P',
2995 s->qscale, adap_parm, s->qscale*adap_parm,
2996 s->mb_var[s->mb_stride*mb_y+mb_x], s->avg_mb_var);
2999 /* DCT & quantize */
3000 if(s->out_format==FMT_MJPEG){
3003 s->block_last_index[i] = s->dct_quantize(s, s->block[i], i, 8, &overflow);
3004 if (overflow) clip_coeffs(s, s->block[i], s->block_last_index[i]);
3010 s->block_last_index[i] = s->dct_quantize(s, s->block[i], i, s->qscale, &overflow);
3011 // FIXME we could decide to change to quantizer instead of clipping
3012 // JS: I don't think that would be a good idea it could lower quality instead
3013 // of improve it. Just INTRADC clipping deserves changes in quantizer
3014 if (overflow) clip_coeffs(s, s->block[i], s->block_last_index[i]);
3016 s->block_last_index[i]= -1;
3018 if(s->luma_elim_threshold && !s->mb_intra)
3020 dct_single_coeff_elimination(s, i, s->luma_elim_threshold);
3021 if(s->chroma_elim_threshold && !s->mb_intra)
3023 dct_single_coeff_elimination(s, i, s->chroma_elim_threshold);
3026 if((s->flags&CODEC_FLAG_GRAY) && s->mb_intra){
3027 s->block_last_index[4]=
3028 s->block_last_index[5]= 0;
3030 s->block[5][0]= (1024 + s->c_dc_scale/2)/ s->c_dc_scale;
3033 /* huffman encode */
3034 switch(s->codec_id){ //FIXME funct ptr could be slightly faster
3035 case CODEC_ID_MPEG1VIDEO:
3036 case CODEC_ID_MPEG2VIDEO:
3037 mpeg1_encode_mb(s, s->block, motion_x, motion_y); break;
3039 case CODEC_ID_MPEG4:
3040 mpeg4_encode_mb(s, s->block, motion_x, motion_y); break;
3041 case CODEC_ID_MSMPEG4V2:
3042 case CODEC_ID_MSMPEG4V3:
3044 msmpeg4_encode_mb(s, s->block, motion_x, motion_y); break;
3046 ff_wmv2_encode_mb(s, s->block, motion_x, motion_y); break;
3048 case CODEC_ID_H263P:
3051 h263_encode_mb(s, s->block, motion_x, motion_y); break;
3053 case CODEC_ID_MJPEG:
3054 mjpeg_encode_mb(s, s->block); break;
3060 #endif //CONFIG_ENCODERS
3063 * combines the (truncated) bitstream to a complete frame
3064 * @returns -1 if no complete frame could be created
3066 int ff_combine_frame( MpegEncContext *s, int next, uint8_t **buf, int *buf_size){
3067 ParseContext *pc= &s->parse_context;
3071 printf("overread %d, state:%X next:%d index:%d o_index:%d\n", pc->overread, pc->state, next, pc->index, pc->overread_index);
3072 printf("%X %X %X %X\n", (*buf)[0], (*buf)[1],(*buf)[2],(*buf)[3]);
3076 /* copy overreaded byes from last frame into buffer */
3077 for(; pc->overread>0; pc->overread--){
3078 pc->buffer[pc->index++]= pc->buffer[pc->overread_index++];
3081 pc->last_index= pc->index;
3083 /* copy into buffer end return */
3084 if(next == END_NOT_FOUND){
3085 pc->buffer= av_fast_realloc(pc->buffer, &pc->buffer_size, (*buf_size) + pc->index + FF_INPUT_BUFFER_PADDING_SIZE);
3087 memcpy(&pc->buffer[pc->index], *buf, *buf_size);
3088 pc->index += *buf_size;
3093 pc->overread_index= pc->index + next;
3095 /* append to buffer */
3097 pc->buffer= av_fast_realloc(pc->buffer, &pc->buffer_size, next + pc->index + FF_INPUT_BUFFER_PADDING_SIZE);
3099 memcpy(&pc->buffer[pc->index], *buf, next + FF_INPUT_BUFFER_PADDING_SIZE );
3104 /* store overread bytes */
3105 for(;next < 0; next++){
3106 pc->state = (pc->state<<8) | pc->buffer[pc->last_index + next];
3112 printf("overread %d, state:%X next:%d index:%d o_index:%d\n", pc->overread, pc->state, next, pc->index, pc->overread_index);
3113 printf("%X %X %X %X\n", (*buf)[0], (*buf)[1],(*buf)[2],(*buf)[3]);
3120 void ff_mpeg_flush(AVCodecContext *avctx){
3122 MpegEncContext *s = avctx->priv_data;
3124 for(i=0; i<MAX_PICTURE_COUNT; i++){
3125 if(s->picture[i].data[0] && ( s->picture[i].type == FF_BUFFER_TYPE_INTERNAL
3126 || s->picture[i].type == FF_BUFFER_TYPE_USER))
3127 avctx->release_buffer(avctx, (AVFrame*)&s->picture[i]);
3129 s->last_picture_ptr = s->next_picture_ptr = NULL;
3131 s->parse_context.state= -1;
3132 s->parse_context.frame_start_found= 0;
3133 s->parse_context.overread= 0;
3134 s->parse_context.overread_index= 0;
3135 s->parse_context.index= 0;
3136 s->parse_context.last_index= 0;
3139 #ifdef CONFIG_ENCODERS
3140 void ff_copy_bits(PutBitContext *pb, uint8_t *src, int length)
3142 int bytes= length>>4;
3143 int bits= length&15;
3146 if(length==0) return;
3148 for(i=0; i<bytes; i++) put_bits(pb, 16, be2me_16(((uint16_t*)src)[i]));
3149 put_bits(pb, bits, be2me_16(((uint16_t*)src)[i])>>(16-bits));
3152 static inline void copy_context_before_encode(MpegEncContext *d, MpegEncContext *s, int type){
3155 memcpy(d->last_mv, s->last_mv, 2*2*2*sizeof(int)); //FIXME is memcpy faster then a loop?
3158 d->mb_skip_run= s->mb_skip_run;
3160 d->last_dc[i]= s->last_dc[i];
3163 d->mv_bits= s->mv_bits;
3164 d->i_tex_bits= s->i_tex_bits;
3165 d->p_tex_bits= s->p_tex_bits;
3166 d->i_count= s->i_count;
3167 d->f_count= s->f_count;
3168 d->b_count= s->b_count;
3169 d->skip_count= s->skip_count;
3170 d->misc_bits= s->misc_bits;
3174 d->qscale= s->qscale;
3177 static inline void copy_context_after_encode(MpegEncContext *d, MpegEncContext *s, int type){
3180 memcpy(d->mv, s->mv, 2*4*2*sizeof(int));
3181 memcpy(d->last_mv, s->last_mv, 2*2*2*sizeof(int)); //FIXME is memcpy faster then a loop?
3184 d->mb_skip_run= s->mb_skip_run;
3186 d->last_dc[i]= s->last_dc[i];
3189 d->mv_bits= s->mv_bits;
3190 d->i_tex_bits= s->i_tex_bits;
3191 d->p_tex_bits= s->p_tex_bits;
3192 d->i_count= s->i_count;
3193 d->f_count= s->f_count;
3194 d->b_count= s->b_count;
3195 d->skip_count= s->skip_count;
3196 d->misc_bits= s->misc_bits;
3198 d->mb_intra= s->mb_intra;
3199 d->mb_skiped= s->mb_skiped;
3200 d->mv_type= s->mv_type;
3201 d->mv_dir= s->mv_dir;
3203 if(s->data_partitioning){
3205 d->tex_pb= s->tex_pb;
3209 d->block_last_index[i]= s->block_last_index[i];
3210 d->interlaced_dct= s->interlaced_dct;
3211 d->qscale= s->qscale;
3214 static inline void encode_mb_hq(MpegEncContext *s, MpegEncContext *backup, MpegEncContext *best, int type,
3215 PutBitContext pb[2], PutBitContext pb2[2], PutBitContext tex_pb[2],
3216 int *dmin, int *next_block, int motion_x, int motion_y)
3219 uint8_t *dest_backup[3];
3221 copy_context_before_encode(s, backup, type);
3223 s->block= s->blocks[*next_block];
3224 s->pb= pb[*next_block];
3225 if(s->data_partitioning){
3226 s->pb2 = pb2 [*next_block];
3227 s->tex_pb= tex_pb[*next_block];
3231 memcpy(dest_backup, s->dest, sizeof(s->dest));
3232 s->dest[0] = s->me.scratchpad;
3233 s->dest[1] = s->me.scratchpad + 16;
3234 s->dest[2] = s->me.scratchpad + 16 + 8;
3235 assert(2*s->uvlinesize == s->linesize); //should be no prob for encoding
3236 assert(s->linesize >= 64); //FIXME
3239 encode_mb(s, motion_x, motion_y);
3241 score= get_bit_count(&s->pb);
3242 if(s->data_partitioning){
3243 score+= get_bit_count(&s->pb2);
3244 score+= get_bit_count(&s->tex_pb);
3247 if(s->avctx->mb_decision == FF_MB_DECISION_RD){
3248 MPV_decode_mb(s, s->block);
3250 score *= s->qscale * s->qscale * 109;
3251 score += sse_mb(s) << 7;
3255 memcpy(s->dest, dest_backup, sizeof(s->dest));
3262 copy_context_after_encode(best, s, type);
3266 static int sse(MpegEncContext *s, uint8_t *src1, uint8_t *src2, int w, int h, int stride){
3267 uint32_t *sq = squareTbl + 256;
3272 return s->dsp.sse[0](NULL, src1, src2, stride);
3273 else if(w==8 && h==8)
3274 return s->dsp.sse[1](NULL, src1, src2, stride);
3278 acc+= sq[src1[x + y*stride] - src2[x + y*stride]];
3287 static int sse_mb(MpegEncContext *s){
3291 if(s->mb_x*16 + 16 > s->width ) w= s->width - s->mb_x*16;
3292 if(s->mb_y*16 + 16 > s->height) h= s->height- s->mb_y*16;
3295 return s->dsp.sse[0](NULL, s->new_picture.data[0] + s->mb_x*16 + s->mb_y*s->linesize*16, s->dest[0], s->linesize)
3296 +s->dsp.sse[1](NULL, s->new_picture.data[1] + s->mb_x*8 + s->mb_y*s->uvlinesize*8,s->dest[1], s->uvlinesize)
3297 +s->dsp.sse[1](NULL, s->new_picture.data[2] + s->mb_x*8 + s->mb_y*s->uvlinesize*8,s->dest[2], s->uvlinesize);
3299 return sse(s, s->new_picture.data[0] + s->mb_x*16 + s->mb_y*s->linesize*16, s->dest[0], w, h, s->linesize)
3300 +sse(s, s->new_picture.data[1] + s->mb_x*8 + s->mb_y*s->uvlinesize*8,s->dest[1], w>>1, h>>1, s->uvlinesize)
3301 +sse(s, s->new_picture.data[2] + s->mb_x*8 + s->mb_y*s->uvlinesize*8,s->dest[2], w>>1, h>>1, s->uvlinesize);
3304 static void encode_picture(MpegEncContext *s, int picture_number)
3306 int mb_x, mb_y, pdif = 0;
3309 MpegEncContext best_s, backup_s;
3310 uint8_t bit_buf[2][3000];
3311 uint8_t bit_buf2[2][3000];
3312 uint8_t bit_buf_tex[2][3000];
3313 PutBitContext pb[2], pb2[2], tex_pb[2];
3316 init_put_bits(&pb [i], bit_buf [i], 3000, NULL, NULL);
3317 init_put_bits(&pb2 [i], bit_buf2 [i], 3000, NULL, NULL);
3318 init_put_bits(&tex_pb[i], bit_buf_tex[i], 3000, NULL, NULL);
3321 s->picture_number = picture_number;
3323 /* Reset the average MB variance */
3324 s->current_picture.mb_var_sum = 0;
3325 s->current_picture.mc_mb_var_sum = 0;
3328 /* we need to initialize some time vars before we can encode b-frames */
3329 // RAL: Condition added for MPEG1VIDEO
3330 //FIXME figure out why mpeg1/2 need this !!!
3331 if (s->codec_id == CODEC_ID_MPEG1VIDEO || s->codec_id == CODEC_ID_MPEG2VIDEO || (s->h263_pred && !s->h263_msmpeg4))
3332 ff_set_mpeg4_time(s, s->picture_number);
3335 s->scene_change_score=0;
3337 s->qscale= (int)(s->frame_qscale + 0.5); //FIXME qscale / ... stuff for ME ratedistoration
3339 if(s->pict_type==I_TYPE){
3340 if(s->msmpeg4_version >= 3) s->no_rounding=1;
3341 else s->no_rounding=0;
3342 }else if(s->pict_type!=B_TYPE){
3343 if(s->flipflop_rounding || s->codec_id == CODEC_ID_H263P || s->codec_id == CODEC_ID_MPEG4)
3344 s->no_rounding ^= 1;
3347 /* Estimate motion for every MB */
3348 s->mb_intra=0; //for the rate distoration & bit compare functions
3349 if(s->pict_type != I_TYPE){
3350 if(s->pict_type != B_TYPE){
3351 if((s->avctx->pre_me && s->last_non_b_pict_type==I_TYPE) || s->avctx->pre_me==2){
3353 s->me.dia_size= s->avctx->pre_dia_size;
3355 for(mb_y=s->mb_height-1; mb_y >=0 ; mb_y--) {
3356 for(mb_x=s->mb_width-1; mb_x >=0 ; mb_x--) {
3359 ff_pre_estimate_p_frame_motion(s, mb_x, mb_y);
3366 s->me.dia_size= s->avctx->dia_size;
3367 for(mb_y=0; mb_y < s->mb_height; mb_y++) {
3368 s->block_index[0]= s->block_wrap[0]*(mb_y*2 + 1) - 1;
3369 s->block_index[1]= s->block_wrap[0]*(mb_y*2 + 1);
3370 s->block_index[2]= s->block_wrap[0]*(mb_y*2 + 2) - 1;
3371 s->block_index[3]= s->block_wrap[0]*(mb_y*2 + 2);
3372 for(mb_x=0; mb_x < s->mb_width; mb_x++) {
3375 s->block_index[0]+=2;
3376 s->block_index[1]+=2;
3377 s->block_index[2]+=2;
3378 s->block_index[3]+=2;
3380 /* compute motion vector & mb_type and store in context */
3381 if(s->pict_type==B_TYPE)
3382 ff_estimate_b_frame_motion(s, mb_x, mb_y);
3384 ff_estimate_p_frame_motion(s, mb_x, mb_y);
3387 }else /* if(s->pict_type == I_TYPE) */{
3389 //FIXME do we need to zero them?
3390 memset(s->motion_val[0], 0, sizeof(int16_t)*(s->mb_width*2 + 2)*(s->mb_height*2 + 2)*2);
3391 memset(s->p_mv_table , 0, sizeof(int16_t)*(s->mb_stride)*s->mb_height*2);
3392 memset(s->mb_type , MB_TYPE_INTRA, sizeof(uint8_t)*s->mb_stride*s->mb_height);
3394 if(!s->fixed_qscale){
3395 /* finding spatial complexity for I-frame rate control */
3396 for(mb_y=0; mb_y < s->mb_height; mb_y++) {
3397 for(mb_x=0; mb_x < s->mb_width; mb_x++) {
3400 uint8_t *pix = s->new_picture.data[0] + (yy * s->linesize) + xx;
3402 int sum = s->dsp.pix_sum(pix, s->linesize);
3404 varc = (s->dsp.pix_norm1(pix, s->linesize) - (((unsigned)(sum*sum))>>8) + 500 + 128)>>8;
3406 s->current_picture.mb_var [s->mb_stride * mb_y + mb_x] = varc;
3407 s->current_picture.mb_mean[s->mb_stride * mb_y + mb_x] = (sum+128)>>8;
3408 s->current_picture.mb_var_sum += varc;
3415 if(s->scene_change_score > 0 && s->pict_type == P_TYPE){
3416 s->pict_type= I_TYPE;
3417 memset(s->mb_type , MB_TYPE_INTRA, sizeof(uint8_t)*s->mb_stride*s->mb_height);
3418 //printf("Scene change detected, encoding as I Frame %d %d\n", s->current_picture.mb_var_sum, s->current_picture.mc_mb_var_sum);
3422 if(s->pict_type==P_TYPE || s->pict_type==S_TYPE) {
3423 s->f_code= ff_get_best_fcode(s, s->p_mv_table, MB_TYPE_INTER);
3425 ff_fix_long_p_mvs(s);
3428 if(s->pict_type==B_TYPE){
3431 a = ff_get_best_fcode(s, s->b_forw_mv_table, MB_TYPE_FORWARD);
3432 b = ff_get_best_fcode(s, s->b_bidir_forw_mv_table, MB_TYPE_BIDIR);
3433 s->f_code = FFMAX(a, b);
3435 a = ff_get_best_fcode(s, s->b_back_mv_table, MB_TYPE_BACKWARD);
3436 b = ff_get_best_fcode(s, s->b_bidir_back_mv_table, MB_TYPE_BIDIR);
3437 s->b_code = FFMAX(a, b);
3439 ff_fix_long_b_mvs(s, s->b_forw_mv_table, s->f_code, MB_TYPE_FORWARD);
3440 ff_fix_long_b_mvs(s, s->b_back_mv_table, s->b_code, MB_TYPE_BACKWARD);
3441 ff_fix_long_b_mvs(s, s->b_bidir_forw_mv_table, s->f_code, MB_TYPE_BIDIR);
3442 ff_fix_long_b_mvs(s, s->b_bidir_back_mv_table, s->b_code, MB_TYPE_BIDIR);
3446 if (s->fixed_qscale)
3447 s->frame_qscale = s->current_picture.quality;
3449 s->frame_qscale = ff_rate_estimate_qscale(s);
3451 if(s->adaptive_quant){
3453 switch(s->codec_id){
3454 case CODEC_ID_MPEG4:
3455 ff_clean_mpeg4_qscales(s);
3458 case CODEC_ID_H263P:
3460 ff_clean_h263_qscales(s);
3465 s->qscale= s->current_picture.qscale_table[0];
3467 s->qscale= (int)(s->frame_qscale + 0.5);
3469 if (s->out_format == FMT_MJPEG) {
3470 /* for mjpeg, we do include qscale in the matrix */
3471 s->intra_matrix[0] = ff_mpeg1_default_intra_matrix[0];
3473 int j= s->dsp.idct_permutation[i];
3475 s->intra_matrix[j] = CLAMP_TO_8BIT((ff_mpeg1_default_intra_matrix[i] * s->qscale) >> 3);
3477 convert_matrix(s, s->q_intra_matrix, s->q_intra_matrix16,
3478 s->q_intra_matrix16_bias, s->intra_matrix, s->intra_quant_bias, 8, 8);
3481 //FIXME var duplication
3482 s->current_picture.key_frame= s->pict_type == I_TYPE;
3483 s->current_picture.pict_type= s->pict_type;
3485 if(s->current_picture.key_frame)
3486 s->picture_in_gop_number=0;
3488 s->last_bits= get_bit_count(&s->pb);
3489 switch(s->out_format) {
3491 mjpeg_picture_header(s);
3495 if (s->codec_id == CODEC_ID_WMV2)
3496 ff_wmv2_encode_picture_header(s, picture_number);
3497 else if (s->h263_msmpeg4)
3498 msmpeg4_encode_picture_header(s, picture_number);
3499 else if (s->h263_pred)
3500 mpeg4_encode_picture_header(s, picture_number);
3501 else if (s->h263_rv10)
3502 rv10_encode_picture_header(s, picture_number);
3503 else if (s->codec_id == CODEC_ID_FLV1)
3504 ff_flv_encode_picture_header(s, picture_number);
3506 h263_encode_picture_header(s, picture_number);
3510 mpeg1_encode_picture_header(s, picture_number);
3515 bits= get_bit_count(&s->pb);
3516 s->header_bits= bits - s->last_bits;
3528 /* init last dc values */
3529 /* note: quant matrix value (8) is implied here */
3530 s->last_dc[i] = 128;
3532 s->current_picture_ptr->error[i] = 0;
3535 s->last_mv[0][0][0] = 0;
3536 s->last_mv[0][0][1] = 0;
3537 s->last_mv[1][0][0] = 0;
3538 s->last_mv[1][0][1] = 0;
3543 switch(s->codec_id){
3545 case CODEC_ID_H263P:
3547 s->gob_index = ff_h263_get_gob_height(s);
3549 case CODEC_ID_MPEG4:
3550 if(s->partitioned_frame)
3551 ff_mpeg4_init_partitions(s);
3558 s->first_slice_line = 1;
3559 s->ptr_lastgob = s->pb.buf;
3560 for(mb_y=0; mb_y < s->mb_height; mb_y++) {
3564 s->y_dc_scale= s->y_dc_scale_table[ s->qscale ];
3565 s->c_dc_scale= s->c_dc_scale_table[ s->qscale ];
3566 ff_init_block_index(s);
3568 for(mb_x=0; mb_x < s->mb_width; mb_x++) {
3569 const int xy= mb_y*s->mb_stride + mb_x;
3570 int mb_type= s->mb_type[xy];
3575 ff_update_block_index(s);
3577 /* write gob / video packet header */
3579 if(s->rtp_mode && mb_y + mb_x>0){
3580 int current_packet_size, is_gob_start;
3582 current_packet_size= pbBufPtr(&s->pb) - s->ptr_lastgob;
3585 if(s->codec_id==CODEC_ID_MPEG4){
3586 if(current_packet_size >= s->rtp_payload_size){
3588 if(s->partitioned_frame){
3589 ff_mpeg4_merge_partitions(s);
3590 ff_mpeg4_init_partitions(s);
3592 ff_mpeg4_encode_video_packet_header(s);
3594 if(s->flags&CODEC_FLAG_PASS1){
3595 int bits= get_bit_count(&s->pb);
3596 s->misc_bits+= bits - s->last_bits;
3599 ff_mpeg4_clean_buffers(s);
3602 }else if(s->codec_id==CODEC_ID_MPEG1VIDEO){
3603 if( current_packet_size >= s->rtp_payload_size
3604 && s->mb_skip_run==0){
3605 ff_mpeg1_encode_slice_header(s);
3606 ff_mpeg1_clean_buffers(s);
3609 }else if(s->codec_id==CODEC_ID_MPEG2VIDEO){
3610 if( ( current_packet_size >= s->rtp_payload_size || mb_x==0)
3611 && s->mb_skip_run==0){
3612 ff_mpeg1_encode_slice_header(s);
3613 ff_mpeg1_clean_buffers(s);
3617 if(current_packet_size >= s->rtp_payload_size
3618 && s->mb_x==0 && s->mb_y%s->gob_index==0){
3620 h263_encode_gob_header(s, mb_y);
3626 s->ptr_lastgob = pbBufPtr(&s->pb);
3627 s->first_slice_line=1;
3628 s->resync_mb_x=mb_x;
3629 s->resync_mb_y=mb_y;
3634 if( (s->resync_mb_x == s->mb_x)
3635 && s->resync_mb_y+1 == s->mb_y){
3636 s->first_slice_line=0;
3641 if(mb_type & (mb_type-1)){ // more than 1 MB type possible
3643 int pb_bits_count, pb2_bits_count, tex_pb_bits_count;
3645 copy_context_before_encode(&backup_s, s, -1);
3647 best_s.data_partitioning= s->data_partitioning;
3648 best_s.partitioned_frame= s->partitioned_frame;
3649 if(s->data_partitioning){
3650 backup_s.pb2= s->pb2;
3651 backup_s.tex_pb= s->tex_pb;
3654 if(mb_type&MB_TYPE_INTER){
3655 s->mv_dir = MV_DIR_FORWARD;
3656 s->mv_type = MV_TYPE_16X16;
3658 s->mv[0][0][0] = s->p_mv_table[xy][0];
3659 s->mv[0][0][1] = s->p_mv_table[xy][1];
3660 encode_mb_hq(s, &backup_s, &best_s, MB_TYPE_INTER, pb, pb2, tex_pb,
3661 &dmin, &next_block, s->mv[0][0][0], s->mv[0][0][1]);
3663 if(mb_type&MB_TYPE_INTER4V){
3664 s->mv_dir = MV_DIR_FORWARD;
3665 s->mv_type = MV_TYPE_8X8;
3668 s->mv[0][i][0] = s->motion_val[s->block_index[i]][0];
3669 s->mv[0][i][1] = s->motion_val[s->block_index[i]][1];
3671 encode_mb_hq(s, &backup_s, &best_s, MB_TYPE_INTER4V, pb, pb2, tex_pb,
3672 &dmin, &next_block, 0, 0);
3674 if(mb_type&MB_TYPE_FORWARD){
3675 s->mv_dir = MV_DIR_FORWARD;
3676 s->mv_type = MV_TYPE_16X16;
3678 s->mv[0][0][0] = s->b_forw_mv_table[xy][0];
3679 s->mv[0][0][1] = s->b_forw_mv_table[xy][1];
3680 encode_mb_hq(s, &backup_s, &best_s, MB_TYPE_FORWARD, pb, pb2, tex_pb,
3681 &dmin, &next_block, s->mv[0][0][0], s->mv[0][0][1]);
3683 if(mb_type&MB_TYPE_BACKWARD){
3684 s->mv_dir = MV_DIR_BACKWARD;
3685 s->mv_type = MV_TYPE_16X16;
3687 s->mv[1][0][0] = s->b_back_mv_table[xy][0];
3688 s->mv[1][0][1] = s->b_back_mv_table[xy][1];
3689 encode_mb_hq(s, &backup_s, &best_s, MB_TYPE_BACKWARD, pb, pb2, tex_pb,
3690 &dmin, &next_block, s->mv[1][0][0], s->mv[1][0][1]);
3692 if(mb_type&MB_TYPE_BIDIR){
3693 s->mv_dir = MV_DIR_FORWARD | MV_DIR_BACKWARD;
3694 s->mv_type = MV_TYPE_16X16;
3696 s->mv[0][0][0] = s->b_bidir_forw_mv_table[xy][0];
3697 s->mv[0][0][1] = s->b_bidir_forw_mv_table[xy][1];
3698 s->mv[1][0][0] = s->b_bidir_back_mv_table[xy][0];
3699 s->mv[1][0][1] = s->b_bidir_back_mv_table[xy][1];
3700 encode_mb_hq(s, &backup_s, &best_s, MB_TYPE_BIDIR, pb, pb2, tex_pb,
3701 &dmin, &next_block, 0, 0);
3703 if(mb_type&MB_TYPE_DIRECT){
3704 int mx= s->b_direct_mv_table[xy][0];
3705 int my= s->b_direct_mv_table[xy][1];
3707 s->mv_dir = MV_DIR_FORWARD | MV_DIR_BACKWARD | MV_DIRECT;
3710 ff_mpeg4_set_direct_mv(s, mx, my);
3712 encode_mb_hq(s, &backup_s, &best_s, MB_TYPE_DIRECT, pb, pb2, tex_pb,
3713 &dmin, &next_block, mx, my);
3715 if(mb_type&MB_TYPE_INTRA){
3717 s->mv_type = MV_TYPE_16X16;
3721 encode_mb_hq(s, &backup_s, &best_s, MB_TYPE_INTRA, pb, pb2, tex_pb,
3722 &dmin, &next_block, 0, 0);
3723 if(s->h263_pred || s->h263_aic){
3725 s->mbintra_table[mb_x + mb_y*s->mb_stride]=1;
3727 ff_clean_intra_table_entries(s); //old mode?
3730 copy_context_after_encode(s, &best_s, -1);
3732 pb_bits_count= get_bit_count(&s->pb);
3733 flush_put_bits(&s->pb);
3734 ff_copy_bits(&backup_s.pb, bit_buf[next_block^1], pb_bits_count);
3737 if(s->data_partitioning){
3738 pb2_bits_count= get_bit_count(&s->pb2);
3739 flush_put_bits(&s->pb2);
3740 ff_copy_bits(&backup_s.pb2, bit_buf2[next_block^1], pb2_bits_count);
3741 s->pb2= backup_s.pb2;
3743 tex_pb_bits_count= get_bit_count(&s->tex_pb);
3744 flush_put_bits(&s->tex_pb);
3745 ff_copy_bits(&backup_s.tex_pb, bit_buf_tex[next_block^1], tex_pb_bits_count);
3746 s->tex_pb= backup_s.tex_pb;
3748 s->last_bits= get_bit_count(&s->pb);
3750 if (s->out_format == FMT_H263 && s->pict_type!=B_TYPE)
3751 ff_h263_update_motion_val(s);
3754 s->dsp.put_pixels_tab[0][0](s->dest[0], s->me.scratchpad , s->linesize ,16);
3755 s->dsp.put_pixels_tab[1][0](s->dest[1], s->me.scratchpad + 16, s->uvlinesize, 8);
3756 s->dsp.put_pixels_tab[1][0](s->dest[2], s->me.scratchpad + 24, s->uvlinesize, 8);
3759 if(s->avctx->mb_decision == FF_MB_DECISION_BITS)
3760 MPV_decode_mb(s, s->block);
3762 int motion_x, motion_y;
3764 int inter_score= s->current_picture.mb_cmp_score[mb_x + mb_y*s->mb_stride];
3766 if(s->avctx->mb_decision==FF_MB_DECISION_SIMPLE && s->pict_type==P_TYPE){ //FIXME check if the mess is usefull at all
3767 /* get luma score */
3768 if((s->avctx->mb_cmp&0xFF)==FF_CMP_SSE){
3769 intra_score= (s->current_picture.mb_var[mb_x + mb_y*s->mb_stride]<<8) - 500; //FIXME dont scale it down so we dont have to fix it
3773 int mean= s->current_picture.mb_mean[mb_x + mb_y*s->mb_stride]; //FIXME
3776 dest_y = s->new_picture.data[0] + (mb_y * 16 * s->linesize ) + mb_x * 16;
3778 for(i=0; i<16; i++){
3779 *(uint32_t*)(&s->me.scratchpad[i*s->linesize+ 0]) = mean;
3780 *(uint32_t*)(&s->me.scratchpad[i*s->linesize+ 4]) = mean;
3781 *(uint32_t*)(&s->me.scratchpad[i*s->linesize+ 8]) = mean;
3782 *(uint32_t*)(&s->me.scratchpad[i*s->linesize+12]) = mean;
3786 intra_score= s->dsp.mb_cmp[0](s, s->me.scratchpad, dest_y, s->linesize);
3788 /* printf("intra:%7d inter:%7d var:%7d mc_var.%7d\n", intra_score>>8, inter_score>>8,
3789 s->current_picture.mb_var[mb_x + mb_y*s->mb_stride],
3790 s->current_picture.mc_mb_var[mb_x + mb_y*s->mb_stride]);*/
3793 /* get chroma score */
3794 if(s->avctx->mb_cmp&FF_CMP_CHROMA){
3802 if(s->out_format == FMT_H263){
3803 mean= (s->dc_val[i][mb_x + (mb_y+1)*(s->mb_width+2)] + 4)>>3; //FIXME not exact but simple ;)
3805 mean= (s->last_dc[i] + 4)>>3;
3807 dest_c = s->new_picture.data[i] + (mb_y * 8 * (s->uvlinesize)) + mb_x * 8;
3811 *(uint32_t*)(&s->me.scratchpad[i*s->uvlinesize+ 0]) = mean;
3812 *(uint32_t*)(&s->me.scratchpad[i*s->uvlinesize+ 4]) = mean;
3815 intra_score+= s->dsp.mb_cmp[1](s, s->me.scratchpad, dest_c, s->uvlinesize);
3820 switch(s->avctx->mb_cmp&0xFF){
3823 intra_score+= 32*s->qscale;
3826 intra_score+= 24*s->qscale*s->qscale;
3829 intra_score+= 96*s->qscale;
3832 intra_score+= 48*s->qscale;
3839 intra_score+= (s->qscale*s->qscale*109*8 + 64)>>7;
3843 if(intra_score < inter_score)
3844 mb_type= MB_TYPE_INTRA;
3847 s->mv_type=MV_TYPE_16X16;
3848 // only one MB-Type possible
3854 motion_x= s->mv[0][0][0] = 0;
3855 motion_y= s->mv[0][0][1] = 0;
3858 s->mv_dir = MV_DIR_FORWARD;
3860 motion_x= s->mv[0][0][0] = s->p_mv_table[xy][0];
3861 motion_y= s->mv[0][0][1] = s->p_mv_table[xy][1];
3863 case MB_TYPE_INTER4V:
3864 s->mv_dir = MV_DIR_FORWARD;
3865 s->mv_type = MV_TYPE_8X8;
3868 s->mv[0][i][0] = s->motion_val[s->block_index[i]][0];
3869 s->mv[0][i][1] = s->motion_val[s->block_index[i]][1];
3871 motion_x= motion_y= 0;
3873 case MB_TYPE_DIRECT:
3874 s->mv_dir = MV_DIR_FORWARD | MV_DIR_BACKWARD | MV_DIRECT;
3876 motion_x=s->b_direct_mv_table[xy][0];
3877 motion_y=s->b_direct_mv_table[xy][1];
3879 ff_mpeg4_set_direct_mv(s, motion_x, motion_y);
3883 s->mv_dir = MV_DIR_FORWARD | MV_DIR_BACKWARD;
3887 s->mv[0][0][0] = s->b_bidir_forw_mv_table[xy][0];
3888 s->mv[0][0][1] = s->b_bidir_forw_mv_table[xy][1];
3889 s->mv[1][0][0] = s->b_bidir_back_mv_table[xy][0];
3890 s->mv[1][0][1] = s->b_bidir_back_mv_table[xy][1];
3892 case MB_TYPE_BACKWARD:
3893 s->mv_dir = MV_DIR_BACKWARD;
3895 motion_x= s->mv[1][0][0] = s->b_back_mv_table[xy][0];
3896 motion_y= s->mv[1][0][1] = s->b_back_mv_table[xy][1];
3898 case MB_TYPE_FORWARD:
3899 s->mv_dir = MV_DIR_FORWARD;
3901 motion_x= s->mv[0][0][0] = s->b_forw_mv_table[xy][0];
3902 motion_y= s->mv[0][0][1] = s->b_forw_mv_table[xy][1];
3903 // printf(" %d %d ", motion_x, motion_y);
3906 motion_x=motion_y=0; //gcc warning fix
3907 printf("illegal MB type\n");
3910 encode_mb(s, motion_x, motion_y);
3912 // RAL: Update last macrobloc type
3913 s->last_mv_dir = s->mv_dir;
3915 if (s->out_format == FMT_H263 && s->pict_type!=B_TYPE)
3916 ff_h263_update_motion_val(s);
3918 MPV_decode_mb(s, s->block);
3921 /* clean the MV table in IPS frames for direct mode in B frames */
3922 if(s->mb_intra /* && I,P,S_TYPE */){
3923 s->p_mv_table[xy][0]=0;
3924 s->p_mv_table[xy][1]=0;
3927 if(s->flags&CODEC_FLAG_PSNR){
3931 if(s->mb_x*16 + 16 > s->width ) w= s->width - s->mb_x*16;
3932 if(s->mb_y*16 + 16 > s->height) h= s->height- s->mb_y*16;
3934 s->current_picture_ptr->error[0] += sse(
3935 s, s->new_picture.data[0] + s->mb_x*16 + s->mb_y*s->linesize*16,
3936 s->dest[0], w, h, s->linesize);
3937 s->current_picture_ptr->error[1] += sse(
3938 s, s->new_picture.data[1] + s->mb_x*8 + s->mb_y*s->uvlinesize*8,
3939 s->dest[1], w>>1, h>>1, s->uvlinesize);
3940 s->current_picture_ptr->error[2] += sse(
3941 s, s->new_picture .data[2] + s->mb_x*8 + s->mb_y*s->uvlinesize*8,
3942 s->dest[2], w>>1, h>>1, s->uvlinesize);
3944 //printf("MB %d %d bits\n", s->mb_x+s->mb_y*s->mb_stride, get_bit_count(&s->pb));
3950 if(s->codec_id==CODEC_ID_MPEG4 && s->partitioned_frame)
3951 ff_mpeg4_merge_partitions(s);
3953 if (s->msmpeg4_version && s->msmpeg4_version<4 && s->pict_type == I_TYPE)
3954 msmpeg4_encode_ext_header(s);
3956 if(s->codec_id==CODEC_ID_MPEG4)
3957 ff_mpeg4_stuffing(&s->pb);
3960 //if (s->gob_number)
3961 // fprintf(stderr,"\nNumber of GOB: %d", s->gob_number);
3963 /* Send the last GOB if RTP */
3965 flush_put_bits(&s->pb);
3966 pdif = pbBufPtr(&s->pb) - s->ptr_lastgob;
3967 /* Call the RTP callback to send the last GOB */
3968 if (s->rtp_callback)
3969 s->rtp_callback(s->ptr_lastgob, pdif, s->gob_number);
3970 s->ptr_lastgob = pbBufPtr(&s->pb);
3971 //fprintf(stderr,"\nGOB: %2d size: %d (last)", s->gob_number, pdif);
3975 static int dct_quantize_trellis_c(MpegEncContext *s,
3976 DCTELEM *block, int n,
3977 int qscale, int *overflow){
3979 const uint8_t *scantable= s->intra_scantable.scantable;
3981 unsigned int threshold1, threshold2;
3991 int coeff_count[64];
3992 int lambda, qmul, qadd, start_i, last_non_zero, i;
3993 const int esc_length= s->ac_esc_length;
3995 uint8_t * last_length;
3999 s->dsp.fdct (block);
4002 qadd= ((qscale-1)|1)*8;
4013 /* For AIC we skip quant/dequant of INTRADC */
4018 /* note: block[0] is assumed to be positive */
4019 block[0] = (block[0] + (q >> 1)) / q;
4022 qmat = s->q_intra_matrix[qscale];
4023 if(s->mpeg_quant || s->out_format == FMT_MPEG1)
4024 bias= 1<<(QMAT_SHIFT-1);
4025 length = s->intra_ac_vlc_length;
4026 last_length= s->intra_ac_vlc_last_length;
4030 qmat = s->q_inter_matrix[qscale];
4031 length = s->inter_ac_vlc_length;
4032 last_length= s->inter_ac_vlc_last_length;
4035 threshold1= (1<<QMAT_SHIFT) - bias - 1;
4036 threshold2= (threshold1<<1);
4038 for(i=start_i; i<64; i++) {
4039 const int j = scantable[i];
4040 const int k= i-start_i;
4041 int level = block[j];
4042 level = level * qmat[j];
4044 // if( bias+level >= (1<<(QMAT_SHIFT - 3))
4045 // || bias-level >= (1<<(QMAT_SHIFT - 3))){
4046 if(((unsigned)(level+threshold1))>threshold2){
4048 level= (bias + level)>>QMAT_SHIFT;
4050 coeff[1][k]= level-1;
4051 // coeff[2][k]= level-2;
4053 level= (bias - level)>>QMAT_SHIFT;
4054 coeff[0][k]= -level;
4055 coeff[1][k]= -level+1;
4056 // coeff[2][k]= -level+2;
4058 coeff_count[k]= FFMIN(level, 2);
4062 coeff[0][k]= (level>>31)|1;
4067 *overflow= s->max_qcoeff < max; //overflow might have happend
4069 if(last_non_zero < start_i){
4070 memset(block + start_i, 0, (64-start_i)*sizeof(DCTELEM));
4071 return last_non_zero;
4074 lambda= (qscale*qscale*64*105 + 64)>>7; //FIXME finetune
4077 for(i=0; i<=last_non_zero - start_i; i++){
4078 int level_index, run, j;
4079 const int dct_coeff= block[ scantable[i + start_i] ];
4080 const int zero_distoration= dct_coeff*dct_coeff;
4081 int best_score=256*256*256*120;
4083 last_score += zero_distoration;
4084 for(level_index=0; level_index < coeff_count[i]; level_index++){
4086 int level= coeff[level_index][i];
4091 if(s->out_format == FMT_H263){
4093 unquant_coeff= level*qmul + qadd;
4095 unquant_coeff= level*qmul - qadd;
4098 j= s->dsp.idct_permutation[ scantable[i + start_i] ]; //FIXME optimize
4101 unquant_coeff = (int)((-level) * qscale * s->intra_matrix[j]) >> 3;
4102 unquant_coeff = -((unquant_coeff - 1) | 1);
4104 unquant_coeff = (int)( level * qscale * s->intra_matrix[j]) >> 3;
4105 unquant_coeff = (unquant_coeff - 1) | 1;
4109 unquant_coeff = ((((-level) << 1) + 1) * qscale * ((int) s->inter_matrix[j])) >> 4;
4110 unquant_coeff = -((unquant_coeff - 1) | 1);
4112 unquant_coeff = ((( level << 1) + 1) * qscale * ((int) s->inter_matrix[j])) >> 4;
4113 unquant_coeff = (unquant_coeff - 1) | 1;
4119 distoration= (unquant_coeff - dct_coeff) * (unquant_coeff - dct_coeff);
4121 if((level&(~127)) == 0){
4122 for(run=0; run<=i - left_limit; run++){
4123 int score= distoration + length[UNI_AC_ENC_INDEX(run, level)]*lambda;
4124 score += score_tab[i-run];
4126 if(score < best_score){
4128 score_tab[i+1]= score;
4130 level_tab[i+1]= level-64;
4134 if(s->out_format == FMT_H263){
4135 for(run=0; run<=i - left_limit; run++){
4136 int score= distoration + last_length[UNI_AC_ENC_INDEX(run, level)]*lambda;
4137 score += score_tab[i-run];
4138 if(score < last_score){
4141 last_level= level-64;
4147 distoration += esc_length*lambda;
4148 for(run=0; run<=i - left_limit; run++){
4149 int score= distoration + score_tab[i-run];
4151 if(score < best_score){
4153 score_tab[i+1]= score;
4155 level_tab[i+1]= level-64;
4159 if(s->out_format == FMT_H263){
4160 for(run=0; run<=i - left_limit; run++){
4161 int score= distoration + score_tab[i-run];
4162 if(score < last_score){
4165 last_level= level-64;
4173 for(j=left_limit; j<=i; j++){
4174 score_tab[j] += zero_distoration;
4176 score_limit+= zero_distoration;
4177 if(score_tab[i+1] < score_limit)
4178 score_limit= score_tab[i+1];
4180 //Note: there is a vlc code in mpeg4 which is 1 bit shorter then another one with a shorter run and the same level
4181 while(score_tab[ left_limit ] > score_limit + lambda) left_limit++;
4184 //FIXME add some cbp penalty
4186 if(s->out_format != FMT_H263){
4187 last_score= 256*256*256*120;
4188 for(i= left_limit; i<=last_non_zero - start_i + 1; i++){
4189 int score= score_tab[i];
4190 if(i) score += lambda*2; //FIXME exacter?
4192 if(score < last_score){
4195 last_level= level_tab[i];
4196 last_run= run_tab[i];
4201 last_non_zero= last_i - 1 + start_i;
4202 memset(block + start_i, 0, (64-start_i)*sizeof(DCTELEM));
4204 if(last_non_zero < start_i)
4205 return last_non_zero;
4209 //FIXME use permutated scantable
4210 block[ s->dsp.idct_permutation[ scantable[last_non_zero] ] ]= last_level;
4213 for(;i>0 ; i -= run_tab[i] + 1){
4214 const int j= s->dsp.idct_permutation[ scantable[i - 1 + start_i] ];
4216 block[j]= level_tab[i];
4220 return last_non_zero;
4223 static int dct_quantize_c(MpegEncContext *s,
4224 DCTELEM *block, int n,
4225 int qscale, int *overflow)
4227 int i, j, level, last_non_zero, q;
4229 const uint8_t *scantable= s->intra_scantable.scantable;
4232 unsigned int threshold1, threshold2;
4234 s->dsp.fdct (block);
4244 /* For AIC we skip quant/dequant of INTRADC */
4247 /* note: block[0] is assumed to be positive */
4248 block[0] = (block[0] + (q >> 1)) / q;
4251 qmat = s->q_intra_matrix[qscale];
4252 bias= s->intra_quant_bias<<(QMAT_SHIFT - QUANT_BIAS_SHIFT);
4256 qmat = s->q_inter_matrix[qscale];
4257 bias= s->inter_quant_bias<<(QMAT_SHIFT - QUANT_BIAS_SHIFT);
4259 threshold1= (1<<QMAT_SHIFT) - bias - 1;
4260 threshold2= (threshold1<<1);
4265 level = level * qmat[j];
4267 // if( bias+level >= (1<<QMAT_SHIFT)
4268 // || bias-level >= (1<<QMAT_SHIFT)){
4269 if(((unsigned)(level+threshold1))>threshold2){
4271 level= (bias + level)>>QMAT_SHIFT;
4274 level= (bias - level)>>QMAT_SHIFT;
4283 *overflow= s->max_qcoeff < max; //overflow might have happend
4285 /* we need this permutation so that we correct the IDCT, we only permute the !=0 elements */
4286 if (s->dsp.idct_permutation_type != FF_NO_IDCT_PERM)
4287 ff_block_permute(block, s->dsp.idct_permutation, scantable, last_non_zero);
4289 return last_non_zero;
4292 #endif //CONFIG_ENCODERS
4294 static void dct_unquantize_mpeg1_c(MpegEncContext *s,
4295 DCTELEM *block, int n, int qscale)
4297 int i, level, nCoeffs;
4298 const uint16_t *quant_matrix;
4300 nCoeffs= s->block_last_index[n];
4304 block[0] = block[0] * s->y_dc_scale;
4306 block[0] = block[0] * s->c_dc_scale;
4307 /* XXX: only mpeg1 */
4308 quant_matrix = s->intra_matrix;
4309 for(i=1;i<=nCoeffs;i++) {
4310 int j= s->intra_scantable.permutated[i];
4315 level = (int)(level * qscale * quant_matrix[j]) >> 3;
4316 level = (level - 1) | 1;
4319 level = (int)(level * qscale * quant_matrix[j]) >> 3;
4320 level = (level - 1) | 1;
4323 if (level < -2048 || level > 2047)
4324 fprintf(stderr, "unquant error %d %d\n", i, level);
4331 quant_matrix = s->inter_matrix;
4332 for(;i<=nCoeffs;i++) {
4333 int j= s->intra_scantable.permutated[i];
4338 level = (((level << 1) + 1) * qscale *
4339 ((int) (quant_matrix[j]))) >> 4;
4340 level = (level - 1) | 1;
4343 level = (((level << 1) + 1) * qscale *
4344 ((int) (quant_matrix[j]))) >> 4;
4345 level = (level - 1) | 1;
4348 if (level < -2048 || level > 2047)
4349 fprintf(stderr, "unquant error %d %d\n", i, level);
4357 static void dct_unquantize_mpeg2_c(MpegEncContext *s,
4358 DCTELEM *block, int n, int qscale)
4360 int i, level, nCoeffs;
4361 const uint16_t *quant_matrix;
4363 if(s->alternate_scan) nCoeffs= 63;
4364 else nCoeffs= s->block_last_index[n];
4368 block[0] = block[0] * s->y_dc_scale;
4370 block[0] = block[0] * s->c_dc_scale;
4371 quant_matrix = s->intra_matrix;
4372 for(i=1;i<=nCoeffs;i++) {
4373 int j= s->intra_scantable.permutated[i];
4378 level = (int)(level * qscale * quant_matrix[j]) >> 3;
4381 level = (int)(level * qscale * quant_matrix[j]) >> 3;
4384 if (level < -2048 || level > 2047)
4385 fprintf(stderr, "unquant error %d %d\n", i, level);
4393 quant_matrix = s->inter_matrix;
4394 for(;i<=nCoeffs;i++) {
4395 int j= s->intra_scantable.permutated[i];
4400 level = (((level << 1) + 1) * qscale *
4401 ((int) (quant_matrix[j]))) >> 4;
4404 level = (((level << 1) + 1) * qscale *
4405 ((int) (quant_matrix[j]))) >> 4;
4408 if (level < -2048 || level > 2047)
4409 fprintf(stderr, "unquant error %d %d\n", i, level);
4420 static void dct_unquantize_h263_c(MpegEncContext *s,
4421 DCTELEM *block, int n, int qscale)
4423 int i, level, qmul, qadd;
4426 assert(s->block_last_index[n]>=0);
4428 qadd = (qscale - 1) | 1;
4434 block[0] = block[0] * s->y_dc_scale;
4436 block[0] = block[0] * s->c_dc_scale;
4440 nCoeffs= 63; //does not allways use zigzag table
4443 nCoeffs= s->inter_scantable.raster_end[ s->block_last_index[n] ];
4446 for(;i<=nCoeffs;i++) {
4450 level = level * qmul - qadd;
4452 level = level * qmul + qadd;
4455 if (level < -2048 || level > 2047)
4456 fprintf(stderr, "unquant error %d %d\n", i, level);
4464 static const AVOption mpeg4_options[] =
4466 AVOPTION_CODEC_INT("bitrate", "desired video bitrate", bit_rate, 4, 240000000, 800000),
4467 AVOPTION_CODEC_INT("ratetol", "number of bits the bitstream is allowed to diverge from the reference"
4468 "the reference can be CBR (for CBR pass1) or VBR (for pass2)",
4469 bit_rate_tolerance, 4, 240000000, 8000),
4470 AVOPTION_CODEC_INT("qmin", "minimum quantizer", qmin, 1, 31, 2),
4471 AVOPTION_CODEC_INT("qmax", "maximum quantizer", qmax, 1, 31, 31),
4472 AVOPTION_CODEC_STRING("rc_eq", "rate control equation",
4473 rc_eq, "tex^qComp,option1,options2", 0),
4474 AVOPTION_CODEC_INT("rc_minrate", "rate control minimum bitrate",
4475 rc_min_rate, 4, 24000000, 0),
4476 AVOPTION_CODEC_INT("rc_maxrate", "rate control maximum bitrate",
4477 rc_max_rate, 4, 24000000, 0),
4478 AVOPTION_CODEC_DOUBLE("rc_buf_aggresivity", "rate control buffer aggresivity",
4479 rc_buffer_aggressivity, 4, 24000000, 0),
4480 AVOPTION_CODEC_DOUBLE("rc_initial_cplx", "initial complexity for pass1 ratecontrol",
4481 rc_initial_cplx, 0., 9999999., 0),
4482 AVOPTION_CODEC_DOUBLE("i_quant_factor", "qscale factor between p and i frames",
4483 i_quant_factor, 0., 0., 0),
4484 AVOPTION_CODEC_DOUBLE("i_quant_offset", "qscale offset between p and i frames",
4485 i_quant_factor, -999999., 999999., 0),
4486 AVOPTION_CODEC_INT("dct_algo", "dct alghorithm",
4487 dct_algo, 0, 5, 0), // fixme - "Auto,FastInt,Int,MMX,MLib,Altivec"
4488 AVOPTION_CODEC_DOUBLE("lumi_masking", "luminance masking",
4489 lumi_masking, 0., 999999., 0),
4490 AVOPTION_CODEC_DOUBLE("temporal_cplx_masking", "temporary complexity masking",
4491 temporal_cplx_masking, 0., 999999., 0),
4492 AVOPTION_CODEC_DOUBLE("spatial_cplx_masking", "spatial complexity masking",
4493 spatial_cplx_masking, 0., 999999., 0),
4494 AVOPTION_CODEC_DOUBLE("p_masking", "p block masking",
4495 p_masking, 0., 999999., 0),
4496 AVOPTION_CODEC_DOUBLE("dark_masking", "darkness masking",
4497 dark_masking, 0., 999999., 0),
4498 AVOPTION_CODEC_INT("idct_algo", "idct alghorithm",
4499 idct_algo, 0, 8, 0), // fixme - "Auto,Int,Simple,SimpleMMX,LibMPEG2MMX,PS2,MLib,ARM,Altivec"
4501 AVOPTION_CODEC_INT("mb_qmin", "minimum MB quantizer",
4503 AVOPTION_CODEC_INT("mb_qmax", "maximum MB quantizer",
4506 AVOPTION_CODEC_INT("me_cmp", "ME compare function",
4507 me_cmp, 0, 24000000, 0),
4508 AVOPTION_CODEC_INT("me_sub_cmp", "subpixel ME compare function",
4509 me_sub_cmp, 0, 24000000, 0),
4512 AVOPTION_CODEC_INT("dia_size", "ME diamond size & shape",
4513 dia_size, 0, 24000000, 0),
4514 AVOPTION_CODEC_INT("last_predictor_count", "amount of previous MV predictors",
4515 last_predictor_count, 0, 24000000, 0),
4517 AVOPTION_CODEC_INT("pre_me", "pre pass for ME",
4518 pre_me, 0, 24000000, 0),
4519 AVOPTION_CODEC_INT("me_pre_cmp", "ME pre pass compare function",
4520 me_pre_cmp, 0, 24000000, 0),
4522 AVOPTION_CODEC_INT("me_range", "maximum ME search range",
4523 me_range, 0, 24000000, 0),
4524 AVOPTION_CODEC_INT("pre_dia_size", "ME pre pass diamod size & shape",
4525 pre_dia_size, 0, 24000000, 0),
4526 AVOPTION_CODEC_INT("me_subpel_quality", "subpel ME quality",
4527 me_subpel_quality, 0, 24000000, 0),
4528 AVOPTION_CODEC_INT("me_range", "maximum ME search range",
4529 me_range, 0, 24000000, 0),
4530 AVOPTION_CODEC_FLAG("psnr", "calculate PSNR of compressed frames",
4531 flags, CODEC_FLAG_PSNR, 0),
4532 AVOPTION_CODEC_RCOVERRIDE("rc_override", "ratecontrol override (=startframe,endframe,qscale,quality_factor)",
4534 AVOPTION_SUB(avoptions_common),
4538 #ifdef CONFIG_ENCODERS
4540 AVCodec mpeg1video_encoder = {
4543 CODEC_ID_MPEG1VIDEO,
4544 sizeof(MpegEncContext),
4552 AVCodec mpeg2video_encoder = {
4555 CODEC_ID_MPEG2VIDEO,
4556 sizeof(MpegEncContext),
4562 AVCodec h263_encoder = {
4566 sizeof(MpegEncContext),
4572 AVCodec h263p_encoder = {
4576 sizeof(MpegEncContext),
4582 AVCodec flv_encoder = {
4586 sizeof(MpegEncContext),
4592 AVCodec rv10_encoder = {
4596 sizeof(MpegEncContext),
4602 AVCodec mpeg4_encoder = {
4606 sizeof(MpegEncContext),
4610 .options = mpeg4_options,
4613 AVCodec msmpeg4v1_encoder = {
4617 sizeof(MpegEncContext),
4621 .options = mpeg4_options,
4624 AVCodec msmpeg4v2_encoder = {
4628 sizeof(MpegEncContext),
4632 .options = mpeg4_options,
4635 AVCodec msmpeg4v3_encoder = {
4639 sizeof(MpegEncContext),
4643 .options = mpeg4_options,
4646 AVCodec wmv1_encoder = {
4650 sizeof(MpegEncContext),
4654 .options = mpeg4_options,
4659 AVCodec mjpeg_encoder = {
4663 sizeof(MpegEncContext),
4669 #endif //CONFIG_ENCODERS