X-Git-Url: https://git.sesse.net/?a=blobdiff_plain;f=h264encode.h;h=f0fcfae0309828b1fbe4826e6dd1d186a1e92ed8;hb=b2766e96ceadecdec2eafc85e2cec55c9fd27a34;hp=5409d17421c3fb8b047c94911908c2243864d7f4;hpb=945c4f5594b09f32d349630837c4663d8c13af63;p=nageru diff --git a/h264encode.h b/h264encode.h index 5409d17..f0fcfae 100644 --- a/h264encode.h +++ b/h264encode.h @@ -26,82 +26,34 @@ #ifndef _H264ENCODE_H #define _H264ENCODE_H -extern "C" { -#include -} -#include +#include +#include #include -#include #include -#include -#include -#include -#include -#include -#include +#include -#include "pbo_frame_allocator.h" -#include "context.h" +#include "ref_counted_frame.h" +#include "ref_counted_gl_sync.h" -#define SURFACE_NUM 16 /* 16 surfaces for source YUV */ +class H264EncoderImpl; +class HTTPD; +class QSurface; +// This is just a pimpl, because including anything X11-related in a .h file +// tends to trip up Qt. All the real logic is in H264EncoderImpl, defined in the +// .cpp file. class H264Encoder { public: - H264Encoder(QSurface *surface, int width, int height, const char *output_filename); - ~H264Encoder(); - //void add_frame(FrameAllocator::Frame frame, GLsync fence); + H264Encoder(QSurface *surface, int width, int height, HTTPD *httpd); + ~H264Encoder(); -#if 0 - struct Frame { - public: - GLuint fbo; - GLuint y_tex, cbcr_tex; - - private: - //int surface_subnum; - }; - void -#endif + void add_audio(int64_t pts, std::vector audio); bool begin_frame(GLuint *y_tex, GLuint *cbcr_tex); - void end_frame(GLsync fence, const std::vector &input_frames_to_release); + void end_frame(RefCountedGLsync fence, int64_t pts, const std::vector &input_frames); + void shutdown(); // Blocking. private: - struct storage_task { - unsigned long long display_order; - unsigned long long encode_order; - int frame_type; - }; - - void copy_thread_func(); - void storage_task_thread(); - void storage_task_enqueue(unsigned long long display_order, unsigned long long encode_order, int frame_type); - int save_codeddata(unsigned long long display_order, unsigned long long encode_order, int frame_type); - - std::thread copy_thread, storage_thread; - - std::mutex storage_task_queue_mutex; - std::condition_variable storage_task_queue_changed; - int srcsurface_status[SURFACE_NUM]; // protected by storage_task_queue_mutex - std::queue storage_task_queue; // protected by storage_task_queue_mutex - bool storage_thread_should_quit = false; // protected by storage_task_queue_mutex - - std::mutex frame_queue_mutex; - std::condition_variable frame_queue_nonempty; - bool copy_thread_should_quit = false; // under frame_queue_mutex - - //int frame_width, frame_height; - //int ; - int current_storage_frame; - - struct PendingFrame { - GLsync fence; - std::vector input_frames_to_release; - }; - std::map pending_frames; - QSurface *surface; - - AVFormatContext *avctx; - AVStream *avstream; + std::unique_ptr impl; }; #endif