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