]> git.sesse.net Git - nageru/blobdiff - ffmpeg_capture.cpp
Correct some comments.
[nageru] / ffmpeg_capture.cpp
index 2f9c6fdc1be3bb096c0a22dd760ac11084b02cd6..407f359104cff8444ac56cc9480c77c86366667c 100644 (file)
@@ -66,6 +66,8 @@ FFmpegCapture::FFmpegCapture(const string &filename, unsigned width, unsigned he
 {
        // Not really used for anything.
        description = "Video: " + filename;
+
+       avformat_network_init();  // In case someone wants this.
 }
 
 FFmpegCapture::~FFmpegCapture()
@@ -136,12 +138,14 @@ void FFmpegCapture::producer_thread_func()
                string pathname = search_for_file(filename);
                if (filename.empty()) {
                        fprintf(stderr, "%s not found, sleeping one second and trying again...\n", filename.c_str());
+                       send_disconnected_frame();
                        producer_thread_should_quit.sleep_for(seconds(1));
                        continue;
                }
                if (!play_video(pathname)) {
                        // Error.
                        fprintf(stderr, "Error when playing %s, sleeping one second and trying again...\n", pathname.c_str());
+                       send_disconnected_frame();
                        producer_thread_should_quit.sleep_for(seconds(1));
                        continue;
                }
@@ -155,6 +159,28 @@ void FFmpegCapture::producer_thread_func()
         }
 }
 
+void FFmpegCapture::send_disconnected_frame()
+{
+       // Send an empty frame to signal that we have no signal anymore.
+       FrameAllocator::Frame video_frame = video_frame_allocator->alloc_frame();
+       if (video_frame.data) {
+               VideoFormat video_format;
+               video_format.width = width;
+               video_format.height = height;
+               video_format.stride = width * 4;
+               video_format.frame_rate_nom = 60;
+               video_format.frame_rate_den = 1;
+               video_format.is_connected = false;
+
+               video_frame.len = width * height * 4;
+               memset(video_frame.data, 0, video_frame.len);
+
+               frame_callback(timecode++,
+                       video_frame, /*video_offset=*/0, video_format,
+                       FrameAllocator::Frame(), /*audio_offset=*/0, AudioFormat());
+       }
+}
+
 bool FFmpegCapture::play_video(const string &pathname)
 {
        // Note: Call before open, not after; otherwise, there's a race.
@@ -297,7 +323,7 @@ bool FFmpegCapture::play_video(const string &pathname)
                if (sws_ctx == nullptr || sws_last_width != frame->width || sws_last_height != frame->height) {
                        sws_ctx.reset(
                                sws_getContext(frame->width, frame->height, (AVPixelFormat)frame->format,
-                                       width, height, AV_PIX_FMT_RGBA,
+                                       width, height, AV_PIX_FMT_BGRA,
                                        SWS_BICUBIC, nullptr, nullptr, nullptr));
                        sws_last_width = frame->width;
                        sws_last_height = frame->height;