]> git.sesse.net Git - nageru/blobdiff - nageru/mixer.cpp
Use vaCreateImage + vaPutImage instead of vaDeriveImage.
[nageru] / nageru / mixer.cpp
index d1b52ef2dc54b4a9db8ad84e755bbadc4ac76411..e0aa8b1fe27783c685dde0c142a8be586dcb89cf 100644 (file)
@@ -551,7 +551,7 @@ void Mixer::configure_card(unsigned card_index, CaptureInterface *capture, CardT
 
        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) {
@@ -824,7 +824,7 @@ void Mixer::bm_frame(unsigned card_index, uint16_t timecode,
        if (video_frame.len - video_offset == 0 ||
            video_frame.len - video_offset != expected_length) {
                if (video_frame.len != 0) {
-                       printf("%s: Dropping video frame with wrong length (%ld; expected %ld)\n",
+                       printf("%s: Dropping video frame with wrong length (%zu; expected %zu)\n",
                                spec_to_string(device).c_str(), video_frame.len - video_offset, expected_length);
                }
                if (video_frame.owner) {
@@ -1081,12 +1081,12 @@ void Mixer::thread_func()
                                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);
                                }
                        }
                }