summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMichael Niedermayer <michaelni@gmx.at>2002-09-24 15:07:44 +0000
committerMichael Niedermayer <michaelni@gmx.at>2002-09-24 15:07:44 +0000
commit9e4c69485b8eb17aa5db0734160420277a8fc1b7 (patch)
tree12af774e8a05c747dd3bcb31d68fc483c75a5e90
parentd87c0267e3a69886ae0a3c43e0adc9705056e8eb (diff)
adaptive quantization for h263
Originally committed as revision 969 to svn://svn.ffmpeg.org/ffmpeg/trunk
-rw-r--r--libavcodec/h263.c19
-rw-r--r--libavcodec/mpegvideo.c17
-rw-r--r--libavcodec/mpegvideo.h1
3 files changed, 29 insertions, 8 deletions
diff --git a/libavcodec/h263.c b/libavcodec/h263.c
index 83f7d96da3..5bf7085f71 100644
--- a/libavcodec/h263.c
+++ b/libavcodec/h263.c
@@ -332,9 +332,8 @@ static inline int decide_ac_pred(MpegEncContext * s, DCTELEM block[6][64], int d
return score0 > score1 ? 1 : 0;
}
-void ff_clean_mpeg4_qscales(MpegEncContext *s){
+void ff_clean_h263_qscales(MpegEncContext *s){
int i;
- /* more braindead iso mpeg mess */
for(i=1; i<s->mb_num; i++){
if(s->qscale_table[i] - s->qscale_table[i-1] >2)
@@ -344,6 +343,12 @@ void ff_clean_mpeg4_qscales(MpegEncContext *s){
if(s->qscale_table[i] - s->qscale_table[i+1] >2)
s->qscale_table[i]= s->qscale_table[i+1]+2;
}
+}
+
+void ff_clean_mpeg4_qscales(MpegEncContext *s){
+ int i;
+
+ ff_clean_h263_qscales(s);
for(i=1; i<s->mb_num; i++){
if(s->qscale_table[i] != s->qscale_table[i-1] && (s->mb_type[i]&MB_TYPE_INTER4V)){
@@ -743,6 +748,7 @@ void h263_encode_mb(MpegEncContext * s,
INT16 pred_dc;
INT16 rec_intradc[6];
UINT16 *dc_ptr[6];
+ const int dquant_code[5]= {1,0,9,2,3};
//printf("**mb x=%d y=%d\n", s->mb_x, s->mb_y);
if (!s->mb_intra) {
@@ -752,19 +758,22 @@ void h263_encode_mb(MpegEncContext * s,
if (s->block_last_index[i] >= 0)
cbp |= 1 << (5 - i);
}
- if ((cbp | motion_x | motion_y) == 0) {
+ if ((cbp | motion_x | motion_y | s->dquant) == 0) {
/* skip macroblock */
put_bits(&s->pb, 1, 1);
return;
}
put_bits(&s->pb, 1, 0); /* mb coded */
cbpc = cbp & 3;
+ if(s->dquant) cbpc+= 8;
put_bits(&s->pb,
inter_MCBPC_bits[cbpc],
inter_MCBPC_code[cbpc]);
cbpy = cbp >> 2;
cbpy ^= 0xf;
put_bits(&s->pb, cbpy_tab[cbpy][1], cbpy_tab[cbpy][0]);
+ if(s->dquant)
+ put_bits(&s->pb, 2, dquant_code[s->dquant+2]);
/* motion vectors: 16x16 mode only now */
h263_pred_motion(s, 0, &pred_x, &pred_y);
@@ -828,10 +837,12 @@ void h263_encode_mb(MpegEncContext * s,
cbpc = cbp & 3;
if (s->pict_type == I_TYPE) {
+ if(s->dquant) cbpc+=4;
put_bits(&s->pb,
intra_MCBPC_bits[cbpc],
intra_MCBPC_code[cbpc]);
} else {
+ if(s->dquant) cbpc+=8;
put_bits(&s->pb, 1, 0); /* mb coded */
put_bits(&s->pb,
inter_MCBPC_bits[cbpc + 4],
@@ -843,6 +854,8 @@ void h263_encode_mb(MpegEncContext * s,
}
cbpy = cbp >> 2;
put_bits(&s->pb, cbpy_tab[cbpy][1], cbpy_tab[cbpy][0]);
+ if(s->dquant)
+ put_bits(&s->pb, 2, dquant_code[s->dquant+2]);
}
for(i=0; i<6; i++) {
diff --git a/libavcodec/mpegvideo.c b/libavcodec/mpegvideo.c
index 4b2b0ad6fd..cf72bb4359 100644
--- a/libavcodec/mpegvideo.c
+++ b/libavcodec/mpegvideo.c
@@ -2190,12 +2190,19 @@ static void encode_picture(MpegEncContext *s, int picture_number)
else
s->frame_qscale = ff_rate_estimate_qscale(s);
- if(s->adaptive_quant && s->codec_id==CODEC_ID_MPEG4)
- ff_clean_mpeg4_qscales(s);
-
- if(s->adaptive_quant)
+ if(s->adaptive_quant){
+ switch(s->codec_id){
+ case CODEC_ID_MPEG4:
+ ff_clean_mpeg4_qscales(s);
+ break;
+ case CODEC_ID_H263:
+ case CODEC_ID_H263P:
+ ff_clean_h263_qscales(s);
+ break;
+ }
+
s->qscale= s->qscale_table[0];
- else
+ }else
s->qscale= (int)(s->frame_qscale + 0.5);
if (s->out_format == FMT_MJPEG) {
diff --git a/libavcodec/mpegvideo.h b/libavcodec/mpegvideo.h
index 2ce290525e..b832560353 100644
--- a/libavcodec/mpegvideo.h
+++ b/libavcodec/mpegvideo.h
@@ -587,6 +587,7 @@ void ff_mpeg4_init_partitions(MpegEncContext *s);
void ff_mpeg4_merge_partitions(MpegEncContext *s);
extern inline int ff_mpeg4_pred_dc(MpegEncContext * s, int n, UINT16 **dc_val_ptr, int *dir_ptr);
void ff_clean_mpeg4_qscales(MpegEncContext *s);
+void ff_clean_h263_qscales(MpegEncContext *s);
/* rv10.c */
void rv10_encode_picture_header(MpegEncContext *s, int picture_number);