diff options
author | foo86 <foobaz86@gmail.com> | 2017-07-10 17:11:33 +0300 |
---|---|---|
committer | James Almer <jamrial@gmail.com> | 2017-07-18 21:04:56 -0300 |
commit | 2123ddb4251bf39bde8b38a1307a0f6154d260e6 (patch) | |
tree | 973f41839b1652fc8d212cbe4c1c1a8cabbe261c /libavcodec/dca.h | |
parent | 9e37cc11012f23e39b63032b5daac03621340a4f (diff) | |
download | ffmpeg-2123ddb4251bf39bde8b38a1307a0f6154d260e6.tar.gz |
avcodec: add avpriv_dca_parse_core_frame_header()
There are 3 different places where DCA core frame header is parsed:
decoder, parser and demuxer. Each one uses ad-hoc code. Add common core
frame header parsing function that will be used in all places.
Signed-off-by: James Almer <jamrial@gmail.com>
Diffstat (limited to 'libavcodec/dca.h')
-rw-r--r-- | libavcodec/dca.h | 49 |
1 files changed, 49 insertions, 0 deletions
diff --git a/libavcodec/dca.h b/libavcodec/dca.h index 1d10de4b94..cf6204e554 100644 --- a/libavcodec/dca.h +++ b/libavcodec/dca.h @@ -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 */ |