mirror of
https://github.com/ZLMediaKit/ZLMediaKit.git
synced 2024-11-22 19:00:01 +08:00
BugFix: crash when FrameMerger::flush
In a lambda expression, temporary stack variables should not be captured; otherwise, the variables may have become invalid when FrameMerger::flush is called.
This commit is contained in:
parent
07f3c6dde4
commit
c0bb7db476
@ -104,7 +104,7 @@ bool MP4MuxerInterface::inputFrame(const Frame::Ptr &frame) {
|
|||||||
case CodecH264:
|
case CodecH264:
|
||||||
case CodecH265: {
|
case CodecH265: {
|
||||||
// 这里的代码逻辑是让SPS、PPS、IDR这些时间戳相同的帧打包到一起当做一个帧处理,
|
// 这里的代码逻辑是让SPS、PPS、IDR这些时间戳相同的帧打包到一起当做一个帧处理,
|
||||||
track.merger.inputFrame(frame, [&](uint64_t dts, uint64_t pts, const Buffer::Ptr &buffer, bool have_idr) {
|
track.merger.inputFrame(frame, [this, &track](uint64_t dts, uint64_t pts, const Buffer::Ptr &buffer, bool have_idr) {
|
||||||
int64_t dts_out, pts_out;
|
int64_t dts_out, pts_out;
|
||||||
track.stamp.revise(dts, pts, dts_out, pts_out);
|
track.stamp.revise(dts, pts, dts_out, pts_out);
|
||||||
mp4_writer_write(_mov_writter.get(), track.track_id, buffer->data(), buffer->size(), pts_out, dts_out, have_idr ? MOV_AV_FLAG_KEYFREAME : 0);
|
mp4_writer_write(_mov_writter.get(), track.track_id, buffer->data(), buffer->size(), pts_out, dts_out, have_idr ? MOV_AV_FLAG_KEYFREAME : 0);
|
||||||
|
@ -55,7 +55,7 @@ bool MpegMuxer::inputFrame(const Frame::Ptr &frame) {
|
|||||||
case CodecH264:
|
case CodecH264:
|
||||||
case CodecH265: {
|
case CodecH265: {
|
||||||
// 这里的代码逻辑是让SPS、PPS、IDR这些时间戳相同的帧打包到一起当做一个帧处理,
|
// 这里的代码逻辑是让SPS、PPS、IDR这些时间戳相同的帧打包到一起当做一个帧处理,
|
||||||
return track.merger.inputFrame(frame, [&](uint64_t dts, uint64_t pts, const Buffer::Ptr &buffer, bool have_idr) {
|
return track.merger.inputFrame(frame, [this, &track](uint64_t dts, uint64_t pts, const Buffer::Ptr &buffer, bool have_idr) {
|
||||||
_key_pos = have_idr;
|
_key_pos = have_idr;
|
||||||
// 取视频时间戳为TS的时间戳
|
// 取视频时间戳为TS的时间戳
|
||||||
_timestamp = dts;
|
_timestamp = dts;
|
||||||
|
@ -111,7 +111,7 @@ void DecoderImp::onDecode(int stream, int codecid, int flags, int64_t pts, int64
|
|||||||
onTrack(stream, Factory::getTrackByCodecId(codec, 8000, 1, 16));
|
onTrack(stream, Factory::getTrackByCodecId(codec, 8000, 1, 16));
|
||||||
}
|
}
|
||||||
if (!ref.first) {
|
if (!ref.first) {
|
||||||
WarnL << "not support codec :" << getCodecName(codec);
|
WarnL << "Unsupported codec :" << getCodecName(codec);
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
auto frame = Factory::getFrameFromPtr(codec, (char *)data, bytes, dts, pts);
|
auto frame = Factory::getFrameFromPtr(codec, (char *)data, bytes, dts, pts);
|
||||||
@ -119,7 +119,7 @@ void DecoderImp::onDecode(int stream, int codecid, int flags, int64_t pts, int64
|
|||||||
onFrame(stream, frame);
|
onFrame(stream, frame);
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
ref.second.inputFrame(frame, [&](uint64_t dts, uint64_t pts, const Buffer::Ptr &buffer, bool) {
|
ref.second.inputFrame(frame, [this, stream, codec](uint64_t dts, uint64_t pts, const Buffer::Ptr &buffer, bool) {
|
||||||
onFrame(stream, Factory::getFrameFromBuffer(codec, buffer, dts, pts));
|
onFrame(stream, Factory::getFrameFromBuffer(codec, buffer, dts, pts));
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
Loading…
Reference in New Issue
Block a user