Skip to content
Projects
Groups
Snippets
Help
Loading...
Help
Contribute to GitLab
Sign in / Register
Toggle navigation
F
ffmpeg.wasm-core
Project
Project
Details
Activity
Cycle Analytics
Repository
Repository
Files
Commits
Branches
Tags
Contributors
Graph
Compare
Charts
Issues
0
Issues
0
List
Board
Labels
Milestones
Merge Requests
0
Merge Requests
0
CI / CD
CI / CD
Pipelines
Jobs
Schedules
Charts
Wiki
Wiki
Snippets
Snippets
Members
Members
Collapse sidebar
Close sidebar
Activity
Graph
Charts
Create a new issue
Jobs
Commits
Issue Boards
Open sidebar
Linshizhi
ffmpeg.wasm-core
Commits
c2500d62
Commit
c2500d62
authored
Jan 07, 2017
by
Daniil Cherednik
Committed by
Rostislav Pehlivanov
Jan 15, 2017
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
dcaenc: Implementation of Huffman codes for DCA encoder
Reviewed-by:
Rostislav Pehlivanov
<
atomnuker@gmail.com
>
parent
a6191d09
Hide whitespace changes
Inline
Side-by-side
Showing
9 changed files
with
217 additions
and
103 deletions
+217
-103
Makefile
libavcodec/Makefile
+1
-1
dca_core.c
libavcodec/dca_core.c
+4
-12
dcadata.c
libavcodec/dcadata.c
+8
-0
dcadata.h
libavcodec/dcadata.h
+5
-0
dcaenc.c
libavcodec/dcaenc.c
+173
-88
dcaenc.h
libavcodec/dcaenc.h
+0
-1
dcahuff.c
libavcodec/dcahuff.c
+22
-0
dcahuff.h
libavcodec/dcahuff.h
+3
-0
acodec.mak
tests/fate/acodec.mak
+1
-1
No files found.
libavcodec/Makefile
View file @
c2500d62
...
@@ -235,7 +235,7 @@ OBJS-$(CONFIG_CYUV_DECODER) += cyuv.o
...
@@ -235,7 +235,7 @@ OBJS-$(CONFIG_CYUV_DECODER) += cyuv.o
OBJS-$(CONFIG_DCA_DECODER)
+=
dcadec.o
dca.o
dcadata.o
dcahuff.o
\
OBJS-$(CONFIG_DCA_DECODER)
+=
dcadec.o
dca.o
dcadata.o
dcahuff.o
\
dca_core.o
dca_exss.o
dca_xll.o
dca_lbr.o
\
dca_core.o
dca_exss.o
dca_xll.o
dca_lbr.o
\
dcadsp.o
dcadct.o
synth_filter.o
dcadsp.o
dcadct.o
synth_filter.o
OBJS-$(CONFIG_DCA_ENCODER)
+=
dcaenc.o
dca.o
dcadata.o
OBJS-$(CONFIG_DCA_ENCODER)
+=
dcaenc.o
dca.o
dcadata.o
dcahuff.o
OBJS-$(CONFIG_DDS_DECODER)
+=
dds.o
OBJS-$(CONFIG_DDS_DECODER)
+=
dds.o
OBJS-$(CONFIG_DIRAC_DECODER)
+=
diracdec.o
dirac.o
diracdsp.o
diractab.o
\
OBJS-$(CONFIG_DIRAC_DECODER)
+=
diracdec.o
dirac.o
diracdsp.o
diractab.o
\
dirac_arith.o
dirac_dwt.o
dirac_vlc.o
dirac_arith.o
dirac_dwt.o
dirac_vlc.o
...
...
libavcodec/dca_core.c
View file @
c2500d62
...
@@ -92,14 +92,6 @@ static const uint8_t block_code_nbits[7] = {
...
@@ -92,14 +92,6 @@ static const uint8_t block_code_nbits[7] = {
7
,
10
,
12
,
13
,
15
,
17
,
19
7
,
10
,
12
,
13
,
15
,
17
,
19
};
};
static
const
uint8_t
quant_index_sel_nbits
[
DCA_CODE_BOOKS
]
=
{
1
,
2
,
2
,
2
,
2
,
3
,
3
,
3
,
3
,
3
};
static
const
uint8_t
quant_index_group_size
[
DCA_CODE_BOOKS
]
=
{
1
,
3
,
3
,
3
,
3
,
7
,
7
,
7
,
7
,
7
};
static
int
dca_get_vlc
(
GetBitContext
*
s
,
DCAVLC
*
v
,
int
i
)
static
int
dca_get_vlc
(
GetBitContext
*
s
,
DCAVLC
*
v
,
int
i
)
{
{
return
get_vlc2
(
s
,
v
->
vlc
[
i
].
table
,
v
->
vlc
[
i
].
bits
,
v
->
max_depth
)
+
v
->
offset
;
return
get_vlc2
(
s
,
v
->
vlc
[
i
].
table
,
v
->
vlc
[
i
].
bits
,
v
->
max_depth
)
+
v
->
offset
;
...
@@ -400,12 +392,12 @@ static int parse_coding_header(DCACoreDecoder *s, enum HeaderType header, int xc
...
@@ -400,12 +392,12 @@ static int parse_coding_header(DCACoreDecoder *s, enum HeaderType header, int xc
// Quantization index codebook select
// Quantization index codebook select
for
(
n
=
0
;
n
<
DCA_CODE_BOOKS
;
n
++
)
for
(
n
=
0
;
n
<
DCA_CODE_BOOKS
;
n
++
)
for
(
ch
=
xch_base
;
ch
<
s
->
nchannels
;
ch
++
)
for
(
ch
=
xch_base
;
ch
<
s
->
nchannels
;
ch
++
)
s
->
quant_index_sel
[
ch
][
n
]
=
get_bits
(
&
s
->
gb
,
quant_index_sel_nbits
[
n
]);
s
->
quant_index_sel
[
ch
][
n
]
=
get_bits
(
&
s
->
gb
,
ff_dca_
quant_index_sel_nbits
[
n
]);
// Scale factor adjustment index
// Scale factor adjustment index
for
(
n
=
0
;
n
<
DCA_CODE_BOOKS
;
n
++
)
for
(
n
=
0
;
n
<
DCA_CODE_BOOKS
;
n
++
)
for
(
ch
=
xch_base
;
ch
<
s
->
nchannels
;
ch
++
)
for
(
ch
=
xch_base
;
ch
<
s
->
nchannels
;
ch
++
)
if
(
s
->
quant_index_sel
[
ch
][
n
]
<
quant_index_group_size
[
n
])
if
(
s
->
quant_index_sel
[
ch
][
n
]
<
ff_dca_
quant_index_group_size
[
n
])
s
->
scale_factor_adj
[
ch
][
n
]
=
ff_dca_scale_factor_adj
[
get_bits
(
&
s
->
gb
,
2
)];
s
->
scale_factor_adj
[
ch
][
n
]
=
ff_dca_scale_factor_adj
[
get_bits
(
&
s
->
gb
,
2
)];
if
(
header
==
HEADER_XXCH
)
{
if
(
header
==
HEADER_XXCH
)
{
...
@@ -663,7 +655,7 @@ static inline int extract_audio(DCACoreDecoder *s, int32_t *audio, int abits, in
...
@@ -663,7 +655,7 @@ static inline int extract_audio(DCACoreDecoder *s, int32_t *audio, int abits, in
if
(
abits
<=
DCA_CODE_BOOKS
)
{
if
(
abits
<=
DCA_CODE_BOOKS
)
{
int
sel
=
s
->
quant_index_sel
[
ch
][
abits
-
1
];
int
sel
=
s
->
quant_index_sel
[
ch
][
abits
-
1
];
if
(
sel
<
quant_index_group_size
[
abits
-
1
])
{
if
(
sel
<
ff_dca_
quant_index_group_size
[
abits
-
1
])
{
// Huffman codes
// Huffman codes
return
parse_huffman_codes
(
s
,
audio
,
abits
,
sel
);
return
parse_huffman_codes
(
s
,
audio
,
abits
,
sel
);
}
}
...
@@ -1562,7 +1554,7 @@ static int parse_x96_coding_header(DCACoreDecoder *s, int exss, int xch_base)
...
@@ -1562,7 +1554,7 @@ static int parse_x96_coding_header(DCACoreDecoder *s, int exss, int xch_base)
// Quantization index codebook select
// Quantization index codebook select
for
(
n
=
0
;
n
<
6
+
4
*
s
->
x96_high_res
;
n
++
)
for
(
n
=
0
;
n
<
6
+
4
*
s
->
x96_high_res
;
n
++
)
for
(
ch
=
xch_base
;
ch
<
s
->
x96_nchannels
;
ch
++
)
for
(
ch
=
xch_base
;
ch
<
s
->
x96_nchannels
;
ch
++
)
s
->
quant_index_sel
[
ch
][
n
]
=
get_bits
(
&
s
->
gb
,
quant_index_sel_nbits
[
n
]);
s
->
quant_index_sel
[
ch
][
n
]
=
get_bits
(
&
s
->
gb
,
ff_dca_
quant_index_sel_nbits
[
n
]);
if
(
exss
)
{
if
(
exss
)
{
// Reserved
// Reserved
...
...
libavcodec/dcadata.c
View file @
c2500d62
...
@@ -50,6 +50,14 @@ const uint8_t ff_dca_dmix_primary_nch[8] = {
...
@@ -50,6 +50,14 @@ const uint8_t ff_dca_dmix_primary_nch[8] = {
1
,
2
,
2
,
3
,
3
,
4
,
4
,
0
1
,
2
,
2
,
3
,
3
,
4
,
4
,
0
};
};
const
uint8_t
ff_dca_quant_index_sel_nbits
[
DCA_CODE_BOOKS
]
=
{
1
,
2
,
2
,
2
,
2
,
3
,
3
,
3
,
3
,
3
};
const
uint8_t
ff_dca_quant_index_group_size
[
DCA_CODE_BOOKS
]
=
{
1
,
3
,
3
,
3
,
3
,
7
,
7
,
7
,
7
,
7
};
/* ADPCM data */
/* ADPCM data */
/* 16 bits signed fractional Q13 binary codes */
/* 16 bits signed fractional Q13 binary codes */
...
...
libavcodec/dcadata.h
View file @
c2500d62
...
@@ -23,6 +23,8 @@
...
@@ -23,6 +23,8 @@
#include <stdint.h>
#include <stdint.h>
#include "dcahuff.h"
extern
const
uint32_t
ff_dca_bit_rates
[
32
];
extern
const
uint32_t
ff_dca_bit_rates
[
32
];
extern
const
uint8_t
ff_dca_channels
[
16
];
extern
const
uint8_t
ff_dca_channels
[
16
];
...
@@ -31,6 +33,9 @@ extern const uint8_t ff_dca_bits_per_sample[8];
...
@@ -31,6 +33,9 @@ extern const uint8_t ff_dca_bits_per_sample[8];
extern
const
uint8_t
ff_dca_dmix_primary_nch
[
8
];
extern
const
uint8_t
ff_dca_dmix_primary_nch
[
8
];
extern
const
uint8_t
ff_dca_quant_index_sel_nbits
[
DCA_CODE_BOOKS
];
extern
const
uint8_t
ff_dca_quant_index_group_size
[
DCA_CODE_BOOKS
];
extern
const
int16_t
ff_dca_adpcm_vb
[
4096
][
4
];
extern
const
int16_t
ff_dca_adpcm_vb
[
4096
][
4
];
extern
const
uint32_t
ff_dca_scale_factor_quant6
[
64
];
extern
const
uint32_t
ff_dca_scale_factor_quant6
[
64
];
...
...
libavcodec/dcaenc.c
View file @
c2500d62
...
@@ -70,6 +70,7 @@ typedef struct DCAEncContext {
...
@@ -70,6 +70,7 @@ typedef struct DCAEncContext {
int
abits
[
MAX_CHANNELS
][
DCAENC_SUBBANDS
];
int
abits
[
MAX_CHANNELS
][
DCAENC_SUBBANDS
];
int
scale_factor
[
MAX_CHANNELS
][
DCAENC_SUBBANDS
];
int
scale_factor
[
MAX_CHANNELS
][
DCAENC_SUBBANDS
];
softfloat
quant
[
MAX_CHANNELS
][
DCAENC_SUBBANDS
];
softfloat
quant
[
MAX_CHANNELS
][
DCAENC_SUBBANDS
];
int32_t
quant_index_sel
[
MAX_CHANNELS
][
DCA_CODE_BOOKS
];
int32_t
eff_masking_curve_cb
[
256
];
int32_t
eff_masking_curve_cb
[
256
];
int32_t
band_masking_cb
[
32
];
int32_t
band_masking_cb
[
32
];
int32_t
worst_quantization_noise
;
int32_t
worst_quantization_noise
;
...
@@ -109,7 +110,7 @@ static int encode_init(AVCodecContext *avctx)
...
@@ -109,7 +110,7 @@ static int encode_init(AVCodecContext *avctx)
{
{
DCAEncContext
*
c
=
avctx
->
priv_data
;
DCAEncContext
*
c
=
avctx
->
priv_data
;
uint64_t
layout
=
avctx
->
channel_layout
;
uint64_t
layout
=
avctx
->
channel_layout
;
int
i
,
min_frame_bits
;
int
i
,
j
,
min_frame_bits
;
c
->
fullband_channels
=
c
->
channels
=
avctx
->
channels
;
c
->
fullband_channels
=
c
->
channels
=
avctx
->
channels
;
c
->
lfe_channel
=
(
avctx
->
channels
==
3
||
avctx
->
channels
==
6
);
c
->
lfe_channel
=
(
avctx
->
channels
==
3
||
avctx
->
channels
==
6
);
...
@@ -142,6 +143,12 @@ static int encode_init(AVCodecContext *avctx)
...
@@ -142,6 +143,12 @@ static int encode_init(AVCodecContext *avctx)
c
->
channel_order_tab
=
channel_reorder_nolfe
[
c
->
channel_config
];
c
->
channel_order_tab
=
channel_reorder_nolfe
[
c
->
channel_config
];
}
}
for
(
i
=
0
;
i
<
MAX_CHANNELS
;
i
++
)
{
for
(
j
=
0
;
j
<
DCA_CODE_BOOKS
;
j
++
)
{
c
->
quant_index_sel
[
i
][
j
]
=
ff_dca_quant_index_group_size
[
j
];
}
}
for
(
i
=
0
;
i
<
9
;
i
++
)
{
for
(
i
=
0
;
i
<
9
;
i
++
)
{
if
(
sample_rates
[
i
]
==
avctx
->
sample_rate
)
if
(
sample_rates
[
i
]
==
avctx
->
sample_rate
)
break
;
break
;
...
@@ -568,9 +575,109 @@ static const int snr_fudge = 128;
...
@@ -568,9 +575,109 @@ static const int snr_fudge = 128;
#define USED_NABITS 2
#define USED_NABITS 2
#define USED_26ABITS 4
#define USED_26ABITS 4
static
int32_t
quantize_value
(
int32_t
value
,
softfloat
quant
)
{
int32_t
offset
=
1
<<
(
quant
.
e
-
1
);
value
=
mul32
(
value
,
quant
.
m
)
+
offset
;
value
=
value
>>
quant
.
e
;
return
value
;
}
static
int
calc_one_scale
(
int32_t
peak_cb
,
int
abits
,
softfloat
*
quant
)
{
int32_t
peak
;
int
our_nscale
,
try_remove
;
softfloat
our_quant
;
av_assert0
(
peak_cb
<=
0
);
av_assert0
(
peak_cb
>=
-
2047
);
our_nscale
=
127
;
peak
=
cb_to_level
[
-
peak_cb
];
for
(
try_remove
=
64
;
try_remove
>
0
;
try_remove
>>=
1
)
{
if
(
scalefactor_inv
[
our_nscale
-
try_remove
].
e
+
stepsize_inv
[
abits
].
e
<=
17
)
continue
;
our_quant
.
m
=
mul32
(
scalefactor_inv
[
our_nscale
-
try_remove
].
m
,
stepsize_inv
[
abits
].
m
);
our_quant
.
e
=
scalefactor_inv
[
our_nscale
-
try_remove
].
e
+
stepsize_inv
[
abits
].
e
-
17
;
if
((
ff_dca_quant_levels
[
abits
]
-
1
)
/
2
<
quantize_value
(
peak
,
our_quant
))
continue
;
our_nscale
-=
try_remove
;
}
if
(
our_nscale
>=
125
)
our_nscale
=
124
;
quant
->
m
=
mul32
(
scalefactor_inv
[
our_nscale
].
m
,
stepsize_inv
[
abits
].
m
);
quant
->
e
=
scalefactor_inv
[
our_nscale
].
e
+
stepsize_inv
[
abits
].
e
-
17
;
av_assert0
((
ff_dca_quant_levels
[
abits
]
-
1
)
/
2
>=
quantize_value
(
peak
,
*
quant
));
return
our_nscale
;
}
static
void
quantize_all
(
DCAEncContext
*
c
)
{
int
sample
,
band
,
ch
;
for
(
ch
=
0
;
ch
<
c
->
fullband_channels
;
ch
++
)
for
(
band
=
0
;
band
<
32
;
band
++
)
for
(
sample
=
0
;
sample
<
SUBBAND_SAMPLES
;
sample
++
)
c
->
quantized
[
ch
][
band
][
sample
]
=
quantize_value
(
c
->
subband
[
ch
][
band
][
sample
],
c
->
quant
[
ch
][
band
]);
}
static
void
accumulate_huff_bit_consumption
(
int
abits
,
int32_t
*
quantized
,
uint32_t
*
result
)
{
uint8_t
sel
,
id
=
abits
-
1
;
for
(
sel
=
0
;
sel
<
ff_dca_quant_index_group_size
[
id
];
sel
++
)
result
[
sel
]
+=
ff_dca_vlc_calc_quant_bits
(
quantized
,
SUBBAND_SAMPLES
,
sel
,
id
);
}
static
uint32_t
set_best_code
(
uint32_t
vlc_bits
[
DCA_CODE_BOOKS
][
7
],
uint32_t
clc_bits
[
DCA_CODE_BOOKS
],
int32_t
res
[
DCA_CODE_BOOKS
])
{
uint8_t
i
,
sel
;
uint32_t
best_sel_bits
[
DCA_CODE_BOOKS
];
int32_t
best_sel_id
[
DCA_CODE_BOOKS
];
uint32_t
t
,
bits
=
0
;
for
(
i
=
0
;
i
<
DCA_CODE_BOOKS
;
i
++
)
{
av_assert0
(
!
((
!!
vlc_bits
[
i
][
0
])
^
(
!!
clc_bits
[
i
])));
if
(
vlc_bits
[
i
][
0
]
==
0
)
{
/* do not transmit adjustment index for empty codebooks */
res
[
i
]
=
ff_dca_quant_index_group_size
[
i
];
/* and skip it */
continue
;
}
best_sel_bits
[
i
]
=
vlc_bits
[
i
][
0
];
best_sel_id
[
i
]
=
0
;
for
(
sel
=
0
;
sel
<
ff_dca_quant_index_group_size
[
i
];
sel
++
)
{
if
(
best_sel_bits
[
i
]
>
vlc_bits
[
i
][
sel
]
&&
vlc_bits
[
i
][
sel
])
{
best_sel_bits
[
i
]
=
vlc_bits
[
i
][
sel
];
best_sel_id
[
i
]
=
sel
;
}
}
/* 2 bits to transmit scale factor adjustment index */
t
=
best_sel_bits
[
i
]
+
2
;
if
(
t
<
clc_bits
[
i
])
{
res
[
i
]
=
best_sel_id
[
i
];
bits
+=
t
;
}
else
{
res
[
i
]
=
ff_dca_quant_index_group_size
[
i
];
bits
+=
clc_bits
[
i
];
}
}
return
bits
;
}
static
int
init_quantization_noise
(
DCAEncContext
*
c
,
int
noise
)
static
int
init_quantization_noise
(
DCAEncContext
*
c
,
int
noise
)
{
{
int
ch
,
band
,
ret
=
0
;
int
ch
,
band
,
ret
=
0
;
uint32_t
huff_bit_count_accum
[
MAX_CHANNELS
][
DCA_CODE_BOOKS
][
7
];
uint32_t
clc_bit_count_accum
[
MAX_CHANNELS
][
DCA_CODE_BOOKS
];
uint32_t
bits_counter
=
0
;
c
->
consumed_bits
=
132
+
493
*
c
->
fullband_channels
;
c
->
consumed_bits
=
132
+
493
*
c
->
fullband_channels
;
if
(
c
->
lfe_channel
)
if
(
c
->
lfe_channel
)
...
@@ -597,10 +704,36 @@ static int init_quantization_noise(DCAEncContext *c, int noise)
...
@@ -597,10 +704,36 @@ static int init_quantization_noise(DCAEncContext *c, int noise)
}
}
}
}
for
(
ch
=
0
;
ch
<
c
->
fullband_channels
;
ch
++
)
/* Recalc scale_factor each time to get bits consumption in case of Huffman coding.
It is suboptimal solution */
/* TODO: May be cache scaled values */
for
(
ch
=
0
;
ch
<
c
->
fullband_channels
;
ch
++
)
{
for
(
band
=
0
;
band
<
32
;
band
++
)
{
c
->
scale_factor
[
ch
][
band
]
=
calc_one_scale
(
c
->
peak_cb
[
ch
][
band
],
c
->
abits
[
ch
][
band
],
&
c
->
quant
[
ch
][
band
]);
}
}
quantize_all
(
c
);
memset
(
huff_bit_count_accum
,
0
,
MAX_CHANNELS
*
DCA_CODE_BOOKS
*
7
*
sizeof
(
uint32_t
));
memset
(
clc_bit_count_accum
,
0
,
MAX_CHANNELS
*
DCA_CODE_BOOKS
*
sizeof
(
uint32_t
));
for
(
ch
=
0
;
ch
<
c
->
fullband_channels
;
ch
++
)
{
for
(
band
=
0
;
band
<
32
;
band
++
)
{
for
(
band
=
0
;
band
<
32
;
band
++
)
{
c
->
consumed_bits
+=
bit_consumption
[
c
->
abits
[
ch
][
band
]];
if
(
c
->
abits
[
ch
][
band
]
&&
c
->
abits
[
ch
][
band
]
<=
DCA_CODE_BOOKS
)
{
accumulate_huff_bit_consumption
(
c
->
abits
[
ch
][
band
],
c
->
quantized
[
ch
][
band
],
huff_bit_count_accum
[
ch
][
c
->
abits
[
ch
][
band
]
-
1
]);
clc_bit_count_accum
[
ch
][
c
->
abits
[
ch
][
band
]
-
1
]
+=
bit_consumption
[
c
->
abits
[
ch
][
band
]];
}
else
{
bits_counter
+=
bit_consumption
[
c
->
abits
[
ch
][
band
]];
}
}
}
}
for
(
ch
=
0
;
ch
<
c
->
fullband_channels
;
ch
++
)
{
bits_counter
+=
set_best_code
(
huff_bit_count_accum
[
ch
],
clc_bit_count_accum
[
ch
],
c
->
quant_index_sel
[
ch
]);
}
c
->
consumed_bits
+=
bits_counter
;
return
ret
;
return
ret
;
}
}
...
@@ -655,71 +788,12 @@ static void shift_history(DCAEncContext *c, const int32_t *input)
...
@@ -655,71 +788,12 @@ static void shift_history(DCAEncContext *c, const int32_t *input)
}
}
}
}
static
int32_t
quantize_value
(
int32_t
value
,
softfloat
quant
)
static
void
calc_lfe_scales
(
DCAEncContext
*
c
)
{
int32_t
offset
=
1
<<
(
quant
.
e
-
1
);
value
=
mul32
(
value
,
quant
.
m
)
+
offset
;
value
=
value
>>
quant
.
e
;
return
value
;
}
static
int
calc_one_scale
(
int32_t
peak_cb
,
int
abits
,
softfloat
*
quant
)
{
int32_t
peak
;
int
our_nscale
,
try_remove
;
softfloat
our_quant
;
av_assert0
(
peak_cb
<=
0
);
av_assert0
(
peak_cb
>=
-
2047
);
our_nscale
=
127
;
peak
=
cb_to_level
[
-
peak_cb
];
for
(
try_remove
=
64
;
try_remove
>
0
;
try_remove
>>=
1
)
{
if
(
scalefactor_inv
[
our_nscale
-
try_remove
].
e
+
stepsize_inv
[
abits
].
e
<=
17
)
continue
;
our_quant
.
m
=
mul32
(
scalefactor_inv
[
our_nscale
-
try_remove
].
m
,
stepsize_inv
[
abits
].
m
);
our_quant
.
e
=
scalefactor_inv
[
our_nscale
-
try_remove
].
e
+
stepsize_inv
[
abits
].
e
-
17
;
if
((
ff_dca_quant_levels
[
abits
]
-
1
)
/
2
<
quantize_value
(
peak
,
our_quant
))
continue
;
our_nscale
-=
try_remove
;
}
if
(
our_nscale
>=
125
)
our_nscale
=
124
;
quant
->
m
=
mul32
(
scalefactor_inv
[
our_nscale
].
m
,
stepsize_inv
[
abits
].
m
);
quant
->
e
=
scalefactor_inv
[
our_nscale
].
e
+
stepsize_inv
[
abits
].
e
-
17
;
av_assert0
((
ff_dca_quant_levels
[
abits
]
-
1
)
/
2
>=
quantize_value
(
peak
,
*
quant
));
return
our_nscale
;
}
static
void
calc_scales
(
DCAEncContext
*
c
)
{
{
int
band
,
ch
;
for
(
ch
=
0
;
ch
<
c
->
fullband_channels
;
ch
++
)
for
(
band
=
0
;
band
<
32
;
band
++
)
c
->
scale_factor
[
ch
][
band
]
=
calc_one_scale
(
c
->
peak_cb
[
ch
][
band
],
c
->
abits
[
ch
][
band
],
&
c
->
quant
[
ch
][
band
]);
if
(
c
->
lfe_channel
)
if
(
c
->
lfe_channel
)
c
->
lfe_scale_factor
=
calc_one_scale
(
c
->
lfe_peak_cb
,
11
,
&
c
->
lfe_quant
);
c
->
lfe_scale_factor
=
calc_one_scale
(
c
->
lfe_peak_cb
,
11
,
&
c
->
lfe_quant
);
}
}
static
void
quantize_all
(
DCAEncContext
*
c
)
{
int
sample
,
band
,
ch
;
for
(
ch
=
0
;
ch
<
c
->
fullband_channels
;
ch
++
)
for
(
band
=
0
;
band
<
32
;
band
++
)
for
(
sample
=
0
;
sample
<
SUBBAND_SAMPLES
;
sample
++
)
c
->
quantized
[
ch
][
band
][
sample
]
=
quantize_value
(
c
->
subband
[
ch
][
band
][
sample
],
c
->
quant
[
ch
][
band
]);
}
static
void
put_frame_header
(
DCAEncContext
*
c
)
static
void
put_frame_header
(
DCAEncContext
*
c
)
{
{
/* SYNC */
/* SYNC */
...
@@ -805,9 +879,6 @@ static void put_frame_header(DCAEncContext *c)
...
@@ -805,9 +879,6 @@ static void put_frame_header(DCAEncContext *c)
static
void
put_primary_audio_header
(
DCAEncContext
*
c
)
static
void
put_primary_audio_header
(
DCAEncContext
*
c
)
{
{
static
const
int
bitlen
[
11
]
=
{
0
,
1
,
2
,
2
,
2
,
2
,
3
,
3
,
3
,
3
,
3
};
static
const
int
thr
[
11
]
=
{
0
,
1
,
3
,
3
,
3
,
3
,
7
,
7
,
7
,
7
,
7
};
int
ch
,
i
;
int
ch
,
i
;
/* Number of subframes */
/* Number of subframes */
put_bits
(
&
c
->
pb
,
4
,
SUBFRAMES
-
1
);
put_bits
(
&
c
->
pb
,
4
,
SUBFRAMES
-
1
);
...
@@ -839,36 +910,51 @@ static void put_primary_audio_header(DCAEncContext *c)
...
@@ -839,36 +910,51 @@ static void put_primary_audio_header(DCAEncContext *c)
for
(
ch
=
0
;
ch
<
c
->
fullband_channels
;
ch
++
)
for
(
ch
=
0
;
ch
<
c
->
fullband_channels
;
ch
++
)
put_bits
(
&
c
->
pb
,
3
,
6
);
put_bits
(
&
c
->
pb
,
3
,
6
);
/* Quantization index codebook select: dummy data
/* Quantization index codebook select */
to avoid transmission of scale factor adjustment */
for
(
i
=
0
;
i
<
DCA_CODE_BOOKS
;
i
++
)
for
(
i
=
1
;
i
<
11
;
i
++
)
for
(
ch
=
0
;
ch
<
c
->
fullband_channels
;
ch
++
)
for
(
ch
=
0
;
ch
<
c
->
fullband_channels
;
ch
++
)
put_bits
(
&
c
->
pb
,
bitlen
[
i
],
thr
[
i
]);
put_bits
(
&
c
->
pb
,
ff_dca_quant_index_sel_nbits
[
i
],
c
->
quant_index_sel
[
ch
][
i
]);
/* Scale factor adjustment index: transmitted in case of Huffman coding */
for
(
i
=
0
;
i
<
DCA_CODE_BOOKS
;
i
++
)
for
(
ch
=
0
;
ch
<
c
->
fullband_channels
;
ch
++
)
if
(
c
->
quant_index_sel
[
ch
][
i
]
<
ff_dca_quant_index_group_size
[
i
])
put_bits
(
&
c
->
pb
,
2
,
0
);
/* Scale factor adjustment index: not transmitted */
/* Audio header CRC check word: not transmitted */
/* Audio header CRC check word: not transmitted */
}
}
static
void
put_subframe_samples
(
DCAEncContext
*
c
,
int
ss
,
int
band
,
int
ch
)
static
void
put_subframe_samples
(
DCAEncContext
*
c
,
int
ss
,
int
band
,
int
ch
)
{
{
if
(
c
->
abits
[
ch
][
band
]
<=
7
)
{
int
i
,
j
,
sum
,
bits
,
sel
;
int
sum
,
i
,
j
;
if
(
c
->
abits
[
ch
][
band
]
<=
DCA_CODE_BOOKS
)
{
for
(
i
=
0
;
i
<
8
;
i
+=
4
)
{
av_assert0
(
c
->
abits
[
ch
][
band
]
>
0
);
sum
=
0
;
sel
=
c
->
quant_index_sel
[
ch
][
c
->
abits
[
ch
][
band
]
-
1
];
for
(
j
=
3
;
j
>=
0
;
j
--
)
{
// Huffman codes
sum
*=
ff_dca_quant_levels
[
c
->
abits
[
ch
][
band
]];
if
(
sel
<
ff_dca_quant_index_group_size
[
c
->
abits
[
ch
][
band
]
-
1
])
{
sum
+=
c
->
quantized
[
ch
][
band
][
ss
*
8
+
i
+
j
];
ff_dca_vlc_enc_quant
(
&
c
->
pb
,
&
c
->
quantized
[
ch
][
band
][
ss
*
8
],
8
,
sel
,
c
->
abits
[
ch
][
band
]
-
1
);
sum
+=
(
ff_dca_quant_levels
[
c
->
abits
[
ch
][
band
]]
-
1
)
/
2
;
return
;
}
put_bits
(
&
c
->
pb
,
bit_consumption
[
c
->
abits
[
ch
][
band
]]
/
4
,
sum
);
}
}
}
else
{
int
i
;
// Block codes
for
(
i
=
0
;
i
<
8
;
i
++
)
{
if
(
c
->
abits
[
ch
][
band
]
<=
7
)
{
int
bits
=
bit_consumption
[
c
->
abits
[
ch
][
band
]]
/
16
;
for
(
i
=
0
;
i
<
8
;
i
+=
4
)
{
put_sbits
(
&
c
->
pb
,
bits
,
c
->
quantized
[
ch
][
band
][
ss
*
8
+
i
]);
sum
=
0
;
for
(
j
=
3
;
j
>=
0
;
j
--
)
{
sum
*=
ff_dca_quant_levels
[
c
->
abits
[
ch
][
band
]];
sum
+=
c
->
quantized
[
ch
][
band
][
ss
*
8
+
i
+
j
];
sum
+=
(
ff_dca_quant_levels
[
c
->
abits
[
ch
][
band
]]
-
1
)
/
2
;
}
put_bits
(
&
c
->
pb
,
bit_consumption
[
c
->
abits
[
ch
][
band
]]
/
4
,
sum
);
}
return
;
}
}
}
}
for
(
i
=
0
;
i
<
8
;
i
++
)
{
bits
=
bit_consumption
[
c
->
abits
[
ch
][
band
]]
/
16
;
put_sbits
(
&
c
->
pb
,
bits
,
c
->
quantized
[
ch
][
band
][
ss
*
8
+
i
]);
}
}
}
static
void
put_subframe
(
DCAEncContext
*
c
,
int
subframe
)
static
void
put_subframe
(
DCAEncContext
*
c
,
int
subframe
)
...
@@ -947,8 +1033,7 @@ static int encode_frame(AVCodecContext *avctx, AVPacket *avpkt,
...
@@ -947,8 +1033,7 @@ static int encode_frame(AVCodecContext *avctx, AVPacket *avpkt,
calc_masking
(
c
,
samples
);
calc_masking
(
c
,
samples
);
find_peaks
(
c
);
find_peaks
(
c
);
assign_bits
(
c
);
assign_bits
(
c
);
calc_scales
(
c
);
calc_lfe_scales
(
c
);
quantize_all
(
c
);
shift_history
(
c
,
samples
);
shift_history
(
c
,
samples
);
init_put_bits
(
&
c
->
pb
,
avpkt
->
data
,
avpkt
->
size
);
init_put_bits
(
&
c
->
pb
,
avpkt
->
data
,
avpkt
->
size
);
...
...
libavcodec/dcaenc.h
View file @
c2500d62
...
@@ -95,7 +95,6 @@ static const softfloat scalefactor_inv[128] = {
...
@@ -95,7 +95,6 @@ static const softfloat scalefactor_inv[128] = {
/* manually derived from
/* manually derived from
* Table B.5: Selection of quantization levels and codebooks
* Table B.5: Selection of quantization levels and codebooks
* FIXME: will become invalid when Huffman codes are introduced.
*/
*/
static
const
int
bit_consumption
[
27
]
=
{
static
const
int
bit_consumption
[
27
]
=
{
-
8
,
28
,
40
,
48
,
52
,
60
,
68
,
76
,
80
,
96
,
-
8
,
28
,
40
,
48
,
52
,
60
,
68
,
76
,
80
,
96
,
...
...
libavcodec/dcahuff.c
View file @
c2500d62
...
@@ -1335,3 +1335,25 @@ av_cold void ff_dca_init_vlcs(void)
...
@@ -1335,3 +1335,25 @@ av_cold void ff_dca_init_vlcs(void)
vlcs_initialized
=
1
;
vlcs_initialized
=
1
;
}
}
uint32_t
ff_dca_vlc_calc_quant_bits
(
int
*
values
,
uint8_t
n
,
uint8_t
sel
,
uint8_t
table
)
{
uint8_t
i
,
id
;
uint32_t
sum
=
0
;
for
(
i
=
0
;
i
<
n
;
i
++
)
{
id
=
values
[
i
]
-
bitalloc_offsets
[
table
];
av_assert0
(
id
<
bitalloc_sizes
[
table
]);
sum
+=
bitalloc_bits
[
table
][
sel
][
id
];
}
return
sum
;
}
void
ff_dca_vlc_enc_quant
(
PutBitContext
*
pb
,
int
*
values
,
uint8_t
n
,
uint8_t
sel
,
uint8_t
table
)
{
uint8_t
i
,
id
;
for
(
i
=
0
;
i
<
n
;
i
++
)
{
id
=
values
[
i
]
-
bitalloc_offsets
[
table
];
av_assert0
(
id
<
bitalloc_sizes
[
table
]);
put_bits
(
pb
,
bitalloc_bits
[
table
][
sel
][
id
],
bitalloc_codes
[
table
][
sel
][
id
]);
}
}
libavcodec/dcahuff.h
View file @
c2500d62
...
@@ -27,6 +27,7 @@
...
@@ -27,6 +27,7 @@
#include "avcodec.h"
#include "avcodec.h"
#include "get_bits.h"
#include "get_bits.h"
#include "put_bits.h"
#define DCA_CODE_BOOKS 10
#define DCA_CODE_BOOKS 10
...
@@ -55,5 +56,7 @@ extern VLC ff_dca_vlc_grid_3;
...
@@ -55,5 +56,7 @@ extern VLC ff_dca_vlc_grid_3;
extern
VLC
ff_dca_vlc_rsd
;
extern
VLC
ff_dca_vlc_rsd
;
av_cold
void
ff_dca_init_vlcs
(
void
);
av_cold
void
ff_dca_init_vlcs
(
void
);
uint32_t
ff_dca_vlc_calc_quant_bits
(
int
*
values
,
uint8_t
n
,
uint8_t
sel
,
uint8_t
abits
);
void
ff_dca_vlc_enc_quant
(
PutBitContext
*
pb
,
int
*
values
,
uint8_t
n
,
uint8_t
sel
,
uint8_t
abits
);
#endif
/* AVCODEC_DCAHUFF_H */
#endif
/* AVCODEC_DCAHUFF_H */
tests/fate/acodec.mak
View file @
c2500d62
...
@@ -104,7 +104,7 @@ fate-acodec-dca: tests/data/asynth-44100-2.wav
...
@@ -104,7 +104,7 @@ fate-acodec-dca: tests/data/asynth-44100-2.wav
fate-acodec-dca: SRC = tests/data/asynth-44100-2.wav
fate-acodec-dca: SRC = tests/data/asynth-44100-2.wav
fate-acodec-dca: CMD = md5 -i $(TARGET_PATH)/$(SRC) -c:a dca -strict -2 -f dts -flags +bitexact
fate-acodec-dca: CMD = md5 -i $(TARGET_PATH)/$(SRC) -c:a dca -strict -2 -f dts -flags +bitexact
fate-acodec-dca: CMP = oneline
fate-acodec-dca: CMP = oneline
fate-acodec-dca: REF = 7
ffdefdf47069289990755c79387cc90
fate-acodec-dca: REF = 7
cd79a3717943a06b217f1130223a86f
FATE_ACODEC-$(call ENCDEC, DCA, WAV) += fate-acodec-dca2
FATE_ACODEC-$(call ENCDEC, DCA, WAV) += fate-acodec-dca2
fate-acodec-dca2: CMD = enc_dec_pcm dts wav s16le $(SRC) -c:a dca -strict -2 -flags +bitexact
fate-acodec-dca2: CMD = enc_dec_pcm dts wav s16le $(SRC) -c:a dca -strict -2 -flags +bitexact
...
...
Write
Preview
Markdown
is supported
0%
Try again
or
attach a new file
Attach a file
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Cancel
Please
register
or
sign in
to comment