Nelze vybrat více než 25 témat Téma musí začínat písmenem nebo číslem, může obsahovat pomlčky („-“) a může být dlouhé až 35 znaků.

90 řádky
1.9KB

  1. #ifndef _mov_memory_buffer_h_
  2. #define _mov_memory_buffer_h_
  3. #include "mov-buffer.h"
  4. #include <stddef.h>
  5. #include <stdlib.h>
  6. #include <string.h>
  7. #include <stdint.h>
  8. #include <errno.h>
  9. struct mov_memory_buffer_t
  10. {
  11. uint8_t* ptr;
  12. uint64_t bytes;
  13. uint64_t off;
  14. uint64_t capacity;
  15. uint64_t maxsize; // limit
  16. };
  17. static int mov_memory_read(void* param, void* data, uint64_t bytes)
  18. {
  19. struct mov_memory_buffer_t* ptr;
  20. ptr = (struct mov_memory_buffer_t*)param;
  21. if (ptr->off + bytes > ptr->bytes)
  22. return -E2BIG;
  23. memcpy(data, ptr->ptr + ptr->off, (size_t)bytes);
  24. ptr->off += bytes;
  25. return 0;
  26. }
  27. static int mov_memory_write(void* param, const void* data, uint64_t bytes)
  28. {
  29. void* p;
  30. uint64_t capacity;
  31. struct mov_memory_buffer_t* ptr;
  32. ptr = (struct mov_memory_buffer_t*)param;
  33. if (ptr->off + bytes > ptr->maxsize)
  34. return -E2BIG;
  35. if (ptr->off + bytes > ptr->capacity)
  36. {
  37. capacity = ptr->off + bytes + 1 * 1024 * 1024;
  38. capacity = capacity > ptr->maxsize ? ptr->maxsize : capacity;
  39. p = realloc(ptr->ptr, capacity);
  40. if (NULL == p)
  41. return -ENOMEM;
  42. ptr->ptr = (uint8_t*)p;
  43. ptr->capacity = capacity;
  44. }
  45. memcpy(ptr->ptr + ptr->off, data, bytes);
  46. ptr->off += bytes;
  47. if (ptr->off > ptr->bytes)
  48. ptr->bytes = ptr->off;
  49. return 0;
  50. }
  51. static int mov_memory_seek(void* param, int64_t offset)
  52. {
  53. struct mov_memory_buffer_t* ptr;
  54. ptr = (struct mov_memory_buffer_t*)param;
  55. if ((uint64_t)(offset >= 0 ? offset : -offset) > ptr->capacity)
  56. return -E2BIG;
  57. ptr->off = offset >= 0 ? offset : (ptr->capacity+offset);
  58. return 0;
  59. }
  60. static int64_t mov_memory_tell(void* param)
  61. {
  62. struct mov_memory_buffer_t* ptr;
  63. ptr = (struct mov_memory_buffer_t*)param;
  64. return (int64_t)ptr->off;
  65. }
  66. static inline const struct mov_buffer_t* mov_memory_buffer(void)
  67. {
  68. static struct mov_buffer_t s_io = {
  69. mov_memory_read,
  70. mov_memory_write,
  71. mov_memory_seek,
  72. mov_memory_tell,
  73. };
  74. return &s_io;
  75. }
  76. #endif /* !_mov_memory_buffer_h_ */