comparison mpegvideo.c @ 1799:95612d423fde libavcodec

multithreaded/SMP motion estimation multithreaded/SMP encoding for MPEG1/MPEG2/MPEG4/H263 all pthread specific code is in pthread.c to try it, run configure --enable-pthreads and ffmpeg ... -threads <num> the internal thread API is a simple AVCodecContext.execute() callback which executes a given function pointer with different arguments and returns after finishing all, that way no mutexes or other thread-mess is needed outside pthread.c
author michael
date Fri, 13 Feb 2004 17:54:10 +0000
parents be1f5b6137e1
children 3f26dfb3eba4
comparison
equal deleted inserted replaced
1798:a3da4b429984 1799:95612d423fde
399 } 399 }
400 pic->type= 0; 400 pic->type= 0;
401 } 401 }
402 } 402 }
403 403
404 static int init_duplicate_context(MpegEncContext *s, MpegEncContext *base){
405 int i;
406
407 CHECKED_ALLOCZ(s->allocated_edge_emu_buffer, (s->width+64)*2*17*2); //(width + edge + align)*interlaced*MBsize*tolerance
408 s->edge_emu_buffer= s->allocated_edge_emu_buffer + (s->width+64)*2*17;
409
410 //FIXME should be linesize instead of s->width*2 but that isnt known before get_buffer()
411 CHECKED_ALLOCZ(s->me.scratchpad, s->width*2*16*2*sizeof(uint8_t))
412 s->rd_scratchpad= s->me.scratchpad;
413 s->b_scratchpad= s->me.scratchpad;
414 s->obmc_scratchpad= s->me.scratchpad + 16;
415 if (s->encoding) {
416 CHECKED_ALLOCZ(s->me.map , ME_MAP_SIZE*sizeof(uint32_t))
417 CHECKED_ALLOCZ(s->me.score_map, ME_MAP_SIZE*sizeof(uint32_t))
418 if(s->avctx->noise_reduction){
419 CHECKED_ALLOCZ(s->dct_error_sum, 2 * 64 * sizeof(int))
420 }
421 }
422 CHECKED_ALLOCZ(s->blocks, 64*6*2 * sizeof(DCTELEM))
423 s->block= s->blocks[0];
424
425 for(i=0;i<12;i++){
426 s->pblocks[i] = (short *)(&s->block[i]);
427 }
428 return 0;
429 fail:
430 return -1; //free() through MPV_common_end()
431 }
432
433 static void free_duplicate_context(MpegEncContext *s){
434 if(s==NULL) return;
435
436 av_freep(&s->allocated_edge_emu_buffer); s->edge_emu_buffer= NULL;
437 av_freep(&s->me.scratchpad);
438 s->rd_scratchpad=
439 s->b_scratchpad=
440 s->obmc_scratchpad= NULL;
441
442 av_freep(&s->dct_error_sum);
443 av_freep(&s->me.map);
444 av_freep(&s->me.score_map);
445 av_freep(&s->blocks);
446 s->block= NULL;
447 }
448
449 static void backup_duplicate_context(MpegEncContext *bak, MpegEncContext *src){
450 #define COPY(a) bak->a= src->a
451 COPY(allocated_edge_emu_buffer);
452 COPY(edge_emu_buffer);
453 COPY(me.scratchpad);
454 COPY(rd_scratchpad);
455 COPY(b_scratchpad);
456 COPY(obmc_scratchpad);
457 COPY(me.map);
458 COPY(me.score_map);
459 COPY(blocks);
460 COPY(block);
461 COPY(start_mb_y);
462 COPY(end_mb_y);
463 COPY(me.map_generation);
464 COPY(pb);
465 COPY(dct_error_sum);
466 #undef COPY
467 }
468
469 static void update_duplicate_context(MpegEncContext *dst, MpegEncContext *src){
470 MpegEncContext bak;
471 //FIXME copy only needed parts
472 //START_TIMER
473 backup_duplicate_context(&bak, dst);
474 memcpy(dst, src, sizeof(MpegEncContext));
475 backup_duplicate_context(dst, &bak);
476 //STOP_TIMER("update_duplicate_context") //about 10k cycles / 0.01 sec for 1000frames on 1ghz with 2 threads
477 }
478
479 static void update_duplicate_context_after_me(MpegEncContext *dst, MpegEncContext *src){
480 #define COPY(a) dst->a= src->a
481 COPY(pict_type);
482 COPY(current_picture);
483 COPY(f_code);
484 COPY(b_code);
485 COPY(qscale);
486 COPY(lambda);
487 COPY(lambda2);
488 COPY(picture_in_gop_number);
489 COPY(gop_picture_number);
490 COPY(frame_pred_frame_dct); //FIXME dont set in encode_header
491 COPY(progressive_frame); //FIXME dont set in encode_header
492 COPY(partitioned_frame); //FIXME dont set in encode_header
493 #undef COPY
494 }
495
404 /* init common structure for both encoder and decoder */ 496 /* init common structure for both encoder and decoder */
405 int MPV_common_init(MpegEncContext *s) 497 int MPV_common_init(MpegEncContext *s)
406 { 498 {
407 int y_size, c_size, yc_size, i, mb_array_size, mv_table_size, x, y; 499 int y_size, c_size, yc_size, i, mb_array_size, mv_table_size, x, y;
408 500
453 545
454 s->avctx->stream_codec_tag= toupper( s->avctx->stream_codec_tag &0xFF) 546 s->avctx->stream_codec_tag= toupper( s->avctx->stream_codec_tag &0xFF)
455 + (toupper((s->avctx->stream_codec_tag>>8 )&0xFF)<<8 ) 547 + (toupper((s->avctx->stream_codec_tag>>8 )&0xFF)<<8 )
456 + (toupper((s->avctx->stream_codec_tag>>16)&0xFF)<<16) 548 + (toupper((s->avctx->stream_codec_tag>>16)&0xFF)<<16)
457 + (toupper((s->avctx->stream_codec_tag>>24)&0xFF)<<24); 549 + (toupper((s->avctx->stream_codec_tag>>24)&0xFF)<<24);
458
459 CHECKED_ALLOCZ(s->allocated_edge_emu_buffer, (s->width+64)*2*17*2); //(width + edge + align)*interlaced*MBsize*tolerance
460 s->edge_emu_buffer= s->allocated_edge_emu_buffer + (s->width+64)*2*17;
461 550
462 s->avctx->coded_frame= (AVFrame*)&s->current_picture; 551 s->avctx->coded_frame= (AVFrame*)&s->current_picture;
463 552
464 CHECKED_ALLOCZ(s->mb_index2xy, (s->mb_num+1)*sizeof(int)) //error ressilience code looks cleaner with this 553 CHECKED_ALLOCZ(s->mb_index2xy, (s->mb_num+1)*sizeof(int)) //error ressilience code looks cleaner with this
465 for(y=0; y<s->mb_height; y++){ 554 for(y=0; y<s->mb_height; y++){
482 s->b_back_mv_table = s->b_back_mv_table_base + s->mb_stride + 1; 571 s->b_back_mv_table = s->b_back_mv_table_base + s->mb_stride + 1;
483 s->b_bidir_forw_mv_table= s->b_bidir_forw_mv_table_base + s->mb_stride + 1; 572 s->b_bidir_forw_mv_table= s->b_bidir_forw_mv_table_base + s->mb_stride + 1;
484 s->b_bidir_back_mv_table= s->b_bidir_back_mv_table_base + s->mb_stride + 1; 573 s->b_bidir_back_mv_table= s->b_bidir_back_mv_table_base + s->mb_stride + 1;
485 s->b_direct_mv_table = s->b_direct_mv_table_base + s->mb_stride + 1; 574 s->b_direct_mv_table = s->b_direct_mv_table_base + s->mb_stride + 1;
486 575
487 //FIXME should be linesize instead of s->width*2 but that isnt known before get_buffer()
488 CHECKED_ALLOCZ(s->me.scratchpad, s->width*2*16*3*sizeof(uint8_t))
489
490 CHECKED_ALLOCZ(s->me.map , ME_MAP_SIZE*sizeof(uint32_t))
491 CHECKED_ALLOCZ(s->me.score_map, ME_MAP_SIZE*sizeof(uint32_t))
492
493 if(s->codec_id==CODEC_ID_MPEG4){
494 CHECKED_ALLOCZ(s->tex_pb_buffer, PB_BUFFER_SIZE);
495 CHECKED_ALLOCZ( s->pb2_buffer, PB_BUFFER_SIZE);
496 }
497
498 if(s->msmpeg4_version){ 576 if(s->msmpeg4_version){
499 CHECKED_ALLOCZ(s->ac_stats, 2*2*(MAX_LEVEL+1)*(MAX_RUN+1)*2*sizeof(int)); 577 CHECKED_ALLOCZ(s->ac_stats, 2*2*(MAX_LEVEL+1)*(MAX_RUN+1)*2*sizeof(int));
500 } 578 }
501 CHECKED_ALLOCZ(s->avctx->stats_out, 256); 579 CHECKED_ALLOCZ(s->avctx->stats_out, 256);
502 580
511 CHECKED_ALLOCZ(s->q_inter_matrix16, 64*32*2 * sizeof(uint16_t)) 589 CHECKED_ALLOCZ(s->q_inter_matrix16, 64*32*2 * sizeof(uint16_t))
512 CHECKED_ALLOCZ(s->input_picture, MAX_PICTURE_COUNT * sizeof(Picture*)) 590 CHECKED_ALLOCZ(s->input_picture, MAX_PICTURE_COUNT * sizeof(Picture*))
513 CHECKED_ALLOCZ(s->reordered_input_picture, MAX_PICTURE_COUNT * sizeof(Picture*)) 591 CHECKED_ALLOCZ(s->reordered_input_picture, MAX_PICTURE_COUNT * sizeof(Picture*))
514 592
515 if(s->avctx->noise_reduction){ 593 if(s->avctx->noise_reduction){
516 CHECKED_ALLOCZ(s->dct_error_sum, 2 * 64 * sizeof(int))
517 CHECKED_ALLOCZ(s->dct_offset, 2 * 64 * sizeof(uint16_t)) 594 CHECKED_ALLOCZ(s->dct_offset, 2 * 64 * sizeof(uint16_t))
518 } 595 }
519 } 596 }
520 CHECKED_ALLOCZ(s->blocks, 64*6*2 * sizeof(DCTELEM))
521
522 CHECKED_ALLOCZ(s->picture, MAX_PICTURE_COUNT * sizeof(Picture)) 597 CHECKED_ALLOCZ(s->picture, MAX_PICTURE_COUNT * sizeof(Picture))
523 598
524 CHECKED_ALLOCZ(s->error_status_table, mb_array_size*sizeof(uint8_t)) 599 CHECKED_ALLOCZ(s->error_status_table, mb_array_size*sizeof(uint8_t))
525 600
526 if(s->codec_id==CODEC_ID_MPEG4 || (s->flags & CODEC_FLAG_INTERLACED_ME)){ 601 if(s->codec_id==CODEC_ID_MPEG4 || (s->flags & CODEC_FLAG_INTERLACED_ME)){
576 /* init macroblock skip table */ 651 /* init macroblock skip table */
577 CHECKED_ALLOCZ(s->mbskip_table, mb_array_size+2); 652 CHECKED_ALLOCZ(s->mbskip_table, mb_array_size+2);
578 //Note the +1 is for a quicker mpeg4 slice_end detection 653 //Note the +1 is for a quicker mpeg4 slice_end detection
579 CHECKED_ALLOCZ(s->prev_pict_types, PREV_PICT_TYPES_BUFFER_SIZE); 654 CHECKED_ALLOCZ(s->prev_pict_types, PREV_PICT_TYPES_BUFFER_SIZE);
580 655
581 s->block= s->blocks[0];
582
583 for(i=0;i<12;i++){
584 s->pblocks[i] = (short *)(&s->block[i]);
585 }
586
587 s->parse_context.state= -1; 656 s->parse_context.state= -1;
588 if((s->avctx->debug&(FF_DEBUG_VIS_QP|FF_DEBUG_VIS_MB_TYPE)) || (s->avctx->debug_mv)){ 657 if((s->avctx->debug&(FF_DEBUG_VIS_QP|FF_DEBUG_VIS_MB_TYPE)) || (s->avctx->debug_mv)){
589 s->visualization_buffer[0] = av_malloc((s->mb_width*16 + 2*EDGE_WIDTH) * s->mb_height*16 + 2*EDGE_WIDTH); 658 s->visualization_buffer[0] = av_malloc((s->mb_width*16 + 2*EDGE_WIDTH) * s->mb_height*16 + 2*EDGE_WIDTH);
590 s->visualization_buffer[1] = av_malloc((s->mb_width*8 + EDGE_WIDTH) * s->mb_height*8 + EDGE_WIDTH); 659 s->visualization_buffer[1] = av_malloc((s->mb_width*8 + EDGE_WIDTH) * s->mb_height*8 + EDGE_WIDTH);
591 s->visualization_buffer[2] = av_malloc((s->mb_width*8 + EDGE_WIDTH) * s->mb_height*8 + EDGE_WIDTH); 660 s->visualization_buffer[2] = av_malloc((s->mb_width*8 + EDGE_WIDTH) * s->mb_height*8 + EDGE_WIDTH);
592 } 661 }
593 662
594 s->context_initialized = 1; 663 s->context_initialized = 1;
664
665 s->thread_context[0]= s;
666 for(i=1; i<s->avctx->thread_count; i++){
667 s->thread_context[i]= av_malloc(sizeof(MpegEncContext));
668 memcpy(s->thread_context[i], s, sizeof(MpegEncContext));
669 }
670
671 for(i=0; i<s->avctx->thread_count; i++){
672 if(init_duplicate_context(s->thread_context[i], s) < 0)
673 goto fail;
674 s->thread_context[i]->start_mb_y= (s->mb_height*(i ) + s->avctx->thread_count/2) / s->avctx->thread_count;
675 s->thread_context[i]->end_mb_y = (s->mb_height*(i+1) + s->avctx->thread_count/2) / s->avctx->thread_count;
676 }
677
595 return 0; 678 return 0;
596 fail: 679 fail:
597 MPV_common_end(s); 680 MPV_common_end(s);
598 return -1; 681 return -1;
599 } 682 }
600 683
601
602 //extern int sads;
603
604 /* init common structure for both encoder and decoder */ 684 /* init common structure for both encoder and decoder */
605 void MPV_common_end(MpegEncContext *s) 685 void MPV_common_end(MpegEncContext *s)
606 { 686 {
607 int i, j, k; 687 int i, j, k;
688
689 for(i=0; i<s->avctx->thread_count; i++){
690 free_duplicate_context(s->thread_context[i]);
691 }
692 for(i=1; i<s->avctx->thread_count; i++){
693 av_freep(&s->thread_context[i]);
694 }
608 695
609 av_freep(&s->parse_context.buffer); 696 av_freep(&s->parse_context.buffer);
610 s->parse_context.buffer_size=0; 697 s->parse_context.buffer_size=0;
611 698
612 av_freep(&s->mb_type); 699 av_freep(&s->mb_type);
639 av_freep(&s->ac_val[0]); 726 av_freep(&s->ac_val[0]);
640 av_freep(&s->coded_block); 727 av_freep(&s->coded_block);
641 av_freep(&s->mbintra_table); 728 av_freep(&s->mbintra_table);
642 av_freep(&s->cbp_table); 729 av_freep(&s->cbp_table);
643 av_freep(&s->pred_dir_table); 730 av_freep(&s->pred_dir_table);
644 av_freep(&s->me.scratchpad);
645 av_freep(&s->me.map);
646 av_freep(&s->me.score_map);
647 731
648 av_freep(&s->mbskip_table); 732 av_freep(&s->mbskip_table);
649 av_freep(&s->prev_pict_types); 733 av_freep(&s->prev_pict_types);
650 av_freep(&s->bitstream_buffer); 734 av_freep(&s->bitstream_buffer);
651 av_freep(&s->tex_pb_buffer);
652 av_freep(&s->pb2_buffer);
653 av_freep(&s->allocated_edge_emu_buffer); s->edge_emu_buffer= NULL;
654 av_freep(&s->avctx->stats_out); 735 av_freep(&s->avctx->stats_out);
655 av_freep(&s->ac_stats); 736 av_freep(&s->ac_stats);
656 av_freep(&s->error_status_table); 737 av_freep(&s->error_status_table);
657 av_freep(&s->mb_index2xy); 738 av_freep(&s->mb_index2xy);
658 av_freep(&s->lambda_table); 739 av_freep(&s->lambda_table);
659 av_freep(&s->q_intra_matrix); 740 av_freep(&s->q_intra_matrix);
660 av_freep(&s->q_inter_matrix); 741 av_freep(&s->q_inter_matrix);
661 av_freep(&s->q_intra_matrix16); 742 av_freep(&s->q_intra_matrix16);
662 av_freep(&s->q_inter_matrix16); 743 av_freep(&s->q_inter_matrix16);
663 av_freep(&s->blocks);
664 av_freep(&s->input_picture); 744 av_freep(&s->input_picture);
665 av_freep(&s->reordered_input_picture); 745 av_freep(&s->reordered_input_picture);
666 av_freep(&s->dct_error_sum); 746 av_freep(&s->dct_error_sum);
667 av_freep(&s->dct_offset); 747 av_freep(&s->dct_offset);
668 748
795 875
796 if(s->avctx->scenechange_threshold < 1000000000 && (s->flags & CODEC_FLAG_CLOSED_GOP)){ 876 if(s->avctx->scenechange_threshold < 1000000000 && (s->flags & CODEC_FLAG_CLOSED_GOP)){
797 av_log(avctx, AV_LOG_ERROR, "closed gop with scene change detection arent supported yet\n"); 877 av_log(avctx, AV_LOG_ERROR, "closed gop with scene change detection arent supported yet\n");
798 return -1; 878 return -1;
799 } 879 }
880
881 if(s->avctx->thread_count > 1 && s->codec_id != CODEC_ID_MPEG4
882 && s->codec_id != CODEC_ID_MPEG1VIDEO && s->codec_id != CODEC_ID_MPEG2VIDEO
883 && (s->codec_id != CODEC_ID_H263P || !(s->flags & CODEC_FLAG_H263P_SLICE_STRUCT))){
884 av_log(avctx, AV_LOG_ERROR, "multi threaded encoding not supported by codec\n");
885 return -1;
886 }
887
888 if(s->avctx->thread_count > 1)
889 s->rtp_mode= 1;
800 890
801 i= ff_gcd(avctx->frame_rate, avctx->frame_rate_base); 891 i= ff_gcd(avctx->frame_rate, avctx->frame_rate_base);
802 if(i > 1){ 892 if(i > 1){
803 av_log(avctx, AV_LOG_INFO, "removing common factors from framerate\n"); 893 av_log(avctx, AV_LOG_INFO, "removing common factors from framerate\n");
804 avctx->frame_rate /= i; 894 avctx->frame_rate /= i;
988 1078
989 if(s->modified_quant) 1079 if(s->modified_quant)
990 s->chroma_qscale_table= ff_h263_chroma_qscale_table; 1080 s->chroma_qscale_table= ff_h263_chroma_qscale_table;
991 s->progressive_frame= 1081 s->progressive_frame=
992 s->progressive_sequence= !(avctx->flags & (CODEC_FLAG_INTERLACED_DCT|CODEC_FLAG_INTERLACED_ME)); 1082 s->progressive_sequence= !(avctx->flags & (CODEC_FLAG_INTERLACED_DCT|CODEC_FLAG_INTERLACED_ME));
1083 s->quant_precision=5;
993 1084
994 ff_set_cmp(&s->dsp, s->dsp.ildct_cmp, s->avctx->ildct_cmp); 1085 ff_set_cmp(&s->dsp, s->dsp.ildct_cmp, s->avctx->ildct_cmp);
995 1086
996 ff_init_me(s); 1087 ff_init_me(s);
997 1088
1901 if(avctx->pix_fmt != PIX_FMT_YUV420P){ 1992 if(avctx->pix_fmt != PIX_FMT_YUV420P){
1902 av_log(avctx, AV_LOG_ERROR, "this codec supports only YUV420P\n"); 1993 av_log(avctx, AV_LOG_ERROR, "this codec supports only YUV420P\n");
1903 return -1; 1994 return -1;
1904 } 1995 }
1905 1996
1906 init_put_bits(&s->pb, buf, buf_size); 1997 for(i=0; i<avctx->thread_count; i++){
1998 int y= s->thread_context[i]->start_mb_y;
1999 int h= s->mb_height;
2000 uint8_t *start= buf + buf_size* y /h;
2001 uint8_t *end = buf + buf_size*(y+1)/h;
2002
2003 init_put_bits(&s->thread_context[i]->pb, start, end - start);
2004 }
1907 2005
1908 s->picture_in_gop_number++; 2006 s->picture_in_gop_number++;
1909 2007
1910 load_input_picture(s, pic_arg); 2008 load_input_picture(s, pic_arg);
1911 2009
2398 2496
2399 for(i=0; i<5; i++){ 2497 for(i=0; i<5; i++){
2400 if(i && mv[i][0]==mv[MID][0] && mv[i][1]==mv[MID][1]){ 2498 if(i && mv[i][0]==mv[MID][0] && mv[i][1]==mv[MID][1]){
2401 ptr[i]= ptr[MID]; 2499 ptr[i]= ptr[MID];
2402 }else{ 2500 }else{
2403 ptr[i]= s->edge_emu_buffer + 16 + 8*(i&1) + s->linesize*8*(i>>1); 2501 ptr[i]= s->obmc_scratchpad + 8*(i&1) + s->linesize*8*(i>>1);
2404 hpel_motion(s, ptr[i], src, 2502 hpel_motion(s, ptr[i], src,
2405 src_x, src_y, 2503 src_x, src_y,
2406 s->width, s->height, s->linesize, 2504 s->width, s->height, s->linesize,
2407 s->h_edge_pos, s->v_edge_pos, 2505 s->h_edge_pos, s->v_edge_pos,
2408 8, 8, pix_op, 2506 8, 8, pix_op,
3024 if(readable){ 3122 if(readable){
3025 dest_y= s->dest[0]; 3123 dest_y= s->dest[0];
3026 dest_cb= s->dest[1]; 3124 dest_cb= s->dest[1];
3027 dest_cr= s->dest[2]; 3125 dest_cr= s->dest[2];
3028 }else{ 3126 }else{
3029 dest_y = s->edge_emu_buffer+32; //FIXME cleanup scratchpad pointers 3127 dest_y = s->b_scratchpad;
3030 dest_cb= s->edge_emu_buffer+48; 3128 dest_cb= s->b_scratchpad+16*s->linesize;
3031 dest_cr= s->edge_emu_buffer+56; 3129 dest_cr= s->b_scratchpad+16*s->linesize+8;
3032 } 3130 }
3033 if (!s->mb_intra) { 3131 if (!s->mb_intra) {
3034 /* motion handling */ 3132 /* motion handling */
3035 /* decoding or more than one mb_type (MC was allready done otherwise) */ 3133 /* decoding or more than one mb_type (MC was allready done otherwise) */
3036 if(!s->encoding){ 3134 if(!s->encoding){
3632 } 3730 }
3633 3731
3634 #ifdef CONFIG_ENCODERS 3732 #ifdef CONFIG_ENCODERS
3635 void ff_copy_bits(PutBitContext *pb, uint8_t *src, int length) 3733 void ff_copy_bits(PutBitContext *pb, uint8_t *src, int length)
3636 { 3734 {
3637 int bytes= length>>4; 3735 int words= length>>4;
3638 int bits= length&15; 3736 int bits= length&15;
3639 int i; 3737 int i;
3640 3738
3641 if(length==0) return; 3739 if(length==0) return;
3642 3740
3643 for(i=0; i<bytes; i++) put_bits(pb, 16, be2me_16(((uint16_t*)src)[i])); 3741 // if(put_bits_count(pb)&7){ //FIXME
3644 put_bits(pb, bits, be2me_16(((uint16_t*)src)[i])>>(16-bits)); 3742 for(i=0; i<words; i++) put_bits(pb, 16, be2me_16(((uint16_t*)src)[i]));
3743 /* }else{
3744 flush_put_bits(pb);
3745 memcpy(pbBufPtr(pb), src, 2*words);
3746 skip_put_bytes(pb, 2*words);
3747 }*/
3748
3749 put_bits(pb, bits, be2me_16(((uint16_t*)src)[words])>>(16-bits));
3645 } 3750 }
3646 3751
3647 static inline void copy_context_before_encode(MpegEncContext *d, MpegEncContext *s, int type){ 3752 static inline void copy_context_before_encode(MpegEncContext *d, MpegEncContext *s, int type){
3648 int i; 3753 int i;
3649 3754
3723 s->tex_pb= tex_pb[*next_block]; 3828 s->tex_pb= tex_pb[*next_block];
3724 } 3829 }
3725 3830
3726 if(*next_block){ 3831 if(*next_block){
3727 memcpy(dest_backup, s->dest, sizeof(s->dest)); 3832 memcpy(dest_backup, s->dest, sizeof(s->dest));
3728 s->dest[0] = s->me.scratchpad; 3833 s->dest[0] = s->rd_scratchpad;
3729 s->dest[1] = s->me.scratchpad + 16; 3834 s->dest[1] = s->rd_scratchpad + 16*s->linesize;
3730 s->dest[2] = s->me.scratchpad + 16 + 8; 3835 s->dest[2] = s->rd_scratchpad + 16*s->linesize + 8;
3731 assert(2*s->uvlinesize == s->linesize); //should be no prob for encoding 3836 assert(s->linesize >= 32); //FIXME
3732 assert(s->linesize >= 64); //FIXME
3733 } 3837 }
3734 3838
3735 encode_mb(s, motion_x, motion_y); 3839 encode_mb(s, motion_x, motion_y);
3736 3840
3737 score= put_bits_count(&s->pb); 3841 score= put_bits_count(&s->pb);
3795 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) 3899 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)
3796 +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) 3900 +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)
3797 +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); 3901 +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);
3798 } 3902 }
3799 3903
3800 static void encode_picture(MpegEncContext *s, int picture_number) 3904 static int pre_estimate_motion_thread(AVCodecContext *c, void *arg){
3801 { 3905 MpegEncContext *s= arg;
3906
3907
3908 s->me.pre_pass=1;
3909 s->me.dia_size= s->avctx->pre_dia_size;
3910 s->first_slice_line=1;
3911 for(s->mb_y= s->end_mb_y-1; s->mb_y >= s->start_mb_y; s->mb_y--) {
3912 for(s->mb_x=s->mb_width-1; s->mb_x >=0 ;s->mb_x--) {
3913 ff_pre_estimate_p_frame_motion(s, s->mb_x, s->mb_y);
3914 }
3915 s->first_slice_line=0;
3916 }
3917
3918 s->me.pre_pass=0;
3919
3920 return 0;
3921 }
3922
3923 static int estimate_motion_thread(AVCodecContext *c, void *arg){
3924 MpegEncContext *s= arg;
3925
3926 s->me.dia_size= s->avctx->dia_size;
3927 s->first_slice_line=1;
3928 for(s->mb_y= s->start_mb_y; s->mb_y < s->end_mb_y; s->mb_y++) {
3929 s->mb_x=0; //for block init below
3930 ff_init_block_index(s);
3931 for(s->mb_x=0; s->mb_x < s->mb_width; s->mb_x++) {
3932 s->block_index[0]+=2;
3933 s->block_index[1]+=2;
3934 s->block_index[2]+=2;
3935 s->block_index[3]+=2;
3936
3937 /* compute motion vector & mb_type and store in context */
3938 if(s->pict_type==B_TYPE)
3939 ff_estimate_b_frame_motion(s, s->mb_x, s->mb_y);
3940 else
3941 ff_estimate_p_frame_motion(s, s->mb_x, s->mb_y);
3942 }
3943 s->first_slice_line=0;
3944 }
3945 return 0;
3946 }
3947
3948 static void write_slice_end(MpegEncContext *s){
3949 if(s->codec_id==CODEC_ID_MPEG4){
3950 if(s->partitioned_frame){
3951 ff_mpeg4_merge_partitions(s);
3952 }
3953
3954 ff_mpeg4_stuffing(&s->pb);
3955 }else if(s->out_format == FMT_MJPEG){
3956 ff_mjpeg_stuffing(&s->pb);
3957 }
3958
3959 align_put_bits(&s->pb);
3960 flush_put_bits(&s->pb);
3961 }
3962
3963 static int encode_thread(AVCodecContext *c, void *arg){
3964 MpegEncContext *s= arg;
3802 int mb_x, mb_y, pdif = 0; 3965 int mb_x, mb_y, pdif = 0;
3803 int i, j; 3966 int i, j;
3804 int bits;
3805 MpegEncContext best_s, backup_s; 3967 MpegEncContext best_s, backup_s;
3806 uint8_t bit_buf[2][3000]; 3968 uint8_t bit_buf[2][3000];
3807 uint8_t bit_buf2[2][3000]; 3969 uint8_t bit_buf2[2][3000];
3808 uint8_t bit_buf_tex[2][3000]; 3970 uint8_t bit_buf_tex[2][3000];
3809 PutBitContext pb[2], pb2[2], tex_pb[2]; 3971 PutBitContext pb[2], pb2[2], tex_pb[2];
3972 //printf("%d->%d\n", s->resync_mb_y, s->end_mb_y);
3810 3973
3811 for(i=0; i<2; i++){ 3974 for(i=0; i<2; i++){
3812 init_put_bits(&pb [i], bit_buf [i], 3000); 3975 init_put_bits(&pb [i], bit_buf [i], 3000);
3813 init_put_bits(&pb2 [i], bit_buf2 [i], 3000); 3976 init_put_bits(&pb2 [i], bit_buf2 [i], 3000);
3814 init_put_bits(&tex_pb[i], bit_buf_tex[i], 3000); 3977 init_put_bits(&tex_pb[i], bit_buf_tex[i], 3000);
3815 } 3978 }
3816 3979
3817 s->picture_number = picture_number;
3818
3819 /* Reset the average MB variance */
3820 s->current_picture.mb_var_sum = 0;
3821 s->current_picture.mc_mb_var_sum = 0;
3822
3823 #ifdef CONFIG_RISKY
3824 /* we need to initialize some time vars before we can encode b-frames */
3825 // RAL: Condition added for MPEG1VIDEO
3826 if (s->codec_id == CODEC_ID_MPEG1VIDEO || s->codec_id == CODEC_ID_MPEG2VIDEO || (s->h263_pred && !s->h263_msmpeg4))
3827 ff_set_mpeg4_time(s, s->picture_number);
3828 #endif
3829
3830 s->scene_change_score=0;
3831
3832 s->lambda= s->current_picture_ptr->quality; //FIXME qscale / ... stuff for ME ratedistoration
3833
3834 if(s->pict_type==I_TYPE){
3835 if(s->msmpeg4_version >= 3) s->no_rounding=1;
3836 else s->no_rounding=0;
3837 }else if(s->pict_type!=B_TYPE){
3838 if(s->flipflop_rounding || s->codec_id == CODEC_ID_H263P || s->codec_id == CODEC_ID_MPEG4)
3839 s->no_rounding ^= 1;
3840 }
3841
3842 /* Estimate motion for every MB */
3843 s->mb_intra=0; //for the rate distoration & bit compare functions
3844 if(s->pict_type != I_TYPE){
3845 if(s->pict_type != B_TYPE){
3846 if((s->avctx->pre_me && s->last_non_b_pict_type==I_TYPE) || s->avctx->pre_me==2){
3847 s->me.pre_pass=1;
3848 s->me.dia_size= s->avctx->pre_dia_size;
3849
3850 for(mb_y=s->mb_height-1; mb_y >=0 ; mb_y--) {
3851 s->mb_y = mb_y;
3852 for(mb_x=s->mb_width-1; mb_x >=0 ; mb_x--) {
3853 s->mb_x = mb_x;
3854 ff_pre_estimate_p_frame_motion(s, mb_x, mb_y);
3855 }
3856 }
3857 s->me.pre_pass=0;
3858 }
3859 }
3860
3861 s->me.dia_size= s->avctx->dia_size;
3862 for(mb_y=0; mb_y < s->mb_height; mb_y++) {
3863 s->mb_y = mb_y;
3864 s->block_index[0]= s->block_wrap[0]*(mb_y*2 + 1) - 1;
3865 s->block_index[1]= s->block_wrap[0]*(mb_y*2 + 1);
3866 s->block_index[2]= s->block_wrap[0]*(mb_y*2 + 2) - 1;
3867 s->block_index[3]= s->block_wrap[0]*(mb_y*2 + 2);
3868 for(mb_x=0; mb_x < s->mb_width; mb_x++) {
3869 s->mb_x = mb_x;
3870 s->block_index[0]+=2;
3871 s->block_index[1]+=2;
3872 s->block_index[2]+=2;
3873 s->block_index[3]+=2;
3874
3875 /* compute motion vector & mb_type and store in context */
3876 if(s->pict_type==B_TYPE)
3877 ff_estimate_b_frame_motion(s, mb_x, mb_y);
3878 else
3879 ff_estimate_p_frame_motion(s, mb_x, mb_y);
3880 }
3881 }
3882 }else /* if(s->pict_type == I_TYPE) */{
3883 /* I-Frame */
3884 for(i=0; i<s->mb_stride*s->mb_height; i++)
3885 s->mb_type[i]= CANDIDATE_MB_TYPE_INTRA;
3886
3887 if(!s->fixed_qscale){
3888 /* finding spatial complexity for I-frame rate control */
3889 for(mb_y=0; mb_y < s->mb_height; mb_y++) {
3890 for(mb_x=0; mb_x < s->mb_width; mb_x++) {
3891 int xx = mb_x * 16;
3892 int yy = mb_y * 16;
3893 uint8_t *pix = s->new_picture.data[0] + (yy * s->linesize) + xx;
3894 int varc;
3895 int sum = s->dsp.pix_sum(pix, s->linesize);
3896
3897 varc = (s->dsp.pix_norm1(pix, s->linesize) - (((unsigned)(sum*sum))>>8) + 500 + 128)>>8;
3898
3899 s->current_picture.mb_var [s->mb_stride * mb_y + mb_x] = varc;
3900 s->current_picture.mb_mean[s->mb_stride * mb_y + mb_x] = (sum+128)>>8;
3901 s->current_picture.mb_var_sum += varc;
3902 }
3903 }
3904 }
3905 }
3906 emms_c();
3907
3908 if(s->scene_change_score > s->avctx->scenechange_threshold && s->pict_type == P_TYPE){
3909 s->pict_type= I_TYPE;
3910 for(i=0; i<s->mb_stride*s->mb_height; i++)
3911 s->mb_type[i]= CANDIDATE_MB_TYPE_INTRA;
3912 //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 }
3914
3915 if(!s->umvplus){
3916 if(s->pict_type==P_TYPE || s->pict_type==S_TYPE) {
3917 s->f_code= ff_get_best_fcode(s, s->p_mv_table, CANDIDATE_MB_TYPE_INTER);
3918
3919 if(s->flags & CODEC_FLAG_INTERLACED_ME){
3920 int a,b;
3921 a= ff_get_best_fcode(s, s->p_field_mv_table[0][0], CANDIDATE_MB_TYPE_INTER_I); //FIXME field_select
3922 b= ff_get_best_fcode(s, s->p_field_mv_table[1][1], CANDIDATE_MB_TYPE_INTER_I);
3923 s->f_code= FFMAX(s->f_code, FFMAX(a,b));
3924 }
3925
3926 ff_fix_long_p_mvs(s);
3927 ff_fix_long_mvs(s, NULL, 0, s->p_mv_table, s->f_code, CANDIDATE_MB_TYPE_INTER, 0);
3928 if(s->flags & CODEC_FLAG_INTERLACED_ME){
3929 for(i=0; i<2; i++){
3930 for(j=0; j<2; j++)
3931 ff_fix_long_mvs(s, s->p_field_select_table[i], j,
3932 s->p_field_mv_table[i][j], s->f_code, CANDIDATE_MB_TYPE_INTER_I, 0);
3933 }
3934 }
3935 }
3936
3937 if(s->pict_type==B_TYPE){
3938 int a, b;
3939
3940 a = ff_get_best_fcode(s, s->b_forw_mv_table, CANDIDATE_MB_TYPE_FORWARD);
3941 b = ff_get_best_fcode(s, s->b_bidir_forw_mv_table, CANDIDATE_MB_TYPE_BIDIR);
3942 s->f_code = FFMAX(a, b);
3943
3944 a = ff_get_best_fcode(s, s->b_back_mv_table, CANDIDATE_MB_TYPE_BACKWARD);
3945 b = ff_get_best_fcode(s, s->b_bidir_back_mv_table, CANDIDATE_MB_TYPE_BIDIR);
3946 s->b_code = FFMAX(a, b);
3947
3948 ff_fix_long_mvs(s, NULL, 0, s->b_forw_mv_table, s->f_code, CANDIDATE_MB_TYPE_FORWARD, 1);
3949 ff_fix_long_mvs(s, NULL, 0, s->b_back_mv_table, s->b_code, CANDIDATE_MB_TYPE_BACKWARD, 1);
3950 ff_fix_long_mvs(s, NULL, 0, s->b_bidir_forw_mv_table, s->f_code, CANDIDATE_MB_TYPE_BIDIR, 1);
3951 ff_fix_long_mvs(s, NULL, 0, s->b_bidir_back_mv_table, s->b_code, CANDIDATE_MB_TYPE_BIDIR, 1);
3952 if(s->flags & CODEC_FLAG_INTERLACED_ME){
3953 int dir;
3954 for(dir=0; dir<2; dir++){
3955 for(i=0; i<2; i++){
3956 for(j=0; j<2; j++){
3957 int type= dir ? (CANDIDATE_MB_TYPE_BACKWARD_I|CANDIDATE_MB_TYPE_BIDIR_I)
3958 : (CANDIDATE_MB_TYPE_FORWARD_I |CANDIDATE_MB_TYPE_BIDIR_I);
3959 ff_fix_long_mvs(s, s->b_field_select_table[dir][i], j,
3960 s->b_field_mv_table[dir][i][j], dir ? s->b_code : s->f_code, type, 1);
3961 }
3962 }
3963 }
3964 }
3965 }
3966 }
3967
3968 if (!s->fixed_qscale)
3969 s->current_picture.quality = ff_rate_estimate_qscale(s);
3970
3971 if(s->adaptive_quant){
3972 #ifdef CONFIG_RISKY
3973 switch(s->codec_id){
3974 case CODEC_ID_MPEG4:
3975 ff_clean_mpeg4_qscales(s);
3976 break;
3977 case CODEC_ID_H263:
3978 case CODEC_ID_H263P:
3979 case CODEC_ID_FLV1:
3980 ff_clean_h263_qscales(s);
3981 break;
3982 }
3983 #endif
3984
3985 s->lambda= s->lambda_table[0];
3986 //FIXME broken
3987 }else
3988 s->lambda= s->current_picture.quality;
3989 //printf("%d %d\n", s->avctx->global_quality, s->current_picture.quality);
3990 update_qscale(s);
3991
3992 if(s->qscale < 3 && s->max_qcoeff<=128 && s->pict_type==I_TYPE && !(s->flags & CODEC_FLAG_QSCALE))
3993 s->qscale= 3; //reduce cliping problems
3994
3995 if (s->out_format == FMT_MJPEG) {
3996 /* for mjpeg, we do include qscale in the matrix */
3997 s->intra_matrix[0] = ff_mpeg1_default_intra_matrix[0];
3998 for(i=1;i<64;i++){
3999 int j= s->dsp.idct_permutation[i];
4000
4001 s->intra_matrix[j] = CLAMP_TO_8BIT((ff_mpeg1_default_intra_matrix[i] * s->qscale) >> 3);
4002 }
4003 convert_matrix(&s->dsp, s->q_intra_matrix, s->q_intra_matrix16,
4004 s->intra_matrix, s->intra_quant_bias, 8, 8);
4005 s->qscale= 8;
4006 }
4007
4008 //FIXME var duplication
4009 s->current_picture.key_frame= s->pict_type == I_TYPE;
4010 s->current_picture.pict_type= s->pict_type;
4011
4012 if(s->current_picture.key_frame)
4013 s->picture_in_gop_number=0;
4014
4015 s->last_bits= put_bits_count(&s->pb); 3980 s->last_bits= put_bits_count(&s->pb);
4016 switch(s->out_format) {
4017 case FMT_MJPEG:
4018 mjpeg_picture_header(s);
4019 break;
4020 #ifdef CONFIG_RISKY
4021 case FMT_H263:
4022 if (s->codec_id == CODEC_ID_WMV2)
4023 ff_wmv2_encode_picture_header(s, picture_number);
4024 else if (s->h263_msmpeg4)
4025 msmpeg4_encode_picture_header(s, picture_number);
4026 else if (s->h263_pred)
4027 mpeg4_encode_picture_header(s, picture_number);
4028 else if (s->codec_id == CODEC_ID_RV10)
4029 rv10_encode_picture_header(s, picture_number);
4030 else if (s->codec_id == CODEC_ID_FLV1)
4031 ff_flv_encode_picture_header(s, picture_number);
4032 else
4033 h263_encode_picture_header(s, picture_number);
4034 break;
4035 #endif
4036 case FMT_MPEG1:
4037 mpeg1_encode_picture_header(s, picture_number);
4038 break;
4039 case FMT_H264:
4040 break;
4041 default:
4042 assert(0);
4043 }
4044 bits= put_bits_count(&s->pb);
4045 s->header_bits= bits - s->last_bits;
4046 s->last_bits= bits;
4047 s->mv_bits=0; 3981 s->mv_bits=0;
4048 s->misc_bits=0; 3982 s->misc_bits=0;
4049 s->i_tex_bits=0; 3983 s->i_tex_bits=0;
4050 s->p_tex_bits=0; 3984 s->p_tex_bits=0;
4051 s->i_count=0; 3985 s->i_count=0;
4078 break; 4012 break;
4079 } 4013 }
4080 #endif 4014 #endif
4081 4015
4082 s->resync_mb_x=0; 4016 s->resync_mb_x=0;
4083 s->resync_mb_y=0; 4017 s->resync_mb_y=0;
4084 s->first_slice_line = 1; 4018 s->first_slice_line = 1;
4085 s->ptr_lastgob = s->pb.buf; 4019 s->ptr_lastgob = s->pb.buf;
4086 for(mb_y=0; mb_y < s->mb_height; mb_y++) { 4020 for(mb_y= s->start_mb_y; mb_y < s->end_mb_y; mb_y++) {
4021 // printf("row %d at %X\n", s->mb_y, (int)s);
4087 s->mb_x=0; 4022 s->mb_x=0;
4088 s->mb_y= mb_y; 4023 s->mb_y= mb_y;
4089 4024
4090 ff_set_qscale(s, s->qscale); 4025 ff_set_qscale(s, s->qscale);
4091 ff_init_block_index(s); 4026 ff_init_block_index(s);
4103 /* write gob / video packet header */ 4038 /* write gob / video packet header */
4104 #ifdef CONFIG_RISKY 4039 #ifdef CONFIG_RISKY
4105 if(s->rtp_mode){ 4040 if(s->rtp_mode){
4106 int current_packet_size, is_gob_start; 4041 int current_packet_size, is_gob_start;
4107 4042
4108 current_packet_size= pbBufPtr(&s->pb) - s->ptr_lastgob; 4043 current_packet_size= pbBufPtr(&s->pb) - s->ptr_lastgob; //FIXME wrong
4109 4044
4110 is_gob_start= s->avctx->rtp_payload_size && current_packet_size >= s->avctx->rtp_payload_size && mb_y + mb_x>0; 4045 is_gob_start= s->avctx->rtp_payload_size && current_packet_size >= s->avctx->rtp_payload_size && mb_y + mb_x>0;
4046
4047 if(s->start_mb_y == mb_y && mb_y > 0 && mb_x==0) is_gob_start=1;
4111 4048
4112 switch(s->codec_id){ 4049 switch(s->codec_id){
4113 case CODEC_ID_H263: 4050 case CODEC_ID_H263:
4114 case CODEC_ID_H263P: 4051 case CODEC_ID_H263P:
4115 if(!s->h263_slice_structured) 4052 if(!s->h263_slice_structured)
4119 if(s->mb_x==0 && s->mb_y!=0) is_gob_start=1; 4056 if(s->mb_x==0 && s->mb_y!=0) is_gob_start=1;
4120 case CODEC_ID_MPEG1VIDEO: 4057 case CODEC_ID_MPEG1VIDEO:
4121 if(s->mb_skip_run) is_gob_start=0; 4058 if(s->mb_skip_run) is_gob_start=0;
4122 break; 4059 break;
4123 } 4060 }
4124 4061
4125 if(is_gob_start){ 4062 if(is_gob_start){
4126 if(s->codec_id==CODEC_ID_MPEG4 && s->partitioned_frame){ 4063 if(s->start_mb_y != mb_y || mb_x!=0){
4127 ff_mpeg4_merge_partitions(s); 4064 write_slice_end(s);
4128 ff_mpeg4_init_partitions(s); 4065
4066 if(s->codec_id==CODEC_ID_MPEG4 && s->partitioned_frame){
4067 ff_mpeg4_init_partitions(s);
4068 }
4129 } 4069 }
4130 4070
4131 if(s->codec_id==CODEC_ID_MPEG4)
4132 ff_mpeg4_stuffing(&s->pb);
4133
4134 align_put_bits(&s->pb);
4135 flush_put_bits(&s->pb);
4136
4137 assert((put_bits_count(&s->pb)&7) == 0); 4071 assert((put_bits_count(&s->pb)&7) == 0);
4138 current_packet_size= pbBufPtr(&s->pb) - s->ptr_lastgob; 4072 current_packet_size= pbBufPtr(&s->pb) - s->ptr_lastgob;
4139 4073
4140 if(s->avctx->error_rate && s->resync_mb_x + s->resync_mb_y > 0){ 4074 if(s->avctx->error_rate && s->resync_mb_x + s->resync_mb_y > 0){
4141 int r= put_bits_count(&s->pb)/8 + s->picture_number + s->codec_id + s->mb_x + s->mb_y; 4075 int r= put_bits_count(&s->pb)/8 + s->picture_number + s->codec_id + s->mb_x + s->mb_y;
4415 #ifdef CONFIG_RISKY 4349 #ifdef CONFIG_RISKY
4416 if (s->out_format == FMT_H263 && s->pict_type!=B_TYPE) 4350 if (s->out_format == FMT_H263 && s->pict_type!=B_TYPE)
4417 ff_h263_update_motion_val(s); 4351 ff_h263_update_motion_val(s);
4418 #endif 4352 #endif
4419 4353
4420 if(next_block==0){ 4354 if(next_block==0){ //FIXME 16 vs linesize16
4421 s->dsp.put_pixels_tab[0][0](s->dest[0], s->me.scratchpad , s->linesize ,16); 4355 s->dsp.put_pixels_tab[0][0](s->dest[0], s->rd_scratchpad , s->linesize ,16);
4422 s->dsp.put_pixels_tab[1][0](s->dest[1], s->me.scratchpad + 16, s->uvlinesize, 8); 4356 s->dsp.put_pixels_tab[1][0](s->dest[1], s->rd_scratchpad + 16*s->linesize , s->uvlinesize, 8);
4423 s->dsp.put_pixels_tab[1][0](s->dest[2], s->me.scratchpad + 24, s->uvlinesize, 8); 4357 s->dsp.put_pixels_tab[1][0](s->dest[2], s->rd_scratchpad + 16*s->linesize + 8, s->uvlinesize, 8);
4424 } 4358 }
4425 4359
4426 if(s->avctx->mb_decision == FF_MB_DECISION_BITS) 4360 if(s->avctx->mb_decision == FF_MB_DECISION_BITS)
4427 MPV_decode_mb(s, s->block); 4361 MPV_decode_mb(s, s->block);
4428 } else { 4362 } else {
4575 if(s->loop_filter) 4509 if(s->loop_filter)
4576 ff_h263_loop_filter(s); 4510 ff_h263_loop_filter(s);
4577 //printf("MB %d %d bits\n", s->mb_x+s->mb_y*s->mb_stride, put_bits_count(&s->pb)); 4511 //printf("MB %d %d bits\n", s->mb_x+s->mb_y*s->mb_stride, put_bits_count(&s->pb));
4578 } 4512 }
4579 } 4513 }
4580 emms_c();
4581 4514
4582 #ifdef CONFIG_RISKY 4515 #ifdef CONFIG_RISKY
4583 if(s->codec_id==CODEC_ID_MPEG4 && s->partitioned_frame) 4516 //not beautifull here but we must write it before flushing so it has to be here
4584 ff_mpeg4_merge_partitions(s);
4585
4586 if (s->msmpeg4_version && s->msmpeg4_version<4 && s->pict_type == I_TYPE) 4517 if (s->msmpeg4_version && s->msmpeg4_version<4 && s->pict_type == I_TYPE)
4587 msmpeg4_encode_ext_header(s); 4518 msmpeg4_encode_ext_header(s);
4588
4589 if(s->codec_id==CODEC_ID_MPEG4)
4590 ff_mpeg4_stuffing(&s->pb);
4591 #endif 4519 #endif
4520
4521 write_slice_end(s);
4592 4522
4593 /* Send the last GOB if RTP */ 4523 /* Send the last GOB if RTP */
4594 if (s->avctx->rtp_callback) { 4524 if (s->avctx->rtp_callback) {
4595 flush_put_bits(&s->pb);
4596 pdif = pbBufPtr(&s->pb) - s->ptr_lastgob; 4525 pdif = pbBufPtr(&s->pb) - s->ptr_lastgob;
4597 /* Call the RTP callback to send the last GOB */ 4526 /* Call the RTP callback to send the last GOB */
4527 emms_c();
4598 s->avctx->rtp_callback(s->ptr_lastgob, pdif, 0); 4528 s->avctx->rtp_callback(s->ptr_lastgob, pdif, 0);
4599 } 4529 }
4530
4531 return 0;
4532 }
4533
4534 #define MERGE(field) dst->field += src->field; src->field=0
4535 static void merge_context_after_me(MpegEncContext *dst, MpegEncContext *src){
4536 MERGE(scene_change_score);
4537 MERGE(mc_mb_var_sum_temp);
4538 MERGE(mb_var_sum_temp);
4539 }
4540
4541 static void merge_context_after_encode(MpegEncContext *dst, MpegEncContext *src){
4542 int i;
4543
4544 MERGE(dct_count[0]); //note, the other dct vars are not part of the context
4545 MERGE(dct_count[1]);
4546 MERGE(mv_bits);
4547 MERGE(header_bits);
4548 MERGE(i_tex_bits);
4549 MERGE(p_tex_bits);
4550 MERGE(i_count);
4551 MERGE(f_count);
4552 MERGE(b_count);
4553 MERGE(skip_count);
4554 MERGE(misc_bits);
4555 MERGE(error_count);
4556 MERGE(padding_bug_score);
4557
4558 if(dst->avctx->noise_reduction){
4559 for(i=0; i<64; i++){
4560 MERGE(dct_error_sum[0][i]);
4561 MERGE(dct_error_sum[1][i]);
4562 }
4563 }
4564
4565 assert(put_bits_count(&src->pb) % 8 ==0);
4566 assert(put_bits_count(&dst->pb) % 8 ==0);
4567 ff_copy_bits(&dst->pb, src->pb.buf, put_bits_count(&src->pb));
4568 flush_put_bits(&dst->pb);
4569 }
4570
4571 static void encode_picture(MpegEncContext *s, int picture_number)
4572 {
4573 int mb_x, mb_y;
4574 int i, j;
4575 int bits;
4576
4577 s->picture_number = picture_number;
4578
4579 /* Reset the average MB variance */
4580 s->mb_var_sum_temp =
4581 s->mc_mb_var_sum_temp = 0;
4582
4583 #ifdef CONFIG_RISKY
4584 /* we need to initialize some time vars before we can encode b-frames */
4585 // RAL: Condition added for MPEG1VIDEO
4586 if (s->codec_id == CODEC_ID_MPEG1VIDEO || s->codec_id == CODEC_ID_MPEG2VIDEO || (s->h263_pred && !s->h263_msmpeg4))
4587 ff_set_mpeg4_time(s, s->picture_number);
4588 #endif
4589
4590 s->scene_change_score=0;
4591
4592 s->lambda= s->current_picture_ptr->quality; //FIXME qscale / ... stuff for ME ratedistoration
4593
4594 if(s->pict_type==I_TYPE){
4595 if(s->msmpeg4_version >= 3) s->no_rounding=1;
4596 else s->no_rounding=0;
4597 }else if(s->pict_type!=B_TYPE){
4598 if(s->flipflop_rounding || s->codec_id == CODEC_ID_H263P || s->codec_id == CODEC_ID_MPEG4)
4599 s->no_rounding ^= 1;
4600 }
4601
4602 s->mb_intra=0; //for the rate distoration & bit compare functions
4603 for(i=1; i<s->avctx->thread_count; i++){
4604 update_duplicate_context(s->thread_context[i], s);
4605 }
4606
4607 /* Estimate motion for every MB */
4608 if(s->pict_type != I_TYPE){
4609 if(s->pict_type != B_TYPE){
4610 if((s->avctx->pre_me && s->last_non_b_pict_type==I_TYPE) || s->avctx->pre_me==2){
4611 s->avctx->execute(s->avctx, pre_estimate_motion_thread, (void**)&(s->thread_context[0]), NULL, s->avctx->thread_count);
4612 }
4613 }
4614
4615 s->avctx->execute(s->avctx, estimate_motion_thread, (void**)&(s->thread_context[0]), NULL, s->avctx->thread_count);
4616 for(i=1; i<s->avctx->thread_count; i++){
4617 merge_context_after_me(s, s->thread_context[i]);
4618 }
4619 }else /* if(s->pict_type == I_TYPE) */{
4620 /* I-Frame */
4621 for(i=0; i<s->mb_stride*s->mb_height; i++)
4622 s->mb_type[i]= CANDIDATE_MB_TYPE_INTRA;
4623
4624 if(!s->fixed_qscale){
4625 /* finding spatial complexity for I-frame rate control */
4626 for(mb_y=0; mb_y < s->mb_height; mb_y++) {
4627 for(mb_x=0; mb_x < s->mb_width; mb_x++) {
4628 int xx = mb_x * 16;
4629 int yy = mb_y * 16;
4630 uint8_t *pix = s->new_picture.data[0] + (yy * s->linesize) + xx;
4631 int varc;
4632 int sum = s->dsp.pix_sum(pix, s->linesize);
4633
4634 varc = (s->dsp.pix_norm1(pix, s->linesize) - (((unsigned)(sum*sum))>>8) + 500 + 128)>>8;
4635
4636 s->current_picture.mb_var [s->mb_stride * mb_y + mb_x] = varc;
4637 s->current_picture.mb_mean[s->mb_stride * mb_y + mb_x] = (sum+128)>>8;
4638 s->mb_var_sum_temp += varc;
4639 }
4640 }
4641 }
4642 }
4643 s->current_picture.mc_mb_var_sum= s->current_picture_ptr->mc_mb_var_sum= s->mc_mb_var_sum_temp;
4644 s->current_picture. mb_var_sum= s->current_picture_ptr-> mb_var_sum= s-> mb_var_sum_temp;
4645 emms_c();
4646
4647 if(s->scene_change_score > s->avctx->scenechange_threshold && s->pict_type == P_TYPE){
4648 s->pict_type= I_TYPE;
4649 for(i=0; i<s->mb_stride*s->mb_height; i++)
4650 s->mb_type[i]= CANDIDATE_MB_TYPE_INTRA;
4651 //printf("Scene change detected, encoding as I Frame %d %d\n", s->current_picture.mb_var_sum, s->current_picture.mc_mb_var_sum);
4652 }
4653
4654 if(!s->umvplus){
4655 if(s->pict_type==P_TYPE || s->pict_type==S_TYPE) {
4656 s->f_code= ff_get_best_fcode(s, s->p_mv_table, CANDIDATE_MB_TYPE_INTER);
4657
4658 if(s->flags & CODEC_FLAG_INTERLACED_ME){
4659 int a,b;
4660 a= ff_get_best_fcode(s, s->p_field_mv_table[0][0], CANDIDATE_MB_TYPE_INTER_I); //FIXME field_select
4661 b= ff_get_best_fcode(s, s->p_field_mv_table[1][1], CANDIDATE_MB_TYPE_INTER_I);
4662 s->f_code= FFMAX(s->f_code, FFMAX(a,b));
4663 }
4664
4665 ff_fix_long_p_mvs(s);
4666 ff_fix_long_mvs(s, NULL, 0, s->p_mv_table, s->f_code, CANDIDATE_MB_TYPE_INTER, 0);
4667 if(s->flags & CODEC_FLAG_INTERLACED_ME){
4668 for(i=0; i<2; i++){
4669 for(j=0; j<2; j++)
4670 ff_fix_long_mvs(s, s->p_field_select_table[i], j,
4671 s->p_field_mv_table[i][j], s->f_code, CANDIDATE_MB_TYPE_INTER_I, 0);
4672 }
4673 }
4674 }
4675
4676 if(s->pict_type==B_TYPE){
4677 int a, b;
4678
4679 a = ff_get_best_fcode(s, s->b_forw_mv_table, CANDIDATE_MB_TYPE_FORWARD);
4680 b = ff_get_best_fcode(s, s->b_bidir_forw_mv_table, CANDIDATE_MB_TYPE_BIDIR);
4681 s->f_code = FFMAX(a, b);
4682
4683 a = ff_get_best_fcode(s, s->b_back_mv_table, CANDIDATE_MB_TYPE_BACKWARD);
4684 b = ff_get_best_fcode(s, s->b_bidir_back_mv_table, CANDIDATE_MB_TYPE_BIDIR);
4685 s->b_code = FFMAX(a, b);
4686
4687 ff_fix_long_mvs(s, NULL, 0, s->b_forw_mv_table, s->f_code, CANDIDATE_MB_TYPE_FORWARD, 1);
4688 ff_fix_long_mvs(s, NULL, 0, s->b_back_mv_table, s->b_code, CANDIDATE_MB_TYPE_BACKWARD, 1);
4689 ff_fix_long_mvs(s, NULL, 0, s->b_bidir_forw_mv_table, s->f_code, CANDIDATE_MB_TYPE_BIDIR, 1);
4690 ff_fix_long_mvs(s, NULL, 0, s->b_bidir_back_mv_table, s->b_code, CANDIDATE_MB_TYPE_BIDIR, 1);
4691 if(s->flags & CODEC_FLAG_INTERLACED_ME){
4692 int dir;
4693 for(dir=0; dir<2; dir++){
4694 for(i=0; i<2; i++){
4695 for(j=0; j<2; j++){
4696 int type= dir ? (CANDIDATE_MB_TYPE_BACKWARD_I|CANDIDATE_MB_TYPE_BIDIR_I)
4697 : (CANDIDATE_MB_TYPE_FORWARD_I |CANDIDATE_MB_TYPE_BIDIR_I);
4698 ff_fix_long_mvs(s, s->b_field_select_table[dir][i], j,
4699 s->b_field_mv_table[dir][i][j], dir ? s->b_code : s->f_code, type, 1);
4700 }
4701 }
4702 }
4703 }
4704 }
4705 }
4706
4707 if (!s->fixed_qscale)
4708 s->current_picture.quality = ff_rate_estimate_qscale(s); //FIXME pic_ptr
4709
4710 if(s->adaptive_quant){
4711 #ifdef CONFIG_RISKY
4712 switch(s->codec_id){
4713 case CODEC_ID_MPEG4:
4714 ff_clean_mpeg4_qscales(s);
4715 break;
4716 case CODEC_ID_H263:
4717 case CODEC_ID_H263P:
4718 case CODEC_ID_FLV1:
4719 ff_clean_h263_qscales(s);
4720 break;
4721 }
4722 #endif
4723
4724 s->lambda= s->lambda_table[0];
4725 //FIXME broken
4726 }else
4727 s->lambda= s->current_picture.quality;
4728 //printf("%d %d\n", s->avctx->global_quality, s->current_picture.quality);
4729 update_qscale(s);
4730
4731 if(s->qscale < 3 && s->max_qcoeff<=128 && s->pict_type==I_TYPE && !(s->flags & CODEC_FLAG_QSCALE))
4732 s->qscale= 3; //reduce cliping problems
4733
4734 if (s->out_format == FMT_MJPEG) {
4735 /* for mjpeg, we do include qscale in the matrix */
4736 s->intra_matrix[0] = ff_mpeg1_default_intra_matrix[0];
4737 for(i=1;i<64;i++){
4738 int j= s->dsp.idct_permutation[i];
4739
4740 s->intra_matrix[j] = CLAMP_TO_8BIT((ff_mpeg1_default_intra_matrix[i] * s->qscale) >> 3);
4741 }
4742 convert_matrix(&s->dsp, s->q_intra_matrix, s->q_intra_matrix16,
4743 s->intra_matrix, s->intra_quant_bias, 8, 8);
4744 s->qscale= 8;
4745 }
4746
4747 //FIXME var duplication
4748 s->current_picture.key_frame= s->pict_type == I_TYPE; //FIXME pic_ptr
4749 s->current_picture.pict_type= s->pict_type;
4750
4751 if(s->current_picture.key_frame)
4752 s->picture_in_gop_number=0;
4753
4754 s->last_bits= put_bits_count(&s->pb);
4755 switch(s->out_format) {
4756 case FMT_MJPEG:
4757 mjpeg_picture_header(s);
4758 break;
4759 #ifdef CONFIG_RISKY
4760 case FMT_H263:
4761 if (s->codec_id == CODEC_ID_WMV2)
4762 ff_wmv2_encode_picture_header(s, picture_number);
4763 else if (s->h263_msmpeg4)
4764 msmpeg4_encode_picture_header(s, picture_number);
4765 else if (s->h263_pred)
4766 mpeg4_encode_picture_header(s, picture_number);
4767 else if (s->codec_id == CODEC_ID_RV10)
4768 rv10_encode_picture_header(s, picture_number);
4769 else if (s->codec_id == CODEC_ID_FLV1)
4770 ff_flv_encode_picture_header(s, picture_number);
4771 else
4772 h263_encode_picture_header(s, picture_number);
4773 break;
4774 #endif
4775 case FMT_MPEG1:
4776 mpeg1_encode_picture_header(s, picture_number);
4777 break;
4778 case FMT_H264:
4779 break;
4780 default:
4781 assert(0);
4782 }
4783 bits= put_bits_count(&s->pb);
4784 s->header_bits= bits - s->last_bits;
4785
4786 for(i=1; i<s->avctx->thread_count; i++){
4787 update_duplicate_context_after_me(s->thread_context[i], s);
4788 }
4789 s->avctx->execute(s->avctx, encode_thread, (void**)&(s->thread_context[0]), NULL, s->avctx->thread_count);
4790 for(i=1; i<s->avctx->thread_count; i++){
4791 merge_context_after_encode(s, s->thread_context[i]);
4792 }
4793 emms_c();
4600 } 4794 }
4601 4795
4602 #endif //CONFIG_ENCODERS 4796 #endif //CONFIG_ENCODERS
4603 4797
4604 static void denoise_dct_c(MpegEncContext *s, DCTELEM *block){ 4798 static void denoise_dct_c(MpegEncContext *s, DCTELEM *block){