blob: 821eeadd6ed5aef5fd9e9adf0509daeb70871db1
1 | /* |
2 | * Copyright (c) 2012 Andrew D'Addesio |
3 | * Copyright (c) 2013-2014 Mozilla Corporation |
4 | * Copyright (c) 2017 Rostislav Pehlivanov <atomnuker@gmail.com> |
5 | * |
6 | * This file is part of FFmpeg. |
7 | * |
8 | * FFmpeg is free software; you can redistribute it and/or |
9 | * modify it under the terms of the GNU Lesser General Public |
10 | * License as published by the Free Software Foundation; either |
11 | * version 2.1 of the License, or (at your option) any later version. |
12 | * |
13 | * FFmpeg is distributed in the hope that it will be useful, |
14 | * but WITHOUT ANY WARRANTY; without even the implied warranty of |
15 | * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU |
16 | * Lesser General Public License for more details. |
17 | * |
18 | * You should have received a copy of the GNU Lesser General Public |
19 | * License along with FFmpeg; if not, write to the Free Software |
20 | * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA |
21 | */ |
22 | |
23 | #ifndef AVCODEC_OPUS_RC_H |
24 | #define AVCODEC_OPUS_RC_H |
25 | |
26 | #include <stdint.h> |
27 | #include "get_bits.h" |
28 | |
29 | #define OPUS_MAX_PACKET_SIZE 1275 |
30 | |
31 | #define opus_ilog(i) (av_log2(i) + !!(i)) |
32 | |
33 | typedef struct RawBitsContext { |
34 | const uint8_t *position; |
35 | uint32_t bytes; |
36 | uint32_t cachelen; |
37 | uint32_t cacheval; |
38 | } RawBitsContext; |
39 | |
40 | typedef struct OpusRangeCoder { |
41 | GetBitContext gb; |
42 | RawBitsContext rb; |
43 | uint32_t range; |
44 | uint32_t value; |
45 | uint32_t total_bits; |
46 | |
47 | /* Encoder */ |
48 | uint8_t buf[OPUS_MAX_PACKET_SIZE + 12]; /* memcpy vs (memmove + overreading) */ |
49 | uint8_t *rng_cur; /* Current range coded byte */ |
50 | int ext; /* Awaiting propagation */ |
51 | int rem; /* Carryout flag */ |
52 | |
53 | /* Encoding stats */ |
54 | int waste; |
55 | } OpusRangeCoder; |
56 | |
57 | /** |
58 | * CELT: estimate bits of entropy that have thus far been consumed for the |
59 | * current CELT frame, to integer and fractional (1/8th bit) precision |
60 | */ |
61 | static av_always_inline uint32_t opus_rc_tell(const OpusRangeCoder *rc) |
62 | { |
63 | return rc->total_bits - av_log2(rc->range) - 1; |
64 | } |
65 | |
66 | static av_always_inline uint32_t opus_rc_tell_frac(const OpusRangeCoder *rc) |
67 | { |
68 | uint32_t i, total_bits, rcbuffer, range; |
69 | |
70 | total_bits = rc->total_bits << 3; |
71 | rcbuffer = av_log2(rc->range) + 1; |
72 | range = rc->range >> (rcbuffer-16); |
73 | |
74 | for (i = 0; i < 3; i++) { |
75 | int bit; |
76 | range = range * range >> 15; |
77 | bit = range >> 16; |
78 | rcbuffer = rcbuffer << 1 | bit; |
79 | range >>= bit; |
80 | } |
81 | |
82 | return total_bits - rcbuffer; |
83 | } |
84 | |
85 | uint32_t ff_opus_rc_dec_cdf(OpusRangeCoder *rc, const uint16_t *cdf); |
86 | void ff_opus_rc_enc_cdf(OpusRangeCoder *rc, int val, const uint16_t *cdf); |
87 | |
88 | uint32_t ff_opus_rc_dec_log(OpusRangeCoder *rc, uint32_t bits); |
89 | void ff_opus_rc_enc_log(OpusRangeCoder *rc, int val, uint32_t bits); |
90 | |
91 | uint32_t ff_opus_rc_dec_uint_step(OpusRangeCoder *rc, int k0); |
92 | void ff_opus_rc_enc_uint_step(OpusRangeCoder *rc, uint32_t val, int k0); |
93 | |
94 | uint32_t ff_opus_rc_dec_uint_tri(OpusRangeCoder *rc, int qn); |
95 | void ff_opus_rc_enc_uint_tri(OpusRangeCoder *rc, uint32_t k, int qn); |
96 | |
97 | uint32_t ff_opus_rc_dec_uint(OpusRangeCoder *rc, uint32_t size); |
98 | void ff_opus_rc_enc_uint(OpusRangeCoder *rc, uint32_t val, uint32_t size); |
99 | |
100 | uint32_t ff_opus_rc_get_raw(OpusRangeCoder *rc, uint32_t count); |
101 | void ff_opus_rc_put_raw(OpusRangeCoder *rc, uint32_t val, uint32_t count); |
102 | |
103 | int ff_opus_rc_dec_laplace(OpusRangeCoder *rc, uint32_t symbol, int decay); |
104 | void ff_opus_rc_enc_laplace(OpusRangeCoder *rc, int *value, uint32_t symbol, int decay); |
105 | |
106 | int ff_opus_rc_dec_init(OpusRangeCoder *rc, const uint8_t *data, int size); |
107 | void ff_opus_rc_dec_raw_init(OpusRangeCoder *rc, const uint8_t *rightend, uint32_t bytes); |
108 | |
109 | void ff_opus_rc_enc_end(OpusRangeCoder *rc, uint8_t *dst, int size); |
110 | void ff_opus_rc_enc_init(OpusRangeCoder *rc); |
111 | |
112 | #endif /* AVCODEC_OPUS_RC_H */ |
113 |