annotate alsdec.c @ 11694:5e8fdcac294e libavcodec

Add support to the Y411 codec tag, corresponding to the rawvideo pixel format uyyvyy411. The codec tag is referenced in fourcc.org.
author stefano
date Sun, 09 May 2010 22:56:04 +0000
parents 7dd2a45249a9
children 74c0478534cf
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 /**
11644
7dd2a45249a9 Remove explicit filename from Doxygen @file commands.
diego
parents: 11560
diff changeset
23 * @file
10522
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"
11148
2d2780630361 Support arithmetic decoding in ALS.
thilo.borgmann
parents: 11071
diff changeset
37 #include "bgmc.h"
10522
9b56cd1e37b7 Add MPEG-4 Audio Lossless Coding (ALS) decoder.
cehoyos
parents:
diff changeset
38
10531
142645a57180 Merge data tables from als_data.h with the decoder source to reduce
thilo.borgmann
parents: 10530
diff changeset
39 #include <stdint.h>
142645a57180 Merge data tables from als_data.h with the decoder source to reduce
thilo.borgmann
parents: 10530
diff changeset
40
142645a57180 Merge data tables from als_data.h with the decoder source to reduce
thilo.borgmann
parents: 10530
diff changeset
41 /** 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
42 * 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
43 * 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
44 */
142645a57180 Merge data tables from als_data.h with the decoder source to reduce
thilo.borgmann
parents: 10530
diff changeset
45 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
46 { {-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
47 { 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
48 { -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
49 { 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
50 { {-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
51 { 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
52 {-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
53 { 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
54 { {-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
55 { 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
56 {-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
57 { 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
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
142645a57180 Merge data tables from als_data.h with the decoder source to reduce
thilo.borgmann
parents: 10530
diff changeset
61 /** 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
62 * 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
63 * 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
64 * 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
65 */
142645a57180 Merge data tables from als_data.h with the decoder source to reduce
thilo.borgmann
parents: 10530
diff changeset
66 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
67 -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
68 -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
69 -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
70 -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
71 -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
72 -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
73 -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
74 -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
75 -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
76 -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
77 -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
78 -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
79 -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
80 -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
81 -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
82 -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
83 -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
84 -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
85 -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
86 -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
87 -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
88 -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
89 -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
90 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
91 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
92 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
93 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
94 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
95 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
96 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
97 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
98 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
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
142645a57180 Merge data tables from als_data.h with the decoder source to reduce
thilo.borgmann
parents: 10530
diff changeset
102 /** 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
103 * 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
104 */
142645a57180 Merge data tables from als_data.h with the decoder source to reduce
thilo.borgmann
parents: 10530
diff changeset
105 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
106 { 0, 8, 16, 24},
142645a57180 Merge data tables from als_data.h with the decoder source to reduce
thilo.borgmann
parents: 10530
diff changeset
107 {32, 40, 48, 56},
142645a57180 Merge data tables from als_data.h with the decoder source to reduce
thilo.borgmann
parents: 10530
diff changeset
108 {64, 70, 76, 82},
142645a57180 Merge data tables from als_data.h with the decoder source to reduce
thilo.borgmann
parents: 10530
diff changeset
109 {88, 92, 96, 100}
142645a57180 Merge data tables from als_data.h with the decoder source to reduce
thilo.borgmann
parents: 10530
diff changeset
110 };
142645a57180 Merge data tables from als_data.h with the decoder source to reduce
thilo.borgmann
parents: 10530
diff changeset
111
10522
9b56cd1e37b7 Add MPEG-4 Audio Lossless Coding (ALS) decoder.
cehoyos
parents:
diff changeset
112
10802
4f614b69b4e5 Add multi-channel correlation support for ALS.
thilo.borgmann
parents: 10800
diff changeset
113 /** Inter-channel weighting factors for multi-channel correlation.
4f614b69b4e5 Add multi-channel correlation support for ALS.
thilo.borgmann
parents: 10800
diff changeset
114 * To be indexed by the Rice coded indices.
4f614b69b4e5 Add multi-channel correlation support for ALS.
thilo.borgmann
parents: 10800
diff changeset
115 */
4f614b69b4e5 Add multi-channel correlation support for ALS.
thilo.borgmann
parents: 10800
diff changeset
116 static const int16_t mcc_weightings[] = {
4f614b69b4e5 Add multi-channel correlation support for ALS.
thilo.borgmann
parents: 10800
diff changeset
117 204, 192, 179, 166, 153, 140, 128, 115,
4f614b69b4e5 Add multi-channel correlation support for ALS.
thilo.borgmann
parents: 10800
diff changeset
118 102, 89, 76, 64, 51, 38, 25, 12,
4f614b69b4e5 Add multi-channel correlation support for ALS.
thilo.borgmann
parents: 10800
diff changeset
119 0, -12, -25, -38, -51, -64, -76, -89,
4f614b69b4e5 Add multi-channel correlation support for ALS.
thilo.borgmann
parents: 10800
diff changeset
120 -102, -115, -128, -140, -153, -166, -179, -192
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
4f614b69b4e5 Add multi-channel correlation support for ALS.
thilo.borgmann
parents: 10800
diff changeset
123
11148
2d2780630361 Support arithmetic decoding in ALS.
thilo.borgmann
parents: 11071
diff changeset
124 /** Tail codes used in arithmetic coding using block Gilbert-Moore codes.
2d2780630361 Support arithmetic decoding in ALS.
thilo.borgmann
parents: 11071
diff changeset
125 */
2d2780630361 Support arithmetic decoding in ALS.
thilo.borgmann
parents: 11071
diff changeset
126 static const uint8_t tail_code[16][6] = {
2d2780630361 Support arithmetic decoding in ALS.
thilo.borgmann
parents: 11071
diff changeset
127 { 74, 44, 25, 13, 7, 3},
2d2780630361 Support arithmetic decoding in ALS.
thilo.borgmann
parents: 11071
diff changeset
128 { 68, 42, 24, 13, 7, 3},
2d2780630361 Support arithmetic decoding in ALS.
thilo.borgmann
parents: 11071
diff changeset
129 { 58, 39, 23, 13, 7, 3},
2d2780630361 Support arithmetic decoding in ALS.
thilo.borgmann
parents: 11071
diff changeset
130 {126, 70, 37, 19, 10, 5},
2d2780630361 Support arithmetic decoding in ALS.
thilo.borgmann
parents: 11071
diff changeset
131 {132, 70, 37, 20, 10, 5},
2d2780630361 Support arithmetic decoding in ALS.
thilo.borgmann
parents: 11071
diff changeset
132 {124, 70, 38, 20, 10, 5},
2d2780630361 Support arithmetic decoding in ALS.
thilo.borgmann
parents: 11071
diff changeset
133 {120, 69, 37, 20, 11, 5},
2d2780630361 Support arithmetic decoding in ALS.
thilo.borgmann
parents: 11071
diff changeset
134 {116, 67, 37, 20, 11, 5},
2d2780630361 Support arithmetic decoding in ALS.
thilo.borgmann
parents: 11071
diff changeset
135 {108, 66, 36, 20, 10, 5},
2d2780630361 Support arithmetic decoding in ALS.
thilo.borgmann
parents: 11071
diff changeset
136 {102, 62, 36, 20, 10, 5},
2d2780630361 Support arithmetic decoding in ALS.
thilo.borgmann
parents: 11071
diff changeset
137 { 88, 58, 34, 19, 10, 5},
2d2780630361 Support arithmetic decoding in ALS.
thilo.borgmann
parents: 11071
diff changeset
138 {162, 89, 49, 25, 13, 7},
2d2780630361 Support arithmetic decoding in ALS.
thilo.borgmann
parents: 11071
diff changeset
139 {156, 87, 49, 26, 14, 7},
2d2780630361 Support arithmetic decoding in ALS.
thilo.borgmann
parents: 11071
diff changeset
140 {150, 86, 47, 26, 14, 7},
2d2780630361 Support arithmetic decoding in ALS.
thilo.borgmann
parents: 11071
diff changeset
141 {142, 84, 47, 26, 14, 7},
2d2780630361 Support arithmetic decoding in ALS.
thilo.borgmann
parents: 11071
diff changeset
142 {131, 79, 46, 26, 14, 7}
2d2780630361 Support arithmetic decoding in ALS.
thilo.borgmann
parents: 11071
diff changeset
143 };
2d2780630361 Support arithmetic decoding in ALS.
thilo.borgmann
parents: 11071
diff changeset
144
2d2780630361 Support arithmetic decoding in ALS.
thilo.borgmann
parents: 11071
diff changeset
145
10522
9b56cd1e37b7 Add MPEG-4 Audio Lossless Coding (ALS) decoder.
cehoyos
parents:
diff changeset
146 enum RA_Flag {
9b56cd1e37b7 Add MPEG-4 Audio Lossless Coding (ALS) decoder.
cehoyos
parents:
diff changeset
147 RA_FLAG_NONE,
9b56cd1e37b7 Add MPEG-4 Audio Lossless Coding (ALS) decoder.
cehoyos
parents:
diff changeset
148 RA_FLAG_FRAMES,
9b56cd1e37b7 Add MPEG-4 Audio Lossless Coding (ALS) decoder.
cehoyos
parents:
diff changeset
149 RA_FLAG_HEADER
9b56cd1e37b7 Add MPEG-4 Audio Lossless Coding (ALS) decoder.
cehoyos
parents:
diff changeset
150 };
9b56cd1e37b7 Add MPEG-4 Audio Lossless Coding (ALS) decoder.
cehoyos
parents:
diff changeset
151
9b56cd1e37b7 Add MPEG-4 Audio Lossless Coding (ALS) decoder.
cehoyos
parents:
diff changeset
152
9b56cd1e37b7 Add MPEG-4 Audio Lossless Coding (ALS) decoder.
cehoyos
parents:
diff changeset
153 typedef struct {
9b56cd1e37b7 Add MPEG-4 Audio Lossless Coding (ALS) decoder.
cehoyos
parents:
diff changeset
154 uint32_t samples; ///< number of samples, 0xFFFFFFFF if unknown
9b56cd1e37b7 Add MPEG-4 Audio Lossless Coding (ALS) decoder.
cehoyos
parents:
diff changeset
155 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
156 int floating; ///< 1 = IEEE 32-bit floating-point, 0 = integer
9b56cd1e37b7 Add MPEG-4 Audio Lossless Coding (ALS) decoder.
cehoyos
parents:
diff changeset
157 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
158 int ra_distance; ///< distance between RA frames (in frames, 0...255)
9b56cd1e37b7 Add MPEG-4 Audio Lossless Coding (ALS) decoder.
cehoyos
parents:
diff changeset
159 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
160 int adapt_order; ///< adaptive order: 1 = on, 0 = off
9b56cd1e37b7 Add MPEG-4 Audio Lossless Coding (ALS) decoder.
cehoyos
parents:
diff changeset
161 int coef_table; ///< table index of Rice code parameters
9b56cd1e37b7 Add MPEG-4 Audio Lossless Coding (ALS) decoder.
cehoyos
parents:
diff changeset
162 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
163 int max_order; ///< maximum prediction order (0..1023)
9b56cd1e37b7 Add MPEG-4 Audio Lossless Coding (ALS) decoder.
cehoyos
parents:
diff changeset
164 int block_switching; ///< number of block switching levels
9b56cd1e37b7 Add MPEG-4 Audio Lossless Coding (ALS) decoder.
cehoyos
parents:
diff changeset
165 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
166 int sb_part; ///< sub-block partition
9b56cd1e37b7 Add MPEG-4 Audio Lossless Coding (ALS) decoder.
cehoyos
parents:
diff changeset
167 int joint_stereo; ///< joint stereo: 1 = on, 0 = off
9b56cd1e37b7 Add MPEG-4 Audio Lossless Coding (ALS) decoder.
cehoyos
parents:
diff changeset
168 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
169 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
170 int chan_sort; ///< channel rearrangement: 1 = on, 0 = off
9b56cd1e37b7 Add MPEG-4 Audio Lossless Coding (ALS) decoder.
cehoyos
parents:
diff changeset
171 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
172 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
173 int *chan_pos; ///< original channel positions
9b56cd1e37b7 Add MPEG-4 Audio Lossless Coding (ALS) decoder.
cehoyos
parents:
diff changeset
174 } ALSSpecificConfig;
9b56cd1e37b7 Add MPEG-4 Audio Lossless Coding (ALS) decoder.
cehoyos
parents:
diff changeset
175
9b56cd1e37b7 Add MPEG-4 Audio Lossless Coding (ALS) decoder.
cehoyos
parents:
diff changeset
176
9b56cd1e37b7 Add MPEG-4 Audio Lossless Coding (ALS) decoder.
cehoyos
parents:
diff changeset
177 typedef struct {
10802
4f614b69b4e5 Add multi-channel correlation support for ALS.
thilo.borgmann
parents: 10800
diff changeset
178 int stop_flag;
4f614b69b4e5 Add multi-channel correlation support for ALS.
thilo.borgmann
parents: 10800
diff changeset
179 int master_channel;
4f614b69b4e5 Add multi-channel correlation support for ALS.
thilo.borgmann
parents: 10800
diff changeset
180 int time_diff_flag;
4f614b69b4e5 Add multi-channel correlation support for ALS.
thilo.borgmann
parents: 10800
diff changeset
181 int time_diff_sign;
4f614b69b4e5 Add multi-channel correlation support for ALS.
thilo.borgmann
parents: 10800
diff changeset
182 int time_diff_index;
4f614b69b4e5 Add multi-channel correlation support for ALS.
thilo.borgmann
parents: 10800
diff changeset
183 int weighting[6];
4f614b69b4e5 Add multi-channel correlation support for ALS.
thilo.borgmann
parents: 10800
diff changeset
184 } ALSChannelData;
4f614b69b4e5 Add multi-channel correlation support for ALS.
thilo.borgmann
parents: 10800
diff changeset
185
4f614b69b4e5 Add multi-channel correlation support for ALS.
thilo.borgmann
parents: 10800
diff changeset
186
4f614b69b4e5 Add multi-channel correlation support for ALS.
thilo.borgmann
parents: 10800
diff changeset
187 typedef struct {
10522
9b56cd1e37b7 Add MPEG-4 Audio Lossless Coding (ALS) decoder.
cehoyos
parents:
diff changeset
188 AVCodecContext *avctx;
9b56cd1e37b7 Add MPEG-4 Audio Lossless Coding (ALS) decoder.
cehoyos
parents:
diff changeset
189 ALSSpecificConfig sconf;
9b56cd1e37b7 Add MPEG-4 Audio Lossless Coding (ALS) decoder.
cehoyos
parents:
diff changeset
190 GetBitContext gb;
9b56cd1e37b7 Add MPEG-4 Audio Lossless Coding (ALS) decoder.
cehoyos
parents:
diff changeset
191 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
192 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
193 unsigned int js_switch; ///< if true, joint-stereo decoding is enforced
9b56cd1e37b7 Add MPEG-4 Audio Lossless Coding (ALS) decoder.
cehoyos
parents:
diff changeset
194 unsigned int num_blocks; ///< number of blocks used in the current frame
11189
638415aafbda Limit the Rice parameter used for progressive decoding in ALS.
thilo.borgmann
parents: 11157
diff changeset
195 unsigned int s_max; ///< maximum Rice parameter allowed in entropy coding
11148
2d2780630361 Support arithmetic decoding in ALS.
thilo.borgmann
parents: 11071
diff changeset
196 uint8_t *bgmc_lut; ///< pointer at lookup tables used for BGMC
2d2780630361 Support arithmetic decoding in ALS.
thilo.borgmann
parents: 11071
diff changeset
197 unsigned int *bgmc_lut_status; ///< pointer at lookup table status flags used for BGMC
10530
d428e57f14c6 Add long-term prediction to the ALS decoder.
thilo.borgmann
parents: 10524
diff changeset
198 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
199 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
200 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
201 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
202 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
203 int32_t **quant_cof; ///< quantized parcor coefficients for a channel
4f614b69b4e5 Add multi-channel correlation support for ALS.
thilo.borgmann
parents: 10800
diff changeset
204 int32_t *quant_cof_buffer; ///< contains all quantized parcor coefficients
4f614b69b4e5 Add multi-channel correlation support for ALS.
thilo.borgmann
parents: 10800
diff changeset
205 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
206 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
207 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
208 ALSChannelData **chan_data; ///< channel data for multi-channel correlation
4f614b69b4e5 Add multi-channel correlation support for ALS.
thilo.borgmann
parents: 10800
diff changeset
209 ALSChannelData *chan_data_buffer; ///< contains channel data for all channels
4f614b69b4e5 Add multi-channel correlation support for ALS.
thilo.borgmann
parents: 10800
diff changeset
210 int *reverted_channels; ///< stores a flag for each reverted channel
10522
9b56cd1e37b7 Add MPEG-4 Audio Lossless Coding (ALS) decoder.
cehoyos
parents:
diff changeset
211 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
212 int32_t **raw_samples; ///< decoded raw samples for each channel
9b56cd1e37b7 Add MPEG-4 Audio Lossless Coding (ALS) decoder.
cehoyos
parents:
diff changeset
213 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
214 } ALSDecContext;
9b56cd1e37b7 Add MPEG-4 Audio Lossless Coding (ALS) decoder.
cehoyos
parents:
diff changeset
215
9b56cd1e37b7 Add MPEG-4 Audio Lossless Coding (ALS) decoder.
cehoyos
parents:
diff changeset
216
10681
997692df50c1 Read and decode block data in separate functions to prepare support for
thilo.borgmann
parents: 10535
diff changeset
217 typedef struct {
997692df50c1 Read and decode block data in separate functions to prepare support for
thilo.borgmann
parents: 10535
diff changeset
218 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
219 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
220 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
221 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
222 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
223 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
224 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
225 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
226 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
227 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
228 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
229 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
230 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
231 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
232 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
233 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
234 } ALSBlockData;
997692df50c1 Read and decode block data in separate functions to prepare support for
thilo.borgmann
parents: 10535
diff changeset
235
997692df50c1 Read and decode block data in separate functions to prepare support for
thilo.borgmann
parents: 10535
diff changeset
236
10522
9b56cd1e37b7 Add MPEG-4 Audio Lossless Coding (ALS) decoder.
cehoyos
parents:
diff changeset
237 static av_cold void dprint_specific_config(ALSDecContext *ctx)
9b56cd1e37b7 Add MPEG-4 Audio Lossless Coding (ALS) decoder.
cehoyos
parents:
diff changeset
238 {
9b56cd1e37b7 Add MPEG-4 Audio Lossless Coding (ALS) decoder.
cehoyos
parents:
diff changeset
239 #ifdef DEBUG
9b56cd1e37b7 Add MPEG-4 Audio Lossless Coding (ALS) decoder.
cehoyos
parents:
diff changeset
240 AVCodecContext *avctx = ctx->avctx;
9b56cd1e37b7 Add MPEG-4 Audio Lossless Coding (ALS) decoder.
cehoyos
parents:
diff changeset
241 ALSSpecificConfig *sconf = &ctx->sconf;
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 dprintf(avctx, "resolution = %i\n", sconf->resolution);
9b56cd1e37b7 Add MPEG-4 Audio Lossless Coding (ALS) decoder.
cehoyos
parents:
diff changeset
244 dprintf(avctx, "floating = %i\n", sconf->floating);
9b56cd1e37b7 Add MPEG-4 Audio Lossless Coding (ALS) decoder.
cehoyos
parents:
diff changeset
245 dprintf(avctx, "frame_length = %i\n", sconf->frame_length);
9b56cd1e37b7 Add MPEG-4 Audio Lossless Coding (ALS) decoder.
cehoyos
parents:
diff changeset
246 dprintf(avctx, "ra_distance = %i\n", sconf->ra_distance);
9b56cd1e37b7 Add MPEG-4 Audio Lossless Coding (ALS) decoder.
cehoyos
parents:
diff changeset
247 dprintf(avctx, "ra_flag = %i\n", sconf->ra_flag);
9b56cd1e37b7 Add MPEG-4 Audio Lossless Coding (ALS) decoder.
cehoyos
parents:
diff changeset
248 dprintf(avctx, "adapt_order = %i\n", sconf->adapt_order);
9b56cd1e37b7 Add MPEG-4 Audio Lossless Coding (ALS) decoder.
cehoyos
parents:
diff changeset
249 dprintf(avctx, "coef_table = %i\n", sconf->coef_table);
9b56cd1e37b7 Add MPEG-4 Audio Lossless Coding (ALS) decoder.
cehoyos
parents:
diff changeset
250 dprintf(avctx, "long_term_prediction = %i\n", sconf->long_term_prediction);
9b56cd1e37b7 Add MPEG-4 Audio Lossless Coding (ALS) decoder.
cehoyos
parents:
diff changeset
251 dprintf(avctx, "max_order = %i\n", sconf->max_order);
9b56cd1e37b7 Add MPEG-4 Audio Lossless Coding (ALS) decoder.
cehoyos
parents:
diff changeset
252 dprintf(avctx, "block_switching = %i\n", sconf->block_switching);
9b56cd1e37b7 Add MPEG-4 Audio Lossless Coding (ALS) decoder.
cehoyos
parents:
diff changeset
253 dprintf(avctx, "bgmc = %i\n", sconf->bgmc);
9b56cd1e37b7 Add MPEG-4 Audio Lossless Coding (ALS) decoder.
cehoyos
parents:
diff changeset
254 dprintf(avctx, "sb_part = %i\n", sconf->sb_part);
9b56cd1e37b7 Add MPEG-4 Audio Lossless Coding (ALS) decoder.
cehoyos
parents:
diff changeset
255 dprintf(avctx, "joint_stereo = %i\n", sconf->joint_stereo);
9b56cd1e37b7 Add MPEG-4 Audio Lossless Coding (ALS) decoder.
cehoyos
parents:
diff changeset
256 dprintf(avctx, "mc_coding = %i\n", sconf->mc_coding);
9b56cd1e37b7 Add MPEG-4 Audio Lossless Coding (ALS) decoder.
cehoyos
parents:
diff changeset
257 dprintf(avctx, "chan_config = %i\n", sconf->chan_config);
9b56cd1e37b7 Add MPEG-4 Audio Lossless Coding (ALS) decoder.
cehoyos
parents:
diff changeset
258 dprintf(avctx, "chan_sort = %i\n", sconf->chan_sort);
9b56cd1e37b7 Add MPEG-4 Audio Lossless Coding (ALS) decoder.
cehoyos
parents:
diff changeset
259 dprintf(avctx, "RLSLMS = %i\n", sconf->rlslms);
9b56cd1e37b7 Add MPEG-4 Audio Lossless Coding (ALS) decoder.
cehoyos
parents:
diff changeset
260 dprintf(avctx, "chan_config_info = %i\n", sconf->chan_config_info);
9b56cd1e37b7 Add MPEG-4 Audio Lossless Coding (ALS) decoder.
cehoyos
parents:
diff changeset
261 #endif
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
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 /** Reads an ALSSpecificConfig from a buffer into the output struct.
9b56cd1e37b7 Add MPEG-4 Audio Lossless Coding (ALS) decoder.
cehoyos
parents:
diff changeset
266 */
9b56cd1e37b7 Add MPEG-4 Audio Lossless Coding (ALS) decoder.
cehoyos
parents:
diff changeset
267 static av_cold int read_specific_config(ALSDecContext *ctx)
9b56cd1e37b7 Add MPEG-4 Audio Lossless Coding (ALS) decoder.
cehoyos
parents:
diff changeset
268 {
9b56cd1e37b7 Add MPEG-4 Audio Lossless Coding (ALS) decoder.
cehoyos
parents:
diff changeset
269 GetBitContext gb;
9b56cd1e37b7 Add MPEG-4 Audio Lossless Coding (ALS) decoder.
cehoyos
parents:
diff changeset
270 uint64_t ht_size;
9b56cd1e37b7 Add MPEG-4 Audio Lossless Coding (ALS) decoder.
cehoyos
parents:
diff changeset
271 int i, config_offset, crc_enabled;
9b56cd1e37b7 Add MPEG-4 Audio Lossless Coding (ALS) decoder.
cehoyos
parents:
diff changeset
272 MPEG4AudioConfig m4ac;
9b56cd1e37b7 Add MPEG-4 Audio Lossless Coding (ALS) decoder.
cehoyos
parents:
diff changeset
273 ALSSpecificConfig *sconf = &ctx->sconf;
9b56cd1e37b7 Add MPEG-4 Audio Lossless Coding (ALS) decoder.
cehoyos
parents:
diff changeset
274 AVCodecContext *avctx = ctx->avctx;
11071
327019a2d156 Remove unnecessary fields in ALSSpecificConfig.
thilo.borgmann
parents: 10861
diff changeset
275 uint32_t als_id, header_size, trailer_size;
10522
9b56cd1e37b7 Add MPEG-4 Audio Lossless Coding (ALS) decoder.
cehoyos
parents:
diff changeset
276
9b56cd1e37b7 Add MPEG-4 Audio Lossless Coding (ALS) decoder.
cehoyos
parents:
diff changeset
277 init_get_bits(&gb, avctx->extradata, avctx->extradata_size * 8);
9b56cd1e37b7 Add MPEG-4 Audio Lossless Coding (ALS) decoder.
cehoyos
parents:
diff changeset
278
9b56cd1e37b7 Add MPEG-4 Audio Lossless Coding (ALS) decoder.
cehoyos
parents:
diff changeset
279 config_offset = ff_mpeg4audio_get_config(&m4ac, avctx->extradata,
9b56cd1e37b7 Add MPEG-4 Audio Lossless Coding (ALS) decoder.
cehoyos
parents:
diff changeset
280 avctx->extradata_size);
9b56cd1e37b7 Add MPEG-4 Audio Lossless Coding (ALS) decoder.
cehoyos
parents:
diff changeset
281
9b56cd1e37b7 Add MPEG-4 Audio Lossless Coding (ALS) decoder.
cehoyos
parents:
diff changeset
282 if (config_offset < 0)
9b56cd1e37b7 Add MPEG-4 Audio Lossless Coding (ALS) decoder.
cehoyos
parents:
diff changeset
283 return -1;
9b56cd1e37b7 Add MPEG-4 Audio Lossless Coding (ALS) decoder.
cehoyos
parents:
diff changeset
284
9b56cd1e37b7 Add MPEG-4 Audio Lossless Coding (ALS) decoder.
cehoyos
parents:
diff changeset
285 skip_bits_long(&gb, config_offset);
9b56cd1e37b7 Add MPEG-4 Audio Lossless Coding (ALS) decoder.
cehoyos
parents:
diff changeset
286
9b56cd1e37b7 Add MPEG-4 Audio Lossless Coding (ALS) decoder.
cehoyos
parents:
diff changeset
287 if (get_bits_left(&gb) < (30 << 3))
9b56cd1e37b7 Add MPEG-4 Audio Lossless Coding (ALS) decoder.
cehoyos
parents:
diff changeset
288 return -1;
9b56cd1e37b7 Add MPEG-4 Audio Lossless Coding (ALS) decoder.
cehoyos
parents:
diff changeset
289
9b56cd1e37b7 Add MPEG-4 Audio Lossless Coding (ALS) decoder.
cehoyos
parents:
diff changeset
290 // read the fixed items
9b56cd1e37b7 Add MPEG-4 Audio Lossless Coding (ALS) decoder.
cehoyos
parents:
diff changeset
291 als_id = get_bits_long(&gb, 32);
9b56cd1e37b7 Add MPEG-4 Audio Lossless Coding (ALS) decoder.
cehoyos
parents:
diff changeset
292 avctx->sample_rate = m4ac.sample_rate;
9b56cd1e37b7 Add MPEG-4 Audio Lossless Coding (ALS) decoder.
cehoyos
parents:
diff changeset
293 skip_bits_long(&gb, 32); // sample rate already known
9b56cd1e37b7 Add MPEG-4 Audio Lossless Coding (ALS) decoder.
cehoyos
parents:
diff changeset
294 sconf->samples = get_bits_long(&gb, 32);
9b56cd1e37b7 Add MPEG-4 Audio Lossless Coding (ALS) decoder.
cehoyos
parents:
diff changeset
295 avctx->channels = m4ac.channels;
9b56cd1e37b7 Add MPEG-4 Audio Lossless Coding (ALS) decoder.
cehoyos
parents:
diff changeset
296 skip_bits(&gb, 16); // number of channels already knwon
9b56cd1e37b7 Add MPEG-4 Audio Lossless Coding (ALS) decoder.
cehoyos
parents:
diff changeset
297 skip_bits(&gb, 3); // skip file_type
9b56cd1e37b7 Add MPEG-4 Audio Lossless Coding (ALS) decoder.
cehoyos
parents:
diff changeset
298 sconf->resolution = get_bits(&gb, 3);
9b56cd1e37b7 Add MPEG-4 Audio Lossless Coding (ALS) decoder.
cehoyos
parents:
diff changeset
299 sconf->floating = get_bits1(&gb);
9b56cd1e37b7 Add MPEG-4 Audio Lossless Coding (ALS) decoder.
cehoyos
parents:
diff changeset
300 skip_bits1(&gb); // skip msb_first
9b56cd1e37b7 Add MPEG-4 Audio Lossless Coding (ALS) decoder.
cehoyos
parents:
diff changeset
301 sconf->frame_length = get_bits(&gb, 16) + 1;
9b56cd1e37b7 Add MPEG-4 Audio Lossless Coding (ALS) decoder.
cehoyos
parents:
diff changeset
302 sconf->ra_distance = get_bits(&gb, 8);
9b56cd1e37b7 Add MPEG-4 Audio Lossless Coding (ALS) decoder.
cehoyos
parents:
diff changeset
303 sconf->ra_flag = get_bits(&gb, 2);
9b56cd1e37b7 Add MPEG-4 Audio Lossless Coding (ALS) decoder.
cehoyos
parents:
diff changeset
304 sconf->adapt_order = get_bits1(&gb);
9b56cd1e37b7 Add MPEG-4 Audio Lossless Coding (ALS) decoder.
cehoyos
parents:
diff changeset
305 sconf->coef_table = get_bits(&gb, 2);
9b56cd1e37b7 Add MPEG-4 Audio Lossless Coding (ALS) decoder.
cehoyos
parents:
diff changeset
306 sconf->long_term_prediction = get_bits1(&gb);
9b56cd1e37b7 Add MPEG-4 Audio Lossless Coding (ALS) decoder.
cehoyos
parents:
diff changeset
307 sconf->max_order = get_bits(&gb, 10);
9b56cd1e37b7 Add MPEG-4 Audio Lossless Coding (ALS) decoder.
cehoyos
parents:
diff changeset
308 sconf->block_switching = get_bits(&gb, 2);
9b56cd1e37b7 Add MPEG-4 Audio Lossless Coding (ALS) decoder.
cehoyos
parents:
diff changeset
309 sconf->bgmc = get_bits1(&gb);
9b56cd1e37b7 Add MPEG-4 Audio Lossless Coding (ALS) decoder.
cehoyos
parents:
diff changeset
310 sconf->sb_part = get_bits1(&gb);
9b56cd1e37b7 Add MPEG-4 Audio Lossless Coding (ALS) decoder.
cehoyos
parents:
diff changeset
311 sconf->joint_stereo = get_bits1(&gb);
9b56cd1e37b7 Add MPEG-4 Audio Lossless Coding (ALS) decoder.
cehoyos
parents:
diff changeset
312 sconf->mc_coding = get_bits1(&gb);
9b56cd1e37b7 Add MPEG-4 Audio Lossless Coding (ALS) decoder.
cehoyos
parents:
diff changeset
313 sconf->chan_config = get_bits1(&gb);
9b56cd1e37b7 Add MPEG-4 Audio Lossless Coding (ALS) decoder.
cehoyos
parents:
diff changeset
314 sconf->chan_sort = get_bits1(&gb);
9b56cd1e37b7 Add MPEG-4 Audio Lossless Coding (ALS) decoder.
cehoyos
parents:
diff changeset
315 crc_enabled = get_bits1(&gb);
9b56cd1e37b7 Add MPEG-4 Audio Lossless Coding (ALS) decoder.
cehoyos
parents:
diff changeset
316 sconf->rlslms = get_bits1(&gb);
9b56cd1e37b7 Add MPEG-4 Audio Lossless Coding (ALS) decoder.
cehoyos
parents:
diff changeset
317 skip_bits(&gb, 5); // skip 5 reserved bits
9b56cd1e37b7 Add MPEG-4 Audio Lossless Coding (ALS) decoder.
cehoyos
parents:
diff changeset
318 skip_bits1(&gb); // skip aux_data_enabled
9b56cd1e37b7 Add MPEG-4 Audio Lossless Coding (ALS) decoder.
cehoyos
parents:
diff changeset
319
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 // check for ALSSpecificConfig struct
9b56cd1e37b7 Add MPEG-4 Audio Lossless Coding (ALS) decoder.
cehoyos
parents:
diff changeset
322 if (als_id != MKBETAG('A','L','S','\0'))
9b56cd1e37b7 Add MPEG-4 Audio Lossless Coding (ALS) decoder.
cehoyos
parents:
diff changeset
323 return -1;
9b56cd1e37b7 Add MPEG-4 Audio Lossless Coding (ALS) decoder.
cehoyos
parents:
diff changeset
324
9b56cd1e37b7 Add MPEG-4 Audio Lossless Coding (ALS) decoder.
cehoyos
parents:
diff changeset
325 ctx->cur_frame_length = sconf->frame_length;
9b56cd1e37b7 Add MPEG-4 Audio Lossless Coding (ALS) decoder.
cehoyos
parents:
diff changeset
326
9b56cd1e37b7 Add MPEG-4 Audio Lossless Coding (ALS) decoder.
cehoyos
parents:
diff changeset
327 // read channel config
9b56cd1e37b7 Add MPEG-4 Audio Lossless Coding (ALS) decoder.
cehoyos
parents:
diff changeset
328 if (sconf->chan_config)
9b56cd1e37b7 Add MPEG-4 Audio Lossless Coding (ALS) decoder.
cehoyos
parents:
diff changeset
329 sconf->chan_config_info = get_bits(&gb, 16);
9b56cd1e37b7 Add MPEG-4 Audio Lossless Coding (ALS) decoder.
cehoyos
parents:
diff changeset
330 // TODO: use this to set avctx->channel_layout
9b56cd1e37b7 Add MPEG-4 Audio Lossless Coding (ALS) decoder.
cehoyos
parents:
diff changeset
331
9b56cd1e37b7 Add MPEG-4 Audio Lossless Coding (ALS) decoder.
cehoyos
parents:
diff changeset
332
9b56cd1e37b7 Add MPEG-4 Audio Lossless Coding (ALS) decoder.
cehoyos
parents:
diff changeset
333 // read channel sorting
9b56cd1e37b7 Add MPEG-4 Audio Lossless Coding (ALS) decoder.
cehoyos
parents:
diff changeset
334 if (sconf->chan_sort && avctx->channels > 1) {
9b56cd1e37b7 Add MPEG-4 Audio Lossless Coding (ALS) decoder.
cehoyos
parents:
diff changeset
335 int chan_pos_bits = av_ceil_log2(avctx->channels);
9b56cd1e37b7 Add MPEG-4 Audio Lossless Coding (ALS) decoder.
cehoyos
parents:
diff changeset
336 int bits_needed = avctx->channels * chan_pos_bits + 7;
9b56cd1e37b7 Add MPEG-4 Audio Lossless Coding (ALS) decoder.
cehoyos
parents:
diff changeset
337 if (get_bits_left(&gb) < bits_needed)
9b56cd1e37b7 Add MPEG-4 Audio Lossless Coding (ALS) decoder.
cehoyos
parents:
diff changeset
338 return -1;
9b56cd1e37b7 Add MPEG-4 Audio Lossless Coding (ALS) decoder.
cehoyos
parents:
diff changeset
339
9b56cd1e37b7 Add MPEG-4 Audio Lossless Coding (ALS) decoder.
cehoyos
parents:
diff changeset
340 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
341 return AVERROR(ENOMEM);
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 for (i = 0; i < avctx->channels; i++)
9b56cd1e37b7 Add MPEG-4 Audio Lossless Coding (ALS) decoder.
cehoyos
parents:
diff changeset
344 sconf->chan_pos[i] = get_bits(&gb, chan_pos_bits);
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 align_get_bits(&gb);
9b56cd1e37b7 Add MPEG-4 Audio Lossless Coding (ALS) decoder.
cehoyos
parents:
diff changeset
347 // TODO: use this to actually do channel sorting
9b56cd1e37b7 Add MPEG-4 Audio Lossless Coding (ALS) decoder.
cehoyos
parents:
diff changeset
348 } else {
9b56cd1e37b7 Add MPEG-4 Audio Lossless Coding (ALS) decoder.
cehoyos
parents:
diff changeset
349 sconf->chan_sort = 0;
9b56cd1e37b7 Add MPEG-4 Audio Lossless Coding (ALS) decoder.
cehoyos
parents:
diff changeset
350 }
9b56cd1e37b7 Add MPEG-4 Audio Lossless Coding (ALS) decoder.
cehoyos
parents:
diff changeset
351
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 // read fixed header and trailer sizes,
9b56cd1e37b7 Add MPEG-4 Audio Lossless Coding (ALS) decoder.
cehoyos
parents:
diff changeset
354 // if size = 0xFFFFFFFF then there is no data field!
9b56cd1e37b7 Add MPEG-4 Audio Lossless Coding (ALS) decoder.
cehoyos
parents:
diff changeset
355 if (get_bits_left(&gb) < 64)
9b56cd1e37b7 Add MPEG-4 Audio Lossless Coding (ALS) decoder.
cehoyos
parents:
diff changeset
356 return -1;
9b56cd1e37b7 Add MPEG-4 Audio Lossless Coding (ALS) decoder.
cehoyos
parents:
diff changeset
357
11071
327019a2d156 Remove unnecessary fields in ALSSpecificConfig.
thilo.borgmann
parents: 10861
diff changeset
358 header_size = get_bits_long(&gb, 32);
327019a2d156 Remove unnecessary fields in ALSSpecificConfig.
thilo.borgmann
parents: 10861
diff changeset
359 trailer_size = get_bits_long(&gb, 32);
327019a2d156 Remove unnecessary fields in ALSSpecificConfig.
thilo.borgmann
parents: 10861
diff changeset
360 if (header_size == 0xFFFFFFFF)
327019a2d156 Remove unnecessary fields in ALSSpecificConfig.
thilo.borgmann
parents: 10861
diff changeset
361 header_size = 0;
327019a2d156 Remove unnecessary fields in ALSSpecificConfig.
thilo.borgmann
parents: 10861
diff changeset
362 if (trailer_size == 0xFFFFFFFF)
327019a2d156 Remove unnecessary fields in ALSSpecificConfig.
thilo.borgmann
parents: 10861
diff changeset
363 trailer_size = 0;
10522
9b56cd1e37b7 Add MPEG-4 Audio Lossless Coding (ALS) decoder.
cehoyos
parents:
diff changeset
364
11071
327019a2d156 Remove unnecessary fields in ALSSpecificConfig.
thilo.borgmann
parents: 10861
diff changeset
365 ht_size = ((int64_t)(header_size) + (int64_t)(trailer_size)) << 3;
10522
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
9b56cd1e37b7 Add MPEG-4 Audio Lossless Coding (ALS) decoder.
cehoyos
parents:
diff changeset
368 // skip the header and trailer data
9b56cd1e37b7 Add MPEG-4 Audio Lossless Coding (ALS) decoder.
cehoyos
parents:
diff changeset
369 if (get_bits_left(&gb) < ht_size)
9b56cd1e37b7 Add MPEG-4 Audio Lossless Coding (ALS) decoder.
cehoyos
parents:
diff changeset
370 return -1;
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 if (ht_size > INT32_MAX)
9b56cd1e37b7 Add MPEG-4 Audio Lossless Coding (ALS) decoder.
cehoyos
parents:
diff changeset
373 return -1;
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 skip_bits_long(&gb, ht_size);
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
9b56cd1e37b7 Add MPEG-4 Audio Lossless Coding (ALS) decoder.
cehoyos
parents:
diff changeset
378 // skip the crc data
9b56cd1e37b7 Add MPEG-4 Audio Lossless Coding (ALS) decoder.
cehoyos
parents:
diff changeset
379 if (crc_enabled) {
9b56cd1e37b7 Add MPEG-4 Audio Lossless Coding (ALS) decoder.
cehoyos
parents:
diff changeset
380 if (get_bits_left(&gb) < 32)
9b56cd1e37b7 Add MPEG-4 Audio Lossless Coding (ALS) decoder.
cehoyos
parents:
diff changeset
381 return -1;
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 skip_bits_long(&gb, 32);
9b56cd1e37b7 Add MPEG-4 Audio Lossless Coding (ALS) decoder.
cehoyos
parents:
diff changeset
384 }
9b56cd1e37b7 Add MPEG-4 Audio Lossless Coding (ALS) decoder.
cehoyos
parents:
diff changeset
385
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 // 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
388
9b56cd1e37b7 Add MPEG-4 Audio Lossless Coding (ALS) decoder.
cehoyos
parents:
diff changeset
389 dprint_specific_config(ctx);
9b56cd1e37b7 Add MPEG-4 Audio Lossless Coding (ALS) decoder.
cehoyos
parents:
diff changeset
390
9b56cd1e37b7 Add MPEG-4 Audio Lossless Coding (ALS) decoder.
cehoyos
parents:
diff changeset
391 return 0;
9b56cd1e37b7 Add MPEG-4 Audio Lossless Coding (ALS) decoder.
cehoyos
parents:
diff changeset
392 }
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
9b56cd1e37b7 Add MPEG-4 Audio Lossless Coding (ALS) decoder.
cehoyos
parents:
diff changeset
395 /** Checks the ALSSpecificConfig for unsupported features.
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 static int check_specific_config(ALSDecContext *ctx)
9b56cd1e37b7 Add MPEG-4 Audio Lossless Coding (ALS) decoder.
cehoyos
parents:
diff changeset
398 {
9b56cd1e37b7 Add MPEG-4 Audio Lossless Coding (ALS) decoder.
cehoyos
parents:
diff changeset
399 ALSSpecificConfig *sconf = &ctx->sconf;
9b56cd1e37b7 Add MPEG-4 Audio Lossless Coding (ALS) decoder.
cehoyos
parents:
diff changeset
400 int error = 0;
9b56cd1e37b7 Add MPEG-4 Audio Lossless Coding (ALS) decoder.
cehoyos
parents:
diff changeset
401
9b56cd1e37b7 Add MPEG-4 Audio Lossless Coding (ALS) decoder.
cehoyos
parents:
diff changeset
402 // report unsupported feature and set error value
9b56cd1e37b7 Add MPEG-4 Audio Lossless Coding (ALS) decoder.
cehoyos
parents:
diff changeset
403 #define MISSING_ERR(cond, str, errval) \
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 (cond) { \
9b56cd1e37b7 Add MPEG-4 Audio Lossless Coding (ALS) decoder.
cehoyos
parents:
diff changeset
406 av_log_missing_feature(ctx->avctx, str, 0); \
9b56cd1e37b7 Add MPEG-4 Audio Lossless Coding (ALS) decoder.
cehoyos
parents:
diff changeset
407 error = errval; \
9b56cd1e37b7 Add MPEG-4 Audio Lossless Coding (ALS) decoder.
cehoyos
parents:
diff changeset
408 } \
9b56cd1e37b7 Add MPEG-4 Audio Lossless Coding (ALS) decoder.
cehoyos
parents:
diff changeset
409 }
9b56cd1e37b7 Add MPEG-4 Audio Lossless Coding (ALS) decoder.
cehoyos
parents:
diff changeset
410
9b56cd1e37b7 Add MPEG-4 Audio Lossless Coding (ALS) decoder.
cehoyos
parents:
diff changeset
411 MISSING_ERR(sconf->floating, "Floating point decoding", -1);
9b56cd1e37b7 Add MPEG-4 Audio Lossless Coding (ALS) decoder.
cehoyos
parents:
diff changeset
412 MISSING_ERR(sconf->rlslms, "Adaptive RLS-LMS prediction", -1);
9b56cd1e37b7 Add MPEG-4 Audio Lossless Coding (ALS) decoder.
cehoyos
parents:
diff changeset
413 MISSING_ERR(sconf->chan_sort, "Channel sorting", 0);
9b56cd1e37b7 Add MPEG-4 Audio Lossless Coding (ALS) decoder.
cehoyos
parents:
diff changeset
414
9b56cd1e37b7 Add MPEG-4 Audio Lossless Coding (ALS) decoder.
cehoyos
parents:
diff changeset
415 return error;
9b56cd1e37b7 Add MPEG-4 Audio Lossless Coding (ALS) decoder.
cehoyos
parents:
diff changeset
416 }
9b56cd1e37b7 Add MPEG-4 Audio Lossless Coding (ALS) decoder.
cehoyos
parents:
diff changeset
417
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 /** 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
420 * 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
421 */
9b56cd1e37b7 Add MPEG-4 Audio Lossless Coding (ALS) decoder.
cehoyos
parents:
diff changeset
422 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
423 unsigned int div, unsigned int **div_blocks,
9b56cd1e37b7 Add MPEG-4 Audio Lossless Coding (ALS) decoder.
cehoyos
parents:
diff changeset
424 unsigned int *num_blocks)
9b56cd1e37b7 Add MPEG-4 Audio Lossless Coding (ALS) decoder.
cehoyos
parents:
diff changeset
425 {
9b56cd1e37b7 Add MPEG-4 Audio Lossless Coding (ALS) decoder.
cehoyos
parents:
diff changeset
426 if (n < 31 && ((bs_info << n) & 0x40000000)) {
9b56cd1e37b7 Add MPEG-4 Audio Lossless Coding (ALS) decoder.
cehoyos
parents:
diff changeset
427 // 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
428 // 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
429 n *= 2;
9b56cd1e37b7 Add MPEG-4 Audio Lossless Coding (ALS) decoder.
cehoyos
parents:
diff changeset
430 div += 1;
9b56cd1e37b7 Add MPEG-4 Audio Lossless Coding (ALS) decoder.
cehoyos
parents:
diff changeset
431 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
432 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
433 } else {
9b56cd1e37b7 Add MPEG-4 Audio Lossless Coding (ALS) decoder.
cehoyos
parents:
diff changeset
434 // 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
435 // (bit implicitly not set)
9b56cd1e37b7 Add MPEG-4 Audio Lossless Coding (ALS) decoder.
cehoyos
parents:
diff changeset
436 **div_blocks = div;
9b56cd1e37b7 Add MPEG-4 Audio Lossless Coding (ALS) decoder.
cehoyos
parents:
diff changeset
437 (*div_blocks)++;
9b56cd1e37b7 Add MPEG-4 Audio Lossless Coding (ALS) decoder.
cehoyos
parents:
diff changeset
438 (*num_blocks)++;
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 }
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
9b56cd1e37b7 Add MPEG-4 Audio Lossless Coding (ALS) decoder.
cehoyos
parents:
diff changeset
443 /** Reads and decodes a Rice codeword.
9b56cd1e37b7 Add MPEG-4 Audio Lossless Coding (ALS) decoder.
cehoyos
parents:
diff changeset
444 */
9b56cd1e37b7 Add MPEG-4 Audio Lossless Coding (ALS) decoder.
cehoyos
parents:
diff changeset
445 static int32_t decode_rice(GetBitContext *gb, unsigned int k)
9b56cd1e37b7 Add MPEG-4 Audio Lossless Coding (ALS) decoder.
cehoyos
parents:
diff changeset
446 {
10535
95f3daa991a2 Use get_bits_left() instead of size_in_bits - get_bits_count().
rbultje
parents: 10531
diff changeset
447 int max = get_bits_left(gb) - k;
10522
9b56cd1e37b7 Add MPEG-4 Audio Lossless Coding (ALS) decoder.
cehoyos
parents:
diff changeset
448 int q = get_unary(gb, 0, max);
9b56cd1e37b7 Add MPEG-4 Audio Lossless Coding (ALS) decoder.
cehoyos
parents:
diff changeset
449 int r = k ? get_bits1(gb) : !(q & 1);
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 (k > 1) {
9b56cd1e37b7 Add MPEG-4 Audio Lossless Coding (ALS) decoder.
cehoyos
parents:
diff changeset
452 q <<= (k - 1);
9b56cd1e37b7 Add MPEG-4 Audio Lossless Coding (ALS) decoder.
cehoyos
parents:
diff changeset
453 q += get_bits_long(gb, k - 1);
9b56cd1e37b7 Add MPEG-4 Audio Lossless Coding (ALS) decoder.
cehoyos
parents:
diff changeset
454 } else if (!k) {
9b56cd1e37b7 Add MPEG-4 Audio Lossless Coding (ALS) decoder.
cehoyos
parents:
diff changeset
455 q >>= 1;
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 return r ? q : ~q;
9b56cd1e37b7 Add MPEG-4 Audio Lossless Coding (ALS) decoder.
cehoyos
parents:
diff changeset
458 }
9b56cd1e37b7 Add MPEG-4 Audio Lossless Coding (ALS) decoder.
cehoyos
parents:
diff changeset
459
9b56cd1e37b7 Add MPEG-4 Audio Lossless Coding (ALS) decoder.
cehoyos
parents:
diff changeset
460
9b56cd1e37b7 Add MPEG-4 Audio Lossless Coding (ALS) decoder.
cehoyos
parents:
diff changeset
461 /** Converts PARCOR coefficient k to direct filter coefficient.
9b56cd1e37b7 Add MPEG-4 Audio Lossless Coding (ALS) decoder.
cehoyos
parents:
diff changeset
462 */
9b56cd1e37b7 Add MPEG-4 Audio Lossless Coding (ALS) decoder.
cehoyos
parents:
diff changeset
463 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
464 {
9b56cd1e37b7 Add MPEG-4 Audio Lossless Coding (ALS) decoder.
cehoyos
parents:
diff changeset
465 int i, j;
9b56cd1e37b7 Add MPEG-4 Audio Lossless Coding (ALS) decoder.
cehoyos
parents:
diff changeset
466
9b56cd1e37b7 Add MPEG-4 Audio Lossless Coding (ALS) decoder.
cehoyos
parents:
diff changeset
467 for (i = 0, j = k - 1; i < j; i++, j--) {
9b56cd1e37b7 Add MPEG-4 Audio Lossless Coding (ALS) decoder.
cehoyos
parents:
diff changeset
468 int tmp1 = ((MUL64(par[k], cof[j]) + (1 << 19)) >> 20);
9b56cd1e37b7 Add MPEG-4 Audio Lossless Coding (ALS) decoder.
cehoyos
parents:
diff changeset
469 cof[j] += ((MUL64(par[k], cof[i]) + (1 << 19)) >> 20);
9b56cd1e37b7 Add MPEG-4 Audio Lossless Coding (ALS) decoder.
cehoyos
parents:
diff changeset
470 cof[i] += tmp1;
9b56cd1e37b7 Add MPEG-4 Audio Lossless Coding (ALS) decoder.
cehoyos
parents:
diff changeset
471 }
9b56cd1e37b7 Add MPEG-4 Audio Lossless Coding (ALS) decoder.
cehoyos
parents:
diff changeset
472 if (i == j)
9b56cd1e37b7 Add MPEG-4 Audio Lossless Coding (ALS) decoder.
cehoyos
parents:
diff changeset
473 cof[i] += ((MUL64(par[k], cof[j]) + (1 << 19)) >> 20);
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 cof[k] = par[k];
9b56cd1e37b7 Add MPEG-4 Audio Lossless Coding (ALS) decoder.
cehoyos
parents:
diff changeset
476 }
9b56cd1e37b7 Add MPEG-4 Audio Lossless Coding (ALS) decoder.
cehoyos
parents:
diff changeset
477
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 /** Reads block switching field if necessary and sets actual block sizes.
9b56cd1e37b7 Add MPEG-4 Audio Lossless Coding (ALS) decoder.
cehoyos
parents:
diff changeset
480 * 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
481 * actual number of samples.
9b56cd1e37b7 Add MPEG-4 Audio Lossless Coding (ALS) decoder.
cehoyos
parents:
diff changeset
482 */
9b56cd1e37b7 Add MPEG-4 Audio Lossless Coding (ALS) decoder.
cehoyos
parents:
diff changeset
483 static void get_block_sizes(ALSDecContext *ctx, unsigned int *div_blocks,
9b56cd1e37b7 Add MPEG-4 Audio Lossless Coding (ALS) decoder.
cehoyos
parents:
diff changeset
484 uint32_t *bs_info)
9b56cd1e37b7 Add MPEG-4 Audio Lossless Coding (ALS) decoder.
cehoyos
parents:
diff changeset
485 {
9b56cd1e37b7 Add MPEG-4 Audio Lossless Coding (ALS) decoder.
cehoyos
parents:
diff changeset
486 ALSSpecificConfig *sconf = &ctx->sconf;
9b56cd1e37b7 Add MPEG-4 Audio Lossless Coding (ALS) decoder.
cehoyos
parents:
diff changeset
487 GetBitContext *gb = &ctx->gb;
9b56cd1e37b7 Add MPEG-4 Audio Lossless Coding (ALS) decoder.
cehoyos
parents:
diff changeset
488 unsigned int *ptr_div_blocks = div_blocks;
9b56cd1e37b7 Add MPEG-4 Audio Lossless Coding (ALS) decoder.
cehoyos
parents:
diff changeset
489 unsigned int b;
9b56cd1e37b7 Add MPEG-4 Audio Lossless Coding (ALS) decoder.
cehoyos
parents:
diff changeset
490
9b56cd1e37b7 Add MPEG-4 Audio Lossless Coding (ALS) decoder.
cehoyos
parents:
diff changeset
491 if (sconf->block_switching) {
9b56cd1e37b7 Add MPEG-4 Audio Lossless Coding (ALS) decoder.
cehoyos
parents:
diff changeset
492 unsigned int bs_info_len = 1 << (sconf->block_switching + 2);
9b56cd1e37b7 Add MPEG-4 Audio Lossless Coding (ALS) decoder.
cehoyos
parents:
diff changeset
493 *bs_info = get_bits_long(gb, bs_info_len);
9b56cd1e37b7 Add MPEG-4 Audio Lossless Coding (ALS) decoder.
cehoyos
parents:
diff changeset
494 *bs_info <<= (32 - bs_info_len);
9b56cd1e37b7 Add MPEG-4 Audio Lossless Coding (ALS) decoder.
cehoyos
parents:
diff changeset
495 }
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 ctx->num_blocks = 0;
9b56cd1e37b7 Add MPEG-4 Audio Lossless Coding (ALS) decoder.
cehoyos
parents:
diff changeset
498 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
499
9b56cd1e37b7 Add MPEG-4 Audio Lossless Coding (ALS) decoder.
cehoyos
parents:
diff changeset
500 // The last frame may have an overdetermined block structure given in
9b56cd1e37b7 Add MPEG-4 Audio Lossless Coding (ALS) decoder.
cehoyos
parents:
diff changeset
501 // the bitstream. In that case the defined block structure would need
9b56cd1e37b7 Add MPEG-4 Audio Lossless Coding (ALS) decoder.
cehoyos
parents:
diff changeset
502 // more samples than available to be consistent.
9b56cd1e37b7 Add MPEG-4 Audio Lossless Coding (ALS) decoder.
cehoyos
parents:
diff changeset
503 // 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
504 // to fit the actual number of available samples.
9b56cd1e37b7 Add MPEG-4 Audio Lossless Coding (ALS) decoder.
cehoyos
parents:
diff changeset
505 // Example: 5 samples, 2nd level block sizes: 2 2 2 2.
9b56cd1e37b7 Add MPEG-4 Audio Lossless Coding (ALS) decoder.
cehoyos
parents:
diff changeset
506 // This results in the actual block sizes: 2 2 1 0.
9b56cd1e37b7 Add MPEG-4 Audio Lossless Coding (ALS) decoder.
cehoyos
parents:
diff changeset
507 // 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
508 // codec RM22 revision 2.
9b56cd1e37b7 Add MPEG-4 Audio Lossless Coding (ALS) decoder.
cehoyos
parents:
diff changeset
509 // 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
510 // 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
511 // of 14496-3.
9b56cd1e37b7 Add MPEG-4 Audio Lossless Coding (ALS) decoder.
cehoyos
parents:
diff changeset
512 // 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
513 // frame.
9b56cd1e37b7 Add MPEG-4 Audio Lossless Coding (ALS) decoder.
cehoyos
parents:
diff changeset
514
9b56cd1e37b7 Add MPEG-4 Audio Lossless Coding (ALS) decoder.
cehoyos
parents:
diff changeset
515 for (b = 0; b < ctx->num_blocks; b++)
9b56cd1e37b7 Add MPEG-4 Audio Lossless Coding (ALS) decoder.
cehoyos
parents:
diff changeset
516 div_blocks[b] = ctx->sconf.frame_length >> div_blocks[b];
9b56cd1e37b7 Add MPEG-4 Audio Lossless Coding (ALS) decoder.
cehoyos
parents:
diff changeset
517
9b56cd1e37b7 Add MPEG-4 Audio Lossless Coding (ALS) decoder.
cehoyos
parents:
diff changeset
518 if (ctx->cur_frame_length != ctx->sconf.frame_length) {
9b56cd1e37b7 Add MPEG-4 Audio Lossless Coding (ALS) decoder.
cehoyos
parents:
diff changeset
519 unsigned int remaining = ctx->cur_frame_length;
9b56cd1e37b7 Add MPEG-4 Audio Lossless Coding (ALS) decoder.
cehoyos
parents:
diff changeset
520
9b56cd1e37b7 Add MPEG-4 Audio Lossless Coding (ALS) decoder.
cehoyos
parents:
diff changeset
521 for (b = 0; b < ctx->num_blocks; b++) {
11372
e6e95656937d Fix last frame block size correction.
thilo.borgmann
parents: 11209
diff changeset
522 if (remaining <= div_blocks[b]) {
10522
9b56cd1e37b7 Add MPEG-4 Audio Lossless Coding (ALS) decoder.
cehoyos
parents:
diff changeset
523 div_blocks[b] = remaining;
9b56cd1e37b7 Add MPEG-4 Audio Lossless Coding (ALS) decoder.
cehoyos
parents:
diff changeset
524 ctx->num_blocks = b + 1;
9b56cd1e37b7 Add MPEG-4 Audio Lossless Coding (ALS) decoder.
cehoyos
parents:
diff changeset
525 break;
9b56cd1e37b7 Add MPEG-4 Audio Lossless Coding (ALS) decoder.
cehoyos
parents:
diff changeset
526 }
9b56cd1e37b7 Add MPEG-4 Audio Lossless Coding (ALS) decoder.
cehoyos
parents:
diff changeset
527
9b56cd1e37b7 Add MPEG-4 Audio Lossless Coding (ALS) decoder.
cehoyos
parents:
diff changeset
528 remaining -= div_blocks[b];
9b56cd1e37b7 Add MPEG-4 Audio Lossless Coding (ALS) decoder.
cehoyos
parents:
diff changeset
529 }
9b56cd1e37b7 Add MPEG-4 Audio Lossless Coding (ALS) decoder.
cehoyos
parents:
diff changeset
530 }
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
9b56cd1e37b7 Add MPEG-4 Audio Lossless Coding (ALS) decoder.
cehoyos
parents:
diff changeset
533
9b56cd1e37b7 Add MPEG-4 Audio Lossless Coding (ALS) decoder.
cehoyos
parents:
diff changeset
534 /** Reads the block data for a constant block
9b56cd1e37b7 Add MPEG-4 Audio Lossless Coding (ALS) decoder.
cehoyos
parents:
diff changeset
535 */
10681
997692df50c1 Read and decode block data in separate functions to prepare support for
thilo.borgmann
parents: 10535
diff changeset
536 static void read_const_block_data(ALSDecContext *ctx, ALSBlockData *bd)
10522
9b56cd1e37b7 Add MPEG-4 Audio Lossless Coding (ALS) decoder.
cehoyos
parents:
diff changeset
537 {
9b56cd1e37b7 Add MPEG-4 Audio Lossless Coding (ALS) decoder.
cehoyos
parents:
diff changeset
538 ALSSpecificConfig *sconf = &ctx->sconf;
9b56cd1e37b7 Add MPEG-4 Audio Lossless Coding (ALS) decoder.
cehoyos
parents:
diff changeset
539 AVCodecContext *avctx = ctx->avctx;
9b56cd1e37b7 Add MPEG-4 Audio Lossless Coding (ALS) decoder.
cehoyos
parents:
diff changeset
540 GetBitContext *gb = &ctx->gb;
9b56cd1e37b7 Add MPEG-4 Audio Lossless Coding (ALS) decoder.
cehoyos
parents:
diff changeset
541
10681
997692df50c1 Read and decode block data in separate functions to prepare support for
thilo.borgmann
parents: 10535
diff changeset
542 bd->const_val = 0;
997692df50c1 Read and decode block data in separate functions to prepare support for
thilo.borgmann
parents: 10535
diff changeset
543 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
544 bd->js_blocks = get_bits1(gb);
10522
9b56cd1e37b7 Add MPEG-4 Audio Lossless Coding (ALS) decoder.
cehoyos
parents:
diff changeset
545
9b56cd1e37b7 Add MPEG-4 Audio Lossless Coding (ALS) decoder.
cehoyos
parents:
diff changeset
546 // skip 5 reserved bits
9b56cd1e37b7 Add MPEG-4 Audio Lossless Coding (ALS) decoder.
cehoyos
parents:
diff changeset
547 skip_bits(gb, 5);
9b56cd1e37b7 Add MPEG-4 Audio Lossless Coding (ALS) decoder.
cehoyos
parents:
diff changeset
548
10681
997692df50c1 Read and decode block data in separate functions to prepare support for
thilo.borgmann
parents: 10535
diff changeset
549 if (bd->const_block) {
10522
9b56cd1e37b7 Add MPEG-4 Audio Lossless Coding (ALS) decoder.
cehoyos
parents:
diff changeset
550 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
551 bd->const_val = get_sbits_long(gb, const_val_bits);
10522
9b56cd1e37b7 Add MPEG-4 Audio Lossless Coding (ALS) decoder.
cehoyos
parents:
diff changeset
552 }
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 // 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
555 bd->const_block = 1;
997692df50c1 Read and decode block data in separate functions to prepare support for
thilo.borgmann
parents: 10535
diff changeset
556 }
997692df50c1 Read and decode block data in separate functions to prepare support for
thilo.borgmann
parents: 10535
diff changeset
557
997692df50c1 Read and decode block data in separate functions to prepare support for
thilo.borgmann
parents: 10535
diff changeset
558
997692df50c1 Read and decode block data in separate functions to prepare support for
thilo.borgmann
parents: 10535
diff changeset
559 /** 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
560 */
997692df50c1 Read and decode block data in separate functions to prepare support for
thilo.borgmann
parents: 10535
diff changeset
561 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
562 {
997692df50c1 Read and decode block data in separate functions to prepare support for
thilo.borgmann
parents: 10535
diff changeset
563 int smp = bd->block_length;
997692df50c1 Read and decode block data in separate functions to prepare support for
thilo.borgmann
parents: 10535
diff changeset
564 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
565 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
566
10522
9b56cd1e37b7 Add MPEG-4 Audio Lossless Coding (ALS) decoder.
cehoyos
parents:
diff changeset
567 // 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
568 for (; smp; smp--)
997692df50c1 Read and decode block data in separate functions to prepare support for
thilo.borgmann
parents: 10535
diff changeset
569 *dst++ = val;
10522
9b56cd1e37b7 Add MPEG-4 Audio Lossless Coding (ALS) decoder.
cehoyos
parents:
diff changeset
570 }
9b56cd1e37b7 Add MPEG-4 Audio Lossless Coding (ALS) decoder.
cehoyos
parents:
diff changeset
571
9b56cd1e37b7 Add MPEG-4 Audio Lossless Coding (ALS) decoder.
cehoyos
parents:
diff changeset
572
9b56cd1e37b7 Add MPEG-4 Audio Lossless Coding (ALS) decoder.
cehoyos
parents:
diff changeset
573 /** Reads the block data for a non-constant block
9b56cd1e37b7 Add MPEG-4 Audio Lossless Coding (ALS) decoder.
cehoyos
parents:
diff changeset
574 */
10681
997692df50c1 Read and decode block data in separate functions to prepare support for
thilo.borgmann
parents: 10535
diff changeset
575 static int read_var_block_data(ALSDecContext *ctx, ALSBlockData *bd)
10522
9b56cd1e37b7 Add MPEG-4 Audio Lossless Coding (ALS) decoder.
cehoyos
parents:
diff changeset
576 {
9b56cd1e37b7 Add MPEG-4 Audio Lossless Coding (ALS) decoder.
cehoyos
parents:
diff changeset
577 ALSSpecificConfig *sconf = &ctx->sconf;
9b56cd1e37b7 Add MPEG-4 Audio Lossless Coding (ALS) decoder.
cehoyos
parents:
diff changeset
578 AVCodecContext *avctx = ctx->avctx;
9b56cd1e37b7 Add MPEG-4 Audio Lossless Coding (ALS) decoder.
cehoyos
parents:
diff changeset
579 GetBitContext *gb = &ctx->gb;
9b56cd1e37b7 Add MPEG-4 Audio Lossless Coding (ALS) decoder.
cehoyos
parents:
diff changeset
580 unsigned int k;
9b56cd1e37b7 Add MPEG-4 Audio Lossless Coding (ALS) decoder.
cehoyos
parents:
diff changeset
581 unsigned int s[8];
11148
2d2780630361 Support arithmetic decoding in ALS.
thilo.borgmann
parents: 11071
diff changeset
582 unsigned int sx[8];
10522
9b56cd1e37b7 Add MPEG-4 Audio Lossless Coding (ALS) decoder.
cehoyos
parents:
diff changeset
583 unsigned int sub_blocks, log2_sub_blocks, sb_length;
9b56cd1e37b7 Add MPEG-4 Audio Lossless Coding (ALS) decoder.
cehoyos
parents:
diff changeset
584 unsigned int start = 0;
10681
997692df50c1 Read and decode block data in separate functions to prepare support for
thilo.borgmann
parents: 10535
diff changeset
585 unsigned int opt_order;
997692df50c1 Read and decode block data in separate functions to prepare support for
thilo.borgmann
parents: 10535
diff changeset
586 int sb;
997692df50c1 Read and decode block data in separate functions to prepare support for
thilo.borgmann
parents: 10535
diff changeset
587 int32_t *quant_cof = bd->quant_cof;
11148
2d2780630361 Support arithmetic decoding in ALS.
thilo.borgmann
parents: 11071
diff changeset
588 int32_t *current_res;
10681
997692df50c1 Read and decode block data in separate functions to prepare support for
thilo.borgmann
parents: 10535
diff changeset
589
10522
9b56cd1e37b7 Add MPEG-4 Audio Lossless Coding (ALS) decoder.
cehoyos
parents:
diff changeset
590
10681
997692df50c1 Read and decode block data in separate functions to prepare support for
thilo.borgmann
parents: 10535
diff changeset
591 // 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
592 bd->const_block = 0;
997692df50c1 Read and decode block data in separate functions to prepare support for
thilo.borgmann
parents: 10535
diff changeset
593
997692df50c1 Read and decode block data in separate functions to prepare support for
thilo.borgmann
parents: 10535
diff changeset
594 bd->opt_order = 1;
997692df50c1 Read and decode block data in separate functions to prepare support for
thilo.borgmann
parents: 10535
diff changeset
595 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
596
997692df50c1 Read and decode block data in separate functions to prepare support for
thilo.borgmann
parents: 10535
diff changeset
597 opt_order = bd->opt_order;
10522
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 // determine the number of subblocks for entropy decoding
9b56cd1e37b7 Add MPEG-4 Audio Lossless Coding (ALS) decoder.
cehoyos
parents:
diff changeset
600 if (!sconf->bgmc && !sconf->sb_part) {
9b56cd1e37b7 Add MPEG-4 Audio Lossless Coding (ALS) decoder.
cehoyos
parents:
diff changeset
601 log2_sub_blocks = 0;
9b56cd1e37b7 Add MPEG-4 Audio Lossless Coding (ALS) decoder.
cehoyos
parents:
diff changeset
602 } else {
9b56cd1e37b7 Add MPEG-4 Audio Lossless Coding (ALS) decoder.
cehoyos
parents:
diff changeset
603 if (sconf->bgmc && sconf->sb_part)
9b56cd1e37b7 Add MPEG-4 Audio Lossless Coding (ALS) decoder.
cehoyos
parents:
diff changeset
604 log2_sub_blocks = get_bits(gb, 2);
9b56cd1e37b7 Add MPEG-4 Audio Lossless Coding (ALS) decoder.
cehoyos
parents:
diff changeset
605 else
9b56cd1e37b7 Add MPEG-4 Audio Lossless Coding (ALS) decoder.
cehoyos
parents:
diff changeset
606 log2_sub_blocks = 2 * get_bits1(gb);
9b56cd1e37b7 Add MPEG-4 Audio Lossless Coding (ALS) decoder.
cehoyos
parents:
diff changeset
607 }
9b56cd1e37b7 Add MPEG-4 Audio Lossless Coding (ALS) decoder.
cehoyos
parents:
diff changeset
608
9b56cd1e37b7 Add MPEG-4 Audio Lossless Coding (ALS) decoder.
cehoyos
parents:
diff changeset
609 sub_blocks = 1 << log2_sub_blocks;
9b56cd1e37b7 Add MPEG-4 Audio Lossless Coding (ALS) decoder.
cehoyos
parents:
diff changeset
610
9b56cd1e37b7 Add MPEG-4 Audio Lossless Coding (ALS) decoder.
cehoyos
parents:
diff changeset
611 // do not continue in case of a damaged stream since
9b56cd1e37b7 Add MPEG-4 Audio Lossless Coding (ALS) decoder.
cehoyos
parents:
diff changeset
612 // 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
613 if (bd->block_length & (sub_blocks - 1)) {
10522
9b56cd1e37b7 Add MPEG-4 Audio Lossless Coding (ALS) decoder.
cehoyos
parents:
diff changeset
614 av_log(avctx, AV_LOG_WARNING,
9b56cd1e37b7 Add MPEG-4 Audio Lossless Coding (ALS) decoder.
cehoyos
parents:
diff changeset
615 "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
616 return -1;
9b56cd1e37b7 Add MPEG-4 Audio Lossless Coding (ALS) decoder.
cehoyos
parents:
diff changeset
617 }
9b56cd1e37b7 Add MPEG-4 Audio Lossless Coding (ALS) decoder.
cehoyos
parents:
diff changeset
618
10681
997692df50c1 Read and decode block data in separate functions to prepare support for
thilo.borgmann
parents: 10535
diff changeset
619 sb_length = bd->block_length >> log2_sub_blocks;
10522
9b56cd1e37b7 Add MPEG-4 Audio Lossless Coding (ALS) decoder.
cehoyos
parents:
diff changeset
620
11148
2d2780630361 Support arithmetic decoding in ALS.
thilo.borgmann
parents: 11071
diff changeset
621 if (sconf->bgmc) {
2d2780630361 Support arithmetic decoding in ALS.
thilo.borgmann
parents: 11071
diff changeset
622 s[0] = get_bits(gb, 8 + (sconf->resolution > 1));
2d2780630361 Support arithmetic decoding in ALS.
thilo.borgmann
parents: 11071
diff changeset
623 for (k = 1; k < sub_blocks; k++)
2d2780630361 Support arithmetic decoding in ALS.
thilo.borgmann
parents: 11071
diff changeset
624 s[k] = s[k - 1] + decode_rice(gb, 2);
10522
9b56cd1e37b7 Add MPEG-4 Audio Lossless Coding (ALS) decoder.
cehoyos
parents:
diff changeset
625
11148
2d2780630361 Support arithmetic decoding in ALS.
thilo.borgmann
parents: 11071
diff changeset
626 for (k = 0; k < sub_blocks; k++) {
2d2780630361 Support arithmetic decoding in ALS.
thilo.borgmann
parents: 11071
diff changeset
627 sx[k] = s[k] & 0x0F;
2d2780630361 Support arithmetic decoding in ALS.
thilo.borgmann
parents: 11071
diff changeset
628 s [k] >>= 4;
2d2780630361 Support arithmetic decoding in ALS.
thilo.borgmann
parents: 11071
diff changeset
629 }
10522
9b56cd1e37b7 Add MPEG-4 Audio Lossless Coding (ALS) decoder.
cehoyos
parents:
diff changeset
630 } else {
9b56cd1e37b7 Add MPEG-4 Audio Lossless Coding (ALS) decoder.
cehoyos
parents:
diff changeset
631 s[0] = get_bits(gb, 4 + (sconf->resolution > 1));
9b56cd1e37b7 Add MPEG-4 Audio Lossless Coding (ALS) decoder.
cehoyos
parents:
diff changeset
632 for (k = 1; k < sub_blocks; k++)
9b56cd1e37b7 Add MPEG-4 Audio Lossless Coding (ALS) decoder.
cehoyos
parents:
diff changeset
633 s[k] = s[k - 1] + decode_rice(gb, 0);
9b56cd1e37b7 Add MPEG-4 Audio Lossless Coding (ALS) decoder.
cehoyos
parents:
diff changeset
634 }
9b56cd1e37b7 Add MPEG-4 Audio Lossless Coding (ALS) decoder.
cehoyos
parents:
diff changeset
635
9b56cd1e37b7 Add MPEG-4 Audio Lossless Coding (ALS) decoder.
cehoyos
parents:
diff changeset
636 if (get_bits1(gb))
10681
997692df50c1 Read and decode block data in separate functions to prepare support for
thilo.borgmann
parents: 10535
diff changeset
637 bd->shift_lsbs = get_bits(gb, 4) + 1;
10522
9b56cd1e37b7 Add MPEG-4 Audio Lossless Coding (ALS) decoder.
cehoyos
parents:
diff changeset
638
10681
997692df50c1 Read and decode block data in separate functions to prepare support for
thilo.borgmann
parents: 10535
diff changeset
639 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
640
9b56cd1e37b7 Add MPEG-4 Audio Lossless Coding (ALS) decoder.
cehoyos
parents:
diff changeset
641
9b56cd1e37b7 Add MPEG-4 Audio Lossless Coding (ALS) decoder.
cehoyos
parents:
diff changeset
642 if (!sconf->rlslms) {
9b56cd1e37b7 Add MPEG-4 Audio Lossless Coding (ALS) decoder.
cehoyos
parents:
diff changeset
643 if (sconf->adapt_order) {
10681
997692df50c1 Read and decode block data in separate functions to prepare support for
thilo.borgmann
parents: 10535
diff changeset
644 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
645 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
646 bd->opt_order = get_bits(gb, opt_order_length);
10522
9b56cd1e37b7 Add MPEG-4 Audio Lossless Coding (ALS) decoder.
cehoyos
parents:
diff changeset
647 } else {
10681
997692df50c1 Read and decode block data in separate functions to prepare support for
thilo.borgmann
parents: 10535
diff changeset
648 bd->opt_order = sconf->max_order;
10522
9b56cd1e37b7 Add MPEG-4 Audio Lossless Coding (ALS) decoder.
cehoyos
parents:
diff changeset
649 }
9b56cd1e37b7 Add MPEG-4 Audio Lossless Coding (ALS) decoder.
cehoyos
parents:
diff changeset
650
10681
997692df50c1 Read and decode block data in separate functions to prepare support for
thilo.borgmann
parents: 10535
diff changeset
651 opt_order = bd->opt_order;
997692df50c1 Read and decode block data in separate functions to prepare support for
thilo.borgmann
parents: 10535
diff changeset
652
10522
9b56cd1e37b7 Add MPEG-4 Audio Lossless Coding (ALS) decoder.
cehoyos
parents:
diff changeset
653 if (opt_order) {
9b56cd1e37b7 Add MPEG-4 Audio Lossless Coding (ALS) decoder.
cehoyos
parents:
diff changeset
654 int add_base;
9b56cd1e37b7 Add MPEG-4 Audio Lossless Coding (ALS) decoder.
cehoyos
parents:
diff changeset
655
9b56cd1e37b7 Add MPEG-4 Audio Lossless Coding (ALS) decoder.
cehoyos
parents:
diff changeset
656 if (sconf->coef_table == 3) {
9b56cd1e37b7 Add MPEG-4 Audio Lossless Coding (ALS) decoder.
cehoyos
parents:
diff changeset
657 add_base = 0x7F;
9b56cd1e37b7 Add MPEG-4 Audio Lossless Coding (ALS) decoder.
cehoyos
parents:
diff changeset
658
9b56cd1e37b7 Add MPEG-4 Audio Lossless Coding (ALS) decoder.
cehoyos
parents:
diff changeset
659 // read coefficient 0
9b56cd1e37b7 Add MPEG-4 Audio Lossless Coding (ALS) decoder.
cehoyos
parents:
diff changeset
660 quant_cof[0] = 32 * parcor_scaled_values[get_bits(gb, 7)];
9b56cd1e37b7 Add MPEG-4 Audio Lossless Coding (ALS) decoder.
cehoyos
parents:
diff changeset
661
9b56cd1e37b7 Add MPEG-4 Audio Lossless Coding (ALS) decoder.
cehoyos
parents:
diff changeset
662 // read coefficient 1
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[get_bits(gb, 7)];
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 // read coefficients 2 to opt_order
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] = get_bits(gb, 7);
9b56cd1e37b7 Add MPEG-4 Audio Lossless Coding (ALS) decoder.
cehoyos
parents:
diff changeset
669 } else {
9b56cd1e37b7 Add MPEG-4 Audio Lossless Coding (ALS) decoder.
cehoyos
parents:
diff changeset
670 int k_max;
9b56cd1e37b7 Add MPEG-4 Audio Lossless Coding (ALS) decoder.
cehoyos
parents:
diff changeset
671 add_base = 1;
9b56cd1e37b7 Add MPEG-4 Audio Lossless Coding (ALS) decoder.
cehoyos
parents:
diff changeset
672
9b56cd1e37b7 Add MPEG-4 Audio Lossless Coding (ALS) decoder.
cehoyos
parents:
diff changeset
673 // read coefficient 0 to 19
9b56cd1e37b7 Add MPEG-4 Audio Lossless Coding (ALS) decoder.
cehoyos
parents:
diff changeset
674 k_max = FFMIN(opt_order, 20);
9b56cd1e37b7 Add MPEG-4 Audio Lossless Coding (ALS) decoder.
cehoyos
parents:
diff changeset
675 for (k = 0; k < k_max; k++) {
9b56cd1e37b7 Add MPEG-4 Audio Lossless Coding (ALS) decoder.
cehoyos
parents:
diff changeset
676 int rice_param = parcor_rice_table[sconf->coef_table][k][1];
9b56cd1e37b7 Add MPEG-4 Audio Lossless Coding (ALS) decoder.
cehoyos
parents:
diff changeset
677 int offset = parcor_rice_table[sconf->coef_table][k][0];
9b56cd1e37b7 Add MPEG-4 Audio Lossless Coding (ALS) decoder.
cehoyos
parents:
diff changeset
678 quant_cof[k] = decode_rice(gb, rice_param) + offset;
9b56cd1e37b7 Add MPEG-4 Audio Lossless Coding (ALS) decoder.
cehoyos
parents:
diff changeset
679 }
9b56cd1e37b7 Add MPEG-4 Audio Lossless Coding (ALS) decoder.
cehoyos
parents:
diff changeset
680
9b56cd1e37b7 Add MPEG-4 Audio Lossless Coding (ALS) decoder.
cehoyos
parents:
diff changeset
681 // read coefficients 20 to 126
9b56cd1e37b7 Add MPEG-4 Audio Lossless Coding (ALS) decoder.
cehoyos
parents:
diff changeset
682 k_max = FFMIN(opt_order, 127);
9b56cd1e37b7 Add MPEG-4 Audio Lossless Coding (ALS) decoder.
cehoyos
parents:
diff changeset
683 for (; k < k_max; k++)
9b56cd1e37b7 Add MPEG-4 Audio Lossless Coding (ALS) decoder.
cehoyos
parents:
diff changeset
684 quant_cof[k] = decode_rice(gb, 2) + (k & 1);
9b56cd1e37b7 Add MPEG-4 Audio Lossless Coding (ALS) decoder.
cehoyos
parents:
diff changeset
685
9b56cd1e37b7 Add MPEG-4 Audio Lossless Coding (ALS) decoder.
cehoyos
parents:
diff changeset
686 // read coefficients 127 to opt_order
9b56cd1e37b7 Add MPEG-4 Audio Lossless Coding (ALS) decoder.
cehoyos
parents:
diff changeset
687 for (; k < opt_order; k++)
9b56cd1e37b7 Add MPEG-4 Audio Lossless Coding (ALS) decoder.
cehoyos
parents:
diff changeset
688 quant_cof[k] = decode_rice(gb, 1);
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 quant_cof[0] = 32 * parcor_scaled_values[quant_cof[0] + 64];
9b56cd1e37b7 Add MPEG-4 Audio Lossless Coding (ALS) decoder.
cehoyos
parents:
diff changeset
691
9b56cd1e37b7 Add MPEG-4 Audio Lossless Coding (ALS) decoder.
cehoyos
parents:
diff changeset
692 if (opt_order > 1)
9b56cd1e37b7 Add MPEG-4 Audio Lossless Coding (ALS) decoder.
cehoyos
parents:
diff changeset
693 quant_cof[1] = -32 * parcor_scaled_values[quant_cof[1] + 64];
9b56cd1e37b7 Add MPEG-4 Audio Lossless Coding (ALS) decoder.
cehoyos
parents:
diff changeset
694 }
9b56cd1e37b7 Add MPEG-4 Audio Lossless Coding (ALS) decoder.
cehoyos
parents:
diff changeset
695
9b56cd1e37b7 Add MPEG-4 Audio Lossless Coding (ALS) decoder.
cehoyos
parents:
diff changeset
696 for (k = 2; k < opt_order; k++)
9b56cd1e37b7 Add MPEG-4 Audio Lossless Coding (ALS) decoder.
cehoyos
parents:
diff changeset
697 quant_cof[k] = (quant_cof[k] << 14) + (add_base << 13);
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 }
9b56cd1e37b7 Add MPEG-4 Audio Lossless Coding (ALS) decoder.
cehoyos
parents:
diff changeset
700
10530
d428e57f14c6 Add long-term prediction to the ALS decoder.
thilo.borgmann
parents: 10524
diff changeset
701 // read LTP gain and lag values
d428e57f14c6 Add long-term prediction to the ALS decoder.
thilo.borgmann
parents: 10524
diff changeset
702 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
703 *bd->use_ltp = get_bits1(gb);
10530
d428e57f14c6 Add long-term prediction to the ALS decoder.
thilo.borgmann
parents: 10524
diff changeset
704
10681
997692df50c1 Read and decode block data in separate functions to prepare support for
thilo.borgmann
parents: 10535
diff changeset
705 if (*bd->use_ltp) {
11209
8173c059f769 Do sequential bit reading outside of []-operators.
thilo.borgmann
parents: 11199
diff changeset
706 int r, c;
8173c059f769 Do sequential bit reading outside of []-operators.
thilo.borgmann
parents: 11199
diff changeset
707
10681
997692df50c1 Read and decode block data in separate functions to prepare support for
thilo.borgmann
parents: 10535
diff changeset
708 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
709 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
710
11209
8173c059f769 Do sequential bit reading outside of []-operators.
thilo.borgmann
parents: 11199
diff changeset
711 r = get_unary(gb, 0, 4);
8173c059f769 Do sequential bit reading outside of []-operators.
thilo.borgmann
parents: 11199
diff changeset
712 c = get_bits(gb, 2);
8173c059f769 Do sequential bit reading outside of []-operators.
thilo.borgmann
parents: 11199
diff changeset
713 bd->ltp_gain[2] = ltp_gain_values[r][c];
10530
d428e57f14c6 Add long-term prediction to the ALS decoder.
thilo.borgmann
parents: 10524
diff changeset
714
10681
997692df50c1 Read and decode block data in separate functions to prepare support for
thilo.borgmann
parents: 10535
diff changeset
715 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
716 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
717
10681
997692df50c1 Read and decode block data in separate functions to prepare support for
thilo.borgmann
parents: 10535
diff changeset
718 *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
719 *bd->ltp_lag += FFMAX(4, opt_order + 1);
10530
d428e57f14c6 Add long-term prediction to the ALS decoder.
thilo.borgmann
parents: 10524
diff changeset
720 }
d428e57f14c6 Add long-term prediction to the ALS decoder.
thilo.borgmann
parents: 10524
diff changeset
721 }
10522
9b56cd1e37b7 Add MPEG-4 Audio Lossless Coding (ALS) decoder.
cehoyos
parents:
diff changeset
722
9b56cd1e37b7 Add MPEG-4 Audio Lossless Coding (ALS) decoder.
cehoyos
parents:
diff changeset
723 // 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
724 if (bd->ra_block) {
10522
9b56cd1e37b7 Add MPEG-4 Audio Lossless Coding (ALS) decoder.
cehoyos
parents:
diff changeset
725 if (opt_order)
10681
997692df50c1 Read and decode block data in separate functions to prepare support for
thilo.borgmann
parents: 10535
diff changeset
726 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
727 if (opt_order > 1)
11189
638415aafbda Limit the Rice parameter used for progressive decoding in ALS.
thilo.borgmann
parents: 11157
diff changeset
728 bd->raw_samples[1] = decode_rice(gb, FFMIN(s[0] + 3, ctx->s_max));
10522
9b56cd1e37b7 Add MPEG-4 Audio Lossless Coding (ALS) decoder.
cehoyos
parents:
diff changeset
729 if (opt_order > 2)
11189
638415aafbda Limit the Rice parameter used for progressive decoding in ALS.
thilo.borgmann
parents: 11157
diff changeset
730 bd->raw_samples[2] = decode_rice(gb, FFMIN(s[0] + 1, ctx->s_max));
10522
9b56cd1e37b7 Add MPEG-4 Audio Lossless Coding (ALS) decoder.
cehoyos
parents:
diff changeset
731
9b56cd1e37b7 Add MPEG-4 Audio Lossless Coding (ALS) decoder.
cehoyos
parents:
diff changeset
732 start = FFMIN(opt_order, 3);
9b56cd1e37b7 Add MPEG-4 Audio Lossless Coding (ALS) decoder.
cehoyos
parents:
diff changeset
733 }
9b56cd1e37b7 Add MPEG-4 Audio Lossless Coding (ALS) decoder.
cehoyos
parents:
diff changeset
734
9b56cd1e37b7 Add MPEG-4 Audio Lossless Coding (ALS) decoder.
cehoyos
parents:
diff changeset
735 // read all residuals
9b56cd1e37b7 Add MPEG-4 Audio Lossless Coding (ALS) decoder.
cehoyos
parents:
diff changeset
736 if (sconf->bgmc) {
11148
2d2780630361 Support arithmetic decoding in ALS.
thilo.borgmann
parents: 11071
diff changeset
737 unsigned int delta[sub_blocks];
2d2780630361 Support arithmetic decoding in ALS.
thilo.borgmann
parents: 11071
diff changeset
738 unsigned int k [sub_blocks];
2d2780630361 Support arithmetic decoding in ALS.
thilo.borgmann
parents: 11071
diff changeset
739 unsigned int b = av_clip((av_ceil_log2(bd->block_length) - 3) >> 1, 0, 5);
2d2780630361 Support arithmetic decoding in ALS.
thilo.borgmann
parents: 11071
diff changeset
740 unsigned int i = start;
2d2780630361 Support arithmetic decoding in ALS.
thilo.borgmann
parents: 11071
diff changeset
741
2d2780630361 Support arithmetic decoding in ALS.
thilo.borgmann
parents: 11071
diff changeset
742 // read most significant bits
2d2780630361 Support arithmetic decoding in ALS.
thilo.borgmann
parents: 11071
diff changeset
743 unsigned int high;
2d2780630361 Support arithmetic decoding in ALS.
thilo.borgmann
parents: 11071
diff changeset
744 unsigned int low;
2d2780630361 Support arithmetic decoding in ALS.
thilo.borgmann
parents: 11071
diff changeset
745 unsigned int value;
2d2780630361 Support arithmetic decoding in ALS.
thilo.borgmann
parents: 11071
diff changeset
746
2d2780630361 Support arithmetic decoding in ALS.
thilo.borgmann
parents: 11071
diff changeset
747 ff_bgmc_decode_init(gb, &high, &low, &value);
2d2780630361 Support arithmetic decoding in ALS.
thilo.borgmann
parents: 11071
diff changeset
748
2d2780630361 Support arithmetic decoding in ALS.
thilo.borgmann
parents: 11071
diff changeset
749 current_res = bd->raw_samples + start;
2d2780630361 Support arithmetic decoding in ALS.
thilo.borgmann
parents: 11071
diff changeset
750
2d2780630361 Support arithmetic decoding in ALS.
thilo.borgmann
parents: 11071
diff changeset
751 for (sb = 0; sb < sub_blocks; sb++, i = 0) {
2d2780630361 Support arithmetic decoding in ALS.
thilo.borgmann
parents: 11071
diff changeset
752 k [sb] = s[sb] > b ? s[sb] - b : 0;
2d2780630361 Support arithmetic decoding in ALS.
thilo.borgmann
parents: 11071
diff changeset
753 delta[sb] = 5 - s[sb] + k[sb];
2d2780630361 Support arithmetic decoding in ALS.
thilo.borgmann
parents: 11071
diff changeset
754
2d2780630361 Support arithmetic decoding in ALS.
thilo.borgmann
parents: 11071
diff changeset
755 ff_bgmc_decode(gb, sb_length, current_res,
2d2780630361 Support arithmetic decoding in ALS.
thilo.borgmann
parents: 11071
diff changeset
756 delta[sb], sx[sb], &high, &low, &value, ctx->bgmc_lut, ctx->bgmc_lut_status);
2d2780630361 Support arithmetic decoding in ALS.
thilo.borgmann
parents: 11071
diff changeset
757
2d2780630361 Support arithmetic decoding in ALS.
thilo.borgmann
parents: 11071
diff changeset
758 current_res += sb_length;
2d2780630361 Support arithmetic decoding in ALS.
thilo.borgmann
parents: 11071
diff changeset
759 }
2d2780630361 Support arithmetic decoding in ALS.
thilo.borgmann
parents: 11071
diff changeset
760
2d2780630361 Support arithmetic decoding in ALS.
thilo.borgmann
parents: 11071
diff changeset
761 ff_bgmc_decode_end(gb);
2d2780630361 Support arithmetic decoding in ALS.
thilo.borgmann
parents: 11071
diff changeset
762
2d2780630361 Support arithmetic decoding in ALS.
thilo.borgmann
parents: 11071
diff changeset
763
2d2780630361 Support arithmetic decoding in ALS.
thilo.borgmann
parents: 11071
diff changeset
764 // read least significant bits and tails
2d2780630361 Support arithmetic decoding in ALS.
thilo.borgmann
parents: 11071
diff changeset
765 i = start;
2d2780630361 Support arithmetic decoding in ALS.
thilo.borgmann
parents: 11071
diff changeset
766 current_res = bd->raw_samples + start;
2d2780630361 Support arithmetic decoding in ALS.
thilo.borgmann
parents: 11071
diff changeset
767
2d2780630361 Support arithmetic decoding in ALS.
thilo.borgmann
parents: 11071
diff changeset
768 for (sb = 0; sb < sub_blocks; sb++, i = 0) {
2d2780630361 Support arithmetic decoding in ALS.
thilo.borgmann
parents: 11071
diff changeset
769 unsigned int cur_tail_code = tail_code[sx[sb]][delta[sb]];
2d2780630361 Support arithmetic decoding in ALS.
thilo.borgmann
parents: 11071
diff changeset
770 unsigned int cur_k = k[sb];
2d2780630361 Support arithmetic decoding in ALS.
thilo.borgmann
parents: 11071
diff changeset
771 unsigned int cur_s = s[sb];
2d2780630361 Support arithmetic decoding in ALS.
thilo.borgmann
parents: 11071
diff changeset
772
2d2780630361 Support arithmetic decoding in ALS.
thilo.borgmann
parents: 11071
diff changeset
773 for (; i < sb_length; i++) {
2d2780630361 Support arithmetic decoding in ALS.
thilo.borgmann
parents: 11071
diff changeset
774 int32_t res = *current_res;
2d2780630361 Support arithmetic decoding in ALS.
thilo.borgmann
parents: 11071
diff changeset
775
2d2780630361 Support arithmetic decoding in ALS.
thilo.borgmann
parents: 11071
diff changeset
776 if (res == cur_tail_code) {
2d2780630361 Support arithmetic decoding in ALS.
thilo.borgmann
parents: 11071
diff changeset
777 unsigned int max_msb = (2 + (sx[sb] > 2) + (sx[sb] > 10))
2d2780630361 Support arithmetic decoding in ALS.
thilo.borgmann
parents: 11071
diff changeset
778 << (5 - delta[sb]);
2d2780630361 Support arithmetic decoding in ALS.
thilo.borgmann
parents: 11071
diff changeset
779
2d2780630361 Support arithmetic decoding in ALS.
thilo.borgmann
parents: 11071
diff changeset
780 res = decode_rice(gb, cur_s);
2d2780630361 Support arithmetic decoding in ALS.
thilo.borgmann
parents: 11071
diff changeset
781
2d2780630361 Support arithmetic decoding in ALS.
thilo.borgmann
parents: 11071
diff changeset
782 if (res >= 0) {
2d2780630361 Support arithmetic decoding in ALS.
thilo.borgmann
parents: 11071
diff changeset
783 res += (max_msb ) << cur_k;
2d2780630361 Support arithmetic decoding in ALS.
thilo.borgmann
parents: 11071
diff changeset
784 } else {
2d2780630361 Support arithmetic decoding in ALS.
thilo.borgmann
parents: 11071
diff changeset
785 res -= (max_msb - 1) << cur_k;
2d2780630361 Support arithmetic decoding in ALS.
thilo.borgmann
parents: 11071
diff changeset
786 }
2d2780630361 Support arithmetic decoding in ALS.
thilo.borgmann
parents: 11071
diff changeset
787 } else {
2d2780630361 Support arithmetic decoding in ALS.
thilo.borgmann
parents: 11071
diff changeset
788 if (res > cur_tail_code)
2d2780630361 Support arithmetic decoding in ALS.
thilo.borgmann
parents: 11071
diff changeset
789 res--;
2d2780630361 Support arithmetic decoding in ALS.
thilo.borgmann
parents: 11071
diff changeset
790
2d2780630361 Support arithmetic decoding in ALS.
thilo.borgmann
parents: 11071
diff changeset
791 if (res & 1)
2d2780630361 Support arithmetic decoding in ALS.
thilo.borgmann
parents: 11071
diff changeset
792 res = -res;
2d2780630361 Support arithmetic decoding in ALS.
thilo.borgmann
parents: 11071
diff changeset
793
2d2780630361 Support arithmetic decoding in ALS.
thilo.borgmann
parents: 11071
diff changeset
794 res >>= 1;
2d2780630361 Support arithmetic decoding in ALS.
thilo.borgmann
parents: 11071
diff changeset
795
2d2780630361 Support arithmetic decoding in ALS.
thilo.borgmann
parents: 11071
diff changeset
796 if (cur_k) {
2d2780630361 Support arithmetic decoding in ALS.
thilo.borgmann
parents: 11071
diff changeset
797 res <<= cur_k;
2d2780630361 Support arithmetic decoding in ALS.
thilo.borgmann
parents: 11071
diff changeset
798 res |= get_bits_long(gb, cur_k);
2d2780630361 Support arithmetic decoding in ALS.
thilo.borgmann
parents: 11071
diff changeset
799 }
2d2780630361 Support arithmetic decoding in ALS.
thilo.borgmann
parents: 11071
diff changeset
800 }
2d2780630361 Support arithmetic decoding in ALS.
thilo.borgmann
parents: 11071
diff changeset
801
11157
625a076b8038 Reindent a line.
thilo.borgmann
parents: 11148
diff changeset
802 *current_res++ = res;
11148
2d2780630361 Support arithmetic decoding in ALS.
thilo.borgmann
parents: 11071
diff changeset
803 }
2d2780630361 Support arithmetic decoding in ALS.
thilo.borgmann
parents: 11071
diff changeset
804 }
10522
9b56cd1e37b7 Add MPEG-4 Audio Lossless Coding (ALS) decoder.
cehoyos
parents:
diff changeset
805 } else {
11148
2d2780630361 Support arithmetic decoding in ALS.
thilo.borgmann
parents: 11071
diff changeset
806 current_res = bd->raw_samples + start;
10522
9b56cd1e37b7 Add MPEG-4 Audio Lossless Coding (ALS) decoder.
cehoyos
parents:
diff changeset
807
9b56cd1e37b7 Add MPEG-4 Audio Lossless Coding (ALS) decoder.
cehoyos
parents:
diff changeset
808 for (sb = 0; sb < sub_blocks; sb++, start = 0)
9b56cd1e37b7 Add MPEG-4 Audio Lossless Coding (ALS) decoder.
cehoyos
parents:
diff changeset
809 for (; start < sb_length; start++)
9b56cd1e37b7 Add MPEG-4 Audio Lossless Coding (ALS) decoder.
cehoyos
parents:
diff changeset
810 *current_res++ = decode_rice(gb, s[sb]);
9b56cd1e37b7 Add MPEG-4 Audio Lossless Coding (ALS) decoder.
cehoyos
parents:
diff changeset
811 }
9b56cd1e37b7 Add MPEG-4 Audio Lossless Coding (ALS) decoder.
cehoyos
parents:
diff changeset
812
10681
997692df50c1 Read and decode block data in separate functions to prepare support for
thilo.borgmann
parents: 10535
diff changeset
813 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
814 align_get_bits(gb);
997692df50c1 Read and decode block data in separate functions to prepare support for
thilo.borgmann
parents: 10535
diff changeset
815
997692df50c1 Read and decode block data in separate functions to prepare support for
thilo.borgmann
parents: 10535
diff changeset
816 return 0;
997692df50c1 Read and decode block data in separate functions to prepare support for
thilo.borgmann
parents: 10535
diff changeset
817 }
997692df50c1 Read and decode block data in separate functions to prepare support for
thilo.borgmann
parents: 10535
diff changeset
818
997692df50c1 Read and decode block data in separate functions to prepare support for
thilo.borgmann
parents: 10535
diff changeset
819
997692df50c1 Read and decode block data in separate functions to prepare support for
thilo.borgmann
parents: 10535
diff changeset
820 /** 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
821 */
997692df50c1 Read and decode block data in separate functions to prepare support for
thilo.borgmann
parents: 10535
diff changeset
822 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
823 {
997692df50c1 Read and decode block data in separate functions to prepare support for
thilo.borgmann
parents: 10535
diff changeset
824 ALSSpecificConfig *sconf = &ctx->sconf;
997692df50c1 Read and decode block data in separate functions to prepare support for
thilo.borgmann
parents: 10535
diff changeset
825 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
826 unsigned int smp = 0;
997692df50c1 Read and decode block data in separate functions to prepare support for
thilo.borgmann
parents: 10535
diff changeset
827 unsigned int k;
10823
d87e8f2c5c91 Change local variable type from unsigned int to int in order to
thilo.borgmann
parents: 10802
diff changeset
828 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
829 int sb;
997692df50c1 Read and decode block data in separate functions to prepare support for
thilo.borgmann
parents: 10535
diff changeset
830 int64_t y;
997692df50c1 Read and decode block data in separate functions to prepare support for
thilo.borgmann
parents: 10535
diff changeset
831 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
832 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
833 int32_t *raw_samples = bd->raw_samples;
10800
67e430033b14 Optimize short-term prediction by reducing index arithmetic.
thilo.borgmann
parents: 10774
diff changeset
834 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
835 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
836
10530
d428e57f14c6 Add long-term prediction to the ALS decoder.
thilo.borgmann
parents: 10524
diff changeset
837 // reverse long-term prediction
10681
997692df50c1 Read and decode block data in separate functions to prepare support for
thilo.borgmann
parents: 10535
diff changeset
838 if (*bd->use_ltp) {
10530
d428e57f14c6 Add long-term prediction to the ALS decoder.
thilo.borgmann
parents: 10524
diff changeset
839 int ltp_smp;
d428e57f14c6 Add long-term prediction to the ALS decoder.
thilo.borgmann
parents: 10524
diff changeset
840
10681
997692df50c1 Read and decode block data in separate functions to prepare support for
thilo.borgmann
parents: 10535
diff changeset
841 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
842 int center = ltp_smp - *bd->ltp_lag;
10530
d428e57f14c6 Add long-term prediction to the ALS decoder.
thilo.borgmann
parents: 10524
diff changeset
843 int begin = FFMAX(0, center - 2);
d428e57f14c6 Add long-term prediction to the ALS decoder.
thilo.borgmann
parents: 10524
diff changeset
844 int end = center + 3;
d428e57f14c6 Add long-term prediction to the ALS decoder.
thilo.borgmann
parents: 10524
diff changeset
845 int tab = 5 - (end - begin);
d428e57f14c6 Add long-term prediction to the ALS decoder.
thilo.borgmann
parents: 10524
diff changeset
846 int base;
d428e57f14c6 Add long-term prediction to the ALS decoder.
thilo.borgmann
parents: 10524
diff changeset
847
d428e57f14c6 Add long-term prediction to the ALS decoder.
thilo.borgmann
parents: 10524
diff changeset
848 y = 1 << 6;
d428e57f14c6 Add long-term prediction to the ALS decoder.
thilo.borgmann
parents: 10524
diff changeset
849
d428e57f14c6 Add long-term prediction to the ALS decoder.
thilo.borgmann
parents: 10524
diff changeset
850 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
851 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
852
d428e57f14c6 Add long-term prediction to the ALS decoder.
thilo.borgmann
parents: 10524
diff changeset
853 raw_samples[ltp_smp] += y >> 7;
d428e57f14c6 Add long-term prediction to the ALS decoder.
thilo.borgmann
parents: 10524
diff changeset
854 }
d428e57f14c6 Add long-term prediction to the ALS decoder.
thilo.borgmann
parents: 10524
diff changeset
855 }
d428e57f14c6 Add long-term prediction to the ALS decoder.
thilo.borgmann
parents: 10524
diff changeset
856
10522
9b56cd1e37b7 Add MPEG-4 Audio Lossless Coding (ALS) decoder.
cehoyos
parents:
diff changeset
857 // 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
858 if (bd->ra_block) {
10522
9b56cd1e37b7 Add MPEG-4 Audio Lossless Coding (ALS) decoder.
cehoyos
parents:
diff changeset
859 for (smp = 0; smp < opt_order; smp++) {
9b56cd1e37b7 Add MPEG-4 Audio Lossless Coding (ALS) decoder.
cehoyos
parents:
diff changeset
860 y = 1 << 19;
9b56cd1e37b7 Add MPEG-4 Audio Lossless Coding (ALS) decoder.
cehoyos
parents:
diff changeset
861
9b56cd1e37b7 Add MPEG-4 Audio Lossless Coding (ALS) decoder.
cehoyos
parents:
diff changeset
862 for (sb = 0; sb < smp; sb++)
10800
67e430033b14 Optimize short-term prediction by reducing index arithmetic.
thilo.borgmann
parents: 10774
diff changeset
863 y += MUL64(lpc_cof[sb], raw_samples[-(sb + 1)]);
10522
9b56cd1e37b7 Add MPEG-4 Audio Lossless Coding (ALS) decoder.
cehoyos
parents:
diff changeset
864
10800
67e430033b14 Optimize short-term prediction by reducing index arithmetic.
thilo.borgmann
parents: 10774
diff changeset
865 *raw_samples++ -= y >> 20;
10522
9b56cd1e37b7 Add MPEG-4 Audio Lossless Coding (ALS) decoder.
cehoyos
parents:
diff changeset
866 parcor_to_lpc(smp, quant_cof, lpc_cof);
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 } else {
9b56cd1e37b7 Add MPEG-4 Audio Lossless Coding (ALS) decoder.
cehoyos
parents:
diff changeset
869 for (k = 0; k < opt_order; k++)
9b56cd1e37b7 Add MPEG-4 Audio Lossless Coding (ALS) decoder.
cehoyos
parents:
diff changeset
870 parcor_to_lpc(k, quant_cof, lpc_cof);
9b56cd1e37b7 Add MPEG-4 Audio Lossless Coding (ALS) decoder.
cehoyos
parents:
diff changeset
871
9b56cd1e37b7 Add MPEG-4 Audio Lossless Coding (ALS) decoder.
cehoyos
parents:
diff changeset
872 // 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
873 if (bd->store_prev_samples)
997692df50c1 Read and decode block data in separate functions to prepare support for
thilo.borgmann
parents: 10535
diff changeset
874 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
875 sizeof(*bd->prev_raw_samples) * sconf->max_order);
10522
9b56cd1e37b7 Add MPEG-4 Audio Lossless Coding (ALS) decoder.
cehoyos
parents:
diff changeset
876
9b56cd1e37b7 Add MPEG-4 Audio Lossless Coding (ALS) decoder.
cehoyos
parents:
diff changeset
877 // 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
878 if (bd->js_blocks && bd->raw_other) {
10522
9b56cd1e37b7 Add MPEG-4 Audio Lossless Coding (ALS) decoder.
cehoyos
parents:
diff changeset
879 int32_t *left, *right;
9b56cd1e37b7 Add MPEG-4 Audio Lossless Coding (ALS) decoder.
cehoyos
parents:
diff changeset
880
10681
997692df50c1 Read and decode block data in separate functions to prepare support for
thilo.borgmann
parents: 10535
diff changeset
881 if (bd->raw_other > raw_samples) { // D = R - L
10522
9b56cd1e37b7 Add MPEG-4 Audio Lossless Coding (ALS) decoder.
cehoyos
parents:
diff changeset
882 left = raw_samples;
10681
997692df50c1 Read and decode block data in separate functions to prepare support for
thilo.borgmann
parents: 10535
diff changeset
883 right = bd->raw_other;
10522
9b56cd1e37b7 Add MPEG-4 Audio Lossless Coding (ALS) decoder.
cehoyos
parents:
diff changeset
884 } else { // D = R - L
10681
997692df50c1 Read and decode block data in separate functions to prepare support for
thilo.borgmann
parents: 10535
diff changeset
885 left = bd->raw_other;
10522
9b56cd1e37b7 Add MPEG-4 Audio Lossless Coding (ALS) decoder.
cehoyos
parents:
diff changeset
886 right = raw_samples;
9b56cd1e37b7 Add MPEG-4 Audio Lossless Coding (ALS) decoder.
cehoyos
parents:
diff changeset
887 }
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 for (sb = -1; sb >= -sconf->max_order; sb--)
9b56cd1e37b7 Add MPEG-4 Audio Lossless Coding (ALS) decoder.
cehoyos
parents:
diff changeset
890 raw_samples[sb] = right[sb] - left[sb];
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
9b56cd1e37b7 Add MPEG-4 Audio Lossless Coding (ALS) decoder.
cehoyos
parents:
diff changeset
893 // reconstruct shifted signal
10681
997692df50c1 Read and decode block data in separate functions to prepare support for
thilo.borgmann
parents: 10535
diff changeset
894 if (bd->shift_lsbs)
10522
9b56cd1e37b7 Add MPEG-4 Audio Lossless Coding (ALS) decoder.
cehoyos
parents:
diff changeset
895 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
896 raw_samples[sb] >>= bd->shift_lsbs;
10522
9b56cd1e37b7 Add MPEG-4 Audio Lossless Coding (ALS) decoder.
cehoyos
parents:
diff changeset
897 }
9b56cd1e37b7 Add MPEG-4 Audio Lossless Coding (ALS) decoder.
cehoyos
parents:
diff changeset
898
10800
67e430033b14 Optimize short-term prediction by reducing index arithmetic.
thilo.borgmann
parents: 10774
diff changeset
899 // reverse linear prediction coefficients for efficiency
67e430033b14 Optimize short-term prediction by reducing index arithmetic.
thilo.borgmann
parents: 10774
diff changeset
900 lpc_cof = lpc_cof + opt_order;
67e430033b14 Optimize short-term prediction by reducing index arithmetic.
thilo.borgmann
parents: 10774
diff changeset
901
67e430033b14 Optimize short-term prediction by reducing index arithmetic.
thilo.borgmann
parents: 10774
diff changeset
902 for (sb = 0; sb < opt_order; sb++)
67e430033b14 Optimize short-term prediction by reducing index arithmetic.
thilo.borgmann
parents: 10774
diff changeset
903 lpc_cof_reversed[sb] = lpc_cof[-(sb + 1)];
67e430033b14 Optimize short-term prediction by reducing index arithmetic.
thilo.borgmann
parents: 10774
diff changeset
904
10522
9b56cd1e37b7 Add MPEG-4 Audio Lossless Coding (ALS) decoder.
cehoyos
parents:
diff changeset
905 // reconstruct raw samples
10800
67e430033b14 Optimize short-term prediction by reducing index arithmetic.
thilo.borgmann
parents: 10774
diff changeset
906 raw_samples = bd->raw_samples + smp;
67e430033b14 Optimize short-term prediction by reducing index arithmetic.
thilo.borgmann
parents: 10774
diff changeset
907 lpc_cof = lpc_cof_reversed + opt_order;
67e430033b14 Optimize short-term prediction by reducing index arithmetic.
thilo.borgmann
parents: 10774
diff changeset
908
67e430033b14 Optimize short-term prediction by reducing index arithmetic.
thilo.borgmann
parents: 10774
diff changeset
909 for (; raw_samples < raw_samples_end; raw_samples++) {
10522
9b56cd1e37b7 Add MPEG-4 Audio Lossless Coding (ALS) decoder.
cehoyos
parents:
diff changeset
910 y = 1 << 19;
9b56cd1e37b7 Add MPEG-4 Audio Lossless Coding (ALS) decoder.
cehoyos
parents:
diff changeset
911
10800
67e430033b14 Optimize short-term prediction by reducing index arithmetic.
thilo.borgmann
parents: 10774
diff changeset
912 for (sb = -opt_order; sb < 0; sb++)
67e430033b14 Optimize short-term prediction by reducing index arithmetic.
thilo.borgmann
parents: 10774
diff changeset
913 y += MUL64(lpc_cof[sb], raw_samples[sb]);
10522
9b56cd1e37b7 Add MPEG-4 Audio Lossless Coding (ALS) decoder.
cehoyos
parents:
diff changeset
914
10800
67e430033b14 Optimize short-term prediction by reducing index arithmetic.
thilo.borgmann
parents: 10774
diff changeset
915 *raw_samples -= y >> 20;
10522
9b56cd1e37b7 Add MPEG-4 Audio Lossless Coding (ALS) decoder.
cehoyos
parents:
diff changeset
916 }
9b56cd1e37b7 Add MPEG-4 Audio Lossless Coding (ALS) decoder.
cehoyos
parents:
diff changeset
917
10800
67e430033b14 Optimize short-term prediction by reducing index arithmetic.
thilo.borgmann
parents: 10774
diff changeset
918 raw_samples = bd->raw_samples;
67e430033b14 Optimize short-term prediction by reducing index arithmetic.
thilo.borgmann
parents: 10774
diff changeset
919
10522
9b56cd1e37b7 Add MPEG-4 Audio Lossless Coding (ALS) decoder.
cehoyos
parents:
diff changeset
920 // 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
921 if (bd->store_prev_samples)
997692df50c1 Read and decode block data in separate functions to prepare support for
thilo.borgmann
parents: 10535
diff changeset
922 memcpy(raw_samples - sconf->max_order, bd->prev_raw_samples,
10522
9b56cd1e37b7 Add MPEG-4 Audio Lossless Coding (ALS) decoder.
cehoyos
parents:
diff changeset
923 sizeof(*raw_samples) * sconf->max_order);
9b56cd1e37b7 Add MPEG-4 Audio Lossless Coding (ALS) decoder.
cehoyos
parents:
diff changeset
924
9b56cd1e37b7 Add MPEG-4 Audio Lossless Coding (ALS) decoder.
cehoyos
parents:
diff changeset
925 return 0;
9b56cd1e37b7 Add MPEG-4 Audio Lossless Coding (ALS) decoder.
cehoyos
parents:
diff changeset
926 }
9b56cd1e37b7 Add MPEG-4 Audio Lossless Coding (ALS) decoder.
cehoyos
parents:
diff changeset
927
9b56cd1e37b7 Add MPEG-4 Audio Lossless Coding (ALS) decoder.
cehoyos
parents:
diff changeset
928
9b56cd1e37b7 Add MPEG-4 Audio Lossless Coding (ALS) decoder.
cehoyos
parents:
diff changeset
929 /** Reads the block data.
9b56cd1e37b7 Add MPEG-4 Audio Lossless Coding (ALS) decoder.
cehoyos
parents:
diff changeset
930 */
10681
997692df50c1 Read and decode block data in separate functions to prepare support for
thilo.borgmann
parents: 10535
diff changeset
931 static int read_block(ALSDecContext *ctx, ALSBlockData *bd)
10522
9b56cd1e37b7 Add MPEG-4 Audio Lossless Coding (ALS) decoder.
cehoyos
parents:
diff changeset
932 {
9b56cd1e37b7 Add MPEG-4 Audio Lossless Coding (ALS) decoder.
cehoyos
parents:
diff changeset
933 GetBitContext *gb = &ctx->gb;
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 // read block type flag and read the samples accordingly
9b56cd1e37b7 Add MPEG-4 Audio Lossless Coding (ALS) decoder.
cehoyos
parents:
diff changeset
936 if (get_bits1(gb)) {
10681
997692df50c1 Read and decode block data in separate functions to prepare support for
thilo.borgmann
parents: 10535
diff changeset
937 if (read_var_block_data(ctx, bd))
10522
9b56cd1e37b7 Add MPEG-4 Audio Lossless Coding (ALS) decoder.
cehoyos
parents:
diff changeset
938 return -1;
9b56cd1e37b7 Add MPEG-4 Audio Lossless Coding (ALS) decoder.
cehoyos
parents:
diff changeset
939 } else {
10681
997692df50c1 Read and decode block data in separate functions to prepare support for
thilo.borgmann
parents: 10535
diff changeset
940 read_const_block_data(ctx, bd);
10522
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
10681
997692df50c1 Read and decode block data in separate functions to prepare support for
thilo.borgmann
parents: 10535
diff changeset
943 return 0;
997692df50c1 Read and decode block data in separate functions to prepare support for
thilo.borgmann
parents: 10535
diff changeset
944 }
997692df50c1 Read and decode block data in separate functions to prepare support for
thilo.borgmann
parents: 10535
diff changeset
945
997692df50c1 Read and decode block data in separate functions to prepare support for
thilo.borgmann
parents: 10535
diff changeset
946
997692df50c1 Read and decode block data in separate functions to prepare support for
thilo.borgmann
parents: 10535
diff changeset
947 /** Decodes the block data.
997692df50c1 Read and decode block data in separate functions to prepare support for
thilo.borgmann
parents: 10535
diff changeset
948 */
997692df50c1 Read and decode block data in separate functions to prepare support for
thilo.borgmann
parents: 10535
diff changeset
949 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
950 {
997692df50c1 Read and decode block data in separate functions to prepare support for
thilo.borgmann
parents: 10535
diff changeset
951 unsigned int smp;
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 // 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
954 if (bd->const_block)
997692df50c1 Read and decode block data in separate functions to prepare support for
thilo.borgmann
parents: 10535
diff changeset
955 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
956 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
957 return -1;
997692df50c1 Read and decode block data in separate functions to prepare support for
thilo.borgmann
parents: 10535
diff changeset
958
10522
9b56cd1e37b7 Add MPEG-4 Audio Lossless Coding (ALS) decoder.
cehoyos
parents:
diff changeset
959 // TODO: read RLSLMS extension data
9b56cd1e37b7 Add MPEG-4 Audio Lossless Coding (ALS) decoder.
cehoyos
parents:
diff changeset
960
10681
997692df50c1 Read and decode block data in separate functions to prepare support for
thilo.borgmann
parents: 10535
diff changeset
961 if (bd->shift_lsbs)
997692df50c1 Read and decode block data in separate functions to prepare support for
thilo.borgmann
parents: 10535
diff changeset
962 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
963 bd->raw_samples[smp] <<= bd->shift_lsbs;
10522
9b56cd1e37b7 Add MPEG-4 Audio Lossless Coding (ALS) decoder.
cehoyos
parents:
diff changeset
964
9b56cd1e37b7 Add MPEG-4 Audio Lossless Coding (ALS) decoder.
cehoyos
parents:
diff changeset
965 return 0;
9b56cd1e37b7 Add MPEG-4 Audio Lossless Coding (ALS) decoder.
cehoyos
parents:
diff changeset
966 }
9b56cd1e37b7 Add MPEG-4 Audio Lossless Coding (ALS) decoder.
cehoyos
parents:
diff changeset
967
9b56cd1e37b7 Add MPEG-4 Audio Lossless Coding (ALS) decoder.
cehoyos
parents:
diff changeset
968
10681
997692df50c1 Read and decode block data in separate functions to prepare support for
thilo.borgmann
parents: 10535
diff changeset
969 /** 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
970 */
997692df50c1 Read and decode block data in separate functions to prepare support for
thilo.borgmann
parents: 10535
diff changeset
971 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
972 {
997692df50c1 Read and decode block data in separate functions to prepare support for
thilo.borgmann
parents: 10535
diff changeset
973 int ret;
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 ret = read_block(ctx, bd);
997692df50c1 Read and decode block data in separate functions to prepare support for
thilo.borgmann
parents: 10535
diff changeset
976
997692df50c1 Read and decode block data in separate functions to prepare support for
thilo.borgmann
parents: 10535
diff changeset
977 if (ret)
997692df50c1 Read and decode block data in separate functions to prepare support for
thilo.borgmann
parents: 10535
diff changeset
978 return ret;
997692df50c1 Read and decode block data in separate functions to prepare support for
thilo.borgmann
parents: 10535
diff changeset
979
997692df50c1 Read and decode block data in separate functions to prepare support for
thilo.borgmann
parents: 10535
diff changeset
980 ret = decode_block(ctx, bd);
997692df50c1 Read and decode block data in separate functions to prepare support for
thilo.borgmann
parents: 10535
diff changeset
981
997692df50c1 Read and decode block data in separate functions to prepare support for
thilo.borgmann
parents: 10535
diff changeset
982 return ret;
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
997692df50c1 Read and decode block data in separate functions to prepare support for
thilo.borgmann
parents: 10535
diff changeset
985
10522
9b56cd1e37b7 Add MPEG-4 Audio Lossless Coding (ALS) decoder.
cehoyos
parents:
diff changeset
986 /** 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
987 * sets these samples to zero.
9b56cd1e37b7 Add MPEG-4 Audio Lossless Coding (ALS) decoder.
cehoyos
parents:
diff changeset
988 */
9b56cd1e37b7 Add MPEG-4 Audio Lossless Coding (ALS) decoder.
cehoyos
parents:
diff changeset
989 static void zero_remaining(unsigned int b, unsigned int b_max,
9b56cd1e37b7 Add MPEG-4 Audio Lossless Coding (ALS) decoder.
cehoyos
parents:
diff changeset
990 const unsigned int *div_blocks, int32_t *buf)
9b56cd1e37b7 Add MPEG-4 Audio Lossless Coding (ALS) decoder.
cehoyos
parents:
diff changeset
991 {
9b56cd1e37b7 Add MPEG-4 Audio Lossless Coding (ALS) decoder.
cehoyos
parents:
diff changeset
992 unsigned int count = 0;
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 while (b < b_max)
9b56cd1e37b7 Add MPEG-4 Audio Lossless Coding (ALS) decoder.
cehoyos
parents:
diff changeset
995 count += div_blocks[b];
9b56cd1e37b7 Add MPEG-4 Audio Lossless Coding (ALS) decoder.
cehoyos
parents:
diff changeset
996
10523
af172182963b Fix a __warn_memset_zero_len gcc-4.4 warning.
alexc
parents: 10522
diff changeset
997 if (count)
10524
e5d7b184a5b0 Cosmetics: Re-indent
alexc
parents: 10523
diff changeset
998 memset(buf, 0, sizeof(*buf) * count);
10522
9b56cd1e37b7 Add MPEG-4 Audio Lossless Coding (ALS) decoder.
cehoyos
parents:
diff changeset
999 }
9b56cd1e37b7 Add MPEG-4 Audio Lossless Coding (ALS) decoder.
cehoyos
parents:
diff changeset
1000
9b56cd1e37b7 Add MPEG-4 Audio Lossless Coding (ALS) decoder.
cehoyos
parents:
diff changeset
1001
9b56cd1e37b7 Add MPEG-4 Audio Lossless Coding (ALS) decoder.
cehoyos
parents:
diff changeset
1002 /** Decodes blocks independently.
9b56cd1e37b7 Add MPEG-4 Audio Lossless Coding (ALS) decoder.
cehoyos
parents:
diff changeset
1003 */
9b56cd1e37b7 Add MPEG-4 Audio Lossless Coding (ALS) decoder.
cehoyos
parents:
diff changeset
1004 static int decode_blocks_ind(ALSDecContext *ctx, unsigned int ra_frame,
9b56cd1e37b7 Add MPEG-4 Audio Lossless Coding (ALS) decoder.
cehoyos
parents:
diff changeset
1005 unsigned int c, const unsigned int *div_blocks,
9b56cd1e37b7 Add MPEG-4 Audio Lossless Coding (ALS) decoder.
cehoyos
parents:
diff changeset
1006 unsigned int *js_blocks)
9b56cd1e37b7 Add MPEG-4 Audio Lossless Coding (ALS) decoder.
cehoyos
parents:
diff changeset
1007 {
9b56cd1e37b7 Add MPEG-4 Audio Lossless Coding (ALS) decoder.
cehoyos
parents:
diff changeset
1008 unsigned int b;
10681
997692df50c1 Read and decode block data in separate functions to prepare support for
thilo.borgmann
parents: 10535
diff changeset
1009 ALSBlockData bd;
997692df50c1 Read and decode block data in separate functions to prepare support for
thilo.borgmann
parents: 10535
diff changeset
1010
997692df50c1 Read and decode block data in separate functions to prepare support for
thilo.borgmann
parents: 10535
diff changeset
1011 memset(&bd, 0, sizeof(ALSBlockData));
997692df50c1 Read and decode block data in separate functions to prepare support for
thilo.borgmann
parents: 10535
diff changeset
1012
997692df50c1 Read and decode block data in separate functions to prepare support for
thilo.borgmann
parents: 10535
diff changeset
1013 bd.ra_block = ra_frame;
997692df50c1 Read and decode block data in separate functions to prepare support for
thilo.borgmann
parents: 10535
diff changeset
1014 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
1015 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
1016 bd.ltp_gain = ctx->ltp_gain[0];
10802
4f614b69b4e5 Add multi-channel correlation support for ALS.
thilo.borgmann
parents: 10800
diff changeset
1017 bd.quant_cof = ctx->quant_cof[0];
4f614b69b4e5 Add multi-channel correlation support for ALS.
thilo.borgmann
parents: 10800
diff changeset
1018 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
1019 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
1020 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
1021
10522
9b56cd1e37b7 Add MPEG-4 Audio Lossless Coding (ALS) decoder.
cehoyos
parents:
diff changeset
1022
9b56cd1e37b7 Add MPEG-4 Audio Lossless Coding (ALS) decoder.
cehoyos
parents:
diff changeset
1023 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
1024 bd.shift_lsbs = 0;
997692df50c1 Read and decode block data in separate functions to prepare support for
thilo.borgmann
parents: 10535
diff changeset
1025 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
1026
997692df50c1 Read and decode block data in separate functions to prepare support for
thilo.borgmann
parents: 10535
diff changeset
1027 if (read_decode_block(ctx, &bd)) {
10522
9b56cd1e37b7 Add MPEG-4 Audio Lossless Coding (ALS) decoder.
cehoyos
parents:
diff changeset
1028 // 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
1029 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
1030 return -1;
9b56cd1e37b7 Add MPEG-4 Audio Lossless Coding (ALS) decoder.
cehoyos
parents:
diff changeset
1031 }
10681
997692df50c1 Read and decode block data in separate functions to prepare support for
thilo.borgmann
parents: 10535
diff changeset
1032 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
1033 bd.ra_block = 0;
10522
9b56cd1e37b7 Add MPEG-4 Audio Lossless Coding (ALS) decoder.
cehoyos
parents:
diff changeset
1034 }
9b56cd1e37b7 Add MPEG-4 Audio Lossless Coding (ALS) decoder.
cehoyos
parents:
diff changeset
1035
9b56cd1e37b7 Add MPEG-4 Audio Lossless Coding (ALS) decoder.
cehoyos
parents:
diff changeset
1036 return 0;
9b56cd1e37b7 Add MPEG-4 Audio Lossless Coding (ALS) decoder.
cehoyos
parents:
diff changeset
1037 }
9b56cd1e37b7 Add MPEG-4 Audio Lossless Coding (ALS) decoder.
cehoyos
parents:
diff changeset
1038
9b56cd1e37b7 Add MPEG-4 Audio Lossless Coding (ALS) decoder.
cehoyos
parents:
diff changeset
1039
9b56cd1e37b7 Add MPEG-4 Audio Lossless Coding (ALS) decoder.
cehoyos
parents:
diff changeset
1040 /** Decodes blocks dependently.
9b56cd1e37b7 Add MPEG-4 Audio Lossless Coding (ALS) decoder.
cehoyos
parents:
diff changeset
1041 */
9b56cd1e37b7 Add MPEG-4 Audio Lossless Coding (ALS) decoder.
cehoyos
parents:
diff changeset
1042 static int decode_blocks(ALSDecContext *ctx, unsigned int ra_frame,
9b56cd1e37b7 Add MPEG-4 Audio Lossless Coding (ALS) decoder.
cehoyos
parents:
diff changeset
1043 unsigned int c, const unsigned int *div_blocks,
9b56cd1e37b7 Add MPEG-4 Audio Lossless Coding (ALS) decoder.
cehoyos
parents:
diff changeset
1044 unsigned int *js_blocks)
9b56cd1e37b7 Add MPEG-4 Audio Lossless Coding (ALS) decoder.
cehoyos
parents:
diff changeset
1045 {
9b56cd1e37b7 Add MPEG-4 Audio Lossless Coding (ALS) decoder.
cehoyos
parents:
diff changeset
1046 ALSSpecificConfig *sconf = &ctx->sconf;
9b56cd1e37b7 Add MPEG-4 Audio Lossless Coding (ALS) decoder.
cehoyos
parents:
diff changeset
1047 unsigned int offset = 0;
9b56cd1e37b7 Add MPEG-4 Audio Lossless Coding (ALS) decoder.
cehoyos
parents:
diff changeset
1048 unsigned int b;
10681
997692df50c1 Read and decode block data in separate functions to prepare support for
thilo.borgmann
parents: 10535
diff changeset
1049 ALSBlockData bd[2];
997692df50c1 Read and decode block data in separate functions to prepare support for
thilo.borgmann
parents: 10535
diff changeset
1050
997692df50c1 Read and decode block data in separate functions to prepare support for
thilo.borgmann
parents: 10535
diff changeset
1051 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
1052
997692df50c1 Read and decode block data in separate functions to prepare support for
thilo.borgmann
parents: 10535
diff changeset
1053 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
1054 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
1055 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
1056 bd[0].ltp_gain = ctx->ltp_gain[0];
10802
4f614b69b4e5 Add multi-channel correlation support for ALS.
thilo.borgmann
parents: 10800
diff changeset
1057 bd[0].quant_cof = ctx->quant_cof[0];
4f614b69b4e5 Add multi-channel correlation support for ALS.
thilo.borgmann
parents: 10800
diff changeset
1058 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
1059 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
1060 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
1061
997692df50c1 Read and decode block data in separate functions to prepare support for
thilo.borgmann
parents: 10535
diff changeset
1062 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
1063 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
1064 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
1065 bd[1].ltp_gain = ctx->ltp_gain[0];
10802
4f614b69b4e5 Add multi-channel correlation support for ALS.
thilo.borgmann
parents: 10800
diff changeset
1066 bd[1].quant_cof = ctx->quant_cof[0];
4f614b69b4e5 Add multi-channel correlation support for ALS.
thilo.borgmann
parents: 10800
diff changeset
1067 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
1068 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
1069 bd[1].js_blocks = *(js_blocks + 1);
10522
9b56cd1e37b7 Add MPEG-4 Audio Lossless Coding (ALS) decoder.
cehoyos
parents:
diff changeset
1070
9b56cd1e37b7 Add MPEG-4 Audio Lossless Coding (ALS) decoder.
cehoyos
parents:
diff changeset
1071 // decode all blocks
9b56cd1e37b7 Add MPEG-4 Audio Lossless Coding (ALS) decoder.
cehoyos
parents:
diff changeset
1072 for (b = 0; b < ctx->num_blocks; b++) {
9b56cd1e37b7 Add MPEG-4 Audio Lossless Coding (ALS) decoder.
cehoyos
parents:
diff changeset
1073 unsigned int s;
10681
997692df50c1 Read and decode block data in separate functions to prepare support for
thilo.borgmann
parents: 10535
diff changeset
1074
997692df50c1 Read and decode block data in separate functions to prepare support for
thilo.borgmann
parents: 10535
diff changeset
1075 bd[0].shift_lsbs = 0;
997692df50c1 Read and decode block data in separate functions to prepare support for
thilo.borgmann
parents: 10535
diff changeset
1076 bd[1].shift_lsbs = 0;
997692df50c1 Read and decode block data in separate functions to prepare support for
thilo.borgmann
parents: 10535
diff changeset
1077
997692df50c1 Read and decode block data in separate functions to prepare support for
thilo.borgmann
parents: 10535
diff changeset
1078 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
1079 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
1080
997692df50c1 Read and decode block data in separate functions to prepare support for
thilo.borgmann
parents: 10535
diff changeset
1081 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
1082 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
1083
997692df50c1 Read and decode block data in separate functions to prepare support for
thilo.borgmann
parents: 10535
diff changeset
1084 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
1085 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
1086
997692df50c1 Read and decode block data in separate functions to prepare support for
thilo.borgmann
parents: 10535
diff changeset
1087 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
1088 // 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
1089 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
1090 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
1091 return -1;
9b56cd1e37b7 Add MPEG-4 Audio Lossless Coding (ALS) decoder.
cehoyos
parents:
diff changeset
1092 }
9b56cd1e37b7 Add MPEG-4 Audio Lossless Coding (ALS) decoder.
cehoyos
parents:
diff changeset
1093
9b56cd1e37b7 Add MPEG-4 Audio Lossless Coding (ALS) decoder.
cehoyos
parents:
diff changeset
1094 // reconstruct joint-stereo blocks
10681
997692df50c1 Read and decode block data in separate functions to prepare support for
thilo.borgmann
parents: 10535
diff changeset
1095 if (bd[0].js_blocks) {
997692df50c1 Read and decode block data in separate functions to prepare support for
thilo.borgmann
parents: 10535
diff changeset
1096 if (bd[1].js_blocks)
10522
9b56cd1e37b7 Add MPEG-4 Audio Lossless Coding (ALS) decoder.
cehoyos
parents:
diff changeset
1097 av_log(ctx->avctx, AV_LOG_WARNING, "Invalid channel pair!\n");
9b56cd1e37b7 Add MPEG-4 Audio Lossless Coding (ALS) decoder.
cehoyos
parents:
diff changeset
1098
9b56cd1e37b7 Add MPEG-4 Audio Lossless Coding (ALS) decoder.
cehoyos
parents:
diff changeset
1099 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
1100 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
1101 } else if (bd[1].js_blocks) {
10522
9b56cd1e37b7 Add MPEG-4 Audio Lossless Coding (ALS) decoder.
cehoyos
parents:
diff changeset
1102 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
1103 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
1104 }
9b56cd1e37b7 Add MPEG-4 Audio Lossless Coding (ALS) decoder.
cehoyos
parents:
diff changeset
1105
9b56cd1e37b7 Add MPEG-4 Audio Lossless Coding (ALS) decoder.
cehoyos
parents:
diff changeset
1106 offset += div_blocks[b];
10681
997692df50c1 Read and decode block data in separate functions to prepare support for
thilo.borgmann
parents: 10535
diff changeset
1107 bd[0].ra_block = 0;
997692df50c1 Read and decode block data in separate functions to prepare support for
thilo.borgmann
parents: 10535
diff changeset
1108 bd[1].ra_block = 0;
10522
9b56cd1e37b7 Add MPEG-4 Audio Lossless Coding (ALS) decoder.
cehoyos
parents:
diff changeset
1109 }
9b56cd1e37b7 Add MPEG-4 Audio Lossless Coding (ALS) decoder.
cehoyos
parents:
diff changeset
1110
9b56cd1e37b7 Add MPEG-4 Audio Lossless Coding (ALS) decoder.
cehoyos
parents:
diff changeset
1111 // store carryover raw samples,
9b56cd1e37b7 Add MPEG-4 Audio Lossless Coding (ALS) decoder.
cehoyos
parents:
diff changeset
1112 // the others channel raw samples are stored by the calling function.
9b56cd1e37b7 Add MPEG-4 Audio Lossless Coding (ALS) decoder.
cehoyos
parents:
diff changeset
1113 memmove(ctx->raw_samples[c] - sconf->max_order,
9b56cd1e37b7 Add MPEG-4 Audio Lossless Coding (ALS) decoder.
cehoyos
parents:
diff changeset
1114 ctx->raw_samples[c] - sconf->max_order + sconf->frame_length,
9b56cd1e37b7 Add MPEG-4 Audio Lossless Coding (ALS) decoder.
cehoyos
parents:
diff changeset
1115 sizeof(*ctx->raw_samples[c]) * sconf->max_order);
9b56cd1e37b7 Add MPEG-4 Audio Lossless Coding (ALS) decoder.
cehoyos
parents:
diff changeset
1116
9b56cd1e37b7 Add MPEG-4 Audio Lossless Coding (ALS) decoder.
cehoyos
parents:
diff changeset
1117 return 0;
9b56cd1e37b7 Add MPEG-4 Audio Lossless Coding (ALS) decoder.
cehoyos
parents:
diff changeset
1118 }
9b56cd1e37b7 Add MPEG-4 Audio Lossless Coding (ALS) decoder.
cehoyos
parents:
diff changeset
1119
9b56cd1e37b7 Add MPEG-4 Audio Lossless Coding (ALS) decoder.
cehoyos
parents:
diff changeset
1120
10802
4f614b69b4e5 Add multi-channel correlation support for ALS.
thilo.borgmann
parents: 10800
diff changeset
1121 /** Reads the channel data.
4f614b69b4e5 Add multi-channel correlation support for ALS.
thilo.borgmann
parents: 10800
diff changeset
1122 */
4f614b69b4e5 Add multi-channel correlation support for ALS.
thilo.borgmann
parents: 10800
diff changeset
1123 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
1124 {
4f614b69b4e5 Add multi-channel correlation support for ALS.
thilo.borgmann
parents: 10800
diff changeset
1125 GetBitContext *gb = &ctx->gb;
4f614b69b4e5 Add multi-channel correlation support for ALS.
thilo.borgmann
parents: 10800
diff changeset
1126 ALSChannelData *current = cd;
4f614b69b4e5 Add multi-channel correlation support for ALS.
thilo.borgmann
parents: 10800
diff changeset
1127 unsigned int channels = ctx->avctx->channels;
4f614b69b4e5 Add multi-channel correlation support for ALS.
thilo.borgmann
parents: 10800
diff changeset
1128 int entries = 0;
4f614b69b4e5 Add multi-channel correlation support for ALS.
thilo.borgmann
parents: 10800
diff changeset
1129
4f614b69b4e5 Add multi-channel correlation support for ALS.
thilo.borgmann
parents: 10800
diff changeset
1130 while (entries < channels && !(current->stop_flag = get_bits1(gb))) {
4f614b69b4e5 Add multi-channel correlation support for ALS.
thilo.borgmann
parents: 10800
diff changeset
1131 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
1132
4f614b69b4e5 Add multi-channel correlation support for ALS.
thilo.borgmann
parents: 10800
diff changeset
1133 if (current->master_channel >= channels) {
4f614b69b4e5 Add multi-channel correlation support for ALS.
thilo.borgmann
parents: 10800
diff changeset
1134 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
1135 return -1;
4f614b69b4e5 Add multi-channel correlation support for ALS.
thilo.borgmann
parents: 10800
diff changeset
1136 }
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 if (current->master_channel != c) {
4f614b69b4e5 Add multi-channel correlation support for ALS.
thilo.borgmann
parents: 10800
diff changeset
1139 current->time_diff_flag = get_bits1(gb);
4f614b69b4e5 Add multi-channel correlation support for ALS.
thilo.borgmann
parents: 10800
diff changeset
1140 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
1141 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
1142 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
1143
4f614b69b4e5 Add multi-channel correlation support for ALS.
thilo.borgmann
parents: 10800
diff changeset
1144 if (current->time_diff_flag) {
4f614b69b4e5 Add multi-channel correlation support for ALS.
thilo.borgmann
parents: 10800
diff changeset
1145 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
1146 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
1147 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
1148
4f614b69b4e5 Add multi-channel correlation support for ALS.
thilo.borgmann
parents: 10800
diff changeset
1149 current->time_diff_sign = get_bits1(gb);
4f614b69b4e5 Add multi-channel correlation support for ALS.
thilo.borgmann
parents: 10800
diff changeset
1150 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
1151 }
4f614b69b4e5 Add multi-channel correlation support for ALS.
thilo.borgmann
parents: 10800
diff changeset
1152 }
4f614b69b4e5 Add multi-channel correlation support for ALS.
thilo.borgmann
parents: 10800
diff changeset
1153
4f614b69b4e5 Add multi-channel correlation support for ALS.
thilo.borgmann
parents: 10800
diff changeset
1154 current++;
4f614b69b4e5 Add multi-channel correlation support for ALS.
thilo.borgmann
parents: 10800
diff changeset
1155 entries++;
4f614b69b4e5 Add multi-channel correlation support for ALS.
thilo.borgmann
parents: 10800
diff changeset
1156 }
4f614b69b4e5 Add multi-channel correlation support for ALS.
thilo.borgmann
parents: 10800
diff changeset
1157
4f614b69b4e5 Add multi-channel correlation support for ALS.
thilo.borgmann
parents: 10800
diff changeset
1158 if (entries == channels) {
4f614b69b4e5 Add multi-channel correlation support for ALS.
thilo.borgmann
parents: 10800
diff changeset
1159 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
1160 return -1;
4f614b69b4e5 Add multi-channel correlation support for ALS.
thilo.borgmann
parents: 10800
diff changeset
1161 }
4f614b69b4e5 Add multi-channel correlation support for ALS.
thilo.borgmann
parents: 10800
diff changeset
1162
4f614b69b4e5 Add multi-channel correlation support for ALS.
thilo.borgmann
parents: 10800
diff changeset
1163 align_get_bits(gb);
4f614b69b4e5 Add multi-channel correlation support for ALS.
thilo.borgmann
parents: 10800
diff changeset
1164 return 0;
4f614b69b4e5 Add multi-channel correlation support for ALS.
thilo.borgmann
parents: 10800
diff changeset
1165 }
4f614b69b4e5 Add multi-channel correlation support for ALS.
thilo.borgmann
parents: 10800
diff changeset
1166
4f614b69b4e5 Add multi-channel correlation support for ALS.
thilo.borgmann
parents: 10800
diff changeset
1167
4f614b69b4e5 Add multi-channel correlation support for ALS.
thilo.borgmann
parents: 10800
diff changeset
1168 /** Recursively reverts the inter-channel correlation for a block.
4f614b69b4e5 Add multi-channel correlation support for ALS.
thilo.borgmann
parents: 10800
diff changeset
1169 */
4f614b69b4e5 Add multi-channel correlation support for ALS.
thilo.borgmann
parents: 10800
diff changeset
1170 static int revert_channel_correlation(ALSDecContext *ctx, ALSBlockData *bd,
4f614b69b4e5 Add multi-channel correlation support for ALS.
thilo.borgmann
parents: 10800
diff changeset
1171 ALSChannelData **cd, int *reverted,
4f614b69b4e5 Add multi-channel correlation support for ALS.
thilo.borgmann
parents: 10800
diff changeset
1172 unsigned int offset, int c)
4f614b69b4e5 Add multi-channel correlation support for ALS.
thilo.borgmann
parents: 10800
diff changeset
1173 {
4f614b69b4e5 Add multi-channel correlation support for ALS.
thilo.borgmann
parents: 10800
diff changeset
1174 ALSChannelData *ch = cd[c];
4f614b69b4e5 Add multi-channel correlation support for ALS.
thilo.borgmann
parents: 10800
diff changeset
1175 unsigned int dep = 0;
4f614b69b4e5 Add multi-channel correlation support for ALS.
thilo.borgmann
parents: 10800
diff changeset
1176 unsigned int channels = ctx->avctx->channels;
4f614b69b4e5 Add multi-channel correlation support for ALS.
thilo.borgmann
parents: 10800
diff changeset
1177
4f614b69b4e5 Add multi-channel correlation support for ALS.
thilo.borgmann
parents: 10800
diff changeset
1178 if (reverted[c])
4f614b69b4e5 Add multi-channel correlation support for ALS.
thilo.borgmann
parents: 10800
diff changeset
1179 return 0;
4f614b69b4e5 Add multi-channel correlation support for ALS.
thilo.borgmann
parents: 10800
diff changeset
1180
4f614b69b4e5 Add multi-channel correlation support for ALS.
thilo.borgmann
parents: 10800
diff changeset
1181 reverted[c] = 1;
4f614b69b4e5 Add multi-channel correlation support for ALS.
thilo.borgmann
parents: 10800
diff changeset
1182
4f614b69b4e5 Add multi-channel correlation support for ALS.
thilo.borgmann
parents: 10800
diff changeset
1183 while (dep < channels && !ch[dep].stop_flag) {
4f614b69b4e5 Add multi-channel correlation support for ALS.
thilo.borgmann
parents: 10800
diff changeset
1184 revert_channel_correlation(ctx, bd, cd, reverted, offset,
4f614b69b4e5 Add multi-channel correlation support for ALS.
thilo.borgmann
parents: 10800
diff changeset
1185 ch[dep].master_channel);
4f614b69b4e5 Add multi-channel correlation support for ALS.
thilo.borgmann
parents: 10800
diff changeset
1186
4f614b69b4e5 Add multi-channel correlation support for ALS.
thilo.borgmann
parents: 10800
diff changeset
1187 dep++;
4f614b69b4e5 Add multi-channel correlation support for ALS.
thilo.borgmann
parents: 10800
diff changeset
1188 }
4f614b69b4e5 Add multi-channel correlation support for ALS.
thilo.borgmann
parents: 10800
diff changeset
1189
4f614b69b4e5 Add multi-channel correlation support for ALS.
thilo.borgmann
parents: 10800
diff changeset
1190 if (dep == channels) {
4f614b69b4e5 Add multi-channel correlation support for ALS.
thilo.borgmann
parents: 10800
diff changeset
1191 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
1192 return -1;
4f614b69b4e5 Add multi-channel correlation support for ALS.
thilo.borgmann
parents: 10800
diff changeset
1193 }
4f614b69b4e5 Add multi-channel correlation support for ALS.
thilo.borgmann
parents: 10800
diff changeset
1194
4f614b69b4e5 Add multi-channel correlation support for ALS.
thilo.borgmann
parents: 10800
diff changeset
1195 bd->use_ltp = ctx->use_ltp + c;
4f614b69b4e5 Add multi-channel correlation support for ALS.
thilo.borgmann
parents: 10800
diff changeset
1196 bd->ltp_lag = ctx->ltp_lag + c;
4f614b69b4e5 Add multi-channel correlation support for ALS.
thilo.borgmann
parents: 10800
diff changeset
1197 bd->ltp_gain = ctx->ltp_gain[c];
4f614b69b4e5 Add multi-channel correlation support for ALS.
thilo.borgmann
parents: 10800
diff changeset
1198 bd->lpc_cof = ctx->lpc_cof[c];
4f614b69b4e5 Add multi-channel correlation support for ALS.
thilo.borgmann
parents: 10800
diff changeset
1199 bd->quant_cof = ctx->quant_cof[c];
4f614b69b4e5 Add multi-channel correlation support for ALS.
thilo.borgmann
parents: 10800
diff changeset
1200 bd->raw_samples = ctx->raw_samples[c] + offset;
4f614b69b4e5 Add multi-channel correlation support for ALS.
thilo.borgmann
parents: 10800
diff changeset
1201
4f614b69b4e5 Add multi-channel correlation support for ALS.
thilo.borgmann
parents: 10800
diff changeset
1202 dep = 0;
4f614b69b4e5 Add multi-channel correlation support for ALS.
thilo.borgmann
parents: 10800
diff changeset
1203 while (!ch[dep].stop_flag) {
4f614b69b4e5 Add multi-channel correlation support for ALS.
thilo.borgmann
parents: 10800
diff changeset
1204 unsigned int smp;
4f614b69b4e5 Add multi-channel correlation support for ALS.
thilo.borgmann
parents: 10800
diff changeset
1205 unsigned int begin = 1;
4f614b69b4e5 Add multi-channel correlation support for ALS.
thilo.borgmann
parents: 10800
diff changeset
1206 unsigned int end = bd->block_length - 1;
4f614b69b4e5 Add multi-channel correlation support for ALS.
thilo.borgmann
parents: 10800
diff changeset
1207 int64_t y;
4f614b69b4e5 Add multi-channel correlation support for ALS.
thilo.borgmann
parents: 10800
diff changeset
1208 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
1209
4f614b69b4e5 Add multi-channel correlation support for ALS.
thilo.borgmann
parents: 10800
diff changeset
1210 if (ch[dep].time_diff_flag) {
4f614b69b4e5 Add multi-channel correlation support for ALS.
thilo.borgmann
parents: 10800
diff changeset
1211 int t = ch[dep].time_diff_index;
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 if (ch[dep].time_diff_sign) {
4f614b69b4e5 Add multi-channel correlation support for ALS.
thilo.borgmann
parents: 10800
diff changeset
1214 t = -t;
4f614b69b4e5 Add multi-channel correlation support for ALS.
thilo.borgmann
parents: 10800
diff changeset
1215 begin -= t;
4f614b69b4e5 Add multi-channel correlation support for ALS.
thilo.borgmann
parents: 10800
diff changeset
1216 } else {
4f614b69b4e5 Add multi-channel correlation support for ALS.
thilo.borgmann
parents: 10800
diff changeset
1217 end -= t;
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
4f614b69b4e5 Add multi-channel correlation support for ALS.
thilo.borgmann
parents: 10800
diff changeset
1220 for (smp = begin; smp < end; smp++) {
4f614b69b4e5 Add multi-channel correlation support for ALS.
thilo.borgmann
parents: 10800
diff changeset
1221 y = (1 << 6) +
4f614b69b4e5 Add multi-channel correlation support for ALS.
thilo.borgmann
parents: 10800
diff changeset
1222 MUL64(ch[dep].weighting[0], master[smp - 1 ]) +
4f614b69b4e5 Add multi-channel correlation support for ALS.
thilo.borgmann
parents: 10800
diff changeset
1223 MUL64(ch[dep].weighting[1], master[smp ]) +
4f614b69b4e5 Add multi-channel correlation support for ALS.
thilo.borgmann
parents: 10800
diff changeset
1224 MUL64(ch[dep].weighting[2], master[smp + 1 ]) +
4f614b69b4e5 Add multi-channel correlation support for ALS.
thilo.borgmann
parents: 10800
diff changeset
1225 MUL64(ch[dep].weighting[3], master[smp - 1 + t]) +
4f614b69b4e5 Add multi-channel correlation support for ALS.
thilo.borgmann
parents: 10800
diff changeset
1226 MUL64(ch[dep].weighting[4], master[smp + t]) +
4f614b69b4e5 Add multi-channel correlation support for ALS.
thilo.borgmann
parents: 10800
diff changeset
1227 MUL64(ch[dep].weighting[5], master[smp + 1 + t]);
4f614b69b4e5 Add multi-channel correlation support for ALS.
thilo.borgmann
parents: 10800
diff changeset
1228
4f614b69b4e5 Add multi-channel correlation support for ALS.
thilo.borgmann
parents: 10800
diff changeset
1229 bd->raw_samples[smp] += y >> 7;
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 } else {
4f614b69b4e5 Add multi-channel correlation support for ALS.
thilo.borgmann
parents: 10800
diff changeset
1232 for (smp = begin; smp < end; smp++) {
4f614b69b4e5 Add multi-channel correlation support for ALS.
thilo.borgmann
parents: 10800
diff changeset
1233 y = (1 << 6) +
4f614b69b4e5 Add multi-channel correlation support for ALS.
thilo.borgmann
parents: 10800
diff changeset
1234 MUL64(ch[dep].weighting[0], master[smp - 1]) +
4f614b69b4e5 Add multi-channel correlation support for ALS.
thilo.borgmann
parents: 10800
diff changeset
1235 MUL64(ch[dep].weighting[1], master[smp ]) +
4f614b69b4e5 Add multi-channel correlation support for ALS.
thilo.borgmann
parents: 10800
diff changeset
1236 MUL64(ch[dep].weighting[2], master[smp + 1]);
4f614b69b4e5 Add multi-channel correlation support for ALS.
thilo.borgmann
parents: 10800
diff changeset
1237
4f614b69b4e5 Add multi-channel correlation support for ALS.
thilo.borgmann
parents: 10800
diff changeset
1238 bd->raw_samples[smp] += y >> 7;
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 }
4f614b69b4e5 Add multi-channel correlation support for ALS.
thilo.borgmann
parents: 10800
diff changeset
1241
4f614b69b4e5 Add multi-channel correlation support for ALS.
thilo.borgmann
parents: 10800
diff changeset
1242 dep++;
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 return 0;
4f614b69b4e5 Add multi-channel correlation support for ALS.
thilo.borgmann
parents: 10800
diff changeset
1246 }
4f614b69b4e5 Add multi-channel correlation support for ALS.
thilo.borgmann
parents: 10800
diff changeset
1247
4f614b69b4e5 Add multi-channel correlation support for ALS.
thilo.borgmann
parents: 10800
diff changeset
1248
10522
9b56cd1e37b7 Add MPEG-4 Audio Lossless Coding (ALS) decoder.
cehoyos
parents:
diff changeset
1249 /** Reads the frame data.
9b56cd1e37b7 Add MPEG-4 Audio Lossless Coding (ALS) decoder.
cehoyos
parents:
diff changeset
1250 */
9b56cd1e37b7 Add MPEG-4 Audio Lossless Coding (ALS) decoder.
cehoyos
parents:
diff changeset
1251 static int read_frame_data(ALSDecContext *ctx, unsigned int ra_frame)
9b56cd1e37b7 Add MPEG-4 Audio Lossless Coding (ALS) decoder.
cehoyos
parents:
diff changeset
1252 {
9b56cd1e37b7 Add MPEG-4 Audio Lossless Coding (ALS) decoder.
cehoyos
parents:
diff changeset
1253 ALSSpecificConfig *sconf = &ctx->sconf;
9b56cd1e37b7 Add MPEG-4 Audio Lossless Coding (ALS) decoder.
cehoyos
parents:
diff changeset
1254 AVCodecContext *avctx = ctx->avctx;
9b56cd1e37b7 Add MPEG-4 Audio Lossless Coding (ALS) decoder.
cehoyos
parents:
diff changeset
1255 GetBitContext *gb = &ctx->gb;
9b56cd1e37b7 Add MPEG-4 Audio Lossless Coding (ALS) decoder.
cehoyos
parents:
diff changeset
1256 unsigned int div_blocks[32]; ///< block sizes.
9b56cd1e37b7 Add MPEG-4 Audio Lossless Coding (ALS) decoder.
cehoyos
parents:
diff changeset
1257 unsigned int c;
9b56cd1e37b7 Add MPEG-4 Audio Lossless Coding (ALS) decoder.
cehoyos
parents:
diff changeset
1258 unsigned int js_blocks[2];
9b56cd1e37b7 Add MPEG-4 Audio Lossless Coding (ALS) decoder.
cehoyos
parents:
diff changeset
1259
9b56cd1e37b7 Add MPEG-4 Audio Lossless Coding (ALS) decoder.
cehoyos
parents:
diff changeset
1260 uint32_t bs_info = 0;
9b56cd1e37b7 Add MPEG-4 Audio Lossless Coding (ALS) decoder.
cehoyos
parents:
diff changeset
1261
9b56cd1e37b7 Add MPEG-4 Audio Lossless Coding (ALS) decoder.
cehoyos
parents:
diff changeset
1262 // 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
1263 if (sconf->ra_flag == RA_FLAG_FRAMES && ra_frame)
9b56cd1e37b7 Add MPEG-4 Audio Lossless Coding (ALS) decoder.
cehoyos
parents:
diff changeset
1264 skip_bits_long(gb, 32);
9b56cd1e37b7 Add MPEG-4 Audio Lossless Coding (ALS) decoder.
cehoyos
parents:
diff changeset
1265
9b56cd1e37b7 Add MPEG-4 Audio Lossless Coding (ALS) decoder.
cehoyos
parents:
diff changeset
1266 if (sconf->mc_coding && sconf->joint_stereo) {
9b56cd1e37b7 Add MPEG-4 Audio Lossless Coding (ALS) decoder.
cehoyos
parents:
diff changeset
1267 ctx->js_switch = get_bits1(gb);
9b56cd1e37b7 Add MPEG-4 Audio Lossless Coding (ALS) decoder.
cehoyos
parents:
diff changeset
1268 align_get_bits(gb);
9b56cd1e37b7 Add MPEG-4 Audio Lossless Coding (ALS) decoder.
cehoyos
parents:
diff changeset
1269 }
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 if (!sconf->mc_coding || ctx->js_switch) {
9b56cd1e37b7 Add MPEG-4 Audio Lossless Coding (ALS) decoder.
cehoyos
parents:
diff changeset
1272 int independent_bs = !sconf->joint_stereo;
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 for (c = 0; c < avctx->channels; c++) {
9b56cd1e37b7 Add MPEG-4 Audio Lossless Coding (ALS) decoder.
cehoyos
parents:
diff changeset
1275 js_blocks[0] = 0;
9b56cd1e37b7 Add MPEG-4 Audio Lossless Coding (ALS) decoder.
cehoyos
parents:
diff changeset
1276 js_blocks[1] = 0;
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 get_block_sizes(ctx, div_blocks, &bs_info);
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 // if joint_stereo and block_switching is set, independent decoding
9b56cd1e37b7 Add MPEG-4 Audio Lossless Coding (ALS) decoder.
cehoyos
parents:
diff changeset
1281 // is signaled via the first bit of bs_info
9b56cd1e37b7 Add MPEG-4 Audio Lossless Coding (ALS) decoder.
cehoyos
parents:
diff changeset
1282 if (sconf->joint_stereo && sconf->block_switching)
9b56cd1e37b7 Add MPEG-4 Audio Lossless Coding (ALS) decoder.
cehoyos
parents:
diff changeset
1283 if (bs_info >> 31)
9b56cd1e37b7 Add MPEG-4 Audio Lossless Coding (ALS) decoder.
cehoyos
parents:
diff changeset
1284 independent_bs = 2;
9b56cd1e37b7 Add MPEG-4 Audio Lossless Coding (ALS) decoder.
cehoyos
parents:
diff changeset
1285
9b56cd1e37b7 Add MPEG-4 Audio Lossless Coding (ALS) decoder.
cehoyos
parents:
diff changeset
1286 // 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
1287 if (c == avctx->channels - 1)
9b56cd1e37b7 Add MPEG-4 Audio Lossless Coding (ALS) decoder.
cehoyos
parents:
diff changeset
1288 independent_bs = 1;
9b56cd1e37b7 Add MPEG-4 Audio Lossless Coding (ALS) decoder.
cehoyos
parents:
diff changeset
1289
9b56cd1e37b7 Add MPEG-4 Audio Lossless Coding (ALS) decoder.
cehoyos
parents:
diff changeset
1290 if (independent_bs) {
9b56cd1e37b7 Add MPEG-4 Audio Lossless Coding (ALS) decoder.
cehoyos
parents:
diff changeset
1291 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
1292 return -1;
9b56cd1e37b7 Add MPEG-4 Audio Lossless Coding (ALS) decoder.
cehoyos
parents:
diff changeset
1293
9b56cd1e37b7 Add MPEG-4 Audio Lossless Coding (ALS) decoder.
cehoyos
parents:
diff changeset
1294 independent_bs--;
9b56cd1e37b7 Add MPEG-4 Audio Lossless Coding (ALS) decoder.
cehoyos
parents:
diff changeset
1295 } else {
9b56cd1e37b7 Add MPEG-4 Audio Lossless Coding (ALS) decoder.
cehoyos
parents:
diff changeset
1296 if (decode_blocks(ctx, ra_frame, c, div_blocks, js_blocks))
9b56cd1e37b7 Add MPEG-4 Audio Lossless Coding (ALS) decoder.
cehoyos
parents:
diff changeset
1297 return -1;
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 c++;
9b56cd1e37b7 Add MPEG-4 Audio Lossless Coding (ALS) decoder.
cehoyos
parents:
diff changeset
1300 }
9b56cd1e37b7 Add MPEG-4 Audio Lossless Coding (ALS) decoder.
cehoyos
parents:
diff changeset
1301
9b56cd1e37b7 Add MPEG-4 Audio Lossless Coding (ALS) decoder.
cehoyos
parents:
diff changeset
1302 // store carryover raw samples
9b56cd1e37b7 Add MPEG-4 Audio Lossless Coding (ALS) decoder.
cehoyos
parents:
diff changeset
1303 memmove(ctx->raw_samples[c] - sconf->max_order,
9b56cd1e37b7 Add MPEG-4 Audio Lossless Coding (ALS) decoder.
cehoyos
parents:
diff changeset
1304 ctx->raw_samples[c] - sconf->max_order + sconf->frame_length,
9b56cd1e37b7 Add MPEG-4 Audio Lossless Coding (ALS) decoder.
cehoyos
parents:
diff changeset
1305 sizeof(*ctx->raw_samples[c]) * sconf->max_order);
9b56cd1e37b7 Add MPEG-4 Audio Lossless Coding (ALS) decoder.
cehoyos
parents:
diff changeset
1306 }
9b56cd1e37b7 Add MPEG-4 Audio Lossless Coding (ALS) decoder.
cehoyos
parents:
diff changeset
1307 } else { // multi-channel coding
10802
4f614b69b4e5 Add multi-channel correlation support for ALS.
thilo.borgmann
parents: 10800
diff changeset
1308 ALSBlockData bd;
4f614b69b4e5 Add multi-channel correlation support for ALS.
thilo.borgmann
parents: 10800
diff changeset
1309 int b;
4f614b69b4e5 Add multi-channel correlation support for ALS.
thilo.borgmann
parents: 10800
diff changeset
1310 int *reverted_channels = ctx->reverted_channels;
4f614b69b4e5 Add multi-channel correlation support for ALS.
thilo.borgmann
parents: 10800
diff changeset
1311 unsigned int offset = 0;
4f614b69b4e5 Add multi-channel correlation support for ALS.
thilo.borgmann
parents: 10800
diff changeset
1312
4f614b69b4e5 Add multi-channel correlation support for ALS.
thilo.borgmann
parents: 10800
diff changeset
1313 for (c = 0; c < avctx->channels; c++)
4f614b69b4e5 Add multi-channel correlation support for ALS.
thilo.borgmann
parents: 10800
diff changeset
1314 if (ctx->chan_data[c] < ctx->chan_data_buffer) {
4f614b69b4e5 Add multi-channel correlation support for ALS.
thilo.borgmann
parents: 10800
diff changeset
1315 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
1316 return -1;
4f614b69b4e5 Add multi-channel correlation support for ALS.
thilo.borgmann
parents: 10800
diff changeset
1317 }
4f614b69b4e5 Add multi-channel correlation support for ALS.
thilo.borgmann
parents: 10800
diff changeset
1318
4f614b69b4e5 Add multi-channel correlation support for ALS.
thilo.borgmann
parents: 10800
diff changeset
1319 memset(&bd, 0, sizeof(ALSBlockData));
4f614b69b4e5 Add multi-channel correlation support for ALS.
thilo.borgmann
parents: 10800
diff changeset
1320 memset(reverted_channels, 0, sizeof(*reverted_channels) * avctx->channels);
4f614b69b4e5 Add multi-channel correlation support for ALS.
thilo.borgmann
parents: 10800
diff changeset
1321
4f614b69b4e5 Add multi-channel correlation support for ALS.
thilo.borgmann
parents: 10800
diff changeset
1322 bd.ra_block = ra_frame;
4f614b69b4e5 Add multi-channel correlation support for ALS.
thilo.borgmann
parents: 10800
diff changeset
1323 bd.prev_raw_samples = ctx->prev_raw_samples;
4f614b69b4e5 Add multi-channel correlation support for ALS.
thilo.borgmann
parents: 10800
diff changeset
1324
10522
9b56cd1e37b7 Add MPEG-4 Audio Lossless Coding (ALS) decoder.
cehoyos
parents:
diff changeset
1325 get_block_sizes(ctx, div_blocks, &bs_info);
9b56cd1e37b7 Add MPEG-4 Audio Lossless Coding (ALS) decoder.
cehoyos
parents:
diff changeset
1326
10802
4f614b69b4e5 Add multi-channel correlation support for ALS.
thilo.borgmann
parents: 10800
diff changeset
1327 for (b = 0; b < ctx->num_blocks; b++) {
4f614b69b4e5 Add multi-channel correlation support for ALS.
thilo.borgmann
parents: 10800
diff changeset
1328 bd.shift_lsbs = 0;
4f614b69b4e5 Add multi-channel correlation support for ALS.
thilo.borgmann
parents: 10800
diff changeset
1329 bd.block_length = div_blocks[b];
4f614b69b4e5 Add multi-channel correlation support for ALS.
thilo.borgmann
parents: 10800
diff changeset
1330
4f614b69b4e5 Add multi-channel correlation support for ALS.
thilo.borgmann
parents: 10800
diff changeset
1331 for (c = 0; c < avctx->channels; c++) {
4f614b69b4e5 Add multi-channel correlation support for ALS.
thilo.borgmann
parents: 10800
diff changeset
1332 bd.use_ltp = ctx->use_ltp + c;
4f614b69b4e5 Add multi-channel correlation support for ALS.
thilo.borgmann
parents: 10800
diff changeset
1333 bd.ltp_lag = ctx->ltp_lag + c;
4f614b69b4e5 Add multi-channel correlation support for ALS.
thilo.borgmann
parents: 10800
diff changeset
1334 bd.ltp_gain = ctx->ltp_gain[c];
4f614b69b4e5 Add multi-channel correlation support for ALS.
thilo.borgmann
parents: 10800
diff changeset
1335 bd.lpc_cof = ctx->lpc_cof[c];
4f614b69b4e5 Add multi-channel correlation support for ALS.
thilo.borgmann
parents: 10800
diff changeset
1336 bd.quant_cof = ctx->quant_cof[c];
4f614b69b4e5 Add multi-channel correlation support for ALS.
thilo.borgmann
parents: 10800
diff changeset
1337 bd.raw_samples = ctx->raw_samples[c] + offset;
4f614b69b4e5 Add multi-channel correlation support for ALS.
thilo.borgmann
parents: 10800
diff changeset
1338 bd.raw_other = NULL;
4f614b69b4e5 Add multi-channel correlation support for ALS.
thilo.borgmann
parents: 10800
diff changeset
1339
4f614b69b4e5 Add multi-channel correlation support for ALS.
thilo.borgmann
parents: 10800
diff changeset
1340 read_block(ctx, &bd);
4f614b69b4e5 Add multi-channel correlation support for ALS.
thilo.borgmann
parents: 10800
diff changeset
1341 if (read_channel_data(ctx, ctx->chan_data[c], c))
4f614b69b4e5 Add multi-channel correlation support for ALS.
thilo.borgmann
parents: 10800
diff changeset
1342 return -1;
4f614b69b4e5 Add multi-channel correlation support for ALS.
thilo.borgmann
parents: 10800
diff changeset
1343 }
4f614b69b4e5 Add multi-channel correlation support for ALS.
thilo.borgmann
parents: 10800
diff changeset
1344
4f614b69b4e5 Add multi-channel correlation support for ALS.
thilo.borgmann
parents: 10800
diff changeset
1345 for (c = 0; c < avctx->channels; c++)
4f614b69b4e5 Add multi-channel correlation support for ALS.
thilo.borgmann
parents: 10800
diff changeset
1346 if (revert_channel_correlation(ctx, &bd, ctx->chan_data,
4f614b69b4e5 Add multi-channel correlation support for ALS.
thilo.borgmann
parents: 10800
diff changeset
1347 reverted_channels, offset, c))
4f614b69b4e5 Add multi-channel correlation support for ALS.
thilo.borgmann
parents: 10800
diff changeset
1348 return -1;
4f614b69b4e5 Add multi-channel correlation support for ALS.
thilo.borgmann
parents: 10800
diff changeset
1349
4f614b69b4e5 Add multi-channel correlation support for ALS.
thilo.borgmann
parents: 10800
diff changeset
1350 for (c = 0; c < avctx->channels; c++) {
4f614b69b4e5 Add multi-channel correlation support for ALS.
thilo.borgmann
parents: 10800
diff changeset
1351 bd.use_ltp = ctx->use_ltp + c;
4f614b69b4e5 Add multi-channel correlation support for ALS.
thilo.borgmann
parents: 10800
diff changeset
1352 bd.ltp_lag = ctx->ltp_lag + c;
4f614b69b4e5 Add multi-channel correlation support for ALS.
thilo.borgmann
parents: 10800
diff changeset
1353 bd.ltp_gain = ctx->ltp_gain[c];
4f614b69b4e5 Add multi-channel correlation support for ALS.
thilo.borgmann
parents: 10800
diff changeset
1354 bd.lpc_cof = ctx->lpc_cof[c];
4f614b69b4e5 Add multi-channel correlation support for ALS.
thilo.borgmann
parents: 10800
diff changeset
1355 bd.quant_cof = ctx->quant_cof[c];
4f614b69b4e5 Add multi-channel correlation support for ALS.
thilo.borgmann
parents: 10800
diff changeset
1356 bd.raw_samples = ctx->raw_samples[c] + offset;
4f614b69b4e5 Add multi-channel correlation support for ALS.
thilo.borgmann
parents: 10800
diff changeset
1357 decode_block(ctx, &bd);
4f614b69b4e5 Add multi-channel correlation support for ALS.
thilo.borgmann
parents: 10800
diff changeset
1358 }
4f614b69b4e5 Add multi-channel correlation support for ALS.
thilo.borgmann
parents: 10800
diff changeset
1359
4f614b69b4e5 Add multi-channel correlation support for ALS.
thilo.borgmann
parents: 10800
diff changeset
1360 memset(reverted_channels, 0, avctx->channels * sizeof(*reverted_channels));
4f614b69b4e5 Add multi-channel correlation support for ALS.
thilo.borgmann
parents: 10800
diff changeset
1361 offset += div_blocks[b];
4f614b69b4e5 Add multi-channel correlation support for ALS.
thilo.borgmann
parents: 10800
diff changeset
1362 bd.ra_block = 0;
4f614b69b4e5 Add multi-channel correlation support for ALS.
thilo.borgmann
parents: 10800
diff changeset
1363 }
4f614b69b4e5 Add multi-channel correlation support for ALS.
thilo.borgmann
parents: 10800
diff changeset
1364
4f614b69b4e5 Add multi-channel correlation support for ALS.
thilo.borgmann
parents: 10800
diff changeset
1365 // store carryover raw samples
4f614b69b4e5 Add multi-channel correlation support for ALS.
thilo.borgmann
parents: 10800
diff changeset
1366 for (c = 0; c < avctx->channels; c++)
4f614b69b4e5 Add multi-channel correlation support for ALS.
thilo.borgmann
parents: 10800
diff changeset
1367 memmove(ctx->raw_samples[c] - sconf->max_order,
4f614b69b4e5 Add multi-channel correlation support for ALS.
thilo.borgmann
parents: 10800
diff changeset
1368 ctx->raw_samples[c] - sconf->max_order + sconf->frame_length,
4f614b69b4e5 Add multi-channel correlation support for ALS.
thilo.borgmann
parents: 10800
diff changeset
1369 sizeof(*ctx->raw_samples[c]) * sconf->max_order);
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
9b56cd1e37b7 Add MPEG-4 Audio Lossless Coding (ALS) decoder.
cehoyos
parents:
diff changeset
1372 // TODO: read_diff_float_data
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 return 0;
9b56cd1e37b7 Add MPEG-4 Audio Lossless Coding (ALS) decoder.
cehoyos
parents:
diff changeset
1375 }
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
9b56cd1e37b7 Add MPEG-4 Audio Lossless Coding (ALS) decoder.
cehoyos
parents:
diff changeset
1378 /** Decodes an ALS frame.
9b56cd1e37b7 Add MPEG-4 Audio Lossless Coding (ALS) decoder.
cehoyos
parents:
diff changeset
1379 */
9b56cd1e37b7 Add MPEG-4 Audio Lossless Coding (ALS) decoder.
cehoyos
parents:
diff changeset
1380 static int decode_frame(AVCodecContext *avctx,
9b56cd1e37b7 Add MPEG-4 Audio Lossless Coding (ALS) decoder.
cehoyos
parents:
diff changeset
1381 void *data, int *data_size,
9b56cd1e37b7 Add MPEG-4 Audio Lossless Coding (ALS) decoder.
cehoyos
parents:
diff changeset
1382 AVPacket *avpkt)
9b56cd1e37b7 Add MPEG-4 Audio Lossless Coding (ALS) decoder.
cehoyos
parents:
diff changeset
1383 {
9b56cd1e37b7 Add MPEG-4 Audio Lossless Coding (ALS) decoder.
cehoyos
parents:
diff changeset
1384 ALSDecContext *ctx = avctx->priv_data;
9b56cd1e37b7 Add MPEG-4 Audio Lossless Coding (ALS) decoder.
cehoyos
parents:
diff changeset
1385 ALSSpecificConfig *sconf = &ctx->sconf;
9b56cd1e37b7 Add MPEG-4 Audio Lossless Coding (ALS) decoder.
cehoyos
parents:
diff changeset
1386 const uint8_t *buffer = avpkt->data;
9b56cd1e37b7 Add MPEG-4 Audio Lossless Coding (ALS) decoder.
cehoyos
parents:
diff changeset
1387 int buffer_size = avpkt->size;
9b56cd1e37b7 Add MPEG-4 Audio Lossless Coding (ALS) decoder.
cehoyos
parents:
diff changeset
1388 int invalid_frame, size;
9b56cd1e37b7 Add MPEG-4 Audio Lossless Coding (ALS) decoder.
cehoyos
parents:
diff changeset
1389 unsigned int c, sample, ra_frame, bytes_read, shift;
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 init_get_bits(&ctx->gb, buffer, buffer_size * 8);
9b56cd1e37b7 Add MPEG-4 Audio Lossless Coding (ALS) decoder.
cehoyos
parents:
diff changeset
1392
9b56cd1e37b7 Add MPEG-4 Audio Lossless Coding (ALS) decoder.
cehoyos
parents:
diff changeset
1393 // 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
1394 // (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
1395 // 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
1396 // previous frame are assumed to be zero.
9b56cd1e37b7 Add MPEG-4 Audio Lossless Coding (ALS) decoder.
cehoyos
parents:
diff changeset
1397 ra_frame = sconf->ra_distance && !(ctx->frame_id % sconf->ra_distance);
9b56cd1e37b7 Add MPEG-4 Audio Lossless Coding (ALS) decoder.
cehoyos
parents:
diff changeset
1398
9b56cd1e37b7 Add MPEG-4 Audio Lossless Coding (ALS) decoder.
cehoyos
parents:
diff changeset
1399 // the last frame to decode might have a different length
9b56cd1e37b7 Add MPEG-4 Audio Lossless Coding (ALS) decoder.
cehoyos
parents:
diff changeset
1400 if (sconf->samples != 0xFFFFFFFF)
9b56cd1e37b7 Add MPEG-4 Audio Lossless Coding (ALS) decoder.
cehoyos
parents:
diff changeset
1401 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
1402 sconf->frame_length);
9b56cd1e37b7 Add MPEG-4 Audio Lossless Coding (ALS) decoder.
cehoyos
parents:
diff changeset
1403 else
9b56cd1e37b7 Add MPEG-4 Audio Lossless Coding (ALS) decoder.
cehoyos
parents:
diff changeset
1404 ctx->cur_frame_length = sconf->frame_length;
9b56cd1e37b7 Add MPEG-4 Audio Lossless Coding (ALS) decoder.
cehoyos
parents:
diff changeset
1405
9b56cd1e37b7 Add MPEG-4 Audio Lossless Coding (ALS) decoder.
cehoyos
parents:
diff changeset
1406 // decode the frame data
9b56cd1e37b7 Add MPEG-4 Audio Lossless Coding (ALS) decoder.
cehoyos
parents:
diff changeset
1407 if ((invalid_frame = read_frame_data(ctx, ra_frame) < 0))
9b56cd1e37b7 Add MPEG-4 Audio Lossless Coding (ALS) decoder.
cehoyos
parents:
diff changeset
1408 av_log(ctx->avctx, AV_LOG_WARNING,
9b56cd1e37b7 Add MPEG-4 Audio Lossless Coding (ALS) decoder.
cehoyos
parents:
diff changeset
1409 "Reading frame data failed. Skipping RA unit.\n");
9b56cd1e37b7 Add MPEG-4 Audio Lossless Coding (ALS) decoder.
cehoyos
parents:
diff changeset
1410
9b56cd1e37b7 Add MPEG-4 Audio Lossless Coding (ALS) decoder.
cehoyos
parents:
diff changeset
1411 ctx->frame_id++;
9b56cd1e37b7 Add MPEG-4 Audio Lossless Coding (ALS) decoder.
cehoyos
parents:
diff changeset
1412
9b56cd1e37b7 Add MPEG-4 Audio Lossless Coding (ALS) decoder.
cehoyos
parents:
diff changeset
1413 // check for size of decoded data
9b56cd1e37b7 Add MPEG-4 Audio Lossless Coding (ALS) decoder.
cehoyos
parents:
diff changeset
1414 size = ctx->cur_frame_length * avctx->channels *
9b56cd1e37b7 Add MPEG-4 Audio Lossless Coding (ALS) decoder.
cehoyos
parents:
diff changeset
1415 (av_get_bits_per_sample_format(avctx->sample_fmt) >> 3);
9b56cd1e37b7 Add MPEG-4 Audio Lossless Coding (ALS) decoder.
cehoyos
parents:
diff changeset
1416
9b56cd1e37b7 Add MPEG-4 Audio Lossless Coding (ALS) decoder.
cehoyos
parents:
diff changeset
1417 if (size > *data_size) {
9b56cd1e37b7 Add MPEG-4 Audio Lossless Coding (ALS) decoder.
cehoyos
parents:
diff changeset
1418 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
1419 return -1;
9b56cd1e37b7 Add MPEG-4 Audio Lossless Coding (ALS) decoder.
cehoyos
parents:
diff changeset
1420 }
9b56cd1e37b7 Add MPEG-4 Audio Lossless Coding (ALS) decoder.
cehoyos
parents:
diff changeset
1421
9b56cd1e37b7 Add MPEG-4 Audio Lossless Coding (ALS) decoder.
cehoyos
parents:
diff changeset
1422 *data_size = size;
9b56cd1e37b7 Add MPEG-4 Audio Lossless Coding (ALS) decoder.
cehoyos
parents:
diff changeset
1423
9b56cd1e37b7 Add MPEG-4 Audio Lossless Coding (ALS) decoder.
cehoyos
parents:
diff changeset
1424 // transform decoded frame into output format
9b56cd1e37b7 Add MPEG-4 Audio Lossless Coding (ALS) decoder.
cehoyos
parents:
diff changeset
1425 #define INTERLEAVE_OUTPUT(bps) \
9b56cd1e37b7 Add MPEG-4 Audio Lossless Coding (ALS) decoder.
cehoyos
parents:
diff changeset
1426 { \
9b56cd1e37b7 Add MPEG-4 Audio Lossless Coding (ALS) decoder.
cehoyos
parents:
diff changeset
1427 int##bps##_t *dest = (int##bps##_t*) data; \
9b56cd1e37b7 Add MPEG-4 Audio Lossless Coding (ALS) decoder.
cehoyos
parents:
diff changeset
1428 shift = bps - ctx->avctx->bits_per_raw_sample; \
9b56cd1e37b7 Add MPEG-4 Audio Lossless Coding (ALS) decoder.
cehoyos
parents:
diff changeset
1429 for (sample = 0; sample < ctx->cur_frame_length; sample++) \
9b56cd1e37b7 Add MPEG-4 Audio Lossless Coding (ALS) decoder.
cehoyos
parents:
diff changeset
1430 for (c = 0; c < avctx->channels; c++) \
9b56cd1e37b7 Add MPEG-4 Audio Lossless Coding (ALS) decoder.
cehoyos
parents:
diff changeset
1431 *dest++ = ctx->raw_samples[c][sample] << shift; \
9b56cd1e37b7 Add MPEG-4 Audio Lossless Coding (ALS) decoder.
cehoyos
parents:
diff changeset
1432 }
9b56cd1e37b7 Add MPEG-4 Audio Lossless Coding (ALS) decoder.
cehoyos
parents:
diff changeset
1433
9b56cd1e37b7 Add MPEG-4 Audio Lossless Coding (ALS) decoder.
cehoyos
parents:
diff changeset
1434 if (ctx->avctx->bits_per_raw_sample <= 16) {
9b56cd1e37b7 Add MPEG-4 Audio Lossless Coding (ALS) decoder.
cehoyos
parents:
diff changeset
1435 INTERLEAVE_OUTPUT(16)
9b56cd1e37b7 Add MPEG-4 Audio Lossless Coding (ALS) decoder.
cehoyos
parents:
diff changeset
1436 } else {
9b56cd1e37b7 Add MPEG-4 Audio Lossless Coding (ALS) decoder.
cehoyos
parents:
diff changeset
1437 INTERLEAVE_OUTPUT(32)
9b56cd1e37b7 Add MPEG-4 Audio Lossless Coding (ALS) decoder.
cehoyos
parents:
diff changeset
1438 }
9b56cd1e37b7 Add MPEG-4 Audio Lossless Coding (ALS) decoder.
cehoyos
parents:
diff changeset
1439
9b56cd1e37b7 Add MPEG-4 Audio Lossless Coding (ALS) decoder.
cehoyos
parents:
diff changeset
1440 bytes_read = invalid_frame ? buffer_size :
9b56cd1e37b7 Add MPEG-4 Audio Lossless Coding (ALS) decoder.
cehoyos
parents:
diff changeset
1441 (get_bits_count(&ctx->gb) + 7) >> 3;
9b56cd1e37b7 Add MPEG-4 Audio Lossless Coding (ALS) decoder.
cehoyos
parents:
diff changeset
1442
9b56cd1e37b7 Add MPEG-4 Audio Lossless Coding (ALS) decoder.
cehoyos
parents:
diff changeset
1443 return bytes_read;
9b56cd1e37b7 Add MPEG-4 Audio Lossless Coding (ALS) decoder.
cehoyos
parents:
diff changeset
1444 }
9b56cd1e37b7 Add MPEG-4 Audio Lossless Coding (ALS) decoder.
cehoyos
parents:
diff changeset
1445
9b56cd1e37b7 Add MPEG-4 Audio Lossless Coding (ALS) decoder.
cehoyos
parents:
diff changeset
1446
9b56cd1e37b7 Add MPEG-4 Audio Lossless Coding (ALS) decoder.
cehoyos
parents:
diff changeset
1447 /** Uninitializes the ALS decoder.
9b56cd1e37b7 Add MPEG-4 Audio Lossless Coding (ALS) decoder.
cehoyos
parents:
diff changeset
1448 */
9b56cd1e37b7 Add MPEG-4 Audio Lossless Coding (ALS) decoder.
cehoyos
parents:
diff changeset
1449 static av_cold int decode_end(AVCodecContext *avctx)
9b56cd1e37b7 Add MPEG-4 Audio Lossless Coding (ALS) decoder.
cehoyos
parents:
diff changeset
1450 {
9b56cd1e37b7 Add MPEG-4 Audio Lossless Coding (ALS) decoder.
cehoyos
parents:
diff changeset
1451 ALSDecContext *ctx = avctx->priv_data;
9b56cd1e37b7 Add MPEG-4 Audio Lossless Coding (ALS) decoder.
cehoyos
parents:
diff changeset
1452
9b56cd1e37b7 Add MPEG-4 Audio Lossless Coding (ALS) decoder.
cehoyos
parents:
diff changeset
1453 av_freep(&ctx->sconf.chan_pos);
9b56cd1e37b7 Add MPEG-4 Audio Lossless Coding (ALS) decoder.
cehoyos
parents:
diff changeset
1454
11148
2d2780630361 Support arithmetic decoding in ALS.
thilo.borgmann
parents: 11071
diff changeset
1455 ff_bgmc_end(&ctx->bgmc_lut, &ctx->bgmc_lut_status);
2d2780630361 Support arithmetic decoding in ALS.
thilo.borgmann
parents: 11071
diff changeset
1456
10681
997692df50c1 Read and decode block data in separate functions to prepare support for
thilo.borgmann
parents: 10535
diff changeset
1457 av_freep(&ctx->use_ltp);
997692df50c1 Read and decode block data in separate functions to prepare support for
thilo.borgmann
parents: 10535
diff changeset
1458 av_freep(&ctx->ltp_lag);
997692df50c1 Read and decode block data in separate functions to prepare support for
thilo.borgmann
parents: 10535
diff changeset
1459 av_freep(&ctx->ltp_gain);
997692df50c1 Read and decode block data in separate functions to prepare support for
thilo.borgmann
parents: 10535
diff changeset
1460 av_freep(&ctx->ltp_gain_buffer);
10522
9b56cd1e37b7 Add MPEG-4 Audio Lossless Coding (ALS) decoder.
cehoyos
parents:
diff changeset
1461 av_freep(&ctx->quant_cof);
9b56cd1e37b7 Add MPEG-4 Audio Lossless Coding (ALS) decoder.
cehoyos
parents:
diff changeset
1462 av_freep(&ctx->lpc_cof);
10802
4f614b69b4e5 Add multi-channel correlation support for ALS.
thilo.borgmann
parents: 10800
diff changeset
1463 av_freep(&ctx->quant_cof_buffer);
4f614b69b4e5 Add multi-channel correlation support for ALS.
thilo.borgmann
parents: 10800
diff changeset
1464 av_freep(&ctx->lpc_cof_buffer);
10860
c9fb5b89e47a Replace variable length array with an allocated buffer
thilo.borgmann
parents: 10823
diff changeset
1465 av_freep(&ctx->lpc_cof_reversed_buffer);
10522
9b56cd1e37b7 Add MPEG-4 Audio Lossless Coding (ALS) decoder.
cehoyos
parents:
diff changeset
1466 av_freep(&ctx->prev_raw_samples);
9b56cd1e37b7 Add MPEG-4 Audio Lossless Coding (ALS) decoder.
cehoyos
parents:
diff changeset
1467 av_freep(&ctx->raw_samples);
9b56cd1e37b7 Add MPEG-4 Audio Lossless Coding (ALS) decoder.
cehoyos
parents:
diff changeset
1468 av_freep(&ctx->raw_buffer);
10802
4f614b69b4e5 Add multi-channel correlation support for ALS.
thilo.borgmann
parents: 10800
diff changeset
1469 av_freep(&ctx->chan_data);
4f614b69b4e5 Add multi-channel correlation support for ALS.
thilo.borgmann
parents: 10800
diff changeset
1470 av_freep(&ctx->chan_data_buffer);
4f614b69b4e5 Add multi-channel correlation support for ALS.
thilo.borgmann
parents: 10800
diff changeset
1471 av_freep(&ctx->reverted_channels);
10522
9b56cd1e37b7 Add MPEG-4 Audio Lossless Coding (ALS) decoder.
cehoyos
parents:
diff changeset
1472
9b56cd1e37b7 Add MPEG-4 Audio Lossless Coding (ALS) decoder.
cehoyos
parents:
diff changeset
1473 return 0;
9b56cd1e37b7 Add MPEG-4 Audio Lossless Coding (ALS) decoder.
cehoyos
parents:
diff changeset
1474 }
9b56cd1e37b7 Add MPEG-4 Audio Lossless Coding (ALS) decoder.
cehoyos
parents:
diff changeset
1475
9b56cd1e37b7 Add MPEG-4 Audio Lossless Coding (ALS) decoder.
cehoyos
parents:
diff changeset
1476
9b56cd1e37b7 Add MPEG-4 Audio Lossless Coding (ALS) decoder.
cehoyos
parents:
diff changeset
1477 /** Initializes the ALS decoder.
9b56cd1e37b7 Add MPEG-4 Audio Lossless Coding (ALS) decoder.
cehoyos
parents:
diff changeset
1478 */
9b56cd1e37b7 Add MPEG-4 Audio Lossless Coding (ALS) decoder.
cehoyos
parents:
diff changeset
1479 static av_cold int decode_init(AVCodecContext *avctx)
9b56cd1e37b7 Add MPEG-4 Audio Lossless Coding (ALS) decoder.
cehoyos
parents:
diff changeset
1480 {
9b56cd1e37b7 Add MPEG-4 Audio Lossless Coding (ALS) decoder.
cehoyos
parents:
diff changeset
1481 unsigned int c;
9b56cd1e37b7 Add MPEG-4 Audio Lossless Coding (ALS) decoder.
cehoyos
parents:
diff changeset
1482 unsigned int channel_size;
10681
997692df50c1 Read and decode block data in separate functions to prepare support for
thilo.borgmann
parents: 10535
diff changeset
1483 int num_buffers;
10522
9b56cd1e37b7 Add MPEG-4 Audio Lossless Coding (ALS) decoder.
cehoyos
parents:
diff changeset
1484 ALSDecContext *ctx = avctx->priv_data;
9b56cd1e37b7 Add MPEG-4 Audio Lossless Coding (ALS) decoder.
cehoyos
parents:
diff changeset
1485 ALSSpecificConfig *sconf = &ctx->sconf;
9b56cd1e37b7 Add MPEG-4 Audio Lossless Coding (ALS) decoder.
cehoyos
parents:
diff changeset
1486 ctx->avctx = avctx;
9b56cd1e37b7 Add MPEG-4 Audio Lossless Coding (ALS) decoder.
cehoyos
parents:
diff changeset
1487
9b56cd1e37b7 Add MPEG-4 Audio Lossless Coding (ALS) decoder.
cehoyos
parents:
diff changeset
1488 if (!avctx->extradata) {
9b56cd1e37b7 Add MPEG-4 Audio Lossless Coding (ALS) decoder.
cehoyos
parents:
diff changeset
1489 av_log(avctx, AV_LOG_ERROR, "Missing required ALS extradata.\n");
9b56cd1e37b7 Add MPEG-4 Audio Lossless Coding (ALS) decoder.
cehoyos
parents:
diff changeset
1490 return -1;
9b56cd1e37b7 Add MPEG-4 Audio Lossless Coding (ALS) decoder.
cehoyos
parents:
diff changeset
1491 }
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 if (read_specific_config(ctx)) {
9b56cd1e37b7 Add MPEG-4 Audio Lossless Coding (ALS) decoder.
cehoyos
parents:
diff changeset
1494 av_log(avctx, AV_LOG_ERROR, "Reading ALSSpecificConfig failed.\n");
9b56cd1e37b7 Add MPEG-4 Audio Lossless Coding (ALS) decoder.
cehoyos
parents:
diff changeset
1495 decode_end(avctx);
9b56cd1e37b7 Add MPEG-4 Audio Lossless Coding (ALS) decoder.
cehoyos
parents:
diff changeset
1496 return -1;
9b56cd1e37b7 Add MPEG-4 Audio Lossless Coding (ALS) decoder.
cehoyos
parents:
diff changeset
1497 }
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 if (check_specific_config(ctx)) {
9b56cd1e37b7 Add MPEG-4 Audio Lossless Coding (ALS) decoder.
cehoyos
parents:
diff changeset
1500 decode_end(avctx);
9b56cd1e37b7 Add MPEG-4 Audio Lossless Coding (ALS) decoder.
cehoyos
parents:
diff changeset
1501 return -1;
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
11148
2d2780630361 Support arithmetic decoding in ALS.
thilo.borgmann
parents: 11071
diff changeset
1504 if (sconf->bgmc)
2d2780630361 Support arithmetic decoding in ALS.
thilo.borgmann
parents: 11071
diff changeset
1505 ff_bgmc_init(avctx, &ctx->bgmc_lut, &ctx->bgmc_lut_status);
2d2780630361 Support arithmetic decoding in ALS.
thilo.borgmann
parents: 11071
diff changeset
1506
10522
9b56cd1e37b7 Add MPEG-4 Audio Lossless Coding (ALS) decoder.
cehoyos
parents:
diff changeset
1507 if (sconf->floating) {
9b56cd1e37b7 Add MPEG-4 Audio Lossless Coding (ALS) decoder.
cehoyos
parents:
diff changeset
1508 avctx->sample_fmt = SAMPLE_FMT_FLT;
9b56cd1e37b7 Add MPEG-4 Audio Lossless Coding (ALS) decoder.
cehoyos
parents:
diff changeset
1509 avctx->bits_per_raw_sample = 32;
9b56cd1e37b7 Add MPEG-4 Audio Lossless Coding (ALS) decoder.
cehoyos
parents:
diff changeset
1510 } else {
9b56cd1e37b7 Add MPEG-4 Audio Lossless Coding (ALS) decoder.
cehoyos
parents:
diff changeset
1511 avctx->sample_fmt = sconf->resolution > 1
9b56cd1e37b7 Add MPEG-4 Audio Lossless Coding (ALS) decoder.
cehoyos
parents:
diff changeset
1512 ? SAMPLE_FMT_S32 : SAMPLE_FMT_S16;
9b56cd1e37b7 Add MPEG-4 Audio Lossless Coding (ALS) decoder.
cehoyos
parents:
diff changeset
1513 avctx->bits_per_raw_sample = (sconf->resolution + 1) * 8;
9b56cd1e37b7 Add MPEG-4 Audio Lossless Coding (ALS) decoder.
cehoyos
parents:
diff changeset
1514 }
9b56cd1e37b7 Add MPEG-4 Audio Lossless Coding (ALS) decoder.
cehoyos
parents:
diff changeset
1515
11189
638415aafbda Limit the Rice parameter used for progressive decoding in ALS.
thilo.borgmann
parents: 11157
diff changeset
1516 // set maximum Rice parameter for progressive decoding based on resolution
638415aafbda Limit the Rice parameter used for progressive decoding in ALS.
thilo.borgmann
parents: 11157
diff changeset
1517 // This is not specified in 14496-3 but actually done by the reference
638415aafbda Limit the Rice parameter used for progressive decoding in ALS.
thilo.borgmann
parents: 11157
diff changeset
1518 // codec RM22 revision 2.
638415aafbda Limit the Rice parameter used for progressive decoding in ALS.
thilo.borgmann
parents: 11157
diff changeset
1519 ctx->s_max = sconf->resolution > 1 ? 31 : 15;
638415aafbda Limit the Rice parameter used for progressive decoding in ALS.
thilo.borgmann
parents: 11157
diff changeset
1520
10530
d428e57f14c6 Add long-term prediction to the ALS decoder.
thilo.borgmann
parents: 10524
diff changeset
1521 // set lag value for long-term prediction
d428e57f14c6 Add long-term prediction to the ALS decoder.
thilo.borgmann
parents: 10524
diff changeset
1522 ctx->ltp_lag_length = 8 + (avctx->sample_rate >= 96000) +
d428e57f14c6 Add long-term prediction to the ALS decoder.
thilo.borgmann
parents: 10524
diff changeset
1523 (avctx->sample_rate >= 192000);
d428e57f14c6 Add long-term prediction to the ALS decoder.
thilo.borgmann
parents: 10524
diff changeset
1524
10681
997692df50c1 Read and decode block data in separate functions to prepare support for
thilo.borgmann
parents: 10535
diff changeset
1525 // allocate quantized parcor coefficient buffer
997692df50c1 Read and decode block data in separate functions to prepare support for
thilo.borgmann
parents: 10535
diff changeset
1526 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
1527
10802
4f614b69b4e5 Add multi-channel correlation support for ALS.
thilo.borgmann
parents: 10800
diff changeset
1528 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
1529 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
1530 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
1531 num_buffers * sconf->max_order);
4f614b69b4e5 Add multi-channel correlation support for ALS.
thilo.borgmann
parents: 10800
diff changeset
1532 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
1533 num_buffers * sconf->max_order);
10860
c9fb5b89e47a Replace variable length array with an allocated buffer
thilo.borgmann
parents: 10823
diff changeset
1534 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
1535 sconf->max_order);
10802
4f614b69b4e5 Add multi-channel correlation support for ALS.
thilo.borgmann
parents: 10800
diff changeset
1536
10861
61bf5a551856 Reindent after last commit.
thilo.borgmann
parents: 10860
diff changeset
1537 if (!ctx->quant_cof || !ctx->lpc_cof ||
61bf5a551856 Reindent after last commit.
thilo.borgmann
parents: 10860
diff changeset
1538 !ctx->quant_cof_buffer || !ctx->lpc_cof_buffer ||
10860
c9fb5b89e47a Replace variable length array with an allocated buffer
thilo.borgmann
parents: 10823
diff changeset
1539 !ctx->lpc_cof_reversed_buffer) {
10802
4f614b69b4e5 Add multi-channel correlation support for ALS.
thilo.borgmann
parents: 10800
diff changeset
1540 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
1541 return AVERROR(ENOMEM);
4f614b69b4e5 Add multi-channel correlation support for ALS.
thilo.borgmann
parents: 10800
diff changeset
1542 }
4f614b69b4e5 Add multi-channel correlation support for ALS.
thilo.borgmann
parents: 10800
diff changeset
1543
4f614b69b4e5 Add multi-channel correlation support for ALS.
thilo.borgmann
parents: 10800
diff changeset
1544 // assign quantized parcor coefficient buffers
4f614b69b4e5 Add multi-channel correlation support for ALS.
thilo.borgmann
parents: 10800
diff changeset
1545 for (c = 0; c < num_buffers; c++) {
4f614b69b4e5 Add multi-channel correlation support for ALS.
thilo.borgmann
parents: 10800
diff changeset
1546 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
1547 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
1548 }
4f614b69b4e5 Add multi-channel correlation support for ALS.
thilo.borgmann
parents: 10800
diff changeset
1549
10681
997692df50c1 Read and decode block data in separate functions to prepare support for
thilo.borgmann
parents: 10535
diff changeset
1550 // 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
1551 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
1552 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
1553 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
1554 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
1555 num_buffers * 5);
997692df50c1 Read and decode block data in separate functions to prepare support for
thilo.borgmann
parents: 10535
diff changeset
1556
997692df50c1 Read and decode block data in separate functions to prepare support for
thilo.borgmann
parents: 10535
diff changeset
1557 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
1558 !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
1559 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
1560 decode_end(avctx);
997692df50c1 Read and decode block data in separate functions to prepare support for
thilo.borgmann
parents: 10535
diff changeset
1561 return AVERROR(ENOMEM);
997692df50c1 Read and decode block data in separate functions to prepare support for
thilo.borgmann
parents: 10535
diff changeset
1562 }
997692df50c1 Read and decode block data in separate functions to prepare support for
thilo.borgmann
parents: 10535
diff changeset
1563
997692df50c1 Read and decode block data in separate functions to prepare support for
thilo.borgmann
parents: 10535
diff changeset
1564 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
1565 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
1566
10802
4f614b69b4e5 Add multi-channel correlation support for ALS.
thilo.borgmann
parents: 10800
diff changeset
1567 // allocate and assign channel data buffer for mcc mode
4f614b69b4e5 Add multi-channel correlation support for ALS.
thilo.borgmann
parents: 10800
diff changeset
1568 if (sconf->mc_coding) {
4f614b69b4e5 Add multi-channel correlation support for ALS.
thilo.borgmann
parents: 10800
diff changeset
1569 ctx->chan_data_buffer = av_malloc(sizeof(*ctx->chan_data_buffer) *
11198
00854e4457f2 Fix wrong buffer allocation for MCC in ALS.
thilo.borgmann
parents: 11189
diff changeset
1570 num_buffers * num_buffers);
11199
f1b38a8588b2 Fix sizeof()-statement to use the actual pointer type.
thilo.borgmann
parents: 11198
diff changeset
1571 ctx->chan_data = av_malloc(sizeof(*ctx->chan_data) *
10802
4f614b69b4e5 Add multi-channel correlation support for ALS.
thilo.borgmann
parents: 10800
diff changeset
1572 num_buffers);
4f614b69b4e5 Add multi-channel correlation support for ALS.
thilo.borgmann
parents: 10800
diff changeset
1573 ctx->reverted_channels = av_malloc(sizeof(*ctx->reverted_channels) *
4f614b69b4e5 Add multi-channel correlation support for ALS.
thilo.borgmann
parents: 10800
diff changeset
1574 num_buffers);
4f614b69b4e5 Add multi-channel correlation support for ALS.
thilo.borgmann
parents: 10800
diff changeset
1575
4f614b69b4e5 Add multi-channel correlation support for ALS.
thilo.borgmann
parents: 10800
diff changeset
1576 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
1577 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
1578 decode_end(avctx);
4f614b69b4e5 Add multi-channel correlation support for ALS.
thilo.borgmann
parents: 10800
diff changeset
1579 return AVERROR(ENOMEM);
4f614b69b4e5 Add multi-channel correlation support for ALS.
thilo.borgmann
parents: 10800
diff changeset
1580 }
4f614b69b4e5 Add multi-channel correlation support for ALS.
thilo.borgmann
parents: 10800
diff changeset
1581
4f614b69b4e5 Add multi-channel correlation support for ALS.
thilo.borgmann
parents: 10800
diff changeset
1582 for (c = 0; c < num_buffers; c++)
11198
00854e4457f2 Fix wrong buffer allocation for MCC in ALS.
thilo.borgmann
parents: 11189
diff changeset
1583 ctx->chan_data[c] = ctx->chan_data_buffer + c * num_buffers;
10802
4f614b69b4e5 Add multi-channel correlation support for ALS.
thilo.borgmann
parents: 10800
diff changeset
1584 } else {
4f614b69b4e5 Add multi-channel correlation support for ALS.
thilo.borgmann
parents: 10800
diff changeset
1585 ctx->chan_data = NULL;
4f614b69b4e5 Add multi-channel correlation support for ALS.
thilo.borgmann
parents: 10800
diff changeset
1586 ctx->chan_data_buffer = NULL;
4f614b69b4e5 Add multi-channel correlation support for ALS.
thilo.borgmann
parents: 10800
diff changeset
1587 ctx->reverted_channels = NULL;
4f614b69b4e5 Add multi-channel correlation support for ALS.
thilo.borgmann
parents: 10800
diff changeset
1588 }
4f614b69b4e5 Add multi-channel correlation support for ALS.
thilo.borgmann
parents: 10800
diff changeset
1589
10522
9b56cd1e37b7 Add MPEG-4 Audio Lossless Coding (ALS) decoder.
cehoyos
parents:
diff changeset
1590 avctx->frame_size = sconf->frame_length;
9b56cd1e37b7 Add MPEG-4 Audio Lossless Coding (ALS) decoder.
cehoyos
parents:
diff changeset
1591 channel_size = sconf->frame_length + sconf->max_order;
9b56cd1e37b7 Add MPEG-4 Audio Lossless Coding (ALS) decoder.
cehoyos
parents:
diff changeset
1592
9b56cd1e37b7 Add MPEG-4 Audio Lossless Coding (ALS) decoder.
cehoyos
parents:
diff changeset
1593 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
1594 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
1595 ctx->raw_samples = av_malloc (sizeof(*ctx-> raw_samples) * avctx->channels);
9b56cd1e37b7 Add MPEG-4 Audio Lossless Coding (ALS) decoder.
cehoyos
parents:
diff changeset
1596
9b56cd1e37b7 Add MPEG-4 Audio Lossless Coding (ALS) decoder.
cehoyos
parents:
diff changeset
1597 // allocate previous raw sample buffer
9b56cd1e37b7 Add MPEG-4 Audio Lossless Coding (ALS) decoder.
cehoyos
parents:
diff changeset
1598 if (!ctx->prev_raw_samples || !ctx->raw_buffer|| !ctx->raw_samples) {
9b56cd1e37b7 Add MPEG-4 Audio Lossless Coding (ALS) decoder.
cehoyos
parents:
diff changeset
1599 av_log(avctx, AV_LOG_ERROR, "Allocating buffer memory failed.\n");
9b56cd1e37b7 Add MPEG-4 Audio Lossless Coding (ALS) decoder.
cehoyos
parents:
diff changeset
1600 decode_end(avctx);
9b56cd1e37b7 Add MPEG-4 Audio Lossless Coding (ALS) decoder.
cehoyos
parents:
diff changeset
1601 return AVERROR(ENOMEM);
9b56cd1e37b7 Add MPEG-4 Audio Lossless Coding (ALS) decoder.
cehoyos
parents:
diff changeset
1602 }
9b56cd1e37b7 Add MPEG-4 Audio Lossless Coding (ALS) decoder.
cehoyos
parents:
diff changeset
1603
9b56cd1e37b7 Add MPEG-4 Audio Lossless Coding (ALS) decoder.
cehoyos
parents:
diff changeset
1604 // assign raw samples buffers
9b56cd1e37b7 Add MPEG-4 Audio Lossless Coding (ALS) decoder.
cehoyos
parents:
diff changeset
1605 ctx->raw_samples[0] = ctx->raw_buffer + sconf->max_order;
9b56cd1e37b7 Add MPEG-4 Audio Lossless Coding (ALS) decoder.
cehoyos
parents:
diff changeset
1606 for (c = 1; c < avctx->channels; c++)
9b56cd1e37b7 Add MPEG-4 Audio Lossless Coding (ALS) decoder.
cehoyos
parents:
diff changeset
1607 ctx->raw_samples[c] = ctx->raw_samples[c - 1] + channel_size;
9b56cd1e37b7 Add MPEG-4 Audio Lossless Coding (ALS) decoder.
cehoyos
parents:
diff changeset
1608
9b56cd1e37b7 Add MPEG-4 Audio Lossless Coding (ALS) decoder.
cehoyos
parents:
diff changeset
1609 return 0;
9b56cd1e37b7 Add MPEG-4 Audio Lossless Coding (ALS) decoder.
cehoyos
parents:
diff changeset
1610 }
9b56cd1e37b7 Add MPEG-4 Audio Lossless Coding (ALS) decoder.
cehoyos
parents:
diff changeset
1611
9b56cd1e37b7 Add MPEG-4 Audio Lossless Coding (ALS) decoder.
cehoyos
parents:
diff changeset
1612
9b56cd1e37b7 Add MPEG-4 Audio Lossless Coding (ALS) decoder.
cehoyos
parents:
diff changeset
1613 /** Flushes (resets) the frame ID after seeking.
9b56cd1e37b7 Add MPEG-4 Audio Lossless Coding (ALS) decoder.
cehoyos
parents:
diff changeset
1614 */
9b56cd1e37b7 Add MPEG-4 Audio Lossless Coding (ALS) decoder.
cehoyos
parents:
diff changeset
1615 static av_cold void flush(AVCodecContext *avctx)
9b56cd1e37b7 Add MPEG-4 Audio Lossless Coding (ALS) decoder.
cehoyos
parents:
diff changeset
1616 {
9b56cd1e37b7 Add MPEG-4 Audio Lossless Coding (ALS) decoder.
cehoyos
parents:
diff changeset
1617 ALSDecContext *ctx = avctx->priv_data;
9b56cd1e37b7 Add MPEG-4 Audio Lossless Coding (ALS) decoder.
cehoyos
parents:
diff changeset
1618
9b56cd1e37b7 Add MPEG-4 Audio Lossless Coding (ALS) decoder.
cehoyos
parents:
diff changeset
1619 ctx->frame_id = 0;
9b56cd1e37b7 Add MPEG-4 Audio Lossless Coding (ALS) decoder.
cehoyos
parents:
diff changeset
1620 }
9b56cd1e37b7 Add MPEG-4 Audio Lossless Coding (ALS) decoder.
cehoyos
parents:
diff changeset
1621
9b56cd1e37b7 Add MPEG-4 Audio Lossless Coding (ALS) decoder.
cehoyos
parents:
diff changeset
1622
9b56cd1e37b7 Add MPEG-4 Audio Lossless Coding (ALS) decoder.
cehoyos
parents:
diff changeset
1623 AVCodec als_decoder = {
9b56cd1e37b7 Add MPEG-4 Audio Lossless Coding (ALS) decoder.
cehoyos
parents:
diff changeset
1624 "als",
11560
8a4984c5cacc Define AVMediaType enum, and use it instead of enum CodecType, which
stefano
parents: 11372
diff changeset
1625 AVMEDIA_TYPE_AUDIO,
10522
9b56cd1e37b7 Add MPEG-4 Audio Lossless Coding (ALS) decoder.
cehoyos
parents:
diff changeset
1626 CODEC_ID_MP4ALS,
9b56cd1e37b7 Add MPEG-4 Audio Lossless Coding (ALS) decoder.
cehoyos
parents:
diff changeset
1627 sizeof(ALSDecContext),
9b56cd1e37b7 Add MPEG-4 Audio Lossless Coding (ALS) decoder.
cehoyos
parents:
diff changeset
1628 decode_init,
9b56cd1e37b7 Add MPEG-4 Audio Lossless Coding (ALS) decoder.
cehoyos
parents:
diff changeset
1629 NULL,
9b56cd1e37b7 Add MPEG-4 Audio Lossless Coding (ALS) decoder.
cehoyos
parents:
diff changeset
1630 decode_end,
9b56cd1e37b7 Add MPEG-4 Audio Lossless Coding (ALS) decoder.
cehoyos
parents:
diff changeset
1631 decode_frame,
9b56cd1e37b7 Add MPEG-4 Audio Lossless Coding (ALS) decoder.
cehoyos
parents:
diff changeset
1632 .flush = flush,
9b56cd1e37b7 Add MPEG-4 Audio Lossless Coding (ALS) decoder.
cehoyos
parents:
diff changeset
1633 .capabilities = CODEC_CAP_SUBFRAMES,
9b56cd1e37b7 Add MPEG-4 Audio Lossless Coding (ALS) decoder.
cehoyos
parents:
diff changeset
1634 .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
1635 };
9b56cd1e37b7 Add MPEG-4 Audio Lossless Coding (ALS) decoder.
cehoyos
parents:
diff changeset
1636