]> git.sesse.net Git - nageru/blobdiff - nageru/quicksync_encoder.cpp
Move VADisplayWithCleanup into its own header file, in shared/.
[nageru] / nageru / quicksync_encoder.cpp
index 9dc603b5ede7a0c1c2f6bbefcf59db713bd92408..7ec9f71c5eced50096af99bd4baed2a433cd8a2b 100644 (file)
@@ -719,25 +719,15 @@ 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;
        }
        global_flags.use_zerocopy = use_zerocopy;
 }
 
-VADisplayWithCleanup::~VADisplayWithCleanup()
-{
-       if (va_dpy != nullptr) {
-               vaTerminate(va_dpy);
-       }
-       if (x11_display != nullptr) {
-               XCloseDisplay(x11_display);
-       }
-       if (drm_fd != -1) {
-               close(drm_fd);
-       }
-}
-
 unique_ptr<VADisplayWithCleanup> va_open_display(const string &va_display)
 {
        if (va_display.empty() || va_display[0] != '/') {  // An X display.
@@ -1547,6 +1537,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 +1984,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,