diff options
Diffstat (limited to 'video/out/vo_rpi.c')
-rw-r--r-- | video/out/vo_rpi.c | 61 |
1 files changed, 37 insertions, 24 deletions
diff --git a/video/out/vo_rpi.c b/video/out/vo_rpi.c index 4f890ad2e4..cf051cfbc2 100644 --- a/video/out/vo_rpi.c +++ b/video/out/vo_rpi.c @@ -80,6 +80,7 @@ struct priv { int display_nr; int layer; int background; + int enable_osd; }; // Magic alignments (in pixels) expected by the MMAL internals. @@ -116,6 +117,8 @@ static size_t layout_buffer(struct mp_image *mpi, MMAL_BUFFER_HEADER_T *buffer, static void update_osd(struct vo *vo) { struct priv *p = vo->priv; + if (!p->enable_osd) + return; mpgl_osd_generate(p->osd, p->osd_res, p->osd_pts, 0, 0); @@ -126,6 +129,8 @@ static void update_osd(struct vo *vo) } p->osd_change_counter = osd_change_counter; + MP_STATS(vo, "start rpi_osd"); + p->egl.gl->ClearColor(0, 0, 0, 0); p->egl.gl->Clear(GL_COLOR_BUFFER_BIT); @@ -153,6 +158,8 @@ static void update_osd(struct vo *vo) gl_sc_gen_shader_and_reset(p->sc); mpgl_osd_draw_part(p->osd, p->w, -p->h, n); } + + MP_STATS(vo, "stop rpi_osd"); } static void resize(struct vo *vo) @@ -164,17 +171,20 @@ static void resize(struct vo *vo) vo_get_src_dst_rects(vo, &src, &dst, &p->osd_res); + int src_w = src.x1 - src.x0, src_h = src.y1 - src.y0, + dst_w = dst.x1 - dst.x0, dst_h = dst.y1 - dst.y0; MMAL_DISPLAYREGION_T dr = { .hdr = { .id = MMAL_PARAMETER_DISPLAYREGION, .size = sizeof(MMAL_DISPLAYREGION_T), }, - .src_rect = { .x = src.x0, .y = src.y0, - .width = src.x1 - src.x0, .height = src.y1 - src.y0, }, - .dest_rect = { .x = dst.x0, .y = dst.y0, - .width = dst.x1 - dst.x0, .height = dst.y1 - dst.y0, }, + .src_rect = { .x = src.x0, .y = src.y0, .width = src_w, .height = src_h }, + .dest_rect = { .x = dst.x0, .y = dst.y0, .width = dst_w, .height = dst_h }, .layer = p->video_layer, .display_num = p->display_nr, + .pixel_x = dst_w * src_h, + .pixel_y = src_w * dst_h, .set = MMAL_DISPLAY_SET_SRC_RECT | MMAL_DISPLAY_SET_DEST_RECT | - MMAL_DISPLAY_SET_LAYER | MMAL_DISPLAY_SET_NUM, + MMAL_DISPLAY_SET_LAYER | MMAL_DISPLAY_SET_NUM | + MMAL_DISPLAY_SET_PIXEL, }; if (mmal_port_parameter_set(input, &dr.hdr)) @@ -240,27 +250,29 @@ static int update_display_size(struct vo *vo) } } - alpha = (VC_DISPMANX_ALPHA_T){ - .flags = DISPMANX_FLAGS_ALPHA_FROM_SOURCE, - .opacity = 0xFF, - }; - p->osd_overlay = vc_dispmanx_element_add(p->update, p->display, - p->osd_layer, - &dst, 0, &src, - DISPMANX_PROTECTION_NONE, - &alpha, 0, 0); - if (!p->osd_overlay) { - MP_FATAL(vo, "Could not add DISPMANX element.\n"); - return -1; - } + if (p->enable_osd) { + alpha = (VC_DISPMANX_ALPHA_T){ + .flags = DISPMANX_FLAGS_ALPHA_FROM_SOURCE, + .opacity = 0xFF, + }; + p->osd_overlay = vc_dispmanx_element_add(p->update, p->display, + p->osd_layer, + &dst, 0, &src, + DISPMANX_PROTECTION_NONE, + &alpha, 0, 0); + if (!p->osd_overlay) { + MP_FATAL(vo, "Could not add DISPMANX element.\n"); + return -1; + } - if (mp_egl_rpi_init(&p->egl, p->osd_overlay, p->w, p->h) < 0) { - MP_FATAL(vo, "EGL/GLES initialization for OSD renderer failed.\n"); - return -1; + if (mp_egl_rpi_init(&p->egl, p->osd_overlay, p->w, p->h) < 0) { + MP_FATAL(vo, "EGL/GLES initialization for OSD renderer failed.\n"); + return -1; + } + p->sc = gl_sc_create(p->egl.gl, vo->log), + p->osd = mpgl_osd_init(p->egl.gl, vo->log, vo->osd); + p->osd_change_counter = -1; // force initial overlay rendering } - p->sc = gl_sc_create(p->egl.gl, vo->log), - p->osd = mpgl_osd_init(p->egl.gl, vo->log, vo->osd); - p->osd_change_counter = -1; // force initial overlay rendering p->display_fps = 0; TV_GET_STATE_RESP_T tvstate; @@ -660,6 +672,7 @@ static const struct m_option options[] = { OPT_INT("display", display_nr, 0), OPT_INT("layer", layer, 0, OPTDEF_INT(-10)), OPT_FLAG("background", background, 0), + OPT_FLAG("osd", enable_osd, 0, OPTDEF_INT(1)), {0}, }; |