codec_abstract_codec.h 6.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232
  1. #pragma once
  2. #include "../base/types.h"
  3. #include <memory>
  4. #include <functional>
  5. #include <vector>
  6. #include <string>
  7. namespace av {
  8. namespace codec {
  9. /**
  10. * 编解码器状态
  11. */
  12. enum class CodecState {
  13. IDLE, // 空闲
  14. OPENED, // 已打开
  15. RUNNING, // 运行中
  16. FLUSHING, // 刷新中
  17. CLOSED, // 已关闭
  18. ERROR // 错误
  19. };
  20. /**
  21. * 编解码器类型
  22. */
  23. enum class CodecType {
  24. ENCODER, // 编码器
  25. DECODER // 解码器
  26. };
  27. /**
  28. * 抽象编解码器基类
  29. * 提供编解码器的通用接口和状态管理
  30. */
  31. class AbstractCodec {
  32. public:
  33. AbstractCodec(MediaType mediaType, CodecType codecType);
  34. virtual ~AbstractCodec();
  35. // 禁止拷贝
  36. AbstractCodec(const AbstractCodec&) = delete;
  37. AbstractCodec& operator=(const AbstractCodec&) = delete;
  38. /**
  39. * 打开编解码器
  40. * @param params 编解码参数
  41. * @return 成功返回ErrorCode::OK
  42. */
  43. virtual ErrorCode open(const CodecParams& params) = 0;
  44. /**
  45. * 关闭编解码器
  46. */
  47. virtual void close() = 0;
  48. /**
  49. * 刷新编解码器缓冲区
  50. * @return 成功返回ErrorCode::OK
  51. */
  52. virtual ErrorCode flush() = 0;
  53. /**
  54. * 重置编解码器
  55. * @return 成功返回ErrorCode::OK
  56. */
  57. virtual ErrorCode reset();
  58. // 状态查询
  59. CodecState getState() const { return state_; }
  60. MediaType getMediaType() const { return mediaType_; }
  61. CodecType getCodecType() const { return codecType_; }
  62. bool isOpened() const { return state_ == CodecState::OPENED || state_ == CodecState::RUNNING; }
  63. bool isRunning() const { return state_ == CodecState::RUNNING; }
  64. bool hasError() const { return state_ == CodecState::ERROR; }
  65. // 参数获取
  66. const CodecParams& getParams() const { return params_; }
  67. // 统计信息
  68. struct Statistics {
  69. uint64_t processedFrames = 0; // 处理的帧数
  70. uint64_t droppedFrames = 0; // 丢弃的帧数
  71. uint64_t errorCount = 0; // 错误次数
  72. double avgProcessTime = 0.0; // 平均处理时间(ms)
  73. uint64_t totalBytes = 0; // 总字节数
  74. };
  75. const Statistics& getStatistics() const { return stats_; }
  76. void resetStatistics();
  77. // 回调函数设置
  78. using ErrorCallback = std::function<void(ErrorCode error, const std::string& message)>;
  79. void setErrorCallback(ErrorCallback callback) { errorCallback_ = std::move(callback); }
  80. protected:
  81. /**
  82. * 设置编解码器状态
  83. */
  84. void setState(CodecState state);
  85. /**
  86. * 报告错误
  87. */
  88. void reportError(ErrorCode error, const std::string& message = "");
  89. /**
  90. * 更新统计信息
  91. */
  92. void updateStats(bool success, double processTime, uint64_t bytes = 0);
  93. /**
  94. * 验证参数有效性
  95. */
  96. virtual bool validateParams(const CodecParams& params) = 0;
  97. protected:
  98. MediaType mediaType_; // 媒体类型
  99. CodecType codecType_; // 编解码器类型
  100. CodecState state_; // 当前状态
  101. CodecParams params_; // 编解码参数
  102. Statistics stats_; // 统计信息
  103. ErrorCallback errorCallback_; // 错误回调
  104. // FFmpeg相关
  105. AVCodecContextPtr codecCtx_; // 编解码上下文
  106. const AVCodec* codec_; // 编解码器
  107. };
  108. /**
  109. * 抽象编码器基类
  110. */
  111. class AbstractEncoder : public AbstractCodec {
  112. public:
  113. AbstractEncoder(MediaType mediaType) : AbstractCodec(mediaType, CodecType::ENCODER) {}
  114. virtual ~AbstractEncoder() = default;
  115. /**
  116. * 编码一帧数据
  117. * @param frame 输入帧
  118. * @param packets 输出包列表
  119. * @return 成功返回ErrorCode::OK
  120. */
  121. virtual ErrorCode encode(const AVFramePtr& frame, std::vector<AVPacketPtr>& packets) = 0;
  122. /**
  123. * 结束编码(刷新缓冲区)
  124. * @param packets 输出包列表
  125. * @return 成功返回ErrorCode::OK
  126. */
  127. virtual ErrorCode finishEncode(std::vector<AVPacketPtr>& packets) = 0;
  128. // 编码器特有的回调
  129. using FrameCallback = std::function<void(const AVFramePtr& frame)>;
  130. using PacketCallback = std::function<void(const AVPacketPtr& packet)>;
  131. void setFrameCallback(FrameCallback callback) { frameCallback_ = std::move(callback); }
  132. void setPacketCallback(PacketCallback callback) { packetCallback_ = std::move(callback); }
  133. protected:
  134. FrameCallback frameCallback_; // 帧回调
  135. PacketCallback packetCallback_; // 包回调
  136. };
  137. /**
  138. * 抽象解码器基类
  139. */
  140. class AbstractDecoder : public AbstractCodec {
  141. public:
  142. AbstractDecoder(MediaType mediaType) : AbstractCodec(mediaType, CodecType::DECODER) {}
  143. virtual ~AbstractDecoder() = default;
  144. /**
  145. * 解码一个包
  146. * @param packet 输入包
  147. * @param frames 输出帧列表
  148. * @return 成功返回ErrorCode::OK
  149. */
  150. virtual ErrorCode decode(const AVPacketPtr& packet, std::vector<AVFramePtr>& frames) = 0;
  151. /**
  152. * 结束解码(刷新缓冲区)
  153. * @param frames 输出帧列表
  154. * @return 成功返回ErrorCode::OK
  155. */
  156. virtual ErrorCode finishDecode(std::vector<AVFramePtr>& frames) = 0;
  157. // 解码器特有的回调
  158. using PacketCallback = std::function<void(const AVPacketPtr& packet)>;
  159. using FrameCallback = std::function<void(const AVFramePtr& frame)>;
  160. void setPacketCallback(PacketCallback callback) { packetCallback_ = std::move(callback); }
  161. void setFrameCallback(FrameCallback callback) { frameCallback_ = std::move(callback); }
  162. protected:
  163. PacketCallback packetCallback_; // 包回调
  164. FrameCallback frameCallback_; // 帧回调
  165. };
  166. /**
  167. * 编解码器工厂类
  168. */
  169. class CodecFactory {
  170. public:
  171. /**
  172. * 创建编码器
  173. */
  174. static std::unique_ptr<AbstractEncoder> createEncoder(MediaType mediaType, const std::string& codecName);
  175. /**
  176. * 创建解码器
  177. */
  178. static std::unique_ptr<AbstractDecoder> createDecoder(MediaType mediaType, const std::string& codecName);
  179. /**
  180. * 获取支持的编码器列表
  181. */
  182. static std::vector<std::string> getSupportedEncoders(MediaType mediaType);
  183. /**
  184. * 获取支持的解码器列表
  185. */
  186. static std::vector<std::string> getSupportedDecoders(MediaType mediaType);
  187. /**
  188. * 检查编解码器是否支持
  189. */
  190. static bool isCodecSupported(const std::string& codecName, CodecType type, MediaType mediaType);
  191. };
  192. } // namespace codec
  193. } // namespace av