afl-capi.rs 3.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990
  1. extern crate mp4parse_capi;
  2. use mp4parse_capi::*;
  3. #[cfg(feature = "fuzz")]
  4. #[macro_use]
  5. extern crate abort_on_panic;
  6. use std::io::Read;
  7. extern fn vec_read(buf: *mut u8, size: usize, userdata: *mut std::os::raw::c_void) -> isize {
  8. let mut input: &mut std::io::Cursor<Vec<u8>> = unsafe { &mut *(userdata as *mut _) };
  9. let mut buf = unsafe { std::slice::from_raw_parts_mut(buf, size) };
  10. match input.read(&mut buf) {
  11. Ok(n) => n as isize,
  12. Err(_) => -1,
  13. }
  14. }
  15. fn doit() {
  16. let mut input = Vec::new();
  17. std::io::stdin().read_to_end(&mut input).unwrap();
  18. let mut cursor = std::io::Cursor::new(input);
  19. let io = mp4parse_io { read: vec_read, userdata: &mut cursor as *mut _ as *mut std::os::raw::c_void };
  20. unsafe {
  21. let context = mp4parse_new(&io);
  22. let rv = mp4parse_read(context);
  23. if rv == mp4parse_error::MP4PARSE_OK {
  24. let count = {
  25. let mut count = 0;
  26. let rv = mp4parse_get_track_count(context, &mut count);
  27. assert!(rv == mp4parse_error::MP4PARSE_OK);
  28. count
  29. };
  30. for track in 0..count {
  31. let mut info = mp4parse_track_info {
  32. track_type: mp4parse_track_type::MP4PARSE_TRACK_TYPE_VIDEO,
  33. codec: mp4parse_codec::MP4PARSE_CODEC_UNKNOWN,
  34. track_id: 0,
  35. duration: 0,
  36. media_time: 0,
  37. };
  38. let rv = mp4parse_get_track_info(context, track, &mut info);
  39. if rv == mp4parse_error::MP4PARSE_OK {
  40. println!("track {}: id={} duration={} media_time={}",
  41. track, info.track_id, info.duration, info.media_time);
  42. match info.track_type {
  43. mp4parse_track_type::MP4PARSE_TRACK_TYPE_VIDEO => {
  44. let mut video = mp4parse_track_video_info {
  45. display_width: 0,
  46. display_height: 0,
  47. image_width: 0,
  48. image_height: 0,
  49. };
  50. let rv = mp4parse_get_track_video_info(context, track, &mut video);
  51. if rv == mp4parse_error::MP4PARSE_OK {
  52. println!(" video: display={}x{} image={}x{}",
  53. video.display_width, video.display_height,
  54. video.image_width, video.image_height);
  55. }
  56. }
  57. mp4parse_track_type::MP4PARSE_TRACK_TYPE_AUDIO => {
  58. let mut audio = Default::default();
  59. let rv = mp4parse_get_track_audio_info(context, track, &mut audio);
  60. if rv == mp4parse_error::MP4PARSE_OK {
  61. println!(" audio: channels={} bit_depth={} sample_rate={}",
  62. audio.channels, audio.bit_depth, audio.sample_rate);
  63. }
  64. }
  65. }
  66. }
  67. }
  68. }
  69. mp4parse_free(context);
  70. }
  71. }
  72. #[cfg(feature = "fuzz")]
  73. fn main() {
  74. abort_on_panic!({
  75. doit();
  76. });
  77. }
  78. #[cfg(not(feature = "fuzz"))]
  79. fn main() {
  80. doit();
  81. }