No puede seleccionar más de 25 temas Los temas deben comenzar con una letra o número, pueden incluir guiones ('-') y pueden tener hasta 35 caracteres de largo.

hace 10 meses
1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495969798
  1. #include "mov-internal.h"
  2. #include <assert.h>
  3. // 8.8.7 Track Fragment Header Box (p71)
  4. int mov_read_tfhd(struct mov_t* mov, const struct mov_box_t* box)
  5. {
  6. uint32_t flags;
  7. uint32_t track_ID;
  8. mov_buffer_r8(&mov->io); /* version */
  9. flags = mov_buffer_r24(&mov->io); /* flags */
  10. track_ID = mov_buffer_r32(&mov->io); /* track_ID */
  11. mov->track = mov_find_track(mov, track_ID);
  12. if (NULL == mov->track)
  13. return -1;
  14. mov->track->tfhd.flags = flags;
  15. if (MOV_TFHD_FLAG_BASE_DATA_OFFSET & flags)
  16. mov->track->tfhd.base_data_offset = mov_buffer_r64(&mov->io); /* base_data_offset*/
  17. else if(MOV_TFHD_FLAG_DEFAULT_BASE_IS_MOOF & flags)
  18. mov->track->tfhd.base_data_offset = mov->moof_offset; /* default-base-is-moof */
  19. else
  20. mov->track->tfhd.base_data_offset = mov->implicit_offset;
  21. if (MOV_TFHD_FLAG_SAMPLE_DESCRIPTION_INDEX & flags)
  22. mov->track->tfhd.sample_description_index = mov_buffer_r32(&mov->io); /* sample_description_index*/
  23. else
  24. mov->track->tfhd.sample_description_index = mov->track->trex.default_sample_description_index;
  25. if (MOV_TFHD_FLAG_DEFAULT_DURATION & flags)
  26. mov->track->tfhd.default_sample_duration = mov_buffer_r32(&mov->io); /* default_sample_duration*/
  27. else
  28. mov->track->tfhd.default_sample_duration = mov->track->trex.default_sample_duration;
  29. if (MOV_TFHD_FLAG_DEFAULT_SIZE & flags)
  30. mov->track->tfhd.default_sample_size = mov_buffer_r32(&mov->io); /* default_sample_size*/
  31. else
  32. mov->track->tfhd.default_sample_size = mov->track->trex.default_sample_size;
  33. if (MOV_TFHD_FLAG_DEFAULT_FLAGS & flags)
  34. mov->track->tfhd.default_sample_flags = mov_buffer_r32(&mov->io); /* default_sample_flags*/
  35. else
  36. mov->track->tfhd.default_sample_flags = mov->track->trex.default_sample_flags;
  37. if (MOV_TFHD_FLAG_DURATION_IS_EMPTY & flags)
  38. (void)box; /* duration-is-empty*/
  39. return mov_buffer_error(&mov->io);
  40. }
  41. size_t mov_write_tfhd(const struct mov_t* mov)
  42. {
  43. size_t size;
  44. uint64_t offset;
  45. size = 12 + 4 /* track_ID */;
  46. offset = mov_buffer_tell(&mov->io);
  47. mov_buffer_w32(&mov->io, 0); /* size */
  48. mov_buffer_write(&mov->io, "tfhd", 4);
  49. mov_buffer_w8(&mov->io, 0); /* version */
  50. mov_buffer_w24(&mov->io, mov->track->tfhd.flags); /* flags */
  51. mov_buffer_w32(&mov->io, mov->track->tkhd.track_ID); /* track_ID */
  52. if (MOV_TFHD_FLAG_BASE_DATA_OFFSET & mov->track->tfhd.flags)
  53. {
  54. mov_buffer_w64(&mov->io, mov->track->tfhd.base_data_offset); /* base_data_offset*/
  55. size += 8;
  56. }
  57. if (MOV_TFHD_FLAG_SAMPLE_DESCRIPTION_INDEX & mov->track->tfhd.flags)
  58. {
  59. mov_buffer_w32(&mov->io, mov->track->stsd.entries[0].data_reference_index); /* sample_description_index*/
  60. size += 4;
  61. }
  62. if (MOV_TFHD_FLAG_DEFAULT_DURATION & mov->track->tfhd.flags)
  63. {
  64. mov_buffer_w32(&mov->io, mov->track->tfhd.default_sample_duration); /* default_sample_duration*/
  65. size += 4;
  66. }
  67. if (MOV_TFHD_FLAG_DEFAULT_SIZE & mov->track->tfhd.flags)
  68. {
  69. mov_buffer_w32(&mov->io, mov->track->tfhd.default_sample_size); /* default_sample_size*/
  70. size += 4;
  71. }
  72. if (MOV_TFHD_FLAG_DEFAULT_FLAGS & mov->track->tfhd.flags)
  73. {
  74. mov_buffer_w32(&mov->io, mov->track->tfhd.default_sample_flags); /* default_sample_flags*/
  75. size += 4;
  76. }
  77. mov_write_size(mov, offset, size);
  78. return size;
  79. }