Files
2026-08-24 10:03:24 +08:00

125 lines
3.9 KiB
C

/*
* Audio Vivid Codec
*
* This file is part of FFmpeg.
*
* FFmpeg is free software; you can redistribute it and/or
* modify it under the terms of the GNU Lesser General Public
* License as published by the Free Software Foundation; either
* version 2.1 of the License, or (at your option) any later version.
*
* FFmpeg is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
* Lesser General Public License for more details.
*
* You should have received a copy of the GNU Lesser General Public
* License along with FFmpeg; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
*/
#include <stdint.h>
/* AVS3 header */
#define AVS3_AUDIO_HEADER_SIZE 7
#define AVS3_SYNC_WORD_SIZE 2
#define MAX_NBYTES_FRAME_HEADER 9
#define AVS3_AUDIO_SYNC_WORD 0xFFF
#define AVS3_AUDIO_FRAME_SIZE 1024
#define AVS3_SIZE_BITRATE_TABLE 16
#define AVS3_SIZE_FS_TABLE 9
/* AVS3 Audio Format */
#define AVS3_MONO_FORMAT 0
#define AVS3_STEREO_FORMAT 1
#define AVS3_MC_FORMAT 2
#define AVS3_HOA_FORMAT 3
#define AVS3_MIX_FORMAT 4
#define AVS3_SIZE_MC_CONFIG_TABLE 10
#define AVS3P3_CH_LAYOUT_5POINT1 (AV_CH_LAYOUT_SURROUND | AV_CH_LOW_FREQUENCY | AV_CH_BACK_LEFT | AV_CH_BACK_RIGHT)
/* Sampling rate index table */
extern const int avs3_samplingrate_table[AVS3_SIZE_FS_TABLE];
// AVS3P3 header information
typedef struct
{
// header info
uint8_t codec_id;
//uint8_t sampling_rate_index;
//int sampling_rate;
uint8_t sample_rate_index;
int sample_rate;
uint16_t bitdepth;
uint16_t channels;
uint16_t objects;
uint16_t hoa_order;
uint64_t channel_layout;
int64_t total_bitrate;
// configuration
uint8_t content_type;
uint16_t channel_num_index;
uint16_t total_channels;
uint8_t resolution;
uint8_t nn_type;
uint8_t resolution_index;
} AVS3AHeaderInfo;
typedef enum
{
CHANNEL_CONFIG_MONO = 0,
CHANNEL_CONFIG_STEREO = 1,
CHANNEL_CONFIG_MC_5_1,
CHANNEL_CONFIG_MC_7_1,
CHANNEL_CONFIG_MC_10_2,
CHANNEL_CONFIG_MC_22_2,
CHANNEL_CONFIG_MC_4_0,
CHANNEL_CONFIG_MC_5_1_2,
CHANNEL_CONFIG_MC_5_1_4,
CHANNEL_CONFIG_MC_7_1_2,
CHANNEL_CONFIG_MC_7_1_4,
CHANNEL_CONFIG_HOA_ORDER1,
CHANNEL_CONFIG_HOA_ORDER2,
CHANNEL_CONFIG_HOA_ORDER3,
CHANNEL_CONFIG_UNKNOWN
} AVS3AChannelConfig;
/* Codec bitrate config struct */
typedef struct CodecBitrateConfigStructure
{
AVS3AChannelConfig channelNumConfig;
const int64_t *bitrateTable;
} CodecBitrateConfig;
typedef struct McChannelConfigStructure
{
const char mcCmdString[10];
AVS3AChannelConfig channelNumConfig;
const int16_t numChannels;
} McChanelConfig;
extern const McChanelConfig mcChannelConfigTable[AVS3_SIZE_MC_CONFIG_TABLE];
/* Codec bitrate config struct */
extern const CodecBitrateConfig codecBitrateConfigTable[CHANNEL_CONFIG_UNKNOWN];
/* bitrate table for each mode */
extern const int64_t bitrateTableMono[AVS3_SIZE_BITRATE_TABLE];
extern const int64_t bitrateTableStereo[AVS3_SIZE_BITRATE_TABLE];
extern const int64_t bitrateTableMC5P1[AVS3_SIZE_BITRATE_TABLE];
extern const int64_t bitrateTableMC7P1[AVS3_SIZE_BITRATE_TABLE];
extern const int64_t bitrateTableMC4P0[AVS3_SIZE_BITRATE_TABLE];
extern const int64_t bitrateTableMC5P1P2[AVS3_SIZE_BITRATE_TABLE];
extern const int64_t bitrateTableMC5P1P4[AVS3_SIZE_BITRATE_TABLE];
extern const int64_t bitrateTableMC7P1P2[AVS3_SIZE_BITRATE_TABLE];
extern const int64_t bitrateTableMC7P1P4[AVS3_SIZE_BITRATE_TABLE];
extern const int64_t bitrateTableFoa[AVS3_SIZE_BITRATE_TABLE];
extern const int64_t bitrateTableHoa2[AVS3_SIZE_BITRATE_TABLE];
extern const int64_t bitrateTableHoa3[AVS3_SIZE_BITRATE_TABLE];
extern uint16_t read_av3a_frame_header(AVS3AHeaderInfo *hdf, const uint8_t *buf, const int byte_size);