X-Git-Url: https://git.sesse.net/?a=blobdiff_plain;f=h264encode.h;h=53c6c569feab9724f5fd8c0780a6ebbc54814946;hb=fec3f686bf239f9d98782603616613c16f8025b1;hp=f355116781cadde6f06c25d5a7c2b8a35b17870d;hpb=e18d9bad93d5bf766d52d0cb66db4c3d3f8a711b;p=nageru diff --git a/h264encode.h b/h264encode.h index f355116..53c6c56 100644 --- a/h264encode.h +++ b/h264encode.h @@ -27,27 +27,35 @@ #define _H264ENCODE_H extern "C" { +#include #include } -#include +#include +#include +#include #include +#include #include #include #include +#include #include -#include -#include -#include -#include +#include -#include "pbo_frame_allocator.h" +#include "bmusb/bmusb.h" #include "context.h" +#include "pbo_frame_allocator.h" +#include "ref_counted_frame.h" +#include "ref_counted_gl_sync.h" + +class HTTPD; +class QSurface; #define SURFACE_NUM 16 /* 16 surfaces for source YUV */ class H264Encoder { public: - H264Encoder(QSurface *surface, int width, int height, const char *output_filename); + H264Encoder(QSurface *surface, int width, int height, HTTPD *httpd); ~H264Encoder(); //void add_frame(FrameAllocator::Frame frame, GLsync fence); @@ -62,22 +70,32 @@ public: }; void #endif + void add_audio(int64_t pts, std::vector audio); // Needs to come before end_frame() of same pts. bool begin_frame(GLuint *y_tex, GLuint *cbcr_tex); - void end_frame(GLsync fence); + void end_frame(RefCountedGLsync fence, int64_t pts, const std::vector &input_frames); private: struct storage_task { unsigned long long display_order; - unsigned long long encode_order; int frame_type; + std::vector audio; + int64_t pts, dts; + }; + struct PendingFrame { + RefCountedGLsync fence; + std::vector input_frames; + int64_t pts; }; - void copy_thread_func(); + void encode_thread_func(); + void encode_remaining_frames_as_p(int encoding_frame_num, int gop_start_display_frame_num, int64_t last_dts); + void encode_frame(PendingFrame frame, int encoding_frame_num, int display_frame_num, int gop_start_display_frame_num, + int frame_type, int64_t pts, int64_t dts); 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); + void storage_task_enqueue(storage_task task); + void save_codeddata(storage_task task); - std::thread copy_thread, storage_thread; + std::thread encode_thread, storage_thread; std::mutex storage_task_queue_mutex; std::condition_variable storage_task_queue_changed; @@ -87,19 +105,18 @@ private: std::mutex frame_queue_mutex; std::condition_variable frame_queue_nonempty; - bool copy_thread_should_quit = false; // under frame_queue_mutex + bool encode_thread_should_quit = false; // under frame_queue_mutex //int frame_width, frame_height; //int ; int current_storage_frame; -#if 0 - std::map> pending_frames; -#endif - std::map pending_frames; + + std::map pending_video_frames; // under frame_queue_mutex + std::map> pending_audio_frames; // under frame_queue_mutex QSurface *surface; - AVFormatContext *avctx; - AVStream *avstream; + AVCodecContext *context_audio; + HTTPD *httpd; }; #endif