Subversion Repositories Kolibri OS

Rev

Go to most recent revision | Details | Last modification | View Log | RSS feed

Rev Author Line No. Line
4349 Serge 1
/*
2
 * exp golomb vlc stuff
3
 * Copyright (c) 2003 Michael Niedermayer 
4
 * Copyright (c) 2004 Alex Beregszaszi
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
 * @brief
26
 *     exp golomb vlc stuff
27
 * @author Michael Niedermayer  and Alex Beregszaszi
28
 */
29
 
30
#ifndef AVCODEC_GOLOMB_H
31
#define AVCODEC_GOLOMB_H
32
 
33
#include 
34
 
35
#include "get_bits.h"
36
#include "put_bits.h"
37
 
38
#define INVALID_VLC           0x80000000
39
 
40
extern const uint8_t ff_golomb_vlc_len[512];
41
extern const uint8_t ff_ue_golomb_vlc_code[512];
42
extern const  int8_t ff_se_golomb_vlc_code[512];
43
extern const uint8_t ff_ue_golomb_len[256];
44
 
45
extern const uint8_t ff_interleaved_golomb_vlc_len[256];
46
extern const uint8_t ff_interleaved_ue_golomb_vlc_code[256];
47
extern const  int8_t ff_interleaved_se_golomb_vlc_code[256];
48
extern const uint8_t ff_interleaved_dirac_golomb_vlc_code[256];
49
 
50
/**
51
 * read unsigned exp golomb code.
52
 */
53
static inline int get_ue_golomb(GetBitContext *gb)
54
{
55
    unsigned int buf;
56
 
57
    OPEN_READER(re, gb);
58
    UPDATE_CACHE(re, gb);
59
    buf = GET_CACHE(re, gb);
60
 
61
    if (buf >= (1 << 27)) {
62
        buf >>= 32 - 9;
63
        LAST_SKIP_BITS(re, gb, ff_golomb_vlc_len[buf]);
64
        CLOSE_READER(re, gb);
65
 
66
        return ff_ue_golomb_vlc_code[buf];
67
    } else {
68
        int log = 2 * av_log2(buf) - 31;
69
        LAST_SKIP_BITS(re, gb, 32 - log);
70
        CLOSE_READER(re, gb);
71
        if (CONFIG_FTRAPV && log < 0) {
72
            av_log(0, AV_LOG_ERROR, "Invalid UE golomb code\n");
73
            return AVERROR_INVALIDDATA;
74
        }
75
        buf >>= log;
76
        buf--;
77
 
78
        return buf;
79
    }
80
}
81
 
82
/**
83
 * Read an unsigned Exp-Golomb code in the range 0 to UINT32_MAX-1.
84
 */
85
static inline unsigned get_ue_golomb_long(GetBitContext *gb)
86
{
87
    unsigned buf, log;
88
 
89
    buf = show_bits_long(gb, 32);
90
    log = 31 - av_log2(buf);
91
    skip_bits_long(gb, log);
92
 
93
    return get_bits_long(gb, log + 1) - 1;
94
}
95
 
96
/**
97
 * read unsigned exp golomb code, constraint to a max of 31.
98
 * the return value is undefined if the stored value exceeds 31.
99
 */
100
static inline int get_ue_golomb_31(GetBitContext *gb)
101
{
102
    unsigned int buf;
103
 
104
    OPEN_READER(re, gb);
105
    UPDATE_CACHE(re, gb);
106
    buf = GET_CACHE(re, gb);
107
 
108
    buf >>= 32 - 9;
109
    LAST_SKIP_BITS(re, gb, ff_golomb_vlc_len[buf]);
110
    CLOSE_READER(re, gb);
111
 
112
    return ff_ue_golomb_vlc_code[buf];
113
}
114
 
