Re: [boost] Quicktime v210 format support (Re: GIL Review)

Lubomir Bourdev wrote:
Of course, the moment I submitted the post I came up with a much simpler alternative. We don't need any InterpolatingChannel. We simply need to create a subbyte channel value. Synopsis: // Represents a channel *value* whose size is not byte-divisible // Models ChannelValueConcept template <typename UnpackedChannelValue, int NumBits> class packed_channel_value { public: typedef ChannelValue value_type; packed_channel_value(const value_type& data) : _data(data) {} packed_channel_value(const packed_channel_value& c) : _data(c._data) {} operator value_type() const { return _data&MAX_VALUE; } packed_channel_value& operator=(const value_type& data) { // warning: using this method may indicate a bug in your code! _data=data; return *this; } ... private: value_type _data; static const value_type MAX_VALUE = (1<<NumBits)-1; }; The difference between this and the packed_channel_reference class is that this one holds a copy of the data, whereas the packed channel reference holds a reference to the data which is located remotely. Now our channel type is simply: typedef packed_channel_value<uint16_t,10> v210_channel_t; Our pixel model is simply: typedef pixel<v210_channel_t, ycbcr_t> v210_pixel_t; We keep the same model of pixel iterator I outlined earlier. But we simply instantiate it with the correct values: reference v120_pixel_ptr::dereference() const { switch (index) { ... case 3: return reference( v120_channel_t(Y3), v120_channel_t((CB1+CB2)/2), v120_channel_t((CR1+CR2)/2)); } } Where "reference" is the same type as "value_type" (since this is an immutable view) Y3,CB1,CB2,CR1 and CR2 are the values of the corresponding 10-bit channels (some shift and mask math necessary) In short, dropping the requirement to write pixel-by-pixel into v210 (which is not a well defined operation anyway) results in a simpler and faster implementation. Lubomir
participants (1)
-
Lubomir Bourdev