summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorwm4 <wm4@nowhere>2015-04-30 21:21:09 +0200
committerDiogo Franco (Kovensky) <diogomfranco@gmail.com>2015-05-07 10:41:33 +0900
commit73fc12c4e256d9eb5ca204246d36500b045da8db (patch)
treeba286964b3a8e92e497a0bede2a6912f1b212a13
parent63402eb1dd761328931411b474480298cf47c2b3 (diff)
downloadmpv-73fc12c4e256d9eb5ca204246d36500b045da8db.tar.bz2
mpv-73fc12c4e256d9eb5ca204246d36500b045da8db.tar.xz
vo_rpi: actually draw a black background
Also factor the display size initialization into a separate function. For some reason this seems to work, although setting the background color using this 1x1 pixel bitmap does not work. I blame the RPI beign a terrible piece of hardware with even worse drivers. (cherry picked from commit 6ae66e717faa4e9ce286ff0532d4ec19a66faf49)
-rw-r--r--video/out/vo_rpi.c88
1 files changed, 65 insertions, 23 deletions
diff --git a/video/out/vo_rpi.c b/video/out/vo_rpi.c
index c60218d575..684eddc560 100644
--- a/video/out/vo_rpi.c
+++ b/video/out/vo_rpi.c
@@ -57,6 +57,7 @@ struct osd_part {
struct priv {
DISPMANX_DISPLAY_HANDLE_T display;
DISPMANX_ELEMENT_HANDLE_T window;
+ DISPMANX_RESOURCE_HANDLE_T window_back;
DISPMANX_UPDATE_HANDLE_T update;
uint32_t w, h;
@@ -239,6 +240,64 @@ static void resize(struct vo *vo)
MP_WARN(vo, "could not set video rectangle\n");
}
+static int update_display_size(struct vo *vo)
+{
+ struct priv *p = vo->priv;
+
+ uint32_t n_w = 0, n_h = 0;
+ if (graphics_get_display_size(0, &n_w, &n_h) < 0) {
+ MP_FATAL(vo, "Could not get display size.\n");
+ return -1;
+ }
+
+ if (p->w == n_w && p->h == n_h)
+ return 0;
+
+ p->w = n_w;
+ p->h = n_h;
+
+ MP_VERBOSE(vo, "Display size: %dx%d\n", p->w, p->h);
+
+ if (p->window)
+ vc_dispmanx_element_remove(p->update, p->window);
+ if (p->window_back)
+ vc_dispmanx_resource_delete(p->window_back);
+ p->window = 0;
+ p->window_back = 0;
+
+ VC_IMAGE_TYPE_T format = VC_IMAGE_ARGB8888; // assuming RPI is always LE
+ p->window_back = vc_dispmanx_resource_create(format, 1 | (4 << 16), 1,
+ &(int32_t){0});
+ if (!p->window_back) {
+ MP_ERR(vo, "Could not create background bitmap.\n");
+ return -1;
+ }
+
+ uint32_t px = 0;
+ VC_RECT_T rc = {.width = 1, .height = 1};
+ vc_dispmanx_resource_write_data(p->window_back, format, 4, &px, &rc);
+
+ // Use the whole screen.
+ VC_RECT_T dst = {.width = p->w, .height = p->h};
+ VC_RECT_T src = {.width = 1 << 16, .height = 1 << 16};
+ VC_DISPMANX_ALPHA_T alpha = {
+ .flags = DISPMANX_FLAGS_ALPHA_FIXED_ALL_PIXELS,
+ .opacity = 0xFF,
+ };
+ p->window = vc_dispmanx_element_add(p->update, p->display, p->background_layer,
+ &dst, p->window_back, &src,
+ DISPMANX_PROTECTION_NONE, &alpha, 0, 0);
+ if (!p->window) {
+ MP_FATAL(vo, "Could not add DISPMANX element.\n");
+ return -1;
+ }
+
+ vc_dispmanx_update_submit_sync(p->update);
+ p->update = vc_dispmanx_update_start(10);
+
+ return 0;
+}
+
static void flip_page(struct vo *vo)
{
struct priv *p = vo->priv;
@@ -479,6 +538,11 @@ static void uninit(struct vo *vo)
wipe_osd(vo);
+ if (p->window)
+ vc_dispmanx_element_remove(p->update, p->window);
+ if (p->window_back)
+ vc_dispmanx_resource_delete(p->window_back);
+
if (p->update)
vc_dispmanx_update_submit_sync(p->update);
@@ -521,30 +585,8 @@ static int preinit(struct vo *vo)
goto fail;
}
- if (graphics_get_display_size(0, &p->w, &p->h) < 0) {
- MP_FATAL(vo, "Could not get display size.\n");
+ if (update_display_size(vo) < 0)
goto fail;
- }
-
- MP_VERBOSE(vo, "Display size: %dx%d\n", p->w, p->h);
-
- // Just use the whole screen.
- VC_RECT_T dst = {.width = p->w, .height = p->h};
- VC_RECT_T src = {.width = p->w << 16, .height = p->h << 16};
- VC_DISPMANX_ALPHA_T alpha = {
- .flags = DISPMANX_FLAGS_ALPHA_FIXED_ALL_PIXELS,
- .opacity = 0xFF,
- };
- p->window = vc_dispmanx_element_add(p->update, p->display, p->background_layer,
- &dst, 0, &src, DISPMANX_PROTECTION_NONE,
- &alpha, 0, 0);
- if (!p->window) {
- MP_FATAL(vo, "Could not add DISPMANX element.\n");
- goto fail;
- }
-
- vc_dispmanx_update_submit_sync(p->update);
- p->update = vc_dispmanx_update_start(10);
return 0;