memory_buffer.cpp 1.6 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071
  1. #include "memory_buffer.h"
  2. #include <c10/util/Logging.h>
  3. namespace ffmpeg {
  4. MemoryBuffer::MemoryBuffer(const uint8_t* buffer, size_t size)
  5. : buffer_(buffer), len_(size) {}
  6. int MemoryBuffer::read(uint8_t* buf, int size) {
  7. if (pos_ < len_) {
  8. auto available = std::min(int(len_ - pos_), size);
  9. memcpy(buf, buffer_ + pos_, available);
  10. pos_ += available;
  11. return available;
  12. }
  13. return 0;
  14. }
  15. int64_t MemoryBuffer::seek(int64_t offset, int whence) {
  16. if (whence & AVSEEK_SIZE) {
  17. return len_;
  18. }
  19. // remove force flag
  20. whence &= ~AVSEEK_FORCE;
  21. switch (whence) {
  22. case SEEK_SET:
  23. if (offset >= 0 && offset <= len_) {
  24. pos_ = offset;
  25. }
  26. break;
  27. case SEEK_END:
  28. if (len_ + offset >= 0 && len_ + offset <= len_) {
  29. pos_ = len_ + offset;
  30. }
  31. break;
  32. case SEEK_CUR:
  33. if (pos_ + offset > 0 && pos_ + offset <= len_) {
  34. pos_ += offset;
  35. }
  36. break;
  37. default:
  38. LOG(ERROR) << "Unknown whence flag gets provided: " << whence;
  39. }
  40. return pos_;
  41. }
  42. /* static */
  43. DecoderInCallback MemoryBuffer::getCallback(
  44. const uint8_t* buffer,
  45. size_t size) {
  46. MemoryBuffer object(buffer, size);
  47. return
  48. [object](uint8_t* out, int size, int whence, uint64_t timeoutMs) mutable
  49. -> int {
  50. if (out) { // see defs.h file
  51. // read mode
  52. return object.read(out, size);
  53. }
  54. // seek mode
  55. if (!timeoutMs) {
  56. // seek capability, yes - supported
  57. return 0;
  58. }
  59. return object.seek(size, whence);
  60. };
  61. }
  62. } // namespace ffmpeg