}
}
-
} // namespace
Mixer::Mixer(const QSurfaceFormat &format, unsigned num_cards)
{
float m = fabs(samples[0]);
for (size_t i = 1; i < num_samples; ++i) {
- m = std::max(m, fabs(samples[i]));
+ m = max(m, fabs(samples[i]));
}
return m;
}
if (card->should_quit) return;
}
+ size_t expected_length = width * (height + extra_lines_top + extra_lines_bottom) * 2;
if (video_frame.len - video_offset == 0 ||
- video_frame.len - video_offset != size_t(width * (height + extra_lines_top + extra_lines_bottom) * 2)) {
+ video_frame.len - video_offset != expected_length) {
if (video_frame.len != 0) {
- printf("Card %d: Dropping video frame with wrong length (%ld)\n",
- card_index, video_frame.len - video_offset);
+ printf("Card %d: Dropping video frame with wrong length (%ld; expected %ld)\n",
+ card_index, video_frame.len - video_offset, expected_length);
}
if (video_frame.owner) {
video_frame.owner->release_frame(video_frame);
unsigned num_fields = interlaced ? 2 : 1;
timespec frame_upload_start;
if (interlaced) {
- // NOTE: This isn't deinterlacing. This is just sending the two fields along
- // as separate frames without considering anything like the half-field offset.
- // We'll need to add a proper deinterlacer on the receiving side to get this right.
+ // Send the two fields along as separate frames; the other side will need to add
+ // a deinterlacer to actually get this right.
assert(height % 2 == 0);
height /= 2;
assert(frame_length % 2 == 0);
num_fields = 2;
clock_gettime(CLOCK_MONOTONIC, &frame_upload_start);
}
+ userdata->last_interlaced = interlaced;
+ userdata->last_frame_rate_nom = frame_rate_nom;
+ userdata->last_frame_rate_den = frame_rate_den;
RefCountedFrame new_frame(video_frame);
// Upload the textures.