瀏覽代碼

Update protobuf.js

Lutz Roeder 4 年之前
父節點
當前提交
be45a310b2
共有 20 個文件被更改,包括 113 次插入109 次删除
  1. 2 1
      source/bigdl.js
  2. 5 3
      source/caffe.js
  3. 11 6
      source/caffe2.js
  4. 2 1
      source/cntk.js
  5. 1 1
      source/coreml.js
  6. 2 2
      source/darknet.js
  7. 2 1
      source/dnn.js
  8. 1 1
      source/json.js
  9. 3 3
      source/lightgbm.js
  10. 3 3
      source/mediapipe.js
  11. 2 2
      source/ncnn.js
  12. 9 9
      source/onnx.js
  13. 1 1
      source/openvino.js
  14. 10 7
      source/paddle.js
  15. 10 8
      source/protobuf.js
  16. 32 36
      source/tf.js
  17. 2 2
      source/tnn.js
  18. 4 4
      source/uff.js
  19. 10 16
      source/view.js
  20. 1 2
      source/xmodel.js

+ 2 - 1
source/bigdl.js

@@ -21,7 +21,8 @@ bigdl.ModelFactory = class {
             try {
                 // https://github.com/intel-analytics/BigDL/blob/master/spark/dl/src/main/resources/serialization/bigdl.proto
                 bigdl.proto = protobuf.get('bigdl').com.intel.analytics.bigdl.serialization;
-                const reader = protobuf.Reader.create(context.stream.peek());
+                const stream = context.stream;
+                const reader = protobuf.BinaryReader.open(stream);
                 module = bigdl.proto.BigDLModule.decode(reader);
             }
             catch (error) {

+ 5 - 3
source/caffe.js

@@ -30,7 +30,8 @@ caffe.ModelFactory = class {
                 const tags = context.tags('pbtxt');
                 if (tags.has('net') || tags.has('train_net') || tags.has('net_param')) {
                     try {
-                        const reader = protobuf.TextReader.create(context.stream.peek());
+                        const stream = context.stream;
+                        const reader = protobuf.TextReader.open(stream);
                         reader.field = function(tag, message) {
                             if (message instanceof caffe.proto.SolverParameter) {
                                 message[tag] = this.read();
@@ -66,7 +67,8 @@ caffe.ModelFactory = class {
                 else {
                     let netParameter = null;
                     try {
-                        const reader = protobuf.Reader.create(context.stream.peek());
+                        const stream = context.stream;
+                        const reader = protobuf.BinaryReader.open(stream);
                         netParameter = caffe.proto.NetParameter.decode(reader);
                     }
                     catch (error) {
@@ -82,7 +84,7 @@ caffe.ModelFactory = class {
     _openNetParameterText(metadata, identifier, buffer) {
         let netParameter = null;
         try {
-            const reader = protobuf.TextReader.create(buffer);
+            const reader = protobuf.TextReader.open(buffer);
             reader.field = function(tag, message) {
                 const type = message.constructor.name;
                 if (tag.endsWith('_param') && (type == 'LayerParameter' || type == 'V1LayerParameter' || type == 'V0LayerParameter')) {

+ 11 - 6
source/caffe2.js

@@ -64,7 +64,7 @@ caffe2.ModelFactory = class {
                         let init_net = null;
                         try {
                             caffe2.proto = protobuf.get('caffe2').caffe2;
-                            const reader = protobuf.TextReader.create(predictBuffer);
+                            const reader = protobuf.TextReader.open(predictBuffer);
                             reader.field = function(tag, message) {
                                 if (message instanceof caffe2.proto.DeviceOption) {
                                     message[tag] = this.read();
@@ -81,9 +81,14 @@ caffe2.ModelFactory = class {
                         try {
                             caffe2.proto = protobuf.get('caffe2').caffe2;
                             if (initBuffer) {
-                                init_net = initTextFormat ?
-                                    caffe2.proto.NetDef.decodeText(protobuf.TextReader.create(initBuffer)) :
-                                    caffe2.proto.NetDef.decode(protobuf.Reader.create(initBuffer));
+                                if (initTextFormat) {
+                                    const reader = protobuf.TextReader.open(initBuffer);
+                                    init_net = caffe2.proto.NetDef.decodeText(reader);
+                                }
+                                else {
+                                    const reader = protobuf.BinaryReader.open(initBuffer);
+                                    init_net = caffe2.proto.NetDef.decode(reader);
+                                }
                             }
                         }
                         catch (error) {
@@ -127,7 +132,7 @@ caffe2.ModelFactory = class {
                         let init_net = null;
                         try {
                             caffe2.proto = protobuf.get('caffe2').caffe2;
-                            const reader = protobuf.Reader.create(predictBuffer);
+                            const reader = protobuf.BinaryReader.open(predictBuffer);
                             predict_net = caffe2.proto.NetDef.decode(reader);
                         }
                         catch (error) {
@@ -137,7 +142,7 @@ caffe2.ModelFactory = class {
                         try {
                             if (initBuffer) {
                                 caffe2.proto = protobuf.get('caffe2').caffe2;
-                                const reader = protobuf.Reader.create(initBuffer);
+                                const reader = protobuf.BinaryReader.open(initBuffer);
                                 init_net = caffe2.proto.NetDef.decode(reader);
                             }
                         }

+ 2 - 1
source/cntk.js

@@ -43,7 +43,8 @@ cntk.ModelFactory = class {
                 if (!obj) {
                     cntk_v2 = protobuf.get('cntk').CNTK.proto;
                     cntk_v2.PoolingType = { 0: 'Max', 1: 'Average' };
-                    const reader = protobuf.Reader.create(context.stream.peek());
+                    const stream = context.stream;
+                    const reader = protobuf.BinaryReader.open(stream);
                     const dictionary = cntk_v2.Dictionary.decode(reader);
                     obj = cntk.ModelFactory._convertDictionary(dictionary);
                     version = 2;

+ 1 - 1
source/coreml.js

@@ -59,7 +59,7 @@ coreml.ModelFactory = class {
                     let model = null;
                     try {
                         coreml.proto = protobuf.get('coreml').CoreML.Specification;
-                        const reader = protobuf.Reader.create(stream.peek());
+                        const reader = protobuf.BinaryReader.open(stream);
                         model = coreml.proto.Model.decode(reader);
                     }
                     catch (error) {

+ 2 - 2
source/darknet.js

@@ -16,7 +16,7 @@ darknet.ModelFactory = class {
                 break;
             default:
                 try {
-                    const reader = base.TextReader.create(context.stream.peek(), 65536);
+                    const reader = base.TextReader.open(context.stream.peek(), 65536);
                     for (;;) {
                         const line = reader.read();
                         if (line === undefined) {
@@ -91,7 +91,7 @@ darknet.Graph = class {
         // read_cfg
         const sections = [];
         let section = null;
-        const reader = base.TextReader.create(cfg);
+        const reader = base.TextReader.open(cfg);
         let lineNumber = 0;
         for (;;) {
             lineNumber++;

+ 2 - 1
source/dnn.js

@@ -19,7 +19,8 @@ dnn.ModelFactory = class {
             let model = null;
             try {
                 dnn.proto = protobuf.get('dnn').dnn;
-                const reader = protobuf.Reader.create(context.stream.peek());
+                const stream = context.stream;
+                const reader = protobuf.BinaryReader.open(stream);
                 model = dnn.proto.Model.decode(reader);
             }
             catch (error) {

+ 1 - 1
source/json.js

@@ -15,7 +15,7 @@ json.TextReader = class {
     }
 
     read() {
-        const decoder = base.TextDecoder.create(this._buffer);
+        const decoder = base.TextDecoder.open(this._buffer);
         const stack = [];
         this._decoder = decoder;
         this._position = 0;

+ 3 - 3
source/lightgbm.js

@@ -8,7 +8,7 @@ lightgbm.ModelFactory = class {
     match(context) {
         try {
             const stream = context.stream;
-            const reader = base.TextReader.create(stream.peek(), 65536);
+            const reader = base.TextReader.open(stream.peek(), 65536);
             const line = reader.read();
             if (line === 'tree') {
                 return true;
@@ -34,7 +34,7 @@ lightgbm.ModelFactory = class {
                     format = 'LightGBM Pickle';
                     model = obj;
                     if (model && model.handle && typeof model.handle === 'string') {
-                        const reader = base.TextReader.create(model.handle);
+                        const reader = base.TextReader.open(model.handle);
                         model = new lightgbm.basic.Booster(reader);
                     }
                 }
@@ -42,7 +42,7 @@ lightgbm.ModelFactory = class {
                     format = 'LightGBM';
                     const stream = context.stream;
                     const buffer = stream.peek();
-                    const reader = base.TextReader.create(buffer);
+                    const reader = base.TextReader.open(buffer);
                     model = new lightgbm.basic.Booster(reader);
                 }
                 resolve(new lightgbm.Model(model, format));

+ 3 - 3
source/mediapipe.js

@@ -18,8 +18,8 @@ mediapipe.ModelFactory = class {
         // return context.require('./mediapipe-proto').then(() => {
             mediapipe.proto = protobuf.get('mediapipe');
             try {
-                const buffer = context.stream.peek();
-                const reader = protobuf.TextReader.create(buffer);
+                const stream = context.stream;
+                const reader = protobuf.TextReader.open(stream);
                 // const config = mediapipe.proto.mediapipe.CalculatorGraphConfig.decodeText(reader);
                 const config = new mediapipe.Object(reader);
                 return new mediapipe.Model(config);
@@ -185,7 +185,7 @@ mediapipe.Node = class {
             for (const entry of node_options) {
                 const value = new RegExp(/^\{(.*)\}\s*$/, 's').exec(entry.value);
                 const buffer = new TextEncoder('utf-8').encode(value[1]);
-                const reader = protobuf.TextReader.create(buffer);
+                const reader = protobuf.TextReader.open(buffer);
                 if (entry.type_url.startsWith('type.googleapis.com/mediapipe.')) {
                     const type = entry.type_url.split('.').pop();
                     if (mediapipe.proto && mediapipe.proto.mediapipe && mediapipe.proto.mediapipe[type]) {

+ 2 - 2
source/ncnn.js

@@ -11,7 +11,7 @@ ncnn.ModelFactory = class {
     match(context) {
         const identifier = context.identifier.toLowerCase();
         if (identifier.endsWith('.param') || identifier.endsWith('.cfg.ncnn')) {
-            const reader = base.TextReader.create(context.stream.peek(), 2048);
+            const reader = base.TextReader.open(context.stream.peek(), 2048);
             const signature = reader.read();
             if (signature !== undefined) {
                 if (signature.trim() === '7767517') {
@@ -784,7 +784,7 @@ ncnn.Utility = class {
 ncnn.TextParamReader = class {
 
     constructor(buffer) {
-        const reader = base.TextReader.create(buffer);
+        const reader = base.TextReader.open(buffer);
         const lines = [];
         for (;;) {
             const line = reader.read();

+ 9 - 9
source/onnx.js

@@ -34,7 +34,7 @@ onnx.ModelFactory = class {
                     const schema = [[1,2],[2,2],[3,2],[4,2],[5,2],[6,0],[7,0],[8,2],[9,2],[10,2],[11,2],[12,2],[13,2],[14,2]];
                     if (schema.every((pair) => !tags.has(pair[0]) || tags.get(pair[0]) === pair[1])) {
                         const decode = (buffer, value) => {
-                            const reader = protobuf.Reader.create(buffer);
+                            const reader = protobuf.BinaryReader.open(buffer);
                             const length = reader.length;
                             while (reader.position < length) {
                                 const tag = reader.uint32();
@@ -111,8 +111,8 @@ onnx.ModelFactory = class {
                 case 'prototxt': {
                     try {
                         onnx.proto = protobuf.get('onnx').onnx;
-                        const buffer = context.stream.peek();
-                        const reader = protobuf.TextReader.create(buffer);
+                        const stream = context.stream;
+                        const reader = protobuf.TextReader.open(stream);
                         model = onnx.proto.ModelProto.decodeText(reader);
                         format = 'ONNX' + (model.ir_version ? ' v' + model.ir_version.toString() : '');
                     }
@@ -129,8 +129,8 @@ onnx.ModelFactory = class {
                         // input_0.pb, output_0.pb
                         try {
                             onnx.proto = protobuf.get('onnx').onnx;
-                            const buffer = context.stream.peek();
-                            const reader = protobuf.Reader.create(buffer);
+                            const stream = context.stream;
+                            const reader = protobuf.BinaryReader.open(stream);
                             const tensor = onnx.proto.TensorProto.decode(reader);
                             tensor.name = tensor.name || context.identifier;
                             model = new onnx.proto.ModelProto();
@@ -154,8 +154,8 @@ onnx.ModelFactory = class {
                         // GraphProto
                         try {
                             onnx.proto = protobuf.get('onnx').onnx;
-                            const buffer = context.stream.peek();
-                            const reader = protobuf.Reader.create(buffer);
+                            const stream = context.stream;
+                            const reader = protobuf.BinaryReader.open(stream);
                             model = new onnx.proto.ModelProto();
                             model.graph = onnx.proto.GraphProto.decode(reader);
                             format = 'ONNX';
@@ -169,8 +169,8 @@ onnx.ModelFactory = class {
                         // ModelProto
                         try {
                             onnx.proto = protobuf.get('onnx').onnx;
-                            const buffer = context.stream.peek();
-                            const reader = protobuf.Reader.create(buffer);
+                            const stream = context.stream;
+                            const reader = protobuf.BinaryReader.open(stream);
                             model = onnx.proto.ModelProto.decode(reader);
                             format = 'ONNX' + (model.ir_version ? ' v' + model.ir_version.toString() : '');
                         }

+ 1 - 1
source/openvino.js

@@ -10,7 +10,7 @@ openvino.ModelFactory = class {
         const extension = identifier.split('.').pop().toLowerCase();
         if (extension === 'xml') {
             try {
-                const reader = base.TextReader.create(context.stream.peek(), 2048);
+                const reader = base.TextReader.open(context.stream.peek(), 2048);
                 for (;;) {
                     const line = reader.read();
                     if (line === undefined) {

+ 10 - 7
source/paddle.js

@@ -44,8 +44,7 @@ paddle.ModelFactory = class {
                         case 'pbtxt':
                         case 'txt': {
                             try {
-                                const buffer = stream.peek();
-                                const reader = protobuf.TextReader.create(buffer);
+                                const reader = protobuf.TextReader.open(stream);
                                 program.desc = paddle.proto.ProgramDesc.decodeText(reader);
                             }
                             catch (error) {
@@ -56,8 +55,7 @@ paddle.ModelFactory = class {
                         }
                         default: {
                             try {
-                                const buffer = stream.peek();
-                                const reader = protobuf.Reader.create(buffer);
+                                const reader = protobuf.BinaryReader.open(stream);
                                 program.desc = paddle.proto.ProgramDesc.decode(reader);
                             }
                             catch (error) {
@@ -533,14 +531,19 @@ paddle.Tensor = class {
                 this._kind = 'NumPy Array';
             }
             else {
+                const uint32 = (stream) => {
+                    const buffer = stream.read(4);
+                    const view = new DataView(buffer.buffer, buffer.byteOffset, buffer.byteLength);
+                    return view.getUint32(0, true);
+                };
                 const stream = data;
                 const signature = stream.read(16);
                 if (!signature.every((value) => value === 0x00)) {
                     throw new paddle.Error('Invalid paddle.TensorDesc signature.');
                 }
-                const buffer = stream.read(4);
-                const length = new DataView(buffer.buffer, buffer.byteOffset, buffer.byteLength).getUint32(0, true);
-                const reader = protobuf.Reader.create(stream.read(length));
+                const length = uint32(stream);
+                const buffer = stream.read(length);
+                const reader = protobuf.BinaryReader.open(buffer);
                 const tensorDesc = paddle.proto.VarType.TensorDesc.decode(reader);
                 const size = tensorDesc.dims.reduce((a, b) => a * b.toNumber(), 1);
                 let itemsize = 0;

+ 10 - 8
source/protobuf.js

@@ -12,9 +12,10 @@ protobuf.get = (name) => {
     return protobuf._map.get(name);
 };
 
-protobuf.Reader = class {
+protobuf.BinaryReader = class {
 
-    constructor(buffer) {
+    constructor(data) {
+        const buffer = data instanceof Uint8Array ? data : data.peek();
         this._buffer = buffer;
         this._length = buffer.length;
         this._position = 0;
@@ -22,8 +23,8 @@ protobuf.Reader = class {
         this._utf8Decoder = new TextDecoder('utf-8');
     }
 
-    static create(buffer) {
-        return new protobuf.Reader(buffer);
+    static open(buffer) {
+        return new protobuf.BinaryReader(buffer);
     }
 
     get length() {
@@ -334,8 +335,9 @@ protobuf.Reader = class {
 
 protobuf.TextReader = class {
 
-    constructor(buffer) {
-        this._decoder = base.TextDecoder.create(buffer);
+    constructor(data) {
+        const buffer = data instanceof Uint8Array ? data : data.peek();
+        this._decoder = base.TextDecoder.open(buffer);
         this._position = 0;
         this._token = undefined;
         this._depth = 0;
@@ -344,7 +346,7 @@ protobuf.TextReader = class {
         this.next();
     }
 
-    static create(buffer) {
+    static open(buffer) {
         return new protobuf.TextReader(buffer);
     }
 
@@ -981,7 +983,7 @@ protobuf.Error = class extends Error {
 };
 
 if (typeof module !== 'undefined' && typeof module.exports === 'object') {
-    module.exports.Reader = protobuf.Reader;
+    module.exports.BinaryReader = protobuf.BinaryReader;
     module.exports.TextReader = protobuf.TextReader;
     module.exports.Error = protobuf.Error;
     module.exports.Int64 = protobuf.Int64;

+ 32 - 36
source/tf.js

@@ -60,7 +60,7 @@ tf.ModelFactory = class {
                     return true;
                 }
                 const decode = (buffer, value) => {
-                    const reader = protobuf.Reader.create(buffer);
+                    const reader = protobuf.BinaryReader.open(buffer);
                     const length = reader.length;
                     while (reader.position < length) {
                         const tag = reader.uint32();
@@ -112,7 +112,8 @@ tf.ModelFactory = class {
             return true;
         }
         if (/^events.out.tfevents./.exec(identifier)) {
-            if (tf.EventFileReader.open(context.stream)) {
+            const stream = context.stream;
+            if (tf.EventFileReader.open(stream)) {
                 return true;
             }
         }
@@ -177,7 +178,8 @@ tf.ModelFactory = class {
             const openEventFile = () => {
                 let format = 'TensorFlow Event File';
                 let producer = null;
-                const eventFileReader = tf.EventFileReader.open(context.stream);
+                const stream = context.stream;
+                const eventFileReader = tf.EventFileReader.open(stream);
                 const saved_model = new tf.proto.SavedModel();
                 for (;;) {
                     const event = eventFileReader.read();
@@ -203,7 +205,7 @@ tf.ModelFactory = class {
                         }
                         case 'graph_def': {
                             const buffer = event.graph_def;
-                            const reader = protobuf.Reader.create(buffer);
+                            const reader = protobuf.BinaryReader.open(buffer);
                             const graph_def = tf.proto.GraphDef.decode(reader);
                             const meta_graph = new tf.proto.MetaGraphDef();
                             meta_graph.meta_info_def = new tf.proto.MetaGraphDef.MetaInfoDef();
@@ -317,8 +319,8 @@ tf.ModelFactory = class {
                 let saved_model = null;
                 if (tags.has('saved_model_schema_version') || tags.has('meta_graphs')) {
                     try {
-                        const buffer = context.stream.peek();
-                        const reader = protobuf.TextReader.create(buffer);
+                        const stream = context.stream;
+                        const reader = protobuf.TextReader.open(stream);
                         saved_model = tf.proto.SavedModel.decodeText(reader);
                         format = 'TensorFlow Saved Model';
                         if (saved_model && Object.prototype.hasOwnProperty.call(saved_model, 'saved_model_schema_version')) {
@@ -331,8 +333,8 @@ tf.ModelFactory = class {
                 }
                 else if (tags.has('graph_def')) {
                     try {
-                        const buffer = context.stream.peek();
-                        const reader = protobuf.TextReader.create(buffer);
+                        const stream = context.stream;
+                        const reader = protobuf.TextReader.open(stream);
                         const meta_graph = tf.proto.MetaGraphDef.decodeText(reader);
                         saved_model = new tf.proto.SavedModel();
                         saved_model.meta_graphs.push(meta_graph);
@@ -344,8 +346,8 @@ tf.ModelFactory = class {
                 }
                 else if (tags.has('node')) {
                     try {
-                        const buffer = context.stream.peek();
-                        const reader = protobuf.TextReader.create(buffer);
+                        const stream = context.stream;
+                        const reader = protobuf.TextReader.open(stream);
                         const graph_def = tf.proto.GraphDef.decodeText(reader);
                         const meta_graph = new tf.proto.MetaGraphDef();
                         meta_graph.graph_def = graph_def;
@@ -365,8 +367,7 @@ tf.ModelFactory = class {
                 let format = null;
                 try {
                     if (identifier.endsWith('saved_model.pb')) {
-                        const buffer = stream.peek();
-                        const reader = protobuf.Reader.create(buffer);
+                        const reader = protobuf.BinaryReader.open(stream);
                         saved_model = tf.proto.SavedModel.decode(reader);
                         format = 'TensorFlow Saved Model';
                         if (saved_model && Object.prototype.hasOwnProperty.call(saved_model, 'saved_model_schema_version')) {
@@ -383,8 +384,7 @@ tf.ModelFactory = class {
                 }
                 try {
                     if (!saved_model && extension == 'meta') {
-                        const buffer = stream.peek();
-                        const reader = protobuf.Reader.create(buffer);
+                        const reader = protobuf.BinaryReader.open(stream);
                         const meta_graph = tf.proto.MetaGraphDef.decode(reader);
                         saved_model = new tf.proto.SavedModel();
                         saved_model.meta_graphs.push(meta_graph);
@@ -397,8 +397,7 @@ tf.ModelFactory = class {
                 }
                 try {
                     if (!saved_model) {
-                        const buffer = stream.peek();
-                        const reader = protobuf.Reader.create(buffer);
+                        const reader = protobuf.BinaryReader.open(stream);
                         const graph_def = tf.proto.GraphDef.decode(reader);
                         const meta_graph = new tf.proto.MetaGraphDef();
                         meta_graph.graph_def = graph_def;
@@ -1829,8 +1828,8 @@ tf.TensorBundle = class {
         if (format === 1) {
             return Promise.resolve(new tf.TensorBundle(format, table.entries, []));
         }
-        const entry = table.entries.get('');
-        const reader = protobuf.Reader.create(entry);
+        const buffer = table.entries.get('');
+        const reader = protobuf.BinaryReader.open(buffer);
         const header = tf.proto.BundleHeaderProto.decode(reader);
         const numShards = header.num_shards;
         const promises = [];
@@ -1857,12 +1856,13 @@ tf.TensorBundle = class {
         switch (format) {
             case 1: {
                 const buffer = entries.get('');
-                const reader = protobuf.Reader.create(buffer);
+                const reader = protobuf.BinaryReader.open(buffer);
                 const header = tf.proto.SavedTensorSlices.decode(reader);
                 const data = new Map();
                 for (const pair of entries) {
                     if (pair[0] !== '' && pair[0] !== 'global_step') {
-                        const reader = protobuf.Reader.create(pair[1]);
+                        const buffer = pair[1];
+                        const reader = protobuf.BinaryReader.open(buffer);
                         const slices = tf.proto.SavedTensorSlices.decode(reader);
                         const name = slices.data.name;
                         const tensor = slices.data.data;
@@ -1903,9 +1903,9 @@ tf.TensorBundle = class {
                 break;
             }
             case 2: {
-                entries.forEach((value, name) => {
+                entries.forEach((buffer, name) => {
                     if (name !== '') {
-                        const reader = protobuf.Reader.create(value);
+                        const reader = protobuf.BinaryReader.open(buffer);
                         const entry = tf.proto.BundleEntryProto.decode(reader);
                         const tensor = new tf.proto.TensorProto();
                         tensor.dtype = entry.dtype;
@@ -2178,14 +2178,6 @@ tf.EventFileReader = class {
         if (masked_crc32c(length_bytes) !== length_crc) {
             return null;
         }
-        // reader.skip(-12);
-        // const length = reader.uint64().toNumber();
-        // reader.uint32(); // masked crc of length
-        // const data = reader.read(length);
-        // const data_crc = reader.uint32();
-        // if (masked_crc32c(data) !== data_crc) {
-        //     return null;
-        // }
         return new tf.EventFileReader(stream);
     }
 
@@ -2195,12 +2187,16 @@ tf.EventFileReader = class {
 
     read() {
         if (this._stream.position < this._stream.length) {
-            const buffer = this._stream.read(12);
-            const reader = new tf.BinaryReader(buffer);
-            const length = reader.uint64().toNumber();
-            reader.uint32(); // masked crc of length
-            const data = this._stream.read(length);
-            const event = tf.proto.Event.decode(protobuf.Reader.create(data));
+            const uint64 = (stream) => {
+                const buffer = stream.read(8);
+                const view = new DataView(buffer.buffer, buffer.byteOffset, buffer.byteLength);
+                return view.getUint64(0, true).toNumber();
+            };
+            const length = uint64(this._stream);
+            this._stream.skip(4); // masked crc of length
+            const buffer = this._stream.read(length);
+            const reader = protobuf.BinaryReader.open(buffer);
+            const event = tf.proto.Event.decode(reader);
             this._stream.skip(4); // masked crc of data
             return event;
         }

+ 2 - 2
source/tnn.js

@@ -9,7 +9,7 @@ tnn.ModelFactory = class {
         const identifier = context.identifier.toLowerCase();
         if (identifier.endsWith('.tnnproto')) {
             try {
-                const reader = base.TextReader.create(context.stream.peek(), 2048);
+                const reader = base.TextReader.open(context.stream.peek(), 2048);
                 const text = reader.read();
                 if (text !== undefined) {
                     const line = text.trim();
@@ -634,7 +634,7 @@ tnn.Metadata = class {
 tnn.TextProtoReader = class {
 
     constructor(buffer) {
-        const reader = base.TextReader.create(buffer);
+        const reader = base.TextReader.open(buffer);
         let lines = [];
         for (;;) {
             const line = reader.read();

+ 4 - 4
source/uff.js

@@ -38,8 +38,8 @@ uff.ModelFactory = class {
             if (extension === 'pbtxt' || identifier.toLowerCase().endsWith('.uff.txt')) {
                 try {
                     uff.proto = protobuf.get('uff').uff;
-                    const buffer = context.stream.peek();
-                    const reader = protobuf.TextReader.create(buffer);
+                    const stream = context.stream;
+                    const reader = protobuf.TextReader.open(stream);
                     meta_graph = uff.proto.MetaGraph.decodeText(reader);
                 }
                 catch (error) {
@@ -49,8 +49,8 @@ uff.ModelFactory = class {
             else {
                 try {
                     uff.proto = protobuf.get('uff').uff;
-                    const buffer = context.stream.peek();
-                    const reader = protobuf.Reader.create(buffer);
+                    const stream = context.stream;
+                    const reader = protobuf.BinaryReader.open(stream);
                     meta_graph = uff.proto.MetaGraph.decode(reader);
                 }
                 catch (error) {

+ 10 - 16
source/view.js

@@ -1281,22 +1281,19 @@ view.ModelContext = class {
         let tags = this._tags.get(type);
         if (!tags) {
             tags = new Map();
-            let reset = false;
-            const signatures = [
-                // Reject PyTorch models
-                [ 0x80, undefined, 0x8a, 0x0a, 0x6c, 0xfc, 0x9c, 0x46, 0xf9, 0x20, 0x6a, 0xa8, 0x50, 0x19 ],
-                // Reject TorchScript models
-                [ 0x50, 0x4b ]
-            ];
             const stream = this.stream;
             if (stream) {
+                const signatures = [
+                    // Reject PyTorch models
+                    [ 0x80, undefined, 0x8a, 0x0a, 0x6c, 0xfc, 0x9c, 0x46, 0xf9, 0x20, 0x6a, 0xa8, 0x50, 0x19 ],
+                    [ 0x50, 0x4b ]
+                ];
                 if (!signatures.some((signature) => signature.length <= stream.length && stream.peek(signature.length).every((value, index) => signature[index] === undefined || signature[index] === value))) {
                     try {
                         switch (type) {
                             case 'pbtxt': {
-                                reset = true;
                                 const buffer = stream.peek();
-                                const decoder = base.TextDecoder.create(buffer);
+                                const decoder = base.TextDecoder.open(buffer);
                                 let count = 0;
                                 for (let i = 0; i < 0x100; i++) {
                                     const c = decoder.decode();
@@ -1307,8 +1304,7 @@ view.ModelContext = class {
                                     }
                                 }
                                 if (count < 4) {
-                                    const buffer = stream.peek();
-                                    const reader = protobuf.TextReader.create(buffer);
+                                    const reader = protobuf.TextReader.open(stream);
                                     reader.start(false);
                                     while (!reader.end(false)) {
                                         const tag = reader.tag();
@@ -1330,9 +1326,7 @@ view.ModelContext = class {
                                 break;
                             }
                             case 'pb': {
-                                reset = true;
-                                const buffer = stream.peek();
-                                const reader = protobuf.Reader.create(buffer);
+                                const reader = protobuf.BinaryReader.open(stream);
                                 const length = reader.length;
                                 while (reader.position < length) {
                                     const tag = reader.uint32();
@@ -1360,8 +1354,8 @@ view.ModelContext = class {
                     }
                 }
             }
-            if (reset) {
-                this.stream.seek(0);
+            if (stream.position !== 0) {
+                stream.seek(0);
             }
             this._tags.set(type, tags);
         }

+ 1 - 2
source/xmodel.js

@@ -18,8 +18,7 @@ xmodel.ModelFactory = class {
             try {
                 xmodel.proto = protobuf.get('xmodel').serial_v2;
                 const stream = context.stream;
-                const buffer = stream.peek();
-                const reader = protobuf.Reader.create(buffer);
+                const reader = protobuf.BinaryReader.open(stream);
                 const graph = xmodel.proto.Graph.decode(reader);
                 return new xmodel.Model(graph);
             }