diff options
Diffstat (limited to '')
-rw-r--r-- | libfreerdp/codec/rfx_bitstream.h | 107 |
1 files changed, 107 insertions, 0 deletions
diff --git a/libfreerdp/codec/rfx_bitstream.h b/libfreerdp/codec/rfx_bitstream.h new file mode 100644 index 0000000..3e84242 --- /dev/null +++ b/libfreerdp/codec/rfx_bitstream.h @@ -0,0 +1,107 @@ +/** + * FreeRDP: A Remote Desktop Protocol Implementation + * RemoteFX Codec Library - Bit Stream + * + * Copyright 2011 Vic Lee + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#ifndef FREERDP_LIB_CODEC_RFX_BITSTREAM_H +#define FREERDP_LIB_CODEC_RFX_BITSTREAM_H + +#include <freerdp/codec/rfx.h> + +typedef struct +{ + BYTE* buffer; + int nbytes; + int byte_pos; + int bits_left; +} RFX_BITSTREAM; + +#define rfx_bitstream_attach(bs, _buffer, _nbytes) \ + do \ + { \ + bs->buffer = (BYTE*)(_buffer); \ + bs->nbytes = (_nbytes); \ + bs->byte_pos = 0; \ + bs->bits_left = 8; \ + } while (0) + +#define rfx_bitstream_get_bits(bs, _nbits, _r) \ + do \ + { \ + int nbits = _nbits; \ + int b; \ + UINT16 n = 0; \ + while (bs->byte_pos < bs->nbytes && nbits > 0) \ + { \ + b = nbits; \ + if (b > bs->bits_left) \ + b = bs->bits_left; \ + if (n) \ + n <<= b; \ + n |= (bs->buffer[bs->byte_pos] >> (bs->bits_left - b)) & ((1 << b) - 1); \ + bs->bits_left -= b; \ + nbits -= b; \ + if (bs->bits_left == 0) \ + { \ + bs->bits_left = 8; \ + bs->byte_pos++; \ + } \ + } \ + _r = n; \ + } while (0) + +#define rfx_bitstream_put_bits(bs, _bits, _nbits) \ + do \ + { \ + UINT16 bits = (_bits); \ + int nbits = (_nbits); \ + int b; \ + while (bs->byte_pos < bs->nbytes && nbits > 0) \ + { \ + b = nbits; \ + if (b > bs->bits_left) \ + b = bs->bits_left; \ + bs->buffer[bs->byte_pos] |= ((bits >> (nbits - b)) & ((1 << b) - 1)) \ + << (bs->bits_left - b); \ + bs->bits_left -= b; \ + nbits -= b; \ + if (bs->bits_left == 0) \ + { \ + bs->bits_left = 8; \ + bs->byte_pos++; \ + } \ + } \ + } while (0) +#define rfx_bitstream_flush(bs) \ + do \ + { \ + if (bs->bits_left != 8) \ + { \ + int _nbits = 8 - bs->bits_left; \ + rfx_bitstream_put_bits(bs, 0, _nbits); \ + } \ + } while (0) + +#define rfx_bitstream_eos(_bs) ((_bs)->byte_pos >= (_bs)->nbytes) +#define rfx_bitstream_left(_bs) \ + ((_bs)->byte_pos >= (_bs)->nbytes \ + ? 0 \ + : ((_bs)->nbytes - (_bs)->byte_pos - 1) * 8 + (_bs)->bits_left) +#define rfx_bitstream_get_processed_bytes(_bs) \ + ((_bs)->bits_left < 8 ? (_bs)->byte_pos + 1 : (_bs)->byte_pos) + +#endif /* FREERDP_LIB_CODEC_RFX_BITSTREAM_H */ |