X-Git-Url: https://git.sesse.net/?a=blobdiff_plain;f=ycbcr_input.cpp;h=4a0ec0ea12b904e2a41f73b774a2c8da00fe43e6;hb=cdbed3b89528ee2f640613219fa3c77a0ad8fef5;hp=4c824c6d092ddc94617a2ecf18e96be4c3a51202;hpb=84412c6d89fbe3563bab0b151274eb56c2ddd35c;p=movit diff --git a/ycbcr_input.cpp b/ycbcr_input.cpp index 4c824c6..4a0ec0e 100644 --- a/ycbcr_input.cpp +++ b/ycbcr_input.cpp @@ -30,22 +30,19 @@ 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); - if (ycbcr_input_splitting == YCBCR_INPUT_SPLIT_Y_AND_CBCR) { + if (ycbcr_input_splitting == YCBCR_INPUT_INTERLEAVED) { + num_channels = 1; + assert(ycbcr_format.chroma_subsampling_x == 1); + assert(ycbcr_format.chroma_subsampling_y == 1); + } else if (ycbcr_input_splitting == YCBCR_INPUT_SPLIT_Y_AND_CBCR) { num_channels = 2; register_uniform_sampler2d("tex_cbcr", &uniform_tex_cb); } else { @@ -69,9 +66,12 @@ void YCbCrInput::set_gl_state(GLuint glsl_program_num, const string& prefix, uns glActiveTexture(GL_TEXTURE0 + *sampler_num + channel); check_error(); - if (texture_num[channel] == 0) { + if (texture_num[channel] == 0 && (pbos[channel] != 0 || pixel_data[channel] != NULL)) { GLenum format, internal_format; - if (channel == 1 && ycbcr_input_splitting == YCBCR_INPUT_SPLIT_Y_AND_CBCR) { + if (channel == 0 && ycbcr_input_splitting == YCBCR_INPUT_INTERLEAVED) { + format = GL_RGB; + internal_format = GL_RGB8; + } else if (channel == 1 && ycbcr_input_splitting == YCBCR_INPUT_SPLIT_Y_AND_CBCR) { format = GL_RG; internal_format = GL_RG8; } else { @@ -142,13 +142,15 @@ string YCbCrInput::output_fragment_shader() ycbcr_format.cr_y_position, ycbcr_format.chroma_subsampling_y, heights[2]); frag_shader += output_glsl_vec2("PREFIX(cr_offset)", cr_offset_x, cr_offset_y); - if (ycbcr_input_splitting == YCBCR_INPUT_SPLIT_Y_AND_CBCR) { + if (ycbcr_input_splitting == YCBCR_INPUT_INTERLEAVED) { + frag_shader += "#define Y_CB_CR_SAME_TEXTURE 1\n"; + } else if (ycbcr_input_splitting == YCBCR_INPUT_SPLIT_Y_AND_CBCR) { char buf[256]; - snprintf(buf, sizeof(buf), "#define CB_CR_SAME_TEXTURE 1\n#define CB_CR_OFFSETS_EQUAL %d\n", + snprintf(buf, sizeof(buf), "#define Y_CB_CR_SAME_TEXTURE 0\n#define CB_CR_SAME_TEXTURE 1\n#define CB_CR_OFFSETS_EQUAL %d\n", (fabs(ycbcr_format.cb_x_position - ycbcr_format.cr_x_position) < 1e-6)); frag_shader += buf; } else { - frag_shader += "#define CB_CR_SAME_TEXTURE 0\n"; + frag_shader += "#define Y_CB_CR_SAME_TEXTURE 0\n#define CB_CR_SAME_TEXTURE 0\n"; } frag_shader += read_file("ycbcr_input.frag");