2 * Simple free lossless/lossy audio codec
3 * Copyright (c) 2004 Alex Beregszaszi
5 * This file is part of FFmpeg.
7 * FFmpeg is free software; you can redistribute it and/or
8 * modify it under the terms of the GNU Lesser General Public
9 * License as published by the Free Software Foundation; either
10 * version 2.1 of the License, or (at your option) any later version.
12 * FFmpeg is distributed in the hope that it will be useful,
13 * but WITHOUT ANY WARRANTY; without even the implied warranty of
14 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
15 * Lesser General Public License for more details.
17 * You should have received a copy of the GNU Lesser General Public
18 * License along with FFmpeg; if not, write to the Free Software
19 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
26 * @file libavcodec/sonic.c
27 * Simple free lossless/lossy audio codec
28 * Based on Paul Francis Harrison's Bonk (http://www.logarithmic.net/pfh/bonk)
29 * Written and designed by Alex Beregszaszi
32 * - CABAC put/get_symbol
33 * - independent quantizer for channels
34 * - >2 channels support
35 * - more decorrelation types
36 * - more tap_quant tests
37 * - selectable intlist writers/readers (bonk-style, golomb, cabac)
40 #define MAX_CHANNELS 2
46 typedef struct SonicContext
{
47 int lossless
, decorrelation
;
49 int num_taps
, downsampling
;
52 int channels
, samplerate
, block_align
, frame_size
;
56 int *coded_samples
[MAX_CHANNELS
];
66 int *predictor_state
[MAX_CHANNELS
];
69 #define LATTICE_SHIFT 10
70 #define SAMPLE_SHIFT 4
71 #define LATTICE_FACTOR (1 << LATTICE_SHIFT)
72 #define SAMPLE_FACTOR (1 << SAMPLE_SHIFT)
74 #define BASE_QUANT 0.6
75 #define RATE_VARIATION 3.0
77 static inline int divide(int a
, int b
)
80 return -( (-a
+ b
/2)/b
);
85 static inline int shift(int a
,int b
)
87 return (a
+(1<<(b
-1))) >> b
;
90 static inline int shift_down(int a
,int b
)
92 return (a
>>b
)+((a
<0)?1:0);
96 static inline int intlist_write(PutBitContext
*pb
, int *buf
, int entries
, int base_2_part
)
100 for (i
= 0; i
< entries
; i
++)
101 set_se_golomb(pb
, buf
[i
]);
106 static inline int intlist_read(GetBitContext
*gb
, int *buf
, int entries
, int base_2_part
)
110 for (i
= 0; i
< entries
; i
++)
111 buf
[i
] = get_se_golomb(gb
);
118 #define ADAPT_LEVEL 8
120 static int bits_to_store(uint64_t x
)
132 static void write_uint_max(PutBitContext
*pb
, unsigned int value
, unsigned int max
)
139 bits
= bits_to_store(max
);
141 for (i
= 0; i
< bits
-1; i
++)
142 put_bits(pb
, 1, value
& (1 << i
));
144 if ( (value
| (1 << (bits
-1))) <= max
)
145 put_bits(pb
, 1, value
& (1 << (bits
-1)));
148 static unsigned int read_uint_max(GetBitContext
*gb
, int max
)
150 int i
, bits
, value
= 0;
155 bits
= bits_to_store(max
);
157 for (i
= 0; i
< bits
-1; i
++)
161 if ( (value
| (1<<(bits
-1))) <= max
)
163 value
+= 1 << (bits
-1);
168 static int intlist_write(PutBitContext
*pb
, int *buf
, int entries
, int base_2_part
)
170 int i
, j
, x
= 0, low_bits
= 0, max
= 0;
171 int step
= 256, pos
= 0, dominant
= 0, any
= 0;
174 copy
= av_mallocz(4* entries
);
182 for (i
= 0; i
< entries
; i
++)
183 energy
+= abs(buf
[i
]);
185 low_bits
= bits_to_store(energy
/ (entries
* 2));
189 put_bits(pb
, 4, low_bits
);
192 for (i
= 0; i
< entries
; i
++)
194 put_bits(pb
, low_bits
, abs(buf
[i
]));
195 copy
[i
] = abs(buf
[i
]) >> low_bits
;
200 bits
= av_mallocz(4* entries
*max
);
207 for (i
= 0; i
<= max
; i
++)
209 for (j
= 0; j
< entries
; j
++)
211 bits
[x
++] = copy
[j
] > i
;
217 int steplet
= step
>> 8;
219 if (pos
+ steplet
> x
)
222 for (i
= 0; i
< steplet
; i
++)
223 if (bits
[i
+pos
] != dominant
)
226 put_bits(pb
, 1, any
);
231 step
+= step
/ ADAPT_LEVEL
;
237 while (((pos
+ interloper
) < x
) && (bits
[pos
+ interloper
] == dominant
))
241 write_uint_max(pb
, interloper
, (step
>> 8) - 1);
243 pos
+= interloper
+ 1;
244 step
-= step
/ ADAPT_LEVEL
;
250 dominant
= !dominant
;
255 for (i
= 0; i
< entries
; i
++)
257 put_bits(pb
, 1, buf
[i
] < 0);
265 static int intlist_read(GetBitContext
*gb
, int *buf
, int entries
, int base_2_part
)
267 int i
, low_bits
= 0, x
= 0;
268 int n_zeros
= 0, step
= 256, dominant
= 0;
269 int pos
= 0, level
= 0;
270 int *bits
= av_mallocz(4* entries
);
277 low_bits
= get_bits(gb
, 4);
280 for (i
= 0; i
< entries
; i
++)
281 buf
[i
] = get_bits(gb
, low_bits
);
284 // av_log(NULL, AV_LOG_INFO, "entries: %d, low bits: %d\n", entries, low_bits);
286 while (n_zeros
< entries
)
288 int steplet
= step
>> 8;
292 for (i
= 0; i
< steplet
; i
++)
293 bits
[x
++] = dominant
;
298 step
+= step
/ ADAPT_LEVEL
;
302 int actual_run
= read_uint_max(gb
, steplet
-1);
304 // av_log(NULL, AV_LOG_INFO, "actual run: %d\n", actual_run);
306 for (i
= 0; i
< actual_run
; i
++)
307 bits
[x
++] = dominant
;
309 bits
[x
++] = !dominant
;
312 n_zeros
+= actual_run
;
316 step
-= step
/ ADAPT_LEVEL
;
322 dominant
= !dominant
;
326 // reconstruct unsigned values
328 for (i
= 0; n_zeros
< entries
; i
++)
335 level
+= 1 << low_bits
;
338 if (buf
[pos
] >= level
)
345 buf
[pos
] += 1 << low_bits
;
354 for (i
= 0; i
< entries
; i
++)
355 if (buf
[i
] && get_bits1(gb
))
358 // av_log(NULL, AV_LOG_INFO, "zeros: %d pos: %d\n", n_zeros, pos);
364 static void predictor_init_state(int *k
, int *state
, int order
)
368 for (i
= order
-2; i
>= 0; i
--)
370 int j
, p
, x
= state
[i
];
372 for (j
= 0, p
= i
+1; p
< order
; j
++,p
++)
374 int tmp
= x
+ shift_down(k
[j
] * state
[p
], LATTICE_SHIFT
);
375 state
[p
] += shift_down(k
[j
]*x
, LATTICE_SHIFT
);
381 static int predictor_calc_error(int *k
, int *state
, int order
, int error
)
383 int i
, x
= error
- shift_down(k
[order
-1] * state
[order
-1], LATTICE_SHIFT
);
386 int *k_ptr
= &(k
[order
-2]),
387 *state_ptr
= &(state
[order
-2]);
388 for (i
= order
-2; i
>= 0; i
--, k_ptr
--, state_ptr
--)
390 int k_value
= *k_ptr
, state_value
= *state_ptr
;
391 x
-= shift_down(k_value
* state_value
, LATTICE_SHIFT
);
392 state_ptr
[1] = state_value
+ shift_down(k_value
* x
, LATTICE_SHIFT
);
395 for (i
= order
-2; i
>= 0; i
--)
397 x
-= shift_down(k
[i
] * state
[i
], LATTICE_SHIFT
);
398 state
[i
+1] = state
[i
] + shift_down(k
[i
] * x
, LATTICE_SHIFT
);
402 // don't drift too far, to avoid overflows
403 if (x
> (SAMPLE_FACTOR
<<16)) x
= (SAMPLE_FACTOR
<<16);
404 if (x
< -(SAMPLE_FACTOR
<<16)) x
= -(SAMPLE_FACTOR
<<16);
411 #if CONFIG_SONIC_ENCODER || CONFIG_SONIC_LS_ENCODER
412 // Heavily modified Levinson-Durbin algorithm which
413 // copes better with quantization, and calculates the
414 // actual whitened result as it goes.
416 static void modified_levinson_durbin(int *window
, int window_entries
,
417 int *out
, int out_entries
, int channels
, int *tap_quant
)
420 int *state
= av_mallocz(4* window_entries
);
422 memcpy(state
, window
, 4* window_entries
);
424 for (i
= 0; i
< out_entries
; i
++)
426 int step
= (i
+1)*channels
, k
, j
;
427 double xx
= 0.0, xy
= 0.0;
429 int *x_ptr
= &(window
[step
]), *state_ptr
= &(state
[0]);
430 j
= window_entries
- step
;
431 for (;j
>=0;j
--,x_ptr
++,state_ptr
++)
433 double x_value
= *x_ptr
, state_value
= *state_ptr
;
434 xx
+= state_value
*state_value
;
435 xy
+= x_value
*state_value
;
438 for (j
= 0; j
<= (window_entries
- step
); j
++);
440 double stepval
= window
[step
+j
], stateval
= window
[j
];
441 // xx += (double)window[j]*(double)window[j];
442 // xy += (double)window[step+j]*(double)window[j];
443 xx
+= stateval
*stateval
;
444 xy
+= stepval
*stateval
;
450 k
= (int)(floor(-xy
/xx
* (double)LATTICE_FACTOR
/ (double)(tap_quant
[i
]) + 0.5));
452 if (k
> (LATTICE_FACTOR
/tap_quant
[i
]))
453 k
= LATTICE_FACTOR
/tap_quant
[i
];
454 if (-k
> (LATTICE_FACTOR
/tap_quant
[i
]))
455 k
= -(LATTICE_FACTOR
/tap_quant
[i
]);
461 x_ptr
= &(window
[step
]);
462 state_ptr
= &(state
[0]);
463 j
= window_entries
- step
;
464 for (;j
>=0;j
--,x_ptr
++,state_ptr
++)
466 int x_value
= *x_ptr
, state_value
= *state_ptr
;
467 *x_ptr
= x_value
+ shift_down(k
*state_value
,LATTICE_SHIFT
);
468 *state_ptr
= state_value
+ shift_down(k
*x_value
, LATTICE_SHIFT
);
471 for (j
=0; j
<= (window_entries
- step
); j
++)
473 int stepval
= window
[step
+j
], stateval
=state
[j
];
474 window
[step
+j
] += shift_down(k
* stateval
, LATTICE_SHIFT
);
475 state
[j
] += shift_down(k
* stepval
, LATTICE_SHIFT
);
483 static inline int code_samplerate(int samplerate
)
487 case 44100: return 0;
488 case 22050: return 1;
489 case 11025: return 2;
490 case 96000: return 3;
491 case 48000: return 4;
492 case 32000: return 5;
493 case 24000: return 6;
494 case 16000: return 7;
500 static av_cold
int sonic_encode_init(AVCodecContext
*avctx
)
502 SonicContext
*s
= avctx
->priv_data
;
506 if (avctx
->channels
> MAX_CHANNELS
)
508 av_log(avctx
, AV_LOG_ERROR
, "Only mono and stereo streams are supported by now\n");
509 return -1; /* only stereo or mono for now */
512 if (avctx
->channels
== 2)
513 s
->decorrelation
= MID_SIDE
;
515 if (avctx
->codec
->id
== CODEC_ID_SONIC_LS
)
520 s
->quantization
= 0.0;
526 s
->quantization
= 1.0;
530 if ((s
->num_taps
< 32) || (s
->num_taps
> 1024) ||
531 ((s
->num_taps
>>5)<<5 != s
->num_taps
))
533 av_log(avctx
, AV_LOG_ERROR
, "Invalid number of taps\n");
538 s
->tap_quant
= av_mallocz(4* s
->num_taps
);
539 for (i
= 0; i
< s
->num_taps
; i
++)
540 s
->tap_quant
[i
] = (int)(sqrt(i
+1));
542 s
->channels
= avctx
->channels
;
543 s
->samplerate
= avctx
->sample_rate
;
545 s
->block_align
= (int)(2048.0*s
->samplerate
/44100)/s
->downsampling
;
546 s
->frame_size
= s
->channels
*s
->block_align
*s
->downsampling
;
548 s
->tail
= av_mallocz(4* s
->num_taps
*s
->channels
);
551 s
->tail_size
= s
->num_taps
*s
->channels
;
553 s
->predictor_k
= av_mallocz(4 * s
->num_taps
);
557 for (i
= 0; i
< s
->channels
; i
++)
559 s
->coded_samples
[i
] = av_mallocz(4* s
->block_align
);
560 if (!s
->coded_samples
[i
])
564 s
->int_samples
= av_mallocz(4* s
->frame_size
);
566 s
->window_size
= ((2*s
->tail_size
)+s
->frame_size
);
567 s
->window
= av_mallocz(4* s
->window_size
);
571 avctx
->extradata
= av_mallocz(16);
572 if (!avctx
->extradata
)
574 init_put_bits(&pb
, avctx
->extradata
, 16*8);
576 put_bits(&pb
, 2, version
); // version
579 put_bits(&pb
, 2, s
->channels
);
580 put_bits(&pb
, 4, code_samplerate(s
->samplerate
));
582 put_bits(&pb
, 1, s
->lossless
);
584 put_bits(&pb
, 3, SAMPLE_SHIFT
); // XXX FIXME: sample precision
585 put_bits(&pb
, 2, s
->decorrelation
);
586 put_bits(&pb
, 2, s
->downsampling
);
587 put_bits(&pb
, 5, (s
->num_taps
>> 5)-1); // 32..1024
588 put_bits(&pb
, 1, 0); // XXX FIXME: no custom tap quant table
591 avctx
->extradata_size
= put_bits_count(&pb
)/8;
593 av_log(avctx
, AV_LOG_INFO
, "Sonic: ver: %d ls: %d dr: %d taps: %d block: %d frame: %d downsamp: %d\n",
594 version
, s
->lossless
, s
->decorrelation
, s
->num_taps
, s
->block_align
, s
->frame_size
, s
->downsampling
);
596 avctx
->coded_frame
= avcodec_alloc_frame();
597 if (!avctx
->coded_frame
)
598 return AVERROR(ENOMEM
);
599 avctx
->coded_frame
->key_frame
= 1;
600 avctx
->frame_size
= s
->block_align
*s
->downsampling
;
605 static av_cold
int sonic_encode_close(AVCodecContext
*avctx
)
607 SonicContext
*s
= avctx
->priv_data
;
610 av_freep(&avctx
->coded_frame
);
612 for (i
= 0; i
< s
->channels
; i
++)
613 av_free(s
->coded_samples
[i
]);
615 av_free(s
->predictor_k
);
617 av_free(s
->tap_quant
);
619 av_free(s
->int_samples
);
624 static int sonic_encode_frame(AVCodecContext
*avctx
,
625 uint8_t *buf
, int buf_size
, void *data
)
627 SonicContext
*s
= avctx
->priv_data
;
629 int i
, j
, ch
, quant
= 0, x
= 0;
630 short *samples
= data
;
632 init_put_bits(&pb
, buf
, buf_size
*8);
635 for (i
= 0; i
< s
->frame_size
; i
++)
636 s
->int_samples
[i
] = samples
[i
];
639 for (i
= 0; i
< s
->frame_size
; i
++)
640 s
->int_samples
[i
] = s
->int_samples
[i
] << SAMPLE_SHIFT
;
642 switch(s
->decorrelation
)
645 for (i
= 0; i
< s
->frame_size
; i
+= s
->channels
)
647 s
->int_samples
[i
] += s
->int_samples
[i
+1];
648 s
->int_samples
[i
+1] -= shift(s
->int_samples
[i
], 1);
652 for (i
= 0; i
< s
->frame_size
; i
+= s
->channels
)
653 s
->int_samples
[i
+1] -= s
->int_samples
[i
];
656 for (i
= 0; i
< s
->frame_size
; i
+= s
->channels
)
657 s
->int_samples
[i
] -= s
->int_samples
[i
+1];
661 memset(s
->window
, 0, 4* s
->window_size
);
663 for (i
= 0; i
< s
->tail_size
; i
++)
664 s
->window
[x
++] = s
->tail
[i
];
666 for (i
= 0; i
< s
->frame_size
; i
++)
667 s
->window
[x
++] = s
->int_samples
[i
];
669 for (i
= 0; i
< s
->tail_size
; i
++)
672 for (i
= 0; i
< s
->tail_size
; i
++)
673 s
->tail
[i
] = s
->int_samples
[s
->frame_size
- s
->tail_size
+ i
];
676 modified_levinson_durbin(s
->window
, s
->window_size
,
677 s
->predictor_k
, s
->num_taps
, s
->channels
, s
->tap_quant
);
678 if (intlist_write(&pb
, s
->predictor_k
, s
->num_taps
, 0) < 0)
681 for (ch
= 0; ch
< s
->channels
; ch
++)
684 for (i
= 0; i
< s
->block_align
; i
++)
687 for (j
= 0; j
< s
->downsampling
; j
++, x
+= s
->channels
)
689 s
->coded_samples
[ch
][i
] = sum
;
693 // simple rate control code
696 double energy1
= 0.0, energy2
= 0.0;
697 for (ch
= 0; ch
< s
->channels
; ch
++)
699 for (i
= 0; i
< s
->block_align
; i
++)
701 double sample
= s
->coded_samples
[ch
][i
];
702 energy2
+= sample
*sample
;
703 energy1
+= fabs(sample
);
707 energy2
= sqrt(energy2
/(s
->channels
*s
->block_align
));
708 energy1
= sqrt(2.0)*energy1
/(s
->channels
*s
->block_align
);
710 // increase bitrate when samples are like a gaussian distribution
711 // reduce bitrate when samples are like a two-tailed exponential distribution
713 if (energy2
> energy1
)
714 energy2
+= (energy2
-energy1
)*RATE_VARIATION
;
716 quant
= (int)(BASE_QUANT
*s
->quantization
*energy2
/SAMPLE_FACTOR
);
717 // av_log(avctx, AV_LOG_DEBUG, "quant: %d energy: %f / %f\n", quant, energy1, energy2);
724 set_ue_golomb(&pb
, quant
);
726 quant
*= SAMPLE_FACTOR
;
729 // write out coded samples
730 for (ch
= 0; ch
< s
->channels
; ch
++)
733 for (i
= 0; i
< s
->block_align
; i
++)
734 s
->coded_samples
[ch
][i
] = divide(s
->coded_samples
[ch
][i
], quant
);
736 if (intlist_write(&pb
, s
->coded_samples
[ch
], s
->block_align
, 1) < 0)
740 // av_log(avctx, AV_LOG_DEBUG, "used bytes: %d\n", (put_bits_count(&pb)+7)/8);
743 return (put_bits_count(&pb
)+7)/8;
745 #endif /* CONFIG_SONIC_ENCODER || CONFIG_SONIC_LS_ENCODER */
747 #if CONFIG_SONIC_DECODER
748 static const int samplerate_table
[] =
749 { 44100, 22050, 11025, 96000, 48000, 32000, 24000, 16000, 8000 };
751 static av_cold
int sonic_decode_init(AVCodecContext
*avctx
)
753 SonicContext
*s
= avctx
->priv_data
;
757 s
->channels
= avctx
->channels
;
758 s
->samplerate
= avctx
->sample_rate
;
760 if (!avctx
->extradata
)
762 av_log(avctx
, AV_LOG_ERROR
, "No mandatory headers present\n");
766 init_get_bits(&gb
, avctx
->extradata
, avctx
->extradata_size
);
768 version
= get_bits(&gb
, 2);
771 av_log(avctx
, AV_LOG_ERROR
, "Unsupported Sonic version, please report\n");
777 s
->channels
= get_bits(&gb
, 2);
778 s
->samplerate
= samplerate_table
[get_bits(&gb
, 4)];
779 av_log(avctx
, AV_LOG_INFO
, "Sonicv2 chans: %d samprate: %d\n",
780 s
->channels
, s
->samplerate
);
783 if (s
->channels
> MAX_CHANNELS
)
785 av_log(avctx
, AV_LOG_ERROR
, "Only mono and stereo streams are supported by now\n");
789 s
->lossless
= get_bits1(&gb
);
791 skip_bits(&gb
, 3); // XXX FIXME
792 s
->decorrelation
= get_bits(&gb
, 2);
794 s
->downsampling
= get_bits(&gb
, 2);
795 s
->num_taps
= (get_bits(&gb
, 5)+1)<<5;
796 if (get_bits1(&gb
)) // XXX FIXME
797 av_log(avctx
, AV_LOG_INFO
, "Custom quant table\n");
799 s
->block_align
= (int)(2048.0*(s
->samplerate
/44100))/s
->downsampling
;
800 s
->frame_size
= s
->channels
*s
->block_align
*s
->downsampling
;
801 // avctx->frame_size = s->block_align;
803 av_log(avctx
, AV_LOG_INFO
, "Sonic: ver: %d ls: %d dr: %d taps: %d block: %d frame: %d downsamp: %d\n",
804 version
, s
->lossless
, s
->decorrelation
, s
->num_taps
, s
->block_align
, s
->frame_size
, s
->downsampling
);
807 s
->tap_quant
= av_mallocz(4* s
->num_taps
);
808 for (i
= 0; i
< s
->num_taps
; i
++)
809 s
->tap_quant
[i
] = (int)(sqrt(i
+1));
811 s
->predictor_k
= av_mallocz(4* s
->num_taps
);
813 for (i
= 0; i
< s
->channels
; i
++)
815 s
->predictor_state
[i
] = av_mallocz(4* s
->num_taps
);
816 if (!s
->predictor_state
[i
])
820 for (i
= 0; i
< s
->channels
; i
++)
822 s
->coded_samples
[i
] = av_mallocz(4* s
->block_align
);
823 if (!s
->coded_samples
[i
])
826 s
->int_samples
= av_mallocz(4* s
->frame_size
);
828 avctx
->sample_fmt
= SAMPLE_FMT_S16
;
832 static av_cold
int sonic_decode_close(AVCodecContext
*avctx
)
834 SonicContext
*s
= avctx
->priv_data
;
837 av_free(s
->int_samples
);
838 av_free(s
->tap_quant
);
839 av_free(s
->predictor_k
);
841 for (i
= 0; i
< s
->channels
; i
++)
843 av_free(s
->predictor_state
[i
]);
844 av_free(s
->coded_samples
[i
]);
850 static int sonic_decode_frame(AVCodecContext
*avctx
,
851 void *data
, int *data_size
,
854 const uint8_t *buf
= avpkt
->data
;
855 int buf_size
= avpkt
->size
;
856 SonicContext
*s
= avctx
->priv_data
;
859 short *samples
= data
;
861 if (buf_size
== 0) return 0;
863 // av_log(NULL, AV_LOG_INFO, "buf_size: %d\n", buf_size);
865 init_get_bits(&gb
, buf
, buf_size
*8);
867 intlist_read(&gb
, s
->predictor_k
, s
->num_taps
, 0);
870 for (i
= 0; i
< s
->num_taps
; i
++)
871 s
->predictor_k
[i
] *= s
->tap_quant
[i
];
876 quant
= get_ue_golomb(&gb
) * SAMPLE_FACTOR
;
878 // av_log(NULL, AV_LOG_INFO, "quant: %d\n", quant);
880 for (ch
= 0; ch
< s
->channels
; ch
++)
884 predictor_init_state(s
->predictor_k
, s
->predictor_state
[ch
], s
->num_taps
);
886 intlist_read(&gb
, s
->coded_samples
[ch
], s
->block_align
, 1);
888 for (i
= 0; i
< s
->block_align
; i
++)
890 for (j
= 0; j
< s
->downsampling
- 1; j
++)
892 s
->int_samples
[x
] = predictor_calc_error(s
->predictor_k
, s
->predictor_state
[ch
], s
->num_taps
, 0);
896 s
->int_samples
[x
] = predictor_calc_error(s
->predictor_k
, s
->predictor_state
[ch
], s
->num_taps
, s
->coded_samples
[ch
][i
] * quant
);
900 for (i
= 0; i
< s
->num_taps
; i
++)
901 s
->predictor_state
[ch
][i
] = s
->int_samples
[s
->frame_size
- s
->channels
+ ch
- i
*s
->channels
];
904 switch(s
->decorrelation
)
907 for (i
= 0; i
< s
->frame_size
; i
+= s
->channels
)
909 s
->int_samples
[i
+1] += shift(s
->int_samples
[i
], 1);
910 s
->int_samples
[i
] -= s
->int_samples
[i
+1];
914 for (i
= 0; i
< s
->frame_size
; i
+= s
->channels
)
915 s
->int_samples
[i
+1] += s
->int_samples
[i
];
918 for (i
= 0; i
< s
->frame_size
; i
+= s
->channels
)
919 s
->int_samples
[i
] += s
->int_samples
[i
+1];
924 for (i
= 0; i
< s
->frame_size
; i
++)
925 s
->int_samples
[i
] = shift(s
->int_samples
[i
], SAMPLE_SHIFT
);
928 for (i
= 0; i
< s
->frame_size
; i
++)
929 samples
[i
] = av_clip_int16(s
->int_samples
[i
]);
933 *data_size
= s
->frame_size
* 2;
935 return (get_bits_count(&gb
)+7)/8;
938 AVCodec sonic_decoder
= {
942 sizeof(SonicContext
),
947 .long_name
= NULL_IF_CONFIG_SMALL("Sonic"),
949 #endif /* CONFIG_SONIC_DECODER */
951 #if CONFIG_SONIC_ENCODER
952 AVCodec sonic_encoder
= {
956 sizeof(SonicContext
),
961 .long_name
= NULL_IF_CONFIG_SMALL("Sonic"),
965 #if CONFIG_SONIC_LS_ENCODER
966 AVCodec sonic_ls_encoder
= {
970 sizeof(SonicContext
),
975 .long_name
= NULL_IF_CONFIG_SMALL("Sonic lossless"),