1 // 2 // Copyright (C) 2008, 2009, 2010, 2011, 2012 3 // Free Software Foundation, Inc. 4 // 5 // This program is free software; you can redistribute it and/or modify 6 // it under the terms of the GNU General Public License as published by 7 // the Free Software Foundation; either version 3 of the License, or 8 // (at your option) any later version. 9 // 10 // This program is distributed in the hope that it will be useful, 11 // but WITHOUT ANY WARRANTY; without even the implied warranty of 12 // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 13 // GNU General Public License for more details. 14 // 15 // You should have received a copy of the GNU General Public License 16 // along with this program; if not, write to the Free Software 17 // Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA 18 19 20 #ifndef GNASH_VIDEOCONVERTER_H 21 #define GNASH_VIDEOCONVERTER_H 22 23 #include <boost/noncopyable.hpp> 24 #include <cstdint> 25 #include <array> 26 #include <memory> 27 28 namespace gnash { 29 namespace media { 30 31 32 33 /// Image buffer wrapper 34 // 35 /// Unfortunately, the GnashImage buffer class currently insists on owning 36 /// its buffer. Hacking around this results in things like gnashGstBuffer, 37 /// which is less than desirable. Furthermore, it only supports a handful of 38 /// pixel and image formats. Something more elaborate is needed to support the 39 /// various YUV formats and different bit depths for RGB. But in the mean time: 40 /// here's a simple image class for use in VideoConverter, at least until we 41 /// merge the image classes. 42 43 struct ImgBuf : public boost::noncopyable 44 { 45 typedef std::uint32_t Type4CC; 46 typedef void (*FreeFunc)(void*); 47 ImgBufImgBuf48 ImgBuf(Type4CC t, std::uint8_t* dataptr, size_t datasize, size_t w, 49 size_t h) 50 : type(t), 51 data(dataptr), 52 size(datasize), 53 width(w), 54 height(h), 55 dealloc(array_delete) 56 {} 57 ~ImgBufImgBuf58 ~ImgBuf() 59 { 60 dealloc(data); 61 } 62 array_deleteImgBuf63 static void array_delete(void* voidptr) 64 { 65 std::uint8_t* ptr = static_cast<std::uint8_t*>(voidptr); 66 delete [] ptr; 67 } 68 noopImgBuf69 static void noop(void* /*voidptr*/) 70 { 71 } 72 73 Type4CC type; 74 std::uint8_t* data; 75 76 size_t size; // in bytes 77 size_t width; // in pixels 78 size_t height; // in pixels 79 80 std::array<size_t, 4> stride; 81 82 FreeFunc dealloc; 83 }; 84 85 86 /// Abstract base class for video image space conversion. 87 88 class VideoConverter : public boost::noncopyable { 89 90 public: VideoConverter(ImgBuf::Type4CC srcFormat,ImgBuf::Type4CC dstFormat)91 VideoConverter(ImgBuf::Type4CC srcFormat, ImgBuf::Type4CC dstFormat) 92 : _src_fmt(srcFormat), 93 _dst_fmt(dstFormat) 94 { 95 } 96 ~VideoConverter()97 virtual ~VideoConverter() 98 { 99 } 100 101 /// Convert a (video) image from one colorspace to another. 102 // 103 /// @param src the image to convert 104 /// @return the converted image or a NULL unique_ptr if an error occurred. 105 virtual std::unique_ptr<ImgBuf> convert(const ImgBuf& src) = 0; 106 107 protected: 108 ImgBuf::Type4CC _src_fmt; 109 ImgBuf::Type4CC _dst_fmt; 110 }; 111 112 113 } // gnash.media namespace 114 } // gnash namespace 115 116 #endif // __VIDEOCONVERTER_H__ 117