Statistics
| Branch: | Revision:

ffmpeg / libavcodec / liba52 / bitstream.c @ 976f969b

History | View | Annotate | Download (2.4 KB)

1
/*
2
 * bitstream.c
3
 * Copyright (C) 2000-2002 Michel Lespinasse <walken@zoy.org>
4
 * Copyright (C) 1999-2000 Aaron Holtzman <aholtzma@ess.engr.uvic.ca>
5
 *
6
 * This file is part of a52dec, a free ATSC A-52 stream decoder.
7
 * See http://liba52.sourceforge.net/ for updates.
8
 *
9
 * a52dec is free software; you can redistribute it and/or modify
10
 * it under the terms of the GNU General Public License as published by
11
 * the Free Software Foundation; either version 2 of the License, or
12
 * (at your option) any later version.
13
 *
14
 * a52dec is distributed in the hope that it will be useful,
15
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
16
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
17
 * GNU General Public License for more details.
18
 *
19
 * You should have received a copy of the GNU General Public License
20
 * along with this program; if not, write to the Free Software
21
 * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
22
 */
23

    
24
#include "config.h"
25

    
26
#include <inttypes.h>
27

    
28
#include "a52.h"
29
#include "a52_internal.h"
30
#include "bitstream.h"
31

    
32
#define BUFFER_SIZE 4096
33

    
34
static uint32_t * buffer_start;
35

    
36
uint32_t a52_bits_left;
37
uint32_t a52_current_word;
38

    
39
void a52_bitstream_set_ptr (uint8_t * buf)
40
{
41
    int align;
42

    
43
    align = (long)buf & 3;
44
    buffer_start = (uint32_t *) (buf - align);
45
    a52_bits_left = 0;
46
    bitstream_get (align * 8);
47
}
48

    
49
static inline void
50
bitstream_fill_current()
51
{
52
    uint32_t tmp;
53

    
54
    tmp = *(buffer_start++);
55
    a52_current_word = swab32 (tmp);
56
}
57

    
58
/*
59
 * The fast paths for _get is in the
60
 * bitstream.h header file so it can be inlined.
61
 *
62
 * The "bottom half" of this routine is suffixed _bh
63
 *
64
 * -ah
65
 */
66

    
67
uint32_t
68
a52_bitstream_get_bh(uint32_t num_bits)
69
{
70
    uint32_t result;
71

    
72
    num_bits -= a52_bits_left;
73
    result = ((a52_current_word << (32 - a52_bits_left)) >>
74
              (32 - a52_bits_left));
75

    
76
    bitstream_fill_current();
77

    
78
    if(num_bits != 0)
79
        result = (result << num_bits) | (a52_current_word >> (32 - num_bits));
80

    
81
    a52_bits_left = 32 - num_bits;
82

    
83
    return result;
84
}
85

    
86
int32_t
87
a52_bitstream_get_bh_2(uint32_t num_bits)
88
{
89
    int32_t result;
90

    
91
    num_bits -= a52_bits_left;
92
    result = ((((int32_t)a52_current_word) << (32 - a52_bits_left)) >>
93
              (32 - a52_bits_left));
94

    
95
    bitstream_fill_current();
96

    
97
    if(num_bits != 0)
98
        result = (result << num_bits) | (a52_current_word >> (32 - num_bits));
99
        
100
    a52_bits_left = 32 - num_bits;
101

    
102
    return result;
103
}