115
static inline unsigned svq3_get_ue_golomb(GetBitContext *gb)
116
{
117
    uint32_t buf;
118
 
119
    OPEN_READER(re, gb);
120
    UPDATE_CACHE(re, gb);
121
    buf = GET_CACHE(re, gb);
122
 
123
    if (buf & 0xAA800000) {
124
        buf >>= 32 - 8;
125
        LAST_SKIP_BITS(re, gb, ff_interleaved_golomb_vlc_len[buf]);
126
        CLOSE_READER(re, gb);
127
 
128
        return ff_interleaved_ue_golomb_vlc_code[buf];
129
    } else {
130
        unsigned ret = 1;
131
 
132
        do {
133
            buf >>= 32 - 8;
134
            LAST_SKIP_BITS(re, gb,
135
                           FFMIN(ff_interleaved_golomb_vlc_len[buf], 8));
136
 
137
            if (ff_interleaved_golomb_vlc_len[buf] != 9) {
138
                ret <<= (ff_interleaved_golomb_vlc_len[buf] - 1) >> 1;
139
                ret  |= ff_interleaved_dirac_golomb_vlc_code[buf];
140
                break;
141
            }
142
            ret = (ret << 4) | ff_interleaved_dirac_golomb_vlc_code[buf];
143
            UPDATE_CACHE(re, gb);
144
            buf = GET_CACHE(re, gb);
145
        } while (ret<0x8000000U && HAVE_BITS_REMAINING(re, gb));
146
 
147
        CLOSE_READER(re, gb);
148
        return ret - 1;
149
    }
150
}
151
 
152
/**
153
 * read unsigned truncated exp golomb code.
154
 */
155
static inline int get_te0_golomb(GetBitContext *gb, int range)
156
{
157
    av_assert2(range >= 1);
158
 
159
    if (range == 1)
160
        return 0;
161
    else if (range == 2)
162
        return get_bits1(gb) ^ 1;
163
    else
164
        return get_ue_golomb(gb);
165
}
166
 
167
/**
168
 * read unsigned truncated exp golomb code.
169
 */
170
static inline int get_te_golomb(GetBitContext *gb, int range)
171
{
172
    av_assert2(range >= 1);
173
 
174
    if (range == 2)
175
        return get_bits1(gb) ^ 1;
176
    else
177
        return get_ue_golomb(gb);
178
}
179
 
180
/**
181
 * read signed exp golomb code.
182
 */
183
static inline int get_se_golomb(GetBitContext *gb)
184
{
185
    unsigned int buf;
186
 
187
    OPEN_READER(re, gb);
188
    UPDATE_CACHE(re, gb);
189
    buf = GET_CACHE(re, gb);
190
 
191
    if (buf >= (1 << 27)) {
192
        buf >>= 32 - 9;
193
        LAST_SKIP_BITS(re, gb, ff_golomb_vlc_len[buf]);
194
        CLOSE_READER(re, gb);
195
 
196
        return ff_se_golomb_vlc_code[buf];
197
    } else {
198
        int log = av_log2(buf);
199
        LAST_SKIP_BITS(re, gb, 31 - log);
200
        UPDATE_CACHE(re, gb);
201
        buf = GET_CACHE(re, gb);
202
 
203
        buf >>= log;
204
 
205
        LAST_SKIP_BITS(re, gb, 32 - log);
206
        CLOSE_READER(re, gb);
207
 
208
        if (buf & 1)
209
            buf = -(buf >> 1);
210
        else
211
            buf = (buf >> 1);
212
 
213
        return buf;
214
    }
215
}
216
 
217
static inline int svq3_get_se_golomb(GetBitContext *gb)
218
{
219
    unsigned int buf;
220
 
221
    OPEN_READER(re, gb);
222
    UPDATE_CACHE(re, gb);
223
    buf = GET_CACHE(re, gb);
224
 
225
    if (buf & 0xAA800000) {
226
        buf >>= 32 - 8;
227
        LAST_SKIP_BITS(re, gb, ff_interleaved_golomb_vlc_len[buf]);
228
        CLOSE_READER(re, gb);
229
 
230
        return ff_interleaved_se_golomb_vlc_code[buf];
231
    } else {
232
        int log;
233
        LAST_SKIP_BITS(re, gb, 8);
234
        UPDATE_CACHE(re, gb);
235
        buf |= 1 | (GET_CACHE(re, gb) >> 8);
236
 
237
        if ((buf & 0xAAAAAAAA) == 0)
238
            return INVALID_VLC;
239
 
240
        for (log = 31; (buf & 0x80000000) == 0; log--)
241
            buf = (buf << 2) - ((buf << log) >> (log - 1)) + (buf >> 30);
242
 
243
        LAST_SKIP_BITS(re, gb, 63 - 2 * log - 8);
244
        CLOSE_READER(re, gb);
245
 
246
        return (signed) (((((buf << log) >> log) - 1) ^ -(buf & 0x1)) + 1) >> 1;
247
    }
248
}
249
 
