X-Git-Url: https://git.sesse.net/?a=blobdiff_plain;f=libavcodec%2Fgolomb.h;h=83d277f963e6b390c1541c804b4c5bd78f3b482a;hb=921715edffbba5db8deb26b7ad3cb583ba963d03;hp=f2fb8928a2e98bb0444f91346c85982efbfbdf97;hpb=631e8afb8c59a0759e57ade1c8a910bb46e0fd6d;p=ffmpeg diff --git a/libavcodec/golomb.h b/libavcodec/golomb.h index f2fb8928a2e..83d277f963e 100644 --- a/libavcodec/golomb.h +++ b/libavcodec/golomb.h @@ -3,25 +3,25 @@ * Copyright (c) 2003 Michael Niedermayer * Copyright (c) 2004 Alex Beregszaszi * - * This file is part of FFmpeg. + * This file is part of Libav. * - * FFmpeg is free software; you can redistribute it and/or + * Libav is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public * License as published by the Free Software Foundation; either * version 2.1 of the License, or (at your option) any later version. * - * FFmpeg is distributed in the hope that it will be useful, + * Libav is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public - * License along with FFmpeg; if not, write to the Free Software + * License along with Libav; if not, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA */ /** - * @file golomb.h + * @file * @brief * exp golomb vlc stuff * @author Michael Niedermayer and Alex Beregszaszi @@ -31,7 +31,8 @@ #define AVCODEC_GOLOMB_H #include -#include "bitstream.h" +#include "get_bits.h" +#include "put_bits.h" #define INVALID_VLC 0x80000000 @@ -74,6 +75,24 @@ static inline int get_ue_golomb(GetBitContext *gb){ } } + /** + * read unsigned exp golomb code, constraint to a max of 31. + * the return value is undefined if the stored value exceeds 31. + */ +static inline int get_ue_golomb_31(GetBitContext *gb){ + unsigned int buf; + + OPEN_READER(re, gb); + UPDATE_CACHE(re, gb); + buf=GET_CACHE(re, gb); + + buf >>= 32 - 9; + LAST_SKIP_BITS(re, gb, ff_golomb_vlc_len[buf]); + CLOSE_READER(re, gb); + + return ff_ue_golomb_vlc_code[buf]; +} + static inline int svq3_get_ue_golomb(GetBitContext *gb){ uint32_t buf; @@ -234,8 +253,12 @@ static inline int get_ur_golomb(GetBitContext *gb, int k, int limit, int esc_len return buf; }else{ - buf >>= 32 - limit - esc_len; - LAST_SKIP_BITS(re, gb, esc_len + limit); + LAST_SKIP_BITS(re, gb, limit); + UPDATE_CACHE(re, gb); + + buf = SHOW_UBITS(re, gb, esc_len); + + LAST_SKIP_BITS(re, gb, esc_len); CLOSE_READER(re, gb); return buf + limit - 1; @@ -255,7 +278,7 @@ static inline int get_ur_golomb_jpegls(GetBitContext *gb, int k, int limit, int log= av_log2(buf); - if(log - k >= 32-MIN_CACHE_BITS){ + if(log - k >= 32-MIN_CACHE_BITS+(MIN_CACHE_BITS==32) && 32-log < limit){ buf >>= log - k; buf += (30-log)<