]> git.sesse.net Git - nageru/blobdiff - nageru/quicksync_encoder.cpp
Add support for V4L2 output.
[nageru] / nageru / quicksync_encoder.cpp
index 9dc603b5ede7a0c1c2f6bbefcf59db713bd92408..70bf8002073d64aba40f2aa6021c3e19ddf9a352 100644 (file)
@@ -719,6 +719,9 @@ void QuickSyncEncoderImpl::enable_zerocopy_if_possible()
        } else if (global_flags.x264_video_to_http) {
                fprintf(stderr, "Disabling zerocopy H.264 encoding due to --http-x264-video.\n");
                use_zerocopy = false;
+       } else if (!global_flags.v4l_output_device.empty()) {
+               fprintf(stderr, "Disabling zerocopy H.264 encoding due to --v4l-output.\n");
+               use_zerocopy = false;
        } else {
                use_zerocopy = true;
        }
@@ -1547,6 +1550,10 @@ QuickSyncEncoderImpl::QuickSyncEncoderImpl(const std::string &filename, Resource
                memset(&slice_param, 0, sizeof(slice_param));
        }
 
+       if (!global_flags.v4l_output_device.empty()) {
+               v4l_output.reset(new V4LOutput(global_flags.v4l_output_device.c_str(), width, height));
+       }
+
        call_once(quick_sync_metrics_inited, [](){
                mixer_latency_histogram.init("mixer");
                qs_latency_histogram.init("quick_sync");
@@ -1990,6 +1997,10 @@ void QuickSyncEncoderImpl::pass_frame(QuickSyncEncoderImpl::PendingFrame frame,
        } else if (global_flags.x264_video_to_http || global_flags.x264_video_to_disk) {
                x264_encoder->add_frame(pts, duration, frame.ycbcr_coefficients, data, received_ts);
        }
+
+       if (v4l_output != nullptr) {
+               v4l_output->send_frame(data);
+       }
 }
 
 void QuickSyncEncoderImpl::encode_frame(QuickSyncEncoderImpl::PendingFrame frame, int encoding_frame_num, int display_frame_num, int gop_start_display_frame_num,