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
9a619bef
Commit
9a619bef
authored
Jan 18, 2017
by
Daniil Cherednik
Committed by
Rostislav Pehlivanov
Jan 20, 2017
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
dcaenc: Use Huffman codes for Bit Allocation Index
Reviewed-by:
Rostislav Pehlivanov
<
atomnuker@gmail.com
>
parent
6b0a3ee6
Show whitespace changes
Inline
Side-by-side
Showing
3 changed files
with
68 additions
and
9 deletions
+68
-9
dcaenc.c
libavcodec/dcaenc.c
+42
-5
dcahuff.c
libavcodec/dcahuff.c
+23
-4
dcahuff.h
libavcodec/dcahuff.h
+3
-0
No files found.
libavcodec/dcaenc.c
View file @
9a619bef
...
...
@@ -67,6 +67,7 @@ typedef struct DCAEncContext {
int32_t
peak_cb
[
MAX_CHANNELS
][
DCAENC_SUBBANDS
];
int32_t
downsampled_lfe
[
DCA_LFE_SAMPLES
];
int32_t
masking_curve_cb
[
SUBSUBFRAMES
][
256
];
int32_t
bit_allocation_sel
[
MAX_CHANNELS
];
int
abits
[
MAX_CHANNELS
][
DCAENC_SUBBANDS
];
int
scale_factor
[
MAX_CHANNELS
][
DCAENC_SUBBANDS
];
softfloat
quant
[
MAX_CHANNELS
][
DCAENC_SUBBANDS
];
...
...
@@ -147,6 +148,8 @@ static int encode_init(AVCodecContext *avctx)
for
(
j
=
0
;
j
<
DCA_CODE_BOOKS
;
j
++
)
{
c
->
quant_index_sel
[
i
][
j
]
=
ff_dca_quant_index_group_size
[
j
];
}
/* 6 - no Huffman */
c
->
bit_allocation_sel
[
i
]
=
6
;
}
for
(
i
=
0
;
i
<
9
;
i
++
)
{
...
...
@@ -672,6 +675,33 @@ static uint32_t set_best_code(uint32_t vlc_bits[DCA_CODE_BOOKS][7], uint32_t clc
return
bits
;
}
static
uint32_t
set_best_abits_code
(
int
abits
[
DCAENC_SUBBANDS
],
int
bands
,
int32_t
*
res
)
{
uint8_t
i
;
uint32_t
t
;
int32_t
best_sel
=
6
;
int32_t
best_bits
=
bands
*
5
;
/* Check do we have subband which cannot be encoded by Huffman tables */
for
(
i
=
0
;
i
<
bands
;
i
++
)
{
if
(
abits
[
i
]
>
12
)
{
*
res
=
best_sel
;
return
best_bits
;
}
}
for
(
i
=
0
;
i
<
DCA_BITALLOC_12_COUNT
;
i
++
)
{
t
=
ff_dca_vlc_calc_alloc_bits
(
abits
,
bands
,
i
);
if
(
t
<
best_bits
)
{
best_bits
=
t
;
best_sel
=
i
;
}
}
*
res
=
best_sel
;
return
best_bits
;
}
static
int
init_quantization_noise
(
DCAEncContext
*
c
,
int
noise
)
{
int
ch
,
band
,
ret
=
0
;
...
...
@@ -679,7 +709,7 @@ static int init_quantization_noise(DCAEncContext *c, int noise)
uint32_t
clc_bit_count_accum
[
MAX_CHANNELS
][
DCA_CODE_BOOKS
];
uint32_t
bits_counter
=
0
;
c
->
consumed_bits
=
132
+
49
3
*
c
->
fullband_channels
;
c
->
consumed_bits
=
132
+
33
3
*
c
->
fullband_channels
;
if
(
c
->
lfe_channel
)
c
->
consumed_bits
+=
72
;
...
...
@@ -702,6 +732,7 @@ static int init_quantization_noise(DCAEncContext *c, int noise)
ret
|=
USED_1ABITS
;
}
}
c
->
consumed_bits
+=
set_best_abits_code
(
c
->
abits
[
ch
],
32
,
&
c
->
bit_allocation_sel
[
ch
]);
}
/* Recalc scale_factor each time to get bits consumption in case of Huffman coding.
...
...
@@ -908,7 +939,7 @@ static void put_primary_audio_header(DCAEncContext *c)
/* Bit allocation quantizer select: linear 5-bit */
for
(
ch
=
0
;
ch
<
c
->
fullband_channels
;
ch
++
)
put_bits
(
&
c
->
pb
,
3
,
6
);
put_bits
(
&
c
->
pb
,
3
,
c
->
bit_allocation_sel
[
ch
]
);
/* Quantization index codebook select */
for
(
i
=
0
;
i
<
DCA_CODE_BOOKS
;
i
++
)
...
...
@@ -974,9 +1005,15 @@ static void put_subframe(DCAEncContext *c, int subframe)
/* Prediction VQ address: not transmitted */
/* Bit allocation index */
for
(
ch
=
0
;
ch
<
c
->
fullband_channels
;
ch
++
)
for
(
band
=
0
;
band
<
DCAENC_SUBBANDS
;
band
++
)
for
(
ch
=
0
;
ch
<
c
->
fullband_channels
;
ch
++
)
{
if
(
c
->
bit_allocation_sel
[
ch
]
==
6
)
{
for
(
band
=
0
;
band
<
DCAENC_SUBBANDS
;
band
++
)
{
put_bits
(
&
c
->
pb
,
5
,
c
->
abits
[
ch
][
band
]);
}
}
else
{
ff_dca_vlc_enc_alloc
(
&
c
->
pb
,
c
->
abits
[
ch
],
DCAENC_SUBBANDS
,
c
->
bit_allocation_sel
[
ch
]);
}
}
if
(
SUBSUBFRAMES
>
1
)
{
/* Transition mode: none for each channel and subband */
...
...
libavcodec/dcahuff.c
View file @
9a619bef
...
...
@@ -42,13 +42,12 @@ static const uint8_t tmode_bits[TMODE_COUNT][4] = {
{
2
,
2
,
2
,
2
}
};
#define BITALLOC_12_COUNT 5
#define BITALLOC_12_VLC_BITS 9
static
const
uint8_t
bitalloc_12_vlc_bits
[
BITALLOC_12_COUNT
]
=
{
static
const
uint8_t
bitalloc_12_vlc_bits
[
DCA_
BITALLOC_12_COUNT
]
=
{
9
,
7
,
7
,
9
,
9
};
static
const
uint16_t
bitalloc_12_codes
[
BITALLOC_12_COUNT
][
12
]
=
{
static
const
uint16_t
bitalloc_12_codes
[
DCA_
BITALLOC_12_COUNT
][
12
]
=
{
{
0x0000
,
0x0002
,
0x0006
,
0x000E
,
0x001E
,
0x003E
,
0x00FF
,
0x00FE
,
0x01FB
,
0x01FA
,
0x01F9
,
0x01F8
,
},
{
0x0001
,
0x0000
,
0x0002
,
0x000F
,
0x000C
,
0x001D
,
0x0039
,
0x0038
,
...
...
@@ -61,7 +60,7 @@ static const uint16_t bitalloc_12_codes[BITALLOC_12_COUNT][12] = {
0x0079
,
0x0078
,
0x00FB
,
0x00FA
,
}
};
static
const
uint8_t
bitalloc_12_bits
[
BITALLOC_12_COUNT
][
12
]
=
{
static
const
uint8_t
bitalloc_12_bits
[
DCA_
BITALLOC_12_COUNT
][
12
]
=
{
{
1
,
2
,
3
,
4
,
5
,
6
,
8
,
8
,
9
,
9
,
9
,
9
},
{
1
,
2
,
3
,
5
,
5
,
6
,
7
,
7
,
7
,
7
,
7
,
7
},
{
2
,
3
,
3
,
3
,
3
,
4
,
4
,
4
,
5
,
6
,
7
,
7
},
...
...
@@ -1357,3 +1356,23 @@ void ff_dca_vlc_enc_quant(PutBitContext *pb, int *values, uint8_t n, uint8_t sel
put_bits
(
pb
,
bitalloc_bits
[
table
][
sel
][
id
],
bitalloc_codes
[
table
][
sel
][
id
]);
}
}
uint32_t
ff_dca_vlc_calc_alloc_bits
(
int
*
values
,
uint8_t
n
,
uint8_t
sel
)
{
uint8_t
i
,
id
;
uint32_t
sum
=
0
;
for
(
i
=
0
;
i
<
n
;
i
++
)
{
id
=
values
[
i
]
-
1
;
sum
+=
bitalloc_12_bits
[
sel
][
id
];
}
return
sum
;
}
void
ff_dca_vlc_enc_alloc
(
PutBitContext
*
pb
,
int
*
values
,
uint8_t
n
,
uint8_t
sel
)
{
uint8_t
i
,
id
;
for
(
i
=
0
;
i
<
n
;
i
++
)
{
id
=
values
[
i
]
-
1
;
put_bits
(
pb
,
bitalloc_12_bits
[
sel
][
id
],
bitalloc_12_codes
[
sel
][
id
]);
}
}
libavcodec/dcahuff.h
View file @
9a619bef
...
...
@@ -30,6 +30,7 @@
#include "put_bits.h"
#define DCA_CODE_BOOKS 10
#define DCA_BITALLOC_12_COUNT 5
typedef
struct
DCAVLC
{
int
offset
;
///< Code values offset
...
...
@@ -58,5 +59,7 @@ extern VLC ff_dca_vlc_rsd;
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
);
uint32_t
ff_dca_vlc_calc_alloc_bits
(
int
*
values
,
uint8_t
n
,
uint8_t
sel
);
void
ff_dca_vlc_enc_alloc
(
PutBitContext
*
pb
,
int
*
values
,
uint8_t
n
,
uint8_t
sel
);
#endif
/* AVCODEC_DCAHUFF_H */
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