X-Git-Url: https://git.sesse.net/?a=blobdiff_plain;f=image_input.cpp;fp=image_input.cpp;h=2bd147d139ec9fbc6c5065f20484cfc3c16e01d5;hb=c9c43a2511ec88bf40aa720ba712577ba85a6863;hp=090b6db6cf1ba700f7e3b2e1c8bf06e0c010c699;hpb=2a431ccd32a47fb0f40389cbd7d1a1e9d1902a64;p=nageru diff --git a/image_input.cpp b/image_input.cpp index 090b6db..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()); @@ -88,12 +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;