Skip to content

Commit 6109eb6

Browse files
committed
Add support for revocable video buffers
1 parent ae1ffa3 commit 6109eb6

File tree

18 files changed

+1785
-131
lines changed

18 files changed

+1785
-131
lines changed

kos/include/libvideo/gfx/buffer.h

Lines changed: 67 additions & 23 deletions
Original file line numberDiff line numberDiff line change
@@ -74,13 +74,9 @@ struct video_lock {
7474

7575
struct video_regionlock {
7676
/* WARNING: DO NOT MODIFY ANYTHING HERE BEFORE `video_buffer_unlockregion()' */
77-
struct video_lock vrl_lock; /* [out] Underlying video lock */
78-
video_coord_t vrl_xbas; /* [out] X-offset added to start of every scanline */
79-
80-
video_coord_t _vrl_xmin; /* [in][const] Region starting X pixel coord */
81-
video_coord_t _vrl_ymin; /* [in][const] Region starting Y pixel coord */
82-
video_dim_t _vrl_xdim; /* [in][const] Region X dimension */
83-
video_dim_t _vrl_ydim; /* [in][const] Region Y dimension */
77+
struct video_lock vrl_lock; /* [out] Underlying video lock */
78+
video_coord_t vrl_xbas; /* [out] X-offset added to start of every scanline */
79+
struct video_crect _vrl_rect; /* [in][const] Region */
8480
};
8581

8682
struct video_buffer_ops {
@@ -143,12 +139,12 @@ struct video_buffer_ops {
143139
*
144140
* Also: this function may succeed in cases where `vi_rlock' fails.
145141
*
146-
* @assume(__lock->_vrl_xdim > 0);
147-
* @assume(__lock->_vrl_ydim > 0);
148-
* @assume((__lock->_vrl_xmin + __lock->_vrl_xdim) > __lock->_vrl_xmin);
149-
* @assume((__lock->_vrl_ymin + __lock->_vrl_ydim) > __lock->_vrl_ymin);
150-
* @assume((__lock->_vrl_xmin + __lock->_vrl_xdim) <= __self->vb_xdim);
151-
* @assume((__lock->_vrl_ymin + __lock->_vrl_ydim) <= __self->vb_ydim);
142+
* @assume(__lock->_vrl_rect.vcr_xdim > 0);
143+
* @assume(__lock->_vrl_rect.vcr_ydim > 0);
144+
* @assume((__lock->_vrl_rect.vcr_xmin + __lock->_vrl_rect.vcr_xdim) > __lock->_vrl_rect.vcr_xmin);
145+
* @assume((__lock->_vrl_rect.vcr_ymin + __lock->_vrl_rect.vcr_ydim) > __lock->_vrl_rect.vcr_ymin);
146+
* @assume((__lock->_vrl_rect.vcr_xmin + __lock->_vrl_rect.vcr_xdim) <= __self->vb_xdim);
147+
* @assume((__lock->_vrl_rect.vcr_ymin + __lock->_vrl_rect.vcr_ydim) <= __self->vb_ydim);
152148
*
153149
* @return: 0: Success
154150
* @return: -1: Error (s.a. `errno') */
@@ -161,12 +157,12 @@ struct video_buffer_ops {
161157
*
162158
* Also: this function may succeed in cases where `vi_wlock' fails.
163159
*
164-
* @assume(__lock->_vrl_xdim > 0);
165-
* @assume(__lock->_vrl_ydim > 0);
166-
* @assume((__lock->_vrl_xmin + __lock->_vrl_xdim) > __lock->_vrl_xmin);
167-
* @assume((__lock->_vrl_ymin + __lock->_vrl_ydim) > __lock->_vrl_ymin);
168-
* @assume((__lock->_vrl_xmin + __lock->_vrl_xdim) <= __self->vb_xdim);
169-
* @assume((__lock->_vrl_ymin + __lock->_vrl_ydim) <= __self->vb_ydim);
160+
* @assume(__lock->_vrl_rect.vcr_xdim > 0);
161+
* @assume(__lock->_vrl_rect.vcr_ydim > 0);
162+
* @assume((__lock->_vrl_rect.vcr_xmin + __lock->_vrl_rect.vcr_xdim) > __lock->_vrl_rect.vcr_xmin);
163+
* @assume((__lock->_vrl_rect.vcr_ymin + __lock->_vrl_rect.vcr_ydim) > __lock->_vrl_rect.vcr_ymin);
164+
* @assume((__lock->_vrl_rect.vcr_xmin + __lock->_vrl_rect.vcr_xdim) <= __self->vb_xdim);
165+
* @assume((__lock->_vrl_rect.vcr_ymin + __lock->_vrl_rect.vcr_ydim) <= __self->vb_ydim);
170166
*
171167
* @return: 0: Success
172168
* @return: -1: Error (s.a. `errno') */
@@ -312,12 +308,12 @@ video_buffer_unlockregion(struct video_buffer *__self, struct video_regionlock *
312308
#define video_buffer_unlock(self, lock) \
313309
(*(self)->vb_ops->vi_unlock)(self, lock)
314310
#define video_buffer_rlockregion(self, lock, xmin, ymin, xdim, ydim) \
315-
((lock)->_vrl_xmin = (xmin), (lock)->_vrl_ymin = (ymin), \
316-
(lock)->_vrl_xdim = (xdim), (lock)->_vrl_ydim = (ydim), \
311+
((lock)->_vrl_rect.vcr_xmin = (xmin), (lock)->_vrl_rect.vcr_ymin = (ymin), \
312+
(lock)->_vrl_rect.vcr_xdim = (xdim), (lock)->_vrl_rect.vcr_ydim = (ydim), \
317313
(*(self)->vb_ops->vi_rlockregion)(self, lock))
318314
#define video_buffer_wlockregion(self, lock, xmin, ymin, xdim, ydim) \
319-
((lock)->_vrl_xmin = (xmin), (lock)->_vrl_ymin = (ymin), \
320-
(lock)->_vrl_xdim = (xdim), (lock)->_vrl_ydim = (ydim), \
315+
((lock)->_vrl_rect.vcr_xmin = (xmin), (lock)->_vrl_rect.vcr_ymin = (ymin), \
316+
(lock)->_vrl_rect.vcr_xdim = (xdim), (lock)->_vrl_rect.vcr_ydim = (ydim), \
321317
(*(self)->vb_ops->vi_wlockregion)(self, lock))
322318
#define video_buffer_unlockregion(self, lock) \
323319
(*(self)->vb_ops->vi_unlockregion)(self, lock)
@@ -612,6 +608,54 @@ video_buffer_fromgfx(struct video_gfx const *__restrict __self);
612608
#endif /* LIBVIDEO_GFX_WANT_PROTOTYPES */
613609

614610

611+
/* Create a wrapper video buffer for `__self' that can only ever be used to access
612+
* the intersection of pixels from `__rect' and `__self' (trying a GFX context will
613+
* always start out with the I/O rect set to "__rect", but the clip rect still set
614+
* to the buffer's base dimensions, and trying to lock OOB regions always fails)
615+
*
616+
* NOTE: Starting coords in `__rect' are allowed to be negative, and its dimensions
617+
* are allowed to be greater than those of `__self', too!
618+
*
619+
* `video_buffer_region_revocable()' does the same, but the returned video buffer
620+
* is also "revocable" (s.a. `video_buffer_region_revoke()'), meaning it can be
621+
* detached from the original buffer (and turned into a no-op) at any point in time
622+
* (blocking if a video lock is held in `video_buffer_region_revoke()').
623+
*
624+
* @return: * : The wrapper video buffer
625+
* @return: NULL: Failed to create video buffer (s.a. `errno') */
626+
typedef __ATTR_WUNUSED_T __ATTR_INOUT_T(1) __ATTR_IN_T(2) __REF struct video_buffer *
627+
(LIBVIDEO_GFX_CC *PVIDEO_BUFFER_REGION)(struct video_buffer *__restrict __self,
628+
struct video_rect const *__restrict __rect);
629+
typedef __ATTR_WUNUSED_T __ATTR_INOUT_T(1) __ATTR_IN_T(2) __REF struct video_buffer *
630+
(LIBVIDEO_GFX_CC *PVIDEO_BUFFER_REGION_REVOCABLE)(struct video_buffer *__restrict __self,
631+
struct video_rect const *__restrict __rect);
632+
#ifdef LIBVIDEO_GFX_WANT_PROTOTYPES
633+
LIBVIDEO_GFX_DECL __ATTR_WUNUSED __ATTR_INOUT(1) __ATTR_IN(2) __REF struct video_buffer *LIBVIDEO_GFX_CC
634+
video_buffer_region(struct video_buffer *__restrict __self,
635+
struct video_rect const *__restrict __rect);
636+
LIBVIDEO_GFX_DECL __ATTR_WUNUSED __ATTR_INOUT(1) __ATTR_IN(2) __REF struct video_buffer *LIBVIDEO_GFX_CC
637+
video_buffer_region_revocable(struct video_buffer *__restrict __self,
638+
struct video_rect const *__restrict __rect);
639+
#endif /* LIBVIDEO_GFX_WANT_PROTOTYPES */
640+
641+
642+
/* Revoke access to the underlying video buffer, given a video
643+
* buffer that was returned by `video_buffer_region_revocable()'.
644+
* If the buffer had already been revoked, this is a no-op.
645+
*
646+
* >> DO NOT CALL THIS FUNCTION FOR BUFFERS OBTAINED FROM SOMETHING
647+
* >> OTHER THAN `video_buffer_region_revocable()' !!!
648+
*
649+
* @return: * : Always re-returns `__self' */
650+
typedef __ATTR_INOUT_T(1) struct video_buffer *
651+
(LIBVIDEO_GFX_CC *PVIDEO_BUFFER_REGION_REVOKE)(struct video_buffer *__restrict __self);
652+
#ifdef LIBVIDEO_GFX_WANT_PROTOTYPES
653+
LIBVIDEO_GFX_DECL __ATTR_INOUT(1) struct video_buffer *LIBVIDEO_GFX_CC
654+
video_buffer_region_revoke(struct video_buffer *__restrict __self);
655+
#endif /* LIBVIDEO_GFX_WANT_PROTOTYPES */
656+
657+
658+
615659
/* Various functions for opening a file/stream/blob as an image file.
616660
* The actual file format is auto-detected, and supported formats depend
617661
* on installed 3rd party libraries. By default, BMP and PNG is supported. */

kos/src/apps/showpic/main.c

Lines changed: 26 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -209,7 +209,7 @@ palettize(struct video_buffer *self, video_pixel_t num_colors, unsigned int meth
209209

210210

211211
static void
212-
do_showpic(struct screen_buffer *screen,
212+
do_showpic(struct video_buffer *screen,
213213
struct video_buffer *image,
214214
struct video_font *font,
215215
char const *filename,
@@ -233,7 +233,7 @@ do_showpic(struct screen_buffer *screen,
233233
#endif
234234

235235
/* Load GFX contexts for the image and the screen */
236-
video_buffer_getgfx(screen_buffer_asvideo(screen), &screen_gfx,
236+
video_buffer_getgfx(screen, &screen_gfx,
237237
GFX_BLENDMODE_ALPHA,
238238
VIDEO_GFX_F_NORMAL, 0);
239239
video_buffer_getgfx(image, &image_gfx,
@@ -514,7 +514,7 @@ do_showpic(struct screen_buffer *screen,
514514
dump_buffer_specs(image, &fd);
515515

516516
gfx_printf("Screen:\n");
517-
dump_buffer_specs(screen_buffer_asvideo(screen), &fd);
517+
dump_buffer_specs(screen, &fd);
518518
#undef gfx_printf
519519
}
520520

@@ -529,15 +529,13 @@ do_showpic(struct screen_buffer *screen,
529529
sync();
530530
}
531531
#endif
532-
533-
534-
screen_buffer_updaterect(screen, &WHOLE_SCREEN);
535532
}
536533

537534

538535
int main(int argc, char *argv[]) {
539536
REF struct video_font *font;
540537
REF struct screen_buffer *screen;
538+
REF struct video_buffer *bscreen;
541539
REF struct video_buffer *frame;
542540
REF struct video_anim *anim;
543541
struct video_anim_frameinfo frame_info;
@@ -557,6 +555,22 @@ int main(int argc, char *argv[]) {
557555
if (!screen)
558556
err(EXIT_FAILURE, "Failed to load screen buffer");
559557

558+
#if 0
559+
{
560+
struct video_rect rect;
561+
rect.vr_xmin = 100;
562+
rect.vr_ymin = 100;
563+
rect.vr_xdim = screen_buffer_asvideo(screen)->vb_xdim - 200;
564+
rect.vr_ydim = screen_buffer_asvideo(screen)->vb_ydim - 200;
565+
bscreen = video_buffer_region_revocable(screen_buffer_asvideo(screen), &rect);
566+
if (!bscreen)
567+
err(EXIT_FAILURE, "Failed to load screen buffer");
568+
// video_buffer_region_revoke(bscreen);
569+
}
570+
#else
571+
bscreen = screen_buffer_asvideo(screen);
572+
#endif
573+
560574
/* Load the named file as a video buffer. */
561575
anim = video_anim_open(argv[1]);
562576
if unlikely(!anim)
@@ -570,8 +584,8 @@ int main(int argc, char *argv[]) {
570584
anim = video_anim_cached(anim, NULL, NULL, VIDEO_BUFFER_AUTO);
571585
#elif 0
572586
anim = video_anim_cached(anim,
573-
screen_buffer_asvideo(screen)->vb_format.vf_codec,
574-
screen_buffer_asvideo(screen)->vb_format.vf_pal,
587+
bscreen->vb_format.vf_codec,
588+
bscreen->vb_format.vf_pal,
575589
VIDEO_BUFFER_AUTO);
576590
#endif
577591
if unlikely(!anim)
@@ -585,7 +599,7 @@ int main(int argc, char *argv[]) {
585599
/* Clear screen */
586600
{
587601
struct video_gfx screen_gfx;
588-
video_buffer_getgfx(screen_buffer_asvideo(screen), &screen_gfx,
602+
video_buffer_getgfx(bscreen, &screen_gfx,
589603
GFX_BLENDMODE_OVERRIDE,
590604
VIDEO_GFX_F_NORMAL, 0);
591605
video_gfx_fillall(&screen_gfx, VIDEO_COLOR_BLACK);
@@ -598,7 +612,8 @@ int main(int argc, char *argv[]) {
598612
struct timespec ts_delay;
599613

600614
/* Render frame */
601-
do_showpic(screen, frame, font, argv[1], &frame_info);
615+
do_showpic(bscreen, frame, font, argv[1], &frame_info);
616+
screen_buffer_updaterect(screen, &WHOLE_SCREEN);
602617

603618
/* Load next frame as part of render delay */
604619
frame_nextinfo = frame_info;
@@ -629,7 +644,7 @@ int main(int argc, char *argv[]) {
629644
}
630645

631646
#if 0 /* Not necessary; we're about to exit, so this happens automatically */
632-
video_buffer_decref(screen_buffer_asvideo(screen));
647+
video_buffer_decref(bscreen);
633648
video_buffer_decref(image);
634649
if (font)
635650
video_font_decref(font);

kos/src/libvideo/compositor/api.h

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -19,6 +19,7 @@
1919
*/
2020
#ifndef GUARD_LIBVIDEO_COMPOSITOR_API_H
2121
#define GUARD_LIBVIDEO_COMPOSITOR_API_H 1
22+
#define LIBVIDEO_GFX_WANT_PROTOTYPES
2223

2324
#include <hybrid/compiler.h>
2425

kos/src/libvideo/compositor/compositor.c

Lines changed: 1 addition & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -411,9 +411,7 @@ local_window_destroy(struct video_display *__restrict self) {
411411
local_window_assert(me);
412412
if (!(me->lw_attr.vwa_flags & VIDEO_WINDOW_F_HIDDEN)) {
413413
if (TAILQ_ISBOUND(me, lw_passthru)) {
414-
/* TODO: cause any future GFX to no-op, and any locks to fail
415-
* NOTE: Only really need this for video buffers created by `video_buffer_fromgfx()' */
416-
// video_buffer_revoke(me->lw_content);
414+
video_buffer_region_revoke(me->lw_content);
417415
TAILQ_UNBIND(&comp->lc_passthru, me, lw_passthru);
418416
}
419417
local_window_hide__locked(me);

kos/src/libvideo/compositor/compositor.h

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -94,9 +94,9 @@ TAILQ_HEAD(local_window_tailq, local_window);
9494
struct local_window: video_window {
9595
struct video_window_attr lw_attr; /* [lock(local_window_comp(this)->lc_lock)] Window attributes (empty windows aren't allowed!) */
9696
REF struct video_buffer *lw_content; /* [1..1][lock(local_window_comp(this)->lc_lock)]
97-
* RGB/RGBA Content buffer (returned by `video_window_getbuffer()')
98-
* Alternatively, when `lw_passthru' is bound, this is a revocable
99-
* subregion of `local_window_comp(this)->lc_buffer'. */
97+
* - RGB/RGBA Content buffer (returned by `video_window_getbuffer()')
98+
* - Alternatively, when `lw_passthru' is bound, this is a revocable region in
99+
* `local_window_comp(this)->lc_buffer' (s.a. `video_buffer_region_revoke()'). */
100100
TAILQ_ENTRY(local_window) lw_passthru; /* [0..1][lock(local_window_comp(this)->lc_lock)] Entry in the list of windows with passthru buffers */
101101
TAILQ_ENTRY(local_window) lw_zorder; /* [1..1][lock(local_window_comp(this)->lc_lock)] Entry in the list of all windows */
102102
TAILQ_ENTRY(local_window) lw_zorder_visi; /* [0..1][lock(local_window_comp(this)->lc_lock)] Entry in the list of all visible windows */

kos/src/libvideo/gfx/buffer.c

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -74,8 +74,8 @@ libvideo_buffer_generic_rlockregion(struct video_buffer *__restrict self,
7474
struct video_regionlock *__restrict lock) {
7575
int result = video_buffer_rlock(self, &lock->vrl_lock);
7676
/*if likely(result == 0)*/ {
77-
lock->vrl_xbas = lock->_vrl_xmin;
78-
lock->vrl_lock.vl_data += lock->_vrl_ymin * lock->vrl_lock.vl_stride;
77+
lock->vrl_xbas = lock->_vrl_rect.vcr_xmin;
78+
lock->vrl_lock.vl_data += lock->_vrl_rect.vcr_ymin * lock->vrl_lock.vl_stride;
7979
}
8080
return result;
8181
}
@@ -85,16 +85,16 @@ libvideo_buffer_generic_wlockregion(struct video_buffer *__restrict self,
8585
struct video_regionlock *__restrict lock) {
8686
int result = video_buffer_wlock(self, &lock->vrl_lock);
8787
/*if likely(result == 0)*/ {
88-
lock->vrl_xbas = lock->_vrl_xmin;
89-
lock->vrl_lock.vl_data += lock->_vrl_ymin * lock->vrl_lock.vl_stride;
88+
lock->vrl_xbas = lock->_vrl_rect.vcr_xmin;
89+
lock->vrl_lock.vl_data += lock->_vrl_rect.vcr_ymin * lock->vrl_lock.vl_stride;
9090
}
9191
return result;
9292
}
9393

9494
INTERN ATTR_INOUT(1) NONNULL((2)) void
9595
NOTHROW(FCC libvideo_buffer_generic_unlockregion)(struct video_buffer *__restrict self,
9696
struct video_regionlock *__restrict lock) {
97-
lock->vrl_lock.vl_data -= lock->_vrl_ymin * lock->vrl_lock.vl_stride;
97+
lock->vrl_lock.vl_data -= lock->_vrl_rect.vcr_ymin * lock->vrl_lock.vl_stride;
9898
video_buffer_unlock(self, &lock->vrl_lock);
9999
}
100100

kos/src/libvideo/gfx/buffer.h

Lines changed: 10 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -36,22 +36,22 @@
3636
DECL_BEGIN
3737

3838
#define video_regionlock_assert(self, lock) \
39-
(__assertf(((lock)->_vrl_xmin + (lock)->_vrl_xdim) > (lock)->_vrl_xmin, \
39+
(__assertf(((lock)->_vrl_rect.vcr_xmin + (lock)->_vrl_rect.vcr_xdim) > (lock)->_vrl_rect.vcr_xmin, \
4040
"video_regionlock: X+SX overflows, or SX=0 [X=%" PRIuCRD ",SX=%" PRIuDIM "]", \
41-
(lock)->_vrl_xmin, (lock)->_vrl_xdim), \
42-
__assertf(((lock)->_vrl_ymin + (lock)->_vrl_ydim) > (lock)->_vrl_ymin, \
41+
(lock)->_vrl_rect.vcr_xmin, (lock)->_vrl_rect.vcr_xdim), \
42+
__assertf(((lock)->_vrl_rect.vcr_ymin + (lock)->_vrl_rect.vcr_ydim) > (lock)->_vrl_rect.vcr_ymin, \
4343
"video_regionlock: Y+SY overflows, or SY=0 [Y=%" PRIuCRD ",SY=%" PRIuDIM "]", \
44-
(lock)->_vrl_ymin, (lock)->_vrl_ydim), \
45-
__assertf(((lock)->_vrl_xmin + (lock)->_vrl_xdim) <= (self)->vb_xdim, \
44+
(lock)->_vrl_rect.vcr_ymin, (lock)->_vrl_rect.vcr_ydim), \
45+
__assertf(((lock)->_vrl_rect.vcr_xmin + (lock)->_vrl_rect.vcr_xdim) <= (self)->vb_xdim, \
4646
"video_regionlock: X+SX overflows exceeds buffer dimension " \
4747
"[X=%" PRIuCRD ",SX=%" PRIuDIM ",X+SX=%" PRIuDIM ",DIM=%" PRIuDIM "]", \
48-
(lock)->_vrl_xmin, (lock)->_vrl_xdim, \
49-
(lock)->_vrl_xmin + (lock)->_vrl_xdim, (self)->vb_xdim), \
50-
__assertf(((lock)->_vrl_ymin + (lock)->_vrl_ydim) <= (self)->vb_ydim, \
48+
(lock)->_vrl_rect.vcr_xmin, (lock)->_vrl_rect.vcr_xdim, \
49+
(lock)->_vrl_rect.vcr_xmin + (lock)->_vrl_rect.vcr_xdim, (self)->vb_xdim), \
50+
__assertf(((lock)->_vrl_rect.vcr_ymin + (lock)->_vrl_rect.vcr_ydim) <= (self)->vb_ydim, \
5151
"video_regionlock: Y+SY overflows exceeds buffer dimension " \
5252
"[Y=%" PRIuCRD ",SY=%" PRIuDIM ",Y+SY=%" PRIuDIM ",DIM=%" PRIuDIM "]", \
53-
(lock)->_vrl_ymin, (lock)->_vrl_ydim, \
54-
(lock)->_vrl_ymin + (lock)->_vrl_ydim, (self)->vb_ydim))
53+
(lock)->_vrl_rect.vcr_ymin, (lock)->_vrl_rect.vcr_ydim, \
54+
(lock)->_vrl_rect.vcr_ymin + (lock)->_vrl_rect.vcr_ydim, (self)->vb_ydim))
5555

5656
/* Generic implementations for video buffer operators. */
5757
INTDEF ATTR_RETNONNULL ATTR_INOUT(1) struct video_gfx *FCC

kos/src/libvideo/gfx/buffer/bitmask.c

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -92,8 +92,8 @@ bitmask_lockregion(struct video_buffer *__restrict self,
9292
}
9393
lock->vrl_lock.vl_stride = me->bmb_bm.vbm_scan >> 3;
9494
lock->vrl_lock.vl_data = (byte_t *)me->bmb_bm.vbm_mask;
95-
lock->vrl_lock.vl_data += lock->vrl_lock.vl_stride * lock->_vrl_ymin;
96-
lock->vrl_xbas = me->bmb_bm.vbm_skip + lock->_vrl_xmin;
95+
lock->vrl_lock.vl_data += lock->vrl_lock.vl_stride * lock->_vrl_rect.vcr_ymin;
96+
lock->vrl_xbas = me->bmb_bm.vbm_skip + lock->_vrl_rect.vcr_xmin;
9797
return 0;
9898
}
9999

kos/src/libvideo/gfx/buffer/custom.c

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -88,10 +88,10 @@ custom_rlockregion(struct video_buffer *__restrict self,
8888
int ok;
8989
size_t xoff;
9090
video_codec_xcoord_to_offset(self->vb_format.vf_codec,
91-
lock->_vrl_xmin, &xoff,
91+
lock->_vrl_rect.vcr_xmin, &xoff,
9292
&lock->vrl_xbas);
9393
ok = (*me->cb_rlock)(me->cb_cookie, &lock->vrl_lock);
94-
lock->vrl_lock.vl_data += lock->_vrl_ymin * lock->vrl_lock.vl_stride;
94+
lock->vrl_lock.vl_data += lock->_vrl_rect.vcr_ymin * lock->vrl_lock.vl_stride;
9595
lock->vrl_lock.vl_data += xoff;
9696
return ok;
9797
}
@@ -110,10 +110,10 @@ custom_wlockregion(struct video_buffer *__restrict self,
110110
int ok;
111111
size_t xoff;
112112
video_codec_xcoord_to_offset(self->vb_format.vf_codec,
113-
lock->_vrl_xmin, &xoff,
113+
lock->_vrl_rect.vcr_xmin, &xoff,
114114
&lock->vrl_xbas);
115115
ok = (*me->cb_wlock)(me->cb_cookie, &lock->vrl_lock);
116-
lock->vrl_lock.vl_data += lock->_vrl_ymin * lock->vrl_lock.vl_stride;
116+
lock->vrl_lock.vl_data += lock->_vrl_rect.vcr_ymin * lock->vrl_lock.vl_stride;
117117
lock->vrl_lock.vl_data += xoff;
118118
return ok;
119119
}
@@ -132,9 +132,9 @@ NOTHROW(FCC custom_unlockregion)(struct video_buffer *__restrict self,
132132
size_t xoff;
133133
video_coord_t xrem;
134134
video_codec_xcoord_to_offset(self->vb_format.vf_codec,
135-
lock->_vrl_xmin, &xoff, &xrem);
135+
lock->_vrl_rect.vcr_xmin, &xoff, &xrem);
136136
assert(xrem == lock->vrl_xbas);
137-
lock->vrl_lock.vl_data -= lock->_vrl_ymin * lock->vrl_lock.vl_stride;
137+
lock->vrl_lock.vl_data -= lock->_vrl_rect.vcr_ymin * lock->vrl_lock.vl_stride;
138138
lock->vrl_lock.vl_data -= xoff;
139139
(*me->cb_unlock)(me->cb_cookie, &lock->vrl_lock);
140140
}

0 commit comments

Comments
 (0)