| OLD | NEW |
| 1 /* Copyright (c) 2007-2008 CSIRO | 1 /* Copyright (c) 2007-2008 CSIRO |
| 2 Copyright (c) 2007-2009 Xiph.Org Foundation | 2 Copyright (c) 2007-2009 Xiph.Org Foundation |
| 3 Copyright (c) 2007-2009 Timothy B. Terriberry | 3 Copyright (c) 2007-2009 Timothy B. Terriberry |
| 4 Written by Timothy B. Terriberry and Jean-Marc Valin */ | 4 Written by Timothy B. Terriberry and Jean-Marc Valin */ |
| 5 /* | 5 /* |
| 6 Redistribution and use in source and binary forms, with or without | 6 Redistribution and use in source and binary forms, with or without |
| 7 modification, are permitted provided that the following conditions | 7 modification, are permitted provided that the following conditions |
| 8 are met: | 8 are met: |
| 9 | 9 |
| 10 - Redistributions of source code must retain the above copyright | 10 - Redistributions of source code must retain the above copyright |
| (...skipping 442 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 453 } | 453 } |
| 454 while(j>0); | 454 while(j>0); |
| 455 return i; | 455 return i; |
| 456 } | 456 } |
| 457 | 457 |
| 458 void encode_pulses(const int *_y,int _n,int _k,ec_enc *_enc){ | 458 void encode_pulses(const int *_y,int _n,int _k,ec_enc *_enc){ |
| 459 celt_assert(_k>0); | 459 celt_assert(_k>0); |
| 460 ec_enc_uint(_enc,icwrs(_n,_y),CELT_PVQ_V(_n,_k)); | 460 ec_enc_uint(_enc,icwrs(_n,_y),CELT_PVQ_V(_n,_k)); |
| 461 } | 461 } |
| 462 | 462 |
| 463 static void cwrsi(int _n,int _k,opus_uint32 _i,int *_y){ | 463 static opus_val32 cwrsi(int _n,int _k,opus_uint32 _i,int *_y){ |
| 464 opus_uint32 p; | 464 opus_uint32 p; |
| 465 int s; | 465 int s; |
| 466 int k0; | 466 int k0; |
| 467 opus_int16 val; |
| 468 opus_val32 yy=0; |
| 467 celt_assert(_k>0); | 469 celt_assert(_k>0); |
| 468 celt_assert(_n>1); | 470 celt_assert(_n>1); |
| 469 while(_n>2){ | 471 while(_n>2){ |
| 470 opus_uint32 q; | 472 opus_uint32 q; |
| 471 /*Lots of pulses case:*/ | 473 /*Lots of pulses case:*/ |
| 472 if(_k>=_n){ | 474 if(_k>=_n){ |
| 473 const opus_uint32 *row; | 475 const opus_uint32 *row; |
| 474 row=CELT_PVQ_U_ROW[_n]; | 476 row=CELT_PVQ_U_ROW[_n]; |
| 475 /*Are the pulses in this dimension negative?*/ | 477 /*Are the pulses in this dimension negative?*/ |
| 476 p=row[_k+1]; | 478 p=row[_k+1]; |
| 477 s=-(_i>=p); | 479 s=-(_i>=p); |
| 478 _i-=p&s; | 480 _i-=p&s; |
| 479 /*Count how many pulses were placed in this dimension.*/ | 481 /*Count how many pulses were placed in this dimension.*/ |
| 480 k0=_k; | 482 k0=_k; |
| 481 q=row[_n]; | 483 q=row[_n]; |
| 482 if(q>_i){ | 484 if(q>_i){ |
| 483 celt_assert(p>q); | 485 celt_assert(p>q); |
| 484 _k=_n; | 486 _k=_n; |
| 485 do p=CELT_PVQ_U_ROW[--_k][_n]; | 487 do p=CELT_PVQ_U_ROW[--_k][_n]; |
| 486 while(p>_i); | 488 while(p>_i); |
| 487 } | 489 } |
| 488 else for(p=row[_k];p>_i;p=row[_k])_k--; | 490 else for(p=row[_k];p>_i;p=row[_k])_k--; |
| 489 _i-=p; | 491 _i-=p; |
| 490 *_y++=(k0-_k+s)^s; | 492 val=(k0-_k+s)^s; |
| 493 *_y++=val; |
| 494 yy=MAC16_16(yy,val,val); |
| 491 } | 495 } |
| 492 /*Lots of dimensions case:*/ | 496 /*Lots of dimensions case:*/ |
| 493 else{ | 497 else{ |
| 494 /*Are there any pulses in this dimension at all?*/ | 498 /*Are there any pulses in this dimension at all?*/ |
| 495 p=CELT_PVQ_U_ROW[_k][_n]; | 499 p=CELT_PVQ_U_ROW[_k][_n]; |
| 496 q=CELT_PVQ_U_ROW[_k+1][_n]; | 500 q=CELT_PVQ_U_ROW[_k+1][_n]; |
| 497 if(p<=_i&&_i<q){ | 501 if(p<=_i&&_i<q){ |
| 498 _i-=p; | 502 _i-=p; |
| 499 *_y++=0; | 503 *_y++=0; |
| 500 } | 504 } |
| 501 else{ | 505 else{ |
| 502 /*Are the pulses in this dimension negative?*/ | 506 /*Are the pulses in this dimension negative?*/ |
| 503 s=-(_i>=q); | 507 s=-(_i>=q); |
| 504 _i-=q&s; | 508 _i-=q&s; |
| 505 /*Count how many pulses were placed in this dimension.*/ | 509 /*Count how many pulses were placed in this dimension.*/ |
| 506 k0=_k; | 510 k0=_k; |
| 507 do p=CELT_PVQ_U_ROW[--_k][_n]; | 511 do p=CELT_PVQ_U_ROW[--_k][_n]; |
| 508 while(p>_i); | 512 while(p>_i); |
| 509 _i-=p; | 513 _i-=p; |
| 510 *_y++=(k0-_k+s)^s; | 514 val=(k0-_k+s)^s; |
| 515 *_y++=val; |
| 516 yy=MAC16_16(yy,val,val); |
| 511 } | 517 } |
| 512 } | 518 } |
| 513 _n--; | 519 _n--; |
| 514 } | 520 } |
| 515 /*_n==2*/ | 521 /*_n==2*/ |
| 516 p=2*_k+1; | 522 p=2*_k+1; |
| 517 s=-(_i>=p); | 523 s=-(_i>=p); |
| 518 _i-=p&s; | 524 _i-=p&s; |
| 519 k0=_k; | 525 k0=_k; |
| 520 _k=(_i+1)>>1; | 526 _k=(_i+1)>>1; |
| 521 if(_k)_i-=2*_k-1; | 527 if(_k)_i-=2*_k-1; |
| 522 *_y++=(k0-_k+s)^s; | 528 val=(k0-_k+s)^s; |
| 529 *_y++=val; |
| 530 yy=MAC16_16(yy,val,val); |
| 523 /*_n==1*/ | 531 /*_n==1*/ |
| 524 s=-(int)_i; | 532 s=-(int)_i; |
| 525 *_y=(_k+s)^s; | 533 val=(_k+s)^s; |
| 534 *_y=val; |
| 535 yy=MAC16_16(yy,val,val); |
| 536 return yy; |
| 526 } | 537 } |
| 527 | 538 |
| 528 void decode_pulses(int *_y,int _n,int _k,ec_dec *_dec){ | 539 opus_val32 decode_pulses(int *_y,int _n,int _k,ec_dec *_dec){ |
| 529 cwrsi(_n,_k,ec_dec_uint(_dec,CELT_PVQ_V(_n,_k)),_y); | 540 return cwrsi(_n,_k,ec_dec_uint(_dec,CELT_PVQ_V(_n,_k)),_y); |
| 530 } | 541 } |
| 531 | 542 |
| 532 #else /* SMALL_FOOTPRINT */ | 543 #else /* SMALL_FOOTPRINT */ |
| 533 | 544 |
| 534 /*Computes the next row/column of any recurrence that obeys the relation | 545 /*Computes the next row/column of any recurrence that obeys the relation |
| 535 u[i][j]=u[i-1][j]+u[i][j-1]+u[i-1][j-1]. | 546 u[i][j]=u[i-1][j]+u[i][j-1]+u[i-1][j-1]. |
| 536 _ui0 is the base case for the new row/column.*/ | 547 _ui0 is the base case for the new row/column.*/ |
| 537 static OPUS_INLINE void unext(opus_uint32 *_ui,unsigned _len,opus_uint32 _ui0){ | 548 static OPUS_INLINE void unext(opus_uint32 *_ui,unsigned _len,opus_uint32 _ui0){ |
| 538 opus_uint32 ui1; | 549 opus_uint32 ui1; |
| 539 unsigned j; | 550 unsigned j; |
| (...skipping 44 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 584 while(++k<len); | 595 while(++k<len); |
| 585 for(k=2;k<_n;k++)unext(_u+1,_k+1,1); | 596 for(k=2;k<_n;k++)unext(_u+1,_k+1,1); |
| 586 return _u[_k]+_u[_k+1]; | 597 return _u[_k]+_u[_k+1]; |
| 587 } | 598 } |
| 588 | 599 |
| 589 /*Returns the _i'th combination of _k elements chosen from a set of size _n | 600 /*Returns the _i'th combination of _k elements chosen from a set of size _n |
| 590 with associated sign bits. | 601 with associated sign bits. |
| 591 _y: Returns the vector of pulses. | 602 _y: Returns the vector of pulses. |
| 592 _u: Must contain entries [0..._k+1] of row _n of U() on input. | 603 _u: Must contain entries [0..._k+1] of row _n of U() on input. |
| 593 Its contents will be destructively modified.*/ | 604 Its contents will be destructively modified.*/ |
| 594 static void cwrsi(int _n,int _k,opus_uint32 _i,int *_y,opus_uint32 *_u){ | 605 static opus_val32 cwrsi(int _n,int _k,opus_uint32 _i,int *_y,opus_uint32 *_u){ |
| 595 int j; | 606 int j; |
| 607 opus_int16 val; |
| 608 opus_val32 yy=0; |
| 596 celt_assert(_n>0); | 609 celt_assert(_n>0); |
| 597 j=0; | 610 j=0; |
| 598 do{ | 611 do{ |
| 599 opus_uint32 p; | 612 opus_uint32 p; |
| 600 int s; | 613 int s; |
| 601 int yj; | 614 int yj; |
| 602 p=_u[_k+1]; | 615 p=_u[_k+1]; |
| 603 s=-(_i>=p); | 616 s=-(_i>=p); |
| 604 _i-=p&s; | 617 _i-=p&s; |
| 605 yj=_k; | 618 yj=_k; |
| 606 p=_u[_k]; | 619 p=_u[_k]; |
| 607 while(p>_i)p=_u[--_k]; | 620 while(p>_i)p=_u[--_k]; |
| 608 _i-=p; | 621 _i-=p; |
| 609 yj-=_k; | 622 yj-=_k; |
| 610 _y[j]=(yj+s)^s; | 623 val=(yj+s)^s; |
| 624 _y[j]=val; |
| 625 yy=MAC16_16(yy,val,val); |
| 611 uprev(_u,_k+2,0); | 626 uprev(_u,_k+2,0); |
| 612 } | 627 } |
| 613 while(++j<_n); | 628 while(++j<_n); |
| 629 return yy; |
| 614 } | 630 } |
| 615 | 631 |
| 616 /*Returns the index of the given combination of K elements chosen from a set | 632 /*Returns the index of the given combination of K elements chosen from a set |
| 617 of size 1 with associated sign bits. | 633 of size 1 with associated sign bits. |
| 618 _y: The vector of pulses, whose sum of absolute values is K. | 634 _y: The vector of pulses, whose sum of absolute values is K. |
| 619 _k: Returns K.*/ | 635 _k: Returns K.*/ |
| 620 static OPUS_INLINE opus_uint32 icwrs1(const int *_y,int *_k){ | 636 static OPUS_INLINE opus_uint32 icwrs1(const int *_y,int *_k){ |
| 621 *_k=abs(_y[0]); | 637 *_k=abs(_y[0]); |
| 622 return _y[0]<0; | 638 return _y[0]<0; |
| 623 } | 639 } |
| (...skipping 54 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 678 VARDECL(opus_uint32,u); | 694 VARDECL(opus_uint32,u); |
| 679 opus_uint32 nc; | 695 opus_uint32 nc; |
| 680 SAVE_STACK; | 696 SAVE_STACK; |
| 681 celt_assert(_k>0); | 697 celt_assert(_k>0); |
| 682 ALLOC(u,_k+2U,opus_uint32); | 698 ALLOC(u,_k+2U,opus_uint32); |
| 683 i=icwrs(_n,_k,&nc,_y,u); | 699 i=icwrs(_n,_k,&nc,_y,u); |
| 684 ec_enc_uint(_enc,i,nc); | 700 ec_enc_uint(_enc,i,nc); |
| 685 RESTORE_STACK; | 701 RESTORE_STACK; |
| 686 } | 702 } |
| 687 | 703 |
| 688 void decode_pulses(int *_y,int _n,int _k,ec_dec *_dec){ | 704 opus_val32 decode_pulses(int *_y,int _n,int _k,ec_dec *_dec){ |
| 689 VARDECL(opus_uint32,u); | 705 VARDECL(opus_uint32,u); |
| 706 int ret; |
| 690 SAVE_STACK; | 707 SAVE_STACK; |
| 691 celt_assert(_k>0); | 708 celt_assert(_k>0); |
| 692 ALLOC(u,_k+2U,opus_uint32); | 709 ALLOC(u,_k+2U,opus_uint32); |
| 693 cwrsi(_n,_k,ec_dec_uint(_dec,ncwrs_urow(_n,_k,u)),_y,u); | 710 ret = cwrsi(_n,_k,ec_dec_uint(_dec,ncwrs_urow(_n,_k,u)),_y,u); |
| 694 RESTORE_STACK; | 711 RESTORE_STACK; |
| 712 return ret; |
| 695 } | 713 } |
| 696 | 714 |
| 697 #endif /* SMALL_FOOTPRINT */ | 715 #endif /* SMALL_FOOTPRINT */ |
| OLD | NEW |