|
@@ -0,0 +1,87 @@
|
|
|
+import 'dart:typed_data';
|
|
|
+
|
|
|
+import 'package:vid/us/vid_us_data_reader.dart';
|
|
|
+import 'package:vid/us/vid_us_image_data.dart';
|
|
|
+
|
|
|
+import 'vid_tag.dart';
|
|
|
+import 'vid_value.dart';
|
|
|
+import 'vid_value_element.dart';
|
|
|
+
|
|
|
+extension VidExtendedDataExt on VidUsImageData {
|
|
|
+ /// 获取结构化扩展数据
|
|
|
+ VidExtendedData? getStructExtendedData() {
|
|
|
+ return VidExtendedData.fromBytes(extendedData);
|
|
|
+ }
|
|
|
+}
|
|
|
+
|
|
|
+/// vid文件扩展数据实体
|
|
|
+class VidExtendedData {
|
|
|
+ /// version tag
|
|
|
+ static VidTag get versionTag => VidTag("Vid", "Version");
|
|
|
+
|
|
|
+ /// version num
|
|
|
+ static VidIntegerValueElement get versionValue => VidIntegerValueElement(1);
|
|
|
+
|
|
|
+ late final Map<VidTag, IVidValue> data;
|
|
|
+
|
|
|
+ VidExtendedData(Map<VidTag, IVidValue> tv) {
|
|
|
+ data = tv;
|
|
|
+ add(versionTag, versionValue);
|
|
|
+ }
|
|
|
+
|
|
|
+ void add(VidTag key, IVidValue value) {
|
|
|
+ data[key] = value;
|
|
|
+ }
|
|
|
+
|
|
|
+ static VidExtendedData? fromBytes(Uint8List bytes) {
|
|
|
+ if (bytes.isEmpty) return null;
|
|
|
+ try {
|
|
|
+ final reader = VidUsDataReader(bytes);
|
|
|
+ final count = reader.readInt();
|
|
|
+ if (count <= 0 || count > bytes.length) return null;
|
|
|
+
|
|
|
+ final Map<VidTag, IVidValue> map = {};
|
|
|
+ for (int cursor = 0; cursor < count; cursor++) {
|
|
|
+ final key = reader.readString();
|
|
|
+ final keys = key.split(',');
|
|
|
+ if (keys.length != 3) {
|
|
|
+ return null;
|
|
|
+ }
|
|
|
+
|
|
|
+ final vidTag = VidTag(keys[0], keys[1]);
|
|
|
+ final valueStr = reader.readString();
|
|
|
+ final valueTypeIndex = int.parse(keys[2]);
|
|
|
+ final valueType = ValueType.values[valueTypeIndex];
|
|
|
+ final vidValue = _convertStr2ValEle(valueType, valueStr);
|
|
|
+ map[vidTag] = vidValue;
|
|
|
+ }
|
|
|
+ return VidExtendedData(map);
|
|
|
+ } catch (e) {}
|
|
|
+ return null;
|
|
|
+ }
|
|
|
+
|
|
|
+ static IVidValue _convertStr2ValEle(ValueType type, String value) {
|
|
|
+ switch (type) {
|
|
|
+ case ValueType.string:
|
|
|
+ return VidStringValueElement(value);
|
|
|
+ case ValueType.double:
|
|
|
+ return VidDoubleValueElement(double.parse(value));
|
|
|
+ case ValueType.float:
|
|
|
+ return VidFloatValueElement(double.parse(value));
|
|
|
+ case ValueType.integer:
|
|
|
+ return VidIntegerValueElement(int.parse(value));
|
|
|
+ case ValueType.long:
|
|
|
+ return VidLongValueElement(int.parse(value));
|
|
|
+ case ValueType.uint:
|
|
|
+ return VidUintValueElement(int.parse(value));
|
|
|
+ case ValueType.ulong:
|
|
|
+ return VidUlongValueElement(int.parse(value));
|
|
|
+ case ValueType.ushort:
|
|
|
+ return VidUshortValueElement(int.parse(value));
|
|
|
+ case ValueType.byte:
|
|
|
+ return VidByteValueElement(int.parse(value));
|
|
|
+ case ValueType.short:
|
|
|
+ return VidShortValueElement(int.parse(value));
|
|
|
+ }
|
|
|
+ }
|
|
|
+}
|