1
0
mirror of https://github.com/FFmpeg/FFmpeg.git synced 2025-08-04 22:03:09 +02:00

avcodec/asvenc: Combine writing bits

Removes implicit checks for "do I need to output the buffer now?".
Codesize with Clang 19 with -O3 decreased from 7136B to 6108B
(although asv2_put_level() is now inlined).

Signed-off-by: Andreas Rheinhardt <andreas.rheinhardt@outlook.com>
This commit is contained in:
Andreas Rheinhardt
2025-05-22 19:38:24 +02:00
parent 0401ca714a
commit 05a5e2b576

View File

@ -62,40 +62,43 @@ enum {
static inline void asv1_put_level(PutBitContext *pb, int level)
{
unsigned int index = level + 3;
unsigned n, code;
if (index <= 6) {
put_bits(pb, ff_asv_level_tab[index][1], ff_asv_level_tab[index][0]);
n = ff_asv_level_tab[index][1];
code = ff_asv_level_tab[index][0];
} else {
put_bits(pb, 3, 0); /* Escape code */
put_sbits(pb, 8, level);
n = 3 + 8;
code = (0 /* Escape code */ << 8) | (level & 0xFF);
}
put_bits(pb, n, code);
}
static inline void asv2_put_level(ASVEncContext *a, PutBitContext *pb, int level)
{
unsigned int index = level + 31;
unsigned n, code;
if (index <= 62) {
put_bits_le(pb, ff_asv2_level_tab[index][1], ff_asv2_level_tab[index][0]);
n = ff_asv2_level_tab[index][1];
code = ff_asv2_level_tab[index][0];
} else {
put_bits_le(pb, 5, 0); /* Escape code */
if (level < -128 || level > 127) {
av_log(a->c.avctx, AV_LOG_WARNING, "Clipping level %d, increase qscale\n", level);
level = av_clip_int8(level);
}
put_bits_le(pb, 8, level & 0xFF);
n = 5 + 8;
code = (level & 0xFF) << 5 | /* Escape code */ 0;
}
put_bits_le(pb, n, code);
}
static inline void asv1_encode_block(ASVEncContext *a, int16_t block[64])
{
int i;
int nc_count = 0;
put_bits(&a->pb, 8, (block[0] + 32) >> 6);
block[0] = 0;
for (i = 0; i < 10; i++) {
for (unsigned i = 0, nc_bits = 0, nc_val = 0; i < 10; i++) {
const int index = ff_asv_scantab[4 * i];
int ccp = 0;
@ -113,10 +116,11 @@ static inline void asv1_encode_block(ASVEncContext *a, int16_t block[64])
ccp |= 1;
if (ccp) {
for (; nc_count; nc_count--)
put_bits(&a->pb, 2, 2); /* Skip */
put_bits(&a->pb, ff_asv_ccp_tab[ccp][1], ff_asv_ccp_tab[ccp][0]);
put_bits(&a->pb, nc_bits + ff_asv_ccp_tab[ccp][1],
nc_val << ff_asv_ccp_tab[ccp][1] /* Skip */ |
ff_asv_ccp_tab[ccp][0]);
nc_bits = 0;
nc_val = 0;
if (ccp & 8)
asv1_put_level(&a->pb, block[index + 0]);
@ -127,7 +131,8 @@ static inline void asv1_encode_block(ASVEncContext *a, int16_t block[64])
if (ccp & 1)
asv1_put_level(&a->pb, block[index + 9]);
} else {
nc_count++;
nc_bits += 2;
nc_val = (nc_val << 2) | 2;
}
}
put_bits(&a->pb, 5, 0xF); /* End of block */
@ -146,8 +151,8 @@ static inline void asv2_encode_block(ASVEncContext *a, int16_t block[64])
count >>= 2;
put_bits_le(&a->pb, 4, count);
put_bits_le(&a->pb, 8, (block[0] + 32) >> 6);
put_bits_le(&a->pb, 4 + 8, count /* 4 bits */ |
(/* DC */(block[0] + 32) >> 6) << 4);
block[0] = 0;
for (i = 0; i <= count; i++) {