root/extra_lib/include/avcap/FormatManager.h

/* [<][>][^][v][top][bottom][index][help] */

INCLUDED FROM


/*
 * (c) 2005, 2008 Nico Pranke <Nico.Pranke@googlemail.com>, Robin Luedtke <RobinLu@gmx.de>
 *
 * This file is part of avcap.
 *
 * avcap is free software: you can redistribute it and/or modify
 * it under the terms of the GNU General Public License as published by
 * the Free Software Foundation, either version 3 of the License, or
 * (at your option) any later version.
 *
 * avcap is distributed in the hope that it will be useful,
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 * GNU General Public License for more details.
 *
 * You should have received a copy of the GNU General Public License
 * along with avcap.  If not, see <http://www.gnu.org/licenses/>.
 */

/* avcap is free for non-commercial use.
 * To use it in commercial endeavors, please contact Nico Pranke <Nico.Pranke@googlemail.com>
 */

#ifndef FORMATMANAGER_H_
#define FORMATMANAGER_H_

#include <list>
#include <string>

#if !defined(_MSC_VER) && !defined(USE_PREBUILD_LIBS)
# include <stdint.h>
# include "avcap-config.h"
#endif

#include "Manager.h"
#include "avcap-export.h"

#ifdef AVCAP_LINUX
# include <linux/types.h>
# ifdef AVCAP_HAVE_V4L2
#  include <linux/videodev2.h>
# else
#  include <linux/videodev.h>
# endif
#endif // AVCAP_LINUX

#ifdef _WIN32
typedef unsigned int uint32_t;
#endif

/* taken from linux/videodev2.h but all FormatManagers use these fourcc-codes*/

#define FOURCC(a,b,c,d)\
        (((uint32_t)(a)<<0)|((uint32_t)(b)<<8)|((uint32_t)(c)<<16)|((uint32_t)(d)<<24))

#define PIX_FMT_RGB332  FOURCC('R','G','B','1') /*  8  RGB-3-3-2     */
#define PIX_FMT_RGB555  FOURCC('R','G','B','O') /* 16  RGB-5-5-5     */
#define PIX_FMT_RGB565  FOURCC('R','G','B','P') /* 16  RGB-5-6-5     */
#define PIX_FMT_RGB555X FOURCC('R','G','B','Q') /* 16  RGB-5-5-5 BE  */
#define PIX_FMT_RGB565X FOURCC('R','G','B','R') /* 16  RGB-5-6-5 BE  */
#define PIX_FMT_BGR24   FOURCC('B','G','R','3') /* 24  BGR-8-8-8     */
#define PIX_FMT_RGB24   FOURCC('R','G','B','3') /* 24  RGB-8-8-8     */
#define PIX_FMT_BGR32   FOURCC('B','G','R','4') /* 32  BGR-8-8-8-8   */
#define PIX_FMT_RGB32   FOURCC('R','G','B','4') /* 32  RGB-8-8-8-8   */
#define PIX_FMT_GREY    FOURCC('G','R','E','Y') /*  8  Greyscale     */
#define PIX_FMT_YVU410  FOURCC('Y','V','U','9') /*  9  YVU 4:1:0     */
#define PIX_FMT_YVU420  FOURCC('Y','V','1','2') /* 12  YVU 4:2:0     */
#define PIX_FMT_YUYV    FOURCC('Y','U','Y','V') /* 16  YUV 4:2:2     */
#define PIX_FMT_UYVY    FOURCC('U','Y','V','Y') /* 16  YUV 4:2:2     */
#define PIX_FMT_YUV422P FOURCC('4','2','2','P') /* 16  YVU422 planar */
#define PIX_FMT_YUV411P FOURCC('4','1','1','P') /* 16  YVU411 planar */
#define PIX_FMT_Y41P    FOURCC('Y','4','1','P') /* 12  YUV 4:1:1     */

/* two planes -- one Y, one Cr + Cb interleaved  */
#define PIX_FMT_NV12    FOURCC('N','V','1','2') /* 12  Y/CbCr 4:2:0  */
#define PIX_FMT_NV21    FOURCC('N','V','2','1') /* 12  Y/CrCb 4:2:0  */

