00001 
00002 
00003 
00004 
00005 
00006 
00007 
00008 
00009 
00010 
00011 
00012 
00013 
00014 
00015 
00016 
00017 
00018 
00019 
00020 
00021 
00022 
00023 
00024 
00025 
00026 
00027 
00028 
00029 
00030 
00031 
00032 
00033 
00034 
00035 
00036 
00037 
00038 
00039 
00040 
00041 
00042 
00043 
00044 
00045 
00046 
00047 
00048 
00049 
00050 
00051 #include <sys/times.h>
00052 #include "all.h"
00053 #include "mtypes.h"
00054 #include "bitio.h"
00055 #include "frames.h"
00056 #include "prototypes.h"
00057 #include "param.h"
00058 #include "mheaders.h"
00059 #include "fsize.h"
00060 #include "postdct.h"
00061 #include "mpeg.h"
00062 #include "parallel.h"
00063 #include "dct.h"
00064 #include "rate.h"
00065 
00066 
00067 
00068 
00069 
00070 
00071 #define MAX_BIT_RATE 104857600          
00072 #define MAX_BUFFER_SIZE 16760832        
00073 #define DEFAULT_BUFFER_SIZE 327680      
00074 #define DEFAULT_VBV_FULLNESS 3          
00075 #define DEFAULT_PICT_RATE_CODE 5        
00076 #define DEFAULT_PICT_RATE 30            
00077 #define MAX_VBV_DELAY 32768             
00078 
00079 
00080 
00081 
00082 static int      RateControlMode = VARIABLE_RATE;
00083 static int32 buffer_size = DEFAULT_BUFFER_SIZE;
00084 static int32 bit_rate = -1;
00085 
00086 
00087 
00088 static int32 VBV_delay =0;          
00089 static int32 VBV_buffer = 0;        
00090 static int32 bufferFillRate = 0;    
00091 static int32 frameDelayIncrement = 0;   
00092 
00093 
00094 static int Xi, Xp, Xb;  
00095 
00096 static int Si, Sp, Sb;  
00097 
00098 static float Qi, Qp, Qb; 
00099      
00100 
00101 int Ti, Tp, Tb;
00102 
00103 int current_Tx; 
00104 
00105 
00106 int GOP_X = 0;
00107 int GOP_I = 0;
00108 int GOP_P = 0;
00109 int GOP_B = 0;
00110 
00111 int Nx = 0;
00112 int Ni = 0;
00113 int Np = 0;
00114 int Nb = 0;
00115 
00116 
00117 
00118 int rc_numBlocks = 0;
00119 int rc_totalQuant = 0;
00120 int rc_bitsThisMB;
00121 int rc_totalMBBits;
00122 int rc_totalFrameBits;
00123 int rc_totalOverheadBits = 0;
00124 
00125 
00126 
00127 int RC_MB_SAMPLE_RATE = 0;
00128 
00129 static float Ki = .7;
00130 static float Kp = 1;
00131 static float Kb = 1.4;
00132 static int rc_R;
00133 static int rc_G;
00134 
00135 
00136 
00137 
00138 static int d0_i;   
00139 static int d0_p;
00140 static int d0_b;
00141 
00142 static int lastFrameVirtBuf;   
00143 static int currentVirtBuf;     
00144 
00145 static int MB_cnt = -1;        
00146 
00147 static int rc_Q;               
00148 
00149 static int reactionParameter;  
00150 
00151 
00152 static int act_j;              
00153 static float N_act;            
00154 static int avg_act;        
00155 static int total_act_j;        
00156 
00157 static int var_sblk;           
00158 static int P_mean;             
00159 
00160 static int mquant;             
00161 static int Qscale;             
00162 
00163 
00164 
00165 
00166 #ifdef RC_STATS_FILE
00167 static FILE *RC_FILE;
00168 #endif
00169 
00170 static char *Frame_header1 = "  Fm         #     Bit      GOP                    V                ";
00171 static char *Frame_header2 = "   #  type   MBs   Alloc    left  Ni Np Nb  N_act  buff   Q_rc Qscale";
00172 static char *Frame_header3 = "----     -  ----  ------ -------  -- -- --  -----  ------ ----   ----";
00173 static char *Frame_trailer1 = "                      avg          virt     %    GOP      %     VBV";
00174 static char *Frame_trailer2 = "    Sx    Qx      Xx  act N_act  buffer alloc    left  left     buf  delay";
00175 static char *Frame_trailer3 = "------ --.-- -------  --- --.-- -------   --- -------   --- ------- ------";
00176 
00177 static char *MB_header1 = "MB#  #bits  Q mqt     Dj  Q_j   actj  N_act  totbits b/MB %alloc %done";
00178 static char *MB_header2 = "---  ----- -- --- ------  ---  -----  --.--   ------ ----    ---   ---";
00179 
00180 static char rc_buffer[101];
00181 
00182 
00183 extern char *framePattern;
00184 extern int framePatternLen;
00185 
00186 
00187 
00188 
00189 
00190 
00191 int initGOPRateControl _ANSI_ARGS_((void));
00192      int determineMBCount _ANSI_ARGS_((void));
00193      void checkBufferFullness _ANSI_ARGS_((int count));
00194      void checkSpatialActivity _ANSI_ARGS_((Block blk0, Block blk1, Block blk2, Block blk3));
00195      void incNumBlocks _ANSI_ARGS_((int num));
00196      void calculateVBVDelay _ANSI_ARGS_((int num));
00197      void updateVBVBuffer _ANSI_ARGS_((int frameBits));
00198      int BlockExperiments  _ANSI_ARGS_((int16 *OrigBlock, int16 *NewBlock, int control));
00199      
00200      
00201      
00202 
00203 
00204      
00205      
00206 
00207 
00208 
00209 
00210 
00211 
00212 
00213 
00214 
00215 
00216 
00217      int
00218        initRateControl()
00219 {
00220   int index;
00221   int result;
00222   
00223   DBG_PRINT(("\tInitializing Allocation Data\n"));
00224   
00225 #ifdef RC_STATS_FILE
00226   RC_FILE = fopen("RC_STATS_FILE", "w");
00227   if ( RC_FILE  == NULL) {
00228     DBG_PRINT(("\tOpen of RC file failed, using stderr\n"));
00229     RC_FILE = stderr;
00230     fprintf(RC_FILE, "\tOpen of RC file failed, using stderr\n");
00231     fflush(RC_FILE);
00232   }
00233 #endif
00234   
00235   
00236   GOP_X = framePatternLen;
00237   for ( index = 0; index < framePatternLen; index++ ) {
00238     switch( framePattern[index] ) {
00239     case 'i':
00240       GOP_I++;
00241       break;
00242     case 'p':
00243       GOP_P++;
00244       break;
00245     case 'b':
00246       GOP_B++;
00247       break;
00248     default:
00249       printf("\n\tERROR rate.c - BAD PATTERN!\n");
00250       RateControlMode = VARIABLE_RATE;
00251       return (0);
00252     }
00253   }
00254   if (GOP_X != (GOP_I + GOP_P + GOP_B )) {
00255     printf("\n\tERROR rate.c - Pattern Length Mismatch\n");
00256     RateControlMode = VARIABLE_RATE;
00257     return (-1);
00258   }
00259   
00260    
00261   rc_R = 0;
00262   rc_G = (bit_rate * GOP_X/frameRateRounded);
00263   
00264   
00265   Xi = (160 * bit_rate/115);
00266   Xp = (60 * bit_rate/115);
00267   Xb = (42 * bit_rate/115);
00268   
00269   
00270   rc_totalMBBits= rc_bitsThisMB= rc_totalFrameBits=rc_totalOverheadBits = 0;
00271   rc_numBlocks = rc_totalQuant = 0;
00272   
00273   
00274   reactionParameter = (2 * bit_rate / frameRateRounded);
00275   d0_i = (10 * reactionParameter / 31);
00276   d0_p = (Kp * d0_i);
00277   d0_b = (Kb * d0_i);
00278   
00279   lastFrameVirtBuf = d0_i;      
00280   rc_Q = lastFrameVirtBuf  * 31 / reactionParameter;
00281   
00282   
00283   avg_act = 400;                
00284   N_act = 1;
00285   
00286   mquant = rc_Q * N_act;
00287   
00288   frameDelayIncrement = (90000 / frameRateRounded); 
00289   bufferFillRate = bit_rate / frameRateRounded; 
00290   VBV_buffer = buffer_size;
00291   DBG_PRINT(("\tVBV- delay: %d, fill rate: %d, delay/Frame: %d units, buffer size: %d\n",
00292              VBV_delay, bufferFillRate, frameDelayIncrement, buffer_size));
00293   
00294   result = initGOPRateControl();
00295   
00296   return result;
00297 }
00298 
00299 
00300 
00301 
00302 
00303 
00304 
00305 
00306 
00307 
00308 
00309 
00310 
00311 int
00312   initGOPRateControl()
00313 {
00314   DBG_PRINT(("\tInitializing new GOP\n"));
00315   
00316   Nx = GOP_X;
00317   Ni = GOP_I;
00318   Np = GOP_P;
00319   Nb = GOP_B;
00320   
00321   rc_R += rc_G;
00322   
00323   DBG_PRINT(("\tbufsize: %d, bitrate: %d, pictrate: %d, GOP bits: %d\n",
00324              buffer_size, bit_rate, frameRateRounded, rc_R));
00325   DBG_PRINT(("\tXi: %d, Xp: %d, Xb: %d Nx: %d, Ni: %d, Np: %d, Nb: %d\n",
00326              Xi, Xp, Xb, Nx,Ni,Np,Nb));
00327   DBG_PRINT(("\td0_i: %d, d0_p: %d, d0_b: %d, avg_act: %d, rc_Q: %d, mquant: %d\n",
00328              d0_i, d0_p, d0_b, avg_act, rc_Q, mquant));
00329   return 1;
00330 }
00331 
00332 
00333 
00334 
00335 
00336 
00337 
00338 
00339 
00340 
00341 
00342 
00343 
00344 
00345 void
00346   targetRateControl(frame)
00347 MpegFrame   *frame;
00348 {
00349   float temp1, minimumBits;
00350   float tempX, tempY, tempZ;
00351   int result;
00352   int frameType;
00353   char *strPtr;
00354   
00355   minimumBits = (bit_rate / (8 * frameRateRounded));
00356   
00357   
00358   if (Nx == 0) {
00359     initGOPRateControl();
00360   }
00361   
00362   if (MB_cnt < 0) {MB_cnt = determineMBCount();}
00363   
00364   switch (frame->type) {
00365   case TYPE_IFRAME:
00366     frameType = 'I';
00367     
00368     
00369     
00370     tempX = ( (Np * Ki * Xp) / (Xi * Kp) );
00371     tempY = ( (Nb * Ki * Xb) / (Xi*Kb) );
00372     tempZ = Ni + tempX + tempY;
00373     temp1 = (rc_R / tempZ);
00374     result = (int) (temp1 > minimumBits ? temp1 :  minimumBits);
00375     current_Tx = Ti = result;
00376     lastFrameVirtBuf = d0_i;
00377     break;
00378     
00379   case TYPE_PFRAME:
00380     frameType = 'P';
00381     tempX =  ( (Ni * Kp * Xi) / (Ki * Xp) );
00382     tempY =  ( (Nb * Kp * Xb) / (Kb * Xp) );
00383     tempZ = Np + tempX + tempY;
00384     temp1 = (rc_R/ tempZ);
00385     result = (int) (temp1 > minimumBits ? temp1 :  minimumBits);
00386     current_Tx = Tp = result;
00387     lastFrameVirtBuf = d0_p;
00388     break;
00389     
00390   case TYPE_BFRAME:
00391     frameType = 'B';
00392     tempX =  ( (Ni * Kb * Xi) / (Ki * Xb) );
00393     tempY =  ( (Np * Kb * Xp) / (Kp * Xb) );
00394     tempZ = Nb + tempX + tempY;
00395     temp1 = (rc_R/ tempZ);
00396     result = (int) (temp1 > minimumBits ? temp1 :  minimumBits);
00397     current_Tx = Tb = result;
00398     lastFrameVirtBuf = d0_b;
00399     break;
00400     
00401   default:
00402     frameType = 'X';
00403   }
00404   
00405   N_act = 1;
00406   rc_Q = lastFrameVirtBuf  * 31 / reactionParameter;
00407   mquant = rc_Q * N_act;
00408   Qscale = (mquant > 31 ? 31 : mquant);
00409   Qscale = (Qscale < 1 ? 1 : Qscale);
00410   
00411   
00412   strPtr = Frame_header1;
00413   DBG_PRINT(("%s\n",strPtr));
00414   strPtr = Frame_header2;
00415   DBG_PRINT(("%s\n",strPtr));
00416   strPtr = Frame_header3;
00417   DBG_PRINT(("%s\n",strPtr));
00418   
00419   
00420   sprintf(rc_buffer, "%4d     %1c  %4d  %6d %7d  %2d %2d %2d   %2.2f  %6d %4d    %3d",
00421           frame->id,frameType,MB_cnt,current_Tx,rc_R,Ni,Np,Nb, N_act, lastFrameVirtBuf, rc_Q, Qscale);
00422   
00423 #ifdef RC_STATS_FILE
00424   fprintf(RC_FILE,"%s\n", rc_buffer);
00425   fflush(RC_FILE);
00426 #endif
00427   DBG_PRINT(("%s\n",rc_buffer));
00428   
00429   
00430   if (RC_MB_SAMPLE_RATE) {
00431     strPtr = MB_header1;
00432     DBG_PRINT(("%s\n",strPtr));
00433     strPtr = MB_header2;
00434     DBG_PRINT(("%s\n",strPtr));
00435   } else {
00436     return;
00437   }
00438   
00439   return;
00440 }
00441 
00442 
00443 
00444 
00445 
00446 
00447 
00448 
00449 
00450 
00451 
00452 
00453 
00454 
00455 
00456 void
00457   updateRateControl(type)
00458 int type; 
00459 {
00460   int totalBits, frameComplexity, pctAllocUsed, pctGOPUsed;
00461   float avgQuant;
00462   char *strPtr;
00463   
00464   totalBits = rc_totalFrameBits;
00465   avgQuant = ((float) rc_totalQuant / (float) rc_numBlocks);
00466   frameComplexity = totalBits * avgQuant;
00467   pctAllocUsed = (totalBits *100 / current_Tx);
00468   rc_R -= totalBits;
00469   pctGOPUsed = (rc_R *100/ rc_G);
00470   
00471   avg_act = (total_act_j / MB_cnt);
00472   
00473   updateVBVBuffer(totalBits);
00474   
00475   switch (type) {
00476   case TYPE_IFRAME:
00477     Ti = current_Tx;
00478     d0_i = currentVirtBuf;
00479     Ni--;
00480     Si = totalBits;
00481     Qi = avgQuant;
00482     Xi = frameComplexity;
00483     break;
00484   case TYPE_PFRAME:
00485     Tp = current_Tx;
00486     d0_p = currentVirtBuf;
00487     Np--;
00488     Sp = totalBits;
00489     Qp = avgQuant;
00490     Xp = frameComplexity;
00491     break;
00492   case TYPE_BFRAME:
00493     Tb = current_Tx;
00494     d0_b = currentVirtBuf;
00495     Nb--;
00496     Sb = totalBits;
00497     Qb = avgQuant;
00498     Xb = frameComplexity;
00499     break;
00500   }
00501   
00502   
00503   
00504   strPtr = Frame_trailer1;
00505   DBG_PRINT(("%s\n",strPtr));
00506   strPtr = Frame_trailer2;
00507   DBG_PRINT(("%s\n",strPtr));
00508   strPtr = Frame_trailer3;
00509   DBG_PRINT(("%s\n",strPtr));
00510   
00511   sprintf(rc_buffer, "%6d  %2.2f  %6d  %3d  %2.2f %7d   %3d %7d   %3d  %6d %6d",
00512           totalBits, avgQuant, frameComplexity, avg_act, N_act, currentVirtBuf, pctAllocUsed, rc_R, pctGOPUsed, VBV_buffer, VBV_delay);
00513 #ifdef RC_STATS_FILE
00514   fprintf(RC_FILE,"%s\n", rc_buffer);
00515   fflush(RC_FILE);
00516 #endif
00517   DBG_PRINT(("%s\n",rc_buffer));
00518   
00519   Nx--;
00520   rc_totalMBBits= rc_bitsThisMB= rc_totalFrameBits=rc_totalOverheadBits = 0;
00521   rc_numBlocks = rc_totalQuant = total_act_j = currentVirtBuf = 0;
00522   
00523   DBG_PRINT(("GOP now has %d bits remaining (%3d%%) for %d frames .. , Ni= %d, Np= %d, Nb= %d\n", rc_R, (rc_R*100/rc_G), (Ni+Np+Nb), Ni, Np, Nb));
00524   
00525 }
00526 
00527 
00528 
00529 
00530 
00531 
00532 
00533 
00534 
00535 
00536 
00537 
00538 
00539 
00540 
00541 
00542 
00543 
00544 void
00545   MB_RateOut(type)
00546 int type;
00547 {
00548   int totalBits;
00549   int pctUsed, pctDone;
00550   int bitsThisMB;
00551   int bitsPerMB;
00552   
00553   bitsThisMB = rc_bitsThisMB;
00554   totalBits = rc_totalFrameBits;
00555   bitsPerMB = (totalBits / rc_numBlocks); 
00556   pctDone = (rc_numBlocks * 100/ MB_cnt); 
00557   pctUsed = (totalBits *100/current_Tx);
00558   
00559   sprintf(rc_buffer, "%3d  %5d %2d %3d %6d  %3d %6d   %2.2f   %6d %4d    %3d   %3d\n",
00560           (rc_numBlocks - 1), bitsThisMB, Qscale, mquant, currentVirtBuf, 
00561           rc_Q, act_j, N_act, totalBits, bitsPerMB, pctUsed, pctDone);
00562 #ifdef RC_STATS_FILE
00563   fprintf(RC_FILE, "%s", rc_buffer);
00564   fflush(RC_FILE);
00565 #endif
00566   
00567   if ( (RC_MB_SAMPLE_RATE) && ((rc_numBlocks -1) % RC_MB_SAMPLE_RATE)) {
00568     DBG_PRINT(("%s\n", rc_buffer));
00569   } else {
00570     return;
00571   }
00572 }
00573 
00574 
00575 
00576 
00577 
00578 
00579 
00580 
00581 
00582 
00583 
00584 
00585 
00586 
00587 
00588 void incNumBlocks(num)
00589      int num;
00590 {
00591   rc_numBlocks += num;
00592 }
00593 
00594 
00595 
00596 
00597 
00598 
00599 
00600 
00601 
00602 
00603 
00604 
00605 
00606 
00607 
00608 
00609 void incMacroBlockBits(num)
00610      int num;
00611 {
00612   rc_bitsThisMB = num;
00613   rc_totalMBBits += num;
00614   rc_totalFrameBits += num;
00615 }
00616 
00617 
00618 
00619 
00620 
00621 
00622 
00623 
00624 
00625 
00626 
00627 
00628 int needQScaleChange(oldQScale, blk0, blk1, blk2, blk3)
00629      int oldQScale;
00630      Block blk0;
00631      Block blk1;
00632      Block blk2;
00633      Block blk3;
00634 {
00635   
00636   
00637   rc_numBlocks++;               
00638   
00639   checkBufferFullness(oldQScale);
00640   
00641   checkSpatialActivity(blk0, blk1, blk2, blk3);
00642   
00643   mquant = rc_Q * N_act;
00644   Qscale = (mquant > 31 ? 31 : mquant);
00645   Qscale = (Qscale < 1 ? 1 : Qscale);
00646   rc_totalQuant += Qscale;
00647   
00648   if (oldQScale == Qscale)
00649     return -1;
00650   else
00651     return Qscale;
00652 }
00653 
00654 
00655 
00656 
00657 
00658 
00659 
00660 
00661 
00662 
00663 
00664 
00665 
00666 
00667 int
00668   determineMBCount ()
00669 {
00670   int y,x;
00671   
00672   x = (Fsize_x +15)/16;
00673   y = (Fsize_y +15)/16;
00674   return  (x * y);
00675 }
00676 
00677 
00678 
00679 
00680 
00681 
00682 
00683 
00684 
00685 
00686 
00687 
00688 
00689 
00690 
00691 
00692 
00693 
00694 
00695 void checkBufferFullness (oldQScale)
00696      int oldQScale;
00697 {
00698   int temp;
00699   
00700   temp = lastFrameVirtBuf + rc_totalFrameBits;
00701   temp -=  (current_Tx * rc_numBlocks / MB_cnt);
00702   currentVirtBuf = temp;
00703   
00704   rc_Q = (currentVirtBuf * 31 / reactionParameter);
00705   return;
00706 }
00707 
00708 
00709 
00710 
00711 
00712 
00713 
00714 
00715 
00716 
00717 
00718 
00719 
00720 
00721 
00722 
00723 
00724 void checkSpatialActivity(blk0, blk1, blk2, blk3)
00725      Block blk0;
00726      Block blk1;
00727      Block blk2;
00728      Block blk3;
00729 {
00730   int temp;
00731   int16 *blkArray[4]; 
00732   int16 *curBlock;
00733   int16 *blk_ptr;
00734   int var[4];
00735   int i, j;
00736   
00737   
00738   blkArray[0] = (int16 *) blk0;
00739   blkArray[1] = (int16 *) blk1;
00740   blkArray[2] = (int16 *) blk2;
00741   blkArray[3] = (int16 *) blk3;
00742   
00743   
00744   for (i =0; i < 4; i++) {      
00745     curBlock = blkArray[i];
00746     blk_ptr = curBlock;
00747     P_mean = 0;
00748     
00749     for (j=0; j < DCTSIZE_SQ; j ++) {
00750       P_mean += *(blk_ptr++);
00751       
00752 
00753 
00754 
00755 
00756     }
00757     P_mean /= DCTSIZE_SQ;
00758     
00759     
00760     curBlock = blkArray[i];
00761     blk_ptr = curBlock;
00762     var[i] = 0;
00763     for (j=0; j < DCTSIZE_SQ; j++) {
00764 #ifdef notdef
00765       if (curBlock[j] != *(blk_ptr++)) {
00766         printf("\n\tARRAY ERROR: block %d\n", j);
00767       }
00768       temp = curBlock[j] - P_mean;
00769 #endif      
00770       temp = *(blk_ptr++) - P_mean;
00771       var[i] += (temp * temp);
00772     }
00773     var[i] /= DCTSIZE_SQ;
00774   }
00775   
00776   
00777   var_sblk  = var[0];
00778   for (i=1; i < 4; i++) {
00779     var_sblk = (var_sblk < var[i] ? var_sblk : var[i]);
00780   }
00781   
00782   
00783   act_j = 1 + var_sblk;
00784   total_act_j += act_j;
00785   temp = (2 * act_j + avg_act);
00786   N_act = ( (float) temp / (float) (act_j + 2*avg_act) );
00787   
00788   return;
00789 }
00790 
00791 
00792 
00793 
00794 
00795 
00796 
00797 
00798 
00799 
00800 
00801 
00802 
00803 
00804 
00805 
00806 int getRateMode()
00807 {
00808   return RateControlMode;
00809 }
00810 
00811 
00812 
00813 
00814 
00815 
00816 
00817 
00818 
00819 
00820 
00821 
00822 
00823 
00824 
00825 
00826 
00827 void setBitRate (charPtr)
00828      char * charPtr;
00829 {
00830   int rate, rnd;
00831   
00832   rate = atoi(charPtr);
00833   if (rate > 0) {
00834     RateControlMode = FIXED_RATE;
00835   } else {
00836     printf("Parameter File Error:  invalid BIT_RATE: \"%s\", defaults to Variable ratemode\n",
00837            charPtr);
00838     RateControlMode = VARIABLE_RATE;
00839     bit_rate = -1;
00840   }
00841   rnd = (rate % 400);
00842   rate += (rnd ? 400 -rnd : 0); 
00843   rate = (rate > MAX_BIT_RATE ? MAX_BIT_RATE : rate);
00844   bit_rate = rate;
00845   DBG_PRINT(("Bit rate is: %d\n", bit_rate));
00846 } 
00847 
00848 
00849 
00850 
00851 
00852 
00853 
00854 
00855 
00856 
00857 
00858 
00859 
00860 
00861 
00862 
00863 int getBitRate ()
00864 {
00865   return bit_rate;
00866 }
00867 
00868 
00869 
00870 
00871 
00872 
00873 
00874 
00875 
00876 
00877 
00878 
00879 
00880 
00881 
00882 
00883 
00884 
00885 void setBufferSize (charPtr)
00886      char * charPtr;
00887 {
00888   int size;
00889   
00890   size = atoi(charPtr);
00891   size = (size > MAX_BUFFER_SIZE ? MAX_BUFFER_SIZE : size);
00892   if (size > 0) {
00893     size = (16*1024) * ((size + (16*1024 - 1)) / (16*1024));
00894     buffer_size = size;
00895   } else {
00896     buffer_size = DEFAULT_BUFFER_SIZE;
00897     printf("Parameter File Error:  invalid BUFFER_SIZE: \"%s\", defaults to : %d\n",
00898            charPtr, buffer_size);
00899   }
00900   DBG_PRINT(("Buffer size is: %d\n", buffer_size));
00901 }
00902 
00903 
00904 
00905 
00906 
00907 
00908 
00909 
00910 
00911 
00912 
00913 
00914 
00915 
00916 int getBufferSize ()
00917 {
00918   return buffer_size;
00919 }
00920 
00921 
00922 
00923 
00924 
00925 
00926 
00927 
00928 
00929 
00930 
00931 
00932 
00933 
00934 
00935 
00936 
00937 
00938 void updateVBVBuffer (frameBits)
00939      int frameBits;
00940 {
00941   if (VBV_delay) {
00942     VBV_delay -= frameDelayIncrement;
00943     if (VBV_delay < 0) {
00944       VBV_delay = 0;
00945     }
00946     
00947   } else {
00948     VBV_buffer -= frameBits;
00949   }
00950   VBV_buffer += bufferFillRate;
00951   if (VBV_buffer < 0) {
00952     fprintf(stderr, "\tWARNING - VBV buffer underflow (%d)\n", VBV_buffer);
00953   }
00954   if (VBV_buffer > buffer_size) {
00955     fprintf(stderr, "WARNING - VBV buffer overflow (%d > %d)\n",
00956             VBV_buffer, buffer_size);
00957   }
00958 }