root/src/add-ons/media/media-add-ons/radeon/VideoIn.h
/******************************************************************************
/
/       File:                   VideoIn.h
/
/       Description:    High-Level ATI Radeon Video Capture Interface.
/
/       Copyright 2001, Carlos Hasan
/
*******************************************************************************/

#ifndef __VIDEO_IN_H__
#define __VIDEO_IN_H__

#include "Radeon.h"
#include "Capture.h"
//#include "Overlay.h"
#include "I2CPort.h"
#include "VIPPort.h"
#include "Tuner.h"
#include "MSP3430.h"
#include "Theater.h"
#include "Theater100.h"
#include "Theater200.h"

enum video_in_source {
        C_VIDEO_IN_TUNER,
        C_VIDEO_IN_COMPOSITE,
        C_VIDEO_IN_SVIDEO,
};

enum { C_VIDEO_IN_SOURCE_MAX = 2 };

enum video_in_standard {
        C_VIDEO_IN_NTSC,
        C_VIDEO_IN_NTSC_JAPAN,
        C_VIDEO_IN_NTSC_443,
        C_VIDEO_IN_PAL_M,
        C_VIDEO_IN_PAL_BDGHI,
        C_VIDEO_IN_PAL_N,
        C_VIDEO_IN_PAL_60,
        C_VIDEO_IN_PAL_NC,
        C_VIDEO_IN_SECAM,
        C_VIDEO_IN_NTSC_RAW
};      

enum { C_VIDEO_IN_STANDARD_MAX = 8 };

enum video_in_capture_mode {
        C_VIDEO_IN_FIELD,
        C_VIDEO_IN_BOB,
        C_VIDEO_IN_WEAVE
};

enum { C_VIDEO_IN_CAPTURE_MODE_MAX = 2 };

enum video_in_resolution {
        C_VIDEO_IN_NTSC_SQ_WIDTH        = 640,
        C_VIDEO_IN_NTSC_SQ_HEIGHT       = 480,
        
        C_VIDEO_IN_NTSC_CCIR_WIDTH      = 720,
        C_VIDEO_IN_NTSC_CCIR_HEIGHT     = 480,
        
        C_VIDEO_IN_PAL_SQ_WIDTH         = 768,
        C_VIDEO_IN_PAL_SQ_HEIGHT        = 576,
        
        C_VIDEO_IN_PAL_CCIR_WIDTH       = 720,
        C_VIDEO_IN_PAL_CCIR_HEIGHT      = 576
};

/*enum video_in_frame_rate {
        C_VIDEO_IN_NTSC_FRAME_RATE      = 29976,
        C_VIDEO_IN_PAL_FRAME_RATE       = 25000
};*/

enum video_in_capabilities {
        C_VIDEO_IN_HAS_SOUND            = 1 << 0,
        C_VIDEO_IN_HAS_TUNER            = 1 << 1,
        C_VIDEO_IN_HAS_COMPOSITE        = 1 << 2,
        C_VIDEO_IN_HAS_SVIDEO           = 1 << 3
};

class CVideoIn {
public:
        CVideoIn( const char *dev_name );
        
        ~CVideoIn();
        
        status_t InitCheck();

        int Capabilities() const;
        
public:
        void Start(video_in_source source, video_in_standard standard,
                           video_in_capture_mode mode, int width, int height);
        
        void Stop();

        int Capture(color_space colorSpace, void * bits, int bitsLength,
                                int bytesPerRow, int * sequence, short * number, bigtime_t * when);
        
public:
        void SetBrightness(int brightness);
        
        void SetContrast(int contrast);
        
        void SetSaturation(int saturation);
        
        void SetHue(int hue);
        
        void SetSharpness(int sharpness);

        void SetFrequency(float frequency, float picture);

        float FrequencyForChannel(int channel, video_in_standard standard);
        
        bool SetChannel(int channel, video_in_standard standard);
        
        int32 getFrameRate( video_in_standard standard );
        
        void getActiveRange( video_in_standard standard, CRadeonRect &rect );
        
private:
        void FreeBuffers();
        
        void Trace(const char * message) const;
                
private:
        CRadeon fRadeon;
        CCapture fCapture;
        CI2CPort fI2CPort;
        CTheater* fTheater;
        CTuner fTuner;
        CMSP3430 fSound;
        int32 fBuffer0;
        int32 fBuffer1;
        int32 fBuffer0Handle;
        int32 fBuffer1Handle;
        void *convert_buffer;
        int fBufferLength;
        int fBufferBytesPerRow;
        int fBufferSequence;
        bigtime_t fBufferPeriod;
        bool started;
};

#endif