]> git.sesse.net Git - movit/blobdiff - ycbcr_input.h
Some small cleanups after we got rid of GLSL 1.10; we can now unify 1.30 and ES 3...
[movit] / ycbcr_input.h
index 997eb481bc57d5ed3fbf491f7b9c2dc7fd44dafc..282b55aaac2d1fe19dd3ef7bae9649e04ab1a54a 100644 (file)
@@ -5,7 +5,7 @@
 // imprecisely, called “YUV”), which is typically what you get from a video decoder.
 // It upsamples planes as needed, using the default linear upsampling OpenGL gives you.
 
-#include <GL/glew.h>
+#include <epoxy/gl.h>
 #include <assert.h>
 #include <string>
 
 #include "effect_chain.h"
 #include "image_format.h"
 #include "input.h"
+#include "ycbcr.h"
 
-class ResourcePool;
-
-struct YCbCrFormat {
-       // Which formula for Y' to use.
-       YCbCrLumaCoefficients luma_coefficients;
+namespace movit {
 
-       // If true, assume Y'CbCr coefficients are full-range, ie. go from 0 to 255
-       // instead of the limited 220/225 steps in classic MPEG. For instance,
-       // JPEG uses the Rec. 601 luma coefficients, but full range.
-       bool full_range;
-
-       // Sampling factors for chroma components. For no subsampling (4:4:4),
-       // set both to 1.
-       unsigned chroma_subsampling_x, chroma_subsampling_y;
+class ResourcePool;
 
-       // Positioning of the chroma samples. MPEG-1 and JPEG is (0.5, 0.5);
-       // MPEG-2 and newer typically are (0.0, 0.5).
-       float cb_x_position, cb_y_position;
-       float cr_x_position, cr_y_position;
+// Whether the data is fully planar (Y', Cb and Cr in one texture each)
+// or not. Note that this input does currently not support fully interleaved
+// data (Y', Cb and Cr next to each other), as 4:4:4 interleaved Y'CbCr seems
+// to be rare; however, YCbCr422InterleavedInput supports the important special
+// case of 4:2:2 interleaved.
+enum YCbCrInputSplitting {
+       // The standard, default case; Y', Cb and Cr in one texture each.
+       YCBCR_INPUT_PLANAR,
+
+       // Y' in one texture, and then Cb and Cr interleaved in one texture.
+       // In particular, this is a superset of the relatively popular NV12 mode.
+       // If you specify this mode, the “Cr” pointer texture will be unused
+       // (the ”Cb” texture contains both).
+       YCBCR_INPUT_SPLIT_Y_AND_CBCR,
 };
 
 class YCbCrInput : public Input {
 public:
        YCbCrInput(const ImageFormat &image_format,
                   const YCbCrFormat &ycbcr_format,
-                  unsigned width, unsigned height);
+                  unsigned width, unsigned height,
+                  YCbCrInputSplitting ycbcr_input_splitting = YCBCR_INPUT_PLANAR);
        ~YCbCrInput();
 
        virtual std::string effect_type_id() const { return "YCbCrInput"; }
@@ -56,6 +57,7 @@ public:
        unsigned get_height() const { return height; }
        Colorspace get_color_space() const { return image_format.color_space; }
        GammaCurve get_gamma_curve() const { return image_format.gamma_curve; }
+       virtual bool can_supply_mipmaps() const { return false; }
 
        // Tells the input where to fetch the actual pixel data. Note that if you change
        // this data, you must either call set_pixel_data() again (using the same pointer
@@ -69,7 +71,7 @@ public:
        // the pointer (and PBO, if set) has to be valid at the time of the render call.
        void set_pixel_data(unsigned channel, const unsigned char *pixel_data, GLuint pbo = 0)
        {
-               assert(channel >= 0 && channel < 3);
+               assert(channel >= 0 && channel < num_channels);
                this->pixel_data[channel] = pixel_data;
                this->pbos[channel] = pbo;
                invalidate_pixel_data();
@@ -78,7 +80,7 @@ public:
        void invalidate_pixel_data();
 
        void set_pitch(unsigned channel, unsigned pitch) {
-               assert(channel >= 0 && channel < 3);
+               assert(channel >= 0 && channel < num_channels);
                this->pitch[channel] = pitch;
                invalidate_pixel_data();
        }
@@ -88,12 +90,15 @@ public:
                resource_pool = chain->get_resource_pool();
        }
 
+       bool set_int(const std::string& key, int value);
+
 private:
        ImageFormat image_format;
        YCbCrFormat ycbcr_format;
+       GLuint num_channels;
+       YCbCrInputSplitting ycbcr_input_splitting;
        GLuint pbos[3], texture_num[3];
-
-       int needs_mipmaps;
+       GLint uniform_tex_y, uniform_tex_cb, uniform_tex_cr;
 
        unsigned width, height, widths[3], heights[3];
        const unsigned char *pixel_data[3];
@@ -101,4 +106,6 @@ private:
        ResourcePool *resource_pool;
 };
 
+}  // namespace movit
+
 #endif // !defined(_MOVIT_YCBCR_INPUT_H)