#include "vaapi_jpeg_decoder.h"
+#include "jpeg_destroyer.h"
#include "jpeg_frame.h"
#include "memcpy_interleaved.h"
vaapi_jpeg_decoding_usable = true;
}
+class VABufferDestroyer {
+public:
+ VABufferDestroyer(VADisplay dpy, VABufferID buf)
+ : dpy(dpy), buf(buf) {}
+
+ ~VABufferDestroyer() {
+ VAStatus va_status = vaDestroyBuffer(dpy, buf);
+ CHECK_VASTATUS(va_status, "vaDestroyBuffer");
+ }
+
+private:
+ VADisplay dpy;
+ VABufferID buf;
+};
+
shared_ptr<Frame> decode_jpeg_vaapi(const string &filename)
{
jpeg_decompress_struct dinfo;
jpeg_error_mgr jerr;
dinfo.err = jpeg_std_error(&jerr);
jpeg_create_decompress(&dinfo);
+ JPEGDestroyer destroy_dinfo(&dinfo);
FILE *fp = fopen(filename.c_str(), "rb");
if (fp == nullptr) {
VABufferID pic_param_buffer;
VAStatus va_status = vaCreateBuffer(va_dpy->va_dpy, config_id, VAPictureParameterBufferType, sizeof(pic_param), 1, &pic_param, &pic_param_buffer);
CHECK_VASTATUS_RET(va_status, "vaCreateBuffer");
+ VABufferDestroyer destroy_pic_param(va_dpy->va_dpy, pic_param_buffer);
// Quantization matrices.
VAIQMatrixBufferJPEGBaseline iq;
VABufferID iq_buffer;
va_status = vaCreateBuffer(va_dpy->va_dpy, config_id, VAIQMatrixBufferType, sizeof(iq), 1, &iq, &iq_buffer);
CHECK_VASTATUS_RET(va_status, "vaCreateBuffer");
+ VABufferDestroyer destroy_iq(va_dpy->va_dpy, iq_buffer);
// Huffman tables (arithmetic is not supported).
VAHuffmanTableBufferJPEGBaseline huff;
VABufferID huff_buffer;
va_status = vaCreateBuffer(va_dpy->va_dpy, config_id, VAHuffmanTableBufferType, sizeof(huff), 1, &huff, &huff_buffer);
CHECK_VASTATUS_RET(va_status, "vaCreateBuffer");
+ VABufferDestroyer destroy_huff(va_dpy->va_dpy, huff_buffer);
// Slice parameters (metadata about the slice).
VASliceParameterBufferJPEGBaseline parms;
VABufferID slice_param_buffer;
va_status = vaCreateBuffer(va_dpy->va_dpy, config_id, VASliceParameterBufferType, sizeof(parms), 1, &parms, &slice_param_buffer);
CHECK_VASTATUS_RET(va_status, "vaCreateBuffer");
+ VABufferDestroyer destroy_slice_param(va_dpy->va_dpy, slice_param_buffer);
// The actual data.
VABufferID data_buffer;
va_status = vaCreateBuffer(va_dpy->va_dpy, config_id, VASliceDataBufferType, str.size(), 1, &str[0], &data_buffer);
CHECK_VASTATUS_RET(va_status, "vaCreateBuffer");
+ VABufferDestroyer destroy_data(va_dpy->va_dpy, data_buffer);
VAResources resources = get_va_resources(dinfo.image_width, dinfo.image_height);
ReleaseVAResources release(resources);