// VlcMediaEngine.h #pragma once # include "MediaEngine.h" #if defined(AX_ENABLE_VLC_MEDIA) #include "vlc/vlc.h" NS_AX_BEGIN class VlcMediaEngine : public MediaEngine { public: VlcMediaEngine(); ~VlcMediaEngine(); void fireMediaEvent(MEMediaEventType event) { if (_onMediaEvent) _onMediaEvent(event); } void setCallbacks(std::function onMediaEvent, std::function onVideoFrame) override { _onMediaEvent = std::move(onMediaEvent); _onVideoFrame = std::move(onVideoFrame); } void setAutoPlay(bool bAutoPlay) override; bool open(std::string_view sourceUri) override; bool close() override; bool setLoop(bool bLooping) override; bool setRate(double fRate) override; bool setCurrentTime(double fSeekTimeInSec) override; bool play() override; bool pause() override; bool stop() override; bool isPlaybackEnded() const override { return _playbackEnded; } MEMediaState getState() const override; bool transferVideoFrame() override; void handleEvent(MEMediaEventType event); bool updatePlaybackProperties(); static void* libvlc_video_lock(void* data, void** p_pixels); static void libvlc_video_unlock(void* data, void* id, void* const* p_pixels); static unsigned int libvlc_video_format_setup(void** opaque, char* chroma, unsigned* width, unsigned* height, unsigned* pitches, unsigned* lines); static void libvlc_handle_event(const libvlc_event_t* event, void* userData); private: std::function _onMediaEvent; std::function _onVideoFrame; std::string _sourceUri; static libvlc_instance_t* s_vlc; libvlc_instance_t* _vlc{}; libvlc_media_player_t* _mp{}; // media player libvlc_media_list_player_t* _mlp{}; // media list player libvlc_media_list_t* _ml{}; // media list libvlc_event_manager_t* _mp_events{}; libvlc_event_manager_t* _mpl_events{}; bool _bAutoPlay = false; bool _looping = false; bool _playbackEnded = false; std::atomic _state{MEMediaState::Closed}; uint64_t _frameIndex = 0; MEIntPoint _videoDim; /* * codec dim, not for render, just record info i.e * H265: ALIGN_XY(_videoDim, 32) * H264: ALIGN_X(_videoDim.x, 16) */ MEIntPoint _codecDim; std::string _videoCodecMimeType; yasio::byte_buffer _frameBuffer1; // for write yasio::byte_buffer _frameBuffer2; // for read mutable std::mutex _frameBuffer1Mtx; }; struct VlcMediaEngineFactory : public MediaEngineFactory { MediaEngine* createMediaEngine() override { return new VlcMediaEngine(); } void destroyMediaEngine(MediaEngine* me) override { delete static_cast(me); } }; NS_AX_END #endif