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 Jul 20 2014 23:05:50 for FFmpeg by
1.8.2