// see the subtitle until the next frame.
#include <assert.h>
+#include <stddef.h>
#include <stdint.h>
+#include <time.h>
+
+#include <atomic>
+#include <chrono>
#include <functional>
#include <map>
#include <memory>
#include <set>
#include <string>
#include <thread>
+#include <vector>
#include <movit/effect.h>
#include <movit/ycbcr.h>
extern "C" {
+#include <libavutil/frame.h>
#include <libswresample/swresample.h>
+#include <libavutil/channel_layout.h>
#include <libavutil/pixfmt.h>
#include <libavutil/rational.h>
#include <libavutil/samplefmt.h>
std::placeholders::_11);
}
- // FFmpegCapture-specific callback that gives the raw audio.
- typedef std::function<void(const AVPacket *pkt, const AVRational timebase)> audio_callback_t;
- void set_audio_callback(audio_callback_t callback)
+ // FFmpegCapture-specific callback that gives the raw audio/video.
+ typedef std::function<void(const AVPacket *pkt, const AVRational timebase)> packet_callback_t;
+ void set_video_callback(packet_callback_t callback)
+ {
+ video_callback = callback;
+ }
+ void set_audio_callback(packet_callback_t callback)
{
audio_callback = callback;
}
std::atomic<bool> should_interrupt{false};
bool last_frame_was_connected = true;
+ // TODO: Replace with std::optional if we go C++17.
+ bool frame_timeout_valid = false; // If true, will time out any reads after ten seconds.
+ std::chrono::steady_clock::time_point frame_timeout_started; // Only relevant if frame_timeout_valid == true.
+
bool has_dequeue_callbacks = false;
std::function<void()> dequeue_init_callback = nullptr;
std::function<void()> dequeue_cleanup_callback = nullptr;
std::unique_ptr<bmusb::FrameAllocator> owned_video_frame_allocator;
std::unique_ptr<bmusb::FrameAllocator> owned_audio_frame_allocator;
frame_callback_t frame_callback = nullptr;
- audio_callback_t audio_callback = nullptr;
+ packet_callback_t video_callback = nullptr;
+ packet_callback_t audio_callback = nullptr;
SwsContextWithDeleter sws_ctx;
int sws_last_width = -1, sws_last_height = -1, sws_last_src_format = -1;
// Audio resampler.
SwrContext *resampler = nullptr;
AVSampleFormat last_src_format, last_dst_format;
- int64_t last_channel_layout;
+ AVChannelLayout last_channel_layout;
int last_sample_rate;
// Subtitles (no decoding done, really).
std::string last_subtitle;
movit::RGBTriplet last_neutral_color{1.0f, 1.0f, 1.0f};
+
+ // Used for suppressing repeated warnings. Reset when a video starts playing.
+ // -1 is strictly speaking outside the range of the enum, but hopefully, it will be alright.
+ AVColorSpace last_colorspace = static_cast<AVColorSpace>(-1);
+ AVChromaLocation last_chroma_location = static_cast<AVChromaLocation>(-1);
};
#endif // !defined(_FFMPEG_CAPTURE_H)