+ // Returns true if there was an error.
+ bool process_queued_commands(AVFormatContext *format_ctx, const std::string &pathname, timespec last_modified, bool *rewound);
+
+ // Returns nullptr if no frame was decoded (e.g. EOF).
+ AVFrameWithDeleter decode_frame(AVFormatContext *format_ctx, AVCodecContext *video_codec_ctx, AVCodecContext *audio_codec_ctx,
+ const std::string &pathname, int video_stream_index, int audio_stream_index,
+ bmusb::FrameAllocator::Frame *audio_frame, bmusb::AudioFormat *audio_format, int64_t *audio_pts, bool *error);
+ void convert_audio(const AVFrame *audio_avframe, bmusb::FrameAllocator::Frame *audio_frame, bmusb::AudioFormat *audio_format);
+
+ bmusb::VideoFormat construct_video_format(const AVFrame *frame, AVRational video_timebase);
+ UniqueFrame make_video_frame(const AVFrame *frame, const std::string &pathname, bool *error);
+
+ static int interrupt_cb_thunk(void *unique);
+ int interrupt_cb();
+
+ mutable std::mutex filename_mu;