From bbac990644365bb8238776d7280bd0f4926d06fc Mon Sep 17 00:00:00 2001 From: Michael Fabian 'Xaymar' Dirks Date: Thu, 8 Sep 2022 23:57:18 +0200 Subject: [PATCH] encoder/ffmpeg: Assume extra data and sei are present on first frame While this may break some unusual encoders that require additional frames for extra data or sei data to be present, it fixes the problem where encoders would never record at all. May need to look into a different solution in the future. Fixes #911 --- source/encoders/encoder-ffmpeg.cpp | 9 ++++++--- 1 file changed, 6 insertions(+), 3 deletions(-) diff --git a/source/encoders/encoder-ffmpeg.cpp b/source/encoders/encoder-ffmpeg.cpp index 2da6e71..3202a7b 100644 --- a/source/encoders/encoder-ffmpeg.cpp +++ b/source/encoders/encoder-ffmpeg.cpp @@ -583,7 +583,7 @@ std::shared_ptr ffmpeg_instance::pop_used_frame() bool ffmpeg_instance::get_extra_data(uint8_t** data, size_t* size) { - if (_extra_data.size() == 0) + if (!_have_first_frame) return false; *data = _extra_data.data(); @@ -593,7 +593,7 @@ bool ffmpeg_instance::get_extra_data(uint8_t** data, size_t* size) bool ffmpeg_instance::get_sei_data(uint8_t** data, size_t* size) { - if (_sei_data.size() == 0) + if (!_have_first_frame) return false; *data = _sei_data.data(); @@ -678,7 +678,10 @@ int ffmpeg_instance::receive_packet(bool* received_packet, struct encoder_packet packet->drop_priority = 3; for (size_t idx = 0, edx = static_cast(_packet->side_data_elems); idx < edx; idx++) { auto& side_data = _packet->side_data[idx]; - if (side_data.type == AV_PKT_DATA_QUALITY_STATS) { + if (side_data.type == AV_PKT_DATA_NEW_EXTRADATA) { + _extra_data.resize(side_data.size); + std::memcpy(_extra_data.data(), side_data.data, side_data.size); + } else if (side_data.type == AV_PKT_DATA_QUALITY_STATS) { // Decisions based on picture type, if present. switch (side_data.data[sizeof(uint32_t)]) { case AV_PICTURE_TYPE_I: // I-Frame