Explorar el Código

Merge branch '107-frame-search-accuracy' into 'master'

Resolve "frame search accuracy"

Closes #107

See merge request troebs/pycs!100
Eric Tröbs hace 4 años
padre
commit
aa24101018
Se han modificado 2 ficheros con 27 adiciones y 16 borrados
  1. 16 16
      pycs/projects/Project.py
  2. 11 0
      webui/src/components/media/annotated-image.vue

+ 16 - 16
pycs/projects/Project.py

@@ -40,13 +40,10 @@ class Project(ObservableDict):
         # save data as MediaFile objects
         if obj['unmanaged'] is None:
             for key in obj['data'].keys():
-                obj['data'][key] = self.create_media_file(obj['data'][key])
-
-        # initialize super
-        super().__init__(obj, parent)
+                obj['data'][key] = self.create_media_file(obj['data'][key], project=obj)
 
         # handle unmanaged files
-        if obj['unmanaged'] is not None:
+        else:
             prev = None
             for file in listdir(obj['unmanaged']):
                 uuid, ext = splitext(file)
@@ -55,7 +52,7 @@ class Project(ObservableDict):
                     'id': uuid,
                     'extension': ext
                 }
-                next = self.create_media_file(next, unmanaged=True)
+                next = self.create_media_file(next, project=obj)
 
                 if prev is not None:
                     next.prev(prev)
@@ -70,6 +67,9 @@ class Project(ObservableDict):
             for key in self.unmanaged_files:
                 self.unmanaged_files[key].length(length)
 
+        # initialize super
+        super().__init__(obj, parent)
+
         # create data and temp
         data_path = path.join('projects', self['id'], 'data')
         if not path.exists(data_path):
@@ -100,20 +100,20 @@ class Project(ObservableDict):
     def new_media_file_path(self):
         return path.join('projects', self['id'], 'data'), str(uuid1())
 
-    def create_media_file(self, file, unmanaged=False):
-        # TODO check file extension
-        # TODO determine type
-        # TODO filter supported types
+    def create_media_file(self, file, project=None):
+        if project is None:
+            project = self
+
         if file['extension'] in ['.jpg', '.png']:
-            if unmanaged:
-                return UnmanagedImageFile(file, self)
+            if project['unmanaged']:
+                return UnmanagedImageFile(file, project)
             else:
-                return ImageFile(file, self)
+                return ImageFile(file, project)
         if file['extension'] in ['.mp4']:
-            if unmanaged:
-                return UnmanagedVideoFile(file, self)
+            if project['unmanaged']:
+                return UnmanagedVideoFile(file, project)
             else:
-                return VideoFile(file, self)
+                return VideoFile(file, project)
 
         raise NotImplementedError
 

+ 11 - 0
webui/src/components/media/annotated-image.vue

@@ -195,10 +195,21 @@ export default {
         this.$refs.image.pause();
     },
     videoJump: function (value) {
+      // calculate difference
       value = Math.max(0, Math.min(this.data.frameCount, value));
       const diff = value - this.video.frame;
 
+      // set timestamp
       this.$refs.image.currentTime += diff / this.data.fps;
+
+      // get timestamp offset and correct if needed
+      const currentFrame = this.$refs.image.currentTime * this.data.fps;
+
+      if (diff < 0 && currentFrame < value) {
+        this.$refs.image.currentTime += 0.5 / this.data.fps;
+      } else if (diff > 0 && currentFrame > value + 0.5) {
+        this.$refs.image.currentTime -= 0.5 / this.data.fps;
+      }
     },
     videoProgress: function (event) {
       this.video.frame = Math.floor(event.target.currentTime * this.data.fps);