avformat/file: seek back to initial position for fd protocol
So user's fd can be passed to libavformat multiple times in sequence without changing the position. Signed-off-by: Zhao Zhili <zhilizhao@tencent.com>
This commit is contained in:
@@ -98,6 +98,7 @@ typedef struct FileContext {
|
|||||||
#if HAVE_DIRENT_H
|
#if HAVE_DIRENT_H
|
||||||
DIR *dir;
|
DIR *dir;
|
||||||
#endif
|
#endif
|
||||||
|
int64_t initial_pos;
|
||||||
} FileContext;
|
} FileContext;
|
||||||
|
|
||||||
static const AVOption file_options[] = {
|
static const AVOption file_options[] = {
|
||||||
@@ -218,7 +219,12 @@ static int fd_dup(URLContext *h, int oldfd)
|
|||||||
static int file_close(URLContext *h)
|
static int file_close(URLContext *h)
|
||||||
{
|
{
|
||||||
FileContext *c = h->priv_data;
|
FileContext *c = h->priv_data;
|
||||||
int ret = close(c->fd);
|
int ret;
|
||||||
|
|
||||||
|
if (c->initial_pos >= 0 && !h->is_streamed)
|
||||||
|
lseek(c->fd, c->initial_pos, SEEK_SET);
|
||||||
|
|
||||||
|
ret = close(c->fd);
|
||||||
return (ret == -1) ? AVERROR(errno) : 0;
|
return (ret == -1) ? AVERROR(errno) : 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -286,6 +292,7 @@ static int file_open(URLContext *h, const char *filename, int flags)
|
|||||||
|
|
||||||
av_strstart(filename, "file:", &filename);
|
av_strstart(filename, "file:", &filename);
|
||||||
|
|
||||||
|
c->initial_pos = -1;
|
||||||
if (flags & AVIO_FLAG_WRITE && flags & AVIO_FLAG_READ) {
|
if (flags & AVIO_FLAG_WRITE && flags & AVIO_FLAG_READ) {
|
||||||
access = O_CREAT | O_RDWR;
|
access = O_CREAT | O_RDWR;
|
||||||
if (c->trunc)
|
if (c->trunc)
|
||||||
@@ -494,6 +501,11 @@ static int fd_open(URLContext *h, const char *filename, int flags)
|
|||||||
if (c->fd == -1)
|
if (c->fd == -1)
|
||||||
return AVERROR(errno);
|
return AVERROR(errno);
|
||||||
|
|
||||||
|
if (h->is_streamed)
|
||||||
|
c->initial_pos = -1;
|
||||||
|
else
|
||||||
|
c->initial_pos = lseek(c->fd, 0, SEEK_CUR);
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user