summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--DOCS/man/input.rst16
-rw-r--r--player/command.c20
2 files changed, 21 insertions, 15 deletions
diff --git a/DOCS/man/input.rst b/DOCS/man/input.rst
index ca384ab4c9..eee6beaf78 100644
--- a/DOCS/man/input.rst
+++ b/DOCS/man/input.rst
@@ -501,13 +501,15 @@ Input Commands that are Possibly Subject to Change
It is also possible to pass a raw memory address for use as bitmap memory
by passing a memory address as integer prefixed with a ``&`` character.
- Passing the wrong thing here will crash the player. The ``offset`` parameter
- is not used and must be 0. This mode might be useful for use with libmpv.
-
- ``offset`` is the offset of the first pixel in the source file. It is
- passed directly to ``mmap`` and is subject to certain restrictions
- (see ``man mmap`` for details). In particular, this value has to be a
- multiple of the system's page size.
+ Passing the wrong thing here will crash the player. This mode might be
+ useful for use with libmpv. The ``offset`` parameter is simply added to the
+ memory address (since mpv 0.8.0, ignored before).
+
+ ``offset`` is the byte offset of the first pixel in the source file.
+ (The current implementation always mmap's the whole file from position 0 to
+ the end of the image, so large offsets should be avoided. Before mpv 0.8.0,
+ the offset was actually passed directly to ``mmap``, but it was changed to
+ make using it easier.)
``fmt`` is a string identifying the image format. Currently, only ``bgra``
is defined. This format has 4 bytes per pixels, with 8 bits per component.
diff --git a/player/command.c b/player/command.c
index c690b6395e..4a5dda6590 100644
--- a/player/command.c
+++ b/player/command.c
@@ -95,7 +95,7 @@ struct command_ctx {
};
struct overlay {
- bool need_unmap : 1;
+ void *map_start;
size_t map_size;
struct sub_bitmap osd;
};
@@ -3823,8 +3823,8 @@ static void replace_overlay(struct MPContext *mpctx, int id, struct overlay *new
recreate_overlays(mpctx);
// Do this afterwards, so we never unmap while the OSD is using it.
- if (old.osd.bitmap && old.map_size)
- munmap(old.osd.bitmap, old.map_size);
+ if (old.map_start && old.map_size)
+ munmap(old.map_start, old.map_size);
}
static int overlay_add(struct MPContext *mpctx, int id, int x, int y,
@@ -3854,7 +3854,7 @@ static int overlay_add(struct MPContext *mpctx, int id, int x, int y,
};
int fd = -1;
bool close_fd = true;
- void *p = (void *)-1;
+ void *p = NULL;
if (file[0] == '@') {
char *end;
fd = strtol(&file[1], &end, 10);
@@ -3871,16 +3871,20 @@ static int overlay_add(struct MPContext *mpctx, int id, int x, int y,
fd = open(file, O_RDONLY | O_BINARY | O_CLOEXEC);
}
if (fd >= 0) {
- overlay.map_size = h * stride;
- p = mmap(NULL, overlay.map_size, PROT_READ, MAP_SHARED, fd, offset);
+ overlay.map_size = offset + h * stride;
+ void *m = mmap(NULL, overlay.map_size, PROT_READ, MAP_SHARED, fd, 0);
if (close_fd)
close(fd);
+ if (m && m != MAP_FAILED) {
+ overlay.map_start = m;
+ p = m;
+ }
}
- if (!p || p == (void *)-1) {
+ if (!p) {
MP_ERR(mpctx, "overlay_add: could not open or map '%s'\n", file);
goto error;
}
- overlay.osd.bitmap = p;
+ overlay.osd.bitmap = (char *)p + offset;
replace_overlay(mpctx, id, &overlay);
r = 0;
error: