Skip to content

Commit 8ae992c

Browse files
committed
Add wrappers for interacting with video_lock
1 parent 977a5c0 commit 8ae992c

File tree

12 files changed

+261
-198
lines changed

12 files changed

+261
-198
lines changed

kos/include/libvideo/gfx/buffer.h

Lines changed: 29 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -390,6 +390,35 @@ struct video_regionlock {
390390
struct video_crect _vrl_rect; /* [in][const] Region */
391391
};
392392

393+
#ifdef __INTELLISENSE__
394+
/* Helpers for getting the raw pointers/offsets into video memory associated with a video lock */
395+
extern __ATTR_RETNONNULL __ATTR_PURE __ATTR_WUNUSED __ATTR_IN(1) __byte_t *
396+
video_lock_getdata(struct video_lock const *__restrict __self);
397+
extern __ATTR_PURE __ATTR_WUNUSED __ATTR_IN(1) __size_t
398+
video_lock_getstride(struct video_lock const *__restrict __self);
399+
extern __ATTR_RETNONNULL __ATTR_PURE __ATTR_WUNUSED __ATTR_IN(1) __byte_t *
400+
video_lock_getline(struct video_lock const *__restrict __self, video_coord_t __y);
401+
402+
/* Same as above, but for `video_regionlock' */
403+
extern __ATTR_RETNONNULL __ATTR_PURE __ATTR_WUNUSED __ATTR_IN(1) __byte_t *
404+
video_regionlock_getdata(struct video_regionlock const *__restrict __self);
405+
extern __ATTR_PURE __ATTR_WUNUSED __ATTR_IN(1) __size_t
406+
video_regionlock_getstride(struct video_regionlock const *__restrict __self);
407+
extern __ATTR_PURE __ATTR_WUNUSED __ATTR_IN(1) video_coord_t
408+
video_regionlock_getxbase(struct video_regionlock const *__restrict __self);
409+
extern __ATTR_RETNONNULL __ATTR_PURE __ATTR_WUNUSED __ATTR_IN(1) __byte_t *
410+
video_regionlock_getline(struct video_regionlock const *__restrict __self, video_coord_t __y);
411+
#else /* __INTELLISENSE__ */
412+
#define video_lock_getdata(self) ((__byte_t *)(self)->vl_data)
413+
#define video_lock_getstride(self) ((__size_t)(self)->vl_stride)
414+
#define video_lock_getline(self, y) ((self)->vl_data + (y) * (self)->vl_stride)
415+
#define video_regionlock_getdata(self) ((__byte_t *)(self)->vrl_lock.vl_data)
416+
#define video_regionlock_getstride(self) ((__size_t)(self)->vrl_lock.vl_stride)
417+
#define video_regionlock_getxbase(self) ((video_coord_t)(self)->vrl_xbas)
418+
#define video_regionlock_getline(self, y) ((self)->vrl_lock.vl_data + (y) * (self)->vrl_lock.vl_stride)
419+
#endif /* !__INTELLISENSE__ */
420+
421+
393422
struct video_buffer_ops {
394423
/* NOTE: _ALL_ Callbacks are always [1..1] */
395424

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

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -429,7 +429,7 @@ NOTHROW(FCC custom_buffer__unlockregion)(struct video_buffer *__restrict self,
429429
video_codec_xcoord_to_offset(video_buffer_getcodec(self),
430430
lock->_vrl_rect.vcr_xmin,
431431
&xoff, &xrem);
432-
assert(xrem == lock->vrl_xbas);
432+
assert(xrem == video_regionlock_getxbase(lock));
433433
lock->vrl_lock.vl_data -= lock->_vrl_rect.vcr_ymin * lock->vrl_lock.vl_stride;
434434
lock->vrl_lock.vl_data -= xoff;
435435
(*me->cbc_unlock)(me->cbc_cookie, &lock->vrl_lock);

kos/src/libvideo/gfx/gfx-palettize.c

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -497,7 +497,7 @@ median_cut_start(struct video_gfx const *__restrict self,
497497
video_gfx_getcodec(self)->vc_codec == VIDEO_CODEC_RGBA8888) {
498498
struct video_lock lock;
499499
if (video_buffer_rlock(video_gfx_getbuffer(self), &lock) == 0) {
500-
if (lock.vl_stride == (self->vg_clip.vgc_byend * 4)) {
500+
if (video_lock_getstride(&lock) == (video_gfx_getioxdim(self) * 4)) {
501501
io.mio_cookie = lock.vl_data;
502502
io.mio_getcolor = &median_io_buf;
503503
median_cut_start_impl(&io, gfx_indices, io_pixels,

kos/src/libvideo/gfx/io/bmp.c.inl

Lines changed: 13 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -560,24 +560,24 @@ libvideo_buffer_open_bmp(struct video_domain const *__restrict domain_hint,
560560
switch (biCompression) {
561561
case BI_BITFIELDS: {
562562
/* In this case, pixel data bounds were already asserted */
563-
byte_t *dst = result_lock.vl_data;
564-
if likely(result_lock.vl_stride == dwPixelScanline) {
563+
byte_t *dst = video_lock_getdata(&result_lock);
564+
if likely(video_lock_getstride(&result_lock) == dwPixelScanline) {
565565
dst = (byte_t *)mempcpy(dst, bPixelData, szPixelDataSizeGot);
566566
} else {
567567
video_dim_t iter_y = video_buffer_getydim(result);
568-
if (result_lock.vl_stride > dwPixelScanline) {
568+
if (video_lock_getstride(&result_lock) > dwPixelScanline) {
569569
byte_t const *src = bPixelData;
570-
size_t missing = result_lock.vl_stride - dwPixelScanline;
570+
size_t missing = video_lock_getstride(&result_lock) - dwPixelScanline;
571571
do {
572572
memcpy(dst, src, dwPixelScanline);
573573
bzero(dst + dwPixelScanline, dwPixelScanline, missing);
574-
dst += result_lock.vl_stride;
574+
dst += video_lock_getstride(&result_lock);
575575
src += dwPixelScanline;
576576
} while (--iter_y);
577577
} else {
578578
byte_t const *src = bPixelData;
579579
do {
580-
dst = (byte_t *)mempcpy(dst, src, result_lock.vl_stride);
580+
dst = (byte_t *)mempcpy(dst, src, video_lock_getstride(&result_lock));
581581
src += szPixelDataSizeGot;
582582
} while (--iter_y);
583583
}
@@ -589,7 +589,7 @@ libvideo_buffer_open_bmp(struct video_domain const *__restrict domain_hint,
589589

590590
case BI_RLE4:
591591
case BI_RLE8:
592-
rle_decode(result_lock.vl_data, result_lock.vl_stride,
592+
rle_decode(result_lock.vl_data, video_lock_getstride(&result_lock),
593593
video_buffer_getydim(result),
594594
bPixelData, blobEOF, biCompression == BI_RLE4);
595595
break;
@@ -778,23 +778,23 @@ libvideo_surface_save_bmp(struct video_surface const *__restrict self,
778778
goto err_unlock;
779779

780780
/* Write pixel data */
781-
if likely(vid_lock.vl_stride == dwPixelScanline) {
781+
if likely(video_lock_getstride(&vid_lock) == dwPixelScanline) {
782782
/* Can write data without any need for padding or-the-like */
783-
size_t n_bytes = vid_lock.vl_stride * video_buffer_getydim(buffer);
783+
size_t n_bytes = video_lock_getstride(&vid_lock) * video_buffer_getydim(buffer);
784784
if (!fwrite(vid_lock.vl_data, n_bytes, 1, stream))
785785
goto err_unlock;
786-
} else if (vid_lock.vl_stride > dwPixelScanline) {
786+
} else if (video_lock_getstride(&vid_lock) > dwPixelScanline) {
787787
video_coord_t y;
788788
for (y = 0; y < video_buffer_getydim(buffer); ++y) {
789-
byte_t const *src = vid_lock.vl_data + y * vid_lock.vl_stride;
789+
byte_t const *src = video_lock_getline(&vid_lock, y);
790790
if (!fwrite(src, dwPixelScanline, 1, stream))
791791
goto err_unlock;
792792
}
793793
} else {
794-
size_t n_skip = dwPixelScanline - vid_lock.vl_stride;
794+
size_t n_skip = dwPixelScanline - video_lock_getstride(&vid_lock);
795795
video_coord_t y;
796796
for (y = 0; y < video_buffer_getydim(buffer); ++y) {
797-
byte_t const *src = vid_lock.vl_data + y * vid_lock.vl_stride;
797+
byte_t const *src = video_lock_getline(&vid_lock, y);
798798
if (!fwrite(src, dwPixelScanline, 1, stream))
799799
goto err_unlock;
800800
if (fseek(stream, n_skip, SEEK_CUR))

kos/src/libvideo/gfx/io/gif.c.inl

Lines changed: 31 additions & 24 deletions
Original file line numberDiff line numberDiff line change
@@ -655,8 +655,8 @@ err_dcol_buffer:
655655
}
656656

657657
/* Convert pixel data */
658-
pal_line = pal_lock.vl_data;
659-
dcol_line = frame_lock.vl_data;
658+
pal_line = video_lock_getdata(&pal_lock);
659+
dcol_line = video_lock_getdata(&frame_lock);
660660
iter_y = video_buffer_getydim(frame);
661661
if (format.vbf_codec->vc_specs.vcs_pxsz == 3) {
662662
do {
@@ -670,8 +670,8 @@ err_dcol_buffer:
670670
*dcol_iter++ = VIDEO_COLOR_GET_GREEN(color);
671671
*dcol_iter++ = VIDEO_COLOR_GET_BLUE(color);
672672
} while (--iter_x);
673-
dcol_line += frame_lock.vl_stride;
674-
pal_line += pal_lock.vl_stride;
673+
dcol_line += video_lock_getstride(&frame_lock);
674+
pal_line += video_lock_getstride(&pal_lock);
675675
} while (--iter_y);
676676
} else {
677677
do {
@@ -689,8 +689,8 @@ err_dcol_buffer:
689689
*(uint32_t *)dcol_iter = color;
690690
dcol_iter += 4;
691691
} while (--iter_x);
692-
dcol_line += frame_lock.vl_stride;
693-
pal_line += pal_lock.vl_stride;
692+
dcol_line += video_lock_getstride(&frame_lock);
693+
pal_line += video_lock_getstride(&pal_lock);
694694
} while (--iter_y);
695695
}
696696
video_buffer_unlock(frame, &pal_lock);
@@ -732,10 +732,13 @@ err_dcol_buffer:
732732
self->gb_restore_stride = req.vbs_stride;
733733
}
734734
(*codec->vc_rectcopy)(self->gb_restore, 0, self->gb_restore_stride,
735-
frame_lock.vl_data, 0, frame_lock.vl_stride,
736-
video_buffer_getxdim(frame), video_buffer_getydim(frame));
735+
video_lock_getdata(&frame_lock), 0,
736+
video_lock_getstride(&frame_lock),
737+
video_buffer_getxdim(frame),
738+
video_buffer_getydim(frame));
737739
}
738-
(*codec->vc_rectfill)(frame_lock.vl_data, 0, frame_lock.vl_stride,
740+
(*codec->vc_rectfill)(video_lock_getdata(&frame_lock), 0,
741+
video_lock_getstride(&frame_lock),
739742
anim->ga_cfg.gc_trans,
740743
video_buffer_getxdim(frame),
741744
video_buffer_getydim(frame));
@@ -745,7 +748,8 @@ err_dcol_buffer:
745748
self->gb_encountered_GIF_DISPOSE_RESTORE_PREVIOUS = true;
746749
/* Restore previous frame */
747750
if (self->gb_restore) {
748-
(*codec->vc_rectcopy)(frame_lock.vl_data, 0, frame_lock.vl_stride,
751+
(*codec->vc_rectcopy)(video_lock_getdata(&frame_lock), 0,
752+
video_lock_getstride(&frame_lock),
749753
self->gb_restore, 0, self->gb_restore_stride,
750754
video_buffer_getxdim(frame),
751755
video_buffer_getydim(frame));
@@ -770,7 +774,8 @@ err_dcol_buffer:
770774
self->gb_restore_stride = req.vbs_stride;
771775
}
772776
(*codec->vc_rectcopy)(self->gb_restore, 0, self->gb_restore_stride,
773-
frame_lock.vl_data, 0, frame_lock.vl_stride,
777+
video_lock_getdata(&frame_lock), 0,
778+
video_lock_getstride(&frame_lock),
774779
video_buffer_getxdim(frame),
775780
video_buffer_getydim(frame));
776781
} break;
@@ -787,8 +792,8 @@ err_dcol_buffer:
787792
frame_endy <= video_buffer_getydim(frame))) {
788793
/* Can render directly into the frame buffer (no scratch buffer needed) */
789794
byte_t *dst;
790-
dst = frame_lock.vl_data + frame_x + frame_y * frame_lock.vl_stride;
791-
reader = gif_read_frame(self, dst, frame_lock.vl_stride, frame_w, frame_h,
795+
dst = video_lock_getline(&frame_lock, frame_y) + frame_x;
796+
reader = gif_read_frame(self, dst, video_lock_getstride(&frame_lock), frame_w, frame_h,
792797
reader, eof, ctrl, self->gb_cfg.gc_trans);
793798
if unlikely(!reader)
794799
goto err_frame_lock;
@@ -809,13 +814,13 @@ set_has_global_transparency:
809814
ATTR_FALLTHROUGH
810815
case GIF_DISPOSE_RESTORE_PREVIOUS: {
811816
/* Check if pixel data contains transparent pixels */
812-
byte_t *line_iter = frame_lock.vl_data;
817+
byte_t *line_iter = video_lock_getdata(&frame_lock);
813818
video_coord_t y_iter = video_buffer_getydim(frame);
814819
do {
815820
if (memchr(line_iter, anim->ga_cfg.gc_trans,
816821
video_buffer_getxdim(frame)))
817822
goto set_has_global_transparency;
818-
line_iter += frame_lock.vl_stride;
823+
line_iter += video_lock_getstride(&frame_lock);
819824
} while (--y_iter);
820825
video_buffer_disablecolorkey(frame);
821826
} break;
@@ -864,7 +869,8 @@ set_has_global_transparency:
864869
codec->vc_specs.vcs_pxsz == 3 || /* RGB888 */
865870
codec->vc_specs.vcs_pxsz == 4); /* RGBA8888 */
866871
src = self->gb_scratch;
867-
dst = frame_lock.vl_data + (frame_x * codec->vc_specs.vcs_pxsz) + (frame_y * frame_lock.vl_stride);
872+
dst = video_lock_getline(&frame_lock, frame_y) +
873+
(frame_x * codec->vc_specs.vcs_pxsz);
868874
switch (codec->vc_specs.vcs_pxsz) {
869875
case 1:
870876
for (y = 0; y < frame_h; ++y) {
@@ -875,7 +881,7 @@ set_has_global_transparency:
875881
*line = pixel;
876882
++line;
877883
}
878-
dst += frame_lock.vl_stride;
884+
dst += video_lock_getstride(&frame_lock);
879885
}
880886
goto check_for_global_transparency;
881887
case 3:
@@ -898,7 +904,7 @@ set_has_global_transparency:
898904
}
899905
line += 3;
900906
}
901-
dst += frame_lock.vl_stride;
907+
dst += video_lock_getstride(&frame_lock);
902908
}
903909
break;
904910
case 4:
@@ -920,7 +926,7 @@ set_has_global_transparency:
920926
}
921927
line += 4;
922928
}
923-
dst += frame_lock.vl_stride;
929+
dst += video_lock_getstride(&frame_lock);
924930
}
925931
break;
926932
default: __builtin_unreachable();
@@ -1029,7 +1035,7 @@ gif_anim_firstframe(struct video_anim const *__restrict self,
10291035

10301036
/* Fill with global transparency, or "0" if not defined */
10311037
if (me->ga_cfg.gc_trans <= 0xff && me->ga_cfg.gc_trans != 0) {
1032-
(*format.vbf_codec->vc_rectfill)(result_lock.vl_data, 0, result_lock.vl_stride,
1038+
(*format.vbf_codec->vc_rectfill)(video_lock_getdata(&result_lock), 0, video_lock_getstride(&result_lock),
10331039
me->ga_cfg.gc_trans,
10341040
video_buffer_getxdim(result),
10351041
video_buffer_getydim(result));
@@ -1052,8 +1058,9 @@ gif_anim_firstframe(struct video_anim const *__restrict self,
10521058

10531059
/* Read frame into buffer */
10541060
reader = gif_read_frame(frame,
1055-
result_lock.vl_data + frame_x + frame_y * result_lock.vl_stride,
1056-
result_lock.vl_stride, frame_w, frame_h, reader, eof, ctrl,
1061+
video_lock_getline(&result_lock, frame_y) + frame_x,
1062+
video_lock_getstride(&result_lock),
1063+
frame_w, frame_h, reader, eof, ctrl,
10571064
(video_pixel_t)-1);
10581065
if unlikely(!reader)
10591066
goto err_r_lock;
@@ -1074,13 +1081,13 @@ set_have_global_trans:
10741081
me->ga_frame1_global_trans = GIF_ANIM_FRAME1_GLOBAL_TRANS__YES;
10751082
goto have_global_trans;
10761083
}
1077-
line_iter = result_lock.vl_data;
1084+
line_iter = video_lock_getdata(&result_lock);
10781085
y_iter = video_buffer_getydim(result);
10791086
do {
10801087
if (memchr(line_iter, me->ga_cfg.gc_trans,
10811088
video_buffer_getxdim(result)))
10821089
goto set_have_global_trans;
1083-
line_iter += result_lock.vl_stride;
1090+
line_iter += video_lock_getstride(&result_lock);
10841091
} while (--y_iter);
10851092
me->ga_frame1_global_trans = GIF_ANIM_FRAME1_GLOBAL_TRANS__NO;
10861093
} break;

kos/src/libvideo/gfx/io/jpg.c.inl

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -441,7 +441,7 @@ err_wrong_fmt:
441441
scanline_y = minimal_jpeg_decompress_struct__get_output_scanline(&decomp);
442442
if (scanline_y >= result_size_y)
443443
break;
444-
scanline = vid_lock.vl_data + scanline_y * vid_lock.vl_stride;
444+
scanline = video_lock_getline(&vid_lock, scanline_y);
445445
scanlines = &scanline;
446446
(void)(*pdyn_jpeg_read_scanlines)(&decomp, scanlines, 1);
447447
}
@@ -577,7 +577,7 @@ do_convert:
577577
want_y = minimal_jpeg_compress_struct__get_next_scanline(&comp);
578578
if (want_y >= minimal_jpeg_compress_struct__get_image_height(&comp))
579579
break;
580-
scanline = vid_lock.vl_data + want_y * vid_lock.vl_stride;
580+
scanline = video_lock_getline(&vid_lock, want_y);
581581
scanlines = &scanline;
582582
(void)(*pdyn_jpeg_write_scanlines)(&comp, scanlines, 1);
583583
}

kos/src/libvideo/gfx/io/png-lodepng.c.inl

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -205,10 +205,10 @@ video_lock_convert_stride(struct video_lock *__restrict self,
205205
byte_t *result = (byte_t *)malloc(new_stride, h);
206206
if likely(result) {
207207
unsigned int y;
208-
byte_t const *src = self->vl_data;
208+
byte_t const *src = video_lock_getdata(self);
209209
byte_t *dst = result;
210-
size_t common = MIN(new_stride, self->vl_stride);
211-
for (y = 0; y < h; ++y, src += self->vl_stride, dst += new_stride)
210+
size_t common = MIN(new_stride, video_lock_getstride(self));
211+
for (y = 0; y < h; ++y, src += video_lock_getstride(self), dst += new_stride)
212212
memcpy(dst, src, common);
213213
}
214214
return result;
@@ -281,9 +281,9 @@ convert_surface:
281281
return result;
282282
lodepng_stride = get_lodepng_stride(video_buffer_getxdim(buffer),
283283
colortype, bitdepth);
284-
if likely(lodepng_stride == lock.vl_stride) {
284+
if likely(lodepng_stride == video_lock_getstride(&lock)) {
285285
error = my_lodepng_encode_memory(&out, &out_size,
286-
(unsigned char const *)lock.vl_data,
286+
(unsigned char const *)video_lock_getdata(&lock),
287287
video_buffer_getxdim(buffer),
288288
video_buffer_getydim(buffer),
289289
colortype, bitdepth, options);

kos/src/libvideo/gfx/io/png.c.inl

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -387,14 +387,14 @@ do_rgb_format:
387387
/* Don't go below whatever scanline requirements libpng has */
388388
size_t libpng_scanline = (*pdyn_png_get_rowbytes)(png_ptr, info_ptr);
389389
int passes = (*pdyn_png_set_interlace_handling)(png_ptr);
390-
if likely(result_lock.vl_stride >= libpng_scanline) {
390+
if likely(video_lock_getstride(&result_lock) >= libpng_scanline) {
391391
int pass;
392392
for (pass = 0; pass < passes; ++pass) {
393-
byte_t *dst = result_lock.vl_data;
393+
byte_t *dst = video_lock_getdata(&result_lock);
394394
libpng_uint_32 y;
395395
for (y = 0; y < height; ++y) {
396396
(*pdyn_png_read_row)(png_ptr, dst, NULL);
397-
dst += result_lock.vl_stride;
397+
dst += video_lock_getstride(&result_lock);
398398
}
399399
}
400400
} else {
@@ -403,11 +403,11 @@ do_rgb_format:
403403
if unlikely(!temp_line)
404404
goto err_png_ptr_info_ptr_pal_r_lock;
405405
for (pass = 0; pass < passes; ++pass) {
406-
byte_t *dst = result_lock.vl_data;
406+
byte_t *dst = video_lock_getdata(&result_lock);
407407
libpng_uint_32 y;
408408
for (y = 0; y < height; ++y) {
409409
(*pdyn_png_read_row)(png_ptr, temp_line, NULL);
410-
dst = (byte_t *)mempcpy(dst, temp_line, result_lock.vl_stride);
410+
dst = (byte_t *)mempcpy(dst, temp_line, video_lock_getstride(&result_lock));
411411
}
412412
}
413413
free(temp_line);

0 commit comments

Comments
 (0)