vl_rbsp.h revision 848b8605
1/************************************************************************** 2 * 3 * Copyright 2013 Advanced Micro Devices, Inc. 4 * All Rights Reserved. 5 * 6 * Permission is hereby granted, free of charge, to any person obtaining a 7 * copy of this software and associated documentation files (the 8 * "Software"), to deal in the Software without restriction, including 9 * without limitation the rights to use, copy, modify, merge, publish, 10 * distribute, sub license, and/or sell copies of the Software, and to 11 * permit persons to whom the Software is furnished to do so, subject to 12 * the following conditions: 13 * 14 * The above copyright notice and this permission notice (including the 15 * next paragraph) shall be included in all copies or substantial portions 16 * of the Software. 17 * 18 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS 19 * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF 20 * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT. 21 * IN NO EVENT SHALL THE COPYRIGHT HOLDER(S) OR AUTHOR(S) BE LIABLE FOR 22 * ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, 23 * TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE 24 * SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. 25 * 26 **************************************************************************/ 27 28/* 29 * Authors: 30 * Christian König <christian.koenig@amd.com> 31 * 32 */ 33 34/* 35 * Functions for reading the raw byte sequence payload of H.264 36 */ 37 38#ifndef vl_rbsp_h 39#define vl_rbsp_h 40 41#include "vl/vl_vlc.h" 42 43struct vl_rbsp { 44 struct vl_vlc nal; 45 unsigned escaped; 46}; 47 48/** 49 * Initialize the RBSP object 50 */ 51static INLINE void vl_rbsp_init(struct vl_rbsp *rbsp, struct vl_vlc *nal, unsigned num_bits) 52{ 53 unsigned bits_left = vl_vlc_bits_left(nal); 54 55 /* copy the position */ 56 rbsp->nal = *nal; 57 58 rbsp->escaped = 0; 59 60 /* search for the end of the NAL unit */ 61 while (vl_vlc_search_byte(nal, num_bits, 0x00)) { 62 if (vl_vlc_peekbits(nal, 24) == 0x000001 || 63 vl_vlc_peekbits(nal, 32) == 0x00000001) { 64 vl_vlc_limit(&rbsp->nal, bits_left - vl_vlc_bits_left(nal)); 65 return; 66 } 67 vl_vlc_eatbits(nal, 8); 68 } 69} 70 71/** 72 * Make at least 16 more bits available 73 */ 74static INLINE void vl_rbsp_fillbits(struct vl_rbsp *rbsp) 75{ 76 unsigned valid = vl_vlc_valid_bits(&rbsp->nal); 77 unsigned i, bits; 78 79 /* abort if we still have enough bits */ 80 if (valid >= 32) 81 return; 82 83 vl_vlc_fillbits(&rbsp->nal); 84 85 /* abort if we have less than 24 bits left in this nal */ 86 if (vl_vlc_bits_left(&rbsp->nal) < 24) 87 return; 88 89 /* check that we have enough bits left from the last fillbits */ 90 assert(valid >= rbsp->escaped); 91 92 /* handle the already escaped bits */ 93 valid -= rbsp->escaped; 94 95 /* search for the emulation prevention three byte */ 96 rbsp->escaped = 16; 97 bits = vl_vlc_valid_bits(&rbsp->nal); 98 for (i = valid + 24; i <= bits; i += 8) { 99 if ((vl_vlc_peekbits(&rbsp->nal, i) & 0xffffff) == 0x3) { 100 vl_vlc_removebits(&rbsp->nal, i - 8, 8); 101 rbsp->escaped = bits - i; 102 bits -= 8; 103 i += 8; 104 } 105 } 106} 107 108/** 109 * Return an unsigned integer from the first n bits 110 */ 111static INLINE unsigned vl_rbsp_u(struct vl_rbsp *rbsp, unsigned n) 112{ 113 if (n == 0) 114 return 0; 115 116 vl_rbsp_fillbits(rbsp); 117 return vl_vlc_get_uimsbf(&rbsp->nal, n); 118} 119 120/** 121 * Return an unsigned exponential Golomb encoded integer 122 */ 123static INLINE unsigned vl_rbsp_ue(struct vl_rbsp *rbsp) 124{ 125 unsigned bits = 0; 126 127 vl_rbsp_fillbits(rbsp); 128 while (!vl_vlc_get_uimsbf(&rbsp->nal, 1)) 129 ++bits; 130 131 return (1 << bits) - 1 + vl_rbsp_u(rbsp, bits); 132} 133 134/** 135 * Return an signed exponential Golomb encoded integer 136 */ 137static INLINE signed vl_rbsp_se(struct vl_rbsp *rbsp) 138{ 139 signed codeNum = vl_rbsp_ue(rbsp); 140 if (codeNum & 1) 141 return (codeNum + 1) >> 1; 142 else 143 return -(codeNum >> 1); 144} 145 146/** 147 * Are more data available in the RBSP ? 148 */ 149static INLINE bool vl_rbsp_more_data(struct vl_rbsp *rbsp) 150{ 151 unsigned bits, value; 152 153 if (vl_vlc_bits_left(&rbsp->nal) > 8) 154 return TRUE; 155 156 bits = vl_vlc_valid_bits(&rbsp->nal); 157 value = vl_vlc_peekbits(&rbsp->nal, bits); 158 if (value == 0 || value == (1 << (bits - 1))) 159 return FALSE; 160 161 return TRUE; 162} 163 164#endif /* vl_rbsp_h */ 165