Loading...
Searching...
No Matches
VideoDecoder.hpp
1#pragma once
2#include <Media/Libav.hpp>
3#if SCORE_HAS_LIBAV
4#include <Video/FrameQueue.hpp>
5#include <Video/Rescale.hpp>
6#include <Video/VideoInterface.hpp>
7extern "C" {
8#include <libavformat/avformat.h>
9#include <libswscale/swscale.h>
10}
11
12#include <ossia/detail/lockfree_queue.hpp>
13
14#include <score_plugin_media_export.h>
15
16#include <atomic>
17#include <condition_variable>
18#include <mutex>
19#include <string>
20#include <thread>
21#include <vector>
22
23namespace Video
24{
25class SCORE_PLUGIN_MEDIA_EXPORT VideoDecoder final
26 : public VideoInterface
27 , public LibAVDecoder
28{
29public:
30 explicit VideoDecoder(DecoderConfiguration) noexcept;
31 ~VideoDecoder() noexcept;
32
33 bool open(const std::string& inputFile) noexcept;
34 bool load(const std::string& inputFile) noexcept;
35
36 const std::string& file() const noexcept { return m_inputFile; }
37
38 int64_t duration() const noexcept;
39
40 void seek(int64_t flicks);
41
42 AVFrame* dequeue_frame() noexcept override;
43 void release_frame(AVFrame*) noexcept override;
44
45private:
46 void buffer_thread() noexcept;
47 void close_file() noexcept;
48 bool seek_impl(int64_t dts) noexcept;
49 AVFrame* read_frame_impl() noexcept;
50 bool open_stream() noexcept;
51 void close_video() noexcept;
52
53 static const constexpr int frames_to_buffer = 16;
54
55 std::string m_inputFile;
56
57 std::thread m_thread;
58 std::mutex m_condMut;
59 std::condition_variable m_condVar;
60
61 int64_t m_duration{}; // in flicks
62
63 std::atomic_int64_t m_seekTo = -1;
64 std::atomic_int64_t m_last_dequeued_dts = 0;
65 std::atomic_int64_t m_dequeued = 0;
66
67 std::atomic_bool m_running{};
68};
69
70}
71#endif
Definition VideoDecoder.hpp:28
Definition Rescale.hpp:36
Definition Rescale.hpp:45
Definition VideoInterface.hpp:37