[vlc-devel] [PATCH 1/2] mmal/vout: Fix abuse of vd->fmt
Julian Scheel
julian at jusst.de
Wed Oct 15 10:23:14 CEST 2014
The fmt in vout_display_t is not allowed to be written to after opening the
plugin without invalidating all the pictures. Instead of doing invalid writes
to vd->fmt, just make use of vd->source and event arguments directly which
shall hold correct values.
As framerate changes are not announced by the core we need to add a local
storage for comparion now as vd->fmt must not be used for it.
Signed-off-by: Julian Scheel <julian at jusst.de>
---
modules/hw/mmal/vout.c | 37 +++++++++++--------------------------
1 file changed, 11 insertions(+), 26 deletions(-)
diff --git a/modules/hw/mmal/vout.c b/modules/hw/mmal/vout.c
index 80aa86b..855f76f 100644
--- a/modules/hw/mmal/vout.c
+++ b/modules/hw/mmal/vout.c
@@ -116,6 +116,9 @@ struct vout_display_sys_t {
unsigned display_width;
unsigned display_height;
+ int i_frame_rate_base;
+ int i_frame_rate;
+
int next_phase_check;
int phase_offset;
int layer;
@@ -193,9 +196,6 @@ static int Open(vlc_object_t *object)
vd->info.has_hide_mouse = true;
sys->opaque = vd->fmt.i_chroma == VLC_CODEC_MMAL_OPAQUE;
- vd->fmt.i_sar_num = vd->source.i_sar_num;
- vd->fmt.i_sar_den = vd->source.i_sar_den;
-
status = mmal_component_create(MMAL_COMPONENT_DEFAULT_VIDEO_RENDERER, &sys->component);
if (status != MMAL_SUCCESS) {
msg_Err(vd, "Failed to create MMAL component %s (status=%"PRIx32" %s)",
@@ -398,7 +398,7 @@ static int configure_display(vout_display_t *vd, const vout_display_cfg_t *cfg,
return -EINVAL;
}
} else {
- fmt = &vd->fmt;
+ fmt = &vd->source;
}
if (!cfg)
@@ -435,9 +435,6 @@ static int configure_display(vout_display_t *vd, const vout_display_cfg_t *cfg,
set_latency_target(vd, true);
}
- if (fmt != &vd->fmt)
- memcpy(&vd->fmt, fmt, sizeof(video_format_t));
-
return 0;
}
@@ -549,12 +546,14 @@ static void vd_display(vout_display_t *vd, picture_t *picture,
MMAL_BUFFER_HEADER_T *buffer = pic_sys->buffer;
MMAL_STATUS_T status;
- if (picture->format.i_frame_rate != vd->fmt.i_frame_rate ||
- picture->format.i_frame_rate_base != vd->fmt.i_frame_rate_base ||
+ if (picture->format.i_frame_rate != sys->i_frame_rate ||
+ picture->format.i_frame_rate_base != sys->i_frame_rate_base ||
picture->b_progressive != sys->b_progressive ||
picture->b_top_field_first != sys->b_top_field_first) {
sys->b_top_field_first = picture->b_top_field_first;
sys->b_progressive = picture->b_progressive;
+ sys->i_frame_rate = picture->format.i_frame_rate;
+ sys->i_frame_rate_base = picture->format.i_frame_rate_base;
configure_display(vd, NULL, &picture->format);
}
@@ -596,7 +595,6 @@ static int vd_control(vout_display_t *vd, int query, va_list args)
vout_display_sys_t *sys = vd->sys;
vout_display_cfg_t cfg;
const vout_display_cfg_t *tmp_cfg;
- video_format_t fmt;
const video_format_t *tmp_fmt;
int ret = VLC_EGENERIC;
@@ -634,22 +632,9 @@ static int vd_control(vout_display_t *vd, int query, va_list args)
break;
case VOUT_DISPLAY_CHANGE_SOURCE_ASPECT:
- fmt = vd->fmt;
- tmp_fmt = va_arg(args, const video_format_t *);
- fmt.i_sar_num = tmp_fmt->i_sar_num;
- fmt.i_sar_den = tmp_fmt->i_sar_den;
- if (configure_display(vd, NULL, &fmt) >= 0)
- ret = VLC_SUCCESS;
- break;
-
case VOUT_DISPLAY_CHANGE_SOURCE_CROP:
- fmt = vd->fmt;
tmp_fmt = va_arg(args, const video_format_t *);
- fmt.i_x_offset = tmp_fmt->i_x_offset;
- fmt.i_y_offset = tmp_fmt->i_y_offset;
- fmt.i_visible_width = tmp_fmt->i_visible_width;
- fmt.i_visible_height = tmp_fmt->i_visible_height;
- if (configure_display(vd, NULL, &fmt) >= 0)
+ if (configure_display(vd, NULL, tmp_fmt) >= 0)
ret = VLC_SUCCESS;
break;
@@ -984,8 +969,8 @@ static void maintain_phase_sync(vout_display_t *vd)
.hdr = { MMAL_PARAMETER_VIDEO_RENDER_STATS, sizeof(render_stats) },
};
int32_t frame_duration = 1000000 /
- ((double)vd->fmt.i_frame_rate /
- vd->fmt.i_frame_rate_base);
+ ((double)vd->source.i_frame_rate /
+ vd->source.i_frame_rate_base);
vout_display_sys_t *sys = vd->sys;
int32_t phase_offset;
MMAL_STATUS_T status;
--
2.1.2
More information about the vlc-devel
mailing list