Skip to content
Projects
Groups
Snippets
Help
Loading...
Sign in / Register
Toggle navigation
F
ffmpeg
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
Packages
Packages
Wiki
Wiki
Snippets
Snippets
Members
Members
Collapse sidebar
Close sidebar
Activity
Graph
Charts
Create a new issue
Jobs
Commits
Issue Boards
Open sidebar
submodule
ffmpeg
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
Hide 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
++
)
put_bits
(
&
c
->
pb
,
5
,
c
->
abits
[
ch
][
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