warn the user if the quantization code could overflow with the selected custom matrix and qp limits
Originally committed as revision 3747 to svn://svn.ffmpeg.org/ffmpeg/trunk
This commit is contained in:
		@@ -109,9 +109,10 @@ static uint8_t default_fcode_tab[MAX_MV*2+1];
 | 
				
			|||||||
enum PixelFormat ff_yuv420p_list[2]= {PIX_FMT_YUV420P, -1};
 | 
					enum PixelFormat ff_yuv420p_list[2]= {PIX_FMT_YUV420P, -1};
 | 
				
			||||||
 | 
					
 | 
				
			||||||
static void convert_matrix(DSPContext *dsp, int (*qmat)[64], uint16_t (*qmat16)[2][64],
 | 
					static void convert_matrix(DSPContext *dsp, int (*qmat)[64], uint16_t (*qmat16)[2][64],
 | 
				
			||||||
                           const uint16_t *quant_matrix, int bias, int qmin, int qmax)
 | 
					                           const uint16_t *quant_matrix, int bias, int qmin, int qmax, int intra)
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
    int qscale;
 | 
					    int qscale;
 | 
				
			||||||
 | 
					    int shift=0;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    for(qscale=qmin; qscale<=qmax; qscale++){
 | 
					    for(qscale=qmin; qscale<=qmax; qscale++){
 | 
				
			||||||
        int i;
 | 
					        int i;
 | 
				
			||||||
@@ -161,6 +162,15 @@ static void convert_matrix(DSPContext *dsp, int (*qmat)[64], uint16_t (*qmat16)[
 | 
				
			|||||||
                qmat16[qscale][1][i]= ROUNDED_DIV(bias<<(16-QUANT_BIAS_SHIFT), qmat16[qscale][0][i]);
 | 
					                qmat16[qscale][1][i]= ROUNDED_DIV(bias<<(16-QUANT_BIAS_SHIFT), qmat16[qscale][0][i]);
 | 
				
			||||||
            }
 | 
					            }
 | 
				
			||||||
        }
 | 
					        }
 | 
				
			||||||
 | 
					        
 | 
				
			||||||
 | 
					        for(i=intra; i<64; i++){
 | 
				
			||||||
 | 
					            while(((8191LL * qmat[qscale][i]) >> shift) > INT_MAX){ 
 | 
				
			||||||
 | 
					                shift++;
 | 
				
			||||||
 | 
					            }
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					    if(shift){
 | 
				
			||||||
 | 
					        av_log(NULL, AV_LOG_INFO, "Warning, QMAT_SHIFT is larger then %d, overflows possible\n", QMAT_SHIFT - shift);
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@@ -1246,9 +1256,9 @@ int MPV_encode_init(AVCodecContext *avctx)
 | 
				
			|||||||
    /* for mjpeg, we do include qscale in the matrix */
 | 
					    /* for mjpeg, we do include qscale in the matrix */
 | 
				
			||||||
    if (s->out_format != FMT_MJPEG) {
 | 
					    if (s->out_format != FMT_MJPEG) {
 | 
				
			||||||
        convert_matrix(&s->dsp, s->q_intra_matrix, s->q_intra_matrix16, 
 | 
					        convert_matrix(&s->dsp, s->q_intra_matrix, s->q_intra_matrix16, 
 | 
				
			||||||
                       s->intra_matrix, s->intra_quant_bias, 1, 31);
 | 
					                       s->intra_matrix, s->intra_quant_bias, avctx->qmin, 31, 1);
 | 
				
			||||||
        convert_matrix(&s->dsp, s->q_inter_matrix, s->q_inter_matrix16, 
 | 
					        convert_matrix(&s->dsp, s->q_inter_matrix, s->q_inter_matrix16, 
 | 
				
			||||||
                       s->inter_matrix, s->inter_quant_bias, 1, 31);
 | 
					                       s->inter_matrix, s->inter_quant_bias, avctx->qmin, 31, 0);
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    if(ff_rate_control_init(s) < 0)
 | 
					    if(ff_rate_control_init(s) < 0)
 | 
				
			||||||
@@ -5290,7 +5300,7 @@ static void encode_picture(MpegEncContext *s, int picture_number)
 | 
				
			|||||||
            s->intra_matrix[j] = CLAMP_TO_8BIT((ff_mpeg1_default_intra_matrix[i] * s->qscale) >> 3);
 | 
					            s->intra_matrix[j] = CLAMP_TO_8BIT((ff_mpeg1_default_intra_matrix[i] * s->qscale) >> 3);
 | 
				
			||||||
        }
 | 
					        }
 | 
				
			||||||
        convert_matrix(&s->dsp, s->q_intra_matrix, s->q_intra_matrix16, 
 | 
					        convert_matrix(&s->dsp, s->q_intra_matrix, s->q_intra_matrix16, 
 | 
				
			||||||
                       s->intra_matrix, s->intra_quant_bias, 8, 8);
 | 
					                       s->intra_matrix, s->intra_quant_bias, 8, 8, 1);
 | 
				
			||||||
        s->qscale= 8;
 | 
					        s->qscale= 8;
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
    
 | 
					    
 | 
				
			||||||
 
 | 
				
			|||||||
		Reference in New Issue
	
	Block a user