scoped_av_packet.h 1.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748
  1. // Copyright (c) 2022 The Chromium Authors. All rights reserved.
  2. // Use of this source code is governed by a BSD-style license that can be
  3. // found in the LICENSE file.
  4. #ifndef MEDIA_FFMPEG_SCOPED_AV_PACKET_H_
  5. #define MEDIA_FFMPEG_SCOPED_AV_PACKET_H_
  6. #include <memory>
  7. #include "media/base/media_export.h"
  8. #include "media/ffmpeg/ffmpeg_deleters.h"
  9. struct AVPacket;
  10. namespace media {
  11. // Like std::unique_ptr<AVPacket>, but makes sure packets are only ever
  12. // allocated with av_packet_alloc() and freed with av_packet_free().
  13. class MEDIA_EXPORT ScopedAVPacket {
  14. public:
  15. // Constructs an empty ScopedAVPacket.
  16. ScopedAVPacket();
  17. ~ScopedAVPacket();
  18. ScopedAVPacket(const ScopedAVPacket&) = delete;
  19. ScopedAVPacket& operator=(const ScopedAVPacket&) = delete;
  20. ScopedAVPacket(ScopedAVPacket&&);
  21. ScopedAVPacket& operator=(ScopedAVPacket&&);
  22. // Returns a ScopedAVPacket wrapping a packet allocated with
  23. // av_packet_alloc().
  24. static ScopedAVPacket Allocate();
  25. AVPacket* get() const { return packet_.get(); }
  26. explicit operator bool() const { return static_cast<bool>(packet_); }
  27. AVPacket& operator*() const { return *packet_; }
  28. AVPacket* operator->() const { return packet_.get(); }
  29. private:
  30. explicit ScopedAVPacket(AVPacket* raw_packet);
  31. std::unique_ptr<AVPacket, ScopedPtrAVFreePacket> packet_;
  32. };
  33. } // namespace media
  34. #endif // MEDIA_FFMPEG_SCOPED_AV_PACKET_H_