⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 bitrate.c

📁 在x86平台上运行不可信任代码的sandbox。
💻 C
📖 第 1 页 / 共 2 页
字号:
      bm->avg_binacc[i]+=LACING_ADJUST(head_ptr[i]);    bm->avg_sampleacc+=ci->blocksizes[vb->W]>>1;    bm->avg_centeracc+=ci->blocksizes[vb->W]>>1;    if(bm->avg_sampleacc>bm->avg_sampledesired || eofflag){      /* update the avg center */      if(bm->avg_centeracc>desired_center){	/* choose the new average floater */	int samples=ci->blocksizes[vb->W]>>1;	double upper=floater_interpolate(bm,vi,bi->queue_avgmax);	double lower=floater_interpolate(bm,vi,bi->queue_avgmin);	double new=PACKETBLOBS/2.,slew;	int bin;		if(upper<new)new=upper;	if(lower>new)new=lower;		slew=(new-bm->avgfloat)/samples*vi->rate;		if(slew<bi->avgfloat_downslew_max)	  new=bm->avgfloat+bi->avgfloat_downslew_max/vi->rate*samples;	if(slew>bi->avgfloat_upslew_max)	  new=bm->avgfloat+bi->avgfloat_upslew_max/vi->rate*samples;		bm->avgfloat=new;	/* apply the average floater to new blocks */	bin=rint(bm->avgfloat);	/*fprintf(stderr,"%d ",bin);*/		while(bm->avg_centeracc>desired_center){	  samples=ci->blocksizes[bm->queue_actual[bm->avg_center]&				0x80000000UL?1:0]>>1;	  	  bm->queue_actual[bm->avg_center]|=bin;	  	  bm->avg_centeracc-=samples;	  bm->avg_center++;	  if(bm->avg_center>=bm->queue_size)bm->avg_center=0;	}	new_minmax_head=bm->avg_center;	      }            /* update the avg tail if needed */      while(bm->avg_sampleacc>bm->avg_sampledesired){	int samples=	  ci->blocksizes[bm->queue_actual[bm->avg_tail]&0x80000000UL?1:0]>>1;	for(i=0;i<bm->queue_bins;i++)	  bm->avg_binacc[i]-=LACING_ADJUST(bm->queue_binned[bins*bm->avg_tail+i]);	bm->avg_sampleacc-=samples;	bm->avg_tail++;	if(bm->avg_tail>=bm->queue_size)bm->avg_tail=0;      }                }  }else{    /* if we're not using an average tracker, the 'float' is nailed to       the avgfloat_initial value.  It needs to be set for the min/max       to deal properly */    long bin=PACKETBLOBS/2;    bm->queue_actual[head]|=bin;    new_minmax_head=next_head;  }	    /* update the min/max queues and enforce limits */  if(bm->minmax_binstack){    unsigned long sampledesired=eofflag?0:bm->minmax_sampledesired;        /* add to stack recent */    while(minmax_head!=new_minmax_head){      unsigned int i;      int samples=ci->blocksizes[bm->queue_actual[minmax_head]&				0x80000000UL?1:0]>>1;      int actual=bm->queue_actual[minmax_head]&0x7fffffffUL;      for(i=0;i<(unsigned int)bins;i++){	bm->minmax_binstack[bm->minmax_stackptr*bins*2+bins+i]+=	  LACING_ADJUST(BINBYTES(bm,minmax_head,				actual>i?actual:i));		bm->minmax_binstack[bm->minmax_stackptr*bins*2+i]+=	  LACING_ADJUST(BINBYTES(bm,minmax_head,				actual<i?actual:i));      }            bm->minmax_posstack[bm->minmax_stackptr]=minmax_head; /* not one							       past							       like							       typical */      bm->minmax_limitstack[bm->minmax_stackptr]=0;      bm->minmax_sampleacc+=samples;      bm->minmax_acctotal+=	LACING_ADJUST(BINBYTES(bm,minmax_head,actual));            minmax_head++;      if(minmax_head>=bm->queue_size)minmax_head=0;    }        /* check limits, enforce changes */    if(bm->minmax_sampleacc>sampledesired){      double bitrate=(double)(bm->minmax_acctotal*8)/	bm->minmax_sampleacc*vi->rate;      int limit=0;            if((bi->queue_hardmax>0 && bitrate>bi->queue_hardmax) || 	 (bi->queue_hardmin>0 && bitrate<bi->queue_hardmin)){	int newstack;	int stackctr;	long bitsum=bm->minmax_acctotal*8;	bitrate=(double)bitsum/bm->minmax_sampleacc*vi->rate;	/* we're off rate.  Iteratively try out new hard floater           limits until we find one that brings us inside.  Here's           where we see the whole point of the limit stacks.  */	if(bi->queue_hardmax>0 && bitrate>bi->queue_hardmax){	  for(limit=-1;limit>-bins+1;limit--){	    long bitsum=limit_sum(bm,limit)*8;	    bitrate=(double)bitsum/bm->minmax_sampleacc*vi->rate;	    if(bitrate<=bi->queue_hardmax)break;	  }	}else if(bitrate<bi->queue_hardmin){	  for(limit=1;limit<bins-1;limit++){	    long bitsum=limit_sum(bm,limit)*8;	    bitrate=(double)bitsum/bm->minmax_sampleacc*vi->rate;	    if(bitrate>=bi->queue_hardmin)break;	  }	  if(bitrate>bi->queue_hardmax)limit--;	}	/* trace the limit backward, stop when we see a lower limit */	newstack=bm->minmax_stackptr-1;	while(newstack>=0){	  if(bm->minmax_limitstack[newstack]<limit)break;	  newstack--;	}		/* update bit counter with new limit and replace any stack           limits that have been replaced by our new lower limit */	stackctr=bm->minmax_stackptr;	while(stackctr>newstack){	  bm->minmax_acctotal-=	    LIMITBYTES(stackctr,bm->minmax_limitstack[stackctr]);	  bm->minmax_acctotal+=LIMITBYTES(stackctr,limit);	  	  if(stackctr<bm->minmax_stackptr)	    for(i=0;i<bins*2;i++)	      bm->minmax_binstack[stackctr*bins*2+i]+=		bm->minmax_binstack[(stackctr+1)*bins*2+i];	  stackctr--;	}	stackctr++;	bm->minmax_posstack[stackctr]=bm->minmax_posstack[bm->minmax_stackptr];	bm->minmax_limitstack[stackctr]=limit;	/* set up new blank stack entry */	stackctr++;	bm->minmax_stackptr=stackctr;	memset(&bm->minmax_binstack[stackctr*bins*2],	       0,	       sizeof(*bm->minmax_binstack)*bins*2);	bm->minmax_limitstack[stackctr]=0;	bm->minmax_posstack[stackctr]=-1;	      }    }        /* remove from tail */    while(bm->minmax_sampleacc>sampledesired){      int samples=	ci->blocksizes[bm->queue_actual[bm->minmax_tail]&0x80000000UL?1:0]>>1;      int actual=bm->queue_actual[bm->minmax_tail]&0x7fffffffUL;      for(i=0;i<bins;i++){	bm->minmax_binstack[bins+i]-= /* always comes off the stack bottom */	  LACING_ADJUST(BINBYTES(bm,bm->minmax_tail,				actual>i?				actual:i));	bm->minmax_binstack[i]-= 	  LACING_ADJUST(BINBYTES(bm,bm->minmax_tail,				actual<i?				actual:i));      }      if(bm->minmax_limitstack[0]>actual)	actual=bm->minmax_limitstack[0];      if(bins+bm->minmax_limitstack[0]<actual)	actual=bins+bm->minmax_limitstack[0];            bm->minmax_acctotal-=LACING_ADJUST(BINBYTES(bm,bm->minmax_tail,actual));      bm->minmax_sampleacc-=samples;      /* revise queue_actual to reflect the limit */      bm->queue_actual[bm->minmax_tail]&=0x80000000UL;      bm->queue_actual[bm->minmax_tail]|=actual;            if(bm->minmax_tail==bm->minmax_posstack[0]){	/* the stack becomes a FIFO; the first data has fallen off */	memmove(bm->minmax_binstack,bm->minmax_binstack+bins*2,		sizeof(*bm->minmax_binstack)*bins*2*bm->minmax_stackptr);	memmove(bm->minmax_posstack,bm->minmax_posstack+1,		sizeof(*bm->minmax_posstack)*bm->minmax_stackptr);	memmove(bm->minmax_limitstack,bm->minmax_limitstack+1,		sizeof(*bm->minmax_limitstack)*bm->minmax_stackptr);	bm->minmax_stackptr--;      }            bm->minmax_tail++;      if(bm->minmax_tail>=bm->queue_size)bm->minmax_tail=0;    }            bm->last_to_flush=bm->minmax_tail;  }else{    bm->last_to_flush=bm->avg_center;  }  if(eofflag)    bm->last_to_flush=bm->queue_head;  return(0);}int vorbis_bitrate_flushpacket(vorbis_dsp_state *vd,ogg_packet *op){  private_state         *b=vd->backend_state;  bitrate_manager_state *bm=&b->bms;  if(bm->queue_size==0){    if(bm->queue_head==0)return(0);    memcpy(op,bm->packets,sizeof(*op));    bm->queue_head=0;  }else{    if(bm->next_to_flush==bm->last_to_flush)return(0);    {      long bin=bm->queue_actual[bm->next_to_flush]&0x7fffffff,i;      long bins=bm->queue_bins;      ogg_uint32_t *markers=bm->queue_binned+bins*bm->next_to_flush;      long bytes=markers[bin];      memcpy(op,bm->packets+bm->next_to_flush,sizeof(*op));      /* we have [PACKETBLOBS] possible packets all squished together in	 the buffer, in sequence.  count in to number [bin] */      for(i=0;i<bin;i++)	op->packet+=markers[i];      op->bytes=bytes;	    }    bm->next_to_flush++;    if(bm->next_to_flush>=bm->queue_size)bm->next_to_flush=0;  }  return(1);}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -