comparison mpegvideo.c @ 1644:835cf346975e libavcodec

h263 loop filter fixed h263 modified quantization CODEC_FLAG_OBMC
author michael
date Mon, 01 Dec 2003 15:23:14 +0000
parents 0226cad80fc2
children ccf7c96a630f
comparison
equal deleted inserted replaced
1643:9bb07bd315d9 1644:835cf346975e
84 }; 84 };
85 85
86 static const uint8_t h263_chroma_roundtab[16] = { 86 static const uint8_t h263_chroma_roundtab[16] = {
87 // 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 87 // 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15
88 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 2, 2, 88 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 2, 2,
89 };
90
91 static const uint8_t ff_default_chroma_qscale_table[32]={
92 // 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31
93 0, 1, 2, 3, 4, 5, 6, 7, 8, 9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31
89 }; 94 };
90 95
91 #ifdef CONFIG_ENCODERS 96 #ifdef CONFIG_ENCODERS
92 static uint8_t (*default_mv_penalty)[MAX_MV*2+1]=NULL; 97 static uint8_t (*default_mv_penalty)[MAX_MV*2+1]=NULL;
93 static uint8_t default_fcode_tab[MAX_MV*2+1]; 98 static uint8_t default_fcode_tab[MAX_MV*2+1];
382 s->block_wrap[2]= 387 s->block_wrap[2]=
383 s->block_wrap[3]= s->mb_width*2 + 2; 388 s->block_wrap[3]= s->mb_width*2 + 2;
384 s->block_wrap[4]= 389 s->block_wrap[4]=
385 s->block_wrap[5]= s->mb_width + 2; 390 s->block_wrap[5]= s->mb_width + 2;
386 391
392 s->y_dc_scale_table=
393 s->c_dc_scale_table= ff_mpeg1_dc_scale_table;
394 s->chroma_qscale_table= ff_default_chroma_qscale_table;
395
387 y_size = (2 * s->mb_width + 2) * (2 * s->mb_height + 2); 396 y_size = (2 * s->mb_width + 2) * (2 * s->mb_height + 2);
388 c_size = (s->mb_width + 2) * (s->mb_height + 2); 397 c_size = (s->mb_width + 2) * (s->mb_height + 2);
389 yc_size = y_size + 2 * c_size; 398 yc_size = y_size + 2 * c_size;
390 399
391 /* convert fourcc to upper case */ 400 /* convert fourcc to upper case */
666 || (s->flags&CODEC_FLAG_QP_RD)) 675 || (s->flags&CODEC_FLAG_QP_RD))
667 && !s->fixed_qscale; 676 && !s->fixed_qscale;
668 677
669 s->progressive_sequence= !(avctx->flags & CODEC_FLAG_INTERLACED_DCT); 678 s->progressive_sequence= !(avctx->flags & CODEC_FLAG_INTERLACED_DCT);
670 679
671 s->obmc= (s->codec_id == CODEC_ID_H263 || s->codec_id == CODEC_ID_H263P) 680 s->obmc= (s->flags & CODEC_FLAG_OBMC);
672 && (s->flags & CODEC_FLAG_4MV); 681 s->loop_filter= (s->flags & CODEC_FLAG_LOOP_FILTER);
673 682
674 if((s->flags & CODEC_FLAG_4MV) && s->codec_id != CODEC_ID_MPEG4 683 if((s->flags & CODEC_FLAG_4MV) && s->codec_id != CODEC_ID_MPEG4
675 && s->codec_id != CODEC_ID_H263 && s->codec_id != CODEC_ID_H263P){ 684 && s->codec_id != CODEC_ID_H263 && s->codec_id != CODEC_ID_H263P){
676 av_log(avctx, AV_LOG_ERROR, "4MV not supported by codec\n"); 685 av_log(avctx, AV_LOG_ERROR, "4MV not supported by codec\n");
677 return -1; 686 return -1;
678 } 687 }
679 688
680 if(s->obmc && s->avctx->mb_decision != FF_MB_DECISION_SIMPLE){ 689 if(s->obmc && s->avctx->mb_decision != FF_MB_DECISION_SIMPLE){
681 av_log(avctx, AV_LOG_ERROR, "OBMC is only supported with simple mb decission\n"); 690 av_log(avctx, AV_LOG_ERROR, "OBMC is only supported with simple mb decission\n");
691 return -1;
692 }
693
694 if(s->obmc && s->codec_id != CODEC_ID_H263 && s->codec_id != CODEC_ID_H263P){
695 av_log(avctx, AV_LOG_ERROR, "OBMC is only supported with H263(+)\n");
682 return -1; 696 return -1;
683 } 697 }
684 698
685 if(s->quarter_sample && s->codec_id != CODEC_ID_MPEG4){ 699 if(s->quarter_sample && s->codec_id != CODEC_ID_MPEG4){
686 av_log(avctx, AV_LOG_ERROR, "qpel not supported by codec\n"); 700 av_log(avctx, AV_LOG_ERROR, "qpel not supported by codec\n");
768 if (h263_get_picture_format(s->width, s->height) == 7) { 782 if (h263_get_picture_format(s->width, s->height) == 7) {
769 av_log(avctx, AV_LOG_INFO, "Input picture size isn't suitable for h263 codec! try h263+\n"); 783 av_log(avctx, AV_LOG_INFO, "Input picture size isn't suitable for h263 codec! try h263+\n");
770 return -1; 784 return -1;
771 } 785 }
772 s->out_format = FMT_H263; 786 s->out_format = FMT_H263;
787 s->obmc= (avctx->flags & CODEC_FLAG_OBMC) ? 1:0;
773 avctx->delay=0; 788 avctx->delay=0;
774 s->low_delay=1; 789 s->low_delay=1;
775 break; 790 break;
776 case CODEC_ID_H263P: 791 case CODEC_ID_H263P:
777 s->out_format = FMT_H263; 792 s->out_format = FMT_H263;
778 s->h263_plus = 1; 793 s->h263_plus = 1;
779 /* Fx */ 794 /* Fx */
780 s->unrestricted_mv=(avctx->flags & CODEC_FLAG_H263P_UMV) ? 1:0; 795 s->umvplus = (avctx->flags & CODEC_FLAG_H263P_UMV) ? 1:0;
781 s->h263_aic= (avctx->flags & CODEC_FLAG_H263P_AIC) ? 1:0; 796 s->h263_aic= (avctx->flags & CODEC_FLAG_H263P_AIC) ? 1:0;
797 s->modified_quant= s->h263_aic;
782 s->alt_inter_vlc= (avctx->flags & CODEC_FLAG_H263P_AIV) ? 1:0; 798 s->alt_inter_vlc= (avctx->flags & CODEC_FLAG_H263P_AIV) ? 1:0;
799 s->obmc= (avctx->flags & CODEC_FLAG_OBMC) ? 1:0;
800 s->loop_filter= (avctx->flags & CODEC_FLAG_LOOP_FILTER) ? 1:0;
801 s->unrestricted_mv= s->obmc || s->loop_filter || s->umvplus;
802 if(s->modified_quant)
803 s->chroma_qscale_table= ff_h263_chroma_qscale_table;
804
783 /* /Fx */ 805 /* /Fx */
784 /* These are just to be sure */ 806 /* These are just to be sure */
785 s->umvplus = 1;
786 avctx->delay=0; 807 avctx->delay=0;
787 s->low_delay=1; 808 s->low_delay=1;
788 break; 809 break;
789 case CODEC_ID_FLV1: 810 case CODEC_ID_FLV1:
790 s->out_format = FMT_H263; 811 s->out_format = FMT_H263;
874 } 895 }
875 } 896 }
876 } 897 }
877 s->me.mv_penalty= default_mv_penalty; 898 s->me.mv_penalty= default_mv_penalty;
878 s->fcode_tab= default_fcode_tab; 899 s->fcode_tab= default_fcode_tab;
879 s->y_dc_scale_table=
880 s->c_dc_scale_table= ff_mpeg1_dc_scale_table;
881 900
882 /* dont use mv_penalty table for crap MV as it would be confused */ 901 /* dont use mv_penalty table for crap MV as it would be confused */
883 //FIXME remove after fixing / removing old ME 902 //FIXME remove after fixing / removing old ME
884 if (s->me_method < ME_EPZS) s->me.mv_penalty = default_mv_penalty; 903 if (s->me_method < ME_EPZS) s->me.mv_penalty = default_mv_penalty;
885 904
2646 s->dsp.idct_add (dest, line_size, block); 2665 s->dsp.idct_add (dest, line_size, block);
2647 } 2666 }
2648 } 2667 }
2649 2668
2650 static inline void add_dequant_dct(MpegEncContext *s, 2669 static inline void add_dequant_dct(MpegEncContext *s,
2651 DCTELEM *block, int i, uint8_t *dest, int line_size) 2670 DCTELEM *block, int i, uint8_t *dest, int line_size, int qscale)
2652 { 2671 {
2653 if (s->block_last_index[i] >= 0) { 2672 if (s->block_last_index[i] >= 0) {
2654 s->dct_unquantize(s, block, i, s->qscale); 2673 s->dct_unquantize(s, block, i, qscale);
2655 2674
2656 s->dsp.idct_add (dest, line_size, block); 2675 s->dsp.idct_add (dest, line_size, block);
2657 } 2676 }
2658 } 2677 }
2659 2678
2808 if(s->hurry_up>1) return; 2827 if(s->hurry_up>1) return;
2809 2828
2810 /* add dct residue */ 2829 /* add dct residue */
2811 if(s->encoding || !( s->h263_msmpeg4 || s->codec_id==CODEC_ID_MPEG1VIDEO || s->codec_id==CODEC_ID_MPEG2VIDEO 2830 if(s->encoding || !( s->h263_msmpeg4 || s->codec_id==CODEC_ID_MPEG1VIDEO || s->codec_id==CODEC_ID_MPEG2VIDEO
2812 || (s->codec_id==CODEC_ID_MPEG4 && !s->mpeg_quant))){ 2831 || (s->codec_id==CODEC_ID_MPEG4 && !s->mpeg_quant))){
2813 add_dequant_dct(s, block[0], 0, dest_y, dct_linesize); 2832 add_dequant_dct(s, block[0], 0, dest_y, dct_linesize, s->qscale);
2814 add_dequant_dct(s, block[1], 1, dest_y + 8, dct_linesize); 2833 add_dequant_dct(s, block[1], 1, dest_y + 8, dct_linesize, s->qscale);
2815 add_dequant_dct(s, block[2], 2, dest_y + dct_offset, dct_linesize); 2834 add_dequant_dct(s, block[2], 2, dest_y + dct_offset, dct_linesize, s->qscale);
2816 add_dequant_dct(s, block[3], 3, dest_y + dct_offset + 8, dct_linesize); 2835 add_dequant_dct(s, block[3], 3, dest_y + dct_offset + 8, dct_linesize, s->qscale);
2817 2836
2818 if(!(s->flags&CODEC_FLAG_GRAY)){ 2837 if(!(s->flags&CODEC_FLAG_GRAY)){
2819 add_dequant_dct(s, block[4], 4, dest_cb, uvlinesize); 2838 add_dequant_dct(s, block[4], 4, dest_cb, uvlinesize, s->chroma_qscale);
2820 add_dequant_dct(s, block[5], 5, dest_cr, uvlinesize); 2839 add_dequant_dct(s, block[5], 5, dest_cr, uvlinesize, s->chroma_qscale);
2821 } 2840 }
2822 } else if(s->codec_id != CODEC_ID_WMV2){ 2841 } else if(s->codec_id != CODEC_ID_WMV2){
2823 add_dct(s, block[0], 0, dest_y, dct_linesize); 2842 add_dct(s, block[0], 0, dest_y, dct_linesize);
2824 add_dct(s, block[1], 1, dest_y + 8, dct_linesize); 2843 add_dct(s, block[1], 1, dest_y + 8, dct_linesize);
2825 add_dct(s, block[2], 2, dest_y + dct_offset, dct_linesize); 2844 add_dct(s, block[2], 2, dest_y + dct_offset, dct_linesize);
3103 s->dquant=0; 3122 s->dquant=0;
3104 } 3123 }
3105 } 3124 }
3106 } 3125 }
3107 s->qscale= last_qp + s->dquant; 3126 s->qscale= last_qp + s->dquant;
3127 s->chroma_qscale= s->chroma_qscale_table[ s->qscale ];
3108 s->y_dc_scale= s->y_dc_scale_table[ s->qscale ]; 3128 s->y_dc_scale= s->y_dc_scale_table[ s->qscale ];
3109 s->c_dc_scale= s->c_dc_scale_table[ s->qscale ]; 3129 s->c_dc_scale= s->c_dc_scale_table[ s->chroma_qscale ];
3110 } 3130 }
3111 3131
3112 if (s->mb_intra) { 3132 if (s->mb_intra) {
3113 uint8_t *ptr; 3133 uint8_t *ptr;
3114 int wrap_y; 3134 int wrap_y;
3842 s->ptr_lastgob = s->pb.buf; 3862 s->ptr_lastgob = s->pb.buf;
3843 for(mb_y=0; mb_y < s->mb_height; mb_y++) { 3863 for(mb_y=0; mb_y < s->mb_height; mb_y++) {
3844 s->mb_x=0; 3864 s->mb_x=0;
3845 s->mb_y= mb_y; 3865 s->mb_y= mb_y;
3846 3866
3867 s->chroma_qscale= s->chroma_qscale_table[ s->qscale ];
3847 s->y_dc_scale= s->y_dc_scale_table[ s->qscale ]; 3868 s->y_dc_scale= s->y_dc_scale_table[ s->qscale ];
3848 s->c_dc_scale= s->c_dc_scale_table[ s->qscale ]; 3869 s->c_dc_scale= s->c_dc_scale_table[ s->chroma_qscale ];
3849 ff_init_block_index(s); 3870 ff_init_block_index(s);
3850 3871
3851 for(mb_x=0; mb_x < s->mb_width; mb_x++) { 3872 for(mb_x=0; mb_x < s->mb_width; mb_x++) {
3852 const int xy= mb_y*s->mb_stride + mb_x; 3873 const int xy= mb_y*s->mb_stride + mb_x;
3853 int mb_type= s->mb_type[xy]; 3874 int mb_type= s->mb_type[xy];
4206 s->dest[1], w>>1, h>>1, s->uvlinesize); 4227 s->dest[1], w>>1, h>>1, s->uvlinesize);
4207 s->current_picture_ptr->error[2] += sse( 4228 s->current_picture_ptr->error[2] += sse(
4208 s, s->new_picture .data[2] + s->mb_x*8 + s->mb_y*s->uvlinesize*8, 4229 s, s->new_picture .data[2] + s->mb_x*8 + s->mb_y*s->uvlinesize*8,
4209 s->dest[2], w>>1, h>>1, s->uvlinesize); 4230 s->dest[2], w>>1, h>>1, s->uvlinesize);
4210 } 4231 }
4232 if(s->loop_filter)
4233 ff_h263_loop_filter(s);
4211 //printf("MB %d %d bits\n", s->mb_x+s->mb_y*s->mb_stride, get_bit_count(&s->pb)); 4234 //printf("MB %d %d bits\n", s->mb_x+s->mb_y*s->mb_stride, get_bit_count(&s->pb));
4212 } 4235 }
4213 } 4236 }
4214 emms_c(); 4237 emms_c();
4215 4238