summaryrefslogtreecommitdiff
path: root/libavcodec/dca.h
diff options
context:
space:
mode:
authorfoo86 <foobaz86@gmail.com>2017-07-10 17:11:33 +0300
committerJames Almer <jamrial@gmail.com>2017-07-18 21:04:56 -0300
commit2123ddb4251bf39bde8b38a1307a0f6154d260e6 (patch)
tree973f41839b1652fc8d212cbe4c1c1a8cabbe261c /libavcodec/dca.h
parent9e37cc11012f23e39b63032b5daac03621340a4f (diff)
downloadffmpeg-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.h49
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 */