Mercurial > libavcodec.hg
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 }; |
