X-Git-Url: https://git.sesse.net/?a=blobdiff_plain;f=nageru%2Fmjpeg_encoder.h;h=6e0357f0c0f32bd4a862ece103bb74d3bb7b50e5;hb=9ffd4f03f314cc6e0254449593def95c9bc203d6;hp=8b68294a48d9e01dfd0254b213b2770d57e0330d;hpb=0b776ba19a0b0703f87e5529b2e4f82af6b50435;p=nageru diff --git a/nageru/mjpeg_encoder.h b/nageru/mjpeg_encoder.h index 8b68294..6e0357f 100644 --- a/nageru/mjpeg_encoder.h +++ b/nageru/mjpeg_encoder.h @@ -27,12 +27,22 @@ struct jpeg_compress_struct; struct VADisplayWithCleanup; struct VectorDestinationManager; +#define CHECK_VASTATUS(va_status, func) \ + if (va_status != VA_STATUS_SUCCESS) { \ + fprintf(stderr, "%s:%d (%s) failed with %d\n", __func__, __LINE__, func, va_status); \ + exit(1); \ + } + class MJPEGEncoder { public: MJPEGEncoder(HTTPD *httpd, const std::string &va_display); ~MJPEGEncoder(); void stop(); void upload_frame(int64_t pts, unsigned card_index, RefCountedFrame frame, const bmusb::VideoFormat &video_format, size_t y_offset, size_t cbcr_offset); + bool using_vaapi() const { return va_dpy != nullptr; } + + // Returns -1 for inactive (ie., don't encode frames for this card right now). + int get_mjpeg_stream_for_card(unsigned card_index); private: static constexpr int quality = 90; @@ -42,6 +52,7 @@ private: VASurfaceID surface; VAContextID context; VABufferID data_buffer; + VAImage image; }; // RAII wrapper to release VAResources on return (even on error). @@ -153,6 +164,8 @@ private: std::atomic metric_mjpeg_frames_oversized_dropped{0}; std::atomic metric_mjpeg_overrun_dropped{0}; std::atomic metric_mjpeg_overrun_submitted{0}; + + friend class PBOFrameAllocator; // FIXME }; #endif // !defined(_MJPEG_ENCODER_H)