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

Audio

开发平台:

Visual C++

  1. /*!
  2.  ************************************************************************
  3.  * file  leaky_bucket.c
  4.  *
  5.  * brief
  6.  *   Calculate if decoder leaky bucket parameters meets HRD constraints specified by encoder.
  7.  *
  8.  * author
  9.  *    Main contributors (see contributors.h for copyright, address and affiliation details)
  10.  *    - Shankar Regunathan                   <shanre@microsoft.com>
  11.  ************************************************************************
  12.  */
  13. #include "contributors.h"
  14. #include "global.h"
  15. #ifdef _LEAKYBUCKET_
  16. /*!
  17.  ***********************************************************************
  18.  * brief
  19.  *   Function to get unsigned long word from a file.
  20.  * param fp
  21.  *    Filepointer
  22.  * return
  23.  *    unsigned long double word
  24.  * par SideEffects
  25.  *     None.
  26.  *  par Notes
  27.  *     File should be opened to read in binary format.
  28.  * author
  29.  *    Shankar Regunathan                   shanre@microsoft.com
  30.  *  date
  31.  *      December 06, 2001.
  32.  ***********************************************************************
  33.  */
  34. /* gets unsigned double stored in Big Endian Order */
  35. unsigned long GetBigDoubleWord(FILE *fp)
  36. {
  37.   register unsigned long dw;
  38.   dw =  (unsigned long) (fgetc(fp) & 0xFF);
  39.   dw = ((unsigned long) (fgetc(fp) & 0xFF)) | (dw << 0x08);
  40.   dw = ((unsigned long) (fgetc(fp) & 0xFF)) | (dw << 0x08);
  41.   dw = ((unsigned long) (fgetc(fp) & 0xFF)) | (dw << 0x08);
  42.   return(dw);
  43. }
  44. /*!
  45.  ***********************************************************************
  46.  * brief
  47.  *   Calculates if decoder leaky bucket parameters meets HRD constraints specified by encoder.
  48.  * param inp
  49.  *    Structure which contains decoder leaky bucket parameters.
  50.  * return
  51.  *    None
  52.  * par SideEffects
  53.  *     None.
  54.  * par Notes
  55.  *     Failure if LeakyBucketParam file is missing or if it does not have
  56.  *     the correct number of entries.
  57.  * author
  58.  *    Shankar Regunathan                   shanre@microsoft.com
  59.  *  date
  60.  *      December 06, 2001.
  61.  ***********************************************************************
  62.  */
  63. /* Main Routine to verify HRD compliance */
  64. void calc_buffer(struct inp_par *inp)
  65. {
  66.   unsigned long NumberLeakyBuckets, *Rmin, *Bmin, *Fmin;
  67.   float B_interp,  F_interp;
  68.   unsigned long iBucket;
  69.   float dnr, frac1, frac2;
  70.   unsigned long R_decoder, B_decoder, F_decoder;
  71.   FILE *outf;
  72.   if ((outf=fopen(inp->LeakyBucketParamFile,"rb"))==NULL)
  73.     {
  74.     snprintf(errortext, ET_SIZE, "Error open file %s n",inp->LeakyBucketParamFile);
  75.     error(errortext,1);
  76.     }
  77.   NumberLeakyBuckets = GetBigDoubleWord(outf);
  78.   printf(" Number Leaky Buckets: %8ld nn", NumberLeakyBuckets);
  79.   Rmin = calloc(sizeof(unsigned long), NumberLeakyBuckets);
  80.   Bmin = calloc(sizeof(unsigned long), NumberLeakyBuckets);
  81.   Fmin = calloc(sizeof(unsigned long), NumberLeakyBuckets);
  82.   for(iBucket =0; iBucket < NumberLeakyBuckets; iBucket++)
  83.   {
  84.     Rmin[iBucket] = GetBigDoubleWord(outf);
  85.     Bmin[iBucket] = GetBigDoubleWord(outf);
  86.     Fmin[iBucket] = GetBigDoubleWord(outf);
  87.     printf(" %8ld %8ld %8ld n", Rmin[iBucket], Bmin[iBucket], Fmin[iBucket]);
  88.   }
  89.   fclose(outf);
  90.   R_decoder = inp->R_decoder;
  91.   F_decoder = inp->F_decoder;
  92.   B_decoder = inp->B_decoder;
  93.   for( iBucket =0; iBucket < NumberLeakyBuckets; iBucket++)
  94.   {
  95.     if(R_decoder < Rmin[iBucket])
  96.       break;
  97.   }
  98.   printf("n");
  99.   if(iBucket > 0 ) 
  100.   {
  101.     if(iBucket < NumberLeakyBuckets) 
  102.     {
  103.       dnr = (float) (Rmin[iBucket] - Rmin[iBucket-1]);
  104.       frac1 = (float) (R_decoder - Rmin[iBucket-1]);
  105.       frac2 = (float) (Rmin[iBucket] - R_decoder);
  106.       B_interp = (float) (Bmin[iBucket] * frac1 + Bmin[iBucket-1] * frac2) /dnr;
  107.       F_interp = (float) (Fmin[iBucket] * frac1 + Fmin[iBucket-1] * frac2) /dnr;
  108.     }
  109.     else {
  110.       B_interp = (float) Bmin[iBucket-1];
  111.       F_interp = (float) Fmin[iBucket-1];
  112.     }
  113.     printf(" Min.buffer %8.2f Decoder buffer size %ld n Minimum Delay %8.2f DecoderDelay %ld n", B_interp, B_decoder, F_interp, F_decoder);
  114.     if(B_decoder > B_interp && F_decoder > F_interp)
  115.       printf(" HRD Compliant n");
  116.     else
  117.       printf(" HRD Non Compliant n");
  118.   }
  119.   else { // (iBucket = 0)
  120.     printf(" Decoder Rate is too small; HRD cannot be verified n");
  121.   }
  122.   free(Rmin);
  123.   free(Bmin);
  124.   free(Fmin);
  125.   return;
  126. }
  127. #endif