X-Git-Url: https://git.sesse.net/?a=blobdiff_plain;f=nageru%2Fimage_input.cpp;h=2e062714285b170148a9822c7289a4a1efe02d2f;hb=0a087eeaf663c3f7b1d9431c725fcae10f60d732;hp=d2d6611162fae0d88ab06dd382d026f5997337a2;hpb=533f00a9b992d06767737f9db236b4cf76b9c124;p=nageru diff --git a/nageru/image_input.cpp b/nageru/image_input.cpp index d2d6611..2e06271 100644 --- a/nageru/image_input.cpp +++ b/nageru/image_input.cpp @@ -41,10 +41,14 @@ struct SwsContext; using namespace std; -// FIXME gl context +ImageInput::ImageInput() + : sRGBSwitchingFlatInput({movit::COLORSPACE_sRGB, movit::GAMMA_sRGB}, movit::FORMAT_RGBA_POSTMULTIPLIED_ALPHA, + GL_UNSIGNED_BYTE, 1280, 720) // Resolution will be overwritten. +{} + ImageInput::ImageInput(const string &filename) - : movit::FlatInput({movit::COLORSPACE_sRGB, movit::GAMMA_sRGB}, movit::FORMAT_RGBA_POSTMULTIPLIED_ALPHA, - GL_UNSIGNED_BYTE, 1280, 720), // Resolution will be overwritten. + : sRGBSwitchingFlatInput({movit::COLORSPACE_sRGB, movit::GAMMA_sRGB}, movit::FORMAT_RGBA_POSTMULTIPLIED_ALPHA, + GL_UNSIGNED_BYTE, 1280, 720), // Resolution will be overwritten. pathname(search_for_file_or_die(filename)), current_image(load_image(filename, pathname)) { @@ -67,12 +71,13 @@ void ImageInput::set_gl_state(GLuint glsl_program_num, const string& prefix, uns // is mostly there to save startup time, not RAM). { lock_guard lock(all_images_lock); + assert(all_images.count(pathname)); if (all_images[pathname] != current_image) { current_image = all_images[pathname]; set_texture_num(*current_image->tex); } } - movit::FlatInput::set_gl_state(glsl_program_num, prefix, sampler_num); + sRGBSwitchingFlatInput::set_gl_state(glsl_program_num, prefix, sampler_num); } shared_ptr ImageInput::load_image(const string &filename, const string &pathname) @@ -121,7 +126,7 @@ shared_ptr ImageInput::load_image_raw(const string &pat fprintf(stderr, "%s: Cannot fill codec parameters\n", pathname.c_str()); return nullptr; } - AVCodec *codec = avcodec_find_decoder(codecpar->codec_id); + const AVCodec *codec = avcodec_find_decoder(codecpar->codec_id); if (codec == nullptr) { fprintf(stderr, "%s: Cannot find decoder\n", pathname.c_str()); return nullptr; @@ -213,7 +218,7 @@ shared_ptr ImageInput::load_image_raw(const string &pat check_error(); glPixelStorei(GL_UNPACK_ROW_LENGTH, linesizes[0] / 4); check_error(); - glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA8, frame->width, frame->height, 0, GL_RGBA, GL_UNSIGNED_BYTE, image_data.get()); + glTexImage2D(GL_TEXTURE_2D, 0, GL_SRGB8_ALPHA8, frame->width, frame->height, 0, GL_RGBA, GL_UNSIGNED_INT_8_8_8_8_REV, image_data.get()); check_error(); glPixelStorei(GL_UNPACK_ROW_LENGTH, 0); check_error(); @@ -223,7 +228,7 @@ shared_ptr ImageInput::load_image_raw(const string &pat glBindTexture(GL_TEXTURE_2D, 0); check_error(); - shared_ptr image(new Image{unsigned(frame->width), unsigned(frame->height), RefCountedTexture(new GLuint(tex)), last_modified}); + shared_ptr image(new Image{unsigned(frame->width), unsigned(frame->height), UniqueTexture(new GLuint(tex)), last_modified}); return image; } @@ -289,6 +294,15 @@ void ImageInput::update_thread_func(QSurface *surface) } } +void ImageInput::switch_image(const string &pathname) +{ +#ifndef NDEBUG + lock_guard lock(all_images_lock); + assert(all_images.count(pathname)); +#endif + this->pathname = pathname; +} + void ImageInput::start_update_thread(QSurface *surface) { update_thread = thread(update_thread_func, surface);