250
static inline int dirac_get_se_golomb(GetBitContext *gb)
251
{
252
    uint32_t ret = svq3_get_ue_golomb(gb);
253
 
254
    if (ret) {
255
        uint32_t buf;
256
        OPEN_READER(re, gb);
257
        UPDATE_CACHE(re, gb);
258
        buf = SHOW_SBITS(re, gb, 1);
259
        LAST_SKIP_BITS(re, gb, 1);
260
        ret = (ret ^ buf) - buf;
261
        CLOSE_READER(re, gb);
262
    }
263
 
264
    return ret;
265
}
266
 
267
/**
268
 * read unsigned golomb rice code (ffv1).
269
 */
270
static inline int get_ur_golomb(GetBitContext *gb, int k, int limit,
271
                                int esc_len)
272
{
273
    unsigned int buf;
274
    int log;
275
 
276
    OPEN_READER(re, gb);
277
    UPDATE_CACHE(re, gb);
278
    buf = GET_CACHE(re, gb);
279
 
280
    log = av_log2(buf);
281
 
282
    if (log > 31 - limit) {
283
        buf >>= log - k;
284
        buf  += (30 - log) << k;
285
        LAST_SKIP_BITS(re, gb, 32 + k - log);
286
        CLOSE_READER(re, gb);
287
 
288
        return buf;
289
    } else {
290
        LAST_SKIP_BITS(re, gb, limit);
291
        UPDATE_CACHE(re, gb);
292
 
293
        buf = SHOW_UBITS(re, gb, esc_len);
294
 
295
        LAST_SKIP_BITS(re, gb, esc_len);
296
        CLOSE_READER(re, gb);
297
 
298
        return buf + limit - 1;
299
    }
300
}
301
 
302
/**
303
 * read unsigned golomb rice code (jpegls).
304
 */
305
static inline int get_ur_golomb_jpegls(GetBitContext *gb, int k, int limit,
306
                                       int esc_len)
307
{
308
    unsigned int buf;
309
    int log;
310
 
311
    OPEN_READER(re, gb);
312
    UPDATE_CACHE(re, gb);
313
    buf = GET_CACHE(re, gb);
314
 
315
    log = av_log2(buf);
316
 
317
    if (log - k >= 32 - MIN_CACHE_BITS + (MIN_CACHE_BITS == 32) &&
318
        32 - log < limit) {
319
        buf >>= log - k;
320
        buf  += (30 - log) << k;
321
        LAST_SKIP_BITS(re, gb, 32 + k - log);
322
        CLOSE_READER(re, gb);
323
 
324
        return buf;
325
    } else {
326
        int i;
327
        for (i = 0; i < limit && SHOW_UBITS(re, gb, 1) == 0; i++) {
328
            if (gb->size_in_bits <= re_index)
329
                return -1;
330
            LAST_SKIP_BITS(re, gb, 1);
331
            UPDATE_CACHE(re, gb);
332
        }
333
        SKIP_BITS(re, gb, 1);
334
 
335
        if (i < limit - 1) {
336
            if (k) {
337
                buf = SHOW_UBITS(re, gb, k);
338
                LAST_SKIP_BITS(re, gb, k);
339
            } else {
340
                buf = 0;
341
            }
342
 
343
            CLOSE_READER(re, gb);
344
            return buf + (i << k);
345
        } else if (i == limit - 1) {
346
            buf = SHOW_UBITS(re, gb, esc_len);
347
            LAST_SKIP_BITS(re, gb, esc_len);
348
            CLOSE_READER(re, gb);
349
 
350
            return buf + 1;
351
        } else
352
            return -1;
353
    }
354
}
355
 
