[vlc-commits] bluray: simplify overlay functions
Rafaël Carré
git at videolan.org
Fri Aug 16 13:26:09 CEST 2013
vlc | branch: master | Rafaël Carré <funman at videolan.org> | Mon Aug 12 09:38:12 2013 +0200| [b323c8761f894fec564b5b35802e6beb485f070d] | committer: Rafaël Carré
bluray: simplify overlay functions
> http://git.videolan.org/gitweb.cgi/vlc.git/?a=commit;h=b323c8761f894fec564b5b35802e6beb485f070d
---
modules/access/bluray.c | 99 +++++++++++++++++++++++------------------------
1 file changed, 49 insertions(+), 50 deletions(-)
diff --git a/modules/access/bluray.c b/modules/access/bluray.c
index 93019dd..f0b147e 100644
--- a/modules/access/bluray.c
+++ b/modules/access/bluray.c
@@ -697,20 +697,21 @@ static void blurayCloseAllOverlays(demux_t *p_demux)
demux_sys_t *p_sys = p_demux->p_sys;
p_demux->p_sys->current_overlay = -1;
- if (p_sys->p_vout != NULL) {
- for (int i = 0; i < 0; i++) {
- if (p_sys->p_overlays[i] != NULL) {
- vout_FlushSubpictureChannel(p_sys->p_vout,
- p_sys->p_overlays[i]->p_pic->i_channel);
- blurayCleanOverlayStruct(p_sys->p_overlays[i]);
- p_sys->p_overlays[i] = NULL;
- }
+ if (!p_sys->p_vout)
+ return;
+
+ for (int i = 0; i < 0; i++) {
+ if (p_sys->p_overlays[i] != NULL) {
+ vout_FlushSubpictureChannel(p_sys->p_vout,
+ p_sys->p_overlays[i]->p_pic->i_channel);
+ blurayCleanOverlayStruct(p_sys->p_overlays[i]);
+ p_sys->p_overlays[i] = NULL;
}
- var_DelCallback(p_sys->p_vout, "mouse-moved", &onMouseEvent, p_demux);
- var_DelCallback(p_sys->p_vout, "mouse-clicked", &onMouseEvent, p_demux);
- vlc_object_release(p_sys->p_vout);
- p_sys->p_vout = NULL;
}
+ var_DelCallback(p_sys->p_vout, "mouse-moved", onMouseEvent, p_demux);
+ var_DelCallback(p_sys->p_vout, "mouse-clicked", onMouseEvent, p_demux);
+ vlc_object_release(p_sys->p_vout);
+ p_sys->p_vout = NULL;
}
/*
@@ -723,27 +724,27 @@ static void blurayCloseAllOverlays(demux_t *p_demux)
static void blurayActivateOverlay(demux_t *p_demux, int plane)
{
demux_sys_t *p_sys = p_demux->p_sys;
+ bluray_overlay_t *ov = p_sys->p_overlays[plane];
/*
* If the overlay is already displayed, mark the picture as outdated.
* We must NOT use vout_PutSubpicture if a picture is already displayed.
*/
- vlc_mutex_lock(&p_sys->p_overlays[plane]->lock);
- if ((p_sys->p_overlays[plane]->status == Displayed ||
- p_sys->p_overlays[plane]->status == Outdated)
- && p_sys->p_vout) {
- p_sys->p_overlays[plane]->status = Outdated;
- vlc_mutex_unlock(&p_sys->p_overlays[plane]->lock);
+ vlc_mutex_lock(&ov->lock);
+ if (ov->status >= Displayed && p_sys->p_vout) {
+ ov->status = Outdated;
+ vlc_mutex_unlock(&ov->lock);
return;
}
+
/*
* Mark the overlay as available, but don't display it right now.
* the blurayDemuxMenu will send it to vout, as it may be unavailable when
* the overlay is computed
*/
p_sys->current_overlay = plane;
- p_sys->p_overlays[plane]->status = ToDisplay;
- vlc_mutex_unlock(&p_sys->p_overlays[plane]->lock);
+ ov->status = ToDisplay;
+ vlc_mutex_unlock(&ov->lock);
}
static void blurayInitOverlay(demux_t *p_demux, int plane, int width, int height)
@@ -756,28 +757,30 @@ static void blurayInitOverlay(demux_t *p_demux, int plane, int width, int height
if (unlikely(!p_sys->p_overlays[plane]))
return;
+ bluray_overlay_t *ov = p_sys->p_overlays[plane];
+
subpicture_updater_sys_t *p_upd_sys = malloc(sizeof(*p_upd_sys));
if (unlikely(!p_upd_sys)) {
- free(p_sys->p_overlays[plane]);
+ free(ov);
p_sys->p_overlays[plane] = NULL;
return;
}
/* two references: vout + demux */
- p_sys->p_overlays[plane]->released_once = ATOMIC_FLAG_INIT;
+ ov->released_once = ATOMIC_FLAG_INIT;
- p_upd_sys->p_overlay = p_sys->p_overlays[plane];
+ p_upd_sys->p_overlay = ov;
subpicture_updater_t updater = {
.pf_validate = subpictureUpdaterValidate,
.pf_update = subpictureUpdaterUpdate,
.pf_destroy = subpictureUpdaterDestroy,
.p_sys = p_upd_sys,
};
- vlc_mutex_init(&p_sys->p_overlays[plane]->lock);
- p_sys->p_overlays[plane]->p_pic = subpicture_New(&updater);
- p_sys->p_overlays[plane]->p_pic->i_original_picture_width = width;
- p_sys->p_overlays[plane]->p_pic->i_original_picture_height = height;
- p_sys->p_overlays[plane]->p_pic->b_ephemer = true;
- p_sys->p_overlays[plane]->p_pic->b_absolute = true;
+ vlc_mutex_init(&ov->lock);
+ ov->p_pic = subpicture_New(&updater);
+ ov->p_pic->i_original_picture_width = width;
+ ov->p_pic->i_original_picture_height = height;
+ ov->p_pic->b_ephemer = true;
+ ov->p_pic->b_absolute = true;
}
/**
@@ -791,13 +794,15 @@ static void blurayInitOverlay(demux_t *p_demux, int plane, int width, int height
static void blurayClearOverlay(demux_t *p_demux, int plane)
{
demux_sys_t *p_sys = p_demux->p_sys;
+ bluray_overlay_t *ov = p_sys->p_overlays[plane];
+
+ vlc_mutex_lock(&ov->lock);
- vlc_mutex_lock(&p_sys->p_overlays[plane]->lock);
+ subpicture_region_ChainDelete(ov->p_regions);
+ ov->p_regions = NULL;
+ ov->status = Outdated;
- subpicture_region_ChainDelete(p_sys->p_overlays[plane]->p_regions);
- p_sys->p_overlays[plane]->p_regions = NULL;
- p_sys->p_overlays[plane]->status = Outdated;
- vlc_mutex_unlock(&p_sys->p_overlays[plane]->lock);
+ vlc_mutex_unlock(&ov->lock);
}
/*
@@ -848,9 +853,8 @@ static void blurayDrawOverlay(demux_t *p_demux, const BD_OVERLAY* const ov)
const BD_PG_RLE_ELEM *img = ov->img;
for (int y = 0; y < ov->h; y++)
for (int x = 0; x < ov->w;) {
- memset(p_reg->p_picture->p[0].p_pixels +
- y * p_reg->p_picture->p[0].i_pitch + x,
- img->color, img->len);
+ plane_t *p = &p_reg->p_picture->p[0];
+ memset(&p->p_pixels[y * p->i_pitch + x], img->color, img->len);
x += img->len;
img++;
}
@@ -904,24 +908,18 @@ static void blurayOverlayProc(void *ptr, const BD_OVERLAY *const overlay)
/*
* ARGB overlay (BD-J)
*/
-
static void blurayInitArgbOverlay(demux_t *p_demux, int plane, int width, int height)
{
demux_sys_t *p_sys = p_demux->p_sys;
blurayInitOverlay(p_demux, plane, width, height);
- /* If there is no region, create a new one. */
- subpicture_region_t *p_reg = p_sys->p_overlays[plane]->p_regions;
- if (!p_reg) {
+ if (!p_sys->p_overlays[plane]->p_regions) {
video_format_t fmt;
video_format_Init(&fmt, 0);
video_format_Setup(&fmt, VLC_CODEC_RGBA, width, height, 1, 1);
- p_reg = subpicture_region_New(&fmt);
- p_reg->i_x = 0;
- p_reg->i_y = 0;
- p_sys->p_overlays[plane]->p_regions = p_reg;
+ p_sys->p_overlays[plane]->p_regions = subpicture_region_New(&fmt);
}
}
@@ -1366,9 +1364,11 @@ static int blurayDemux(demux_t *p_demux)
}
if (p_sys->current_overlay != -1) {
- vlc_mutex_lock(&p_sys->p_overlays[p_sys->current_overlay]->lock);
- if (p_sys->p_overlays[p_sys->current_overlay]->status == ToDisplay) {
- vlc_mutex_unlock(&p_sys->p_overlays[p_sys->current_overlay]->lock);
+ bluray_overlay_t *ov = p_sys->p_overlays[p_sys->current_overlay];
+ vlc_mutex_lock(&ov->lock);
+ bool display = ov->status == ToDisplay;
+ vlc_mutex_unlock(&ov->lock);
+ if (display) {
if (p_sys->p_vout == NULL)
p_sys->p_vout = input_GetVout(p_sys->p_input);
if (p_sys->p_vout != NULL) {
@@ -1376,8 +1376,7 @@ static int blurayDemux(demux_t *p_demux)
var_AddCallback(p_sys->p_vout, "mouse-clicked", onMouseEvent, p_demux);
bluraySendOverlayToVout(p_demux);
}
- } else
- vlc_mutex_unlock(&p_sys->p_overlays[p_sys->current_overlay]->lock);
+ }
}
}
More information about the vlc-commits
mailing list