Mercurial > libavcodec.hg
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){ |