Add guard to handle resetting AVPacket after use.

Also handle allocation failures.
This commit is contained in:
Doug Nazar
2022-07-28 00:37:02 -04:00
parent 110cc436a3
commit acbdf1854d
5 changed files with 63 additions and 15 deletions

View File

@@ -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