Você não pode selecionar mais de 25 tópicos Os tópicos devem começar com uma letra ou um número, podem incluir traços ('-') e podem ter até 35 caracteres.

10 meses atrás
1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374
  1. #include "mov-udta.h"
  2. #include "mov-ioutil.h"
  3. #include "mov-memory-buffer.h"
  4. #include "mov-internal.h"
  5. int mov_read_udta(struct mov_t* mov, const struct mov_box_t* box)
  6. {
  7. mov_buffer_skip(&mov->io, box->size);
  8. return mov_buffer_error(&mov->io);
  9. }
  10. size_t mov_write_udta(const struct mov_t* mov)
  11. {
  12. if (!mov->udta || mov->udta_size < 1)
  13. return 0;
  14. mov_buffer_w32(&mov->io, 8 + (uint32_t)mov->udta_size);
  15. mov_buffer_write(&mov->io, "udta", 4);
  16. mov_buffer_write(&mov->io, mov->udta, mov->udta_size);
  17. return 8 + (size_t)mov->udta_size;
  18. }
  19. int mov_udta_meta_write(const struct mov_udta_meta_t* meta, void* data, int bytes)
  20. {
  21. struct mov_ioutil_t w;
  22. struct mov_memory_buffer_t ptr;
  23. uint64_t pmeta, pilst, n;
  24. ptr.maxsize = bytes;
  25. ptr.capacity = bytes;
  26. ptr.off = 0;
  27. ptr.ptr = (uint8_t*)data;
  28. memset(&w, 0, sizeof(w));
  29. memcpy(&w.io, mov_memory_buffer(), sizeof(w.io));
  30. w.param = &ptr;
  31. pmeta = mov_buffer_tell(&w);
  32. mov_buffer_w32(&w, 0); // placeholder
  33. mov_buffer_write(&w, "meta", 4);
  34. mov_buffer_w32(&w, 0); /* version & flags */
  35. mov_buffer_w32(&w, 33);
  36. mov_buffer_write(&w, "hdlr", 4);
  37. mov_buffer_w32(&w, 0); /* version & flags */
  38. mov_buffer_w32(&w, 0);
  39. mov_buffer_write(&w, "mdir", 4);
  40. mov_buffer_write(&w, "appl", 4);
  41. mov_buffer_w32(&w, 0);
  42. mov_buffer_w32(&w, 0);
  43. mov_buffer_w8(&w, 0);
  44. pilst = mov_buffer_tell(&w);
  45. mov_buffer_w32(&w, 0); // placeholder
  46. mov_buffer_write(&w, "ilst", 4);
  47. // write cover
  48. mov_buffer_w32(&w, meta->cover_size + 16 + 8);
  49. mov_buffer_write(&w, "covr", 4);
  50. mov_buffer_w32(&w, meta->cover_size + 16);
  51. mov_buffer_write(&w, "data", 4);
  52. mov_buffer_w32(&w, 0); // TODO track tag
  53. mov_buffer_w32(&w, 0);
  54. mov_buffer_write(&w, meta->cover, meta->cover_size);
  55. // update box size
  56. n = mov_buffer_tell(&w);
  57. mov_buffer_seek(&w, pilst);
  58. mov_buffer_w32(&w, (uint32_t)(n - pilst));
  59. mov_buffer_seek(&w, pmeta);
  60. mov_buffer_w32(&w, (uint32_t)(n - pmeta));
  61. mov_buffer_seek(&w, n); // rewind
  62. return (int)ptr.bytes;
  63. }