/*  The following formats are not defined in the V4L2 specification */
#define PIX_FMT_YUV410  FOURCC('Y','U','V','9') /*  9  YUV 4:1:0     */
#define PIX_FMT_YUV420  FOURCC('Y','U','1','2') /* 12  YUV 4:2:0     */
#define PIX_FMT_I420    FOURCC('I','4','2','0') /* 12  identical to YU12 */
#define PIX_FMT_YYUV    FOURCC('Y','Y','U','V') /* 16  YUV 4:2:2     */
#define PIX_FMT_HI240   FOURCC('H','I','2','4') /*  8  8-bit color   */
#define PIX_FMT_HM12    FOURCC('H','M','1','2') /*  8  YUV 4:1:1 16x16 macroblocks */

/* see http://www.siliconimaging.com/RGB%20Bayer.htm */
#define PIX_FMT_SBGGR8  FOURCC('B','A','8','1') /*  8  BGBG.. GRGR.. */

/* compressed formats */
#define PIX_FMT_MJPEG    FOURCC('M','J','P','G') /* Motion-JPEG   */
#define PIX_FMT_JPEG     FOURCC('J','P','E','G') /* JFIF JPEG     */
#define PIX_FMT_DV       FOURCC('d','v','s','d') /* 1394          */
#define PIX_FMT_MPEG     FOURCC('M','P','E','G') /* MPEG-1/2/4    */

/*  Vendor-specific formats   */
#define PIX_FMT_WNVA     FOURCC('W','N','V','A') /* Winnov hw compress */
#define PIX_FMT_SN9C10X  FOURCC('S','9','1','0') /* SN9C10x compression */
#define PIX_FMT_PWC1     FOURCC('P','W','C','1') /* pwc older webcam */
#define PIX_FMT_PWC2     FOURCC('P','W','C','2') /* pwc newer webcam */
#define PIX_FMT_ET61X251 FOURCC('E','6','2','5') /* ET61X251 compression */

namespace avcap
{
class DeviceDescriptor;

        //! Description of the video standard.
        struct AVCAP_Export VideoStandard
        {
#ifdef AVCAP_LINUX
                typedef v4l2_std_id     STANDARD_ID_T;
                enum {
                        PAL = V4L2_STD_PAL_B,
                        NTSC = V4L2_STD_NTSC_M,
                        SECAM = V4L2_STD_SECAM_B
                };
#endif

#if defined (_WIN32) || defined (AVCAP_OSX)
                typedef unsigned int STANDARD_ID_T;
#endif


                std::string             name;   //!< The name of the standard.
                STANDARD_ID_T   id;             //!< A unique identifier.

                //! Constructor
                VideoStandard(const std::string& n, STANDARD_ID_T i):
                        name(n),
                        id(i)
                        {};
        };

        //! The Resolution consists of a width and a height.
        struct AVCAP_Export Resolution {
                int width, height;

                Resolution(int w, int h):
                        width(w),
                        height(h)
                        {}
        };

        //! Description of a video format.
        class AVCAP_Export Format
        {
        public:
                typedef std::list<Resolution*> ResolutionList_t;
        private:
                std::string mName;              // A textual description.
                uint32_t mFourcc;               // The Four Character Code of the format.
                ResolutionList_t        mResList;

#ifdef _WIN32
                void *mediatype;                /* stores DirectShow-specific format description (only used internaly).
                                                                 *< It is always casted to a AM_MEDIA_TYPE
                                                                 * DirectShow structure; see DirectShow documentation */
#endif

        public:
                //! Constructor
                inline Format(const std::string& n, uint32_t f):
                        mName(n), mFourcc(f)
                        {}

                //! Destructor
                virtual ~Format();

                //! Get the name of the format.
                /*! \return name */
                inline const std::string& getName() const
                        { return mName; }

                //! Get the four character code of the format (see: www.fourcc.org).
                /*! \return fourcc */
                inline uint32_t getFourcc() const
                        { return mFourcc; }

                //! Return a list of resolutions that are supported for this format.
                /*! \return the resolutions.*/
                inline const ResolutionList_t& getResolutionList() const
                        { return mResList; }

