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.

324 line
8.2KB

  1. // ITU-T H.222.0(10/2014)
  2. // Information technology - Generic coding of moving pictures and associated audio information: Systems
  3. // 2.4.3.6 PES packet(p51)
  4. #include "mpeg-pes-internal.h"
  5. #include <stdio.h>
  6. #include <string.h>
  7. #include <assert.h>
  8. /// @return 0-error, other-pes header length
  9. int pes_read_header(struct pes_t *pes, struct mpeg_bits_t* reader)
  10. {
  11. uint8_t v8;
  12. uint16_t v16;
  13. uint32_t v32;
  14. size_t end;
  15. //pes->sid = mpeg_bits_read8(reader);
  16. pes->len = mpeg_bits_read16(reader);
  17. v8 = mpeg_bits_read8(reader);
  18. //assert(0x02 == ((v8 >> 6) & 0x3));
  19. pes->PES_scrambling_control = (v8 >> 4) & 0x3;
  20. pes->PES_priority = (v8 >> 3) & 0x1;
  21. pes->data_alignment_indicator = (v8 >> 2) & 0x1;
  22. pes->copyright = (v8 >> 1) & 0x1;
  23. pes->original_or_copy = v8 & 0x1;
  24. v8 = mpeg_bits_read8(reader);
  25. pes->PTS_DTS_flags = (v8 >> 6) & 0x3;
  26. pes->ESCR_flag = (v8 >> 5) & 0x1;
  27. pes->ES_rate_flag = (v8 >> 4) & 0x1;
  28. pes->DSM_trick_mode_flag = (v8 >> 3) & 0x1;
  29. pes->additional_copy_info_flag = (v8 >> 2) & 0x1;
  30. pes->PES_CRC_flag = (v8 >> 1) & 0x1;
  31. pes->PES_extension_flag = v8 & 0x1;
  32. pes->PES_header_data_length = mpeg_bits_read8(reader);
  33. if (pes->len > 0 && pes->len < pes->PES_header_data_length + 3)
  34. return MPEG_ERROR_INVALID_DATA; // skip invalid packet
  35. end = mpeg_bits_tell(reader) + pes->PES_header_data_length;
  36. if (mpeg_bits_error(reader) || end > mpeg_bits_length(reader))
  37. return MPEG_ERROR_NEED_MORE_DATA;
  38. if (0x02 & pes->PTS_DTS_flags)
  39. {
  40. v8 = mpeg_bits_read8(reader);
  41. //assert(0x20 == (v8 & 0x20));
  42. pes->pts = ((((uint64_t)v8 >> 1) & 0x07) << 30) | mpeg_bits_read30(reader);
  43. }
  44. //else
  45. //{
  46. // pes->pts = PTS_NO_VALUE;
  47. //}
  48. if (0x01 & pes->PTS_DTS_flags)
  49. {
  50. v8 = mpeg_bits_read8(reader);
  51. //assert(0x10 == (v8 & 0x10));
  52. pes->dts = ((((uint64_t)v8 >> 1) & 0x07) << 30) | mpeg_bits_read30(reader);
  53. }
  54. else if(0x02 & pes->PTS_DTS_flags)
  55. {
  56. // has pts
  57. pes->dts = pes->pts;
  58. }
  59. //else
  60. //{
  61. // pes->dts = PTS_NO_VALUE;
  62. //}
  63. if (pes->ESCR_flag)
  64. {
  65. v32 = mpeg_bits_read32(reader);
  66. v16 = mpeg_bits_read16(reader);
  67. pes->ESCR_base = (((uint64_t)((v32 >> 27) & 0x07)) << 30) | (((uint64_t)((v32 >> 11) & 0x7FFF)) << 15) | (((uint64_t)(v32 & 0x3FF)) << 5) | ((uint64_t)(v16 >> 11) & 0x1F);
  68. pes->ESCR_extension = (v16 >> 1) & 0x1FF;
  69. }
  70. if (pes->ES_rate_flag)
  71. {
  72. pes->ES_rate = (mpeg_bits_read8(reader) & 0x7F) << 15;
  73. pes->ES_rate |= mpeg_bits_read15(reader);
  74. }
  75. if (pes->DSM_trick_mode_flag)
  76. {
  77. // TODO:
  78. //mpeg_bits_skip(reader, 1);
  79. }
  80. if (pes->additional_copy_info_flag)
  81. {
  82. //mpeg_bits_skip(reader, 1);
  83. }
  84. if (pes->PES_CRC_flag)
  85. {
  86. //mpeg_bits_skip(reader, 2);
  87. }
  88. if (pes->PES_extension_flag)
  89. {
  90. }
  91. if (pes->len > 0)
  92. {
  93. if (pes->len < pes->PES_header_data_length + 3)
  94. return MPEG_ERROR_INVALID_DATA; // skip invalid packet
  95. pes->len -= pes->PES_header_data_length + 3;
  96. }
  97. assert(pes->len >= 0); // TS pes->len maybe 0(payload > 65535)
  98. mpeg_bits_seek(reader, end);
  99. assert(0 == mpeg_bits_error(reader));
  100. return mpeg_bits_error(reader) ? MPEG_ERROR_INVALID_DATA : MPEG_ERROR_OK;
  101. }
  102. /// @return 0-error, pes header length
  103. size_t pes_write_header(const struct pes_t *pes, uint8_t* data, size_t bytes)
  104. {
  105. uint8_t len = 0;
  106. uint8_t flags = 0x00;
  107. uint8_t *p = NULL;
  108. if (bytes < 9) return 0; // error
  109. // packet_start_code_prefix 0x000001
  110. data[0] = 0x00;
  111. data[1] = 0x00;
  112. data[2] = 0x01;
  113. data[3] = pes->sid;
  114. // skip PES_packet_length
  115. //data[4] = 0x00;
  116. //data[5] = 0x00;
  117. // '10'
  118. // PES_scrambling_control '00'
  119. // PES_priority '0'
  120. // data_alignment_indicator '1'
  121. // copyright '0'
  122. // original_or_copy '0'
  123. data[6] = 0x80;
  124. if(pes->data_alignment_indicator)
  125. data[6] |= 0x04;
  126. //if (IDR | subtitle | raw data)
  127. //data[6] |= 0x04;
  128. // PTS_DTS_flag 'xx'
  129. // ESCR_flag '0'
  130. // ES_rate_flag '0'
  131. // DSM_trick_mode_flag '0'
  132. // additional_copy_info_flag '0'
  133. // PES_CRC_flag '0'
  134. // PES_extension_flag '0'
  135. if(PTS_NO_VALUE != pes->pts)
  136. {
  137. flags |= 0x80; // pts
  138. len += 5;
  139. }
  140. assert(PTS_NO_VALUE == pes->dts || pes->pts == pes->dts || PES_SID_VIDEO == data[3]); // audio PTS==DTS
  141. if(PTS_NO_VALUE != pes->dts /*&& PES_SID_VIDEO==(PES_SID_VIDEO&data[3])*/ && pes->dts != pes->pts)
  142. {
  143. flags |= 0x40; // dts
  144. len += 5;
  145. }
  146. data[7] = flags;
  147. // PES_header_data_length : 8
  148. data[8] = len;
  149. if ((size_t)len + 9 > bytes)
  150. return 0; // error
  151. p = data + 9;
  152. if(flags & 0x80)
  153. {
  154. *p++ = ((flags >> 2) & 0x30)/* 0011/0010 */ | (((pes->pts >> 30) & 0x07) << 1) /* PTS 30-32 */ | 0x01 /* marker_bit */;
  155. *p++ = (pes->pts >> 22) & 0xFF; /* PTS 22-29 */
  156. *p++ = ((pes->pts >> 14) & 0xFE) /* PTS 15-21 */ | 0x01 /* marker_bit */;
  157. *p++ = (pes->pts >> 7) & 0xFF; /* PTS 7-14 */
  158. *p++ = ((pes->pts << 1) & 0xFE) /* PTS 0-6 */ | 0x01 /* marker_bit */;
  159. }
  160. if(flags & 0x40)
  161. {
  162. *p++ = 0x10 /* 0001 */ | (((pes->dts >> 30) & 0x07) << 1) /* DTS 30-32 */ | 0x01 /* marker_bit */;
  163. *p++ = (pes->dts >> 22) & 0xFF; /* DTS 22-29 */
  164. *p++ = ((pes->dts >> 14) & 0xFE) /* DTS 15-21 */ | 0x01 /* marker_bit */;
  165. *p++ = (pes->dts >> 7) & 0xFF; /* DTS 7-14 */
  166. *p++ = ((pes->dts << 1) & 0xFE) /* DTS 0-6 */ | 0x01 /* marker_bit */;
  167. }
  168. return p - data;
  169. }
  170. // ISO/IEC 11172-1
  171. // 2.4.3.3 Packet Layer (p20)
  172. /*
  173. packet() {
  174. packet_start_code_prefix 24 bslbf
  175. stream_id 8 uimsbf
  176. packet_length 16 uimsbf
  177. if (packet_start_code != private_stream_2) {
  178. while (nextbits() == '1')
  179. stuffing_byte 8 bslbf
  180. if (nextbits () == '01') {
  181. '01' 2 bslbf
  182. STD_buffer_scale 1 bslbf
  183. STD_buffer_size 13 uimsbf
  184. }
  185. if (nextbits() == '0010') {
  186. '0010' 4 bslbf
  187. presentation_time_stamp[32..30] 3 bslbf
  188. marker_bit 1 bslbf
  189. presentation_time_stamp[29..15] 15 bslbf
  190. marker_bit 1 bslbf
  191. presentation_time_stamp[14..0] 15 bslbf
  192. marker_bit 1 bslbf
  193. }
  194. else if (nextbits() == '0011') {
  195. '0011' 4 bslbf
  196. presentation_time_stamp[32..30] 3 bslbf
  197. marker_bit 1 bslbf
  198. presentation_time_stamp[29..15] 15 bslbf
  199. marker_bit 1 bslbf
  200. presentation_time_stamp[14..0] 15 bslbf
  201. marker_bit 1 bslbf
  202. '0001' 4 bslbf
  203. decoding_time_stamp[32..30] 3 bslbf
  204. marker_bit 1 bslbf
  205. decoding_time_stamp[29..15] 15 bslbf
  206. marker_bit 1 bslbf
  207. decoding_time_stamp[14..0] 15 bslbf
  208. marker_bit 1 bslbf
  209. }
  210. else
  211. '0000 1111' 8 bslbf
  212. }
  213. for (i = 0; i < N; i++) {
  214. packet_data_byte 8 bslbf
  215. }
  216. }
  217. */
  218. int pes_read_mpeg1_header(struct pes_t *pes, struct mpeg_bits_t* reader)
  219. {
  220. uint8_t v8;
  221. size_t offset;
  222. //pes->sid = mpeg_bits_read8(reader);
  223. pes->len = mpeg_bits_read16(reader);
  224. offset = mpeg_bits_tell(reader);
  225. do
  226. {
  227. v8 = mpeg_bits_read8(reader);
  228. } while (0 == mpeg_bits_error(reader) && v8 == 0xFF);
  229. if (0x40 == (0xC0 & v8))
  230. {
  231. mpeg_bits_skip(reader, 2); // skip STD_buffer_scale / STD_buffer_size
  232. v8 = mpeg_bits_read8(reader);
  233. }
  234. if (0x20 == (0xF0 & v8))
  235. {
  236. pes->pts = ((((uint64_t)v8 >> 1) & 0x07) << 30) | mpeg_bits_read30(reader);
  237. }
  238. else if (0x30 == (0xF0 & v8))
  239. {
  240. pes->pts = ((((uint64_t)v8 >> 1) & 0x07) << 30) | mpeg_bits_read30(reader);
  241. v8 = mpeg_bits_read8(reader);
  242. pes->dts = ((((uint64_t)v8 >> 1) & 0x07) << 30) | mpeg_bits_read30(reader);
  243. }
  244. else
  245. {
  246. assert(0x0F == v8);
  247. }
  248. if (mpeg_bits_error(reader))
  249. return MPEG_ERROR_NEED_MORE_DATA;
  250. offset = mpeg_bits_tell(reader) - offset;
  251. if (pes->len > 0)
  252. {
  253. if (pes->len < offset)
  254. return MPEG_ERROR_INVALID_DATA; // invalid data length
  255. pes->len -= (uint32_t)offset;
  256. }
  257. assert(0 == mpeg_bits_error(reader));
  258. return MPEG_ERROR_OK;
  259. }
  260. uint16_t mpeg_bits_read15(struct mpeg_bits_t* reader)
  261. {
  262. uint16_t v;
  263. v = ((uint16_t)mpeg_bits_read8(reader)) << 7;
  264. v |= (mpeg_bits_read8(reader) >> 1) & 0x7F;
  265. return v;
  266. }
  267. uint32_t mpeg_bits_read30(struct mpeg_bits_t* reader)
  268. {
  269. uint32_t v;
  270. v = ((uint32_t)mpeg_bits_read15(reader)) << 15;
  271. v |= mpeg_bits_read15(reader);
  272. return v;
  273. }
  274. uint64_t mpeg_bits_read45(struct mpeg_bits_t* reader)
  275. {
  276. uint64_t v;
  277. v = ((uint64_t)mpeg_bits_read15(reader)) << 30;
  278. v |= ((uint64_t)mpeg_bits_read15(reader)) << 15;
  279. v |= mpeg_bits_read15(reader);
  280. return v;
  281. }