comparison mpegvideo.c @ 3281:7fac25904a8b libavcodec

missmatch control for mpeg2 intra dequantization if bitexact=1
author michael
date Fri, 28 Apr 2006 17:03:52 +0000
parents f7a9d8dd476b
children 30d412952107
comparison
equal deleted inserted replaced
3280:894ef0dba687 3281:7fac25904a8b
45 DCTELEM *block, int n, int qscale); 45 DCTELEM *block, int n, int qscale);
46 static void dct_unquantize_mpeg1_inter_c(MpegEncContext *s, 46 static void dct_unquantize_mpeg1_inter_c(MpegEncContext *s,
47 DCTELEM *block, int n, int qscale); 47 DCTELEM *block, int n, int qscale);
48 static void dct_unquantize_mpeg2_intra_c(MpegEncContext *s, 48 static void dct_unquantize_mpeg2_intra_c(MpegEncContext *s,
49 DCTELEM *block, int n, int qscale); 49 DCTELEM *block, int n, int qscale);
50 static void dct_unquantize_mpeg2_intra_bitexact(MpegEncContext *s,
51 DCTELEM *block, int n, int qscale);
50 static void dct_unquantize_mpeg2_inter_c(MpegEncContext *s, 52 static void dct_unquantize_mpeg2_inter_c(MpegEncContext *s,
51 DCTELEM *block, int n, int qscale); 53 DCTELEM *block, int n, int qscale);
52 static void dct_unquantize_h263_intra_c(MpegEncContext *s, 54 static void dct_unquantize_h263_intra_c(MpegEncContext *s,
53 DCTELEM *block, int n, int qscale); 55 DCTELEM *block, int n, int qscale);
54 static void dct_unquantize_h263_inter_c(MpegEncContext *s, 56 static void dct_unquantize_h263_inter_c(MpegEncContext *s,
264 s->dct_unquantize_h263_intra = dct_unquantize_h263_intra_c; 266 s->dct_unquantize_h263_intra = dct_unquantize_h263_intra_c;
265 s->dct_unquantize_h263_inter = dct_unquantize_h263_inter_c; 267 s->dct_unquantize_h263_inter = dct_unquantize_h263_inter_c;
266 s->dct_unquantize_mpeg1_intra = dct_unquantize_mpeg1_intra_c; 268 s->dct_unquantize_mpeg1_intra = dct_unquantize_mpeg1_intra_c;
267 s->dct_unquantize_mpeg1_inter = dct_unquantize_mpeg1_inter_c; 269 s->dct_unquantize_mpeg1_inter = dct_unquantize_mpeg1_inter_c;
268 s->dct_unquantize_mpeg2_intra = dct_unquantize_mpeg2_intra_c; 270 s->dct_unquantize_mpeg2_intra = dct_unquantize_mpeg2_intra_c;
271 if(s->flags & CODEC_FLAG_BITEXACT)
272 s->dct_unquantize_mpeg2_intra = dct_unquantize_mpeg2_intra_bitexact;
269 s->dct_unquantize_mpeg2_inter = dct_unquantize_mpeg2_inter_c; 273 s->dct_unquantize_mpeg2_inter = dct_unquantize_mpeg2_inter_c;
270 274
271 #ifdef CONFIG_ENCODERS 275 #ifdef CONFIG_ENCODERS
272 s->dct_quantize= dct_quantize_c; 276 s->dct_quantize= dct_quantize_c;
273 s->denoise_dct= denoise_dct_c; 277 s->denoise_dct= denoise_dct_c;
6525 block[j] = level; 6529 block[j] = level;
6526 } 6530 }
6527 } 6531 }
6528 } 6532 }
6529 6533
6534 static void dct_unquantize_mpeg2_intra_bitexact(MpegEncContext *s,
6535 DCTELEM *block, int n, int qscale)
6536 {
6537 int i, level, nCoeffs;
6538 const uint16_t *quant_matrix;
6539 int sum=-1;
6540
6541 if(s->alternate_scan) nCoeffs= 63;
6542 else nCoeffs= s->block_last_index[n];
6543
6544 if (n < 4)
6545 block[0] = block[0] * s->y_dc_scale;
6546 else
6547 block[0] = block[0] * s->c_dc_scale;
6548 quant_matrix = s->intra_matrix;
6549 for(i=1;i<=nCoeffs;i++) {
6550 int j= s->intra_scantable.permutated[i];
6551 level = block[j];
6552 if (level) {
6553 if (level < 0) {
6554 level = -level;
6555 level = (int)(level * qscale * quant_matrix[j]) >> 3;
6556 level = -level;
6557 } else {
6558 level = (int)(level * qscale * quant_matrix[j]) >> 3;
6559 }
6560 block[j] = level;
6561 sum+=level;
6562 }
6563 }
6564 block[63]^=sum&1;
6565 }
6566
6530 static void dct_unquantize_mpeg2_inter_c(MpegEncContext *s, 6567 static void dct_unquantize_mpeg2_inter_c(MpegEncContext *s,
6531 DCTELEM *block, int n, int qscale) 6568 DCTELEM *block, int n, int qscale)
6532 { 6569 {
6533 int i, level, nCoeffs; 6570 int i, level, nCoeffs;
6534 const uint16_t *quant_matrix; 6571 const uint16_t *quant_matrix;