URL
https://opencores.org/ocsvn/bluespec-h264/bluespec-h264/trunk
Subversion Repositories bluespec-h264
[/] [bluespec-h264/] [trunk/] [test/] [decoder/] [ldecod/] [src/] [leaky_bucket.c] - Rev 100
Compare with Previous | Blame | View Log
/*! ************************************************************************ * \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 <shanre@microsoft.com> ************************************************************************ */ #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 * \par SideEffects * None. * \par 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 * \par SideEffects * None. * \par 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