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