X-Git-Url: https://git.sesse.net/?a=blobdiff_plain;f=nageru%2Fmjpeg_encoder.h;h=5f19246841dd8e5f5e0bb6c6e41981ec4e71ecdc;hb=8850f9468d6a1727e7be302d2a9b4360f69210cc;hp=330784bd94a30121cf30f9b3c7a5bfb1d48d2883;hpb=0c7201c2d136870ea8c5fe205bee21207369312c;p=nageru diff --git a/nageru/mjpeg_encoder.h b/nageru/mjpeg_encoder.h index 330784b..5f19246 100644 --- a/nageru/mjpeg_encoder.h +++ b/nageru/mjpeg_encoder.h @@ -4,6 +4,7 @@ #include "defs.h" #include "shared/ffmpeg_raii.h" #include "shared/httpd.h" +#include "shared/va_resource_pool.h" #include "ref_counted_frame.h" extern "C" { @@ -44,62 +45,11 @@ public: bool using_vaapi() const { return va_dpy != nullptr; } bool should_encode_mjpeg_for_card(unsigned card_index); + VAResourcePool *get_va_pool() const { return va_pool.get(); } private: static constexpr int quality = 90; - struct VAResources { - unsigned width, height; - uint32_t fourcc; - VASurfaceID surface; - VAContextID context; - VABufferID data_buffer; - VAImage image; - }; - - // RAII wrapper to release VAResources on return (even on error). - class ReleaseVAResources { - public: - ReleaseVAResources() : committed(true) {} - - ReleaseVAResources(MJPEGEncoder *mjpeg, const VAResources &resources) - : mjpeg(mjpeg), resources(resources) {} - - ReleaseVAResources(ReleaseVAResources &) = delete; - - ReleaseVAResources(ReleaseVAResources &&other) - : mjpeg(other.mjpeg), resources(other.resources), committed(other.committed) { - other.commit(); - } - - ReleaseVAResources &operator= (ReleaseVAResources &) = delete; - - ReleaseVAResources &operator= (ReleaseVAResources &&other) { - if (!committed) { - mjpeg->release_va_resources(resources); - } - mjpeg = other.mjpeg; - resources = std::move(other.resources); - committed = other.committed; - other.commit(); - return *this; - } - - ~ReleaseVAResources() - { - if (!committed) { - mjpeg->release_va_resources(resources); - } - } - - void commit() { committed = true; } - - private: - MJPEGEncoder *mjpeg = nullptr; - VAResources resources; - bool committed = false; - }; - struct QueuedFrame { int64_t pts; unsigned card_index; @@ -110,7 +60,7 @@ private: movit::RGBTriplet white_balance; // Only for frames in the process of being encoded by VA-API. - VAResources resources; + VAResourcePool::VAResources resources; ReleaseVAResources resource_releaser; }; @@ -153,7 +103,7 @@ private: bool running = false; std::unique_ptr va_dpy; - VAConfigID config_id_422, config_id_420; + std::unique_ptr va_pool; struct VAKey { unsigned width, height, y_h_samp_factor, y_v_samp_factor; @@ -185,11 +135,6 @@ private: std::map va_data_for_parameters; 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, uint32_t fourcc); - void release_va_resources(VAResources resources); - uint8_t *tmp_y, *tmp_cbcr, *tmp_cb, *tmp_cr; // Private to the encoder thread. Used by the libjpeg backend only. std::atomic metric_mjpeg_frames_zero_size_dropped{0};