Ver Fonte

Fix bugs regarding ffmpeg and AVSEEK_SIZE

rdb há 17 anos atrás
pai
commit
1e4753f911
1 ficheiros alterados com 18 adições e 3 exclusões
  1. 18 3
      panda/src/movies/ffmpegVirtualFile.cxx

+ 18 - 3
panda/src/movies/ffmpegVirtualFile.cxx

@@ -96,11 +96,26 @@ static PN_int64
 pandavfs_seek(URLContext *h, PN_int64 pos, int whence) {
 pandavfs_seek(URLContext *h, PN_int64 pos, int whence) {
   istream *s = (istream*)(h->priv_data);
   istream *s = (istream*)(h->priv_data);
   switch(whence) {
   switch(whence) {
-  case 0: s->seekg(pos, ios::beg); break;
-  case 1: s->seekg(pos, ios::cur); break;
-  case 2: s->seekg(pos, ios::end); break;
+  case SEEK_SET: s->seekg(pos, ios::beg); break;
+  case SEEK_CUR: s->seekg(pos, ios::cur); break;
+  case SEEK_END: s->seekg(pos, ios::end); break;
+  case AVSEEK_SIZE: {
+    s->seekg(0, ios::cur);
+    offset_t p = s->tellg();
+    s->seekg(-1, ios::end);
+    offset_t size = s->tellg();
+    if (size < 0) {
+      movies_cat.error() << "Failed to determine filesize in ffmpegVirtualFile\n";
+      s->clear();
+      return -1;
+    }
+    size++;
+    s->seekg(p, ios::beg);
+    s->clear();
+    return size; }
   default:
   default:
     movies_cat.error() << "Illegal parameter to seek in ffmpegVirtualFile\n";
     movies_cat.error() << "Illegal parameter to seek in ffmpegVirtualFile\n";
+    s->clear();
     return -1;
     return -1;
   }
   }
   s->clear();
   s->clear();