Вы не можете выбрать более 25 тем Темы должны начинаться с буквы или цифры, могут содержать дефисы(-) и должны содержать не более 35 символов.

10 месяцев назад
123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273
  1. // ITU-T H.222.0(10/2014)
  2. // Information technology - Generic coding of moving pictures and associated audio information: Systems
  3. // 2.5.4 Program stream map(p82)
  4. #include "mpeg-ps-internal.h"
  5. #include "mpeg-pes-internal.h"
  6. #include "mpeg-element-descriptor.h"
  7. #include "mpeg-util.h"
  8. #include <assert.h>
  9. #include <string.h>
  10. static struct pes_t* psm_fetch(struct psm_t* psm, uint8_t sid)
  11. {
  12. size_t i;
  13. for (i = 0; i < psm->stream_count; i++)
  14. {
  15. if (psm->streams[i].sid == sid)
  16. return &psm->streams[i];
  17. }
  18. if (psm->stream_count >= sizeof(psm->streams) / sizeof(psm->streams[0]))
  19. {
  20. assert(0);
  21. return NULL;
  22. }
  23. // new stream
  24. return &psm->streams[psm->stream_count++];
  25. }
  26. #if 1
  27. int psm_read(struct psm_t* psm, struct mpeg_bits_t* reader)
  28. {
  29. uint8_t v8;
  30. size_t end, off;
  31. struct pes_t* stream;
  32. //uint8_t current_next_indicator;
  33. uint8_t single_extension_stream_flag;
  34. uint16_t program_stream_map_length;
  35. uint16_t program_stream_info_length;
  36. uint16_t element_stream_map_length;
  37. uint16_t element_stream_info_length;
  38. uint8_t cid, sid;
  39. // Table 2-41 - Program stream map(p79)
  40. program_stream_map_length = mpeg_bits_read16(reader); // (data[4] << 8) | data[5];
  41. end = mpeg_bits_tell(reader) + program_stream_map_length;
  42. if (mpeg_bits_error(reader) || end > mpeg_bits_length(reader))
  43. return MPEG_ERROR_NEED_MORE_DATA;
  44. v8 = mpeg_bits_read8(reader); // data[6]
  45. //assert((0x20 & data[6]) == 0x00); // 'xx0xxxxx'
  46. //current_next_indicator = (data[6] >> 7) & 0x01;
  47. single_extension_stream_flag = (uint8_t)(v8 >> 6) & 0x01; //(data[6] >> 6) & 0x01;
  48. psm->ver = v8 & 0x1F;
  49. mpeg_bits_read8(reader); //assert(data[7] == 0x01); // '00000001'
  50. // program stream descriptor
  51. program_stream_info_length = mpeg_bits_read16(reader); //(data[8] << 8) | data[9];
  52. if ((uint32_t)program_stream_info_length + 4 + 2 /*element_stream_map_length*/ > (uint32_t)program_stream_map_length)
  53. return MPEG_ERROR_INVALID_DATA;
  54. // TODO: parse descriptor
  55. //for (i = 10; i + 2 <= 10 + program_stream_info_length;)
  56. //{
  57. // // descriptor()
  58. // i += mpeg_elment_descriptor(data + i, 10 + program_stream_info_length - i);
  59. //}
  60. mpeg_bits_skip(reader, program_stream_info_length); // 10 + program_stream_info_length;
  61. // program element stream
  62. element_stream_map_length = mpeg_bits_read16(reader);
  63. /* Ignore es_map_length, trust psm_length */
  64. element_stream_map_length = program_stream_map_length - program_stream_info_length - 10;
  65. end = mpeg_bits_tell(reader) + element_stream_map_length;
  66. while (0 == mpeg_bits_error(reader)
  67. && mpeg_bits_tell(reader) + 4 /*element_stream_info_length*/ <= end
  68. && psm->stream_count < sizeof(psm->streams) / sizeof(psm->streams[0]))
  69. {
  70. cid = mpeg_bits_read8(reader);
  71. sid = mpeg_bits_read8(reader);
  72. element_stream_info_length = mpeg_bits_read16(reader);
  73. if (mpeg_bits_tell(reader) + element_stream_info_length > end)
  74. return MPEG_ERROR_INVALID_DATA;
  75. stream = psm_fetch(psm, sid); // sid
  76. if (NULL == stream)
  77. continue;
  78. stream->codecid = cid;
  79. stream->sid = sid;
  80. stream->pid = stream->sid; // for ts PID
  81. off = mpeg_bits_tell(reader);
  82. if (0xFD == stream->sid && 0 == single_extension_stream_flag)
  83. {
  84. if (element_stream_info_length < 3)
  85. return MPEG_ERROR_INVALID_DATA;
  86. //uint8_t pseudo_descriptor_tag = mpeg_bits_read8(reader);
  87. //uint8_t pseudo_descriptor_length = mpeg_bits_read8(reader)
  88. //uint8_t element_stream_id_extension = mpeg_bits_read8(reader) & 0x7F;
  89. //assert((0x80 & data[k + 2]) == 0x80); // '1xxxxxxx'
  90. mpeg_bits_skip(reader, 3);
  91. }
  92. while (0 == mpeg_bits_error(reader) && mpeg_bits_tell(reader) < off + element_stream_info_length)
  93. {
  94. // descriptor()
  95. mpeg_elment_descriptor(reader);
  96. }
  97. assert(mpeg_bits_tell(reader) == off + element_stream_info_length);
  98. mpeg_bits_seek(reader, off + element_stream_info_length); // make sure
  99. }
  100. mpeg_bits_read32(reader); // crc32
  101. // assert(j+4 == program_stream_map_length+6);
  102. // assert(0 == mpeg_crc32(0xffffffff, data, program_stream_map_length+6));
  103. assert(0 == mpeg_bits_error(reader));
  104. assert(end + 4 /*crc32*/ == mpeg_bits_tell(reader));
  105. return MPEG_ERROR_OK;
  106. }
  107. #else
  108. size_t psm_read(struct psm_t *psm, const uint8_t* data, size_t bytes)
  109. {
  110. size_t i, j, k;
  111. struct pes_t* stream;
  112. //uint8_t current_next_indicator;
  113. uint8_t single_extension_stream_flag;
  114. uint16_t program_stream_map_length;
  115. uint16_t program_stream_info_length;
  116. uint16_t element_stream_map_length;
  117. uint16_t element_stream_info_length;
  118. // Table 2-41 - Program stream map(p79)
  119. assert(0x00==data[0] && 0x00==data[1] && 0x01==data[2] && 0xBC==data[3]);
  120. program_stream_map_length = (data[4] << 8) | data[5];
  121. if (program_stream_map_length < 3 || bytes < (size_t)program_stream_map_length + 6)
  122. return 0; // invalid data length
  123. //assert((0x20 & data[6]) == 0x00); // 'xx0xxxxx'
  124. //current_next_indicator = (data[6] >> 7) & 0x01;
  125. single_extension_stream_flag = (data[6] >> 6) & 0x01;
  126. psm->ver = data[6] & 0x1F;
  127. //assert(data[7] == 0x01); // '00000001'
  128. // program stream descriptor
  129. program_stream_info_length = (data[8] << 8) | data[9];
  130. if ((size_t)program_stream_info_length + 4 + 2 /*element_stream_map_length*/ > (size_t)program_stream_map_length)
  131. return 0; // TODO: error
  132. // TODO: parse descriptor
  133. //for (i = 10; i + 2 <= 10 + program_stream_info_length;)
  134. //{
  135. // // descriptor()
  136. // i += mpeg_elment_descriptor(data + i, 10 + program_stream_info_length - i);
  137. //}
  138. // program element stream
  139. i = 10 + program_stream_info_length;
  140. element_stream_map_length = (data[i] << 8) | data[i+1];
  141. /* Ignore es_map_length, trust psm_length */
  142. element_stream_map_length = program_stream_map_length - program_stream_info_length - 10;
  143. i += 2;
  144. for(j = i; j + 4/*element_stream_info_length*/ <= i+element_stream_map_length && psm->stream_count < sizeof(psm->streams)/sizeof(psm->streams[0]); j += 4 + element_stream_info_length)
  145. {
  146. element_stream_info_length = (data[j + 2] << 8) | data[j + 3];
  147. if (j + 4 + element_stream_info_length > i + element_stream_map_length)
  148. return 0; // TODO: error
  149. stream = psm_fetch(psm, data[j + 1]); // sid
  150. if (NULL == stream)
  151. continue;
  152. stream->codecid = data[j];
  153. stream->sid = data[j+1];
  154. stream->pid = stream->sid; // for ts PID
  155. k = j + 4;
  156. if(0xFD == stream->sid && 0 == single_extension_stream_flag)
  157. {
  158. if(element_stream_info_length < 3)
  159. return 0; // TODO: error
  160. // uint8_t pseudo_descriptor_tag = data[k];
  161. // uint8_t pseudo_descriptor_length = data[k+1];
  162. // uint8_t element_stream_id_extension = data[k+2] & 0x7F;
  163. assert((0x80 & data[k+2]) == 0x80); // '1xxxxxxx'
  164. k += 3;
  165. }
  166. while(k + 2 <= j + 4 + element_stream_info_length)
  167. {
  168. // descriptor()
  169. k += mpeg_elment_descriptor(data+k, j + 4 + element_stream_info_length - k);
  170. }
  171. assert(k - j - 4 == element_stream_info_length);
  172. }
  173. // assert(j+4 == program_stream_map_length+6);
  174. // assert(0 == mpeg_crc32(0xffffffff, data, program_stream_map_length+6));
  175. return program_stream_map_length+6;
  176. }
  177. #endif
  178. size_t psm_write(const struct psm_t *psm, uint8_t *data)
  179. {
  180. // Table 2-41 - Program stream map(p79)
  181. size_t i,j;
  182. uint16_t extlen;
  183. unsigned int crc;
  184. nbo_w32(data, 0x00000100);
  185. data[3] = PES_SID_PSM;
  186. // program_stream_map_length 16-bits
  187. //nbo_w16(data+4, 6+4*psm->stream_count+4);
  188. // current_next_indicator '1'
  189. // single_extension_stream_flag '1'
  190. // reserved '0'
  191. // program_stream_map_version 'xxxxx'
  192. data[6] = 0xc0 | (psm->ver & 0x1F);
  193. // reserved '0000000'
  194. // marker_bit '1'
  195. data[7] = 0x01;
  196. extlen = 0;
  197. extlen += (uint16_t)service_extension_descriptor_write(data + 10 + extlen, 32);
  198. #if defined(MPEG_CLOCK_EXTENSION_DESCRIPTOR)
  199. extlen += (uint16_t)clock_extension_descriptor_write(data + 10 + extlen, 32, psm->clock);
  200. #endif
  201. // program_stream_info_length 16-bits
  202. nbo_w16(data + 8, extlen); // program_stream_info_length = 0
  203. // elementary_stream_map_length 16-bits
  204. //nbo_w16(data+10+extlen, psm->stream_count*4);
  205. j = 12 + extlen;
  206. for(i = 0; i < psm->stream_count; i++)
  207. {
  208. assert(PES_SID_EXTEND != psm->streams[i].sid);
  209. // stream_type:8
  210. data[j++] = psm->streams[i].codecid;
  211. // elementary_stream_id:8
  212. data[j++] = psm->streams[i].sid;
  213. // elementary_stream_info_length:16
  214. nbo_w16(data+j, psm->streams[i].esinfo_len);
  215. // descriptor()
  216. memcpy(data+j+2, psm->streams[i].esinfo, psm->streams[i].esinfo_len);
  217. j += 2 + psm->streams[i].esinfo_len;
  218. }
  219. // elementary_stream_map_length 16-bits
  220. nbo_w16(data + 10 + extlen, (uint16_t)(j - 12 - extlen));
  221. // program_stream_map_length:16
  222. nbo_w16(data + 4, (uint16_t)(j-6+4)); // 4-bytes crc32
  223. // crc32
  224. crc = mpeg_crc32(0xffffffff, data, (uint32_t)j);
  225. data[j+3] = (uint8_t)((crc >> 24) & 0xFF);
  226. data[j+2] = (uint8_t)((crc >> 16) & 0xFF);
  227. data[j+1] = (uint8_t)((crc >> 8) & 0xFF);
  228. data[j+0] = (uint8_t)(crc & 0xFF);
  229. return j+4;
  230. }