]> git.sesse.net Git - nageru/blobdiff - nageru/mjpeg_encoder.h
Fix MJPEG white balance information when VA-API is in use.
[nageru] / nageru / mjpeg_encoder.h
index 6ba7f0381bad3a1f3f1ec879e07cf44dcaf7260b..87bf3b5836509429b67195733d567c77ae0550e4 100644 (file)
@@ -31,7 +31,7 @@ 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); \
+        fprintf(stderr, "%s:%d (%s) failed: %s\n", __func__, __LINE__, func, vaErrorStr(va_status)); \
         exit(1);                                                        \
     }
 
@@ -154,6 +154,22 @@ private:
        std::unique_ptr<VADisplayWithCleanup> va_dpy;
        VAConfigID config_id;
 
+       struct VAKey {
+               unsigned width, height;
+               movit::RGBTriplet white_balance;
+
+               bool operator< (const VAKey &other) const {
+                       if (width != other.width)
+                               return width < other.width;
+                       if (height != other.height)
+                               return height < other.height;
+                       if (white_balance.r != other.white_balance.r)
+                               return white_balance.r < other.white_balance.r;
+                       if (white_balance.g != other.white_balance.g)
+                               return white_balance.g < other.white_balance.g;
+                       return white_balance.b < other.white_balance.b;
+               }
+       };
        struct VAData {
                std::vector<uint8_t> jpeg_header;
                VAEncPictureParameterBufferJPEG pic_param;
@@ -161,8 +177,8 @@ private:
                VAHuffmanTableBufferJPEGBaseline huff;
                VAEncSliceParameterBufferJPEG parms;
        };
-       std::map<std::pair<unsigned, unsigned>, VAData> va_data_for_resolution;
-       VAData get_va_data_for_resolution(unsigned width, unsigned height, const movit::RGBTriplet &white_balance);
+       std::map<VAKey, VAData> va_data_for_parameters;
+       VAData get_va_data_for_parameters(unsigned width, unsigned height, const movit::RGBTriplet &white_balance);
 
        std::list<VAResources> va_resources_freelist;
        std::mutex va_resources_mutex;