[vlc-commits] [Git][videolan/vlc][master] 4 commits: display: keep the video placement internally
Steve Lhomme (@robUx4)
gitlab at videolan.org
Mon Apr 15 06:23:22 UTC 2024
Steve Lhomme pushed to branch master at VideoLAN / VLC
Commits:
1c46d14f by Steve Lhomme at 2024-04-15T05:51:40+00:00
display: keep the video placement internally
- - - - -
4ab62d06 by Steve Lhomme at 2024-04-15T05:51:40+00:00
display: notify display modules when the picture placement changed
In many cases that's what they really care about. Not the display size or display filled value.
- - - - -
0c10d951 by Steve Lhomme at 2024-04-15T05:51:40+00:00
display: remove redundant VOUT_DISPLAY_CHANGE_ZOOM
If the zoom of the video changed, the video placement has changed as well.
Display modules don't actually care about the aspect ratio, just where they're supposed to stretch the video.
- - - - -
65b81371 by Steve Lhomme at 2024-04-15T05:51:40+00:00
display: remove redundant VOUT_DISPLAY_CHANGE_DISPLAY_FILLED
If the display filling mode of the video changed, the video placement has changed as well.
Display modules don't actually care about the aspect ratio, just where they're supposed to stretch the video.
- - - - -
22 changed files:
- include/vlc_vout_display.h
- modules/hw/mmal/vout.c
- modules/video_output/android/display.c
- modules/video_output/apple/VLCSampleBufferDisplay.m
- modules/video_output/caca.c
- modules/video_output/caopengllayer.m
- modules/video_output/decklink.cpp
- modules/video_output/drm/display.c
- modules/video_output/flaschen.c
- modules/video_output/kva.c
- modules/video_output/libplacebo/display.c
- modules/video_output/macosx.m
- modules/video_output/opengl/display.c
- modules/video_output/splitter.c
- modules/video_output/vdummy.c
- modules/video_output/vmem.c
- modules/video_output/wayland/shm.c
- modules/video_output/win32/common.c
- modules/video_output/xcb/render.c
- modules/video_output/xcb/x11.c
- modules/video_output/yuv.c
- src/video_output/display.c
Changes:
=====================================
include/vlc_vout_display.h
=====================================
@@ -147,43 +147,34 @@ enum vout_display_query {
VOUT_DISPLAY_CHANGE_DISPLAY_SIZE,
/**
- * Notifies a change of the display fitting mode by the user.
+ * Notifies a change of the sample aspect ratio.
*
* \retval VLC_SUCCESS if the display handled the change
* \retval VLC_EGENERIC if a \ref vlc_display_operations::reset_pictures
* request is necessary
*/
- VOUT_DISPLAY_CHANGE_DISPLAY_FILLED,
+ VOUT_DISPLAY_CHANGE_SOURCE_ASPECT,
/**
- * Notifies a change of the user zoom factor.
+ * Notifies a change of the source cropping.
*
- * \retval VLC_SUCCESS if the display handled the change
- * \retval VLC_EGENERIC if a \ref vlc_display_operations::reset_pictures
- * request is necessary
- */
- VOUT_DISPLAY_CHANGE_ZOOM,
-
- /**
- * Notifies a change of the sample aspect ratio.
+ * The cropping requested is stored by source \ref video_format_t `i_x`/`y_offset`
+ * and `i_visible_width`/`height`
*
* \retval VLC_SUCCESS if the display handled the change
* \retval VLC_EGENERIC if a \ref vlc_display_operations::reset_pictures
* request is necessary
*/
- VOUT_DISPLAY_CHANGE_SOURCE_ASPECT,
+ VOUT_DISPLAY_CHANGE_SOURCE_CROP,
/**
- * Notifies a change of the source cropping.
- *
- * The cropping requested is stored by source \ref video_format_t `i_x`/`y_offset`
- * and `i_visible_width`/`height`
+ * Notified when the source placement in the display has changed
*
* \retval VLC_SUCCESS if the display handled the change
* \retval VLC_EGENERIC if a \ref vlc_display_operations::reset_pictures
* request is necessary
*/
- VOUT_DISPLAY_CHANGE_SOURCE_CROP,
+ VOUT_DISPLAY_CHANGE_SOURCE_PLACE,
};
/**
@@ -294,10 +285,9 @@ struct vlc_display_operations
* Reset the picture format handled by the module.
* This occurs after a
* \ref VOUT_DISPLAY_CHANGE_DISPLAY_SIZE,
- * \ref VOUT_DISPLAY_CHANGE_DISPLAY_FILLED,
- * \ref VOUT_DISPLAY_CHANGE_ZOOM,
- * \ref VOUT_DISPLAY_CHANGE_SOURCE_ASPECT or
- * \ref VOUT_DISPLAY_CHANGE_SOURCE_CROP
+ * \ref VOUT_DISPLAY_CHANGE_SOURCE_ASPECT,
+ * \ref VOUT_DISPLAY_CHANGE_SOURCE_CROP or
+ * \ref VOUT_DISPLAY_CHANGE_SOURCE_PLACE
* control query returns an error.
*
* \param ftmp video format that the module expects as input
=====================================
modules/hw/mmal/vout.c
=====================================
@@ -689,17 +689,13 @@ static int vd_control(vout_display_t *vd, int query)
case VOUT_DISPLAY_CHANGE_DISPLAY_SIZE:
case VOUT_DISPLAY_CHANGE_SOURCE_ASPECT:
case VOUT_DISPLAY_CHANGE_SOURCE_CROP:
+ case VOUT_DISPLAY_CHANGE_SOURCE_PLACE:
{
if (configure_display(vd, vd->source) >= 0)
ret = VLC_SUCCESS;
break;
}
- case VOUT_DISPLAY_CHANGE_ZOOM:
- msg_Warn(vd, "Unsupported control query %d", query);
- ret = VLC_SUCCESS;
- break;
-
default:
msg_Warn(vd, "Unknown control query %d", query);
break;
=====================================
modules/video_output/android/display.c
=====================================
@@ -77,8 +77,7 @@ static int subpicture_Control(vout_display_t *vd, int query)
case VOUT_DISPLAY_CHANGE_DISPLAY_SIZE:
vlc_gl_Resize(sub->gl, vd->cfg->display.width, vd->cfg->display.height);
// fallthrough
- case VOUT_DISPLAY_CHANGE_DISPLAY_FILLED:
- case VOUT_DISPLAY_CHANGE_ZOOM:
+ case VOUT_DISPLAY_CHANGE_SOURCE_PLACE:
{
sub->place_changed = true;
return VLC_SUCCESS;
@@ -422,8 +421,7 @@ static int Control(vout_display_t *vd, int query)
vd->cfg->display.height);
return VLC_SUCCESS;
}
- case VOUT_DISPLAY_CHANGE_ZOOM:
- case VOUT_DISPLAY_CHANGE_DISPLAY_FILLED:
+ case VOUT_DISPLAY_CHANGE_SOURCE_PLACE:
return VLC_SUCCESS;
default:
msg_Warn(vd, "Unknown request in android-display: %d", query);
=====================================
modules/video_output/apple/VLCSampleBufferDisplay.m
=====================================
@@ -599,10 +599,9 @@ static int Control (vout_display_t *vd, int query)
switch (query)
{
case VOUT_DISPLAY_CHANGE_DISPLAY_SIZE:
- case VOUT_DISPLAY_CHANGE_DISPLAY_FILLED:
- case VOUT_DISPLAY_CHANGE_ZOOM:
case VOUT_DISPLAY_CHANGE_SOURCE_ASPECT:
case VOUT_DISPLAY_CHANGE_SOURCE_CROP:
+ case VOUT_DISPLAY_CHANGE_SOURCE_PLACE:
break;
default:
msg_Err (vd, "Unhandled request %d", query);
=====================================
modules/video_output/caca.c
=====================================
@@ -187,9 +187,8 @@ static int Control(vout_display_t *vd, int query)
sys->dither = NULL;
/* fall through */
case VOUT_DISPLAY_CHANGE_DISPLAY_SIZE:
- case VOUT_DISPLAY_CHANGE_ZOOM:
- case VOUT_DISPLAY_CHANGE_DISPLAY_FILLED:
case VOUT_DISPLAY_CHANGE_SOURCE_ASPECT:
+ case VOUT_DISPLAY_CHANGE_SOURCE_PLACE:
return VLC_SUCCESS;
default:
=====================================
modules/video_output/caopengllayer.m
=====================================
@@ -554,10 +554,9 @@ static int Control (vout_display_t *vd, int query)
case VOUT_DISPLAY_CHANGE_DISPLAY_SIZE:
return VLC_SUCCESS;
- case VOUT_DISPLAY_CHANGE_DISPLAY_FILLED:
- case VOUT_DISPLAY_CHANGE_ZOOM:
case VOUT_DISPLAY_CHANGE_SOURCE_ASPECT:
case VOUT_DISPLAY_CHANGE_SOURCE_CROP:
+ case VOUT_DISPLAY_CHANGE_SOURCE_PLACE:
{
@synchronized(sys->videoLayer)
{
=====================================
modules/video_output/decklink.cpp
=====================================
@@ -765,10 +765,9 @@ static int ControlVideo(vout_display_t *vd, int query)
switch (query) {
case VOUT_DISPLAY_CHANGE_DISPLAY_SIZE:
- case VOUT_DISPLAY_CHANGE_DISPLAY_FILLED:
- case VOUT_DISPLAY_CHANGE_ZOOM:
case VOUT_DISPLAY_CHANGE_SOURCE_ASPECT:
case VOUT_DISPLAY_CHANGE_SOURCE_CROP:
+ case VOUT_DISPLAY_CHANGE_SOURCE_PLACE:
return VLC_SUCCESS;
}
return VLC_EGENERIC;
=====================================
modules/video_output/drm/display.c
=====================================
@@ -77,10 +77,9 @@ static int Control(vout_display_t *vd, int query)
switch (query) {
case VOUT_DISPLAY_CHANGE_DISPLAY_SIZE:
- case VOUT_DISPLAY_CHANGE_DISPLAY_FILLED:
- case VOUT_DISPLAY_CHANGE_ZOOM:
case VOUT_DISPLAY_CHANGE_SOURCE_ASPECT:
case VOUT_DISPLAY_CHANGE_SOURCE_CROP:
+ case VOUT_DISPLAY_CHANGE_SOURCE_PLACE:
return VLC_SUCCESS;
}
return VLC_EGENERIC;
=====================================
modules/video_output/flaschen.c
=====================================
@@ -233,10 +233,9 @@ static int Control(vout_display_t *vd, int query)
{
switch (query) {
case VOUT_DISPLAY_CHANGE_DISPLAY_SIZE:
- case VOUT_DISPLAY_CHANGE_ZOOM:
- case VOUT_DISPLAY_CHANGE_DISPLAY_FILLED:
case VOUT_DISPLAY_CHANGE_SOURCE_ASPECT:
case VOUT_DISPLAY_CHANGE_SOURCE_CROP:
+ case VOUT_DISPLAY_CHANGE_SOURCE_PLACE:
return VLC_SUCCESS;
default:
=====================================
modules/video_output/kva.c
=====================================
@@ -406,9 +406,8 @@ static int Control( vout_display_t *vd, int query )
return VLC_SUCCESS;
}
- case VOUT_DISPLAY_CHANGE_DISPLAY_FILLED:
- case VOUT_DISPLAY_CHANGE_ZOOM:
case VOUT_DISPLAY_CHANGE_SOURCE_ASPECT:
+ case VOUT_DISPLAY_CHANGE_SOURCE_PLACE:
{
vout_display_place_t place;
vout_display_PlacePicture(&place, vd->source, &vd->cfg->display);
=====================================
modules/video_output/libplacebo/display.c
=====================================
@@ -546,10 +546,9 @@ static int Control(vout_display_t *vd, int query)
*/
}
return VLC_SUCCESS;
- case VOUT_DISPLAY_CHANGE_DISPLAY_FILLED:
case VOUT_DISPLAY_CHANGE_SOURCE_ASPECT:
case VOUT_DISPLAY_CHANGE_SOURCE_CROP:
- case VOUT_DISPLAY_CHANGE_ZOOM:
+ case VOUT_DISPLAY_CHANGE_SOURCE_PLACE:
return VLC_SUCCESS;
default:
=====================================
modules/video_output/macosx.m
=====================================
@@ -352,10 +352,9 @@ static int Control (vout_display_t *vd, int query)
case VOUT_DISPLAY_CHANGE_DISPLAY_SIZE:
return VLC_SUCCESS;
- case VOUT_DISPLAY_CHANGE_DISPLAY_FILLED:
- case VOUT_DISPLAY_CHANGE_ZOOM:
case VOUT_DISPLAY_CHANGE_SOURCE_ASPECT:
case VOUT_DISPLAY_CHANGE_SOURCE_CROP:
+ case VOUT_DISPLAY_CHANGE_SOURCE_PLACE:
{
@synchronized(sys->glView) {
vout_display_cfg_t cfg;
=====================================
modules/video_output/opengl/display.c
=====================================
@@ -324,10 +324,9 @@ static int Control (vout_display_t *vd, int query)
case VOUT_DISPLAY_CHANGE_DISPLAY_SIZE:
vlc_gl_Resize (sys->gl, vd->cfg->display.width, vd->cfg->display.height);
// fallthrough
- case VOUT_DISPLAY_CHANGE_DISPLAY_FILLED:
- case VOUT_DISPLAY_CHANGE_ZOOM:
case VOUT_DISPLAY_CHANGE_SOURCE_ASPECT:
case VOUT_DISPLAY_CHANGE_SOURCE_CROP:
+ case VOUT_DISPLAY_CHANGE_SOURCE_PLACE:
{
struct vout_display_placement dp = vd->cfg->display;
=====================================
modules/video_output/splitter.c
=====================================
@@ -102,10 +102,9 @@ static int vlc_vidsplit_Control(vout_display_t *vd, int query)
switch (query) {
case VOUT_DISPLAY_CHANGE_DISPLAY_SIZE:
- case VOUT_DISPLAY_CHANGE_DISPLAY_FILLED:
- case VOUT_DISPLAY_CHANGE_ZOOM:
case VOUT_DISPLAY_CHANGE_SOURCE_ASPECT:
case VOUT_DISPLAY_CHANGE_SOURCE_CROP:
+ case VOUT_DISPLAY_CHANGE_SOURCE_PLACE:
return VLC_SUCCESS;
}
return VLC_EGENERIC;
=====================================
modules/video_output/vdummy.c
=====================================
@@ -139,10 +139,9 @@ static int Control(vout_display_t *vd, int query)
switch (query) {
case VOUT_DISPLAY_CHANGE_DISPLAY_SIZE:
- case VOUT_DISPLAY_CHANGE_DISPLAY_FILLED:
- case VOUT_DISPLAY_CHANGE_ZOOM:
case VOUT_DISPLAY_CHANGE_SOURCE_ASPECT:
case VOUT_DISPLAY_CHANGE_SOURCE_CROP:
+ case VOUT_DISPLAY_CHANGE_SOURCE_PLACE:
return VLC_SUCCESS;
}
return VLC_SUCCESS;
=====================================
modules/video_output/vmem.c
=====================================
@@ -252,10 +252,9 @@ static int Control(vout_display_t *vd, int query)
switch (query) {
case VOUT_DISPLAY_CHANGE_DISPLAY_SIZE:
- case VOUT_DISPLAY_CHANGE_DISPLAY_FILLED:
- case VOUT_DISPLAY_CHANGE_ZOOM:
case VOUT_DISPLAY_CHANGE_SOURCE_ASPECT:
case VOUT_DISPLAY_CHANGE_SOURCE_CROP:
+ case VOUT_DISPLAY_CHANGE_SOURCE_PLACE:
return VLC_SUCCESS;
}
return VLC_EGENERIC;
=====================================
modules/video_output/wayland/shm.c
=====================================
@@ -180,10 +180,9 @@ static int Control(vout_display_t *vd, int query)
switch (query)
{
case VOUT_DISPLAY_CHANGE_DISPLAY_SIZE:
- case VOUT_DISPLAY_CHANGE_DISPLAY_FILLED:
- case VOUT_DISPLAY_CHANGE_ZOOM:
case VOUT_DISPLAY_CHANGE_SOURCE_ASPECT:
case VOUT_DISPLAY_CHANGE_SOURCE_CROP:
+ case VOUT_DISPLAY_CHANGE_SOURCE_PLACE:
{
if (sys->viewport != NULL)
{
=====================================
modules/video_output/win32/common.c
=====================================
@@ -121,10 +121,9 @@ void CommonControl(vout_display_t *vd, display_win32_area_t *area, int query)
}
#endif /* WINAPI_PARTITION_DESKTOP */
// fallthrough
- case VOUT_DISPLAY_CHANGE_DISPLAY_FILLED:
- case VOUT_DISPLAY_CHANGE_ZOOM:
case VOUT_DISPLAY_CHANGE_SOURCE_ASPECT:
case VOUT_DISPLAY_CHANGE_SOURCE_CROP:
+ case VOUT_DISPLAY_CHANGE_SOURCE_PLACE:
CommonPlacePicture(vd, area);
break;
=====================================
modules/video_output/xcb/render.c
=====================================
@@ -394,10 +394,10 @@ static int Control(vout_display_t *vd, int query)
switch (query) {
case VOUT_DISPLAY_CHANGE_DISPLAY_SIZE:
- case VOUT_DISPLAY_CHANGE_DISPLAY_FILLED:
- case VOUT_DISPLAY_CHANGE_ZOOM:
case VOUT_DISPLAY_CHANGE_SOURCE_ASPECT:
- case VOUT_DISPLAY_CHANGE_SOURCE_CROP: {
+ case VOUT_DISPLAY_CHANGE_SOURCE_CROP:
+ case VOUT_DISPLAY_CHANGE_SOURCE_PLACE:
+ {
/* Update the window size */
uint32_t mask = XCB_CONFIG_WINDOW_WIDTH | XCB_CONFIG_WINDOW_HEIGHT;
const uint32_t values[] = {
=====================================
modules/video_output/xcb/x11.c
=====================================
@@ -222,10 +222,9 @@ static int Control(vout_display_t *vd, int query)
xcb_configure_window(sys->conn, sys->window, mask, values);
}
/* fall through */
- case VOUT_DISPLAY_CHANGE_ZOOM:
- case VOUT_DISPLAY_CHANGE_DISPLAY_FILLED:
case VOUT_DISPLAY_CHANGE_SOURCE_ASPECT:
case VOUT_DISPLAY_CHANGE_SOURCE_CROP:
+ case VOUT_DISPLAY_CHANGE_SOURCE_PLACE:
{
vout_display_place_t place;
=====================================
modules/video_output/yuv.c
=====================================
@@ -253,10 +253,9 @@ static int Control(vout_display_t *vd, int query)
switch (query) {
case VOUT_DISPLAY_CHANGE_DISPLAY_SIZE:
- case VOUT_DISPLAY_CHANGE_DISPLAY_FILLED:
- case VOUT_DISPLAY_CHANGE_ZOOM:
case VOUT_DISPLAY_CHANGE_SOURCE_ASPECT:
case VOUT_DISPLAY_CHANGE_SOURCE_CROP:
+ case VOUT_DISPLAY_CHANGE_SOURCE_PLACE:
return VLC_SUCCESS;
}
return VLC_EGENERIC;
=====================================
src/video_output/display.c
=====================================
@@ -253,10 +253,20 @@ typedef struct {
video_format_t display_fmt;
vlc_video_context *src_vctx;
+ vout_display_place_t src_place;
+
// filters to convert the vout source to fmt, NULL means no conversion is needed
struct pooled_filter_chain *converter;
} vout_display_priv_t;
+static bool PlaceVideoInDisplay(vout_display_priv_t *osys)
+{
+ struct vout_display_placement place_cfg = osys->cfg.display;
+ vout_display_place_t prev_place = osys->src_place;
+ vout_display_PlacePicture(&osys->src_place, &osys->source, &place_cfg);
+ return vout_display_PlaceEquals(&prev_place, &osys->src_place);
+}
+
/*****************************************************************************
* FIXME/TODO see how to have direct rendering here (interact with vout.c)
*****************************************************************************/
@@ -493,7 +503,16 @@ static int vout_UpdateSourceCrop(vout_display_t *vd)
osys->source.i_visible_height = bottom - top;
video_format_Print(VLC_OBJECT(vd), "CROPPED ", &osys->source);
- return vout_display_Control(vd, VOUT_DISPLAY_CHANGE_SOURCE_CROP);
+ bool place_changed = PlaceVideoInDisplay(osys);
+
+ int res1 = vout_display_Control(vd, VOUT_DISPLAY_CHANGE_SOURCE_CROP);
+ if (place_changed)
+ {
+ int res2 = vout_display_Control(vd, VOUT_DISPLAY_CHANGE_SOURCE_PLACE);
+ if (res2 != VLC_SUCCESS)
+ res1 = res2;
+ }
+ return res1;
}
static int vout_SetSourceAspect(vout_display_t *vd,
@@ -507,12 +526,21 @@ static int vout_SetSourceAspect(vout_display_t *vd,
osys->source.i_sar_den = sar_den;
}
+ bool place_changed = PlaceVideoInDisplay(osys);
+
err1 = vout_display_Control(vd, VOUT_DISPLAY_CHANGE_SOURCE_ASPECT);
/* If a crop ratio is requested, recompute the parameters */
if (osys->crop.mode != VOUT_CROP_NONE)
err2 = vout_UpdateSourceCrop(vd);
+ if (place_changed)
+ {
+ int res2 = vout_display_Control(vd, VOUT_DISPLAY_CHANGE_SOURCE_PLACE);
+ if (res2 != VLC_SUCCESS)
+ err1 = res2;
+ }
+
if (err1 != VLC_SUCCESS)
return err1;
@@ -569,7 +597,19 @@ void vout_display_SetSize(vout_display_t *vd, unsigned width, unsigned height)
osys->cfg.display.width = width;
osys->cfg.display.height = height;
- if (vout_display_Control(vd, VOUT_DISPLAY_CHANGE_DISPLAY_SIZE) != VLC_SUCCESS)
+
+ bool place_changed = PlaceVideoInDisplay(osys);
+
+ int res1 = vout_display_Control(vd, VOUT_DISPLAY_CHANGE_DISPLAY_SIZE);
+
+ if (place_changed)
+ {
+ int res2 = vout_display_Control(vd, VOUT_DISPLAY_CHANGE_SOURCE_PLACE);
+ if (res2 != VLC_SUCCESS)
+ res1 = res2;
+ }
+
+ if (res1 != VLC_SUCCESS)
vout_display_Reset(vd);
}
@@ -581,8 +621,14 @@ void vout_SetDisplayFitting(vout_display_t *vd, enum vlc_video_fitting fit)
return; /* nothing to do */
osys->cfg.display.fitting = fit;
- if (vout_display_Control(vd, VOUT_DISPLAY_CHANGE_DISPLAY_FILLED) != VLC_SUCCESS)
- vout_display_Reset(vd);
+
+ bool place_changed = PlaceVideoInDisplay(osys);
+ if (place_changed)
+ {
+ int res2 = vout_display_Control(vd, VOUT_DISPLAY_CHANGE_SOURCE_PLACE);
+ if (res2 != VLC_SUCCESS)
+ vout_display_Reset(vd);
+ }
}
void vout_SetDisplayZoom(vout_display_t *vd, unsigned num, unsigned den)
@@ -598,8 +644,14 @@ void vout_SetDisplayZoom(vout_display_t *vd, unsigned num, unsigned den)
return; /* zoom has no effects */
if (onum * den == num * oden)
return; /* zoom has not changed */
- if (vout_display_Control(vd, VOUT_DISPLAY_CHANGE_ZOOM) != VLC_SUCCESS)
- vout_display_Reset(vd);
+
+ bool place_changed = PlaceVideoInDisplay(osys);
+ if (place_changed)
+ {
+ int res2 = vout_display_Control(vd, VOUT_DISPLAY_CHANGE_SOURCE_PLACE);
+ if (res2 != VLC_SUCCESS)
+ vout_display_Reset(vd);
+ }
}
void vout_SetDisplayAspect(vout_display_t *vd, unsigned dar_num, unsigned dar_den)
@@ -739,6 +791,8 @@ vout_display_t *vout_display_New(vlc_object_t *parent,
if (owner)
vd->owner = *owner;
+ PlaceVideoInDisplay(osys);
+
if (module == NULL || module[0] == '\0')
module = "any";
View it on GitLab: https://code.videolan.org/videolan/vlc/-/compare/ffd9f613a74b2e0e039f9508044d0911cdc4dfaf...65b813712c929a12cdadff0fee1bb8e578224914
--
View it on GitLab: https://code.videolan.org/videolan/vlc/-/compare/ffd9f613a74b2e0e039f9508044d0911cdc4dfaf...65b813712c929a12cdadff0fee1bb8e578224914
You're receiving this email because of your account on code.videolan.org.
VideoLAN code repository instance
More information about the vlc-commits
mailing list