Mercurial > libavcodec.hg
comparison mpegvideo.c @ 690:a1c69cb685b3 libavcodec
adaptive quantization (lumi/temporal & spatial complexity masking)
author | michaelni |
---|---|
date | Mon, 23 Sep 2002 14:56:11 +0000 |
parents | 242f0f7d8c15 |
children | b6a7ff92df57 |
comparison
equal
deleted
inserted
replaced
689:efcbfbd18864 | 690:a1c69cb685b3 |
---|---|
205 int j; | 205 int j; |
206 int mv_table_size= (s->mb_width+2)*(s->mb_height+2); | 206 int mv_table_size= (s->mb_width+2)*(s->mb_height+2); |
207 | 207 |
208 CHECKED_ALLOCZ(s->mb_var , s->mb_num * sizeof(INT16)) | 208 CHECKED_ALLOCZ(s->mb_var , s->mb_num * sizeof(INT16)) |
209 CHECKED_ALLOCZ(s->mc_mb_var, s->mb_num * sizeof(INT16)) | 209 CHECKED_ALLOCZ(s->mc_mb_var, s->mb_num * sizeof(INT16)) |
210 CHECKED_ALLOCZ(s->mb_mean , s->mb_num * sizeof(INT8)) | |
210 | 211 |
211 /* Allocate MV tables */ | 212 /* Allocate MV tables */ |
212 CHECKED_ALLOCZ(s->p_mv_table , mv_table_size * 2 * sizeof(INT16)) | 213 CHECKED_ALLOCZ(s->p_mv_table , mv_table_size * 2 * sizeof(INT16)) |
213 CHECKED_ALLOCZ(s->b_forw_mv_table , mv_table_size * 2 * sizeof(INT16)) | 214 CHECKED_ALLOCZ(s->b_forw_mv_table , mv_table_size * 2 * sizeof(INT16)) |
214 CHECKED_ALLOCZ(s->b_back_mv_table , mv_table_size * 2 * sizeof(INT16)) | 215 CHECKED_ALLOCZ(s->b_back_mv_table , mv_table_size * 2 * sizeof(INT16)) |
327 int i; | 328 int i; |
328 | 329 |
329 av_freep(&s->mb_type); | 330 av_freep(&s->mb_type); |
330 av_freep(&s->mb_var); | 331 av_freep(&s->mb_var); |
331 av_freep(&s->mc_mb_var); | 332 av_freep(&s->mc_mb_var); |
333 av_freep(&s->mb_mean); | |
332 av_freep(&s->p_mv_table); | 334 av_freep(&s->p_mv_table); |
333 av_freep(&s->b_forw_mv_table); | 335 av_freep(&s->b_forw_mv_table); |
334 av_freep(&s->b_back_mv_table); | 336 av_freep(&s->b_back_mv_table); |
335 av_freep(&s->b_bidir_forw_mv_table); | 337 av_freep(&s->b_bidir_forw_mv_table); |
336 av_freep(&s->b_bidir_back_mv_table); | 338 av_freep(&s->b_bidir_back_mv_table); |
439 else | 441 else |
440 s->me_method = avctx->me_method; | 442 s->me_method = avctx->me_method; |
441 | 443 |
442 /* Fixed QSCALE */ | 444 /* Fixed QSCALE */ |
443 s->fixed_qscale = (avctx->flags & CODEC_FLAG_QSCALE); | 445 s->fixed_qscale = (avctx->flags & CODEC_FLAG_QSCALE); |
446 | |
447 s->adaptive_quant= ( s->avctx->lumi_masking | |
448 || s->avctx->temporal_cplx_masking | |
449 || s->avctx->spatial_cplx_masking | |
450 || s->avctx->p_masking) | |
451 && !s->fixed_qscale; | |
444 | 452 |
445 switch(avctx->codec->id) { | 453 switch(avctx->codec->id) { |
446 case CODEC_ID_MPEG1VIDEO: | 454 case CODEC_ID_MPEG1VIDEO: |
447 s->out_format = FMT_MPEG1; | 455 s->out_format = FMT_MPEG1; |
448 avctx->delay=0; //FIXME not sure, should check the spec | 456 avctx->delay=0; //FIXME not sure, should check the spec |
891 MPV_frame_end(s); | 899 MPV_frame_end(s); |
892 | 900 |
893 if (s->out_format == FMT_MJPEG) | 901 if (s->out_format == FMT_MJPEG) |
894 mjpeg_picture_trailer(s); | 902 mjpeg_picture_trailer(s); |
895 | 903 |
896 avctx->quality = s->qscale; | 904 if(!s->fixed_qscale) |
905 avctx->quality = s->qscale; | |
897 | 906 |
898 if(s->flags&CODEC_FLAG_PASS1) | 907 if(s->flags&CODEC_FLAG_PASS1) |
899 ff_write_pass1_stats(s); | 908 ff_write_pass1_stats(s); |
900 | 909 |
901 } | 910 } |
1751 dct_linesize = s->linesize; | 1760 dct_linesize = s->linesize; |
1752 dct_offset = s->linesize * 8; | 1761 dct_offset = s->linesize * 8; |
1753 } | 1762 } |
1754 #endif | 1763 #endif |
1755 for(i=0; i<6; i++) skip_dct[i]=0; | 1764 for(i=0; i<6; i++) skip_dct[i]=0; |
1765 | |
1766 if(s->adaptive_quant){ | |
1767 s->dquant= s->qscale_table[mb_x + mb_y*s->mb_width] - s->qscale; | |
1768 if(s->codec_id==CODEC_ID_MPEG4){ | |
1769 if (s->dquant> 2) s->dquant= 2; | |
1770 else if(s->dquant<-2) s->dquant=-2; | |
1771 | |
1772 if(!s->mb_intra){ | |
1773 assert(s->dquant==0 || s->mv_type!=MV_TYPE_8X8); | |
1774 | |
1775 if(s->mv_dir&MV_DIRECT) | |
1776 s->dquant=0; | |
1777 } | |
1778 } | |
1779 s->qscale+= s->dquant; | |
1780 s->y_dc_scale= s->y_dc_scale_table[ s->qscale ]; | |
1781 s->c_dc_scale= s->c_dc_scale_table[ s->qscale ]; | |
1782 } | |
1756 | 1783 |
1757 if (s->mb_intra) { | 1784 if (s->mb_intra) { |
1758 UINT8 *ptr; | 1785 UINT8 *ptr; |
1759 int wrap; | 1786 int wrap; |
1760 int emu=0; | 1787 int emu=0; |
2078 /* we need to initialize some time vars before we can encode b-frames */ | 2105 /* we need to initialize some time vars before we can encode b-frames */ |
2079 if (s->h263_pred && !s->h263_msmpeg4) | 2106 if (s->h263_pred && !s->h263_msmpeg4) |
2080 ff_set_mpeg4_time(s, s->picture_number); | 2107 ff_set_mpeg4_time(s, s->picture_number); |
2081 | 2108 |
2082 s->scene_change_score=0; | 2109 s->scene_change_score=0; |
2110 | |
2111 s->qscale= (int)(s->frame_qscale + 0.5); //FIXME qscale / ... stuff for ME ratedistoration | |
2083 | 2112 |
2084 /* Estimate motion for every MB */ | 2113 /* Estimate motion for every MB */ |
2085 if(s->pict_type != I_TYPE){ | 2114 if(s->pict_type != I_TYPE){ |
2086 for(mb_y=0; mb_y < s->mb_height; mb_y++) { | 2115 for(mb_y=0; mb_y < s->mb_height; mb_y++) { |
2087 s->block_index[0]= s->block_wrap[0]*(mb_y*2 + 1) - 1; | 2116 s->block_index[0]= s->block_wrap[0]*(mb_y*2 + 1) - 1; |
2123 int sum = pix_sum(pix, s->linesize); | 2152 int sum = pix_sum(pix, s->linesize); |
2124 | 2153 |
2125 sum= (sum+8)>>4; | 2154 sum= (sum+8)>>4; |
2126 varc = (pix_norm1(pix, s->linesize) - sum*sum + 500 + 128)>>8; | 2155 varc = (pix_norm1(pix, s->linesize) - sum*sum + 500 + 128)>>8; |
2127 | 2156 |
2128 s->mb_var[s->mb_width * mb_y + mb_x] = varc; | 2157 s->mb_var [s->mb_width * mb_y + mb_x] = varc; |
2158 s->mb_mean[s->mb_width * mb_y + mb_x] = (sum+7)>>4; | |
2129 s->mb_var_sum += varc; | 2159 s->mb_var_sum += varc; |
2130 } | 2160 } |
2131 } | 2161 } |
2132 } | 2162 } |
2133 } | 2163 } |
2152 ff_fix_long_b_mvs(s, s->b_back_mv_table, s->b_code, MB_TYPE_BACKWARD); | 2182 ff_fix_long_b_mvs(s, s->b_back_mv_table, s->b_code, MB_TYPE_BACKWARD); |
2153 ff_fix_long_b_mvs(s, s->b_bidir_forw_mv_table, s->f_code, MB_TYPE_BIDIR); | 2183 ff_fix_long_b_mvs(s, s->b_bidir_forw_mv_table, s->f_code, MB_TYPE_BIDIR); |
2154 ff_fix_long_b_mvs(s, s->b_bidir_back_mv_table, s->b_code, MB_TYPE_BIDIR); | 2184 ff_fix_long_b_mvs(s, s->b_bidir_back_mv_table, s->b_code, MB_TYPE_BIDIR); |
2155 } | 2185 } |
2156 | 2186 |
2157 //printf("f_code %d ///\n", s->f_code); | 2187 if (s->fixed_qscale) |
2158 | 2188 s->frame_qscale = s->avctx->quality; |
2159 // printf("%d %d\n", s->avg_mb_var, s->mc_mb_var); | 2189 else |
2160 if (!s->fixed_qscale) | 2190 s->frame_qscale = ff_rate_estimate_qscale(s); |
2161 s->qscale = ff_rate_estimate_qscale(s); | 2191 |
2162 | 2192 if(s->adaptive_quant && s->codec_id==CODEC_ID_MPEG4) |
2193 ff_clean_mpeg4_qscales(s); | |
2194 | |
2195 if(s->adaptive_quant) | |
2196 s->qscale= s->qscale_table[0]; | |
2197 else | |
2198 s->qscale= (int)(s->frame_qscale + 0.5); | |
2199 | |
2163 if (s->out_format == FMT_MJPEG) { | 2200 if (s->out_format == FMT_MJPEG) { |
2164 /* for mjpeg, we do include qscale in the matrix */ | 2201 /* for mjpeg, we do include qscale in the matrix */ |
2165 s->intra_matrix[0] = ff_mpeg1_default_intra_matrix[0]; | 2202 s->intra_matrix[0] = ff_mpeg1_default_intra_matrix[0]; |
2166 for(i=1;i<64;i++) | 2203 for(i=1;i<64;i++) |
2167 s->intra_matrix[i] = CLAMP_TO_8BIT((ff_mpeg1_default_intra_matrix[i] * s->qscale) >> 3); | 2204 s->intra_matrix[i] = CLAMP_TO_8BIT((ff_mpeg1_default_intra_matrix[i] * s->qscale) >> 3); |