From e27b6e62f7711fae834ee2daee9b252a4fc9f6c0 Mon Sep 17 00:00:00 2001 From: Michael Niedermayer Date: Fri, 28 Apr 2006 17:03:52 +0000 Subject: [PATCH] missmatch control for mpeg2 intra dequantization if bitexact=1 Originally committed as revision 5328 to svn://svn.ffmpeg.org/ffmpeg/trunk --- libavcodec/i386/mpegvideo_mmx.c | 3 ++- libavcodec/mpegvideo.c | 37 +++++++++++++++++++++++++++++++++ tests/ffmpeg.regression.ref | 36 ++++++++++++++++---------------- tests/libav.regression.ref | 6 +++--- tests/rotozoom.regression.ref | 36 ++++++++++++++++---------------- 5 files changed, 78 insertions(+), 40 deletions(-) diff --git a/libavcodec/i386/mpegvideo_mmx.c b/libavcodec/i386/mpegvideo_mmx.c index f83df3a194..ad03629342 100644 --- a/libavcodec/i386/mpegvideo_mmx.c +++ b/libavcodec/i386/mpegvideo_mmx.c @@ -699,7 +699,8 @@ void MPV_common_init_mmx(MpegEncContext *s) s->dct_unquantize_h263_inter = dct_unquantize_h263_inter_mmx; s->dct_unquantize_mpeg1_intra = dct_unquantize_mpeg1_intra_mmx; s->dct_unquantize_mpeg1_inter = dct_unquantize_mpeg1_inter_mmx; - s->dct_unquantize_mpeg2_intra = dct_unquantize_mpeg2_intra_mmx; + if(!(s->flags & CODEC_FLAG_BITEXACT)) + s->dct_unquantize_mpeg2_intra = dct_unquantize_mpeg2_intra_mmx; s->dct_unquantize_mpeg2_inter = dct_unquantize_mpeg2_inter_mmx; draw_edges = draw_edges_mmx; diff --git a/libavcodec/mpegvideo.c b/libavcodec/mpegvideo.c index c4fef9c3a1..7ae84994e2 100644 --- a/libavcodec/mpegvideo.c +++ b/libavcodec/mpegvideo.c @@ -47,6 +47,8 @@ static void dct_unquantize_mpeg1_inter_c(MpegEncContext *s, DCTELEM *block, int n, int qscale); static void dct_unquantize_mpeg2_intra_c(MpegEncContext *s, DCTELEM *block, int n, int qscale); +static void dct_unquantize_mpeg2_intra_bitexact(MpegEncContext *s, + DCTELEM *block, int n, int qscale); static void dct_unquantize_mpeg2_inter_c(MpegEncContext *s, DCTELEM *block, int n, int qscale); static void dct_unquantize_h263_intra_c(MpegEncContext *s, @@ -266,6 +268,8 @@ int DCT_common_init(MpegEncContext *s) s->dct_unquantize_mpeg1_intra = dct_unquantize_mpeg1_intra_c; s->dct_unquantize_mpeg1_inter = dct_unquantize_mpeg1_inter_c; s->dct_unquantize_mpeg2_intra = dct_unquantize_mpeg2_intra_c; + if(s->flags & CODEC_FLAG_BITEXACT) + s->dct_unquantize_mpeg2_intra = dct_unquantize_mpeg2_intra_bitexact; s->dct_unquantize_mpeg2_inter = dct_unquantize_mpeg2_inter_c; #ifdef CONFIG_ENCODERS @@ -6527,6 +6531,39 @@ static void dct_unquantize_mpeg2_intra_c(MpegEncContext *s, } } +static void dct_unquantize_mpeg2_intra_bitexact(MpegEncContext *s, + DCTELEM *block, int n, int qscale) +{ + int i, level, nCoeffs; + const uint16_t *quant_matrix; + int sum=-1; + + if(s->alternate_scan) nCoeffs= 63; + else nCoeffs= s->block_last_index[n]; + + if (n < 4) + block[0] = block[0] * s->y_dc_scale; + else + block[0] = block[0] * s->c_dc_scale; + quant_matrix = s->intra_matrix; + for(i=1;i<=nCoeffs;i++) { + int j= s->intra_scantable.permutated[i]; + level = block[j]; + if (level) { + if (level < 0) { + level = -level; + level = (int)(level * qscale * quant_matrix[j]) >> 3; + level = -level; + } else { + level = (int)(level * qscale * quant_matrix[j]) >> 3; + } + block[j] = level; + sum+=level; + } + } + block[63]^=sum&1; +} + static void dct_unquantize_mpeg2_inter_c(MpegEncContext *s, DCTELEM *block, int n, int qscale) { diff --git a/tests/ffmpeg.regression.ref b/tests/ffmpeg.regression.ref index ee55d20ae5..aff2d6791d 100644 --- a/tests/ffmpeg.regression.ref +++ b/tests/ffmpeg.regression.ref @@ -3,25 +3,25 @@ ffmpeg regression test 734274 ./data/a-mpeg1.mpg eff964f940a35427fa9e8d35fb4f5699 *./data/out.yuv stddev: 7.66 PSNR:30.43 bytes:7602176 -5e1e8136cf2565f7cfbcfc7eda8d8f2b *./data/a-mpeg2.mpg -750226 ./data/a-mpeg2.mpg -27ddfd3e44537661eb14b96129a055ef *./data/out.yuv -stddev: 7.69 PSNR:30.40 bytes:7602176 -004245d17ae9322ea3c6dc4b0f0554d6 *./data/a-mpeg2.mpg -746381 ./data/a-mpeg2.mpg -c7b9a71245912671889849ed560b67d3 *./data/out.yuv -stddev: 7.69 PSNR:30.40 bytes:7602176 -59d4471ff2a9749824b4d813900afdfc *./data/a-mpeg2i.mpg -754366 ./data/a-mpeg2i.mpg -ddf889858529d09c8fe31c701deacd16 *./data/out.yuv -stddev: 7.71 PSNR:30.37 bytes:7602176 -d0830d912bc594eeec4d3ec60d727d15 *./data/a-mpeg2thread.mpg -816727 ./data/a-mpeg2thread.mpg -664c5ac9185522238813c476b7b0570a *./data/out.yuv +a60d3fb60982786b9761a07c24664e9c *./data/a-mpeg2.mpg +747312 ./data/a-mpeg2.mpg +f5b8b9c2a5e162b6c01d6b299d03b117 *./data/out.yuv +stddev: 7.69 PSNR:30.39 bytes:7602176 +a34af358ee5b5dab19d37ee29f1927b2 *./data/a-mpeg2.mpg +748099 ./data/a-mpeg2.mpg +555f76a5df78088411b83f5faf334762 *./data/out.yuv +stddev: 7.69 PSNR:30.39 bytes:7602176 +5173c8b2e244a4ac12cca31ae1c19a0d *./data/a-mpeg2i.mpg +756437 ./data/a-mpeg2i.mpg +e29b8da1aeb96bb9c1a43a400958a11d *./data/out.yuv +stddev: 7.69 PSNR:30.39 bytes:7602176 +367414ac9225222fc8ec9352485a7637 *./data/a-mpeg2thread.mpg +820348 ./data/a-mpeg2thread.mpg +6b820ffc74de50cc863b41d51f72c22b *./data/out.yuv stddev: 7.64 PSNR:30.45 bytes:7602176 -d948e29c0be5a78b75c0c7f3ecd8d29d *./data/a-mpeg2reuse.mpg -2114000 ./data/a-mpeg2reuse.mpg -55e78a12330b374db6910447db78ad46 *./data/out.yuv +edb3e58ea66de2e9b32713daf9b5c3f1 *./data/a-mpeg2reuse.mpg +2119706 ./data/a-mpeg2reuse.mpg +1dab2eaca5320fe01afbe9596b2bd6cc *./data/out.yuv stddev: 7.68 PSNR:30.41 bytes:7602176 09086e7b020e9425a8f7e05372dbcfcd *./data/a-msmpeg4v2.avi 642666 ./data/a-msmpeg4v2.avi diff --git a/tests/libav.regression.ref b/tests/libav.regression.ref index 88bb54b67e..9f881b6b7c 100644 --- a/tests/libav.regression.ref +++ b/tests/libav.regression.ref @@ -10,9 +10,9 @@ ffmpeg regression test 90784a1b9589095f20fc6bcc0cc23cc4 *./data/b-libav.mpg 387072 ./data/b-libav.mpg ./data/b-libav.mpg CRC=0x8b644837 -c9050b51f6d6636cdda3160d43463bc3 *./data/b-libav.ts - 479400 ./data/b-libav.ts -./data/b-libav.ts CRC=0x7968c81f +2933a367c996b49f4b7e66a481fb334e *./data/b-libav.ts +476768 ./data/b-libav.ts +./data/b-libav.ts CRC=0x0dd7fc5f 57a8dfc7926802bb337a9d8918de94a8 *./data/b-libav.swf 41816 ./data/b-libav.swf ./data/b-libav.swf CRC=0x2b273fea diff --git a/tests/rotozoom.regression.ref b/tests/rotozoom.regression.ref index cb43ded3e3..e4d5dcfa0b 100644 --- a/tests/rotozoom.regression.ref +++ b/tests/rotozoom.regression.ref @@ -3,26 +3,26 @@ ffmpeg regression test 193481 ./data/a-mpeg1.mpg ce245faede79604bb268f93689a490d6 *./data/out.yuv stddev: 4.96 PSNR:34.21 bytes:7602176 -a59a2a0d04768b9dcd51ab13f751f0ef *./data/a-mpeg2.mpg -199231 ./data/a-mpeg2.mpg -bccb76fc30fca87cc401e41f4c0ef154 *./data/out.yuv +f0310ea9b9a4f37c1a4dd0d4985a3f81 *./data/a-mpeg2.mpg +199396 ./data/a-mpeg2.mpg +94581e9516461557b194aeefaaba3835 *./data/out.yuv stddev: 4.97 PSNR:34.18 bytes:7602176 -eba2bff497863dbe8dad4a771fe14910 *./data/a-mpeg2.mpg -198404 ./data/a-mpeg2.mpg -107af0aac7f32378988469bd6eae9c31 *./data/out.yuv -stddev: 4.98 PSNR:34.17 bytes:7602176 -8d0a7f9b0b4cb5a7e4980051994e1390 *./data/a-mpeg2i.mpg -205006 ./data/a-mpeg2i.mpg -d215d0f3cbbfb687a929ccf2dd1a034a *./data/out.yuv -stddev: 4.99 PSNR:34.16 bytes:7602176 -20f7d29ae2d7eed5742b22c9d2ed5281 *./data/a-mpeg2thread.mpg -184113 ./data/a-mpeg2thread.mpg -b6cc35f5619c6f44c1c2bfbf01e55aec *./data/out.yuv +374bd257b96328935926b350b0c5cada *./data/a-mpeg2.mpg +198338 ./data/a-mpeg2.mpg +f464b420ae24c1e453df8d3e5ef9140d *./data/out.yuv +stddev: 4.98 PSNR:34.18 bytes:7602176 +611f1707acde262e615511eab55d9f74 *./data/a-mpeg2i.mpg +205165 ./data/a-mpeg2i.mpg +8577a8f6bc2ad86fe93e0d1ded6df70a *./data/out.yuv +stddev: 4.98 PSNR:34.16 bytes:7602176 +6a23281e0e268db8df62e9e9957ee583 *./data/a-mpeg2thread.mpg +183955 ./data/a-mpeg2thread.mpg +38441603e2201ddb01632ba3411a6bb8 *./data/out.yuv stddev: 4.76 PSNR:34.56 bytes:7602176 -57bc4a05ff7053dc988530714e91f6c2 *./data/a-mpeg2reuse.mpg -397335 ./data/a-mpeg2reuse.mpg -4f6b4006112516a6f939d61876f78eca *./data/out.yuv -stddev: 4.77 PSNR:34.54 bytes:7602176 +c9f6617461caee57ccb6d438761527c8 *./data/a-mpeg2reuse.mpg +396729 ./data/a-mpeg2reuse.mpg +b10aec71132301cad001070e8ad46b7d *./data/out.yuv +stddev: 4.77 PSNR:34.55 bytes:7602176 dc68a5115d1bf1bb2eb2ce9bb237bd79 *./data/a-msmpeg4v2.avi 129504 ./data/a-msmpeg4v2.avi 25b5ba0b024fcd4028e707ffbeb80f55 *./data/out.yuv