sync_decoder.h 1.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748
  1. #pragma once
  2. #include <list>
  3. #include "decoder.h"
  4. namespace ffmpeg {
  5. /**
  6. * Class uses FFMPEG library to decode media streams.
  7. * Media bytes can be explicitly provided through read-callback
  8. * or fetched internally by FFMPEG library
  9. */
  10. class SyncDecoder : public Decoder {
  11. public:
  12. // Allocation of memory must be done with a proper alignment.
  13. class AVByteStorage : public ByteStorage {
  14. public:
  15. explicit AVByteStorage(size_t n);
  16. ~AVByteStorage() override;
  17. void ensure(size_t n) override;
  18. uint8_t* writableTail() override;
  19. void append(size_t n) override;
  20. void trim(size_t n) override;
  21. const uint8_t* data() const override;
  22. size_t length() const override;
  23. size_t tail() const override;
  24. void clear() override;
  25. private:
  26. size_t offset_{0};
  27. size_t length_{0};
  28. size_t capacity_{0};
  29. uint8_t* buffer_{nullptr};
  30. };
  31. public:
  32. int decode(DecoderOutputMessage* out, uint64_t timeoutMs) override;
  33. private:
  34. void push(DecoderOutputMessage&& buffer) override;
  35. void onInit() override;
  36. std::unique_ptr<ByteStorage> createByteStorage(size_t n) override;
  37. private:
  38. std::list<DecoderOutputMessage> queue_;
  39. bool eof_{false};
  40. };
  41. } // namespace ffmpeg