1cabdff1aSopenharmony_ci/*
2cabdff1aSopenharmony_ci * av3a parser
3cabdff1aSopenharmony_ci *
4cabdff1aSopenharmony_ci * Copyright (c) 2018 James Almer <jamrial@gmail.com>
5cabdff1aSopenharmony_ci *
6cabdff1aSopenharmony_ci * This file is part of FFmpeg.
7cabdff1aSopenharmony_ci *
8cabdff1aSopenharmony_ci * FFmpeg is free software; you can redistribute it and/or
9cabdff1aSopenharmony_ci * modify it under the terms of the GNU Lesser General Public
10cabdff1aSopenharmony_ci * License as published by the Free Software Foundation; either
11cabdff1aSopenharmony_ci * version 2.1 of the License, or (at your option) any later version.
12cabdff1aSopenharmony_ci *
13cabdff1aSopenharmony_ci * FFmpeg is distributed in the hope that it will be useful,
14cabdff1aSopenharmony_ci * but WITHOUT ANY WARRANTY; without even the implied warranty of
15cabdff1aSopenharmony_ci * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
16cabdff1aSopenharmony_ci * Lesser General Public License for more details.
17cabdff1aSopenharmony_ci *
18cabdff1aSopenharmony_ci * You should have received a copy of the GNU Lesser General Public
19cabdff1aSopenharmony_ci * License along with FFmpeg; if not, write to the Free Software
20cabdff1aSopenharmony_ci * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
21cabdff1aSopenharmony_ci */
22cabdff1aSopenharmony_ci
23cabdff1aSopenharmony_ci#include <stdio.h>
24cabdff1aSopenharmony_ci#include <stdint.h>
25cabdff1aSopenharmony_ci#include "libavutil/channel_layout.h"
26cabdff1aSopenharmony_ci#include "libavutil/samplefmt.h"
27cabdff1aSopenharmony_ci#include "libavutil/intreadwrite.h"
28cabdff1aSopenharmony_ci#include "parser.h"
29cabdff1aSopenharmony_ci#include "get_bits.h"
30cabdff1aSopenharmony_ci
31cabdff1aSopenharmony_ci/* AVS3 header */
32cabdff1aSopenharmony_ci#define AVS3_AUDIO_HEADER_SIZE 7
33cabdff1aSopenharmony_ci#define AVS3_SYNC_WORD_SIZE 2
34cabdff1aSopenharmony_ci#define MAX_NBYTES_FRAME_HEADER 9
35cabdff1aSopenharmony_ci#define AVS3_AUDIO_SYNC_WORD 0xFFF
36cabdff1aSopenharmony_ci
37cabdff1aSopenharmony_ci#define AVS3_AUDIO_FRAME_SIZE 1024
38cabdff1aSopenharmony_ci#define AVS3_SIZE_BITRATE_TABLE 16
39cabdff1aSopenharmony_ci#define AVS3_SIZE_FS_TABLE 9
40cabdff1aSopenharmony_ci
41cabdff1aSopenharmony_ci/* AVS3 Audio Format */
42cabdff1aSopenharmony_ci#define AVS3_MONO_FORMAT 0
43cabdff1aSopenharmony_ci#define AVS3_STEREO_FORMAT 1
44cabdff1aSopenharmony_ci#define AVS3_MC_FORMAT 2
45cabdff1aSopenharmony_ci#define AVS3_HOA_FORMAT 3
46cabdff1aSopenharmony_ci#define AVS3_MIX_FORMAT 4
47cabdff1aSopenharmony_ci
48cabdff1aSopenharmony_ci#define AVS3_SIZE_MC_CONFIG_TABLE 10
49cabdff1aSopenharmony_ci
50cabdff1aSopenharmony_ci#define AVS3P3_CH_LAYOUT_5POINT1 (AV_CH_LAYOUT_SURROUND | AV_CH_LOW_FREQUENCY | AV_CH_BACK_LEFT | AV_CH_BACK_RIGHT)
51cabdff1aSopenharmony_ci
52cabdff1aSopenharmony_citypedef struct AVS3AudioParseContext {
53cabdff1aSopenharmony_ci    int32_t frame_size;
54cabdff1aSopenharmony_ci    int32_t bitdepth;
55cabdff1aSopenharmony_ci    int32_t sample_rate;
56cabdff1aSopenharmony_ci    uint64_t bit_rate;
57cabdff1aSopenharmony_ci    uint16_t channels;
58cabdff1aSopenharmony_ci    uint64_t channel_layout;
59cabdff1aSopenharmony_ci} AVS3AParseContext;
60cabdff1aSopenharmony_ci
61cabdff1aSopenharmony_ci// AVS3P3 header information
62cabdff1aSopenharmony_citypedef struct {
63cabdff1aSopenharmony_ci    // header info
64cabdff1aSopenharmony_ci    uint8_t codec_id;
65cabdff1aSopenharmony_ci    uint8_t sampling_rate_index;
66cabdff1aSopenharmony_ci    int32_t sampling_rate;
67cabdff1aSopenharmony_ci
68cabdff1aSopenharmony_ci    uint16_t bitdepth;
69cabdff1aSopenharmony_ci    uint16_t channels;
70cabdff1aSopenharmony_ci    uint16_t objects;
71cabdff1aSopenharmony_ci    uint16_t hoa_order;
72cabdff1aSopenharmony_ci    uint64_t channel_layout;
73cabdff1aSopenharmony_ci    int64_t total_bitrate;
74cabdff1aSopenharmony_ci
75cabdff1aSopenharmony_ci    // configuration
76cabdff1aSopenharmony_ci    uint8_t content_type;
77cabdff1aSopenharmony_ci    uint16_t channel_num_index;
78cabdff1aSopenharmony_ci    uint16_t total_channels;
79cabdff1aSopenharmony_ci    uint8_t resolution;
80cabdff1aSopenharmony_ci    uint8_t nn_type;
81cabdff1aSopenharmony_ci    uint8_t resolution_index;
82cabdff1aSopenharmony_ci} AVS3AHeaderInfo;
83cabdff1aSopenharmony_ci
84cabdff1aSopenharmony_citypedef enum {
85cabdff1aSopenharmony_ci    CHANNEL_CONFIG_MONO = 0,
86cabdff1aSopenharmony_ci    CHANNEL_CONFIG_STEREO = 1,
87cabdff1aSopenharmony_ci    CHANNEL_CONFIG_MC_5_1,
88cabdff1aSopenharmony_ci    CHANNEL_CONFIG_MC_7_1,
89cabdff1aSopenharmony_ci    CHANNEL_CONFIG_MC_10_2,
90cabdff1aSopenharmony_ci    CHANNEL_CONFIG_MC_22_2,
91cabdff1aSopenharmony_ci    CHANNEL_CONFIG_MC_4_0,
92cabdff1aSopenharmony_ci    CHANNEL_CONFIG_MC_5_1_2,
93cabdff1aSopenharmony_ci    CHANNEL_CONFIG_MC_5_1_4,
94cabdff1aSopenharmony_ci    CHANNEL_CONFIG_MC_7_1_2,
95cabdff1aSopenharmony_ci    CHANNEL_CONFIG_MC_7_1_4,
96cabdff1aSopenharmony_ci    CHANNEL_CONFIG_HOA_ORDER1,
97cabdff1aSopenharmony_ci    CHANNEL_CONFIG_HOA_ORDER2,
98cabdff1aSopenharmony_ci    CHANNEL_CONFIG_HOA_ORDER3,
99cabdff1aSopenharmony_ci    CHANNEL_CONFIG_UNKNOWN
100cabdff1aSopenharmony_ci} AVS3AChannelConfig;
101cabdff1aSopenharmony_ci
102cabdff1aSopenharmony_ci/* Codec bitrate config struct */
103cabdff1aSopenharmony_citypedef struct CodecBitrateConfigStructure {
104cabdff1aSopenharmony_ci    AVS3AChannelConfig channelNumConfig;
105cabdff1aSopenharmony_ci    const int64_t *bitrateTable;
106cabdff1aSopenharmony_ci} CodecBitrateConfig;
107cabdff1aSopenharmony_ci
108cabdff1aSopenharmony_citypedef struct McChannelConfigStructure {
109cabdff1aSopenharmony_ci    const char mcCmdString[10];
110cabdff1aSopenharmony_ci    AVS3AChannelConfig channelNumConfig;
111cabdff1aSopenharmony_ci    const int16_t numChannels;
112cabdff1aSopenharmony_ci} McChanelConfig;
113cabdff1aSopenharmony_ci
114cabdff1aSopenharmony_cistatic const McChanelConfig mcChannelConfigTable[AVS3_SIZE_MC_CONFIG_TABLE] = {
115cabdff1aSopenharmony_ci        {"STEREO", CHANNEL_CONFIG_STEREO, 2},
116cabdff1aSopenharmony_ci        {"MC_5_1_0", CHANNEL_CONFIG_MC_5_1, 6},
117cabdff1aSopenharmony_ci        {"MC_7_1_0", CHANNEL_CONFIG_MC_7_1, 8},
118cabdff1aSopenharmony_ci        {"MC_10_2", CHANNEL_CONFIG_MC_10_2, 12},
119cabdff1aSopenharmony_ci        {"MC_22_2", CHANNEL_CONFIG_MC_22_2, 24},
120cabdff1aSopenharmony_ci        {"MC_4_0", CHANNEL_CONFIG_MC_4_0, 4},
121cabdff1aSopenharmony_ci        {"MC_5_1_2", CHANNEL_CONFIG_MC_5_1_2, 8},
122cabdff1aSopenharmony_ci        {"MC_5_1_4", CHANNEL_CONFIG_MC_5_1_4, 10},
123cabdff1aSopenharmony_ci        {"MC_7_1_2", CHANNEL_CONFIG_MC_7_1_2, 10},
124cabdff1aSopenharmony_ci        {"MC_7_1_4", CHANNEL_CONFIG_MC_7_1_4, 12}
125cabdff1aSopenharmony_ci};
126cabdff1aSopenharmony_ci
127cabdff1aSopenharmony_cistatic const int32_t avs3_samplingrate_table[AVS3_SIZE_FS_TABLE] = {
128cabdff1aSopenharmony_ci    192000, 96000, 48000, 44100, 32000, 24000, 22050, 16000, 8000
129cabdff1aSopenharmony_ci};
130cabdff1aSopenharmony_ci
131cabdff1aSopenharmony_ci// bitrate table for mono
132cabdff1aSopenharmony_cistatic const int64_t bitrateTableMono[AVS3_SIZE_BITRATE_TABLE] = {
133cabdff1aSopenharmony_ci    16000, 32000, 44000, 56000, 64000, 72000, 80000, 96000, 128000, 144000, 164000, 192000, 0, 0, 0, 0
134cabdff1aSopenharmony_ci};
135cabdff1aSopenharmony_ci
136cabdff1aSopenharmony_ci// bitrate table for stereo
137cabdff1aSopenharmony_cistatic const int64_t bitrateTableStereo[AVS3_SIZE_BITRATE_TABLE] = {
138cabdff1aSopenharmony_ci    24000, 32000, 48000, 64000, 80000, 96000, 128000, 144000, 192000, 256000, 320000, 0, 0, 0, 0, 0
139cabdff1aSopenharmony_ci};
140cabdff1aSopenharmony_ci
141cabdff1aSopenharmony_ci// bitrate table for MC 5.1
142cabdff1aSopenharmony_cistatic const int64_t bitrateTableMC5P1[AVS3_SIZE_BITRATE_TABLE] = {
143cabdff1aSopenharmony_ci    192000, 256000, 320000, 384000, 448000, 512000, 640000, 720000, 144000, 96000, 128000, 160000, 0, 0, 0, 0
144cabdff1aSopenharmony_ci};
145cabdff1aSopenharmony_ci
146cabdff1aSopenharmony_ci// bitrate table for MC 7.1
147cabdff1aSopenharmony_cistatic const int64_t bitrateTableMC7P1[AVS3_SIZE_BITRATE_TABLE] = {
148cabdff1aSopenharmony_ci    192000, 480000, 256000, 384000, 576000, 640000, 128000, 160000, 0, 0, 0, 0, 0, 0, 0, 0
149cabdff1aSopenharmony_ci};
150cabdff1aSopenharmony_ci
151cabdff1aSopenharmony_ci// bitrate table for MC 4.0
152cabdff1aSopenharmony_cistatic const int64_t bitrateTableMC4P0[AVS3_SIZE_BITRATE_TABLE] = {
153cabdff1aSopenharmony_ci    48000, 96000, 128000, 192000, 256000, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0
154cabdff1aSopenharmony_ci};
155cabdff1aSopenharmony_ci
156cabdff1aSopenharmony_ci// bitrate table for MC 5.1.2
157cabdff1aSopenharmony_cistatic const int64_t bitrateTableMC5P1P2[AVS3_SIZE_BITRATE_TABLE] = {
158cabdff1aSopenharmony_ci    152000, 320000, 480000, 576000, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0
159cabdff1aSopenharmony_ci};
160cabdff1aSopenharmony_ci
161cabdff1aSopenharmony_ci// bitrate table for MC 5.1.4
162cabdff1aSopenharmony_cistatic const int64_t bitrateTableMC5P1P4[AVS3_SIZE_BITRATE_TABLE] = {
163cabdff1aSopenharmony_ci    176000, 384000, 576000, 704000, 256000, 448000, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0
164cabdff1aSopenharmony_ci};
165cabdff1aSopenharmony_ci
166cabdff1aSopenharmony_ci// bitrate table for MC 7.1.2
167cabdff1aSopenharmony_cistatic const int64_t bitrateTableMC7P1P2[AVS3_SIZE_BITRATE_TABLE] = {
168cabdff1aSopenharmony_ci    216000, 480000, 576000, 384000, 768000, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0
169cabdff1aSopenharmony_ci};
170cabdff1aSopenharmony_ci
171cabdff1aSopenharmony_ci// bitrate table for MC 7.1.4
172cabdff1aSopenharmony_cistatic const int64_t bitrateTableMC7P1P4[AVS3_SIZE_BITRATE_TABLE] = {
173cabdff1aSopenharmony_ci    240000, 608000, 384000, 512000, 832000, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0
174cabdff1aSopenharmony_ci};
175cabdff1aSopenharmony_ci
176cabdff1aSopenharmony_cistatic const int64_t bitrateTableFoa[AVS3_SIZE_BITRATE_TABLE] = {
177cabdff1aSopenharmony_ci    48000, 96000, 128000, 192000, 256000, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0
178cabdff1aSopenharmony_ci};
179cabdff1aSopenharmony_ci
180cabdff1aSopenharmony_cistatic const int64_t bitrateTableHoa2[AVS3_SIZE_BITRATE_TABLE] = {
181cabdff1aSopenharmony_ci    192000, 256000, 320000, 384000, 480000, 512000, 640000, 0, 0, 0, 0, 0, 0, 0, 0, 0
182cabdff1aSopenharmony_ci};
183cabdff1aSopenharmony_ci
184cabdff1aSopenharmony_ci// bitrate table for HOA order 3
185cabdff1aSopenharmony_cistatic const int64_t bitrateTableHoa3[AVS3_SIZE_BITRATE_TABLE] = {
186cabdff1aSopenharmony_ci    256000, 320000, 384000, 512000, 640000, 896000, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0
187cabdff1aSopenharmony_ci};
188cabdff1aSopenharmony_ci
189cabdff1aSopenharmony_ci// Codec channel number & bitrate config table
190cabdff1aSopenharmony_ci// format: {channelConfigIdx, numChannels, bitrateTable}
191cabdff1aSopenharmony_cistatic const CodecBitrateConfig codecBitrateConfigTable[CHANNEL_CONFIG_UNKNOWN] = {
192cabdff1aSopenharmony_ci    {CHANNEL_CONFIG_MONO, bitrateTableMono},
193cabdff1aSopenharmony_ci    {CHANNEL_CONFIG_STEREO, bitrateTableStereo},
194cabdff1aSopenharmony_ci    {CHANNEL_CONFIG_MC_5_1, bitrateTableMC5P1},
195cabdff1aSopenharmony_ci    {CHANNEL_CONFIG_MC_7_1, bitrateTableMC7P1},
196cabdff1aSopenharmony_ci    {CHANNEL_CONFIG_MC_10_2, NULL},
197cabdff1aSopenharmony_ci    {CHANNEL_CONFIG_MC_22_2, NULL},
198cabdff1aSopenharmony_ci    {CHANNEL_CONFIG_MC_4_0, bitrateTableMC4P0},
199cabdff1aSopenharmony_ci    {CHANNEL_CONFIG_MC_5_1_2, bitrateTableMC5P1P2},
200cabdff1aSopenharmony_ci    {CHANNEL_CONFIG_MC_5_1_4, bitrateTableMC5P1P4},
201cabdff1aSopenharmony_ci    {CHANNEL_CONFIG_MC_7_1_2, bitrateTableMC7P1P2},
202cabdff1aSopenharmony_ci    {CHANNEL_CONFIG_MC_7_1_4, bitrateTableMC7P1P4},
203cabdff1aSopenharmony_ci    {CHANNEL_CONFIG_HOA_ORDER1, bitrateTableFoa},
204cabdff1aSopenharmony_ci    {CHANNEL_CONFIG_HOA_ORDER2, bitrateTableHoa2},
205cabdff1aSopenharmony_ci    {CHANNEL_CONFIG_HOA_ORDER3, bitrateTableHoa3}
206cabdff1aSopenharmony_ci};
207cabdff1aSopenharmony_ci
208cabdff1aSopenharmony_cistatic int read_av3a_frame_header(AVS3AHeaderInfo *hdf, const uint8_t *buf, const int32_t byte_size)
209cabdff1aSopenharmony_ci{
210cabdff1aSopenharmony_ci    GetBitContext gb;
211cabdff1aSopenharmony_ci    AVS3AChannelConfig channel_config;
212cabdff1aSopenharmony_ci
213cabdff1aSopenharmony_ci    uint8_t content_type = 0;
214cabdff1aSopenharmony_ci    uint8_t hoa_order = 0;
215cabdff1aSopenharmony_ci    uint8_t bitdepth = 0;
216cabdff1aSopenharmony_ci    uint8_t resolution = 0;
217cabdff1aSopenharmony_ci
218cabdff1aSopenharmony_ci    int16_t channels = 0;
219cabdff1aSopenharmony_ci    int16_t objects = 0;
220cabdff1aSopenharmony_ci    uint64_t channel_layout = 0;
221cabdff1aSopenharmony_ci
222cabdff1aSopenharmony_ci    int64_t bitrate_per_obj = 0;
223cabdff1aSopenharmony_ci    int64_t bitrate_bed_mc = 0;
224cabdff1aSopenharmony_ci    int64_t total_bitrate = 0;
225cabdff1aSopenharmony_ci
226cabdff1aSopenharmony_ci    uint8_t num_chan_index = 0;
227cabdff1aSopenharmony_ci    uint8_t obj_brt_idx = 0;
228cabdff1aSopenharmony_ci    uint8_t bed_brt_idx = 0;
229cabdff1aSopenharmony_ci    uint8_t brt_idx = 0;
230cabdff1aSopenharmony_ci
231cabdff1aSopenharmony_ci    // Read max header length into bs buffer
232cabdff1aSopenharmony_ci    init_get_bits8(&gb, buf, MAX_NBYTES_FRAME_HEADER);
233cabdff1aSopenharmony_ci
234cabdff1aSopenharmony_ci    // 12 bits for frame sync word
235cabdff1aSopenharmony_ci    if (get_bits(&gb, 12) != AVS3_AUDIO_SYNC_WORD) {
236cabdff1aSopenharmony_ci        return AVERROR_INVALIDDATA;
237cabdff1aSopenharmony_ci    }
238cabdff1aSopenharmony_ci
239cabdff1aSopenharmony_ci    // 4 bits for codec id
240cabdff1aSopenharmony_ci    uint8_t codec_id = get_bits(&gb, 4);
241cabdff1aSopenharmony_ci    if (codec_id != 2) {
242cabdff1aSopenharmony_ci        return AVERROR_INVALIDDATA;
243cabdff1aSopenharmony_ci    }
244cabdff1aSopenharmony_ci
245cabdff1aSopenharmony_ci    // 1 bits for anc data
246cabdff1aSopenharmony_ci    if (get_bits(&gb, 1) != 0) {
247cabdff1aSopenharmony_ci        return AVERROR_INVALIDDATA;
248cabdff1aSopenharmony_ci    }
249cabdff1aSopenharmony_ci
250cabdff1aSopenharmony_ci    // 3 bits nn type
251cabdff1aSopenharmony_ci    uint8_t nn_type = get_bits(&gb, 3);
252cabdff1aSopenharmony_ci
253cabdff1aSopenharmony_ci    // 3 bits for coding profile
254cabdff1aSopenharmony_ci    uint8_t coding_profile = get_bits(&gb, 3);
255cabdff1aSopenharmony_ci
256cabdff1aSopenharmony_ci    // 4 bits for sampling index
257cabdff1aSopenharmony_ci    uint8_t samping_rate_index = get_bits(&gb, 4);
258cabdff1aSopenharmony_ci
259cabdff1aSopenharmony_ci    // skip 8 bits for CRC first part
260cabdff1aSopenharmony_ci    skip_bits(&gb, 8);
261cabdff1aSopenharmony_ci
262cabdff1aSopenharmony_ci    if (coding_profile == 0) {
263cabdff1aSopenharmony_ci        content_type = 0;
264cabdff1aSopenharmony_ci
265cabdff1aSopenharmony_ci        // 7 bits for mono/stereo/MC
266cabdff1aSopenharmony_ci        num_chan_index = get_bits(&gb, 7);
267cabdff1aSopenharmony_ci
268cabdff1aSopenharmony_ci        channel_config = (AVS3AChannelConfig)num_chan_index;
269cabdff1aSopenharmony_ci        switch (channel_config) {
270cabdff1aSopenharmony_ci            case CHANNEL_CONFIG_MONO:
271cabdff1aSopenharmony_ci                channels = 1;
272cabdff1aSopenharmony_ci                channel_layout = AV_CH_LAYOUT_MONO;
273cabdff1aSopenharmony_ci                break;
274cabdff1aSopenharmony_ci            case CHANNEL_CONFIG_STEREO:
275cabdff1aSopenharmony_ci                channels = 2;
276cabdff1aSopenharmony_ci                channel_layout = AV_CH_LAYOUT_STEREO;
277cabdff1aSopenharmony_ci                break;
278cabdff1aSopenharmony_ci            case CHANNEL_CONFIG_MC_4_0:
279cabdff1aSopenharmony_ci                channels = 4;
280cabdff1aSopenharmony_ci                break;
281cabdff1aSopenharmony_ci            case CHANNEL_CONFIG_MC_5_1:
282cabdff1aSopenharmony_ci                channels = 6;
283cabdff1aSopenharmony_ci                channel_layout = AVS3P3_CH_LAYOUT_5POINT1;
284cabdff1aSopenharmony_ci                break;
285cabdff1aSopenharmony_ci            case CHANNEL_CONFIG_MC_7_1:
286cabdff1aSopenharmony_ci                channels = 8;
287cabdff1aSopenharmony_ci                channel_layout = AV_CH_LAYOUT_7POINT1;
288cabdff1aSopenharmony_ci                break;
289cabdff1aSopenharmony_ci            case CHANNEL_CONFIG_MC_5_1_2:
290cabdff1aSopenharmony_ci                channels = 8;
291cabdff1aSopenharmony_ci                break;
292cabdff1aSopenharmony_ci            case CHANNEL_CONFIG_MC_5_1_4:
293cabdff1aSopenharmony_ci                channels = 10;
294cabdff1aSopenharmony_ci                break;
295cabdff1aSopenharmony_ci            case CHANNEL_CONFIG_MC_7_1_2:
296cabdff1aSopenharmony_ci                channels = 10;
297cabdff1aSopenharmony_ci                break;
298cabdff1aSopenharmony_ci            case CHANNEL_CONFIG_MC_7_1_4:
299cabdff1aSopenharmony_ci                channels = 12;
300cabdff1aSopenharmony_ci                break;
301cabdff1aSopenharmony_ci            case CHANNEL_CONFIG_MC_22_2:
302cabdff1aSopenharmony_ci                channels = 24;
303cabdff1aSopenharmony_ci                channel_layout = AV_CH_LAYOUT_22POINT2;
304cabdff1aSopenharmony_ci                break;
305cabdff1aSopenharmony_ci            default:
306cabdff1aSopenharmony_ci                break;
307cabdff1aSopenharmony_ci        }
308cabdff1aSopenharmony_ci    } else if (coding_profile == 1) {
309cabdff1aSopenharmony_ci        // sound bed type, 2bits
310cabdff1aSopenharmony_ci        uint8_t soundBedType = get_bits(&gb, 2);
311cabdff1aSopenharmony_ci
312cabdff1aSopenharmony_ci        if (soundBedType == 0) {
313cabdff1aSopenharmony_ci            content_type = 1;
314cabdff1aSopenharmony_ci
315cabdff1aSopenharmony_ci            // for only objects
316cabdff1aSopenharmony_ci            // object number, 7 bits
317cabdff1aSopenharmony_ci            objects = get_bits(&gb, 7);
318cabdff1aSopenharmony_ci            objects += 1;
319cabdff1aSopenharmony_ci
320cabdff1aSopenharmony_ci            // bitrate index for each obj, 4 bits
321cabdff1aSopenharmony_ci            obj_brt_idx = get_bits(&gb, 4);
322cabdff1aSopenharmony_ci
323cabdff1aSopenharmony_ci            total_bitrate = codecBitrateConfigTable[CHANNEL_CONFIG_MONO].bitrateTable[obj_brt_idx] * objects;
324cabdff1aSopenharmony_ci        } else if (soundBedType == 1) {
325cabdff1aSopenharmony_ci            content_type = 2;
326cabdff1aSopenharmony_ci
327cabdff1aSopenharmony_ci            // for MC + objs
328cabdff1aSopenharmony_ci            // channel number index, 7 bits
329cabdff1aSopenharmony_ci            num_chan_index = get_bits(&gb, 7);
330cabdff1aSopenharmony_ci
331cabdff1aSopenharmony_ci            // bitrate index for sound bed, 4 bits
332cabdff1aSopenharmony_ci            bed_brt_idx = get_bits(&gb, 4);
333cabdff1aSopenharmony_ci
334cabdff1aSopenharmony_ci            // object number, 7 bits
335cabdff1aSopenharmony_ci            objects = get_bits(&gb, 7);
336cabdff1aSopenharmony_ci            objects += 1;
337cabdff1aSopenharmony_ci
338cabdff1aSopenharmony_ci            // bitrate index for each obj, 4 bits
339cabdff1aSopenharmony_ci            obj_brt_idx = get_bits(&gb, 4);
340cabdff1aSopenharmony_ci
341cabdff1aSopenharmony_ci            // channelNumIdx for sound bed
342cabdff1aSopenharmony_ci            channel_config = (AVS3AChannelConfig)num_chan_index;
343cabdff1aSopenharmony_ci
344cabdff1aSopenharmony_ci            // sound bed bitrate
345cabdff1aSopenharmony_ci            bitrate_bed_mc = codecBitrateConfigTable[channel_config].bitrateTable[bed_brt_idx];
346cabdff1aSopenharmony_ci
347cabdff1aSopenharmony_ci            // numChannels for sound bed
348cabdff1aSopenharmony_ci            for (int16_t i = 0; i < AVS3_SIZE_MC_CONFIG_TABLE; i++) {
349cabdff1aSopenharmony_ci                if (channel_config == mcChannelConfigTable[i].channelNumConfig) {
350cabdff1aSopenharmony_ci                    channels = mcChannelConfigTable[i].numChannels;
351cabdff1aSopenharmony_ci                }
352cabdff1aSopenharmony_ci            }
353cabdff1aSopenharmony_ci
354cabdff1aSopenharmony_ci            // bitrate per obj
355cabdff1aSopenharmony_ci            bitrate_per_obj = codecBitrateConfigTable[CHANNEL_CONFIG_MONO].bitrateTable[obj_brt_idx];
356cabdff1aSopenharmony_ci
357cabdff1aSopenharmony_ci            // add num chans and num objs to get total chans
358cabdff1aSopenharmony_ci            /* channels += objects; */
359cabdff1aSopenharmony_ci
360cabdff1aSopenharmony_ci            total_bitrate = bitrate_bed_mc + bitrate_per_obj * objects;
361cabdff1aSopenharmony_ci        }
362cabdff1aSopenharmony_ci    } else if (coding_profile == 2) {
363cabdff1aSopenharmony_ci        content_type = 3;
364cabdff1aSopenharmony_ci
365cabdff1aSopenharmony_ci        // 4 bits for HOA order
366cabdff1aSopenharmony_ci        hoa_order = get_bits(&gb, 4);
367cabdff1aSopenharmony_ci        hoa_order += 1;
368cabdff1aSopenharmony_ci
369cabdff1aSopenharmony_ci        switch (hoa_order) {
370cabdff1aSopenharmony_ci            case 1:
371cabdff1aSopenharmony_ci                channels = 4;
372cabdff1aSopenharmony_ci                channel_config = CHANNEL_CONFIG_HOA_ORDER1;
373cabdff1aSopenharmony_ci                break;
374cabdff1aSopenharmony_ci            case 2:
375cabdff1aSopenharmony_ci                channels = 9;
376cabdff1aSopenharmony_ci                channel_config = CHANNEL_CONFIG_HOA_ORDER2;
377cabdff1aSopenharmony_ci                break;
378cabdff1aSopenharmony_ci            case 3:
379cabdff1aSopenharmony_ci                channels = 16;
380cabdff1aSopenharmony_ci                channel_config = CHANNEL_CONFIG_HOA_ORDER3;
381cabdff1aSopenharmony_ci                break;
382cabdff1aSopenharmony_ci            default:
383cabdff1aSopenharmony_ci                break;
384cabdff1aSopenharmony_ci        }
385cabdff1aSopenharmony_ci    } else {
386cabdff1aSopenharmony_ci        return AVERROR_INVALIDDATA;
387cabdff1aSopenharmony_ci    }
388cabdff1aSopenharmony_ci
389cabdff1aSopenharmony_ci    // 2 bits for bit depth
390cabdff1aSopenharmony_ci    uint8_t resolution_index = get_bits(&gb, 2);
391cabdff1aSopenharmony_ci    switch (resolution_index) {
392cabdff1aSopenharmony_ci        case 0:
393cabdff1aSopenharmony_ci            bitdepth = AV_SAMPLE_FMT_U8;
394cabdff1aSopenharmony_ci            resolution = 8;
395cabdff1aSopenharmony_ci            break;
396cabdff1aSopenharmony_ci        case 1:
397cabdff1aSopenharmony_ci            bitdepth = AV_SAMPLE_FMT_S16;
398cabdff1aSopenharmony_ci            resolution = 16;
399cabdff1aSopenharmony_ci            break;
400cabdff1aSopenharmony_ci        case 2:
401cabdff1aSopenharmony_ci            resolution = 24;
402cabdff1aSopenharmony_ci            break;
403cabdff1aSopenharmony_ci        default:
404cabdff1aSopenharmony_ci            return AVERROR_INVALIDDATA;
405cabdff1aSopenharmony_ci    }
406cabdff1aSopenharmony_ci
407cabdff1aSopenharmony_ci    if (coding_profile != 1) {
408cabdff1aSopenharmony_ci        // 4 bits for bitrate index
409cabdff1aSopenharmony_ci        brt_idx = get_bits(&gb, 4);
410cabdff1aSopenharmony_ci        total_bitrate = codecBitrateConfigTable[channel_config].bitrateTable[brt_idx];
411cabdff1aSopenharmony_ci    }
412cabdff1aSopenharmony_ci
413cabdff1aSopenharmony_ci    // 8 bits for CRC second part
414cabdff1aSopenharmony_ci    skip_bits(&gb, 8);
415cabdff1aSopenharmony_ci
416cabdff1aSopenharmony_ci    /* AVS3P6 M6954-v3 */
417cabdff1aSopenharmony_ci    hdf->codec_id = codec_id;
418cabdff1aSopenharmony_ci    hdf->sampling_rate_index = samping_rate_index;
419cabdff1aSopenharmony_ci    hdf->sampling_rate = avs3_samplingrate_table[samping_rate_index];
420cabdff1aSopenharmony_ci    hdf->bitdepth = bitdepth;
421cabdff1aSopenharmony_ci
422cabdff1aSopenharmony_ci    hdf->nn_type = nn_type;
423cabdff1aSopenharmony_ci    hdf->content_type = content_type;
424cabdff1aSopenharmony_ci
425cabdff1aSopenharmony_ci    if (hdf->content_type == 0) {
426cabdff1aSopenharmony_ci        hdf->channel_num_index = num_chan_index;
427cabdff1aSopenharmony_ci        hdf->channels = channels;
428cabdff1aSopenharmony_ci        hdf->objects = 0;
429cabdff1aSopenharmony_ci        hdf->total_channels = channels;
430cabdff1aSopenharmony_ci        hdf->channel_layout = channel_layout;
431cabdff1aSopenharmony_ci    } else if (hdf->content_type == 1) {
432cabdff1aSopenharmony_ci        hdf->objects = objects;
433cabdff1aSopenharmony_ci        hdf->channels = 0;
434cabdff1aSopenharmony_ci        hdf->total_channels = objects;
435cabdff1aSopenharmony_ci    } else if (hdf->content_type == 2) {
436cabdff1aSopenharmony_ci        hdf->channel_num_index = num_chan_index;
437cabdff1aSopenharmony_ci        hdf->channels = channels;
438cabdff1aSopenharmony_ci        hdf->objects = objects;
439cabdff1aSopenharmony_ci        hdf->total_channels = channels + objects;
440cabdff1aSopenharmony_ci        hdf->channel_layout = channel_layout;
441cabdff1aSopenharmony_ci    } else if (hdf->content_type == 3) {
442cabdff1aSopenharmony_ci        hdf->hoa_order = hoa_order;
443cabdff1aSopenharmony_ci        hdf->channels = channels;
444cabdff1aSopenharmony_ci        hdf->total_channels = channels;
445cabdff1aSopenharmony_ci    } else {
446cabdff1aSopenharmony_ci        return AVERROR_INVALIDDATA;
447cabdff1aSopenharmony_ci    }
448cabdff1aSopenharmony_ci
449cabdff1aSopenharmony_ci    hdf->total_bitrate = total_bitrate;
450cabdff1aSopenharmony_ci    hdf->resolution = resolution;
451cabdff1aSopenharmony_ci    hdf->resolution_index = resolution_index;
452cabdff1aSopenharmony_ci
453cabdff1aSopenharmony_ci    return 0;
454cabdff1aSopenharmony_ci}
455cabdff1aSopenharmony_ci
456cabdff1aSopenharmony_cistatic int32_t raw_av3a_parse(AVCodecParserContext *s, AVCodecContext *avctx, const uint8_t **poutbuf,
457cabdff1aSopenharmony_ci                              int32_t *poutbuf_size, const uint8_t *buf, int32_t buf_size)
458cabdff1aSopenharmony_ci{
459cabdff1aSopenharmony_ci    uint8_t header[MAX_NBYTES_FRAME_HEADER];
460cabdff1aSopenharmony_ci    AVS3AHeaderInfo hdf;
461cabdff1aSopenharmony_ci
462cabdff1aSopenharmony_ci    if (buf_size < MAX_NBYTES_FRAME_HEADER) {
463cabdff1aSopenharmony_ci        return buf_size;
464cabdff1aSopenharmony_ci    }
465cabdff1aSopenharmony_ci
466cabdff1aSopenharmony_ci    memcpy(header, buf, MAX_NBYTES_FRAME_HEADER);
467cabdff1aSopenharmony_ci
468cabdff1aSopenharmony_ci    // read frame header
469cabdff1aSopenharmony_ci    int32_t ret = read_av3a_frame_header(&hdf, header, MAX_NBYTES_FRAME_HEADER);
470cabdff1aSopenharmony_ci    if (ret != 0) {
471cabdff1aSopenharmony_ci        return ret;
472cabdff1aSopenharmony_ci    }
473cabdff1aSopenharmony_ci
474cabdff1aSopenharmony_ci    avctx->sample_rate = hdf.sampling_rate;
475cabdff1aSopenharmony_ci    avctx->bit_rate = hdf.total_bitrate;
476cabdff1aSopenharmony_ci    avctx->channels = hdf.total_channels;
477cabdff1aSopenharmony_ci    avctx->channel_layout = hdf.channel_layout;
478cabdff1aSopenharmony_ci    avctx->frame_size = AVS3_AUDIO_FRAME_SIZE;
479cabdff1aSopenharmony_ci    s->format = hdf.bitdepth;
480cabdff1aSopenharmony_ci
481cabdff1aSopenharmony_ci    /* return the full packet */
482cabdff1aSopenharmony_ci    *poutbuf = buf;
483cabdff1aSopenharmony_ci    *poutbuf_size = buf_size;
484cabdff1aSopenharmony_ci
485cabdff1aSopenharmony_ci    return buf_size;
486cabdff1aSopenharmony_ci}
487cabdff1aSopenharmony_ci
488cabdff1aSopenharmony_ci#ifdef CONFIG_AV3A_PARSER
489cabdff1aSopenharmony_ciconst AVCodecParser ff_av3a_parser = {
490cabdff1aSopenharmony_ci    .codec_ids = { AV_CODEC_ID_AVS3DA },
491cabdff1aSopenharmony_ci    .priv_data_size = sizeof(AVS3AParseContext),
492cabdff1aSopenharmony_ci    .parser_parse = raw_av3a_parse,
493cabdff1aSopenharmony_ci};
494cabdff1aSopenharmony_ci#endif