/* * Copyright (c) Hisilicon Technologies Co., Ltd. 2012-2019. All rights reserved. * Description: IEC61937 data parser function * Author: audio * Create: 2012-05-30 */ #ifndef __IEC61937_PARSER_H__ #define __IEC61937_PARSER_H__ #include "drv_audio_ext.h" #ifdef __cplusplus extern "C" { #endif /* __cpluscplus */ typedef td_void *ext_parser_handle; /* the repetition period between 2 data-burst of AC3, also indicate the out buffer length */ #define BITS_BURSTLENGTH_AC3 (1536 * 4) #define BITS_BURSTLENGTH_EAC3 (1536 * 4 * 4) /* the repetition period between 2 data-burst of MAT, also indicate the out buffer length */ #define BITS_BURSTLENGTH_TUREHD 61440 #define BITS_BURSTLENGTH_MAT 61440 /* the repetition period between 2 data-burst of DTS, also indicate the out buffer length */ #define BITS_BURSTLENGTH_DTS_TYPE_I (512 * 4) #define BITS_BURSTLENGTH_DTS_TYPE_II (1024 * 4) #define BITS_BURSTLENGTH_DTS_TYPE_III (2048 * 4) #define BITS_BURSTLENGTH_DTSCD (1024 * 4) #define BITS_BURSTLENGTH_DTSHD 32768 /* the length of burst-preamble */ #define LENGTH_OF_PREAMBLE 8 #define LENGTH_OF_PA_AND_PB 4 #define DTSHD_HEADER_SIZE 12 #define IEC61937_SYNCWORD_LE 0xF8724E1F #define IEC61937_SYNCWORD_BE 0x72F81F4E /* * DCA syncwords, also used for bitstream type detection */ #define DCA_MARKER_RAW_BE 0x7FFE8001 #define DCA_MARKER_RAW_LE 0xFE7F0180 #define DCA_MARKER_14B_BE 0x1FFFE800 #define DCA_MARKER_14B_LE 0xFF1F00E8 #define IEC61937_PARSER_LENGTH_MIN 6 /* sizeof(pa + pb + pc) */ #define IEC61937_PARSER_LENGTH_MAX (BITS_BURSTLENGTH_MAT + IEC61937_PARSER_LENGTH_MIN) /* the data type code, see IEC61917-2 */ #define IEC61937_DATATYPE_NULL 0 /* null data */ #define IEC61937_DATATYPE_AC3 1 /* AC-3 data */ #define IEC61937_DATATYPE_PAUSE 3 /* pause */ #define IEC61937_DATATYPE_DTS_TYPE_I 11 /* DTS type 1 */ #define IEC61937_DATATYPE_DTS_TYPE_II 12 /* DTS type 2 */ #define IEC61937_DATATYPE_DTS_TYPE_III 13 /* DTS type 3 */ #define IEC61937_DATATYPE_DTS_TYPE_IV 17 /* DTS type 4 */ #define IEC61937_DATATYPE_EAC3 21 /* enhanced AC-3 */ #define IEC61937_DATATYPE_MAT 22 /* MAT(true HD) */ #define IEC61937_DATATYPE_DTSCD 0xff /* DTS CD */ typedef enum { IEC61937_PARSER_STREAM_PCM = EXT_AUDIO_FORMAT_PCM, IEC61937_PARSER_STREAM_DD = EXT_AUDIO_FORMAT_AC3, IEC61937_PARSER_STREAM_DDP = EXT_AUDIO_FORMAT_EAC3, IEC61937_PARSER_STREAM_DTS = EXT_AUDIO_FORMAT_DTS, IEC61937_PARSER_STREAM_DTSHD = EXT_AUDIO_FORMAT_DTS_HD, IEC61937_PARSER_STREAM_MAT = EXT_AUDIO_FORMAT_MAT, IEC61937_PARSER_STREAM_UNKNOWN = EXT_AUDIO_FORMAT_STREAM, IEC61937_PARSER_STREAM_TYPE_MAX = EXT_AUDIO_FORMAT_CXT, } iec61937_parser_stream_type; typedef struct { td_u8 *data; td_u32 size; } iec61937_parser_stream_buf; typedef struct { td_u8 *buffer; td_u32 alloc_len; td_u32 free_len; td_u32 filled_len; td_u32 burst_len; td_u32 total_discard_len; td_bool frame_is_ready; td_bool big_endian; td_u32 first_empty_time; td_u32 frame_len; td_u8 *frame_buf; td_u32 channel; td_u32 bit_depth; iec61937_parser_stream_type stream_type; } iec61937_parser_state; td_s32 iec61937_parser_create(ext_parser_handle *parser); td_void iec61937_parser_destroy(ext_parser_handle parser); td_s32 iec61937_parser_get_buf(ext_parser_handle parser, td_u32 request_size, iec61937_parser_stream_buf *stream); td_s32 iec61937_parser_put_buf(ext_parser_handle parser, iec61937_parser_stream_buf *stream); td_s32 iec61937_parser_acquire_frame(ext_parser_handle parser, td_void *dst_buf, td_u32 *frame_len); td_s32 iec61937_parser_release_frame(ext_parser_handle parser, td_u32 frame_len); td_s32 iec61937_parser_get_stream_type(ext_parser_handle parser, iec61937_parser_stream_type *stream_type); td_s32 iec61937_parser_get_burst_len(ext_parser_handle parser, td_u32 *burst_len); td_bool iec61937_check_is_empty(ext_parser_handle parser); #ifdef __cplusplus } #endif /* __cpluscplus */ #endif /* __IEC61937_PARSER_H__ */