comparison mpegvideo.c @ 1708:dea5b2946999 libavcodec

interlaced motion estimation interlaced mpeg2 encoding P & B frames rate distored interlaced mb decission alternate scantable support 4mv encoding fixes (thats also why the regression tests change) passing height to most dsp functions interlaced mpeg4 encoding (no direct mode MBs yet) various related cleanups disabled old motion estimaton algorithms (log, full, ...) they will either be fixed or removed
author michael
date Tue, 30 Dec 2003 16:07:57 +0000
parents 027545a2fdbe
children f2f8eddf1b13
comparison
equal deleted inserted replaced
1707:027545a2fdbe 1708:dea5b2946999
250 #endif //CONFIG_ENCODERS 250 #endif //CONFIG_ENCODERS
251 251
252 /* load & permutate scantables 252 /* load & permutate scantables
253 note: only wmv uses differnt ones 253 note: only wmv uses differnt ones
254 */ 254 */
255 ff_init_scantable(s->dsp.idct_permutation, &s->inter_scantable , ff_zigzag_direct); 255 if(s->alternate_scan){
256 ff_init_scantable(s->dsp.idct_permutation, &s->intra_scantable , ff_zigzag_direct); 256 ff_init_scantable(s->dsp.idct_permutation, &s->inter_scantable , ff_alternate_vertical_scan);
257 ff_init_scantable(s->dsp.idct_permutation, &s->intra_scantable , ff_alternate_vertical_scan);
258 }else{
259 ff_init_scantable(s->dsp.idct_permutation, &s->inter_scantable , ff_zigzag_direct);
260 ff_init_scantable(s->dsp.idct_permutation, &s->intra_scantable , ff_zigzag_direct);
261 }
257 ff_init_scantable(s->dsp.idct_permutation, &s->intra_h_scantable, ff_alternate_horizontal_scan); 262 ff_init_scantable(s->dsp.idct_permutation, &s->intra_h_scantable, ff_alternate_horizontal_scan);
258 ff_init_scantable(s->dsp.idct_permutation, &s->intra_v_scantable, ff_alternate_vertical_scan); 263 ff_init_scantable(s->dsp.idct_permutation, &s->intra_v_scantable, ff_alternate_vertical_scan);
259 264
260 s->picture_structure= PICT_FRAME; 265 s->picture_structure= PICT_FRAME;
261 266
392 } 397 }
393 398
394 /* init common structure for both encoder and decoder */ 399 /* init common structure for both encoder and decoder */
395 int MPV_common_init(MpegEncContext *s) 400 int MPV_common_init(MpegEncContext *s)
396 { 401 {
397 int y_size, c_size, yc_size, i, mb_array_size, x, y; 402 int y_size, c_size, yc_size, i, mb_array_size, mv_table_size, x, y;
398 403
399 dsputil_init(&s->dsp, s->avctx); 404 dsputil_init(&s->dsp, s->avctx);
400 DCT_common_init(s); 405 DCT_common_init(s);
401 406
402 s->flags= s->avctx->flags; 407 s->flags= s->avctx->flags;
405 s->mb_height = (s->height + 15) / 16; 410 s->mb_height = (s->height + 15) / 16;
406 s->mb_stride = s->mb_width + 1; 411 s->mb_stride = s->mb_width + 1;
407 s->b8_stride = s->mb_width*2 + 1; 412 s->b8_stride = s->mb_width*2 + 1;
408 s->b4_stride = s->mb_width*4 + 1; 413 s->b4_stride = s->mb_width*4 + 1;
409 mb_array_size= s->mb_height * s->mb_stride; 414 mb_array_size= s->mb_height * s->mb_stride;
415 mv_table_size= (s->mb_height+2) * s->mb_stride + 1;
410 416
411 /* set default edge pos, will be overriden in decode_header if needed */ 417 /* set default edge pos, will be overriden in decode_header if needed */
412 s->h_edge_pos= s->mb_width*16; 418 s->h_edge_pos= s->mb_width*16;
413 s->v_edge_pos= s->mb_height*16; 419 s->v_edge_pos= s->mb_height*16;
414 420
456 } 462 }
457 } 463 }
458 s->mb_index2xy[ s->mb_height*s->mb_width ] = (s->mb_height-1)*s->mb_stride + s->mb_width; //FIXME really needed? 464 s->mb_index2xy[ s->mb_height*s->mb_width ] = (s->mb_height-1)*s->mb_stride + s->mb_width; //FIXME really needed?
459 465
460 if (s->encoding) { 466 if (s->encoding) {
461 int mv_table_size= s->mb_stride * (s->mb_height+2) + 1;
462
463 /* Allocate MV tables */ 467 /* Allocate MV tables */
464 CHECKED_ALLOCZ(s->p_mv_table_base , mv_table_size * 2 * sizeof(int16_t)) 468 CHECKED_ALLOCZ(s->p_mv_table_base , mv_table_size * 2 * sizeof(int16_t))
465 CHECKED_ALLOCZ(s->b_forw_mv_table_base , mv_table_size * 2 * sizeof(int16_t)) 469 CHECKED_ALLOCZ(s->b_forw_mv_table_base , mv_table_size * 2 * sizeof(int16_t))
466 CHECKED_ALLOCZ(s->b_back_mv_table_base , mv_table_size * 2 * sizeof(int16_t)) 470 CHECKED_ALLOCZ(s->b_back_mv_table_base , mv_table_size * 2 * sizeof(int16_t))
467 CHECKED_ALLOCZ(s->b_bidir_forw_mv_table_base , mv_table_size * 2 * sizeof(int16_t)) 471 CHECKED_ALLOCZ(s->b_bidir_forw_mv_table_base , mv_table_size * 2 * sizeof(int16_t))
489 CHECKED_ALLOCZ(s->ac_stats, 2*2*(MAX_LEVEL+1)*(MAX_RUN+1)*2*sizeof(int)); 493 CHECKED_ALLOCZ(s->ac_stats, 2*2*(MAX_LEVEL+1)*(MAX_RUN+1)*2*sizeof(int));
490 } 494 }
491 CHECKED_ALLOCZ(s->avctx->stats_out, 256); 495 CHECKED_ALLOCZ(s->avctx->stats_out, 256);
492 496
493 /* Allocate MB type table */ 497 /* Allocate MB type table */
494 CHECKED_ALLOCZ(s->mb_type , mb_array_size * sizeof(uint8_t)) //needed for encoding 498 CHECKED_ALLOCZ(s->mb_type , mb_array_size * sizeof(uint16_t)) //needed for encoding
495 499
496 CHECKED_ALLOCZ(s->lambda_table, mb_array_size * sizeof(int)) 500 CHECKED_ALLOCZ(s->lambda_table, mb_array_size * sizeof(int))
497 501
498 CHECKED_ALLOCZ(s->q_intra_matrix, 64*32 * sizeof(int)) 502 CHECKED_ALLOCZ(s->q_intra_matrix, 64*32 * sizeof(int))
499 CHECKED_ALLOCZ(s->q_inter_matrix, 64*32 * sizeof(int)) 503 CHECKED_ALLOCZ(s->q_inter_matrix, 64*32 * sizeof(int))
511 515
512 CHECKED_ALLOCZ(s->picture, MAX_PICTURE_COUNT * sizeof(Picture)) 516 CHECKED_ALLOCZ(s->picture, MAX_PICTURE_COUNT * sizeof(Picture))
513 517
514 CHECKED_ALLOCZ(s->error_status_table, mb_array_size*sizeof(uint8_t)) 518 CHECKED_ALLOCZ(s->error_status_table, mb_array_size*sizeof(uint8_t))
515 519
516 if(s->codec_id==CODEC_ID_MPEG4){ 520 if(s->codec_id==CODEC_ID_MPEG4 || (s->flags & CODEC_FLAG_INTERLACED_ME)){
517 /* interlaced direct mode decoding tables */ 521 /* interlaced direct mode decoding tables */
518 CHECKED_ALLOCZ(s->field_mv_table, mb_array_size*2*2 * sizeof(int16_t)) 522 for(i=0; i<2; i++){
519 CHECKED_ALLOCZ(s->field_select_table, mb_array_size*2* sizeof(int8_t)) 523 int j, k;
524 for(j=0; j<2; j++){
525 for(k=0; k<2; k++){
526 CHECKED_ALLOCZ(s->b_field_mv_table_base[i][j][k] , mv_table_size * 2 * sizeof(int16_t))
527 s->b_field_mv_table[i][j][k] = s->b_field_mv_table_base[i][j][k] + s->mb_stride + 1;
528 }
529 CHECKED_ALLOCZ(s->b_field_select_table[i][j] , mb_array_size * 2 * sizeof(uint8_t))
530 CHECKED_ALLOCZ(s->p_field_mv_table_base[i][j] , mv_table_size * 2 * sizeof(int16_t))
531 s->p_field_mv_table[i][j] = s->p_field_mv_table_base[i][j] + s->mb_stride + 1;
532 }
533 CHECKED_ALLOCZ(s->p_field_select_table[i] , mb_array_size * 2 * sizeof(uint8_t))
534 }
520 } 535 }
521 if (s->out_format == FMT_H263) { 536 if (s->out_format == FMT_H263) {
522 /* ac values */ 537 /* ac values */
523 CHECKED_ALLOCZ(s->ac_val[0], yc_size * sizeof(int16_t) * 16); 538 CHECKED_ALLOCZ(s->ac_val[0], yc_size * sizeof(int16_t) * 16);
524 s->ac_val[1] = s->ac_val[0] + y_size; 539 s->ac_val[1] = s->ac_val[0] + y_size;
581 //extern int sads; 596 //extern int sads;
582 597
583 /* init common structure for both encoder and decoder */ 598 /* init common structure for both encoder and decoder */
584 void MPV_common_end(MpegEncContext *s) 599 void MPV_common_end(MpegEncContext *s)
585 { 600 {
586 int i; 601 int i, j, k;
587 602
588 av_freep(&s->parse_context.buffer); 603 av_freep(&s->parse_context.buffer);
589 s->parse_context.buffer_size=0; 604 s->parse_context.buffer_size=0;
590 605
591 av_freep(&s->mb_type); 606 av_freep(&s->mb_type);
599 s->b_forw_mv_table= NULL; 614 s->b_forw_mv_table= NULL;
600 s->b_back_mv_table= NULL; 615 s->b_back_mv_table= NULL;
601 s->b_bidir_forw_mv_table= NULL; 616 s->b_bidir_forw_mv_table= NULL;
602 s->b_bidir_back_mv_table= NULL; 617 s->b_bidir_back_mv_table= NULL;
603 s->b_direct_mv_table= NULL; 618 s->b_direct_mv_table= NULL;
619 for(i=0; i<2; i++){
620 for(j=0; j<2; j++){
621 for(k=0; k<2; k++){
622 av_freep(&s->b_field_mv_table_base[i][j][k]);
623 s->b_field_mv_table[i][j][k]=NULL;
624 }
625 av_freep(&s->b_field_select_table[i][j]);
626 av_freep(&s->p_field_mv_table_base[i][j]);
627 s->p_field_mv_table[i][j]=NULL;
628 }
629 av_freep(&s->p_field_select_table[i]);
630 }
604 631
605 av_freep(&s->dc_val[0]); 632 av_freep(&s->dc_val[0]);
606 av_freep(&s->ac_val[0]); 633 av_freep(&s->ac_val[0]);
607 av_freep(&s->coded_block); 634 av_freep(&s->coded_block);
608 av_freep(&s->mbintra_table); 635 av_freep(&s->mbintra_table);
616 av_freep(&s->prev_pict_types); 643 av_freep(&s->prev_pict_types);
617 av_freep(&s->bitstream_buffer); 644 av_freep(&s->bitstream_buffer);
618 av_freep(&s->tex_pb_buffer); 645 av_freep(&s->tex_pb_buffer);
619 av_freep(&s->pb2_buffer); 646 av_freep(&s->pb2_buffer);
620 av_freep(&s->allocated_edge_emu_buffer); s->edge_emu_buffer= NULL; 647 av_freep(&s->allocated_edge_emu_buffer); s->edge_emu_buffer= NULL;
621 av_freep(&s->field_mv_table);
622 av_freep(&s->field_select_table);
623 av_freep(&s->avctx->stats_out); 648 av_freep(&s->avctx->stats_out);
624 av_freep(&s->ac_stats); 649 av_freep(&s->ac_stats);
625 av_freep(&s->error_status_table); 650 av_freep(&s->error_status_table);
626 av_freep(&s->mb_index2xy); 651 av_freep(&s->mb_index2xy);
627 av_freep(&s->lambda_table); 652 av_freep(&s->lambda_table);
690 } 715 }
691 716
692 s->me_method = avctx->me_method; 717 s->me_method = avctx->me_method;
693 718
694 /* Fixed QSCALE */ 719 /* Fixed QSCALE */
695 s->fixed_qscale = (avctx->flags & CODEC_FLAG_QSCALE); 720 s->fixed_qscale = !!(avctx->flags & CODEC_FLAG_QSCALE);
696 721
697 s->adaptive_quant= ( s->avctx->lumi_masking 722 s->adaptive_quant= ( s->avctx->lumi_masking
698 || s->avctx->dark_masking 723 || s->avctx->dark_masking
699 || s->avctx->temporal_cplx_masking 724 || s->avctx->temporal_cplx_masking
700 || s->avctx->spatial_cplx_masking 725 || s->avctx->spatial_cplx_masking
701 || s->avctx->p_masking 726 || s->avctx->p_masking
702 || (s->flags&CODEC_FLAG_QP_RD)) 727 || (s->flags&CODEC_FLAG_QP_RD))
703 && !s->fixed_qscale; 728 && !s->fixed_qscale;
704 729
705 s->obmc= (s->flags & CODEC_FLAG_OBMC); 730 s->obmc= !!(s->flags & CODEC_FLAG_OBMC);
706 s->loop_filter= (s->flags & CODEC_FLAG_LOOP_FILTER); 731 s->loop_filter= !!(s->flags & CODEC_FLAG_LOOP_FILTER);
732 s->alternate_scan= !!(s->flags & CODEC_FLAG_ALT_SCAN);
707 733
708 if((s->flags & CODEC_FLAG_4MV) && s->codec_id != CODEC_ID_MPEG4 734 if((s->flags & CODEC_FLAG_4MV) && s->codec_id != CODEC_ID_MPEG4
709 && s->codec_id != CODEC_ID_H263 && s->codec_id != CODEC_ID_H263P){ 735 && s->codec_id != CODEC_ID_H263 && s->codec_id != CODEC_ID_H263P){
710 av_log(avctx, AV_LOG_ERROR, "4MV not supported by codec\n"); 736 av_log(avctx, AV_LOG_ERROR, "4MV not supported by codec\n");
711 return -1; 737 return -1;
932 return -1; 958 return -1;
933 959
934 if(s->modified_quant) 960 if(s->modified_quant)
935 s->chroma_qscale_table= ff_h263_chroma_qscale_table; 961 s->chroma_qscale_table= ff_h263_chroma_qscale_table;
936 s->progressive_frame= 962 s->progressive_frame=
937 s->progressive_sequence= !(avctx->flags & CODEC_FLAG_INTERLACED_DCT); 963 s->progressive_sequence= !(avctx->flags & (CODEC_FLAG_INTERLACED_DCT|CODEC_FLAG_INTERLACED_ME));
938 964
939 ff_init_me(s); 965 ff_init_me(s);
940 966
941 #ifdef CONFIG_ENCODERS 967 #ifdef CONFIG_ENCODERS
942 #ifdef CONFIG_RISKY 968 #ifdef CONFIG_RISKY
1608 h= s->height&~15; 1634 h= s->height&~15;
1609 1635
1610 for(y=0; y<h; y+=16){ 1636 for(y=0; y<h; y+=16){
1611 for(x=0; x<w; x+=16){ 1637 for(x=0; x<w; x+=16){
1612 int offset= x + y*stride; 1638 int offset= x + y*stride;
1613 int sad = s->dsp.pix_abs16x16(src + offset, ref + offset, stride); 1639 int sad = s->dsp.sad[0](NULL, src + offset, ref + offset, stride, 16);
1614 int mean= (s->dsp.pix_sum(src + offset, stride) + 128)>>8; 1640 int mean= (s->dsp.pix_sum(src + offset, stride) + 128)>>8;
1615 int sae = get_sae(src + offset, mean, stride); 1641 int sae = get_sae(src + offset, mean, stride);
1616 1642
1617 acc+= sae + 500 < sad; 1643 acc+= sae + 500 < sad;
1618 } 1644 }
1904 1930
1905 /* update mpeg1/2 vbv_delay for CBR */ 1931 /* update mpeg1/2 vbv_delay for CBR */
1906 if(s->avctx->rc_max_rate && s->avctx->rc_min_rate == s->avctx->rc_max_rate){ 1932 if(s->avctx->rc_max_rate && s->avctx->rc_min_rate == s->avctx->rc_max_rate){
1907 int vbv_delay; 1933 int vbv_delay;
1908 1934
1909 assert(s->repeat_first_field==0 && s->avctx->repeat_pic==0); 1935 assert(s->repeat_first_field==0);
1910 1936
1911 vbv_delay= lrintf(90000 * s->rc_context.buffer_index / s->avctx->rc_max_rate); 1937 vbv_delay= lrintf(90000 * s->rc_context.buffer_index / s->avctx->rc_max_rate);
1912 assert(vbv_delay < 0xFFFF); 1938 assert(vbv_delay < 0xFFFF);
1913 1939
1914 s->vbv_delay_ptr[0] &= 0xF8; 1940 s->vbv_delay_ptr[0] &= 0xF8;
3298 emu=1; 3324 emu=1;
3299 } 3325 }
3300 3326
3301 if(s->flags&CODEC_FLAG_INTERLACED_DCT){ 3327 if(s->flags&CODEC_FLAG_INTERLACED_DCT){
3302 int progressive_score, interlaced_score; 3328 int progressive_score, interlaced_score;
3303 3329
3304 progressive_score= pix_vcmp16x8(ptr, wrap_y ) + pix_vcmp16x8(ptr + wrap_y*8, wrap_y ); 3330 progressive_score= pix_vcmp16x8(ptr, wrap_y ) + pix_vcmp16x8(ptr + wrap_y*8, wrap_y );
3305 interlaced_score = pix_vcmp16x8(ptr, wrap_y*2) + pix_vcmp16x8(ptr + wrap_y , wrap_y*2); 3331 interlaced_score = pix_vcmp16x8(ptr, wrap_y*2) + pix_vcmp16x8(ptr + wrap_y , wrap_y*2);
3306 3332
3307 if(progressive_score > interlaced_score + 100){ 3333 if(progressive_score > interlaced_score + 100){
3308 s->interlaced_dct=1; 3334 s->interlaced_dct=1;
3415 s->dsp.diff_pixels(s->block[5], ptr_cr, dest_cr, wrap_c); 3441 s->dsp.diff_pixels(s->block[5], ptr_cr, dest_cr, wrap_c);
3416 } 3442 }
3417 /* pre quantization */ 3443 /* pre quantization */
3418 if(s->current_picture.mc_mb_var[s->mb_stride*mb_y+ mb_x]<2*s->qscale*s->qscale){ 3444 if(s->current_picture.mc_mb_var[s->mb_stride*mb_y+ mb_x]<2*s->qscale*s->qscale){
3419 //FIXME optimize 3445 //FIXME optimize
3420 if(s->dsp.pix_abs8x8(ptr_y , dest_y , wrap_y) < 20*s->qscale) skip_dct[0]= 1; 3446 if(s->dsp.sad[1](NULL, ptr_y , dest_y , wrap_y, 8) < 20*s->qscale) skip_dct[0]= 1;
3421 if(s->dsp.pix_abs8x8(ptr_y + 8, dest_y + 8, wrap_y) < 20*s->qscale) skip_dct[1]= 1; 3447 if(s->dsp.sad[1](NULL, ptr_y + 8, dest_y + 8, wrap_y, 8) < 20*s->qscale) skip_dct[1]= 1;
3422 if(s->dsp.pix_abs8x8(ptr_y +dct_offset , dest_y +dct_offset , wrap_y) < 20*s->qscale) skip_dct[2]= 1; 3448 if(s->dsp.sad[1](NULL, ptr_y +dct_offset , dest_y +dct_offset , wrap_y, 8) < 20*s->qscale) skip_dct[2]= 1;
3423 if(s->dsp.pix_abs8x8(ptr_y +dct_offset+ 8, dest_y +dct_offset+ 8, wrap_y) < 20*s->qscale) skip_dct[3]= 1; 3449 if(s->dsp.sad[1](NULL, ptr_y +dct_offset+ 8, dest_y +dct_offset+ 8, wrap_y, 8) < 20*s->qscale) skip_dct[3]= 1;
3424 if(s->dsp.pix_abs8x8(ptr_cb , dest_cb , wrap_c) < 20*s->qscale) skip_dct[4]= 1; 3450 if(s->dsp.sad[1](NULL, ptr_cb , dest_cb , wrap_c, 8) < 20*s->qscale) skip_dct[4]= 1;
3425 if(s->dsp.pix_abs8x8(ptr_cr , dest_cr , wrap_c) < 20*s->qscale) skip_dct[5]= 1; 3451 if(s->dsp.sad[1](NULL, ptr_cr , dest_cr , wrap_c, 8) < 20*s->qscale) skip_dct[5]= 1;
3426 #if 0 3452 #if 0
3427 { 3453 {
3428 static int stat[7]; 3454 static int stat[7];
3429 int num=0; 3455 int num=0;
3430 for(i=0; i<6; i++) 3456 for(i=0; i<6; i++)
3480 if((s->flags&CODEC_FLAG_GRAY) && s->mb_intra){ 3506 if((s->flags&CODEC_FLAG_GRAY) && s->mb_intra){
3481 s->block_last_index[4]= 3507 s->block_last_index[4]=
3482 s->block_last_index[5]= 0; 3508 s->block_last_index[5]= 0;
3483 s->block[4][0]= 3509 s->block[4][0]=
3484 s->block[5][0]= (1024 + s->c_dc_scale/2)/ s->c_dc_scale; 3510 s->block[5][0]= (1024 + s->c_dc_scale/2)/ s->c_dc_scale;
3511 }
3512
3513 //non c quantize code returns incorrect block_last_index FIXME
3514 if(s->alternate_scan && s->dct_quantize != dct_quantize_c){
3515 for(i=0; i<6; i++){
3516 int j;
3517 if(s->block_last_index[i]>0){
3518 for(j=63; j>0; j--){
3519 if(s->block[i][ s->intra_scantable.permutated[j] ]) break;
3520 }
3521 s->block_last_index[i]= j;
3522 }
3523 }
3485 } 3524 }
3486 3525
3487 /* huffman encode */ 3526 /* huffman encode */
3488 switch(s->codec_id){ //FIXME funct ptr could be slightly faster 3527 switch(s->codec_id){ //FIXME funct ptr could be slightly faster
3489 case CODEC_ID_MPEG1VIDEO: 3528 case CODEC_ID_MPEG1VIDEO:
3722 uint32_t *sq = squareTbl + 256; 3761 uint32_t *sq = squareTbl + 256;
3723 int acc=0; 3762 int acc=0;
3724 int x,y; 3763 int x,y;
3725 3764
3726 if(w==16 && h==16) 3765 if(w==16 && h==16)
3727 return s->dsp.sse[0](NULL, src1, src2, stride); 3766 return s->dsp.sse[0](NULL, src1, src2, stride, 16);
3728 else if(w==8 && h==8) 3767 else if(w==8 && h==8)
3729 return s->dsp.sse[1](NULL, src1, src2, stride); 3768 return s->dsp.sse[1](NULL, src1, src2, stride, 8);
3730 3769
3731 for(y=0; y<h; y++){ 3770 for(y=0; y<h; y++){
3732 for(x=0; x<w; x++){ 3771 for(x=0; x<w; x++){
3733 acc+= sq[src1[x + y*stride] - src2[x + y*stride]]; 3772 acc+= sq[src1[x + y*stride] - src2[x + y*stride]];
3734 } 3773 }
3745 3784
3746 if(s->mb_x*16 + 16 > s->width ) w= s->width - s->mb_x*16; 3785 if(s->mb_x*16 + 16 > s->width ) w= s->width - s->mb_x*16;
3747 if(s->mb_y*16 + 16 > s->height) h= s->height- s->mb_y*16; 3786 if(s->mb_y*16 + 16 > s->height) h= s->height- s->mb_y*16;
3748 3787
3749 if(w==16 && h==16) 3788 if(w==16 && h==16)
3750 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) 3789 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, 16)
3751 +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) 3790 +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, 8)
3752 +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); 3791 +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, 8);
3753 else 3792 else
3754 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) 3793 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)
3755 +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) 3794 +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)
3756 +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); 3795 +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);
3757 } 3796 }
3758 3797
3759 static void encode_picture(MpegEncContext *s, int picture_number) 3798 static void encode_picture(MpegEncContext *s, int picture_number)
3760 { 3799 {
3761 int mb_x, mb_y, pdif = 0; 3800 int mb_x, mb_y, pdif = 0;
3762 int i; 3801 int i, j;
3763 int bits; 3802 int bits;
3764 MpegEncContext best_s, backup_s; 3803 MpegEncContext best_s, backup_s;
3765 uint8_t bit_buf[2][3000]; 3804 uint8_t bit_buf[2][3000];
3766 uint8_t bit_buf2[2][3000]; 3805 uint8_t bit_buf2[2][3000];
3767 uint8_t bit_buf_tex[2][3000]; 3806 uint8_t bit_buf_tex[2][3000];
3841 }else /* if(s->pict_type == I_TYPE) */{ 3880 }else /* if(s->pict_type == I_TYPE) */{
3842 /* I-Frame */ 3881 /* I-Frame */
3843 //FIXME do we need to zero them? 3882 //FIXME do we need to zero them?
3844 memset(s->current_picture.motion_val[0][0], 0, sizeof(int16_t)*(s->mb_width*2 + 2)*(s->mb_height*2 + 2)*2); 3883 memset(s->current_picture.motion_val[0][0], 0, sizeof(int16_t)*(s->mb_width*2 + 2)*(s->mb_height*2 + 2)*2);
3845 memset(s->p_mv_table , 0, sizeof(int16_t)*(s->mb_stride)*s->mb_height*2); 3884 memset(s->p_mv_table , 0, sizeof(int16_t)*(s->mb_stride)*s->mb_height*2);
3846 memset(s->mb_type , MB_TYPE_INTRA, sizeof(uint8_t)*s->mb_stride*s->mb_height); 3885 for(i=0; i<s->mb_stride*s->mb_height; i++)
3886 s->mb_type[i]= CANDIDATE_MB_TYPE_INTRA;
3847 3887
3848 if(!s->fixed_qscale){ 3888 if(!s->fixed_qscale){
3849 /* finding spatial complexity for I-frame rate control */ 3889 /* finding spatial complexity for I-frame rate control */
3850 for(mb_y=0; mb_y < s->mb_height; mb_y++) { 3890 for(mb_y=0; mb_y < s->mb_height; mb_y++) {
3851 for(mb_x=0; mb_x < s->mb_width; mb_x++) { 3891 for(mb_x=0; mb_x < s->mb_width; mb_x++) {
3866 } 3906 }
3867 emms_c(); 3907 emms_c();
3868 3908
3869 if(s->scene_change_score > s->avctx->scenechange_threshold && s->pict_type == P_TYPE){ 3909 if(s->scene_change_score > s->avctx->scenechange_threshold && s->pict_type == P_TYPE){
3870 s->pict_type= I_TYPE; 3910 s->pict_type= I_TYPE;
3871 memset(s->mb_type , MB_TYPE_INTRA, sizeof(uint8_t)*s->mb_stride*s->mb_height); 3911 for(i=0; i<s->mb_stride*s->mb_height; i++)
3912 s->mb_type[i]= CANDIDATE_MB_TYPE_INTRA;
3872 //printf("Scene change detected, encoding as I Frame %d %d\n", s->current_picture.mb_var_sum, s->current_picture.mc_mb_var_sum); 3913 //printf("Scene change detected, encoding as I Frame %d %d\n", s->current_picture.mb_var_sum, s->current_picture.mc_mb_var_sum);
3873 } 3914 }
3874 3915
3875 if(!s->umvplus){ 3916 if(!s->umvplus){
3876 if(s->pict_type==P_TYPE || s->pict_type==S_TYPE) { 3917 if(s->pict_type==P_TYPE || s->pict_type==S_TYPE) {
3877 s->f_code= ff_get_best_fcode(s, s->p_mv_table, MB_TYPE_INTER); 3918 s->f_code= ff_get_best_fcode(s, s->p_mv_table, CANDIDATE_MB_TYPE_INTER);
3878 3919
3920 if(s->flags & CODEC_FLAG_INTERLACED_ME){
3921 int a,b;
3922 a= ff_get_best_fcode(s, s->p_field_mv_table[0][0], CANDIDATE_MB_TYPE_INTER_I); //FIXME field_select
3923 b= ff_get_best_fcode(s, s->p_field_mv_table[1][1], CANDIDATE_MB_TYPE_INTER_I);
3924 s->f_code= FFMAX(s->f_code, FFMAX(a,b));
3925 }
3926
3879 ff_fix_long_p_mvs(s); 3927 ff_fix_long_p_mvs(s);
3928 ff_fix_long_mvs(s, NULL, 0, s->p_mv_table, s->f_code, CANDIDATE_MB_TYPE_INTER, 0);
3929 if(s->flags & CODEC_FLAG_INTERLACED_ME){
3930 for(i=0; i<2; i++){
3931 for(j=0; j<2; j++)
3932 ff_fix_long_mvs(s, s->p_field_select_table[i], j,
3933 s->p_field_mv_table[i][j], s->f_code, CANDIDATE_MB_TYPE_INTER_I, 0);
3934 }
3935 }
3880 } 3936 }
3881 3937
3882 if(s->pict_type==B_TYPE){ 3938 if(s->pict_type==B_TYPE){
3883 int a, b; 3939 int a, b;
3884 3940
3885 a = ff_get_best_fcode(s, s->b_forw_mv_table, MB_TYPE_FORWARD); 3941 a = ff_get_best_fcode(s, s->b_forw_mv_table, CANDIDATE_MB_TYPE_FORWARD);
3886 b = ff_get_best_fcode(s, s->b_bidir_forw_mv_table, MB_TYPE_BIDIR); 3942 b = ff_get_best_fcode(s, s->b_bidir_forw_mv_table, CANDIDATE_MB_TYPE_BIDIR);
3887 s->f_code = FFMAX(a, b); 3943 s->f_code = FFMAX(a, b);
3888 3944
3889 a = ff_get_best_fcode(s, s->b_back_mv_table, MB_TYPE_BACKWARD); 3945 a = ff_get_best_fcode(s, s->b_back_mv_table, CANDIDATE_MB_TYPE_BACKWARD);
3890 b = ff_get_best_fcode(s, s->b_bidir_back_mv_table, MB_TYPE_BIDIR); 3946 b = ff_get_best_fcode(s, s->b_bidir_back_mv_table, CANDIDATE_MB_TYPE_BIDIR);
3891 s->b_code = FFMAX(a, b); 3947 s->b_code = FFMAX(a, b);
3892 3948
3893 ff_fix_long_b_mvs(s, s->b_forw_mv_table, s->f_code, MB_TYPE_FORWARD); 3949 ff_fix_long_mvs(s, NULL, 0, s->b_forw_mv_table, s->f_code, CANDIDATE_MB_TYPE_FORWARD, 1);
3894 ff_fix_long_b_mvs(s, s->b_back_mv_table, s->b_code, MB_TYPE_BACKWARD); 3950 ff_fix_long_mvs(s, NULL, 0, s->b_back_mv_table, s->b_code, CANDIDATE_MB_TYPE_BACKWARD, 1);
3895 ff_fix_long_b_mvs(s, s->b_bidir_forw_mv_table, s->f_code, MB_TYPE_BIDIR); 3951 ff_fix_long_mvs(s, NULL, 0, s->b_bidir_forw_mv_table, s->f_code, CANDIDATE_MB_TYPE_BIDIR, 1);
3896 ff_fix_long_b_mvs(s, s->b_bidir_back_mv_table, s->b_code, MB_TYPE_BIDIR); 3952 ff_fix_long_mvs(s, NULL, 0, s->b_bidir_back_mv_table, s->b_code, CANDIDATE_MB_TYPE_BIDIR, 1);
3953 if(s->flags & CODEC_FLAG_INTERLACED_ME){
3954 int dir;
3955 for(dir=0; dir<2; dir++){
3956 for(i=0; i<2; i++){
3957 for(j=0; j<2; j++){
3958 int type= dir ? (CANDIDATE_MB_TYPE_BACKWARD_I|CANDIDATE_MB_TYPE_BIDIR_I)
3959 : (CANDIDATE_MB_TYPE_FORWARD_I |CANDIDATE_MB_TYPE_BIDIR_I);
3960 ff_fix_long_mvs(s, s->b_field_select_table[dir][i], j,
3961 s->b_field_mv_table[dir][i][j], dir ? s->b_code : s->f_code, type, 1);
3962 }
3963 }
3964 }
3965 }
3897 } 3966 }
3898 } 3967 }
3899 3968
3900 if (!s->fixed_qscale) 3969 if (!s->fixed_qscale)
3901 s->current_picture.quality = ff_rate_estimate_qscale(s); 3970 s->current_picture.quality = ff_rate_estimate_qscale(s);
3988 s->last_dc[i] = 128; 4057 s->last_dc[i] = 128;
3989 4058
3990 s->current_picture_ptr->error[i] = 0; 4059 s->current_picture_ptr->error[i] = 0;
3991 } 4060 }
3992 s->mb_skip_run = 0; 4061 s->mb_skip_run = 0;
3993 s->last_mv[0][0][0] = 0; 4062 memset(s->last_mv, 0, sizeof(s->last_mv));
3994 s->last_mv[0][0][1] = 0;
3995 s->last_mv[1][0][0] = 0;
3996 s->last_mv[1][0][1] = 0;
3997 4063
3998 s->last_mv_dir = 0; 4064 s->last_mv_dir = 0;
3999 4065
4000 #ifdef CONFIG_RISKY 4066 #ifdef CONFIG_RISKY
4001 switch(s->codec_id){ 4067 switch(s->codec_id){
4025 for(mb_x=0; mb_x < s->mb_width; mb_x++) { 4091 for(mb_x=0; mb_x < s->mb_width; mb_x++) {
4026 const int xy= mb_y*s->mb_stride + mb_x; 4092 const int xy= mb_y*s->mb_stride + mb_x;
4027 int mb_type= s->mb_type[xy]; 4093 int mb_type= s->mb_type[xy];
4028 // int d; 4094 // int d;
4029 int dmin= INT_MAX; 4095 int dmin= INT_MAX;
4096 int dir;
4030 4097
4031 s->mb_x = mb_x; 4098 s->mb_x = mb_x;
4032 ff_update_block_index(s); 4099 ff_update_block_index(s);
4033 4100
4034 /* write gob / video packet header */ 4101 /* write gob / video packet header */
4132 if(s->data_partitioning){ 4199 if(s->data_partitioning){
4133 backup_s.pb2= s->pb2; 4200 backup_s.pb2= s->pb2;
4134 backup_s.tex_pb= s->tex_pb; 4201 backup_s.tex_pb= s->tex_pb;
4135 } 4202 }
4136 4203
4137 if(mb_type&MB_TYPE_INTER){ 4204 if(mb_type&CANDIDATE_MB_TYPE_INTER){
4138 s->mv_dir = MV_DIR_FORWARD; 4205 s->mv_dir = MV_DIR_FORWARD;
4139 s->mv_type = MV_TYPE_16X16; 4206 s->mv_type = MV_TYPE_16X16;
4140 s->mb_intra= 0; 4207 s->mb_intra= 0;
4141 s->mv[0][0][0] = s->p_mv_table[xy][0]; 4208 s->mv[0][0][0] = s->p_mv_table[xy][0];
4142 s->mv[0][0][1] = s->p_mv_table[xy][1]; 4209 s->mv[0][0][1] = s->p_mv_table[xy][1];
4143 encode_mb_hq(s, &backup_s, &best_s, MB_TYPE_INTER, pb, pb2, tex_pb, 4210 encode_mb_hq(s, &backup_s, &best_s, CANDIDATE_MB_TYPE_INTER, pb, pb2, tex_pb,
4144 &dmin, &next_block, s->mv[0][0][0], s->mv[0][0][1]); 4211 &dmin, &next_block, s->mv[0][0][0], s->mv[0][0][1]);
4145 } 4212 }
4146 if(mb_type&MB_TYPE_SKIPED){ 4213 if(mb_type&CANDIDATE_MB_TYPE_INTER_I){
4214 s->mv_dir = MV_DIR_FORWARD;
4215 s->mv_type = MV_TYPE_FIELD;
4216 s->mb_intra= 0;
4217 for(i=0; i<2; i++){
4218 j= s->field_select[0][i] = s->p_field_select_table[i][xy];
4219 s->mv[0][i][0] = s->p_field_mv_table[i][j][xy][0];
4220 s->mv[0][i][1] = s->p_field_mv_table[i][j][xy][1];
4221 }
4222 encode_mb_hq(s, &backup_s, &best_s, CANDIDATE_MB_TYPE_INTER_I, pb, pb2, tex_pb,
4223 &dmin, &next_block, 0, 0);
4224 }
4225 if(mb_type&CANDIDATE_MB_TYPE_SKIPED){
4147 s->mv_dir = MV_DIR_FORWARD; 4226 s->mv_dir = MV_DIR_FORWARD;
4148 s->mv_type = MV_TYPE_16X16; 4227 s->mv_type = MV_TYPE_16X16;
4149 s->mb_intra= 0; 4228 s->mb_intra= 0;
4150 s->mv[0][0][0] = 0; 4229 s->mv[0][0][0] = 0;
4151 s->mv[0][0][1] = 0; 4230 s->mv[0][0][1] = 0;
4152 encode_mb_hq(s, &backup_s, &best_s, MB_TYPE_SKIPED, pb, pb2, tex_pb, 4231 encode_mb_hq(s, &backup_s, &best_s, CANDIDATE_MB_TYPE_SKIPED, pb, pb2, tex_pb,
4153 &dmin, &next_block, s->mv[0][0][0], s->mv[0][0][1]); 4232 &dmin, &next_block, s->mv[0][0][0], s->mv[0][0][1]);
4154 } 4233 }
4155 if(mb_type&MB_TYPE_INTER4V){ 4234 if(mb_type&CANDIDATE_MB_TYPE_INTER4V){
4156 s->mv_dir = MV_DIR_FORWARD; 4235 s->mv_dir = MV_DIR_FORWARD;
4157 s->mv_type = MV_TYPE_8X8; 4236 s->mv_type = MV_TYPE_8X8;
4158 s->mb_intra= 0; 4237 s->mb_intra= 0;
4159 for(i=0; i<4; i++){ 4238 for(i=0; i<4; i++){
4160 s->mv[0][i][0] = s->current_picture.motion_val[0][s->block_index[i]][0]; 4239 s->mv[0][i][0] = s->current_picture.motion_val[0][s->block_index[i]][0];
4161 s->mv[0][i][1] = s->current_picture.motion_val[0][s->block_index[i]][1]; 4240 s->mv[0][i][1] = s->current_picture.motion_val[0][s->block_index[i]][1];
4162 } 4241 }
4163 encode_mb_hq(s, &backup_s, &best_s, MB_TYPE_INTER4V, pb, pb2, tex_pb, 4242 encode_mb_hq(s, &backup_s, &best_s, CANDIDATE_MB_TYPE_INTER4V, pb, pb2, tex_pb,
4164 &dmin, &next_block, 0, 0); 4243 &dmin, &next_block, 0, 0);
4165 } 4244 }
4166 if(mb_type&MB_TYPE_FORWARD){ 4245 if(mb_type&CANDIDATE_MB_TYPE_FORWARD){
4167 s->mv_dir = MV_DIR_FORWARD; 4246 s->mv_dir = MV_DIR_FORWARD;
4168 s->mv_type = MV_TYPE_16X16; 4247 s->mv_type = MV_TYPE_16X16;
4169 s->mb_intra= 0; 4248 s->mb_intra= 0;
4170 s->mv[0][0][0] = s->b_forw_mv_table[xy][0]; 4249 s->mv[0][0][0] = s->b_forw_mv_table[xy][0];
4171 s->mv[0][0][1] = s->b_forw_mv_table[xy][1]; 4250 s->mv[0][0][1] = s->b_forw_mv_table[xy][1];
4172 encode_mb_hq(s, &backup_s, &best_s, MB_TYPE_FORWARD, pb, pb2, tex_pb, 4251 encode_mb_hq(s, &backup_s, &best_s, CANDIDATE_MB_TYPE_FORWARD, pb, pb2, tex_pb,
4173 &dmin, &next_block, s->mv[0][0][0], s->mv[0][0][1]); 4252 &dmin, &next_block, s->mv[0][0][0], s->mv[0][0][1]);
4174 } 4253 }
4175 if(mb_type&MB_TYPE_BACKWARD){ 4254 if(mb_type&CANDIDATE_MB_TYPE_BACKWARD){
4176 s->mv_dir = MV_DIR_BACKWARD; 4255 s->mv_dir = MV_DIR_BACKWARD;
4177 s->mv_type = MV_TYPE_16X16; 4256 s->mv_type = MV_TYPE_16X16;
4178 s->mb_intra= 0; 4257 s->mb_intra= 0;
4179 s->mv[1][0][0] = s->b_back_mv_table[xy][0]; 4258 s->mv[1][0][0] = s->b_back_mv_table[xy][0];
4180 s->mv[1][0][1] = s->b_back_mv_table[xy][1]; 4259 s->mv[1][0][1] = s->b_back_mv_table[xy][1];
4181 encode_mb_hq(s, &backup_s, &best_s, MB_TYPE_BACKWARD, pb, pb2, tex_pb, 4260 encode_mb_hq(s, &backup_s, &best_s, CANDIDATE_MB_TYPE_BACKWARD, pb, pb2, tex_pb,
4182 &dmin, &next_block, s->mv[1][0][0], s->mv[1][0][1]); 4261 &dmin, &next_block, s->mv[1][0][0], s->mv[1][0][1]);
4183 } 4262 }
4184 if(mb_type&MB_TYPE_BIDIR){ 4263 if(mb_type&CANDIDATE_MB_TYPE_BIDIR){
4185 s->mv_dir = MV_DIR_FORWARD | MV_DIR_BACKWARD; 4264 s->mv_dir = MV_DIR_FORWARD | MV_DIR_BACKWARD;
4186 s->mv_type = MV_TYPE_16X16; 4265 s->mv_type = MV_TYPE_16X16;
4187 s->mb_intra= 0; 4266 s->mb_intra= 0;
4188 s->mv[0][0][0] = s->b_bidir_forw_mv_table[xy][0]; 4267 s->mv[0][0][0] = s->b_bidir_forw_mv_table[xy][0];
4189 s->mv[0][0][1] = s->b_bidir_forw_mv_table[xy][1]; 4268 s->mv[0][0][1] = s->b_bidir_forw_mv_table[xy][1];
4190 s->mv[1][0][0] = s->b_bidir_back_mv_table[xy][0]; 4269 s->mv[1][0][0] = s->b_bidir_back_mv_table[xy][0];
4191 s->mv[1][0][1] = s->b_bidir_back_mv_table[xy][1]; 4270 s->mv[1][0][1] = s->b_bidir_back_mv_table[xy][1];
4192 encode_mb_hq(s, &backup_s, &best_s, MB_TYPE_BIDIR, pb, pb2, tex_pb, 4271 encode_mb_hq(s, &backup_s, &best_s, CANDIDATE_MB_TYPE_BIDIR, pb, pb2, tex_pb,
4193 &dmin, &next_block, 0, 0); 4272 &dmin, &next_block, 0, 0);
4194 } 4273 }
4195 if(mb_type&MB_TYPE_DIRECT){ 4274 if(mb_type&CANDIDATE_MB_TYPE_DIRECT){
4196 int mx= s->b_direct_mv_table[xy][0]; 4275 int mx= s->b_direct_mv_table[xy][0];
4197 int my= s->b_direct_mv_table[xy][1]; 4276 int my= s->b_direct_mv_table[xy][1];
4198 4277
4199 s->mv_dir = MV_DIR_FORWARD | MV_DIR_BACKWARD | MV_DIRECT; 4278 s->mv_dir = MV_DIR_FORWARD | MV_DIR_BACKWARD | MV_DIRECT;
4200 s->mb_intra= 0; 4279 s->mb_intra= 0;
4201 #ifdef CONFIG_RISKY 4280 #ifdef CONFIG_RISKY
4202 ff_mpeg4_set_direct_mv(s, mx, my); 4281 ff_mpeg4_set_direct_mv(s, mx, my);
4203 #endif 4282 #endif
4204 encode_mb_hq(s, &backup_s, &best_s, MB_TYPE_DIRECT, pb, pb2, tex_pb, 4283 encode_mb_hq(s, &backup_s, &best_s, CANDIDATE_MB_TYPE_DIRECT, pb, pb2, tex_pb,
4205 &dmin, &next_block, mx, my); 4284 &dmin, &next_block, mx, my);
4206 } 4285 }
4207 if(mb_type&MB_TYPE_INTRA){ 4286 if(mb_type&CANDIDATE_MB_TYPE_FORWARD_I){
4287 s->mv_dir = MV_DIR_FORWARD;
4288 s->mv_type = MV_TYPE_FIELD;
4289 s->mb_intra= 0;
4290 for(i=0; i<2; i++){
4291 j= s->field_select[0][i] = s->b_field_select_table[0][i][xy];
4292 s->mv[0][i][0] = s->b_field_mv_table[0][i][j][xy][0];
4293 s->mv[0][i][1] = s->b_field_mv_table[0][i][j][xy][1];
4294 }
4295 encode_mb_hq(s, &backup_s, &best_s, CANDIDATE_MB_TYPE_FORWARD_I, pb, pb2, tex_pb,
4296 &dmin, &next_block, 0, 0);
4297 }
4298 if(mb_type&CANDIDATE_MB_TYPE_BACKWARD_I){
4299 s->mv_dir = MV_DIR_BACKWARD;
4300 s->mv_type = MV_TYPE_FIELD;
4301 s->mb_intra= 0;
4302 for(i=0; i<2; i++){
4303 j= s->field_select[1][i] = s->b_field_select_table[1][i][xy];
4304 s->mv[1][i][0] = s->b_field_mv_table[1][i][j][xy][0];
4305 s->mv[1][i][1] = s->b_field_mv_table[1][i][j][xy][1];
4306 }
4307 encode_mb_hq(s, &backup_s, &best_s, CANDIDATE_MB_TYPE_BACKWARD_I, pb, pb2, tex_pb,
4308 &dmin, &next_block, 0, 0);
4309 }
4310 if(mb_type&CANDIDATE_MB_TYPE_BIDIR_I){
4311 s->mv_dir = MV_DIR_FORWARD | MV_DIR_BACKWARD;
4312 s->mv_type = MV_TYPE_FIELD;
4313 s->mb_intra= 0;
4314 for(dir=0; dir<2; dir++){
4315 for(i=0; i<2; i++){
4316 j= s->field_select[dir][i] = s->b_field_select_table[dir][i][xy];
4317 s->mv[dir][i][0] = s->b_field_mv_table[dir][i][j][xy][0];
4318 s->mv[dir][i][1] = s->b_field_mv_table[dir][i][j][xy][1];
4319 }
4320 }
4321 encode_mb_hq(s, &backup_s, &best_s, CANDIDATE_MB_TYPE_BIDIR_I, pb, pb2, tex_pb,
4322 &dmin, &next_block, 0, 0);
4323 }
4324 if(mb_type&CANDIDATE_MB_TYPE_INTRA){
4208 s->mv_dir = 0; 4325 s->mv_dir = 0;
4209 s->mv_type = MV_TYPE_16X16; 4326 s->mv_type = MV_TYPE_16X16;
4210 s->mb_intra= 1; 4327 s->mb_intra= 1;
4211 s->mv[0][0][0] = 0; 4328 s->mv[0][0][0] = 0;
4212 s->mv[0][0][1] = 0; 4329 s->mv[0][0][1] = 0;
4213 encode_mb_hq(s, &backup_s, &best_s, MB_TYPE_INTRA, pb, pb2, tex_pb, 4330 encode_mb_hq(s, &backup_s, &best_s, CANDIDATE_MB_TYPE_INTRA, pb, pb2, tex_pb,
4214 &dmin, &next_block, 0, 0); 4331 &dmin, &next_block, 0, 0);
4215 if(s->h263_pred || s->h263_aic){ 4332 if(s->h263_pred || s->h263_aic){
4216 if(best_s.mb_intra) 4333 if(best_s.mb_intra)
4217 s->mbintra_table[mb_x + mb_y*s->mb_stride]=1; 4334 s->mbintra_table[mb_x + mb_y*s->mb_stride]=1;
4218 else 4335 else
4250 dc[i]= s->dc_val[0][ s->block_index[i] ]; 4367 dc[i]= s->dc_val[0][ s->block_index[i] ];
4251 memcpy(ac[i], s->ac_val[0][s->block_index[i]], sizeof(DCTELEM)*16); 4368 memcpy(ac[i], s->ac_val[0][s->block_index[i]], sizeof(DCTELEM)*16);
4252 } 4369 }
4253 } 4370 }
4254 4371
4255 encode_mb_hq(s, &backup_s, &best_s, MB_TYPE_INTER /* wrong but unused */, pb, pb2, tex_pb, 4372 encode_mb_hq(s, &backup_s, &best_s, CANDIDATE_MB_TYPE_INTER /* wrong but unused */, pb, pb2, tex_pb,
4256 &dmin, &next_block, s->mv[mvdir][0][0], s->mv[mvdir][0][1]); 4373 &dmin, &next_block, s->mv[mvdir][0][0], s->mv[mvdir][0][1]);
4257 if(best_s.qscale != qp){ 4374 if(best_s.qscale != qp){
4258 if(s->mb_intra){ 4375 if(s->mb_intra){
4259 for(i=0; i<6; i++){ 4376 for(i=0; i<6; i++){
4260 s->dc_val[0][ s->block_index[i] ]= dc[i]; 4377 s->dc_val[0][ s->block_index[i] ]= dc[i];
4310 int motion_x, motion_y; 4427 int motion_x, motion_y;
4311 s->mv_type=MV_TYPE_16X16; 4428 s->mv_type=MV_TYPE_16X16;
4312 // only one MB-Type possible 4429 // only one MB-Type possible
4313 4430
4314 switch(mb_type){ 4431 switch(mb_type){
4315 case MB_TYPE_INTRA: 4432 case CANDIDATE_MB_TYPE_INTRA:
4316 s->mv_dir = 0; 4433 s->mv_dir = 0;
4317 s->mb_intra= 1; 4434 s->mb_intra= 1;
4318 motion_x= s->mv[0][0][0] = 0; 4435 motion_x= s->mv[0][0][0] = 0;
4319 motion_y= s->mv[0][0][1] = 0; 4436 motion_y= s->mv[0][0][1] = 0;
4320 break; 4437 break;
4321 case MB_TYPE_INTER: 4438 case CANDIDATE_MB_TYPE_INTER:
4322 s->mv_dir = MV_DIR_FORWARD; 4439 s->mv_dir = MV_DIR_FORWARD;
4323 s->mb_intra= 0; 4440 s->mb_intra= 0;
4324 motion_x= s->mv[0][0][0] = s->p_mv_table[xy][0]; 4441 motion_x= s->mv[0][0][0] = s->p_mv_table[xy][0];
4325 motion_y= s->mv[0][0][1] = s->p_mv_table[xy][1]; 4442 motion_y= s->mv[0][0][1] = s->p_mv_table[xy][1];
4326 break; 4443 break;
4327 case MB_TYPE_INTER4V: 4444 case CANDIDATE_MB_TYPE_INTER_I:
4445 s->mv_dir = MV_DIR_FORWARD;
4446 s->mv_type = MV_TYPE_FIELD;
4447 s->mb_intra= 0;
4448 for(i=0; i<2; i++){
4449 j= s->field_select[0][i] = s->p_field_select_table[i][xy];
4450 s->mv[0][i][0] = s->p_field_mv_table[i][j][xy][0];
4451 s->mv[0][i][1] = s->p_field_mv_table[i][j][xy][1];
4452 }
4453 motion_x = motion_y = 0;
4454 break;
4455 case CANDIDATE_MB_TYPE_INTER4V:
4328 s->mv_dir = MV_DIR_FORWARD; 4456 s->mv_dir = MV_DIR_FORWARD;
4329 s->mv_type = MV_TYPE_8X8; 4457 s->mv_type = MV_TYPE_8X8;
4330 s->mb_intra= 0; 4458 s->mb_intra= 0;
4331 for(i=0; i<4; i++){ 4459 for(i=0; i<4; i++){
4332 s->mv[0][i][0] = s->current_picture.motion_val[0][s->block_index[i]][0]; 4460 s->mv[0][i][0] = s->current_picture.motion_val[0][s->block_index[i]][0];
4333 s->mv[0][i][1] = s->current_picture.motion_val[0][s->block_index[i]][1]; 4461 s->mv[0][i][1] = s->current_picture.motion_val[0][s->block_index[i]][1];
4334 } 4462 }
4335 motion_x= motion_y= 0; 4463 motion_x= motion_y= 0;
4336 break; 4464 break;
4337 case MB_TYPE_DIRECT: 4465 case CANDIDATE_MB_TYPE_DIRECT:
4338 s->mv_dir = MV_DIR_FORWARD | MV_DIR_BACKWARD | MV_DIRECT; 4466 s->mv_dir = MV_DIR_FORWARD | MV_DIR_BACKWARD | MV_DIRECT;
4339 s->mb_intra= 0; 4467 s->mb_intra= 0;
4340 motion_x=s->b_direct_mv_table[xy][0]; 4468 motion_x=s->b_direct_mv_table[xy][0];
4341 motion_y=s->b_direct_mv_table[xy][1]; 4469 motion_y=s->b_direct_mv_table[xy][1];
4342 #ifdef CONFIG_RISKY 4470 #ifdef CONFIG_RISKY
4343 ff_mpeg4_set_direct_mv(s, motion_x, motion_y); 4471 ff_mpeg4_set_direct_mv(s, motion_x, motion_y);
4344 #endif 4472 #endif
4345 break; 4473 break;
4346 case MB_TYPE_BIDIR: 4474 case CANDIDATE_MB_TYPE_BIDIR:
4347 s->mv_dir = MV_DIR_FORWARD | MV_DIR_BACKWARD; 4475 s->mv_dir = MV_DIR_FORWARD | MV_DIR_BACKWARD;
4348 s->mb_intra= 0; 4476 s->mb_intra= 0;
4349 motion_x=0; 4477 motion_x=0;
4350 motion_y=0; 4478 motion_y=0;
4351 s->mv[0][0][0] = s->b_bidir_forw_mv_table[xy][0]; 4479 s->mv[0][0][0] = s->b_bidir_forw_mv_table[xy][0];
4352 s->mv[0][0][1] = s->b_bidir_forw_mv_table[xy][1]; 4480 s->mv[0][0][1] = s->b_bidir_forw_mv_table[xy][1];
4353 s->mv[1][0][0] = s->b_bidir_back_mv_table[xy][0]; 4481 s->mv[1][0][0] = s->b_bidir_back_mv_table[xy][0];
4354 s->mv[1][0][1] = s->b_bidir_back_mv_table[xy][1]; 4482 s->mv[1][0][1] = s->b_bidir_back_mv_table[xy][1];
4355 break; 4483 break;
4356 case MB_TYPE_BACKWARD: 4484 case CANDIDATE_MB_TYPE_BACKWARD:
4357 s->mv_dir = MV_DIR_BACKWARD; 4485 s->mv_dir = MV_DIR_BACKWARD;
4358 s->mb_intra= 0; 4486 s->mb_intra= 0;
4359 motion_x= s->mv[1][0][0] = s->b_back_mv_table[xy][0]; 4487 motion_x= s->mv[1][0][0] = s->b_back_mv_table[xy][0];
4360 motion_y= s->mv[1][0][1] = s->b_back_mv_table[xy][1]; 4488 motion_y= s->mv[1][0][1] = s->b_back_mv_table[xy][1];
4361 break; 4489 break;
4362 case MB_TYPE_FORWARD: 4490 case CANDIDATE_MB_TYPE_FORWARD:
4363 s->mv_dir = MV_DIR_FORWARD; 4491 s->mv_dir = MV_DIR_FORWARD;
4364 s->mb_intra= 0; 4492 s->mb_intra= 0;
4365 motion_x= s->mv[0][0][0] = s->b_forw_mv_table[xy][0]; 4493 motion_x= s->mv[0][0][0] = s->b_forw_mv_table[xy][0];
4366 motion_y= s->mv[0][0][1] = s->b_forw_mv_table[xy][1]; 4494 motion_y= s->mv[0][0][1] = s->b_forw_mv_table[xy][1];
4367 // printf(" %d %d ", motion_x, motion_y); 4495 // printf(" %d %d ", motion_x, motion_y);
4496 break;
4497 case CANDIDATE_MB_TYPE_FORWARD_I:
4498 s->mv_dir = MV_DIR_FORWARD;
4499 s->mv_type = MV_TYPE_FIELD;
4500 s->mb_intra= 0;
4501 for(i=0; i<2; i++){
4502 j= s->field_select[0][i] = s->b_field_select_table[0][i][xy];
4503 s->mv[0][i][0] = s->b_field_mv_table[0][i][j][xy][0];
4504 s->mv[0][i][1] = s->b_field_mv_table[0][i][j][xy][1];
4505 }
4506 motion_x=motion_y=0;
4507 break;
4508 case CANDIDATE_MB_TYPE_BACKWARD_I:
4509 s->mv_dir = MV_DIR_BACKWARD;
4510 s->mv_type = MV_TYPE_FIELD;
4511 s->mb_intra= 0;
4512 for(i=0; i<2; i++){
4513 j= s->field_select[1][i] = s->b_field_select_table[1][i][xy];
4514 s->mv[1][i][0] = s->b_field_mv_table[1][i][j][xy][0];
4515 s->mv[1][i][1] = s->b_field_mv_table[1][i][j][xy][1];
4516 }
4517 motion_x=motion_y=0;
4518 break;
4519 case CANDIDATE_MB_TYPE_BIDIR_I:
4520 s->mv_dir = MV_DIR_FORWARD | MV_DIR_BACKWARD;
4521 s->mv_type = MV_TYPE_FIELD;
4522 s->mb_intra= 0;
4523 for(dir=0; dir<2; dir++){
4524 for(i=0; i<2; i++){
4525 j= s->field_select[dir][i] = s->b_field_select_table[dir][i][xy];
4526 s->mv[dir][i][0] = s->b_field_mv_table[dir][i][j][xy][0];
4527 s->mv[dir][i][1] = s->b_field_mv_table[dir][i][j][xy][1];
4528 }
4529 }
4530 motion_x=motion_y=0;
4368 break; 4531 break;
4369 default: 4532 default:
4370 motion_x=motion_y=0; //gcc warning fix 4533 motion_x=motion_y=0; //gcc warning fix
4371 av_log(s->avctx, AV_LOG_ERROR, "illegal MB type\n"); 4534 av_log(s->avctx, AV_LOG_ERROR, "illegal MB type\n");
4372 } 4535 }