intreadwrite.h
上传用户:lctgjx
上传日期:2022-06-04
资源大小:8887k
文件大小:7k
源码类别:

流媒体/Mpeg4/MP4

开发平台:

Visual C++

  1. /*
  2.  * This file is part of FFmpeg.
  3.  *
  4.  * FFmpeg is free software; you can redistribute it and/or
  5.  * modify it under the terms of the GNU Lesser General Public
  6.  * License as published by the Free Software Foundation; either
  7.  * version 2.1 of the License, or (at your option) any later version.
  8.  *
  9.  * FFmpeg is distributed in the hope that it will be useful,
  10.  * but WITHOUT ANY WARRANTY; without even the implied warranty of
  11.  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
  12.  * Lesser General Public License for more details.
  13.  *
  14.  * You should have received a copy of the GNU Lesser General Public
  15.  * License along with FFmpeg; if not, write to the Free Software
  16.  * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
  17.  */
  18. #ifndef FFMPEG_INTREADWRITE_H
  19. #define FFMPEG_INTREADWRITE_H
  20. #include "bswap.h"
  21. #ifdef __GNUC__
  22. struct unaligned_64 { uint64_t l; } __attribute__((packed));
  23. struct unaligned_32 { uint32_t l; } __attribute__((packed));
  24. struct unaligned_16 { uint16_t l; } __attribute__((packed));
  25. #define AV_RN16(a) (((const struct unaligned_16 *) (a))->l)
  26. #define AV_RN32(a) (((const struct unaligned_32 *) (a))->l)
  27. #define AV_RN64(a) (((const struct unaligned_64 *) (a))->l)
  28. #define AV_WN16(a, b) (((struct unaligned_16 *) (a))->l) = (b)
  29. #define AV_WN32(a, b) (((struct unaligned_32 *) (a))->l) = (b)
  30. #define AV_WN64(a, b) (((struct unaligned_64 *) (a))->l) = (b)
  31. #else /* __GNUC__ */
  32. #define AV_RN16(a) (*((const uint16_t*)(a)))
  33. #define AV_RN32(a) (*((const uint32_t*)(a)))
  34. #define AV_RN64(a) (*((const uint64_t*)(a)))
  35. #define AV_WN16(a, b) *((uint16_t*)(a)) = (b)
  36. #define AV_WN32(a, b) *((uint32_t*)(a)) = (b)
  37. #define AV_WN64(a, b) *((uint64_t*)(a)) = (b)
  38. #endif /* !__GNUC__ */
  39. /* endian macros */
  40. #define AV_RB8(x)     (((const uint8_t*)(x))[0])
  41. #define AV_WB8(p, d)  do { ((uint8_t*)(p))[0] = (d); } while(0)
  42. #define AV_RL8(x)     AV_RB8(x)
  43. #define AV_WL8(p, d)  AV_WB8(p, d)
  44. #ifdef HAVE_FAST_UNALIGNED
  45. # ifdef WORDS_BIGENDIAN
  46. #  define AV_RB16(x)    AV_RN16(x)
  47. #  define AV_WB16(p, d) AV_WN16(p, d)
  48. #  define AV_RL16(x)    bswap_16(AV_RN16(x))
  49. #  define AV_WL16(p, d) AV_WN16(p, bswap_16(d))
  50. # else /* WORDS_BIGENDIAN */
  51. #  define AV_RB16(x)    bswap_16(AV_RN16(x))
  52. #  define AV_WB16(p, d) AV_WN16(p, bswap_16(d))
  53. #  define AV_RL16(x)    AV_RN16(x)
  54. #  define AV_WL16(p, d) AV_WN16(p, d)
  55. # endif
  56. #else /* HAVE_FAST_UNALIGNED */
  57. #define AV_RB16(x)  ((((const uint8_t*)(x))[0] << 8) | ((const uint8_t*)(x))[1])
  58. #define AV_WB16(p, d) do { 
  59.                     ((uint8_t*)(p))[1] = (d); 
  60.                     ((uint8_t*)(p))[0] = (d)>>8; } while(0)
  61. #define AV_RL16(x)  ((((const uint8_t*)(x))[1] << 8) | 
  62.                       ((const uint8_t*)(x))[0])
  63. #define AV_WL16(p, d) do { 
  64.                     ((uint8_t*)(p))[0] = (d); 
  65.                     ((uint8_t*)(p))[1] = (d)>>8; } while(0)
  66. #endif
  67. #define AV_RB24(x)  ((((const uint8_t*)(x))[0] << 16) | 
  68.                      (((const uint8_t*)(x))[1] <<  8) | 
  69.                       ((const uint8_t*)(x))[2])
  70. #define AV_WB24(p, d) do { 
  71.                     ((uint8_t*)(p))[2] = (d); 
  72.                     ((uint8_t*)(p))[1] = (d)>>8; 
  73.                     ((uint8_t*)(p))[0] = (d)>>16; } while(0)
  74. #define AV_RL24(x)  ((((const uint8_t*)(x))[2] << 16) | 
  75.                      (((const uint8_t*)(x))[1] <<  8) | 
  76.                       ((const uint8_t*)(x))[0])
  77. #define AV_WL24(p, d) do { 
  78.                     ((uint8_t*)(p))[0] = (d); 
  79.                     ((uint8_t*)(p))[1] = (d)>>8; 
  80.                     ((uint8_t*)(p))[2] = (d)>>16; } while(0)
  81. #ifdef HAVE_FAST_UNALIGNED
  82. # ifdef WORDS_BIGENDIAN
  83. #  define AV_RB32(x)    AV_RN32(x)
  84. #  define AV_WB32(p, d) AV_WN32(p, d)
  85. #  define AV_RL32(x)    bswap_32(AV_RN32(x))
  86. #  define AV_WL32(p, d) AV_WN32(p, bswap_32(d))
  87. # else /* WORDS_BIGENDIAN */
  88. #  define AV_RB32(x)    bswap_32(AV_RN32(x))
  89. #  define AV_WB32(p, d) AV_WN32(p, bswap_32(d))
  90. #  define AV_RL32(x)    AV_RN32(x)
  91. #  define AV_WL32(p, d) AV_WN32(p, d)
  92. # endif
  93. #else /* HAVE_FAST_UNALIGNED */
  94. #define AV_RB32(x)  ((((const uint8_t*)(x))[0] << 24) | 
  95.                      (((const uint8_t*)(x))[1] << 16) | 
  96.                      (((const uint8_t*)(x))[2] <<  8) | 
  97.                       ((const uint8_t*)(x))[3])
  98. #define AV_WB32(p, d) do { 
  99.                     ((uint8_t*)(p))[3] = (d); 
  100.                     ((uint8_t*)(p))[2] = (d)>>8; 
  101.                     ((uint8_t*)(p))[1] = (d)>>16; 
  102.                     ((uint8_t*)(p))[0] = (d)>>24; } while(0)
  103. #define AV_RL32(x) ((((const uint8_t*)(x))[3] << 24) | 
  104.                     (((const uint8_t*)(x))[2] << 16) | 
  105.                     (((const uint8_t*)(x))[1] <<  8) | 
  106.                      ((const uint8_t*)(x))[0])
  107. #define AV_WL32(p, d) do { 
  108.                     ((uint8_t*)(p))[0] = (d); 
  109.                     ((uint8_t*)(p))[1] = (d)>>8; 
  110.                     ((uint8_t*)(p))[2] = (d)>>16; 
  111.                     ((uint8_t*)(p))[3] = (d)>>24; } while(0)
  112. #endif
  113. #ifdef HAVE_FAST_UNALIGNED
  114. # ifdef WORDS_BIGENDIAN
  115. #  define AV_RB64(x)    AV_RN64(x)
  116. #  define AV_WB64(p, d) AV_WN64(p, d)
  117. #  define AV_RL64(x)    bswap_64(AV_RN64(x))
  118. #  define AV_WL64(p, d) AV_WN64(p, bswap_64(d))
  119. # else /* WORDS_BIGENDIAN */
  120. #  define AV_RB64(x)    bswap_64(AV_RN64(x))
  121. #  define AV_WB64(p, d) AV_WN64(p, bswap_64(d))
  122. #  define AV_RL64(x)    AV_RN64(x)
  123. #  define AV_WL64(p, d) AV_WN64(p, d)
  124. # endif
  125. #else /* HAVE_FAST_UNALIGNED */
  126. #define AV_RB64(x)  (((uint64_t)((const uint8_t*)(x))[0] << 56) | 
  127.                      ((uint64_t)((const uint8_t*)(x))[1] << 48) | 
  128.                      ((uint64_t)((const uint8_t*)(x))[2] << 40) | 
  129.                      ((uint64_t)((const uint8_t*)(x))[3] << 32) | 
  130.                      ((uint64_t)((const uint8_t*)(x))[4] << 24) | 
  131.                      ((uint64_t)((const uint8_t*)(x))[5] << 16) | 
  132.                      ((uint64_t)((const uint8_t*)(x))[6] <<  8) | 
  133.                       (uint64_t)((const uint8_t*)(x))[7])
  134. #define AV_WB64(p, d) do { 
  135.                     ((uint8_t*)(p))[7] = (d);     
  136.                     ((uint8_t*)(p))[6] = (d)>>8;  
  137.                     ((uint8_t*)(p))[5] = (d)>>16; 
  138.                     ((uint8_t*)(p))[4] = (d)>>24; 
  139.                     ((uint8_t*)(p))[3] = (d)>>32; 
  140.                     ((uint8_t*)(p))[2] = (d)>>40; 
  141.                     ((uint8_t*)(p))[1] = (d)>>48; 
  142.                     ((uint8_t*)(p))[0] = (d)>>56; } while(0)
  143. #define AV_RL64(x)  (((uint64_t)((const uint8_t*)(x))[7] << 56) | 
  144.                      ((uint64_t)((const uint8_t*)(x))[6] << 48) | 
  145.                      ((uint64_t)((const uint8_t*)(x))[5] << 40) | 
  146.                      ((uint64_t)((const uint8_t*)(x))[4] << 32) | 
  147.                      ((uint64_t)((const uint8_t*)(x))[3] << 24) | 
  148.                      ((uint64_t)((const uint8_t*)(x))[2] << 16) | 
  149.                      ((uint64_t)((const uint8_t*)(x))[1] <<  8) | 
  150.                       (uint64_t)((const uint8_t*)(x))[0])
  151. #define AV_WL64(p, d) do { 
  152.                     ((uint8_t*)(p))[0] = (d);     
  153.                     ((uint8_t*)(p))[1] = (d)>>8;  
  154.                     ((uint8_t*)(p))[2] = (d)>>16; 
  155.                     ((uint8_t*)(p))[3] = (d)>>24; 
  156.                     ((uint8_t*)(p))[4] = (d)>>32; 
  157.                     ((uint8_t*)(p))[5] = (d)>>40; 
  158.                     ((uint8_t*)(p))[6] = (d)>>48; 
  159.                     ((uint8_t*)(p))[7] = (d)>>56; } while(0)
  160. #endif
  161. #endif /* FFMPEG_INTREADWRITE_H */