IMediaDecoder.h 5.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232
  1. #ifndef IMEDIADECODER_H
  2. #define IMEDIADECODER_H
  3. #include <functional>
  4. #include <memory>
  5. #include <vector>
  6. #include <string>
  7. namespace AVPlayer2 {
  8. namespace Core {
  9. /**
  10. * 解码器状态枚举
  11. */
  12. enum class DecoderState {
  13. Idle, // 空闲状态
  14. Decoding, // 解码中
  15. Paused, // 暂停状态
  16. Stopped, // 停止状态
  17. Error // 错误状态
  18. };
  19. /**
  20. * 媒体类型枚举
  21. */
  22. enum class MediaType {
  23. Audio, // 音频
  24. Video, // 视频
  25. Subtitle // 字幕
  26. };
  27. /**
  28. * 解码器类型枚举
  29. */
  30. enum class DecoderType {
  31. Software, // 软件解码
  32. Hardware // 硬件解码
  33. };
  34. } // namespace Core
  35. namespace Types {
  36. /**
  37. * 媒体包数据
  38. */
  39. struct MediaPacket {
  40. unsigned char* data; // 数据指针
  41. int size; // 数据大小
  42. double timestamp; // 时间戳(秒)
  43. int64_t pts; // 显示时间戳
  44. int64_t dts; // 解码时间戳
  45. int streamIndex; // 流索引
  46. bool isKeyFrame; // 是否关键帧
  47. Core::MediaType mediaType; // 媒体类型
  48. };
  49. /**
  50. * 解码器配置
  51. */
  52. struct DecoderConfig {
  53. Core::DecoderType type; // 解码器类型
  54. std::string codecName; // 编解码器名称
  55. int threadCount; // 线程数
  56. bool enableHardwareAccel; // 是否启用硬件加速
  57. std::string hwAccelDevice; // 硬件加速设备
  58. };
  59. /**
  60. * 解码统计信息
  61. */
  62. struct DecoderStats {
  63. int framesDecoded; // 已解码帧数
  64. int framesDropped; // 丢弃帧数
  65. double averageDecodeTime; // 平均解码时间(毫秒)
  66. double currentFps; // 当前解码帧率
  67. };
  68. } // namespace Types
  69. namespace Core {
  70. /**
  71. * 媒体解码器抽象接口
  72. * 提供与平台无关的媒体解码功能
  73. */
  74. class IMediaDecoder {
  75. public:
  76. virtual ~IMediaDecoder() = default;
  77. /**
  78. * 初始化解码器
  79. * @param config 解码器配置
  80. * @return 是否初始化成功
  81. */
  82. virtual bool initialize(const Types::DecoderConfig& config) = 0;
  83. /**
  84. * 开始解码
  85. * @return 是否开始成功
  86. */
  87. virtual bool start() = 0;
  88. /**
  89. * 停止解码
  90. */
  91. virtual void stop() = 0;
  92. /**
  93. * 暂停解码
  94. */
  95. virtual void pause() = 0;
  96. /**
  97. * 恢复解码
  98. */
  99. virtual void resume() = 0;
  100. /**
  101. * 输入媒体包进行解码
  102. * @param packet 媒体包数据
  103. * @return 是否输入成功
  104. */
  105. virtual bool inputPacket(const Types::MediaPacket& packet) = 0;
  106. /**
  107. * 获取解码后的音频帧
  108. * @param audioFrame 输出音频帧数据
  109. * @return 是否获取成功
  110. */
  111. virtual bool getAudioFrame(Types::AudioFrame& audioFrame) = 0;
  112. /**
  113. * 获取解码后的视频帧
  114. * @param videoFrame 输出视频帧数据
  115. * @return 是否获取成功
  116. */
  117. virtual bool getVideoFrame(Types::VideoFrame& videoFrame) = 0;
  118. /**
  119. * 刷新解码器缓冲区
  120. */
  121. virtual void flush() = 0;
  122. /**
  123. * 重置解码器
  124. */
  125. virtual void reset() = 0;
  126. /**
  127. * 获取当前状态
  128. * @return 解码器状态
  129. */
  130. virtual DecoderState getState() const = 0;
  131. /**
  132. * 获取支持的媒体类型
  133. * @return 支持的媒体类型列表
  134. */
  135. virtual std::vector<MediaType> getSupportedMediaTypes() const = 0;
  136. /**
  137. * 检查是否支持硬件加速
  138. * @return 是否支持硬件加速
  139. */
  140. virtual bool isHardwareAccelSupported() const = 0;
  141. /**
  142. * 获取解码统计信息
  143. * @return 解码统计信息
  144. */
  145. virtual Types::DecoderStats getStats() const = 0;
  146. /**
  147. * 设置状态变化回调
  148. * @param callback 状态变化回调函数
  149. */
  150. virtual void setStateCallback(std::function<void(DecoderState)> callback) = 0;
  151. /**
  152. * 设置帧解码完成回调
  153. * @param callback 帧解码完成回调函数
  154. */
  155. virtual void setFrameDecodedCallback(std::function<void(MediaType, double)> callback) = 0;
  156. /**
  157. * 设置解码错误回调
  158. * @param callback 解码错误回调函数
  159. */
  160. virtual void setErrorCallback(std::function<void(const std::string&)> callback) = 0;
  161. };
  162. /**
  163. * 媒体解码器工厂接口
  164. */
  165. class IMediaDecoderFactory {
  166. public:
  167. virtual ~IMediaDecoderFactory() = default;
  168. /**
  169. * 创建解码器实例
  170. * @param mediaType 媒体类型
  171. * @return 解码器智能指针
  172. */
  173. virtual std::unique_ptr<IMediaDecoder> createDecoder(MediaType mediaType) = 0;
  174. /**
  175. * 获取支持的编解码器列表
  176. * @param mediaType 媒体类型
  177. * @return 支持的编解码器名称列表
  178. */
  179. virtual std::vector<std::string> getSupportedCodecs(MediaType mediaType) = 0;
  180. /**
  181. * 检查是否支持指定编解码器
  182. * @param codecName 编解码器名称
  183. * @param mediaType 媒体类型
  184. * @return 是否支持
  185. */
  186. virtual bool isCodecSupported(const std::string& codecName, MediaType mediaType) = 0;
  187. /**
  188. * 获取可用的硬件加速设备列表
  189. * @return 硬件加速设备名称列表
  190. */
  191. virtual std::vector<std::string> getAvailableHwAccelDevices() = 0;
  192. };
  193. } // namespace Core
  194. } // namespace AVPlayer2
  195. #endif // IMEDIADECODER_H