Line | Branch | Exec | Source |
---|---|---|---|
1 | /* | ||
2 | * DCA compatible decoder data | ||
3 | * Copyright (C) 2004 Gildas Bazin | ||
4 | * Copyright (C) 2004 Benjamin Zores | ||
5 | * Copyright (C) 2006 Benjamin Larsson | ||
6 | * Copyright (C) 2007 Konstantin Shishkov | ||
7 | * | ||
8 | * This file is part of FFmpeg. | ||
9 | * | ||
10 | * FFmpeg is free software; you can redistribute it and/or | ||
11 | * modify it under the terms of the GNU Lesser General Public | ||
12 | * License as published by the Free Software Foundation; either | ||
13 | * version 2.1 of the License, or (at your option) any later version. | ||
14 | * | ||
15 | * FFmpeg is distributed in the hope that it will be useful, | ||
16 | * but WITHOUT ANY WARRANTY; without even the implied warranty of | ||
17 | * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU | ||
18 | * Lesser General Public License for more details. | ||
19 | * | ||
20 | * You should have received a copy of the GNU Lesser General Public | ||
21 | * License along with FFmpeg; if not, write to the Free Software | ||
22 | * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA | ||
23 | */ | ||
24 | |||
25 | #include <stdint.h> | ||
26 | #include <string.h> | ||
27 | |||
28 | #include "libavutil/error.h" | ||
29 | |||
30 | #include "dca.h" | ||
31 | #include "dca_core.h" | ||
32 | #include "dca_syncwords.h" | ||
33 | #include "get_bits.h" | ||
34 | #include "put_bits.h" | ||
35 | |||
36 | const uint32_t ff_dca_sampling_freqs[16] = { | ||
37 | 8000, 16000, 32000, 64000, 128000, 22050, 44100, 88200, | ||
38 | 176400, 352800, 12000, 24000, 48000, 96000, 192000, 384000, | ||
39 | }; | ||
40 | |||
41 | const uint8_t ff_dca_freq_ranges[16] = { | ||
42 | 0, 1, 2, 3, 4, 1, 2, 3, 4, 4, 0, 1, 2, 3, 4, 4 | ||
43 | }; | ||
44 | |||
45 | const uint8_t ff_dca_bits_per_sample[8] = { | ||
46 | 16, 16, 20, 20, 0, 24, 24, 0 | ||
47 | }; | ||
48 | |||
49 | 8066 | int avpriv_dca_convert_bitstream(const uint8_t *src, int src_size, uint8_t *dst, | |
50 | int max_size) | ||
51 | { | ||
52 | uint32_t mrk; | ||
53 | int i, tmp; | ||
54 | PutBitContext pb; | ||
55 | |||
56 |
1/2✗ Branch 0 not taken.
✓ Branch 1 taken 8066 times.
|
8066 | if ((unsigned) src_size > (unsigned) max_size) |
57 | ✗ | src_size = max_size; | |
58 | |||
59 | 8066 | mrk = AV_RB32(src); | |
60 |
2/4✓ Branch 0 taken 8062 times.
✓ Branch 1 taken 4 times.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
|
8066 | switch (mrk) { |
61 | 8062 | case DCA_SYNCWORD_CORE_BE: | |
62 | case DCA_SYNCWORD_SUBSTREAM: | ||
63 | 8062 | memcpy(dst, src, src_size); | |
64 | 8062 | return src_size; | |
65 | 4 | case DCA_SYNCWORD_CORE_LE: | |
66 |
2/2✓ Branch 0 taken 36 times.
✓ Branch 1 taken 4 times.
|
40 | for (i = 0; i < (src_size + 1) >> 1; i++) { |
67 | 36 | AV_WB16(dst, AV_RL16(src)); | |
68 | 36 | src += 2; | |
69 | 36 | dst += 2; | |
70 | } | ||
71 | 4 | return src_size; | |
72 | ✗ | case DCA_SYNCWORD_CORE_14B_BE: | |
73 | case DCA_SYNCWORD_CORE_14B_LE: | ||
74 | ✗ | init_put_bits(&pb, dst, max_size); | |
75 | ✗ | for (i = 0; i < (src_size + 1) >> 1; i++, src += 2) { | |
76 | ✗ | tmp = ((mrk == DCA_SYNCWORD_CORE_14B_BE) ? AV_RB16(src) : AV_RL16(src)) & 0x3FFF; | |
77 | ✗ | put_bits(&pb, 14, tmp); | |
78 | } | ||
79 | ✗ | flush_put_bits(&pb); | |
80 | ✗ | return put_bytes_output(&pb); | |
81 | ✗ | default: | |
82 | ✗ | return AVERROR_INVALIDDATA; | |
83 | } | ||
84 | } | ||
85 | |||
86 | 10537 | int ff_dca_parse_core_frame_header(DCACoreFrameHeader *h, GetBitContext *gb) | |
87 | { | ||
88 |
1/2✗ Branch 1 not taken.
✓ Branch 2 taken 10537 times.
|
10537 | if (get_bits_long(gb, 32) != DCA_SYNCWORD_CORE_BE) |
89 | ✗ | return DCA_PARSE_ERROR_SYNC_WORD; | |
90 | |||
91 | 10537 | h->normal_frame = get_bits1(gb); | |
92 | 10537 | h->deficit_samples = get_bits(gb, 5) + 1; | |
93 |
1/2✗ Branch 0 not taken.
✓ Branch 1 taken 10537 times.
|
10537 | if (h->deficit_samples != DCA_PCMBLOCK_SAMPLES) |
94 | ✗ | return DCA_PARSE_ERROR_DEFICIT_SAMPLES; | |
95 | |||
96 | 10537 | h->crc_present = get_bits1(gb); | |
97 | 10537 | h->npcmblocks = get_bits(gb, 7) + 1; | |
98 |
1/2✗ Branch 0 not taken.
✓ Branch 1 taken 10537 times.
|
10537 | if (h->npcmblocks & (DCA_SUBBAND_SAMPLES - 1)) |
99 | ✗ | return DCA_PARSE_ERROR_PCM_BLOCKS; | |
100 | |||
101 | 10537 | h->frame_size = get_bits(gb, 14) + 1; | |
102 |
1/2✗ Branch 0 not taken.
✓ Branch 1 taken 10537 times.
|
10537 | if (h->frame_size < 96) |
103 | ✗ | return DCA_PARSE_ERROR_FRAME_SIZE; | |
104 | |||
105 | 10537 | h->audio_mode = get_bits(gb, 6); | |
106 |
1/2✗ Branch 0 not taken.
✓ Branch 1 taken 10537 times.
|
10537 | if (h->audio_mode >= DCA_AMODE_COUNT) |
107 | ✗ | return DCA_PARSE_ERROR_AMODE; | |
108 | |||
109 | 10537 | h->sr_code = get_bits(gb, 4); | |
110 |
1/2✗ Branch 0 not taken.
✓ Branch 1 taken 10537 times.
|
10537 | if (!ff_dca_sample_rates[h->sr_code]) |
111 | ✗ | return DCA_PARSE_ERROR_SAMPLE_RATE; | |
112 | |||
113 | 10537 | h->br_code = get_bits(gb, 5); | |
114 |
1/2✗ Branch 1 not taken.
✓ Branch 2 taken 10537 times.
|
10537 | if (get_bits1(gb)) |
115 | ✗ | return DCA_PARSE_ERROR_RESERVED_BIT; | |
116 | |||
117 | 10537 | h->drc_present = get_bits1(gb); | |
118 | 10537 | h->ts_present = get_bits1(gb); | |
119 | 10537 | h->aux_present = get_bits1(gb); | |
120 | 10537 | h->hdcd_master = get_bits1(gb); | |
121 | 10537 | h->ext_audio_type = get_bits(gb, 3); | |
122 | 10537 | h->ext_audio_present = get_bits1(gb); | |
123 | 10537 | h->sync_ssf = get_bits1(gb); | |
124 | 10537 | h->lfe_present = get_bits(gb, 2); | |
125 |
1/2✗ Branch 0 not taken.
✓ Branch 1 taken 10537 times.
|
10537 | if (h->lfe_present == DCA_LFE_FLAG_INVALID) |
126 | ✗ | return DCA_PARSE_ERROR_LFE_FLAG; | |
127 | |||
128 | 10537 | h->predictor_history = get_bits1(gb); | |
129 |
1/2✗ Branch 0 not taken.
✓ Branch 1 taken 10537 times.
|
10537 | if (h->crc_present) |
130 | ✗ | skip_bits(gb, 16); | |
131 | 10537 | h->filter_perfect = get_bits1(gb); | |
132 | 10537 | h->encoder_rev = get_bits(gb, 4); | |
133 | 10537 | h->copy_hist = get_bits(gb, 2); | |
134 | 10537 | h->pcmr_code = get_bits(gb, 3); | |
135 |
1/2✗ Branch 0 not taken.
✓ Branch 1 taken 10537 times.
|
10537 | if (!ff_dca_bits_per_sample[h->pcmr_code]) |
136 | ✗ | return DCA_PARSE_ERROR_PCM_RES; | |
137 | |||
138 | 10537 | h->sumdiff_front = get_bits1(gb); | |
139 | 10537 | h->sumdiff_surround = get_bits1(gb); | |
140 | 10537 | h->dn_code = get_bits(gb, 4); | |
141 | 10537 | return 0; | |
142 | } | ||
143 | |||
144 | 8066 | int avpriv_dca_parse_core_frame_header(DCACoreFrameHeader *h, const uint8_t *buf, int size) | |
145 | { | ||
146 | GetBitContext gb; | ||
147 | int ret; | ||
148 | |||
149 | 8066 | ret = init_get_bits8(&gb, buf, size); | |
150 |
1/2✗ Branch 0 not taken.
✓ Branch 1 taken 8066 times.
|
8066 | if (ret < 0) |
151 | ✗ | return ret; | |
152 | |||
153 |
1/2✗ Branch 1 not taken.
✓ Branch 2 taken 8066 times.
|
8066 | if (ff_dca_parse_core_frame_header(h, &gb) < 0) |
154 | ✗ | return AVERROR_INVALIDDATA; | |
155 | |||
156 | 8066 | return 0; | |
157 | } | ||
158 |