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);