www.pudn.com > jm50g.zip > leaky_bucket.c
/* *********************************************************************** * COPYRIGHT AND WARRANTY INFORMATION * * Copyright 2001, International Telecommunications Union, Geneva * * DISCLAIMER OF WARRANTY * * These software programs are available to the user without any * license fee or royalty on an "as is" basis. The ITU disclaims * any and all warranties, whether express, implied, or * statutory, including any implied warranties of merchantability * or of fitness for a particular purpose. In no event shall the * contributor or the ITU be liable for any incidental, punitive, or * consequential damages of any kind whatsoever arising from the * use of these programs. * * This disclaimer of warranty extends to the user of these programs * and user's customers, employees, agents, transferees, successors, * and assigns. * * The ITU does not represent or warrant that the programs furnished * hereunder are free of infringement of any third-party patents. * Commercial implementations of ITU-T Recommendations, including * shareware, may be subject to royalty fees to patent holders. * Information regarding the ITU-T patent policy is available from * the ITU Web site at http://www.itu.int. * * THIS IS NOT A GRANT OF PATENT RIGHTS - SEE THE ITU-T PATENT POLICY. ************************************************************************ */ /*! ************************************************************************ * \file leaky_bucket.c * * \brief * Calculate if decoder leaky bucket parameters meets HRD constraints specified by encoder. * * \author * Main contributors (see contributors.h for copyright, address and affiliation details) * - Shankar Regunathan************************************************************************ */ #include "contributors.h" #include "global.h" #include "stdlib.h" #ifdef _LEAKYBUCKET_ /*! *********************************************************************** * \brief * Function to get unsigned long word from a file. * \param fp * Filepointer * \return * unsigned long double word * \para SideEffects * None. * \para Notes * File should be opened to read in binary format. * \author * Shankar Regunathan shanre@microsoft.com * \date * December 06, 2001. *********************************************************************** */ /* gets unsigned double stored in Big Endian Order */ unsigned long GetBigDoubleWord(FILE *fp) { register unsigned long dw; dw = (unsigned long) (fgetc(fp) & 0xFF); dw = ((unsigned long) (fgetc(fp) & 0xFF)) | (dw << 0x08); dw = ((unsigned long) (fgetc(fp) & 0xFF)) | (dw << 0x08); dw = ((unsigned long) (fgetc(fp) & 0xFF)) | (dw << 0x08); return(dw); } /*! *********************************************************************** * \brief * Calculates if decoder leaky bucket parameters meets HRD constraints specified by encoder. * \param inp * Structure which contains decoder leaky bucket parameters. * \return * None * \para SideEffects * None. * \para Notes * Failure if LeakyBucketParam file is missing or if it does not have * the correct number of entries. * \author * Shankar Regunathan shanre@microsoft.com * \date * December 06, 2001. *********************************************************************** */ /* Main Routine to verify HRD compliance */ void calc_buffer(struct inp_par *inp) { unsigned long NumberLeakyBuckets, *Rmin, *Bmin, *Fmin; float B_interp, F_interp; unsigned long iBucket; float dnr, frac1, frac2; unsigned long R_decoder, B_decoder, F_decoder; FILE *outf; if ((outf=fopen(inp->LeakyBucketParamFile,"rb"))==NULL) { snprintf(errortext, ET_SIZE, "Error open file %s \n",inp->LeakyBucketParamFile); error(errortext,1); } NumberLeakyBuckets = GetBigDoubleWord(outf); printf(" Number Leaky Buckets: %8ld \n\n", NumberLeakyBuckets); Rmin = calloc(sizeof(unsigned long), NumberLeakyBuckets); Bmin = calloc(sizeof(unsigned long), NumberLeakyBuckets); Fmin = calloc(sizeof(unsigned long), NumberLeakyBuckets); for(iBucket =0; iBucket < NumberLeakyBuckets; iBucket++) { Rmin[iBucket] = GetBigDoubleWord(outf); Bmin[iBucket] = GetBigDoubleWord(outf); Fmin[iBucket] = GetBigDoubleWord(outf); printf(" %8ld %8ld %8ld \n", Rmin[iBucket], Bmin[iBucket], Fmin[iBucket]); } fclose(outf); R_decoder = inp->R_decoder; F_decoder = inp->F_decoder; B_decoder = inp->B_decoder; for( iBucket =0; iBucket < NumberLeakyBuckets; iBucket++) { if(R_decoder < Rmin[iBucket]) break; } printf("\n"); if(iBucket > 0 ) { if(iBucket < NumberLeakyBuckets) { dnr = (float) (Rmin[iBucket] - Rmin[iBucket-1]); frac1 = (float) (R_decoder - Rmin[iBucket-1]); frac2 = (float) (Rmin[iBucket] - R_decoder); B_interp = (float) (Bmin[iBucket] * frac1 + Bmin[iBucket-1] * frac2) /dnr; F_interp = (float) (Fmin[iBucket] * frac1 + Fmin[iBucket-1] * frac2) /dnr; } else { B_interp = (float) Bmin[iBucket-1]; F_interp = (float) Fmin[iBucket-1]; } 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); if(B_decoder > B_interp && F_decoder > F_interp) printf(" HRD Compliant \n"); else printf(" HRD Non Compliant \n"); } else { // (iBucket = 0) printf(" Decoder Rate is too small; HRD cannot be verified \n"); } free(Rmin); free(Bmin); free(Fmin); return; } #endif