mirror of
https://github.com/ZoneMinder/zoneminder.git
synced 2026-03-11 10:26:43 -04:00
Add guard to handle resetting AVPacket after use.
Also handle allocation failures.
This commit is contained in:
@@ -139,6 +139,11 @@ AVFrame *FFmpeg_Input::get_frame(int stream_id) {
|
||||
int frameComplete = false;
|
||||
av_packet_ptr packet{av_packet_alloc()};
|
||||
|
||||
if (!packet) {
|
||||
Error("Unable to allocate packet.");
|
||||
return nullptr;
|
||||
}
|
||||
|
||||
while ( !frameComplete ) {
|
||||
int ret = av_read_frame(input_format_context, packet.get());
|
||||
if ( ret < 0 ) {
|
||||
@@ -157,9 +162,10 @@ AVFrame *FFmpeg_Input::get_frame(int stream_id) {
|
||||
}
|
||||
ZM_DUMP_STREAM_PACKET(input_format_context->streams[packet->stream_index], packet, "Received packet");
|
||||
|
||||
av_packet_guard pkt_guard{packet};
|
||||
|
||||
if ( (stream_id >= 0) && (packet->stream_index != stream_id) ) {
|
||||
Debug(1,"Packet is not for our stream (%d)", packet->stream_index );
|
||||
zm_av_packet_unref(packet.get());
|
||||
continue;
|
||||
}
|
||||
|
||||
@@ -175,7 +181,6 @@ AVFrame *FFmpeg_Input::get_frame(int stream_id) {
|
||||
if ( ret < 0 ) {
|
||||
Error("Unable to decode frame at frame %d: %d %s, continuing",
|
||||
streams[packet->stream_index].frame_count, ret, av_make_error_string(ret).c_str());
|
||||
zm_av_packet_unref(packet.get());
|
||||
av_frame_free(&frame);
|
||||
continue;
|
||||
} else {
|
||||
@@ -194,7 +199,6 @@ AVFrame *FFmpeg_Input::get_frame(int stream_id) {
|
||||
input_format_context->streams[stream_id]->time_base
|
||||
);
|
||||
|
||||
zm_av_packet_unref(packet.get());
|
||||
} // end while !frameComplete
|
||||
return frame;
|
||||
} // end AVFrame *FFmpeg_Input::get_frame
|
||||
|
||||
Reference in New Issue
Block a user