Skip to content

Commit

Permalink
Merge branch 'main' of github.com:oddity-ai/video-rs
Browse files Browse the repository at this point in the history
  • Loading branch information
gerwin3 committed Aug 30, 2024
2 parents c8421b0 + 213ac42 commit ddbf8a6
Show file tree
Hide file tree
Showing 2 changed files with 31 additions and 2 deletions.
18 changes: 16 additions & 2 deletions src/decode.rs
Original file line number Diff line number Diff line change
Expand Up @@ -224,15 +224,29 @@ impl Decoder {
/// See [`Reader::seek`](crate::io::Reader::seek) for more information.
#[inline]
pub fn seek(&mut self, timestamp_milliseconds: i64) -> Result<()> {
self.reader.seek(timestamp_milliseconds)
self.reader
.seek(timestamp_milliseconds)
.inspect(|_| self.decoder.decoder.flush())
}

/// Seek to specific frame in reader.
///
/// See [`Reader::seek_to_frame`](crate::io::Reader::seek_to_frame) for more information.
#[inline]
pub fn seek_to_frame(&mut self, frame_number: i64) -> Result<()> {
self.reader
.seek_to_frame(frame_number)
.inspect(|_| self.decoder.decoder.flush())
}

/// Seek to start of reader.
///
/// See [`Reader::seek_to_start`](crate::io::Reader::seek_to_start) for more information.
#[inline]
pub fn seek_to_start(&mut self) -> Result<()> {
self.reader.seek_to_start()
self.reader
.seek_to_start()
.inspect(|_| self.decoder.decoder.flush())
}

/// Split the decoder into a decoder (of type [`DecoderSplit`]) and a [`Reader`].
Expand Down
15 changes: 15 additions & 0 deletions src/io.rs
Original file line number Diff line number Diff line change
Expand Up @@ -5,6 +5,7 @@ use ffmpeg::ffi::AV_TIME_BASE_Q;
use ffmpeg::format::context::{Input as AvInput, Output as AvOutput};
use ffmpeg::media::Type as AvMediaType;
use ffmpeg::Error as AvError;
use ffmpeg_next::ffi::av_seek_frame;

use crate::error::Error;
use crate::ffi;
Expand Down Expand Up @@ -157,6 +158,20 @@ impl Reader {
.map_err(Error::BackendError)
}

/// Seek to a specific frame in the video stream.
///
/// # Arguments
///
/// * `frame_number` - The frame number to seek to.
pub fn seek_to_frame(&mut self, frame_number: i64) -> Result<()> {
unsafe {
match av_seek_frame(self.input.as_mut_ptr(), -1, frame_number, 0) {
0 => Ok(()),
e => Err(Error::BackendError(AvError::from(e))),
}
}
}

/// Seek to start of reader. This function performs best effort seeking to the start of the
/// file.
pub fn seek_to_start(&mut self) -> Result<()> {
Expand Down

0 comments on commit ddbf8a6

Please sign in to comment.