CaptureCard *card = &cards[card_index];
card->usb = new BMUSBCapture(card_index);
card->usb->set_frame_callback(bind(&Mixer::bm_frame, this, card_index, _1, _2, _3, _4, _5, _6, _7));
- card->frame_allocator.reset(new PBOFrameAllocator(WIDTH * (HEIGHT+EXTRAHEIGHT) * 2 + 44, WIDTH, HEIGHT));
+ card->frame_allocator.reset(new PBOFrameAllocator(WIDTH * (HEIGHT+EXTRAHEIGHT) * 2 + 44 + 1, WIDTH, HEIGHT));
card->usb->set_video_frame_allocator(card->frame_allocator.get());
card->surface = create_surface(format);
card->usb->set_dequeue_thread_callbacks(
int64_t frame_length = find_frame_length(video_format);
- if (audio_frame.len - audio_offset > 30000) {
+ size_t num_samples = (audio_frame.len >= audio_offset) ? (audio_frame.len - audio_offset) / 8 / 3 : 0;
+ if (num_samples > OUTPUT_FREQUENCY / 10) {
printf("Card %d: Dropping frame with implausible audio length (len=%d, offset=%d) [timecode=0x%04x video_len=%d video_offset=%d video_format=%x)\n",
card_index, int(audio_frame.len), int(audio_offset),
timecode, int(video_frame.len), int(video_offset), video_format);
card->last_timecode = timecode;
// Convert the audio to stereo fp32 and add it.
- size_t num_samples = (audio_frame.len >= audio_offset) ? (audio_frame.len - audio_offset) / 8 / 3 : 0;
vector<float> audio;
audio.resize(num_samples * 2);
convert_fixed24_to_fp32(&audio[0], 2, audio_frame.data + audio_offset, 8, num_samples);