comparison mpegvideo.c @ 936:caa77cd960c0 libavcodec

qpel encoding 4mv+b frames encoding finally fixed chroma ME 5 comparission functions for ME b frame encoding speedup wmv2 codec (unfinished) user specified diamond size for EPZS
author michaelni
date Fri, 27 Dec 2002 23:51:46 +0000
parents 6bcb214d6a17
children 463f7260b155
comparison
equal deleted inserted replaced
935:c9bbd35064b6 936:caa77cd960c0
41 DCTELEM *block, int n, int qscale); 41 DCTELEM *block, int n, int qscale);
42 static void draw_edges_c(UINT8 *buf, int wrap, int width, int height, int w); 42 static void draw_edges_c(UINT8 *buf, int wrap, int width, int height, int w);
43 static int dct_quantize_c(MpegEncContext *s, DCTELEM *block, int n, int qscale, int *overflow); 43 static int dct_quantize_c(MpegEncContext *s, DCTELEM *block, int n, int qscale, int *overflow);
44 44
45 void (*draw_edges)(UINT8 *buf, int wrap, int width, int height, int w)= draw_edges_c; 45 void (*draw_edges)(UINT8 *buf, int wrap, int width, int height, int w)= draw_edges_c;
46 static void emulated_edge_mc(MpegEncContext *s, UINT8 *src, int linesize, int block_w, int block_h,
47 int src_x, int src_y, int w, int h);
48 46
49 47
50 /* enable all paranoid tests for rounding, overflows, etc... */ 48 /* enable all paranoid tests for rounding, overflows, etc... */
51 //#define PARANOID 49 //#define PARANOID
52 50
62 22725, 31521, 29692, 26722, 22725, 17855, 12299, 6270, 60 22725, 31521, 29692, 26722, 22725, 17855, 12299, 6270,
63 21407, 29692, 27969, 25172, 21407, 16819, 11585, 5906, 61 21407, 29692, 27969, 25172, 21407, 16819, 11585, 5906,
64 19266, 26722, 25172, 22654, 19266, 15137, 10426, 5315, 62 19266, 26722, 25172, 22654, 19266, 15137, 10426, 5315,
65 16384, 22725, 21407, 19266, 16384, 12873, 8867, 4520, 63 16384, 22725, 21407, 19266, 16384, 12873, 8867, 4520,
66 12873, 17855, 16819, 15137, 12873, 10114, 6967, 3552, 64 12873, 17855, 16819, 15137, 12873, 10114, 6967, 3552,
67 8867, 12299, 11585, 10426, 8867, 6967, 4799, 2446, 65 8867 , 12299, 11585, 10426, 8867, 6967, 4799, 2446,
68 4520, 6270, 5906, 5315, 4520, 3552, 2446, 1247 66 4520 , 6270, 5906, 5315, 4520, 3552, 2446, 1247
69 }; 67 };
70 68
71 /* Input permutation for the simple_idct_mmx */ 69 /* Input permutation for the simple_idct_mmx */
72 static const uint8_t simple_mmx_permutation[64]={ 70 static const uint8_t simple_mmx_permutation[64]={
73 0x00, 0x08, 0x04, 0x09, 0x01, 0x0C, 0x05, 0x0D, 71 0x00, 0x08, 0x04, 0x09, 0x01, 0x0C, 0x05, 0x0D,
84 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 2, 2, 82 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 2, 2,
85 }; 83 };
86 84
87 static UINT16 (*default_mv_penalty)[MAX_MV*2+1]=NULL; 85 static UINT16 (*default_mv_penalty)[MAX_MV*2+1]=NULL;
88 static UINT8 default_fcode_tab[MAX_MV*2+1]; 86 static UINT8 default_fcode_tab[MAX_MV*2+1];
89
90 /* default motion estimation */
91 int motion_estimation_method = ME_EPZS;
92 87
93 static void convert_matrix(MpegEncContext *s, int (*qmat)[64], uint16_t (*qmat16)[64], uint16_t (*qmat16_bias)[64], 88 static void convert_matrix(MpegEncContext *s, int (*qmat)[64], uint16_t (*qmat16)[64], uint16_t (*qmat16_bias)[64],
94 const UINT16 *quant_matrix, int bias, int qmin, int qmax) 89 const UINT16 *quant_matrix, int bias, int qmin, int qmax)
95 { 90 {
96 int qscale; 91 int qscale;
392 CHECKED_ALLOCZ(s->p_mv_table , mv_table_size * 2 * sizeof(INT16)) 387 CHECKED_ALLOCZ(s->p_mv_table , mv_table_size * 2 * sizeof(INT16))
393 CHECKED_ALLOCZ(s->b_forw_mv_table , mv_table_size * 2 * sizeof(INT16)) 388 CHECKED_ALLOCZ(s->b_forw_mv_table , mv_table_size * 2 * sizeof(INT16))
394 CHECKED_ALLOCZ(s->b_back_mv_table , mv_table_size * 2 * sizeof(INT16)) 389 CHECKED_ALLOCZ(s->b_back_mv_table , mv_table_size * 2 * sizeof(INT16))
395 CHECKED_ALLOCZ(s->b_bidir_forw_mv_table , mv_table_size * 2 * sizeof(INT16)) 390 CHECKED_ALLOCZ(s->b_bidir_forw_mv_table , mv_table_size * 2 * sizeof(INT16))
396 CHECKED_ALLOCZ(s->b_bidir_back_mv_table , mv_table_size * 2 * sizeof(INT16)) 391 CHECKED_ALLOCZ(s->b_bidir_back_mv_table , mv_table_size * 2 * sizeof(INT16))
397 CHECKED_ALLOCZ(s->b_direct_forw_mv_table, mv_table_size * 2 * sizeof(INT16))
398 CHECKED_ALLOCZ(s->b_direct_back_mv_table, mv_table_size * 2 * sizeof(INT16))
399 CHECKED_ALLOCZ(s->b_direct_mv_table , mv_table_size * 2 * sizeof(INT16)) 392 CHECKED_ALLOCZ(s->b_direct_mv_table , mv_table_size * 2 * sizeof(INT16))
400 393
401 //FIXME should be linesize instead of s->width*2 but that isnt known before get_buffer() 394 //FIXME should be linesize instead of s->width*2 but that isnt known before get_buffer()
402 CHECKED_ALLOCZ(s->me_scratchpad, s->width*2*16*3*sizeof(uint8_t)) 395 CHECKED_ALLOCZ(s->me.scratchpad, s->width*2*16*3*sizeof(uint8_t))
403 396
404 CHECKED_ALLOCZ(s->me_map , ME_MAP_SIZE*sizeof(uint32_t)) 397 CHECKED_ALLOCZ(s->me.map , ME_MAP_SIZE*sizeof(uint32_t))
405 CHECKED_ALLOCZ(s->me_score_map, ME_MAP_SIZE*sizeof(uint16_t)) 398 CHECKED_ALLOCZ(s->me.score_map, ME_MAP_SIZE*sizeof(uint32_t))
406 399
407 if(s->codec_id==CODEC_ID_MPEG4){ 400 if(s->codec_id==CODEC_ID_MPEG4){
408 CHECKED_ALLOCZ(s->tex_pb_buffer, PB_BUFFER_SIZE); 401 CHECKED_ALLOCZ(s->tex_pb_buffer, PB_BUFFER_SIZE);
409 CHECKED_ALLOCZ( s->pb2_buffer, PB_BUFFER_SIZE); 402 CHECKED_ALLOCZ( s->pb2_buffer, PB_BUFFER_SIZE);
410 } 403 }
496 av_freep(&s->p_mv_table); 489 av_freep(&s->p_mv_table);
497 av_freep(&s->b_forw_mv_table); 490 av_freep(&s->b_forw_mv_table);
498 av_freep(&s->b_back_mv_table); 491 av_freep(&s->b_back_mv_table);
499 av_freep(&s->b_bidir_forw_mv_table); 492 av_freep(&s->b_bidir_forw_mv_table);
500 av_freep(&s->b_bidir_back_mv_table); 493 av_freep(&s->b_bidir_back_mv_table);
501 av_freep(&s->b_direct_forw_mv_table);
502 av_freep(&s->b_direct_back_mv_table);
503 av_freep(&s->b_direct_mv_table); 494 av_freep(&s->b_direct_mv_table);
504 av_freep(&s->motion_val); 495 av_freep(&s->motion_val);
505 av_freep(&s->dc_val[0]); 496 av_freep(&s->dc_val[0]);
506 av_freep(&s->ac_val[0]); 497 av_freep(&s->ac_val[0]);
507 av_freep(&s->coded_block); 498 av_freep(&s->coded_block);
508 av_freep(&s->mbintra_table); 499 av_freep(&s->mbintra_table);
509 av_freep(&s->cbp_table); 500 av_freep(&s->cbp_table);
510 av_freep(&s->pred_dir_table); 501 av_freep(&s->pred_dir_table);
511 av_freep(&s->me_scratchpad); 502 av_freep(&s->me.scratchpad);
512 av_freep(&s->me_map); 503 av_freep(&s->me.map);
513 av_freep(&s->me_score_map); 504 av_freep(&s->me.score_map);
514 505
515 av_freep(&s->mbskip_table); 506 av_freep(&s->mbskip_table);
516 av_freep(&s->bitstream_buffer); 507 av_freep(&s->bitstream_buffer);
517 av_freep(&s->tex_pb_buffer); 508 av_freep(&s->tex_pb_buffer);
518 av_freep(&s->pb2_buffer); 509 av_freep(&s->pb2_buffer);
564 s->codec_id= avctx->codec->id; 555 s->codec_id= avctx->codec->id;
565 s->luma_elim_threshold = avctx->luma_elim_threshold; 556 s->luma_elim_threshold = avctx->luma_elim_threshold;
566 s->chroma_elim_threshold= avctx->chroma_elim_threshold; 557 s->chroma_elim_threshold= avctx->chroma_elim_threshold;
567 s->strict_std_compliance= avctx->strict_std_compliance; 558 s->strict_std_compliance= avctx->strict_std_compliance;
568 s->data_partitioning= avctx->flags & CODEC_FLAG_PART; 559 s->data_partitioning= avctx->flags & CODEC_FLAG_PART;
560 s->quarter_sample= (avctx->flags & CODEC_FLAG_QPEL)!=0;
569 s->mpeg_quant= avctx->mpeg_quant; 561 s->mpeg_quant= avctx->mpeg_quant;
570 562
571 if (s->gop_size <= 1) { 563 if (s->gop_size <= 1) {
572 s->intra_only = 1; 564 s->intra_only = 1;
573 s->gop_size = 12; 565 s->gop_size = 12;
574 } else { 566 } else {
575 s->intra_only = 0; 567 s->intra_only = 0;
576 } 568 }
577 569
578 /* ME algorithm */ 570 s->me_method = avctx->me_method;
579 if (avctx->me_method == 0)
580 /* For compatibility */
581 s->me_method = motion_estimation_method;
582 else
583 s->me_method = avctx->me_method;
584 571
585 /* Fixed QSCALE */ 572 /* Fixed QSCALE */
586 s->fixed_qscale = (avctx->flags & CODEC_FLAG_QSCALE); 573 s->fixed_qscale = (avctx->flags & CODEC_FLAG_QSCALE);
587 574
588 s->adaptive_quant= ( s->avctx->lumi_masking 575 s->adaptive_quant= ( s->avctx->lumi_masking
711 for(i=-16; i<16; i++){ 698 for(i=-16; i<16; i++){
712 default_fcode_tab[i + MAX_MV]= 1; 699 default_fcode_tab[i + MAX_MV]= 1;
713 } 700 }
714 } 701 }
715 } 702 }
716 s->mv_penalty= default_mv_penalty; 703 s->me.mv_penalty= default_mv_penalty;
717 s->fcode_tab= default_fcode_tab; 704 s->fcode_tab= default_fcode_tab;
718 s->y_dc_scale_table= 705 s->y_dc_scale_table=
719 s->c_dc_scale_table= ff_mpeg1_dc_scale_table; 706 s->c_dc_scale_table= ff_mpeg1_dc_scale_table;
720 707
721 /* dont use mv_penalty table for crap MV as it would be confused */ 708 /* dont use mv_penalty table for crap MV as it would be confused */
722 if (s->me_method < ME_EPZS) s->mv_penalty = default_mv_penalty; 709 //FIXME remove after fixing / removing old ME
710 if (s->me_method < ME_EPZS) s->me.mv_penalty = default_mv_penalty;
723 711
724 s->encoding = 1; 712 s->encoding = 1;
725 713
726 /* init */ 714 /* init */
727 if (MPV_common_init(s) < 0) 715 if (MPV_common_init(s) < 0)
728 return -1; 716 return -1;
729 717
718 ff_init_me(s);
719
730 #ifdef CONFIG_ENCODERS 720 #ifdef CONFIG_ENCODERS
731 if (s->out_format == FMT_H263) 721 if (s->out_format == FMT_H263)
732 h263_encode_init(s); 722 h263_encode_init(s);
733 else if (s->out_format == FMT_MPEG1) 723 else if (s->out_format == FMT_MPEG1)
734 ff_mpeg1_encode_init(s); 724 ff_mpeg1_encode_init(s);
944 934
945 /* release non refernce frames */ 935 /* release non refernce frames */
946 for(i=0; i<MAX_PICTURE_COUNT; i++){ 936 for(i=0; i<MAX_PICTURE_COUNT; i++){
947 if(s->picture[i].data[0] && !s->picture[i].reference /*&& s->picture[i].type!=FF_BUFFER_TYPE_SHARED*/) 937 if(s->picture[i].data[0] && !s->picture[i].reference /*&& s->picture[i].type!=FF_BUFFER_TYPE_SHARED*/)
948 s->avctx->release_buffer(s->avctx, (AVFrame*)&s->picture[i]); 938 s->avctx->release_buffer(s->avctx, (AVFrame*)&s->picture[i]);
939 }
940 if(s->avctx->debug&FF_DEBUG_SKIP){
941 int x,y;
942 for(y=0; y<s->mb_height; y++){
943 for(x=0; x<s->mb_width; x++){
944 int count= s->mbskip_table[x + y*s->mb_width];
945 if(count>9) count=9;
946 printf(" %1d", count);
947 }
948 printf("\n");
949 }
950 printf("pict type: %d\n", s->pict_type);
949 } 951 }
950 } 952 }
951 953
952 static int get_sae(uint8_t *src, int ref, int stride){ 954 static int get_sae(uint8_t *src, int ref, int stride){
953 int x,y; 955 int x,y;
1282 1284
1283 dest_y+=dest_offset; 1285 dest_y+=dest_offset;
1284 if(s->flags&CODEC_FLAG_EMU_EDGE){ 1286 if(s->flags&CODEC_FLAG_EMU_EDGE){
1285 if(src_x<0 || src_y<0 || src_x + (motion_x&15) + 16 > s->h_edge_pos 1287 if(src_x<0 || src_y<0 || src_x + (motion_x&15) + 16 > s->h_edge_pos
1286 || src_y + (motion_y&15) + 16 > s->v_edge_pos){ 1288 || src_y + (motion_y&15) + 16 > s->v_edge_pos){
1287 emulated_edge_mc(s, ptr, linesize, 17, 17, src_x, src_y, s->h_edge_pos, s->v_edge_pos); 1289 ff_emulated_edge_mc(s, ptr, linesize, 17, 17, src_x, src_y, s->h_edge_pos, s->v_edge_pos);
1288 ptr= s->edge_emu_buffer; 1290 ptr= s->edge_emu_buffer;
1289 emu=1; 1291 emu=1;
1290 } 1292 }
1291 } 1293 }
1292 1294
1320 motion_y =0; 1322 motion_y =0;
1321 1323
1322 offset = (src_y * uvlinesize) + src_x + (src_offset>>1); 1324 offset = (src_y * uvlinesize) + src_x + (src_offset>>1);
1323 ptr = ref_picture[1] + offset; 1325 ptr = ref_picture[1] + offset;
1324 if(emu){ 1326 if(emu){
1325 emulated_edge_mc(s, ptr, uvlinesize, 9, 9, src_x, src_y, s->h_edge_pos>>1, s->v_edge_pos>>1); 1327 ff_emulated_edge_mc(s, ptr, uvlinesize, 9, 9, src_x, src_y, s->h_edge_pos>>1, s->v_edge_pos>>1);
1326 ptr= s->edge_emu_buffer; 1328 ptr= s->edge_emu_buffer;
1327 } 1329 }
1328 s->dsp.gmc1(dest_cb + (dest_offset>>1), ptr, uvlinesize, 8, motion_x&15, motion_y&15, 128 - s->no_rounding); 1330 s->dsp.gmc1(dest_cb + (dest_offset>>1), ptr, uvlinesize, 8, motion_x&15, motion_y&15, 128 - s->no_rounding);
1329 1331
1330 ptr = ref_picture[2] + offset; 1332 ptr = ref_picture[2] + offset;
1331 if(emu){ 1333 if(emu){
1332 emulated_edge_mc(s, ptr, uvlinesize, 9, 9, src_x, src_y, s->h_edge_pos>>1, s->v_edge_pos>>1); 1334 ff_emulated_edge_mc(s, ptr, uvlinesize, 9, 9, src_x, src_y, s->h_edge_pos>>1, s->v_edge_pos>>1);
1333 ptr= s->edge_emu_buffer; 1335 ptr= s->edge_emu_buffer;
1334 } 1336 }
1335 s->dsp.gmc1(dest_cr + (dest_offset>>1), ptr, uvlinesize, 8, motion_x&15, motion_y&15, 128 - s->no_rounding); 1337 s->dsp.gmc1(dest_cr + (dest_offset>>1), ptr, uvlinesize, 8, motion_x&15, motion_y&15, 128 - s->no_rounding);
1336 1338
1337 return; 1339 return;
1399 a+1, (1<<(2*a+1)) - s->no_rounding, 1401 a+1, (1<<(2*a+1)) - s->no_rounding,
1400 s->h_edge_pos>>1, s->v_edge_pos>>1); 1402 s->h_edge_pos>>1, s->v_edge_pos>>1);
1401 } 1403 }
1402 1404
1403 1405
1404 static void emulated_edge_mc(MpegEncContext *s, UINT8 *src, int linesize, int block_w, int block_h, 1406 void ff_emulated_edge_mc(MpegEncContext *s, UINT8 *src, int linesize, int block_w, int block_h,
1405 int src_x, int src_y, int w, int h){ 1407 int src_x, int src_y, int w, int h){
1406 int x, y; 1408 int x, y;
1407 int start_y, start_x, end_y, end_x; 1409 int start_y, start_x, end_y, end_x;
1408 UINT8 *buf= s->edge_emu_buffer; 1410 UINT8 *buf= s->edge_emu_buffer;
1409 1411
1499 dest_y += dest_offset; 1501 dest_y += dest_offset;
1500 1502
1501 if(s->flags&CODEC_FLAG_EMU_EDGE){ 1503 if(s->flags&CODEC_FLAG_EMU_EDGE){
1502 if(src_x<0 || src_y<0 || src_x + (motion_x&1) + 16 > s->h_edge_pos 1504 if(src_x<0 || src_y<0 || src_x + (motion_x&1) + 16 > s->h_edge_pos
1503 || src_y + (motion_y&1) + h > v_edge_pos){ 1505 || src_y + (motion_y&1) + h > v_edge_pos){
1504 emulated_edge_mc(s, ptr - src_offset, s->linesize, 17, 17+field_based, 1506 ff_emulated_edge_mc(s, ptr - src_offset, s->linesize, 17, 17+field_based,
1505 src_x, src_y<<field_based, s->h_edge_pos, s->v_edge_pos); 1507 src_x, src_y<<field_based, s->h_edge_pos, s->v_edge_pos);
1506 ptr= s->edge_emu_buffer + src_offset; 1508 ptr= s->edge_emu_buffer + src_offset;
1507 emu=1; 1509 emu=1;
1508 } 1510 }
1509 } 1511 }
1536 if (src_y == (height >> 1)) 1538 if (src_y == (height >> 1))
1537 dxy &= ~2; 1539 dxy &= ~2;
1538 offset = (src_y * uvlinesize) + src_x + (src_offset >> 1); 1540 offset = (src_y * uvlinesize) + src_x + (src_offset >> 1);
1539 ptr = ref_picture[1] + offset; 1541 ptr = ref_picture[1] + offset;
1540 if(emu){ 1542 if(emu){
1541 emulated_edge_mc(s, ptr - (src_offset >> 1), s->uvlinesize, 9, 9+field_based, 1543 ff_emulated_edge_mc(s, ptr - (src_offset >> 1), s->uvlinesize, 9, 9+field_based,
1542 src_x, src_y<<field_based, s->h_edge_pos>>1, s->v_edge_pos>>1); 1544 src_x, src_y<<field_based, s->h_edge_pos>>1, s->v_edge_pos>>1);
1543 ptr= s->edge_emu_buffer + (src_offset >> 1); 1545 ptr= s->edge_emu_buffer + (src_offset >> 1);
1544 } 1546 }
1545 pix_op[1][dxy](dest_cb + (dest_offset >> 1), ptr, uvlinesize, h >> 1); 1547 pix_op[1][dxy](dest_cb + (dest_offset >> 1), ptr, uvlinesize, h >> 1);
1546 1548
1547 ptr = ref_picture[2] + offset; 1549 ptr = ref_picture[2] + offset;
1548 if(emu){ 1550 if(emu){
1549 emulated_edge_mc(s, ptr - (src_offset >> 1), s->uvlinesize, 9, 9+field_based, 1551 ff_emulated_edge_mc(s, ptr - (src_offset >> 1), s->uvlinesize, 9, 9+field_based,
1550 src_x, src_y<<field_based, s->h_edge_pos>>1, s->v_edge_pos>>1); 1552 src_x, src_y<<field_based, s->h_edge_pos>>1, s->v_edge_pos>>1);
1551 ptr= s->edge_emu_buffer + (src_offset >> 1); 1553 ptr= s->edge_emu_buffer + (src_offset >> 1);
1552 } 1554 }
1553 pix_op[1][dxy](dest_cr + (dest_offset >> 1), ptr, uvlinesize, h >> 1); 1555 pix_op[1][dxy](dest_cr + (dest_offset >> 1), ptr, uvlinesize, h >> 1);
1554 } 1556 }
1584 //printf("%d %d %d\n", src_x, src_y, dxy); 1586 //printf("%d %d %d\n", src_x, src_y, dxy);
1585 1587
1586 if(s->flags&CODEC_FLAG_EMU_EDGE){ 1588 if(s->flags&CODEC_FLAG_EMU_EDGE){
1587 if(src_x<0 || src_y<0 || src_x + (motion_x&3) + 16 > s->h_edge_pos 1589 if(src_x<0 || src_y<0 || src_x + (motion_x&3) + 16 > s->h_edge_pos
1588 || src_y + (motion_y&3) + h > v_edge_pos){ 1590 || src_y + (motion_y&3) + h > v_edge_pos){
1589 emulated_edge_mc(s, ptr - src_offset, s->linesize, 17, 17+field_based, 1591 ff_emulated_edge_mc(s, ptr - src_offset, s->linesize, 17, 17+field_based,
1590 src_x, src_y<<field_based, s->h_edge_pos, s->v_edge_pos); 1592 src_x, src_y<<field_based, s->h_edge_pos, s->v_edge_pos);
1591 ptr= s->edge_emu_buffer + src_offset; 1593 ptr= s->edge_emu_buffer + src_offset;
1592 emu=1; 1594 emu=1;
1593 } 1595 }
1594 } 1596 }
1629 dxy &= ~2; 1631 dxy &= ~2;
1630 1632
1631 offset = (src_y * uvlinesize) + src_x + (src_offset >> 1); 1633 offset = (src_y * uvlinesize) + src_x + (src_offset >> 1);
1632 ptr = ref_picture[1] + offset; 1634 ptr = ref_picture[1] + offset;
1633 if(emu){ 1635 if(emu){
1634 emulated_edge_mc(s, ptr - (src_offset >> 1), s->uvlinesize, 9, 9 + field_based, 1636 ff_emulated_edge_mc(s, ptr - (src_offset >> 1), s->uvlinesize, 9, 9 + field_based,
1635 src_x, src_y<<field_based, s->h_edge_pos>>1, s->v_edge_pos>>1); 1637 src_x, src_y<<field_based, s->h_edge_pos>>1, s->v_edge_pos>>1);
1636 ptr= s->edge_emu_buffer + (src_offset >> 1); 1638 ptr= s->edge_emu_buffer + (src_offset >> 1);
1637 } 1639 }
1638 pix_op[1][dxy](dest_cb + (dest_offset >> 1), ptr, uvlinesize, h >> 1); 1640 pix_op[1][dxy](dest_cb + (dest_offset >> 1), ptr, uvlinesize, h >> 1);
1639 1641
1640 ptr = ref_picture[2] + offset; 1642 ptr = ref_picture[2] + offset;
1641 if(emu){ 1643 if(emu){
1642 emulated_edge_mc(s, ptr - (src_offset >> 1), s->uvlinesize, 9, 9 + field_based, 1644 ff_emulated_edge_mc(s, ptr - (src_offset >> 1), s->uvlinesize, 9, 9 + field_based,
1643 src_x, src_y<<field_based, s->h_edge_pos>>1, s->v_edge_pos>>1); 1645 src_x, src_y<<field_based, s->h_edge_pos>>1, s->v_edge_pos>>1);
1644 ptr= s->edge_emu_buffer + (src_offset >> 1); 1646 ptr= s->edge_emu_buffer + (src_offset >> 1);
1645 } 1647 }
1646 pix_op[1][dxy](dest_cr + (dest_offset >> 1), ptr, uvlinesize, h >> 1); 1648 pix_op[1][dxy](dest_cr + (dest_offset >> 1), ptr, uvlinesize, h >> 1);
1647 } 1649 }
1672 } 1674 }
1673 }else if(s->quarter_sample){ 1675 }else if(s->quarter_sample){
1674 qpel_motion(s, dest_y, dest_cb, dest_cr, 0, 1676 qpel_motion(s, dest_y, dest_cb, dest_cr, 0,
1675 ref_picture, 0, 1677 ref_picture, 0,
1676 0, pix_op, qpix_op, 1678 0, pix_op, qpix_op,
1679 s->mv[dir][0][0], s->mv[dir][0][1], 16);
1680 }else if(s->mspel){
1681 ff_mspel_motion(s, dest_y, dest_cb, dest_cr,
1682 ref_picture, pix_op,
1677 s->mv[dir][0][0], s->mv[dir][0][1], 16); 1683 s->mv[dir][0][0], s->mv[dir][0][1], 16);
1678 }else{ 1684 }else{
1679 mpeg_motion(s, dest_y, dest_cb, dest_cr, 0, 1685 mpeg_motion(s, dest_y, dest_cb, dest_cr, 0,
1680 ref_picture, 0, 1686 ref_picture, 0,
1681 0, pix_op, 1687 0, pix_op,
1704 1710
1705 ptr = ref_picture[0] + (src_y * s->linesize) + (src_x); 1711 ptr = ref_picture[0] + (src_y * s->linesize) + (src_x);
1706 if(s->flags&CODEC_FLAG_EMU_EDGE){ 1712 if(s->flags&CODEC_FLAG_EMU_EDGE){
1707 if(src_x<0 || src_y<0 || src_x + (motion_x&3) + 8 > s->h_edge_pos 1713 if(src_x<0 || src_y<0 || src_x + (motion_x&3) + 8 > s->h_edge_pos
1708 || src_y + (motion_y&3) + 8 > s->v_edge_pos){ 1714 || src_y + (motion_y&3) + 8 > s->v_edge_pos){
1709 emulated_edge_mc(s, ptr, s->linesize, 9, 9, src_x, src_y, s->h_edge_pos, s->v_edge_pos); 1715 ff_emulated_edge_mc(s, ptr, s->linesize, 9, 9, src_x, src_y, s->h_edge_pos, s->v_edge_pos);
1710 ptr= s->edge_emu_buffer; 1716 ptr= s->edge_emu_buffer;
1711 } 1717 }
1712 } 1718 }
1713 dest = dest_y + ((i & 1) * 8) + (i >> 1) * 8 * s->linesize; 1719 dest = dest_y + ((i & 1) * 8) + (i >> 1) * 8 * s->linesize;
1714 qpix_op[1][dxy](dest, ptr, s->linesize); 1720 qpix_op[1][dxy](dest, ptr, s->linesize);
1735 1741
1736 ptr = ref_picture[0] + (src_y * s->linesize) + (src_x); 1742 ptr = ref_picture[0] + (src_y * s->linesize) + (src_x);
1737 if(s->flags&CODEC_FLAG_EMU_EDGE){ 1743 if(s->flags&CODEC_FLAG_EMU_EDGE){
1738 if(src_x<0 || src_y<0 || src_x + (motion_x&1) + 8 > s->h_edge_pos 1744 if(src_x<0 || src_y<0 || src_x + (motion_x&1) + 8 > s->h_edge_pos
1739 || src_y + (motion_y&1) + 8 > s->v_edge_pos){ 1745 || src_y + (motion_y&1) + 8 > s->v_edge_pos){
1740 emulated_edge_mc(s, ptr, s->linesize, 9, 9, src_x, src_y, s->h_edge_pos, s->v_edge_pos); 1746 ff_emulated_edge_mc(s, ptr, s->linesize, 9, 9, src_x, src_y, s->h_edge_pos, s->v_edge_pos);
1741 ptr= s->edge_emu_buffer; 1747 ptr= s->edge_emu_buffer;
1742 } 1748 }
1743 } 1749 }
1744 dest = dest_y + ((i & 1) * 8) + (i >> 1) * 8 * s->linesize; 1750 dest = dest_y + ((i & 1) * 8) + (i >> 1) * 8 * s->linesize;
1745 pix_op[1][dxy](dest, ptr, s->linesize, 8); 1751 pix_op[1][dxy](dest, ptr, s->linesize, 8);
1782 offset = (src_y * (s->uvlinesize)) + src_x; 1788 offset = (src_y * (s->uvlinesize)) + src_x;
1783 ptr = ref_picture[1] + offset; 1789 ptr = ref_picture[1] + offset;
1784 if(s->flags&CODEC_FLAG_EMU_EDGE){ 1790 if(s->flags&CODEC_FLAG_EMU_EDGE){
1785 if(src_x<0 || src_y<0 || src_x + (dxy &1) + 8 > s->h_edge_pos>>1 1791 if(src_x<0 || src_y<0 || src_x + (dxy &1) + 8 > s->h_edge_pos>>1
1786 || src_y + (dxy>>1) + 8 > s->v_edge_pos>>1){ 1792 || src_y + (dxy>>1) + 8 > s->v_edge_pos>>1){
1787 emulated_edge_mc(s, ptr, s->uvlinesize, 9, 9, src_x, src_y, s->h_edge_pos>>1, s->v_edge_pos>>1); 1793 ff_emulated_edge_mc(s, ptr, s->uvlinesize, 9, 9, src_x, src_y, s->h_edge_pos>>1, s->v_edge_pos>>1);
1788 ptr= s->edge_emu_buffer; 1794 ptr= s->edge_emu_buffer;
1789 emu=1; 1795 emu=1;
1790 } 1796 }
1791 } 1797 }
1792 pix_op[1][dxy](dest_cb, ptr, s->uvlinesize, 8); 1798 pix_op[1][dxy](dest_cb, ptr, s->uvlinesize, 8);
1793 1799
1794 ptr = ref_picture[2] + offset; 1800 ptr = ref_picture[2] + offset;
1795 if(emu){ 1801 if(emu){
1796 emulated_edge_mc(s, ptr, s->uvlinesize, 9, 9, src_x, src_y, s->h_edge_pos>>1, s->v_edge_pos>>1); 1802 ff_emulated_edge_mc(s, ptr, s->uvlinesize, 9, 9, src_x, src_y, s->h_edge_pos>>1, s->v_edge_pos>>1);
1797 ptr= s->edge_emu_buffer; 1803 ptr= s->edge_emu_buffer;
1798 } 1804 }
1799 pix_op[1][dxy](dest_cr, ptr, s->uvlinesize, 8); 1805 pix_op[1][dxy](dest_cr, ptr, s->uvlinesize, 8);
1800 break; 1806 break;
1801 case MV_TYPE_FIELD: 1807 case MV_TYPE_FIELD:
1926 else if (s->h263_pred || s->h263_aic) 1932 else if (s->h263_pred || s->h263_aic)
1927 s->mbintra_table[mb_xy]=1; 1933 s->mbintra_table[mb_xy]=1;
1928 1934
1929 /* update motion predictor, not for B-frames as they need the motion_val from the last P/S-Frame */ 1935 /* update motion predictor, not for B-frames as they need the motion_val from the last P/S-Frame */
1930 if (s->out_format == FMT_H263 && s->pict_type!=B_TYPE) { //FIXME move into h263.c if possible, format specific stuff shouldnt be here 1936 if (s->out_format == FMT_H263 && s->pict_type!=B_TYPE) { //FIXME move into h263.c if possible, format specific stuff shouldnt be here
1931 1937 //FIXME a lot of thet is only needed for !low_delay
1932 const int wrap = s->block_wrap[0]; 1938 const int wrap = s->block_wrap[0];
1933 const int xy = s->block_index[0]; 1939 const int xy = s->block_index[0];
1934 const int mb_index= s->mb_x + s->mb_y*s->mb_width; 1940 const int mb_index= s->mb_x + s->mb_y*s->mb_width;
1935 if(s->mv_type == MV_TYPE_8X8){ 1941 if(s->mv_type == MV_TYPE_8X8){
1936 s->co_located_type_table[mb_index]= CO_LOCATED_TYPE_4MV; 1942 s->co_located_type_table[mb_index]= CO_LOCATED_TYPE_4MV;
2062 2068
2063 if(!(s->flags&CODEC_FLAG_GRAY)){ 2069 if(!(s->flags&CODEC_FLAG_GRAY)){
2064 add_dequant_dct(s, block[4], 4, dest_cb, s->uvlinesize); 2070 add_dequant_dct(s, block[4], 4, dest_cb, s->uvlinesize);
2065 add_dequant_dct(s, block[5], 5, dest_cr, s->uvlinesize); 2071 add_dequant_dct(s, block[5], 5, dest_cr, s->uvlinesize);
2066 } 2072 }
2067 } else { 2073 } else if(s->codec_id != CODEC_ID_WMV2){
2068 add_dct(s, block[0], 0, dest_y, dct_linesize); 2074 add_dct(s, block[0], 0, dest_y, dct_linesize);
2069 add_dct(s, block[1], 1, dest_y + 8, dct_linesize); 2075 add_dct(s, block[1], 1, dest_y + 8, dct_linesize);
2070 add_dct(s, block[2], 2, dest_y + dct_offset, dct_linesize); 2076 add_dct(s, block[2], 2, dest_y + dct_offset, dct_linesize);
2071 add_dct(s, block[3], 3, dest_y + dct_offset + 8, dct_linesize); 2077 add_dct(s, block[3], 3, dest_y + dct_offset + 8, dct_linesize);
2072 2078
2073 if(!(s->flags&CODEC_FLAG_GRAY)){ 2079 if(!(s->flags&CODEC_FLAG_GRAY)){
2074 add_dct(s, block[4], 4, dest_cb, s->uvlinesize); 2080 add_dct(s, block[4], 4, dest_cb, s->uvlinesize);
2075 add_dct(s, block[5], 5, dest_cr, s->uvlinesize); 2081 add_dct(s, block[5], 5, dest_cr, s->uvlinesize);
2076 } 2082 }
2083 } else{
2084 ff_wmv2_add_mb(s, block, dest_y, dest_cb, dest_cr);
2077 } 2085 }
2078 } else { 2086 } else {
2079 /* dct only in intra block */ 2087 /* dct only in intra block */
2080 if(s->encoding || !(s->mpeg2 || s->codec_id==CODEC_ID_MPEG1VIDEO)){ 2088 if(s->encoding || !(s->mpeg2 || s->codec_id==CODEC_ID_MPEG1VIDEO)){
2081 put_dct(s, block[0], 0, dest_y, dct_linesize); 2089 put_dct(s, block[0], 0, dest_y, dct_linesize);
2374 2382
2375 wrap_y = s->linesize; 2383 wrap_y = s->linesize;
2376 ptr = s->new_picture.data[0] + (mb_y * 16 * wrap_y) + mb_x * 16; 2384 ptr = s->new_picture.data[0] + (mb_y * 16 * wrap_y) + mb_x * 16;
2377 2385
2378 if(mb_x*16+16 > s->width || mb_y*16+16 > s->height){ 2386 if(mb_x*16+16 > s->width || mb_y*16+16 > s->height){
2379 emulated_edge_mc(s, ptr, wrap_y, 16, 16, mb_x*16, mb_y*16, s->width, s->height); 2387 ff_emulated_edge_mc(s, ptr, wrap_y, 16, 16, mb_x*16, mb_y*16, s->width, s->height);
2380 ptr= s->edge_emu_buffer; 2388 ptr= s->edge_emu_buffer;
2381 emu=1; 2389 emu=1;
2382 } 2390 }
2383 2391
2384 if(s->flags&CODEC_FLAG_INTERLACED_DCT){ 2392 if(s->flags&CODEC_FLAG_INTERLACED_DCT){
2406 skip_dct[5]= 1; 2414 skip_dct[5]= 1;
2407 }else{ 2415 }else{
2408 int wrap_c = s->uvlinesize; 2416 int wrap_c = s->uvlinesize;
2409 ptr = s->new_picture.data[1] + (mb_y * 8 * wrap_c) + mb_x * 8; 2417 ptr = s->new_picture.data[1] + (mb_y * 8 * wrap_c) + mb_x * 8;
2410 if(emu){ 2418 if(emu){
2411 emulated_edge_mc(s, ptr, wrap_c, 8, 8, mb_x*8, mb_y*8, s->width>>1, s->height>>1); 2419 ff_emulated_edge_mc(s, ptr, wrap_c, 8, 8, mb_x*8, mb_y*8, s->width>>1, s->height>>1);
2412 ptr= s->edge_emu_buffer; 2420 ptr= s->edge_emu_buffer;
2413 } 2421 }
2414 s->dsp.get_pixels(s->block[4], ptr, wrap_c); 2422 s->dsp.get_pixels(s->block[4], ptr, wrap_c);
2415 2423
2416 ptr = s->new_picture.data[2] + (mb_y * 8 * wrap_c) + mb_x * 8; 2424 ptr = s->new_picture.data[2] + (mb_y * 8 * wrap_c) + mb_x * 8;
2417 if(emu){ 2425 if(emu){
2418 emulated_edge_mc(s, ptr, wrap_c, 8, 8, mb_x*8, mb_y*8, s->width>>1, s->height>>1); 2426 ff_emulated_edge_mc(s, ptr, wrap_c, 8, 8, mb_x*8, mb_y*8, s->width>>1, s->height>>1);
2419 ptr= s->edge_emu_buffer; 2427 ptr= s->edge_emu_buffer;
2420 } 2428 }
2421 s->dsp.get_pixels(s->block[5], ptr, wrap_c); 2429 s->dsp.get_pixels(s->block[5], ptr, wrap_c);
2422 } 2430 }
2423 }else{ 2431 }else{
2453 if (s->mv_dir & MV_DIR_BACKWARD) { 2461 if (s->mv_dir & MV_DIR_BACKWARD) {
2454 MPV_motion(s, dest_y, dest_cb, dest_cr, 1, s->next_picture.data, op_pix, op_qpix); 2462 MPV_motion(s, dest_y, dest_cb, dest_cr, 1, s->next_picture.data, op_pix, op_qpix);
2455 } 2463 }
2456 2464
2457 if(mb_x*16+16 > s->width || mb_y*16+16 > s->height){ 2465 if(mb_x*16+16 > s->width || mb_y*16+16 > s->height){
2458 emulated_edge_mc(s, ptr_y, wrap_y, 16, 16, mb_x*16, mb_y*16, s->width, s->height); 2466 ff_emulated_edge_mc(s, ptr_y, wrap_y, 16, 16, mb_x*16, mb_y*16, s->width, s->height);
2459 ptr_y= s->edge_emu_buffer; 2467 ptr_y= s->edge_emu_buffer;
2460 emu=1; 2468 emu=1;
2461 } 2469 }
2462 2470
2463 if(s->flags&CODEC_FLAG_INTERLACED_DCT){ 2471 if(s->flags&CODEC_FLAG_INTERLACED_DCT){
2485 if(s->flags&CODEC_FLAG_GRAY){ 2493 if(s->flags&CODEC_FLAG_GRAY){
2486 skip_dct[4]= 1; 2494 skip_dct[4]= 1;
2487 skip_dct[5]= 1; 2495 skip_dct[5]= 1;
2488 }else{ 2496 }else{
2489 if(emu){ 2497 if(emu){
2490 emulated_edge_mc(s, ptr_cb, wrap_c, 8, 8, mb_x*8, mb_y*8, s->width>>1, s->height>>1); 2498 ff_emulated_edge_mc(s, ptr_cb, wrap_c, 8, 8, mb_x*8, mb_y*8, s->width>>1, s->height>>1);
2491 ptr_cb= s->edge_emu_buffer; 2499 ptr_cb= s->edge_emu_buffer;
2492 } 2500 }
2493 s->dsp.diff_pixels(s->block[4], ptr_cb, dest_cb, wrap_c); 2501 s->dsp.diff_pixels(s->block[4], ptr_cb, dest_cb, wrap_c);
2494 if(emu){ 2502 if(emu){
2495 emulated_edge_mc(s, ptr_cr, wrap_c, 8, 8, mb_x*8, mb_y*8, s->width>>1, s->height>>1); 2503 ff_emulated_edge_mc(s, ptr_cr, wrap_c, 8, 8, mb_x*8, mb_y*8, s->width>>1, s->height>>1);
2496 ptr_cr= s->edge_emu_buffer; 2504 ptr_cr= s->edge_emu_buffer;
2497 } 2505 }
2498 s->dsp.diff_pixels(s->block[5], ptr_cr, dest_cr, wrap_c); 2506 s->dsp.diff_pixels(s->block[5], ptr_cr, dest_cr, wrap_c);
2499 } 2507 }
2500 /* pre quantization */ 2508 /* pre quantization */
2572 s->block[5][0]= 128; 2580 s->block[5][0]= 128;
2573 } 2581 }
2574 2582
2575 #ifdef CONFIG_ENCODERS 2583 #ifdef CONFIG_ENCODERS
2576 /* huffman encode */ 2584 /* huffman encode */
2577 switch(s->out_format) { 2585 switch(s->codec_id){ //FIXME funct ptr could be slightly faster
2578 case FMT_MPEG1: 2586 case CODEC_ID_MPEG1VIDEO:
2579 mpeg1_encode_mb(s, s->block, motion_x, motion_y); 2587 mpeg1_encode_mb(s, s->block, motion_x, motion_y); break;
2580 break; 2588 case CODEC_ID_MPEG4:
2581 case FMT_H263: 2589 mpeg4_encode_mb(s, s->block, motion_x, motion_y); break;
2582 if (s->h263_msmpeg4) 2590 case CODEC_ID_MSMPEG4V2:
2583 msmpeg4_encode_mb(s, s->block, motion_x, motion_y); 2591 case CODEC_ID_MSMPEG4V3:
2584 else if(s->h263_pred) 2592 case CODEC_ID_WMV1:
2585 mpeg4_encode_mb(s, s->block, motion_x, motion_y); 2593 msmpeg4_encode_mb(s, s->block, motion_x, motion_y); break;
2586 else 2594 case CODEC_ID_WMV2:
2587 h263_encode_mb(s, s->block, motion_x, motion_y); 2595 ff_wmv2_encode_mb(s, s->block, motion_x, motion_y); break;
2588 break; 2596 case CODEC_ID_MJPEG:
2589 case FMT_MJPEG: 2597 mjpeg_encode_mb(s, s->block); break;
2590 mjpeg_encode_mb(s, s->block); 2598 case CODEC_ID_H263:
2591 break; 2599 case CODEC_ID_H263P:
2600 case CODEC_ID_RV10:
2601 h263_encode_mb(s, s->block, motion_x, motion_y); break;
2602 default:
2603 assert(0);
2592 } 2604 }
2593 #endif 2605 #endif
2594 } 2606 }
2595 2607
2596 void ff_copy_bits(PutBitContext *pb, UINT8 *src, int length) 2608 void ff_copy_bits(PutBitContext *pb, UINT8 *src, int length)
2702 uint32_t *sq = squareTbl + 256; 2714 uint32_t *sq = squareTbl + 256;
2703 int acc=0; 2715 int acc=0;
2704 int x,y; 2716 int x,y;
2705 2717
2706 if(w==16 && h==16) 2718 if(w==16 && h==16)
2707 return s->dsp.pix_norm(src1, src2, stride); 2719 return s->dsp.sse[0](NULL, src1, src2, stride);
2720 else if(w==8 && h==8)
2721 return s->dsp.sse[1](NULL, src1, src2, stride);
2708 2722
2709 for(y=0; y<h; y++){ 2723 for(y=0; y<h; y++){
2710 for(x=0; x<w; x++){ 2724 for(x=0; x<w; x++){
2711 acc+= sq[src1[x + y*stride] - src2[x + y*stride]]; 2725 acc+= sq[src1[x + y*stride] - src2[x + y*stride]];
2712 } 2726 }
2713 } 2727 }
2728
2729 assert(acc>=0);
2730
2714 return acc; 2731 return acc;
2715 } 2732 }
2716 2733
2717 static void encode_picture(MpegEncContext *s, int picture_number) 2734 static void encode_picture(MpegEncContext *s, int picture_number)
2718 { 2735 {
2749 ff_set_mpeg4_time(s, s->picture_number); 2766 ff_set_mpeg4_time(s, s->picture_number);
2750 2767
2751 s->scene_change_score=0; 2768 s->scene_change_score=0;
2752 2769
2753 s->qscale= (int)(s->frame_qscale + 0.5); //FIXME qscale / ... stuff for ME ratedistoration 2770 s->qscale= (int)(s->frame_qscale + 0.5); //FIXME qscale / ... stuff for ME ratedistoration
2771
2772 if(s->msmpeg4_version){
2773 if(s->pict_type==I_TYPE)
2774 s->no_rounding=1;
2775 else if(s->flipflop_rounding)
2776 s->no_rounding ^= 1;
2777 }else{
2778 if(s->pict_type==I_TYPE)
2779 s->no_rounding=0;
2780 else if(s->pict_type!=B_TYPE)
2781 s->no_rounding ^= 1;
2782 }
2754 2783
2755 /* Estimate motion for every MB */ 2784 /* Estimate motion for every MB */
2756 if(s->pict_type != I_TYPE){ 2785 if(s->pict_type != I_TYPE){
2757 for(mb_y=0; mb_y < s->mb_height; mb_y++) { 2786 for(mb_y=0; mb_y < s->mb_height; mb_y++) {
2758 s->block_index[0]= s->block_wrap[0]*(mb_y*2 + 1) - 1; 2787 s->block_index[0]= s->block_wrap[0]*(mb_y*2 + 1) - 1;
2770 /* compute motion vector & mb_type and store in context */ 2799 /* compute motion vector & mb_type and store in context */
2771 if(s->pict_type==B_TYPE) 2800 if(s->pict_type==B_TYPE)
2772 ff_estimate_b_frame_motion(s, mb_x, mb_y); 2801 ff_estimate_b_frame_motion(s, mb_x, mb_y);
2773 else 2802 else
2774 ff_estimate_p_frame_motion(s, mb_x, mb_y); 2803 ff_estimate_p_frame_motion(s, mb_x, mb_y);
2775 // s->mb_type[mb_y*s->mb_width + mb_x]=MB_TYPE_INTER;
2776 } 2804 }
2777 } 2805 }
2778 }else /* if(s->pict_type == I_TYPE) */{ 2806 }else /* if(s->pict_type == I_TYPE) */{
2779 /* I-Frame */ 2807 /* I-Frame */
2780 //FIXME do we need to zero them? 2808 //FIXME do we need to zero them?
2865 switch(s->out_format) { 2893 switch(s->out_format) {
2866 case FMT_MJPEG: 2894 case FMT_MJPEG:
2867 mjpeg_picture_header(s); 2895 mjpeg_picture_header(s);
2868 break; 2896 break;
2869 case FMT_H263: 2897 case FMT_H263:
2870 if (s->h263_msmpeg4) 2898 if (s->codec_id == CODEC_ID_WMV2)
2899 ff_wmv2_encode_picture_header(s, picture_number);
2900 else if (s->h263_msmpeg4)
2871 msmpeg4_encode_picture_header(s, picture_number); 2901 msmpeg4_encode_picture_header(s, picture_number);
2872 else if (s->h263_pred) 2902 else if (s->h263_pred)
2873 mpeg4_encode_picture_header(s, picture_number); 2903 mpeg4_encode_picture_header(s, picture_number);
2874 else if (s->h263_rv10) 2904 else if (s->h263_rv10)
2875 rv10_encode_picture_header(s, picture_number); 2905 rv10_encode_picture_header(s, picture_number);
3047 s->mv[1][0][1] = s->b_bidir_back_mv_table[xy][1]; 3077 s->mv[1][0][1] = s->b_bidir_back_mv_table[xy][1];
3048 encode_mb_hq(s, &backup_s, &best_s, MB_TYPE_BIDIR, pb, pb2, tex_pb, 3078 encode_mb_hq(s, &backup_s, &best_s, MB_TYPE_BIDIR, pb, pb2, tex_pb,
3049 &dmin, &next_block, 0, 0); 3079 &dmin, &next_block, 0, 0);
3050 } 3080 }
3051 if(mb_type&MB_TYPE_DIRECT){ 3081 if(mb_type&MB_TYPE_DIRECT){
3082 int mx= s->b_direct_mv_table[xy][0];
3083 int my= s->b_direct_mv_table[xy][1];
3084
3052 s->mv_dir = MV_DIR_FORWARD | MV_DIR_BACKWARD | MV_DIRECT; 3085 s->mv_dir = MV_DIR_FORWARD | MV_DIR_BACKWARD | MV_DIRECT;
3053 s->mv_type = MV_TYPE_16X16; //FIXME
3054 s->mb_intra= 0; 3086 s->mb_intra= 0;
3055 s->mv[0][0][0] = s->b_direct_forw_mv_table[xy][0]; 3087 ff_mpeg4_set_direct_mv(s, mx, my);
3056 s->mv[0][0][1] = s->b_direct_forw_mv_table[xy][1];
3057 s->mv[1][0][0] = s->b_direct_back_mv_table[xy][0];
3058 s->mv[1][0][1] = s->b_direct_back_mv_table[xy][1];
3059 encode_mb_hq(s, &backup_s, &best_s, MB_TYPE_DIRECT, pb, pb2, tex_pb, 3088 encode_mb_hq(s, &backup_s, &best_s, MB_TYPE_DIRECT, pb, pb2, tex_pb,
3060 &dmin, &next_block, s->b_direct_mv_table[xy][0], s->b_direct_mv_table[xy][1]); 3089 &dmin, &next_block, mx, my);
3061 } 3090 }
3062 if(mb_type&MB_TYPE_INTRA){ 3091 if(mb_type&MB_TYPE_INTRA){
3063 s->mv_dir = MV_DIR_FORWARD; 3092 s->mv_dir = MV_DIR_FORWARD;
3064 s->mv_type = MV_TYPE_16X16; 3093 s->mv_type = MV_TYPE_16X16;
3065 s->mb_intra= 1; 3094 s->mb_intra= 1;
3120 case MB_TYPE_DIRECT: 3149 case MB_TYPE_DIRECT:
3121 s->mv_dir = MV_DIR_FORWARD | MV_DIR_BACKWARD | MV_DIRECT; 3150 s->mv_dir = MV_DIR_FORWARD | MV_DIR_BACKWARD | MV_DIRECT;
3122 s->mb_intra= 0; 3151 s->mb_intra= 0;
3123 motion_x=s->b_direct_mv_table[xy][0]; 3152 motion_x=s->b_direct_mv_table[xy][0];
3124 motion_y=s->b_direct_mv_table[xy][1]; 3153 motion_y=s->b_direct_mv_table[xy][1];
3125 s->mv[0][0][0] = s->b_direct_forw_mv_table[xy][0]; 3154 ff_mpeg4_set_direct_mv(s, motion_x, motion_y);
3126 s->mv[0][0][1] = s->b_direct_forw_mv_table[xy][1];
3127 s->mv[1][0][0] = s->b_direct_back_mv_table[xy][0];
3128 s->mv[1][0][1] = s->b_direct_back_mv_table[xy][1];
3129 break; 3155 break;
3130 case MB_TYPE_BIDIR: 3156 case MB_TYPE_BIDIR:
3131 s->mv_dir = MV_DIR_FORWARD | MV_DIR_BACKWARD; 3157 s->mv_dir = MV_DIR_FORWARD | MV_DIR_BACKWARD;
3132 s->mb_intra= 0; 3158 s->mb_intra= 0;
3133 motion_x=0; 3159 motion_x=0;
3168 int w= 16; 3194 int w= 16;
3169 int h= 16; 3195 int h= 16;
3170 3196
3171 if(s->mb_x*16 + 16 > s->width ) w= s->width - s->mb_x*16; 3197 if(s->mb_x*16 + 16 > s->width ) w= s->width - s->mb_x*16;
3172 if(s->mb_y*16 + 16 > s->height) h= s->height- s->mb_y*16; 3198 if(s->mb_y*16 + 16 > s->height) h= s->height- s->mb_y*16;
3173 3199
3174 s->current_picture.error[0] += sse( 3200 s->current_picture.error[0] += sse(
3175 s, 3201 s,
3176 s->new_picture .data[0] + s->mb_x*16 + s->mb_y*s->linesize*16, 3202 s->new_picture .data[0] + s->mb_x*16 + s->mb_y*s->linesize*16,
3177 s->current_picture.data[0] + s->mb_x*16 + s->mb_y*s->linesize*16, 3203 s->current_picture.data[0] + s->mb_x*16 + s->mb_y*s->linesize*16,
3178 w, h, s->linesize); 3204 w, h, s->linesize);
3469 switch(pict_type){ 3495 switch(pict_type){
3470 case I_TYPE: return 'I'; 3496 case I_TYPE: return 'I';
3471 case P_TYPE: return 'P'; 3497 case P_TYPE: return 'P';
3472 case B_TYPE: return 'B'; 3498 case B_TYPE: return 'B';
3473 case S_TYPE: return 'S'; 3499 case S_TYPE: return 'S';
3500 default: return '?';
3474 } 3501 }
3475 } 3502 }
3476 3503
3477 AVCodec mpeg1video_encoder = { 3504 AVCodec mpeg1video_encoder = {
3478 "mpeg1video", 3505 "mpeg1video",
3572 MPV_encode_init, 3599 MPV_encode_init,
3573 MPV_encode_picture, 3600 MPV_encode_picture,
3574 MPV_encode_end, 3601 MPV_encode_end,
3575 }; 3602 };
3576 3603
3577 AVCodec wmv2_encoder = {
3578 "wmv2",
3579 CODEC_TYPE_VIDEO,
3580 CODEC_ID_WMV2,
3581 sizeof(MpegEncContext),
3582 MPV_encode_init,
3583 MPV_encode_picture,
3584 MPV_encode_end,
3585 };