📄 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 Leaky Buffer parameters * * \author * Main contributors (see contributors.h for copyright, address and affiliation details) * - Shankar Regunathan <shanre@microsoft.com> *************************************************************************** */#include <stdlib.h>#include <assert.h>#include "contributors.h"#include "global.h"#ifdef _LEAKYBUCKET_long Bit_Buffer[10000];unsigned long total_frame_buffer = 0;/*! *********************************************************************** * \brief * Function to get Leaky Bucket rates from rate file * \param NumberLeakyBuckets * Number of Leaky Bucket Parameters * \param Rmin * Rate values for each Bucket. * \return * returns 1 if successful; else returns zero. * \para SideEffects * None. * \para Notes * Failure if LeakyBucketRate is missing or if it does not have * the correct number of entries. * \author * Shankar Regunathan shanre@microsoft.com * \date * December 06, 2001. *********************************************************************** */int get_LeakyBucketRate(unsigned long NumberLeakyBuckets, unsigned long *Rmin){ FILE *f; unsigned long i, buf; if((f = fopen(input->LeakyBucketRateFile, "r")) == NULL) { printf(" LeakyBucketRate File does not exist; using rate calculated from avg. rate \n"); return 0; } for(i=0; i<NumberLeakyBuckets; i++) { if(1 != fscanf(f, "%ld", &buf)) { printf(" Leaky BucketRateFile does not have valid entries;\n using rate calculated from avg. rate \n"); return 0; } Rmin[i] = buf; } return 1;}/*! *********************************************************************** * \brief * Writes one unsigned long word in big endian order to a file. * \param dw * Value to be written * \param fp * File pointer * \return * None. * \para SideEffects * None. * \author * Shankar Regunathan shanre@microsoft.com * \date * December 06, 2001. *********************************************************************** */void PutBigDoubleWord(unsigned long dw, FILE *fp){ fputc((dw >> 0x18) & 0xFF, fp); fputc((dw >> 0x10) & 0xFF, fp); fputc((dw >> 0x08) & 0xFF, fp); fputc(dw & 0xFF, fp);}/*! *********************************************************************** * \brief * Stores the Leaky BucketParameters in file input->LeakyBucketParamFile. * \param NumberLeakyBuckets * Number of LeakyBuckets. * \param Rmin * Rate values of the buckets. * \param Bmin * Minimum buffer values of the buckets. * \param Fmin * Minimum initial buffer fullness of the buckets * \return * None. * \para * Returns error if LeakyBucketParamFile cannot be opened. * \para SideEffects * Prints the LeakyBucket Parameters in standard output. * \author * Shankar Regunathan shanre@microsoft.com * \date * December 06, 2001. *********************************************************************** */void write_buffer(unsigned long NumberLeakyBuckets, unsigned long Rmin[], unsigned long Bmin[], unsigned long Fmin[]){#ifndef H26L_LIB FILE *outf; unsigned long iBucket; if ((outf=fopen(input->LeakyBucketParamFile,"wb"))==NULL) { snprintf(errortext, ET_SIZE, "Error open file %s \n",input->outfile); error(errortext,1); } PutBigDoubleWord(NumberLeakyBuckets, outf); printf(" Number Leaky Buckets: %ld \n Rmin Bmin Fmin \n", NumberLeakyBuckets); for(iBucket =0; iBucket < NumberLeakyBuckets; iBucket++) { assert(Rmin[iBucket]<4294967296); //Overflow should be corrected already. assert(Bmin[iBucket]<4294967296); assert(Fmin[iBucket]<4294967296); PutBigDoubleWord(Rmin[iBucket], outf); PutBigDoubleWord(Bmin[iBucket], outf); PutBigDoubleWord(Fmin[iBucket], outf); printf(" %8ld %8ld %8ld \n", Rmin[iBucket], Bmin[iBucket], Fmin[iBucket]); } fclose(outf);#endif}/*! *********************************************************************** * \brief * Sorts the rate array in ascending order. * \param NumberLeakyBuckets * Number of LeakyBuckets. * \param Rmin * Rate values of the buckets. * \return * None. * \author * Shankar Regunathan shanre@microsoft.com * \date * December 06, 2001. *********************************************************************** */void Sort(unsigned long NumberLeakyBuckets, unsigned long *Rmin){ unsigned long i, j; unsigned long temp; for(i=0; i< NumberLeakyBuckets-1; i++) { for(j=i+1; j<NumberLeakyBuckets; j++) { if(Rmin[i] > Rmin[j]) { temp = Rmin[i]; Rmin[i] = Rmin[j]; Rmin[j] = temp; } } }}/*! *********************************************************************** * \brief * Main Routine to calculate Leaky Buffer parameters * \param NumberLeakyBuckets * None. * \return * None. * \author * Shankar Regunathan shanre@microsoft.com * \date * December 06, 2001. *********************************************************************** */void calc_buffer(){ unsigned long AvgRate, TotalRate, NumberLeakyBuckets; long *buffer_frame, minB; unsigned long iBucket, iFrame, FrameIndex; long maxBuffer, actualBuffer, InitFullness, iChannelRate; unsigned long *Rmin, *Bmin, *Fmin; fprintf(stdout,"--------------------------------------------------------------------------\n"); printf(" Total Frames: %ld (%d) \n", total_frame_buffer, input->no_frames); NumberLeakyBuckets = (unsigned long) input->NumberLeakyBuckets; buffer_frame = calloc(total_frame_buffer, sizeof(long)); if(!buffer_frame) no_mem_exit("init_buffer: buffer_frame"); Rmin = calloc(NumberLeakyBuckets, sizeof(unsigned long)); if(!Rmin) no_mem_exit("init_buffer: Rmin"); Bmin = calloc(NumberLeakyBuckets, sizeof(unsigned long)); if(!Bmin) no_mem_exit("init_buffer: Bmin"); Fmin = calloc(NumberLeakyBuckets, sizeof(unsigned long)); if(!Fmin) no_mem_exit("init_buffer: Fmin"); TotalRate = 0; for(iFrame=0; iFrame < total_frame_buffer; iFrame++) { TotalRate += (unsigned long) Bit_Buffer[iFrame]; } AvgRate = (unsigned long) ((float) TotalRate/ total_frame_buffer); if(1 != get_LeakyBucketRate(NumberLeakyBuckets, Rmin)) { /* if rate file is not present, use default calculated from avg.rate */ for(iBucket=0; iBucket < NumberLeakyBuckets; iBucket++) { if(iBucket == 0) Rmin[iBucket] = (AvgRate * img->framerate)/(input->jumpd+1); /* convert bits/frame to bits/second */ else Rmin[iBucket] = Rmin[iBucket-1] + (AvgRate/4) * (img->framerate) / (input->jumpd+1); } } Sort(NumberLeakyBuckets, Rmin); maxBuffer = AvgRate * 20; /* any initialization is good. */ for(iBucket=0; iBucket< NumberLeakyBuckets; iBucket++) { iChannelRate = (long) Rmin[iBucket] * (input->jumpd+1)/(img->framerate); /* converts bits/second to bits/frame */ /* To calculate initial buffer size */ InitFullness = maxBuffer; /* set Initial Fullness to be buffer size */ buffer_frame[0] = InitFullness; minB = maxBuffer; for(iFrame=0; iFrame<total_frame_buffer ; iFrame++) { buffer_frame[iFrame] = buffer_frame[iFrame] - Bit_Buffer[iFrame]; if(buffer_frame[iFrame] < minB) { minB = buffer_frame[iFrame]; FrameIndex = iFrame; } buffer_frame[iFrame+1] = buffer_frame[iFrame] + iChannelRate; if(buffer_frame[iFrame+1] > maxBuffer) buffer_frame[iFrame+1] = maxBuffer; } actualBuffer = (maxBuffer - minB); /* To calculate initial buffer Fullness */ InitFullness = Bit_Buffer[0]; buffer_frame[0] = InitFullness; for(iFrame=0; iFrame < FrameIndex+1; iFrame++) { buffer_frame[iFrame] = buffer_frame[iFrame] - Bit_Buffer[iFrame]; if(buffer_frame[iFrame] < 0) { InitFullness -= buffer_frame[iFrame]; buffer_frame[iFrame] = 0; } buffer_frame[iFrame+1] = buffer_frame[iFrame] + iChannelRate; if(buffer_frame[iFrame+1] > actualBuffer) break; } Bmin[iBucket] = (unsigned long) actualBuffer; Fmin[iBucket] = (unsigned long) InitFullness; } write_buffer(NumberLeakyBuckets, Rmin, Bmin, Fmin); free(Rmin); free(Bmin); free(Fmin); return;}#endif
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -