blob: bdf67227e235424fcc5bda979fd10eca045fe3d4 [file] [log] [blame]
/*!
*************************************************************************************
* \file rdpicdecision.c
*
* \brief
* Perform RD optimal decisions between multiple coded versions of the same picture
*
* \author
* Main contributors (see contributors.h for copyright, address and affiliation details)
* - Alexis Michael Tourapis <alexismt@ieee.org>
*************************************************************************************
*/
#include "global.h"
#include <math.h>
/*!
************************************************************************
* \brief
* RD decision between possible encoding cases
************************************************************************
*/
int rd_pic_decision(double snrY_version1, double snrY_version2, int bits_version1, int bits_version2, double lambda_picture)
{
double cost_version1, cost_version2;
cost_version1 = (double) bits_version1 * lambda_picture + snrY_version1;
cost_version2 = (double) bits_version2 * lambda_picture + snrY_version2;
//printf("%d %d %.2f %.2f %.2f %.2f \n",bits_version1,bits_version2,snrY_version1,snrY_version2,cost_version1,cost_version2);
if (cost_version2 > cost_version1 || (cost_version2 == cost_version1 && snrY_version2 >= snrY_version1) )
return (0);
else
return (1);
}
/*!
************************************************************************
* \brief
* Picture Coding Decision
************************************************************************
*/
int picture_coding_decision (Picture *picture1, Picture *picture2, int qp)
{
double lambda_picture;
int spframe = (img->type == SP_SLICE);
int bframe = (img->type == B_SLICE);
double snr_picture1, snr_picture2;
int bit_picture1, bit_picture2;
if (input->successive_Bframe)
lambda_picture = 0.68 * pow (2, (qp - SHIFT_QP) / 3.0) * (bframe || spframe ? 2 : 1);
else
lambda_picture = 0.68 * pow (2, (qp - SHIFT_QP) / 3.0);
snr_picture1 = picture1->distortion_y + picture1->distortion_u + picture1->distortion_v;
snr_picture2 = picture2->distortion_y + picture2->distortion_u + picture2->distortion_v;
bit_picture2 = picture2->bits_per_picture ;
bit_picture1 = picture1->bits_per_picture;
return rd_pic_decision(snr_picture1, snr_picture2, bit_picture1, bit_picture2, lambda_picture);
}