Browse Source

update VidUsImageData, fix writeString

gavin.chen 2 years ago
parent
commit
6f29f21eb4
2 changed files with 84 additions and 8 deletions
  1. 6 5
      lib/us/vid_us_data_writer.dart
  2. 78 3
      lib/us/vid_us_image_data.dart

+ 6 - 5
lib/us/vid_us_data_writer.dart

@@ -1,5 +1,3 @@
-import 'dart:convert';
-import 'dart:io';
 import 'dart:typed_data';
 
 ///Not used for now.
@@ -9,10 +7,13 @@ class VidUsDataWriter {
   Uint8List get data => _builder.toBytes();
 
   void writeString(String value) {
-    var data = utf8.encode(value);
-    var length = data.length;
+    var data = value.codeUnits;
+    var length = data.length * 2;
     writeInt(length);
-    _builder.add(data);
+    for (var codeUnit in data) {
+      _builder.addByte(codeUnit & 0xff);
+      _builder.addByte((codeUnit >> 8) & 0xff);
+    }
   }
 
   void writeInt(int value) {

+ 78 - 3
lib/us/vid_us_image_data.dart

@@ -1,6 +1,8 @@
 import 'dart:typed_data';
+import 'package:vid/us/vid_us_application.dart';
 import 'package:vid/us/vid_us_data_http_reader.dart';
 import 'package:vid/us/vid_us_data_reader.dart';
+import 'package:vid/us/vid_us_data_writer.dart';
 import 'package:vid/us/vid_us_image.dart';
 import 'package:vid/us/vid_us_probe.dart';
 
@@ -12,7 +14,6 @@ enum VidUsImageFormat {
   Diff,
 }
 
-///Only suport read for now.
 ///Not suport carotid3d for now.
 class VidUsImageData {
   late VidUsDataReader _reader;
@@ -22,6 +23,7 @@ class VidUsImageData {
   late VidUsProbe _probe;
   late VidUsImageFormat _imageFormat;
   late Uint8List _extendedData;
+  late List<VidUsImage> _imagesList;
 
   final String header = "VINNO IMAGE DATA";
 
@@ -61,6 +63,66 @@ class VidUsImageData {
     for (var i = 0; i < _imageCount; i++) {
       _imagePositionList.add(imagePositionReader.readInt64V2());
     }
+    _imagesList = [];
+  }
+
+  /// Create an empty third part VINNO Image Data
+  VidUsImageData.empty(int fps, VidUsImageFormat imageFormat) {
+    _imageCount = 0;
+    _version = 1;
+    _probe = VidUsProbe(
+      "ThirdPart",
+      VidUsProbeType.Linear,
+      VidUsApplication(
+        "ThirdPart",
+        "ThirdPart",
+        "ThirdPart",
+        "ThirdPart",
+        false,
+      ),
+      fps.toDouble(),
+    );
+    _imageFormat = imageFormat;
+    _extendedData = Uint8List(10);
+    _imagePositionList = [];
+    _imagesList = [];
+  }
+
+  /// Add an image to the image data.
+  void addJpegImage(Uint8List jpegBytes, int width, int height) {
+    if (_imageFormat != VidUsImageFormat.Jpeg) {
+      throw Exception("The image format is not Jpeg.");
+    }
+    if (_imagesList.length != _imageCount) {
+      _fillImageList();
+    }
+    VidUsImage image = VidUsImage(_imageCount, width, height, jpegBytes);
+    _imageCount++;
+    _imagesList.add(image);
+  }
+
+  Uint8List flush() {
+    if (_imageCount != _imagesList.length) {
+      _fillImageList();
+    }
+    var imagePositionOffset = 0;
+    var writer = VidUsDataWriter();
+    writer.writeString(header);
+    writer.writeInt(_version);
+    writer.writeBytes(_probe.toBytes());
+    writer.writeInt(_imageFormat.index);
+    writer.writeBytes(_extendedData);
+    imagePositionOffset = writer.data.length + _imageCount * 8 + 4;
+    var imagePositionWriter = VidUsDataWriter();
+    for (var i = 0; i < _imageCount; i++) {
+      imagePositionWriter.writeInt64(imagePositionOffset);
+      imagePositionOffset += _imagesList[i].toBytes().length + 4;
+    }
+    writer.writeBytes(imagePositionWriter.data);
+    for (var i = 0; i < _imageCount; i++) {
+      writer.writeBytes(_imagesList[i].toBytes());
+    }
+    return writer.data;
   }
 
   /// Get one image from the vid.
@@ -72,6 +134,14 @@ class VidUsImageData {
     var imageData = _reader.readBytes(_imagePositionList[index]);
     return VidUsImage.fromBytes(imageData);
   }
+
+  /// Fill all images to the image list.
+  void _fillImageList() {
+    _imagesList = [];
+    for (var i = 0; i < _imageCount; i++) {
+      _imagesList.add(getImage(i));
+    }
+  }
 }
 
 ///Raised when getting data from the downloaded data timeout. depends on the readHeaderTimeout and
@@ -122,12 +192,17 @@ class HttpVidUsImageData {
   /// to let the reader read the header.
   /// [readImageTimeout] is the timeout value of reading one frame.
   /// [minChunkSize] The min download chunk size, set to a large value may speedup the download speed, but will cause the progress not smooth.
-  HttpVidUsImageData(String url, {DownloadCallback? downloadCallback, int minChunkSize = 65536, int readHeaderTimeout = 3000, int readImageTimeout = 500}) {
+  HttpVidUsImageData(String url,
+      {DownloadCallback? downloadCallback,
+      int minChunkSize = 65536,
+      int readHeaderTimeout = 3000,
+      int readImageTimeout = 500}) {
     _initialized = false;
     _closed = false;
     _readHeaderTimeout = readHeaderTimeout;
     _readImageTimeout = readImageTimeout;
-    _reader = VidUsDataHttpReader(url, downloadCallback: downloadCallback, minChunkSize: minChunkSize);
+    _reader = VidUsDataHttpReader(url,
+        downloadCallback: downloadCallback, minChunkSize: minChunkSize);
   }
 
   ///Get the downloaded data of this HttpVidUsImageData