356
/**
357
 * read signed golomb rice code (ffv1).
358
 */
359
static inline int get_sr_golomb(GetBitContext *gb, int k, int limit,
360
                                int esc_len)
361
{
362
    int v = get_ur_golomb(gb, k, limit, esc_len);
363
 
364
    v++;
365
    if (v & 1)
366
        return v >> 1;
367
    else
368
        return -(v >> 1);
369
 
370
//    return (v>>1) ^ -(v&1);
371
}
372
 
373
/**
374
 * read signed golomb rice code (flac).
375
 */
376
static inline int get_sr_golomb_flac(GetBitContext *gb, int k, int limit,
377
                                     int esc_len)
378
{
379
    int v = get_ur_golomb_jpegls(gb, k, limit, esc_len);
380
    return (v >> 1) ^ -(v & 1);
381
}
382
 
383
/**
384
 * read unsigned golomb rice code (shorten).
385
 */
386
static inline unsigned int get_ur_golomb_shorten(GetBitContext *gb, int k)
387
{
388
    return get_ur_golomb_jpegls(gb, k, INT_MAX, 0);
389
}
390
 
391
/**
392
 * read signed golomb rice code (shorten).
393
 */
394
static inline int get_sr_golomb_shorten(GetBitContext *gb, int k)
395
{
396
    int uvar = get_ur_golomb_jpegls(gb, k + 1, INT_MAX, 0);
397
    if (uvar & 1)
398
        return ~(uvar >> 1);
399
    else
400
        return uvar >> 1;
401
}
402
 
403
#ifdef TRACE
404
 
405
static inline int get_ue(GetBitContext *s, const char *file, const char *func,
406
                         int line)
407
{
408
    int show = show_bits(s, 24);
409
    int pos  = get_bits_count(s);
410
    int i    = get_ue_golomb(s);
411
    int len  = get_bits_count(s) - pos;
412
    int bits = show >> (24 - len);
413
 
414
    print_bin(bits, len);
415
 
416
    av_log(NULL, AV_LOG_DEBUG, "%5d %2d %3d ue  @%5d in %s %s:%d\n",
417
           bits, len, i, pos, file, func, line);
418
 
419
    return i;
420
}
421
 
422
static inline int get_se(GetBitContext *s, const char *file, const char *func,
423
                         int line)
424
{
425
    int show = show_bits(s, 24);
426
    int pos  = get_bits_count(s);
427
    int i    = get_se_golomb(s);
428
    int len  = get_bits_count(s) - pos;
429
    int bits = show >> (24 - len);
430
 
431
    print_bin(bits, len);
432
 
433
    av_log(NULL, AV_LOG_DEBUG, "%5d %2d %3d se  @%5d in %s %s:%d\n",
434
           bits, len, i, pos, file, func, line);
435
 
436
    return i;
437
}
438
 
439
static inline int get_te(GetBitContext *s, int r, char *file, const char *func,
440
                         int line)
441
{
442
    int show = show_bits(s, 24);
443
    int pos  = get_bits_count(s);
444
    int i    = get_te0_golomb(s, r);
445
    int len  = get_bits_count(s) - pos;
446
    int bits = show >> (24 - len);
447
 
448
    print_bin(bits, len);
449
 
450
    av_log(NULL, AV_LOG_DEBUG, "%5d %2d %3d te  @%5d in %s %s:%d\n",
451
           bits, len, i, pos, file, func, line);
452
 
453
    return i;
454
}
455
 
456
#define get_ue_golomb(a) get_ue(a, __FILE__, __PRETTY_FUNCTION__, __LINE__)
457
#define get_se_golomb(a) get_se(a, __FILE__, __PRETTY_FUNCTION__, __LINE__)
458
#define get_te_golomb(a, r)  get_te(a, r, __FILE__, __PRETTY_FUNCTION__, __LINE__)
459
#define get_te0_golomb(a, r) get_te(a, r, __FILE__, __PRETTY_FUNCTION__, __LINE__)
460
 
