vid_extended_data.dart 2.6 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788
  1. import 'dart:typed_data';
  2. import 'package:vid/us/vid_us_data_reader.dart';
  3. import 'package:vid/us/vid_us_image_data.dart';
  4. import 'vid_tag.dart';
  5. import 'vid_value.dart';
  6. import 'vid_value_element.dart';
  7. extension VidExtendedDataExt on VidUsImageData {
  8. /// 获取结构化扩展数据
  9. VidExtendedData? getStructExtendedData() {
  10. return VidExtendedData.fromBytes(extendedData);
  11. }
  12. }
  13. /// vid文件扩展数据实体
  14. class VidExtendedData {
  15. /// version tag
  16. static VidTag get versionTag => VidTag("Vid", "Version");
  17. /// version num
  18. static VidIntegerValueElement get versionValue => VidIntegerValueElement(1);
  19. late final Map<VidTag, IVidValue> data;
  20. VidExtendedData(Map<VidTag, IVidValue> tv) {
  21. data = tv;
  22. add(versionTag, versionValue);
  23. }
  24. void add(VidTag key, IVidValue value) {
  25. data[key] = value;
  26. }
  27. static VidExtendedData? fromBytes(Uint8List bytes) {
  28. if (bytes.isEmpty) return null;
  29. try {
  30. final reader = VidUsDataReader(bytes);
  31. final count = reader.readInt();
  32. if (count <= 0 || count > bytes.length) return null;
  33. final Map<VidTag, IVidValue> map = {};
  34. for (int cursor = 0; cursor < count; cursor++) {
  35. final key = reader.readString();
  36. final keys = key.split(',');
  37. if (keys.length != 3) {
  38. return null;
  39. }
  40. final vidTag = VidTag(keys[0], keys[1]);
  41. final valueStr = reader.readString();
  42. final valueTypeName = keys[2].toLowerCase();
  43. final valueType = ValueType.values
  44. .firstWhere((e) => e.name.toLowerCase() == valueTypeName);
  45. final vidValue = _convertStr2ValEle(valueType, valueStr);
  46. map[vidTag] = vidValue;
  47. }
  48. return VidExtendedData(map);
  49. } catch (e) {}
  50. return null;
  51. }
  52. static IVidValue _convertStr2ValEle(ValueType type, String value) {
  53. switch (type) {
  54. case ValueType.string:
  55. return VidStringValueElement(value);
  56. case ValueType.double:
  57. return VidDoubleValueElement(double.parse(value));
  58. case ValueType.float:
  59. return VidFloatValueElement(double.parse(value));
  60. case ValueType.integer:
  61. return VidIntegerValueElement(int.parse(value));
  62. case ValueType.long:
  63. return VidLongValueElement(int.parse(value));
  64. case ValueType.uint:
  65. return VidUintValueElement(int.parse(value));
  66. case ValueType.ulong:
  67. return VidUlongValueElement(int.parse(value));
  68. case ValueType.ushort:
  69. return VidUshortValueElement(int.parse(value));
  70. case ValueType.byte:
  71. return VidByteValueElement(int.parse(value));
  72. case ValueType.short:
  73. return VidShortValueElement(int.parse(value));
  74. }
  75. }
  76. }