#include "queue_spot_holder.h"
extern "C" {
+#include <libavformat/avformat.h>
#include <libavformat/avio.h>
}
#include <condition_variable>
#include <functional>
#include <mutex>
+#include <thread>
class JPEGFrameView;
class VideoStream;
class QSurface;
class QSurfaceFormat;
+double compute_time_left(const std::vector<Clip> &clips, const std::map<size_t, double> &progress);
+
class Player : public QueueInterface {
public:
- Player(JPEGFrameView *destination, bool also_output_to_stream);
+ enum StreamOutput {
+ NO_STREAM_OUTPUT,
+ HTTPD_STREAM_OUTPUT, // Output to global_httpd.
+ FILE_STREAM_OUTPUT // Output to file_avctx.
+ };
+ Player(JPEGFrameView *destination, StreamOutput stream_output, AVFormatContext *file_avctx = nullptr);
+ ~Player();
void play_clip(const Clip &clip, size_t clip_idx, unsigned stream_idx);
void override_angle(unsigned stream_idx); // For the current clip only.
void release_queue_spot() override;
private:
- void thread_func(bool also_output_to_stream);
+ void thread_func(StreamOutput stream_output, AVFormatContext *file_avctx);
void open_output_stream();
static int write_packet2_thunk(void *opaque, uint8_t *buf, int buf_size, AVIODataMarkerType type, int64_t time);
int write_packet2(uint8_t *buf, int buf_size, AVIODataMarkerType type, int64_t time);
// Returns false if pts is after the last frame.
bool find_surrounding_frames(int64_t pts, int stream_idx, FrameOnDisk *frame_lower, FrameOnDisk *frame_upper);
+ std::thread player_thread;
+ std::atomic<bool> should_quit{false};
+
JPEGFrameView *destination;
done_callback_func done_callback;
next_clip_callback_func next_clip_callback;