pub struct EncoderHandle {
pub cancel: Arc<AtomicBool>,
pub encoder: Arc<Mutex<Option<Box<dyn VideoEncoder>>>>,
pub output_path: PathBuf,
pub feed_thread: Option<JoinHandle<()>>,
}Expand description
Live encoder + its background feed-thread cancel flag. Owned by
RecordingState::encoder for the duration of a session.
The M-EXPORT.3 v0 ships with a test-pattern feed thread —
pushes a solid-colour BGRA frame at 30 fps so the encoder
produces a real (trivial) .mp4 file the user can verify the
orchestration end-to-end with. Real per-channel pixel forwarding
(extending camera/screen/SCK pipelines to push frames) is the
M-EXPORT.3.1 follow-up.
Fields§
§cancel: Arc<AtomicBool>Cooperative cancel flag for the feed thread.
encoder: Arc<Mutex<Option<Box<dyn VideoEncoder>>>>The encoder itself. Wrapped in Mutex<Option<...>> so the
feed thread can push from its lock; finalize calls take()
- invokes
Box::finalizeafter the thread joins.
output_path: PathBufOutput path the encoder was configured to write to. Mirrored
here so stop_recording can include it in RecordingSummary
without re-querying.
feed_thread: Option<JoinHandle<()>>Background thread feeding the encoder. Some while active,
None after take_for_finalize() removes it.
Implementations§
Source§impl EncoderHandle
impl EncoderHandle
Sourcepub fn start_with_real_capture(
encoder_config: EncoderConfig,
camera_slot: FrameSlot,
screen_slot: FrameSlot,
audio_mixer: SharedAudioMixer,
screen_dims: StreamDimensions,
cam_dims: StreamDimensions,
) -> Result<Self, EncodeError>
pub fn start_with_real_capture( encoder_config: EncoderConfig, camera_slot: FrameSlot, screen_slot: FrameSlot, audio_mixer: SharedAudioMixer, screen_dims: StreamDimensions, cam_dims: StreamDimensions, ) -> Result<Self, EncodeError>
Start the encoder + a real-capture feed thread that pulls
composed frames from crate::recording_compose::RecordingCompose
and mixed audio from SharedAudioMixer (M-PIX.6).
The compose pump is constructed inside the feed thread —
wisp’s Application (wgpu Device + Queue) isn’t Send
across the worker boundary in all configurations, and
constructing it on the thread that uses it avoids the
question entirely.
§Errors
Returns the underlying encode error if the encoder can’t be constructed (parent dir missing, scratch file open failure). Wisp init errors at compose-pump construction happen on the feed thread; logged but don’t fail the handle creation.
Sourcepub fn start_with_test_pattern(
encoder_config: EncoderConfig,
palette_seed: u64,
) -> Result<Self, EncodeError>
pub fn start_with_test_pattern( encoder_config: EncoderConfig, palette_seed: u64, ) -> Result<Self, EncodeError>
Start an encoder + spawn the test-pattern feed thread.
Returns a handle whose finalize_now() produces the final
container path.
palette_seed controls the test-pattern colour (different
per session id so multiple recordings produce visually
distinct previews).
Sourcepub fn finalize_now(self) -> Result<PathBuf, EncodeError>
pub fn finalize_now(self) -> Result<PathBuf, EncodeError>
Stop the feed thread and finalize the encoder. Returns the output path on success.
§Errors
Returns the underlying [media::encode::EncodeError] if the
gst-launch subprocess fails.
Trait Implementations§
Auto Trait Implementations§
impl Freeze for EncoderHandle
impl !RefUnwindSafe for EncoderHandle
impl Send for EncoderHandle
impl Sync for EncoderHandle
impl Unpin for EncoderHandle
impl UnsafeUnpin for EncoderHandle
impl !UnwindSafe for EncoderHandle
Blanket Implementations§
Source§impl<T> BorrowMut<T> for Twhere
T: ?Sized,
impl<T> BorrowMut<T> for Twhere
T: ?Sized,
Source§fn borrow_mut(&mut self) -> &mut T
fn borrow_mut(&mut self) -> &mut T
§impl<T> Instrument for T
impl<T> Instrument for T
§fn instrument(self, span: Span) -> Instrumented<Self>
fn instrument(self, span: Span) -> Instrumented<Self>
§fn in_current_span(self) -> Instrumented<Self>
fn in_current_span(self) -> Instrumented<Self>
Source§impl<T> IntoEither for T
impl<T> IntoEither for T
Source§fn into_either(self, into_left: bool) -> Either<Self, Self>
fn into_either(self, into_left: bool) -> Either<Self, Self>
self into a Left variant of Either<Self, Self>
if into_left is true.
Converts self into a Right variant of Either<Self, Self>
otherwise. Read moreSource§fn into_either_with<F>(self, into_left: F) -> Either<Self, Self>
fn into_either_with<F>(self, into_left: F) -> Either<Self, Self>
self into a Left variant of Either<Self, Self>
if into_left(&self) returns true.
Converts self into a Right variant of Either<Self, Self>
otherwise. Read more