com.sky.ondeviceagent / Runtime /Inference /Common /StreamingAssetsModelLoader.cs
Sky-Kim's picture
Initial commit
2e7837a
Raw
History Blame Contribute Delete
2.8 kB
using System;
using System.IO;
using Unity.InferenceEngine;
using UnityEngine;
using UnityEngine.Networking;
namespace OnDeviceAgent.Inference
{
public static class StreamingAssetsModelLoader
{
public static Model LoadModel(string relativePath, string logPrefix)
{
var path = GetStreamingAssetPath(relativePath);
if (CanReadStreamingAssetsWithFileApi() && File.Exists(path))
return ModelLoader.Load(path);
var bytes = LoadBytesFromStreamingAssets(path, logPrefix);
using (var stream = new MemoryStream(bytes))
return ModelLoader.Load(stream);
}
public static string LoadText(string relativePath, string logPrefix)
{
var path = GetStreamingAssetPath(relativePath);
if (CanReadStreamingAssetsWithFileApi() && File.Exists(path))
return File.ReadAllText(path);
return System.Text.Encoding.UTF8.GetString(LoadBytesFromStreamingAssets(path, logPrefix));
}
public static byte[] LoadBytes(string relativePath, string logPrefix)
{
var path = GetStreamingAssetPath(relativePath);
if (CanReadStreamingAssetsWithFileApi() && File.Exists(path))
return File.ReadAllBytes(path);
return LoadBytesFromStreamingAssets(path, logPrefix);
}
static string GetStreamingAssetPath(string relativePath)
{
return ModelPathResolver.GetModelFilePath(relativePath);
}
static bool CanReadStreamingAssetsWithFileApi()
{
return Application.platform != RuntimePlatform.Android &&
Application.platform != RuntimePlatform.WebGLPlayer;
}
static byte[] LoadBytesFromStreamingAssets(string path, string logPrefix)
{
using (var request = UnityWebRequest.Get(ToStreamingAssetUri(path)))
{
var operation = request.SendWebRequest();
// Blocks calling thread (Android/WebGL only); Sleep(1) avoids spin.
while (!operation.isDone)
System.Threading.Thread.Sleep(1);
if (request.result != UnityWebRequest.Result.Success)
throw new FileNotFoundException($"{logPrefix} Missing StreamingAssets file: {path} ({request.error})", path);
return request.downloadHandler.data;
}
}
static string ToStreamingAssetUri(string path)
{
if (path.StartsWith("jar:", StringComparison.OrdinalIgnoreCase) ||
path.StartsWith("http://", StringComparison.OrdinalIgnoreCase) ||
path.StartsWith("https://", StringComparison.OrdinalIgnoreCase) ||
path.StartsWith("file://", StringComparison.OrdinalIgnoreCase))
return path;
return "file://" + path;
}
}
}