@ -32,6 +32,49 @@
# include "libavutil/internal.h"
# include "libavutil/intreadwrite.h"
# include "get_bits.h"
# define DCA_CORE_FRAME_HEADER_SIZE 18
enum DCAParseError {
DCA_PARSE_ERROR_SYNC_WORD = - 1 ,
DCA_PARSE_ERROR_DEFICIT_SAMPLES = - 2 ,
DCA_PARSE_ERROR_PCM_BLOCKS = - 3 ,
DCA_PARSE_ERROR_FRAME_SIZE = - 4 ,
DCA_PARSE_ERROR_AMODE = - 5 ,
DCA_PARSE_ERROR_SAMPLE_RATE = - 6 ,
DCA_PARSE_ERROR_RESERVED_BIT = - 7 ,
DCA_PARSE_ERROR_LFE_FLAG = - 8 ,
DCA_PARSE_ERROR_PCM_RES = - 9
} ;
typedef struct DCACoreFrameHeader {
uint8_t normal_frame ; ///< Frame type
uint8_t deficit_samples ; ///< Deficit sample count
uint8_t crc_present ; ///< CRC present flag
uint8_t npcmblocks ; ///< Number of PCM sample blocks
uint16_t frame_size ; ///< Primary frame byte size
uint8_t audio_mode ; ///< Audio channel arrangement
uint8_t sr_code ; ///< Core audio sampling frequency
uint8_t br_code ; ///< Transmission bit rate
uint8_t drc_present ; ///< Embedded dynamic range flag
uint8_t ts_present ; ///< Embedded time stamp flag
uint8_t aux_present ; ///< Auxiliary data flag
uint8_t hdcd_master ; ///< HDCD mastering flag
uint8_t ext_audio_type ; ///< Extension audio descriptor flag
uint8_t ext_audio_present ; ///< Extended coding flag
uint8_t sync_ssf ; ///< Audio sync word insertion flag
uint8_t lfe_present ; ///< Low frequency effects flag
uint8_t predictor_history ; ///< Predictor history flag switch
uint8_t filter_perfect ; ///< Multirate interpolator switch
uint8_t encoder_rev ; ///< Encoder software revision
uint8_t copy_hist ; ///< Copy history
uint8_t pcmr_code ; ///< Source PCM resolution
uint8_t sumdiff_front ; ///< Front sum/difference flag
uint8_t sumdiff_surround ; ///< Surround sum/difference flag
uint8_t dn_code ; ///< Dialog normalization / unspecified
} DCACoreFrameHeader ;
enum DCASpeaker {
DCA_SPEAKER_C , DCA_SPEAKER_L , DCA_SPEAKER_R , DCA_SPEAKER_Ls ,
DCA_SPEAKER_Rs , DCA_SPEAKER_LFE1 , DCA_SPEAKER_Cs , DCA_SPEAKER_Lsr ,
@ -165,4 +208,10 @@ extern const uint8_t ff_dca_bits_per_sample[8];
int avpriv_dca_convert_bitstream ( const uint8_t * src , int src_size , uint8_t * dst ,
int max_size ) ;
/**
* Parse and validate core frame header
* @ return 0 on success , negative DCA_PARSE_ERROR_ code on failure
*/
int avpriv_dca_parse_core_frame_header ( GetBitContext * gb , DCACoreFrameHeader * h ) ;
# endif /* AVCODEC_DCA_H */