#include "flags.h"
#include "mjpeg_encoder.h"
#include "v210_converter.h"
-#include "va_display_with_cleanup.h"
+#include "shared/va_display.h"
using namespace std;
default:
assert(false);
}
+
+ if (ud->generation != generation) {
+ auto it = lingering_generations.find(ud->generation);
+ assert(it != lingering_generations.end());
+ if (--it->second.num_frames_left == 0) {
+ lingering_generations.erase(it); // Deallocates the userdata block.
+ }
+ }
}
//static int sumsum = 0;
mjpeg_encoder->should_encode_mjpeg_for_card(card_index)) {
if (mjpeg_encoder->using_vaapi()) {
VADisplay va_dpy = mjpeg_encoder->va_dpy->va_dpy;
- MJPEGEncoder::VAResources resources = mjpeg_encoder->get_va_resources(width, height);
+ MJPEGEncoder::VAResources resources = mjpeg_encoder->get_va_resources(width, height, VA_FOURCC_UYVY); // Only used by DeckLinkCapture, so always 4:2:2.
MJPEGEncoder::ReleaseVAResources release(mjpeg_encoder, resources);
if (resources.image.pitches[0] == stride) {
return;
}
+ lock_guard<mutex> lock(freelist_mutex);
+ lingering_generations[generation] = LingeringGeneration{ move(userdata), this->num_queued_frames };
+ ++generation;
+
+ while (!freelist.empty()) {
+ Frame frame = freelist.front();
+ freelist.pop();
+ destroy_frame(&frame);
+ }
+
this->pixel_format = pixel_format;
this->frame_size = frame_size;
this->width = width;
this->permissions = permissions;
this->map_bits = map_bits;
- lock_guard<mutex> lock(freelist_mutex);
- while (!freelist.empty()) {
- Frame frame = freelist.front();
- freelist.pop();
- destroy_frame(&frame);
- }
- ++generation;
+ userdata.reset(new Userdata[num_queued_frames]);
for (size_t i = 0; i < num_queued_frames; ++i) {
init_frame(i, frame_size, width, height, permissions, map_bits, generation);
}