Skip to content
Snippets Groups Projects
Commit 9ce6b316 authored by Janne Mareike Koschinski's avatar Janne Mareike Koschinski
Browse files

Added early spritesheet generation

parent a33d733f
No related branches found
No related tags found
No related merge requests found
...@@ -36,17 +36,30 @@ impl<'a> AVFormatContext { ...@@ -36,17 +36,30 @@ impl<'a> AVFormatContext {
} }
pub fn streams(&self) -> Vec<AVStream> { pub fn streams(&self) -> Vec<AVStream> {
return unsafe { Vec::from(
unsafe {
std::slice::from_raw_parts(
(*self.base).streams,
(*self.base).nb_streams as usize,
)
}
).iter().map(|stream| {
AVStream::new(unsafe { (*stream).as_mut() }.expect("not null"), &self)
}).collect()
}
pub fn find_stream<P>(&self, predicate: P) -> Option<AVStream> where
P: FnMut(&AVStream) -> bool {
Vec::from(
unsafe {
std::slice::from_raw_parts( std::slice::from_raw_parts(
(*self.base).streams, (*self.base).streams,
(*self.base).nb_streams as usize, (*self.base).nb_streams as usize,
) )
} }
.iter() ).iter().map(|stream| {
.map(|stream| {
AVStream::new(unsafe { (*stream).as_mut() }.expect("not null"), &self) AVStream::new(unsafe { (*stream).as_mut() }.expect("not null"), &self)
}) }).find(predicate)
.collect();
} }
pub fn read_frame(&/*TODO:mut*/ self, packet: &mut AVPacket) -> Result<(), failure::Error> { pub fn read_frame(&/*TODO:mut*/ self, packet: &mut AVPacket) -> Result<(), failure::Error> {
......
...@@ -2,6 +2,7 @@ pub(crate) mod ffmpeg_api; ...@@ -2,6 +2,7 @@ pub(crate) mod ffmpeg_api;
use crate::ffmpeg_api::enums::*; use crate::ffmpeg_api::enums::*;
use crate::ffmpeg_api::api::*; use crate::ffmpeg_api::api::*;
use image::{ImageBuffer, RgbImage};
fn main() -> Result<(), std::io::Error> { fn main() -> Result<(), std::io::Error> {
let mut before = std::time::SystemTime::now(); let mut before = std::time::SystemTime::now();
...@@ -15,7 +16,16 @@ fn main() -> Result<(), std::io::Error> { ...@@ -15,7 +16,16 @@ fn main() -> Result<(), std::io::Error> {
panic!("Could not open video input: {:?}", error) panic!("Could not open video input: {:?}", error)
}); });
for mut stream in avformat_context.streams() { let x = 5;
let y = 5;
let mut spritesheet: RgbImage = ImageBuffer::new(160 * x, 90 * x);
let mut stream: AVStream = avformat_context.find_stream(|stream| {
stream.codec_parameters().codec_type() == AVMediaType::Video
}).unwrap_or_else(|| {
panic!("Could not find video stream")
});
stream.set_discard(AVDiscard::NonKey); stream.set_discard(AVDiscard::NonKey);
let codec_parameters = stream.codec_parameters(); let codec_parameters = stream.codec_parameters();
...@@ -61,7 +71,7 @@ fn main() -> Result<(), std::io::Error> { ...@@ -61,7 +71,7 @@ fn main() -> Result<(), std::io::Error> {
let mut scale_context = SwsContext::new(); let mut scale_context = SwsContext::new();
while avformat_context.read_frame(&mut packet).is_ok() && i < 16 { while avformat_context.read_frame(&mut packet).is_ok() {
if packet.stream_index() == stream.index() { if packet.stream_index() == stream.index() {
codec_context.in_packet(&mut packet).unwrap_or_else(|error| { codec_context.in_packet(&mut packet).unwrap_or_else(|error| {
panic!("Could not load packet: {:?}", error) panic!("Could not load packet: {:?}", error)
...@@ -84,22 +94,39 @@ fn main() -> Result<(), std::io::Error> { ...@@ -84,22 +94,39 @@ fn main() -> Result<(), std::io::Error> {
println!("Processing Time: {:#?}", before.elapsed().unwrap()); println!("Processing Time: {:#?}", before.elapsed().unwrap());
before = std::time::SystemTime::now(); before = std::time::SystemTime::now();
image::save_buffer( let current: RgbImage = ImageBuffer::from_raw(160, 90, output_frame.data(0).to_vec()).unwrap();
format!("/home/janne/Workspace/justflix/data/test/image_{}.png", i),
output_frame.data(0), image::imageops::overlay(
output_frame.width() as u32, &mut spritesheet,
output_frame.height() as u32, &current,
image::ColorType::Rgb8, (i % x) * 160,
).unwrap(); ((i / x) % y) * 90,
);
println!("Writing Time: {:#?}", before.elapsed().unwrap()); println!("Writing Time: {:#?}", before.elapsed().unwrap());
before = std::time::SystemTime::now(); before = std::time::SystemTime::now();
i += 1; i += 1;
if i % (x * y) == 0 {
spritesheet.save(format!("/home/janne/Workspace/justflix/data/spritesheets/spritesheet_{}.png", (i / (x*y)) - 1)).unwrap_or_else(|error| {
panic!("Could not write spritesheet: {}", error)
});
spritesheet = ImageBuffer::new(160 * x, 90 * x);
println!("Writing Time: {:#?}", before.elapsed().unwrap());
before = std::time::SystemTime::now();
} }
} }
} }
} }
if i % (x * y) != 0 {
spritesheet.save(format!("/home/janne/Workspace/justflix/data/spritesheets/spritesheet_{}.png", i / (x*y))).unwrap_or_else(|error| {
panic!("Could not write spritesheet: {}", error)
});
println!("Writing Time: {:#?}", before.elapsed().unwrap());
before = std::time::SystemTime::now();
}
} }
Ok(()) Ok(())
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Please register or to comment