} // 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();
avformat_network_init(); // In case someone wants this.
}
+FFmpegCapture::FFmpegCapture(const std::vector<std::string> &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),
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<mutex> lock(filename_mu);
- filename_copy = filename;
+ filename_copy = filenames.front();
+ filenames.erase(filenames.begin());
}
string pathname;
} else {
pathname = description;
}
+ printf("CAP %s\n", pathname.c_str());
if (pathname.empty()) {
send_disconnected_frame();
if (play_once) {
continue;
}
- if (play_once) {
+ if (play_once && filenames.empty()) {
send_disconnected_frame();
break;
}
// “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);
// 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;
}