- lock_guard<mutex> lock(qs_mu);
- quicksync_encoder->add_audio(pts, audio);
+ // Take only qs_audio_mu, since add_audio() is thread safe
+ // (we can only conflict with do_cut(), which takes qs_audio_mu)
+ // and we don't want to contend with begin_frame().
+ {
+ lock_guard<mutex> lock(qs_audio_mu);
+ quicksync_encoder->add_audio(pts, audio);
+ }
+ stream_audio_encoder->encode_audio(audio, pts + quicksync_encoder->global_delay());
+}
+
+bool VideoEncoder::is_zerocopy() const
+{
+ // Explicitly do _not_ take qs_mu; this is called from the mixer,
+ // and qs_mu might be contended. is_zerocopy() is thread safe
+ // and never called in parallel with do_cut() (both happen only
+ // from the mixer thread).
+ return quicksync_encoder->is_zerocopy();