mltframework / mltframework/mlt
[TSAN] Data race steaming from mlt_profile_from_producer
Nobody has claimed this yet.
- Dominant language
- C
- Stars
- 1.9k
- Forks
- 387
- Avg merge
- 17h 28m
- Merged PRs (30d)
- 8
Description
I'm trying to catalog and fix (the best I can) the numerous data races in mlt.
This one happens by simply running "melt video.mp4"
WARNING: ThreadSanitizer: data race (pid=344)
Write of size 8 at 0x7b100000a840 by main thread (mutexes: write M2682):
#0 free <null> (melt+0x6f54f)
#1 buffer_replace /home/nicolas/Documents/Developpement/Projets/FFmpeg/libavutil/buffer.c:117:9 (libavutil.so.56+0x1877c)
#2 av_buffer_unref /home/nicolas/Documents/Developpement/Projets/FFmpeg/libavutil/buffer.c:130:5 (libavutil.so.56+0x1877c)
#3 mlt_frame_get_image /home/nicolas/Documents/Developpement/Projets/mlt/src/framework/mlt_frame.c:620:11 (libmlt.so.6+0x27286)
#4 filter_get_image /home/nicolas/Documents/Developpement/Projets/mlt/src/modules/xine/filter_deinterlace.c:251:17 (libmltxine.so+0xfd1e)
#5 mlt_frame_get_image /home/nicolas/Documents/Developpement/Projets/mlt/src/framework/mlt_frame.c:620:11 (libmlt.so.6+0x27286)
#6 get_image /home/nicolas/Documents/Developpement/Projets/mlt/src/modules/core/filter_fieldorder.c:33:14 (libmltcore.so+0x3f494)
#7 mlt_frame_get_image /home/nicolas/Documents/Developpement/Projets/mlt/src/framework/mlt_frame.c:620:11 (libmlt.so.6+0x27286)
#8 filter_get_image /home/nicolas/Documents/Developpement/Projets/mlt/src/modules/core/filter_crop.c:76:10 (libmltcore.so+0x3afe2)
#9 mlt_frame_get_image /home/nicolas/Documents/Developpement/Projets/mlt/src/framework/mlt_frame.c:620:11 (libmlt.so.6+0x27286)
#10 filter_get_image /home/nicolas/Documents/Developpement/Projets/mlt/src/modules/core/filter_rescale.c:221:3 (libmltcore.so+0x54eae)
#11 mlt_frame_get_image /home/nicolas/Documents/Developpement/Projets/mlt/src/framework/mlt_frame.c:620:11 (libmlt.so.6+0x27286)
#12 filter_get_image /home/nicolas/Documents/Developpement/Projets/mlt/src/modules/core/filter_resize.c:225:10 (libmltcore.so+0x5637b)
#13 mlt_frame_get_image /home/nicolas/Documents/Developpement/Projets/mlt/src/framework/mlt_frame.c:620:11 (libmlt.so.6+0x27286)
#14 producer_get_image /home/nicolas/Documents/Developpement/Projets/mlt/src/framework/mlt_tractor.c:371:2 (libmlt.so.6+0x996b6)
#15 mlt_frame_get_image /home/nicolas/Documents/Developpement/Projets/mlt/src/framework/mlt_frame.c:620:11 (libmlt.so.6+0x27286)
#16 mlt_profile_from_producer /home/nicolas/Documents/Developpement/Projets/mlt/src/framework/mlt_profile.c:419:10 (libmlt.so.6+0xa2bac)
#17 main /home/nicolas/Documents/Developpement/Projets/mlt/src/melt/melt.c:897:4 (melt+0xc62ea)
Previous write of size 8 at 0x7b100000a840 by thread T2 (mutexes: write M3072):
#0 posix_memalign <null> (melt+0x6546c)
#1 av_malloc.localalias.1 /home/nicolas/Documents/Developpement/Projets/FFmpeg/libavutil/mem.c:87:9 (libavutil.so.56+0x2d75a)
Mutex M2682 (0x7b6c00001380) created at:
#0 pthread_mutex_init <null> (melt+0x5380b)
#1 producer_open /home/nicolas/Documents/Developpement/Projets/mlt/src/modules/avformat/producer_avformat.c:746:3 (libmltavformat.so+0x2298d)
#2 producer_avformat_init /home/nicolas/Documents/Developpement/Projets/mlt/src/modules/avformat/producer_avformat.c:202:10 (libmltavformat.so+0x21622)
#3 create_service /home/nicolas/Documents/Developpement/Projets/mlt/src/modules/avformat/factory.c:116:11 (libmltavformat.so+0x17c55)
#4 mlt_repository_create /home/nicolas/Documents/Developpement/Projets/mlt/src/framework/mlt_repository.c:245:35 (libmlt.so.6+0x9d549)
#5 mlt_factory_producer /home/nicolas/Documents/Developpement/Projets/mlt/src/framework/mlt_factory.c:346:9 (libmlt.so.6+0x9b3d7)
#6 create_from /home/nicolas/Documents/Developpement/Projets/mlt/src/modules/core/producer_loader.c:57:15 (libmltcore.so+0x1f007)
#7 create_producer /home/nicolas/Documents/Developpement/Projets/mlt/src/modules/core/producer_loader.c:123:14 (libmltcore.so+0x1dd0f)
#8 producer_loader_init /home/nicolas/Documents/Developpement/Projets/mlt/src/modules/core/producer_loader.c:220:14 (libmltcore.so+0x1d073)
#9 mlt_repository_create /home/nicolas/Documents/Developpement/Projets/mlt/src/framework/mlt_repository.c:245:35 (libmlt.so.6+0x9d549)
#10 mlt_factory_producer /home/nicolas/Documents/Developpement/Projets/mlt/src/framework/mlt_factory.c:346:9 (libmlt.so.6+0x9b3d7)
#11 create_producer /home/nicolas/Documents/Developpement/Projets/mlt/src/modules/core/producer_melt.c:80:24 (libmltcore.so+0x267ef)
#12 producer_melt_init /home/nicolas/Documents/Developpement/Projets/mlt/src/modules/core/producer_melt.c:434:15 (libmltcore.so+0x24f9a)
#13 mlt_repository_create /home/nicolas/Documents/Developpement/Projets/mlt/src/framework/mlt_repository.c:245:35 (libmlt.so.6+0x9d549)
#14 mlt_factory_producer /home/nicolas/Documents/Developpement/Projets/mlt/src/framework/mlt_factory.c:346:9 (libmlt.so.6+0x9b3d7)
#15 main /home/nicolas/Documents/Developpement/Projets/mlt/src/melt/melt.c:890:10 (melt+0xc6191)
Mutex M3072 (0x7b8000002258) created at:
#0 pthread_mutex_init <null> (melt+0x5380b)
#1 ff_frame_thread_init /home/nicolas/Documents/Developpement/Projets/FFmpeg/libavcodec/pthread_frame.c:771:9 (libavcodec.so.58+0x5a9649)
#2 producer_set_up_video /home/nicolas/Documents/Developpement/Projets/mlt/src/modules/avformat/producer_avformat.c:2277:32 (libmltavformat.so+0x2d805)
#3 producer_get_frame /home/nicolas/Documents/Developpement/Projets/mlt/src/modules/avformat/producer_avformat.c:2960:2 (libmltavformat.so+0x22674)
#4 producer_get_frame /home/nicolas/Documents/Developpement/Projets/mlt/src/framework/mlt_producer.c:647:13 (libmlt.so.6+0x6437d)
#5 mlt_service_get_frame /home/nicolas/Documents/Developpement/Projets/mlt/src/framework/mlt_service.c:593:12 (libmlt.so.6+0x6046b)
#6 producer_get_frame /home/nicolas/Documents/Developpement/Projets/mlt/src/framework/mlt_producer.c:698:12 (libmlt.so.6+0x64827)
#7 mlt_service_get_frame /home/nicolas/Documents/Developpement/Projets/mlt/src/framework/mlt_service.c:593:12 (libmlt.so.6+0x6046b)
#8 producer_get_frame /home/nicolas/Documents/Developpement/Projets/mlt/src/framework/mlt_playlist.c:2102:3 (libmlt.so.6+0x701ae)
#9 producer_get_frame /home/nicolas/Documents/Developpement/Projets/mlt/src/framework/mlt_producer.c:647:13 (libmlt.so.6+0x6437d)
#10 mlt_service_get_frame /home/nicolas/Documents/Developpement/Projets/mlt/src/framework/mlt_service.c:593:12 (libmlt.so.6+0x6046b)
#11 producer_get_frame /home/nicolas/Documents/Developpement/Projets/mlt/src/framework/mlt_multitrack.c:612:3 (libmlt.so.6+0x6b719)
#12 producer_get_frame /home/nicolas/Documents/Developpement/Projets/mlt/src/framework/mlt_producer.c:647:13 (libmlt.so.6+0x6437d)
#13 mlt_service_get_frame /home/nicolas/Documents/Developpement/Projets/mlt/src/framework/mlt_service.c:593:12 (libmlt.so.6+0x6046b)
#14 producer_get_frame /home/nicolas/Documents/Developpement/Projets/mlt/src/framework/mlt_tractor.c:520:5 (libmlt.so.6+0x95836)
#15 producer_get_frame /home/nicolas/Documents/Developpement/Projets/mlt/src/framework/mlt_producer.c:647:13 (libmlt.so.6+0x6437d)
#16 mlt_service_get_frame /home/nicolas/Documents/Developpement/Projets/mlt/src/framework/mlt_service.c:593:12 (libmlt.so.6+0x6046b)
#17 mlt_profile_from_producer /home/nicolas/Documents/Developpement/Projets/mlt/src/framework/mlt_profile.c:414:9 (libmlt.so.6+0xa2ac0)
#18 main /home/nicolas/Documents/Developpement/Projets/mlt/src/melt/melt.c:897:4 (melt+0xc62ea)
Thread T2 (tid=347, running) created by main thread at:
#0 pthread_create <null> (melt+0x535f7)
#1 ff_frame_thread_init /home/nicolas/Documents/Developpement/Projets/FFmpeg/libavcodec/pthread_frame.c:828:15 (libavcodec.so.58+0x5a9601)
#2 producer_set_up_video /home/nicolas/Documents/Developpement/Projets/mlt/src/modules/avformat/producer_avformat.c:2277:32 (libmltavformat.so+0x2d805)
#3 producer_get_frame /home/nicolas/Documents/Developpement/Projets/mlt/src/modules/avformat/producer_avformat.c:2960:2 (libmltavformat.so+0x22674)
#4 producer_get_frame /home/nicolas/Documents/Developpement/Projets/mlt/src/framework/mlt_producer.c:647:13 (libmlt.so.6+0x6437d)
#5 mlt_service_get_frame /home/nicolas/Documents/Developpement/Projets/mlt/src/framework/mlt_service.c:593:12 (libmlt.so.6+0x6046b)
#6 producer_get_frame /home/nicolas/Documents/Developpement/Projets/mlt/src/framework/mlt_producer.c:698:12 (libmlt.so.6+0x64827)
#7 mlt_service_get_frame /home/nicolas/Documents/Developpement/Projets/mlt/src/framework/mlt_service.c:593:12 (libmlt.so.6+0x6046b)
#8 producer_get_frame /home/nicolas/Documents/Developpement/Projets/mlt/src/framework/mlt_playlist.c:2102:3 (libmlt.so.6+0x701ae)
#9 producer_get_frame /home/nicolas/Documents/Developpement/Projets/mlt/src/framework/mlt_producer.c:647:13 (libmlt.so.6+0x6437d)
#10 mlt_service_get_frame /home/nicolas/Documents/Developpement/Projets/mlt/src/framework/mlt_service.c:593:12 (libmlt.so.6+0x6046b)
#11 producer_get_frame /home/nicolas/Documents/Developpement/Projets/mlt/src/framework/mlt_multitrack.c:612:3 (libmlt.so.6+0x6b719)
#12 producer_get_frame /home/nicolas/Documents/Developpement/Projets/mlt/src/framework/mlt_producer.c:647:13 (libmlt.so.6+0x6437d)
#13 mlt_service_get_frame /home/nicolas/Documents/Developpement/Projets/mlt/src/framework/mlt_service.c:593:12 (libmlt.so.6+0x6046b)
#14 producer_get_frame /home/nicolas/Documents/Developpement/Projets/mlt/src/framework/mlt_tractor.c:520:5 (libmlt.so.6+0x95836)
#15 producer_get_frame /home/nicolas/Documents/Developpement/Projets/mlt/src/framework/mlt_producer.c:647:13 (libmlt.so.6+0x6437d)
#16 mlt_service_get_frame /home/nicolas/Documents/Developpement/Projets/mlt/src/framework/mlt_service.c:593:12 (libmlt.so.6+0x6046b)
#17 mlt_profile_from_producer /home/nicolas/Documents/Developpement/Projets/mlt/src/framework/mlt_profile.c:414:9 (libmlt.so.6+0xa2ac0)
#18 main /home/nicolas/Documents/Developpement/Projets/mlt/src/melt/melt.c:897:4 (melt+0xc62ea)
SUMMARY: ThreadSanitizer: data race (/usr/local/bin/melt+0x6f54f) in __interceptor_free
==================
Both mlt and libav* are compiled with debug symbols and clang's Thread Sanitizer.
In this particular case, I'm stuck for now since the backtrace of the concurrent write is too shallow.
I managed to get a better backtrace for the first write:
#11 0x0000556895c5a56d in free ()
#12 0x00007fd136fb2815 in av_free (ptr=<optimized out>) at libavutil/mem.c:223
#13 0x00007fd136fb2902 in av_freep (arg=<optimized out>) at libavutil/mem.c:233
#14 0x00007fd136f9d77d in buffer_replace (src=0x0, dst=0x7b5400001390) at libavutil/buffer.c:117
#15 0x00007fd136f9d77d in av_buffer_unref (buf=buf@entry=0x7b5400001390) at libavutil/buffer.c:130
#16 0x00007fd134df89d6 in decode_receive_frame_internal (avctx=avctx@entry=0x7b6400032f00, frame=0x7b5400001180) at libavcodec/decode.c:672
#17 0x00007fd134df9750 in avcodec_send_packet (avctx=avctx@entry=0x7b6400032f00, avpkt=avpkt@entry=0x7b6c00000f38) at libavcodec/decode.c:705
#18 0x00007fd134dfbca3 in compat_decode (avctx=0x7b6400032f00, frame=0x7b5400039080, got_frame=0x7ffda744187c, pkt=0x7b6c00000f38) at libavcodec/decode.c:841
#19 0x00007fd1371a5aa1 in producer_get_image (frame=0x7b1800003600, buffer=0x7ffda7443ec0, format=0x7ffda7443ebc, width=0x7ffda7442f94, height=0x7ffda7442f90, writable=0) at producer_avformat.c:1790
#20 0x00007fd1389cb287 in mlt_frame_get_image (self=0x7b1800003600, buffer=0x7ffda7443ec0, format=0x7ffda7443ebc, width=0x7ffda7442f94, height=0x7ffda7442f90, writable=0) at mlt_frame.c:620
#21 0x00007fd1283a3d1f in filter_get_image (frame=0x7b1800003600, image=0x7ffda7443ec0, format=0x7ffda7443ebc, width=0x7ffda7442f94, height=0x7ffda7442f90, writable=0) at filter_deinterlace.c:251
#22 0x00007fd1389cb287 in mlt_frame_get_image (self=0x7b1800003600, buffer=0x7ffda7443ec0, format=0x7ffda7443ebc, width=0x7ffda7442f94, height=0x7ffda7442f90, writable=0) at mlt_frame.c:620
#23 0x00007fd130baf495 in get_image (frame=0x7b1800003600, image=0x7ffda7443ec0, format=0x7ffda7443ebc, width=0x7ffda7442f94, height=0x7ffda7442f90, writable=0) at filter_fieldorder.c:33
#24 0x00007fd1389cb287 in mlt_frame_get_image (self=0x7b1800003600, buffer=0x7ffda7443ec0, format=0x7ffda7443ebc, width=0x7ffda7442f94, height=0x7ffda7442f90, writable=0) at mlt_frame.c:620
#25 0x00007fd130baafe3 in filter_get_image (frame=0x7b1800003600, image=0x7ffda7443ec0, format=0x7ffda7443ebc, width=0x7ffda7442f94, height=0x7ffda7442f90, writable=0) at filter_crop.c:76
#26 0x00007fd1389cb287 in mlt_frame_get_image (self=0x7b1800003600, buffer=0x7ffda7443ec0, format=0x7ffda7443ebc, width=0x7ffda7442f94, height=0x7ffda7442f90, writable=0) at mlt_frame.c:620
#27 0x00007fd130bc4eaf in filter_get_image (frame=0x7b1800003600, image=0x7ffda7443ec0, format=0x7ffda7443ebc, width=0x7ffda7443eb8, height=0x7ffda7443eb4, writable=0) at filter_rescale.c:221
#28 0x00007fd1389cb287 in mlt_frame_get_image (self=0x7b1800003600, buffer=0x7ffda7443ec0, format=0x7ffda7443ebc, width=0x7ffda7443eb8, height=0x7ffda7443eb4, writable=0) at mlt_frame.c:620
#29 0x00007fd130bc637c in filter_get_image (frame=0x7b1800003600, image=0x7ffda7443ec0, format=0x7ffda7443ebc, width=0x7ffda7443eb8, height=0x7ffda7443eb4, writable=0) at filter_resize.c:225
#30 0x00007fd1389cb287 in mlt_frame_get_image (self=0x7b1800003600, buffer=0x7ffda7443ec0, format=0x7ffda7443ebc, width=0x7ffda7443eb8, height=0x7ffda7443eb4, writable=0) at mlt_frame.c:620
#31 0x00007fd138a3d6b7 in producer_get_image (self=0x7b18000035a0, buffer=0x7ffda7443ec0, format=0x7ffda7443ebc, width=0x7ffda7443eb8, height=0x7ffda7443eb4, writable=0) at mlt_tractor.c:371
#32 0x00007fd1389cb287 in mlt_frame_get_image (self=0x7b18000035a0, buffer=0x7ffda7443ec0, format=0x7ffda7443ebc, width=0x7ffda7443eb8, height=0x7ffda7443eb4, writable=0) at mlt_frame.c:620
#33 0x00007fd138a46bad in mlt_profile_from_producer (profile=0x7b1000001000, producer=0x7b200003ac80) at mlt_profile.c:419
#34 0x0000556895cb12eb in main (argc=2, argv=0x7ffda7444828) at melt.c:897
If anyone has ideas on how to debug further, I'm all ears.
Contributor guide
No contributing guide indexed for this repository
First steps
- Read the whole issue, then the project's contributing guide.
- Comment on the issue to say you are picking it up — it saves two people doing the same work.
- Fork the repository and make your change on a branch.
- Open a pull request that references the issue number.
Research direction
Reproduce the report with melt video.mp4 under Clang ThreadSanitizer. Start with src/framework/mlt_profile.c around mlt_profile_from_producer, then inspect src/framework/mlt_frame.c and src/modules/avformat/producer_avformat.c alongside the reported FFmpeg buffer and decode paths. Done means the reported race is understood and addressed without introducing new ThreadSanitizer warnings.
Written by the indexing model from the issue text.
Assessment
- Tech stack
- c
- Domain
- audio-video-rtc
- Issue type
- Bug
- Difficulty
- 4/5
- Estimated time
- 3-5 days
- Activity status
- Stale
- Clarity
- Needs clarification
- Newbie friendliness
- 35/100