X-Git-Url: https://git.sesse.net/?p=nageru;a=blobdiff_plain;f=futatabi%2Fplayer.h;h=03da29e364b80db3c2a503fc3e3d98b25ee90a84;hp=c7f8e070a71a0ce697e1c21edd14727a3892762f;hb=eaba7288c4fb39ca195c9355970293bcaf088dbc;hpb=9b7d691b4cc5db7dbfc18c82e86c1207fcac4722 diff --git a/futatabi/player.h b/futatabi/player.h index c7f8e07..03da29e 100644 --- a/futatabi/player.h +++ b/futatabi/player.h @@ -6,12 +6,14 @@ #include "queue_spot_holder.h" extern "C" { +#include #include } #include #include #include +#include class JPEGFrameView; class VideoStream; @@ -20,7 +22,13 @@ class QSurfaceFormat; 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. @@ -46,7 +54,7 @@ public: 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); @@ -55,6 +63,9 @@ private: // 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 should_quit{false}; + JPEGFrameView *destination; done_callback_func done_callback; next_clip_callback_func next_clip_callback;