frame_wrapper.h 5.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190
  1. #ifndef AV_BASE_FRAME_WRAPPER_H
  2. #define AV_BASE_FRAME_WRAPPER_H
  3. #include "types.h"
  4. #include <memory>
  5. #include <functional>
  6. extern "C" {
  7. #include <libavutil/frame.h>
  8. #include <libavutil/avutil.h>
  9. }
  10. namespace av {
  11. /**
  12. * 安全的AVFrame包装器类
  13. * 提供比AVFramePtr更安全和易用的接口
  14. * 解决了智能指针在某些场景下的复杂性问题
  15. */
  16. class FrameWrapper {
  17. public:
  18. // 默认构造函数
  19. FrameWrapper() = default;
  20. // 从原生指针构造(接管所有权)
  21. explicit FrameWrapper(AVFrame* frame) : frame_(frame) {}
  22. // 从智能指针构造
  23. explicit FrameWrapper(AVFramePtr frame) : frame_(frame.release()) {}
  24. // 移动构造函数
  25. FrameWrapper(FrameWrapper&& other) noexcept
  26. : frame_(other.frame_) {
  27. other.frame_ = nullptr;
  28. }
  29. // 移动赋值操作符
  30. FrameWrapper& operator=(FrameWrapper&& other) noexcept {
  31. if (this != &other) {
  32. reset();
  33. frame_ = other.frame_;
  34. other.frame_ = nullptr;
  35. }
  36. return *this;
  37. }
  38. // 禁用拷贝构造和拷贝赋值
  39. FrameWrapper(const FrameWrapper&) = delete;
  40. FrameWrapper& operator=(const FrameWrapper&) = delete;
  41. // 析构函数
  42. ~FrameWrapper() {
  43. reset();
  44. }
  45. // 创建新帧
  46. static FrameWrapper create() {
  47. return FrameWrapper(av_frame_alloc());
  48. }
  49. // 创建视频帧
  50. static FrameWrapper createVideo(int width, int height, AVPixelFormat format) {
  51. AVFrame* frame = av_frame_alloc();
  52. if (!frame) return FrameWrapper();
  53. frame->width = width;
  54. frame->height = height;
  55. frame->format = format;
  56. if (av_frame_get_buffer(frame, 32) < 0) {
  57. av_frame_free(&frame);
  58. return FrameWrapper();
  59. }
  60. return FrameWrapper(frame);
  61. }
  62. // 创建音频帧
  63. static FrameWrapper createAudio(int sampleRate, int channels,
  64. AVSampleFormat format, int nbSamples) {
  65. AVFrame* frame = av_frame_alloc();
  66. if (!frame) return FrameWrapper();
  67. frame->sample_rate = sampleRate;
  68. frame->ch_layout.nb_channels = channels;
  69. frame->format = format;
  70. frame->nb_samples = nbSamples;
  71. if (av_frame_get_buffer(frame, 0) < 0) {
  72. av_frame_free(&frame);
  73. return FrameWrapper();
  74. }
  75. return FrameWrapper(frame);
  76. }
  77. // 获取原生指针(不转移所有权)
  78. AVFrame* get() const { return frame_; }
  79. // 获取原生指针并转移所有权
  80. AVFrame* release() {
  81. AVFrame* temp = frame_;
  82. frame_ = nullptr;
  83. return temp;
  84. }
  85. // 重置,释放当前帧
  86. void reset(AVFrame* newFrame = nullptr) {
  87. if (frame_) {
  88. av_frame_free(&frame_);
  89. }
  90. frame_ = newFrame;
  91. }
  92. // 检查是否有效
  93. bool isValid() const { return frame_ != nullptr; }
  94. // 操作符重载
  95. operator bool() const { return isValid(); }
  96. AVFrame* operator->() const { return frame_; }
  97. AVFrame& operator*() const { return *frame_; }
  98. // 克隆帧(深拷贝)
  99. FrameWrapper clone() const {
  100. if (!frame_) return FrameWrapper();
  101. AVFrame* newFrame = av_frame_alloc();
  102. if (!newFrame) return FrameWrapper();
  103. if (av_frame_ref(newFrame, frame_) < 0) {
  104. av_frame_free(&newFrame);
  105. return FrameWrapper();
  106. }
  107. return FrameWrapper(newFrame);
  108. }
  109. // 创建引用(浅拷贝)
  110. FrameWrapper ref() const {
  111. if (!frame_) return FrameWrapper();
  112. AVFrame* newFrame = av_frame_alloc();
  113. if (!newFrame) return FrameWrapper();
  114. if (av_frame_ref(newFrame, frame_) < 0) {
  115. av_frame_free(&newFrame);
  116. return FrameWrapper();
  117. }
  118. return FrameWrapper(newFrame);
  119. }
  120. // 便捷的属性访问
  121. int64_t pts() const { return frame_ ? frame_->pts : AV_NOPTS_VALUE; }
  122. void setPts(int64_t pts) { if (frame_) frame_->pts = pts; }
  123. int width() const { return frame_ ? frame_->width : 0; }
  124. int height() const { return frame_ ? frame_->height : 0; }
  125. int sampleRate() const { return frame_ ? frame_->sample_rate : 0; }
  126. int channels() const { return frame_ ? frame_->ch_layout.nb_channels : 0; }
  127. int nbSamples() const { return frame_ ? frame_->nb_samples : 0; }
  128. AVPixelFormat pixelFormat() const {
  129. return frame_ ? static_cast<AVPixelFormat>(frame_->format) : AV_PIX_FMT_NONE;
  130. }
  131. AVSampleFormat sampleFormat() const {
  132. return frame_ ? static_cast<AVSampleFormat>(frame_->format) : AV_SAMPLE_FMT_NONE;
  133. }
  134. bool isKeyFrame() const { return frame_ && frame_->key_frame; }
  135. // 转换为智能指针(转移所有权)
  136. AVFramePtr toSmartPtr() {
  137. return AVFramePtr(release());
  138. }
  139. private:
  140. AVFrame* frame_ = nullptr;
  141. };
  142. // 便捷的类型定义
  143. using Frame = FrameWrapper;
  144. // 回调函数类型定义(使用 FrameWrapper)
  145. using FrameWrapperCallback = std::function<void(const FrameWrapper&)>;
  146. } // namespace av
  147. #endif // AV_BASE_FRAME_WRAPPER_H