FFmpeg
Main Page
Related Pages
Modules
Namespaces
Data Structures
Files
Examples
File List
Globals
•
All
Data Structures
Namespaces
Files
Functions
Variables
Typedefs
Enumerations
Enumerator
Macros
Groups
Pages
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
uint32_t
prob
[258];
/**< Table of cumulative probability for each symbol. */
51
uint8_t
range_hash
[1024];
/**< Hash table mapping upper byte to approximate symbol. */
52
}
lag_rac
;
53
54
void
ff_lag_rac_init
(
lag_rac
*l,
GetBitContext
*gb,
int
length
);
55
56
/* TODO: Optimize */
57
static
inline
void
lag_rac_refill
(
lag_rac
*l)
58
{
59
while
(l->
range
<= 0x800000) {
60
l->
low
<<= 8;
61
l->
range
<<= 8;
62
l->
low
|= 0xff & (
AV_RB16
(l->
bytestream
) >> 1);
63
if
(l->
bytestream
< l->
bytestream_end
)
64
l->
bytestream
++;
65
}
66
}
67
68
/**
69
* Decode a single byte from the compressed plane described by *l.
70
* @param l pointer to lag_rac for the current plane
71
* @return next byte of decoded data
72
*/
73
static
inline
uint8_t
lag_get_rac
(
lag_rac
*l)
74
{
75
unsigned
range_scaled, low_scaled;
76
int
val
;
77
78
lag_rac_refill
(l);
79
80
range_scaled = l->
range
>> l->
scale
;
81
82
if
(l->
low
< range_scaled * l->
prob
[255]) {
83
/* val = 0 is frequent enough to deserve a shortcut */
84
if
(l->
low
< range_scaled * l->
prob
[1]) {
85
val = 0;
86
}
else
{
87
low_scaled = l->
low
/ (range_scaled<<(l->
hash_shift
));
88
89
val = l->
range_hash
[low_scaled];
90
while
(l->
low
>= range_scaled * l->
prob
[val + 1])
91
val++;
92
}
93
94
l->
range
= range_scaled * (l->
prob
[val + 1] - l->
prob
[
val
]);
95
}
else
{
96
val = 255;
97
l->
range
-= range_scaled * l->
prob
[255];
98
}
99
100
if
(!l->
range
)
101
l->
range
= 0x80;
102
103
l->
low
-= range_scaled * l->
prob
[
val
];
104
105
return
val
;
106
}
107
108
109
#endif
/* AVCODEC_LAGARITHRAC_H */
Generated on Sun Mar 8 2015 02:34:54 for FFmpeg by
1.8.2