aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorMichael Niedermayer <michaelni@gmx.at>2002-09-24 12:33:37 +0000
committerMichael Niedermayer <michaelni@gmx.at>2002-09-24 12:33:37 +0000
commitd87c0267e3a69886ae0a3c43e0adc9705056e8eb (patch)
tree12f4af381df4334ddafe45e9cdde3ddfbdc080ed
parent5e746b99959e8cf13af70af4f9f8c772dcc15fc5 (diff)
downloadffmpeg-d87c0267e3a69886ae0a3c43e0adc9705056e8eb.tar.gz
adaptive quantization for mpeg1
Originally committed as revision 968 to svn://svn.ffmpeg.org/ffmpeg/trunk
-rw-r--r--libavcodec/mpeg12.c43
1 files changed, 39 insertions, 4 deletions
diff --git a/libavcodec/mpeg12.c b/libavcodec/mpeg12.c
index ef6bec7ace..928896549c 100644
--- a/libavcodec/mpeg12.c
+++ b/libavcodec/mpeg12.c
@@ -23,6 +23,12 @@
#include "mpeg12data.h"
+#if 1
+#define PRINT_QP(a, b) {}
+#else
+#define PRINT_QP(a, b) printf(a, b)
+#endif
+
/* Start codes. */
#define SEQ_END_CODE 0x000001b7
#define SEQ_START_CODE 0x000001b3
@@ -289,6 +295,7 @@ void mpeg1_encode_mb(MpegEncContext *s,
(!((mb_x | mb_y) == 0 ||
(mb_x == s->mb_width - 1 && mb_y == s->mb_height - 1)))) {
s->mb_incr++;
+ s->qscale -= s->dquant;
} else {
/* output mb incr */
mb_incr = s->mb_incr;
@@ -301,17 +308,39 @@ void mpeg1_encode_mb(MpegEncContext *s,
mbAddrIncrTable[mb_incr - 1][0]);
if (s->pict_type == I_TYPE) {
- put_bits(&s->pb, 1, 1); /* macroblock_type : macroblock_quant = 0 */
+ if(s->dquant && cbp){
+ put_bits(&s->pb, 2, 1); /* macroblock_type : macroblock_quant = 1 */
+ put_bits(&s->pb, 5, s->qscale);
+ }else{
+ put_bits(&s->pb, 1, 1); /* macroblock_type : macroblock_quant = 0 */
+ s->qscale -= s->dquant;
+ }
} else {
if (s->mb_intra) {
- put_bits(&s->pb, 5, 0x03);
+ if(s->dquant && cbp){
+ put_bits(&s->pb, 6, 0x01);
+ put_bits(&s->pb, 5, s->qscale);
+ }else{
+ put_bits(&s->pb, 5, 0x03);
+ s->qscale -= s->dquant;
+ }
} else {
if (cbp != 0) {
if (motion_x == 0 && motion_y == 0) {
- put_bits(&s->pb, 2, 1); /* macroblock_pattern only */
+ if(s->dquant){
+ put_bits(&s->pb, 5, 1); /* macroblock_pattern & quant */
+ put_bits(&s->pb, 5, s->qscale);
+ }else{
+ put_bits(&s->pb, 2, 1); /* macroblock_pattern only */
+ }
put_bits(&s->pb, mbPatTable[cbp - 1][1], mbPatTable[cbp - 1][0]);
} else {
- put_bits(&s->pb, 1, 1); /* motion + cbp */
+ if(s->dquant){
+ put_bits(&s->pb, 5, 2); /* motion + cbp */
+ put_bits(&s->pb, 5, s->qscale);
+ }else{
+ put_bits(&s->pb, 1, 1); /* motion + cbp */
+ }
mpeg1_encode_motion(s, motion_x - s->last_mv[0][0][0]);
mpeg1_encode_motion(s, motion_y - s->last_mv[0][0][1]);
put_bits(&s->pb, mbPatTable[cbp - 1][1], mbPatTable[cbp - 1][0]);
@@ -320,6 +349,7 @@ void mpeg1_encode_mb(MpegEncContext *s,
put_bits(&s->pb, 3, 1); /* motion only */
mpeg1_encode_motion(s, motion_x - s->last_mv[0][0][0]);
mpeg1_encode_motion(s, motion_y - s->last_mv[0][0][1]);
+ s->qscale -= s->dquant;
}
}
}
@@ -1502,6 +1532,11 @@ static int mpeg_decode_slice(AVCodecContext *avctx,
return -1;
if (ret == 1)
break;
+
+ if(s->mb_x==0)
+ PRINT_QP("%s", "\n");
+ PRINT_QP("%2d", s->qscale);
+
MPV_decode_mb(s, s->block);
}
emms_c();