X-Git-Url: https://git.sesse.net/?p=movit;a=blobdiff_plain;f=ycbcr_input.cpp;h=071ce134833151b33bbb9cce800c1971143106dc;hp=7f58f3fa019d66fa6ac95115f0985463786e85d0;hb=e9523ce68f9f08d5178615c8c4a031eec67d1455;hpb=ae634b4c9fd1a8275b36458862ada71a44063108 diff --git a/ycbcr_input.cpp b/ycbcr_input.cpp index 7f58f3f..071ce13 100644 --- a/ycbcr_input.cpp +++ b/ycbcr_input.cpp @@ -30,17 +30,11 @@ YCbCrInput::YCbCrInput(const ImageFormat &image_format, pbos[0] = pbos[1] = pbos[2] = 0; texture_num[0] = texture_num[1] = texture_num[2] = 0; - assert(width % ycbcr_format.chroma_subsampling_x == 0); - pitch[0] = widths[0] = width; - pitch[1] = widths[1] = width / ycbcr_format.chroma_subsampling_x; - pitch[2] = widths[2] = width / ycbcr_format.chroma_subsampling_x; - - assert(height % ycbcr_format.chroma_subsampling_y == 0); - heights[0] = height; - heights[1] = height / ycbcr_format.chroma_subsampling_y; - heights[2] = height / ycbcr_format.chroma_subsampling_y; + set_width(width); + set_height(height); pixel_data[0] = pixel_data[1] = pixel_data[2] = NULL; + owns_texture[0] = owns_texture[1] = owns_texture[2] = false; register_uniform_sampler2d("tex_y", &uniform_tex_y); @@ -58,9 +52,7 @@ YCbCrInput::YCbCrInput(const ImageFormat &image_format, YCbCrInput::~YCbCrInput() { for (unsigned channel = 0; channel < num_channels; ++channel) { - if (texture_num[channel] != 0) { - resource_pool->release_2d_texture(texture_num[channel]); - } + possibly_release_texture(channel); } } @@ -100,6 +92,7 @@ void YCbCrInput::set_gl_state(GLuint glsl_program_num, const string& prefix, uns check_error(); glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE); check_error(); + owns_texture[channel] = true; } else { glBindTexture(GL_TEXTURE_2D, texture_num[channel]); check_error(); @@ -158,10 +151,7 @@ string YCbCrInput::output_fragment_shader() void YCbCrInput::invalidate_pixel_data() { for (unsigned channel = 0; channel < 3; ++channel) { - if (texture_num[channel] != 0) { - resource_pool->release_2d_texture(texture_num[channel]); - texture_num[channel] = 0; - } + possibly_release_texture(channel); } } @@ -174,4 +164,13 @@ bool YCbCrInput::set_int(const std::string& key, int value) return Effect::set_int(key, value); } +void YCbCrInput::possibly_release_texture(unsigned channel) +{ + if (texture_num[channel] != 0 && owns_texture[channel]) { + resource_pool->release_2d_texture(texture_num[channel]); + texture_num[channel] = 0; + owns_texture[channel] = false; + } +} + } // namespace movit