Nevar pievienot vairāk kā 25 tēmas Tēmai ir jāsākas ar burtu vai ciparu, tā var saturēt domu zīmes ('-') un var būt līdz 35 simboliem gara.

587 rindas
16KB

  1. // ITU-T H.222.0(06/2012)
  2. // Information technology - Generic coding of moving pictures and associated audio information: Systems
  3. // 2.6 Program and program element descriptors(p83)
  4. #include "mpeg-element-descriptor.h"
  5. #include <stdlib.h>
  6. #include <string.h>
  7. #include <assert.h>
  8. #include <time.h>
  9. /*
  10. 2.6 Program and program element descriptors
  11. 2.6.1 Semantic definition of fields in program and program element descriptors
  12. Table 2-45 - Program and program element descriptors
  13. tag TS PS Identification
  14. 0 n/a n/a reserved
  15. 1 n/a X forbidden
  16. 2 X X video_stream_descriptor
  17. 3 X X audio_stream_descriptor
  18. 4 X X hierarchy_descriptor
  19. 5 X X registration_descriptor
  20. 6 X X data_stream_alignment_descriptor
  21. 7 X X target_background_grid_descriptor
  22. 8 X X video_window_descriptor
  23. 9 X X CA_descriptor
  24. 10 X X ISO_639_language_descriptor
  25. 11 X X system_clock_descriptor
  26. 12 X X multiplex_buffer_utilization_descriptor
  27. 13 X X copyright_descriptor
  28. 14 X maximum_bitrate_descriptor
  29. 15 X X private_data_indicator_descriptor
  30. 16 X X smoothing_buffer_descriptor
  31. 17 X STD_descriptor
  32. 18 X X IBP_descriptor
  33. 19-26 X Defined in ISO/IEC 13818-6
  34. 27 X X MPEG-4_video_descriptor
  35. 28 X X MPEG-4_audio_descriptor
  36. 29 X X IOD_descriptor
  37. 30 X SL_descriptor
  38. 31 X X FMC_descriptor
  39. 32 X X external_ES_ID_descriptor
  40. 33 X X MuxCode_descriptor
  41. 34 X X FmxBufferSize_descriptor
  42. 35 X multiplexbuffer_descriptor
  43. 36 X X content_labeling_descriptor
  44. 37 X X metadata_pointer_descriptor
  45. 38 X X metadata_descriptor
  46. 39 X X metadata_STD_descriptor
  47. 40 X X AVC video descriptor
  48. 41 X X IPMP_descriptor (defined in ISO/IEC 13818-11, MPEG-2 IPMP)
  49. 42 X X AVC timing and HRD descriptor
  50. 43 X X MPEG-2_AAC_audio_descriptor
  51. 44 X X FlexMuxTiming_descriptor
  52. 45 X X MPEG-4_text_descriptor
  53. 46 X X MPEG-4_audio_extension_descriptor
  54. 47 X X auxiliary_video_stream_descriptor
  55. 48 X X SVC extension descriptor
  56. 49 X X MVC extension descriptor
  57. 50 X n/a J2K video descriptor
  58. 51 X X MVC operation point descriptor
  59. 52 X X MPEG2_stereoscopic_video_format_descriptor
  60. 53 X X Stereoscopic_program_info_descriptor
  61. 54 X X Stereoscopic_video_info_descriptor
  62. 55 X n/a Transport_profile_descriptor
  63. 56 X n/a HEVC video descriptor
  64. 57-63 n/a n/a Rec. ITU-T H.222.0 | ISO/IEC 13818-1 Reserved
  65. 64-255 n/a n/a User Private
  66. */
  67. int mpeg_elment_descriptor(struct mpeg_bits_t* reader)
  68. {
  69. size_t offset;
  70. uint8_t tag = mpeg_bits_read8(reader);
  71. uint8_t len = mpeg_bits_read8(reader);
  72. if (mpeg_bits_error(reader))
  73. return -1;
  74. offset = mpeg_bits_tell(reader);
  75. switch(tag)
  76. {
  77. case 2:
  78. video_stream_descriptor(reader, len);
  79. break;
  80. case 3:
  81. audio_stream_descriptor(reader, len);
  82. break;
  83. case 4:
  84. hierarchy_descriptor(reader, len);
  85. break;
  86. case 5:
  87. registration_descriptor(reader, len);
  88. break;
  89. case 10:
  90. language_descriptor(reader, len);
  91. break;
  92. case 11:
  93. system_clock_descriptor(reader, len);
  94. break;
  95. case 27:
  96. mpeg4_video_descriptor(reader, len);
  97. break;
  98. case 28:
  99. mpeg4_audio_descriptor(reader, len);
  100. break;
  101. case 37:
  102. metadata_pointer_descriptor(reader, len);
  103. break;
  104. case 38:
  105. metadata_descriptor(reader, len);
  106. break;
  107. case 40:
  108. avc_video_descriptor(reader, len);
  109. break;
  110. case 42:
  111. avc_timing_hrd_descriptor(reader, len);
  112. break;
  113. case 43:
  114. mpeg2_aac_descriptor(reader, len);
  115. break;
  116. case 48:
  117. svc_extension_descriptor(reader, len);
  118. break;
  119. case 49:
  120. mvc_extension_descriptor(reader, len);
  121. break;
  122. case 0x40:
  123. clock_extension_descriptor(reader, len);
  124. break;
  125. //default:
  126. // assert(0);
  127. }
  128. mpeg_bits_seek(reader, offset + len); // read all
  129. return mpeg_bits_error(reader) ? -1 : 0;
  130. }
  131. int video_stream_descriptor(struct mpeg_bits_t* reader, uint8_t len)
  132. {
  133. // 2.6.2 Video stream descriptor(p85)
  134. uint8_t v;
  135. video_stream_descriptor_t desc;
  136. (void)len; assert(len >= 1);
  137. memset(&desc, 0, sizeof(desc));
  138. v = mpeg_bits_read8(reader);
  139. desc.multiple_frame_rate_flag = (v >> 7) & 0x01;
  140. desc.frame_rate_code = (v >> 3) & 0x0F;
  141. desc.MPEG_1_only_flag = (v >> 2) & 0x01;
  142. desc.constrained_parameter_flag = (v >> 1) & 0x01;
  143. desc.still_picture_flag = v & 0x01;
  144. if(0 == desc.MPEG_1_only_flag)
  145. {
  146. desc.profile_and_level_indication = mpeg_bits_read8(reader);
  147. v = mpeg_bits_read8(reader);
  148. desc.chroma_format = (v >> 6) & 0x03;
  149. desc.frame_rate_code = (v >> 5) & 0x01;
  150. assert((0x1F & v) == 0x00); // 'xxx00000'
  151. }
  152. assert(0 == mpeg_bits_error(reader));
  153. return mpeg_bits_error(reader) ? -1 : 0;
  154. }
  155. int audio_stream_descriptor(struct mpeg_bits_t* reader, uint8_t len)
  156. {
  157. // 2.6.4 Audio stream descriptor(p86)
  158. uint8_t v;
  159. audio_stream_descriptor_t desc;
  160. (void)len; assert(len >= 1);
  161. v = mpeg_bits_read8(reader);
  162. memset(&desc, 0, sizeof(desc));
  163. desc.free_format_flag = (v >> 7) & 0x01;
  164. desc.ID = (v >> 6) & 0x01;
  165. desc.layer = (v >> 4) & 0x03;
  166. desc.variable_rate_audio_indicator = (v >> 3) & 0x01;
  167. assert(0 == mpeg_bits_error(reader));
  168. return mpeg_bits_error(reader) ? -1 : 0;
  169. }
  170. int hierarchy_descriptor(struct mpeg_bits_t* reader, uint8_t len)
  171. {
  172. // 2.6.6 Hierarchy descriptor(p86)
  173. uint8_t v;
  174. hierarchy_descriptor_t desc;
  175. (void)len; assert(len >= 4);
  176. v = mpeg_bits_read8(reader);
  177. memset(&desc, 0, sizeof(desc));
  178. desc.no_view_scalability_flag = (v >> 7) & 0x01;
  179. desc.no_temporal_scalability_flag = (v >> 6) & 0x01;
  180. desc.no_spatial_scalability_flag = (v >> 5) & 0x01;
  181. desc.no_quality_scalability_flag = (v >> 4) & 0x01;
  182. desc.hierarchy_type = v & 0x0F;
  183. desc.hierarchy_layer_index = mpeg_bits_read8(reader) & 0x3F;
  184. v = mpeg_bits_read8(reader);
  185. desc.tref_present_flag = (v >> 7) & 0x01;
  186. desc.hierarchy_embedded_layer_index = v & 0x3F;
  187. desc.hierarchy_channel = mpeg_bits_read8(reader) & 0x3F;
  188. assert(0 == mpeg_bits_error(reader));
  189. return mpeg_bits_error(reader) ? -1 : 0;
  190. }
  191. int registration_descriptor(struct mpeg_bits_t* reader, uint8_t len)
  192. {
  193. // 2.6.8 Registration descriptor(p94)
  194. size_t fourcc;
  195. (void)len; assert(len >= 4);
  196. fourcc = mpeg_bits_read32(reader);
  197. (void)fourcc;
  198. assert(0 == mpeg_bits_error(reader));
  199. return mpeg_bits_error(reader) ? -1 : 0;
  200. }
  201. int language_descriptor(struct mpeg_bits_t* reader, uint8_t len)
  202. {
  203. // 2.6.18 ISO 639 language descriptor(p92)
  204. uint8_t i;
  205. uint32_t v;
  206. for (i = 0; i + 4 < len; i += 4)
  207. {
  208. language_descriptor_t desc;
  209. memset(&desc, 0, sizeof(desc));
  210. v = mpeg_bits_read32(reader);
  211. desc.code = v >> 8;
  212. desc.audio = v & 0xFF;
  213. }
  214. return mpeg_bits_error(reader) ? -1 : 0;
  215. }
  216. int system_clock_descriptor(struct mpeg_bits_t* reader, uint8_t len)
  217. {
  218. // 2.6.20 System clock descriptor(p92)
  219. uint8_t v;
  220. system_clock_descriptor_t desc;
  221. (void)len; assert(len >= 2);
  222. v = mpeg_bits_read8(reader);
  223. memset(&desc, 0, sizeof(desc));
  224. desc.external_clock_reference_indicator = (v >> 7) & 0x01;
  225. desc.clock_accuracy_integer = v & 0x3F;
  226. desc.clock_accuracy_exponent = (mpeg_bits_read8(reader) >> 5) & 0x07;
  227. assert(0 == mpeg_bits_error(reader));
  228. return mpeg_bits_error(reader) ? -1 : 0;
  229. }
  230. int mpeg4_video_descriptor(struct mpeg_bits_t* reader, uint8_t len)
  231. {
  232. // 2.6.36 MPEG-4 video descriptor(p96)
  233. mpeg4_video_descriptor_t desc;
  234. (void)len; assert(len >= 1);
  235. memset(&desc, 0, sizeof(desc));
  236. desc.visual_profile_and_level = mpeg_bits_read8(reader);
  237. assert(0 == mpeg_bits_error(reader));
  238. return mpeg_bits_error(reader) ? -1 : 0;
  239. }
  240. int mpeg4_audio_descriptor(struct mpeg_bits_t* reader, uint8_t len)
  241. {
  242. // 2.6.38 MPEG-4 audio descriptor(p97)
  243. mpeg4_audio_descriptor_t desc;
  244. (void)len; assert(len >= 1);
  245. memset(&desc, 0, sizeof(desc));
  246. desc.profile_and_level = mpeg_bits_read8(reader);
  247. assert(0 == mpeg_bits_error(reader));
  248. return mpeg_bits_error(reader) ? -1 : 0;
  249. }
  250. int metadata_pointer_descriptor(struct mpeg_bits_t* reader, uint8_t len)
  251. {
  252. // 2.6.58 Metadata pointer descriptor(p112)
  253. uint8_t flags;
  254. metadata_pointer_descriptor_t desc;
  255. (void)len; assert(len >= 5);
  256. desc.metadata_application_format_identifier = mpeg_bits_read16(reader);
  257. if (0xFFFF == desc.metadata_application_format_identifier)
  258. desc.metadata_application_format_identifier = mpeg_bits_read32(reader);
  259. desc.metadata_format_identifier = mpeg_bits_read8(reader);
  260. if (0xFF == desc.metadata_format_identifier)
  261. desc.metadata_format_identifier = mpeg_bits_read32(reader);
  262. desc.metadata_service_id = mpeg_bits_read8(reader);
  263. flags = mpeg_bits_read8(reader);
  264. desc.MPEG_carriage_flags = (flags >> 5) & 0x03;
  265. if (flags & 0x80) // metadata_locator_record_flag
  266. {
  267. desc.metadata_locator_record_length = mpeg_bits_read8(reader);
  268. mpeg_bits_skip(reader, desc.metadata_locator_record_length); // metadata_locator_record_byte
  269. }
  270. if (desc.MPEG_carriage_flags <= 2)
  271. desc.program_number = mpeg_bits_read16(reader);
  272. if (1 == desc.MPEG_carriage_flags)
  273. {
  274. desc.transport_stream_location = mpeg_bits_read16(reader);
  275. desc.transport_stream_id = mpeg_bits_read16(reader);
  276. }
  277. assert(0 == mpeg_bits_error(reader));
  278. return mpeg_bits_error(reader) ? -1 : 0;
  279. }
  280. int metadata_descriptor(struct mpeg_bits_t* reader, uint8_t len)
  281. {
  282. // 2.6.60 Metadata descriptor(p115)
  283. uint8_t flags;
  284. metadata_descriptor_t desc;
  285. (void)len; assert(len >= 5);
  286. desc.metadata_application_format_identifier = mpeg_bits_read16(reader);
  287. if (0xFFFF == desc.metadata_application_format_identifier)
  288. desc.metadata_application_format_identifier = mpeg_bits_read32(reader);
  289. desc.metadata_format_identifier = mpeg_bits_read8(reader);
  290. if (0xFF == desc.metadata_format_identifier)
  291. desc.metadata_format_identifier = mpeg_bits_read32(reader);
  292. desc.metadata_service_id = mpeg_bits_read8(reader);
  293. flags = mpeg_bits_read8(reader);
  294. desc.decoder_config_flags = (flags >> 5) & 0x07;
  295. if (flags & 0x10) // DSM-CC_flag
  296. {
  297. desc.service_identification_length = mpeg_bits_read8(reader);
  298. mpeg_bits_skip(reader, desc.service_identification_length); // service_identification_record_byte
  299. }
  300. if (0x01 == desc.decoder_config_flags)
  301. {
  302. desc.decoder_config_length = mpeg_bits_read8(reader);
  303. mpeg_bits_skip(reader, desc.decoder_config_length); // decoder_config_byte
  304. }
  305. else if (0x03 == desc.decoder_config_flags)
  306. {
  307. desc.dec_config_identification_record_length = mpeg_bits_read8(reader);
  308. mpeg_bits_skip(reader, desc.dec_config_identification_record_length); // dec_config_identification_record_byte
  309. }
  310. else if (0x04 == desc.decoder_config_flags)
  311. {
  312. desc.decoder_config_metadata_service_id = mpeg_bits_read8(reader);
  313. }
  314. assert(0 == mpeg_bits_error(reader));
  315. return mpeg_bits_error(reader) ? -1 : 0;
  316. }
  317. int avc_video_descriptor(struct mpeg_bits_t* reader, uint8_t len)
  318. {
  319. // 2.6.64 AVC video descriptor(p110)
  320. uint8_t v;
  321. avc_video_descriptor_t desc;
  322. (void)len; assert(len >= 4);
  323. memset(&desc, 0, sizeof(desc));
  324. desc.profile_idc = mpeg_bits_read8(reader);
  325. v = mpeg_bits_read8(reader);
  326. desc.constraint_set0_flag = (v >> 7) & 0x01;
  327. desc.constraint_set1_flag = (v >> 6) & 0x01;
  328. desc.constraint_set2_flag = (v >> 5) & 0x01;
  329. desc.constraint_set3_flag = (v >> 4) & 0x01;
  330. desc.constraint_set4_flag = (v >> 3) & 0x01;
  331. desc.constraint_set5_flag = (v >> 2) & 0x01;
  332. desc.AVC_compatible_flags = v & 0x03;
  333. desc.level_idc = mpeg_bits_read8(reader);
  334. v = mpeg_bits_read8(reader);
  335. desc.AVC_still_present = (v >> 7) & 0x01;
  336. desc.AVC_24_hour_picture_flag = (v >> 6) & 0x01;
  337. desc.frame_packing_SEI_not_present_flag = (v >> 5) & 0x01;
  338. assert(0 == mpeg_bits_error(reader));
  339. return mpeg_bits_error(reader) ? -1 : 0;
  340. }
  341. int avc_timing_hrd_descriptor(struct mpeg_bits_t* reader, uint8_t len)
  342. {
  343. // 2.6.66 AVC timing and HRD descriptor(p112)
  344. uint8_t v;
  345. avc_timing_hrd_descriptor_t desc;
  346. (void)len; assert(len >= 2);
  347. memset(&desc, 0, sizeof(desc));
  348. v = mpeg_bits_read8(reader);
  349. desc.hrd_management_valid_flag = (v >> 7) & 0x01;
  350. desc.picture_and_timing_info_present = (v >> 0) & 0x01;
  351. if(desc.picture_and_timing_info_present)
  352. {
  353. v = mpeg_bits_read8(reader);
  354. desc._90kHZ_flag = (v >> 7) & 0x01;
  355. if(0 == desc._90kHZ_flag)
  356. {
  357. desc.N = mpeg_bits_read32(reader);
  358. desc.K = mpeg_bits_read32(reader);
  359. }
  360. desc.num_unit_in_tick = mpeg_bits_read32(reader);
  361. }
  362. v = mpeg_bits_read8(reader);
  363. desc.fixed_frame_rate_flag = (v >> 7) & 0x01;
  364. desc.temporal_poc_flag = (v >> 6) & 0x01;
  365. desc.picture_to_display_conversion_flag = (v >> 5) & 0x01;
  366. assert(0 == mpeg_bits_error(reader));
  367. return mpeg_bits_error(reader) ? -1 : 0;
  368. }
  369. int mpeg2_aac_descriptor(struct mpeg_bits_t* reader, uint8_t len)
  370. {
  371. // 2.6.68 MPEG-2 AAC audio descriptor(p113)
  372. mpeg2_aac_descriptor_t desc;
  373. (void)len; assert(len >= 3);
  374. memset(&desc, 0, sizeof(desc));
  375. desc.profile = mpeg_bits_read8(reader);
  376. desc.channel_configuration = mpeg_bits_read8(reader);
  377. desc.additional_information = mpeg_bits_read8(reader);
  378. assert(0 == mpeg_bits_error(reader));
  379. return mpeg_bits_error(reader) ? -1 : 0;
  380. }
  381. int svc_extension_descriptor(struct mpeg_bits_t* reader, uint8_t len)
  382. {
  383. // 2.6.76 SVC extension descriptor(p116)
  384. uint8_t v;
  385. svc_extension_descriptor_t desc;
  386. (void)len; assert(len >= 13);
  387. memset(&desc, 0, sizeof(desc));
  388. desc.width = mpeg_bits_read16(reader);
  389. desc.height = mpeg_bits_read16(reader);
  390. desc.frame_rate = mpeg_bits_read16(reader);
  391. desc.average_bitrate = mpeg_bits_read16(reader);
  392. desc.maximum_bitrate = mpeg_bits_read16(reader);
  393. desc.dependency_id = (mpeg_bits_read8(reader) >> 5) & 0x07;
  394. v = mpeg_bits_read8(reader);
  395. desc.quality_id_start = (v >> 4) & 0x0F;
  396. desc.quality_id_end = (v >> 0) & 0x0F;
  397. v = mpeg_bits_read8(reader);
  398. desc.temporal_id_start = (v >> 5) & 0x07;
  399. desc.temporal_id_end = (v >> 2) & 0x07;
  400. desc.no_sei_nal_unit_present = (v >> 1) & 0x01;
  401. assert(0 == mpeg_bits_error(reader));
  402. return mpeg_bits_error(reader) ? -1 : 0;
  403. }
  404. int mvc_extension_descriptor(struct mpeg_bits_t* reader, uint8_t len)
  405. {
  406. // 2.6.78 MVC extension descriptor(p117)
  407. uint32_t v;
  408. mvc_extension_descriptor_t desc;
  409. (void)len; assert(len >= 8);
  410. memset(&desc, 0, sizeof(desc));
  411. desc.average_bit_rate = mpeg_bits_read16(reader);
  412. desc.maximum_bitrate = mpeg_bits_read16(reader);
  413. v = mpeg_bits_read32(reader);
  414. desc.view_order_index_min = (v >> 18) & 0x3FF;
  415. desc.view_order_index_max = (v >> 8) & 0x3FF;
  416. desc.temporal_id_start = (v >> 5) & 0x07;
  417. desc.temporal_id_end = (v >> 2) & 0x07;
  418. desc.no_sei_nal_unit_present = (v >> 1) & 0x01;
  419. desc.no_prefix_nal_unit_present = (v >> 0) & 0x01;
  420. assert(0 == mpeg_bits_error(reader));
  421. return mpeg_bits_error(reader) ? -1 : 0;
  422. }
  423. size_t service_extension_descriptor_write(uint8_t* data, size_t bytes)
  424. {
  425. uint8_t n;
  426. n = (uint8_t)strlen(SERVICE_NAME);
  427. if (bytes < 2 + n)
  428. return 0;
  429. data[0] = SERVICE_ID;
  430. data[1] = 2 + n;
  431. memcpy(data + 2, SERVICE_NAME, n);
  432. return 2 + n;
  433. }
  434. typedef struct _clock_extension_descriptor_t
  435. {
  436. uint8_t year; // base 2000, 8-bit
  437. uint8_t month; // 1-12, 4-bit
  438. uint8_t day; // 1-31, 5-bit
  439. uint8_t hour; // 0-23, 5-bit
  440. uint8_t minute; // 0-59, 6-bit
  441. uint8_t second; // 0-59, 6-bit
  442. uint16_t microsecond; // 14-bit
  443. } clock_extension_descriptor_t;
  444. int clock_extension_descriptor(struct mpeg_bits_t* reader, uint8_t len)
  445. {
  446. uint32_t v;
  447. struct tm t;
  448. time_t clock;
  449. (void)len; assert(len >= 9);
  450. v = mpeg_bits_read32(reader); // skip 4-bytes leading
  451. memset(&t, 0, sizeof(t));
  452. t.tm_year = mpeg_bits_read8(reader) + 2000 - 1900;
  453. v = mpeg_bits_read32(reader);
  454. t.tm_mon = ((v >> 28) & 0x0F) - 1;
  455. t.tm_mday = (v >> 23) & 0x1F;
  456. t.tm_hour = (v >> 18) & 0x1F;
  457. t.tm_min = (v >> 12) & 0x3F;
  458. t.tm_sec = (v >> 6) & 0x3F;
  459. //desc.microsecond = v & 0x3F;
  460. clock = mktime(&t) * 1000;
  461. assert(0 == mpeg_bits_error(reader));
  462. return mpeg_bits_error(reader) ? -1 : 0;
  463. }
  464. size_t clock_extension_descriptor_write(uint8_t* data, size_t bytes, int64_t clock)
  465. {
  466. struct tm* t;
  467. time_t seconds;
  468. if (bytes < 16)
  469. return 0;
  470. seconds = (time_t)(clock / 1000);
  471. t = localtime(&seconds);
  472. data[0] = 0x40;
  473. data[1] = 0x0E;
  474. data[2] = 0x48;
  475. data[3] = 0x4B;
  476. data[4] = 0x01;
  477. data[5] = 0x00;
  478. data[6] = (uint8_t)(t->tm_year + 1900 - 2000); // base 2000
  479. data[7] = (uint8_t)((t->tm_mon + 1) << 4) | ((t->tm_mday >> 1) & 0x0F);
  480. data[8] = (uint8_t)((t->tm_mday & 0x01) << 7) | ((t->tm_hour & 0x1F) << 2) | ((t->tm_min >> 4) & 0x03);
  481. data[9] = (uint8_t)((t->tm_min & 0x0F) << 4) | ((t->tm_sec >> 2) & 0x0F);
  482. data[10] = (uint8_t)((t->tm_sec & 0x03) << 6);
  483. data[11] = 0x00;
  484. data[12] = 0x00;
  485. data[13] = 0xFF;
  486. data[14] = 0xFF;
  487. data[15] = 0xFF;
  488. return 16;
  489. }