X-Git-Url: https://git.sesse.net/?a=blobdiff_plain;f=effect_chain.cpp;h=4c2df4c2de6dbce9563c4f34700891b113acdc7e;hb=06ba8d86c019208682d8883dc7187df37b027814;hp=bf017166a770f5a2d4d52adf0d68cf303aab30bd;hpb=d2050acb601e0d16bb33b1c1e7cf443dce2d3c93;p=movit diff --git a/effect_chain.cpp b/effect_chain.cpp index bf01716..4c2df4c 100644 --- a/effect_chain.cpp +++ b/effect_chain.cpp @@ -82,13 +82,14 @@ void EffectChain::add_output(const ImageFormat &format, OutputAlphaFormat alpha_ } void EffectChain::add_ycbcr_output(const ImageFormat &format, OutputAlphaFormat alpha_format, - const YCbCrFormat &ycbcr_format) + const YCbCrFormat &ycbcr_format, YCbCrOutputSplitting output_splitting) { assert(!finalized); output_format = format; output_alpha_format = alpha_format; output_color_type = OUTPUT_COLOR_YCBCR; output_ycbcr_format = ycbcr_format; + output_ycbcr_splitting = output_splitting; assert(ycbcr_format.chroma_subsampling_x == 1); assert(ycbcr_format.chroma_subsampling_y == 1); @@ -361,6 +362,23 @@ void EffectChain::compile_glsl_program(Phase *phase) frag_shader += "\n"; } frag_shader += string("#define INPUT ") + phase->effect_ids[phase->effects.back()] + "\n"; + + // If we're the last phase, add the right #defines for Y'CbCr multi-output as needed. + if (phase->output_node->outgoing_links.empty() && output_color_type == OUTPUT_COLOR_YCBCR) { + switch (output_ycbcr_splitting) { + case YCBCR_OUTPUT_INTERLEAVED: + // No #defines set. + break; + case YCBCR_OUTPUT_SPLIT_Y_AND_CBCR: + frag_shader += "#define YCBCR_OUTPUT_SPLIT_Y_AND_CBCR 1\n"; + break; + case YCBCR_OUTPUT_PLANAR: + frag_shader += "#define YCBCR_OUTPUT_PLANAR 1\n"; + break; + default: + assert(false); + } + } frag_shader.append(read_version_dependent_file("footer", "frag")); // Collect uniforms from all effects and output them. Note that this needs