461
#endif /* TRACE */
462
 
463
/**
464
 * write unsigned exp golomb code.
465
 */
466
static inline void set_ue_golomb(PutBitContext *pb, int i)
467
{
468
    av_assert2(i >= 0);
469
 
470
#if 0
471
    if (i = 0) {
472
        put_bits(pb, 1, 1);
473
        return;
474
    }
475
#endif
476
    if (i < 256)
477
        put_bits(pb, ff_ue_golomb_len[i], i + 1);
478
    else {
479
        int e = av_log2(i + 1);
480
        put_bits(pb, 2 * e + 1, i + 1);
481
    }
482
}
483
 
484
/**
485
 * write truncated unsigned exp golomb code.
486
 */
487
static inline void set_te_golomb(PutBitContext *pb, int i, int range)
488
{
489
    av_assert2(range >= 1);
490
    av_assert2(i <= range);
491
 
492
    if (range == 2)
493
        put_bits(pb, 1, i ^ 1);
494
    else
495
        set_ue_golomb(pb, i);
496
}
497
 
498
/**
499
 * write signed exp golomb code. 16 bits at most.
500
 */
501
static inline void set_se_golomb(PutBitContext *pb, int i)
502
{
503
#if 0
504
    if (i <= 0)
505
        i = -2 * i;
506
    else
507
        i = 2 * i - 1;
508
#elif 1
509
    i = 2 * i - 1;
510
    if (i < 0)
511
        i ^= -1;    //FIXME check if gcc does the right thing
512
#else
513
    i  = 2 * i - 1;
514
    i ^= (i >> 31);
515
#endif
516
    set_ue_golomb(pb, i);
517
}
518
 
519
/**
520
 * write unsigned golomb rice code (ffv1).
521
 */
522
static inline void set_ur_golomb(PutBitContext *pb, int i, int k, int limit,
523
                                 int esc_len)
524
{
525
    int e;
526
 
527
    av_assert2(i >= 0);
528
 
529
    e = i >> k;
530
    if (e < limit)
531
        put_bits(pb, e + k + 1, (1 << k) + (i & ((1 << k) - 1)));
532
    else
533
        put_bits(pb, limit + esc_len, i - limit + 1);
534
}
535
 
536
/**
537
 * write unsigned golomb rice code (jpegls).
538
 */
539
static inline void set_ur_golomb_jpegls(PutBitContext *pb, int i, int k,
540
                                        int limit, int esc_len)
541
{
542
    int e;
543
 
544
    av_assert2(i >= 0);
545
 
546
    e = (i >> k) + 1;
547
    if (e < limit) {
548
        while (e > 31) {
549
            put_bits(pb, 31, 0);
550
            e -= 31;
551
        }
552
        put_bits(pb, e, 1);
553
        if (k)
554
            put_sbits(pb, k, i);
555
    } else {
556
        while (limit > 31) {
557
            put_bits(pb, 31, 0);
558
            limit -= 31;
559
        }
560
        put_bits(pb, limit, 1);
561
        put_bits(pb, esc_len, i - 1);
562
    }
563
}
564
 
565
/**
566
 * write signed golomb rice code (ffv1).
567
 */
568
static inline void set_sr_golomb(PutBitContext *pb, int i, int k, int limit,
569
                                 int esc_len)
570
{
571
    int v;
572
 
573
    v  = -2 * i - 1;
574
    v ^= (v >> 31);
575
 
576
    set_ur_golomb(pb, v, k, limit, esc_len);
577
}
578
 
579
/**
580
 * write signed golomb rice code (flac).
581
 */
582
static inline void set_sr_golomb_flac(PutBitContext *pb, int i, int k,
583
                                      int limit, int esc_len)
584
{
585
    int v;
586
 
587
    v  = -2 * i - 1;
588
    v ^= (v >> 31);
589
 
590
    set_ur_golomb_jpegls(pb, v, k, limit, esc_len);
591
}
592
 
593
#endif /* AVCODEC_GOLOMB_H */