]> git.sesse.net Git - nageru/blobdiff - futatabi/vaapi_jpeg_decoder.cpp
Log a warning when we kill a client that is not keeping up.
[nageru] / futatabi / vaapi_jpeg_decoder.cpp
index 1d0f771cddb2d2f27d414b7393320df44799b51b..f34654d508504434e81fbcc816e12b3a8aba95a5 100644 (file)
@@ -41,7 +41,7 @@ static mutex va_resources_mutex;
 #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); \
+               abort(); \
        }
 
 #define CHECK_VASTATUS_RET(va_status, func) \
@@ -337,6 +337,8 @@ shared_ptr<Frame> decode_jpeg_vaapi(const string &jpeg)
        }
        JPEGDestroyer destroy_dinfo(&dinfo);
 
+       jpeg_save_markers(&dinfo, JPEG_APP0 + 1, 0xFFFF);
+
        jpeg_mem_src(&dinfo, reinterpret_cast<const unsigned char *>(jpeg.data()), jpeg.size());
        if (!error_mgr.run([&dinfo] { jpeg_read_header(&dinfo, true); })) {
                return nullptr;
@@ -566,6 +568,14 @@ shared_ptr<Frame> decode_jpeg_vaapi(const string &jpeg)
        frame->pitch_y = dinfo.image_width;
        frame->pitch_chroma = dinfo.image_width / 2;
 
+       if (dinfo.marker_list != nullptr &&
+           dinfo.marker_list->marker == JPEG_APP0 + 1 &&
+           dinfo.marker_list->data_length >= 4 &&
+           memcmp(dinfo.marker_list->data, "Exif", 4) == 0) {
+               frame->exif_data.assign(reinterpret_cast<char *>(dinfo.marker_list->data),
+                       dinfo.marker_list->data_length);
+       }
+
        va_status = vaUnmapBuffer(va_dpy->va_dpy, resources.image.buf);
        CHECK_VASTATUS_RET(va_status, "vaUnmapBuffer");