forked from StrafesNET/roblox-bot-player
add numerous errors
This commit is contained in:
@@ -46,6 +46,11 @@ impl EncodeSubcommand{
|
|||||||
average_bitrate:self.target_bitrate.unwrap_or(6_000_000),
|
average_bitrate:self.target_bitrate.unwrap_or(6_000_000),
|
||||||
max_bitrate:self.max_bitrate.unwrap_or(6_000_000),
|
max_bitrate:self.max_bitrate.unwrap_or(6_000_000),
|
||||||
device:self.device,
|
device:self.device,
|
||||||
|
output_file:self.output_file.unwrap_or_else(||{
|
||||||
|
let mut output_file:PathBuf=self.bot.file_stem().unwrap().into();
|
||||||
|
output_file.set_extension("h264");
|
||||||
|
output_file
|
||||||
|
}),
|
||||||
map:self.map,
|
map:self.map,
|
||||||
bot:self.bot,
|
bot:self.bot,
|
||||||
})
|
})
|
||||||
@@ -60,6 +65,15 @@ enum EncodeError{
|
|||||||
DecodeSNF(strafesnet_snf::Error),
|
DecodeSNF(strafesnet_snf::Error),
|
||||||
DecodeMap(strafesnet_snf::map::Error),
|
DecodeMap(strafesnet_snf::map::Error),
|
||||||
DecodeBot(strafesnet_roblox_bot_file::v0::Error),
|
DecodeBot(strafesnet_roblox_bot_file::v0::Error),
|
||||||
|
CreateInstance(vk_video::VulkanInitError),
|
||||||
|
CreateAdapter(vk_video::VulkanInitError),
|
||||||
|
NoAdapter,
|
||||||
|
CreateDevice(vk_video::VulkanInitError),
|
||||||
|
VideoEncodeParams(vk_video::VulkanEncoderError),
|
||||||
|
VideoCreateTextures(vk_video::VulkanEncoderError),
|
||||||
|
VideoEncodeFrame(vk_video::VulkanEncoderError),
|
||||||
|
OutputCreateFile(std::io::Error),
|
||||||
|
OutputWriteFile(std::io::Error),
|
||||||
}
|
}
|
||||||
|
|
||||||
struct EncodeParams{
|
struct EncodeParams{
|
||||||
@@ -71,6 +85,7 @@ struct EncodeParams{
|
|||||||
device:Option<String>,
|
device:Option<String>,
|
||||||
map:PathBuf,
|
map:PathBuf,
|
||||||
bot:PathBuf,
|
bot:PathBuf,
|
||||||
|
output_file:PathBuf,
|
||||||
}
|
}
|
||||||
|
|
||||||
fn encode(params:EncodeParams)->Result<(),EncodeError>{
|
fn encode(params:EncodeParams)->Result<(),EncodeError>{
|
||||||
@@ -90,14 +105,15 @@ fn encode(params:EncodeParams)->Result<(),EncodeError>{
|
|||||||
let timelines=strafesnet_roblox_bot_file::v0::read_all_to_block(std::io::Cursor::new(bot_file))
|
let timelines=strafesnet_roblox_bot_file::v0::read_all_to_block(std::io::Cursor::new(bot_file))
|
||||||
.map_err(EncodeError::DecodeBot)?;
|
.map_err(EncodeError::DecodeBot)?;
|
||||||
|
|
||||||
let vulkan_instance = vk_video::VulkanInstance::new().unwrap();
|
// vulkan init
|
||||||
|
let vulkan_instance = vk_video::VulkanInstance::new().map_err(EncodeError::CreateInstance)?;
|
||||||
let vulkan_adapter = if let Some(filter)=params.device.as_deref(){
|
let vulkan_adapter = if let Some(filter)=params.device.as_deref(){
|
||||||
vulkan_instance.iter_adapters(None)
|
vulkan_instance.iter_adapters(None)
|
||||||
.unwrap()
|
.map_err(EncodeError::CreateAdapter)?
|
||||||
.find(|adapter|adapter.info().name.contains(filter))
|
.find(|adapter|adapter.info().name.contains(filter))
|
||||||
.unwrap()
|
.ok_or(EncodeError::NoAdapter)?
|
||||||
}else{
|
}else{
|
||||||
vulkan_instance.create_adapter(None).unwrap()
|
vulkan_instance.create_adapter(None).map_err(EncodeError::CreateAdapter)?
|
||||||
};
|
};
|
||||||
let vulkan_device = vulkan_adapter
|
let vulkan_device = vulkan_adapter
|
||||||
.create_device(
|
.create_device(
|
||||||
@@ -105,7 +121,7 @@ fn encode(params:EncodeParams)->Result<(),EncodeError>{
|
|||||||
wgpu::ExperimentalFeatures::disabled(),
|
wgpu::ExperimentalFeatures::disabled(),
|
||||||
wgpu::Limits::defaults(),
|
wgpu::Limits::defaults(),
|
||||||
)
|
)
|
||||||
.unwrap();
|
.map_err(EncodeError::CreateDevice)?;
|
||||||
|
|
||||||
// playback
|
// playback
|
||||||
let bot=strafesnet_roblox_bot_player::bot::CompleteBot::new(timelines);
|
let bot=strafesnet_roblox_bot_player::bot::CompleteBot::new(timelines);
|
||||||
@@ -134,11 +150,12 @@ fn encode(params:EncodeParams)->Result<(),EncodeError>{
|
|||||||
virtual_buffer_size: std::time::Duration::from_secs(2),
|
virtual_buffer_size: std::time::Duration::from_secs(2),
|
||||||
},
|
},
|
||||||
)
|
)
|
||||||
.unwrap(),
|
.map_err(EncodeError::VideoEncodeParams)?,
|
||||||
)
|
)
|
||||||
.unwrap();
|
.map_err(EncodeError::VideoCreateTextures)?;
|
||||||
|
|
||||||
let mut output_file = std::fs::File::create("output.h264").unwrap();
|
let mut output_file = std::fs::File::create(params.output_file)
|
||||||
|
.map_err(EncodeError::OutputCreateFile)?;
|
||||||
|
|
||||||
let duration = bot.duration();
|
let duration = bot.duration();
|
||||||
for i in 0..duration.get()*target_framerate as i64/SessionTime::ONE_SECOND.get() {
|
for i in 0..duration.get()*target_framerate as i64/SessionTime::ONE_SECOND.get() {
|
||||||
@@ -147,19 +164,15 @@ fn encode(params:EncodeParams)->Result<(),EncodeError>{
|
|||||||
let (pos,angles)=playback_head.get_position_angles(&bot,time);
|
let (pos,angles)=playback_head.get_position_angles(&bot,time);
|
||||||
wgpu_state.render(pos,angles);
|
wgpu_state.render(pos,angles);
|
||||||
|
|
||||||
let res = unsafe {
|
let frame=vk_video::Frame{
|
||||||
encoder
|
data:wgpu_state.video_texture.clone(),
|
||||||
.encode(
|
pts:None,
|
||||||
vk_video::Frame {
|
|
||||||
data: wgpu_state.video_texture.clone(),
|
|
||||||
pts: None,
|
|
||||||
},
|
|
||||||
false,
|
|
||||||
)
|
|
||||||
.unwrap()
|
|
||||||
};
|
};
|
||||||
|
let res=unsafe{encoder.encode(frame,false)}
|
||||||
|
.map_err(EncodeError::VideoEncodeFrame)?;
|
||||||
|
|
||||||
output_file.write_all(&res.data).unwrap();
|
output_file.write_all(&res.data)
|
||||||
|
.map_err(EncodeError::OutputWriteFile)?;
|
||||||
}
|
}
|
||||||
|
|
||||||
Ok(())
|
Ok(())
|
||||||
|
|||||||
Reference in New Issue
Block a user