| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232 |
- #ifndef IMEDIADECODER_H
- #define IMEDIADECODER_H
- #include <functional>
- #include <memory>
- #include <vector>
- #include <string>
- namespace AVPlayer2 {
- namespace Core {
- /**
- * 解码器状态枚举
- */
- enum class DecoderState {
- Idle, // 空闲状态
- Decoding, // 解码中
- Paused, // 暂停状态
- Stopped, // 停止状态
- Error // 错误状态
- };
- /**
- * 媒体类型枚举
- */
- enum class MediaType {
- Audio, // 音频
- Video, // 视频
- Subtitle // 字幕
- };
- /**
- * 解码器类型枚举
- */
- enum class DecoderType {
- Software, // 软件解码
- Hardware // 硬件解码
- };
- } // namespace Core
- namespace Types {
- /**
- * 媒体包数据
- */
- struct MediaPacket {
- unsigned char* data; // 数据指针
- int size; // 数据大小
- double timestamp; // 时间戳(秒)
- int64_t pts; // 显示时间戳
- int64_t dts; // 解码时间戳
- int streamIndex; // 流索引
- bool isKeyFrame; // 是否关键帧
- Core::MediaType mediaType; // 媒体类型
- };
- /**
- * 解码器配置
- */
- struct DecoderConfig {
- Core::DecoderType type; // 解码器类型
- std::string codecName; // 编解码器名称
- int threadCount; // 线程数
- bool enableHardwareAccel; // 是否启用硬件加速
- std::string hwAccelDevice; // 硬件加速设备
- };
- /**
- * 解码统计信息
- */
- struct DecoderStats {
- int framesDecoded; // 已解码帧数
- int framesDropped; // 丢弃帧数
- double averageDecodeTime; // 平均解码时间(毫秒)
- double currentFps; // 当前解码帧率
- };
- } // namespace Types
- namespace Core {
- /**
- * 媒体解码器抽象接口
- * 提供与平台无关的媒体解码功能
- */
- class IMediaDecoder {
- public:
- virtual ~IMediaDecoder() = default;
- /**
- * 初始化解码器
- * @param config 解码器配置
- * @return 是否初始化成功
- */
- virtual bool initialize(const Types::DecoderConfig& config) = 0;
- /**
- * 开始解码
- * @return 是否开始成功
- */
- virtual bool start() = 0;
- /**
- * 停止解码
- */
- virtual void stop() = 0;
- /**
- * 暂停解码
- */
- virtual void pause() = 0;
- /**
- * 恢复解码
- */
- virtual void resume() = 0;
- /**
- * 输入媒体包进行解码
- * @param packet 媒体包数据
- * @return 是否输入成功
- */
- virtual bool inputPacket(const Types::MediaPacket& packet) = 0;
- /**
- * 获取解码后的音频帧
- * @param audioFrame 输出音频帧数据
- * @return 是否获取成功
- */
- virtual bool getAudioFrame(Types::AudioFrame& audioFrame) = 0;
- /**
- * 获取解码后的视频帧
- * @param videoFrame 输出视频帧数据
- * @return 是否获取成功
- */
- virtual bool getVideoFrame(Types::VideoFrame& videoFrame) = 0;
- /**
- * 刷新解码器缓冲区
- */
- virtual void flush() = 0;
- /**
- * 重置解码器
- */
- virtual void reset() = 0;
- /**
- * 获取当前状态
- * @return 解码器状态
- */
- virtual DecoderState getState() const = 0;
- /**
- * 获取支持的媒体类型
- * @return 支持的媒体类型列表
- */
- virtual std::vector<MediaType> getSupportedMediaTypes() const = 0;
- /**
- * 检查是否支持硬件加速
- * @return 是否支持硬件加速
- */
- virtual bool isHardwareAccelSupported() const = 0;
- /**
- * 获取解码统计信息
- * @return 解码统计信息
- */
- virtual Types::DecoderStats getStats() const = 0;
- /**
- * 设置状态变化回调
- * @param callback 状态变化回调函数
- */
- virtual void setStateCallback(std::function<void(DecoderState)> callback) = 0;
- /**
- * 设置帧解码完成回调
- * @param callback 帧解码完成回调函数
- */
- virtual void setFrameDecodedCallback(std::function<void(MediaType, double)> callback) = 0;
- /**
- * 设置解码错误回调
- * @param callback 解码错误回调函数
- */
- virtual void setErrorCallback(std::function<void(const std::string&)> callback) = 0;
- };
- /**
- * 媒体解码器工厂接口
- */
- class IMediaDecoderFactory {
- public:
- virtual ~IMediaDecoderFactory() = default;
- /**
- * 创建解码器实例
- * @param mediaType 媒体类型
- * @return 解码器智能指针
- */
- virtual std::unique_ptr<IMediaDecoder> createDecoder(MediaType mediaType) = 0;
- /**
- * 获取支持的编解码器列表
- * @param mediaType 媒体类型
- * @return 支持的编解码器名称列表
- */
- virtual std::vector<std::string> getSupportedCodecs(MediaType mediaType) = 0;
- /**
- * 检查是否支持指定编解码器
- * @param codecName 编解码器名称
- * @param mediaType 媒体类型
- * @return 是否支持
- */
- virtual bool isCodecSupported(const std::string& codecName, MediaType mediaType) = 0;
- /**
- * 获取可用的硬件加速设备列表
- * @return 硬件加速设备名称列表
- */
- virtual std::vector<std::string> getAvailableHwAccelDevices() = 0;
- };
- } // namespace Core
- } // namespace AVPlayer2
- #endif // IMEDIADECODER_H
|