                void addResolution(int w, int h);

#ifdef _WIN32
                void* getMediaType() { return mediatype; }

                void setMediaType(void* mt) { mediatype = mt; }
#endif
        };

        //! Abstract base for classes that query and manage available formats, video-standards and resolutions of a capture device.

        /*! This class queries the formats, video-standards and resolutions provided by the device
         * and allows applications to set them.
         * The class provides a STL-list of Format-objects.
         * Actualy changing the format may be deferred by the concrete implementation until it
         * is really necessary, e.g. the capture begins, because advising the driver
         * to change the format can be a quite time-consuming operation.
         * Most of the methods in this class are implemented as a noop and are
         * reimplemented by the derived class for a concrete capture API/OS, if the method is applicable.
         */

        class AVCAP_Export FormatManager: public Manager<Format>
        {
        public:
                typedef std::list<VideoStandard*>       VideoStandardList;

        protected:
                ListType                mFormats;
                int                             mWidth;
                int                             mHeight;
                int                     mBytesPerLine;
#if defined(AVCAP_LINUX) || defined (AVCAP_OSX)
                unsigned int    mCurrentFormat;
#endif
#ifdef _WIN32
                void                    *mCurrentFormat;                // Always casted to a AM_MEDIA_TYPE DirectShow structure
#endif
                unsigned long   mImageSize;
                bool                    mModified;
                VideoStandardList       mStandards;

        public:
                //! The constructor. */
                FormatManager(DeviceDescriptor *dd);

                //! The destructor. */
                virtual ~FormatManager();

                //! Returns the STL-list of Format objects describing the available formats.
                /*! \return The format list.*/
                virtual inline const ListType& getFormatList() const
                        { return (const ListType&) mFormats; }

                //! Set the format to capture.
                /*! \param fmt The new format.
                 * \return 0, if successful, -1 else */
                virtual int setFormat(Format *fmt);

                //! Set the format to capture.
                /*! \param fourcc The four character code of the new format.
                 * \return 0, if successful, -1 else */
                virtual int setFormat(uint32_t fourcc);

                //! Get the current format.
                /*! \return The format. */
                virtual Format* getFormat();

                //! Set the image with and height.
                /*! \param w : width
                 * \param h : height
                 * \return 0, if successful, -1 else */
                virtual int setResolution(int w, int h);

                //! Set the number of used bytes per scanline, if possible.
                /*! \param bpl
                 * \return 0, if successful, -1 else */
                virtual int setBytesPerLine(int bpl);

                //! Returns the image with.
                /*! \return width*/
                virtual int getWidth();

                //! Returns the image height.
                /*! \return height*/
                virtual int getHeight();

                //! Returns the bytes per line.
                /*! \return bpl*/
                virtual int getBytesPerLine();

                //! Flushes the format, i.e. the driver is advised to apply the current format settings.
                /*! \return  0, if successful, -1 else */
                virtual int flush();

                //! The number of bytes that an image of the current size requires to be stored in memory, including padding.
                /*! \return size */
                virtual size_t getImageSize();

                //! Set the framerate.
                /*! The default implementation returns -1
                 * \param fps : the number of frames per second.
                 * \return 0 if successful, -1 on failure */
                virtual int setFramerate(int fps);

                //! Get the current framerate.
                /*! The default implementation returns -1
                 *! \return the frames per second */
                virtual int getFramerate();

                //! Get the STL-list of avaliable video standards described by VideoStandard objects.
                /*! \return standards list*/
                virtual inline const VideoStandardList& getVideoStandardList() const
                        { return (const VideoStandardList&) mStandards; }

                //! Get the currently used video standard.
                /*! The default implementation returns 0
                 * \return the current standard or 0, if not applicable */
                virtual const VideoStandard* getVideoStandard();

                //! Set the video standard to use.
                /*! Attention: not all video standards can be set in conjunction with each connector and format.
                 * The default implementation returns -1
                 * \param std The new video standard.
                 * \return 0, if successful, -1 else */
                virtual int setVideoStandard(const VideoStandard* std);

                virtual void query() = 0;
        };
};
#endif //FORMATMANAGER_H_



/* [<][>][^][v][top][bottom][index][help] */