vorbis_block.c (30592B)
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-2015 * 9 * by the Xiph.Org Foundation https://xiph.org/ * 10 * * 11 ******************************************************************** 12 13 function: PCM data vector blocking, windowing and dis/reassembly 14 15 Handle windowing, overlap-add, etc of the PCM vectors. This is made 16 more amusing by Vorbis' current two allowed block sizes. 17 18 ********************************************************************/ 19 20 #include <stdio.h> 21 #include <stdlib.h> 22 #include <string.h> 23 #include <ogg/ogg.h> 24 #include "vorbis/codec.h" 25 #include "codec_internal.h" 26 27 #include "window.h" 28 #include "mdct.h" 29 #include "lpc.h" 30 #include "registry.h" 31 #include "misc.h" 32 33 /* pcm accumulator examples (not exhaustive): 34 35 <-------------- lW ----------------> 36 <--------------- W ----------------> 37 : .....|..... _______________ | 38 : .''' | '''_--- | |\ | 39 :.....''' |_____--- '''......| | \_______| 40 :.................|__________________|_______|__|______| 41 |<------ Sl ------>| > Sr < |endW 42 |beginSl |endSl | |endSr 43 |beginW |endlW |beginSr 44 45 46 |< lW >| 47 <--------------- W ----------------> 48 | | .. ______________ | 49 | | ' `/ | ---_ | 50 |___.'___/`. | ---_____| 51 |_______|__|_______|_________________| 52 | >|Sl|< |<------ Sr ----->|endW 53 | | |endSl |beginSr |endSr 54 |beginW | |endlW 55 mult[0] |beginSl mult[n] 56 57 <-------------- lW -----------------> 58 |<--W-->| 59 : .............. ___ | | 60 : .''' |`/ \ | | 61 :.....''' |/`....\|...| 62 :.........................|___|___|___| 63 |Sl |Sr |endW 64 | | |endSr 65 | |beginSr 66 | |endSl 67 |beginSl 68 |beginW 69 */ 70 71 /* block abstraction setup *********************************************/ 72 73 #ifndef WORD_ALIGN 74 #define WORD_ALIGN 8 75 #endif 76 77 int vorbis_block_init(vorbis_dsp_state *v, vorbis_block *vb){ 78 int i; 79 memset(vb,0,sizeof(*vb)); 80 vb->vd=v; 81 vb->localalloc=0; 82 vb->localstore=NULL; 83 if(v->analysisp){ 84 vorbis_block_internal *vbi= 85 vb->internal=_ogg_calloc(1,sizeof(vorbis_block_internal)); 86 vbi->ampmax=-9999; 87 88 for(i=0;i<PACKETBLOBS;i++){ 89 if(i==PACKETBLOBS/2){ 90 vbi->packetblob[i]=&vb->opb; 91 }else{ 92 vbi->packetblob[i]= 93 _ogg_calloc(1,sizeof(oggpack_buffer)); 94 } 95 oggpack_writeinit(vbi->packetblob[i]); 96 } 97 } 98 99 return(0); 100 } 101 102 void *_vorbis_block_alloc(vorbis_block *vb,long bytes){ 103 bytes=(bytes+(WORD_ALIGN-1)) & ~(WORD_ALIGN-1); 104 if(bytes+vb->localtop>vb->localalloc){ 105 /* can't just _ogg_realloc... there are outstanding pointers */ 106 if(vb->localstore){ 107 struct alloc_chain *link=_ogg_malloc(sizeof(*link)); 108 vb->totaluse+=vb->localtop; 109 link->next=vb->reap; 110 link->ptr=vb->localstore; 111 vb->reap=link; 112 } 113 /* highly conservative */ 114 vb->localalloc=bytes; 115 vb->localstore=_ogg_malloc(vb->localalloc); 116 vb->localtop=0; 117 } 118 { 119 void *ret=(void *)(((char *)vb->localstore)+vb->localtop); 120 vb->localtop+=bytes; 121 return ret; 122 } 123 } 124 125 /* reap the chain, pull the ripcord */ 126 void _vorbis_block_ripcord(vorbis_block *vb){ 127 /* reap the chain */ 128 struct alloc_chain *reap=vb->reap; 129 while(reap){ 130 struct alloc_chain *next=reap->next; 131 _ogg_free(reap->ptr); 132 memset(reap,0,sizeof(*reap)); 133 _ogg_free(reap); 134 reap=next; 135 } 136 /* consolidate storage */ 137 if(vb->totaluse){ 138 vb->localstore=_ogg_realloc(vb->localstore,vb->totaluse+vb->localalloc); 139 vb->localalloc+=vb->totaluse; 140 vb->totaluse=0; 141 } 142 143 /* pull the ripcord */ 144 vb->localtop=0; 145 vb->reap=NULL; 146 } 147 148 int vorbis_block_clear(vorbis_block *vb){ 149 int i; 150 vorbis_block_internal *vbi=vb->internal; 151 152 _vorbis_block_ripcord(vb); 153 if(vb->localstore)_ogg_free(vb->localstore); 154 155 if(vbi){ 156 for(i=0;i<PACKETBLOBS;i++){ 157 oggpack_writeclear(vbi->packetblob[i]); 158 if(i!=PACKETBLOBS/2)_ogg_free(vbi->packetblob[i]); 159 } 160 _ogg_free(vbi); 161 } 162 memset(vb,0,sizeof(*vb)); 163 return(0); 164 } 165 166 /* Analysis side code, but directly related to blocking. Thus it's 167 here and not in analysis.c (which is for analysis transforms only). 168 The init is here because some of it is shared */ 169 170 static int _vds_shared_init(vorbis_dsp_state *v,vorbis_info *vi,int encp){ 171 int i; 172 codec_setup_info *ci=vi->codec_setup; 173 private_state *b=NULL; 174 int hs; 175 176 if(ci==NULL|| 177 ci->modes<=0|| 178 ci->blocksizes[0]<64|| 179 ci->blocksizes[1]<ci->blocksizes[0]){ 180 return 1; 181 } 182 hs=ci->halfrate_flag; 183 184 memset(v,0,sizeof(*v)); 185 b=v->backend_state=_ogg_calloc(1,sizeof(*b)); 186 187 v->vi=vi; 188 b->modebits=ov_ilog(ci->modes-1); 189 190 b->transform[0]=_ogg_calloc(VI_TRANSFORMB,sizeof(*b->transform[0])); 191 b->transform[1]=_ogg_calloc(VI_TRANSFORMB,sizeof(*b->transform[1])); 192 193 /* MDCT is tranform 0 */ 194 195 b->transform[0][0]=_ogg_calloc(1,sizeof(mdct_lookup)); 196 b->transform[1][0]=_ogg_calloc(1,sizeof(mdct_lookup)); 197 mdct_init(b->transform[0][0],ci->blocksizes[0]>>hs); 198 mdct_init(b->transform[1][0],ci->blocksizes[1]>>hs); 199 200 /* Vorbis I uses only window type 0 */ 201 /* note that the correct computation below is technically: 202 b->window[0]=ov_ilog(ci->blocksizes[0]-1)-6; 203 b->window[1]=ov_ilog(ci->blocksizes[1]-1)-6; 204 but since blocksizes are always powers of two, 205 the below is equivalent. 206 */ 207 b->window[0]=ov_ilog(ci->blocksizes[0])-7; 208 b->window[1]=ov_ilog(ci->blocksizes[1])-7; 209 210 if(encp){ /* encode/decode differ here */ 211 212 /* analysis always needs an fft */ 213 drft_init(&b->fft_look[0],ci->blocksizes[0]); 214 drft_init(&b->fft_look[1],ci->blocksizes[1]); 215 216 /* finish the codebooks */ 217 if(!ci->fullbooks){ 218 ci->fullbooks=_ogg_calloc(ci->books,sizeof(*ci->fullbooks)); 219 for(i=0;i<ci->books;i++) 220 vorbis_book_init_encode(ci->fullbooks+i,ci->book_param[i]); 221 } 222 223 b->psy=_ogg_calloc(ci->psys,sizeof(*b->psy)); 224 for(i=0;i<ci->psys;i++){ 225 _vp_psy_init(b->psy+i, 226 ci->psy_param[i], 227 &ci->psy_g_param, 228 ci->blocksizes[ci->psy_param[i]->blockflag]/2, 229 vi->rate); 230 } 231 232 v->analysisp=1; 233 }else{ 234 /* finish the codebooks */ 235 if(!ci->fullbooks){ 236 ci->fullbooks=_ogg_calloc(ci->books,sizeof(*ci->fullbooks)); 237 for(i=0;i<ci->books;i++){ 238 if(ci->book_param[i]==NULL) 239 goto abort_books; 240 if(vorbis_book_init_decode(ci->fullbooks+i,ci->book_param[i])) 241 goto abort_books; 242 /* decode codebooks are now standalone after init */ 243 vorbis_staticbook_destroy(ci->book_param[i]); 244 ci->book_param[i]=NULL; 245 } 246 } 247 } 248 249 /* initialize the storage vectors. blocksize[1] is small for encode, 250 but the correct size for decode */ 251 v->pcm_storage=ci->blocksizes[1]; 252 v->pcm=_ogg_malloc(vi->channels*sizeof(*v->pcm)); 253 v->pcmret=_ogg_malloc(vi->channels*sizeof(*v->pcmret)); 254 { 255 int i; 256 for(i=0;i<vi->channels;i++) 257 v->pcm[i]=_ogg_calloc(v->pcm_storage,sizeof(*v->pcm[i])); 258 } 259 260 /* all 1 (large block) or 0 (small block) */ 261 /* explicitly set for the sake of clarity */ 262 v->lW=0; /* previous window size */ 263 v->W=0; /* current window size */ 264 265 /* all vector indexes */ 266 v->centerW=ci->blocksizes[1]/2; 267 268 v->pcm_current=v->centerW; 269 270 /* initialize all the backend lookups */ 271 b->flr=_ogg_calloc(ci->floors,sizeof(*b->flr)); 272 b->residue=_ogg_calloc(ci->residues,sizeof(*b->residue)); 273 274 for(i=0;i<ci->floors;i++) 275 b->flr[i]=_floor_P[ci->floor_type[i]]-> 276 look(v,ci->floor_param[i]); 277 278 for(i=0;i<ci->residues;i++) 279 b->residue[i]=_residue_P[ci->residue_type[i]]-> 280 look(v,ci->residue_param[i]); 281 282 return 0; 283 abort_books: 284 for(i=0;i<ci->books;i++){ 285 if(ci->book_param[i]!=NULL){ 286 vorbis_staticbook_destroy(ci->book_param[i]); 287 ci->book_param[i]=NULL; 288 } 289 } 290 vorbis_dsp_clear(v); 291 return -1; 292 } 293 294 /* arbitrary settings and spec-mandated numbers get filled in here */ 295 int vorbis_analysis_init(vorbis_dsp_state *v,vorbis_info *vi){ 296 private_state *b=NULL; 297 298 if(_vds_shared_init(v,vi,1))return 1; 299 b=v->backend_state; 300 b->psy_g_look=_vp_global_look(vi); 301 302 /* Initialize the envelope state storage */ 303 b->ve=_ogg_calloc(1,sizeof(*b->ve)); 304 _ve_envelope_init(b->ve,vi); 305 306 vorbis_bitrate_init(vi,&b->bms); 307 308 /* compressed audio packets start after the headers 309 with sequence number 3 */ 310 v->sequence=3; 311 312 return(0); 313 } 314 315 void vorbis_dsp_clear(vorbis_dsp_state *v){ 316 int i; 317 if(v){ 318 vorbis_info *vi=v->vi; 319 codec_setup_info *ci=(vi?vi->codec_setup:NULL); 320 private_state *b=v->backend_state; 321 322 if(b){ 323 324 if(b->ve){ 325 _ve_envelope_clear(b->ve); 326 _ogg_free(b->ve); 327 } 328 329 if(b->transform[0]){ 330 mdct_clear(b->transform[0][0]); 331 _ogg_free(b->transform[0][0]); 332 _ogg_free(b->transform[0]); 333 } 334 if(b->transform[1]){ 335 mdct_clear(b->transform[1][0]); 336 _ogg_free(b->transform[1][0]); 337 _ogg_free(b->transform[1]); 338 } 339 340 if(b->flr){ 341 if(ci) 342 for(i=0;i<ci->floors;i++) 343 _floor_P[ci->floor_type[i]]-> 344 free_look(b->flr[i]); 345 _ogg_free(b->flr); 346 } 347 if(b->residue){ 348 if(ci) 349 for(i=0;i<ci->residues;i++) 350 _residue_P[ci->residue_type[i]]-> 351 free_look(b->residue[i]); 352 _ogg_free(b->residue); 353 } 354 if(b->psy){ 355 if(ci) 356 for(i=0;i<ci->psys;i++) 357 _vp_psy_clear(b->psy+i); 358 _ogg_free(b->psy); 359 } 360 361 if(b->psy_g_look)_vp_global_free(b->psy_g_look); 362 vorbis_bitrate_clear(&b->bms); 363 364 drft_clear(&b->fft_look[0]); 365 drft_clear(&b->fft_look[1]); 366 367 } 368 369 if(v->pcm){ 370 if(vi) 371 for(i=0;i<vi->channels;i++) 372 if(v->pcm[i])_ogg_free(v->pcm[i]); 373 _ogg_free(v->pcm); 374 if(v->pcmret)_ogg_free(v->pcmret); 375 } 376 377 if(b){ 378 /* free header, header1, header2 */ 379 if(b->header)_ogg_free(b->header); 380 if(b->header1)_ogg_free(b->header1); 381 if(b->header2)_ogg_free(b->header2); 382 _ogg_free(b); 383 } 384 385 memset(v,0,sizeof(*v)); 386 } 387 } 388 389 float **vorbis_analysis_buffer(vorbis_dsp_state *v, int vals){ 390 int i; 391 vorbis_info *vi=v->vi; 392 private_state *b=v->backend_state; 393 394 /* free header, header1, header2 */ 395 if(b->header)_ogg_free(b->header);b->header=NULL; 396 if(b->header1)_ogg_free(b->header1);b->header1=NULL; 397 if(b->header2)_ogg_free(b->header2);b->header2=NULL; 398 399 /* Do we have enough storage space for the requested buffer? If not, 400 expand the PCM (and envelope) storage */ 401 402 if(v->pcm_current+vals>=v->pcm_storage){ 403 v->pcm_storage=v->pcm_current+vals*2; 404 405 for(i=0;i<vi->channels;i++){ 406 v->pcm[i]=_ogg_realloc(v->pcm[i],v->pcm_storage*sizeof(*v->pcm[i])); 407 } 408 } 409 410 for(i=0;i<vi->channels;i++) 411 v->pcmret[i]=v->pcm[i]+v->pcm_current; 412 413 return(v->pcmret); 414 } 415 416 static void _preextrapolate_helper(vorbis_dsp_state *v){ 417 int i; 418 int order=16; 419 float *lpc=alloca(order*sizeof(*lpc)); 420 float *work=alloca(v->pcm_current*sizeof(*work)); 421 long j; 422 v->preextrapolate=1; 423 424 if(v->pcm_current-v->centerW>order*2){ /* safety */ 425 for(i=0;i<v->vi->channels;i++){ 426 /* need to run the extrapolation in reverse! */ 427 for(j=0;j<v->pcm_current;j++) 428 work[j]=v->pcm[i][v->pcm_current-j-1]; 429 430 /* prime as above */ 431 vorbis_lpc_from_data(work,lpc,v->pcm_current-v->centerW,order); 432 433 #if 0 434 if(v->vi->channels==2){ 435 if(i==0) 436 _analysis_output("predataL",0,work,v->pcm_current-v->centerW,0,0,0); 437 else 438 _analysis_output("predataR",0,work,v->pcm_current-v->centerW,0,0,0); 439 }else{ 440 _analysis_output("predata",0,work,v->pcm_current-v->centerW,0,0,0); 441 } 442 #endif 443 444 /* run the predictor filter */ 445 vorbis_lpc_predict(lpc,work+v->pcm_current-v->centerW-order, 446 order, 447 work+v->pcm_current-v->centerW, 448 v->centerW); 449 450 for(j=0;j<v->pcm_current;j++) 451 v->pcm[i][v->pcm_current-j-1]=work[j]; 452 453 } 454 } 455 } 456 457 458 /* call with val<=0 to set eof */ 459 460 int vorbis_analysis_wrote(vorbis_dsp_state *v, int vals){ 461 vorbis_info *vi=v->vi; 462 codec_setup_info *ci=vi->codec_setup; 463 464 if(vals<=0){ 465 int order=32; 466 int i; 467 float *lpc=alloca(order*sizeof(*lpc)); 468 469 /* if it wasn't done earlier (very short sample) */ 470 if(!v->preextrapolate) 471 _preextrapolate_helper(v); 472 473 /* We're encoding the end of the stream. Just make sure we have 474 [at least] a few full blocks of zeroes at the end. */ 475 /* actually, we don't want zeroes; that could drop a large 476 amplitude off a cliff, creating spread spectrum noise that will 477 suck to encode. Extrapolate for the sake of cleanliness. */ 478 479 vorbis_analysis_buffer(v,ci->blocksizes[1]*3); 480 v->eofflag=v->pcm_current; 481 v->pcm_current+=ci->blocksizes[1]*3; 482 483 for(i=0;i<vi->channels;i++){ 484 if(v->eofflag>order*2){ 485 /* extrapolate with LPC to fill in */ 486 long n; 487 488 /* make a predictor filter */ 489 n=v->eofflag; 490 if(n>ci->blocksizes[1])n=ci->blocksizes[1]; 491 vorbis_lpc_from_data(v->pcm[i]+v->eofflag-n,lpc,n,order); 492 493 /* run the predictor filter */ 494 vorbis_lpc_predict(lpc,v->pcm[i]+v->eofflag-order,order, 495 v->pcm[i]+v->eofflag,v->pcm_current-v->eofflag); 496 }else{ 497 /* not enough data to extrapolate (unlikely to happen due to 498 guarding the overlap, but bulletproof in case that 499 assumtion goes away). zeroes will do. */ 500 memset(v->pcm[i]+v->eofflag,0, 501 (v->pcm_current-v->eofflag)*sizeof(*v->pcm[i])); 502 503 } 504 } 505 }else{ 506 507 if(v->pcm_current+vals>v->pcm_storage) 508 return(OV_EINVAL); 509 510 v->pcm_current+=vals; 511 512 /* we may want to reverse extrapolate the beginning of a stream 513 too... in case we're beginning on a cliff! */ 514 /* clumsy, but simple. It only runs once, so simple is good. */ 515 if(!v->preextrapolate && v->pcm_current-v->centerW>ci->blocksizes[1]) 516 _preextrapolate_helper(v); 517 518 } 519 return(0); 520 } 521 522 /* do the deltas, envelope shaping, pre-echo and determine the size of 523 the next block on which to continue analysis */ 524 int vorbis_analysis_blockout(vorbis_dsp_state *v,vorbis_block *vb){ 525 int i; 526 vorbis_info *vi=v->vi; 527 codec_setup_info *ci=vi->codec_setup; 528 private_state *b=v->backend_state; 529 vorbis_look_psy_global *g=b->psy_g_look; 530 long beginW=v->centerW-ci->blocksizes[v->W]/2,centerNext; 531 vorbis_block_internal *vbi=(vorbis_block_internal *)vb->internal; 532 533 /* check to see if we're started... */ 534 if(!v->preextrapolate)return(0); 535 536 /* check to see if we're done... */ 537 if(v->eofflag==-1)return(0); 538 539 /* By our invariant, we have lW, W and centerW set. Search for 540 the next boundary so we can determine nW (the next window size) 541 which lets us compute the shape of the current block's window */ 542 543 /* we do an envelope search even on a single blocksize; we may still 544 be throwing more bits at impulses, and envelope search handles 545 marking impulses too. */ 546 { 547 long bp=_ve_envelope_search(v); 548 if(bp==-1){ 549 550 if(v->eofflag==0)return(0); /* not enough data currently to search for a 551 full long block */ 552 v->nW=0; 553 }else{ 554 555 if(ci->blocksizes[0]==ci->blocksizes[1]) 556 v->nW=0; 557 else 558 v->nW=bp; 559 } 560 } 561 562 centerNext=v->centerW+ci->blocksizes[v->W]/4+ci->blocksizes[v->nW]/4; 563 564 { 565 /* center of next block + next block maximum right side. */ 566 567 long blockbound=centerNext+ci->blocksizes[v->nW]/2; 568 if(v->pcm_current<blockbound)return(0); /* not enough data yet; 569 although this check is 570 less strict that the 571 _ve_envelope_search, 572 the search is not run 573 if we only use one 574 block size */ 575 576 577 } 578 579 /* fill in the block. Note that for a short window, lW and nW are *short* 580 regardless of actual settings in the stream */ 581 582 _vorbis_block_ripcord(vb); 583 vb->lW=v->lW; 584 vb->W=v->W; 585 vb->nW=v->nW; 586 587 if(v->W){ 588 if(!v->lW || !v->nW){ 589 vbi->blocktype=BLOCKTYPE_TRANSITION; 590 /*fprintf(stderr,"-");*/ 591 }else{ 592 vbi->blocktype=BLOCKTYPE_LONG; 593 /*fprintf(stderr,"_");*/ 594 } 595 }else{ 596 if(_ve_envelope_mark(v)){ 597 vbi->blocktype=BLOCKTYPE_IMPULSE; 598 /*fprintf(stderr,"|");*/ 599 600 }else{ 601 vbi->blocktype=BLOCKTYPE_PADDING; 602 /*fprintf(stderr,".");*/ 603 604 } 605 } 606 607 vb->vd=v; 608 vb->sequence=v->sequence++; 609 vb->granulepos=v->granulepos; 610 vb->pcmend=ci->blocksizes[v->W]; 611 612 /* copy the vectors; this uses the local storage in vb */ 613 614 /* this tracks 'strongest peak' for later psychoacoustics */ 615 /* moved to the global psy state; clean this mess up */ 616 if(vbi->ampmax>g->ampmax)g->ampmax=vbi->ampmax; 617 g->ampmax=_vp_ampmax_decay(g->ampmax,v); 618 vbi->ampmax=g->ampmax; 619 620 vb->pcm=_vorbis_block_alloc(vb,sizeof(*vb->pcm)*vi->channels); 621 vbi->pcmdelay=_vorbis_block_alloc(vb,sizeof(*vbi->pcmdelay)*vi->channels); 622 for(i=0;i<vi->channels;i++){ 623 vbi->pcmdelay[i]= 624 _vorbis_block_alloc(vb,(vb->pcmend+beginW)*sizeof(*vbi->pcmdelay[i])); 625 memcpy(vbi->pcmdelay[i],v->pcm[i],(vb->pcmend+beginW)*sizeof(*vbi->pcmdelay[i])); 626 vb->pcm[i]=vbi->pcmdelay[i]+beginW; 627 628 /* before we added the delay 629 vb->pcm[i]=_vorbis_block_alloc(vb,vb->pcmend*sizeof(*vb->pcm[i])); 630 memcpy(vb->pcm[i],v->pcm[i]+beginW,ci->blocksizes[v->W]*sizeof(*vb->pcm[i])); 631 */ 632 633 } 634 635 /* handle eof detection: eof==0 means that we've not yet received EOF 636 eof>0 marks the last 'real' sample in pcm[] 637 eof<0 'no more to do'; doesn't get here */ 638 639 if(v->eofflag){ 640 if(v->centerW>=v->eofflag){ 641 v->eofflag=-1; 642 vb->eofflag=1; 643 return(1); 644 } 645 } 646 647 /* advance storage vectors and clean up */ 648 { 649 int new_centerNext=ci->blocksizes[1]/2; 650 int movementW=centerNext-new_centerNext; 651 652 if(movementW>0){ 653 654 _ve_envelope_shift(b->ve,movementW); 655 v->pcm_current-=movementW; 656 657 for(i=0;i<vi->channels;i++) 658 memmove(v->pcm[i],v->pcm[i]+movementW, 659 v->pcm_current*sizeof(*v->pcm[i])); 660 661 662 v->lW=v->W; 663 v->W=v->nW; 664 v->centerW=new_centerNext; 665 666 if(v->eofflag){ 667 v->eofflag-=movementW; 668 if(v->eofflag<=0)v->eofflag=-1; 669 /* do not add padding to end of stream! */ 670 if(v->centerW>=v->eofflag){ 671 v->granulepos+=movementW-(v->centerW-v->eofflag); 672 }else{ 673 v->granulepos+=movementW; 674 } 675 }else{ 676 v->granulepos+=movementW; 677 } 678 } 679 } 680 681 /* done */ 682 return(1); 683 } 684 685 int vorbis_synthesis_restart(vorbis_dsp_state *v){ 686 vorbis_info *vi=v->vi; 687 codec_setup_info *ci; 688 int hs; 689 690 if(!v->backend_state)return -1; 691 if(!vi)return -1; 692 ci=vi->codec_setup; 693 if(!ci)return -1; 694 hs=ci->halfrate_flag; 695 696 v->centerW=ci->blocksizes[1]>>(hs+1); 697 v->pcm_current=v->centerW>>hs; 698 699 v->pcm_returned=-1; 700 v->granulepos=-1; 701 v->sequence=-1; 702 v->eofflag=0; 703 ((private_state *)(v->backend_state))->sample_count=-1; 704 705 return(0); 706 } 707 708 int vorbis_synthesis_init(vorbis_dsp_state *v,vorbis_info *vi){ 709 if(_vds_shared_init(v,vi,0)){ 710 vorbis_dsp_clear(v); 711 return 1; 712 } 713 vorbis_synthesis_restart(v); 714 return 0; 715 } 716 717 /* Unlike in analysis, the window is only partially applied for each 718 block. The time domain envelope is not yet handled at the point of 719 calling (as it relies on the previous block). */ 720 721 int vorbis_synthesis_blockin(vorbis_dsp_state *v,vorbis_block *vb){ 722 vorbis_info *vi=v->vi; 723 codec_setup_info *ci=vi->codec_setup; 724 private_state *b=v->backend_state; 725 int hs=ci->halfrate_flag; 726 int i,j; 727 728 if(!vb)return(OV_EINVAL); 729 if(v->pcm_current>v->pcm_returned && v->pcm_returned!=-1)return(OV_EINVAL); 730 731 v->lW=v->W; 732 v->W=vb->W; 733 v->nW=-1; 734 735 if((v->sequence==-1)|| 736 (v->sequence+1 != vb->sequence)){ 737 v->granulepos=-1; /* out of sequence; lose count */ 738 b->sample_count=-1; 739 } 740 741 v->sequence=vb->sequence; 742 743 if(vb->pcm){ /* no pcm to process if vorbis_synthesis_trackonly 744 was called on block */ 745 int n=ci->blocksizes[v->W]>>(hs+1); 746 int n0=ci->blocksizes[0]>>(hs+1); 747 int n1=ci->blocksizes[1]>>(hs+1); 748 749 int thisCenter; 750 int prevCenter; 751 752 v->glue_bits+=vb->glue_bits; 753 v->time_bits+=vb->time_bits; 754 v->floor_bits+=vb->floor_bits; 755 v->res_bits+=vb->res_bits; 756 757 if(v->centerW){ 758 thisCenter=n1; 759 prevCenter=0; 760 }else{ 761 thisCenter=0; 762 prevCenter=n1; 763 } 764 765 /* v->pcm is now used like a two-stage double buffer. We don't want 766 to have to constantly shift *or* adjust memory usage. Don't 767 accept a new block until the old is shifted out */ 768 769 for(j=0;j<vi->channels;j++){ 770 /* the overlap/add section */ 771 if(v->lW){ 772 if(v->W){ 773 /* large/large */ 774 const float *w=_vorbis_window_get(b->window[1]-hs); 775 float *pcm=v->pcm[j]+prevCenter; 776 float *p=vb->pcm[j]; 777 for(i=0;i<n1;i++) 778 pcm[i]=pcm[i]*w[n1-i-1] + p[i]*w[i]; 779 }else{ 780 /* large/small */ 781 const float *w=_vorbis_window_get(b->window[0]-hs); 782 float *pcm=v->pcm[j]+prevCenter+n1/2-n0/2; 783 float *p=vb->pcm[j]; 784 for(i=0;i<n0;i++) 785 pcm[i]=pcm[i]*w[n0-i-1] +p[i]*w[i]; 786 } 787 }else{ 788 if(v->W){ 789 /* small/large */ 790 const float *w=_vorbis_window_get(b->window[0]-hs); 791 float *pcm=v->pcm[j]+prevCenter; 792 float *p=vb->pcm[j]+n1/2-n0/2; 793 for(i=0;i<n0;i++) 794 pcm[i]=pcm[i]*w[n0-i-1] +p[i]*w[i]; 795 for(;i<n1/2+n0/2;i++) 796 pcm[i]=p[i]; 797 }else{ 798 /* small/small */ 799 const float *w=_vorbis_window_get(b->window[0]-hs); 800 float *pcm=v->pcm[j]+prevCenter; 801 float *p=vb->pcm[j]; 802 for(i=0;i<n0;i++) 803 pcm[i]=pcm[i]*w[n0-i-1] +p[i]*w[i]; 804 } 805 } 806 807 /* the copy section */ 808 { 809 float *pcm=v->pcm[j]+thisCenter; 810 float *p=vb->pcm[j]+n; 811 for(i=0;i<n;i++) 812 pcm[i]=p[i]; 813 } 814 } 815 816 if(v->centerW) 817 v->centerW=0; 818 else 819 v->centerW=n1; 820 821 /* deal with initial packet state; we do this using the explicit 822 pcm_returned==-1 flag otherwise we're sensitive to first block 823 being short or long */ 824 825 if(v->pcm_returned==-1){ 826 v->pcm_returned=thisCenter; 827 v->pcm_current=thisCenter; 828 }else{ 829 v->pcm_returned=prevCenter; 830 v->pcm_current=prevCenter+ 831 ((ci->blocksizes[v->lW]/4+ 832 ci->blocksizes[v->W]/4)>>hs); 833 } 834 835 } 836 837 /* track the frame number... This is for convenience, but also 838 making sure our last packet doesn't end with added padding. If 839 the last packet is partial, the number of samples we'll have to 840 return will be past the vb->granulepos. 841 842 This is not foolproof! It will be confused if we begin 843 decoding at the last page after a seek or hole. In that case, 844 we don't have a starting point to judge where the last frame 845 is. For this reason, vorbisfile will always try to make sure 846 it reads the last two marked pages in proper sequence */ 847 848 if(b->sample_count==-1){ 849 b->sample_count=0; 850 }else{ 851 b->sample_count+=ci->blocksizes[v->lW]/4+ci->blocksizes[v->W]/4; 852 } 853 854 if(v->granulepos==-1){ 855 if(vb->granulepos!=-1){ /* only set if we have a position to set to */ 856 857 v->granulepos=vb->granulepos; 858 859 /* is this a short page? */ 860 if(b->sample_count>v->granulepos){ 861 /* corner case; if this is both the first and last audio page, 862 then spec says the end is cut, not beginning */ 863 long extra=b->sample_count-vb->granulepos; 864 865 /* we use ogg_int64_t for granule positions because a 866 uint64 isn't universally available. Unfortunately, 867 that means granposes can be 'negative' and result in 868 extra being negative */ 869 if(extra<0) 870 extra=0; 871 872 if(vb->eofflag){ 873 /* trim the end */ 874 /* no preceding granulepos; assume we started at zero (we'd 875 have to in a short single-page stream) */ 876 /* granulepos could be -1 due to a seek, but that would result 877 in a long count, not short count */ 878 879 /* Guard against corrupt/malicious frames that set EOP and 880 a backdated granpos; don't rewind more samples than we 881 actually have */ 882 if(extra > (v->pcm_current - v->pcm_returned)<<hs) 883 extra = (v->pcm_current - v->pcm_returned)<<hs; 884 885 v->pcm_current-=extra>>hs; 886 }else{ 887 /* trim the beginning */ 888 v->pcm_returned+=extra>>hs; 889 if(v->pcm_returned>v->pcm_current) 890 v->pcm_returned=v->pcm_current; 891 } 892 893 } 894 895 } 896 }else{ 897 v->granulepos+=ci->blocksizes[v->lW]/4+ci->blocksizes[v->W]/4; 898 if(vb->granulepos!=-1 && v->granulepos!=vb->granulepos){ 899 900 if(v->granulepos>vb->granulepos){ 901 long extra=v->granulepos-vb->granulepos; 902 903 if(extra) 904 if(vb->eofflag){ 905 /* partial last frame. Strip the extra samples off */ 906 907 /* Guard against corrupt/malicious frames that set EOP and 908 a backdated granpos; don't rewind more samples than we 909 actually have */ 910 if(extra > (v->pcm_current - v->pcm_returned)<<hs) 911 extra = (v->pcm_current - v->pcm_returned)<<hs; 912 913 /* we use ogg_int64_t for granule positions because a 914 uint64 isn't universally available. Unfortunately, 915 that means granposes can be 'negative' and result in 916 extra being negative */ 917 if(extra<0) 918 extra=0; 919 920 v->pcm_current-=extra>>hs; 921 } /* else {Shouldn't happen *unless* the bitstream is out of 922 spec. Either way, believe the bitstream } */ 923 } /* else {Shouldn't happen *unless* the bitstream is out of 924 spec. Either way, believe the bitstream } */ 925 v->granulepos=vb->granulepos; 926 } 927 } 928 929 /* Update, cleanup */ 930 931 if(vb->eofflag)v->eofflag=1; 932 return(0); 933 934 } 935 936 /* pcm==NULL indicates we just want the pending samples, no more */ 937 int vorbis_synthesis_pcmout(vorbis_dsp_state *v,float ***pcm){ 938 vorbis_info *vi=v->vi; 939 940 if(v->pcm_returned>-1 && v->pcm_returned<v->pcm_current){ 941 if(pcm){ 942 int i; 943 for(i=0;i<vi->channels;i++) 944 v->pcmret[i]=v->pcm[i]+v->pcm_returned; 945 *pcm=v->pcmret; 946 } 947 return(v->pcm_current-v->pcm_returned); 948 } 949 return(0); 950 } 951 952 int vorbis_synthesis_read(vorbis_dsp_state *v,int n){ 953 if(n && v->pcm_returned+n>v->pcm_current)return(OV_EINVAL); 954 v->pcm_returned+=n; 955 return(0); 956 } 957 958 /* intended for use with a specific vorbisfile feature; we want access 959 to the [usually synthetic/postextrapolated] buffer and lapping at 960 the end of a decode cycle, specifically, a half-short-block worth. 961 This funtion works like pcmout above, except it will also expose 962 this implicit buffer data not normally decoded. */ 963 int vorbis_synthesis_lapout(vorbis_dsp_state *v,float ***pcm){ 964 vorbis_info *vi=v->vi; 965 codec_setup_info *ci=vi->codec_setup; 966 int hs=ci->halfrate_flag; 967 968 int n=ci->blocksizes[v->W]>>(hs+1); 969 int n0=ci->blocksizes[0]>>(hs+1); 970 int n1=ci->blocksizes[1]>>(hs+1); 971 int i,j; 972 973 if(v->pcm_returned<0)return 0; 974 975 /* our returned data ends at pcm_returned; because the synthesis pcm 976 buffer is a two-fragment ring, that means our data block may be 977 fragmented by buffering, wrapping or a short block not filling 978 out a buffer. To simplify things, we unfragment if it's at all 979 possibly needed. Otherwise, we'd need to call lapout more than 980 once as well as hold additional dsp state. Opt for 981 simplicity. */ 982 983 /* centerW was advanced by blockin; it would be the center of the 984 *next* block */ 985 if(v->centerW==n1){ 986 /* the data buffer wraps; swap the halves */ 987 /* slow, sure, small */ 988 for(j=0;j<vi->channels;j++){ 989 float *p=v->pcm[j]; 990 for(i=0;i<n1;i++){ 991 float temp=p[i]; 992 p[i]=p[i+n1]; 993 p[i+n1]=temp; 994 } 995 } 996 997 v->pcm_current-=n1; 998 v->pcm_returned-=n1; 999 v->centerW=0; 1000 } 1001 1002 /* solidify buffer into contiguous space */ 1003 if((v->lW^v->W)==1){ 1004 /* long/short or short/long */ 1005 for(j=0;j<vi->channels;j++){ 1006 float *s=v->pcm[j]; 1007 float *d=v->pcm[j]+(n1-n0)/2; 1008 for(i=(n1+n0)/2-1;i>=0;--i) 1009 d[i]=s[i]; 1010 } 1011 v->pcm_returned+=(n1-n0)/2; 1012 v->pcm_current+=(n1-n0)/2; 1013 }else{ 1014 if(v->lW==0){ 1015 /* short/short */ 1016 for(j=0;j<vi->channels;j++){ 1017 float *s=v->pcm[j]; 1018 float *d=v->pcm[j]+n1-n0; 1019 for(i=n0-1;i>=0;--i) 1020 d[i]=s[i]; 1021 } 1022 v->pcm_returned+=n1-n0; 1023 v->pcm_current+=n1-n0; 1024 } 1025 } 1026 1027 if(pcm){ 1028 int i; 1029 for(i=0;i<vi->channels;i++) 1030 v->pcmret[i]=v->pcm[i]+v->pcm_returned; 1031 *pcm=v->pcmret; 1032 } 1033 1034 return(n1+n-v->pcm_returned); 1035 1036 } 1037 1038 const float *vorbis_window(vorbis_dsp_state *v,int W){ 1039 vorbis_info *vi=v->vi; 1040 codec_setup_info *ci=vi->codec_setup; 1041 int hs=ci->halfrate_flag; 1042 private_state *b=v->backend_state; 1043 1044 if(b->window[W]-1<0)return NULL; 1045 return _vorbis_window_get(b->window[W]-hs); 1046 }