| File: | root/firefox-clang/media/ffvpx/libavcodec/get_bits.h |
| Warning: | line 342, column 5 Addition of a null pointer (via field 'buffer') and a nonzero integer value results in undefined behavior |
Press '?' to see keyboard shortcuts
Keyboard shortcuts:
| 1 | /* | |||
| 2 | * FLAC common code | |||
| 3 | * Copyright (c) 2009 Justin Ruggles | |||
| 4 | * | |||
| 5 | * This file is part of FFmpeg. | |||
| 6 | * | |||
| 7 | * FFmpeg is free software; you can redistribute it and/or | |||
| 8 | * modify it under the terms of the GNU Lesser General Public | |||
| 9 | * License as published by the Free Software Foundation; either | |||
| 10 | * version 2.1 of the License, or (at your option) any later version. | |||
| 11 | * | |||
| 12 | * FFmpeg is distributed in the hope that it will be useful, | |||
| 13 | * but WITHOUT ANY WARRANTY; without even the implied warranty of | |||
| 14 | * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU | |||
| 15 | * Lesser General Public License for more details. | |||
| 16 | * | |||
| 17 | * You should have received a copy of the GNU Lesser General Public | |||
| 18 | * License along with FFmpeg; if not, write to the Free Software | |||
| 19 | * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA | |||
| 20 | */ | |||
| 21 | ||||
| 22 | #include "libavutil/channel_layout.h" | |||
| 23 | #include "libavutil/crc.h" | |||
| 24 | #include "libavutil/log.h" | |||
| 25 | #include "bytestream.h" | |||
| 26 | #include "get_bits.h" | |||
| 27 | #include "flac.h" | |||
| 28 | #include "flacdata.h" | |||
| 29 | #include "flac_parse.h" | |||
| 30 | ||||
| 31 | static const int8_t sample_size_table[] = { 0, 8, 12, 0, 16, 20, 24, 32 }; | |||
| 32 | ||||
| 33 | static const AVChannelLayout flac_channel_layouts[8] = { | |||
| 34 | AV_CHANNEL_LAYOUT_MONO{ AV_CHANNEL_ORDER_NATIVE, (1), { ((1ULL << AV_CHAN_FRONT_CENTER )) }, ((void*)0) }, | |||
| 35 | AV_CHANNEL_LAYOUT_STEREO{ AV_CHANNEL_ORDER_NATIVE, (2), { ((1ULL << AV_CHAN_FRONT_LEFT )|(1ULL << AV_CHAN_FRONT_RIGHT )) }, ((void*)0) }, | |||
| 36 | AV_CHANNEL_LAYOUT_SURROUND{ AV_CHANNEL_ORDER_NATIVE, (3), { (((1ULL << AV_CHAN_FRONT_LEFT )|(1ULL << AV_CHAN_FRONT_RIGHT ))|(1ULL << AV_CHAN_FRONT_CENTER )) }, ((void*)0) }, | |||
| 37 | AV_CHANNEL_LAYOUT_QUAD{ AV_CHANNEL_ORDER_NATIVE, (4), { (((1ULL << AV_CHAN_FRONT_LEFT )|(1ULL << AV_CHAN_FRONT_RIGHT ))|(1ULL << AV_CHAN_BACK_LEFT )|(1ULL << AV_CHAN_BACK_RIGHT )) }, ((void*)0) }, | |||
| 38 | AV_CHANNEL_LAYOUT_5POINT0{ AV_CHANNEL_ORDER_NATIVE, (5), { ((((1ULL << AV_CHAN_FRONT_LEFT )|(1ULL << AV_CHAN_FRONT_RIGHT ))|(1ULL << AV_CHAN_FRONT_CENTER ))|(1ULL << AV_CHAN_SIDE_LEFT )|(1ULL << AV_CHAN_SIDE_RIGHT )) }, ((void*)0) }, | |||
| 39 | AV_CHANNEL_LAYOUT_5POINT1{ AV_CHANNEL_ORDER_NATIVE, (6), { (((((1ULL << AV_CHAN_FRONT_LEFT )|(1ULL << AV_CHAN_FRONT_RIGHT ))|(1ULL << AV_CHAN_FRONT_CENTER ))|(1ULL << AV_CHAN_SIDE_LEFT )|(1ULL << AV_CHAN_SIDE_RIGHT ))|(1ULL << AV_CHAN_LOW_FREQUENCY )) }, ((void*)0) }, | |||
| 40 | AV_CHANNEL_LAYOUT_6POINT1{ AV_CHANNEL_ORDER_NATIVE, (7), { ((((((1ULL << AV_CHAN_FRONT_LEFT )|(1ULL << AV_CHAN_FRONT_RIGHT ))|(1ULL << AV_CHAN_FRONT_CENTER ))|(1ULL << AV_CHAN_SIDE_LEFT )|(1ULL << AV_CHAN_SIDE_RIGHT ))|(1ULL << AV_CHAN_LOW_FREQUENCY ))|(1ULL << AV_CHAN_BACK_CENTER )) }, ((void*)0) }, | |||
| 41 | AV_CHANNEL_LAYOUT_7POINT1{ AV_CHANNEL_ORDER_NATIVE, (8), { ((((((1ULL << AV_CHAN_FRONT_LEFT )|(1ULL << AV_CHAN_FRONT_RIGHT ))|(1ULL << AV_CHAN_FRONT_CENTER ))|(1ULL << AV_CHAN_SIDE_LEFT )|(1ULL << AV_CHAN_SIDE_RIGHT ))|(1ULL << AV_CHAN_LOW_FREQUENCY ))|(1ULL << AV_CHAN_BACK_LEFT )|(1ULL << AV_CHAN_BACK_RIGHT )) }, ((void*)0) } | |||
| 42 | }; | |||
| 43 | ||||
| 44 | static int64_t get_utf8(GetBitContext *gb) | |||
| 45 | { | |||
| 46 | int64_t val; | |||
| 47 | GET_UTF8(val, get_bits(gb, 8), return -1;)val= (uint8_t)(get_bits(gb, 8)); { uint32_t top = (val & 128 ) >> 1; if ((val & 0xc0) == 0x80 || val >= 0xFE) {return -1;} while (val & top) { unsigned int tmp = (uint8_t )(get_bits(gb, 8)) - 128; if(tmp>>6) {return -1;} val= ( val<<6) + tmp; top <<= 5; } val &= (top << 1) - 1; } | |||
| 48 | return val; | |||
| 49 | } | |||
| 50 | ||||
| 51 | int ff_flac_decode_frame_header(void *logctx, GetBitContext *gb, | |||
| 52 | FLACFrameInfo *fi, int log_level_offset) | |||
| 53 | { | |||
| 54 | int bs_code, sr_code, bps_code; | |||
| 55 | ||||
| 56 | /* frame sync code */ | |||
| 57 | if ((get_bits(gb, 15) & 0x7FFF) != 0x7FFC) { | |||
| 58 | av_log(logctx, AV_LOG_ERROR16 + log_level_offset, "invalid sync code\n"); | |||
| 59 | return AVERROR_INVALIDDATA(-(int)(('I') | (('N') << 8) | (('D') << 16) | (( unsigned)('A') << 24))); | |||
| 60 | } | |||
| 61 | ||||
| 62 | /* variable block size stream code */ | |||
| 63 | fi->is_var_size = get_bits1(gb); | |||
| 64 | ||||
| 65 | /* block size and sample rate codes */ | |||
| 66 | bs_code = get_bits(gb, 4); | |||
| 67 | sr_code = get_bits(gb, 4); | |||
| 68 | ||||
| 69 | /* channels and decorrelation */ | |||
| 70 | fi->ch_mode = get_bits(gb, 4); | |||
| 71 | if (fi->ch_mode < FLAC_MAX_CHANNELS8) { | |||
| 72 | fi->channels = fi->ch_mode + 1; | |||
| 73 | fi->ch_mode = FLAC_CHMODE_INDEPENDENT; | |||
| 74 | } else if (fi->ch_mode < FLAC_MAX_CHANNELS8 + FLAC_CHMODE_MID_SIDE) { | |||
| 75 | fi->channels = 2; | |||
| 76 | fi->ch_mode -= FLAC_MAX_CHANNELS8 - 1; | |||
| 77 | } else { | |||
| 78 | av_log(logctx, AV_LOG_ERROR16 + log_level_offset, | |||
| 79 | "invalid channel mode: %d\n", fi->ch_mode); | |||
| 80 | return AVERROR_INVALIDDATA(-(int)(('I') | (('N') << 8) | (('D') << 16) | (( unsigned)('A') << 24))); | |||
| 81 | } | |||
| 82 | ||||
| 83 | /* bits per sample */ | |||
| 84 | bps_code = get_bits(gb, 3); | |||
| 85 | if (bps_code == 3) { | |||
| 86 | av_log(logctx, AV_LOG_ERROR16 + log_level_offset, | |||
| 87 | "invalid sample size code (%d)\n", | |||
| 88 | bps_code); | |||
| 89 | return AVERROR_INVALIDDATA(-(int)(('I') | (('N') << 8) | (('D') << 16) | (( unsigned)('A') << 24))); | |||
| 90 | } | |||
| 91 | fi->bps = sample_size_table[bps_code]; | |||
| 92 | ||||
| 93 | /* reserved bit */ | |||
| 94 | if (get_bits1(gb)) { | |||
| 95 | av_log(logctx, AV_LOG_ERROR16 + log_level_offset, | |||
| 96 | "broken stream, invalid padding\n"); | |||
| 97 | return AVERROR_INVALIDDATA(-(int)(('I') | (('N') << 8) | (('D') << 16) | (( unsigned)('A') << 24))); | |||
| 98 | } | |||
| 99 | ||||
| 100 | /* sample or frame count */ | |||
| 101 | fi->frame_or_sample_num = get_utf8(gb); | |||
| 102 | if (fi->frame_or_sample_num < 0) { | |||
| 103 | av_log(logctx, AV_LOG_ERROR16 + log_level_offset, | |||
| 104 | "sample/frame number invalid; utf8 fscked\n"); | |||
| 105 | return AVERROR_INVALIDDATA(-(int)(('I') | (('N') << 8) | (('D') << 16) | (( unsigned)('A') << 24))); | |||
| 106 | } | |||
| 107 | ||||
| 108 | /* blocksize */ | |||
| 109 | if (bs_code == 0) { | |||
| 110 | av_log(logctx, AV_LOG_ERROR16 + log_level_offset, | |||
| 111 | "reserved blocksize code: 0\n"); | |||
| 112 | return AVERROR_INVALIDDATA(-(int)(('I') | (('N') << 8) | (('D') << 16) | (( unsigned)('A') << 24))); | |||
| 113 | } else if (bs_code == 6) { | |||
| 114 | fi->blocksize = get_bits(gb, 8) + 1; | |||
| 115 | } else if (bs_code == 7) { | |||
| 116 | fi->blocksize = get_bits(gb, 16) + 1; | |||
| 117 | } else { | |||
| 118 | fi->blocksize = ff_flac_blocksize_table[bs_code]; | |||
| 119 | } | |||
| 120 | ||||
| 121 | /* sample rate */ | |||
| 122 | if (sr_code < 12) { | |||
| 123 | fi->samplerate = ff_flac_sample_rate_table[sr_code]; | |||
| 124 | } else if (sr_code == 12) { | |||
| 125 | fi->samplerate = get_bits(gb, 8) * 1000; | |||
| 126 | } else if (sr_code == 13) { | |||
| 127 | fi->samplerate = get_bits(gb, 16); | |||
| 128 | } else if (sr_code == 14) { | |||
| 129 | fi->samplerate = get_bits(gb, 16) * 10; | |||
| 130 | } else { | |||
| 131 | av_log(logctx, AV_LOG_ERROR16 + log_level_offset, | |||
| 132 | "illegal sample rate code %d\n", | |||
| 133 | sr_code); | |||
| 134 | return AVERROR_INVALIDDATA(-(int)(('I') | (('N') << 8) | (('D') << 16) | (( unsigned)('A') << 24))); | |||
| 135 | } | |||
| 136 | ||||
| 137 | /* header CRC-8 check */ | |||
| 138 | skip_bits(gb, 8); | |||
| 139 | if (av_crc(av_crc_get_table(AV_CRC_8_ATM), 0, gb->buffer, | |||
| 140 | get_bits_count(gb)/8)) { | |||
| 141 | av_log(logctx, AV_LOG_ERROR16 + log_level_offset, | |||
| 142 | "header crc mismatch\n"); | |||
| 143 | return AVERROR_INVALIDDATA(-(int)(('I') | (('N') << 8) | (('D') << 16) | (( unsigned)('A') << 24))); | |||
| 144 | } | |||
| 145 | ||||
| 146 | return 0; | |||
| 147 | } | |||
| 148 | ||||
| 149 | int ff_flac_is_extradata_valid(AVCodecContext *avctx, | |||
| 150 | uint8_t **streaminfo_start) | |||
| 151 | { | |||
| 152 | if (!avctx->extradata || avctx->extradata_size < FLAC_STREAMINFO_SIZE34) { | |||
| 153 | av_log(avctx, AV_LOG_ERROR16, "extradata NULL or too small.\n"); | |||
| 154 | return 0; | |||
| 155 | } | |||
| 156 | if (AV_RL32(avctx->extradata)(((const union unaligned_32 *) (avctx->extradata))->l) != MKTAG('f','L','a','C')(('f') | (('L') << 8) | (('a') << 16) | ((unsigned )('C') << 24))) { | |||
| 157 | /* extradata contains STREAMINFO only */ | |||
| 158 | if (avctx->extradata_size != FLAC_STREAMINFO_SIZE34) { | |||
| 159 | av_log(avctx, AV_LOG_WARNING24, "extradata contains %d bytes too many.\n", | |||
| 160 | FLAC_STREAMINFO_SIZE34-avctx->extradata_size); | |||
| 161 | } | |||
| 162 | *streaminfo_start = avctx->extradata; | |||
| 163 | } else { | |||
| 164 | if (avctx->extradata_size < 8+FLAC_STREAMINFO_SIZE34) { | |||
| 165 | av_log(avctx, AV_LOG_ERROR16, "extradata too small.\n"); | |||
| 166 | return 0; | |||
| 167 | } | |||
| 168 | *streaminfo_start = &avctx->extradata[8]; | |||
| 169 | } | |||
| 170 | return 1; | |||
| 171 | } | |||
| 172 | ||||
| 173 | void ff_flac_set_channel_layout(AVCodecContext *avctx, int channels) | |||
| 174 | { | |||
| 175 | if (channels == avctx->ch_layout.nb_channels && | |||
| 176 | avctx->ch_layout.order != AV_CHANNEL_ORDER_UNSPEC) | |||
| 177 | return; | |||
| 178 | ||||
| 179 | av_channel_layout_uninit(&avctx->ch_layout); | |||
| 180 | if (channels <= FF_ARRAY_ELEMS(flac_channel_layouts)(sizeof(flac_channel_layouts) / sizeof((flac_channel_layouts) [0]))) | |||
| 181 | avctx->ch_layout = flac_channel_layouts[channels - 1]; | |||
| 182 | else | |||
| 183 | avctx->ch_layout = (AVChannelLayout){ .order = AV_CHANNEL_ORDER_UNSPEC, | |||
| 184 | .nb_channels = channels }; | |||
| 185 | } | |||
| 186 | ||||
| 187 | int ff_flac_parse_streaminfo(AVCodecContext *avctx, struct FLACStreaminfo *s, | |||
| 188 | const uint8_t *buffer) | |||
| 189 | { | |||
| 190 | GetBitContext gb; | |||
| 191 | init_get_bits(&gb, buffer, FLAC_STREAMINFO_SIZE34*8); | |||
| ||||
| 192 | ||||
| 193 | skip_bits(&gb, 16); /* skip min blocksize */ | |||
| 194 | s->max_blocksize = get_bits(&gb, 16); | |||
| 195 | if (s->max_blocksize < FLAC_MIN_BLOCKSIZE16) { | |||
| 196 | av_log(avctx, AV_LOG_WARNING24, "invalid max blocksize: %d\n", | |||
| 197 | s->max_blocksize); | |||
| 198 | s->max_blocksize = 16; | |||
| 199 | return AVERROR_INVALIDDATA(-(int)(('I') | (('N') << 8) | (('D') << 16) | (( unsigned)('A') << 24))); | |||
| 200 | } | |||
| 201 | ||||
| 202 | skip_bits(&gb, 24); /* skip min frame size */ | |||
| 203 | s->max_framesize = get_bits(&gb, 24); | |||
| 204 | ||||
| 205 | s->samplerate = get_bits(&gb, 20); | |||
| 206 | s->channels = get_bits(&gb, 3) + 1; | |||
| 207 | s->bps = get_bits(&gb, 5) + 1; | |||
| 208 | ||||
| 209 | if (s->bps < 4) { | |||
| 210 | av_log(avctx, AV_LOG_ERROR16, "invalid bps: %d\n", s->bps); | |||
| 211 | s->bps = 16; | |||
| 212 | return AVERROR_INVALIDDATA(-(int)(('I') | (('N') << 8) | (('D') << 16) | (( unsigned)('A') << 24))); | |||
| 213 | } | |||
| 214 | ||||
| 215 | avctx->sample_rate = s->samplerate; | |||
| 216 | avctx->bits_per_raw_sample = s->bps; | |||
| 217 | ff_flac_set_channel_layout(avctx, s->channels); | |||
| 218 | ||||
| 219 | s->samples = get_bits64(&gb, 36); | |||
| 220 | ||||
| 221 | skip_bits_long(&gb, 64); /* md5 sum */ | |||
| 222 | skip_bits_long(&gb, 64); /* md5 sum */ | |||
| 223 | ||||
| 224 | return 0; | |||
| 225 | } |
| 1 | /* | ||||
| 2 | * Copyright (c) 2004 Michael Niedermayer <michaelni@gmx.at> | ||||
| 3 | * | ||||
| 4 | * This file is part of FFmpeg. | ||||
| 5 | * | ||||
| 6 | * FFmpeg is free software; you can redistribute it and/or | ||||
| 7 | * modify it under the terms of the GNU Lesser General Public | ||||
| 8 | * License as published by the Free Software Foundation; either | ||||
| 9 | * version 2.1 of the License, or (at your option) any later version. | ||||
| 10 | * | ||||
| 11 | * FFmpeg is distributed in the hope that it will be useful, | ||||
| 12 | * but WITHOUT ANY WARRANTY; without even the implied warranty of | ||||
| 13 | * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU | ||||
| 14 | * Lesser General Public License for more details. | ||||
| 15 | * | ||||
| 16 | * You should have received a copy of the GNU Lesser General Public | ||||
| 17 | * License along with FFmpeg; if not, write to the Free Software | ||||
| 18 | * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA | ||||
| 19 | */ | ||||
| 20 | |||||
| 21 | /** | ||||
| 22 | * @file | ||||
| 23 | * bitstream reader API header. | ||||
| 24 | */ | ||||
| 25 | |||||
| 26 | #ifndef AVCODEC_GET_BITS_H | ||||
| 27 | #define AVCODEC_GET_BITS_H | ||||
| 28 | |||||
| 29 | #include <stdint.h> | ||||
| 30 | |||||
| 31 | #include "libavutil/common.h" | ||||
| 32 | #include "libavutil/intreadwrite.h" | ||||
| 33 | #include "libavutil/avassert.h" | ||||
| 34 | |||||
| 35 | #include "defs.h" | ||||
| 36 | #include "mathops.h" | ||||
| 37 | #include "vlc.h" | ||||
| 38 | |||||
| 39 | /* | ||||
| 40 | * Safe bitstream reading: | ||||
| 41 | * optionally, the get_bits API can check to ensure that we | ||||
| 42 | * don't read past input buffer boundaries. This is protected | ||||
| 43 | * with CONFIG_SAFE_BITSTREAM_READER at the global level, and | ||||
| 44 | * then below that with UNCHECKED_BITSTREAM_READER at the per- | ||||
| 45 | * decoder level. This means that decoders that check internally | ||||
| 46 | * can "#define UNCHECKED_BITSTREAM_READER 1" to disable | ||||
| 47 | * overread checks. | ||||
| 48 | * Boundary checking causes a minor performance penalty so for | ||||
| 49 | * applications that won't want/need this, it can be disabled | ||||
| 50 | * globally using "#define CONFIG_SAFE_BITSTREAM_READER 0". | ||||
| 51 | */ | ||||
| 52 | #ifndef UNCHECKED_BITSTREAM_READER!1 | ||||
| 53 | #define UNCHECKED_BITSTREAM_READER!1 !CONFIG_SAFE_BITSTREAM_READER1 | ||||
| 54 | #endif | ||||
| 55 | |||||
| 56 | #ifndef CACHED_BITSTREAM_READER0 | ||||
| 57 | #define CACHED_BITSTREAM_READER0 0 | ||||
| 58 | #endif | ||||
| 59 | |||||
| 60 | #if CACHED_BITSTREAM_READER0 | ||||
| 61 | |||||
| 62 | // we always want the LE implementation, to provide get_bits_le() | ||||
| 63 | #define BITSTREAM_LE | ||||
| 64 | |||||
| 65 | #ifndef BITSTREAM_READER_LE | ||||
| 66 | # define BITSTREAM_BE | ||||
| 67 | # define BITSTREAM_DEFAULT_BE | ||||
| 68 | #endif | ||||
| 69 | |||||
| 70 | #include "bitstream.h" | ||||
| 71 | |||||
| 72 | #undef BITSTREAM_LE | ||||
| 73 | #undef BITSTREAM_BE | ||||
| 74 | #undef BITSTREAM_DEFAULT_BE | ||||
| 75 | |||||
| 76 | typedef BitstreamContext GetBitContext; | ||||
| 77 | |||||
| 78 | #define get_bits_count bits_tell | ||||
| 79 | #define get_bits_bytesize bits_bytesize | ||||
| 80 | #define get_bits_left bits_left | ||||
| 81 | #define skip_bits_long bits_skip | ||||
| 82 | #define skip_bits bits_skip | ||||
| 83 | #define get_bits bits_read_nz | ||||
| 84 | #define get_bitsz bits_read | ||||
| 85 | #define get_bits_long bits_read | ||||
| 86 | #define get_bits1 bits_read_bit | ||||
| 87 | #define get_bits64 bits_read_64 | ||||
| 88 | #define get_xbits bits_read_xbits | ||||
| 89 | #define get_sbits bits_read_signed_nz | ||||
| 90 | #define get_sbits_long bits_read_signed | ||||
| 91 | #define show_bits bits_peek | ||||
| 92 | #define show_bits_long bits_peek | ||||
| 93 | #define init_get_bits bits_init | ||||
| 94 | #define init_get_bits8 bits_init8 | ||||
| 95 | #define align_get_bits bits_align | ||||
| 96 | #define get_vlc2 bits_read_vlc | ||||
| 97 | #define get_vlc_multi bits_read_vlc_multi | ||||
| 98 | |||||
| 99 | #define init_get_bits8_le(s, buffer, byte_size) bits_init8_le((BitstreamContextLE*)s, buffer, byte_size) | ||||
| 100 | #define get_bits_le(s, n) bits_read_le((BitstreamContextLE*)s, n) | ||||
| 101 | |||||
| 102 | #define show_bits1(s) bits_peek(s, 1) | ||||
| 103 | #define skip_bits1(s) bits_skip(s, 1) | ||||
| 104 | |||||
| 105 | #define skip_1stop_8data_bits bits_skip_1stop_8data | ||||
| 106 | |||||
| 107 | #else // CACHED_BITSTREAM_READER | ||||
| 108 | |||||
| 109 | typedef struct GetBitContext { | ||||
| 110 | const uint8_t *buffer; | ||||
| 111 | int index; | ||||
| 112 | int size_in_bits; | ||||
| 113 | int size_in_bits_plus8; | ||||
| 114 | } GetBitContext; | ||||
| 115 | |||||
| 116 | static inline unsigned int get_bits(GetBitContext *s, int n); | ||||
| 117 | static inline void skip_bits(GetBitContext *s, int n); | ||||
| 118 | static inline unsigned int show_bits(GetBitContext *s, int n); | ||||
| 119 | |||||
| 120 | /* Bitstream reader API docs: | ||||
| 121 | * name | ||||
| 122 | * arbitrary name which is used as prefix for the internal variables | ||||
| 123 | * | ||||
| 124 | * gb | ||||
| 125 | * getbitcontext | ||||
| 126 | * | ||||
| 127 | * OPEN_READER(name, gb) | ||||
| 128 | * load gb into local variables | ||||
| 129 | * | ||||
| 130 | * CLOSE_READER(name, gb) | ||||
| 131 | * store local vars in gb | ||||
| 132 | * | ||||
| 133 | * UPDATE_CACHE(name, gb) | ||||
| 134 | * Refill the internal cache from the bitstream. | ||||
| 135 | * After this call at least MIN_CACHE_BITS will be available. | ||||
| 136 | * | ||||
| 137 | * GET_CACHE(name, gb) | ||||
| 138 | * Will output the contents of the internal cache, | ||||
| 139 | * next bit is MSB of 32 or 64 bits (FIXME 64 bits). | ||||
| 140 | * | ||||
| 141 | * SHOW_UBITS(name, gb, num) | ||||
| 142 | * Will return the next num bits. | ||||
| 143 | * | ||||
| 144 | * SHOW_SBITS(name, gb, num) | ||||
| 145 | * Will return the next num bits and do sign extension. | ||||
| 146 | * | ||||
| 147 | * SKIP_BITS(name, gb, num) | ||||
| 148 | * Will skip over the next num bits. | ||||
| 149 | * Note, this is equivalent to SKIP_CACHE; SKIP_COUNTER. | ||||
| 150 | * | ||||
| 151 | * SKIP_CACHE(name, gb, num) | ||||
| 152 | * Will remove the next num bits from the cache (note SKIP_COUNTER | ||||
| 153 | * MUST be called before UPDATE_CACHE / CLOSE_READER). | ||||
| 154 | * | ||||
| 155 | * SKIP_COUNTER(name, gb, num) | ||||
| 156 | * Will increment the internal bit counter (see SKIP_CACHE & SKIP_BITS). | ||||
| 157 | * | ||||
| 158 | * LAST_SKIP_BITS(name, gb, num) | ||||
| 159 | * Like SKIP_BITS, to be used if next call is UPDATE_CACHE or CLOSE_READER. | ||||
| 160 | * | ||||
| 161 | * BITS_LEFT(name, gb) | ||||
| 162 | * Return the number of bits left | ||||
| 163 | * | ||||
| 164 | * For examples see get_bits, show_bits, skip_bits, get_vlc. | ||||
| 165 | */ | ||||
| 166 | |||||
| 167 | #define MIN_CACHE_BITS25 25 | ||||
| 168 | |||||
| 169 | #define OPEN_READER_NOSIZE_NOCACHE(name, gb)unsigned int name_index = (gb)->index \ | ||||
| 170 | unsigned int name ## _index = (gb)->index | ||||
| 171 | |||||
| 172 | #define OPEN_READER_NOSIZE(name, gb)unsigned int name_index = (gb)->index; unsigned int name_cache \ | ||||
| 173 | OPEN_READER_NOSIZE_NOCACHE(name, gb)unsigned int name_index = (gb)->index; \ | ||||
| 174 | unsigned int name ## _cache | ||||
| 175 | |||||
| 176 | #if UNCHECKED_BITSTREAM_READER!1 | ||||
| 177 | #define OPEN_READER(name, gb)unsigned int name_index = (gb)->index; unsigned int name_cache ; unsigned int name_size_plus8 = (gb)->size_in_bits_plus8 OPEN_READER_NOSIZE(name, gb)unsigned int name_index = (gb)->index; unsigned int name_cache | ||||
| 178 | #define OPEN_READER_SIZE(name, gb)unsigned int name_size_plus8 = (gb)->size_in_bits_plus8 ((void)0) | ||||
| 179 | #define BITS_AVAILABLE(name, gb)name_index < name_size_plus8 1 | ||||
| 180 | #else | ||||
| 181 | #define OPEN_READER_SIZE(name, gb)unsigned int name_size_plus8 = (gb)->size_in_bits_plus8 unsigned int name ## _size_plus8 = (gb)->size_in_bits_plus8 | ||||
| 182 | #define OPEN_READER(name, gb)unsigned int name_index = (gb)->index; unsigned int name_cache ; unsigned int name_size_plus8 = (gb)->size_in_bits_plus8 \ | ||||
| 183 | OPEN_READER_NOSIZE(name, gb)unsigned int name_index = (gb)->index; unsigned int name_cache; \ | ||||
| 184 | OPEN_READER_SIZE(name, gb)unsigned int name_size_plus8 = (gb)->size_in_bits_plus8 | ||||
| 185 | |||||
| 186 | #define BITS_AVAILABLE(name, gb)name_index < name_size_plus8 name ## _index < name ## _size_plus8 | ||||
| 187 | #endif | ||||
| 188 | |||||
| 189 | #define CLOSE_READER(name, gb)(gb)->index = name_index (gb)->index = name ## _index | ||||
| 190 | |||||
| 191 | #define UPDATE_CACHE_BE_EXT(name, gb, bits, dst_bits)name_cache = AV_RBbits((gb)->buffer + (name_index >> 3)) << (name_index & 7) >> (bits - dst_bits) name ## _cache = \ | ||||
| 192 | AV_RB ## bits((gb)->buffer + (name ## _index >> 3)) << (name ## _index & 7) >> (bits - dst_bits) | ||||
| 193 | |||||
| 194 | #define UPDATE_CACHE_LE_EXT(name, gb, bits, dst_bits)name_cache = (uintdst_bits_t)(AV_RLbits((gb)->buffer + (name_index >> 3)) >> (name_index & 7)) name ## _cache = \ | ||||
| 195 | (uint ## dst_bits ## _t)(AV_RL ## bits((gb)->buffer + (name ## _index >> 3)) >> (name ## _index & 7)) | ||||
| 196 | |||||
| 197 | /* Using these two macros ensures that 32 bits are available. */ | ||||
| 198 | # define UPDATE_CACHE_LE_32(name, gb)name_cache = (uint32_t)((((const union unaligned_64 *) (((gb) )->buffer + (name_index >> 3)))->l) >> (name_index & 7)) UPDATE_CACHE_LE_EXT(name, (gb), 64, 32)name_cache = (uint32_t)((((const union unaligned_64 *) (((gb) )->buffer + (name_index >> 3)))->l) >> (name_index & 7)) | ||||
| 199 | # define UPDATE_CACHE_BE_32(name, gb)name_cache = av_bswap64((((const union unaligned_64 *) (((gb) )->buffer + (name_index >> 3)))->l)) << (name_index & 7) >> (64 - 32) UPDATE_CACHE_BE_EXT(name, (gb), 64, 32)name_cache = av_bswap64((((const union unaligned_64 *) (((gb) )->buffer + (name_index >> 3)))->l)) << (name_index & 7) >> (64 - 32) | ||||
| 200 | |||||
| 201 | # define UPDATE_CACHE_LE(name, gb)name_cache = (uint32_t)((((const union unaligned_32 *) (((gb) )->buffer + (name_index >> 3)))->l) >> (name_index & 7)) UPDATE_CACHE_LE_EXT(name, (gb), 32, 32)name_cache = (uint32_t)((((const union unaligned_32 *) (((gb) )->buffer + (name_index >> 3)))->l) >> (name_index & 7)) | ||||
| 202 | # define UPDATE_CACHE_BE(name, gb)name_cache = av_bswap32((((const union unaligned_32 *) (((gb) )->buffer + (name_index >> 3)))->l)) << (name_index & 7) >> (32 - 32) UPDATE_CACHE_BE_EXT(name, (gb), 32, 32)name_cache = av_bswap32((((const union unaligned_32 *) (((gb) )->buffer + (name_index >> 3)))->l)) << (name_index & 7) >> (32 - 32) | ||||
| 203 | |||||
| 204 | #ifdef BITSTREAM_READER_LE | ||||
| 205 | |||||
| 206 | # define UPDATE_CACHE(name, gb)name_cache = av_bswap32((((const union unaligned_32 *) (((gb) )->buffer + (name_index >> 3)))->l)) << (name_index & 7) >> (32 - 32) UPDATE_CACHE_LE(name, gb)name_cache = (uint32_t)((((const union unaligned_32 *) (((gb) )->buffer + (name_index >> 3)))->l) >> (name_index & 7)) | ||||
| 207 | # define UPDATE_CACHE_32(name, gb)name_cache = av_bswap64((((const union unaligned_64 *) ((((gb )))->buffer + (name_index >> 3)))->l)) << ( name_index & 7) >> (64 - 32) UPDATE_CACHE_LE_32(name, (gb))name_cache = (uint32_t)((((const union unaligned_64 *) ((((gb )))->buffer + (name_index >> 3)))->l) >> (name_index & 7)) | ||||
| 208 | |||||
| 209 | # define SKIP_CACHE(name, gb, num)name_cache <<= (num) name ## _cache >>= (num) | ||||
| 210 | |||||
| 211 | #else | ||||
| 212 | |||||
| 213 | # define UPDATE_CACHE(name, gb)name_cache = av_bswap32((((const union unaligned_32 *) (((gb) )->buffer + (name_index >> 3)))->l)) << (name_index & 7) >> (32 - 32) UPDATE_CACHE_BE(name, gb)name_cache = av_bswap32((((const union unaligned_32 *) (((gb) )->buffer + (name_index >> 3)))->l)) << (name_index & 7) >> (32 - 32) | ||||
| 214 | # define UPDATE_CACHE_32(name, gb)name_cache = av_bswap64((((const union unaligned_64 *) ((((gb )))->buffer + (name_index >> 3)))->l)) << ( name_index & 7) >> (64 - 32) UPDATE_CACHE_BE_32(name, (gb))name_cache = av_bswap64((((const union unaligned_64 *) ((((gb )))->buffer + (name_index >> 3)))->l)) << ( name_index & 7) >> (64 - 32) | ||||
| 215 | |||||
| 216 | # define SKIP_CACHE(name, gb, num)name_cache <<= (num) name ## _cache <<= (num) | ||||
| 217 | |||||
| 218 | #endif | ||||
| 219 | |||||
| 220 | #if UNCHECKED_BITSTREAM_READER!1 | ||||
| 221 | # define SKIP_COUNTER(name, gb, num)name_index = ((name_size_plus8) > (name_index + (num)) ? ( name_index + (num)) : (name_size_plus8)) name ## _index += (num) | ||||
| 222 | #else | ||||
| 223 | # define SKIP_COUNTER(name, gb, num)name_index = ((name_size_plus8) > (name_index + (num)) ? ( name_index + (num)) : (name_size_plus8)) \ | ||||
| 224 | name ## _index = FFMIN(name ## _size_plus8, name ## _index + (num))((name ## _size_plus8) > (name ## _index + (num)) ? (name ## _index + (num)) : (name ## _size_plus8)) | ||||
| 225 | #endif | ||||
| 226 | |||||
| 227 | #define BITS_LEFT(name, gb)((int)((gb)->size_in_bits - name_index)) ((int)((gb)->size_in_bits - name ## _index)) | ||||
| 228 | |||||
| 229 | #define SKIP_BITS(name, gb, num)do { name_cache <<= (num); name_index = ((name_size_plus8 ) > (name_index + (num)) ? (name_index + (num)) : (name_size_plus8 )); } while (0) \ | ||||
| 230 | do { \ | ||||
| 231 | SKIP_CACHE(name, gb, num)name_cache <<= (num); \ | ||||
| 232 | SKIP_COUNTER(name, gb, num)name_index = ((name_size_plus8) > (name_index + (num)) ? ( name_index + (num)) : (name_size_plus8)); \ | ||||
| 233 | } while (0) | ||||
| 234 | |||||
| 235 | #define LAST_SKIP_BITS(name, gb, num)name_index = ((name_size_plus8) > (name_index + (num)) ? ( name_index + (num)) : (name_size_plus8)) SKIP_COUNTER(name, gb, num)name_index = ((name_size_plus8) > (name_index + (num)) ? ( name_index + (num)) : (name_size_plus8)) | ||||
| 236 | |||||
| 237 | #define SHOW_UBITS_LE(name, gb, num)zero_extend(name_cache, num) zero_extend(name ## _cache, num) | ||||
| 238 | #define SHOW_SBITS_LE(name, gb, num)sign_extend(name_cache, num) sign_extend(name ## _cache, num) | ||||
| 239 | |||||
| 240 | #define SHOW_UBITS_BE(name, gb, num)NEG_USR32(name_cache, num) NEG_USR32NEG_USR32(name ## _cache, num) | ||||
| 241 | #define SHOW_SBITS_BE(name, gb, num)NEG_SSR32(name_cache, num) NEG_SSR32NEG_SSR32(name ## _cache, num) | ||||
| 242 | |||||
| 243 | #ifdef BITSTREAM_READER_LE | ||||
| 244 | # define SHOW_UBITS(name, gb, num)NEG_USR32(name_cache, num) SHOW_UBITS_LE(name, gb, num)zero_extend(name_cache, num) | ||||
| 245 | # define SHOW_SBITS(name, gb, num)NEG_SSR32(name_cache, num) SHOW_SBITS_LE(name, gb, num)sign_extend(name_cache, num) | ||||
| 246 | #else | ||||
| 247 | # define SHOW_UBITS(name, gb, num)NEG_USR32(name_cache, num) SHOW_UBITS_BE(name, gb, num)NEG_USR32(name_cache, num) | ||||
| 248 | # define SHOW_SBITS(name, gb, num)NEG_SSR32(name_cache, num) SHOW_SBITS_BE(name, gb, num)NEG_SSR32(name_cache, num) | ||||
| 249 | #endif | ||||
| 250 | |||||
| 251 | #define GET_CACHE(name, gb)((uint32_t) name_cache) ((uint32_t) name ## _cache) | ||||
| 252 | |||||
| 253 | |||||
| 254 | static inline int get_bits_count(const GetBitContext *s) | ||||
| 255 | { | ||||
| 256 | return s->index; | ||||
| 257 | } | ||||
| 258 | |||||
| 259 | /** | ||||
| 260 | * Get the size of the GetBitContext's buffer in bytes. | ||||
| 261 | * | ||||
| 262 | * @param s the GetBitContext | ||||
| 263 | * @param round_up If set, the number of bits will be rounded up to full bytes; | ||||
| 264 | * this does not matter if the number of bits is known to be | ||||
| 265 | * a multiple of eight, e.g. if the GetBitContext has been | ||||
| 266 | * initialized with init_get_bits8. | ||||
| 267 | */ | ||||
| 268 | static inline int get_bits_bytesize(const GetBitContext *s, int round_up) | ||||
| 269 | { | ||||
| 270 | return (s->size_in_bits + (round_up ? 7 : 0)) >> 3; | ||||
| 271 | } | ||||
| 272 | |||||
| 273 | /** | ||||
| 274 | * Skips the specified number of bits. | ||||
| 275 | * @param n the number of bits to skip, | ||||
| 276 | * For the UNCHECKED_BITSTREAM_READER this must not cause the distance | ||||
| 277 | * from the start to overflow int32_t. Staying within the bitstream + padding | ||||
| 278 | * is sufficient, too. | ||||
| 279 | */ | ||||
| 280 | static inline void skip_bits_long(GetBitContext *s, int n) | ||||
| 281 | { | ||||
| 282 | #if UNCHECKED_BITSTREAM_READER!1 | ||||
| 283 | s->index += n; | ||||
| 284 | #else | ||||
| 285 | s->index += av_clipav_clip_c(n, -s->index, s->size_in_bits_plus8 - s->index); | ||||
| 286 | #endif | ||||
| 287 | } | ||||
| 288 | |||||
| 289 | /** | ||||
| 290 | * Read MPEG-1 dc-style VLC (sign bit + mantissa with no MSB). | ||||
| 291 | * if MSB not set it is negative | ||||
| 292 | * @param n length in bits | ||||
| 293 | */ | ||||
| 294 | static inline int get_xbits(GetBitContext *s, int n) | ||||
| 295 | { | ||||
| 296 | register int sign; | ||||
| 297 | register int32_t cache; | ||||
| 298 | OPEN_READER(re, s)unsigned int re_index = (s)->index; unsigned int re_cache; unsigned int re_size_plus8 = (s)->size_in_bits_plus8; | ||||
| 299 | av_assert2(n>0 && n<=25)do { if (!(n>0 && n<=25)) { av_log(((void*)0), 0 , "Assertion %s failed at %s:%d\n", "n>0 && n<=25" , "/root/firefox-clang/media/ffvpx/libavcodec/get_bits.h", 299 ); abort(); } } while (0); | ||||
| 300 | UPDATE_CACHE(re, s)re_cache = av_bswap32((((const union unaligned_32 *) (((s))-> buffer + (re_index >> 3)))->l)) << (re_index & 7) >> (32 - 32); | ||||
| 301 | cache = GET_CACHE(re, s)((uint32_t) re_cache); | ||||
| 302 | sign = ~cache >> 31; | ||||
| 303 | LAST_SKIP_BITS(re, s, n)re_index = ((re_size_plus8) > (re_index + (n)) ? (re_index + (n)) : (re_size_plus8)); | ||||
| 304 | CLOSE_READER(re, s)(s)->index = re_index; | ||||
| 305 | return (NEG_USR32NEG_USR32(sign ^ cache, n) ^ sign) - sign; | ||||
| 306 | } | ||||
| 307 | |||||
| 308 | static inline int get_xbits_le(GetBitContext *s, int n) | ||||
| 309 | { | ||||
| 310 | register int sign; | ||||
| 311 | register int32_t cache; | ||||
| 312 | OPEN_READER(re, s)unsigned int re_index = (s)->index; unsigned int re_cache; unsigned int re_size_plus8 = (s)->size_in_bits_plus8; | ||||
| 313 | av_assert2(n>0 && n<=25)do { if (!(n>0 && n<=25)) { av_log(((void*)0), 0 , "Assertion %s failed at %s:%d\n", "n>0 && n<=25" , "/root/firefox-clang/media/ffvpx/libavcodec/get_bits.h", 313 ); abort(); } } while (0); | ||||
| 314 | UPDATE_CACHE_LE(re, s)re_cache = (uint32_t)((((const union unaligned_32 *) (((s))-> buffer + (re_index >> 3)))->l) >> (re_index & 7)); | ||||
| 315 | cache = GET_CACHE(re, s)((uint32_t) re_cache); | ||||
| 316 | sign = sign_extend(~cache, n) >> 31; | ||||
| 317 | LAST_SKIP_BITS(re, s, n)re_index = ((re_size_plus8) > (re_index + (n)) ? (re_index + (n)) : (re_size_plus8)); | ||||
| 318 | CLOSE_READER(re, s)(s)->index = re_index; | ||||
| 319 | return (zero_extend(sign ^ cache, n) ^ sign) - sign; | ||||
| 320 | } | ||||
| 321 | |||||
| 322 | static inline int get_sbits(GetBitContext *s, int n) | ||||
| 323 | { | ||||
| 324 | register int tmp; | ||||
| 325 | OPEN_READER(re, s)unsigned int re_index = (s)->index; unsigned int re_cache; unsigned int re_size_plus8 = (s)->size_in_bits_plus8; | ||||
| 326 | av_assert2(n>0 && n<=25)do { if (!(n>0 && n<=25)) { av_log(((void*)0), 0 , "Assertion %s failed at %s:%d\n", "n>0 && n<=25" , "/root/firefox-clang/media/ffvpx/libavcodec/get_bits.h", 326 ); abort(); } } while (0); | ||||
| 327 | UPDATE_CACHE(re, s)re_cache = av_bswap32((((const union unaligned_32 *) (((s))-> buffer + (re_index >> 3)))->l)) << (re_index & 7) >> (32 - 32); | ||||
| 328 | tmp = SHOW_SBITS(re, s, n)NEG_SSR32(re_cache, n); | ||||
| 329 | LAST_SKIP_BITS(re, s, n)re_index = ((re_size_plus8) > (re_index + (n)) ? (re_index + (n)) : (re_size_plus8)); | ||||
| 330 | CLOSE_READER(re, s)(s)->index = re_index; | ||||
| 331 | return tmp; | ||||
| 332 | } | ||||
| 333 | |||||
| 334 | /** | ||||
| 335 | * Read 1-25 bits. | ||||
| 336 | */ | ||||
| 337 | static inline unsigned int get_bits(GetBitContext *s, int n) | ||||
| 338 | { | ||||
| 339 | register unsigned int tmp; | ||||
| 340 | OPEN_READER(re, s)unsigned int re_index = (s)->index; unsigned int re_cache; unsigned int re_size_plus8 = (s)->size_in_bits_plus8; | ||||
| 341 | av_assert2(n>0 && n<=25)do { if (!(n>0 && n<=25)) { av_log(((void*)0), 0 , "Assertion %s failed at %s:%d\n", "n>0 && n<=25" , "/root/firefox-clang/media/ffvpx/libavcodec/get_bits.h", 341 ); abort(); } } while (0); | ||||
| 342 | UPDATE_CACHE(re, s)re_cache = av_bswap32((((const union unaligned_32 *) (((s))-> buffer + (re_index >> 3)))->l)) << (re_index & 7) >> (32 - 32); | ||||
| |||||
| 343 | tmp = SHOW_UBITS(re, s, n)NEG_USR32(re_cache, n); | ||||
| 344 | LAST_SKIP_BITS(re, s, n)re_index = ((re_size_plus8) > (re_index + (n)) ? (re_index + (n)) : (re_size_plus8)); | ||||
| 345 | CLOSE_READER(re, s)(s)->index = re_index; | ||||
| 346 | av_assert2(tmp < UINT64_C(1) << n)do { if (!(tmp < 1UL << n)) { av_log(((void*)0), 0, "Assertion %s failed at %s:%d\n" , "tmp < 1UL << n", "/root/firefox-clang/media/ffvpx/libavcodec/get_bits.h" , 346); abort(); } } while (0); | ||||
| 347 | return tmp; | ||||
| 348 | } | ||||
| 349 | |||||
| 350 | /** | ||||
| 351 | * Read 0-25 bits. | ||||
| 352 | */ | ||||
| 353 | static av_always_inline__attribute__((always_inline)) inline int get_bitsz(GetBitContext *s, int n) | ||||
| 354 | { | ||||
| 355 | return n ? get_bits(s, n) : 0; | ||||
| 356 | } | ||||
| 357 | |||||
| 358 | static inline unsigned int get_bits_le(GetBitContext *s, int n) | ||||
| 359 | { | ||||
| 360 | register int tmp; | ||||
| 361 | OPEN_READER(re, s)unsigned int re_index = (s)->index; unsigned int re_cache; unsigned int re_size_plus8 = (s)->size_in_bits_plus8; | ||||
| 362 | av_assert2(n>0 && n<=25)do { if (!(n>0 && n<=25)) { av_log(((void*)0), 0 , "Assertion %s failed at %s:%d\n", "n>0 && n<=25" , "/root/firefox-clang/media/ffvpx/libavcodec/get_bits.h", 362 ); abort(); } } while (0); | ||||
| 363 | UPDATE_CACHE_LE(re, s)re_cache = (uint32_t)((((const union unaligned_32 *) (((s))-> buffer + (re_index >> 3)))->l) >> (re_index & 7)); | ||||
| 364 | tmp = SHOW_UBITS_LE(re, s, n)zero_extend(re_cache, n); | ||||
| 365 | LAST_SKIP_BITS(re, s, n)re_index = ((re_size_plus8) > (re_index + (n)) ? (re_index + (n)) : (re_size_plus8)); | ||||
| 366 | CLOSE_READER(re, s)(s)->index = re_index; | ||||
| 367 | return tmp; | ||||
| 368 | } | ||||
| 369 | |||||
| 370 | /** | ||||
| 371 | * Show 1-25 bits. | ||||
| 372 | */ | ||||
| 373 | static inline unsigned int show_bits(GetBitContext *s, int n) | ||||
| 374 | { | ||||
| 375 | register unsigned int tmp; | ||||
| 376 | OPEN_READER_NOSIZE(re, s)unsigned int re_index = (s)->index; unsigned int re_cache; | ||||
| 377 | av_assert2(n>0 && n<=25)do { if (!(n>0 && n<=25)) { av_log(((void*)0), 0 , "Assertion %s failed at %s:%d\n", "n>0 && n<=25" , "/root/firefox-clang/media/ffvpx/libavcodec/get_bits.h", 377 ); abort(); } } while (0); | ||||
| 378 | UPDATE_CACHE(re, s)re_cache = av_bswap32((((const union unaligned_32 *) (((s))-> buffer + (re_index >> 3)))->l)) << (re_index & 7) >> (32 - 32); | ||||
| 379 | tmp = SHOW_UBITS(re, s, n)NEG_USR32(re_cache, n); | ||||
| 380 | return tmp; | ||||
| 381 | } | ||||
| 382 | |||||
| 383 | static inline void skip_bits(GetBitContext *s, int n) | ||||
| 384 | { | ||||
| 385 | OPEN_READER_NOSIZE_NOCACHE(re, s)unsigned int re_index = (s)->index; | ||||
| 386 | OPEN_READER_SIZE(re, s)unsigned int re_size_plus8 = (s)->size_in_bits_plus8; | ||||
| 387 | LAST_SKIP_BITS(re, s, n)re_index = ((re_size_plus8) > (re_index + (n)) ? (re_index + (n)) : (re_size_plus8)); | ||||
| 388 | CLOSE_READER(re, s)(s)->index = re_index; | ||||
| 389 | } | ||||
| 390 | |||||
| 391 | static inline unsigned int get_bits1(GetBitContext *s) | ||||
| 392 | { | ||||
| 393 | unsigned int index = s->index; | ||||
| 394 | uint8_t result = s->buffer[index >> 3]; | ||||
| 395 | #ifdef BITSTREAM_READER_LE | ||||
| 396 | result >>= index & 7; | ||||
| 397 | result &= 1; | ||||
| 398 | #else | ||||
| 399 | result <<= index & 7; | ||||
| 400 | result >>= 8 - 1; | ||||
| 401 | #endif | ||||
| 402 | #if !UNCHECKED_BITSTREAM_READER!1 | ||||
| 403 | if (s->index < s->size_in_bits_plus8) | ||||
| 404 | #endif | ||||
| 405 | index++; | ||||
| 406 | s->index = index; | ||||
| 407 | |||||
| 408 | return result; | ||||
| 409 | } | ||||
| 410 | |||||
| 411 | static inline unsigned int show_bits1(GetBitContext *s) | ||||
| 412 | { | ||||
| 413 | return show_bits(s, 1); | ||||
| 414 | } | ||||
| 415 | |||||
| 416 | static inline void skip_bits1(GetBitContext *s) | ||||
| 417 | { | ||||
| 418 | skip_bits(s, 1); | ||||
| 419 | } | ||||
| 420 | |||||
| 421 | /** | ||||
| 422 | * Read 0-32 bits. | ||||
| 423 | */ | ||||
| 424 | static inline unsigned int get_bits_long(GetBitContext *s, int n) | ||||
| 425 | { | ||||
| 426 | av_assert2(n>=0 && n<=32)do { if (!(n>=0 && n<=32)) { av_log(((void*)0), 0, "Assertion %s failed at %s:%d\n", "n>=0 && n<=32" , "/root/firefox-clang/media/ffvpx/libavcodec/get_bits.h", 426 ); abort(); } } while (0); | ||||
| 427 | if (!n) { | ||||
| 428 | return 0; | ||||
| 429 | } else if ((!HAVE_FAST_64BIT1 || av_builtin_constant_p__builtin_constant_p(n <= MIN_CACHE_BITS25)) | ||||
| 430 | && n <= MIN_CACHE_BITS25) { | ||||
| 431 | return get_bits(s, n); | ||||
| 432 | } else { | ||||
| 433 | #if HAVE_FAST_64BIT1 | ||||
| 434 | unsigned tmp; | ||||
| 435 | OPEN_READER(re, s)unsigned int re_index = (s)->index; unsigned int re_cache; unsigned int re_size_plus8 = (s)->size_in_bits_plus8; | ||||
| 436 | UPDATE_CACHE_32(re, s)re_cache = av_bswap64((((const union unaligned_64 *) ((((s))) ->buffer + (re_index >> 3)))->l)) << (re_index & 7) >> (64 - 32); | ||||
| 437 | tmp = SHOW_UBITS(re, s, n)NEG_USR32(re_cache, n); | ||||
| 438 | LAST_SKIP_BITS(re, s, n)re_index = ((re_size_plus8) > (re_index + (n)) ? (re_index + (n)) : (re_size_plus8)); | ||||
| 439 | CLOSE_READER(re, s)(s)->index = re_index; | ||||
| 440 | return tmp; | ||||
| 441 | #else | ||||
| 442 | #ifdef BITSTREAM_READER_LE | ||||
| 443 | unsigned ret = get_bits(s, 16); | ||||
| 444 | return ret | (get_bits(s, n - 16) << 16); | ||||
| 445 | #else | ||||
| 446 | unsigned ret = get_bits(s, 16) << (n - 16); | ||||
| 447 | return ret | get_bits(s, n - 16); | ||||
| 448 | #endif | ||||
| 449 | #endif | ||||
| 450 | } | ||||
| 451 | } | ||||
| 452 | |||||
| 453 | /** | ||||
| 454 | * Read 0-64 bits. | ||||
| 455 | */ | ||||
| 456 | static inline uint64_t get_bits64(GetBitContext *s, int n) | ||||
| 457 | { | ||||
| 458 | if (n <= 32) { | ||||
| 459 | return get_bits_long(s, n); | ||||
| 460 | } else { | ||||
| 461 | #ifdef BITSTREAM_READER_LE | ||||
| 462 | uint64_t ret = get_bits_long(s, 32); | ||||
| 463 | return ret | (uint64_t) get_bits_long(s, n - 32) << 32; | ||||
| 464 | #else | ||||
| 465 | uint64_t ret = (uint64_t) get_bits_long(s, n - 32) << 32; | ||||
| 466 | return ret | get_bits_long(s, 32); | ||||
| 467 | #endif | ||||
| 468 | } | ||||
| 469 | } | ||||
| 470 | |||||
| 471 | /** | ||||
| 472 | * Read 0-32 bits as a signed integer. | ||||
| 473 | */ | ||||
| 474 | static inline int get_sbits_long(GetBitContext *s, int n) | ||||
| 475 | { | ||||
| 476 | // sign_extend(x, 0) is undefined | ||||
| 477 | if (!n) | ||||
| 478 | return 0; | ||||
| 479 | |||||
| 480 | return sign_extend(get_bits_long(s, n), n); | ||||
| 481 | } | ||||
| 482 | |||||
| 483 | /** | ||||
| 484 | * Read 0-64 bits as a signed integer. | ||||
| 485 | */ | ||||
| 486 | static inline int64_t get_sbits64(GetBitContext *s, int n) | ||||
| 487 | { | ||||
| 488 | // sign_extend(x, 0) is undefined | ||||
| 489 | if (!n) | ||||
| 490 | return 0; | ||||
| 491 | |||||
| 492 | return sign_extend64(get_bits64(s, n), n); | ||||
| 493 | } | ||||
| 494 | |||||
| 495 | /** | ||||
| 496 | * Show 0-32 bits. | ||||
| 497 | */ | ||||
| 498 | static inline unsigned int show_bits_long(GetBitContext *s, int n) | ||||
| 499 | { | ||||
| 500 | if (n <= MIN_CACHE_BITS25) { | ||||
| 501 | return show_bits(s, n); | ||||
| 502 | } else { | ||||
| 503 | GetBitContext gb = *s; | ||||
| 504 | return get_bits_long(&gb, n); | ||||
| 505 | } | ||||
| 506 | } | ||||
| 507 | |||||
| 508 | |||||
| 509 | /** | ||||
| 510 | * Initialize GetBitContext. | ||||
| 511 | * @param buffer bitstream buffer, must be AV_INPUT_BUFFER_PADDING_SIZE bytes | ||||
| 512 | * larger than the actual read bits because some optimized bitstream | ||||
| 513 | * readers read 32 or 64 bit at once and could read over the end | ||||
| 514 | * @param bit_size the size of the buffer in bits | ||||
| 515 | * @return 0 on success, AVERROR_INVALIDDATA if the buffer_size would overflow. | ||||
| 516 | */ | ||||
| 517 | static inline int init_get_bits(GetBitContext *s, const uint8_t *buffer, | ||||
| 518 | int bit_size) | ||||
| 519 | { | ||||
| 520 | int ret = 0; | ||||
| 521 | |||||
| 522 | if (bit_size >= INT_MAX2147483647 - FFMAX(7, AV_INPUT_BUFFER_PADDING_SIZE*8)((7) > (64*8) ? (7) : (64*8)) || bit_size
| ||||
| 523 | bit_size = 0; | ||||
| 524 | buffer = NULL((void*)0); | ||||
| 525 | ret = AVERROR_INVALIDDATA(-(int)(('I') | (('N') << 8) | (('D') << 16) | (( unsigned)('A') << 24))); | ||||
| 526 | } | ||||
| 527 | |||||
| 528 | s->buffer = buffer; | ||||
| 529 | s->size_in_bits = bit_size; | ||||
| 530 | s->size_in_bits_plus8 = bit_size + 8; | ||||
| 531 | s->index = 0; | ||||
| 532 | |||||
| 533 | return ret; | ||||
| 534 | } | ||||
| 535 | |||||
| 536 | /** | ||||
| 537 | * Initialize GetBitContext. | ||||
| 538 | * @param buffer bitstream buffer, must be AV_INPUT_BUFFER_PADDING_SIZE bytes | ||||
| 539 | * larger than the actual read bits because some optimized bitstream | ||||
| 540 | * readers read 32 or 64 bit at once and could read over the end | ||||
| 541 | * @param byte_size the size of the buffer in bytes | ||||
| 542 | * @return 0 on success, AVERROR_INVALIDDATA if the buffer_size would overflow. | ||||
| 543 | */ | ||||
| 544 | static inline int init_get_bits8(GetBitContext *s, const uint8_t *buffer, | ||||
| 545 | int byte_size) | ||||
| 546 | { | ||||
| 547 | if (byte_size > INT_MAX2147483647 / 8 || byte_size < 0) | ||||
| 548 | byte_size = -1; | ||||
| 549 | return init_get_bits(s, buffer, byte_size * 8); | ||||
| 550 | } | ||||
| 551 | |||||
| 552 | static inline int init_get_bits8_le(GetBitContext *s, const uint8_t *buffer, | ||||
| 553 | int byte_size) | ||||
| 554 | { | ||||
| 555 | if (byte_size > INT_MAX2147483647 / 8 || byte_size < 0) | ||||
| 556 | byte_size = -1; | ||||
| 557 | return init_get_bits(s, buffer, byte_size * 8); | ||||
| 558 | } | ||||
| 559 | |||||
| 560 | static inline const uint8_t *align_get_bits(GetBitContext *s) | ||||
| 561 | { | ||||
| 562 | int n = -get_bits_count(s) & 7; | ||||
| 563 | if (n) | ||||
| 564 | skip_bits(s, n); | ||||
| 565 | return s->buffer + (s->index >> 3); | ||||
| 566 | } | ||||
| 567 | |||||
| 568 | /** | ||||
| 569 | * If the vlc code is invalid and max_depth=1, then no bits will be removed. | ||||
| 570 | * If the vlc code is invalid and max_depth>1, then the number of bits removed | ||||
| 571 | * is undefined. | ||||
| 572 | */ | ||||
| 573 | #define GET_VLC(code, name, gb, table, bits, max_depth)do { unsigned idx_ = NEG_USR32(name_cache, bits); code = table [idx_].sym; int n_ = table[idx_].len; if (max_depth > 1 && n_ < 0) { name_index = ((name_size_plus8) > (name_index + (bits)) ? (name_index + (bits)) : (name_size_plus8)); name_cache = av_bswap32((((const union unaligned_32 *) (((gb))->buffer + (name_index >> 3)))->l)) << (name_index & 7) >> (32 - 32); int nb__bits = -n_; idx_ = NEG_USR32( name_cache, nb__bits) + code; code = table[idx_].sym; n_ = table [idx_].len; if (max_depth > 2 && n_ < 0) { name_index = ((name_size_plus8) > (name_index + (nb__bits)) ? (name_index + (nb__bits)) : (name_size_plus8)); name_cache = av_bswap32( (((const union unaligned_32 *) (((gb))->buffer + (name_index >> 3)))->l)) << (name_index & 7) >> (32 - 32); nb__bits = -n_; idx_ = NEG_USR32(name_cache, nb__bits ) + code; code = table[idx_].sym; n_ = table[idx_].len; } } do { name_cache <<= (n_); name_index = ((name_size_plus8) > (name_index + (n_)) ? (name_index + (n_)) : (name_size_plus8 )); } while (0); } while (0) \ | ||||
| 574 | do { \ | ||||
| 575 | unsigned idx_ = SHOW_UBITS(name, gb, bits)NEG_USR32(name_cache, bits); \ | ||||
| 576 | code = table[idx_].sym; \ | ||||
| 577 | int n_ = table[idx_].len; \ | ||||
| 578 | \ | ||||
| 579 | if (max_depth > 1 && n_ < 0) { \ | ||||
| 580 | LAST_SKIP_BITS(name, gb, bits)name_index = ((name_size_plus8) > (name_index + (bits)) ? ( name_index + (bits)) : (name_size_plus8)); \ | ||||
| 581 | UPDATE_CACHE(name, gb)name_cache = av_bswap32((((const union unaligned_32 *) (((gb) )->buffer + (name_index >> 3)))->l)) << (name_index & 7) >> (32 - 32); \ | ||||
| 582 | \ | ||||
| 583 | int nb__bits = -n_; \ | ||||
| 584 | \ | ||||
| 585 | idx_ = SHOW_UBITS(name, gb, nb__bits)NEG_USR32(name_cache, nb__bits) + code; \ | ||||
| 586 | code = table[idx_].sym; \ | ||||
| 587 | n_ = table[idx_].len; \ | ||||
| 588 | if (max_depth > 2 && n_ < 0) { \ | ||||
| 589 | LAST_SKIP_BITS(name, gb, nb__bits)name_index = ((name_size_plus8) > (name_index + (nb__bits) ) ? (name_index + (nb__bits)) : (name_size_plus8)); \ | ||||
| 590 | UPDATE_CACHE(name, gb)name_cache = av_bswap32((((const union unaligned_32 *) (((gb) )->buffer + (name_index >> 3)))->l)) << (name_index & 7) >> (32 - 32); \ | ||||
| 591 | \ | ||||
| 592 | nb__bits = -n_; \ | ||||
| 593 | \ | ||||
| 594 | idx_ = SHOW_UBITS(name, gb, nb__bits)NEG_USR32(name_cache, nb__bits) + code; \ | ||||
| 595 | code = table[idx_].sym; \ | ||||
| 596 | n_ = table[idx_].len; \ | ||||
| 597 | } \ | ||||
| 598 | } \ | ||||
| 599 | SKIP_BITS(name, gb, n_)do { name_cache <<= (n_); name_index = ((name_size_plus8 ) > (name_index + (n_)) ? (name_index + (n_)) : (name_size_plus8 )); } while (0); \ | ||||
| 600 | } while (0) | ||||
| 601 | |||||
| 602 | #define GET_RL_VLC(level, run, name, gb, table, bits, \do { unsigned idx_ = NEG_USR32(name_cache, bits); level = table [idx_].level; int n_ = table[idx_].len8; if (max_depth > 1 && n_ < 0) { do { name_cache <<= (bits); name_index = ((name_size_plus8) > (name_index + (bits)) ? (name_index + (bits)) : (name_size_plus8)); } while (0); if (need_update ) { name_cache = av_bswap32((((const union unaligned_32 *) (( (gb))->buffer + (name_index >> 3)))->l)) << (name_index & 7) >> (32 - 32); } int nb__bits = -n_ ; idx_ = NEG_USR32(name_cache, nb__bits) + level; level = table [idx_].level; n_ = table[idx_].len8; if (max_depth > 2 && n_ < 0) { name_index = ((name_size_plus8) > (name_index + (nb__bits)) ? (name_index + (nb__bits)) : (name_size_plus8 )); if (need_update) { name_cache = av_bswap32((((const union unaligned_32 *) (((gb))->buffer + (name_index >> 3) ))->l)) << (name_index & 7) >> (32 - 32); } nb__bits = -n_; idx_ = NEG_USR32(name_cache, nb__bits) + level ; level = table[idx_].level; n_ = table[idx_].len8; } } run = table[idx_].run; do { name_cache <<= (n_); name_index = ((name_size_plus8) > (name_index + (n_)) ? (name_index + ( n_)) : (name_size_plus8)); } while (0); } while (0) | ||||
| 603 | max_depth, need_update)do { unsigned idx_ = NEG_USR32(name_cache, bits); level = table [idx_].level; int n_ = table[idx_].len8; if (max_depth > 1 && n_ < 0) { do { name_cache <<= (bits); name_index = ((name_size_plus8) > (name_index + (bits)) ? (name_index + (bits)) : (name_size_plus8)); } while (0); if (need_update ) { name_cache = av_bswap32((((const union unaligned_32 *) (( (gb))->buffer + (name_index >> 3)))->l)) << (name_index & 7) >> (32 - 32); } int nb__bits = -n_ ; idx_ = NEG_USR32(name_cache, nb__bits) + level; level = table [idx_].level; n_ = table[idx_].len8; if (max_depth > 2 && n_ < 0) { name_index = ((name_size_plus8) > (name_index + (nb__bits)) ? (name_index + (nb__bits)) : (name_size_plus8 )); if (need_update) { name_cache = av_bswap32((((const union unaligned_32 *) (((gb))->buffer + (name_index >> 3) ))->l)) << (name_index & 7) >> (32 - 32); } nb__bits = -n_; idx_ = NEG_USR32(name_cache, nb__bits) + level ; level = table[idx_].level; n_ = table[idx_].len8; } } run = table[idx_].run; do { name_cache <<= (n_); name_index = ((name_size_plus8) > (name_index + (n_)) ? (name_index + ( n_)) : (name_size_plus8)); } while (0); } while (0) \ | ||||
| 604 | do { \ | ||||
| 605 | unsigned idx_ = SHOW_UBITS(name, gb, bits)NEG_USR32(name_cache, bits); \ | ||||
| 606 | level = table[idx_].level; \ | ||||
| 607 | int n_ = table[idx_].len8; \ | ||||
| 608 | \ | ||||
| 609 | if (max_depth > 1 && n_ < 0) { \ | ||||
| 610 | SKIP_BITS(name, gb, bits)do { name_cache <<= (bits); name_index = ((name_size_plus8 ) > (name_index + (bits)) ? (name_index + (bits)) : (name_size_plus8 )); } while (0); \ | ||||
| 611 | if (need_update) { \ | ||||
| 612 | UPDATE_CACHE(name, gb)name_cache = av_bswap32((((const union unaligned_32 *) (((gb) )->buffer + (name_index >> 3)))->l)) << (name_index & 7) >> (32 - 32); \ | ||||
| 613 | } \ | ||||
| 614 | \ | ||||
| 615 | int nb__bits = -n_; \ | ||||
| 616 | \ | ||||
| 617 | idx_ = SHOW_UBITS(name, gb, nb__bits)NEG_USR32(name_cache, nb__bits) + level; \ | ||||
| 618 | level = table[idx_].level; \ | ||||
| 619 | n_ = table[idx_].len8; \ | ||||
| 620 | if (max_depth > 2 && n_ < 0) { \ | ||||
| 621 | LAST_SKIP_BITS(name, gb, nb__bits)name_index = ((name_size_plus8) > (name_index + (nb__bits) ) ? (name_index + (nb__bits)) : (name_size_plus8)); \ | ||||
| 622 | if (need_update) { \ | ||||
| 623 | UPDATE_CACHE(name, gb)name_cache = av_bswap32((((const union unaligned_32 *) (((gb) )->buffer + (name_index >> 3)))->l)) << (name_index & 7) >> (32 - 32); \ | ||||
| 624 | } \ | ||||
| 625 | nb__bits = -n_; \ | ||||
| 626 | \ | ||||
| 627 | idx_ = SHOW_UBITS(name, gb, nb__bits)NEG_USR32(name_cache, nb__bits) + level; \ | ||||
| 628 | level = table[idx_].level; \ | ||||
| 629 | n_ = table[idx_].len8; \ | ||||
| 630 | } \ | ||||
| 631 | } \ | ||||
| 632 | run = table[idx_].run; \ | ||||
| 633 | SKIP_BITS(name, gb, n_)do { name_cache <<= (n_); name_index = ((name_size_plus8 ) > (name_index + (n_)) ? (name_index + (n_)) : (name_size_plus8 )); } while (0); \ | ||||
| 634 | } while (0) | ||||
| 635 | |||||
| 636 | /** | ||||
| 637 | * Parse a vlc code. | ||||
| 638 | * @param bits is the number of bits which will be read at once, must be | ||||
| 639 | * identical to nb_bits in vlc_init() | ||||
| 640 | * @param max_depth is the number of times bits bits must be read to completely | ||||
| 641 | * read the longest vlc code | ||||
| 642 | * = (max_vlc_length + bits - 1) / bits | ||||
| 643 | * @returns the code parsed or -1 if no vlc matches | ||||
| 644 | */ | ||||
| 645 | static av_always_inline__attribute__((always_inline)) inline int get_vlc2(GetBitContext *s, const VLCElem *table, | ||||
| 646 | int bits, int max_depth) | ||||
| 647 | { | ||||
| 648 | int code; | ||||
| 649 | |||||
| 650 | OPEN_READER(re, s)unsigned int re_index = (s)->index; unsigned int re_cache; unsigned int re_size_plus8 = (s)->size_in_bits_plus8; | ||||
| 651 | UPDATE_CACHE(re, s)re_cache = av_bswap32((((const union unaligned_32 *) (((s))-> buffer + (re_index >> 3)))->l)) << (re_index & 7) >> (32 - 32); | ||||
| 652 | |||||
| 653 | GET_VLC(code, re, s, table, bits, max_depth)do { unsigned idx_ = NEG_USR32(re_cache, bits); code = table[ idx_].sym; int n_ = table[idx_].len; if (max_depth > 1 && n_ < 0) { re_index = ((re_size_plus8) > (re_index + (bits )) ? (re_index + (bits)) : (re_size_plus8)); re_cache = av_bswap32 ((((const union unaligned_32 *) (((s))->buffer + (re_index >> 3)))->l)) << (re_index & 7) >> ( 32 - 32); int nb__bits = -n_; idx_ = NEG_USR32(re_cache, nb__bits ) + code; code = table[idx_].sym; n_ = table[idx_].len; if (max_depth > 2 && n_ < 0) { re_index = ((re_size_plus8) > (re_index + (nb__bits)) ? (re_index + (nb__bits)) : (re_size_plus8 )); re_cache = av_bswap32((((const union unaligned_32 *) (((s ))->buffer + (re_index >> 3)))->l)) << (re_index & 7) >> (32 - 32); nb__bits = -n_; idx_ = NEG_USR32 (re_cache, nb__bits) + code; code = table[idx_].sym; n_ = table [idx_].len; } } do { re_cache <<= (n_); re_index = ((re_size_plus8 ) > (re_index + (n_)) ? (re_index + (n_)) : (re_size_plus8 )); } while (0); } while (0); | ||||
| 654 | |||||
| 655 | CLOSE_READER(re, s)(s)->index = re_index; | ||||
| 656 | |||||
| 657 | return code; | ||||
| 658 | } | ||||
| 659 | |||||
| 660 | static inline int get_vlc_multi(GetBitContext *s, uint8_t *dst, | ||||
| 661 | av_unused__attribute__((unused)) const VLC_MULTI_ELEM *const Jtable, | ||||
| 662 | const VLCElem *const table, | ||||
| 663 | const int bits, const int max_depth, | ||||
| 664 | av_unused__attribute__((unused)) const int symbols_size) | ||||
| 665 | { | ||||
| 666 | dst[0] = get_vlc2(s, table, bits, max_depth); | ||||
| 667 | return 1; | ||||
| 668 | } | ||||
| 669 | |||||
| 670 | static inline int decode012(GetBitContext *gb) | ||||
| 671 | { | ||||
| 672 | int n; | ||||
| 673 | n = get_bits1(gb); | ||||
| 674 | if (n == 0) | ||||
| 675 | return 0; | ||||
| 676 | else | ||||
| 677 | return get_bits1(gb) + 1; | ||||
| 678 | } | ||||
| 679 | |||||
| 680 | static inline int decode210(GetBitContext *gb) | ||||
| 681 | { | ||||
| 682 | if (get_bits1(gb)) | ||||
| 683 | return 0; | ||||
| 684 | else | ||||
| 685 | return 2 - get_bits1(gb); | ||||
| 686 | } | ||||
| 687 | |||||
| 688 | static inline int get_bits_left(GetBitContext *gb) | ||||
| 689 | { | ||||
| 690 | return gb->size_in_bits - get_bits_count(gb); | ||||
| 691 | } | ||||
| 692 | |||||
| 693 | static inline int skip_1stop_8data_bits(GetBitContext *gb) | ||||
| 694 | { | ||||
| 695 | if (get_bits_left(gb) <= 0) | ||||
| 696 | return AVERROR_INVALIDDATA(-(int)(('I') | (('N') << 8) | (('D') << 16) | (( unsigned)('A') << 24))); | ||||
| 697 | |||||
| 698 | while (get_bits1(gb)) { | ||||
| 699 | skip_bits(gb, 8); | ||||
| 700 | if (get_bits_left(gb) <= 0) | ||||
| 701 | return AVERROR_INVALIDDATA(-(int)(('I') | (('N') << 8) | (('D') << 16) | (( unsigned)('A') << 24))); | ||||
| 702 | } | ||||
| 703 | |||||
| 704 | return 0; | ||||
| 705 | } | ||||
| 706 | |||||
| 707 | #endif // CACHED_BITSTREAM_READER | ||||
| 708 | |||||
| 709 | #endif /* AVCODEC_GET_BITS_H */ |