annotate alsdec.c @ 10948:c80f0dfbf47d libavcodec

Only calculate the second chroma qp if it differs from the firstin the main loop filter. (a little faster for the common case where they are equal)
author michael
date Wed, 20 Jan 2010 01:49:24 +0000
parents 61bf5a551856
children 327019a2d156
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
10522
9b56cd1e37b7 Add MPEG-4 Audio Lossless Coding (ALS) decoder.
cehoyos
parents:
diff changeset
1 /*
9b56cd1e37b7 Add MPEG-4 Audio Lossless Coding (ALS) decoder.
cehoyos
parents:
diff changeset
2 * MPEG-4 ALS decoder
9b56cd1e37b7 Add MPEG-4 Audio Lossless Coding (ALS) decoder.
cehoyos
parents:
diff changeset
3 * Copyright (c) 2009 Thilo Borgmann <thilo.borgmann _at_ googlemail.com>
9b56cd1e37b7 Add MPEG-4 Audio Lossless Coding (ALS) decoder.
cehoyos
parents:
diff changeset
4 *
9b56cd1e37b7 Add MPEG-4 Audio Lossless Coding (ALS) decoder.
cehoyos
parents:
diff changeset
5 * This file is part of FFmpeg.
9b56cd1e37b7 Add MPEG-4 Audio Lossless Coding (ALS) decoder.
cehoyos
parents:
diff changeset
6 *
9b56cd1e37b7 Add MPEG-4 Audio Lossless Coding (ALS) decoder.
cehoyos
parents:
diff changeset
7 * FFmpeg is free software; you can redistribute it and/or
9b56cd1e37b7 Add MPEG-4 Audio Lossless Coding (ALS) decoder.
cehoyos
parents:
diff changeset
8 * modify it under the terms of the GNU Lesser General Public
9b56cd1e37b7 Add MPEG-4 Audio Lossless Coding (ALS) decoder.
cehoyos
parents:
diff changeset
9 * License as published by the Free Software Foundation; either
9b56cd1e37b7 Add MPEG-4 Audio Lossless Coding (ALS) decoder.
cehoyos
parents:
diff changeset
10 * version 2.1 of the License, or (at your option) any later version.
9b56cd1e37b7 Add MPEG-4 Audio Lossless Coding (ALS) decoder.
cehoyos
parents:
diff changeset
11 *
9b56cd1e37b7 Add MPEG-4 Audio Lossless Coding (ALS) decoder.
cehoyos
parents:
diff changeset
12 * FFmpeg is distributed in the hope that it will be useful,
9b56cd1e37b7 Add MPEG-4 Audio Lossless Coding (ALS) decoder.
cehoyos
parents:
diff changeset
13 * but WITHOUT ANY WARRANTY; without even the implied warranty of
9b56cd1e37b7 Add MPEG-4 Audio Lossless Coding (ALS) decoder.
cehoyos
parents:
diff changeset
14 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
9b56cd1e37b7 Add MPEG-4 Audio Lossless Coding (ALS) decoder.
cehoyos
parents:
diff changeset
15 * Lesser General Public License for more details.
9b56cd1e37b7 Add MPEG-4 Audio Lossless Coding (ALS) decoder.
cehoyos
parents:
diff changeset
16 *
9b56cd1e37b7 Add MPEG-4 Audio Lossless Coding (ALS) decoder.
cehoyos
parents:
diff changeset
17 * You should have received a copy of the GNU Lesser General Public
9b56cd1e37b7 Add MPEG-4 Audio Lossless Coding (ALS) decoder.
cehoyos
parents:
diff changeset
18 * License along with FFmpeg; if not, write to the Free Software
9b56cd1e37b7 Add MPEG-4 Audio Lossless Coding (ALS) decoder.
cehoyos
parents:
diff changeset
19 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
9b56cd1e37b7 Add MPEG-4 Audio Lossless Coding (ALS) decoder.
cehoyos
parents:
diff changeset
20 */
9b56cd1e37b7 Add MPEG-4 Audio Lossless Coding (ALS) decoder.
cehoyos
parents:
diff changeset
21
9b56cd1e37b7 Add MPEG-4 Audio Lossless Coding (ALS) decoder.
cehoyos
parents:
diff changeset
22 /**
9b56cd1e37b7 Add MPEG-4 Audio Lossless Coding (ALS) decoder.
cehoyos
parents:
diff changeset
23 * @file libavcodec/alsdec.c
9b56cd1e37b7 Add MPEG-4 Audio Lossless Coding (ALS) decoder.
cehoyos
parents:
diff changeset
24 * MPEG-4 ALS decoder
9b56cd1e37b7 Add MPEG-4 Audio Lossless Coding (ALS) decoder.
cehoyos
parents:
diff changeset
25 * @author Thilo Borgmann <thilo.borgmann _at_ googlemail.com>
9b56cd1e37b7 Add MPEG-4 Audio Lossless Coding (ALS) decoder.
cehoyos
parents:
diff changeset
26 */
9b56cd1e37b7 Add MPEG-4 Audio Lossless Coding (ALS) decoder.
cehoyos
parents:
diff changeset
27
9b56cd1e37b7 Add MPEG-4 Audio Lossless Coding (ALS) decoder.
cehoyos
parents:
diff changeset
28
9b56cd1e37b7 Add MPEG-4 Audio Lossless Coding (ALS) decoder.
cehoyos
parents:
diff changeset
29 //#define DEBUG
9b56cd1e37b7 Add MPEG-4 Audio Lossless Coding (ALS) decoder.
cehoyos
parents:
diff changeset
30
9b56cd1e37b7 Add MPEG-4 Audio Lossless Coding (ALS) decoder.
cehoyos
parents:
diff changeset
31
9b56cd1e37b7 Add MPEG-4 Audio Lossless Coding (ALS) decoder.
cehoyos
parents:
diff changeset
32 #include "avcodec.h"
9b56cd1e37b7 Add MPEG-4 Audio Lossless Coding (ALS) decoder.
cehoyos
parents:
diff changeset
33 #include "get_bits.h"
9b56cd1e37b7 Add MPEG-4 Audio Lossless Coding (ALS) decoder.
cehoyos
parents:
diff changeset
34 #include "unary.h"
9b56cd1e37b7 Add MPEG-4 Audio Lossless Coding (ALS) decoder.
cehoyos
parents:
diff changeset
35 #include "mpeg4audio.h"
9b56cd1e37b7 Add MPEG-4 Audio Lossless Coding (ALS) decoder.
cehoyos
parents:
diff changeset
36 #include "bytestream.h"
9b56cd1e37b7 Add MPEG-4 Audio Lossless Coding (ALS) decoder.
cehoyos
parents:
diff changeset
37
10531
142645a57180 Merge data tables from als_data.h with the decoder source to reduce
thilo.borgmann
parents: 10530
diff changeset
38 #include <stdint.h>
142645a57180 Merge data tables from als_data.h with the decoder source to reduce
thilo.borgmann
parents: 10530
diff changeset
39
142645a57180 Merge data tables from als_data.h with the decoder source to reduce
thilo.borgmann
parents: 10530
diff changeset
40 /** Rice parameters and corresponding index offsets for decoding the
142645a57180 Merge data tables from als_data.h with the decoder source to reduce
thilo.borgmann
parents: 10530
diff changeset
41 * indices of scaled PARCOR values. The table choosen is set globally
142645a57180 Merge data tables from als_data.h with the decoder source to reduce
thilo.borgmann
parents: 10530
diff changeset
42 * by the encoder and stored in ALSSpecificConfig.
142645a57180 Merge data tables from als_data.h with the decoder source to reduce
thilo.borgmann
parents: 10530
diff changeset
43 */
142645a57180 Merge data tables from als_data.h with the decoder source to reduce
thilo.borgmann
parents: 10530
diff changeset
44 static const int8_t parcor_rice_table[3][20][2] = {
142645a57180 Merge data tables from als_data.h with the decoder source to reduce
thilo.borgmann
parents: 10530
diff changeset
45 { {-52, 4}, {-29, 5}, {-31, 4}, { 19, 4}, {-16, 4},
142645a57180 Merge data tables from als_data.h with the decoder source to reduce
thilo.borgmann
parents: 10530
diff changeset
46 { 12, 3}, { -7, 3}, { 9, 3}, { -5, 3}, { 6, 3},
142645a57180 Merge data tables from als_data.h with the decoder source to reduce
thilo.borgmann
parents: 10530
diff changeset
47 { -4, 3}, { 3, 3}, { -3, 2}, { 3, 2}, { -2, 2},
142645a57180 Merge data tables from als_data.h with the decoder source to reduce
thilo.borgmann
parents: 10530
diff changeset
48 { 3, 2}, { -1, 2}, { 2, 2}, { -1, 2}, { 2, 2} },
142645a57180 Merge data tables from als_data.h with the decoder source to reduce
thilo.borgmann
parents: 10530
diff changeset
49 { {-58, 3}, {-42, 4}, {-46, 4}, { 37, 5}, {-36, 4},
142645a57180 Merge data tables from als_data.h with the decoder source to reduce
thilo.borgmann
parents: 10530
diff changeset
50 { 29, 4}, {-29, 4}, { 25, 4}, {-23, 4}, { 20, 4},
142645a57180 Merge data tables from als_data.h with the decoder source to reduce
thilo.borgmann
parents: 10530
diff changeset
51 {-17, 4}, { 16, 4}, {-12, 4}, { 12, 3}, {-10, 4},
142645a57180 Merge data tables from als_data.h with the decoder source to reduce
thilo.borgmann
parents: 10530
diff changeset
52 { 7, 3}, { -4, 4}, { 3, 3}, { -1, 3}, { 1, 3} },
142645a57180 Merge data tables from als_data.h with the decoder source to reduce
thilo.borgmann
parents: 10530
diff changeset
53 { {-59, 3}, {-45, 5}, {-50, 4}, { 38, 4}, {-39, 4},
142645a57180 Merge data tables from als_data.h with the decoder source to reduce
thilo.borgmann
parents: 10530
diff changeset
54 { 32, 4}, {-30, 4}, { 25, 3}, {-23, 3}, { 20, 3},
142645a57180 Merge data tables from als_data.h with the decoder source to reduce
thilo.borgmann
parents: 10530
diff changeset
55 {-20, 3}, { 16, 3}, {-13, 3}, { 10, 3}, { -7, 3},
142645a57180 Merge data tables from als_data.h with the decoder source to reduce
thilo.borgmann
parents: 10530
diff changeset
56 { 3, 3}, { 0, 3}, { -1, 3}, { 2, 3}, { -1, 2} }
142645a57180 Merge data tables from als_data.h with the decoder source to reduce
thilo.borgmann
parents: 10530
diff changeset
57 };
142645a57180 Merge data tables from als_data.h with the decoder source to reduce
thilo.borgmann
parents: 10530
diff changeset
58
142645a57180 Merge data tables from als_data.h with the decoder source to reduce
thilo.borgmann
parents: 10530
diff changeset
59
142645a57180 Merge data tables from als_data.h with the decoder source to reduce
thilo.borgmann
parents: 10530
diff changeset
60 /** Scaled PARCOR values used for the first two PARCOR coefficients.
142645a57180 Merge data tables from als_data.h with the decoder source to reduce
thilo.borgmann
parents: 10530
diff changeset
61 * To be indexed by the Rice coded indices.
142645a57180 Merge data tables from als_data.h with the decoder source to reduce
thilo.borgmann
parents: 10530
diff changeset
62 * Generated by: parcor_scaled_values[i] = 32 + ((i * (i+1)) << 7) - (1 << 20)
142645a57180 Merge data tables from als_data.h with the decoder source to reduce
thilo.borgmann
parents: 10530
diff changeset
63 * Actual values are divided by 32 in order to be stored in 16 bits.
142645a57180 Merge data tables from als_data.h with the decoder source to reduce
thilo.borgmann
parents: 10530
diff changeset
64 */
142645a57180 Merge data tables from als_data.h with the decoder source to reduce
thilo.borgmann
parents: 10530
diff changeset
65 static const int16_t parcor_scaled_values[] = {
142645a57180 Merge data tables from als_data.h with the decoder source to reduce
thilo.borgmann
parents: 10530
diff changeset
66 -1048544 / 32, -1048288 / 32, -1047776 / 32, -1047008 / 32,
142645a57180 Merge data tables from als_data.h with the decoder source to reduce
thilo.borgmann
parents: 10530
diff changeset
67 -1045984 / 32, -1044704 / 32, -1043168 / 32, -1041376 / 32,
142645a57180 Merge data tables from als_data.h with the decoder source to reduce
thilo.borgmann
parents: 10530
diff changeset
68 -1039328 / 32, -1037024 / 32, -1034464 / 32, -1031648 / 32,
142645a57180 Merge data tables from als_data.h with the decoder source to reduce
thilo.borgmann
parents: 10530
diff changeset
69 -1028576 / 32, -1025248 / 32, -1021664 / 32, -1017824 / 32,
142645a57180 Merge data tables from als_data.h with the decoder source to reduce
thilo.borgmann
parents: 10530
diff changeset
70 -1013728 / 32, -1009376 / 32, -1004768 / 32, -999904 / 32,
142645a57180 Merge data tables from als_data.h with the decoder source to reduce
thilo.borgmann
parents: 10530
diff changeset
71 -994784 / 32, -989408 / 32, -983776 / 32, -977888 / 32,
142645a57180 Merge data tables from als_data.h with the decoder source to reduce
thilo.borgmann
parents: 10530
diff changeset
72 -971744 / 32, -965344 / 32, -958688 / 32, -951776 / 32,
142645a57180 Merge data tables from als_data.h with the decoder source to reduce
thilo.borgmann
parents: 10530
diff changeset
73 -944608 / 32, -937184 / 32, -929504 / 32, -921568 / 32,
142645a57180 Merge data tables from als_data.h with the decoder source to reduce
thilo.borgmann
parents: 10530
diff changeset
74 -913376 / 32, -904928 / 32, -896224 / 32, -887264 / 32,
142645a57180 Merge data tables from als_data.h with the decoder source to reduce
thilo.borgmann
parents: 10530
diff changeset
75 -878048 / 32, -868576 / 32, -858848 / 32, -848864 / 32,
142645a57180 Merge data tables from als_data.h with the decoder source to reduce
thilo.borgmann
parents: 10530
diff changeset
76 -838624 / 32, -828128 / 32, -817376 / 32, -806368 / 32,
142645a57180 Merge data tables from als_data.h with the decoder source to reduce
thilo.borgmann
parents: 10530
diff changeset
77 -795104 / 32, -783584 / 32, -771808 / 32, -759776 / 32,
142645a57180 Merge data tables from als_data.h with the decoder source to reduce
thilo.borgmann
parents: 10530
diff changeset
78 -747488 / 32, -734944 / 32, -722144 / 32, -709088 / 32,
142645a57180 Merge data tables from als_data.h with the decoder source to reduce
thilo.borgmann
parents: 10530
diff changeset
79 -695776 / 32, -682208 / 32, -668384 / 32, -654304 / 32,
142645a57180 Merge data tables from als_data.h with the decoder source to reduce
thilo.borgmann
parents: 10530
diff changeset
80 -639968 / 32, -625376 / 32, -610528 / 32, -595424 / 32,
142645a57180 Merge data tables from als_data.h with the decoder source to reduce
thilo.borgmann
parents: 10530
diff changeset
81 -580064 / 32, -564448 / 32, -548576 / 32, -532448 / 32,
142645a57180 Merge data tables from als_data.h with the decoder source to reduce
thilo.borgmann
parents: 10530
diff changeset
82 -516064 / 32, -499424 / 32, -482528 / 32, -465376 / 32,
142645a57180 Merge data tables from als_data.h with the decoder source to reduce
thilo.borgmann
parents: 10530
diff changeset
83 -447968 / 32, -430304 / 32, -412384 / 32, -394208 / 32,
142645a57180 Merge data tables from als_data.h with the decoder source to reduce
thilo.borgmann
parents: 10530
diff changeset
84 -375776 / 32, -357088 / 32, -338144 / 32, -318944 / 32,
142645a57180 Merge data tables from als_data.h with the decoder source to reduce
thilo.borgmann
parents: 10530
diff changeset
85 -299488 / 32, -279776 / 32, -259808 / 32, -239584 / 32,
142645a57180 Merge data tables from als_data.h with the decoder source to reduce
thilo.borgmann
parents: 10530
diff changeset
86 -219104 / 32, -198368 / 32, -177376 / 32, -156128 / 32,
142645a57180 Merge data tables from als_data.h with the decoder source to reduce
thilo.borgmann
parents: 10530
diff changeset
87 -134624 / 32, -112864 / 32, -90848 / 32, -68576 / 32,
142645a57180 Merge data tables from als_data.h with the decoder source to reduce
thilo.borgmann
parents: 10530
diff changeset
88 -46048 / 32, -23264 / 32, -224 / 32, 23072 / 32,
142645a57180 Merge data tables from als_data.h with the decoder source to reduce
thilo.borgmann
parents: 10530
diff changeset
89 46624 / 32, 70432 / 32, 94496 / 32, 118816 / 32,
142645a57180 Merge data tables from als_data.h with the decoder source to reduce
thilo.borgmann
parents: 10530
diff changeset
90 143392 / 32, 168224 / 32, 193312 / 32, 218656 / 32,
142645a57180 Merge data tables from als_data.h with the decoder source to reduce
thilo.borgmann
parents: 10530
diff changeset
91 244256 / 32, 270112 / 32, 296224 / 32, 322592 / 32,
142645a57180 Merge data tables from als_data.h with the decoder source to reduce
thilo.borgmann
parents: 10530
diff changeset
92 349216 / 32, 376096 / 32, 403232 / 32, 430624 / 32,
142645a57180 Merge data tables from als_data.h with the decoder source to reduce
thilo.borgmann
parents: 10530
diff changeset
93 458272 / 32, 486176 / 32, 514336 / 32, 542752 / 32,
142645a57180 Merge data tables from als_data.h with the decoder source to reduce
thilo.borgmann
parents: 10530
diff changeset
94 571424 / 32, 600352 / 32, 629536 / 32, 658976 / 32,
142645a57180 Merge data tables from als_data.h with the decoder source to reduce
thilo.borgmann
parents: 10530
diff changeset
95 688672 / 32, 718624 / 32, 748832 / 32, 779296 / 32,
142645a57180 Merge data tables from als_data.h with the decoder source to reduce
thilo.borgmann
parents: 10530
diff changeset
96 810016 / 32, 840992 / 32, 872224 / 32, 903712 / 32,
142645a57180 Merge data tables from als_data.h with the decoder source to reduce
thilo.borgmann
parents: 10530
diff changeset
97 935456 / 32, 967456 / 32, 999712 / 32, 1032224 / 32
142645a57180 Merge data tables from als_data.h with the decoder source to reduce
thilo.borgmann
parents: 10530
diff changeset
98 };
142645a57180 Merge data tables from als_data.h with the decoder source to reduce
thilo.borgmann
parents: 10530
diff changeset
99
142645a57180 Merge data tables from als_data.h with the decoder source to reduce
thilo.borgmann
parents: 10530
diff changeset
100
142645a57180 Merge data tables from als_data.h with the decoder source to reduce
thilo.borgmann
parents: 10530
diff changeset
101 /** Gain values of p(0) for long-term prediction.
142645a57180 Merge data tables from als_data.h with the decoder source to reduce
thilo.borgmann
parents: 10530
diff changeset
102 * To be indexed by the Rice coded indices.
142645a57180 Merge data tables from als_data.h with the decoder source to reduce
thilo.borgmann
parents: 10530
diff changeset
103 */
142645a57180 Merge data tables from als_data.h with the decoder source to reduce
thilo.borgmann
parents: 10530
diff changeset
104 static const uint8_t ltp_gain_values [4][4] = {
142645a57180 Merge data tables from als_data.h with the decoder source to reduce
thilo.borgmann
parents: 10530
diff changeset
105 { 0, 8, 16, 24},
142645a57180 Merge data tables from als_data.h with the decoder source to reduce
thilo.borgmann
parents: 10530
diff changeset
106 {32, 40, 48, 56},
142645a57180 Merge data tables from als_data.h with the decoder source to reduce
thilo.borgmann
parents: 10530
diff changeset
107 {64, 70, 76, 82},
142645a57180 Merge data tables from als_data.h with the decoder source to reduce
thilo.borgmann
parents: 10530
diff changeset
108 {88, 92, 96, 100}
142645a57180 Merge data tables from als_data.h with the decoder source to reduce
thilo.borgmann
parents: 10530
diff changeset
109 };
142645a57180 Merge data tables from als_data.h with the decoder source to reduce
thilo.borgmann
parents: 10530
diff changeset
110
10522
9b56cd1e37b7 Add MPEG-4 Audio Lossless Coding (ALS) decoder.
cehoyos
parents:
diff changeset
111
10802
4f614b69b4e5 Add multi-channel correlation support for ALS.
thilo.borgmann
parents: 10800
diff changeset
112 /** Inter-channel weighting factors for multi-channel correlation.
4f614b69b4e5 Add multi-channel correlation support for ALS.
thilo.borgmann
parents: 10800
diff changeset
113 * To be indexed by the Rice coded indices.
4f614b69b4e5 Add multi-channel correlation support for ALS.
thilo.borgmann
parents: 10800
diff changeset
114 */
4f614b69b4e5 Add multi-channel correlation support for ALS.
thilo.borgmann
parents: 10800
diff changeset
115 static const int16_t mcc_weightings[] = {
4f614b69b4e5 Add multi-channel correlation support for ALS.
thilo.borgmann
parents: 10800
diff changeset
116 204, 192, 179, 166, 153, 140, 128, 115,
4f614b69b4e5 Add multi-channel correlation support for ALS.
thilo.borgmann
parents: 10800
diff changeset
117 102, 89, 76, 64, 51, 38, 25, 12,
4f614b69b4e5 Add multi-channel correlation support for ALS.
thilo.borgmann
parents: 10800
diff changeset
118 0, -12, -25, -38, -51, -64, -76, -89,
4f614b69b4e5 Add multi-channel correlation support for ALS.
thilo.borgmann
parents: 10800
diff changeset
119 -102, -115, -128, -140, -153, -166, -179, -192
4f614b69b4e5 Add multi-channel correlation support for ALS.
thilo.borgmann
parents: 10800
diff changeset
120 };
4f614b69b4e5 Add multi-channel correlation support for ALS.
thilo.borgmann
parents: 10800
diff changeset
121
4f614b69b4e5 Add multi-channel correlation support for ALS.
thilo.borgmann
parents: 10800
diff changeset
122
10522
9b56cd1e37b7 Add MPEG-4 Audio Lossless Coding (ALS) decoder.
cehoyos
parents:
diff changeset
123 enum RA_Flag {
9b56cd1e37b7 Add MPEG-4 Audio Lossless Coding (ALS) decoder.
cehoyos
parents:
diff changeset
124 RA_FLAG_NONE,
9b56cd1e37b7 Add MPEG-4 Audio Lossless Coding (ALS) decoder.
cehoyos
parents:
diff changeset
125 RA_FLAG_FRAMES,
9b56cd1e37b7 Add MPEG-4 Audio Lossless Coding (ALS) decoder.
cehoyos
parents:
diff changeset
126 RA_FLAG_HEADER
9b56cd1e37b7 Add MPEG-4 Audio Lossless Coding (ALS) decoder.
cehoyos
parents:
diff changeset
127 };
9b56cd1e37b7 Add MPEG-4 Audio Lossless Coding (ALS) decoder.
cehoyos
parents:
diff changeset
128
9b56cd1e37b7 Add MPEG-4 Audio Lossless Coding (ALS) decoder.
cehoyos
parents:
diff changeset
129
9b56cd1e37b7 Add MPEG-4 Audio Lossless Coding (ALS) decoder.
cehoyos
parents:
diff changeset
130 typedef struct {
9b56cd1e37b7 Add MPEG-4 Audio Lossless Coding (ALS) decoder.
cehoyos
parents:
diff changeset
131 uint32_t samples; ///< number of samples, 0xFFFFFFFF if unknown
9b56cd1e37b7 Add MPEG-4 Audio Lossless Coding (ALS) decoder.
cehoyos
parents:
diff changeset
132 int resolution; ///< 000 = 8-bit; 001 = 16-bit; 010 = 24-bit; 011 = 32-bit
9b56cd1e37b7 Add MPEG-4 Audio Lossless Coding (ALS) decoder.
cehoyos
parents:
diff changeset
133 int floating; ///< 1 = IEEE 32-bit floating-point, 0 = integer
9b56cd1e37b7 Add MPEG-4 Audio Lossless Coding (ALS) decoder.
cehoyos
parents:
diff changeset
134 int frame_length; ///< frame length for each frame (last frame may differ)
9b56cd1e37b7 Add MPEG-4 Audio Lossless Coding (ALS) decoder.
cehoyos
parents:
diff changeset
135 int ra_distance; ///< distance between RA frames (in frames, 0...255)
9b56cd1e37b7 Add MPEG-4 Audio Lossless Coding (ALS) decoder.
cehoyos
parents:
diff changeset
136 enum RA_Flag ra_flag; ///< indicates where the size of ra units is stored
9b56cd1e37b7 Add MPEG-4 Audio Lossless Coding (ALS) decoder.
cehoyos
parents:
diff changeset
137 int adapt_order; ///< adaptive order: 1 = on, 0 = off
9b56cd1e37b7 Add MPEG-4 Audio Lossless Coding (ALS) decoder.
cehoyos
parents:
diff changeset
138 int coef_table; ///< table index of Rice code parameters
9b56cd1e37b7 Add MPEG-4 Audio Lossless Coding (ALS) decoder.
cehoyos
parents:
diff changeset
139 int long_term_prediction; ///< long term prediction (LTP): 1 = on, 0 = off
9b56cd1e37b7 Add MPEG-4 Audio Lossless Coding (ALS) decoder.
cehoyos
parents:
diff changeset
140 int max_order; ///< maximum prediction order (0..1023)
9b56cd1e37b7 Add MPEG-4 Audio Lossless Coding (ALS) decoder.
cehoyos
parents:
diff changeset
141 int block_switching; ///< number of block switching levels
9b56cd1e37b7 Add MPEG-4 Audio Lossless Coding (ALS) decoder.
cehoyos
parents:
diff changeset
142 int bgmc; ///< "Block Gilbert-Moore Code": 1 = on, 0 = off (Rice coding only)
9b56cd1e37b7 Add MPEG-4 Audio Lossless Coding (ALS) decoder.
cehoyos
parents:
diff changeset
143 int sb_part; ///< sub-block partition
9b56cd1e37b7 Add MPEG-4 Audio Lossless Coding (ALS) decoder.
cehoyos
parents:
diff changeset
144 int joint_stereo; ///< joint stereo: 1 = on, 0 = off
9b56cd1e37b7 Add MPEG-4 Audio Lossless Coding (ALS) decoder.
cehoyos
parents:
diff changeset
145 int mc_coding; ///< extended inter-channel coding (multi channel coding): 1 = on, 0 = off
9b56cd1e37b7 Add MPEG-4 Audio Lossless Coding (ALS) decoder.
cehoyos
parents:
diff changeset
146 int chan_config; ///< indicates that a chan_config_info field is present
9b56cd1e37b7 Add MPEG-4 Audio Lossless Coding (ALS) decoder.
cehoyos
parents:
diff changeset
147 int chan_sort; ///< channel rearrangement: 1 = on, 0 = off
9b56cd1e37b7 Add MPEG-4 Audio Lossless Coding (ALS) decoder.
cehoyos
parents:
diff changeset
148 int rlslms; ///< use "Recursive Least Square-Least Mean Square" predictor: 1 = on, 0 = off
9b56cd1e37b7 Add MPEG-4 Audio Lossless Coding (ALS) decoder.
cehoyos
parents:
diff changeset
149 int chan_config_info; ///< mapping of channels to loudspeaker locations. Unused until setting channel configuration is implemented.
9b56cd1e37b7 Add MPEG-4 Audio Lossless Coding (ALS) decoder.
cehoyos
parents:
diff changeset
150 int *chan_pos; ///< original channel positions
9b56cd1e37b7 Add MPEG-4 Audio Lossless Coding (ALS) decoder.
cehoyos
parents:
diff changeset
151 uint32_t header_size; ///< header size of original audio file in bytes, provided for debugging
9b56cd1e37b7 Add MPEG-4 Audio Lossless Coding (ALS) decoder.
cehoyos
parents:
diff changeset
152 uint32_t trailer_size; ///< trailer size of original audio file in bytes, provided for debugging
9b56cd1e37b7 Add MPEG-4 Audio Lossless Coding (ALS) decoder.
cehoyos
parents:
diff changeset
153 } ALSSpecificConfig;
9b56cd1e37b7 Add MPEG-4 Audio Lossless Coding (ALS) decoder.
cehoyos
parents:
diff changeset
154
9b56cd1e37b7 Add MPEG-4 Audio Lossless Coding (ALS) decoder.
cehoyos
parents:
diff changeset
155
9b56cd1e37b7 Add MPEG-4 Audio Lossless Coding (ALS) decoder.
cehoyos
parents:
diff changeset
156 typedef struct {
10802
4f614b69b4e5 Add multi-channel correlation support for ALS.
thilo.borgmann
parents: 10800
diff changeset
157 int stop_flag;
4f614b69b4e5 Add multi-channel correlation support for ALS.
thilo.borgmann
parents: 10800
diff changeset
158 int master_channel;
4f614b69b4e5 Add multi-channel correlation support for ALS.
thilo.borgmann
parents: 10800
diff changeset
159 int time_diff_flag;
4f614b69b4e5 Add multi-channel correlation support for ALS.
thilo.borgmann
parents: 10800
diff changeset
160 int time_diff_sign;
4f614b69b4e5 Add multi-channel correlation support for ALS.
thilo.borgmann
parents: 10800
diff changeset
161 int time_diff_index;
4f614b69b4e5 Add multi-channel correlation support for ALS.
thilo.borgmann
parents: 10800
diff changeset
162 int weighting[6];
4f614b69b4e5 Add multi-channel correlation support for ALS.
thilo.borgmann
parents: 10800
diff changeset
163 } ALSChannelData;
4f614b69b4e5 Add multi-channel correlation support for ALS.
thilo.borgmann
parents: 10800
diff changeset
164
4f614b69b4e5 Add multi-channel correlation support for ALS.
thilo.borgmann
parents: 10800
diff changeset
165
4f614b69b4e5 Add multi-channel correlation support for ALS.
thilo.borgmann
parents: 10800
diff changeset
166 typedef struct {
10522
9b56cd1e37b7 Add MPEG-4 Audio Lossless Coding (ALS) decoder.
cehoyos
parents:
diff changeset
167 AVCodecContext *avctx;
9b56cd1e37b7 Add MPEG-4 Audio Lossless Coding (ALS) decoder.
cehoyos
parents:
diff changeset
168 ALSSpecificConfig sconf;
9b56cd1e37b7 Add MPEG-4 Audio Lossless Coding (ALS) decoder.
cehoyos
parents:
diff changeset
169 GetBitContext gb;
9b56cd1e37b7 Add MPEG-4 Audio Lossless Coding (ALS) decoder.
cehoyos
parents:
diff changeset
170 unsigned int cur_frame_length; ///< length of the current frame to decode
9b56cd1e37b7 Add MPEG-4 Audio Lossless Coding (ALS) decoder.
cehoyos
parents:
diff changeset
171 unsigned int frame_id; ///< the frame ID / number of the current frame
9b56cd1e37b7 Add MPEG-4 Audio Lossless Coding (ALS) decoder.
cehoyos
parents:
diff changeset
172 unsigned int js_switch; ///< if true, joint-stereo decoding is enforced
9b56cd1e37b7 Add MPEG-4 Audio Lossless Coding (ALS) decoder.
cehoyos
parents:
diff changeset
173 unsigned int num_blocks; ///< number of blocks used in the current frame
10530
d428e57f14c6 Add long-term prediction to the ALS decoder.
thilo.borgmann
parents: 10524
diff changeset
174 int ltp_lag_length; ///< number of bits used for ltp lag value
10681
997692df50c1 Read and decode block data in separate functions to prepare support for
thilo.borgmann
parents: 10535
diff changeset
175 int *use_ltp; ///< contains use_ltp flags for all channels
997692df50c1 Read and decode block data in separate functions to prepare support for
thilo.borgmann
parents: 10535
diff changeset
176 int *ltp_lag; ///< contains ltp lag values for all channels
997692df50c1 Read and decode block data in separate functions to prepare support for
thilo.borgmann
parents: 10535
diff changeset
177 int **ltp_gain; ///< gain values for ltp 5-tap filter for a channel
997692df50c1 Read and decode block data in separate functions to prepare support for
thilo.borgmann
parents: 10535
diff changeset
178 int *ltp_gain_buffer; ///< contains all gain values for ltp 5-tap filter
10802
4f614b69b4e5 Add multi-channel correlation support for ALS.
thilo.borgmann
parents: 10800
diff changeset
179 int32_t **quant_cof; ///< quantized parcor coefficients for a channel
4f614b69b4e5 Add multi-channel correlation support for ALS.
thilo.borgmann
parents: 10800
diff changeset
180 int32_t *quant_cof_buffer; ///< contains all quantized parcor coefficients
4f614b69b4e5 Add multi-channel correlation support for ALS.
thilo.borgmann
parents: 10800
diff changeset
181 int32_t **lpc_cof; ///< coefficients of the direct form prediction filter for a channel
4f614b69b4e5 Add multi-channel correlation support for ALS.
thilo.borgmann
parents: 10800
diff changeset
182 int32_t *lpc_cof_buffer; ///< contains all coefficients of the direct form prediction filter
10860
c9fb5b89e47a Replace variable length array with an allocated buffer
thilo.borgmann
parents: 10823
diff changeset
183 int32_t *lpc_cof_reversed_buffer; ///< temporary buffer to set up a reversed versio of lpc_cof_buffer
10802
4f614b69b4e5 Add multi-channel correlation support for ALS.
thilo.borgmann
parents: 10800
diff changeset
184 ALSChannelData **chan_data; ///< channel data for multi-channel correlation
4f614b69b4e5 Add multi-channel correlation support for ALS.
thilo.borgmann
parents: 10800
diff changeset
185 ALSChannelData *chan_data_buffer; ///< contains channel data for all channels
4f614b69b4e5 Add multi-channel correlation support for ALS.
thilo.borgmann
parents: 10800
diff changeset
186 int *reverted_channels; ///< stores a flag for each reverted channel
10522
9b56cd1e37b7 Add MPEG-4 Audio Lossless Coding (ALS) decoder.
cehoyos
parents:
diff changeset
187 int32_t *prev_raw_samples; ///< contains unshifted raw samples from the previous block
9b56cd1e37b7 Add MPEG-4 Audio Lossless Coding (ALS) decoder.
cehoyos
parents:
diff changeset
188 int32_t **raw_samples; ///< decoded raw samples for each channel
9b56cd1e37b7 Add MPEG-4 Audio Lossless Coding (ALS) decoder.
cehoyos
parents:
diff changeset
189 int32_t *raw_buffer; ///< contains all decoded raw samples including carryover samples
9b56cd1e37b7 Add MPEG-4 Audio Lossless Coding (ALS) decoder.
cehoyos
parents:
diff changeset
190 } ALSDecContext;
9b56cd1e37b7 Add MPEG-4 Audio Lossless Coding (ALS) decoder.
cehoyos
parents:
diff changeset
191
9b56cd1e37b7 Add MPEG-4 Audio Lossless Coding (ALS) decoder.
cehoyos
parents:
diff changeset
192
10681
997692df50c1 Read and decode block data in separate functions to prepare support for
thilo.borgmann
parents: 10535
diff changeset
193 typedef struct {
997692df50c1 Read and decode block data in separate functions to prepare support for
thilo.borgmann
parents: 10535
diff changeset
194 unsigned int block_length; ///< number of samples within the block
997692df50c1 Read and decode block data in separate functions to prepare support for
thilo.borgmann
parents: 10535
diff changeset
195 unsigned int ra_block; ///< if true, this is a random access block
997692df50c1 Read and decode block data in separate functions to prepare support for
thilo.borgmann
parents: 10535
diff changeset
196 int const_block; ///< if true, this is a constant value block
997692df50c1 Read and decode block data in separate functions to prepare support for
thilo.borgmann
parents: 10535
diff changeset
197 int32_t const_val; ///< the sample value of a constant block
997692df50c1 Read and decode block data in separate functions to prepare support for
thilo.borgmann
parents: 10535
diff changeset
198 int js_blocks; ///< true if this block contains a difference signal
997692df50c1 Read and decode block data in separate functions to prepare support for
thilo.borgmann
parents: 10535
diff changeset
199 unsigned int shift_lsbs; ///< shift of values for this block
997692df50c1 Read and decode block data in separate functions to prepare support for
thilo.borgmann
parents: 10535
diff changeset
200 unsigned int opt_order; ///< prediction order of this block
997692df50c1 Read and decode block data in separate functions to prepare support for
thilo.borgmann
parents: 10535
diff changeset
201 int store_prev_samples;///< if true, carryover samples have to be stored
997692df50c1 Read and decode block data in separate functions to prepare support for
thilo.borgmann
parents: 10535
diff changeset
202 int *use_ltp; ///< if true, long-term prediction is used
997692df50c1 Read and decode block data in separate functions to prepare support for
thilo.borgmann
parents: 10535
diff changeset
203 int *ltp_lag; ///< lag value for long-term prediction
997692df50c1 Read and decode block data in separate functions to prepare support for
thilo.borgmann
parents: 10535
diff changeset
204 int *ltp_gain; ///< gain values for ltp 5-tap filter
997692df50c1 Read and decode block data in separate functions to prepare support for
thilo.borgmann
parents: 10535
diff changeset
205 int32_t *quant_cof; ///< quantized parcor coefficients
997692df50c1 Read and decode block data in separate functions to prepare support for
thilo.borgmann
parents: 10535
diff changeset
206 int32_t *lpc_cof; ///< coefficients of the direct form prediction
997692df50c1 Read and decode block data in separate functions to prepare support for
thilo.borgmann
parents: 10535
diff changeset
207 int32_t *raw_samples; ///< decoded raw samples / residuals for this block
997692df50c1 Read and decode block data in separate functions to prepare support for
thilo.borgmann
parents: 10535
diff changeset
208 int32_t *prev_raw_samples; ///< contains unshifted raw samples from the previous block
997692df50c1 Read and decode block data in separate functions to prepare support for
thilo.borgmann
parents: 10535
diff changeset
209 int32_t *raw_other; ///< decoded raw samples of the other channel of a channel pair
997692df50c1 Read and decode block data in separate functions to prepare support for
thilo.borgmann
parents: 10535
diff changeset
210 } ALSBlockData;
997692df50c1 Read and decode block data in separate functions to prepare support for
thilo.borgmann
parents: 10535
diff changeset
211
997692df50c1 Read and decode block data in separate functions to prepare support for
thilo.borgmann
parents: 10535
diff changeset
212
10522
9b56cd1e37b7 Add MPEG-4 Audio Lossless Coding (ALS) decoder.
cehoyos
parents:
diff changeset
213 static av_cold void dprint_specific_config(ALSDecContext *ctx)
9b56cd1e37b7 Add MPEG-4 Audio Lossless Coding (ALS) decoder.
cehoyos
parents:
diff changeset
214 {
9b56cd1e37b7 Add MPEG-4 Audio Lossless Coding (ALS) decoder.
cehoyos
parents:
diff changeset
215 #ifdef DEBUG
9b56cd1e37b7 Add MPEG-4 Audio Lossless Coding (ALS) decoder.
cehoyos
parents:
diff changeset
216 AVCodecContext *avctx = ctx->avctx;
9b56cd1e37b7 Add MPEG-4 Audio Lossless Coding (ALS) decoder.
cehoyos
parents:
diff changeset
217 ALSSpecificConfig *sconf = &ctx->sconf;
9b56cd1e37b7 Add MPEG-4 Audio Lossless Coding (ALS) decoder.
cehoyos
parents:
diff changeset
218
9b56cd1e37b7 Add MPEG-4 Audio Lossless Coding (ALS) decoder.
cehoyos
parents:
diff changeset
219 dprintf(avctx, "resolution = %i\n", sconf->resolution);
9b56cd1e37b7 Add MPEG-4 Audio Lossless Coding (ALS) decoder.
cehoyos
parents:
diff changeset
220 dprintf(avctx, "floating = %i\n", sconf->floating);
9b56cd1e37b7 Add MPEG-4 Audio Lossless Coding (ALS) decoder.
cehoyos
parents:
diff changeset
221 dprintf(avctx, "frame_length = %i\n", sconf->frame_length);
9b56cd1e37b7 Add MPEG-4 Audio Lossless Coding (ALS) decoder.
cehoyos
parents:
diff changeset
222 dprintf(avctx, "ra_distance = %i\n", sconf->ra_distance);
9b56cd1e37b7 Add MPEG-4 Audio Lossless Coding (ALS) decoder.
cehoyos
parents:
diff changeset
223 dprintf(avctx, "ra_flag = %i\n", sconf->ra_flag);
9b56cd1e37b7 Add MPEG-4 Audio Lossless Coding (ALS) decoder.
cehoyos
parents:
diff changeset
224 dprintf(avctx, "adapt_order = %i\n", sconf->adapt_order);
9b56cd1e37b7 Add MPEG-4 Audio Lossless Coding (ALS) decoder.
cehoyos
parents:
diff changeset
225 dprintf(avctx, "coef_table = %i\n", sconf->coef_table);
9b56cd1e37b7 Add MPEG-4 Audio Lossless Coding (ALS) decoder.
cehoyos
parents:
diff changeset
226 dprintf(avctx, "long_term_prediction = %i\n", sconf->long_term_prediction);
9b56cd1e37b7 Add MPEG-4 Audio Lossless Coding (ALS) decoder.
cehoyos
parents:
diff changeset
227 dprintf(avctx, "max_order = %i\n", sconf->max_order);
9b56cd1e37b7 Add MPEG-4 Audio Lossless Coding (ALS) decoder.
cehoyos
parents:
diff changeset
228 dprintf(avctx, "block_switching = %i\n", sconf->block_switching);
9b56cd1e37b7 Add MPEG-4 Audio Lossless Coding (ALS) decoder.
cehoyos
parents:
diff changeset
229 dprintf(avctx, "bgmc = %i\n", sconf->bgmc);
9b56cd1e37b7 Add MPEG-4 Audio Lossless Coding (ALS) decoder.
cehoyos
parents:
diff changeset
230 dprintf(avctx, "sb_part = %i\n", sconf->sb_part);
9b56cd1e37b7 Add MPEG-4 Audio Lossless Coding (ALS) decoder.
cehoyos
parents:
diff changeset
231 dprintf(avctx, "joint_stereo = %i\n", sconf->joint_stereo);
9b56cd1e37b7 Add MPEG-4 Audio Lossless Coding (ALS) decoder.
cehoyos
parents:
diff changeset
232 dprintf(avctx, "mc_coding = %i\n", sconf->mc_coding);
9b56cd1e37b7 Add MPEG-4 Audio Lossless Coding (ALS) decoder.
cehoyos
parents:
diff changeset
233 dprintf(avctx, "chan_config = %i\n", sconf->chan_config);
9b56cd1e37b7 Add MPEG-4 Audio Lossless Coding (ALS) decoder.
cehoyos
parents:
diff changeset
234 dprintf(avctx, "chan_sort = %i\n", sconf->chan_sort);
9b56cd1e37b7 Add MPEG-4 Audio Lossless Coding (ALS) decoder.
cehoyos
parents:
diff changeset
235 dprintf(avctx, "RLSLMS = %i\n", sconf->rlslms);
9b56cd1e37b7 Add MPEG-4 Audio Lossless Coding (ALS) decoder.
cehoyos
parents:
diff changeset
236 dprintf(avctx, "chan_config_info = %i\n", sconf->chan_config_info);
9b56cd1e37b7 Add MPEG-4 Audio Lossless Coding (ALS) decoder.
cehoyos
parents:
diff changeset
237 dprintf(avctx, "header_size = %i\n", sconf->header_size);
9b56cd1e37b7 Add MPEG-4 Audio Lossless Coding (ALS) decoder.
cehoyos
parents:
diff changeset
238 dprintf(avctx, "trailer_size = %i\n", sconf->trailer_size);
9b56cd1e37b7 Add MPEG-4 Audio Lossless Coding (ALS) decoder.
cehoyos
parents:
diff changeset
239 #endif
9b56cd1e37b7 Add MPEG-4 Audio Lossless Coding (ALS) decoder.
cehoyos
parents:
diff changeset
240 }
9b56cd1e37b7 Add MPEG-4 Audio Lossless Coding (ALS) decoder.
cehoyos
parents:
diff changeset
241
9b56cd1e37b7 Add MPEG-4 Audio Lossless Coding (ALS) decoder.
cehoyos
parents:
diff changeset
242
9b56cd1e37b7 Add MPEG-4 Audio Lossless Coding (ALS) decoder.
cehoyos
parents:
diff changeset
243 /** Reads an ALSSpecificConfig from a buffer into the output struct.
9b56cd1e37b7 Add MPEG-4 Audio Lossless Coding (ALS) decoder.
cehoyos
parents:
diff changeset
244 */
9b56cd1e37b7 Add MPEG-4 Audio Lossless Coding (ALS) decoder.
cehoyos
parents:
diff changeset
245 static av_cold int read_specific_config(ALSDecContext *ctx)
9b56cd1e37b7 Add MPEG-4 Audio Lossless Coding (ALS) decoder.
cehoyos
parents:
diff changeset
246 {
9b56cd1e37b7 Add MPEG-4 Audio Lossless Coding (ALS) decoder.
cehoyos
parents:
diff changeset
247 GetBitContext gb;
9b56cd1e37b7 Add MPEG-4 Audio Lossless Coding (ALS) decoder.
cehoyos
parents:
diff changeset
248 uint64_t ht_size;
9b56cd1e37b7 Add MPEG-4 Audio Lossless Coding (ALS) decoder.
cehoyos
parents:
diff changeset
249 int i, config_offset, crc_enabled;
9b56cd1e37b7 Add MPEG-4 Audio Lossless Coding (ALS) decoder.
cehoyos
parents:
diff changeset
250 MPEG4AudioConfig m4ac;
9b56cd1e37b7 Add MPEG-4 Audio Lossless Coding (ALS) decoder.
cehoyos
parents:
diff changeset
251 ALSSpecificConfig *sconf = &ctx->sconf;
9b56cd1e37b7 Add MPEG-4 Audio Lossless Coding (ALS) decoder.
cehoyos
parents:
diff changeset
252 AVCodecContext *avctx = ctx->avctx;
9b56cd1e37b7 Add MPEG-4 Audio Lossless Coding (ALS) decoder.
cehoyos
parents:
diff changeset
253 uint32_t als_id;
9b56cd1e37b7 Add MPEG-4 Audio Lossless Coding (ALS) decoder.
cehoyos
parents:
diff changeset
254
9b56cd1e37b7 Add MPEG-4 Audio Lossless Coding (ALS) decoder.
cehoyos
parents:
diff changeset
255 init_get_bits(&gb, avctx->extradata, avctx->extradata_size * 8);
9b56cd1e37b7 Add MPEG-4 Audio Lossless Coding (ALS) decoder.
cehoyos
parents:
diff changeset
256
9b56cd1e37b7 Add MPEG-4 Audio Lossless Coding (ALS) decoder.
cehoyos
parents:
diff changeset
257 config_offset = ff_mpeg4audio_get_config(&m4ac, avctx->extradata,
9b56cd1e37b7 Add MPEG-4 Audio Lossless Coding (ALS) decoder.
cehoyos
parents:
diff changeset
258 avctx->extradata_size);
9b56cd1e37b7 Add MPEG-4 Audio Lossless Coding (ALS) decoder.
cehoyos
parents:
diff changeset
259
9b56cd1e37b7 Add MPEG-4 Audio Lossless Coding (ALS) decoder.
cehoyos
parents:
diff changeset
260 if (config_offset < 0)
9b56cd1e37b7 Add MPEG-4 Audio Lossless Coding (ALS) decoder.
cehoyos
parents:
diff changeset
261 return -1;
9b56cd1e37b7 Add MPEG-4 Audio Lossless Coding (ALS) decoder.
cehoyos
parents:
diff changeset
262
9b56cd1e37b7 Add MPEG-4 Audio Lossless Coding (ALS) decoder.
cehoyos
parents:
diff changeset
263 skip_bits_long(&gb, config_offset);
9b56cd1e37b7 Add MPEG-4 Audio Lossless Coding (ALS) decoder.
cehoyos
parents:
diff changeset
264
9b56cd1e37b7 Add MPEG-4 Audio Lossless Coding (ALS) decoder.
cehoyos
parents:
diff changeset
265 if (get_bits_left(&gb) < (30 << 3))
9b56cd1e37b7 Add MPEG-4 Audio Lossless Coding (ALS) decoder.
cehoyos
parents:
diff changeset
266 return -1;
9b56cd1e37b7 Add MPEG-4 Audio Lossless Coding (ALS) decoder.
cehoyos
parents:
diff changeset
267
9b56cd1e37b7 Add MPEG-4 Audio Lossless Coding (ALS) decoder.
cehoyos
parents:
diff changeset
268 // read the fixed items
9b56cd1e37b7 Add MPEG-4 Audio Lossless Coding (ALS) decoder.
cehoyos
parents:
diff changeset
269 als_id = get_bits_long(&gb, 32);
9b56cd1e37b7 Add MPEG-4 Audio Lossless Coding (ALS) decoder.
cehoyos
parents:
diff changeset
270 avctx->sample_rate = m4ac.sample_rate;
9b56cd1e37b7 Add MPEG-4 Audio Lossless Coding (ALS) decoder.
cehoyos
parents:
diff changeset
271 skip_bits_long(&gb, 32); // sample rate already known
9b56cd1e37b7 Add MPEG-4 Audio Lossless Coding (ALS) decoder.
cehoyos
parents:
diff changeset
272 sconf->samples = get_bits_long(&gb, 32);
9b56cd1e37b7 Add MPEG-4 Audio Lossless Coding (ALS) decoder.
cehoyos
parents:
diff changeset
273 avctx->channels = m4ac.channels;
9b56cd1e37b7 Add MPEG-4 Audio Lossless Coding (ALS) decoder.
cehoyos
parents:
diff changeset
274 skip_bits(&gb, 16); // number of channels already knwon
9b56cd1e37b7 Add MPEG-4 Audio Lossless Coding (ALS) decoder.
cehoyos
parents:
diff changeset
275 skip_bits(&gb, 3); // skip file_type
9b56cd1e37b7 Add MPEG-4 Audio Lossless Coding (ALS) decoder.
cehoyos
parents:
diff changeset
276 sconf->resolution = get_bits(&gb, 3);
9b56cd1e37b7 Add MPEG-4 Audio Lossless Coding (ALS) decoder.
cehoyos
parents:
diff changeset
277 sconf->floating = get_bits1(&gb);
9b56cd1e37b7 Add MPEG-4 Audio Lossless Coding (ALS) decoder.
cehoyos
parents:
diff changeset
278 skip_bits1(&gb); // skip msb_first
9b56cd1e37b7 Add MPEG-4 Audio Lossless Coding (ALS) decoder.
cehoyos
parents:
diff changeset
279 sconf->frame_length = get_bits(&gb, 16) + 1;
9b56cd1e37b7 Add MPEG-4 Audio Lossless Coding (ALS) decoder.
cehoyos
parents:
diff changeset
280 sconf->ra_distance = get_bits(&gb, 8);
9b56cd1e37b7 Add MPEG-4 Audio Lossless Coding (ALS) decoder.
cehoyos
parents:
diff changeset
281 sconf->ra_flag = get_bits(&gb, 2);
9b56cd1e37b7 Add MPEG-4 Audio Lossless Coding (ALS) decoder.
cehoyos
parents:
diff changeset
282 sconf->adapt_order = get_bits1(&gb);
9b56cd1e37b7 Add MPEG-4 Audio Lossless Coding (ALS) decoder.
cehoyos
parents:
diff changeset
283 sconf->coef_table = get_bits(&gb, 2);
9b56cd1e37b7 Add MPEG-4 Audio Lossless Coding (ALS) decoder.
cehoyos
parents:
diff changeset
284 sconf->long_term_prediction = get_bits1(&gb);
9b56cd1e37b7 Add MPEG-4 Audio Lossless Coding (ALS) decoder.
cehoyos
parents:
diff changeset
285 sconf->max_order = get_bits(&gb, 10);
9b56cd1e37b7 Add MPEG-4 Audio Lossless Coding (ALS) decoder.
cehoyos
parents:
diff changeset
286 sconf->block_switching = get_bits(&gb, 2);
9b56cd1e37b7 Add MPEG-4 Audio Lossless Coding (ALS) decoder.
cehoyos
parents:
diff changeset
287 sconf->bgmc = get_bits1(&gb);
9b56cd1e37b7 Add MPEG-4 Audio Lossless Coding (ALS) decoder.
cehoyos
parents:
diff changeset
288 sconf->sb_part = get_bits1(&gb);
9b56cd1e37b7 Add MPEG-4 Audio Lossless Coding (ALS) decoder.
cehoyos
parents:
diff changeset
289 sconf->joint_stereo = get_bits1(&gb);
9b56cd1e37b7 Add MPEG-4 Audio Lossless Coding (ALS) decoder.
cehoyos
parents:
diff changeset
290 sconf->mc_coding = get_bits1(&gb);
9b56cd1e37b7 Add MPEG-4 Audio Lossless Coding (ALS) decoder.
cehoyos
parents:
diff changeset
291 sconf->chan_config = get_bits1(&gb);
9b56cd1e37b7 Add MPEG-4 Audio Lossless Coding (ALS) decoder.
cehoyos
parents:
diff changeset
292 sconf->chan_sort = get_bits1(&gb);
9b56cd1e37b7 Add MPEG-4 Audio Lossless Coding (ALS) decoder.
cehoyos
parents:
diff changeset
293 crc_enabled = get_bits1(&gb);
9b56cd1e37b7 Add MPEG-4 Audio Lossless Coding (ALS) decoder.
cehoyos
parents:
diff changeset
294 sconf->rlslms = get_bits1(&gb);
9b56cd1e37b7 Add MPEG-4 Audio Lossless Coding (ALS) decoder.
cehoyos
parents:
diff changeset
295 skip_bits(&gb, 5); // skip 5 reserved bits
9b56cd1e37b7 Add MPEG-4 Audio Lossless Coding (ALS) decoder.
cehoyos
parents:
diff changeset
296 skip_bits1(&gb); // skip aux_data_enabled
9b56cd1e37b7 Add MPEG-4 Audio Lossless Coding (ALS) decoder.
cehoyos
parents:
diff changeset
297
9b56cd1e37b7 Add MPEG-4 Audio Lossless Coding (ALS) decoder.
cehoyos
parents:
diff changeset
298
9b56cd1e37b7 Add MPEG-4 Audio Lossless Coding (ALS) decoder.
cehoyos
parents:
diff changeset
299 // check for ALSSpecificConfig struct
9b56cd1e37b7 Add MPEG-4 Audio Lossless Coding (ALS) decoder.
cehoyos
parents:
diff changeset
300 if (als_id != MKBETAG('A','L','S','\0'))
9b56cd1e37b7 Add MPEG-4 Audio Lossless Coding (ALS) decoder.
cehoyos
parents:
diff changeset
301 return -1;
9b56cd1e37b7 Add MPEG-4 Audio Lossless Coding (ALS) decoder.
cehoyos
parents:
diff changeset
302
9b56cd1e37b7 Add MPEG-4 Audio Lossless Coding (ALS) decoder.
cehoyos
parents:
diff changeset
303 ctx->cur_frame_length = sconf->frame_length;
9b56cd1e37b7 Add MPEG-4 Audio Lossless Coding (ALS) decoder.
cehoyos
parents:
diff changeset
304
9b56cd1e37b7 Add MPEG-4 Audio Lossless Coding (ALS) decoder.
cehoyos
parents:
diff changeset
305 // read channel config
9b56cd1e37b7 Add MPEG-4 Audio Lossless Coding (ALS) decoder.
cehoyos
parents:
diff changeset
306 if (sconf->chan_config)
9b56cd1e37b7 Add MPEG-4 Audio Lossless Coding (ALS) decoder.
cehoyos
parents:
diff changeset
307 sconf->chan_config_info = get_bits(&gb, 16);
9b56cd1e37b7 Add MPEG-4 Audio Lossless Coding (ALS) decoder.
cehoyos
parents:
diff changeset
308 // TODO: use this to set avctx->channel_layout
9b56cd1e37b7 Add MPEG-4 Audio Lossless Coding (ALS) decoder.
cehoyos
parents:
diff changeset
309
9b56cd1e37b7 Add MPEG-4 Audio Lossless Coding (ALS) decoder.
cehoyos
parents:
diff changeset
310
9b56cd1e37b7 Add MPEG-4 Audio Lossless Coding (ALS) decoder.
cehoyos
parents:
diff changeset
311 // read channel sorting
9b56cd1e37b7 Add MPEG-4 Audio Lossless Coding (ALS) decoder.
cehoyos
parents:
diff changeset
312 if (sconf->chan_sort && avctx->channels > 1) {
9b56cd1e37b7 Add MPEG-4 Audio Lossless Coding (ALS) decoder.
cehoyos
parents:
diff changeset
313 int chan_pos_bits = av_ceil_log2(avctx->channels);
9b56cd1e37b7 Add MPEG-4 Audio Lossless Coding (ALS) decoder.
cehoyos
parents:
diff changeset
314 int bits_needed = avctx->channels * chan_pos_bits + 7;
9b56cd1e37b7 Add MPEG-4 Audio Lossless Coding (ALS) decoder.
cehoyos
parents:
diff changeset
315 if (get_bits_left(&gb) < bits_needed)
9b56cd1e37b7 Add MPEG-4 Audio Lossless Coding (ALS) decoder.
cehoyos
parents:
diff changeset
316 return -1;
9b56cd1e37b7 Add MPEG-4 Audio Lossless Coding (ALS) decoder.
cehoyos
parents:
diff changeset
317
9b56cd1e37b7 Add MPEG-4 Audio Lossless Coding (ALS) decoder.
cehoyos
parents:
diff changeset
318 if (!(sconf->chan_pos = av_malloc(avctx->channels * sizeof(*sconf->chan_pos))))
9b56cd1e37b7 Add MPEG-4 Audio Lossless Coding (ALS) decoder.
cehoyos
parents:
diff changeset
319 return AVERROR(ENOMEM);
9b56cd1e37b7 Add MPEG-4 Audio Lossless Coding (ALS) decoder.
cehoyos
parents:
diff changeset
320
9b56cd1e37b7 Add MPEG-4 Audio Lossless Coding (ALS) decoder.
cehoyos
parents:
diff changeset
321 for (i = 0; i < avctx->channels; i++)
9b56cd1e37b7 Add MPEG-4 Audio Lossless Coding (ALS) decoder.
cehoyos
parents:
diff changeset
322 sconf->chan_pos[i] = get_bits(&gb, chan_pos_bits);
9b56cd1e37b7 Add MPEG-4 Audio Lossless Coding (ALS) decoder.
cehoyos
parents:
diff changeset
323
9b56cd1e37b7 Add MPEG-4 Audio Lossless Coding (ALS) decoder.
cehoyos
parents:
diff changeset
324 align_get_bits(&gb);
9b56cd1e37b7 Add MPEG-4 Audio Lossless Coding (ALS) decoder.
cehoyos
parents:
diff changeset
325 // TODO: use this to actually do channel sorting
9b56cd1e37b7 Add MPEG-4 Audio Lossless Coding (ALS) decoder.
cehoyos
parents:
diff changeset
326 } else {
9b56cd1e37b7 Add MPEG-4 Audio Lossless Coding (ALS) decoder.
cehoyos
parents:
diff changeset
327 sconf->chan_sort = 0;
9b56cd1e37b7 Add MPEG-4 Audio Lossless Coding (ALS) decoder.
cehoyos
parents:
diff changeset
328 }
9b56cd1e37b7 Add MPEG-4 Audio Lossless Coding (ALS) decoder.
cehoyos
parents:
diff changeset
329
9b56cd1e37b7 Add MPEG-4 Audio Lossless Coding (ALS) decoder.
cehoyos
parents:
diff changeset
330
9b56cd1e37b7 Add MPEG-4 Audio Lossless Coding (ALS) decoder.
cehoyos
parents:
diff changeset
331 // read fixed header and trailer sizes,
9b56cd1e37b7 Add MPEG-4 Audio Lossless Coding (ALS) decoder.
cehoyos
parents:
diff changeset
332 // if size = 0xFFFFFFFF then there is no data field!
9b56cd1e37b7 Add MPEG-4 Audio Lossless Coding (ALS) decoder.
cehoyos
parents:
diff changeset
333 if (get_bits_left(&gb) < 64)
9b56cd1e37b7 Add MPEG-4 Audio Lossless Coding (ALS) decoder.
cehoyos
parents:
diff changeset
334 return -1;
9b56cd1e37b7 Add MPEG-4 Audio Lossless Coding (ALS) decoder.
cehoyos
parents:
diff changeset
335
9b56cd1e37b7 Add MPEG-4 Audio Lossless Coding (ALS) decoder.
cehoyos
parents:
diff changeset
336 sconf->header_size = get_bits_long(&gb, 32);
9b56cd1e37b7 Add MPEG-4 Audio Lossless Coding (ALS) decoder.
cehoyos
parents:
diff changeset
337 sconf->trailer_size = get_bits_long(&gb, 32);
9b56cd1e37b7 Add MPEG-4 Audio Lossless Coding (ALS) decoder.
cehoyos
parents:
diff changeset
338 if (sconf->header_size == 0xFFFFFFFF)
9b56cd1e37b7 Add MPEG-4 Audio Lossless Coding (ALS) decoder.
cehoyos
parents:
diff changeset
339 sconf->header_size = 0;
9b56cd1e37b7 Add MPEG-4 Audio Lossless Coding (ALS) decoder.
cehoyos
parents:
diff changeset
340 if (sconf->trailer_size == 0xFFFFFFFF)
9b56cd1e37b7 Add MPEG-4 Audio Lossless Coding (ALS) decoder.
cehoyos
parents:
diff changeset
341 sconf->trailer_size = 0;
9b56cd1e37b7 Add MPEG-4 Audio Lossless Coding (ALS) decoder.
cehoyos
parents:
diff changeset
342
9b56cd1e37b7 Add MPEG-4 Audio Lossless Coding (ALS) decoder.
cehoyos
parents:
diff changeset
343 ht_size = ((int64_t)(sconf->header_size) + (int64_t)(sconf->trailer_size)) << 3;
9b56cd1e37b7 Add MPEG-4 Audio Lossless Coding (ALS) decoder.
cehoyos
parents:
diff changeset
344
9b56cd1e37b7 Add MPEG-4 Audio Lossless Coding (ALS) decoder.
cehoyos
parents:
diff changeset
345
9b56cd1e37b7 Add MPEG-4 Audio Lossless Coding (ALS) decoder.
cehoyos
parents:
diff changeset
346 // skip the header and trailer data
9b56cd1e37b7 Add MPEG-4 Audio Lossless Coding (ALS) decoder.
cehoyos
parents:
diff changeset
347 if (get_bits_left(&gb) < ht_size)
9b56cd1e37b7 Add MPEG-4 Audio Lossless Coding (ALS) decoder.
cehoyos
parents:
diff changeset
348 return -1;
9b56cd1e37b7 Add MPEG-4 Audio Lossless Coding (ALS) decoder.
cehoyos
parents:
diff changeset
349
9b56cd1e37b7 Add MPEG-4 Audio Lossless Coding (ALS) decoder.
cehoyos
parents:
diff changeset
350 if (ht_size > INT32_MAX)
9b56cd1e37b7 Add MPEG-4 Audio Lossless Coding (ALS) decoder.
cehoyos
parents:
diff changeset
351 return -1;
9b56cd1e37b7 Add MPEG-4 Audio Lossless Coding (ALS) decoder.
cehoyos
parents:
diff changeset
352
9b56cd1e37b7 Add MPEG-4 Audio Lossless Coding (ALS) decoder.
cehoyos
parents:
diff changeset
353 skip_bits_long(&gb, ht_size);
9b56cd1e37b7 Add MPEG-4 Audio Lossless Coding (ALS) decoder.
cehoyos
parents:
diff changeset
354
9b56cd1e37b7 Add MPEG-4 Audio Lossless Coding (ALS) decoder.
cehoyos
parents:
diff changeset
355
9b56cd1e37b7 Add MPEG-4 Audio Lossless Coding (ALS) decoder.
cehoyos
parents:
diff changeset
356 // skip the crc data
9b56cd1e37b7 Add MPEG-4 Audio Lossless Coding (ALS) decoder.
cehoyos
parents:
diff changeset
357 if (crc_enabled) {
9b56cd1e37b7 Add MPEG-4 Audio Lossless Coding (ALS) decoder.
cehoyos
parents:
diff changeset
358 if (get_bits_left(&gb) < 32)
9b56cd1e37b7 Add MPEG-4 Audio Lossless Coding (ALS) decoder.
cehoyos
parents:
diff changeset
359 return -1;
9b56cd1e37b7 Add MPEG-4 Audio Lossless Coding (ALS) decoder.
cehoyos
parents:
diff changeset
360
9b56cd1e37b7 Add MPEG-4 Audio Lossless Coding (ALS) decoder.
cehoyos
parents:
diff changeset
361 skip_bits_long(&gb, 32);
9b56cd1e37b7 Add MPEG-4 Audio Lossless Coding (ALS) decoder.
cehoyos
parents:
diff changeset
362 }
9b56cd1e37b7 Add MPEG-4 Audio Lossless Coding (ALS) decoder.
cehoyos
parents:
diff changeset
363
9b56cd1e37b7 Add MPEG-4 Audio Lossless Coding (ALS) decoder.
cehoyos
parents:
diff changeset
364
9b56cd1e37b7 Add MPEG-4 Audio Lossless Coding (ALS) decoder.
cehoyos
parents:
diff changeset
365 // no need to read the rest of ALSSpecificConfig (ra_unit_size & aux data)
9b56cd1e37b7 Add MPEG-4 Audio Lossless Coding (ALS) decoder.
cehoyos
parents:
diff changeset
366
9b56cd1e37b7 Add MPEG-4 Audio Lossless Coding (ALS) decoder.
cehoyos
parents:
diff changeset
367 dprint_specific_config(ctx);
9b56cd1e37b7 Add MPEG-4 Audio Lossless Coding (ALS) decoder.
cehoyos
parents:
diff changeset
368
9b56cd1e37b7 Add MPEG-4 Audio Lossless Coding (ALS) decoder.
cehoyos
parents:
diff changeset
369 return 0;
9b56cd1e37b7 Add MPEG-4 Audio Lossless Coding (ALS) decoder.
cehoyos
parents:
diff changeset
370 }
9b56cd1e37b7 Add MPEG-4 Audio Lossless Coding (ALS) decoder.
cehoyos
parents:
diff changeset
371
9b56cd1e37b7 Add MPEG-4 Audio Lossless Coding (ALS) decoder.
cehoyos
parents:
diff changeset
372
9b56cd1e37b7 Add MPEG-4 Audio Lossless Coding (ALS) decoder.
cehoyos
parents:
diff changeset
373 /** Checks the ALSSpecificConfig for unsupported features.
9b56cd1e37b7 Add MPEG-4 Audio Lossless Coding (ALS) decoder.
cehoyos
parents:
diff changeset
374 */
9b56cd1e37b7 Add MPEG-4 Audio Lossless Coding (ALS) decoder.
cehoyos
parents:
diff changeset
375 static int check_specific_config(ALSDecContext *ctx)
9b56cd1e37b7 Add MPEG-4 Audio Lossless Coding (ALS) decoder.
cehoyos
parents:
diff changeset
376 {
9b56cd1e37b7 Add MPEG-4 Audio Lossless Coding (ALS) decoder.
cehoyos
parents:
diff changeset
377 ALSSpecificConfig *sconf = &ctx->sconf;
9b56cd1e37b7 Add MPEG-4 Audio Lossless Coding (ALS) decoder.
cehoyos
parents:
diff changeset
378 int error = 0;
9b56cd1e37b7 Add MPEG-4 Audio Lossless Coding (ALS) decoder.
cehoyos
parents:
diff changeset
379
9b56cd1e37b7 Add MPEG-4 Audio Lossless Coding (ALS) decoder.
cehoyos
parents:
diff changeset
380 // report unsupported feature and set error value
9b56cd1e37b7 Add MPEG-4 Audio Lossless Coding (ALS) decoder.
cehoyos
parents:
diff changeset
381 #define MISSING_ERR(cond, str, errval) \
9b56cd1e37b7 Add MPEG-4 Audio Lossless Coding (ALS) decoder.
cehoyos
parents:
diff changeset
382 { \
9b56cd1e37b7 Add MPEG-4 Audio Lossless Coding (ALS) decoder.
cehoyos
parents:
diff changeset
383 if (cond) { \
9b56cd1e37b7 Add MPEG-4 Audio Lossless Coding (ALS) decoder.
cehoyos
parents:
diff changeset
384 av_log_missing_feature(ctx->avctx, str, 0); \
9b56cd1e37b7 Add MPEG-4 Audio Lossless Coding (ALS) decoder.
cehoyos
parents:
diff changeset
385 error = errval; \
9b56cd1e37b7 Add MPEG-4 Audio Lossless Coding (ALS) decoder.
cehoyos
parents:
diff changeset
386 } \
9b56cd1e37b7 Add MPEG-4 Audio Lossless Coding (ALS) decoder.
cehoyos
parents:
diff changeset
387 }
9b56cd1e37b7 Add MPEG-4 Audio Lossless Coding (ALS) decoder.
cehoyos
parents:
diff changeset
388
9b56cd1e37b7 Add MPEG-4 Audio Lossless Coding (ALS) decoder.
cehoyos
parents:
diff changeset
389 MISSING_ERR(sconf->floating, "Floating point decoding", -1);
9b56cd1e37b7 Add MPEG-4 Audio Lossless Coding (ALS) decoder.
cehoyos
parents:
diff changeset
390 MISSING_ERR(sconf->bgmc, "BGMC entropy decoding", -1);
9b56cd1e37b7 Add MPEG-4 Audio Lossless Coding (ALS) decoder.
cehoyos
parents:
diff changeset
391 MISSING_ERR(sconf->rlslms, "Adaptive RLS-LMS prediction", -1);
9b56cd1e37b7 Add MPEG-4 Audio Lossless Coding (ALS) decoder.
cehoyos
parents:
diff changeset
392 MISSING_ERR(sconf->chan_sort, "Channel sorting", 0);
9b56cd1e37b7 Add MPEG-4 Audio Lossless Coding (ALS) decoder.
cehoyos
parents:
diff changeset
393
9b56cd1e37b7 Add MPEG-4 Audio Lossless Coding (ALS) decoder.
cehoyos
parents:
diff changeset
394 return error;
9b56cd1e37b7 Add MPEG-4 Audio Lossless Coding (ALS) decoder.
cehoyos
parents:
diff changeset
395 }
9b56cd1e37b7 Add MPEG-4 Audio Lossless Coding (ALS) decoder.
cehoyos
parents:
diff changeset
396
9b56cd1e37b7 Add MPEG-4 Audio Lossless Coding (ALS) decoder.
cehoyos
parents:
diff changeset
397
9b56cd1e37b7 Add MPEG-4 Audio Lossless Coding (ALS) decoder.
cehoyos
parents:
diff changeset
398 /** Parses the bs_info field to extract the block partitioning used in
9b56cd1e37b7 Add MPEG-4 Audio Lossless Coding (ALS) decoder.
cehoyos
parents:
diff changeset
399 * block switching mode, refer to ISO/IEC 14496-3, section 11.6.2.
9b56cd1e37b7 Add MPEG-4 Audio Lossless Coding (ALS) decoder.
cehoyos
parents:
diff changeset
400 */
9b56cd1e37b7 Add MPEG-4 Audio Lossless Coding (ALS) decoder.
cehoyos
parents:
diff changeset
401 static void parse_bs_info(const uint32_t bs_info, unsigned int n,
9b56cd1e37b7 Add MPEG-4 Audio Lossless Coding (ALS) decoder.
cehoyos
parents:
diff changeset
402 unsigned int div, unsigned int **div_blocks,
9b56cd1e37b7 Add MPEG-4 Audio Lossless Coding (ALS) decoder.
cehoyos
parents:
diff changeset
403 unsigned int *num_blocks)
9b56cd1e37b7 Add MPEG-4 Audio Lossless Coding (ALS) decoder.
cehoyos
parents:
diff changeset
404 {
9b56cd1e37b7 Add MPEG-4 Audio Lossless Coding (ALS) decoder.
cehoyos
parents:
diff changeset
405 if (n < 31 && ((bs_info << n) & 0x40000000)) {
9b56cd1e37b7 Add MPEG-4 Audio Lossless Coding (ALS) decoder.
cehoyos
parents:
diff changeset
406 // if the level is valid and the investigated bit n is set
9b56cd1e37b7 Add MPEG-4 Audio Lossless Coding (ALS) decoder.
cehoyos
parents:
diff changeset
407 // then recursively check both children at bits (2n+1) and (2n+2)
9b56cd1e37b7 Add MPEG-4 Audio Lossless Coding (ALS) decoder.
cehoyos
parents:
diff changeset
408 n *= 2;
9b56cd1e37b7 Add MPEG-4 Audio Lossless Coding (ALS) decoder.
cehoyos
parents:
diff changeset
409 div += 1;
9b56cd1e37b7 Add MPEG-4 Audio Lossless Coding (ALS) decoder.
cehoyos
parents:
diff changeset
410 parse_bs_info(bs_info, n + 1, div, div_blocks, num_blocks);
9b56cd1e37b7 Add MPEG-4 Audio Lossless Coding (ALS) decoder.
cehoyos
parents:
diff changeset
411 parse_bs_info(bs_info, n + 2, div, div_blocks, num_blocks);
9b56cd1e37b7 Add MPEG-4 Audio Lossless Coding (ALS) decoder.
cehoyos
parents:
diff changeset
412 } else {
9b56cd1e37b7 Add MPEG-4 Audio Lossless Coding (ALS) decoder.
cehoyos
parents:
diff changeset
413 // else the bit is not set or the last level has been reached
9b56cd1e37b7 Add MPEG-4 Audio Lossless Coding (ALS) decoder.
cehoyos
parents:
diff changeset
414 // (bit implicitly not set)
9b56cd1e37b7 Add MPEG-4 Audio Lossless Coding (ALS) decoder.
cehoyos
parents:
diff changeset
415 **div_blocks = div;
9b56cd1e37b7 Add MPEG-4 Audio Lossless Coding (ALS) decoder.
cehoyos
parents:
diff changeset
416 (*div_blocks)++;
9b56cd1e37b7 Add MPEG-4 Audio Lossless Coding (ALS) decoder.
cehoyos
parents:
diff changeset
417 (*num_blocks)++;
9b56cd1e37b7 Add MPEG-4 Audio Lossless Coding (ALS) decoder.
cehoyos
parents:
diff changeset
418 }
9b56cd1e37b7 Add MPEG-4 Audio Lossless Coding (ALS) decoder.
cehoyos
parents:
diff changeset
419 }
9b56cd1e37b7 Add MPEG-4 Audio Lossless Coding (ALS) decoder.
cehoyos
parents:
diff changeset
420
9b56cd1e37b7 Add MPEG-4 Audio Lossless Coding (ALS) decoder.
cehoyos
parents:
diff changeset
421
9b56cd1e37b7 Add MPEG-4 Audio Lossless Coding (ALS) decoder.
cehoyos
parents:
diff changeset
422 /** Reads and decodes a Rice codeword.
9b56cd1e37b7 Add MPEG-4 Audio Lossless Coding (ALS) decoder.
cehoyos
parents:
diff changeset
423 */
9b56cd1e37b7 Add MPEG-4 Audio Lossless Coding (ALS) decoder.
cehoyos
parents:
diff changeset
424 static int32_t decode_rice(GetBitContext *gb, unsigned int k)
9b56cd1e37b7 Add MPEG-4 Audio Lossless Coding (ALS) decoder.
cehoyos
parents:
diff changeset
425 {
10535
95f3daa991a2 Use get_bits_left() instead of size_in_bits - get_bits_count().
rbultje
parents: 10531
diff changeset
426 int max = get_bits_left(gb) - k;
10522
9b56cd1e37b7 Add MPEG-4 Audio Lossless Coding (ALS) decoder.
cehoyos
parents:
diff changeset
427 int q = get_unary(gb, 0, max);
9b56cd1e37b7 Add MPEG-4 Audio Lossless Coding (ALS) decoder.
cehoyos
parents:
diff changeset
428 int r = k ? get_bits1(gb) : !(q & 1);
9b56cd1e37b7 Add MPEG-4 Audio Lossless Coding (ALS) decoder.
cehoyos
parents:
diff changeset
429
9b56cd1e37b7 Add MPEG-4 Audio Lossless Coding (ALS) decoder.
cehoyos
parents:
diff changeset
430 if (k > 1) {
9b56cd1e37b7 Add MPEG-4 Audio Lossless Coding (ALS) decoder.
cehoyos
parents:
diff changeset
431 q <<= (k - 1);
9b56cd1e37b7 Add MPEG-4 Audio Lossless Coding (ALS) decoder.
cehoyos
parents:
diff changeset
432 q += get_bits_long(gb, k - 1);
9b56cd1e37b7 Add MPEG-4 Audio Lossless Coding (ALS) decoder.
cehoyos
parents:
diff changeset
433 } else if (!k) {
9b56cd1e37b7 Add MPEG-4 Audio Lossless Coding (ALS) decoder.
cehoyos
parents:
diff changeset
434 q >>= 1;
9b56cd1e37b7 Add MPEG-4 Audio Lossless Coding (ALS) decoder.
cehoyos
parents:
diff changeset
435 }
9b56cd1e37b7 Add MPEG-4 Audio Lossless Coding (ALS) decoder.
cehoyos
parents:
diff changeset
436 return r ? q : ~q;
9b56cd1e37b7 Add MPEG-4 Audio Lossless Coding (ALS) decoder.
cehoyos
parents:
diff changeset
437 }
9b56cd1e37b7 Add MPEG-4 Audio Lossless Coding (ALS) decoder.
cehoyos
parents:
diff changeset
438
9b56cd1e37b7 Add MPEG-4 Audio Lossless Coding (ALS) decoder.
cehoyos
parents:
diff changeset
439
9b56cd1e37b7 Add MPEG-4 Audio Lossless Coding (ALS) decoder.
cehoyos
parents:
diff changeset
440 /** Converts PARCOR coefficient k to direct filter coefficient.
9b56cd1e37b7 Add MPEG-4 Audio Lossless Coding (ALS) decoder.
cehoyos
parents:
diff changeset
441 */
9b56cd1e37b7 Add MPEG-4 Audio Lossless Coding (ALS) decoder.
cehoyos
parents:
diff changeset
442 static void parcor_to_lpc(unsigned int k, const int32_t *par, int32_t *cof)
9b56cd1e37b7 Add MPEG-4 Audio Lossless Coding (ALS) decoder.
cehoyos
parents:
diff changeset
443 {
9b56cd1e37b7 Add MPEG-4 Audio Lossless Coding (ALS) decoder.
cehoyos
parents:
diff changeset
444 int i, j;
9b56cd1e37b7 Add MPEG-4 Audio Lossless Coding (ALS) decoder.
cehoyos
parents:
diff changeset
445
9b56cd1e37b7 Add MPEG-4 Audio Lossless Coding (ALS) decoder.
cehoyos
parents:
diff changeset
446 for (i = 0, j = k - 1; i < j; i++, j--) {
9b56cd1e37b7 Add MPEG-4 Audio Lossless Coding (ALS) decoder.
cehoyos
parents:
diff changeset
447 int tmp1 = ((MUL64(par[k], cof[j]) + (1 << 19)) >> 20);
9b56cd1e37b7 Add MPEG-4 Audio Lossless Coding (ALS) decoder.
cehoyos
parents:
diff changeset
448 cof[j] += ((MUL64(par[k], cof[i]) + (1 << 19)) >> 20);
9b56cd1e37b7 Add MPEG-4 Audio Lossless Coding (ALS) decoder.
cehoyos
parents:
diff changeset
449 cof[i] += tmp1;
9b56cd1e37b7 Add MPEG-4 Audio Lossless Coding (ALS) decoder.
cehoyos
parents:
diff changeset
450 }
9b56cd1e37b7 Add MPEG-4 Audio Lossless Coding (ALS) decoder.
cehoyos
parents:
diff changeset
451 if (i == j)
9b56cd1e37b7 Add MPEG-4 Audio Lossless Coding (ALS) decoder.
cehoyos
parents:
diff changeset
452 cof[i] += ((MUL64(par[k], cof[j]) + (1 << 19)) >> 20);
9b56cd1e37b7 Add MPEG-4 Audio Lossless Coding (ALS) decoder.
cehoyos
parents:
diff changeset
453
9b56cd1e37b7 Add MPEG-4 Audio Lossless Coding (ALS) decoder.
cehoyos
parents:
diff changeset
454 cof[k] = par[k];
9b56cd1e37b7 Add MPEG-4 Audio Lossless Coding (ALS) decoder.
cehoyos
parents:
diff changeset
455 }
9b56cd1e37b7 Add MPEG-4 Audio Lossless Coding (ALS) decoder.
cehoyos
parents:
diff changeset
456
9b56cd1e37b7 Add MPEG-4 Audio Lossless Coding (ALS) decoder.
cehoyos
parents:
diff changeset
457
9b56cd1e37b7 Add MPEG-4 Audio Lossless Coding (ALS) decoder.
cehoyos
parents:
diff changeset
458 /** Reads block switching field if necessary and sets actual block sizes.
9b56cd1e37b7 Add MPEG-4 Audio Lossless Coding (ALS) decoder.
cehoyos
parents:
diff changeset
459 * Also assures that the block sizes of the last frame correspond to the
9b56cd1e37b7 Add MPEG-4 Audio Lossless Coding (ALS) decoder.
cehoyos
parents:
diff changeset
460 * actual number of samples.
9b56cd1e37b7 Add MPEG-4 Audio Lossless Coding (ALS) decoder.
cehoyos
parents:
diff changeset
461 */
9b56cd1e37b7 Add MPEG-4 Audio Lossless Coding (ALS) decoder.
cehoyos
parents:
diff changeset
462 static void get_block_sizes(ALSDecContext *ctx, unsigned int *div_blocks,
9b56cd1e37b7 Add MPEG-4 Audio Lossless Coding (ALS) decoder.
cehoyos
parents:
diff changeset
463 uint32_t *bs_info)
9b56cd1e37b7 Add MPEG-4 Audio Lossless Coding (ALS) decoder.
cehoyos
parents:
diff changeset
464 {
9b56cd1e37b7 Add MPEG-4 Audio Lossless Coding (ALS) decoder.
cehoyos
parents:
diff changeset
465 ALSSpecificConfig *sconf = &ctx->sconf;
9b56cd1e37b7 Add MPEG-4 Audio Lossless Coding (ALS) decoder.
cehoyos
parents:
diff changeset
466 GetBitContext *gb = &ctx->gb;
9b56cd1e37b7 Add MPEG-4 Audio Lossless Coding (ALS) decoder.
cehoyos
parents:
diff changeset
467 unsigned int *ptr_div_blocks = div_blocks;
9b56cd1e37b7 Add MPEG-4 Audio Lossless Coding (ALS) decoder.
cehoyos
parents:
diff changeset
468 unsigned int b;
9b56cd1e37b7 Add MPEG-4 Audio Lossless Coding (ALS) decoder.
cehoyos
parents:
diff changeset
469
9b56cd1e37b7 Add MPEG-4 Audio Lossless Coding (ALS) decoder.
cehoyos
parents:
diff changeset
470 if (sconf->block_switching) {
9b56cd1e37b7 Add MPEG-4 Audio Lossless Coding (ALS) decoder.
cehoyos
parents:
diff changeset
471 unsigned int bs_info_len = 1 << (sconf->block_switching + 2);
9b56cd1e37b7 Add MPEG-4 Audio Lossless Coding (ALS) decoder.
cehoyos
parents:
diff changeset
472 *bs_info = get_bits_long(gb, bs_info_len);
9b56cd1e37b7 Add MPEG-4 Audio Lossless Coding (ALS) decoder.
cehoyos
parents:
diff changeset
473 *bs_info <<= (32 - bs_info_len);
9b56cd1e37b7 Add MPEG-4 Audio Lossless Coding (ALS) decoder.
cehoyos
parents:
diff changeset
474 }
9b56cd1e37b7 Add MPEG-4 Audio Lossless Coding (ALS) decoder.
cehoyos
parents:
diff changeset
475
9b56cd1e37b7 Add MPEG-4 Audio Lossless Coding (ALS) decoder.
cehoyos
parents:
diff changeset
476 ctx->num_blocks = 0;
9b56cd1e37b7 Add MPEG-4 Audio Lossless Coding (ALS) decoder.
cehoyos
parents:
diff changeset
477 parse_bs_info(*bs_info, 0, 0, &ptr_div_blocks, &ctx->num_blocks);
9b56cd1e37b7 Add MPEG-4 Audio Lossless Coding (ALS) decoder.
cehoyos
parents:
diff changeset
478
9b56cd1e37b7 Add MPEG-4 Audio Lossless Coding (ALS) decoder.
cehoyos
parents:
diff changeset
479 // The last frame may have an overdetermined block structure given in
9b56cd1e37b7 Add MPEG-4 Audio Lossless Coding (ALS) decoder.
cehoyos
parents:
diff changeset
480 // the bitstream. In that case the defined block structure would need
9b56cd1e37b7 Add MPEG-4 Audio Lossless Coding (ALS) decoder.
cehoyos
parents:
diff changeset
481 // more samples than available to be consistent.
9b56cd1e37b7 Add MPEG-4 Audio Lossless Coding (ALS) decoder.
cehoyos
parents:
diff changeset
482 // The block structure is actually used but the block sizes are adapted
9b56cd1e37b7 Add MPEG-4 Audio Lossless Coding (ALS) decoder.
cehoyos
parents:
diff changeset
483 // to fit the actual number of available samples.
9b56cd1e37b7 Add MPEG-4 Audio Lossless Coding (ALS) decoder.
cehoyos
parents:
diff changeset
484 // Example: 5 samples, 2nd level block sizes: 2 2 2 2.
9b56cd1e37b7 Add MPEG-4 Audio Lossless Coding (ALS) decoder.
cehoyos
parents:
diff changeset
485 // This results in the actual block sizes: 2 2 1 0.
9b56cd1e37b7 Add MPEG-4 Audio Lossless Coding (ALS) decoder.
cehoyos
parents:
diff changeset
486 // This is not specified in 14496-3 but actually done by the reference
9b56cd1e37b7 Add MPEG-4 Audio Lossless Coding (ALS) decoder.
cehoyos
parents:
diff changeset
487 // codec RM22 revision 2.
9b56cd1e37b7 Add MPEG-4 Audio Lossless Coding (ALS) decoder.
cehoyos
parents:
diff changeset
488 // This appears to happen in case of an odd number of samples in the last
9b56cd1e37b7 Add MPEG-4 Audio Lossless Coding (ALS) decoder.
cehoyos
parents:
diff changeset
489 // frame which is actually not allowed by the block length switching part
9b56cd1e37b7 Add MPEG-4 Audio Lossless Coding (ALS) decoder.
cehoyos
parents:
diff changeset
490 // of 14496-3.
9b56cd1e37b7 Add MPEG-4 Audio Lossless Coding (ALS) decoder.
cehoyos
parents:
diff changeset
491 // The ALS conformance files feature an odd number of samples in the last
9b56cd1e37b7 Add MPEG-4 Audio Lossless Coding (ALS) decoder.
cehoyos
parents:
diff changeset
492 // frame.
9b56cd1e37b7 Add MPEG-4 Audio Lossless Coding (ALS) decoder.
cehoyos
parents:
diff changeset
493
9b56cd1e37b7 Add MPEG-4 Audio Lossless Coding (ALS) decoder.
cehoyos
parents:
diff changeset
494 for (b = 0; b < ctx->num_blocks; b++)
9b56cd1e37b7 Add MPEG-4 Audio Lossless Coding (ALS) decoder.
cehoyos
parents:
diff changeset
495 div_blocks[b] = ctx->sconf.frame_length >> div_blocks[b];
9b56cd1e37b7 Add MPEG-4 Audio Lossless Coding (ALS) decoder.
cehoyos
parents:
diff changeset
496
9b56cd1e37b7 Add MPEG-4 Audio Lossless Coding (ALS) decoder.
cehoyos
parents:
diff changeset
497 if (ctx->cur_frame_length != ctx->sconf.frame_length) {
9b56cd1e37b7 Add MPEG-4 Audio Lossless Coding (ALS) decoder.
cehoyos
parents:
diff changeset
498 unsigned int remaining = ctx->cur_frame_length;
9b56cd1e37b7 Add MPEG-4 Audio Lossless Coding (ALS) decoder.
cehoyos
parents:
diff changeset
499
9b56cd1e37b7 Add MPEG-4 Audio Lossless Coding (ALS) decoder.
cehoyos
parents:
diff changeset
500 for (b = 0; b < ctx->num_blocks; b++) {
9b56cd1e37b7 Add MPEG-4 Audio Lossless Coding (ALS) decoder.
cehoyos
parents:
diff changeset
501 if (remaining < div_blocks[b]) {
9b56cd1e37b7 Add MPEG-4 Audio Lossless Coding (ALS) decoder.
cehoyos
parents:
diff changeset
502 div_blocks[b] = remaining;
9b56cd1e37b7 Add MPEG-4 Audio Lossless Coding (ALS) decoder.
cehoyos
parents:
diff changeset
503 ctx->num_blocks = b + 1;
9b56cd1e37b7 Add MPEG-4 Audio Lossless Coding (ALS) decoder.
cehoyos
parents:
diff changeset
504 break;
9b56cd1e37b7 Add MPEG-4 Audio Lossless Coding (ALS) decoder.
cehoyos
parents:
diff changeset
505 }
9b56cd1e37b7 Add MPEG-4 Audio Lossless Coding (ALS) decoder.
cehoyos
parents:
diff changeset
506
9b56cd1e37b7 Add MPEG-4 Audio Lossless Coding (ALS) decoder.
cehoyos
parents:
diff changeset
507 remaining -= div_blocks[b];
9b56cd1e37b7 Add MPEG-4 Audio Lossless Coding (ALS) decoder.
cehoyos
parents:
diff changeset
508 }
9b56cd1e37b7 Add MPEG-4 Audio Lossless Coding (ALS) decoder.
cehoyos
parents:
diff changeset
509 }
9b56cd1e37b7 Add MPEG-4 Audio Lossless Coding (ALS) decoder.
cehoyos
parents:
diff changeset
510 }
9b56cd1e37b7 Add MPEG-4 Audio Lossless Coding (ALS) decoder.
cehoyos
parents:
diff changeset
511
9b56cd1e37b7 Add MPEG-4 Audio Lossless Coding (ALS) decoder.
cehoyos
parents:
diff changeset
512
9b56cd1e37b7 Add MPEG-4 Audio Lossless Coding (ALS) decoder.
cehoyos
parents:
diff changeset
513 /** Reads the block data for a constant block
9b56cd1e37b7 Add MPEG-4 Audio Lossless Coding (ALS) decoder.
cehoyos
parents:
diff changeset
514 */
10681
997692df50c1 Read and decode block data in separate functions to prepare support for
thilo.borgmann
parents: 10535
diff changeset
515 static void read_const_block_data(ALSDecContext *ctx, ALSBlockData *bd)
10522
9b56cd1e37b7 Add MPEG-4 Audio Lossless Coding (ALS) decoder.
cehoyos
parents:
diff changeset
516 {
9b56cd1e37b7 Add MPEG-4 Audio Lossless Coding (ALS) decoder.
cehoyos
parents:
diff changeset
517 ALSSpecificConfig *sconf = &ctx->sconf;
9b56cd1e37b7 Add MPEG-4 Audio Lossless Coding (ALS) decoder.
cehoyos
parents:
diff changeset
518 AVCodecContext *avctx = ctx->avctx;
9b56cd1e37b7 Add MPEG-4 Audio Lossless Coding (ALS) decoder.
cehoyos
parents:
diff changeset
519 GetBitContext *gb = &ctx->gb;
9b56cd1e37b7 Add MPEG-4 Audio Lossless Coding (ALS) decoder.
cehoyos
parents:
diff changeset
520
10681
997692df50c1 Read and decode block data in separate functions to prepare support for
thilo.borgmann
parents: 10535
diff changeset
521 bd->const_val = 0;
997692df50c1 Read and decode block data in separate functions to prepare support for
thilo.borgmann
parents: 10535
diff changeset
522 bd->const_block = get_bits1(gb); // 1 = constant value, 0 = zero block (silence)
997692df50c1 Read and decode block data in separate functions to prepare support for
thilo.borgmann
parents: 10535
diff changeset
523 bd->js_blocks = get_bits1(gb);
10522
9b56cd1e37b7 Add MPEG-4 Audio Lossless Coding (ALS) decoder.
cehoyos
parents:
diff changeset
524
9b56cd1e37b7 Add MPEG-4 Audio Lossless Coding (ALS) decoder.
cehoyos
parents:
diff changeset
525 // skip 5 reserved bits
9b56cd1e37b7 Add MPEG-4 Audio Lossless Coding (ALS) decoder.
cehoyos
parents:
diff changeset
526 skip_bits(gb, 5);
9b56cd1e37b7 Add MPEG-4 Audio Lossless Coding (ALS) decoder.
cehoyos
parents:
diff changeset
527
10681
997692df50c1 Read and decode block data in separate functions to prepare support for
thilo.borgmann
parents: 10535
diff changeset
528 if (bd->const_block) {
10522
9b56cd1e37b7 Add MPEG-4 Audio Lossless Coding (ALS) decoder.
cehoyos
parents:
diff changeset
529 unsigned int const_val_bits = sconf->floating ? 24 : avctx->bits_per_raw_sample;
10681
997692df50c1 Read and decode block data in separate functions to prepare support for
thilo.borgmann
parents: 10535
diff changeset
530 bd->const_val = get_sbits_long(gb, const_val_bits);
10522
9b56cd1e37b7 Add MPEG-4 Audio Lossless Coding (ALS) decoder.
cehoyos
parents:
diff changeset
531 }
9b56cd1e37b7 Add MPEG-4 Audio Lossless Coding (ALS) decoder.
cehoyos
parents:
diff changeset
532
10681
997692df50c1 Read and decode block data in separate functions to prepare support for
thilo.borgmann
parents: 10535
diff changeset
533 // ensure constant block decoding by reusing this field
997692df50c1 Read and decode block data in separate functions to prepare support for
thilo.borgmann
parents: 10535
diff changeset
534 bd->const_block = 1;
997692df50c1 Read and decode block data in separate functions to prepare support for
thilo.borgmann
parents: 10535
diff changeset
535 }
997692df50c1 Read and decode block data in separate functions to prepare support for
thilo.borgmann
parents: 10535
diff changeset
536
997692df50c1 Read and decode block data in separate functions to prepare support for
thilo.borgmann
parents: 10535
diff changeset
537
997692df50c1 Read and decode block data in separate functions to prepare support for
thilo.borgmann
parents: 10535
diff changeset
538 /** Decodes the block data for a constant block
997692df50c1 Read and decode block data in separate functions to prepare support for
thilo.borgmann
parents: 10535
diff changeset
539 */
997692df50c1 Read and decode block data in separate functions to prepare support for
thilo.borgmann
parents: 10535
diff changeset
540 static void decode_const_block_data(ALSDecContext *ctx, ALSBlockData *bd)
997692df50c1 Read and decode block data in separate functions to prepare support for
thilo.borgmann
parents: 10535
diff changeset
541 {
997692df50c1 Read and decode block data in separate functions to prepare support for
thilo.borgmann
parents: 10535
diff changeset
542 int smp = bd->block_length;
997692df50c1 Read and decode block data in separate functions to prepare support for
thilo.borgmann
parents: 10535
diff changeset
543 int32_t val = bd->const_val;
997692df50c1 Read and decode block data in separate functions to prepare support for
thilo.borgmann
parents: 10535
diff changeset
544 int32_t *dst = bd->raw_samples;
997692df50c1 Read and decode block data in separate functions to prepare support for
thilo.borgmann
parents: 10535
diff changeset
545
10522
9b56cd1e37b7 Add MPEG-4 Audio Lossless Coding (ALS) decoder.
cehoyos
parents:
diff changeset
546 // write raw samples into buffer
10681
997692df50c1 Read and decode block data in separate functions to prepare support for
thilo.borgmann
parents: 10535
diff changeset
547 for (; smp; smp--)
997692df50c1 Read and decode block data in separate functions to prepare support for
thilo.borgmann
parents: 10535
diff changeset
548 *dst++ = val;
10522
9b56cd1e37b7 Add MPEG-4 Audio Lossless Coding (ALS) decoder.
cehoyos
parents:
diff changeset
549 }
9b56cd1e37b7 Add MPEG-4 Audio Lossless Coding (ALS) decoder.
cehoyos
parents:
diff changeset
550
9b56cd1e37b7 Add MPEG-4 Audio Lossless Coding (ALS) decoder.
cehoyos
parents:
diff changeset
551
9b56cd1e37b7 Add MPEG-4 Audio Lossless Coding (ALS) decoder.
cehoyos
parents:
diff changeset
552 /** Reads the block data for a non-constant block
9b56cd1e37b7 Add MPEG-4 Audio Lossless Coding (ALS) decoder.
cehoyos
parents:
diff changeset
553 */
10681
997692df50c1 Read and decode block data in separate functions to prepare support for
thilo.borgmann
parents: 10535
diff changeset
554 static int read_var_block_data(ALSDecContext *ctx, ALSBlockData *bd)
10522
9b56cd1e37b7 Add MPEG-4 Audio Lossless Coding (ALS) decoder.
cehoyos
parents:
diff changeset
555 {
9b56cd1e37b7 Add MPEG-4 Audio Lossless Coding (ALS) decoder.
cehoyos
parents:
diff changeset
556 ALSSpecificConfig *sconf = &ctx->sconf;
9b56cd1e37b7 Add MPEG-4 Audio Lossless Coding (ALS) decoder.
cehoyos
parents:
diff changeset
557 AVCodecContext *avctx = ctx->avctx;
9b56cd1e37b7 Add MPEG-4 Audio Lossless Coding (ALS) decoder.
cehoyos
parents:
diff changeset
558 GetBitContext *gb = &ctx->gb;
9b56cd1e37b7 Add MPEG-4 Audio Lossless Coding (ALS) decoder.
cehoyos
parents:
diff changeset
559 unsigned int k;
9b56cd1e37b7 Add MPEG-4 Audio Lossless Coding (ALS) decoder.
cehoyos
parents:
diff changeset
560 unsigned int s[8];
9b56cd1e37b7 Add MPEG-4 Audio Lossless Coding (ALS) decoder.
cehoyos
parents:
diff changeset
561 unsigned int sub_blocks, log2_sub_blocks, sb_length;
9b56cd1e37b7 Add MPEG-4 Audio Lossless Coding (ALS) decoder.
cehoyos
parents:
diff changeset
562 unsigned int start = 0;
10681
997692df50c1 Read and decode block data in separate functions to prepare support for
thilo.borgmann
parents: 10535
diff changeset
563 unsigned int opt_order;
997692df50c1 Read and decode block data in separate functions to prepare support for
thilo.borgmann
parents: 10535
diff changeset
564 int sb;
997692df50c1 Read and decode block data in separate functions to prepare support for
thilo.borgmann
parents: 10535
diff changeset
565 int32_t *quant_cof = bd->quant_cof;
997692df50c1 Read and decode block data in separate functions to prepare support for
thilo.borgmann
parents: 10535
diff changeset
566
10522
9b56cd1e37b7 Add MPEG-4 Audio Lossless Coding (ALS) decoder.
cehoyos
parents:
diff changeset
567
10681
997692df50c1 Read and decode block data in separate functions to prepare support for
thilo.borgmann
parents: 10535
diff changeset
568 // ensure variable block decoding by reusing this field
997692df50c1 Read and decode block data in separate functions to prepare support for
thilo.borgmann
parents: 10535
diff changeset
569 bd->const_block = 0;
997692df50c1 Read and decode block data in separate functions to prepare support for
thilo.borgmann
parents: 10535
diff changeset
570
997692df50c1 Read and decode block data in separate functions to prepare support for
thilo.borgmann
parents: 10535
diff changeset
571 bd->opt_order = 1;
997692df50c1 Read and decode block data in separate functions to prepare support for
thilo.borgmann
parents: 10535
diff changeset
572 bd->js_blocks = get_bits1(gb);
997692df50c1 Read and decode block data in separate functions to prepare support for
thilo.borgmann
parents: 10535
diff changeset
573
997692df50c1 Read and decode block data in separate functions to prepare support for
thilo.borgmann
parents: 10535
diff changeset
574 opt_order = bd->opt_order;
10522
9b56cd1e37b7 Add MPEG-4 Audio Lossless Coding (ALS) decoder.
cehoyos
parents:
diff changeset
575
9b56cd1e37b7 Add MPEG-4 Audio Lossless Coding (ALS) decoder.
cehoyos
parents:
diff changeset
576 // determine the number of subblocks for entropy decoding
9b56cd1e37b7 Add MPEG-4 Audio Lossless Coding (ALS) decoder.
cehoyos
parents:
diff changeset
577 if (!sconf->bgmc && !sconf->sb_part) {
9b56cd1e37b7 Add MPEG-4 Audio Lossless Coding (ALS) decoder.
cehoyos
parents:
diff changeset
578 log2_sub_blocks = 0;
9b56cd1e37b7 Add MPEG-4 Audio Lossless Coding (ALS) decoder.
cehoyos
parents:
diff changeset
579 } else {
9b56cd1e37b7 Add MPEG-4 Audio Lossless Coding (ALS) decoder.
cehoyos
parents:
diff changeset
580 if (sconf->bgmc && sconf->sb_part)
9b56cd1e37b7 Add MPEG-4 Audio Lossless Coding (ALS) decoder.
cehoyos
parents:
diff changeset
581 log2_sub_blocks = get_bits(gb, 2);
9b56cd1e37b7 Add MPEG-4 Audio Lossless Coding (ALS) decoder.
cehoyos
parents:
diff changeset
582 else
9b56cd1e37b7 Add MPEG-4 Audio Lossless Coding (ALS) decoder.
cehoyos
parents:
diff changeset
583 log2_sub_blocks = 2 * get_bits1(gb);
9b56cd1e37b7 Add MPEG-4 Audio Lossless Coding (ALS) decoder.
cehoyos
parents:
diff changeset
584 }
9b56cd1e37b7 Add MPEG-4 Audio Lossless Coding (ALS) decoder.
cehoyos
parents:
diff changeset
585
9b56cd1e37b7 Add MPEG-4 Audio Lossless Coding (ALS) decoder.
cehoyos
parents:
diff changeset
586 sub_blocks = 1 << log2_sub_blocks;
9b56cd1e37b7 Add MPEG-4 Audio Lossless Coding (ALS) decoder.
cehoyos
parents:
diff changeset
587
9b56cd1e37b7 Add MPEG-4 Audio Lossless Coding (ALS) decoder.
cehoyos
parents:
diff changeset
588 // do not continue in case of a damaged stream since
9b56cd1e37b7 Add MPEG-4 Audio Lossless Coding (ALS) decoder.
cehoyos
parents:
diff changeset
589 // block_length must be evenly divisible by sub_blocks
10681
997692df50c1 Read and decode block data in separate functions to prepare support for
thilo.borgmann
parents: 10535
diff changeset
590 if (bd->block_length & (sub_blocks - 1)) {
10522
9b56cd1e37b7 Add MPEG-4 Audio Lossless Coding (ALS) decoder.
cehoyos
parents:
diff changeset
591 av_log(avctx, AV_LOG_WARNING,
9b56cd1e37b7 Add MPEG-4 Audio Lossless Coding (ALS) decoder.
cehoyos
parents:
diff changeset
592 "Block length is not evenly divisible by the number of subblocks.\n");
9b56cd1e37b7 Add MPEG-4 Audio Lossless Coding (ALS) decoder.
cehoyos
parents:
diff changeset
593 return -1;
9b56cd1e37b7 Add MPEG-4 Audio Lossless Coding (ALS) decoder.
cehoyos
parents:
diff changeset
594 }
9b56cd1e37b7 Add MPEG-4 Audio Lossless Coding (ALS) decoder.
cehoyos
parents:
diff changeset
595
10681
997692df50c1 Read and decode block data in separate functions to prepare support for
thilo.borgmann
parents: 10535
diff changeset
596 sb_length = bd->block_length >> log2_sub_blocks;
10522
9b56cd1e37b7 Add MPEG-4 Audio Lossless Coding (ALS) decoder.
cehoyos
parents:
diff changeset
597
9b56cd1e37b7 Add MPEG-4 Audio Lossless Coding (ALS) decoder.
cehoyos
parents:
diff changeset
598
9b56cd1e37b7 Add MPEG-4 Audio Lossless Coding (ALS) decoder.
cehoyos
parents:
diff changeset
599 if (sconf->bgmc) {
9b56cd1e37b7 Add MPEG-4 Audio Lossless Coding (ALS) decoder.
cehoyos
parents:
diff changeset
600 // TODO: BGMC mode
9b56cd1e37b7 Add MPEG-4 Audio Lossless Coding (ALS) decoder.
cehoyos
parents:
diff changeset
601 } else {
9b56cd1e37b7 Add MPEG-4 Audio Lossless Coding (ALS) decoder.
cehoyos
parents:
diff changeset
602 s[0] = get_bits(gb, 4 + (sconf->resolution > 1));
9b56cd1e37b7 Add MPEG-4 Audio Lossless Coding (ALS) decoder.
cehoyos
parents:
diff changeset
603 for (k = 1; k < sub_blocks; k++)
9b56cd1e37b7 Add MPEG-4 Audio Lossless Coding (ALS) decoder.
cehoyos
parents:
diff changeset
604 s[k] = s[k - 1] + decode_rice(gb, 0);
9b56cd1e37b7 Add MPEG-4 Audio Lossless Coding (ALS) decoder.
cehoyos
parents:
diff changeset
605 }
9b56cd1e37b7 Add MPEG-4 Audio Lossless Coding (ALS) decoder.
cehoyos
parents:
diff changeset
606
9b56cd1e37b7 Add MPEG-4 Audio Lossless Coding (ALS) decoder.
cehoyos
parents:
diff changeset
607 if (get_bits1(gb))
10681
997692df50c1 Read and decode block data in separate functions to prepare support for
thilo.borgmann
parents: 10535
diff changeset
608 bd->shift_lsbs = get_bits(gb, 4) + 1;
10522
9b56cd1e37b7 Add MPEG-4 Audio Lossless Coding (ALS) decoder.
cehoyos
parents:
diff changeset
609
10681
997692df50c1 Read and decode block data in separate functions to prepare support for
thilo.borgmann
parents: 10535
diff changeset
610 bd->store_prev_samples = (bd->js_blocks && bd->raw_other) || bd->shift_lsbs;
10522
9b56cd1e37b7 Add MPEG-4 Audio Lossless Coding (ALS) decoder.
cehoyos
parents:
diff changeset
611
9b56cd1e37b7 Add MPEG-4 Audio Lossless Coding (ALS) decoder.
cehoyos
parents:
diff changeset
612
9b56cd1e37b7 Add MPEG-4 Audio Lossless Coding (ALS) decoder.
cehoyos
parents:
diff changeset
613 if (!sconf->rlslms) {
9b56cd1e37b7 Add MPEG-4 Audio Lossless Coding (ALS) decoder.
cehoyos
parents:
diff changeset
614 if (sconf->adapt_order) {
10681
997692df50c1 Read and decode block data in separate functions to prepare support for
thilo.borgmann
parents: 10535
diff changeset
615 int opt_order_length = av_ceil_log2(av_clip((bd->block_length >> 3) - 1,
10522
9b56cd1e37b7 Add MPEG-4 Audio Lossless Coding (ALS) decoder.
cehoyos
parents:
diff changeset
616 2, sconf->max_order + 1));
10681
997692df50c1 Read and decode block data in separate functions to prepare support for
thilo.borgmann
parents: 10535
diff changeset
617 bd->opt_order = get_bits(gb, opt_order_length);
10522
9b56cd1e37b7 Add MPEG-4 Audio Lossless Coding (ALS) decoder.
cehoyos
parents:
diff changeset
618 } else {
10681
997692df50c1 Read and decode block data in separate functions to prepare support for
thilo.borgmann
parents: 10535
diff changeset
619 bd->opt_order = sconf->max_order;
10522
9b56cd1e37b7 Add MPEG-4 Audio Lossless Coding (ALS) decoder.
cehoyos
parents:
diff changeset
620 }
9b56cd1e37b7 Add MPEG-4 Audio Lossless Coding (ALS) decoder.
cehoyos
parents:
diff changeset
621
10681
997692df50c1 Read and decode block data in separate functions to prepare support for
thilo.borgmann
parents: 10535
diff changeset
622 opt_order = bd->opt_order;
997692df50c1 Read and decode block data in separate functions to prepare support for
thilo.borgmann
parents: 10535
diff changeset
623
10522
9b56cd1e37b7 Add MPEG-4 Audio Lossless Coding (ALS) decoder.
cehoyos
parents:
diff changeset
624 if (opt_order) {
9b56cd1e37b7 Add MPEG-4 Audio Lossless Coding (ALS) decoder.
cehoyos
parents:
diff changeset
625 int add_base;
9b56cd1e37b7 Add MPEG-4 Audio Lossless Coding (ALS) decoder.
cehoyos
parents:
diff changeset
626
9b56cd1e37b7 Add MPEG-4 Audio Lossless Coding (ALS) decoder.
cehoyos
parents:
diff changeset
627 if (sconf->coef_table == 3) {
9b56cd1e37b7 Add MPEG-4 Audio Lossless Coding (ALS) decoder.
cehoyos
parents:
diff changeset
628 add_base = 0x7F;
9b56cd1e37b7 Add MPEG-4 Audio Lossless Coding (ALS) decoder.
cehoyos
parents:
diff changeset
629
9b56cd1e37b7 Add MPEG-4 Audio Lossless Coding (ALS) decoder.
cehoyos
parents:
diff changeset
630 // read coefficient 0
9b56cd1e37b7 Add MPEG-4 Audio Lossless Coding (ALS) decoder.
cehoyos
parents:
diff changeset
631 quant_cof[0] = 32 * parcor_scaled_values[get_bits(gb, 7)];
9b56cd1e37b7 Add MPEG-4 Audio Lossless Coding (ALS) decoder.
cehoyos
parents:
diff changeset
632
9b56cd1e37b7 Add MPEG-4 Audio Lossless Coding (ALS) decoder.
cehoyos
parents:
diff changeset
633 // read coefficient 1
9b56cd1e37b7 Add MPEG-4 Audio Lossless Coding (ALS) decoder.
cehoyos
parents:
diff changeset
634 if (opt_order > 1)
9b56cd1e37b7 Add MPEG-4 Audio Lossless Coding (ALS) decoder.
cehoyos
parents:
diff changeset
635 quant_cof[1] = -32 * parcor_scaled_values[get_bits(gb, 7)];
9b56cd1e37b7 Add MPEG-4 Audio Lossless Coding (ALS) decoder.
cehoyos
parents:
diff changeset
636
9b56cd1e37b7 Add MPEG-4 Audio Lossless Coding (ALS) decoder.
cehoyos
parents:
diff changeset
637 // read coefficients 2 to opt_order
9b56cd1e37b7 Add MPEG-4 Audio Lossless Coding (ALS) decoder.
cehoyos
parents:
diff changeset
638 for (k = 2; k < opt_order; k++)
9b56cd1e37b7 Add MPEG-4 Audio Lossless Coding (ALS) decoder.
cehoyos
parents:
diff changeset
639 quant_cof[k] = get_bits(gb, 7);
9b56cd1e37b7 Add MPEG-4 Audio Lossless Coding (ALS) decoder.
cehoyos
parents:
diff changeset
640 } else {
9b56cd1e37b7 Add MPEG-4 Audio Lossless Coding (ALS) decoder.
cehoyos
parents:
diff changeset
641 int k_max;
9b56cd1e37b7 Add MPEG-4 Audio Lossless Coding (ALS) decoder.
cehoyos
parents:
diff changeset
642 add_base = 1;
9b56cd1e37b7 Add MPEG-4 Audio Lossless Coding (ALS) decoder.
cehoyos
parents:
diff changeset
643
9b56cd1e37b7 Add MPEG-4 Audio Lossless Coding (ALS) decoder.
cehoyos
parents:
diff changeset
644 // read coefficient 0 to 19
9b56cd1e37b7 Add MPEG-4 Audio Lossless Coding (ALS) decoder.
cehoyos
parents:
diff changeset
645 k_max = FFMIN(opt_order, 20);
9b56cd1e37b7 Add MPEG-4 Audio Lossless Coding (ALS) decoder.
cehoyos
parents:
diff changeset
646 for (k = 0; k < k_max; k++) {
9b56cd1e37b7 Add MPEG-4 Audio Lossless Coding (ALS) decoder.
cehoyos
parents:
diff changeset
647 int rice_param = parcor_rice_table[sconf->coef_table][k][1];
9b56cd1e37b7 Add MPEG-4 Audio Lossless Coding (ALS) decoder.
cehoyos
parents:
diff changeset
648 int offset = parcor_rice_table[sconf->coef_table][k][0];
9b56cd1e37b7 Add MPEG-4 Audio Lossless Coding (ALS) decoder.
cehoyos
parents:
diff changeset
649 quant_cof[k] = decode_rice(gb, rice_param) + offset;
9b56cd1e37b7 Add MPEG-4 Audio Lossless Coding (ALS) decoder.
cehoyos
parents:
diff changeset
650 }
9b56cd1e37b7 Add MPEG-4 Audio Lossless Coding (ALS) decoder.
cehoyos
parents:
diff changeset
651
9b56cd1e37b7 Add MPEG-4 Audio Lossless Coding (ALS) decoder.
cehoyos
parents:
diff changeset
652 // read coefficients 20 to 126
9b56cd1e37b7 Add MPEG-4 Audio Lossless Coding (ALS) decoder.
cehoyos
parents:
diff changeset
653 k_max = FFMIN(opt_order, 127);
9b56cd1e37b7 Add MPEG-4 Audio Lossless Coding (ALS) decoder.
cehoyos
parents:
diff changeset
654 for (; k < k_max; k++)
9b56cd1e37b7 Add MPEG-4 Audio Lossless Coding (ALS) decoder.
cehoyos
parents:
diff changeset
655 quant_cof[k] = decode_rice(gb, 2) + (k & 1);
9b56cd1e37b7 Add MPEG-4 Audio Lossless Coding (ALS) decoder.
cehoyos
parents:
diff changeset
656
9b56cd1e37b7 Add MPEG-4 Audio Lossless Coding (ALS) decoder.
cehoyos
parents:
diff changeset
657 // read coefficients 127 to opt_order
9b56cd1e37b7 Add MPEG-4 Audio Lossless Coding (ALS) decoder.
cehoyos
parents:
diff changeset
658 for (; k < opt_order; k++)
9b56cd1e37b7 Add MPEG-4 Audio Lossless Coding (ALS) decoder.
cehoyos
parents:
diff changeset
659 quant_cof[k] = decode_rice(gb, 1);
9b56cd1e37b7 Add MPEG-4 Audio Lossless Coding (ALS) decoder.
cehoyos
parents:
diff changeset
660
9b56cd1e37b7 Add MPEG-4 Audio Lossless Coding (ALS) decoder.
cehoyos
parents:
diff changeset
661 quant_cof[0] = 32 * parcor_scaled_values[quant_cof[0] + 64];
9b56cd1e37b7 Add MPEG-4 Audio Lossless Coding (ALS) decoder.
cehoyos
parents:
diff changeset
662
9b56cd1e37b7 Add MPEG-4 Audio Lossless Coding (ALS) decoder.
cehoyos
parents:
diff changeset
663 if (opt_order > 1)
9b56cd1e37b7 Add MPEG-4 Audio Lossless Coding (ALS) decoder.
cehoyos
parents:
diff changeset
664 quant_cof[1] = -32 * parcor_scaled_values[quant_cof[1] + 64];
9b56cd1e37b7 Add MPEG-4 Audio Lossless Coding (ALS) decoder.
cehoyos
parents:
diff changeset
665 }
9b56cd1e37b7 Add MPEG-4 Audio Lossless Coding (ALS) decoder.
cehoyos
parents:
diff changeset
666
9b56cd1e37b7 Add MPEG-4 Audio Lossless Coding (ALS) decoder.
cehoyos
parents:
diff changeset
667 for (k = 2; k < opt_order; k++)
9b56cd1e37b7 Add MPEG-4 Audio Lossless Coding (ALS) decoder.
cehoyos
parents:
diff changeset
668 quant_cof[k] = (quant_cof[k] << 14) + (add_base << 13);
9b56cd1e37b7 Add MPEG-4 Audio Lossless Coding (ALS) decoder.
cehoyos
parents:
diff changeset
669 }
9b56cd1e37b7 Add MPEG-4 Audio Lossless Coding (ALS) decoder.
cehoyos
parents:
diff changeset
670 }
9b56cd1e37b7 Add MPEG-4 Audio Lossless Coding (ALS) decoder.
cehoyos
parents:
diff changeset
671
10530
d428e57f14c6 Add long-term prediction to the ALS decoder.
thilo.borgmann
parents: 10524
diff changeset
672 // read LTP gain and lag values
d428e57f14c6 Add long-term prediction to the ALS decoder.
thilo.borgmann
parents: 10524
diff changeset
673 if (sconf->long_term_prediction) {
10681
997692df50c1 Read and decode block data in separate functions to prepare support for
thilo.borgmann
parents: 10535
diff changeset
674 *bd->use_ltp = get_bits1(gb);
10530
d428e57f14c6 Add long-term prediction to the ALS decoder.
thilo.borgmann
parents: 10524
diff changeset
675
10681
997692df50c1 Read and decode block data in separate functions to prepare support for
thilo.borgmann
parents: 10535
diff changeset
676 if (*bd->use_ltp) {
997692df50c1 Read and decode block data in separate functions to prepare support for
thilo.borgmann
parents: 10535
diff changeset
677 bd->ltp_gain[0] = decode_rice(gb, 1) << 3;
997692df50c1 Read and decode block data in separate functions to prepare support for
thilo.borgmann
parents: 10535
diff changeset
678 bd->ltp_gain[1] = decode_rice(gb, 2) << 3;
10530
d428e57f14c6 Add long-term prediction to the ALS decoder.
thilo.borgmann
parents: 10524
diff changeset
679
10681
997692df50c1 Read and decode block data in separate functions to prepare support for
thilo.borgmann
parents: 10535
diff changeset
680 bd->ltp_gain[2] = ltp_gain_values[get_unary(gb, 0, 4)][get_bits(gb, 2)];
10530
d428e57f14c6 Add long-term prediction to the ALS decoder.
thilo.borgmann
parents: 10524
diff changeset
681
10681
997692df50c1 Read and decode block data in separate functions to prepare support for
thilo.borgmann
parents: 10535
diff changeset
682 bd->ltp_gain[3] = decode_rice(gb, 2) << 3;
997692df50c1 Read and decode block data in separate functions to prepare support for
thilo.borgmann
parents: 10535
diff changeset
683 bd->ltp_gain[4] = decode_rice(gb, 1) << 3;
10530
d428e57f14c6 Add long-term prediction to the ALS decoder.
thilo.borgmann
parents: 10524
diff changeset
684
10681
997692df50c1 Read and decode block data in separate functions to prepare support for
thilo.borgmann
parents: 10535
diff changeset
685 *bd->ltp_lag = get_bits(gb, ctx->ltp_lag_length);
997692df50c1 Read and decode block data in separate functions to prepare support for
thilo.borgmann
parents: 10535
diff changeset
686 *bd->ltp_lag += FFMAX(4, opt_order + 1);
10530
d428e57f14c6 Add long-term prediction to the ALS decoder.
thilo.borgmann
parents: 10524
diff changeset
687 }
d428e57f14c6 Add long-term prediction to the ALS decoder.
thilo.borgmann
parents: 10524
diff changeset
688 }
10522
9b56cd1e37b7 Add MPEG-4 Audio Lossless Coding (ALS) decoder.
cehoyos
parents:
diff changeset
689
9b56cd1e37b7 Add MPEG-4 Audio Lossless Coding (ALS) decoder.
cehoyos
parents:
diff changeset
690 // read first value and residuals in case of a random access block
10681
997692df50c1 Read and decode block data in separate functions to prepare support for
thilo.borgmann
parents: 10535
diff changeset
691 if (bd->ra_block) {
10522
9b56cd1e37b7 Add MPEG-4 Audio Lossless Coding (ALS) decoder.
cehoyos
parents:
diff changeset
692 if (opt_order)
10681
997692df50c1 Read and decode block data in separate functions to prepare support for
thilo.borgmann
parents: 10535
diff changeset
693 bd->raw_samples[0] = decode_rice(gb, avctx->bits_per_raw_sample - 4);
10522
9b56cd1e37b7 Add MPEG-4 Audio Lossless Coding (ALS) decoder.
cehoyos
parents:
diff changeset
694 if (opt_order > 1)
10681
997692df50c1 Read and decode block data in separate functions to prepare support for
thilo.borgmann
parents: 10535
diff changeset
695 bd->raw_samples[1] = decode_rice(gb, s[0] + 3);
10522
9b56cd1e37b7 Add MPEG-4 Audio Lossless Coding (ALS) decoder.
cehoyos
parents:
diff changeset
696 if (opt_order > 2)
10681
997692df50c1 Read and decode block data in separate functions to prepare support for
thilo.borgmann
parents: 10535
diff changeset
697 bd->raw_samples[2] = decode_rice(gb, s[0] + 1);
10522
9b56cd1e37b7 Add MPEG-4 Audio Lossless Coding (ALS) decoder.
cehoyos
parents:
diff changeset
698
9b56cd1e37b7 Add MPEG-4 Audio Lossless Coding (ALS) decoder.
cehoyos
parents:
diff changeset
699 start = FFMIN(opt_order, 3);
9b56cd1e37b7 Add MPEG-4 Audio Lossless Coding (ALS) decoder.
cehoyos
parents:
diff changeset
700 }
9b56cd1e37b7 Add MPEG-4 Audio Lossless Coding (ALS) decoder.
cehoyos
parents:
diff changeset
701
9b56cd1e37b7 Add MPEG-4 Audio Lossless Coding (ALS) decoder.
cehoyos
parents:
diff changeset
702 // read all residuals
9b56cd1e37b7 Add MPEG-4 Audio Lossless Coding (ALS) decoder.
cehoyos
parents:
diff changeset
703 if (sconf->bgmc) {
9b56cd1e37b7 Add MPEG-4 Audio Lossless Coding (ALS) decoder.
cehoyos
parents:
diff changeset
704 // TODO: BGMC mode
9b56cd1e37b7 Add MPEG-4 Audio Lossless Coding (ALS) decoder.
cehoyos
parents:
diff changeset
705 } else {
10681
997692df50c1 Read and decode block data in separate functions to prepare support for
thilo.borgmann
parents: 10535
diff changeset
706 int32_t *current_res = bd->raw_samples + start;
10522
9b56cd1e37b7 Add MPEG-4 Audio Lossless Coding (ALS) decoder.
cehoyos
parents:
diff changeset
707
9b56cd1e37b7 Add MPEG-4 Audio Lossless Coding (ALS) decoder.
cehoyos
parents:
diff changeset
708 for (sb = 0; sb < sub_blocks; sb++, start = 0)
9b56cd1e37b7 Add MPEG-4 Audio Lossless Coding (ALS) decoder.
cehoyos
parents:
diff changeset
709 for (; start < sb_length; start++)
9b56cd1e37b7 Add MPEG-4 Audio Lossless Coding (ALS) decoder.
cehoyos
parents:
diff changeset
710 *current_res++ = decode_rice(gb, s[sb]);
9b56cd1e37b7 Add MPEG-4 Audio Lossless Coding (ALS) decoder.
cehoyos
parents:
diff changeset
711 }
9b56cd1e37b7 Add MPEG-4 Audio Lossless Coding (ALS) decoder.
cehoyos
parents:
diff changeset
712
10681
997692df50c1 Read and decode block data in separate functions to prepare support for
thilo.borgmann
parents: 10535
diff changeset
713 if (!sconf->mc_coding || ctx->js_switch)
997692df50c1 Read and decode block data in separate functions to prepare support for
thilo.borgmann
parents: 10535
diff changeset
714 align_get_bits(gb);
997692df50c1 Read and decode block data in separate functions to prepare support for
thilo.borgmann
parents: 10535
diff changeset
715
997692df50c1 Read and decode block data in separate functions to prepare support for
thilo.borgmann
parents: 10535
diff changeset
716 return 0;
997692df50c1 Read and decode block data in separate functions to prepare support for
thilo.borgmann
parents: 10535
diff changeset
717 }
997692df50c1 Read and decode block data in separate functions to prepare support for
thilo.borgmann
parents: 10535
diff changeset
718
997692df50c1 Read and decode block data in separate functions to prepare support for
thilo.borgmann
parents: 10535
diff changeset
719
997692df50c1 Read and decode block data in separate functions to prepare support for
thilo.borgmann
parents: 10535
diff changeset
720 /** Decodes the block data for a non-constant block
997692df50c1 Read and decode block data in separate functions to prepare support for
thilo.borgmann
parents: 10535
diff changeset
721 */
997692df50c1 Read and decode block data in separate functions to prepare support for
thilo.borgmann
parents: 10535
diff changeset
722 static int decode_var_block_data(ALSDecContext *ctx, ALSBlockData *bd)
997692df50c1 Read and decode block data in separate functions to prepare support for
thilo.borgmann
parents: 10535
diff changeset
723 {
997692df50c1 Read and decode block data in separate functions to prepare support for
thilo.borgmann
parents: 10535
diff changeset
724 ALSSpecificConfig *sconf = &ctx->sconf;
997692df50c1 Read and decode block data in separate functions to prepare support for
thilo.borgmann
parents: 10535
diff changeset
725 unsigned int block_length = bd->block_length;
997692df50c1 Read and decode block data in separate functions to prepare support for
thilo.borgmann
parents: 10535
diff changeset
726 unsigned int smp = 0;
997692df50c1 Read and decode block data in separate functions to prepare support for
thilo.borgmann
parents: 10535
diff changeset
727 unsigned int k;
10823
d87e8f2c5c91 Change local variable type from unsigned int to int in order to
thilo.borgmann
parents: 10802
diff changeset
728 int opt_order = bd->opt_order;
10681
997692df50c1 Read and decode block data in separate functions to prepare support for
thilo.borgmann
parents: 10535
diff changeset
729 int sb;
997692df50c1 Read and decode block data in separate functions to prepare support for
thilo.borgmann
parents: 10535
diff changeset
730 int64_t y;
997692df50c1 Read and decode block data in separate functions to prepare support for
thilo.borgmann
parents: 10535
diff changeset
731 int32_t *quant_cof = bd->quant_cof;
997692df50c1 Read and decode block data in separate functions to prepare support for
thilo.borgmann
parents: 10535
diff changeset
732 int32_t *lpc_cof = bd->lpc_cof;
997692df50c1 Read and decode block data in separate functions to prepare support for
thilo.borgmann
parents: 10535
diff changeset
733 int32_t *raw_samples = bd->raw_samples;
10800
67e430033b14 Optimize short-term prediction by reducing index arithmetic.
thilo.borgmann
parents: 10774
diff changeset
734 int32_t *raw_samples_end = bd->raw_samples + bd->block_length;
10860
c9fb5b89e47a Replace variable length array with an allocated buffer
thilo.borgmann
parents: 10823
diff changeset
735 int32_t *lpc_cof_reversed = ctx->lpc_cof_reversed_buffer;
10681
997692df50c1 Read and decode block data in separate functions to prepare support for
thilo.borgmann
parents: 10535
diff changeset
736
10530
d428e57f14c6 Add long-term prediction to the ALS decoder.
thilo.borgmann
parents: 10524
diff changeset
737 // reverse long-term prediction
10681
997692df50c1 Read and decode block data in separate functions to prepare support for
thilo.borgmann
parents: 10535
diff changeset
738 if (*bd->use_ltp) {
10530
d428e57f14c6 Add long-term prediction to the ALS decoder.
thilo.borgmann
parents: 10524
diff changeset
739 int ltp_smp;
d428e57f14c6 Add long-term prediction to the ALS decoder.
thilo.borgmann
parents: 10524
diff changeset
740
10681
997692df50c1 Read and decode block data in separate functions to prepare support for
thilo.borgmann
parents: 10535
diff changeset
741 for (ltp_smp = FFMAX(*bd->ltp_lag - 2, 0); ltp_smp < block_length; ltp_smp++) {
997692df50c1 Read and decode block data in separate functions to prepare support for
thilo.borgmann
parents: 10535
diff changeset
742 int center = ltp_smp - *bd->ltp_lag;
10530
d428e57f14c6 Add long-term prediction to the ALS decoder.
thilo.borgmann
parents: 10524
diff changeset
743 int begin = FFMAX(0, center - 2);
d428e57f14c6 Add long-term prediction to the ALS decoder.
thilo.borgmann
parents: 10524
diff changeset
744 int end = center + 3;
d428e57f14c6 Add long-term prediction to the ALS decoder.
thilo.borgmann
parents: 10524
diff changeset
745 int tab = 5 - (end - begin);
d428e57f14c6 Add long-term prediction to the ALS decoder.
thilo.borgmann
parents: 10524
diff changeset
746 int base;
d428e57f14c6 Add long-term prediction to the ALS decoder.
thilo.borgmann
parents: 10524
diff changeset
747
d428e57f14c6 Add long-term prediction to the ALS decoder.
thilo.borgmann
parents: 10524
diff changeset
748 y = 1 << 6;
d428e57f14c6 Add long-term prediction to the ALS decoder.
thilo.borgmann
parents: 10524
diff changeset
749
d428e57f14c6 Add long-term prediction to the ALS decoder.
thilo.borgmann
parents: 10524
diff changeset
750 for (base = begin; base < end; base++, tab++)
10681
997692df50c1 Read and decode block data in separate functions to prepare support for
thilo.borgmann
parents: 10535
diff changeset
751 y += MUL64(bd->ltp_gain[tab], raw_samples[base]);
10530
d428e57f14c6 Add long-term prediction to the ALS decoder.
thilo.borgmann
parents: 10524
diff changeset
752
d428e57f14c6 Add long-term prediction to the ALS decoder.
thilo.borgmann
parents: 10524
diff changeset
753 raw_samples[ltp_smp] += y >> 7;
d428e57f14c6 Add long-term prediction to the ALS decoder.
thilo.borgmann
parents: 10524
diff changeset
754 }
d428e57f14c6 Add long-term prediction to the ALS decoder.
thilo.borgmann
parents: 10524
diff changeset
755 }
d428e57f14c6 Add long-term prediction to the ALS decoder.
thilo.borgmann
parents: 10524
diff changeset
756
10522
9b56cd1e37b7 Add MPEG-4 Audio Lossless Coding (ALS) decoder.
cehoyos
parents:
diff changeset
757 // reconstruct all samples from residuals
10681
997692df50c1 Read and decode block data in separate functions to prepare support for
thilo.borgmann
parents: 10535
diff changeset
758 if (bd->ra_block) {
10522
9b56cd1e37b7 Add MPEG-4 Audio Lossless Coding (ALS) decoder.
cehoyos
parents:
diff changeset
759 for (smp = 0; smp < opt_order; smp++) {
9b56cd1e37b7 Add MPEG-4 Audio Lossless Coding (ALS) decoder.
cehoyos
parents:
diff changeset
760 y = 1 << 19;
9b56cd1e37b7 Add MPEG-4 Audio Lossless Coding (ALS) decoder.
cehoyos
parents:
diff changeset
761
9b56cd1e37b7 Add MPEG-4 Audio Lossless Coding (ALS) decoder.
cehoyos
parents:
diff changeset
762 for (sb = 0; sb < smp; sb++)
10800
67e430033b14 Optimize short-term prediction by reducing index arithmetic.
thilo.borgmann
parents: 10774
diff changeset
763 y += MUL64(lpc_cof[sb], raw_samples[-(sb + 1)]);
10522
9b56cd1e37b7 Add MPEG-4 Audio Lossless Coding (ALS) decoder.
cehoyos
parents:
diff changeset
764
10800
67e430033b14 Optimize short-term prediction by reducing index arithmetic.
thilo.borgmann
parents: 10774
diff changeset
765 *raw_samples++ -= y >> 20;
10522
9b56cd1e37b7 Add MPEG-4 Audio Lossless Coding (ALS) decoder.
cehoyos
parents:
diff changeset
766 parcor_to_lpc(smp, quant_cof, lpc_cof);
9b56cd1e37b7 Add MPEG-4 Audio Lossless Coding (ALS) decoder.
cehoyos
parents:
diff changeset
767 }
9b56cd1e37b7 Add MPEG-4 Audio Lossless Coding (ALS) decoder.
cehoyos
parents:
diff changeset
768 } else {
9b56cd1e37b7 Add MPEG-4 Audio Lossless Coding (ALS) decoder.
cehoyos
parents:
diff changeset
769 for (k = 0; k < opt_order; k++)
9b56cd1e37b7 Add MPEG-4 Audio Lossless Coding (ALS) decoder.
cehoyos
parents:
diff changeset
770 parcor_to_lpc(k, quant_cof, lpc_cof);
9b56cd1e37b7 Add MPEG-4 Audio Lossless Coding (ALS) decoder.
cehoyos
parents:
diff changeset
771
9b56cd1e37b7 Add MPEG-4 Audio Lossless Coding (ALS) decoder.
cehoyos
parents:
diff changeset
772 // store previous samples in case that they have to be altered
10681
997692df50c1 Read and decode block data in separate functions to prepare support for
thilo.borgmann
parents: 10535
diff changeset
773 if (bd->store_prev_samples)
997692df50c1 Read and decode block data in separate functions to prepare support for
thilo.borgmann
parents: 10535
diff changeset
774 memcpy(bd->prev_raw_samples, raw_samples - sconf->max_order,
997692df50c1 Read and decode block data in separate functions to prepare support for
thilo.borgmann
parents: 10535
diff changeset
775 sizeof(*bd->prev_raw_samples) * sconf->max_order);
10522
9b56cd1e37b7 Add MPEG-4 Audio Lossless Coding (ALS) decoder.
cehoyos
parents:
diff changeset
776
9b56cd1e37b7 Add MPEG-4 Audio Lossless Coding (ALS) decoder.
cehoyos
parents:
diff changeset
777 // reconstruct difference signal for prediction (joint-stereo)
10681
997692df50c1 Read and decode block data in separate functions to prepare support for
thilo.borgmann
parents: 10535
diff changeset
778 if (bd->js_blocks && bd->raw_other) {
10522
9b56cd1e37b7 Add MPEG-4 Audio Lossless Coding (ALS) decoder.
cehoyos
parents:
diff changeset
779 int32_t *left, *right;
9b56cd1e37b7 Add MPEG-4 Audio Lossless Coding (ALS) decoder.
cehoyos
parents:
diff changeset
780
10681
997692df50c1 Read and decode block data in separate functions to prepare support for
thilo.borgmann
parents: 10535
diff changeset
781 if (bd->raw_other > raw_samples) { // D = R - L
10522
9b56cd1e37b7 Add MPEG-4 Audio Lossless Coding (ALS) decoder.
cehoyos
parents:
diff changeset
782 left = raw_samples;
10681
997692df50c1 Read and decode block data in separate functions to prepare support for
thilo.borgmann
parents: 10535
diff changeset
783 right = bd->raw_other;
10522
9b56cd1e37b7 Add MPEG-4 Audio Lossless Coding (ALS) decoder.
cehoyos
parents:
diff changeset
784 } else { // D = R - L
10681
997692df50c1 Read and decode block data in separate functions to prepare support for
thilo.borgmann
parents: 10535
diff changeset
785 left = bd->raw_other;
10522
9b56cd1e37b7 Add MPEG-4 Audio Lossless Coding (ALS) decoder.
cehoyos
parents:
diff changeset
786 right = raw_samples;
9b56cd1e37b7 Add MPEG-4 Audio Lossless Coding (ALS) decoder.
cehoyos
parents:
diff changeset
787 }
9b56cd1e37b7 Add MPEG-4 Audio Lossless Coding (ALS) decoder.
cehoyos
parents:
diff changeset
788
9b56cd1e37b7 Add MPEG-4 Audio Lossless Coding (ALS) decoder.
cehoyos
parents:
diff changeset
789 for (sb = -1; sb >= -sconf->max_order; sb--)
9b56cd1e37b7 Add MPEG-4 Audio Lossless Coding (ALS) decoder.
cehoyos
parents:
diff changeset
790 raw_samples[sb] = right[sb] - left[sb];
9b56cd1e37b7 Add MPEG-4 Audio Lossless Coding (ALS) decoder.
cehoyos
parents:
diff changeset
791 }
9b56cd1e37b7 Add MPEG-4 Audio Lossless Coding (ALS) decoder.
cehoyos
parents:
diff changeset
792
9b56cd1e37b7 Add MPEG-4 Audio Lossless Coding (ALS) decoder.
cehoyos
parents:
diff changeset
793 // reconstruct shifted signal
10681
997692df50c1 Read and decode block data in separate functions to prepare support for
thilo.borgmann
parents: 10535
diff changeset
794 if (bd->shift_lsbs)
10522
9b56cd1e37b7 Add MPEG-4 Audio Lossless Coding (ALS) decoder.
cehoyos
parents:
diff changeset
795 for (sb = -1; sb >= -sconf->max_order; sb--)
10681
997692df50c1 Read and decode block data in separate functions to prepare support for
thilo.borgmann
parents: 10535
diff changeset
796 raw_samples[sb] >>= bd->shift_lsbs;
10522
9b56cd1e37b7 Add MPEG-4 Audio Lossless Coding (ALS) decoder.
cehoyos
parents:
diff changeset
797 }
9b56cd1e37b7 Add MPEG-4 Audio Lossless Coding (ALS) decoder.
cehoyos
parents:
diff changeset
798
10800
67e430033b14 Optimize short-term prediction by reducing index arithmetic.
thilo.borgmann
parents: 10774
diff changeset
799 // reverse linear prediction coefficients for efficiency
67e430033b14 Optimize short-term prediction by reducing index arithmetic.
thilo.borgmann
parents: 10774
diff changeset
800 lpc_cof = lpc_cof + opt_order;
67e430033b14 Optimize short-term prediction by reducing index arithmetic.
thilo.borgmann
parents: 10774
diff changeset
801
67e430033b14 Optimize short-term prediction by reducing index arithmetic.
thilo.borgmann
parents: 10774
diff changeset
802 for (sb = 0; sb < opt_order; sb++)
67e430033b14 Optimize short-term prediction by reducing index arithmetic.
thilo.borgmann
parents: 10774
diff changeset
803 lpc_cof_reversed[sb] = lpc_cof[-(sb + 1)];
67e430033b14 Optimize short-term prediction by reducing index arithmetic.
thilo.borgmann
parents: 10774
diff changeset
804
10522
9b56cd1e37b7 Add MPEG-4 Audio Lossless Coding (ALS) decoder.
cehoyos
parents:
diff changeset
805 // reconstruct raw samples
10800
67e430033b14 Optimize short-term prediction by reducing index arithmetic.
thilo.borgmann
parents: 10774
diff changeset
806 raw_samples = bd->raw_samples + smp;
67e430033b14 Optimize short-term prediction by reducing index arithmetic.
thilo.borgmann
parents: 10774
diff changeset
807 lpc_cof = lpc_cof_reversed + opt_order;
67e430033b14 Optimize short-term prediction by reducing index arithmetic.
thilo.borgmann
parents: 10774
diff changeset
808
67e430033b14 Optimize short-term prediction by reducing index arithmetic.
thilo.borgmann
parents: 10774
diff changeset
809 for (; raw_samples < raw_samples_end; raw_samples++) {
10522
9b56cd1e37b7 Add MPEG-4 Audio Lossless Coding (ALS) decoder.
cehoyos
parents:
diff changeset
810 y = 1 << 19;
9b56cd1e37b7 Add MPEG-4 Audio Lossless Coding (ALS) decoder.
cehoyos
parents:
diff changeset
811
10800
67e430033b14 Optimize short-term prediction by reducing index arithmetic.
thilo.borgmann
parents: 10774
diff changeset
812 for (sb = -opt_order; sb < 0; sb++)
67e430033b14 Optimize short-term prediction by reducing index arithmetic.
thilo.borgmann
parents: 10774
diff changeset
813 y += MUL64(lpc_cof[sb], raw_samples[sb]);
10522
9b56cd1e37b7 Add MPEG-4 Audio Lossless Coding (ALS) decoder.
cehoyos
parents:
diff changeset
814
10800
67e430033b14 Optimize short-term prediction by reducing index arithmetic.
thilo.borgmann
parents: 10774
diff changeset
815 *raw_samples -= y >> 20;
10522
9b56cd1e37b7 Add MPEG-4 Audio Lossless Coding (ALS) decoder.
cehoyos
parents:
diff changeset
816 }
9b56cd1e37b7 Add MPEG-4 Audio Lossless Coding (ALS) decoder.
cehoyos
parents:
diff changeset
817
10800
67e430033b14 Optimize short-term prediction by reducing index arithmetic.
thilo.borgmann
parents: 10774
diff changeset
818 raw_samples = bd->raw_samples;
67e430033b14 Optimize short-term prediction by reducing index arithmetic.
thilo.borgmann
parents: 10774
diff changeset
819
10522
9b56cd1e37b7 Add MPEG-4 Audio Lossless Coding (ALS) decoder.
cehoyos
parents:
diff changeset
820 // restore previous samples in case that they have been altered
10681
997692df50c1 Read and decode block data in separate functions to prepare support for
thilo.borgmann
parents: 10535
diff changeset
821 if (bd->store_prev_samples)
997692df50c1 Read and decode block data in separate functions to prepare support for
thilo.borgmann
parents: 10535
diff changeset
822 memcpy(raw_samples - sconf->max_order, bd->prev_raw_samples,
10522
9b56cd1e37b7 Add MPEG-4 Audio Lossless Coding (ALS) decoder.
cehoyos
parents:
diff changeset
823 sizeof(*raw_samples) * sconf->max_order);
9b56cd1e37b7 Add MPEG-4 Audio Lossless Coding (ALS) decoder.
cehoyos
parents:
diff changeset
824
9b56cd1e37b7 Add MPEG-4 Audio Lossless Coding (ALS) decoder.
cehoyos
parents:
diff changeset
825 return 0;
9b56cd1e37b7 Add MPEG-4 Audio Lossless Coding (ALS) decoder.
cehoyos
parents:
diff changeset
826 }
9b56cd1e37b7 Add MPEG-4 Audio Lossless Coding (ALS) decoder.
cehoyos
parents:
diff changeset
827
9b56cd1e37b7 Add MPEG-4 Audio Lossless Coding (ALS) decoder.
cehoyos
parents:
diff changeset
828
9b56cd1e37b7 Add MPEG-4 Audio Lossless Coding (ALS) decoder.
cehoyos
parents:
diff changeset
829 /** Reads the block data.
9b56cd1e37b7 Add MPEG-4 Audio Lossless Coding (ALS) decoder.
cehoyos
parents:
diff changeset
830 */
10681
997692df50c1 Read and decode block data in separate functions to prepare support for
thilo.borgmann
parents: 10535
diff changeset
831 static int read_block(ALSDecContext *ctx, ALSBlockData *bd)
10522
9b56cd1e37b7 Add MPEG-4 Audio Lossless Coding (ALS) decoder.
cehoyos
parents:
diff changeset
832 {
9b56cd1e37b7 Add MPEG-4 Audio Lossless Coding (ALS) decoder.
cehoyos
parents:
diff changeset
833 GetBitContext *gb = &ctx->gb;
9b56cd1e37b7 Add MPEG-4 Audio Lossless Coding (ALS) decoder.
cehoyos
parents:
diff changeset
834
9b56cd1e37b7 Add MPEG-4 Audio Lossless Coding (ALS) decoder.
cehoyos
parents:
diff changeset
835 // read block type flag and read the samples accordingly
9b56cd1e37b7 Add MPEG-4 Audio Lossless Coding (ALS) decoder.
cehoyos
parents:
diff changeset
836 if (get_bits1(gb)) {
10681
997692df50c1 Read and decode block data in separate functions to prepare support for
thilo.borgmann
parents: 10535
diff changeset
837 if (read_var_block_data(ctx, bd))
10522
9b56cd1e37b7 Add MPEG-4 Audio Lossless Coding (ALS) decoder.
cehoyos
parents:
diff changeset
838 return -1;
9b56cd1e37b7 Add MPEG-4 Audio Lossless Coding (ALS) decoder.
cehoyos
parents:
diff changeset
839 } else {
10681
997692df50c1 Read and decode block data in separate functions to prepare support for
thilo.borgmann
parents: 10535
diff changeset
840 read_const_block_data(ctx, bd);
10522
9b56cd1e37b7 Add MPEG-4 Audio Lossless Coding (ALS) decoder.
cehoyos
parents:
diff changeset
841 }
9b56cd1e37b7 Add MPEG-4 Audio Lossless Coding (ALS) decoder.
cehoyos
parents:
diff changeset
842
10681
997692df50c1 Read and decode block data in separate functions to prepare support for
thilo.borgmann
parents: 10535
diff changeset
843 return 0;
997692df50c1 Read and decode block data in separate functions to prepare support for
thilo.borgmann
parents: 10535
diff changeset
844 }
997692df50c1 Read and decode block data in separate functions to prepare support for
thilo.borgmann
parents: 10535
diff changeset
845
997692df50c1 Read and decode block data in separate functions to prepare support for
thilo.borgmann
parents: 10535
diff changeset
846
997692df50c1 Read and decode block data in separate functions to prepare support for
thilo.borgmann
parents: 10535
diff changeset
847 /** Decodes the block data.
997692df50c1 Read and decode block data in separate functions to prepare support for
thilo.borgmann
parents: 10535
diff changeset
848 */
997692df50c1 Read and decode block data in separate functions to prepare support for
thilo.borgmann
parents: 10535
diff changeset
849 static int decode_block(ALSDecContext *ctx, ALSBlockData *bd)
997692df50c1 Read and decode block data in separate functions to prepare support for
thilo.borgmann
parents: 10535
diff changeset
850 {
997692df50c1 Read and decode block data in separate functions to prepare support for
thilo.borgmann
parents: 10535
diff changeset
851 unsigned int smp;
997692df50c1 Read and decode block data in separate functions to prepare support for
thilo.borgmann
parents: 10535
diff changeset
852
997692df50c1 Read and decode block data in separate functions to prepare support for
thilo.borgmann
parents: 10535
diff changeset
853 // read block type flag and read the samples accordingly
997692df50c1 Read and decode block data in separate functions to prepare support for
thilo.borgmann
parents: 10535
diff changeset
854 if (bd->const_block)
997692df50c1 Read and decode block data in separate functions to prepare support for
thilo.borgmann
parents: 10535
diff changeset
855 decode_const_block_data(ctx, bd);
997692df50c1 Read and decode block data in separate functions to prepare support for
thilo.borgmann
parents: 10535
diff changeset
856 else if (decode_var_block_data(ctx, bd))
997692df50c1 Read and decode block data in separate functions to prepare support for
thilo.borgmann
parents: 10535
diff changeset
857 return -1;
997692df50c1 Read and decode block data in separate functions to prepare support for
thilo.borgmann
parents: 10535
diff changeset
858
10522
9b56cd1e37b7 Add MPEG-4 Audio Lossless Coding (ALS) decoder.
cehoyos
parents:
diff changeset
859 // TODO: read RLSLMS extension data
9b56cd1e37b7 Add MPEG-4 Audio Lossless Coding (ALS) decoder.
cehoyos
parents:
diff changeset
860
10681
997692df50c1 Read and decode block data in separate functions to prepare support for
thilo.borgmann
parents: 10535
diff changeset
861 if (bd->shift_lsbs)
997692df50c1 Read and decode block data in separate functions to prepare support for
thilo.borgmann
parents: 10535
diff changeset
862 for (smp = 0; smp < bd->block_length; smp++)
997692df50c1 Read and decode block data in separate functions to prepare support for
thilo.borgmann
parents: 10535
diff changeset
863 bd->raw_samples[smp] <<= bd->shift_lsbs;
10522
9b56cd1e37b7 Add MPEG-4 Audio Lossless Coding (ALS) decoder.
cehoyos
parents:
diff changeset
864
9b56cd1e37b7 Add MPEG-4 Audio Lossless Coding (ALS) decoder.
cehoyos
parents:
diff changeset
865 return 0;
9b56cd1e37b7 Add MPEG-4 Audio Lossless Coding (ALS) decoder.
cehoyos
parents:
diff changeset
866 }
9b56cd1e37b7 Add MPEG-4 Audio Lossless Coding (ALS) decoder.
cehoyos
parents:
diff changeset
867
9b56cd1e37b7 Add MPEG-4 Audio Lossless Coding (ALS) decoder.
cehoyos
parents:
diff changeset
868
10681
997692df50c1 Read and decode block data in separate functions to prepare support for
thilo.borgmann
parents: 10535
diff changeset
869 /** Reads and decodes block data successively.
997692df50c1 Read and decode block data in separate functions to prepare support for
thilo.borgmann
parents: 10535
diff changeset
870 */
997692df50c1 Read and decode block data in separate functions to prepare support for
thilo.borgmann
parents: 10535
diff changeset
871 static int read_decode_block(ALSDecContext *ctx, ALSBlockData *bd)
997692df50c1 Read and decode block data in separate functions to prepare support for
thilo.borgmann
parents: 10535
diff changeset
872 {
997692df50c1 Read and decode block data in separate functions to prepare support for
thilo.borgmann
parents: 10535
diff changeset
873 int ret;
997692df50c1 Read and decode block data in separate functions to prepare support for
thilo.borgmann
parents: 10535
diff changeset
874
997692df50c1 Read and decode block data in separate functions to prepare support for
thilo.borgmann
parents: 10535
diff changeset
875 ret = read_block(ctx, bd);
997692df50c1 Read and decode block data in separate functions to prepare support for
thilo.borgmann
parents: 10535
diff changeset
876
997692df50c1 Read and decode block data in separate functions to prepare support for
thilo.borgmann
parents: 10535
diff changeset
877 if (ret)
997692df50c1 Read and decode block data in separate functions to prepare support for
thilo.borgmann
parents: 10535
diff changeset
878 return ret;
997692df50c1 Read and decode block data in separate functions to prepare support for
thilo.borgmann
parents: 10535
diff changeset
879
997692df50c1 Read and decode block data in separate functions to prepare support for
thilo.borgmann
parents: 10535
diff changeset
880 ret = decode_block(ctx, bd);
997692df50c1 Read and decode block data in separate functions to prepare support for
thilo.borgmann
parents: 10535
diff changeset
881
997692df50c1 Read and decode block data in separate functions to prepare support for
thilo.borgmann
parents: 10535
diff changeset
882 return ret;
997692df50c1 Read and decode block data in separate functions to prepare support for
thilo.borgmann
parents: 10535
diff changeset
883 }
997692df50c1 Read and decode block data in separate functions to prepare support for
thilo.borgmann
parents: 10535
diff changeset
884
997692df50c1 Read and decode block data in separate functions to prepare support for
thilo.borgmann
parents: 10535
diff changeset
885
10522
9b56cd1e37b7 Add MPEG-4 Audio Lossless Coding (ALS) decoder.
cehoyos
parents:
diff changeset
886 /** Computes the number of samples left to decode for the current frame and
9b56cd1e37b7 Add MPEG-4 Audio Lossless Coding (ALS) decoder.
cehoyos
parents:
diff changeset
887 * sets these samples to zero.
9b56cd1e37b7 Add MPEG-4 Audio Lossless Coding (ALS) decoder.
cehoyos
parents:
diff changeset
888 */
9b56cd1e37b7 Add MPEG-4 Audio Lossless Coding (ALS) decoder.
cehoyos
parents:
diff changeset
889 static void zero_remaining(unsigned int b, unsigned int b_max,
9b56cd1e37b7 Add MPEG-4 Audio Lossless Coding (ALS) decoder.
cehoyos
parents:
diff changeset
890 const unsigned int *div_blocks, int32_t *buf)
9b56cd1e37b7 Add MPEG-4 Audio Lossless Coding (ALS) decoder.
cehoyos
parents:
diff changeset
891 {
9b56cd1e37b7 Add MPEG-4 Audio Lossless Coding (ALS) decoder.
cehoyos
parents:
diff changeset
892 unsigned int count = 0;
9b56cd1e37b7 Add MPEG-4 Audio Lossless Coding (ALS) decoder.
cehoyos
parents:
diff changeset
893
9b56cd1e37b7 Add MPEG-4 Audio Lossless Coding (ALS) decoder.
cehoyos
parents:
diff changeset
894 while (b < b_max)
9b56cd1e37b7 Add MPEG-4 Audio Lossless Coding (ALS) decoder.
cehoyos
parents:
diff changeset
895 count += div_blocks[b];
9b56cd1e37b7 Add MPEG-4 Audio Lossless Coding (ALS) decoder.
cehoyos
parents:
diff changeset
896
10523
af172182963b Fix a __warn_memset_zero_len gcc-4.4 warning.
alexc
parents: 10522
diff changeset
897 if (count)
10524
e5d7b184a5b0 Cosmetics: Re-indent
alexc
parents: 10523
diff changeset
898 memset(buf, 0, sizeof(*buf) * count);
10522
9b56cd1e37b7 Add MPEG-4 Audio Lossless Coding (ALS) decoder.
cehoyos
parents:
diff changeset
899 }
9b56cd1e37b7 Add MPEG-4 Audio Lossless Coding (ALS) decoder.
cehoyos
parents:
diff changeset
900
9b56cd1e37b7 Add MPEG-4 Audio Lossless Coding (ALS) decoder.
cehoyos
parents:
diff changeset
901
9b56cd1e37b7 Add MPEG-4 Audio Lossless Coding (ALS) decoder.
cehoyos
parents:
diff changeset
902 /** Decodes blocks independently.
9b56cd1e37b7 Add MPEG-4 Audio Lossless Coding (ALS) decoder.
cehoyos
parents:
diff changeset
903 */
9b56cd1e37b7 Add MPEG-4 Audio Lossless Coding (ALS) decoder.
cehoyos
parents:
diff changeset
904 static int decode_blocks_ind(ALSDecContext *ctx, unsigned int ra_frame,
9b56cd1e37b7 Add MPEG-4 Audio Lossless Coding (ALS) decoder.
cehoyos
parents:
diff changeset
905 unsigned int c, const unsigned int *div_blocks,
9b56cd1e37b7 Add MPEG-4 Audio Lossless Coding (ALS) decoder.
cehoyos
parents:
diff changeset
906 unsigned int *js_blocks)
9b56cd1e37b7 Add MPEG-4 Audio Lossless Coding (ALS) decoder.
cehoyos
parents:
diff changeset
907 {
9b56cd1e37b7 Add MPEG-4 Audio Lossless Coding (ALS) decoder.
cehoyos
parents:
diff changeset
908 unsigned int b;
10681
997692df50c1 Read and decode block data in separate functions to prepare support for
thilo.borgmann
parents: 10535
diff changeset
909 ALSBlockData bd;
997692df50c1 Read and decode block data in separate functions to prepare support for
thilo.borgmann
parents: 10535
diff changeset
910
997692df50c1 Read and decode block data in separate functions to prepare support for
thilo.borgmann
parents: 10535
diff changeset
911 memset(&bd, 0, sizeof(ALSBlockData));
997692df50c1 Read and decode block data in separate functions to prepare support for
thilo.borgmann
parents: 10535
diff changeset
912
997692df50c1 Read and decode block data in separate functions to prepare support for
thilo.borgmann
parents: 10535
diff changeset
913 bd.ra_block = ra_frame;
997692df50c1 Read and decode block data in separate functions to prepare support for
thilo.borgmann
parents: 10535
diff changeset
914 bd.use_ltp = ctx->use_ltp;
997692df50c1 Read and decode block data in separate functions to prepare support for
thilo.borgmann
parents: 10535
diff changeset
915 bd.ltp_lag = ctx->ltp_lag;
997692df50c1 Read and decode block data in separate functions to prepare support for
thilo.borgmann
parents: 10535
diff changeset
916 bd.ltp_gain = ctx->ltp_gain[0];
10802
4f614b69b4e5 Add multi-channel correlation support for ALS.
thilo.borgmann
parents: 10800
diff changeset
917 bd.quant_cof = ctx->quant_cof[0];
4f614b69b4e5 Add multi-channel correlation support for ALS.
thilo.borgmann
parents: 10800
diff changeset
918 bd.lpc_cof = ctx->lpc_cof[0];
10681
997692df50c1 Read and decode block data in separate functions to prepare support for
thilo.borgmann
parents: 10535
diff changeset
919 bd.prev_raw_samples = ctx->prev_raw_samples;
997692df50c1 Read and decode block data in separate functions to prepare support for
thilo.borgmann
parents: 10535
diff changeset
920 bd.raw_samples = ctx->raw_samples[c];
997692df50c1 Read and decode block data in separate functions to prepare support for
thilo.borgmann
parents: 10535
diff changeset
921
10522
9b56cd1e37b7 Add MPEG-4 Audio Lossless Coding (ALS) decoder.
cehoyos
parents:
diff changeset
922
9b56cd1e37b7 Add MPEG-4 Audio Lossless Coding (ALS) decoder.
cehoyos
parents:
diff changeset
923 for (b = 0; b < ctx->num_blocks; b++) {
10681
997692df50c1 Read and decode block data in separate functions to prepare support for
thilo.borgmann
parents: 10535
diff changeset
924 bd.shift_lsbs = 0;
997692df50c1 Read and decode block data in separate functions to prepare support for
thilo.borgmann
parents: 10535
diff changeset
925 bd.block_length = div_blocks[b];
997692df50c1 Read and decode block data in separate functions to prepare support for
thilo.borgmann
parents: 10535
diff changeset
926
997692df50c1 Read and decode block data in separate functions to prepare support for
thilo.borgmann
parents: 10535
diff changeset
927 if (read_decode_block(ctx, &bd)) {
10522
9b56cd1e37b7 Add MPEG-4 Audio Lossless Coding (ALS) decoder.
cehoyos
parents:
diff changeset
928 // damaged block, write zero for the rest of the frame
10681
997692df50c1 Read and decode block data in separate functions to prepare support for
thilo.borgmann
parents: 10535
diff changeset
929 zero_remaining(b, ctx->num_blocks, div_blocks, bd.raw_samples);
10522
9b56cd1e37b7 Add MPEG-4 Audio Lossless Coding (ALS) decoder.
cehoyos
parents:
diff changeset
930 return -1;
9b56cd1e37b7 Add MPEG-4 Audio Lossless Coding (ALS) decoder.
cehoyos
parents:
diff changeset
931 }
10681
997692df50c1 Read and decode block data in separate functions to prepare support for
thilo.borgmann
parents: 10535
diff changeset
932 bd.raw_samples += div_blocks[b];
997692df50c1 Read and decode block data in separate functions to prepare support for
thilo.borgmann
parents: 10535
diff changeset
933 bd.ra_block = 0;
10522
9b56cd1e37b7 Add MPEG-4 Audio Lossless Coding (ALS) decoder.
cehoyos
parents:
diff changeset
934 }
9b56cd1e37b7 Add MPEG-4 Audio Lossless Coding (ALS) decoder.
cehoyos
parents:
diff changeset
935
9b56cd1e37b7 Add MPEG-4 Audio Lossless Coding (ALS) decoder.
cehoyos
parents:
diff changeset
936 return 0;
9b56cd1e37b7 Add MPEG-4 Audio Lossless Coding (ALS) decoder.
cehoyos
parents:
diff changeset
937 }
9b56cd1e37b7 Add MPEG-4 Audio Lossless Coding (ALS) decoder.
cehoyos
parents:
diff changeset
938
9b56cd1e37b7 Add MPEG-4 Audio Lossless Coding (ALS) decoder.
cehoyos
parents:
diff changeset
939
9b56cd1e37b7 Add MPEG-4 Audio Lossless Coding (ALS) decoder.
cehoyos
parents:
diff changeset
940 /** Decodes blocks dependently.
9b56cd1e37b7 Add MPEG-4 Audio Lossless Coding (ALS) decoder.
cehoyos
parents:
diff changeset
941 */
9b56cd1e37b7 Add MPEG-4 Audio Lossless Coding (ALS) decoder.
cehoyos
parents:
diff changeset
942 static int decode_blocks(ALSDecContext *ctx, unsigned int ra_frame,
9b56cd1e37b7 Add MPEG-4 Audio Lossless Coding (ALS) decoder.
cehoyos
parents:
diff changeset
943 unsigned int c, const unsigned int *div_blocks,
9b56cd1e37b7 Add MPEG-4 Audio Lossless Coding (ALS) decoder.
cehoyos
parents:
diff changeset
944 unsigned int *js_blocks)
9b56cd1e37b7 Add MPEG-4 Audio Lossless Coding (ALS) decoder.
cehoyos
parents:
diff changeset
945 {
9b56cd1e37b7 Add MPEG-4 Audio Lossless Coding (ALS) decoder.
cehoyos
parents:
diff changeset
946 ALSSpecificConfig *sconf = &ctx->sconf;
9b56cd1e37b7 Add MPEG-4 Audio Lossless Coding (ALS) decoder.
cehoyos
parents:
diff changeset
947 unsigned int offset = 0;
9b56cd1e37b7 Add MPEG-4 Audio Lossless Coding (ALS) decoder.
cehoyos
parents:
diff changeset
948 unsigned int b;
10681
997692df50c1 Read and decode block data in separate functions to prepare support for
thilo.borgmann
parents: 10535
diff changeset
949 ALSBlockData bd[2];
997692df50c1 Read and decode block data in separate functions to prepare support for
thilo.borgmann
parents: 10535
diff changeset
950
997692df50c1 Read and decode block data in separate functions to prepare support for
thilo.borgmann
parents: 10535
diff changeset
951 memset(bd, 0, 2 * sizeof(ALSBlockData));
997692df50c1 Read and decode block data in separate functions to prepare support for
thilo.borgmann
parents: 10535
diff changeset
952
997692df50c1 Read and decode block data in separate functions to prepare support for
thilo.borgmann
parents: 10535
diff changeset
953 bd[0].ra_block = ra_frame;
997692df50c1 Read and decode block data in separate functions to prepare support for
thilo.borgmann
parents: 10535
diff changeset
954 bd[0].use_ltp = ctx->use_ltp;
997692df50c1 Read and decode block data in separate functions to prepare support for
thilo.borgmann
parents: 10535
diff changeset
955 bd[0].ltp_lag = ctx->ltp_lag;
997692df50c1 Read and decode block data in separate functions to prepare support for
thilo.borgmann
parents: 10535
diff changeset
956 bd[0].ltp_gain = ctx->ltp_gain[0];
10802
4f614b69b4e5 Add multi-channel correlation support for ALS.
thilo.borgmann
parents: 10800
diff changeset
957 bd[0].quant_cof = ctx->quant_cof[0];
4f614b69b4e5 Add multi-channel correlation support for ALS.
thilo.borgmann
parents: 10800
diff changeset
958 bd[0].lpc_cof = ctx->lpc_cof[0];
10681
997692df50c1 Read and decode block data in separate functions to prepare support for
thilo.borgmann
parents: 10535
diff changeset
959 bd[0].prev_raw_samples = ctx->prev_raw_samples;
997692df50c1 Read and decode block data in separate functions to prepare support for
thilo.borgmann
parents: 10535
diff changeset
960 bd[0].js_blocks = *js_blocks;
997692df50c1 Read and decode block data in separate functions to prepare support for
thilo.borgmann
parents: 10535
diff changeset
961
997692df50c1 Read and decode block data in separate functions to prepare support for
thilo.borgmann
parents: 10535
diff changeset
962 bd[1].ra_block = ra_frame;
997692df50c1 Read and decode block data in separate functions to prepare support for
thilo.borgmann
parents: 10535
diff changeset
963 bd[1].use_ltp = ctx->use_ltp;
997692df50c1 Read and decode block data in separate functions to prepare support for
thilo.borgmann
parents: 10535
diff changeset
964 bd[1].ltp_lag = ctx->ltp_lag;
997692df50c1 Read and decode block data in separate functions to prepare support for
thilo.borgmann
parents: 10535
diff changeset
965 bd[1].ltp_gain = ctx->ltp_gain[0];
10802
4f614b69b4e5 Add multi-channel correlation support for ALS.
thilo.borgmann
parents: 10800
diff changeset
966 bd[1].quant_cof = ctx->quant_cof[0];
4f614b69b4e5 Add multi-channel correlation support for ALS.
thilo.borgmann
parents: 10800
diff changeset
967 bd[1].lpc_cof = ctx->lpc_cof[0];
10681
997692df50c1 Read and decode block data in separate functions to prepare support for
thilo.borgmann
parents: 10535
diff changeset
968 bd[1].prev_raw_samples = ctx->prev_raw_samples;
997692df50c1 Read and decode block data in separate functions to prepare support for
thilo.borgmann
parents: 10535
diff changeset
969 bd[1].js_blocks = *(js_blocks + 1);
10522
9b56cd1e37b7 Add MPEG-4 Audio Lossless Coding (ALS) decoder.
cehoyos
parents:
diff changeset
970
9b56cd1e37b7 Add MPEG-4 Audio Lossless Coding (ALS) decoder.
cehoyos
parents:
diff changeset
971 // decode all blocks
9b56cd1e37b7 Add MPEG-4 Audio Lossless Coding (ALS) decoder.
cehoyos
parents:
diff changeset
972 for (b = 0; b < ctx->num_blocks; b++) {
9b56cd1e37b7 Add MPEG-4 Audio Lossless Coding (ALS) decoder.
cehoyos
parents:
diff changeset
973 unsigned int s;
10681
997692df50c1 Read and decode block data in separate functions to prepare support for
thilo.borgmann
parents: 10535
diff changeset
974
997692df50c1 Read and decode block data in separate functions to prepare support for
thilo.borgmann
parents: 10535
diff changeset
975 bd[0].shift_lsbs = 0;
997692df50c1 Read and decode block data in separate functions to prepare support for
thilo.borgmann
parents: 10535
diff changeset
976 bd[1].shift_lsbs = 0;
997692df50c1 Read and decode block data in separate functions to prepare support for
thilo.borgmann
parents: 10535
diff changeset
977
997692df50c1 Read and decode block data in separate functions to prepare support for
thilo.borgmann
parents: 10535
diff changeset
978 bd[0].block_length = div_blocks[b];
997692df50c1 Read and decode block data in separate functions to prepare support for
thilo.borgmann
parents: 10535
diff changeset
979 bd[1].block_length = div_blocks[b];
997692df50c1 Read and decode block data in separate functions to prepare support for
thilo.borgmann
parents: 10535
diff changeset
980
997692df50c1 Read and decode block data in separate functions to prepare support for
thilo.borgmann
parents: 10535
diff changeset
981 bd[0].raw_samples = ctx->raw_samples[c ] + offset;
997692df50c1 Read and decode block data in separate functions to prepare support for
thilo.borgmann
parents: 10535
diff changeset
982 bd[1].raw_samples = ctx->raw_samples[c + 1] + offset;
997692df50c1 Read and decode block data in separate functions to prepare support for
thilo.borgmann
parents: 10535
diff changeset
983
997692df50c1 Read and decode block data in separate functions to prepare support for
thilo.borgmann
parents: 10535
diff changeset
984 bd[0].raw_other = bd[1].raw_samples;
997692df50c1 Read and decode block data in separate functions to prepare support for
thilo.borgmann
parents: 10535
diff changeset
985 bd[1].raw_other = bd[0].raw_samples;
997692df50c1 Read and decode block data in separate functions to prepare support for
thilo.borgmann
parents: 10535
diff changeset
986
997692df50c1 Read and decode block data in separate functions to prepare support for
thilo.borgmann
parents: 10535
diff changeset
987 if(read_decode_block(ctx, &bd[0]) || read_decode_block(ctx, &bd[1])) {
10522
9b56cd1e37b7 Add MPEG-4 Audio Lossless Coding (ALS) decoder.
cehoyos
parents:
diff changeset
988 // damaged block, write zero for the rest of the frame
10681
997692df50c1 Read and decode block data in separate functions to prepare support for
thilo.borgmann
parents: 10535
diff changeset
989 zero_remaining(b, ctx->num_blocks, div_blocks, bd[0].raw_samples);
997692df50c1 Read and decode block data in separate functions to prepare support for
thilo.borgmann
parents: 10535
diff changeset
990 zero_remaining(b, ctx->num_blocks, div_blocks, bd[1].raw_samples);
10522
9b56cd1e37b7 Add MPEG-4 Audio Lossless Coding (ALS) decoder.
cehoyos
parents:
diff changeset
991 return -1;
9b56cd1e37b7 Add MPEG-4 Audio Lossless Coding (ALS) decoder.
cehoyos
parents:
diff changeset
992 }
9b56cd1e37b7 Add MPEG-4 Audio Lossless Coding (ALS) decoder.
cehoyos
parents:
diff changeset
993
9b56cd1e37b7 Add MPEG-4 Audio Lossless Coding (ALS) decoder.
cehoyos
parents:
diff changeset
994 // reconstruct joint-stereo blocks
10681
997692df50c1 Read and decode block data in separate functions to prepare support for
thilo.borgmann
parents: 10535
diff changeset
995 if (bd[0].js_blocks) {
997692df50c1 Read and decode block data in separate functions to prepare support for
thilo.borgmann
parents: 10535
diff changeset
996 if (bd[1].js_blocks)
10522
9b56cd1e37b7 Add MPEG-4 Audio Lossless Coding (ALS) decoder.
cehoyos
parents:
diff changeset
997 av_log(ctx->avctx, AV_LOG_WARNING, "Invalid channel pair!\n");
9b56cd1e37b7 Add MPEG-4 Audio Lossless Coding (ALS) decoder.
cehoyos
parents:
diff changeset
998
9b56cd1e37b7 Add MPEG-4 Audio Lossless Coding (ALS) decoder.
cehoyos
parents:
diff changeset
999 for (s = 0; s < div_blocks[b]; s++)
10681
997692df50c1 Read and decode block data in separate functions to prepare support for
thilo.borgmann
parents: 10535
diff changeset
1000 bd[0].raw_samples[s] = bd[1].raw_samples[s] - bd[0].raw_samples[s];
997692df50c1 Read and decode block data in separate functions to prepare support for
thilo.borgmann
parents: 10535
diff changeset
1001 } else if (bd[1].js_blocks) {
10522
9b56cd1e37b7 Add MPEG-4 Audio Lossless Coding (ALS) decoder.
cehoyos
parents:
diff changeset
1002 for (s = 0; s < div_blocks[b]; s++)
10681
997692df50c1 Read and decode block data in separate functions to prepare support for
thilo.borgmann
parents: 10535
diff changeset
1003 bd[1].raw_samples[s] = bd[1].raw_samples[s] + bd[0].raw_samples[s];
10522
9b56cd1e37b7 Add MPEG-4 Audio Lossless Coding (ALS) decoder.
cehoyos
parents:
diff changeset
1004 }
9b56cd1e37b7 Add MPEG-4 Audio Lossless Coding (ALS) decoder.
cehoyos
parents:
diff changeset
1005
9b56cd1e37b7 Add MPEG-4 Audio Lossless Coding (ALS) decoder.
cehoyos
parents:
diff changeset
1006 offset += div_blocks[b];
10681
997692df50c1 Read and decode block data in separate functions to prepare support for
thilo.borgmann
parents: 10535
diff changeset
1007 bd[0].ra_block = 0;
997692df50c1 Read and decode block data in separate functions to prepare support for
thilo.borgmann
parents: 10535
diff changeset
1008 bd[1].ra_block = 0;
10522
9b56cd1e37b7 Add MPEG-4 Audio Lossless Coding (ALS) decoder.
cehoyos
parents:
diff changeset
1009 }
9b56cd1e37b7 Add MPEG-4 Audio Lossless Coding (ALS) decoder.
cehoyos
parents:
diff changeset
1010
9b56cd1e37b7 Add MPEG-4 Audio Lossless Coding (ALS) decoder.
cehoyos
parents:
diff changeset
1011 // store carryover raw samples,
9b56cd1e37b7 Add MPEG-4 Audio Lossless Coding (ALS) decoder.
cehoyos
parents:
diff changeset
1012 // the others channel raw samples are stored by the calling function.
9b56cd1e37b7 Add MPEG-4 Audio Lossless Coding (ALS) decoder.
cehoyos
parents:
diff changeset
1013 memmove(ctx->raw_samples[c] - sconf->max_order,
9b56cd1e37b7 Add MPEG-4 Audio Lossless Coding (ALS) decoder.
cehoyos
parents:
diff changeset
1014 ctx->raw_samples[c] - sconf->max_order + sconf->frame_length,
9b56cd1e37b7 Add MPEG-4 Audio Lossless Coding (ALS) decoder.
cehoyos
parents:
diff changeset
1015 sizeof(*ctx->raw_samples[c]) * sconf->max_order);
9b56cd1e37b7 Add MPEG-4 Audio Lossless Coding (ALS) decoder.
cehoyos
parents:
diff changeset
1016
9b56cd1e37b7 Add MPEG-4 Audio Lossless Coding (ALS) decoder.
cehoyos
parents:
diff changeset
1017 return 0;
9b56cd1e37b7 Add MPEG-4 Audio Lossless Coding (ALS) decoder.
cehoyos
parents:
diff changeset
1018 }
9b56cd1e37b7 Add MPEG-4 Audio Lossless Coding (ALS) decoder.
cehoyos
parents:
diff changeset
1019
9b56cd1e37b7 Add MPEG-4 Audio Lossless Coding (ALS) decoder.
cehoyos
parents:
diff changeset
1020
10802
4f614b69b4e5 Add multi-channel correlation support for ALS.
thilo.borgmann
parents: 10800
diff changeset
1021 /** Reads the channel data.
4f614b69b4e5 Add multi-channel correlation support for ALS.
thilo.borgmann
parents: 10800
diff changeset
1022 */
4f614b69b4e5 Add multi-channel correlation support for ALS.
thilo.borgmann
parents: 10800
diff changeset
1023 static int read_channel_data(ALSDecContext *ctx, ALSChannelData *cd, int c)
4f614b69b4e5 Add multi-channel correlation support for ALS.
thilo.borgmann
parents: 10800
diff changeset
1024 {
4f614b69b4e5 Add multi-channel correlation support for ALS.
thilo.borgmann
parents: 10800
diff changeset
1025 GetBitContext *gb = &ctx->gb;
4f614b69b4e5 Add multi-channel correlation support for ALS.
thilo.borgmann
parents: 10800
diff changeset
1026 ALSChannelData *current = cd;
4f614b69b4e5 Add multi-channel correlation support for ALS.
thilo.borgmann
parents: 10800
diff changeset
1027 unsigned int channels = ctx->avctx->channels;
4f614b69b4e5 Add multi-channel correlation support for ALS.
thilo.borgmann
parents: 10800
diff changeset
1028 int entries = 0;
4f614b69b4e5 Add multi-channel correlation support for ALS.
thilo.borgmann
parents: 10800
diff changeset
1029
4f614b69b4e5 Add multi-channel correlation support for ALS.
thilo.borgmann
parents: 10800
diff changeset
1030 while (entries < channels && !(current->stop_flag = get_bits1(gb))) {
4f614b69b4e5 Add multi-channel correlation support for ALS.
thilo.borgmann
parents: 10800
diff changeset
1031 current->master_channel = get_bits_long(gb, av_ceil_log2(channels));
4f614b69b4e5 Add multi-channel correlation support for ALS.
thilo.borgmann
parents: 10800
diff changeset
1032
4f614b69b4e5 Add multi-channel correlation support for ALS.
thilo.borgmann
parents: 10800
diff changeset
1033 if (current->master_channel >= channels) {
4f614b69b4e5 Add multi-channel correlation support for ALS.
thilo.borgmann
parents: 10800
diff changeset
1034 av_log(ctx->avctx, AV_LOG_ERROR, "Invalid master channel!\n");
4f614b69b4e5 Add multi-channel correlation support for ALS.
thilo.borgmann
parents: 10800
diff changeset
1035 return -1;
4f614b69b4e5 Add multi-channel correlation support for ALS.
thilo.borgmann
parents: 10800
diff changeset
1036 }
4f614b69b4e5 Add multi-channel correlation support for ALS.
thilo.borgmann
parents: 10800
diff changeset
1037
4f614b69b4e5 Add multi-channel correlation support for ALS.
thilo.borgmann
parents: 10800
diff changeset
1038 if (current->master_channel != c) {
4f614b69b4e5 Add multi-channel correlation support for ALS.
thilo.borgmann
parents: 10800
diff changeset
1039 current->time_diff_flag = get_bits1(gb);
4f614b69b4e5 Add multi-channel correlation support for ALS.
thilo.borgmann
parents: 10800
diff changeset
1040 current->weighting[0] = mcc_weightings[av_clip(decode_rice(gb, 1) + 16, 0, 32)];
4f614b69b4e5 Add multi-channel correlation support for ALS.
thilo.borgmann
parents: 10800
diff changeset
1041 current->weighting[1] = mcc_weightings[av_clip(decode_rice(gb, 2) + 14, 0, 32)];
4f614b69b4e5 Add multi-channel correlation support for ALS.
thilo.borgmann
parents: 10800
diff changeset
1042 current->weighting[2] = mcc_weightings[av_clip(decode_rice(gb, 1) + 16, 0, 32)];
4f614b69b4e5 Add multi-channel correlation support for ALS.
thilo.borgmann
parents: 10800
diff changeset
1043
4f614b69b4e5 Add multi-channel correlation support for ALS.
thilo.borgmann
parents: 10800
diff changeset
1044 if (current->time_diff_flag) {
4f614b69b4e5 Add multi-channel correlation support for ALS.
thilo.borgmann
parents: 10800
diff changeset
1045 current->weighting[3] = mcc_weightings[av_clip(decode_rice(gb, 1) + 16, 0, 32)];
4f614b69b4e5 Add multi-channel correlation support for ALS.
thilo.borgmann
parents: 10800
diff changeset
1046 current->weighting[4] = mcc_weightings[av_clip(decode_rice(gb, 1) + 16, 0, 32)];
4f614b69b4e5 Add multi-channel correlation support for ALS.
thilo.borgmann
parents: 10800
diff changeset
1047 current->weighting[5] = mcc_weightings[av_clip(decode_rice(gb, 1) + 16, 0, 32)];
4f614b69b4e5 Add multi-channel correlation support for ALS.
thilo.borgmann
parents: 10800
diff changeset
1048
4f614b69b4e5 Add multi-channel correlation support for ALS.
thilo.borgmann
parents: 10800
diff changeset
1049 current->time_diff_sign = get_bits1(gb);
4f614b69b4e5 Add multi-channel correlation support for ALS.
thilo.borgmann
parents: 10800
diff changeset
1050 current->time_diff_index = get_bits(gb, ctx->ltp_lag_length - 3) + 3;
4f614b69b4e5 Add multi-channel correlation support for ALS.
thilo.borgmann
parents: 10800
diff changeset
1051 }
4f614b69b4e5 Add multi-channel correlation support for ALS.
thilo.borgmann
parents: 10800
diff changeset
1052 }
4f614b69b4e5 Add multi-channel correlation support for ALS.
thilo.borgmann
parents: 10800
diff changeset
1053
4f614b69b4e5 Add multi-channel correlation support for ALS.
thilo.borgmann
parents: 10800
diff changeset
1054 current++;
4f614b69b4e5 Add multi-channel correlation support for ALS.
thilo.borgmann
parents: 10800
diff changeset
1055 entries++;
4f614b69b4e5 Add multi-channel correlation support for ALS.
thilo.borgmann
parents: 10800
diff changeset
1056 }
4f614b69b4e5 Add multi-channel correlation support for ALS.
thilo.borgmann
parents: 10800
diff changeset
1057
4f614b69b4e5 Add multi-channel correlation support for ALS.
thilo.borgmann
parents: 10800
diff changeset
1058 if (entries == channels) {
4f614b69b4e5 Add multi-channel correlation support for ALS.
thilo.borgmann
parents: 10800
diff changeset
1059 av_log(ctx->avctx, AV_LOG_ERROR, "Damaged channel data!\n");
4f614b69b4e5 Add multi-channel correlation support for ALS.
thilo.borgmann
parents: 10800
diff changeset
1060 return -1;
4f614b69b4e5 Add multi-channel correlation support for ALS.
thilo.borgmann
parents: 10800
diff changeset
1061 }
4f614b69b4e5 Add multi-channel correlation support for ALS.
thilo.borgmann
parents: 10800
diff changeset
1062
4f614b69b4e5 Add multi-channel correlation support for ALS.
thilo.borgmann
parents: 10800
diff changeset
1063 align_get_bits(gb);
4f614b69b4e5 Add multi-channel correlation support for ALS.
thilo.borgmann
parents: 10800
diff changeset
1064 return 0;
4f614b69b4e5 Add multi-channel correlation support for ALS.
thilo.borgmann
parents: 10800
diff changeset
1065 }
4f614b69b4e5 Add multi-channel correlation support for ALS.
thilo.borgmann
parents: 10800
diff changeset
1066
4f614b69b4e5 Add multi-channel correlation support for ALS.
thilo.borgmann
parents: 10800
diff changeset
1067
4f614b69b4e5 Add multi-channel correlation support for ALS.
thilo.borgmann
parents: 10800
diff changeset
1068 /** Recursively reverts the inter-channel correlation for a block.
4f614b69b4e5 Add multi-channel correlation support for ALS.
thilo.borgmann
parents: 10800
diff changeset
1069 */
4f614b69b4e5 Add multi-channel correlation support for ALS.
thilo.borgmann
parents: 10800
diff changeset
1070 static int revert_channel_correlation(ALSDecContext *ctx, ALSBlockData *bd,
4f614b69b4e5 Add multi-channel correlation support for ALS.
thilo.borgmann
parents: 10800
diff changeset
1071 ALSChannelData **cd, int *reverted,
4f614b69b4e5 Add multi-channel correlation support for ALS.
thilo.borgmann
parents: 10800
diff changeset
1072 unsigned int offset, int c)
4f614b69b4e5 Add multi-channel correlation support for ALS.
thilo.borgmann
parents: 10800
diff changeset
1073 {
4f614b69b4e5 Add multi-channel correlation support for ALS.
thilo.borgmann
parents: 10800
diff changeset
1074 ALSChannelData *ch = cd[c];
4f614b69b4e5 Add multi-channel correlation support for ALS.
thilo.borgmann
parents: 10800
diff changeset
1075 unsigned int dep = 0;
4f614b69b4e5 Add multi-channel correlation support for ALS.
thilo.borgmann
parents: 10800
diff changeset
1076 unsigned int channels = ctx->avctx->channels;
4f614b69b4e5 Add multi-channel correlation support for ALS.
thilo.borgmann
parents: 10800
diff changeset
1077
4f614b69b4e5 Add multi-channel correlation support for ALS.
thilo.borgmann
parents: 10800
diff changeset
1078 if (reverted[c])
4f614b69b4e5 Add multi-channel correlation support for ALS.
thilo.borgmann
parents: 10800
diff changeset
1079 return 0;
4f614b69b4e5 Add multi-channel correlation support for ALS.
thilo.borgmann
parents: 10800
diff changeset
1080
4f614b69b4e5 Add multi-channel correlation support for ALS.
thilo.borgmann
parents: 10800
diff changeset
1081 reverted[c] = 1;
4f614b69b4e5 Add multi-channel correlation support for ALS.
thilo.borgmann
parents: 10800
diff changeset
1082
4f614b69b4e5 Add multi-channel correlation support for ALS.
thilo.borgmann
parents: 10800
diff changeset
1083 while (dep < channels && !ch[dep].stop_flag) {
4f614b69b4e5 Add multi-channel correlation support for ALS.
thilo.borgmann
parents: 10800
diff changeset
1084 revert_channel_correlation(ctx, bd, cd, reverted, offset,
4f614b69b4e5 Add multi-channel correlation support for ALS.
thilo.borgmann
parents: 10800
diff changeset
1085 ch[dep].master_channel);
4f614b69b4e5 Add multi-channel correlation support for ALS.
thilo.borgmann
parents: 10800
diff changeset
1086
4f614b69b4e5 Add multi-channel correlation support for ALS.
thilo.borgmann
parents: 10800
diff changeset
1087 dep++;
4f614b69b4e5 Add multi-channel correlation support for ALS.
thilo.borgmann
parents: 10800
diff changeset
1088 }
4f614b69b4e5 Add multi-channel correlation support for ALS.
thilo.borgmann
parents: 10800
diff changeset
1089
4f614b69b4e5 Add multi-channel correlation support for ALS.
thilo.borgmann
parents: 10800
diff changeset
1090 if (dep == channels) {
4f614b69b4e5 Add multi-channel correlation support for ALS.
thilo.borgmann
parents: 10800
diff changeset
1091 av_log(ctx->avctx, AV_LOG_WARNING, "Invalid channel correlation!\n");
4f614b69b4e5 Add multi-channel correlation support for ALS.
thilo.borgmann
parents: 10800
diff changeset
1092 return -1;
4f614b69b4e5 Add multi-channel correlation support for ALS.
thilo.borgmann
parents: 10800
diff changeset
1093 }
4f614b69b4e5 Add multi-channel correlation support for ALS.
thilo.borgmann
parents: 10800
diff changeset
1094
4f614b69b4e5 Add multi-channel correlation support for ALS.
thilo.borgmann
parents: 10800
diff changeset
1095 bd->use_ltp = ctx->use_ltp + c;
4f614b69b4e5 Add multi-channel correlation support for ALS.
thilo.borgmann
parents: 10800
diff changeset
1096 bd->ltp_lag = ctx->ltp_lag + c;
4f614b69b4e5 Add multi-channel correlation support for ALS.
thilo.borgmann
parents: 10800
diff changeset
1097 bd->ltp_gain = ctx->ltp_gain[c];
4f614b69b4e5 Add multi-channel correlation support for ALS.
thilo.borgmann
parents: 10800
diff changeset
1098 bd->lpc_cof = ctx->lpc_cof[c];
4f614b69b4e5 Add multi-channel correlation support for ALS.
thilo.borgmann
parents: 10800
diff changeset
1099 bd->quant_cof = ctx->quant_cof[c];
4f614b69b4e5 Add multi-channel correlation support for ALS.
thilo.borgmann
parents: 10800
diff changeset
1100 bd->raw_samples = ctx->raw_samples[c] + offset;
4f614b69b4e5 Add multi-channel correlation support for ALS.
thilo.borgmann
parents: 10800
diff changeset
1101
4f614b69b4e5 Add multi-channel correlation support for ALS.
thilo.borgmann
parents: 10800
diff changeset
1102 dep = 0;
4f614b69b4e5 Add multi-channel correlation support for ALS.
thilo.borgmann
parents: 10800
diff changeset
1103 while (!ch[dep].stop_flag) {
4f614b69b4e5 Add multi-channel correlation support for ALS.
thilo.borgmann
parents: 10800
diff changeset
1104 unsigned int smp;
4f614b69b4e5 Add multi-channel correlation support for ALS.
thilo.borgmann
parents: 10800
diff changeset
1105 unsigned int begin = 1;
4f614b69b4e5 Add multi-channel correlation support for ALS.
thilo.borgmann
parents: 10800
diff changeset
1106 unsigned int end = bd->block_length - 1;
4f614b69b4e5 Add multi-channel correlation support for ALS.
thilo.borgmann
parents: 10800
diff changeset
1107 int64_t y;
4f614b69b4e5 Add multi-channel correlation support for ALS.
thilo.borgmann
parents: 10800
diff changeset
1108 int32_t *master = ctx->raw_samples[ch[dep].master_channel] + offset;
4f614b69b4e5 Add multi-channel correlation support for ALS.
thilo.borgmann
parents: 10800
diff changeset
1109
4f614b69b4e5 Add multi-channel correlation support for ALS.
thilo.borgmann
parents: 10800
diff changeset
1110 if (ch[dep].time_diff_flag) {
4f614b69b4e5 Add multi-channel correlation support for ALS.
thilo.borgmann
parents: 10800
diff changeset
1111 int t = ch[dep].time_diff_index;
4f614b69b4e5 Add multi-channel correlation support for ALS.
thilo.borgmann
parents: 10800
diff changeset
1112
4f614b69b4e5 Add multi-channel correlation support for ALS.
thilo.borgmann
parents: 10800
diff changeset
1113 if (ch[dep].time_diff_sign) {
4f614b69b4e5 Add multi-channel correlation support for ALS.
thilo.borgmann
parents: 10800
diff changeset
1114 t = -t;
4f614b69b4e5 Add multi-channel correlation support for ALS.
thilo.borgmann
parents: 10800
diff changeset
1115 begin -= t;
4f614b69b4e5 Add multi-channel correlation support for ALS.
thilo.borgmann
parents: 10800
diff changeset
1116 } else {
4f614b69b4e5 Add multi-channel correlation support for ALS.
thilo.borgmann
parents: 10800
diff changeset
1117 end -= t;
4f614b69b4e5 Add multi-channel correlation support for ALS.
thilo.borgmann
parents: 10800
diff changeset
1118 }
4f614b69b4e5 Add multi-channel correlation support for ALS.
thilo.borgmann
parents: 10800
diff changeset
1119
4f614b69b4e5 Add multi-channel correlation support for ALS.
thilo.borgmann
parents: 10800
diff changeset
1120 for (smp = begin; smp < end; smp++) {
4f614b69b4e5 Add multi-channel correlation support for ALS.
thilo.borgmann
parents: 10800
diff changeset
1121 y = (1 << 6) +
4f614b69b4e5 Add multi-channel correlation support for ALS.
thilo.borgmann
parents: 10800
diff changeset
1122 MUL64(ch[dep].weighting[0], master[smp - 1 ]) +
4f614b69b4e5 Add multi-channel correlation support for ALS.
thilo.borgmann
parents: 10800
diff changeset
1123 MUL64(ch[dep].weighting[1], master[smp ]) +
4f614b69b4e5 Add multi-channel correlation support for ALS.
thilo.borgmann
parents: 10800
diff changeset
1124 MUL64(ch[dep].weighting[2], master[smp + 1 ]) +
4f614b69b4e5 Add multi-channel correlation support for ALS.
thilo.borgmann
parents: 10800
diff changeset
1125 MUL64(ch[dep].weighting[3], master[smp - 1 + t]) +
4f614b69b4e5 Add multi-channel correlation support for ALS.
thilo.borgmann
parents: 10800
diff changeset
1126 MUL64(ch[dep].weighting[4], master[smp + t]) +
4f614b69b4e5 Add multi-channel correlation support for ALS.
thilo.borgmann
parents: 10800
diff changeset
1127 MUL64(ch[dep].weighting[5], master[smp + 1 + t]);
4f614b69b4e5 Add multi-channel correlation support for ALS.
thilo.borgmann
parents: 10800
diff changeset
1128
4f614b69b4e5 Add multi-channel correlation support for ALS.
thilo.borgmann
parents: 10800
diff changeset
1129 bd->raw_samples[smp] += y >> 7;
4f614b69b4e5 Add multi-channel correlation support for ALS.
thilo.borgmann
parents: 10800
diff changeset
1130 }
4f614b69b4e5 Add multi-channel correlation support for ALS.
thilo.borgmann
parents: 10800
diff changeset
1131 } else {
4f614b69b4e5 Add multi-channel correlation support for ALS.
thilo.borgmann
parents: 10800
diff changeset
1132 for (smp = begin; smp < end; smp++) {
4f614b69b4e5 Add multi-channel correlation support for ALS.
thilo.borgmann
parents: 10800
diff changeset
1133 y = (1 << 6) +
4f614b69b4e5 Add multi-channel correlation support for ALS.
thilo.borgmann
parents: 10800
diff changeset
1134 MUL64(ch[dep].weighting[0], master[smp - 1]) +
4f614b69b4e5 Add multi-channel correlation support for ALS.
thilo.borgmann
parents: 10800
diff changeset
1135 MUL64(ch[dep].weighting[1], master[smp ]) +
4f614b69b4e5 Add multi-channel correlation support for ALS.
thilo.borgmann
parents: 10800
diff changeset
1136 MUL64(ch[dep].weighting[2], master[smp + 1]);
4f614b69b4e5 Add multi-channel correlation support for ALS.
thilo.borgmann
parents: 10800
diff changeset
1137
4f614b69b4e5 Add multi-channel correlation support for ALS.
thilo.borgmann
parents: 10800
diff changeset
1138 bd->raw_samples[smp] += y >> 7;
4f614b69b4e5 Add multi-channel correlation support for ALS.
thilo.borgmann
parents: 10800
diff changeset
1139 }
4f614b69b4e5 Add multi-channel correlation support for ALS.
thilo.borgmann
parents: 10800
diff changeset
1140 }
4f614b69b4e5 Add multi-channel correlation support for ALS.
thilo.borgmann
parents: 10800
diff changeset
1141
4f614b69b4e5 Add multi-channel correlation support for ALS.
thilo.borgmann
parents: 10800
diff changeset
1142 dep++;
4f614b69b4e5 Add multi-channel correlation support for ALS.
thilo.borgmann
parents: 10800
diff changeset
1143 }
4f614b69b4e5 Add multi-channel correlation support for ALS.
thilo.borgmann
parents: 10800
diff changeset
1144
4f614b69b4e5 Add multi-channel correlation support for ALS.
thilo.borgmann
parents: 10800
diff changeset
1145 return 0;
4f614b69b4e5 Add multi-channel correlation support for ALS.
thilo.borgmann
parents: 10800
diff changeset
1146 }
4f614b69b4e5 Add multi-channel correlation support for ALS.
thilo.borgmann
parents: 10800
diff changeset
1147
4f614b69b4e5 Add multi-channel correlation support for ALS.
thilo.borgmann
parents: 10800
diff changeset
1148
10522
9b56cd1e37b7 Add MPEG-4 Audio Lossless Coding (ALS) decoder.
cehoyos
parents:
diff changeset
1149 /** Reads the frame data.
9b56cd1e37b7 Add MPEG-4 Audio Lossless Coding (ALS) decoder.
cehoyos
parents:
diff changeset
1150 */
9b56cd1e37b7 Add MPEG-4 Audio Lossless Coding (ALS) decoder.
cehoyos
parents:
diff changeset
1151 static int read_frame_data(ALSDecContext *ctx, unsigned int ra_frame)
9b56cd1e37b7 Add MPEG-4 Audio Lossless Coding (ALS) decoder.
cehoyos
parents:
diff changeset
1152 {
9b56cd1e37b7 Add MPEG-4 Audio Lossless Coding (ALS) decoder.
cehoyos
parents:
diff changeset
1153 ALSSpecificConfig *sconf = &ctx->sconf;
9b56cd1e37b7 Add MPEG-4 Audio Lossless Coding (ALS) decoder.
cehoyos
parents:
diff changeset
1154 AVCodecContext *avctx = ctx->avctx;
9b56cd1e37b7 Add MPEG-4 Audio Lossless Coding (ALS) decoder.
cehoyos
parents:
diff changeset
1155 GetBitContext *gb = &ctx->gb;
9b56cd1e37b7 Add MPEG-4 Audio Lossless Coding (ALS) decoder.
cehoyos
parents:
diff changeset
1156 unsigned int div_blocks[32]; ///< block sizes.
9b56cd1e37b7 Add MPEG-4 Audio Lossless Coding (ALS) decoder.
cehoyos
parents:
diff changeset
1157 unsigned int c;
9b56cd1e37b7 Add MPEG-4 Audio Lossless Coding (ALS) decoder.
cehoyos
parents:
diff changeset
1158 unsigned int js_blocks[2];
9b56cd1e37b7 Add MPEG-4 Audio Lossless Coding (ALS) decoder.
cehoyos
parents:
diff changeset
1159
9b56cd1e37b7 Add MPEG-4 Audio Lossless Coding (ALS) decoder.
cehoyos
parents:
diff changeset
1160 uint32_t bs_info = 0;
9b56cd1e37b7 Add MPEG-4 Audio Lossless Coding (ALS) decoder.
cehoyos
parents:
diff changeset
1161
9b56cd1e37b7 Add MPEG-4 Audio Lossless Coding (ALS) decoder.
cehoyos
parents:
diff changeset
1162 // skip the size of the ra unit if present in the frame
9b56cd1e37b7 Add MPEG-4 Audio Lossless Coding (ALS) decoder.
cehoyos
parents:
diff changeset
1163 if (sconf->ra_flag == RA_FLAG_FRAMES && ra_frame)
9b56cd1e37b7 Add MPEG-4 Audio Lossless Coding (ALS) decoder.
cehoyos
parents:
diff changeset
1164 skip_bits_long(gb, 32);
9b56cd1e37b7 Add MPEG-4 Audio Lossless Coding (ALS) decoder.
cehoyos
parents:
diff changeset
1165
9b56cd1e37b7 Add MPEG-4 Audio Lossless Coding (ALS) decoder.
cehoyos
parents:
diff changeset
1166 if (sconf->mc_coding && sconf->joint_stereo) {
9b56cd1e37b7 Add MPEG-4 Audio Lossless Coding (ALS) decoder.
cehoyos
parents:
diff changeset
1167 ctx->js_switch = get_bits1(gb);
9b56cd1e37b7 Add MPEG-4 Audio Lossless Coding (ALS) decoder.
cehoyos
parents:
diff changeset
1168 align_get_bits(gb);
9b56cd1e37b7 Add MPEG-4 Audio Lossless Coding (ALS) decoder.
cehoyos
parents:
diff changeset
1169 }
9b56cd1e37b7 Add MPEG-4 Audio Lossless Coding (ALS) decoder.
cehoyos
parents:
diff changeset
1170
9b56cd1e37b7 Add MPEG-4 Audio Lossless Coding (ALS) decoder.
cehoyos
parents:
diff changeset
1171 if (!sconf->mc_coding || ctx->js_switch) {
9b56cd1e37b7 Add MPEG-4 Audio Lossless Coding (ALS) decoder.
cehoyos
parents:
diff changeset
1172 int independent_bs = !sconf->joint_stereo;
9b56cd1e37b7 Add MPEG-4 Audio Lossless Coding (ALS) decoder.
cehoyos
parents:
diff changeset
1173
9b56cd1e37b7 Add MPEG-4 Audio Lossless Coding (ALS) decoder.
cehoyos
parents:
diff changeset
1174 for (c = 0; c < avctx->channels; c++) {
9b56cd1e37b7 Add MPEG-4 Audio Lossless Coding (ALS) decoder.
cehoyos
parents:
diff changeset
1175 js_blocks[0] = 0;
9b56cd1e37b7 Add MPEG-4 Audio Lossless Coding (ALS) decoder.
cehoyos
parents:
diff changeset
1176 js_blocks[1] = 0;
9b56cd1e37b7 Add MPEG-4 Audio Lossless Coding (ALS) decoder.
cehoyos
parents:
diff changeset
1177
9b56cd1e37b7 Add MPEG-4 Audio Lossless Coding (ALS) decoder.
cehoyos
parents:
diff changeset
1178 get_block_sizes(ctx, div_blocks, &bs_info);
9b56cd1e37b7 Add MPEG-4 Audio Lossless Coding (ALS) decoder.
cehoyos
parents:
diff changeset
1179
9b56cd1e37b7 Add MPEG-4 Audio Lossless Coding (ALS) decoder.
cehoyos
parents:
diff changeset
1180 // if joint_stereo and block_switching is set, independent decoding
9b56cd1e37b7 Add MPEG-4 Audio Lossless Coding (ALS) decoder.
cehoyos
parents:
diff changeset
1181 // is signaled via the first bit of bs_info
9b56cd1e37b7 Add MPEG-4 Audio Lossless Coding (ALS) decoder.
cehoyos
parents:
diff changeset
1182 if (sconf->joint_stereo && sconf->block_switching)
9b56cd1e37b7 Add MPEG-4 Audio Lossless Coding (ALS) decoder.
cehoyos
parents:
diff changeset
1183 if (bs_info >> 31)
9b56cd1e37b7 Add MPEG-4 Audio Lossless Coding (ALS) decoder.
cehoyos
parents:
diff changeset
1184 independent_bs = 2;
9b56cd1e37b7 Add MPEG-4 Audio Lossless Coding (ALS) decoder.
cehoyos
parents:
diff changeset
1185
9b56cd1e37b7 Add MPEG-4 Audio Lossless Coding (ALS) decoder.
cehoyos
parents:
diff changeset
1186 // if this is the last channel, it has to be decoded independently
9b56cd1e37b7 Add MPEG-4 Audio Lossless Coding (ALS) decoder.
cehoyos
parents:
diff changeset
1187 if (c == avctx->channels - 1)
9b56cd1e37b7 Add MPEG-4 Audio Lossless Coding (ALS) decoder.
cehoyos
parents:
diff changeset
1188 independent_bs = 1;
9b56cd1e37b7 Add MPEG-4 Audio Lossless Coding (ALS) decoder.
cehoyos
parents:
diff changeset
1189
9b56cd1e37b7 Add MPEG-4 Audio Lossless Coding (ALS) decoder.
cehoyos
parents:
diff changeset
1190 if (independent_bs) {
9b56cd1e37b7 Add MPEG-4 Audio Lossless Coding (ALS) decoder.
cehoyos
parents:
diff changeset
1191 if (decode_blocks_ind(ctx, ra_frame, c, div_blocks, js_blocks))
9b56cd1e37b7 Add MPEG-4 Audio Lossless Coding (ALS) decoder.
cehoyos
parents:
diff changeset
1192 return -1;
9b56cd1e37b7 Add MPEG-4 Audio Lossless Coding (ALS) decoder.
cehoyos
parents:
diff changeset
1193
9b56cd1e37b7 Add MPEG-4 Audio Lossless Coding (ALS) decoder.
cehoyos
parents:
diff changeset
1194 independent_bs--;
9b56cd1e37b7 Add MPEG-4 Audio Lossless Coding (ALS) decoder.
cehoyos
parents:
diff changeset
1195 } else {
9b56cd1e37b7 Add MPEG-4 Audio Lossless Coding (ALS) decoder.
cehoyos
parents:
diff changeset
1196 if (decode_blocks(ctx, ra_frame, c, div_blocks, js_blocks))
9b56cd1e37b7 Add MPEG-4 Audio Lossless Coding (ALS) decoder.
cehoyos
parents:
diff changeset
1197 return -1;
9b56cd1e37b7 Add MPEG-4 Audio Lossless Coding (ALS) decoder.
cehoyos
parents:
diff changeset
1198
9b56cd1e37b7 Add MPEG-4 Audio Lossless Coding (ALS) decoder.
cehoyos
parents:
diff changeset
1199 c++;
9b56cd1e37b7 Add MPEG-4 Audio Lossless Coding (ALS) decoder.
cehoyos
parents:
diff changeset
1200 }
9b56cd1e37b7 Add MPEG-4 Audio Lossless Coding (ALS) decoder.
cehoyos
parents:
diff changeset
1201
9b56cd1e37b7 Add MPEG-4 Audio Lossless Coding (ALS) decoder.
cehoyos
parents:
diff changeset
1202 // store carryover raw samples
9b56cd1e37b7 Add MPEG-4 Audio Lossless Coding (ALS) decoder.
cehoyos
parents:
diff changeset
1203 memmove(ctx->raw_samples[c] - sconf->max_order,
9b56cd1e37b7 Add MPEG-4 Audio Lossless Coding (ALS) decoder.
cehoyos
parents:
diff changeset
1204 ctx->raw_samples[c] - sconf->max_order + sconf->frame_length,
9b56cd1e37b7 Add MPEG-4 Audio Lossless Coding (ALS) decoder.
cehoyos
parents:
diff changeset
1205 sizeof(*ctx->raw_samples[c]) * sconf->max_order);
9b56cd1e37b7 Add MPEG-4 Audio Lossless Coding (ALS) decoder.
cehoyos
parents:
diff changeset
1206 }
9b56cd1e37b7 Add MPEG-4 Audio Lossless Coding (ALS) decoder.
cehoyos
parents:
diff changeset
1207 } else { // multi-channel coding
10802
4f614b69b4e5 Add multi-channel correlation support for ALS.
thilo.borgmann
parents: 10800
diff changeset
1208 ALSBlockData bd;
4f614b69b4e5 Add multi-channel correlation support for ALS.
thilo.borgmann
parents: 10800
diff changeset
1209 int b;
4f614b69b4e5 Add multi-channel correlation support for ALS.
thilo.borgmann
parents: 10800
diff changeset
1210 int *reverted_channels = ctx->reverted_channels;
4f614b69b4e5 Add multi-channel correlation support for ALS.
thilo.borgmann
parents: 10800
diff changeset
1211 unsigned int offset = 0;
4f614b69b4e5 Add multi-channel correlation support for ALS.
thilo.borgmann
parents: 10800
diff changeset
1212
4f614b69b4e5 Add multi-channel correlation support for ALS.
thilo.borgmann
parents: 10800
diff changeset
1213 for (c = 0; c < avctx->channels; c++)
4f614b69b4e5 Add multi-channel correlation support for ALS.
thilo.borgmann
parents: 10800
diff changeset
1214 if (ctx->chan_data[c] < ctx->chan_data_buffer) {
4f614b69b4e5 Add multi-channel correlation support for ALS.
thilo.borgmann
parents: 10800
diff changeset
1215 av_log(ctx->avctx, AV_LOG_ERROR, "Invalid channel data!\n");
4f614b69b4e5 Add multi-channel correlation support for ALS.
thilo.borgmann
parents: 10800
diff changeset
1216 return -1;
4f614b69b4e5 Add multi-channel correlation support for ALS.
thilo.borgmann
parents: 10800
diff changeset
1217 }
4f614b69b4e5 Add multi-channel correlation support for ALS.
thilo.borgmann
parents: 10800
diff changeset
1218
4f614b69b4e5 Add multi-channel correlation support for ALS.
thilo.borgmann
parents: 10800
diff changeset
1219 memset(&bd, 0, sizeof(ALSBlockData));
4f614b69b4e5 Add multi-channel correlation support for ALS.
thilo.borgmann
parents: 10800
diff changeset
1220 memset(reverted_channels, 0, sizeof(*reverted_channels) * avctx->channels);
4f614b69b4e5 Add multi-channel correlation support for ALS.
thilo.borgmann
parents: 10800
diff changeset
1221
4f614b69b4e5 Add multi-channel correlation support for ALS.
thilo.borgmann
parents: 10800
diff changeset
1222 bd.ra_block = ra_frame;
4f614b69b4e5 Add multi-channel correlation support for ALS.
thilo.borgmann
parents: 10800
diff changeset
1223 bd.prev_raw_samples = ctx->prev_raw_samples;
4f614b69b4e5 Add multi-channel correlation support for ALS.
thilo.borgmann
parents: 10800
diff changeset
1224
10522
9b56cd1e37b7 Add MPEG-4 Audio Lossless Coding (ALS) decoder.
cehoyos
parents:
diff changeset
1225 get_block_sizes(ctx, div_blocks, &bs_info);
9b56cd1e37b7 Add MPEG-4 Audio Lossless Coding (ALS) decoder.
cehoyos
parents:
diff changeset
1226
10802
4f614b69b4e5 Add multi-channel correlation support for ALS.
thilo.borgmann
parents: 10800
diff changeset
1227 for (b = 0; b < ctx->num_blocks; b++) {
4f614b69b4e5 Add multi-channel correlation support for ALS.
thilo.borgmann
parents: 10800
diff changeset
1228 bd.shift_lsbs = 0;
4f614b69b4e5 Add multi-channel correlation support for ALS.
thilo.borgmann
parents: 10800
diff changeset
1229 bd.block_length = div_blocks[b];
4f614b69b4e5 Add multi-channel correlation support for ALS.
thilo.borgmann
parents: 10800
diff changeset
1230
4f614b69b4e5 Add multi-channel correlation support for ALS.
thilo.borgmann
parents: 10800
diff changeset
1231 for (c = 0; c < avctx->channels; c++) {
4f614b69b4e5 Add multi-channel correlation support for ALS.
thilo.borgmann
parents: 10800
diff changeset
1232 bd.use_ltp = ctx->use_ltp + c;
4f614b69b4e5 Add multi-channel correlation support for ALS.
thilo.borgmann
parents: 10800
diff changeset
1233 bd.ltp_lag = ctx->ltp_lag + c;
4f614b69b4e5 Add multi-channel correlation support for ALS.
thilo.borgmann
parents: 10800
diff changeset
1234 bd.ltp_gain = ctx->ltp_gain[c];
4f614b69b4e5 Add multi-channel correlation support for ALS.
thilo.borgmann
parents: 10800
diff changeset
1235 bd.lpc_cof = ctx->lpc_cof[c];
4f614b69b4e5 Add multi-channel correlation support for ALS.
thilo.borgmann
parents: 10800
diff changeset
1236 bd.quant_cof = ctx->quant_cof[c];
4f614b69b4e5 Add multi-channel correlation support for ALS.
thilo.borgmann
parents: 10800
diff changeset
1237 bd.raw_samples = ctx->raw_samples[c] + offset;
4f614b69b4e5 Add multi-channel correlation support for ALS.
thilo.borgmann
parents: 10800
diff changeset
1238 bd.raw_other = NULL;
4f614b69b4e5 Add multi-channel correlation support for ALS.
thilo.borgmann
parents: 10800
diff changeset
1239
4f614b69b4e5 Add multi-channel correlation support for ALS.
thilo.borgmann
parents: 10800
diff changeset
1240 read_block(ctx, &bd);
4f614b69b4e5 Add multi-channel correlation support for ALS.
thilo.borgmann
parents: 10800
diff changeset
1241 if (read_channel_data(ctx, ctx->chan_data[c], c))
4f614b69b4e5 Add multi-channel correlation support for ALS.
thilo.borgmann
parents: 10800
diff changeset
1242 return -1;
4f614b69b4e5 Add multi-channel correlation support for ALS.
thilo.borgmann
parents: 10800
diff changeset
1243 }
4f614b69b4e5 Add multi-channel correlation support for ALS.
thilo.borgmann
parents: 10800
diff changeset
1244
4f614b69b4e5 Add multi-channel correlation support for ALS.
thilo.borgmann
parents: 10800
diff changeset
1245 for (c = 0; c < avctx->channels; c++)
4f614b69b4e5 Add multi-channel correlation support for ALS.
thilo.borgmann
parents: 10800
diff changeset
1246 if (revert_channel_correlation(ctx, &bd, ctx->chan_data,
4f614b69b4e5 Add multi-channel correlation support for ALS.
thilo.borgmann
parents: 10800
diff changeset
1247 reverted_channels, offset, c))
4f614b69b4e5 Add multi-channel correlation support for ALS.
thilo.borgmann
parents: 10800
diff changeset
1248 return -1;
4f614b69b4e5 Add multi-channel correlation support for ALS.
thilo.borgmann
parents: 10800
diff changeset
1249
4f614b69b4e5 Add multi-channel correlation support for ALS.
thilo.borgmann
parents: 10800
diff changeset
1250 for (c = 0; c < avctx->channels; c++) {
4f614b69b4e5 Add multi-channel correlation support for ALS.
thilo.borgmann
parents: 10800
diff changeset
1251 bd.use_ltp = ctx->use_ltp + c;
4f614b69b4e5 Add multi-channel correlation support for ALS.
thilo.borgmann
parents: 10800
diff changeset
1252 bd.ltp_lag = ctx->ltp_lag + c;
4f614b69b4e5 Add multi-channel correlation support for ALS.
thilo.borgmann
parents: 10800
diff changeset
1253 bd.ltp_gain = ctx->ltp_gain[c];
4f614b69b4e5 Add multi-channel correlation support for ALS.
thilo.borgmann
parents: 10800
diff changeset
1254 bd.lpc_cof = ctx->lpc_cof[c];
4f614b69b4e5 Add multi-channel correlation support for ALS.
thilo.borgmann
parents: 10800
diff changeset
1255 bd.quant_cof = ctx->quant_cof[c];
4f614b69b4e5 Add multi-channel correlation support for ALS.
thilo.borgmann
parents: 10800
diff changeset
1256 bd.raw_samples = ctx->raw_samples[c] + offset;
4f614b69b4e5 Add multi-channel correlation support for ALS.
thilo.borgmann
parents: 10800
diff changeset
1257 decode_block(ctx, &bd);
4f614b69b4e5 Add multi-channel correlation support for ALS.
thilo.borgmann
parents: 10800
diff changeset
1258 }
4f614b69b4e5 Add multi-channel correlation support for ALS.
thilo.borgmann
parents: 10800
diff changeset
1259
4f614b69b4e5 Add multi-channel correlation support for ALS.
thilo.borgmann
parents: 10800
diff changeset
1260 memset(reverted_channels, 0, avctx->channels * sizeof(*reverted_channels));
4f614b69b4e5 Add multi-channel correlation support for ALS.
thilo.borgmann
parents: 10800
diff changeset
1261 offset += div_blocks[b];
4f614b69b4e5 Add multi-channel correlation support for ALS.
thilo.borgmann
parents: 10800
diff changeset
1262 bd.ra_block = 0;
4f614b69b4e5 Add multi-channel correlation support for ALS.
thilo.borgmann
parents: 10800
diff changeset
1263 }
4f614b69b4e5 Add multi-channel correlation support for ALS.
thilo.borgmann
parents: 10800
diff changeset
1264
4f614b69b4e5 Add multi-channel correlation support for ALS.
thilo.borgmann
parents: 10800
diff changeset
1265 // store carryover raw samples
4f614b69b4e5 Add multi-channel correlation support for ALS.
thilo.borgmann
parents: 10800
diff changeset
1266 for (c = 0; c < avctx->channels; c++)
4f614b69b4e5 Add multi-channel correlation support for ALS.
thilo.borgmann
parents: 10800
diff changeset
1267 memmove(ctx->raw_samples[c] - sconf->max_order,
4f614b69b4e5 Add multi-channel correlation support for ALS.
thilo.borgmann
parents: 10800
diff changeset
1268 ctx->raw_samples[c] - sconf->max_order + sconf->frame_length,
4f614b69b4e5 Add multi-channel correlation support for ALS.
thilo.borgmann
parents: 10800
diff changeset
1269 sizeof(*ctx->raw_samples[c]) * sconf->max_order);
10522
9b56cd1e37b7 Add MPEG-4 Audio Lossless Coding (ALS) decoder.
cehoyos
parents:
diff changeset
1270 }
9b56cd1e37b7 Add MPEG-4 Audio Lossless Coding (ALS) decoder.
cehoyos
parents:
diff changeset
1271
9b56cd1e37b7 Add MPEG-4 Audio Lossless Coding (ALS) decoder.
cehoyos
parents:
diff changeset
1272 // TODO: read_diff_float_data
9b56cd1e37b7 Add MPEG-4 Audio Lossless Coding (ALS) decoder.
cehoyos
parents:
diff changeset
1273
9b56cd1e37b7 Add MPEG-4 Audio Lossless Coding (ALS) decoder.
cehoyos
parents:
diff changeset
1274 return 0;
9b56cd1e37b7 Add MPEG-4 Audio Lossless Coding (ALS) decoder.
cehoyos
parents:
diff changeset
1275 }
9b56cd1e37b7 Add MPEG-4 Audio Lossless Coding (ALS) decoder.
cehoyos
parents:
diff changeset
1276
9b56cd1e37b7 Add MPEG-4 Audio Lossless Coding (ALS) decoder.
cehoyos
parents:
diff changeset
1277
9b56cd1e37b7 Add MPEG-4 Audio Lossless Coding (ALS) decoder.
cehoyos
parents:
diff changeset
1278 /** Decodes an ALS frame.
9b56cd1e37b7 Add MPEG-4 Audio Lossless Coding (ALS) decoder.
cehoyos
parents:
diff changeset
1279 */
9b56cd1e37b7 Add MPEG-4 Audio Lossless Coding (ALS) decoder.
cehoyos
parents:
diff changeset
1280 static int decode_frame(AVCodecContext *avctx,
9b56cd1e37b7 Add MPEG-4 Audio Lossless Coding (ALS) decoder.
cehoyos
parents:
diff changeset
1281 void *data, int *data_size,
9b56cd1e37b7 Add MPEG-4 Audio Lossless Coding (ALS) decoder.
cehoyos
parents:
diff changeset
1282 AVPacket *avpkt)
9b56cd1e37b7 Add MPEG-4 Audio Lossless Coding (ALS) decoder.
cehoyos
parents:
diff changeset
1283 {
9b56cd1e37b7 Add MPEG-4 Audio Lossless Coding (ALS) decoder.
cehoyos
parents:
diff changeset
1284 ALSDecContext *ctx = avctx->priv_data;
9b56cd1e37b7 Add MPEG-4 Audio Lossless Coding (ALS) decoder.
cehoyos
parents:
diff changeset
1285 ALSSpecificConfig *sconf = &ctx->sconf;
9b56cd1e37b7 Add MPEG-4 Audio Lossless Coding (ALS) decoder.
cehoyos
parents:
diff changeset
1286 const uint8_t *buffer = avpkt->data;
9b56cd1e37b7 Add MPEG-4 Audio Lossless Coding (ALS) decoder.
cehoyos
parents:
diff changeset
1287 int buffer_size = avpkt->size;
9b56cd1e37b7 Add MPEG-4 Audio Lossless Coding (ALS) decoder.
cehoyos
parents:
diff changeset
1288 int invalid_frame, size;
9b56cd1e37b7 Add MPEG-4 Audio Lossless Coding (ALS) decoder.
cehoyos
parents:
diff changeset
1289 unsigned int c, sample, ra_frame, bytes_read, shift;
9b56cd1e37b7 Add MPEG-4 Audio Lossless Coding (ALS) decoder.
cehoyos
parents:
diff changeset
1290
9b56cd1e37b7 Add MPEG-4 Audio Lossless Coding (ALS) decoder.
cehoyos
parents:
diff changeset
1291 init_get_bits(&ctx->gb, buffer, buffer_size * 8);
9b56cd1e37b7 Add MPEG-4 Audio Lossless Coding (ALS) decoder.
cehoyos
parents:
diff changeset
1292
9b56cd1e37b7 Add MPEG-4 Audio Lossless Coding (ALS) decoder.
cehoyos
parents:
diff changeset
1293 // In the case that the distance between random access frames is set to zero
9b56cd1e37b7 Add MPEG-4 Audio Lossless Coding (ALS) decoder.
cehoyos
parents:
diff changeset
1294 // (sconf->ra_distance == 0) no frame is treated as a random access frame.
9b56cd1e37b7 Add MPEG-4 Audio Lossless Coding (ALS) decoder.
cehoyos
parents:
diff changeset
1295 // For the first frame, if prediction is used, all samples used from the
9b56cd1e37b7 Add MPEG-4 Audio Lossless Coding (ALS) decoder.
cehoyos
parents:
diff changeset
1296 // previous frame are assumed to be zero.
9b56cd1e37b7 Add MPEG-4 Audio Lossless Coding (ALS) decoder.
cehoyos
parents:
diff changeset
1297 ra_frame = sconf->ra_distance && !(ctx->frame_id % sconf->ra_distance);
9b56cd1e37b7 Add MPEG-4 Audio Lossless Coding (ALS) decoder.
cehoyos
parents:
diff changeset
1298
9b56cd1e37b7 Add MPEG-4 Audio Lossless Coding (ALS) decoder.
cehoyos
parents:
diff changeset
1299 // the last frame to decode might have a different length
9b56cd1e37b7 Add MPEG-4 Audio Lossless Coding (ALS) decoder.
cehoyos
parents:
diff changeset
1300 if (sconf->samples != 0xFFFFFFFF)
9b56cd1e37b7 Add MPEG-4 Audio Lossless Coding (ALS) decoder.
cehoyos
parents:
diff changeset
1301 ctx->cur_frame_length = FFMIN(sconf->samples - ctx->frame_id * (uint64_t) sconf->frame_length,
9b56cd1e37b7 Add MPEG-4 Audio Lossless Coding (ALS) decoder.
cehoyos
parents:
diff changeset
1302 sconf->frame_length);
9b56cd1e37b7 Add MPEG-4 Audio Lossless Coding (ALS) decoder.
cehoyos
parents:
diff changeset
1303 else
9b56cd1e37b7 Add MPEG-4 Audio Lossless Coding (ALS) decoder.
cehoyos
parents:
diff changeset
1304 ctx->cur_frame_length = sconf->frame_length;
9b56cd1e37b7 Add MPEG-4 Audio Lossless Coding (ALS) decoder.
cehoyos
parents:
diff changeset
1305
9b56cd1e37b7 Add MPEG-4 Audio Lossless Coding (ALS) decoder.
cehoyos
parents:
diff changeset
1306 // decode the frame data
9b56cd1e37b7 Add MPEG-4 Audio Lossless Coding (ALS) decoder.
cehoyos
parents:
diff changeset
1307 if ((invalid_frame = read_frame_data(ctx, ra_frame) < 0))
9b56cd1e37b7 Add MPEG-4 Audio Lossless Coding (ALS) decoder.
cehoyos
parents:
diff changeset
1308 av_log(ctx->avctx, AV_LOG_WARNING,
9b56cd1e37b7 Add MPEG-4 Audio Lossless Coding (ALS) decoder.
cehoyos
parents:
diff changeset
1309 "Reading frame data failed. Skipping RA unit.\n");
9b56cd1e37b7 Add MPEG-4 Audio Lossless Coding (ALS) decoder.
cehoyos
parents:
diff changeset
1310
9b56cd1e37b7 Add MPEG-4 Audio Lossless Coding (ALS) decoder.
cehoyos
parents:
diff changeset
1311 ctx->frame_id++;
9b56cd1e37b7 Add MPEG-4 Audio Lossless Coding (ALS) decoder.
cehoyos
parents:
diff changeset
1312
9b56cd1e37b7 Add MPEG-4 Audio Lossless Coding (ALS) decoder.
cehoyos
parents:
diff changeset
1313 // check for size of decoded data
9b56cd1e37b7 Add MPEG-4 Audio Lossless Coding (ALS) decoder.
cehoyos
parents:
diff changeset
1314 size = ctx->cur_frame_length * avctx->channels *
9b56cd1e37b7 Add MPEG-4 Audio Lossless Coding (ALS) decoder.
cehoyos
parents:
diff changeset
1315 (av_get_bits_per_sample_format(avctx->sample_fmt) >> 3);
9b56cd1e37b7 Add MPEG-4 Audio Lossless Coding (ALS) decoder.
cehoyos
parents:
diff changeset
1316
9b56cd1e37b7 Add MPEG-4 Audio Lossless Coding (ALS) decoder.
cehoyos
parents:
diff changeset
1317 if (size > *data_size) {
9b56cd1e37b7 Add MPEG-4 Audio Lossless Coding (ALS) decoder.
cehoyos
parents:
diff changeset
1318 av_log(avctx, AV_LOG_ERROR, "Decoded data exceeds buffer size.\n");
9b56cd1e37b7 Add MPEG-4 Audio Lossless Coding (ALS) decoder.
cehoyos
parents:
diff changeset
1319 return -1;
9b56cd1e37b7 Add MPEG-4 Audio Lossless Coding (ALS) decoder.
cehoyos
parents:
diff changeset
1320 }
9b56cd1e37b7 Add MPEG-4 Audio Lossless Coding (ALS) decoder.
cehoyos
parents:
diff changeset
1321
9b56cd1e37b7 Add MPEG-4 Audio Lossless Coding (ALS) decoder.
cehoyos
parents:
diff changeset
1322 *data_size = size;
9b56cd1e37b7 Add MPEG-4 Audio Lossless Coding (ALS) decoder.
cehoyos
parents:
diff changeset
1323
9b56cd1e37b7 Add MPEG-4 Audio Lossless Coding (ALS) decoder.
cehoyos
parents:
diff changeset
1324 // transform decoded frame into output format
9b56cd1e37b7 Add MPEG-4 Audio Lossless Coding (ALS) decoder.
cehoyos
parents:
diff changeset
1325 #define INTERLEAVE_OUTPUT(bps) \
9b56cd1e37b7 Add MPEG-4 Audio Lossless Coding (ALS) decoder.
cehoyos
parents:
diff changeset
1326 { \
9b56cd1e37b7 Add MPEG-4 Audio Lossless Coding (ALS) decoder.
cehoyos
parents:
diff changeset
1327 int##bps##_t *dest = (int##bps##_t*) data; \
9b56cd1e37b7 Add MPEG-4 Audio Lossless Coding (ALS) decoder.
cehoyos
parents:
diff changeset
1328 shift = bps - ctx->avctx->bits_per_raw_sample; \
9b56cd1e37b7 Add MPEG-4 Audio Lossless Coding (ALS) decoder.
cehoyos
parents:
diff changeset
1329 for (sample = 0; sample < ctx->cur_frame_length; sample++) \
9b56cd1e37b7 Add MPEG-4 Audio Lossless Coding (ALS) decoder.
cehoyos
parents:
diff changeset
1330 for (c = 0; c < avctx->channels; c++) \
9b56cd1e37b7 Add MPEG-4 Audio Lossless Coding (ALS) decoder.
cehoyos
parents:
diff changeset
1331 *dest++ = ctx->raw_samples[c][sample] << shift; \
9b56cd1e37b7 Add MPEG-4 Audio Lossless Coding (ALS) decoder.
cehoyos
parents:
diff changeset
1332 }
9b56cd1e37b7 Add MPEG-4 Audio Lossless Coding (ALS) decoder.
cehoyos
parents:
diff changeset
1333
9b56cd1e37b7 Add MPEG-4 Audio Lossless Coding (ALS) decoder.
cehoyos
parents:
diff changeset
1334 if (ctx->avctx->bits_per_raw_sample <= 16) {
9b56cd1e37b7 Add MPEG-4 Audio Lossless Coding (ALS) decoder.
cehoyos
parents:
diff changeset
1335 INTERLEAVE_OUTPUT(16)
9b56cd1e37b7 Add MPEG-4 Audio Lossless Coding (ALS) decoder.
cehoyos
parents:
diff changeset
1336 } else {
9b56cd1e37b7 Add MPEG-4 Audio Lossless Coding (ALS) decoder.
cehoyos
parents:
diff changeset
1337 INTERLEAVE_OUTPUT(32)
9b56cd1e37b7 Add MPEG-4 Audio Lossless Coding (ALS) decoder.
cehoyos
parents:
diff changeset
1338 }
9b56cd1e37b7 Add MPEG-4 Audio Lossless Coding (ALS) decoder.
cehoyos
parents:
diff changeset
1339
9b56cd1e37b7 Add MPEG-4 Audio Lossless Coding (ALS) decoder.
cehoyos
parents:
diff changeset
1340 bytes_read = invalid_frame ? buffer_size :
9b56cd1e37b7 Add MPEG-4 Audio Lossless Coding (ALS) decoder.
cehoyos
parents:
diff changeset
1341 (get_bits_count(&ctx->gb) + 7) >> 3;
9b56cd1e37b7 Add MPEG-4 Audio Lossless Coding (ALS) decoder.
cehoyos
parents:
diff changeset
1342
9b56cd1e37b7 Add MPEG-4 Audio Lossless Coding (ALS) decoder.
cehoyos
parents:
diff changeset
1343 return bytes_read;
9b56cd1e37b7 Add MPEG-4 Audio Lossless Coding (ALS) decoder.
cehoyos
parents:
diff changeset
1344 }
9b56cd1e37b7 Add MPEG-4 Audio Lossless Coding (ALS) decoder.
cehoyos
parents:
diff changeset
1345
9b56cd1e37b7 Add MPEG-4 Audio Lossless Coding (ALS) decoder.
cehoyos
parents:
diff changeset
1346
9b56cd1e37b7 Add MPEG-4 Audio Lossless Coding (ALS) decoder.
cehoyos
parents:
diff changeset
1347 /** Uninitializes the ALS decoder.
9b56cd1e37b7 Add MPEG-4 Audio Lossless Coding (ALS) decoder.
cehoyos
parents:
diff changeset
1348 */
9b56cd1e37b7 Add MPEG-4 Audio Lossless Coding (ALS) decoder.
cehoyos
parents:
diff changeset
1349 static av_cold int decode_end(AVCodecContext *avctx)
9b56cd1e37b7 Add MPEG-4 Audio Lossless Coding (ALS) decoder.
cehoyos
parents:
diff changeset
1350 {
9b56cd1e37b7 Add MPEG-4 Audio Lossless Coding (ALS) decoder.
cehoyos
parents:
diff changeset
1351 ALSDecContext *ctx = avctx->priv_data;
9b56cd1e37b7 Add MPEG-4 Audio Lossless Coding (ALS) decoder.
cehoyos
parents:
diff changeset
1352
9b56cd1e37b7 Add MPEG-4 Audio Lossless Coding (ALS) decoder.
cehoyos
parents:
diff changeset
1353 av_freep(&ctx->sconf.chan_pos);
9b56cd1e37b7 Add MPEG-4 Audio Lossless Coding (ALS) decoder.
cehoyos
parents:
diff changeset
1354
10681
997692df50c1 Read and decode block data in separate functions to prepare support for
thilo.borgmann
parents: 10535
diff changeset
1355 av_freep(&ctx->use_ltp);
997692df50c1 Read and decode block data in separate functions to prepare support for
thilo.borgmann
parents: 10535
diff changeset
1356 av_freep(&ctx->ltp_lag);
997692df50c1 Read and decode block data in separate functions to prepare support for
thilo.borgmann
parents: 10535
diff changeset
1357 av_freep(&ctx->ltp_gain);
997692df50c1 Read and decode block data in separate functions to prepare support for
thilo.borgmann
parents: 10535
diff changeset
1358 av_freep(&ctx->ltp_gain_buffer);
10522
9b56cd1e37b7 Add MPEG-4 Audio Lossless Coding (ALS) decoder.
cehoyos
parents:
diff changeset
1359 av_freep(&ctx->quant_cof);
9b56cd1e37b7 Add MPEG-4 Audio Lossless Coding (ALS) decoder.
cehoyos
parents:
diff changeset
1360 av_freep(&ctx->lpc_cof);
10802
4f614b69b4e5 Add multi-channel correlation support for ALS.
thilo.borgmann
parents: 10800
diff changeset
1361 av_freep(&ctx->quant_cof_buffer);
4f614b69b4e5 Add multi-channel correlation support for ALS.
thilo.borgmann
parents: 10800
diff changeset
1362 av_freep(&ctx->lpc_cof_buffer);
10860
c9fb5b89e47a Replace variable length array with an allocated buffer
thilo.borgmann
parents: 10823
diff changeset
1363 av_freep(&ctx->lpc_cof_reversed_buffer);
10522
9b56cd1e37b7 Add MPEG-4 Audio Lossless Coding (ALS) decoder.
cehoyos
parents:
diff changeset
1364 av_freep(&ctx->prev_raw_samples);
9b56cd1e37b7 Add MPEG-4 Audio Lossless Coding (ALS) decoder.
cehoyos
parents:
diff changeset
1365 av_freep(&ctx->raw_samples);
9b56cd1e37b7 Add MPEG-4 Audio Lossless Coding (ALS) decoder.
cehoyos
parents:
diff changeset
1366 av_freep(&ctx->raw_buffer);
10802
4f614b69b4e5 Add multi-channel correlation support for ALS.
thilo.borgmann
parents: 10800
diff changeset
1367 av_freep(&ctx->chan_data);
4f614b69b4e5 Add multi-channel correlation support for ALS.
thilo.borgmann
parents: 10800
diff changeset
1368 av_freep(&ctx->chan_data_buffer);
4f614b69b4e5 Add multi-channel correlation support for ALS.
thilo.borgmann
parents: 10800
diff changeset
1369 av_freep(&ctx->reverted_channels);
10522
9b56cd1e37b7 Add MPEG-4 Audio Lossless Coding (ALS) decoder.
cehoyos
parents:
diff changeset
1370
9b56cd1e37b7 Add MPEG-4 Audio Lossless Coding (ALS) decoder.
cehoyos
parents:
diff changeset
1371 return 0;
9b56cd1e37b7 Add MPEG-4 Audio Lossless Coding (ALS) decoder.
cehoyos
parents:
diff changeset
1372 }
9b56cd1e37b7 Add MPEG-4 Audio Lossless Coding (ALS) decoder.
cehoyos
parents:
diff changeset
1373
9b56cd1e37b7 Add MPEG-4 Audio Lossless Coding (ALS) decoder.
cehoyos
parents:
diff changeset
1374
9b56cd1e37b7 Add MPEG-4 Audio Lossless Coding (ALS) decoder.
cehoyos
parents:
diff changeset
1375 /** Initializes the ALS decoder.
9b56cd1e37b7 Add MPEG-4 Audio Lossless Coding (ALS) decoder.
cehoyos
parents:
diff changeset
1376 */
9b56cd1e37b7 Add MPEG-4 Audio Lossless Coding (ALS) decoder.
cehoyos
parents:
diff changeset
1377 static av_cold int decode_init(AVCodecContext *avctx)
9b56cd1e37b7 Add MPEG-4 Audio Lossless Coding (ALS) decoder.
cehoyos
parents:
diff changeset
1378 {
9b56cd1e37b7 Add MPEG-4 Audio Lossless Coding (ALS) decoder.
cehoyos
parents:
diff changeset
1379 unsigned int c;
9b56cd1e37b7 Add MPEG-4 Audio Lossless Coding (ALS) decoder.
cehoyos
parents:
diff changeset
1380 unsigned int channel_size;
10681
997692df50c1 Read and decode block data in separate functions to prepare support for
thilo.borgmann
parents: 10535
diff changeset
1381 int num_buffers;
10522
9b56cd1e37b7 Add MPEG-4 Audio Lossless Coding (ALS) decoder.
cehoyos
parents:
diff changeset
1382 ALSDecContext *ctx = avctx->priv_data;
9b56cd1e37b7 Add MPEG-4 Audio Lossless Coding (ALS) decoder.
cehoyos
parents:
diff changeset
1383 ALSSpecificConfig *sconf = &ctx->sconf;
9b56cd1e37b7 Add MPEG-4 Audio Lossless Coding (ALS) decoder.
cehoyos
parents:
diff changeset
1384 ctx->avctx = avctx;
9b56cd1e37b7 Add MPEG-4 Audio Lossless Coding (ALS) decoder.
cehoyos
parents:
diff changeset
1385
9b56cd1e37b7 Add MPEG-4 Audio Lossless Coding (ALS) decoder.
cehoyos
parents:
diff changeset
1386 if (!avctx->extradata) {
9b56cd1e37b7 Add MPEG-4 Audio Lossless Coding (ALS) decoder.
cehoyos
parents:
diff changeset
1387 av_log(avctx, AV_LOG_ERROR, "Missing required ALS extradata.\n");
9b56cd1e37b7 Add MPEG-4 Audio Lossless Coding (ALS) decoder.
cehoyos
parents:
diff changeset
1388 return -1;
9b56cd1e37b7 Add MPEG-4 Audio Lossless Coding (ALS) decoder.
cehoyos
parents:
diff changeset
1389 }
9b56cd1e37b7 Add MPEG-4 Audio Lossless Coding (ALS) decoder.
cehoyos
parents:
diff changeset
1390
9b56cd1e37b7 Add MPEG-4 Audio Lossless Coding (ALS) decoder.
cehoyos
parents:
diff changeset
1391 if (read_specific_config(ctx)) {
9b56cd1e37b7 Add MPEG-4 Audio Lossless Coding (ALS) decoder.
cehoyos
parents:
diff changeset
1392 av_log(avctx, AV_LOG_ERROR, "Reading ALSSpecificConfig failed.\n");
9b56cd1e37b7 Add MPEG-4 Audio Lossless Coding (ALS) decoder.
cehoyos
parents:
diff changeset
1393 decode_end(avctx);
9b56cd1e37b7 Add MPEG-4 Audio Lossless Coding (ALS) decoder.
cehoyos
parents:
diff changeset
1394 return -1;
9b56cd1e37b7 Add MPEG-4 Audio Lossless Coding (ALS) decoder.
cehoyos
parents:
diff changeset
1395 }
9b56cd1e37b7 Add MPEG-4 Audio Lossless Coding (ALS) decoder.
cehoyos
parents:
diff changeset
1396
9b56cd1e37b7 Add MPEG-4 Audio Lossless Coding (ALS) decoder.
cehoyos
parents:
diff changeset
1397 if (check_specific_config(ctx)) {
9b56cd1e37b7 Add MPEG-4 Audio Lossless Coding (ALS) decoder.
cehoyos
parents:
diff changeset
1398 decode_end(avctx);
9b56cd1e37b7 Add MPEG-4 Audio Lossless Coding (ALS) decoder.
cehoyos
parents:
diff changeset
1399 return -1;
9b56cd1e37b7 Add MPEG-4 Audio Lossless Coding (ALS) decoder.
cehoyos
parents:
diff changeset
1400 }
9b56cd1e37b7 Add MPEG-4 Audio Lossless Coding (ALS) decoder.
cehoyos
parents:
diff changeset
1401
9b56cd1e37b7 Add MPEG-4 Audio Lossless Coding (ALS) decoder.
cehoyos
parents:
diff changeset
1402 if (sconf->floating) {
9b56cd1e37b7 Add MPEG-4 Audio Lossless Coding (ALS) decoder.
cehoyos
parents:
diff changeset
1403 avctx->sample_fmt = SAMPLE_FMT_FLT;
9b56cd1e37b7 Add MPEG-4 Audio Lossless Coding (ALS) decoder.
cehoyos
parents:
diff changeset
1404 avctx->bits_per_raw_sample = 32;
9b56cd1e37b7 Add MPEG-4 Audio Lossless Coding (ALS) decoder.
cehoyos
parents:
diff changeset
1405 } else {
9b56cd1e37b7 Add MPEG-4 Audio Lossless Coding (ALS) decoder.
cehoyos
parents:
diff changeset
1406 avctx->sample_fmt = sconf->resolution > 1
9b56cd1e37b7 Add MPEG-4 Audio Lossless Coding (ALS) decoder.
cehoyos
parents:
diff changeset
1407 ? SAMPLE_FMT_S32 : SAMPLE_FMT_S16;
9b56cd1e37b7 Add MPEG-4 Audio Lossless Coding (ALS) decoder.
cehoyos
parents:
diff changeset
1408 avctx->bits_per_raw_sample = (sconf->resolution + 1) * 8;
9b56cd1e37b7 Add MPEG-4 Audio Lossless Coding (ALS) decoder.
cehoyos
parents:
diff changeset
1409 }
9b56cd1e37b7 Add MPEG-4 Audio Lossless Coding (ALS) decoder.
cehoyos
parents:
diff changeset
1410
10530
d428e57f14c6 Add long-term prediction to the ALS decoder.
thilo.borgmann
parents: 10524
diff changeset
1411 // set lag value for long-term prediction
d428e57f14c6 Add long-term prediction to the ALS decoder.
thilo.borgmann
parents: 10524
diff changeset
1412 ctx->ltp_lag_length = 8 + (avctx->sample_rate >= 96000) +
d428e57f14c6 Add long-term prediction to the ALS decoder.
thilo.borgmann
parents: 10524
diff changeset
1413 (avctx->sample_rate >= 192000);
d428e57f14c6 Add long-term prediction to the ALS decoder.
thilo.borgmann
parents: 10524
diff changeset
1414
10681
997692df50c1 Read and decode block data in separate functions to prepare support for
thilo.borgmann
parents: 10535
diff changeset
1415 // allocate quantized parcor coefficient buffer
997692df50c1 Read and decode block data in separate functions to prepare support for
thilo.borgmann
parents: 10535
diff changeset
1416 num_buffers = sconf->mc_coding ? avctx->channels : 1;
997692df50c1 Read and decode block data in separate functions to prepare support for
thilo.borgmann
parents: 10535
diff changeset
1417
10802
4f614b69b4e5 Add multi-channel correlation support for ALS.
thilo.borgmann
parents: 10800
diff changeset
1418 ctx->quant_cof = av_malloc(sizeof(*ctx->quant_cof) * num_buffers);
4f614b69b4e5 Add multi-channel correlation support for ALS.
thilo.borgmann
parents: 10800
diff changeset
1419 ctx->lpc_cof = av_malloc(sizeof(*ctx->lpc_cof) * num_buffers);
4f614b69b4e5 Add multi-channel correlation support for ALS.
thilo.borgmann
parents: 10800
diff changeset
1420 ctx->quant_cof_buffer = av_malloc(sizeof(*ctx->quant_cof_buffer) *
4f614b69b4e5 Add multi-channel correlation support for ALS.
thilo.borgmann
parents: 10800
diff changeset
1421 num_buffers * sconf->max_order);
4f614b69b4e5 Add multi-channel correlation support for ALS.
thilo.borgmann
parents: 10800
diff changeset
1422 ctx->lpc_cof_buffer = av_malloc(sizeof(*ctx->lpc_cof_buffer) *
4f614b69b4e5 Add multi-channel correlation support for ALS.
thilo.borgmann
parents: 10800
diff changeset
1423 num_buffers * sconf->max_order);
10860
c9fb5b89e47a Replace variable length array with an allocated buffer
thilo.borgmann
parents: 10823
diff changeset
1424 ctx->lpc_cof_reversed_buffer = av_malloc(sizeof(*ctx->lpc_cof_buffer) *
c9fb5b89e47a Replace variable length array with an allocated buffer
thilo.borgmann
parents: 10823
diff changeset
1425 sconf->max_order);
10802
4f614b69b4e5 Add multi-channel correlation support for ALS.
thilo.borgmann
parents: 10800
diff changeset
1426
10861
61bf5a551856 Reindent after last commit.
thilo.borgmann
parents: 10860
diff changeset
1427 if (!ctx->quant_cof || !ctx->lpc_cof ||
61bf5a551856 Reindent after last commit.
thilo.borgmann
parents: 10860
diff changeset
1428 !ctx->quant_cof_buffer || !ctx->lpc_cof_buffer ||
10860
c9fb5b89e47a Replace variable length array with an allocated buffer
thilo.borgmann
parents: 10823
diff changeset
1429 !ctx->lpc_cof_reversed_buffer) {
10802
4f614b69b4e5 Add multi-channel correlation support for ALS.
thilo.borgmann
parents: 10800
diff changeset
1430 av_log(avctx, AV_LOG_ERROR, "Allocating buffer memory failed.\n");
4f614b69b4e5 Add multi-channel correlation support for ALS.
thilo.borgmann
parents: 10800
diff changeset
1431 return AVERROR(ENOMEM);
4f614b69b4e5 Add multi-channel correlation support for ALS.
thilo.borgmann
parents: 10800
diff changeset
1432 }
4f614b69b4e5 Add multi-channel correlation support for ALS.
thilo.borgmann
parents: 10800
diff changeset
1433
4f614b69b4e5 Add multi-channel correlation support for ALS.
thilo.borgmann
parents: 10800
diff changeset
1434 // assign quantized parcor coefficient buffers
4f614b69b4e5 Add multi-channel correlation support for ALS.
thilo.borgmann
parents: 10800
diff changeset
1435 for (c = 0; c < num_buffers; c++) {
4f614b69b4e5 Add multi-channel correlation support for ALS.
thilo.borgmann
parents: 10800
diff changeset
1436 ctx->quant_cof[c] = ctx->quant_cof_buffer + c * sconf->max_order;
4f614b69b4e5 Add multi-channel correlation support for ALS.
thilo.borgmann
parents: 10800
diff changeset
1437 ctx->lpc_cof[c] = ctx->lpc_cof_buffer + c * sconf->max_order;
4f614b69b4e5 Add multi-channel correlation support for ALS.
thilo.borgmann
parents: 10800
diff changeset
1438 }
4f614b69b4e5 Add multi-channel correlation support for ALS.
thilo.borgmann
parents: 10800
diff changeset
1439
10681
997692df50c1 Read and decode block data in separate functions to prepare support for
thilo.borgmann
parents: 10535
diff changeset
1440 // allocate and assign lag and gain data buffer for ltp mode
997692df50c1 Read and decode block data in separate functions to prepare support for
thilo.borgmann
parents: 10535
diff changeset
1441 ctx->use_ltp = av_mallocz(sizeof(*ctx->use_ltp) * num_buffers);
997692df50c1 Read and decode block data in separate functions to prepare support for
thilo.borgmann
parents: 10535
diff changeset
1442 ctx->ltp_lag = av_malloc (sizeof(*ctx->ltp_lag) * num_buffers);
997692df50c1 Read and decode block data in separate functions to prepare support for
thilo.borgmann
parents: 10535
diff changeset
1443 ctx->ltp_gain = av_malloc (sizeof(*ctx->ltp_gain) * num_buffers);
997692df50c1 Read and decode block data in separate functions to prepare support for
thilo.borgmann
parents: 10535
diff changeset
1444 ctx->ltp_gain_buffer = av_malloc (sizeof(*ctx->ltp_gain_buffer) *
997692df50c1 Read and decode block data in separate functions to prepare support for
thilo.borgmann
parents: 10535
diff changeset
1445 num_buffers * 5);
997692df50c1 Read and decode block data in separate functions to prepare support for
thilo.borgmann
parents: 10535
diff changeset
1446
997692df50c1 Read and decode block data in separate functions to prepare support for
thilo.borgmann
parents: 10535
diff changeset
1447 if (!ctx->use_ltp || !ctx->ltp_lag ||
997692df50c1 Read and decode block data in separate functions to prepare support for
thilo.borgmann
parents: 10535
diff changeset
1448 !ctx->ltp_gain || !ctx->ltp_gain_buffer) {
997692df50c1 Read and decode block data in separate functions to prepare support for
thilo.borgmann
parents: 10535
diff changeset
1449 av_log(avctx, AV_LOG_ERROR, "Allocating buffer memory failed.\n");
997692df50c1 Read and decode block data in separate functions to prepare support for
thilo.borgmann
parents: 10535
diff changeset
1450 decode_end(avctx);
997692df50c1 Read and decode block data in separate functions to prepare support for
thilo.borgmann
parents: 10535
diff changeset
1451 return AVERROR(ENOMEM);
997692df50c1 Read and decode block data in separate functions to prepare support for
thilo.borgmann
parents: 10535
diff changeset
1452 }
997692df50c1 Read and decode block data in separate functions to prepare support for
thilo.borgmann
parents: 10535
diff changeset
1453
997692df50c1 Read and decode block data in separate functions to prepare support for
thilo.borgmann
parents: 10535
diff changeset
1454 for (c = 0; c < num_buffers; c++)
997692df50c1 Read and decode block data in separate functions to prepare support for
thilo.borgmann
parents: 10535
diff changeset
1455 ctx->ltp_gain[c] = ctx->ltp_gain_buffer + c * 5;
997692df50c1 Read and decode block data in separate functions to prepare support for
thilo.borgmann
parents: 10535
diff changeset
1456
10802
4f614b69b4e5 Add multi-channel correlation support for ALS.
thilo.borgmann
parents: 10800
diff changeset
1457 // allocate and assign channel data buffer for mcc mode
4f614b69b4e5 Add multi-channel correlation support for ALS.
thilo.borgmann
parents: 10800
diff changeset
1458 if (sconf->mc_coding) {
4f614b69b4e5 Add multi-channel correlation support for ALS.
thilo.borgmann
parents: 10800
diff changeset
1459 ctx->chan_data_buffer = av_malloc(sizeof(*ctx->chan_data_buffer) *
4f614b69b4e5 Add multi-channel correlation support for ALS.
thilo.borgmann
parents: 10800
diff changeset
1460 num_buffers);
4f614b69b4e5 Add multi-channel correlation support for ALS.
thilo.borgmann
parents: 10800
diff changeset
1461 ctx->chan_data = av_malloc(sizeof(ALSChannelData) *
4f614b69b4e5 Add multi-channel correlation support for ALS.
thilo.borgmann
parents: 10800
diff changeset
1462 num_buffers);
4f614b69b4e5 Add multi-channel correlation support for ALS.
thilo.borgmann
parents: 10800
diff changeset
1463 ctx->reverted_channels = av_malloc(sizeof(*ctx->reverted_channels) *
4f614b69b4e5 Add multi-channel correlation support for ALS.
thilo.borgmann
parents: 10800
diff changeset
1464 num_buffers);
4f614b69b4e5 Add multi-channel correlation support for ALS.
thilo.borgmann
parents: 10800
diff changeset
1465
4f614b69b4e5 Add multi-channel correlation support for ALS.
thilo.borgmann
parents: 10800
diff changeset
1466 if (!ctx->chan_data_buffer || !ctx->chan_data || !ctx->reverted_channels) {
4f614b69b4e5 Add multi-channel correlation support for ALS.
thilo.borgmann
parents: 10800
diff changeset
1467 av_log(avctx, AV_LOG_ERROR, "Allocating buffer memory failed.\n");
4f614b69b4e5 Add multi-channel correlation support for ALS.
thilo.borgmann
parents: 10800
diff changeset
1468 decode_end(avctx);
4f614b69b4e5 Add multi-channel correlation support for ALS.
thilo.borgmann
parents: 10800
diff changeset
1469 return AVERROR(ENOMEM);
4f614b69b4e5 Add multi-channel correlation support for ALS.
thilo.borgmann
parents: 10800
diff changeset
1470 }
4f614b69b4e5 Add multi-channel correlation support for ALS.
thilo.borgmann
parents: 10800
diff changeset
1471
4f614b69b4e5 Add multi-channel correlation support for ALS.
thilo.borgmann
parents: 10800
diff changeset
1472 for (c = 0; c < num_buffers; c++)
4f614b69b4e5 Add multi-channel correlation support for ALS.
thilo.borgmann
parents: 10800
diff changeset
1473 ctx->chan_data[c] = ctx->chan_data_buffer + c;
4f614b69b4e5 Add multi-channel correlation support for ALS.
thilo.borgmann
parents: 10800
diff changeset
1474 } else {
4f614b69b4e5 Add multi-channel correlation support for ALS.
thilo.borgmann
parents: 10800
diff changeset
1475 ctx->chan_data = NULL;
4f614b69b4e5 Add multi-channel correlation support for ALS.
thilo.borgmann
parents: 10800
diff changeset
1476 ctx->chan_data_buffer = NULL;
4f614b69b4e5 Add multi-channel correlation support for ALS.
thilo.borgmann
parents: 10800
diff changeset
1477 ctx->reverted_channels = NULL;
4f614b69b4e5 Add multi-channel correlation support for ALS.
thilo.borgmann
parents: 10800
diff changeset
1478 }
4f614b69b4e5 Add multi-channel correlation support for ALS.
thilo.borgmann
parents: 10800
diff changeset
1479
10522
9b56cd1e37b7 Add MPEG-4 Audio Lossless Coding (ALS) decoder.
cehoyos
parents:
diff changeset
1480 avctx->frame_size = sconf->frame_length;
9b56cd1e37b7 Add MPEG-4 Audio Lossless Coding (ALS) decoder.
cehoyos
parents:
diff changeset
1481 channel_size = sconf->frame_length + sconf->max_order;
9b56cd1e37b7 Add MPEG-4 Audio Lossless Coding (ALS) decoder.
cehoyos
parents:
diff changeset
1482
9b56cd1e37b7 Add MPEG-4 Audio Lossless Coding (ALS) decoder.
cehoyos
parents:
diff changeset
1483 ctx->prev_raw_samples = av_malloc (sizeof(*ctx->prev_raw_samples) * sconf->max_order);
9b56cd1e37b7 Add MPEG-4 Audio Lossless Coding (ALS) decoder.
cehoyos
parents:
diff changeset
1484 ctx->raw_buffer = av_mallocz(sizeof(*ctx-> raw_buffer) * avctx->channels * channel_size);
9b56cd1e37b7 Add MPEG-4 Audio Lossless Coding (ALS) decoder.
cehoyos
parents:
diff changeset
1485 ctx->raw_samples = av_malloc (sizeof(*ctx-> raw_samples) * avctx->channels);
9b56cd1e37b7 Add MPEG-4 Audio Lossless Coding (ALS) decoder.
cehoyos
parents:
diff changeset
1486
9b56cd1e37b7 Add MPEG-4 Audio Lossless Coding (ALS) decoder.
cehoyos
parents:
diff changeset
1487 // allocate previous raw sample buffer
9b56cd1e37b7 Add MPEG-4 Audio Lossless Coding (ALS) decoder.
cehoyos
parents:
diff changeset
1488 if (!ctx->prev_raw_samples || !ctx->raw_buffer|| !ctx->raw_samples) {
9b56cd1e37b7 Add MPEG-4 Audio Lossless Coding (ALS) decoder.
cehoyos
parents:
diff changeset
1489 av_log(avctx, AV_LOG_ERROR, "Allocating buffer memory failed.\n");
9b56cd1e37b7 Add MPEG-4 Audio Lossless Coding (ALS) decoder.
cehoyos
parents:
diff changeset
1490 decode_end(avctx);
9b56cd1e37b7 Add MPEG-4 Audio Lossless Coding (ALS) decoder.
cehoyos
parents:
diff changeset
1491 return AVERROR(ENOMEM);
9b56cd1e37b7 Add MPEG-4 Audio Lossless Coding (ALS) decoder.
cehoyos
parents:
diff changeset
1492 }
9b56cd1e37b7 Add MPEG-4 Audio Lossless Coding (ALS) decoder.
cehoyos
parents:
diff changeset
1493
9b56cd1e37b7 Add MPEG-4 Audio Lossless Coding (ALS) decoder.
cehoyos
parents:
diff changeset
1494 // assign raw samples buffers
9b56cd1e37b7 Add MPEG-4 Audio Lossless Coding (ALS) decoder.
cehoyos
parents:
diff changeset
1495 ctx->raw_samples[0] = ctx->raw_buffer + sconf->max_order;
9b56cd1e37b7 Add MPEG-4 Audio Lossless Coding (ALS) decoder.
cehoyos
parents:
diff changeset
1496 for (c = 1; c < avctx->channels; c++)
9b56cd1e37b7 Add MPEG-4 Audio Lossless Coding (ALS) decoder.
cehoyos
parents:
diff changeset
1497 ctx->raw_samples[c] = ctx->raw_samples[c - 1] + channel_size;
9b56cd1e37b7 Add MPEG-4 Audio Lossless Coding (ALS) decoder.
cehoyos
parents:
diff changeset
1498
9b56cd1e37b7 Add MPEG-4 Audio Lossless Coding (ALS) decoder.
cehoyos
parents:
diff changeset
1499 return 0;
9b56cd1e37b7 Add MPEG-4 Audio Lossless Coding (ALS) decoder.
cehoyos
parents:
diff changeset
1500 }
9b56cd1e37b7 Add MPEG-4 Audio Lossless Coding (ALS) decoder.
cehoyos
parents:
diff changeset
1501
9b56cd1e37b7 Add MPEG-4 Audio Lossless Coding (ALS) decoder.
cehoyos
parents:
diff changeset
1502
9b56cd1e37b7 Add MPEG-4 Audio Lossless Coding (ALS) decoder.
cehoyos
parents:
diff changeset
1503 /** Flushes (resets) the frame ID after seeking.
9b56cd1e37b7 Add MPEG-4 Audio Lossless Coding (ALS) decoder.
cehoyos
parents:
diff changeset
1504 */
9b56cd1e37b7 Add MPEG-4 Audio Lossless Coding (ALS) decoder.
cehoyos
parents:
diff changeset
1505 static av_cold void flush(AVCodecContext *avctx)
9b56cd1e37b7 Add MPEG-4 Audio Lossless Coding (ALS) decoder.
cehoyos
parents:
diff changeset
1506 {
9b56cd1e37b7 Add MPEG-4 Audio Lossless Coding (ALS) decoder.
cehoyos
parents:
diff changeset
1507 ALSDecContext *ctx = avctx->priv_data;
9b56cd1e37b7 Add MPEG-4 Audio Lossless Coding (ALS) decoder.
cehoyos
parents:
diff changeset
1508
9b56cd1e37b7 Add MPEG-4 Audio Lossless Coding (ALS) decoder.
cehoyos
parents:
diff changeset
1509 ctx->frame_id = 0;
9b56cd1e37b7 Add MPEG-4 Audio Lossless Coding (ALS) decoder.
cehoyos
parents:
diff changeset
1510 }
9b56cd1e37b7 Add MPEG-4 Audio Lossless Coding (ALS) decoder.
cehoyos
parents:
diff changeset
1511
9b56cd1e37b7 Add MPEG-4 Audio Lossless Coding (ALS) decoder.
cehoyos
parents:
diff changeset
1512
9b56cd1e37b7 Add MPEG-4 Audio Lossless Coding (ALS) decoder.
cehoyos
parents:
diff changeset
1513 AVCodec als_decoder = {
9b56cd1e37b7 Add MPEG-4 Audio Lossless Coding (ALS) decoder.
cehoyos
parents:
diff changeset
1514 "als",
9b56cd1e37b7 Add MPEG-4 Audio Lossless Coding (ALS) decoder.
cehoyos
parents:
diff changeset
1515 CODEC_TYPE_AUDIO,
9b56cd1e37b7 Add MPEG-4 Audio Lossless Coding (ALS) decoder.
cehoyos
parents:
diff changeset
1516 CODEC_ID_MP4ALS,
9b56cd1e37b7 Add MPEG-4 Audio Lossless Coding (ALS) decoder.
cehoyos
parents:
diff changeset
1517 sizeof(ALSDecContext),
9b56cd1e37b7 Add MPEG-4 Audio Lossless Coding (ALS) decoder.
cehoyos
parents:
diff changeset
1518 decode_init,
9b56cd1e37b7 Add MPEG-4 Audio Lossless Coding (ALS) decoder.
cehoyos
parents:
diff changeset
1519 NULL,
9b56cd1e37b7 Add MPEG-4 Audio Lossless Coding (ALS) decoder.
cehoyos
parents:
diff changeset
1520 decode_end,
9b56cd1e37b7 Add MPEG-4 Audio Lossless Coding (ALS) decoder.
cehoyos
parents:
diff changeset
1521 decode_frame,
9b56cd1e37b7 Add MPEG-4 Audio Lossless Coding (ALS) decoder.
cehoyos
parents:
diff changeset
1522 .flush = flush,
9b56cd1e37b7 Add MPEG-4 Audio Lossless Coding (ALS) decoder.
cehoyos
parents:
diff changeset
1523 .capabilities = CODEC_CAP_SUBFRAMES,
9b56cd1e37b7 Add MPEG-4 Audio Lossless Coding (ALS) decoder.
cehoyos
parents:
diff changeset
1524 .long_name = NULL_IF_CONFIG_SMALL("MPEG-4 Audio Lossless Coding (ALS)"),
9b56cd1e37b7 Add MPEG-4 Audio Lossless Coding (ALS) decoder.
cehoyos
parents:
diff changeset
1525 };
9b56cd1e37b7 Add MPEG-4 Audio Lossless Coding (ALS) decoder.
cehoyos
parents:
diff changeset
1526