obs-av1.c 5.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212
  1. // SPDX-FileCopyrightText: 2023 David Rosca <[email protected]>
  2. //
  3. // SPDX-License-Identifier: GPL-2.0-or-later
  4. #include "obs-av1.h"
  5. #include "obs.h"
  6. static inline uint64_t leb128(const uint8_t *buf, size_t size, size_t *len)
  7. {
  8. uint64_t value = 0;
  9. uint8_t leb128_byte;
  10. *len = 0;
  11. for (int i = 0; i < 8; i++) {
  12. if (size-- < 1)
  13. break;
  14. (*len)++;
  15. leb128_byte = buf[i];
  16. value |= (leb128_byte & 0x7f) << (i * 7);
  17. if (!(leb128_byte & 0x80))
  18. break;
  19. }
  20. return value;
  21. }
  22. static inline unsigned int get_bits(uint8_t val, unsigned int n,
  23. unsigned int count)
  24. {
  25. return (val >> (8 - n - count)) & ((1 << (count - 1)) * 2 - 1);
  26. }
  27. static void parse_obu_header(const uint8_t *buf, size_t size, size_t *obu_start,
  28. size_t *obu_size, int *obu_type)
  29. {
  30. int extension_flag, has_size_field;
  31. size_t size_len = 0;
  32. *obu_start = 0;
  33. *obu_size = 0;
  34. *obu_type = 0;
  35. if (size < 1)
  36. return;
  37. *obu_type = get_bits(*buf, 1, 4);
  38. extension_flag = get_bits(*buf, 5, 1);
  39. has_size_field = get_bits(*buf, 6, 1);
  40. if (extension_flag)
  41. (*obu_start)++;
  42. (*obu_start)++;
  43. if (has_size_field)
  44. *obu_size = (size_t)leb128(buf + *obu_start, size - *obu_start,
  45. &size_len);
  46. else
  47. *obu_size = size - 1;
  48. *obu_start += size_len;
  49. }
  50. // Pass a static 10 byte buffer in. The max size for a leb128.
  51. static inline void encode_uleb128(uint64_t val, uint8_t *out_buf,
  52. size_t *len_out)
  53. {
  54. size_t num_bytes = 0;
  55. uint8_t b = val & 0x7f;
  56. val >>= 7;
  57. while (val > 0) {
  58. out_buf[num_bytes] = b | 0x80;
  59. ++num_bytes;
  60. b = val & 0x7f;
  61. val >>= 7;
  62. }
  63. out_buf[num_bytes] = b;
  64. ++num_bytes;
  65. *len_out = num_bytes;
  66. }
  67. static const uint8_t METADATA_TYPE_ITUT_T35 = 4;
  68. static const uint8_t OBU_METADATA = 5;
  69. // Create a metadata OBU to carry caption information.
  70. void metadata_obu_itu_t35(const uint8_t *itut_t35_buffer, size_t itut_bufsize,
  71. uint8_t **out_buffer, size_t *outbuf_size)
  72. {
  73. /* From the AV1 spec: 5.3.2 OBU Header Syntax
  74. * -------------
  75. * obu_forbidden_bit (1)
  76. * obu_type (4) // In this case OBS_OBU_METADATA
  77. * obu_extension_flag (1)
  78. * obu_has_size_field (1) // Must be set, size of OBU is variable
  79. * obu_reserved_1bit (1)
  80. * if(obu_extension_flag == 1)
  81. * // skip, because we aren't setting this
  82. */
  83. uint8_t obu_header_byte = (OBU_METADATA << 3) | (1 << 1);
  84. /* From the AV1 spec: 5.3.1 General OBU Syntax
  85. * if (obu_has_size_field)
  86. * obu_size leb128()
  87. * else
  88. * obu_size = sz - 1 - obu_extension_flag
  89. *
  90. * // Skipping portions unrelated to this OBU type
  91. *
  92. * if (obu_type == OBU_METADATA)
  93. * metdata_obu()
  94. * 5.8.1 General metadata OBU Syntax
  95. * // leb128(metadatatype) should always be 1 byte +1 for trailing bits
  96. * metadata_type leb128()
  97. * 5.8.2 Metadata ITUT T35 syntax
  98. * if (metadata_type == METADATA_TYPE_ITUT_T35)
  99. * // add ITUT T35 payload
  100. * 5.8.1 General metadata OBU Syntax
  101. * // trailing bits will always be 0x80 because
  102. * // everything in here is byte aligned
  103. * trailing_bits( obu_size * 8 - payloadBits )
  104. */
  105. int64_t size_field = 1 + itut_bufsize + 1;
  106. uint8_t size_buf[10];
  107. size_t size_buf_size = 0;
  108. encode_uleb128(size_field, size_buf, &size_buf_size);
  109. // header + obu_size + metadata_type + metadata_payload + trailing_bits
  110. *outbuf_size = 1 + size_buf_size + 1 + itut_bufsize + 1;
  111. *out_buffer = bzalloc(*outbuf_size);
  112. size_t offset = 0;
  113. (*out_buffer)[0] = obu_header_byte;
  114. ++offset;
  115. memcpy((*out_buffer) + offset, size_buf, size_buf_size);
  116. offset += size_buf_size;
  117. (*out_buffer)[offset] = METADATA_TYPE_ITUT_T35;
  118. ++offset;
  119. memcpy((*out_buffer) + offset, itut_t35_buffer, itut_bufsize);
  120. offset += itut_bufsize;
  121. /* From AV1 spec: 6.2.1 General OBU semantics
  122. * ... Trailing bits are always present, unless the OBU consists of only
  123. * the header. Trailing bits achieve byte alignment when the payload of
  124. * an OBU is not byte aligned. The trailing bits may also used for
  125. * additional byte padding, and if used are taken into account in the
  126. * sz value. In all cases, the pattern used for the trailing bits
  127. * guarantees that all OBUs (except header-only OBUs) end with the same
  128. * pattern: one bit set to one, optionally followed by zeros. */
  129. (*out_buffer)[offset] = 0x80;
  130. }
  131. bool obs_av1_keyframe(const uint8_t *data, size_t size)
  132. {
  133. const uint8_t *start = data, *end = data + size;
  134. while (start < end) {
  135. size_t obu_start, obu_size;
  136. int obu_type;
  137. parse_obu_header(start, end - start, &obu_start, &obu_size,
  138. &obu_type);
  139. if (obu_size) {
  140. if (obu_type == OBS_OBU_FRAME ||
  141. obu_type == OBS_OBU_FRAME_HEADER) {
  142. uint8_t val = *(start + obu_start);
  143. if (!get_bits(val, 0, 1)) // show_existing_frame
  144. return get_bits(val, 1, 2) ==
  145. 0; // frame_type
  146. return false;
  147. }
  148. }
  149. start += obu_start + obu_size;
  150. }
  151. return false;
  152. }
  153. void obs_extract_av1_headers(const uint8_t *packet, size_t size,
  154. uint8_t **new_packet_data, size_t *new_packet_size,
  155. uint8_t **header_data, size_t *header_size)
  156. {
  157. DARRAY(uint8_t) new_packet;
  158. DARRAY(uint8_t) header;
  159. const uint8_t *start = packet, *end = packet + size;
  160. da_init(new_packet);
  161. da_init(header);
  162. while (start < end) {
  163. size_t obu_start, obu_size;
  164. int obu_type;
  165. parse_obu_header(start, end - start, &obu_start, &obu_size,
  166. &obu_type);
  167. if (obu_type == OBS_OBU_METADATA ||
  168. obu_type == OBS_OBU_SEQUENCE_HEADER) {
  169. da_push_back_array(header, start, obu_start + obu_size);
  170. }
  171. da_push_back_array(new_packet, start, obu_start + obu_size);
  172. start += obu_start + obu_size;
  173. }
  174. *new_packet_data = new_packet.array;
  175. *new_packet_size = new_packet.num;
  176. *header_data = header.array;
  177. *header_size = header.num;
  178. }