bitrate.c 17 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540
  1. /********************************************************************
  2. * *
  3. * THIS FILE IS PART OF THE OggVorbis SOFTWARE CODEC SOURCE CODE. *
  4. * USE, DISTRIBUTION AND REPRODUCTION OF THIS LIBRARY SOURCE IS *
  5. * GOVERNED BY A BSD-STYLE SOURCE LICENSE INCLUDED WITH THIS SOURCE *
  6. * IN 'COPYING'. PLEASE READ THESE TERMS BEFORE DISTRIBUTING. *
  7. * *
  8. * THE OggVorbis SOURCE CODE IS (C) COPYRIGHT 1994-2002 *
  9. * by the XIPHOPHORUS Company http://www.xiph.org/ *
  10. * *
  11. ********************************************************************
  12. function: bitrate tracking and management
  13. last mod: $Id: bitrate.c,v 1.17 2002/07/02 04:25:16 xiphmont Exp $
  14. ********************************************************************/
  15. #include <stdio.h>
  16. #include <stdlib.h>
  17. #include <string.h>
  18. #include <math.h>
  19. #include <ogg/ogg.h>
  20. #include "vorbis/codec.h"
  21. #include "codec_internal.h"
  22. #include "os.h"
  23. #include "misc.h"
  24. #include "bitrate.h"
  25. static long BINBYTES(bitrate_manager_state *bm,long pos,long bin){
  26. int bins=bm->queue_bins;
  27. return(bm->queue_binned[pos*bins+bin]);
  28. }
  29. #define LIMITBYTES(pos,bin) (bm->minmax_binstack[(pos)*bins*2+((bin)+bins)])
  30. static long LACING_ADJUST(long bytes){
  31. int addto=bytes/255+1;
  32. return(bytes+addto);
  33. }
  34. static int floater_interpolate(bitrate_manager_state *bm,vorbis_info *vi,
  35. double desired_rate){
  36. int bin=rint(bm->avgfloat);
  37. double lobitrate,hibitrate;
  38. lobitrate=(double)(bm->avg_binacc[bin]*8)/bm->avg_sampleacc*vi->rate;
  39. while(lobitrate>desired_rate && bin>0){
  40. bin--;
  41. lobitrate=(double)(bm->avg_binacc[bin]*8)/bm->avg_sampleacc*vi->rate;
  42. }
  43. if(bin+1<bm->queue_bins){
  44. hibitrate=(double)(bm->avg_binacc[bin+1]*8)/bm->avg_sampleacc*vi->rate;
  45. if(fabs(hibitrate-desired_rate) < fabs(lobitrate-desired_rate))bin++;
  46. }
  47. return(bin);
  48. }
  49. /* try out a new limit */
  50. static long limit_sum(bitrate_manager_state *bm,int limit){
  51. int i=bm->minmax_stackptr;
  52. long acc=bm->minmax_acctotal;
  53. long bins=bm->queue_bins;
  54. acc-=LIMITBYTES(i,0);
  55. acc+=LIMITBYTES(i,limit);
  56. while(i-->0){
  57. if(bm->minmax_limitstack[i]<=limit)break;
  58. acc-=LIMITBYTES(i,bm->minmax_limitstack[i]);
  59. acc+=LIMITBYTES(i,limit);
  60. }
  61. return(acc);
  62. }
  63. /* compute bitrate tracking setup, allocate circular packet size queue */
  64. void vorbis_bitrate_init(vorbis_info *vi,bitrate_manager_state *bm){
  65. int i;
  66. codec_setup_info *ci=vi->codec_setup;
  67. bitrate_manager_info *bi=&ci->bi;
  68. long maxlatency;
  69. memset(bm,0,sizeof(*bm));
  70. if(bi){
  71. bm->avg_sampledesired=bi->queue_avg_time*vi->rate;
  72. bm->avg_centerdesired=bi->queue_avg_time*vi->rate*bi->queue_avg_center;
  73. bm->minmax_sampledesired=bi->queue_minmax_time*vi->rate;
  74. /* first find the max possible needed queue size */
  75. maxlatency=max(bm->avg_sampledesired-bm->avg_centerdesired,
  76. bm->minmax_sampledesired)+bm->avg_centerdesired;
  77. if(maxlatency>0 &&
  78. (bi->queue_avgmin>0 || bi->queue_avgmax>0 || bi->queue_hardmax>0 ||
  79. bi->queue_hardmin>0)){
  80. long maxpackets=maxlatency/(ci->blocksizes[0]>>1)+3;
  81. long bins=PACKETBLOBS;
  82. bm->queue_size=maxpackets;
  83. bm->queue_bins=bins;
  84. bm->queue_binned=_ogg_calloc(maxpackets,bins*sizeof(*bm->queue_binned));
  85. bm->queue_actual=_ogg_calloc(maxpackets,sizeof(*bm->queue_actual));
  86. if((bi->queue_avgmin>0 || bi->queue_avgmax>0) &&
  87. bi->queue_avg_time>0){
  88. bm->avg_binacc=_ogg_calloc(bins,sizeof(*bm->avg_binacc));
  89. bm->avgfloat=PACKETBLOBS/2;
  90. }else{
  91. bm->avg_tail= -1;
  92. }
  93. if((bi->queue_hardmin>0 || bi->queue_hardmax>0) &&
  94. bi->queue_minmax_time>0){
  95. bm->minmax_binstack=_ogg_calloc((bins+1)*bins*2,
  96. sizeof(bm->minmax_binstack));
  97. bm->minmax_posstack=_ogg_calloc((bins+1),
  98. sizeof(bm->minmax_posstack));
  99. bm->minmax_limitstack=_ogg_calloc((bins+1),
  100. sizeof(bm->minmax_limitstack));
  101. }else{
  102. bm->minmax_tail= -1;
  103. }
  104. /* space for the packet queueing */
  105. bm->packetbuffers=_ogg_calloc(maxpackets,sizeof(*bm->packetbuffers));
  106. bm->packets=_ogg_calloc(maxpackets,sizeof(*bm->packets));
  107. for(i=0;i<maxpackets;i++)
  108. oggpack_writeinit(bm->packetbuffers+i);
  109. }else{
  110. bm->packetbuffers=_ogg_calloc(1,sizeof(*bm->packetbuffers));
  111. bm->packets=_ogg_calloc(1,sizeof(*bm->packets));
  112. oggpack_writeinit(bm->packetbuffers);
  113. }
  114. }
  115. }
  116. void vorbis_bitrate_clear(bitrate_manager_state *bm){
  117. int i;
  118. if(bm){
  119. if(bm->queue_binned)_ogg_free(bm->queue_binned);
  120. if(bm->queue_actual)_ogg_free(bm->queue_actual);
  121. if(bm->avg_binacc)_ogg_free(bm->avg_binacc);
  122. if(bm->minmax_binstack)_ogg_free(bm->minmax_binstack);
  123. if(bm->minmax_posstack)_ogg_free(bm->minmax_posstack);
  124. if(bm->minmax_limitstack)_ogg_free(bm->minmax_limitstack);
  125. if(bm->packetbuffers){
  126. if(bm->queue_size==0){
  127. oggpack_writeclear(bm->packetbuffers);
  128. }else{
  129. for(i=0;i<bm->queue_size;i++)
  130. oggpack_writeclear(bm->packetbuffers+i);
  131. }
  132. _ogg_free(bm->packetbuffers);
  133. }
  134. if(bm->packets)_ogg_free(bm->packets);
  135. memset(bm,0,sizeof(*bm));
  136. }
  137. }
  138. int vorbis_bitrate_managed(vorbis_block *vb){
  139. vorbis_dsp_state *vd=vb->vd;
  140. backend_lookup_state *b=vd->backend_state;
  141. bitrate_manager_state *bm=&b->bms;
  142. if(bm->queue_binned)return(1);
  143. return(0);
  144. }
  145. /* finish taking in the block we just processed */
  146. int vorbis_bitrate_addblock(vorbis_block *vb){
  147. int i;
  148. vorbis_block_internal *vbi=vb->internal;
  149. vorbis_dsp_state *vd=vb->vd;
  150. backend_lookup_state *b=vd->backend_state;
  151. bitrate_manager_state *bm=&b->bms;
  152. vorbis_info *vi=vd->vi;
  153. codec_setup_info *ci=vi->codec_setup;
  154. bitrate_manager_info *bi=&ci->bi;
  155. int eofflag=vb->eofflag;
  156. int head=bm->queue_head;
  157. int next_head=head+1;
  158. int bins=bm->queue_bins;
  159. int minmax_head,new_minmax_head;
  160. ogg_uint32_t *head_ptr;
  161. oggpack_buffer temp;
  162. if(!bm->queue_binned){
  163. oggpack_buffer temp;
  164. /* not a bitrate managed stream, but for API simplicity, we'll
  165. buffer one packet to keep the code path clean */
  166. if(bm->queue_head)return(-1); /* one has been submitted without
  167. being claimed */
  168. bm->queue_head++;
  169. bm->packets[0].packet=oggpack_get_buffer(&vb->opb);
  170. bm->packets[0].bytes=oggpack_bytes(&vb->opb);
  171. bm->packets[0].b_o_s=0;
  172. bm->packets[0].e_o_s=vb->eofflag;
  173. bm->packets[0].granulepos=vb->granulepos;
  174. bm->packets[0].packetno=vb->sequence; /* for sake of completeness */
  175. memcpy(&temp,bm->packetbuffers,sizeof(vb->opb));
  176. memcpy(bm->packetbuffers,&vb->opb,sizeof(vb->opb));
  177. memcpy(&vb->opb,&temp,sizeof(vb->opb));
  178. return(0);
  179. }
  180. /* add encoded packet to head */
  181. if(next_head>=bm->queue_size)next_head=0;
  182. head_ptr=bm->queue_binned+bins*head;
  183. /* is there room to add a block? In proper use of the API, this will
  184. never come up... but guard it anyway */
  185. if(next_head==bm->avg_tail || next_head==bm->minmax_tail)return(-1);
  186. /* add the block to the toplevel queue */
  187. bm->queue_head=next_head;
  188. bm->queue_actual[head]=(vb->W?0x80000000UL:0);
  189. /* buffer packet fields */
  190. bm->packets[head].packet=oggpack_get_buffer(&vb->opb);
  191. bm->packets[head].bytes=oggpack_bytes(&vb->opb);
  192. bm->packets[head].b_o_s=0;
  193. bm->packets[head].e_o_s=vb->eofflag;
  194. bm->packets[head].granulepos=vb->granulepos;
  195. bm->packets[head].packetno=vb->sequence; /* for sake of completeness */
  196. /* swap packet buffers */
  197. memcpy(&temp,bm->packetbuffers+head,sizeof(vb->opb));
  198. memcpy(bm->packetbuffers+head,&vb->opb,sizeof(vb->opb));
  199. memcpy(&vb->opb,&temp,sizeof(vb->opb));
  200. /* save markers */
  201. head_ptr[0]=vbi->packetblob_markers[0];
  202. for(i=1;i<PACKETBLOBS;i++){
  203. head_ptr[i]=vbi->packetblob_markers[i]-vbi->packetblob_markers[i-1];
  204. }
  205. if(bm->avg_binacc)
  206. new_minmax_head=minmax_head=bm->avg_center;
  207. else
  208. new_minmax_head=minmax_head=head;
  209. /* the average tracking queue is updated first; its results (if it's
  210. in use) are taken into account by the min/max limiter (if min/max
  211. is in use) */
  212. if(bm->avg_binacc){
  213. unsigned long desired_center=bm->avg_centerdesired;
  214. if(eofflag)desired_center=0;
  215. /* update the avg head */
  216. for(i=0;i<bins;i++)
  217. bm->avg_binacc[i]+=LACING_ADJUST(head_ptr[i]);
  218. bm->avg_sampleacc+=ci->blocksizes[vb->W]>>1;
  219. bm->avg_centeracc+=ci->blocksizes[vb->W]>>1;
  220. if(bm->avg_sampleacc>bm->avg_sampledesired || eofflag){
  221. /* update the avg center */
  222. if(bm->avg_centeracc>desired_center){
  223. /* choose the new average floater */
  224. int samples=ci->blocksizes[vb->W]>>1;
  225. double upper=floater_interpolate(bm,vi,bi->queue_avgmax);
  226. double lower=floater_interpolate(bm,vi,bi->queue_avgmin);
  227. double new=PACKETBLOBS/2.,slew;
  228. int bin;
  229. if(upper<new)new=upper;
  230. if(lower>new)new=lower;
  231. slew=(new-bm->avgfloat)/samples*vi->rate;
  232. if(slew<bi->avgfloat_downslew_max)
  233. new=bm->avgfloat+bi->avgfloat_downslew_max/vi->rate*samples;
  234. if(slew>bi->avgfloat_upslew_max)
  235. new=bm->avgfloat+bi->avgfloat_upslew_max/vi->rate*samples;
  236. bm->avgfloat=new;
  237. /* apply the average floater to new blocks */
  238. bin=rint(bm->avgfloat);
  239. /*fprintf(stderr,"%d ",bin);*/
  240. while(bm->avg_centeracc>desired_center){
  241. samples=ci->blocksizes[bm->queue_actual[bm->avg_center]&
  242. 0x80000000UL?1:0]>>1;
  243. bm->queue_actual[bm->avg_center]|=bin;
  244. bm->avg_centeracc-=samples;
  245. bm->avg_center++;
  246. if(bm->avg_center>=bm->queue_size)bm->avg_center=0;
  247. }
  248. new_minmax_head=bm->avg_center;
  249. }
  250. /* update the avg tail if needed */
  251. while(bm->avg_sampleacc>bm->avg_sampledesired){
  252. int samples=
  253. ci->blocksizes[bm->queue_actual[bm->avg_tail]&0x80000000UL?1:0]>>1;
  254. for(i=0;i<bm->queue_bins;i++)
  255. bm->avg_binacc[i]-=LACING_ADJUST(bm->queue_binned[bins*bm->avg_tail+i]);
  256. bm->avg_sampleacc-=samples;
  257. bm->avg_tail++;
  258. if(bm->avg_tail>=bm->queue_size)bm->avg_tail=0;
  259. }
  260. }
  261. }else{
  262. /* if we're not using an average tracker, the 'float' is nailed to
  263. the avgfloat_initial value. It needs to be set for the min/max
  264. to deal properly */
  265. long bin=PACKETBLOBS/2;
  266. bm->queue_actual[head]|=bin;
  267. new_minmax_head=next_head;
  268. }
  269. /* update the min/max queues and enforce limits */
  270. if(bm->minmax_binstack){
  271. unsigned long sampledesired=eofflag?0:bm->minmax_sampledesired;
  272. /* add to stack recent */
  273. while(minmax_head!=new_minmax_head){
  274. unsigned int i;
  275. int samples=ci->blocksizes[bm->queue_actual[minmax_head]&
  276. 0x80000000UL?1:0]>>1;
  277. for(i=0;i<(unsigned int)bins;i++){
  278. bm->minmax_binstack[bm->minmax_stackptr*bins*2+bins+i]+=
  279. LACING_ADJUST(BINBYTES(bm,minmax_head,
  280. (bm->queue_actual[minmax_head]&0x7fffffffUL)>i?
  281. bm->queue_actual[minmax_head]:i));
  282. bm->minmax_binstack[bm->minmax_stackptr*bins*2+i]+=
  283. LACING_ADJUST(BINBYTES(bm,minmax_head,
  284. (bm->queue_actual[minmax_head]&0x7fffffffUL)<i?
  285. bm->queue_actual[minmax_head]:i));
  286. }
  287. bm->minmax_posstack[bm->minmax_stackptr]=minmax_head; /* not one
  288. past
  289. like
  290. typical */
  291. bm->minmax_limitstack[bm->minmax_stackptr]=0;
  292. bm->minmax_sampleacc+=samples;
  293. bm->minmax_acctotal+=
  294. LACING_ADJUST(BINBYTES(bm,minmax_head,bm->queue_actual[minmax_head]));
  295. minmax_head++;
  296. if(minmax_head>=bm->queue_size)minmax_head=0;
  297. }
  298. /* check limits, enforce changes */
  299. if(bm->minmax_sampleacc>sampledesired){
  300. double bitrate=(double)(bm->minmax_acctotal*8)/
  301. bm->minmax_sampleacc*vi->rate;
  302. int limit=0;
  303. if((bi->queue_hardmax>0 && bitrate>bi->queue_hardmax) ||
  304. (bi->queue_hardmin>0 && bitrate<bi->queue_hardmin)){
  305. int newstack;
  306. int stackctr;
  307. long bitsum=limit_sum(bm,0)*8;
  308. bitrate=(double)bitsum/bm->minmax_sampleacc*vi->rate;
  309. /* we're off rate. Iteratively try out new hard floater
  310. limits until we find one that brings us inside. Here's
  311. where we see the whole point of the limit stacks. */
  312. if(bi->queue_hardmax>0 && bitrate>bi->queue_hardmax){
  313. for(limit=-1;limit>-bins;limit--){
  314. long bitsum=limit_sum(bm,limit)*8;
  315. bitrate=(double)bitsum/bm->minmax_sampleacc*vi->rate;
  316. if(bitrate<=bi->queue_hardmax)break;
  317. }
  318. }else if(bitrate<bi->queue_hardmin){
  319. for(limit=1;limit<bins;limit++){
  320. long bitsum=limit_sum(bm,limit)*8;
  321. bitrate=(double)bitsum/bm->minmax_sampleacc*vi->rate;
  322. if(bitrate>=bi->queue_hardmin)break;
  323. }
  324. if(bitrate>bi->queue_hardmax)limit--;
  325. }
  326. for(i=limit-1;i>-bins;i--){
  327. long bitsum=limit_sum(bm,i)*8;
  328. bitrate=(double)bitsum/bm->minmax_sampleacc*vi->rate;
  329. }
  330. bitsum=limit_sum(bm,limit)*8;
  331. bitrate=(double)bitsum/bm->minmax_sampleacc*vi->rate;
  332. /* trace the limit backward, stop when we see a lower limit */
  333. newstack=bm->minmax_stackptr-1;
  334. while(newstack>=0){
  335. if(bm->minmax_limitstack[newstack]<limit)break;
  336. newstack--;
  337. }
  338. /* update bit counter with new limit and replace any stack
  339. limits that have been replaced by our new lower limit */
  340. stackctr=bm->minmax_stackptr;
  341. while(stackctr>newstack){
  342. bm->minmax_acctotal-=
  343. LIMITBYTES(stackctr,bm->minmax_limitstack[stackctr]);
  344. bm->minmax_acctotal+=LIMITBYTES(stackctr,limit);
  345. if(stackctr<bm->minmax_stackptr)
  346. for(i=0;i<bins*2;i++)
  347. bm->minmax_binstack[stackctr*bins*2+i]+=
  348. bm->minmax_binstack[(stackctr+1)*bins*2+i];
  349. stackctr--;
  350. }
  351. stackctr++;
  352. bm->minmax_posstack[stackctr]=bm->minmax_posstack[bm->minmax_stackptr];
  353. bm->minmax_limitstack[stackctr]=limit;
  354. /* set up new blank stack entry */
  355. stackctr++;
  356. bm->minmax_stackptr=stackctr;
  357. memset(&bm->minmax_binstack[stackctr*bins*2],
  358. 0,
  359. sizeof(*bm->minmax_binstack)*bins*2);
  360. bm->minmax_limitstack[stackctr]=0;
  361. bm->minmax_posstack[stackctr]=-1;
  362. }
  363. }
  364. /* remove from tail */
  365. while(bm->minmax_sampleacc>sampledesired){
  366. int samples=
  367. ci->blocksizes[bm->queue_actual[bm->minmax_tail]&0x80000000UL?1:0]>>1;
  368. int actual=bm->queue_actual[bm->minmax_tail]&0x7fffffffUL;
  369. for(i=0;i<bins;i++){
  370. bm->minmax_binstack[bins+i]-= /* always comes off the stack bottom */
  371. LACING_ADJUST(BINBYTES(bm,bm->minmax_tail,
  372. actual>i?
  373. actual:i));
  374. bm->minmax_binstack[i]-=
  375. LACING_ADJUST(BINBYTES(bm,bm->minmax_tail,
  376. actual<i?
  377. actual:i));
  378. }
  379. /* always perform in this order; max overrules min */
  380. if(bm->minmax_limitstack[0]>actual)
  381. actual=bm->minmax_limitstack[0];
  382. if(bins+bm->minmax_limitstack[0]<actual)
  383. actual=bins+bm->minmax_limitstack[0];
  384. bm->minmax_acctotal-=LACING_ADJUST(BINBYTES(bm,bm->minmax_tail,actual));
  385. bm->minmax_sampleacc-=samples;
  386. /* revise queue_actual to reflect the limit */
  387. bm->queue_actual[bm->minmax_tail]&=0x80000000UL;
  388. bm->queue_actual[bm->minmax_tail]|=actual;
  389. if(bm->minmax_tail==bm->minmax_posstack[0]){
  390. /* the stack becomes a FIFO; the first data has fallen off */
  391. memmove(bm->minmax_binstack,bm->minmax_binstack+bins*2,
  392. sizeof(*bm->minmax_binstack)*bins*2*bm->minmax_stackptr);
  393. memmove(bm->minmax_posstack,bm->minmax_posstack+1,
  394. sizeof(*bm->minmax_posstack)*bm->minmax_stackptr);
  395. memmove(bm->minmax_limitstack,bm->minmax_limitstack+1,
  396. sizeof(*bm->minmax_limitstack)*bm->minmax_stackptr);
  397. bm->minmax_stackptr--;
  398. }
  399. bm->minmax_tail++;
  400. if(bm->minmax_tail>=bm->queue_size)bm->minmax_tail=0;
  401. }
  402. bm->last_to_flush=bm->minmax_tail;
  403. }else{
  404. bm->last_to_flush=bm->avg_center;
  405. }
  406. if(eofflag)
  407. bm->last_to_flush=bm->queue_head;
  408. return(0);
  409. }
  410. int vorbis_bitrate_flushpacket(vorbis_dsp_state *vd,ogg_packet *op){
  411. backend_lookup_state *b=vd->backend_state;
  412. bitrate_manager_state *bm=&b->bms;
  413. if(bm->queue_size==0){
  414. if(bm->queue_head==0)return(0);
  415. memcpy(op,bm->packets,sizeof(*op));
  416. bm->queue_head=0;
  417. }else{
  418. if(bm->next_to_flush==bm->last_to_flush)return(0);
  419. {
  420. long bin=bm->queue_actual[bm->next_to_flush]&0x7fffffff,i;
  421. long bins=bm->queue_bins;
  422. ogg_uint32_t *markers=bm->queue_binned+bins*bm->next_to_flush;
  423. long bytes=markers[bin];
  424. memcpy(op,bm->packets+bm->next_to_flush,sizeof(*op));
  425. /* we have [PACKETBLOBS] possible packets all squished together in
  426. the buffer, in sequence. count in to number [bin] */
  427. for(i=0;i<bin;i++)
  428. op->packet+=markers[i];
  429. op->bytes=bytes;
  430. }
  431. bm->next_to_flush++;
  432. if(bm->next_to_flush>=bm->queue_size)bm->next_to_flush=0;
  433. }
  434. return(1);
  435. }