X-Git-Url: https://git.sesse.net/?a=blobdiff_plain;f=nageru%2Fmjpeg_encoder.h;fp=nageru%2Fmjpeg_encoder.h;h=93394db3a5cc476b12c0935a8e4bd0e93d9641a8;hb=2f8f882defb23abe8b2c54e195b72c57fba55cd6;hp=87bf3b5836509429b67195733d567c77ae0550e4;hpb=76a40fb903cb2d9b47473d48c5eaad97d957d6e7;p=nageru diff --git a/nageru/mjpeg_encoder.h b/nageru/mjpeg_encoder.h index 87bf3b5..93394db 100644 --- a/nageru/mjpeg_encoder.h +++ b/nageru/mjpeg_encoder.h @@ -50,6 +50,7 @@ private: struct VAResources { unsigned width, height; + uint32_t fourcc; VASurfaceID surface; VAContextID context; VABufferID data_buffer; @@ -119,8 +120,8 @@ private: std::vector encode_jpeg_libjpeg(const QueuedFrame &qf); void write_mjpeg_packet(AVFormatContext *avctx, int64_t pts, unsigned stream_index, const uint8_t *jpeg, size_t jpeg_size); void write_audio_packet(AVFormatContext *avctx, int64_t pts, unsigned stream_index, const std::vector &audio); - void init_jpeg_422(unsigned width, unsigned height, const movit::RGBTriplet &white_balance, VectorDestinationManager *dest, jpeg_compress_struct *cinfo); - std::vector get_jpeg_header(unsigned width, unsigned height, const movit::RGBTriplet &white_balance, jpeg_compress_struct *cinfo); + void init_jpeg(unsigned width, unsigned height, const movit::RGBTriplet &white_balance, VectorDestinationManager *dest, jpeg_compress_struct *cinfo, int y_h_samp_factor, int y_v_samp_factor); + std::vector get_jpeg_header(unsigned width, unsigned height, const movit::RGBTriplet &white_balance, int y_h_samp_factor, int y_v_samp_factor, jpeg_compress_struct *cinfo); void add_stream(HTTPD::StreamID stream_id); // Can only be called from the constructor, or the thread owning . void update_siphon_streams(); // Same. void create_ffmpeg_context(HTTPD::StreamID stream_id); @@ -152,10 +153,10 @@ private: bool running = false; std::unique_ptr va_dpy; - VAConfigID config_id; + VAConfigID config_id_422, config_id_420; struct VAKey { - unsigned width, height; + unsigned width, height, y_h_samp_factor, y_v_samp_factor; movit::RGBTriplet white_balance; bool operator< (const VAKey &other) const { @@ -163,6 +164,10 @@ private: return width < other.width; if (height != other.height) return height < other.height; + if (y_h_samp_factor != other.y_h_samp_factor) + return y_h_samp_factor < other.y_h_samp_factor; + if (y_v_samp_factor != other.y_v_samp_factor) + return y_v_samp_factor < other.y_v_samp_factor; if (white_balance.r != other.white_balance.r) return white_balance.r < other.white_balance.r; if (white_balance.g != other.white_balance.g) @@ -178,14 +183,14 @@ private: VAEncSliceParameterBufferJPEG parms; }; std::map va_data_for_parameters; - VAData get_va_data_for_parameters(unsigned width, unsigned height, const movit::RGBTriplet &white_balance); + VAData get_va_data_for_parameters(unsigned width, unsigned height, unsigned y_h_samp_factor, unsigned y_v_samp_factor, const movit::RGBTriplet &white_balance); std::list va_resources_freelist; std::mutex va_resources_mutex; - VAResources get_va_resources(unsigned width, unsigned height); + VAResources get_va_resources(unsigned width, unsigned height, uint32_t fourcc); void release_va_resources(VAResources resources); - static std::unique_ptr try_open_va(const std::string &va_display, std::string *error, VAConfigID *config_id); + static std::unique_ptr try_open_va(const std::string &va_display, std::string *error, VAConfigID *config_id_422, VAConfigID *config_id_420); uint8_t *tmp_y, *tmp_cbcr, *tmp_cb, *tmp_cr; // Private to the encoder thread. Used by the libjpeg backend only.