Commit 098eefe1 authored by Michael Niedermayer's avatar Michael Niedermayer

statistics for 2-pass encoding

Originally committed as revision 354 to svn://svn.ffmpeg.org/ffmpeg/trunk
parent b1563bfe
...@@ -146,6 +146,17 @@ typedef struct AVCodecContext { ...@@ -146,6 +146,17 @@ typedef struct AVCodecContext {
float psnr_cb; float psnr_cb;
float psnr_cr; float psnr_cr;
/* statistics, used for 2-pass encoding */
int mv_bits;
int header_bits;
int i_tex_bits;
int p_tex_bits;
int i_count;
int p_count;
int skip_count;
int misc_bits; // cbp, mb_type
int frame_bits;
/* the following fields are ignored */ /* the following fields are ignored */
void *opaque; /* can be used to carry app specific stuff */ void *opaque; /* can be used to carry app specific stuff */
char codec_name[32]; char codec_name[32];
......
...@@ -245,6 +245,7 @@ void mpeg4_encode_mb(MpegEncContext * s, ...@@ -245,6 +245,7 @@ void mpeg4_encode_mb(MpegEncContext * s,
int motion_x, int motion_y) int motion_x, int motion_y)
{ {
int cbpc, cbpy, i, cbp, pred_x, pred_y; int cbpc, cbpy, i, cbp, pred_x, pred_y;
int bits;
// printf("**mb x=%d y=%d\n", s->mb_x, s->mb_y); // printf("**mb x=%d y=%d\n", s->mb_x, s->mb_y);
if (!s->mb_intra) { if (!s->mb_intra) {
...@@ -257,6 +258,9 @@ void mpeg4_encode_mb(MpegEncContext * s, ...@@ -257,6 +258,9 @@ void mpeg4_encode_mb(MpegEncContext * s,
if ((cbp | motion_x | motion_y) == 0) { if ((cbp | motion_x | motion_y) == 0) {
/* skip macroblock */ /* skip macroblock */
put_bits(&s->pb, 1, 1); put_bits(&s->pb, 1, 1);
s->misc_bits++;
s->last_bits++;
s->skip_count++;
return; return;
} }
put_bits(&s->pb, 1, 0); /* mb coded */ put_bits(&s->pb, 1, 0); /* mb coded */
...@@ -268,16 +272,28 @@ void mpeg4_encode_mb(MpegEncContext * s, ...@@ -268,16 +272,28 @@ void mpeg4_encode_mb(MpegEncContext * s,
cbpy ^= 0xf; cbpy ^= 0xf;
put_bits(&s->pb, cbpy_tab[cbpy][1], cbpy_tab[cbpy][0]); put_bits(&s->pb, cbpy_tab[cbpy][1], cbpy_tab[cbpy][0]);
bits= get_bit_count(&s->pb);
s->misc_bits+= bits - s->last_bits;
s->last_bits=bits;
/* motion vectors: 16x16 mode only now */ /* motion vectors: 16x16 mode only now */
h263_pred_motion(s, 0, &pred_x, &pred_y); h263_pred_motion(s, 0, &pred_x, &pred_y);
h263_encode_motion(s, motion_x - pred_x); h263_encode_motion(s, motion_x - pred_x);
h263_encode_motion(s, motion_y - pred_y); h263_encode_motion(s, motion_y - pred_y);
bits= get_bit_count(&s->pb);
s->mv_bits+= bits - s->last_bits;
s->last_bits=bits;
/* encode each block */ /* encode each block */
for (i = 0; i < 6; i++) { for (i = 0; i < 6; i++) {
mpeg4_encode_block(s, block[i], i, 0, zigzag_direct); mpeg4_encode_block(s, block[i], i, 0, zigzag_direct);
} }
bits= get_bit_count(&s->pb);
s->p_tex_bits+= bits - s->last_bits;
s->last_bits=bits;
s->p_count++;
} else { } else {
int dc_diff[6]; //dc values with the dc prediction subtracted int dc_diff[6]; //dc values with the dc prediction subtracted
int dir[6]; //prediction direction int dir[6]; //prediction direction
...@@ -340,11 +356,20 @@ void mpeg4_encode_mb(MpegEncContext * s, ...@@ -340,11 +356,20 @@ void mpeg4_encode_mb(MpegEncContext * s,
cbpy = cbp >> 2; cbpy = cbp >> 2;
put_bits(&s->pb, cbpy_tab[cbpy][1], cbpy_tab[cbpy][0]); put_bits(&s->pb, cbpy_tab[cbpy][1], cbpy_tab[cbpy][0]);
bits= get_bit_count(&s->pb);
s->misc_bits+= bits - s->last_bits;
s->last_bits=bits;
/* encode each block */ /* encode each block */
for (i = 0; i < 6; i++) { for (i = 0; i < 6; i++) {
mpeg4_encode_block(s, block[i], i, dc_diff[i], scan_table[i]); mpeg4_encode_block(s, block[i], i, dc_diff[i], scan_table[i]);
} }
bits= get_bit_count(&s->pb);
s->i_tex_bits+= bits - s->last_bits;
s->last_bits=bits;
s->i_count++;
/* restore ac coeffs & last_index stuff if we messed them up with the prediction */ /* restore ac coeffs & last_index stuff if we messed them up with the prediction */
if(s->ac_pred){ if(s->ac_pred){
for(i=0; i<6; i++){ for(i=0; i<6; i++){
......
...@@ -542,6 +542,14 @@ int MPV_encode_picture(AVCodecContext *avctx, ...@@ -542,6 +542,14 @@ int MPV_encode_picture(AVCodecContext *avctx,
encode_picture(s, s->picture_number); encode_picture(s, s->picture_number);
avctx->key_frame = (s->pict_type == I_TYPE); avctx->key_frame = (s->pict_type == I_TYPE);
avctx->header_bits = s->header_bits;
avctx->mv_bits = s->mv_bits;
avctx->misc_bits = s->misc_bits;
avctx->i_tex_bits = s->i_tex_bits;
avctx->p_tex_bits = s->p_tex_bits;
avctx->i_count = s->i_count;
avctx->p_count = s->p_count;
avctx->skip_count = s->skip_count;
MPV_frame_end(s); MPV_frame_end(s);
s->picture_number++; s->picture_number++;
...@@ -554,6 +562,9 @@ int MPV_encode_picture(AVCodecContext *avctx, ...@@ -554,6 +562,9 @@ int MPV_encode_picture(AVCodecContext *avctx,
s->last_frame_bits= s->frame_bits; s->last_frame_bits= s->frame_bits;
s->frame_bits = (pbBufPtr(&s->pb) - s->pb.buf) * 8; s->frame_bits = (pbBufPtr(&s->pb) - s->pb.buf) * 8;
s->total_bits += s->frame_bits; s->total_bits += s->frame_bits;
avctx->frame_bits = s->frame_bits;
//printf("fcode: %d, type: %d, head: %d, mv: %d, misc: %d, frame: %d, itex: %d, ptex: %d\n",
//s->f_code, avctx->key_frame, s->header_bits, s->mv_bits, s->misc_bits, s->frame_bits, s->i_tex_bits, s->p_tex_bits);
avctx->quality = s->qscale; avctx->quality = s->qscale;
if (avctx->get_psnr) { if (avctx->get_psnr) {
...@@ -1071,6 +1082,7 @@ static void encode_picture(MpegEncContext *s, int picture_number) ...@@ -1071,6 +1082,7 @@ static void encode_picture(MpegEncContext *s, int picture_number)
int mb_x, mb_y, wrap, last_gob, pdif = 0; int mb_x, mb_y, wrap, last_gob, pdif = 0;
UINT8 *ptr; UINT8 *ptr;
int i, motion_x, motion_y; int i, motion_x, motion_y;
int bits;
s->picture_number = picture_number; s->picture_number = picture_number;
...@@ -1134,7 +1146,7 @@ static void encode_picture(MpegEncContext *s, int picture_number) ...@@ -1134,7 +1146,7 @@ static void encode_picture(MpegEncContext *s, int picture_number)
for(i=MAX_FCODE; i>1; i--){ for(i=MAX_FCODE; i>1; i--){
loose+= mv_num[i]; loose+= mv_num[i];
if(loose > 4) break; //FIXME this is pretty ineffective if(loose > 10) break; //FIXME this is pretty ineffective
} }
s->f_code= i; s->f_code= i;
}else{ }else{
...@@ -1179,6 +1191,7 @@ static void encode_picture(MpegEncContext *s, int picture_number) ...@@ -1179,6 +1191,7 @@ static void encode_picture(MpegEncContext *s, int picture_number)
convert_matrix(s->q_non_intra_matrix, s->q_non_intra_matrix16, s->non_intra_matrix, s->qscale); convert_matrix(s->q_non_intra_matrix, s->q_non_intra_matrix16, s->non_intra_matrix, s->qscale);
} }
s->last_bits= get_bit_count(&s->pb);
switch(s->out_format) { switch(s->out_format) {
case FMT_MJPEG: case FMT_MJPEG:
mjpeg_picture_header(s); mjpeg_picture_header(s);
...@@ -1197,6 +1210,16 @@ static void encode_picture(MpegEncContext *s, int picture_number) ...@@ -1197,6 +1210,16 @@ static void encode_picture(MpegEncContext *s, int picture_number)
mpeg1_encode_picture_header(s, picture_number); mpeg1_encode_picture_header(s, picture_number);
break; break;
} }
bits= get_bit_count(&s->pb);
s->header_bits= bits - s->last_bits;
s->last_bits= bits;
s->mv_bits=0;
s->misc_bits=0;
s->i_tex_bits=0;
s->p_tex_bits=0;
s->i_count=0;
s->p_count=0;
s->skip_count=0;
/* init last dc values */ /* init last dc values */
/* note: quant matrix value (8) is implied here */ /* note: quant matrix value (8) is implied here */
......
...@@ -178,6 +178,17 @@ typedef struct MpegEncContext { ...@@ -178,6 +178,17 @@ typedef struct MpegEncContext {
double short_term_qsum; /* sum of recent qscales */ double short_term_qsum; /* sum of recent qscales */
double short_term_qcount; /* count of recent qscales */ double short_term_qcount; /* count of recent qscales */
/* statistics, used for 2-pass encoding */
int mv_bits;
int header_bits;
int i_tex_bits;
int p_tex_bits;
int i_count;
int p_count;
int skip_count;
int misc_bits; // cbp, mb_type
int last_bits; //temp var used for calculating the above vars
/* H.263 specific */ /* H.263 specific */
int gob_number; int gob_number;
int gob_index; int gob_index;
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment