annotate bitstream.c @ 4166:eced83504436 libavcodec

mp3 header (de)compression bitstream filter this will make mp3 frames 4 bytes smaller, it will not give you binary identical mp3 files, but it will give you mp3 files which decode to binary identical output this will only work in containers providing at least packet size, sample_rate and number of channels bugreports about mp3 files for which this fails are welcome and this is experimental (dont expect compatibility and dont even expect to be able to decompress what you compressed, hell dont even expect this to work without editing the source a little)
author michael
date Fri, 10 Nov 2006 01:41:53 +0000
parents c8c591fe26f8
children ad02fe65f45a
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
0
986e461dc072 Initial revision
glantau
parents:
diff changeset
1 /*
986e461dc072 Initial revision
glantau
parents:
diff changeset
2 * Common bit i/o utils
429
718a22dc121f license/copyright change
glantau
parents: 396
diff changeset
3 * Copyright (c) 2000, 2001 Fabrice Bellard.
1739
07a484280a82 copyright year update of the files i touched and remembered, things look annoyingly unmaintained otherwise
michael
parents: 1660
diff changeset
4 * Copyright (c) 2002-2004 Michael Niedermayer <michaelni@gmx.at>
0
986e461dc072 Initial revision
glantau
parents:
diff changeset
5 *
3947
c8c591fe26f8 Change license headers to say 'FFmpeg' instead of 'this program/this library'
diego
parents: 3648
diff changeset
6 * This file is part of FFmpeg.
c8c591fe26f8 Change license headers to say 'FFmpeg' instead of 'this program/this library'
diego
parents: 3648
diff changeset
7 *
c8c591fe26f8 Change license headers to say 'FFmpeg' instead of 'this program/this library'
diego
parents: 3648
diff changeset
8 * FFmpeg is free software; you can redistribute it and/or
429
718a22dc121f license/copyright change
glantau
parents: 396
diff changeset
9 * modify it under the terms of the GNU Lesser General Public
718a22dc121f license/copyright change
glantau
parents: 396
diff changeset
10 * License as published by the Free Software Foundation; either
3947
c8c591fe26f8 Change license headers to say 'FFmpeg' instead of 'this program/this library'
diego
parents: 3648
diff changeset
11 * version 2.1 of the License, or (at your option) any later version.
0
986e461dc072 Initial revision
glantau
parents:
diff changeset
12 *
3947
c8c591fe26f8 Change license headers to say 'FFmpeg' instead of 'this program/this library'
diego
parents: 3648
diff changeset
13 * FFmpeg is distributed in the hope that it will be useful,
0
986e461dc072 Initial revision
glantau
parents:
diff changeset
14 * but WITHOUT ANY WARRANTY; without even the implied warranty of
429
718a22dc121f license/copyright change
glantau
parents: 396
diff changeset
15 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
718a22dc121f license/copyright change
glantau
parents: 396
diff changeset
16 * Lesser General Public License for more details.
0
986e461dc072 Initial revision
glantau
parents:
diff changeset
17 *
429
718a22dc121f license/copyright change
glantau
parents: 396
diff changeset
18 * You should have received a copy of the GNU Lesser General Public
3947
c8c591fe26f8 Change license headers to say 'FFmpeg' instead of 'this program/this library'
diego
parents: 3648
diff changeset
19 * License along with FFmpeg; if not, write to the Free Software
3036
0b546eab515d Update licensing information: The FSF changed postal address.
diego
parents: 2979
diff changeset
20 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
192
1e5f64be86fc another bitstream reader code (faster on intel cpus) - patch by Michael Niedermayer <michaelni@gmx.at>
uid46427
parents: 144
diff changeset
21 *
234
5fc0c3af3fe4 alternative bitstream writer (disabled by default, uncomment #define ALT_BISTREAM_WRITER in common.h if u want to try it)
michaelni
parents: 219
diff changeset
22 * alternative bitstream reader & writer by Michael Niedermayer <michaelni@gmx.at>
0
986e461dc072 Initial revision
glantau
parents:
diff changeset
23 */
1106
1e39f273ecd6 per file doxy
michaelni
parents: 1083
diff changeset
24
1e39f273ecd6 per file doxy
michaelni
parents: 1083
diff changeset
25 /**
2398
582e635cfa08 common.c -> bitstream.c (and the single non bitstream func -> utils.c)
michael
parents: 2370
diff changeset
26 * @file bitstream.c
582e635cfa08 common.c -> bitstream.c (and the single non bitstream func -> utils.c)
michael
parents: 2370
diff changeset
27 * bitstream api.
1106
1e39f273ecd6 per file doxy
michaelni
parents: 1083
diff changeset
28 */
2967
ef2149182f1c COSMETICS: Remove all trailing whitespace.
diego
parents: 2885
diff changeset
29
524
3e579fbef701 * declare av_free
kabi
parents: 520
diff changeset
30 #include "avcodec.h"
2398
582e635cfa08 common.c -> bitstream.c (and the single non bitstream func -> utils.c)
michael
parents: 2370
diff changeset
31 #include "bitstream.h"
1037
44a230c11d83 optimizing av_log2
michaelni
parents: 1031
diff changeset
32
0
986e461dc072 Initial revision
glantau
parents:
diff changeset
33 void align_put_bits(PutBitContext *s)
986e461dc072 Initial revision
glantau
parents:
diff changeset
34 {
234
5fc0c3af3fe4 alternative bitstream writer (disabled by default, uncomment #define ALT_BISTREAM_WRITER in common.h if u want to try it)
michaelni
parents: 219
diff changeset
35 #ifdef ALT_BITSTREAM_WRITER
5fc0c3af3fe4 alternative bitstream writer (disabled by default, uncomment #define ALT_BISTREAM_WRITER in common.h if u want to try it)
michaelni
parents: 219
diff changeset
36 put_bits(s,( - s->index) & 7,0);
5fc0c3af3fe4 alternative bitstream writer (disabled by default, uncomment #define ALT_BISTREAM_WRITER in common.h if u want to try it)
michaelni
parents: 219
diff changeset
37 #else
238
99a9f903f0e3 optimized the normal bitstream writer, its faster than the alternative one on p3 now ... lets hope its at least not slower on p4 & k7
michaelni
parents: 234
diff changeset
38 put_bits(s,s->bit_left & 7,0);
234
5fc0c3af3fe4 alternative bitstream writer (disabled by default, uncomment #define ALT_BISTREAM_WRITER in common.h if u want to try it)
michaelni
parents: 219
diff changeset
39 #endif
0
986e461dc072 Initial revision
glantau
parents:
diff changeset
40 }
986e461dc072 Initial revision
glantau
parents:
diff changeset
41
2885
5dfb90019814 Rename put_string to ff_put_string to avoid a symbol clash on Mac OS X.
diego
parents: 2663
diff changeset
42 void ff_put_string(PutBitContext * pbc, char *s, int put_zero)
358
2066dc543be4 move put_string() to common.{c,h}
michaelni
parents: 324
diff changeset
43 {
2066dc543be4 move put_string() to common.{c,h}
michaelni
parents: 324
diff changeset
44 while(*s){
2066dc543be4 move put_string() to common.{c,h}
michaelni
parents: 324
diff changeset
45 put_bits(pbc, 8, *s);
2066dc543be4 move put_string() to common.{c,h}
michaelni
parents: 324
diff changeset
46 s++;
2066dc543be4 move put_string() to common.{c,h}
michaelni
parents: 324
diff changeset
47 }
1795
920e6381e1fe 2 byte shorter userdata for mpeg4
michael
parents: 1786
diff changeset
48 if(put_zero)
920e6381e1fe 2 byte shorter userdata for mpeg4
michael
parents: 1786
diff changeset
49 put_bits(pbc, 8, 0);
358
2066dc543be4 move put_string() to common.{c,h}
michaelni
parents: 324
diff changeset
50 }
2066dc543be4 move put_string() to common.{c,h}
michaelni
parents: 324
diff changeset
51
0
986e461dc072 Initial revision
glantau
parents:
diff changeset
52 /* VLC decoding */
986e461dc072 Initial revision
glantau
parents:
diff changeset
53
986e461dc072 Initial revision
glantau
parents:
diff changeset
54 //#define DEBUG_VLC
986e461dc072 Initial revision
glantau
parents:
diff changeset
55
986e461dc072 Initial revision
glantau
parents:
diff changeset
56 #define GET_DATA(v, table, i, wrap, size) \
986e461dc072 Initial revision
glantau
parents:
diff changeset
57 {\
1064
b32afefe7d33 * UINTX -> uintx_t INTX -> intx_t
kabi
parents: 1057
diff changeset
58 const uint8_t *ptr = (const uint8_t *)table + i * wrap;\
0
986e461dc072 Initial revision
glantau
parents:
diff changeset
59 switch(size) {\
986e461dc072 Initial revision
glantau
parents:
diff changeset
60 case 1:\
1064
b32afefe7d33 * UINTX -> uintx_t INTX -> intx_t
kabi
parents: 1057
diff changeset
61 v = *(const uint8_t *)ptr;\
0
986e461dc072 Initial revision
glantau
parents:
diff changeset
62 break;\
986e461dc072 Initial revision
glantau
parents:
diff changeset
63 case 2:\
1064
b32afefe7d33 * UINTX -> uintx_t INTX -> intx_t
kabi
parents: 1057
diff changeset
64 v = *(const uint16_t *)ptr;\
0
986e461dc072 Initial revision
glantau
parents:
diff changeset
65 break;\
986e461dc072 Initial revision
glantau
parents:
diff changeset
66 default:\
1064
b32afefe7d33 * UINTX -> uintx_t INTX -> intx_t
kabi
parents: 1057
diff changeset
67 v = *(const uint32_t *)ptr;\
0
986e461dc072 Initial revision
glantau
parents:
diff changeset
68 break;\
986e461dc072 Initial revision
glantau
parents:
diff changeset
69 }\
986e461dc072 Initial revision
glantau
parents:
diff changeset
70 }
986e461dc072 Initial revision
glantau
parents:
diff changeset
71
986e461dc072 Initial revision
glantau
parents:
diff changeset
72
2370
26560d4fdb1f Memory leak fix patch by (Burkhard Plaum <plaum >at< ipf.uni-stuttgart )dot( de>)
michael
parents: 2281
diff changeset
73 static int alloc_table(VLC *vlc, int size, int use_static)
0
986e461dc072 Initial revision
glantau
parents:
diff changeset
74 {
986e461dc072 Initial revision
glantau
parents:
diff changeset
75 int index;
986e461dc072 Initial revision
glantau
parents:
diff changeset
76 index = vlc->table_size;
986e461dc072 Initial revision
glantau
parents:
diff changeset
77 vlc->table_size += size;
986e461dc072 Initial revision
glantau
parents:
diff changeset
78 if (vlc->table_size > vlc->table_allocated) {
986e461dc072 Initial revision
glantau
parents:
diff changeset
79 vlc->table_allocated += (1 << vlc->bits);
2370
26560d4fdb1f Memory leak fix patch by (Burkhard Plaum <plaum >at< ipf.uni-stuttgart )dot( de>)
michael
parents: 2281
diff changeset
80 if(use_static)
26560d4fdb1f Memory leak fix patch by (Burkhard Plaum <plaum >at< ipf.uni-stuttgart )dot( de>)
michael
parents: 2281
diff changeset
81 vlc->table = av_realloc_static(vlc->table,
26560d4fdb1f Memory leak fix patch by (Burkhard Plaum <plaum >at< ipf.uni-stuttgart )dot( de>)
michael
parents: 2281
diff changeset
82 sizeof(VLC_TYPE) * 2 * vlc->table_allocated);
26560d4fdb1f Memory leak fix patch by (Burkhard Plaum <plaum >at< ipf.uni-stuttgart )dot( de>)
michael
parents: 2281
diff changeset
83 else
26560d4fdb1f Memory leak fix patch by (Burkhard Plaum <plaum >at< ipf.uni-stuttgart )dot( de>)
michael
parents: 2281
diff changeset
84 vlc->table = av_realloc(vlc->table,
26560d4fdb1f Memory leak fix patch by (Burkhard Plaum <plaum >at< ipf.uni-stuttgart )dot( de>)
michael
parents: 2281
diff changeset
85 sizeof(VLC_TYPE) * 2 * vlc->table_allocated);
520
19a5e2a81e1a new bitstream reader API (old get_bits() based one is emulated and will still be supported in the future cuz its simpler)
michaelni
parents: 497
diff changeset
86 if (!vlc->table)
0
986e461dc072 Initial revision
glantau
parents:
diff changeset
87 return -1;
986e461dc072 Initial revision
glantau
parents:
diff changeset
88 }
986e461dc072 Initial revision
glantau
parents:
diff changeset
89 return index;
986e461dc072 Initial revision
glantau
parents:
diff changeset
90 }
986e461dc072 Initial revision
glantau
parents:
diff changeset
91
520
19a5e2a81e1a new bitstream reader API (old get_bits() based one is emulated and will still be supported in the future cuz its simpler)
michaelni
parents: 497
diff changeset
92 static int build_table(VLC *vlc, int table_nb_bits,
0
986e461dc072 Initial revision
glantau
parents:
diff changeset
93 int nb_codes,
986e461dc072 Initial revision
glantau
parents:
diff changeset
94 const void *bits, int bits_wrap, int bits_size,
986e461dc072 Initial revision
glantau
parents:
diff changeset
95 const void *codes, int codes_wrap, int codes_size,
2663
b33be8b00488 LE bitstream reader based upon a patch by (Balatoni Denes <dbalatoni programozo hu)
michael
parents: 2398
diff changeset
96 uint32_t code_prefix, int n_prefix, int flags)
0
986e461dc072 Initial revision
glantau
parents:
diff changeset
97 {
2663
b33be8b00488 LE bitstream reader based upon a patch by (Balatoni Denes <dbalatoni programozo hu)
michael
parents: 2398
diff changeset
98 int i, j, k, n, table_size, table_index, nb, n1, index, code_prefix2;
1064
b32afefe7d33 * UINTX -> uintx_t INTX -> intx_t
kabi
parents: 1057
diff changeset
99 uint32_t code;
520
19a5e2a81e1a new bitstream reader API (old get_bits() based one is emulated and will still be supported in the future cuz its simpler)
michaelni
parents: 497
diff changeset
100 VLC_TYPE (*table)[2];
0
986e461dc072 Initial revision
glantau
parents:
diff changeset
101
986e461dc072 Initial revision
glantau
parents:
diff changeset
102 table_size = 1 << table_nb_bits;
2663
b33be8b00488 LE bitstream reader based upon a patch by (Balatoni Denes <dbalatoni programozo hu)
michael
parents: 2398
diff changeset
103 table_index = alloc_table(vlc, table_size, flags & INIT_VLC_USE_STATIC);
0
986e461dc072 Initial revision
glantau
parents:
diff changeset
104 #ifdef DEBUG_VLC
520
19a5e2a81e1a new bitstream reader API (old get_bits() based one is emulated and will still be supported in the future cuz its simpler)
michaelni
parents: 497
diff changeset
105 printf("new table index=%d size=%d code_prefix=%x n=%d\n",
0
986e461dc072 Initial revision
glantau
parents:
diff changeset
106 table_index, table_size, code_prefix, n_prefix);
986e461dc072 Initial revision
glantau
parents:
diff changeset
107 #endif
986e461dc072 Initial revision
glantau
parents:
diff changeset
108 if (table_index < 0)
986e461dc072 Initial revision
glantau
parents:
diff changeset
109 return -1;
520
19a5e2a81e1a new bitstream reader API (old get_bits() based one is emulated and will still be supported in the future cuz its simpler)
michaelni
parents: 497
diff changeset
110 table = &vlc->table[table_index];
0
986e461dc072 Initial revision
glantau
parents:
diff changeset
111
986e461dc072 Initial revision
glantau
parents:
diff changeset
112 for(i=0;i<table_size;i++) {
520
19a5e2a81e1a new bitstream reader API (old get_bits() based one is emulated and will still be supported in the future cuz its simpler)
michaelni
parents: 497
diff changeset
113 table[i][1] = 0; //bits
19a5e2a81e1a new bitstream reader API (old get_bits() based one is emulated and will still be supported in the future cuz its simpler)
michaelni
parents: 497
diff changeset
114 table[i][0] = -1; //codes
0
986e461dc072 Initial revision
glantau
parents:
diff changeset
115 }
986e461dc072 Initial revision
glantau
parents:
diff changeset
116
986e461dc072 Initial revision
glantau
parents:
diff changeset
117 /* first pass: map codes and compute auxillary table sizes */
986e461dc072 Initial revision
glantau
parents:
diff changeset
118 for(i=0;i<nb_codes;i++) {
986e461dc072 Initial revision
glantau
parents:
diff changeset
119 GET_DATA(n, bits, i, bits_wrap, bits_size);
986e461dc072 Initial revision
glantau
parents:
diff changeset
120 GET_DATA(code, codes, i, codes_wrap, codes_size);
986e461dc072 Initial revision
glantau
parents:
diff changeset
121 /* we accept tables with holes */
986e461dc072 Initial revision
glantau
parents:
diff changeset
122 if (n <= 0)
986e461dc072 Initial revision
glantau
parents:
diff changeset
123 continue;
986e461dc072 Initial revision
glantau
parents:
diff changeset
124 #if defined(DEBUG_VLC) && 0
986e461dc072 Initial revision
glantau
parents:
diff changeset
125 printf("i=%d n=%d code=0x%x\n", i, n, code);
986e461dc072 Initial revision
glantau
parents:
diff changeset
126 #endif
986e461dc072 Initial revision
glantau
parents:
diff changeset
127 /* if code matches the prefix, it is in the table */
986e461dc072 Initial revision
glantau
parents:
diff changeset
128 n -= n_prefix;
2663
b33be8b00488 LE bitstream reader based upon a patch by (Balatoni Denes <dbalatoni programozo hu)
michael
parents: 2398
diff changeset
129 if(flags & INIT_VLC_LE)
b33be8b00488 LE bitstream reader based upon a patch by (Balatoni Denes <dbalatoni programozo hu)
michael
parents: 2398
diff changeset
130 code_prefix2= code & (n_prefix>=32 ? 0xffffffff : (1 << n_prefix)-1);
b33be8b00488 LE bitstream reader based upon a patch by (Balatoni Denes <dbalatoni programozo hu)
michael
parents: 2398
diff changeset
131 else
b33be8b00488 LE bitstream reader based upon a patch by (Balatoni Denes <dbalatoni programozo hu)
michael
parents: 2398
diff changeset
132 code_prefix2= code >> n;
b33be8b00488 LE bitstream reader based upon a patch by (Balatoni Denes <dbalatoni programozo hu)
michael
parents: 2398
diff changeset
133 if (n > 0 && code_prefix2 == code_prefix) {
0
986e461dc072 Initial revision
glantau
parents:
diff changeset
134 if (n <= table_nb_bits) {
986e461dc072 Initial revision
glantau
parents:
diff changeset
135 /* no need to add another table */
986e461dc072 Initial revision
glantau
parents:
diff changeset
136 j = (code << (table_nb_bits - n)) & (table_size - 1);
986e461dc072 Initial revision
glantau
parents:
diff changeset
137 nb = 1 << (table_nb_bits - n);
986e461dc072 Initial revision
glantau
parents:
diff changeset
138 for(k=0;k<nb;k++) {
2663
b33be8b00488 LE bitstream reader based upon a patch by (Balatoni Denes <dbalatoni programozo hu)
michael
parents: 2398
diff changeset
139 if(flags & INIT_VLC_LE)
b33be8b00488 LE bitstream reader based upon a patch by (Balatoni Denes <dbalatoni programozo hu)
michael
parents: 2398
diff changeset
140 j = (code >> n_prefix) + (k<<n);
0
986e461dc072 Initial revision
glantau
parents:
diff changeset
141 #ifdef DEBUG_VLC
1602
fdb8244da1e5 av_log patch(2 of ?) by (Michel Bardiaux <mbardiaux at peaktime dot be>)
michael
parents: 1598
diff changeset
142 av_log(NULL, AV_LOG_DEBUG, "%4x: code=%d n=%d\n",
0
986e461dc072 Initial revision
glantau
parents:
diff changeset
143 j, i, n);
986e461dc072 Initial revision
glantau
parents:
diff changeset
144 #endif
520
19a5e2a81e1a new bitstream reader API (old get_bits() based one is emulated and will still be supported in the future cuz its simpler)
michaelni
parents: 497
diff changeset
145 if (table[j][1] /*bits*/ != 0) {
1598
932d306bf1dc av_log() patch by (Michel Bardiaux <mbardiaux at peaktime dot be>)
michael
parents: 1548
diff changeset
146 av_log(NULL, AV_LOG_ERROR, "incorrect codes\n");
2281
7b345b735ac7 do not call (av_)abort()
michael
parents: 1875
diff changeset
147 return -1;
0
986e461dc072 Initial revision
glantau
parents:
diff changeset
148 }
520
19a5e2a81e1a new bitstream reader API (old get_bits() based one is emulated and will still be supported in the future cuz its simpler)
michaelni
parents: 497
diff changeset
149 table[j][1] = n; //bits
19a5e2a81e1a new bitstream reader API (old get_bits() based one is emulated and will still be supported in the future cuz its simpler)
michaelni
parents: 497
diff changeset
150 table[j][0] = i; //code
0
986e461dc072 Initial revision
glantau
parents:
diff changeset
151 j++;
986e461dc072 Initial revision
glantau
parents:
diff changeset
152 }
986e461dc072 Initial revision
glantau
parents:
diff changeset
153 } else {
986e461dc072 Initial revision
glantau
parents:
diff changeset
154 n -= table_nb_bits;
2663
b33be8b00488 LE bitstream reader based upon a patch by (Balatoni Denes <dbalatoni programozo hu)
michael
parents: 2398
diff changeset
155 j = (code >> ((flags & INIT_VLC_LE) ? n_prefix : n)) & ((1 << table_nb_bits) - 1);
0
986e461dc072 Initial revision
glantau
parents:
diff changeset
156 #ifdef DEBUG_VLC
986e461dc072 Initial revision
glantau
parents:
diff changeset
157 printf("%4x: n=%d (subtable)\n",
986e461dc072 Initial revision
glantau
parents:
diff changeset
158 j, n);
986e461dc072 Initial revision
glantau
parents:
diff changeset
159 #endif
986e461dc072 Initial revision
glantau
parents:
diff changeset
160 /* compute table size */
520
19a5e2a81e1a new bitstream reader API (old get_bits() based one is emulated and will still be supported in the future cuz its simpler)
michaelni
parents: 497
diff changeset
161 n1 = -table[j][1]; //bits
0
986e461dc072 Initial revision
glantau
parents:
diff changeset
162 if (n > n1)
986e461dc072 Initial revision
glantau
parents:
diff changeset
163 n1 = n;
520
19a5e2a81e1a new bitstream reader API (old get_bits() based one is emulated and will still be supported in the future cuz its simpler)
michaelni
parents: 497
diff changeset
164 table[j][1] = -n1; //bits
0
986e461dc072 Initial revision
glantau
parents:
diff changeset
165 }
986e461dc072 Initial revision
glantau
parents:
diff changeset
166 }
986e461dc072 Initial revision
glantau
parents:
diff changeset
167 }
986e461dc072 Initial revision
glantau
parents:
diff changeset
168
986e461dc072 Initial revision
glantau
parents:
diff changeset
169 /* second pass : fill auxillary tables recursively */
986e461dc072 Initial revision
glantau
parents:
diff changeset
170 for(i=0;i<table_size;i++) {
520
19a5e2a81e1a new bitstream reader API (old get_bits() based one is emulated and will still be supported in the future cuz its simpler)
michaelni
parents: 497
diff changeset
171 n = table[i][1]; //bits
0
986e461dc072 Initial revision
glantau
parents:
diff changeset
172 if (n < 0) {
986e461dc072 Initial revision
glantau
parents:
diff changeset
173 n = -n;
986e461dc072 Initial revision
glantau
parents:
diff changeset
174 if (n > table_nb_bits) {
986e461dc072 Initial revision
glantau
parents:
diff changeset
175 n = table_nb_bits;
520
19a5e2a81e1a new bitstream reader API (old get_bits() based one is emulated and will still be supported in the future cuz its simpler)
michaelni
parents: 497
diff changeset
176 table[i][1] = -n; //bits
0
986e461dc072 Initial revision
glantau
parents:
diff changeset
177 }
986e461dc072 Initial revision
glantau
parents:
diff changeset
178 index = build_table(vlc, n, nb_codes,
986e461dc072 Initial revision
glantau
parents:
diff changeset
179 bits, bits_wrap, bits_size,
986e461dc072 Initial revision
glantau
parents:
diff changeset
180 codes, codes_wrap, codes_size,
2663
b33be8b00488 LE bitstream reader based upon a patch by (Balatoni Denes <dbalatoni programozo hu)
michael
parents: 2398
diff changeset
181 (flags & INIT_VLC_LE) ? (code_prefix | (i << n_prefix)) : ((code_prefix << table_nb_bits) | i),
b33be8b00488 LE bitstream reader based upon a patch by (Balatoni Denes <dbalatoni programozo hu)
michael
parents: 2398
diff changeset
182 n_prefix + table_nb_bits, flags);
0
986e461dc072 Initial revision
glantau
parents:
diff changeset
183 if (index < 0)
986e461dc072 Initial revision
glantau
parents:
diff changeset
184 return -1;
986e461dc072 Initial revision
glantau
parents:
diff changeset
185 /* note: realloc has been done, so reload tables */
520
19a5e2a81e1a new bitstream reader API (old get_bits() based one is emulated and will still be supported in the future cuz its simpler)
michaelni
parents: 497
diff changeset
186 table = &vlc->table[table_index];
535
7f1b09bb34c6 dont trash table in GET_VLC
michaelni
parents: 529
diff changeset
187 table[i][0] = index; //code
0
986e461dc072 Initial revision
glantau
parents:
diff changeset
188 }
986e461dc072 Initial revision
glantau
parents:
diff changeset
189 }
986e461dc072 Initial revision
glantau
parents:
diff changeset
190 return table_index;
986e461dc072 Initial revision
glantau
parents:
diff changeset
191 }
986e461dc072 Initial revision
glantau
parents:
diff changeset
192
986e461dc072 Initial revision
glantau
parents:
diff changeset
193
24
08265a63313e added MJPEG decoder + comments
glantau
parents: 20
diff changeset
194 /* Build VLC decoding tables suitable for use with get_vlc().
08265a63313e added MJPEG decoder + comments
glantau
parents: 20
diff changeset
195
08265a63313e added MJPEG decoder + comments
glantau
parents: 20
diff changeset
196 'nb_bits' set thee decoding table size (2^nb_bits) entries. The
08265a63313e added MJPEG decoder + comments
glantau
parents: 20
diff changeset
197 bigger it is, the faster is the decoding. But it should not be too
08265a63313e added MJPEG decoder + comments
glantau
parents: 20
diff changeset
198 big to save memory and L1 cache. '9' is a good compromise.
2967
ef2149182f1c COSMETICS: Remove all trailing whitespace.
diego
parents: 2885
diff changeset
199
24
08265a63313e added MJPEG decoder + comments
glantau
parents: 20
diff changeset
200 'nb_codes' : number of vlcs codes
08265a63313e added MJPEG decoder + comments
glantau
parents: 20
diff changeset
201
08265a63313e added MJPEG decoder + comments
glantau
parents: 20
diff changeset
202 'bits' : table which gives the size (in bits) of each vlc code.
08265a63313e added MJPEG decoder + comments
glantau
parents: 20
diff changeset
203
08265a63313e added MJPEG decoder + comments
glantau
parents: 20
diff changeset
204 'codes' : table which gives the bit pattern of of each vlc code.
08265a63313e added MJPEG decoder + comments
glantau
parents: 20
diff changeset
205
08265a63313e added MJPEG decoder + comments
glantau
parents: 20
diff changeset
206 'xxx_wrap' : give the number of bytes between each entry of the
08265a63313e added MJPEG decoder + comments
glantau
parents: 20
diff changeset
207 'bits' or 'codes' tables.
08265a63313e added MJPEG decoder + comments
glantau
parents: 20
diff changeset
208
08265a63313e added MJPEG decoder + comments
glantau
parents: 20
diff changeset
209 'xxx_size' : gives the number of bytes of each entry of the 'bits'
08265a63313e added MJPEG decoder + comments
glantau
parents: 20
diff changeset
210 or 'codes' tables.
08265a63313e added MJPEG decoder + comments
glantau
parents: 20
diff changeset
211
08265a63313e added MJPEG decoder + comments
glantau
parents: 20
diff changeset
212 'wrap' and 'size' allows to use any memory configuration and types
2967
ef2149182f1c COSMETICS: Remove all trailing whitespace.
diego
parents: 2885
diff changeset
213 (byte/word/long) to store the 'bits' and 'codes' tables.
2370
26560d4fdb1f Memory leak fix patch by (Burkhard Plaum <plaum >at< ipf.uni-stuttgart )dot( de>)
michael
parents: 2281
diff changeset
214
26560d4fdb1f Memory leak fix patch by (Burkhard Plaum <plaum >at< ipf.uni-stuttgart )dot( de>)
michael
parents: 2281
diff changeset
215 'use_static' should be set to 1 for tables, which should be freed
26560d4fdb1f Memory leak fix patch by (Burkhard Plaum <plaum >at< ipf.uni-stuttgart )dot( de>)
michael
parents: 2281
diff changeset
216 with av_free_static(), 0 if free_vlc() will be used.
24
08265a63313e added MJPEG decoder + comments
glantau
parents: 20
diff changeset
217 */
0
986e461dc072 Initial revision
glantau
parents:
diff changeset
218 int init_vlc(VLC *vlc, int nb_bits, int nb_codes,
986e461dc072 Initial revision
glantau
parents:
diff changeset
219 const void *bits, int bits_wrap, int bits_size,
2370
26560d4fdb1f Memory leak fix patch by (Burkhard Plaum <plaum >at< ipf.uni-stuttgart )dot( de>)
michael
parents: 2281
diff changeset
220 const void *codes, int codes_wrap, int codes_size,
26560d4fdb1f Memory leak fix patch by (Burkhard Plaum <plaum >at< ipf.uni-stuttgart )dot( de>)
michael
parents: 2281
diff changeset
221 int use_static)
0
986e461dc072 Initial revision
glantau
parents:
diff changeset
222 {
986e461dc072 Initial revision
glantau
parents:
diff changeset
223 vlc->bits = nb_bits;
2370
26560d4fdb1f Memory leak fix patch by (Burkhard Plaum <plaum >at< ipf.uni-stuttgart )dot( de>)
michael
parents: 2281
diff changeset
224 if(!use_static) {
26560d4fdb1f Memory leak fix patch by (Burkhard Plaum <plaum >at< ipf.uni-stuttgart )dot( de>)
michael
parents: 2281
diff changeset
225 vlc->table = NULL;
26560d4fdb1f Memory leak fix patch by (Burkhard Plaum <plaum >at< ipf.uni-stuttgart )dot( de>)
michael
parents: 2281
diff changeset
226 vlc->table_allocated = 0;
26560d4fdb1f Memory leak fix patch by (Burkhard Plaum <plaum >at< ipf.uni-stuttgart )dot( de>)
michael
parents: 2281
diff changeset
227 vlc->table_size = 0;
26560d4fdb1f Memory leak fix patch by (Burkhard Plaum <plaum >at< ipf.uni-stuttgart )dot( de>)
michael
parents: 2281
diff changeset
228 } else {
26560d4fdb1f Memory leak fix patch by (Burkhard Plaum <plaum >at< ipf.uni-stuttgart )dot( de>)
michael
parents: 2281
diff changeset
229 /* Static tables are initially always NULL, return
26560d4fdb1f Memory leak fix patch by (Burkhard Plaum <plaum >at< ipf.uni-stuttgart )dot( de>)
michael
parents: 2281
diff changeset
230 if vlc->table != NULL to avoid double allocation */
26560d4fdb1f Memory leak fix patch by (Burkhard Plaum <plaum >at< ipf.uni-stuttgart )dot( de>)
michael
parents: 2281
diff changeset
231 if(vlc->table)
26560d4fdb1f Memory leak fix patch by (Burkhard Plaum <plaum >at< ipf.uni-stuttgart )dot( de>)
michael
parents: 2281
diff changeset
232 return 0;
26560d4fdb1f Memory leak fix patch by (Burkhard Plaum <plaum >at< ipf.uni-stuttgart )dot( de>)
michael
parents: 2281
diff changeset
233 }
26560d4fdb1f Memory leak fix patch by (Burkhard Plaum <plaum >at< ipf.uni-stuttgart )dot( de>)
michael
parents: 2281
diff changeset
234
0
986e461dc072 Initial revision
glantau
parents:
diff changeset
235 #ifdef DEBUG_VLC
986e461dc072 Initial revision
glantau
parents:
diff changeset
236 printf("build table nb_codes=%d\n", nb_codes);
986e461dc072 Initial revision
glantau
parents:
diff changeset
237 #endif
986e461dc072 Initial revision
glantau
parents:
diff changeset
238
986e461dc072 Initial revision
glantau
parents:
diff changeset
239 if (build_table(vlc, nb_bits, nb_codes,
986e461dc072 Initial revision
glantau
parents:
diff changeset
240 bits, bits_wrap, bits_size,
986e461dc072 Initial revision
glantau
parents:
diff changeset
241 codes, codes_wrap, codes_size,
2370
26560d4fdb1f Memory leak fix patch by (Burkhard Plaum <plaum >at< ipf.uni-stuttgart )dot( de>)
michael
parents: 2281
diff changeset
242 0, 0, use_static) < 0) {
520
19a5e2a81e1a new bitstream reader API (old get_bits() based one is emulated and will still be supported in the future cuz its simpler)
michaelni
parents: 497
diff changeset
243 av_free(vlc->table);
0
986e461dc072 Initial revision
glantau
parents:
diff changeset
244 return -1;
986e461dc072 Initial revision
glantau
parents:
diff changeset
245 }
986e461dc072 Initial revision
glantau
parents:
diff changeset
246 return 0;
986e461dc072 Initial revision
glantau
parents:
diff changeset
247 }
986e461dc072 Initial revision
glantau
parents:
diff changeset
248
986e461dc072 Initial revision
glantau
parents:
diff changeset
249
986e461dc072 Initial revision
glantau
parents:
diff changeset
250 void free_vlc(VLC *vlc)
986e461dc072 Initial revision
glantau
parents:
diff changeset
251 {
520
19a5e2a81e1a new bitstream reader API (old get_bits() based one is emulated and will still be supported in the future cuz its simpler)
michaelni
parents: 497
diff changeset
252 av_free(vlc->table);
0
986e461dc072 Initial revision
glantau
parents:
diff changeset
253 }
986e461dc072 Initial revision
glantau
parents:
diff changeset
254