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