diff options
author | Bastien Nocera <hadess@hadess.net> | 2016-06-08 17:35:52 +0200 |
---|---|---|
committer | Bastien Nocera <hadess@hadess.net> | 2016-06-09 11:57:53 +0200 |
commit | d65e2d2454411f51a1b5463ddae97c1adafc4250 (patch) | |
tree | ea41f39edf98e09eb98d39f5f1ab0f6fe9c0198f | |
parent | 8c8aa6a8f790b1db546fbc2e81c7127172d5e2bf (diff) | |
download | gvfs-d65e2d2454411f51a1b5463ddae97c1adafc4250.tar.gz |
afc: Fix GStreamer playback of native files
GStreamer gets very confused when the offset after a seek isn't what it
expected, and told us that the "Stream contains no data." when trying to
play back using giosrc.
But we could play the video just fine going through fuse.
FUSE hides bugs with relative seeks, such as our absolute offset being
wrong when doing absolute seeks. To make sure that the offset we return
is correct, call tell() and use that as the new offset.
https://bugzilla.gnome.org/show_bug.cgi?id=767405
-rw-r--r-- | daemon/gvfsbackendafc.c | 27 |
1 files changed, 17 insertions, 10 deletions
diff --git a/daemon/gvfsbackendafc.c b/daemon/gvfsbackendafc.c index 3da3cafa..7d51ce4e 100644 --- a/daemon/gvfsbackendafc.c +++ b/daemon/gvfsbackendafc.c @@ -1458,7 +1458,7 @@ g_vfs_backend_afc_write (GVfsBackend *backend, g_vfs_job_succeeded (G_VFS_JOB(job)); } -static int +static goffset g_vfs_backend_afc_seek (GVfsBackendAfc *self, GVfsJob *job, GVfsBackendHandle handle, @@ -1467,12 +1467,13 @@ g_vfs_backend_afc_seek (GVfsBackendAfc *self, { int afc_seek_type; FileHandle *fh; + guint64 new_offset; if ((afc_seek_type = gvfs_seek_type_to_lseek (type)) == -1) { g_vfs_job_failed(job, G_IO_ERROR, G_IO_ERROR_INVALID_ARGUMENT, _("Unsupported seek type")); - return 1; + return -1; } fh = (FileHandle *) handle; @@ -1480,11 +1481,13 @@ g_vfs_backend_afc_seek (GVfsBackendAfc *self, if (G_UNLIKELY(g_vfs_backend_afc_check (afc_file_seek (fh->afc_cli, fh->fd, offset, afc_seek_type), job))) - { - return 1; - } + return -1; + + if (G_UNLIKELY(g_vfs_backend_afc_check (afc_file_tell (fh->afc_cli, fh->fd, &new_offset), + job))) + return -1; - return 0; + return new_offset; } static void @@ -1495,15 +1498,17 @@ g_vfs_backend_afc_seek_on_read (GVfsBackend *backend, GSeekType type) { GVfsBackendAfc *self; + goffset new_offset; g_return_if_fail (handle != NULL); self = G_VFS_BACKEND_AFC(backend); g_return_if_fail (self->connected); - if (!g_vfs_backend_afc_seek (self, G_VFS_JOB(job), handle, offset, type)) + new_offset = g_vfs_backend_afc_seek (self, G_VFS_JOB(job), handle, offset, type); + if (new_offset >= 0) { - g_vfs_job_seek_read_set_offset (job, offset); + g_vfs_job_seek_read_set_offset (job, new_offset); g_vfs_job_succeeded (G_VFS_JOB(job)); } } @@ -1516,15 +1521,17 @@ g_vfs_backend_afc_seek_on_write (GVfsBackend *backend, GSeekType type) { GVfsBackendAfc *self; + goffset new_offset; g_return_if_fail (handle != NULL); self = G_VFS_BACKEND_AFC(backend); g_return_if_fail (self->connected); - if (!g_vfs_backend_afc_seek (self, G_VFS_JOB(job), handle, offset, type)) + new_offset = g_vfs_backend_afc_seek (self, G_VFS_JOB(job), handle, offset, type); + if (new_offset >= 0) { - g_vfs_job_seek_write_set_offset (job, offset); + g_vfs_job_seek_write_set_offset (job, new_offset); g_vfs_job_succeeded (G_VFS_JOB(job)); } } |