+static void uyvy_to_rgb565(void *d, const void *s, int pixels)
+{
+ unsigned short *dst = d;
+ const unsigned int *src = s;
+ int v;
+
+ // no colors, for now
+ for (; pixels > 0; src++, dst += 2, pixels -= 2) {
+ v = (*src >> 8) & 0xff;
+ v = (v - 16) * 255 / 219 / 8;
+ dst[0] = (v << 11) | (v << 6) | v;
+
+ v = (*src >> 24) & 0xff;
+ v = (v - 16) * 255 / 219 / 8;
+ dst[1] = (v << 11) | (v << 6) | v;
+ }
+}
+
+static void overlay_clear(void)
+{
+ int pixels = overlay->w * overlay->h;
+ int *dst = (int *)overlay->pixels[0];
+ int v = 0x10801080;
+
+ for (; pixels > 0; dst += 4, pixels -= 2 * 4)
+ dst[0] = dst[1] = dst[2] = dst[3] = v;
+
+ for (; pixels > 0; dst++, pixels -= 2)
+ *dst = v;
+}
+
+static void overlay_blit(int doffs, const void *src_, int w, int h,
+ int sstride, int bgr24)
+{
+ const unsigned short *src = src_;
+ unsigned short *dst;
+ int dstride = overlay->w;
+
+ SDL_LockYUVOverlay(overlay);
+ dst = (void *)overlay->pixels[0];
+
+ dst += doffs;
+ if (bgr24) {
+ for (; h > 0; dst += dstride, src += sstride, h--)
+ bgr888_to_uyvy(dst, src, w);
+ }
+ else {
+ for (; h > 0; dst += dstride, src += sstride, h--)
+ bgr555_to_uyvy(dst, src, w);
+ }
+
+ SDL_UnlockYUVOverlay(overlay);
+}
+
+static void overlay_hud_print(int x, int y, const char *str, int bpp)
+{
+ SDL_LockYUVOverlay(overlay);
+ basic_text_out_uyvy_nf(overlay->pixels[0], overlay->w, x, y, str);
+ SDL_UnlockYUVOverlay(overlay);
+}
+