Subversion Repositories Kolibri OS

Rev

Blame | Last modification | View Log | RSS feed

  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.  
  43. struct vl_rbsp {
  44.    struct vl_vlc nal;
  45.    unsigned escaped;
  46. };
  47.  
  48. /**
  49.  * Initialize the RBSP object
  50.  */
  51. static 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.  */
  74. static 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.  */
  111. static 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.  */
  123. static 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.  */
  137. static 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.  */
  149. static 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.