Support special seek whence for ffmpeg.

AVSEEK_SIZE is passed as a whence when ffmpeg needs just data size.
This commit is contained in:
John Preston 2017-03-01 10:31:36 +03:00
parent fb230a443e
commit 5f5770dd46
3 changed files with 16 additions and 0 deletions

View File

@ -157,6 +157,10 @@ struct Instance::Inner::Private {
case SEEK_SET: newPos = offset; break;
case SEEK_CUR: newPos = l->dataPos + offset; break;
case SEEK_END: newPos = l->data.size() + offset; break;
case AVSEEK_SIZE: {
// Special whence for determining filesize without any seek.
return l->data.size();
} break;
}
if (newPos < 0) {
return -1;

View File

@ -109,6 +109,10 @@ int64_t AbstractFFMpegLoader::_seek_data(void *opaque, int64_t offset, int whenc
case SEEK_SET: newPos = offset; break;
case SEEK_CUR: newPos = l->dataPos + offset; break;
case SEEK_END: newPos = l->data.size() + offset; break;
case AVSEEK_SIZE: {
// Special whence for determining filesize without any seek.
return l->data.size();
} break;
}
if (newPos < 0 || newPos > l->data.size()) {
return -1;
@ -129,6 +133,10 @@ int64_t AbstractFFMpegLoader::_seek_file(void *opaque, int64_t offset, int whenc
case SEEK_SET: return l->f.seek(offset) ? l->f.pos() : -1;
case SEEK_CUR: return l->f.seek(l->f.pos() + offset) ? l->f.pos() : -1;
case SEEK_END: return l->f.seek(l->f.size() + offset) ? l->f.pos() : -1;
case AVSEEK_SIZE: {
// Special whence for determining filesize without any seek.
return l->f.size();
} break;
}
return -1;
}

View File

@ -582,6 +582,10 @@ int64_t FFMpegReaderImplementation::_seek(void *opaque, int64_t offset, int when
case SEEK_SET: return l->_device->seek(offset) ? l->_device->pos() : -1;
case SEEK_CUR: return l->_device->seek(l->_device->pos() + offset) ? l->_device->pos() : -1;
case SEEK_END: return l->_device->seek(l->_device->size() + offset) ? l->_device->pos() : -1;
case AVSEEK_SIZE: {
// Special whence for determining filesize without any seek.
return l->_dataSize;
} break;
}
return -1;
}