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