Skip to content

videodecoder: fix copying buffer metas

Ensure the buffer is writable before copying metas.

This can be reproduced with an H264 stream with SEI's and the following pipeline

gst-launch-1.0 filesrc location=file.h264 ! h264parse ! "video/x-h264, alignment=nal, stream-format=byte-stream" ! tee name=t ! queue ! avdec_h264 ! fakesink .t ! queue ! fakesink

This crashes in gst_buffer_add_video_sei_user_data_unregistered_meta (or any other meta that checks g_assert (meta != NULL)).

The stack trace with G_DEBUG=faltal-warnings:

g_logv(const char *,GLogLevelFlags,const char *,char *) 0x00007ffac7cdd0ee
g_log(const char *,GLogLevelFlags,const char *,...) 0x00007ffac7cdb668
g_return_if_fail_warning(const char *,const char *,const char *) 0x00007ffac7cdd33d
gst_buffer_add_meta(_GstBuffer *,const _GstMetaInfo *,void *) 0x00007ffabc48bd93
gst_buffer_add_video_sei_user_data_unregistered_meta(_GstBuffer *,unsigned char *,unsigned char *,unsigned long long) 0x00007ffac6e3aafd
gst_video_sei_user_data_unregistered_meta_transform(_GstBuffer *,_GstMeta *,_GstBuffer *,unsigned int,void *) 0x00007ffac6e3ad72
foreach_metadata(_GstBuffer *,_GstMeta **,void *) 0x00007ffac6de3da9
gst_buffer_foreach_meta(_GstBuffer *,int (*)(_GstBuffer *, _GstMeta **, void *),void *) 0x00007ffabc48d070
[Inlined] gst_video_decoder_copy_metas(_GstVideoDecoder *,_GstVideoCodecFrame *,_GstBuffer *,_GstBuffer *) 0x00007ffac6de509a
gst_video_decoder_chain_forward(_GstVideoDecoder *,_GstBuffer *,int) 0x00007ffac6de506c
gst_video_decoder_chain(_GstPad *,_GstObject *,_GstBuffer *) 0x00007ffac6de4ebd
gst_pad_chain_data_unchecked(_GstPad *,GstPadProbeType,void *) 0x00007ffabc4ce203
gst_pad_push_data(_GstPad *,GstPadProbeType,void *) 0x00007ffabc4d3a1e
gst_pad_push(_GstPad *,_GstBuffer *) 0x00007ffabc4d346c
[Inlined] gst_tee_do_push(_GstTee *,_GstPad *,void *,int) 0x00007ffac4d51cf2
gst_tee_handle_data(_GstTee *,void *,int) 0x00007ffac4d51cc3
gst_tee_chain(_GstPad *,_GstObject *,_GstBuffer *) 0x00007ffac4d51058
gst_pad_chain_data_unchecked(_GstPad *,GstPadProbeType,void *) 0x00007ffabc4ce203
gst_pad_push_data(_GstPad *,GstPadProbeType,void *) 0x00007ffabc4d3a1e
gst_pad_push(_GstPad *,_GstBuffer *) 0x00007ffabc4d346c
gst_base_transform_chain(_GstPad *,_GstObject *,_GstBuffer *) 0x00007ffac6b6f785
gst_pad_chain_data_unchecked(_GstPad *,GstPadProbeType,void *) 0x00007ffabc4ce203
gst_pad_push_data(_GstPad *,GstPadProbeType,void *) 0x00007ffabc4d3a1e
gst_pad_push(_GstPad *,_GstBuffer *) 0x00007ffabc4d346c
gst_base_parse_push_frame(_GstBaseParse *,GstBaseParseFrame *) 0x00007ffac6b4bf43
gst_base_parse_finish_frame(_GstBaseParse *,GstBaseParseFrame *,int) 0x00007ffac6b4645a
gst_h264_parse_handle_frame(_GstBaseParse *,GstBaseParseFrame *,int *) 0x00007ffac915b112
gst_base_parse_handle_buffer(_GstBaseParse *,_GstBuffer *,int *,int *) 0x00007ffac6b477ba
gst_base_parse_chain(_GstPad *,_GstObject *,_GstBuffer *) 0x00007ffac6b4380c
gst_pad_chain_data_unchecked(_GstPad *,GstPadProbeType,void *) 0x00007ffabc4ce203
gst_pad_push_data(_GstPad *,GstPadProbeType,void *) 0x00007ffabc4d3a1e
gst_pad_push(_GstPad *,_GstBuffer *) 0x00007ffabc4d346c
gst_proxy_pad_chain_default(_GstPad *,_GstObject *,_GstBuffer *) 0x00007ffabc4b957e
gst_pad_chain_data_unchecked(_GstPad *,GstPadProbeType,void *) 0x00007ffabc4ce203
gst_pad_push_data(_GstPad *,GstPadProbeType,void *) 0x00007ffabc4d3a1e
gst_pad_push(_GstPad *,_GstBuffer *) 0x00007ffabc4d346c
gst_video_encoder_finish_frame(_GstVideoEncoder *,_GstVideoCodecFrame *) 0x00007ffac6df49ff
gst_lynx_enc_handle_frame(_GstVideoEncoder *, _GstVideoCodecFrame *) encoder_process.c:186
gst_video_encoder_chain(_GstPad *,_GstObject *,_GstBuffer *) 0x00007ffac6df39f0
gst_pad_chain_data_unchecked(_GstPad *,GstPadProbeType,void *) 0x00007ffabc4ce203
gst_pad_push_data(_GstPad *,GstPadProbeType,void *) 0x00007ffabc4d3a1e
gst_pad_push(_GstPad *,_GstBuffer *) 0x00007ffabc4d346c
gst_base_transform_chain(_GstPad *,_GstObject *,_GstBuffer *) 0x00007ffac6b6f785
gst_pad_chain_data_unchecked(_GstPad *,GstPadProbeType,void *) 0x00007ffabc4ce203
gst_pad_push_data(_GstPad *,GstPadProbeType,void *) 0x00007ffabc4d3a1e
gst_pad_push(_GstPad *,_GstBuffer *) 0x00007ffabc4d346c
gst_base_src_loop(_GstPad *) 0x00007ffac6b69684
gst_task_func(_GstTask *) 0x00007ffabc50d07c
g_thread_pool_thread_proxy(void *) 0x00007ffac7d0487b
g_thread_proxy(void *) 0x00007ffac7d03902
g_thread_win32_proxy(void *) 0x00007ffac7d38277
Edited by Andoni Morales Alastruey

Merge request reports