card->capture->set_frame_callback(bind(&Mixer::bm_frame, this, card_index, _1, _2, _3, _4, _5, _6, _7));
if (card->frame_allocator == nullptr) {
- card->frame_allocator.reset(new PBOFrameAllocator(pixel_format, 8 << 20, global_flags.width, global_flags.height)); // 8 MB.
+ card->frame_allocator.reset(new PBOFrameAllocator(pixel_format, 8 << 20, global_flags.width, global_flags.height, card_index, mjpeg_encoder.get())); // 8 MB.
}
card->capture->set_video_frame_allocator(card->frame_allocator.get());
if (card->surface == nullptr) {
new_frame->upload_func = nullptr;
}
- // Only bother doing MJPEG encoding if there are any connected clients
- // that want the stream. FIXME: We should also stop memcpy-ing if there are none!
- if (httpd.get_num_connected_multicam_clients() > 0) {
- auto stream_it = global_flags.card_to_mjpeg_stream_export.find(card_index);
- if (stream_it != global_flags.card_to_mjpeg_stream_export.end()) {
- mjpeg_encoder->upload_frame(pts_int, stream_it->second, new_frame->frame, new_frame->video_format, new_frame->y_offset, new_frame->cbcr_offset);
+ if (new_frame->frame->data_copy != nullptr) {
+ int mjpeg_card_index = mjpeg_encoder->get_mjpeg_stream_for_card(card_index);
+ if (mjpeg_card_index == -1) {
+ mjpeg_encoder->finish_frame(new_frame->frame);
+ } else {
+ mjpeg_encoder->upload_frame(pts_int, mjpeg_card_index, new_frame->frame, new_frame->video_format, new_frame->y_offset, new_frame->cbcr_offset);
}
}
}