X-Git-Url: https://git.sesse.net/?a=blobdiff_plain;f=image_input.cpp;h=2bd147d139ec9fbc6c5065f20484cfc3c16e01d5;hb=9903ba2fb66d20f39e4b73fd6f948e5dbc528fcb;hp=b4fc65749215e740b6c10c718b4a63e9d02f2410;hpb=46a29f577f39bf2000553e53683b34b7f50f8dbf;p=nageru diff --git a/image_input.cpp b/image_input.cpp index b4fc657..2bd147d 100644 --- a/image_input.cpp +++ b/image_input.cpp @@ -12,10 +12,19 @@ extern "C" { using namespace std; -ImageInput::ImageInput(const std::string &filename) +ImageInput::ImageInput(const string &filename) : movit::FlatInput({movit::COLORSPACE_sRGB, movit::GAMMA_sRGB}, movit::FORMAT_RGBA_POSTMULTIPLIED_ALPHA, GL_UNSIGNED_BYTE, 1280, 720) // FIXME { + set_pixel_data(load_image(filename)); +} + +const uint8_t *ImageInput::load_image(const string &filename) +{ + if (all_images.count(filename)) { + return all_images[filename].get(); + } + AVFormatContext *format_ctx = nullptr; if (avformat_open_input(&format_ctx, filename.c_str(), nullptr, nullptr) != 0) { fprintf(stderr, "%s: Error opening file\n", filename.c_str()); @@ -63,6 +72,7 @@ ImageInput::ImageInput(const std::string &filename) exit(1); } if (pkt.stream_index != stream_index) { + av_free_packet(&pkt); continue; } @@ -70,6 +80,7 @@ ImageInput::ImageInput(const std::string &filename) fprintf(stderr, "%s: Cannot decode frame\n", filename.c_str()); exit(1); } + av_free_packet(&pkt); } while (!frame_finished); // TODO: Scale down if needed! @@ -86,7 +97,16 @@ ImageInput::ImageInput(const std::string &filename) sws_freeContext(sws_ctx); size_t len = frame->width * frame->height * 4; - image_data.reset(new uint8_t[len]); + unique_ptr image_data(new uint8_t[len]); av_image_copy_to_buffer(image_data.get(), len, pic.data, pic.linesize, PIX_FMT_RGBA, frame->width, frame->height, 1); - set_pixel_data(image_data.get()); + + avpicture_free(&pic); + av_frame_free(&frame); + avcodec_close(codec_ctx); + avformat_close_input(&format_ctx); + + all_images[filename] = move(image_data); + return all_images[filename].get(); } + +map> ImageInput::all_images;