📄 image.c
字号:
/*!
************************************************************************
* \brief
* Upsample 4 times, store them in out4x. Color is simply copied
* for 4:4:4 Independent mode
*
* \par Input:
* nplane
*
************************************************************************/
void UnifiedOneForthPix_JV (int nplane, StorablePicture *s)
{
int ypadded_size = s->size_y + 2 * IMG_PAD_SIZE;
int xpadded_size = s->size_x + 2 * IMG_PAD_SIZE;
if( nplane == 0 )
{
// don't upsample twice
if (s->imgY_sub)
return;
// Y component
get_mem4Dpel (&(s->imgY_sub), 4, 4, ypadded_size, xpadded_size);
if (NULL == s->imgY_sub)
no_mem_exit("UnifiedOneForthPix_JV: s->imgY_sub");
// don't upsample twice
if (s->imgUV_sub)
return;
// Y component
get_mem5Dpel (&(s->imgUV_sub), 2, 4, 4, ypadded_size, xpadded_size);
if (NULL == s->imgUV_sub)
no_mem_exit("UnifiedOneForthPix_JV: s->imgUV_sub");
s->p_imgY_sub[0] = s->imgY_sub;
s->p_imgY_sub[1] = s->imgUV_sub[0];
s->p_imgY_sub[2] = s->imgUV_sub[1];
}
// derive the subpixel images for first component
s->colour_plane_id = nplane;
getSubImagesLuma ( s );
}
/*!
************************************************************************
* \brief
* Find SNR for all three components
************************************************************************
*/
static void find_snr (void)
{
int i, j;
int64 diff_y=0, diff_u=0, diff_v=0;
int impix;
int impix_cr;
unsigned int max_pix_value_sqd = img->max_imgpel_value * img->max_imgpel_value;
unsigned int max_pix_value_sqd_uv = img->max_imgpel_value_uv * img->max_imgpel_value_uv;
// Calculate PSNR for Y, U and V.
// Luma.
impix = input->img_height * input->img_width;
impix_cr = input->img_height_cr * input->img_width_cr;
if (img->fld_flag != 0)
{
diff_y = 0;
for (i = 0; i < input->img_width; ++i)
{
for (j = 0; j < input->img_height; ++j)
{
diff_y += iabs2( imgY_org[j][i] - imgY_com[j][i] );
}
}
if (img->yuv_format != YUV400)
{
// Chroma.
diff_u = 0;
diff_v = 0;
for (i = 0; i < input->img_width_cr; i++)
{
for (j = 0; j < input->img_height_cr; j++)
{
diff_u += iabs2( imgUV_org[0][j][i] - imgUV_com[0][j][i] );
diff_v += iabs2( imgUV_org[1][j][i] - imgUV_com[1][j][i] );
}
}
}
}
else
{
imgY_org = imgY_org_frm;
imgUV_org = imgUV_org_frm;
if(input->PicInterlace==ADAPTIVE_CODING)
{
enc_picture = enc_frame_picture[0];
}
diff_y = 0;
for (i = 0; i < input->img_width; ++i)
{
for (j = 0; j < input->img_height; ++j)
{
diff_y += iabs2( imgY_org[j][i] - enc_picture->imgY[j][i] );
}
}
if (img->yuv_format != YUV400)
{
// Chroma.
diff_u = 0;
diff_v = 0;
for (i = 0; i < input->img_width_cr; i++)
{
for (j = 0; j < input->img_height_cr; j++)
{
diff_u += iabs2( imgUV_org[0][j][i] - enc_picture->imgUV[0][j][i] );
diff_v += iabs2( imgUV_org[1][j][i] - enc_picture->imgUV[1][j][i] );
}
}
}
}
snr->sse_y = (float)diff_y;
snr->sse_u = (float)diff_u;
snr->sse_v = (float)diff_v;
#if ZEROSNR
if (diff_y == 0)
diff_y = 1;
if (diff_u == 0)
diff_u = 1;
if (diff_v == 0)
diff_v = 1;
#endif
// Collecting SNR statistics
if (diff_y != 0)
{
snr->snr_y = (float) (10 * log10 (max_pix_value_sqd * (double)((double) impix / diff_y))); // luma snr for current frame
if (img->yuv_format != YUV400)
{
snr->snr_u = (float) (10 * log10 (max_pix_value_sqd_uv * (double)((double) impix_cr / diff_u))); // u croma snr for current frame, 1/4 of luma samples
snr->snr_v = (float) (10 * log10 (max_pix_value_sqd_uv * (double)((double) impix_cr / diff_v))); // v croma snr for current frame, 1/4 of luma samples
}
else
{
snr->snr_u = 0.0;
snr->snr_v = 0.0;
}
}
if (img->number == 0)
{
snr->snr_y1 = snr->snr_y; // keep luma snr for first frame
snr->snr_u1 = snr->snr_u; // keep croma u snr for first frame
snr->snr_v1 = snr->snr_v; // keep croma v snr for first frame
snr->snr_ya = snr->snr_y1;
snr->snr_ua = snr->snr_u1;
snr->snr_va = snr->snr_v1;
// sse stats
snr->msse_y = snr->sse_y;
snr->msse_u = snr->sse_u;
snr->msse_v = snr->sse_v;
for (i=0; i<5; i++)
{
snr->snr_yt[i] = 0.0;
snr->snr_ut[i] = 0.0;
snr->snr_vt[i] = 0.0;
}
}
else
{
//int total_frames = img->number + frame_ctr[B_SLICE];
int total_frames = snr->frame_ctr - 1;
snr->snr_ya = (float) (snr->snr_ya * total_frames + snr->snr_y) / (total_frames + 1); // average snr luma for all frames inc. first
snr->snr_ua = (float) (snr->snr_ua * total_frames + snr->snr_u) / (total_frames + 1); // average snr u croma for all frames inc. first
snr->snr_va = (float) (snr->snr_va * total_frames + snr->snr_v) / (total_frames + 1); // average snr v croma for all frames inc. first
snr->msse_y = (float) (snr->msse_y * total_frames + snr->sse_y) / (total_frames + 1); // average sse luma for all frames inc. first
snr->msse_u = (float) (snr->msse_u * total_frames + snr->sse_u) / (total_frames + 1); // average sse u croma for all frames inc. first
snr->msse_v = (float) (snr->msse_v * total_frames + snr->sse_v) / (total_frames + 1); // average sse v croma for all frames inc. first
}
snr->snr_yt[img->type] = (float) (snr->snr_yt[img->type] * (frame_ctr[img->type] - 1) + snr->snr_y) / ( frame_ctr[img->type] ); // average luma snr for img->type coded frames
snr->snr_ut[img->type] = (float) (snr->snr_ut[img->type] * (frame_ctr[img->type] - 1) + snr->snr_u) / ( frame_ctr[img->type] ); // average chroma u snr for img->type coded frames
snr->snr_vt[img->type] = (float) (snr->snr_vt[img->type] * (frame_ctr[img->type] - 1) + snr->snr_v) / ( frame_ctr[img->type] ); // average chroma v snr for img->type coded frames
}
/*!
************************************************************************
* \brief
* Find SNR for all three components
* for 4:4:4 independent mode
************************************************************************
*/
static void find_snr_JV (void)
{
int i, j;
int64 diff_y=0, diff_u=0, diff_v=0;
int impix;
int impix_cr;
unsigned int max_pix_value_sqd = img->max_imgpel_value * img->max_imgpel_value;
unsigned int max_pix_value_sqd_uv = img->max_imgpel_value_uv * img->max_imgpel_value_uv;
// Calculate PSNR for Y, U and V.
// Luma.
impix = input->img_height * input->img_width;
impix_cr = input->img_height_cr * input->img_width_cr;
if (img->fld_flag != 0)
{
diff_y = 0;
for (i = 0; i < input->img_width; ++i)
{
for (j = 0; j < input->img_height; ++j)
{
diff_y += img->quad[imgY_org[j][i] - imgY_com[j][i]];
}
}
if (img->yuv_format != YUV400)
{
// Chroma.
diff_u = 0;
diff_v = 0;
for (i = 0; i < input->img_width_cr; i++)
{
for (j = 0; j < input->img_height_cr; j++)
{
diff_u += img->quad[imgUV_org[0][j][i] - imgUV_com[0][j][i]];
diff_v += img->quad[imgUV_org[1][j][i] - imgUV_com[1][j][i]];
}
}
}
}
else
{
imgY_org = imgY_org_frm_JV[0];
enc_picture = enc_frame_picture[0];
if(input->PicInterlace==ADAPTIVE_CODING)
{
enc_picture = enc_frame_picture[0];
}
diff_y = 0;
for (i = 0; i < input->img_width; ++i)
{
for (j = 0; j < input->img_height; ++j)
{
diff_y += img->quad[imgY_org[j][i] - enc_picture->imgY[j][i]];
}
}
imgY_org = imgY_org_frm_JV[1];
diff_u = 0;
for (i = 0; i < input->img_width_cr; i++)
{
for (j = 0; j < input->img_height_cr; j++)
{
diff_u += img->quad[imgY_org[j][i] - enc_picture->imgUV[0][j][i]];
}
}
imgY_org = imgY_org_frm_JV[2];
diff_v = 0;
for (i = 0; i < input->img_width_cr; i++)
{
for (j = 0; j < input->img_height_cr; j++)
{
diff_v += img->quad[imgY_org[j][i] - enc_picture->imgUV[1][j][i]];
}
}
}
snr->sse_y = (float)diff_y;
snr->sse_u = (float)diff_u;
snr->sse_v = (float)diff_v;
#if ZEROSNR
if (diff_y == 0)
diff_y = 1;
if (diff_u == 0)
diff_u = 1;
if (diff_v == 0)
diff_v = 1;
#endif
// Collecting SNR statistics
if (diff_y != 0)
{
snr->snr_y = (float) (10 * log10 (max_pix_value_sqd * (double)((double) impix / diff_y))); // luma snr for current frame
if (img->yuv_format != YUV400)
{
snr->snr_u = (float) (10 * log10 (max_pix_value_sqd_uv * (double)((double) impix_cr / diff_u))); // u croma snr for current frame, 1/4 of luma samples
snr->snr_v = (float) (10 * log10 (max_pix_value_sqd_uv * (double)((double) impix_cr / diff_v))); // v croma snr for current frame, 1/4 of luma samples
}
else
{
snr->snr_u = 0.0;
snr->snr_v = 0.0;
}
}
if (img->number == 0)
{
snr->snr_y1 = snr->snr_y; // keep luma snr for first frame
snr->snr_u1 = snr->snr_u; // keep croma u snr for first frame
snr->snr_v1 = snr->snr_v; // keep croma v snr for first frame
snr->snr_ya = snr->snr_y1;
snr->snr_ua = snr->snr_u1;
snr->snr_va = snr->snr_v1;
// sse stats
snr->msse_y = snr->sse_y;
snr->msse_u = snr->sse_u;
snr->msse_v = snr->sse_v;
for (i=0; i<5; i++)
{
snr->snr_yt[i] = 0.0;
snr->snr_ut[i] = 0.0;
snr->snr_vt[i] = 0.0;
}
}
else
{
//int total_frames = img->number + frame_ctr[B_SLICE];
int total_frames = snr->frame_ctr - 1;
snr->snr_ya = (float) (snr->snr_ya * total_frames + snr->snr_y) / (total_frames + 1); // average snr luma for all frames inc. first
snr->snr_ua = (float) (snr->snr_ua * total_frames + snr->snr_u) / (total_frames + 1); // average snr u croma for all frames inc. first
snr->snr_va = (float) (snr->snr_va * total_frames + snr->snr_v) / (total_frames + 1); // average snr v croma for all frames inc. first
snr->msse_y = (float) (snr->msse_y * total_frames + snr->sse_y) / (total_frames + 1); // average sse luma for all frames inc. first
snr->msse_u = (float) (snr->msse_u * total_frames + snr->sse_u) / (total_frames + 1); // average sse u croma for all frames inc. first
snr->msse_v = (float) (snr->msse_v * total_frames + snr->sse_v) / (total_frames + 1); // average sse v croma for all frames inc. first
}
snr->snr_yt[img->type] = (float) (snr->snr_yt[img->type] * (frame_ctr[img->type] - 1) + snr->snr_y) / ( frame_ctr[img->type] ); // average luma snr for img->type coded frames
snr->snr_ut[img->type] = (float) (snr->snr_ut[img->type] * (frame_ctr[img->type] - 1) + snr->snr_u) / ( frame_ctr[img->type] ); // average chroma u snr for img->type coded frames
snr->snr_vt[img->type] = (float) (snr->snr_vt[img->type] * (frame_ctr[img->type] - 1) + snr->snr_v) / ( frame_ctr[img->type] ); // average chroma v snr for img->type coded frames
}
/*!
************************************************************************
* \brief
* Find distortion for all three components
************************************************************************
*/
static void find_distortion (void)
{
int i, j, uv;
int64 diff_cmp[3] = {0};
int impix;
// Calculate PSNR for Y, U and V.
// Luma.
impix = input->img_height * input->img_width;
if (img->structure!=FRAME)
{
for (i = 0; i < input->img_width; ++i)
{
for (j = 0; j < input->img_height; ++j)
{
diff_cmp[0] += iabs2( imgY_org[j][i] - imgY_com[j][i] );
}
}
if (img->yuv_format != YUV400)
{
// Chroma.
for (uv = 0; uv < 2; uv++)
{
for (i = 0; i < input->img_width_cr; i++)
{
for (j = 0; j < input->img_height_cr; j++)
{
diff_cmp[uv + 1] += iabs2( imgUV_org[uv][j][i] - imgUV_com[uv][j][i] );
}
}
}
}
}
else
{
imgY_org = imgY_org_frm;
imgUV_org = imgUV_org_frm;
for (i = 0; i < input->img_width; ++i)
{
for (j = 0; j < input->img_height; ++j)
{
diff_cmp[0] += iabs2( imgY_org[j][i] - enc_picture->imgY[j][i] );
}
}
if (img->yuv_format != YUV400)
{
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -