1 /*
2 * AMR narrowband decoder
3 * Copyright (c) 2006-2007 Robert Swain
4 * Copyright (c) 2009 Colin McQuillan
5 *
6 * This file is part of FFmpeg.
7 *
8 * FFmpeg is free software; you can redistribute it and/or
9 * modify it under the terms of the GNU Lesser General Public
10 * License as published by the Free Software Foundation; either
11 * version 2.1 of the License, or (at your option) any later version.
12 *
13 * FFmpeg is distributed in the hope that it will be useful,
14 * but WITHOUT ANY WARRANTY; without even the implied warranty of
15 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
16 * Lesser General Public License for more details.
17 *
18 * You should have received a copy of the GNU Lesser General Public
19 * License along with FFmpeg; if not, write to the Free Software
20 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
21 */
22
23
24 /**
25 * @file
26 * AMR narrowband decoder
27 *
28 * This decoder uses floats for simplicity and so is not bit-exact. One
29 * difference is that differences in phase can accumulate. The test sequences
30 * in 3GPP TS 26.074 can still be useful.
31 *
32 * - Comparing this file's output to the output of the ref decoder gives a
33 * PSNR of 30 to 80. Plotting the output samples shows a difference in
34 * phase in some areas.
35 *
36 * - Comparing both decoders against their input, this decoder gives a similar
37 * PSNR. If the test sequence homing frames are removed (this decoder does
38 * not detect them), the PSNR is at least as good as the reference on 140
39 * out of 169 tests.
40 */
41
42
43 #include <string.h>
44 #include <math.h>
45
59
61
62 #define AMR_BLOCK_SIZE 160 ///< samples per frame
63 #define AMR_SAMPLE_BOUND 32768.0
///< threshold for synthesis overflow
64
65 /**
66 * Scale from constructed speech to [-1,1]
67 *
68 * AMR is designed to produce 16-bit PCM samples (3GPP TS 26.090 4.2) but
69 * upscales by two (section 6.2.2).
70 *
71 * Fundamentally, this scale is determined by energy_mean through
72 * the fixed vector contribution to the excitation vector.
73 */
74 #define AMR_SAMPLE_SCALE (2.0 / 32768.0)
75
76 /** Prediction factor for 12.2kbit/s mode */
77 #define PRED_FAC_MODE_12k2 0.65
78
79 #define LSF_R_FAC (8000.0 / 32768.0) ///< LSF residual tables to Hertz
80 #define MIN_LSF_SPACING (50.0488 / 8000.0)
///< Ensures stability of LPC filter
81 #define PITCH_LAG_MIN_MODE_12k2 18
///< Lower bound on decoded lag search in 12.2kbit/s mode
82
83 /** Initial energy in dB. Also used for bad frames (unimplemented). */
84 #define MIN_ENERGY -14.0
85
86 /** Maximum sharpening factor
87 *
88 * The specification says 0.8, which should be 13107, but the reference C code
89 * uses 13017 instead. (Amusingly the same applies to SHARP_MAX in g729dec.c.)
90 */
91 #define SHARP_MAX 0.79449462890625
92
93 /** Number of impulse response coefficients used for tilt factor */
94 #define AMR_TILT_RESPONSE 22
95 /** Tilt factor = 1st reflection coefficient * gamma_t */
96 #define AMR_TILT_GAMMA_T 0.8
97 /** Adaptive gain control factor used in post-filter */
98 #define AMR_AGC_ALPHA 0.9
99
101 AMRNBFrame frame;
///< decoded AMR parameters (lsf coefficients, codebook indexes, etc)
104
108
111
113
115
117 float *
excitation;
///< pointer to the current excitation vector in excitation_buf
118
121
122 float prediction_error[4];
///< quantified prediction errors {20log10(^gamma_gc)} for previous four subframes
123 float pitch_gain[5];
///< quantified pitch gains for the current and previous four subframes
124 float fixed_gain[5];
///< quantified fixed gains for the current and previous four subframes
125
126 float beta;
///< previous pitch_gain, bounded by [0.0,SHARP_MAX]
127 uint8_t
diff_count;
///< the number of subframes for which diff has been above 0.65
128 uint8_t
hang_count;
///< the number of subframes since a hangover period started
129
131 uint8_t
prev_ir_filter_nr;
///< previous impulse response filter "impNr": 0 - strong, 1 - medium, 2 - none
133
134 float postfilter_mem[10];
///< previous intermediate values in the formant filter
135 float tilt_mem;
///< previous input to tilt compensation filter
137 float high_pass_mem[2];
///< previous intermediate values in the high-pass filter
138
140
145
147
151
152 /** Double version of ff_weighted_vector_sumf() */
154 const double *in_b, double weight_coeff_a,
155 double weight_coeff_b, int length)
156 {
158
159 for (
i = 0;
i < length;
i++)
160 out[
i] = weight_coeff_a * in_a[
i]
161 + weight_coeff_b * in_b[
i];
162 }
163
165 {
168
172 }
173
177 }
181
184 // p->excitation always points to the same position in p->excitation_buf
186
190 }
191
192 for (
i = 0;
i < 4;
i++)
194
199 }
200
201 return 0;
202 }
203
204
205 /**
206 * Unpack an RFC4867 speech frame into the AMR frame mode and parameters.
207 *
208 * The order of speech bits is specified by 3GPP TS 26.101.
209 *
210 * @param p the context
211 * @param buf pointer to the input buffer
212 * @param buf_size size of the input buffer
213 *
214 * @return the frame mode
215 */
217 int buf_size)
218 {
220
221 // Decode the first octet.
222 mode = buf[0] >> 3 & 0x0F;
// frame type
224
227 }
228
232
234 }
235
236
237 /// @name AMR pitch LPC coefficient decoding functions
238 /// @{
239
240 /**
241 * Interpolate the LSF vector (used for fixed gain smoothing).
242 * The interpolation is done over all four subframes even in MODE_12k2.
243 *
244 * @param[in] ctx The Context
245 * @param[in,out] lsf_q LSFs in [0,1] for each subframe
246 * @param[in] lsf_new New LSFs in [0,1] for subframe 4
247 */
249 {
251
252 for (
i = 0;
i < 4;
i++)
253 ctx->weighted_vector_sumf(lsf_q[
i], lsf_q[3], lsf_new,
254 0.25 * (3 -
i), 0.25 * (
i + 1),
256 }
257
258 /**
259 * Decode a set of 5 split-matrix quantized lsf indexes into an lsp vector.
260 *
261 * @param p the context
262 * @param lsp output LSP vector
263 * @param lsf_no_r LSF vector without the residual vector added
264 * @param lsf_quantizer pointers to LSF dictionary tables
265 * @param quantizer_offset offset in tables
266 * @param sign for the 3 dictionary table
267 * @param update store data for computing the next frame's LSFs
268 */
271 const int16_t *lsf_quantizer[5],
272 const int quantizer_offset,
273 const int sign,
const int update)
274 {
278
279 for (
i = 0; i < LP_FILTER_ORDER >> 1;
i++)
280 memcpy(&lsf_r[
i << 1], &lsf_quantizer[
i][quantizer_offset],
281 2 * sizeof(*lsf_r));
282
283 if (sign) {
284 lsf_r[4] *= -1;
285 lsf_r[5] *= -1;
286 }
287
290
292 lsf_q[
i] = lsf_r[
i] * (
LSF_R_FAC / 8000.0) + lsf_no_r[
i] * (1.0 / 8000.0);
293
295
298
300 }
301
302 /**
303 * Decode a set of 5 split-matrix quantized lsf indexes into 2 lsp vectors.
304 *
305 * @param p pointer to the AMRContext
306 */
308 {
309 const uint16_t *lsf_param = p->
frame.
lsf;
311 const int16_t *lsf_quantizer[5];
313
314 lsf_quantizer[0] =
lsf_5_1[lsf_param[0]];
315 lsf_quantizer[1] =
lsf_5_2[lsf_param[1]];
316 lsf_quantizer[2] =
lsf_5_3[lsf_param[2] >> 1];
317 lsf_quantizer[3] =
lsf_5_4[lsf_param[3]];
318 lsf_quantizer[4] =
lsf_5_5[lsf_param[4]];
319
322
325
326 // interpolate LSP vectors at subframes 1 and 3
329 }
330
331 /**
332 * Decode a set of 3 split-matrix quantized lsf indexes into an lsp vector.
333 *
334 * @param p pointer to the AMRContext
335 */
337 {
338 const uint16_t *lsf_param = p->
frame.
lsf;
341 const int16_t *lsf_quantizer;
343
345 memcpy(lsf_r, lsf_quantizer, 3 * sizeof(*lsf_r));
346
348 memcpy(lsf_r + 3, lsf_quantizer, 3 * sizeof(*lsf_r));
349
351 memcpy(lsf_r + 6, lsf_quantizer, 4 * sizeof(*lsf_r));
352
353 // calculate mean-removed LSF vector and add mean
356
358
359 // store data for computing the next frame's LSFs
362
364
365 // interpolate LSP vectors at subframes 1, 2 and 3
366 for (
i = 1;
i <= 3;
i++)
370 }
371
372 /// @}
373
374
375 /// @name AMR pitch vector decoding functions
376 /// @{
377
378 /**
379 * Like ff_decode_pitch_lag(), but with 1/6 resolution
380 */
382 const int prev_lag_int, const int subframe)
383 {
384 if (subframe == 0 || subframe == 2) {
385 if (pitch_index < 463) {
386 *lag_int = (pitch_index + 107) * 10923 >> 16;
387 *lag_frac = pitch_index - *lag_int * 6 + 105;
388 } else {
389 *lag_int = pitch_index - 368;
390 *lag_frac = 0;
391 }
392 } else {
393 *lag_int = ((pitch_index + 5) * 10923 >> 16) - 1;
394 *lag_frac = pitch_index - *lag_int * 6 - 3;
397 }
398 }
399
402 const int subframe)
403 {
404 int pitch_lag_int, pitch_lag_frac;
406
410 subframe);
411 } else {
417 pitch_lag_frac *= 2;
418 }
419
420 p->
pitch_lag_int = pitch_lag_int;
// store previous lag in a uint8_t
421
422 pitch_lag_int += pitch_lag_frac > 0;
423
424 /* Calculate the pitch vector by interpolating the past excitation at the
425 pitch lag using a b60 hamming windowed sinc function. */
429 pitch_lag_frac + 6 - 6*(pitch_lag_frac > 0),
431
433 }
434
435 /// @}
436
437
438 /// @name AMR algebraic code book (fixed) vector decoding functions
439 /// @{
440
441 /**
442 * Decode a 10-bit algebraic codebook index from a 10.2 kbit/s frame.
443 */
445 int i1, int i2, int i3)
446 {
447 // coded using 7+3 bits with the 3 LSBs being, individually, the LSB of 1 of
448 // the 3 pulses and the upper 7 bits being coded in base 5
451 pulse_position[i2] = (
positions[1] << 1) + ((
code >> 1) & 1);
452 pulse_position[i3] = (
positions[0] << 1) + ((
code >> 2) & 1);
453 }
454
455 /**
456 * Decode the algebraic codebook index to pulse positions and signs and
457 * construct the algebraic codebook vector for MODE_10k2.
458 *
459 * @param fixed_index positions of the eight pulses
460 * @param fixed_sparse pointer to the algebraic codebook vector
461 */
464 {
465 int pulse_position[8];
467
470
471 // coded using 5+2 bits with the 2 LSBs being, individually, the LSB of 1 of
472 // the 2 pulses and the upper 5 bits being coded in base 5
473 temp = ((fixed_index[6] >> 2) * 25 + 12) >> 5;
474 pulse_position[3] =
temp % 5;
475 pulse_position[7] =
temp / 5;
476 if (pulse_position[7] & 1)
477 pulse_position[3] = 4 - pulse_position[3];
478 pulse_position[3] = (pulse_position[3] << 1) + ( fixed_index[6] & 1);
479 pulse_position[7] = (pulse_position[7] << 1) + ((fixed_index[6] >> 1) & 1);
480
482 for (
i = 0;
i < 4;
i++) {
483 const int pos1 = (pulse_position[
i] << 2) +
i;
484 const int pos2 = (pulse_position[
i + 4] << 2) +
i;
485 const float sign = fixed_index[
i] ? -1.0 : 1.0;
486 fixed_sparse->
x[
i ] = pos1;
487 fixed_sparse->
x[
i + 4] = pos2;
488 fixed_sparse->
y[
i ] = sign;
489 fixed_sparse->
y[
i + 4] = pos2 < pos1 ? -sign : sign;
490 }
491 }
492
493 /**
494 * Decode the algebraic codebook index to pulse positions and signs,
495 * then construct the algebraic codebook vector.
496 *
497 * nb of pulses | bits encoding pulses
498 * For MODE_4k75 or MODE_5k15, 2 | 1-3, 4-6, 7
499 * MODE_5k9, 2 | 1, 2-4, 5-6, 7-9
500 * MODE_6k7, 3 | 1-3, 4, 5-7, 8, 9-11
501 * MODE_7k4 or MODE_7k95, 4 | 1-3, 4-6, 7-9, 10, 11-13
502 *
503 * @param fixed_sparse pointer to the algebraic codebook vector
504 * @param pulses algebraic codebook indexes
505 * @param mode mode of the current frame
506 * @param subframe current subframe number
507 */
509 const enum Mode mode,
const int subframe)
510 {
512
517 } else {
518 int *pulse_position = fixed_sparse->
x;
520 const int fixed_index =
pulses[0];
521
523 pulse_subset = ((fixed_index >> 3) & 8) + (subframe << 1);
524 pulse_position[0] = ( fixed_index & 7) * 5 +
track_position[pulse_subset];
525 pulse_position[1] = ((fixed_index >> 3) & 7) * 5 +
track_position[pulse_subset + 1];
528 pulse_subset = ((fixed_index & 1) << 1) + 1;
529 pulse_position[0] = ((fixed_index >> 1) & 7) * 5 + pulse_subset;
530 pulse_subset = (fixed_index >> 4) & 3;
531 pulse_position[1] = ((fixed_index >> 6) & 7) * 5 + pulse_subset + (pulse_subset == 3 ? 1 : 0);
532 fixed_sparse->
n = pulse_position[0] == pulse_position[1] ? 1 : 2;
534 pulse_position[0] = (fixed_index & 7) * 5;
535 pulse_subset = (fixed_index >> 2) & 2;
536 pulse_position[1] = ((fixed_index >> 4) & 7) * 5 + pulse_subset + 1;
537 pulse_subset = (fixed_index >> 6) & 2;
538 pulse_position[2] = ((fixed_index >> 8) & 7) * 5 + pulse_subset + 2;
540 } else { // mode <= MODE_7k95
542 pulse_position[1] =
gray_decode[(fixed_index >> 3) & 7] + 1;
543 pulse_position[2] =
gray_decode[(fixed_index >> 6) & 7] + 2;
544 pulse_subset = (fixed_index >> 9) & 1;
545 pulse_position[3] =
gray_decode[(fixed_index >> 10) & 7] + pulse_subset + 3;
547 }
548 for (
i = 0;
i < fixed_sparse->
n;
i++)
549 fixed_sparse->
y[
i] = (
pulses[1] >>
i) & 1 ? 1.0 : -1.0;
550 }
551 }
552
553 /**
554 * Apply pitch lag to obtain the sharpened fixed vector (section 6.1.2)
555 *
556 * @param p the context
557 * @param subframe unpacked amr subframe
558 * @param mode mode of the current frame
559 * @param fixed_sparse sparse representation of the fixed vector
560 */
563 {
564 // The spec suggests the current pitch gain is always used, but in other
565 // modes the pitch and codebook gains are jointly quantized (sec 5.8.2)
566 // so the codebook gain cannot depend on the quantized pitch gain.
569
572
573 // Save pitch sharpening factor for the next subframe
574 // MODE_4k75 only updates on the 2nd and 4th subframes - this follows from
575 // the fact that the gains for two subframes are jointly quantized.
578 }
579 /// @}
580
581
582 /// @name AMR gain decoding functions
583 /// @{
584
585 /**
586 * fixed gain smoothing
587 * Note that where the spec specifies the "spectrum in the q domain"
588 * in section 6.1.4, in fact frequencies should be used.
589 *
590 * @param p the context
591 * @param lsf LSFs for the current subframe, in the range [0,1]
592 * @param lsf_avg averaged LSFs
593 * @param mode mode of the current frame
594 *
595 * @return fixed gain smoothed
596 */
598 const float *lsf_avg,
const enum Mode mode)
599 {
602
605
606 // If diff is large for ten subframes, disable smoothing for a 40-subframe
607 // hangover period.
611
614 p->
diff_count--;
// don't let diff_count overflow
615 }
616
620 const float smoothing_factor =
av_clipf(4.0 *
diff - 1.6, 0.0, 1.0);
625 (1.0 - smoothing_factor) * fixed_gain_mean;
626 }
628 }
629
630 /**
631 * Decode pitch gain and fixed gain factor (part of section 6.1.3).
632 *
633 * @param p the context
634 * @param amr_subframe unpacked amr subframe
635 * @param mode mode of the current frame
636 * @param subframe current subframe number
637 * @param fixed_gain_factor decoded gain correction factor
638 */
640 const enum Mode mode,
const int subframe,
641 float *fixed_gain_factor)
642 {
645 * (1.0 / 16384.0);
647 * (1.0 / 2048.0);
648 } else {
649 const uint16_t *gains;
650
655 } else {
656 // gain index is only coded in subframes 0,2 for MODE_4k75
658 }
659
660 p->
pitch_gain[4] = gains[0] * (1.0 / 16384.0);
661 *fixed_gain_factor = gains[1] * (1.0 / 4096.0);
662 }
663 }
664
665 /// @}
666
667
668 /// @name AMR preprocessing functions
669 /// @{
670
671 /**
672 * Circularly convolve a sparse fixed vector with a phase dispersion impulse
673 * response filter (D.6.2 of G.729 and 6.1.5 of AMR).
674 *
675 * @param out vector with filter applied
676 * @param in source vector
677 * @param filter phase filter coefficients
678 *
679 * out[n] = sum(i,0,len-1){ in[i] * filter[(len + n - i)%len] }
680 */
683 {
689
693
694 if (lag < AMR_SUBFRAME_SIZE >> 1)
697 }
698
700 for (
i = 0;
i < in->
n;
i++) {
703 const float *filterp;
704
709 } else
710 filterp = filter2;
711
713 }
714 }
715
716 /**
717 * Reduce fixed vector sparseness by smoothing with one of three IR filters.
718 * Also know as "adaptive phase dispersion".
719 *
720 * This implements 3GPP TS 26.090 section 6.1(5).
721 *
722 * @param p the context
723 * @param fixed_sparse algebraic codebook vector
724 * @param fixed_vector unfiltered fixed vector
725 * @param fixed_gain smoothed gain
726 * @param out space for modified vector if necessary
727 */
729 const float *fixed_vector,
730 float fixed_gain,
float *
out)
731 {
732 int ir_filter_nr;
733
735 ir_filter_nr = 0; // strong filtering
737 ir_filter_nr = 1; // medium filtering
738 } else
739 ir_filter_nr = 2; // no filtering
740
741 // detect 'onset'
746
749
750 for (
i = 0;
i < 5;
i++)
752 count++;
753 if (count > 2)
754 ir_filter_nr = 0;
755
757 ir_filter_nr--;
758 } else if (ir_filter_nr < 2)
759 ir_filter_nr++;
760
761 // Disable filtering for very low level of fixed_gain.
762 // Note this step is not specified in the technical description but is in
763 // the reference source in the function Ph_disp.
764 if (fixed_gain < 5.0)
765 ir_filter_nr = 2;
766
768 && ir_filter_nr < 2) {
774 }
775
776 // update ir filter strength history
779
780 return fixed_vector;
781 }
782
783 /// @}
784
785
786 /// @name AMR synthesis functions
787 /// @{
788
789 /**
790 * Conduct 10th order linear predictive coding synthesis.
791 *
792 * @param p pointer to the AMRContext
793 * @param lpc pointer to the LPC coefficients
794 * @param fixed_gain fixed codebook gain for synthesis
795 * @param fixed_vector algebraic codebook vector
796 * @param samples pointer to the output speech samples
797 * @param overflow 16-bit overflow flag
798 */
800 float fixed_gain, const float *fixed_vector,
802 {
805
806 // if an overflow has been detected, the pitch vector is scaled down by a
807 // factor of 4
811
814
815 // emphasize pitch vector contribution
819 float pitch_factor =
824
827
830 }
831
835
836 // detect overflow
839 return 1;
840 }
841
842 return 0;
843 }
844
845 /// @}
846
847
848 /// @name AMR update functions
849 /// @{
850
851 /**
852 * Update buffers and history at the end of decoding a subframe.
853 *
854 * @param p pointer to the AMRContext
855 */
857 {
859
862
865
868 }
869
870 /// @}
871
872
873 /// @name AMR Postprocessing functions
874 /// @{
875
876 /**
877 * Get the tilt factor of a formant filter from its transfer function
878 *
879 * @param p The Context
880 * @param lpc_n LP_FILTER_ORDER coefficients of the numerator
881 * @param lpc_d LP_FILTER_ORDER coefficients of the denominator
882 */
884 {
885 float rh0, rh1; // autocorrelation at lag 0 and 1
886
887 // LP_FILTER_ORDER prior zeros are needed for ff_celp_lp_synthesis_filterf
890
896
899
900 // The spec only specifies this check for 12.2 and 10.2 kbit/s
901 // modes. But in the ref source the tilt is always non-negative.
903 }
904
905 /**
906 * Perform adaptive post-filtering to enhance the quality of the speech.
907 * See section 6.2.1.
908 *
909 * @param p pointer to the AMRContext
910 * @param lpc interpolated LP coefficients for this subframe
911 * @param buf_out output of the filter
912 */
914 {
917
920
922 const float *gamma_n, *gamma_d; // Formant filter factor table
924
928 } else {
931 }
932
934 lpc_n[
i] = lpc[
i] * gamma_n[
i];
935 lpc_d[
i] = lpc[
i] * gamma_d[
i];
936 }
937
943
947
950
953 }
954
955 /// @}
956
958 int *got_frame_ptr,
AVPacket *avpkt)
959 {
960
962 const uint8_t *buf = avpkt->
data;
963 int buf_size = avpkt->
size;
965
966 /* get output buffer */
970
973 float fixed_gain_factor;
974 AMRFixed fixed_sparse = {0};
// fixed vector up to anti-sparseness processing
975 float spare_vector[
AMR_SUBFRAME_SIZE];
// extra stack space to hold result from anti-sparseness processing
976 float synth_fixed_gain; // the fixed gain that synthesis should use
977 const float *synth_fixed_vector; // pointer to the fixed vector that synthesis should use
978 float *buf_out = (
float *)
frame->extended_data[ch];
979 int channel_size;
981
986 }
991 }
992
996 } else
998
999 for (
i = 0;
i < 4;
i++)
1001
1002 for (subframe = 0; subframe < 4; subframe++) {
1004
1006
1009
1010 // The fixed gain (section 6.1.3) depends on the fixed vector
1011 // (section 6.1.2), but the fixed vector calculation uses
1012 // pitch sharpening based on the on the pitch gain (section 6.1.3).
1013 // So the correct order is: pitch gain, pitch sharpening, fixed gain.
1015 &fixed_gain_factor);
1016
1018
1020 av_log(avctx,
AV_LOG_ERROR,
"The file is corrupted, pitch_lag = 0 is not allowed\n");
1022 }
1025
1034
1035 // The excitation feedback is calculated without any processing such
1036 // as fixed gain smoothing. This isn't mentioned in the specification.
1041
1042 // In the ref decoder, excitation is stored with no fractional bits.
1043 // This step prevents buzz in silent periods. The ref encoder can
1044 // emit long sequences with pitch factor greater than one. This
1045 // creates unwanted feedback if the excitation vector is nonzero.
1046 // (e.g. test sequence T19_795.COD in 3GPP TS 26.074)
1049
1050 // Smooth fixed gain.
1051 // The specification is ambiguous, but in the reference source, the
1052 // smoothed value is NOT fed back into later fixed gain smoothing.
1055
1057 synth_fixed_gain, spare_vector);
1058
1061 // overflow detected -> rerun synthesis scaling pitch vector down
1062 // by a factor of 4, skipping pitch vector contribution emphasis
1063 // and adaptive gain control
1066
1068
1069 // update buffers and history
1072 }
1073
1079
1080 /* Update averaged lsf vector (used for fixed gain smoothing).
1081 *
1082 * Note that lsf_avg should not incorporate the current frame's LSFs
1083 * for fixed_gain_smooth.
1084 * The specification has an incorrect formula: the reference decoder uses
1085 * qbar(n-1) rather than qbar(n) in section 6.1(4) equation 71. */
1088 buf += channel_size;
1089 buf_size -= channel_size;
1090 }
1091
1092 *got_frame_ptr = 1;
1093
1094 return buf - avpkt->
data;
1095 }
1096
1097
1109 };