You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

mpeg-util.h 3.6KB

10 months ago
123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167
  1. #ifndef _mpeg_util_h_
  2. #define _mpeg_util_h_
  3. #include "mpeg-types.h"
  4. #include <assert.h>
  5. struct mpeg_bits_t
  6. {
  7. struct
  8. {
  9. const uint8_t* ptr;
  10. size_t len;
  11. } data[2];
  12. size_t count; // data count
  13. size_t len; // total length
  14. size_t off; // total offset
  15. int err; // flags
  16. };
  17. static inline void mpeg_bits_init(struct mpeg_bits_t* bits, const void* data, size_t bytes)
  18. {
  19. bits->data[0].ptr = (const uint8_t*)data;
  20. bits->data[0].len = bytes;
  21. bits->count = 1;
  22. bits->len = bytes;
  23. bits->off = 0;
  24. bits->err = 0;
  25. }
  26. static inline void mpeg_bits_init2(struct mpeg_bits_t* bits, const void* data1, size_t bytes1, const void* data2, size_t bytes2)
  27. {
  28. bits->data[0].ptr = (const uint8_t*)data1;
  29. bits->data[0].len = bytes1;
  30. bits->data[1].ptr = (const uint8_t*)data2;
  31. bits->data[1].len = bytes2;
  32. bits->len = bytes1 + bytes2;
  33. bits->count = 2;
  34. bits->off = 0;
  35. bits->err = 0;
  36. }
  37. /// @return 0-ok, other-error
  38. static inline int mpeg_bits_error(struct mpeg_bits_t* bits)
  39. {
  40. return bits->err;
  41. }
  42. static inline size_t mpeg_bits_length(struct mpeg_bits_t* bits)
  43. {
  44. return bits->len;
  45. }
  46. static inline size_t mpeg_bits_tell(struct mpeg_bits_t* bits)
  47. {
  48. return bits->off;
  49. }
  50. static inline void mpeg_bits_seek(struct mpeg_bits_t* bits, size_t n)
  51. {
  52. bits->off = n;
  53. if (n > bits->len)
  54. bits->err = 1;
  55. }
  56. static inline void mpeg_bits_skip(struct mpeg_bits_t* bits, size_t n)
  57. {
  58. bits->off += n;
  59. if (bits->off > bits->len)
  60. bits->err = 1;
  61. }
  62. static inline uint8_t mpeg_bits_read8(struct mpeg_bits_t* bits)
  63. {
  64. size_t i, at;
  65. at = bits->off;
  66. for (i = 0; 0 == bits->err && i < bits->count; i++)
  67. {
  68. if (at < bits->data[i].len)
  69. {
  70. bits->off++;
  71. return bits->data[i].ptr[at];
  72. }
  73. at -= bits->data[i].len;
  74. }
  75. bits->err = 1;
  76. return 0;
  77. }
  78. static inline uint16_t mpeg_bits_read16(struct mpeg_bits_t* bits)
  79. {
  80. uint16_t v;
  81. v = (uint16_t)mpeg_bits_read8(bits) << 8;
  82. v |= mpeg_bits_read8(bits);
  83. return v;
  84. }
  85. static inline uint32_t mpeg_bits_read32(struct mpeg_bits_t* bits)
  86. {
  87. uint32_t v;
  88. v = ((uint32_t)mpeg_bits_read16(bits)) << 16;
  89. v |= mpeg_bits_read16(bits);
  90. return v;
  91. }
  92. static inline uint64_t mpeg_bits_read64(struct mpeg_bits_t* bits)
  93. {
  94. uint64_t v;
  95. v = ((uint64_t)mpeg_bits_read32(bits)) << 32;
  96. v |= mpeg_bits_read32(bits);
  97. return v;
  98. }
  99. static inline uint64_t mpeg_bits_readn(struct mpeg_bits_t* bits, size_t n)
  100. {
  101. size_t i;
  102. uint64_t v;
  103. for (v = i = 0; i < n && i < 8; i++)
  104. v = (v << 8) | mpeg_bits_read8(bits);
  105. return v;
  106. }
  107. static inline uint64_t mpeg_bits_tryread(struct mpeg_bits_t* bits, size_t n)
  108. {
  109. uint64_t v;
  110. size_t i, offset;
  111. if (bits->err || bits->off + n > bits->len)
  112. return 0;
  113. offset = mpeg_bits_tell(bits);
  114. for (v = i = 0; i < n && i < 8; i++)
  115. v = (v << 8) | mpeg_bits_read8(bits);
  116. mpeg_bits_seek(bits, offset);
  117. return v;
  118. }
  119. static inline void nbo_w16(uint8_t* ptr, uint16_t val)
  120. {
  121. ptr[0] = (uint8_t)((val >> 8) & 0xFF);
  122. ptr[1] = (uint8_t)(val & 0xFF);
  123. }
  124. static inline void nbo_w32(uint8_t* ptr, uint32_t val)
  125. {
  126. ptr[0] = (uint8_t)((val >> 24) & 0xFF);
  127. ptr[1] = (uint8_t)((val >> 16) & 0xFF);
  128. ptr[2] = (uint8_t)((val >> 8) & 0xFF);
  129. ptr[3] = (uint8_t)(val & 0xFF);
  130. }
  131. void pcr_write(uint8_t *ptr, int64_t pcr);
  132. int mpeg_stream_type_audio(int codecid);
  133. int mpeg_stream_type_video(int codecid);
  134. int mpeg_h264_find_nalu(const uint8_t* p, size_t bytes, size_t* leading);
  135. int mpeg_h264_find_new_access_unit(const uint8_t* data, size_t bytes, int* vcl);
  136. int mpeg_h265_find_new_access_unit(const uint8_t* data, size_t bytes, int* vcl);
  137. int mpeg_h26x_verify(const uint8_t* data, size_t bytes, int* codec);
  138. uint32_t mpeg_crc32(uint32_t crc, const uint8_t *buffer, uint32_t size);
  139. #endif /* !_mpeg_util_h_ */