]> git.sesse.net Git - nageru/commitdiff
Only load images once; add a cache.
authorSteinar H. Gunderson <sgunderson@bigfoot.com>
Thu, 31 Dec 2015 16:52:14 +0000 (17:52 +0100)
committerSteinar H. Gunderson <sgunderson@bigfoot.com>
Thu, 31 Dec 2015 16:52:14 +0000 (17:52 +0100)
image_input.cpp
image_input.h

index 090b6db6cf1ba700f7e3b2e1c8bf06e0c010c699..2bd147d139ec9fbc6c5065f20484cfc3c16e01d5 100644 (file)
@@ -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<uint8_t[]> 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<string, unique_ptr<uint8_t[]>> ImageInput::all_images;
index edc86c8fbbf76ed7562fc93cf340952144ae5cbf..3fad845ea83351a43271fc1d357b4a7d7f162356 100644 (file)
@@ -1,12 +1,12 @@
 #ifndef _IMAGE_INPUT_H
 #define _IMAGE_INPUT_H 1
 
+#include <map>
 #include <memory>
 #include <string>
 
 #include <movit/flat_input.h>
 
-
 // An output that takes its input from a static image, loaded with ffmpeg.
 // comes from a single 2D array with chunky pixels.
 class ImageInput : public movit::FlatInput {
@@ -16,7 +16,8 @@ public:
        std::string effect_type_id() const override { return "ImageInput"; }
 
 private:
-       std::unique_ptr<uint8_t[]> image_data;
+       static const uint8_t *load_image(const std::string &filename);
+       static std::map<std::string, std::unique_ptr<uint8_t[]>> all_images;
 };
 
 #endif // !defined(_IMAGE_INPUT_H)