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.

10 kuukautta sitten
12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576
  1. #include "mov-internal.h"
  2. #include <assert.h>
  3. // 8.4.2 Media Header Box (p35)
  4. // Box Type: 'mdhd'
  5. // Container: Media Box ('mdia')
  6. // Mandatory: Yes
  7. // Quantity: Exactly one
  8. /*
  9. aligned(8) class MediaHeaderBox extends FullBox('mdhd', version, 0) {
  10. if (version==1) {
  11. unsigned int(64) creation_time;
  12. unsigned int(64) modification_time;
  13. unsigned int(32) timescale;
  14. unsigned int(64) duration;
  15. } else { // version==0
  16. unsigned int(32) creation_time;
  17. unsigned int(32) modification_time;
  18. unsigned int(32) timescale;
  19. unsigned int(32) duration;
  20. }
  21. bit(1) pad = 0;
  22. unsigned int(5)[3] language; // ISO-639-2/T language code
  23. unsigned int(16) pre_defined = 0;
  24. }
  25. */
  26. int mov_read_mdhd(struct mov_t* mov, const struct mov_box_t* box)
  27. {
  28. uint32_t val;
  29. struct mov_mdhd_t* mdhd = &mov->track->mdhd;
  30. mdhd->version = mov_buffer_r8(&mov->io);
  31. mdhd->flags = mov_buffer_r24(&mov->io);
  32. if (1 == mdhd->version)
  33. {
  34. mdhd->creation_time = mov_buffer_r64(&mov->io);
  35. mdhd->modification_time = mov_buffer_r64(&mov->io);
  36. mdhd->timescale = mov_buffer_r32(&mov->io);
  37. mdhd->duration = mov_buffer_r64(&mov->io);
  38. }
  39. else
  40. {
  41. assert(0 == mdhd->version);
  42. mdhd->creation_time = mov_buffer_r32(&mov->io);
  43. mdhd->modification_time = mov_buffer_r32(&mov->io);
  44. mdhd->timescale = mov_buffer_r32(&mov->io);
  45. mdhd->duration = mov_buffer_r32(&mov->io);
  46. }
  47. val = mov_buffer_r32(&mov->io);
  48. mdhd->language = (val >> 16) & 0x7FFF;
  49. mdhd->pre_defined = val & 0xFFFF;
  50. (void)box;
  51. return mov_buffer_error(&mov->io);
  52. }
  53. size_t mov_write_mdhd(const struct mov_t* mov)
  54. {
  55. const struct mov_mdhd_t* mdhd = &mov->track->mdhd;
  56. mov_buffer_w32(&mov->io, 32); /* size */
  57. mov_buffer_write(&mov->io, "mdhd", 4);
  58. mov_buffer_w32(&mov->io, 0); /* version 1 & flags */
  59. mov_buffer_w32(&mov->io, (uint32_t)mdhd->creation_time); /* creation_time */
  60. mov_buffer_w32(&mov->io, (uint32_t)mdhd->modification_time); /* modification_time */
  61. mov_buffer_w32(&mov->io, mdhd->timescale); /* timescale */
  62. mov_buffer_w32(&mov->io, (uint32_t)mdhd->duration); /* duration */
  63. mov_buffer_w16(&mov->io, (uint16_t)mdhd->language); /* ISO-639-2/T language code */
  64. mov_buffer_w16(&mov->io, 0); /* pre_defined (quality) */
  65. return 32;
  66. }