mirror of
https://github.com/ultravideo/uvg266.git
synced 2024-11-27 11:24:05 +00:00
Fixed PSNR calculation
This commit is contained in:
parent
9888eaf9a4
commit
f85db78fe2
|
@ -144,11 +144,12 @@
|
||||||
fread(encoder->in.cur_pic.uData, cfg->width*cfg->height>>2,1,input);
|
fread(encoder->in.cur_pic.uData, cfg->width*cfg->height>>2,1,input);
|
||||||
fread(encoder->in.cur_pic.vData, cfg->width*cfg->height>>2,1,input);
|
fread(encoder->in.cur_pic.vData, cfg->width*cfg->height>>2,1,input);
|
||||||
|
|
||||||
/* Clear reconstruction buffers */
|
/* Clear reconstruction buffers (not needed, for debugging) */
|
||||||
|
/*
|
||||||
memset(encoder->in.cur_pic.yRecData, 0, cfg->width*cfg->height);
|
memset(encoder->in.cur_pic.yRecData, 0, cfg->width*cfg->height);
|
||||||
memset(encoder->in.cur_pic.uRecData, 128, cfg->width*cfg->height>>2);
|
memset(encoder->in.cur_pic.uRecData, 128, cfg->width*cfg->height>>2);
|
||||||
memset(encoder->in.cur_pic.vRecData, 128, cfg->width*cfg->height>>2);
|
memset(encoder->in.cur_pic.vRecData, 128, cfg->width*cfg->height>>2);
|
||||||
|
*/
|
||||||
/* /////////////THE ACTUAL CODING HAPPENDS HERE\\\\\\\\\\\\\\\\\\\ */
|
/* /////////////THE ACTUAL CODING HAPPENDS HERE\\\\\\\\\\\\\\\\\\\ */
|
||||||
encode_one_frame(encoder);
|
encode_one_frame(encoder);
|
||||||
|
|
||||||
|
@ -164,7 +165,7 @@
|
||||||
temp_PSNR[1] = imagePSNR(encoder->in.cur_pic.uData,encoder->in.cur_pic.uRecData,cfg->width>>1,cfg->height>>1);
|
temp_PSNR[1] = imagePSNR(encoder->in.cur_pic.uData,encoder->in.cur_pic.uRecData,cfg->width>>1,cfg->height>>1);
|
||||||
temp_PSNR[2] = imagePSNR(encoder->in.cur_pic.vData,encoder->in.cur_pic.vRecData,cfg->width>>1,cfg->height>>1);
|
temp_PSNR[2] = imagePSNR(encoder->in.cur_pic.vData,encoder->in.cur_pic.vRecData,cfg->width>>1,cfg->height>>1);
|
||||||
|
|
||||||
printf("[%d] %c-frame PSNR: %2.2f %2.2f %2.2f\n", encoder->frame, "IPB"[encoder->in.cur_pic.type%3],
|
printf("[%d] %c-frame PSNR: %2.4f %2.4f %2.4f\n", encoder->frame, "IPB"[encoder->in.cur_pic.type%3],
|
||||||
temp_PSNR[0],temp_PSNR[1],temp_PSNR[2]);
|
temp_PSNR[0],temp_PSNR[1],temp_PSNR[2]);
|
||||||
PSNR[0]+=temp_PSNR[0];
|
PSNR[0]+=temp_PSNR[0];
|
||||||
PSNR[1]+=temp_PSNR[1];
|
PSNR[1]+=temp_PSNR[1];
|
||||||
|
@ -174,7 +175,7 @@
|
||||||
}
|
}
|
||||||
/* Coding finished */
|
/* Coding finished */
|
||||||
|
|
||||||
printf(" Processed %d frames, AVG PSNR: %2.2f %2.2f %2.2f\n", encoder->frame,PSNR[0]/encoder->frame,PSNR[1]/encoder->frame,PSNR[2]/encoder->frame);
|
printf(" Processed %d frames, AVG PSNR: %2.4f %2.4f %2.4f\n", encoder->frame,PSNR[0]/encoder->frame,PSNR[1]/encoder->frame,PSNR[2]/encoder->frame);
|
||||||
|
|
||||||
fclose(input);
|
fclose(input);
|
||||||
fclose(output);
|
fclose(output);
|
||||||
|
|
|
@ -192,7 +192,7 @@ void init_encoder_control(encoder_control* control,bitstream* output)
|
||||||
control->stream = output;
|
control->stream = output;
|
||||||
}
|
}
|
||||||
|
|
||||||
void init_encoder_input(encoder_input* input,FILE* inputfile, uint32_t width, uint32_t height)
|
void init_encoder_input(encoder_input* input,FILE* inputfile, int32_t width, int32_t height)
|
||||||
{
|
{
|
||||||
int i;
|
int i;
|
||||||
input->file = inputfile;
|
input->file = inputfile;
|
||||||
|
|
|
@ -33,10 +33,10 @@ enum { FORMAT_400 = 0, FORMAT_420, FORMAT_422, FORMAT_444 };
|
||||||
typedef struct
|
typedef struct
|
||||||
{
|
{
|
||||||
FILE* file;
|
FILE* file;
|
||||||
uint32_t width;
|
int32_t width;
|
||||||
uint32_t height;
|
int32_t height;
|
||||||
uint32_t height_in_LCU;
|
int32_t height_in_LCU;
|
||||||
uint32_t width_in_LCU;
|
int32_t width_in_LCU;
|
||||||
picture cur_pic;
|
picture cur_pic;
|
||||||
uint8_t video_format;
|
uint8_t video_format;
|
||||||
} encoder_input;
|
} encoder_input;
|
||||||
|
@ -88,7 +88,7 @@ typedef struct
|
||||||
} transform_info;
|
} transform_info;
|
||||||
|
|
||||||
void init_encoder_control(encoder_control* control,bitstream* output);
|
void init_encoder_control(encoder_control* control,bitstream* output);
|
||||||
void init_encoder_input(encoder_input* input,FILE* inputfile, uint32_t width, uint32_t height);
|
void init_encoder_input(encoder_input* input,FILE* inputfile, int32_t width, int32_t height);
|
||||||
void encode_one_frame(encoder_control* encoder);
|
void encode_one_frame(encoder_control* encoder);
|
||||||
|
|
||||||
|
|
||||||
|
|
|
@ -129,26 +129,26 @@
|
||||||
#define PSNRMAX (255.0*255.0)
|
#define PSNRMAX (255.0*255.0)
|
||||||
|
|
||||||
//Calculates image PSNR value
|
//Calculates image PSNR value
|
||||||
double imagePSNR(uint8_t *frame1, uint8_t *frame2, uint32_t x, uint32_t y)
|
double imagePSNR(uint8_t *frame1, uint8_t *frame2, int32_t x, int32_t y)
|
||||||
{
|
{
|
||||||
uint64_t MSE=0;
|
int64_t MSE=0;
|
||||||
uint64_t MSEtemp=0;
|
int64_t MSEtemp=0;
|
||||||
double psnr=0.0;
|
double psnr=0.0;
|
||||||
|
double pixels = x*y;
|
||||||
int32_t index;
|
int32_t index;
|
||||||
|
|
||||||
//Calculate MSE
|
//Calculate MSE
|
||||||
for(index=x*y-1;index>=0;index--)
|
for(index = 0; index < x*y; index++)
|
||||||
{
|
{
|
||||||
MSEtemp=frame1[index]-frame2[index];
|
MSEtemp=frame1[index]-frame2[index];
|
||||||
MSE+=MSEtemp*MSEtemp;
|
MSE+=MSEtemp*MSEtemp;
|
||||||
}
|
}
|
||||||
MSE/=x*y;
|
|
||||||
|
|
||||||
//Avoid division by zero
|
//Avoid division by zero
|
||||||
if(MSE==0) return 99.0;
|
if(MSE==0) return 99.0;
|
||||||
|
|
||||||
//The PSNR
|
//The PSNR
|
||||||
psnr=10*log10(PSNRMAX/MSE);
|
psnr=10*log10(PSNRMAX/((double)MSE/pixels));
|
||||||
|
|
||||||
//Thats it.
|
//Thats it.
|
||||||
return psnr;
|
return psnr;
|
||||||
|
@ -346,6 +346,7 @@ uint32_t SAD16x16(int16_t *block,uint32_t stride1,int16_t* block2, uint32_t stri
|
||||||
block += iOffsetOrg;
|
block += iOffsetOrg;
|
||||||
block2 += iOffsetCur;
|
block2 += iOffsetCur;
|
||||||
}
|
}
|
||||||
|
|
||||||
*/
|
*/
|
||||||
uint32_t sum=0;
|
uint32_t sum=0;
|
||||||
for(y=0;y<16;y++)
|
for(y=0;y<16;y++)
|
||||||
|
@ -369,6 +370,7 @@ uint32_t SAD16x16(int16_t *block,uint32_t stride1,int16_t* block2, uint32_t stri
|
||||||
sum+=abs((int32_t)block[i+14]-(int32_t)block2[ii+14]);
|
sum+=abs((int32_t)block[i+14]-(int32_t)block2[ii+14]);
|
||||||
sum+=abs((int32_t)block[i+15]-(int32_t)block2[ii+15]);
|
sum+=abs((int32_t)block[i+15]-(int32_t)block2[ii+15]);
|
||||||
}
|
}
|
||||||
|
|
||||||
return sum;
|
return sum;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -21,7 +21,7 @@ uint32_t SAD32x32(int16_t *block,uint32_t stride1,int16_t* block2, uint32_t stri
|
||||||
uint32_t SAD16x16(int16_t *block,uint32_t stride1,int16_t* block2, uint32_t stride2);
|
uint32_t SAD16x16(int16_t *block,uint32_t stride1,int16_t* block2, uint32_t stride2);
|
||||||
uint32_t SAD8x8(int16_t *block,uint32_t stride1,int16_t* block2, uint32_t stride2);
|
uint32_t SAD8x8(int16_t *block,uint32_t stride1,int16_t* block2, uint32_t stride2);
|
||||||
uint32_t SAD4x4(int16_t *block,uint32_t stride1,int16_t* block2, uint32_t stride2);
|
uint32_t SAD4x4(int16_t *block,uint32_t stride1,int16_t* block2, uint32_t stride2);
|
||||||
double imagePSNR(uint8_t *frame1, uint8_t *frame2, uint32_t x, uint32_t y);
|
double imagePSNR(uint8_t *frame1, uint8_t *frame2, int32_t x, int32_t y);
|
||||||
|
|
||||||
/** \defgroup picture_group Picture handler group
|
/** \defgroup picture_group Picture handler group
|
||||||
* This group contains all picture related stuff
|
* This group contains all picture related stuff
|
||||||
|
|
Loading…
Reference in a new issue