From 5bb5f8f8854d2f1f2afad0255d32394c3412882a Mon Sep 17 00:00:00 2001 From: "Steinar H. Gunderson" Date: Sat, 9 Apr 2016 14:25:09 +0200 Subject: [PATCH] Fix reading of PNG images. --- image_input.cpp | 20 +++++++++++++++++--- 1 file changed, 17 insertions(+), 3 deletions(-) diff --git a/image_input.cpp b/image_input.cpp index 27c088d..5c1bd8f 100644 --- a/image_input.cpp +++ b/image_input.cpp @@ -152,7 +152,7 @@ shared_ptr ImageInput::load_image_raw(const string &fil unique_ptr codec_ctx_cleanup( codec_ctx, avcodec_close); - // Read packets until we have a frame. + // Read packets until we have a frame or there are none left. int frame_finished = 0; auto frame = av_frame_alloc_unique(); do { @@ -163,8 +163,7 @@ shared_ptr ImageInput::load_image_raw(const string &fil pkt.data = nullptr; pkt.size = 0; if (av_read_frame(format_ctx.get(), &pkt) < 0) { - fprintf(stderr, "%s: Cannot read frame\n", filename.c_str()); - return nullptr; + break; } if (pkt.stream_index != stream_index) { continue; @@ -176,6 +175,21 @@ shared_ptr ImageInput::load_image_raw(const string &fil } } while (!frame_finished); + // See if there's a cached frame for us. + if (!frame_finished) { + AVPacket pkt; + pkt.data = nullptr; + pkt.size = 0; + if (avcodec_decode_video2(codec_ctx, frame.get(), &frame_finished, &pkt) < 0) { + fprintf(stderr, "%s: Cannot decode frame\n", filename.c_str()); + return nullptr; + } + } + if (!frame_finished) { + fprintf(stderr, "%s: Decoder did not output frame.\n", filename.c_str()); + return nullptr; + } + // TODO: Scale down if needed! uint8_t *pic_data[4] = {nullptr}; unique_ptr pic_data_cleanup( -- 2.39.2