[vlc-commits] [Git][videolan/vlc][master] 3 commits: codec: videotoolbox: failed codec init should need cleanup
Steve Lhomme (@robUx4)
gitlab at videolan.org
Sat Feb 25 05:45:22 UTC 2023
Steve Lhomme pushed to branch master at VideoLAN / VLC
Commits:
b784f792 by Francois Cartegnie at 2023-02-25T05:22:27+00:00
codec: videotoolbox: failed codec init should need cleanup
calling dedicated resources releases assumes all init
allocations must succeed
- - - - -
979a8f93 by Francois Cartegnie at 2023-02-25T05:22:27+00:00
codec: videotoolbox: codec specific logical split
- - - - -
2f3f2253 by Francois Cartegnie at 2023-02-25T05:22:27+00:00
codec: videotoolbox: fix include path
- - - - -
2 changed files:
- modules/codec/videotoolbox/decoder.c
- modules/codec/videotoolbox/encoder.c
Changes:
=====================================
modules/codec/videotoolbox/decoder.c
=====================================
@@ -29,14 +29,14 @@
#import <vlc_common.h>
#import <vlc_plugin.h>
#import <vlc_codec.h>
-#import "hxxx_helper.h"
+#import "../hxxx_helper.h"
#import <vlc_bits.h>
#import <vlc_boxes.h>
-#import "vt_utils.h"
-#import "../packetizer/h264_nal.h"
-#import "../packetizer/h264_slice.h"
-#import "../packetizer/hxxx_nal.h"
-#import "../packetizer/hxxx_sei.h"
+#import "../vt_utils.h"
+#import "../../packetizer/h264_nal.h"
+#import "../../packetizer/h264_slice.h"
+#import "../../packetizer/hxxx_nal.h"
+#import "../../packetizer/hxxx_sei.h"
#import <VideoToolbox/VideoToolbox.h>
#import <VideoToolbox/VTErrors.h>
@@ -111,11 +111,10 @@ struct frame_info_t
typedef struct decoder_sys_t
{
CMVideoCodecType codec;
- struct hxxx_helper hh;
- /* Codec specific callbacks */
+ /* Codec specific callbacks and contexts */
bool (*pf_codec_init)(decoder_t *);
- void (*pf_codec_clean)(decoder_t *);
+ void (*pf_codec_clean)(void *);
bool (*pf_codec_supported)(decoder_t *);
bool (*pf_late_start)(decoder_t *);
block_t* (*pf_process_block)(decoder_t *,
@@ -126,8 +125,8 @@ typedef struct decoder_sys_t
CFDictionaryRef (*pf_copy_extradata)(decoder_t *);
bool (*pf_fill_reorder_info)(decoder_t *, const block_t *,
frame_info_t *);
-
- /* !Codec specific callbacks */
+ void *p_codec_context;
+ /* !Codec specific callbacks and contexts */
enum
{
@@ -161,8 +160,6 @@ typedef struct decoder_sys_t
OSType i_cvpx_format;
bool b_cvpx_format_forced;
- h264_poc_context_t h264_pocctx;
- hevc_poc_ctx_t hevc_pocctx;
date_t pts;
vlc_video_context *vctx;
@@ -246,57 +243,65 @@ static void pic_pacer_WaitAllocatableSlot(struct pic_pacer *pic_pacer)
#pragma mark - start & stop
-/* Codec Specific */
-
-static void HXXXGetBestChroma(decoder_t *p_dec)
+static OSType GetBestChroma(uint8_t i_chroma_format, uint8_t i_depth_luma,
+ uint8_t i_depth_chroma)
{
- decoder_sys_t *p_sys = p_dec->p_sys;
-
- if (p_sys->i_cvpx_format != 0 || p_sys->b_cvpx_format_forced)
- return;
-
- uint8_t i_chroma_format, i_depth_luma, i_depth_chroma;
- if (hxxx_helper_get_chroma_chroma(&p_sys->hh, &i_chroma_format, &i_depth_luma,
- &i_depth_chroma) != VLC_SUCCESS)
- return;
-
if (i_chroma_format == 1 /* YUV 4:2:0 */)
{
if (i_depth_luma == 8 && i_depth_chroma == 8)
- p_sys->i_cvpx_format = kCVPixelFormatType_420YpCbCr8BiPlanarVideoRange;
- else if (i_depth_luma == 10 && i_depth_chroma == 10)
+ return kCVPixelFormatType_420YpCbCr8BiPlanarVideoRange;
+ if (i_depth_luma == 10 && i_depth_chroma == 10)
{
#if !TARGET_OS_IPHONE
if (deviceSupportsHEVC()) /* 42010bit went with HEVC on macOS */
- p_sys->i_cvpx_format = kCVPixelFormatType_420YpCbCr10BiPlanarVideoRange;
- else
+ return kCVPixelFormatType_420YpCbCr10BiPlanarVideoRange;
#endif
/* Force BGRA output (and let VT handle the tone mapping) since the
* Apple openGL* implementation can't handle 16 bit textures. This
* is the case for iOS and some macOS devices (ones that are not
* handling HEVC). */
- p_sys->i_cvpx_format = kCVPixelFormatType_32BGRA;
+ return kCVPixelFormatType_32BGRA;
}
else if (i_depth_luma > 10 && i_depth_chroma > 10)
{
/* XXX: The apple openGL implementation doesn't support 12 or 16
* bit rendering */
- p_sys->i_cvpx_format = kCVPixelFormatType_32BGRA;
+ return kCVPixelFormatType_32BGRA;
}
}
+ return 0;
+}
+
+/* Codec Specific */
+
+/** H26x Specific */
+static OSType GetBestChromaFromHxxx(struct hxxx_helper *hh)
+{
+ uint8_t a, b, c;
+ if (hxxx_helper_get_chroma_chroma(hh, &a, &b, &c) != VLC_SUCCESS)
+ return 0;
+ return GetBestChroma(a, b, c);
}
+/** H264 Specific */
+
+struct vt_h264_context
+{
+ struct hxxx_helper hh;
+ h264_poc_context_t poc;
+};
+
static void GetxPSH264(uint8_t i_pps_id, void *priv,
const h264_sequence_parameter_set_t **pp_sps,
const h264_picture_parameter_set_t **pp_pps)
{
- decoder_sys_t *p_sys = priv;
+ struct vt_h264_context *h264ctx = priv;
- *pp_pps = p_sys->hh.h264.pps_list[i_pps_id].h264_pps;
+ *pp_pps = h264ctx->hh.h264.pps_list[i_pps_id].h264_pps;
if (*pp_pps == NULL)
*pp_sps = NULL;
else
- *pp_sps = p_sys->hh.h264.sps_list[(*pp_pps)->i_sps_id].h264_sps;
+ *pp_sps = h264ctx->hh.h264.sps_list[(*pp_pps)->i_sps_id].h264_sps;
}
struct sei_callback_h264_s
@@ -331,9 +336,10 @@ static bool FillReorderInfoH264(decoder_t *p_dec, const block_t *p_block,
frame_info_t *p_info)
{
decoder_sys_t *p_sys = p_dec->p_sys;
+ struct vt_h264_context *h264ctx = p_sys->p_codec_context;
hxxx_iterator_ctx_t itctx;
hxxx_iterator_init(&itctx, p_block->p_buffer, p_block->i_buffer,
- p_sys->hh.i_output_nal_length_size);
+ h264ctx->hh.i_output_nal_length_size);
const uint8_t *p_nal; size_t i_nal;
struct
@@ -352,16 +358,16 @@ static bool FillReorderInfoH264(decoder_t *p_dec, const block_t *p_block,
if (i_nal_type <= H264_NAL_SLICE_IDR && i_nal_type != H264_NAL_UNKNOWN)
{
h264_slice_t slice;
- if (!h264_decode_slice(p_nal, i_nal, GetxPSH264, p_sys, &slice))
+ if (!h264_decode_slice(p_nal, i_nal, GetxPSH264, h264ctx, &slice))
return false;
const h264_sequence_parameter_set_t *p_sps;
const h264_picture_parameter_set_t *p_pps;
- GetxPSH264(slice.i_pic_parameter_set_id, p_sys, &p_sps, &p_pps);
+ GetxPSH264(slice.i_pic_parameter_set_id, h264ctx, &p_sps, &p_pps);
if (p_sps)
{
int bFOC;
- h264_compute_poc(p_sps, &slice, &p_sys->h264_pocctx,
+ h264_compute_poc(p_sps, &slice, &h264ctx->poc,
&p_info->i_poc, &p_info->i_foc, &bFOC);
p_info->b_keyframe = slice.type == H264_SLICE_TYPE_I;
@@ -413,44 +419,55 @@ static bool FillReorderInfoH264(decoder_t *p_dec, const block_t *p_block,
static block_t *ProcessBlockH264(decoder_t *p_dec, block_t *p_block, bool *pb_config_changed)
{
decoder_sys_t *p_sys = p_dec->p_sys;
- p_block = hxxx_helper_process_block(&p_sys->hh, p_block);
- *pb_config_changed = hxxx_helper_has_new_config(&p_sys->hh);
+ struct vt_h264_context *h264ctx = p_sys->p_codec_context;
+ p_block = hxxx_helper_process_block(&h264ctx->hh, p_block);
+ *pb_config_changed = hxxx_helper_has_new_config(&h264ctx->hh);
return p_block;
}
-
-static bool InitH264(decoder_t *p_dec)
+static void CleanH264(void *p_codec_context)
{
- decoder_sys_t *p_sys = p_dec->p_sys;
- h264_poc_context_init(&p_sys->h264_pocctx);
- hxxx_helper_init(&p_sys->hh, VLC_OBJECT(p_dec),
- p_dec->fmt_in->i_codec, 0, 4);
- return hxxx_helper_set_extra(&p_sys->hh, p_dec->fmt_in->p_extra,
- p_dec->fmt_in->i_extra) == VLC_SUCCESS;
+ struct vt_h264_context *h264ctx = p_codec_context;
+ hxxx_helper_clean(&h264ctx->hh);
+ free(h264ctx);
}
-static void CleanH264(decoder_t *p_dec)
+static bool InitH264(decoder_t *p_dec)
{
decoder_sys_t *p_sys = p_dec->p_sys;
- hxxx_helper_clean(&p_sys->hh);
+ struct vt_h264_context *ctx = malloc(sizeof(*ctx));
+ if(!ctx)
+ return false;
+ h264_poc_context_init(&ctx->poc);
+ hxxx_helper_init(&ctx->hh, VLC_OBJECT(p_dec),
+ p_dec->fmt_in->i_codec, 0, 4);
+ if(hxxx_helper_set_extra(&ctx->hh, p_dec->fmt_in->p_extra,
+ p_dec->fmt_in->i_extra) != VLC_SUCCESS)
+ {
+ CleanH264(ctx);
+ return false;
+ }
+ p_sys->p_codec_context = ctx;
+ return true;
}
static CFDictionaryRef CopyDecoderExtradataH264(decoder_t *p_dec)
{
decoder_sys_t *p_sys = p_dec->p_sys;
+ struct vt_h264_context *h264ctx = p_sys->p_codec_context;
CFDictionaryRef extradata = NULL;
- if (p_dec->fmt_in->i_extra && p_sys->hh.i_input_nal_length_size)
+ if (p_dec->fmt_in->i_extra && h264ctx->hh.i_input_nal_length_size)
{
/* copy DecoderConfiguration */
extradata = ExtradataInfoCreate(CFSTR("avcC"),
p_dec->fmt_in->p_extra,
p_dec->fmt_in->i_extra);
}
- else if (hxxx_helper_has_config(&p_sys->hh))
+ else if (hxxx_helper_has_config(&h264ctx->hh))
{
/* build DecoderConfiguration from gathered */
- block_t *p_avcC = hxxx_helper_get_extradata_block(&p_sys->hh);
+ block_t *p_avcC = hxxx_helper_get_extradata_block(&h264ctx->hh);
if (p_avcC)
{
extradata = ExtradataInfoCreate(CFSTR("avcC"),
@@ -465,9 +482,10 @@ static CFDictionaryRef CopyDecoderExtradataH264(decoder_t *p_dec)
static bool CodecSupportedH264(decoder_t *p_dec)
{
decoder_sys_t *p_sys = p_dec->p_sys;
+ struct vt_h264_context *h264ctx = p_sys->p_codec_context;
uint8_t i_profile, i_level;
- if (hxxx_helper_get_current_profile_level(&p_sys->hh, &i_profile, &i_level))
+ if (hxxx_helper_get_current_profile_level(&h264ctx->hh, &i_profile, &i_level))
return true;
switch (i_profile) {
@@ -504,7 +522,8 @@ static bool CodecSupportedH264(decoder_t *p_dec)
return false;
}
- HXXXGetBestChroma(p_dec);
+ if (p_sys->i_cvpx_format == 0 && !p_sys->b_cvpx_format_forced)
+ p_sys->i_cvpx_format = GetBestChromaFromHxxx(&h264ctx->hh);
return true;
}
@@ -512,12 +531,14 @@ static bool CodecSupportedH264(decoder_t *p_dec)
static bool LateStartH264(decoder_t *p_dec)
{
decoder_sys_t *p_sys = p_dec->p_sys;
- return (p_dec->fmt_in->i_extra == 0 && !hxxx_helper_has_config(&p_sys->hh));
+ struct vt_h264_context *h264ctx = p_sys->p_codec_context;
+ return (p_dec->fmt_in->i_extra == 0 && !hxxx_helper_has_config(&h264ctx->hh));
}
static bool ConfigureVoutH264(decoder_t *p_dec)
{
decoder_sys_t *p_sys = p_dec->p_sys;
+ struct vt_h264_context *h264ctx = p_sys->p_codec_context;
if (p_dec->fmt_in->video.primaries == COLOR_PRIMARIES_UNDEF)
{
@@ -525,7 +546,7 @@ static bool ConfigureVoutH264(decoder_t *p_dec)
video_transfer_func_t transfer;
video_color_space_t colorspace;
video_color_range_t full_range;
- if (hxxx_helper_get_colorimetry(&p_sys->hh,
+ if (hxxx_helper_get_colorimetry(&h264ctx->hh,
&primaries,
&transfer,
&colorspace,
@@ -542,7 +563,7 @@ static bool ConfigureVoutH264(decoder_t *p_dec)
{
unsigned i_width, i_height, i_vis_width, i_vis_height;
if (VLC_SUCCESS ==
- hxxx_helper_get_current_picture_size(&p_sys->hh,
+ hxxx_helper_get_current_picture_size(&h264ctx->hh,
&i_width, &i_height,
&i_vis_width, &i_vis_height))
{
@@ -558,7 +579,7 @@ static bool ConfigureVoutH264(decoder_t *p_dec)
{
int i_sar_num, i_sar_den;
if (VLC_SUCCESS ==
- hxxx_helper_get_current_sar(&p_sys->hh, &i_sar_num, &i_sar_den))
+ hxxx_helper_get_current_sar(&h264ctx->hh, &i_sar_num, &i_sar_den))
{
p_dec->fmt_out.video.i_sar_num = i_sar_num;
p_dec->fmt_out.video.i_sar_den = i_sar_den;
@@ -572,7 +593,8 @@ static bool VideoToolboxNeedsToRestartH264(decoder_t *p_dec,
VTDecompressionSessionRef session)
{
decoder_sys_t *p_sys = p_dec->p_sys;
- const struct hxxx_helper *hh = &p_sys->hh;
+ struct vt_h264_context *h264ctx = p_sys->p_codec_context;
+ const struct hxxx_helper *hh = &h264ctx->hh;
unsigned w, h, vw, vh;
int sarn, sard;
@@ -608,26 +630,48 @@ static bool VideoToolboxNeedsToRestartH264(decoder_t *p_dec,
return b_ret;
}
+/** HEVC Specific */
+
+struct vt_hevc_context
+{
+ struct hxxx_helper hh;
+ hevc_poc_ctx_t poc;
+};
+
+static void CleanHEVC(void *p_codec_context)
+{
+ struct vt_hevc_context *hevcctx = p_codec_context;
+ hxxx_helper_clean(&hevcctx->hh);
+ free(hevcctx);
+}
+
static bool InitHEVC(decoder_t *p_dec)
{
decoder_sys_t *p_sys = p_dec->p_sys;
- hevc_poc_cxt_init(&p_sys->hevc_pocctx);
- hxxx_helper_init(&p_sys->hh, VLC_OBJECT(p_dec),
+ struct vt_hevc_context *ctx = malloc(sizeof(*ctx));
+ if(!ctx)
+ return false;
+ hevc_poc_cxt_init(&ctx->poc);
+ hxxx_helper_init(&ctx->hh, VLC_OBJECT(p_dec),
p_dec->fmt_in->i_codec, 0, 4);
- return hxxx_helper_set_extra(&p_sys->hh, p_dec->fmt_in->p_extra,
- p_dec->fmt_in->i_extra) == VLC_SUCCESS;
+ if(hxxx_helper_set_extra(&ctx->hh, p_dec->fmt_in->p_extra,
+ p_dec->fmt_in->i_extra) != VLC_SUCCESS)
+ {
+ CleanHEVC(ctx);
+ return false;
+ }
+ p_sys->p_codec_context = ctx;
+ return true;
}
-#define CleanHEVC CleanH264
-
static void GetxPSHEVC(uint8_t i_id, void *priv,
hevc_picture_parameter_set_t **pp_pps,
hevc_sequence_parameter_set_t **pp_sps,
hevc_video_parameter_set_t **pp_vps)
{
- decoder_sys_t *p_sys = priv;
+ struct vt_hevc_context *hevcctx = priv;
- *pp_pps = p_sys->hh.hevc.pps_list[i_id].hevc_pps;
+ *pp_pps = hevcctx->hh.hevc.pps_list[i_id].hevc_pps;
if (*pp_pps == NULL)
{
*pp_vps = NULL;
@@ -636,13 +680,13 @@ static void GetxPSHEVC(uint8_t i_id, void *priv,
else
{
uint8_t i_sps_id = hevc_get_pps_sps_id(*pp_pps);
- *pp_sps = p_sys->hh.hevc.sps_list[i_sps_id].hevc_sps;
+ *pp_sps = hevcctx->hh.hevc.sps_list[i_sps_id].hevc_sps;
if (*pp_sps == NULL)
*pp_vps = NULL;
else
{
uint8_t i_vps_id = hevc_get_sps_vps_id(*pp_sps);
- *pp_vps = p_sys->hh.hevc.vps_list[i_vps_id].hevc_vps;
+ *pp_vps = hevcctx->hh.hevc.vps_list[i_vps_id].hevc_vps;
}
}
}
@@ -669,9 +713,10 @@ static bool FillReorderInfoHEVC(decoder_t *p_dec, const block_t *p_block,
frame_info_t *p_info)
{
decoder_sys_t *p_sys = p_dec->p_sys;
+ struct vt_hevc_context *hevcctx = p_sys->p_codec_context;
hxxx_iterator_ctx_t itctx;
hxxx_iterator_init(&itctx, p_block->p_buffer, p_block->i_buffer,
- p_sys->hh.i_output_nal_length_size);
+ hevcctx->hh.i_output_nal_length_size);
const uint8_t *p_nal; size_t i_nal;
struct
@@ -690,7 +735,7 @@ static bool FillReorderInfoHEVC(decoder_t *p_dec, const block_t *p_block,
if (i_nal_type <= HEVC_NAL_IRAP_VCL23)
{
hevc_slice_segment_header_t *p_sli =
- hevc_decode_slice_header(p_nal, i_nal, true, GetxPSHEVC, p_sys);
+ hevc_decode_slice_header(p_nal, i_nal, true, GetxPSHEVC, hevcctx);
if (!p_sli)
return false;
@@ -704,7 +749,7 @@ static bool FillReorderInfoHEVC(decoder_t *p_dec, const block_t *p_block,
hevc_sequence_parameter_set_t *p_sps;
hevc_picture_parameter_set_t *p_pps;
hevc_video_parameter_set_t *p_vps;
- GetxPSHEVC(hevc_get_slice_pps_id(p_sli), p_sys, &p_pps, &p_sps, &p_vps);
+ GetxPSHEVC(hevc_get_slice_pps_id(p_sli), hevcctx, &p_pps, &p_sps, &p_vps);
if (p_sps)
{
struct hevc_sei_callback_s sei;
@@ -712,7 +757,7 @@ static bool FillReorderInfoHEVC(decoder_t *p_dec, const block_t *p_block,
sei.p_timing = NULL;
const int POC = hevc_compute_picture_order_count(p_sps, p_sli,
- &p_sys->hevc_pocctx);
+ &hevcctx->poc);
for (size_t i=0; i<i_sei_count; i++)
HxxxParseSEI(sei_array[i].p_nal, sei_array[i].i_nal,
@@ -764,19 +809,20 @@ static bool FillReorderInfoHEVC(decoder_t *p_dec, const block_t *p_block,
static CFDictionaryRef CopyDecoderExtradataHEVC(decoder_t *p_dec)
{
decoder_sys_t *p_sys = p_dec->p_sys;
+ struct vt_hevc_context *hevcctx = p_sys->p_codec_context;
CFDictionaryRef extradata = NULL;
- if (p_dec->fmt_in->i_extra && p_sys->hh.i_input_nal_length_size)
+ if (p_dec->fmt_in->i_extra && hevcctx->hh.i_input_nal_length_size)
{
/* copy DecoderConfiguration */
extradata = ExtradataInfoCreate(CFSTR("hvcC"),
p_dec->fmt_in->p_extra,
p_dec->fmt_in->i_extra);
}
- else if (hxxx_helper_has_config(&p_sys->hh))
+ else if (hxxx_helper_has_config(&hevcctx->hh))
{
/* build DecoderConfiguration from gathered */
- block_t *p_hvcC = hxxx_helper_get_extradata_block(&p_sys->hh);
+ block_t *p_hvcC = hxxx_helper_get_extradata_block(&hevcctx->hh);
if (p_hvcC)
{
extradata = ExtradataInfoCreate(CFSTR("hvcC"),
@@ -791,13 +837,16 @@ static CFDictionaryRef CopyDecoderExtradataHEVC(decoder_t *p_dec)
static bool LateStartHEVC(decoder_t *p_dec)
{
decoder_sys_t *p_sys = p_dec->p_sys;
- return (p_dec->fmt_in->i_extra == 0 && !hxxx_helper_has_config(&p_sys->hh));
+ struct vt_hevc_context *hevcctx = p_sys->p_codec_context;
+ return (p_dec->fmt_in->i_extra == 0 && !hxxx_helper_has_config(&hevcctx->hh));
}
static bool CodecSupportedHEVC(decoder_t *p_dec)
{
- HXXXGetBestChroma(p_dec);
-
+ decoder_sys_t *p_sys = p_dec->p_sys;
+ struct vt_hevc_context *hevcctx = p_sys->p_codec_context;
+ if (p_sys->i_cvpx_format == 0 && !p_sys->b_cvpx_format_forced)
+ p_sys->i_cvpx_format = GetBestChromaFromHxxx(&hevcctx->hh);
return true;
}
@@ -1389,7 +1438,7 @@ static void CloseDecoder(vlc_object_t *p_this)
StopVideoToolbox(p_dec);
if (p_sys->pf_codec_clean)
- p_sys->pf_codec_clean(p_dec);
+ p_sys->pf_codec_clean(p_sys->p_codec_context);
vlc_video_context_Release(p_sys->vctx);
@@ -1511,6 +1560,7 @@ static int OpenDecoder(vlc_object_t *p_this)
if (p_sys->pf_codec_init && !p_sys->pf_codec_init(p_dec))
{
+ p_sys->pf_codec_clean = NULL; /* avoid double free */
CloseDecoder(p_this);
return VLC_EGENERIC;
}
=====================================
modules/codec/videotoolbox/encoder.c
=====================================
@@ -28,14 +28,14 @@
#import <vlc_common.h>
#import <vlc_plugin.h>
#import <vlc_codec.h>
-#import "hxxx_helper.h"
+#import "../hxxx_helper.h"
#import <vlc_bits.h>
#import <vlc_threads.h>
-#import "vt_utils.h"
-#import "../packetizer/h264_nal.h"
-#import "../packetizer/h264_slice.h"
-#import "../packetizer/hxxx_nal.h"
-#import "../packetizer/hxxx_sei.h"
+#import "../vt_utils.h"
+#import "../../packetizer/h264_nal.h"
+#import "../../packetizer/h264_slice.h"
+#import "../../packetizer/hxxx_nal.h"
+#import "../../packetizer/hxxx_sei.h"
#import <VideoToolbox/VideoToolbox.h>
#import <VideoToolbox/VTErrors.h>
View it on GitLab: https://code.videolan.org/videolan/vlc/-/compare/805ef1126cd31a0bc09945221ef1e97b862aab4b...2f3f2253adfd612a507410755c64a13e437ec602
--
View it on GitLab: https://code.videolan.org/videolan/vlc/-/compare/805ef1126cd31a0bc09945221ef1e97b862aab4b...2f3f2253adfd612a507410755c64a13e437ec602
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