FFmpeg
libavcodec
lagarithrac.h
Go to the documentation of this file.
1
/*
2
* Lagarith range decoder
3
* Copyright (c) 2009 Nathan Caldwell <saintdev (at) gmail.com>
4
* Copyright (c) 2009 David Conrad
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
/**
24
* @file
25
* Lagarith range decoder
26
* @author Nathan Caldwell
27
* @author David Conrad
28
*/
29
30
#ifndef AVCODEC_LAGARITHRAC_H
31
#define AVCODEC_LAGARITHRAC_H
32
33
#include <stdint.h>
34
#include "
libavutil/common.h
"
35
#include "
libavutil/intreadwrite.h
"
36
#include "
avcodec.h
"
37
#include "
get_bits.h
"
38
39
typedef
struct
lag_rac
{
40
AVCodecContext
*
avctx
;
41
unsigned
low
;
42
unsigned
range
;
43
unsigned
scale
;
/**< Number of bits of precision in range. */
44
unsigned
hash_shift
;
/**< Number of bits to shift to calculate hash for radix search. */
45
46
const
uint8_t
*
bytestream_start
;
/**< Start of input bytestream. */
47
const
uint8_t
*
bytestream
;
/**< Current position in input bytestream. */
48
const
uint8_t
*
bytestream_end
;
/**< End position of input bytestream. */
49
50
int
overread
;
51
#define MAX_OVERREAD 4
52
53
uint32_t
prob
[258];
/**< Table of cumulative probability for each symbol. */
54
uint8_t
range_hash
[1024];
/**< Hash table mapping upper byte to approximate symbol. */
55
}
lag_rac
;
56
57
void
ff_lag_rac_init
(
lag_rac
*l,
GetBitContext
*gb,
int
length
);
58
59
/* TODO: Optimize */
60
static
inline
void
lag_rac_refill
(
lag_rac
*l)
61
{
62
while
(l->
range
<= 0x800000) {
63
l->
low
<<= 8;
64
l->
range
<<= 8;
65
l->
low
|= 0xff & (
AV_RB16
(l->
bytestream
) >> 1);
66
if
(l->
bytestream
< l->
bytestream_end
)
67
l->
bytestream
++;
68
else
69
l->
overread
++;
70
}
71
}
72
73
/**
74
* Decode a single byte from the compressed plane described by *l.
75
* @param l pointer to lag_rac for the current plane
76
* @return next byte of decoded data
77
*/
78
static
inline
uint8_t
lag_get_rac
(
lag_rac
*l)
79
{
80
unsigned
range_scaled, low_scaled;
81
int
val
;
82
83
lag_rac_refill
(l);
84
85
range_scaled = l->
range
>> l->
scale
;
86
87
if
(l->
low
< range_scaled * l->
prob
[255]) {
88
/* val = 0 is frequent enough to deserve a shortcut */
89
if
(l->
low
< range_scaled * l->
prob
[1]) {
90
val
= 0;
91
}
else
{
92
low_scaled = l->
low
/ (range_scaled<<(l->
hash_shift
));
93
94
val
= l->
range_hash
[low_scaled];
95
while
(l->
low
>= range_scaled * l->
prob
[
val
+ 1])
96
val
++;
97
}
98
99
l->
range
= range_scaled * (l->
prob
[
val
+ 1] - l->
prob
[
val
]);
100
}
else
{
101
val
= 255;
102
l->
range
-= range_scaled * l->
prob
[255];
103
}
104
105
if
(!l->
range
)
106
l->
range
= 0x80;
107
108
l->
low
-= range_scaled * l->
prob
[
val
];
109
110
return
val
;
111
}
112
113
114
#endif
/* AVCODEC_LAGARITHRAC_H */
lag_rac::low
unsigned low
Definition:
lagarithrac.h:41
lag_rac::scale
unsigned scale
Number of bits of precision in range.
Definition:
lagarithrac.h:43
lag_rac::hash_shift
unsigned hash_shift
Number of bits to shift to calculate hash for radix search.
Definition:
lagarithrac.h:44
lag_rac::overread
int overread
Definition:
lagarithrac.h:50
lag_get_rac
static uint8_t lag_get_rac(lag_rac *l)
Decode a single byte from the compressed plane described by *l.
Definition:
lagarithrac.h:78
lag_rac::prob
uint32_t prob[258]
Table of cumulative probability for each symbol.
Definition:
lagarithrac.h:53
lag_rac::range_hash
uint8_t range_hash[1024]
Hash table mapping upper byte to approximate symbol.
Definition:
lagarithrac.h:54
GetBitContext
Definition:
get_bits.h:61
intreadwrite.h
get_bits.h
lag_rac
Definition:
lagarithrac.h:39
ff_lag_rac_init
void ff_lag_rac_init(lag_rac *l, GetBitContext *gb, int length)
Definition:
lagarithrac.c:33
lag_rac::range
unsigned range
Definition:
lagarithrac.h:42
lag_rac::avctx
AVCodecContext * avctx
Definition:
lagarithrac.h:40
lag_rac_refill
static void lag_rac_refill(lag_rac *l)
Definition:
lagarithrac.h:60
val
const char const char void * val
Definition:
avisynth_c.h:863
lag_rac::bytestream_start
const uint8_t * bytestream_start
Start of input bytestream.
Definition:
lagarithrac.h:46
lag_rac::bytestream
const uint8_t * bytestream
Current position in input bytestream.
Definition:
lagarithrac.h:47
common.h
uint8_t
uint8_t
Definition:
audio_convert.c:194
avcodec.h
AVCodecContext
main external API structure.
Definition:
avcodec.h:1565
length
const char int length
Definition:
avisynth_c.h:860
lag_rac::bytestream_end
const uint8_t * bytestream_end
End position of input bytestream.
Definition:
lagarithrac.h:48
AV_RB16
uint64_t_TMPL AV_WL64 unsigned int_TMPL AV_WL32 unsigned int_TMPL AV_WL24 unsigned int_TMPL AV_WL16 uint64_t_TMPL AV_WB64 unsigned int_TMPL AV_WB32 unsigned int_TMPL AV_WB24 unsigned int_TMPL AV_RB16
Definition:
bytestream.h:94
Generated on Wed Aug 24 2022 21:26:44 for FFmpeg by
1.8.17