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.c | |
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.c')
-rw-r--r-- | libavcodec/dca.c | 60 |
1 files changed, 60 insertions, 0 deletions
diff --git a/libavcodec/dca.c b/libavcodec/dca.c index fb796191d6..39f8f3d81c 100644 --- a/libavcodec/dca.c +++ b/libavcodec/dca.c @@ -28,7 +28,9 @@ #include "libavutil/error.h" #include "dca.h" +#include "dca_core.h" #include "dca_syncwords.h" +#include "get_bits.h" #include "put_bits.h" const uint32_t avpriv_dca_sample_rates[16] = { @@ -85,3 +87,61 @@ int avpriv_dca_convert_bitstream(const uint8_t *src, int src_size, uint8_t *dst, return AVERROR_INVALIDDATA; } } + +int avpriv_dca_parse_core_frame_header(GetBitContext *gb, DCACoreFrameHeader *h) +{ + if (get_bits_long(gb, 32) != DCA_SYNCWORD_CORE_BE) + return DCA_PARSE_ERROR_SYNC_WORD; + + h->normal_frame = get_bits1(gb); + h->deficit_samples = get_bits(gb, 5) + 1; + if (h->deficit_samples != DCA_PCMBLOCK_SAMPLES) + return DCA_PARSE_ERROR_DEFICIT_SAMPLES; + + h->crc_present = get_bits1(gb); + h->npcmblocks = get_bits(gb, 7) + 1; + if (h->npcmblocks & (DCA_SUBBAND_SAMPLES - 1)) + return DCA_PARSE_ERROR_PCM_BLOCKS; + + h->frame_size = get_bits(gb, 14) + 1; + if (h->frame_size < 96) + return DCA_PARSE_ERROR_FRAME_SIZE; + + h->audio_mode = get_bits(gb, 6); + if (h->audio_mode >= DCA_AMODE_COUNT) + return DCA_PARSE_ERROR_AMODE; + + h->sr_code = get_bits(gb, 4); + if (!avpriv_dca_sample_rates[h->sr_code]) + return DCA_PARSE_ERROR_SAMPLE_RATE; + + h->br_code = get_bits(gb, 5); + if (get_bits1(gb)) + return DCA_PARSE_ERROR_RESERVED_BIT; + + h->drc_present = get_bits1(gb); + h->ts_present = get_bits1(gb); + h->aux_present = get_bits1(gb); + h->hdcd_master = get_bits1(gb); + h->ext_audio_type = get_bits(gb, 3); + h->ext_audio_present = get_bits1(gb); + h->sync_ssf = get_bits1(gb); + h->lfe_present = get_bits(gb, 2); + if (h->lfe_present == DCA_LFE_FLAG_INVALID) + return DCA_PARSE_ERROR_LFE_FLAG; + + h->predictor_history = get_bits1(gb); + if (h->crc_present) + skip_bits(gb, 16); + h->filter_perfect = get_bits1(gb); + h->encoder_rev = get_bits(gb, 4); + h->copy_hist = get_bits(gb, 2); + h->pcmr_code = get_bits(gb, 3); + if (!ff_dca_bits_per_sample[h->pcmr_code]) + return DCA_PARSE_ERROR_PCM_RES; + + h->sumdiff_front = get_bits1(gb); + h->sumdiff_surround = get_bits1(gb); + h->dn_code = get_bits(gb, 4); + return 0; +} |