test_fragment.rs 2.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263
  1. extern crate mp4parse_capi;
  2. use std::io::Read;
  3. use mp4parse_capi::*;
  4. extern fn buf_read(buf: *mut u8, size: usize, userdata: *mut std::os::raw::c_void) -> isize {
  5. let mut input: &mut std::fs::File = unsafe { &mut *(userdata as *mut _) };
  6. let mut buf = unsafe { std::slice::from_raw_parts_mut(buf, size) };
  7. match input.read(&mut buf) {
  8. Ok(n) => n as isize,
  9. Err(_) => -1,
  10. }
  11. }
  12. #[test]
  13. fn parse_fragment() {
  14. let mut file = std::fs::File::open("tests/bipbop_audioinit.mp4").expect("Unknown file");
  15. let io = mp4parse_io {
  16. read: buf_read,
  17. userdata: &mut file as *mut _ as *mut std::os::raw::c_void
  18. };
  19. unsafe {
  20. let parser = mp4parse_new(&io);
  21. let mut rv = mp4parse_read(parser);
  22. assert_eq!(rv, mp4parse_error::MP4PARSE_OK);
  23. let mut counts: u32 = 0;
  24. rv = mp4parse_get_track_count(parser, &mut counts);
  25. assert_eq!(rv, mp4parse_error::MP4PARSE_OK);
  26. assert_eq!(counts, 1);
  27. let mut track_info = mp4parse_track_info {
  28. track_type: mp4parse_track_type::MP4PARSE_TRACK_TYPE_AUDIO,
  29. codec: mp4parse_codec::MP4PARSE_CODEC_UNKNOWN,
  30. track_id: 0,
  31. duration: 0,
  32. media_time: 0,
  33. };
  34. rv = mp4parse_get_track_info(parser, 0, &mut track_info);
  35. assert_eq!(rv, mp4parse_error::MP4PARSE_OK);
  36. assert_eq!(track_info.track_type, mp4parse_track_type::MP4PARSE_TRACK_TYPE_AUDIO);
  37. assert_eq!(track_info.codec, mp4parse_codec::MP4PARSE_CODEC_AAC);
  38. assert_eq!(track_info.track_id, 1);
  39. assert_eq!(track_info.duration, 0);
  40. assert_eq!(track_info.media_time, 0);
  41. let mut is_fragmented_file: u8 = 0;
  42. rv = mp4parse_is_fragmented(parser, track_info.track_id, &mut is_fragmented_file);
  43. assert_eq!(rv, mp4parse_error::MP4PARSE_OK);
  44. assert_eq!(is_fragmented_file, 1);
  45. let mut fragment_info = mp4parse_fragment_info {
  46. fragment_duration: 0,
  47. };
  48. rv = mp4parse_get_fragment_info(parser, &mut fragment_info);
  49. assert_eq!(rv, mp4parse_error::MP4PARSE_OK);
  50. assert_eq!(fragment_info.fragment_duration, 10032000);
  51. mp4parse_free(parser);
  52. }
  53. }