data_host.dart 1.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475
  1. import 'dart:typed_data';
  2. import 'package:fis_vid/cache/io.dart';
  3. import 'package:fis_vid/data_host/interface/data_host.dart';
  4. import 'package:fis_vid/common/vid_download.dart';
  5. import 'package:vid/us/vid_us_image.dart';
  6. import 'package:vid/us/vid_us_image_data.dart';
  7. import 'package:vid/us/vid_us_probe.dart';
  8. import '../base/data_host.dart';
  9. class VidDataHost extends VidDataHostBase {
  10. VidDataHost(String url) : super(url);
  11. VidUsImageData? _data;
  12. VidFileDownloadCancelToken? _downloadCancelToken;
  13. @override
  14. VidUsProbe get probe => _data!.probe;
  15. @override
  16. int get frameCount => _data == null ? -1 : _data!.imageCount;
  17. @override
  18. Future<VidUsImageData?> getData() async => _data;
  19. @override
  20. Future<VidDataHostLoadInfo?> load() async {
  21. final vidFileBuffer = await _loadVidFile(url);
  22. if (vidFileBuffer == null) return null;
  23. _data = VidUsImageData(vidFileBuffer);
  24. return VidDataHostLoadInfo(probe);
  25. }
  26. @override
  27. Future<VidUsImage> getFrame(int index) async {
  28. if (_data == null) {
  29. throw Exception(
  30. "[VidDataHost] getFrame: must call load first and data is not null.");
  31. }
  32. final frame = _data!.getImage(index);
  33. frameLoaded.emit(this, frame);
  34. return frame;
  35. }
  36. @override
  37. Future<void> release() async {
  38. try {
  39. _downloadCancelToken?.cancel();
  40. } catch (e) {}
  41. _data = null;
  42. }
  43. Future<Uint8List?> _loadVidFile(String url) async {
  44. try {
  45. final cachedFile = await VidNativeCache.ins.getCache(url);
  46. if (cachedFile != null) return cachedFile;
  47. _downloadCancelToken = VidFileDownloadCancelToken();
  48. final buffer = await VidFileDownloader.download(
  49. url,
  50. cancelToken: _downloadCancelToken,
  51. );
  52. if (buffer != null) {
  53. await VidNativeCache.ins.saveCache(url, buffer);
  54. }
  55. return buffer;
  56. } catch (e) {
  57. return null;
  58. }
  59. }
  60. }