mirror of
https://git.ffmpeg.org/ffmpeg.git
synced 2024-12-27 18:02:11 +00:00
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:
parent
287e22f745
commit
5c3d2177e7
@ -98,6 +98,7 @@ typedef struct FileContext {
|
||||
#if HAVE_DIRENT_H
|
||||
DIR *dir;
|
||||
#endif
|
||||
int64_t initial_pos;
|
||||
} FileContext;
|
||||
|
||||
static const AVOption file_options[] = {
|
||||
@ -218,7 +219,12 @@ static int fd_dup(URLContext *h, int oldfd)
|
||||
static int file_close(URLContext *h)
|
||||
{
|
||||
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;
|
||||
}
|
||||
|
||||
@ -286,6 +292,7 @@ static int file_open(URLContext *h, const char *filename, int flags)
|
||||
|
||||
av_strstart(filename, "file:", &filename);
|
||||
|
||||
c->initial_pos = -1;
|
||||
if (flags & AVIO_FLAG_WRITE && flags & AVIO_FLAG_READ) {
|
||||
access = O_CREAT | O_RDWR;
|
||||
if (c->trunc)
|
||||
@ -494,6 +501,11 @@ static int fd_open(URLContext *h, const char *filename, int flags)
|
||||
if (c->fd == -1)
|
||||
return AVERROR(errno);
|
||||
|
||||
if (h->is_streamed)
|
||||
c->initial_pos = -1;
|
||||
else
|
||||
c->initial_pos = lseek(c->fd, 0, SEEK_CUR);
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
Loading…
Reference in New Issue
Block a user