diff options
| author | Carl Hetherington <cth@carlh.net> | 2022-10-24 20:37:02 +0200 |
|---|---|---|
| committer | Carl Hetherington <cth@carlh.net> | 2022-10-24 23:50:44 +0200 |
| commit | 01a24fe341fcd6a7265e118806827f006d4f84f8 (patch) | |
| tree | 04446ecc753842206b034a57bfcdbf395ceb0c62 /src/lib/ffmpeg_file_encoder.cc | |
| parent | f2e3522a9dcf7bd0a7a1f1073e45b4450e3b68f0 (diff) | |
Hopefully fix crash when the same frame is encoded twice.prores-debug
Previously if some frame X was passed to the encoder twice
I think this would happen:
X1 written; X stored to _pending_images
X2 written; _pending_images remains the same
X1 encode finishes; X is discarded from _pending_images
Data for X2 is read by the encoder but was just freed
I think this might have resulted in intermittent crashes, which were
fairly common in the 2.17.x branch with the test
ffmpeg_encoder_prores_regression_1
But I didn't conclusively prove it.
Diffstat (limited to 'src/lib/ffmpeg_file_encoder.cc')
| -rw-r--r-- | src/lib/ffmpeg_file_encoder.cc | 16 |
1 files changed, 13 insertions, 3 deletions
diff --git a/src/lib/ffmpeg_file_encoder.cc b/src/lib/ffmpeg_file_encoder.cc index 1294b9b3c..8045600fe 100644 --- a/src/lib/ffmpeg_file_encoder.cc +++ b/src/lib/ffmpeg_file_encoder.cc @@ -411,7 +411,13 @@ FFmpegFileEncoder::video (shared_ptr<PlayerVideo> video, DCPTime time) { boost::mutex::scoped_lock lm (_pending_images_mutex); - _pending_images[image->data()[0]] = image; + auto key = image->data()[0]; + auto iter = _pending_images.find(key); + if (iter != _pending_images.end()) { + iter->second.second++; + } else { + _pending_images[key] = { image, 1 }; + } } for (int i = 0; i < 3; ++i) { @@ -502,7 +508,11 @@ void FFmpegFileEncoder::buffer_free2 (uint8_t* data) { boost::mutex::scoped_lock lm (_pending_images_mutex); - if (_pending_images.find(data) != _pending_images.end()) { - _pending_images.erase (data); + auto iter = _pending_images.find(data); + if (iter != _pending_images.end()) { + iter->second.second--; + if (iter->second.second == 0) { + _pending_images.erase(data); + } } } |
