rdpicdecision.c
上传用户:hjq518
上传日期:2021-12-09
资源大小:5084k
文件大小:2k
源码类别:

Audio

开发平台:

Visual C++

  1. /*!
  2. *************************************************************************************
  3. * file rdpicdecision.c
  4. *
  5. * brief
  6. *    Perform RD optimal decisions between multiple coded versions of the same picture
  7. *
  8. * author
  9. *    Main contributors (see contributors.h for copyright, address and affiliation details)
  10. *     - Alexis Michael Tourapis         <alexismt@ieee.org>
  11. *************************************************************************************
  12. */
  13. #include "global.h"
  14. #include <math.h>
  15. /*!
  16.  ************************************************************************
  17.  * brief
  18.  *    RD decision between possible encoding cases
  19.  ************************************************************************
  20.  */
  21. int rd_pic_decision(double snrY_version1, double snrY_version2, int bits_version1, int bits_version2, double lambda_picture)
  22. {
  23.   double cost_version1, cost_version2;
  24.   cost_version1 = (double) bits_version1 * lambda_picture + snrY_version1;
  25.   cost_version2 = (double) bits_version2 * lambda_picture + snrY_version2;
  26.   //printf("%d %d %.2f %.2f %.2f %.2f n",bits_version1,bits_version2,snrY_version1,snrY_version2,cost_version1,cost_version2);
  27.   if (cost_version2 > cost_version1 || (cost_version2 == cost_version1 && snrY_version2 >= snrY_version1) )
  28.     return (0);
  29.   else
  30.     return (1);
  31. }
  32. /*!
  33.  ************************************************************************
  34.  * brief
  35.  *    Picture Coding Decision
  36.  ************************************************************************
  37.  */
  38. int picture_coding_decision (Picture *picture1, Picture *picture2, int qp)
  39. {
  40.   double lambda_picture;
  41.   int spframe = (img->type == SP_SLICE);
  42.   int bframe = (img->type == B_SLICE);
  43.   double sse_picture1, sse_picture2;
  44.   if (params->successive_Bframe)
  45.     lambda_picture = (qp < 20 ? 0.55 : 0.68) * pow (2, (qp - SHIFT_QP) / 3.0) * (bframe || spframe ? 2 : 1);
  46.   else
  47.     lambda_picture = (qp < 20 ? 0.55 : 0.68) * pow (2, (qp - SHIFT_QP) / 3.0);
  48.   sse_picture1 = picture1->distortion.value[0] + picture1->distortion.value[1] + picture1->distortion.value[2];
  49.   sse_picture2 = picture2->distortion.value[0] + picture2->distortion.value[1] + picture2->distortion.value[2];
  50.  
  51.   return rd_pic_decision(sse_picture1, sse_picture2, picture1->bits_per_picture, picture2->bits_per_picture, lambda_picture);
  52. }