diff options
author | wm4 <wm4@nowhere> | 2014-12-26 17:43:59 +0100 |
---|---|---|
committer | wm4 <wm4@nowhere> | 2014-12-26 18:11:22 +0100 |
commit | adf7f0661ec7b6c83a3a82478f28967e7a96d298 (patch) | |
tree | 1914c642abcf338384a4d94785cc49f8bb6a3e52 /player | |
parent | 3fdb6be3166790ff3aad68dd4d4bb83963815e4b (diff) | |
download | mpv-adf7f0661ec7b6c83a3a82478f28967e7a96d298.tar.bz2 mpv-adf7f0661ec7b6c83a3a82478f28967e7a96d298.tar.xz |
command: overlay_add: more flexible treatment of offset parameter
Essentially, don't make it the mmap() argument, and just add it to the
memory address. This hides tricky things like alignment reequirements
from the user.
Strictly speaking, this is not entirely backwards compatible: this adds
the regression that you can't access past 2 or 4 GB of a file on 32 bit
systems anymore. But I doubt anyone cared about this.
In theory, we could be clever, and just align the offset manually and
pass that to mmap(). This would also be transparent to the user, but
minimally more effort, so this is left as exercise to the reader.
Diffstat (limited to 'player')
-rw-r--r-- | player/command.c | 20 |
1 files changed, 12 insertions, 8 deletions
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: |