X-Git-Url: https://git.sesse.net/?a=blobdiff_plain;f=quicksync_encoder_impl.h;h=0dcb9cb0e0a3a374af7ca2a7eb5ecd90b26a0b41;hb=4a0187ffb4075b4d217b8d9e9c96cac548b199d8;hp=b55edbbc58c6586ff8645fe3b0fbdd08844212f4;hpb=e066f18188fde1e6bd0b698c89427119cbffaaa3;p=nageru diff --git a/quicksync_encoder_impl.h b/quicksync_encoder_impl.h index b55edbb..0dcb9cb 100644 --- a/quicksync_encoder_impl.h +++ b/quicksync_encoder_impl.h @@ -2,6 +2,7 @@ #define _QUICKSYNC_ENCODER_IMPL_H 1 #include +#include #include #include @@ -35,9 +36,11 @@ 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 begin_frame(int64_t pts, int64_t duration, const std::vector &input_frames, GLuint *y_tex, GLuint *cbcr_tex); + 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) { @@ -55,6 +58,7 @@ private: int frame_type; std::vector audio; int64_t pts, dts, duration; + movit::YCbCrLumaCoefficients ycbcr_coefficients; ReceivedTimestamps received_ts; std::vector ref_display_frame_numbers; }; @@ -62,15 +66,16 @@ private: RefCountedGLsync fence; std::vector input_frames; int64_t pts, duration; + 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. @@ -99,21 +104,21 @@ private: void add_packet_for_uncompressed_frame(int64_t pts, int64_t duration, const uint8_t *data); void pass_frame(PendingFrame frame, int display_frame_num, int64_t pts, int64_t duration); 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, int64_t duration); + int frame_type, int64_t pts, int64_t dts, int64_t duration, movit::YCbCrLumaCoefficients ycbcr_coefficients); void storage_task_thread(); void storage_task_enqueue(storage_task task); void save_codeddata(GLSurface *surf, storage_task task); - int render_packedsequence(); + int render_packedsequence(movit::YCbCrLumaCoefficients ycbcr_coefficients); int render_packedpicture(); void render_packedslice(); int render_sequence(); int render_picture(GLSurface *surf, int frame_type, int display_frame_num, int gop_start_display_frame_num); - void sps_rbsp(bitstream *bs); + void sps_rbsp(movit::YCbCrLumaCoefficients ycbcr_coefficients, bitstream *bs); void pps_rbsp(bitstream *bs); int build_packed_pic_buffer(unsigned char **header_buffer); int render_slice(int encoding_frame_num, int display_frame_num, int gop_start_display_frame_num, int frame_type); void slice_header(bitstream *bs); - int build_packed_seq_buffer(unsigned char **header_buffer); + 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(); @@ -130,7 +135,7 @@ private: bool is_shutdown = false; bool has_released_gl_resources = false; - bool use_zerocopy; + std::atomic use_zerocopy; int drm_fd = -1; std::thread encode_thread, storage_thread; @@ -157,6 +162,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. @@ -208,7 +214,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;