X-Git-Url: https://git.sesse.net/?a=blobdiff_plain;f=nageru%2Fffmpeg_capture.cpp;fp=nageru%2Fffmpeg_capture.cpp;h=984ce5e8b8add69da4b0a9fd8a68d232c7ab6b41;hb=1d202a8d120f0af9940cc55a12140672804fad69;hp=a9ad73d8d7ee0948744111bfaffc451159c25e9f;hpb=f1b3eaca67a78977069c37fc673360e1ae47449e;p=nageru diff --git a/nageru/ffmpeg_capture.cpp b/nageru/ffmpeg_capture.cpp index a9ad73d..984ce5e 100644 --- a/nageru/ffmpeg_capture.cpp +++ b/nageru/ffmpeg_capture.cpp @@ -258,8 +258,9 @@ RGBTriplet get_neutral_color(AVDictionary *metadata) } // namespace FFmpegCapture::FFmpegCapture(const string &filename, unsigned width, unsigned height) - : filename(filename), width(width), height(height), video_timebase{1, 1} + : width(width), height(height), video_timebase{1, 1} { + filenames.push_back(filename); description = "Video: " + filename; last_frame = steady_clock::now(); @@ -267,6 +268,17 @@ FFmpegCapture::FFmpegCapture(const string &filename, unsigned width, unsigned he avformat_network_init(); // In case someone wants this. } +FFmpegCapture::FFmpegCapture(const std::vector &filenames, unsigned width, unsigned height) + : filenames(filenames), width(width), height(height), video_timebase{1, 1} +{ + description = "Video: " + filenames[0]; + + last_frame = steady_clock::now(); + play_once = true; + + avformat_network_init(); // In case someone wants this. +} + #ifdef HAVE_SRT FFmpegCapture::FFmpegCapture(int srt_sock, const string &stream_id) : srt_sock(srt_sock), @@ -357,11 +369,14 @@ void FFmpegCapture::producer_thread_func() snprintf(thread_name, sizeof(thread_name), "FFmpeg_C_%d", card_index); pthread_setname_np(pthread_self(), thread_name); + printf("CAP\n"); while (!producer_thread_should_quit.should_quit()) { string filename_copy; + printf("CAP %zu LEFT\n", filenames.size()); { lock_guard lock(filename_mu); - filename_copy = filename; + filename_copy = filenames.front(); + filenames.erase(filenames.begin()); } string pathname; @@ -370,6 +385,7 @@ void FFmpegCapture::producer_thread_func() } else { pathname = description; } + printf("CAP %s\n", pathname.c_str()); if (pathname.empty()) { send_disconnected_frame(); if (play_once) { @@ -391,7 +407,7 @@ void FFmpegCapture::producer_thread_func() continue; } - if (play_once) { + if (play_once && filenames.empty()) { send_disconnected_frame(); break; } @@ -547,7 +563,7 @@ bool FFmpegCapture::play_video(const string &pathname) // “whatever goes”, so we don't get VDPAU or CUDA here without enumerating // through several different types. VA-API will do for now. AVBufferRef *hw_device_ctx = nullptr; - if (av_hwdevice_ctx_create(&hw_device_ctx, AV_HWDEVICE_TYPE_VAAPI, nullptr, nullptr, 0) < 0) { + if (av_hwdevice_ctx_create(&hw_device_ctx, AV_HWDEVICE_TYPE_VAAPI, nullptr, nullptr, 0) < 0 || true) { fprintf(stderr, "Failed to initialize VA-API for FFmpeg acceleration. Decoding video in software.\n"); } else { video_codec_ctx->hw_device_ctx = av_buffer_ref(hw_device_ctx); @@ -616,7 +632,7 @@ bool FFmpegCapture::play_video(const string &pathname) // so don't try). return true; } - if (av_seek_frame(format_ctx.get(), /*stream_index=*/-1, /*timestamp=*/0, /*flags=*/0) < 0) { + if (true || av_seek_frame(format_ctx.get(), /*stream_index=*/-1, /*timestamp=*/0, /*flags=*/0) < 0) { fprintf(stderr, "%s: Rewind failed, not looping.\n", pathname.c_str()); return true; }