]> git.sesse.net Git - nageru/blobdiff - nageru/quicksync_encoder.cpp
Add some asserts to track down pts/dts problems before we get crashes back from FFmpe...
[nageru] / nageru / quicksync_encoder.cpp
index 84bfaac80b9c6e3b5c4e731c92a674b71510e7b8..75b13b899a0cee05e109ef5b53764f82ebeb767b 100644 (file)
@@ -713,17 +713,11 @@ void QuickSyncEncoderImpl::enable_zerocopy_if_possible()
        if (global_flags.x264_video_to_disk) {
                // Quick Sync is entirely disabled.
                use_zerocopy = false;
-       } else if (global_flags.uncompressed_video_to_http) {
-               fprintf(stderr, "Disabling zerocopy H.264 encoding due to --http-uncompressed-video.\n");
-               use_zerocopy = false;
        } 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.av1_video_to_http) {
-               fprintf(stderr, "Disabling zerocopy H.264 encoding due to --http-av1-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;
@@ -906,7 +900,7 @@ int QuickSyncEncoderImpl::setup_encode()
                        gl_surfaces[i].y_tex = resource_pool->create_2d_texture(GL_R8, 1, 1);
                        gl_surfaces[i].cbcr_tex = resource_pool->create_2d_texture(GL_RG8, 1, 1);
                } else {
-                       size_t bytes_per_pixel = (global_flags.x264_bit_depth > 8) ? 2 : 1;
+                       size_t bytes_per_pixel = (global_flags.bit_depth > 8) ? 2 : 1;
 
                        // Generate a PBO to read into. It doesn't necessarily fit 1:1 with the VA-API
                        // buffers, due to potentially differing pitch.
@@ -1344,8 +1338,7 @@ void QuickSyncEncoderImpl::save_codeddata(GLSurface *surf, storage_task task)
                if (file_mux) {
                        file_mux->add_packet(pkt, task.pts + global_delay(), task.dts + global_delay());
                }
-               if (!global_flags.uncompressed_video_to_http &&
-                   !global_flags.x264_video_to_http &&
+               if (!global_flags.x264_video_to_http &&
                    !global_flags.av1_video_to_http) {
                        stream_mux->add_packet(pkt, task.pts + global_delay(), task.dts + global_delay());
                }
@@ -1356,6 +1349,7 @@ void QuickSyncEncoderImpl::save_codeddata(GLSurface *surf, storage_task task)
 // this is weird. but it seems to put a new frame onto the queue
 void QuickSyncEncoderImpl::storage_task_enqueue(storage_task task)
 {
+       assert(task.pts >= task.dts);
        lock_guard<mutex> lock(storage_task_queue_mutex);
        storage_task_queue.push(move(task));
        storage_task_queue_changed.notify_all();
@@ -1633,7 +1627,7 @@ RefCountedGLsync QuickSyncEncoderImpl::end_frame()
        assert(!is_shutdown);
 
        if (!use_zerocopy) {
-               GLenum type = global_flags.x264_bit_depth > 8 ? GL_UNSIGNED_SHORT : GL_UNSIGNED_BYTE;
+               GLenum type = global_flags.bit_depth > 8 ? GL_UNSIGNED_SHORT : GL_UNSIGNED_BYTE;
                GLSurface *surf;
                {
                        lock_guard<mutex> lock(storage_task_queue_mutex);
@@ -1860,19 +1854,6 @@ void QuickSyncEncoderImpl::encode_remaining_frames_as_p(int encoding_frame_num,
        }
 }
 
-void QuickSyncEncoderImpl::add_packet_for_uncompressed_frame(int64_t pts, int64_t duration, const uint8_t *data)
-{
-       AVPacket pkt;
-       memset(&pkt, 0, sizeof(pkt));
-       pkt.buf = nullptr;
-       pkt.data = const_cast<uint8_t *>(data);
-       pkt.size = frame_width * frame_height * 2;
-       pkt.stream_index = 0;
-       pkt.flags = AV_PKT_FLAG_KEY;
-       pkt.duration = duration;
-       stream_mux->add_packet(pkt, pts, pts);
-}
-
 void memcpy_with_pitch(uint8_t *dst, const uint8_t *src, size_t src_width, size_t dst_pitch, size_t height)
 {
        if (src_width == dst_pitch) {
@@ -1915,9 +1896,7 @@ void QuickSyncEncoderImpl::pass_frame(QuickSyncEncoderImpl::PendingFrame frame,
                assert(surf != nullptr);
        }
        uint8_t *data = reinterpret_cast<uint8_t *>(surf->y_ptr);
-       if (global_flags.uncompressed_video_to_http) {
-               add_packet_for_uncompressed_frame(pts, duration, data);
-       } else if (http_encoder != nullptr) {
+       if (http_encoder != nullptr) {
                http_encoder->add_frame(pts, duration, frame.ycbcr_coefficients, data, received_ts);
        } if (disk_encoder != nullptr && disk_encoder != http_encoder) {
                disk_encoder->add_frame(pts, duration, frame.ycbcr_coefficients, data, received_ts);