X-Git-Url: https://git.sesse.net/?a=blobdiff_plain;f=quicksync_encoder_impl.h;h=41f7e32345f16fd1ba19f4cd1de637459c948659;hb=a5746714e6ca1e665bf9e74344e67712443f947a;hp=679f2a27beec9753e2e1cffb0767a7db4e0fd667;hpb=ee7da87b4aa284b7babd59dc21db925f7c384ce7;p=nageru diff --git a/quicksync_encoder_impl.h b/quicksync_encoder_impl.h index 679f2a2..41f7e32 100644 --- a/quicksync_encoder_impl.h +++ b/quicksync_encoder_impl.h @@ -31,14 +31,26 @@ struct __bitstream { }; typedef struct __bitstream bitstream; +struct VADisplayWithCleanup { + ~VADisplayWithCleanup(); + + VADisplay va_dpy; + Display *x11_display = nullptr; + bool can_use_zerocopy = true; + int drm_fd = -1; +}; +std::unique_ptr va_open_display(const std::string &va_display); // Can return nullptr on failure. + class QuickSyncEncoderImpl { public: QuickSyncEncoderImpl(const std::string &filename, movit::ResourcePool *resource_pool, QSurface *surface, const std::string &va_display, int width, int height, AVOutputFormat *oformat, X264Encoder *x264_encoder, DiskSpaceEstimator *disk_space_estimator); ~QuickSyncEncoderImpl(); void add_audio(int64_t pts, std::vector audio); + bool is_zerocopy() const; bool begin_frame(int64_t pts, int64_t duration, movit::YCbCrLumaCoefficients ycbcr_coefficients, const std::vector &input_frames, GLuint *y_tex, GLuint *cbcr_tex); RefCountedGLsync end_frame(); void shutdown(); + void close_file(); void release_gl_resources(); void set_stream_mux(Mux *mux) { @@ -67,13 +79,13 @@ private: movit::YCbCrLumaCoefficients ycbcr_coefficients; }; struct GLSurface { + // Only if x264_video_to_disk == false. VASurfaceID src_surface, ref_surface; VABufferID coded_buf; - VAImage surface_image; - GLuint y_tex, cbcr_tex; - // Only if use_zerocopy == true. + // Only if use_zerocopy == true (which implies x264_video_to_disk == false). + GLuint y_tex, cbcr_tex; EGLImage y_egl_image, cbcr_egl_image; // Only if use_zerocopy == false. @@ -119,10 +131,7 @@ private: int build_packed_seq_buffer(movit::YCbCrLumaCoefficients ycbcr_coefficients, unsigned char **header_buffer); int build_packed_slice_buffer(unsigned char **header_buffer); int init_va(const std::string &va_display); - int deinit_va(); void enable_zerocopy_if_possible(); - VADisplay va_open_display(const std::string &va_display); - void va_close_display(VADisplay va_dpy); int setup_encode(); void release_encode(); void update_ReferenceFrames(int current_display_frame, int frame_type); @@ -133,8 +142,7 @@ private: bool is_shutdown = false; bool has_released_gl_resources = false; - bool use_zerocopy; - int drm_fd = -1; + std::atomic use_zerocopy{false}; std::thread encode_thread, storage_thread; @@ -160,6 +168,7 @@ private: std::map reorder_buffer; int quicksync_encoding_frame_num = 0; + std::mutex file_audio_encoder_mutex; std::unique_ptr file_audio_encoder; X264Encoder *x264_encoder; // nullptr if not using x264. @@ -167,10 +176,8 @@ private: Mux* stream_mux = nullptr; // To HTTP. std::unique_ptr file_mux; // To local disk. - Display *x11_display = nullptr; - // Encoder parameters - VADisplay va_dpy; + std::unique_ptr va_dpy; VAProfile h264_profile = (VAProfile)~0; VAConfigAttrib config_attrib[VAConfigAttribTypeMax]; int config_attrib_num = 0, enc_packed_header_idx; @@ -211,7 +218,6 @@ private: int h264_entropy_mode = 1; /* cabac */ int ip_period = 3; - int rc_mode = -1; unsigned int current_ref_frame_num = 0; // Encoding frame order within this GOP, sans B-frames. int frame_width;