class DeckLinkOutput;
class QSurface;
class QSurfaceFormat;
+class TimecodeRenderer;
+class v210Converter;
namespace movit {
class Effect;
class EffectChain;
-class FlatInput;
class ResourcePool;
+class YCbCrInput;
} // namespace movit
// For any card that's not the master (where we pick out the frames as they
desired_output_video_mode = mode;
}
+ void set_display_timecode_in_stream(bool enable) {
+ display_timecode_in_stream = enable;
+ }
+
+ void set_display_timecode_on_stdout(bool enable) {
+ display_timecode_on_stdout = enable;
+ }
+
private:
struct CaptureCard;
- void configure_card(unsigned card_index, bmusb::CaptureInterface *capture, bool is_fake_capture, DeckLinkOutput *output);
+ enum class CardType {
+ LIVE_CARD,
+ FAKE_CAPTURE,
+ FFMPEG_INPUT
+ };
+ void configure_card(unsigned card_index, bmusb::CaptureInterface *capture, CardType card_type, DeckLinkOutput *output);
void set_output_card_internal(int card_index); // Should only be called from the mixer thread.
void bm_frame(unsigned card_index, uint16_t timecode,
bmusb::FrameAllocator::Frame video_frame, size_t video_offset, bmusb::VideoFormat video_format,
void thread_func();
void handle_hotplugged_cards();
void schedule_audio_resampling_tasks(unsigned dropped_frames, int num_samples_per_frame, int length_per_frame, bool is_preroll, std::chrono::steady_clock::time_point frame_timestamp);
+ std::string get_timecode_text() const;
void render_one_frame(int64_t duration);
void audio_thread_func();
void release_display_frame(DisplayFrame *frame);
void trim_queue(CaptureCard *card, unsigned card_index);
HTTPD httpd;
- unsigned num_cards;
+ unsigned num_cards, num_video_inputs;
QSurface *mixer_surface, *h264_encoder_surface, *decklink_output_surface;
std::unique_ptr<movit::ResourcePool> resource_pool;
std::unique_ptr<movit::EffectChain> display_chain;
std::unique_ptr<ChromaSubsampler> chroma_subsampler;
+ std::unique_ptr<v210Converter> v210_converter;
std::unique_ptr<VideoEncoder> video_encoder;
+ std::unique_ptr<TimecodeRenderer> timecode_renderer;
+ std::atomic<bool> display_timecode_in_stream{false};
+ std::atomic<bool> display_timecode_on_stdout{false};
+
// Effects part of <display_chain>. Owned by <display_chain>.
- movit::FlatInput *display_input;
+ movit::YCbCrInput *display_input;
int64_t pts_int = 0; // In TIMEBASE units.
+ unsigned frame_num = 0;
// Accumulated errors in number of 1/TIMEBASE audio samples. If OUTPUT_FREQUENCY divided by
// frame rate is integer, will always stay zero.