root/src/add-ons/media/media-add-ons/radeon/Capture.h
/******************************************************************************
/
/       File:                   Capture.h
/
/       Description:    ATI Radeon Capture Unit interface.
/
/       Copyright 2001, Carlos Hasan
/
*******************************************************************************/

#ifndef __CAPTURE_H__
#define __CAPTURE_H__

#include "Radeon.h"

enum capture_buffer_mode {
        C_RADEON_CAPTURE_FIELD_SINGLE   = 0,
        C_RADEON_CAPTURE_FIELD_DOUBLE   = 1,
        C_RADEON_CAPTURE_BOB_SINGLE             = 2,
        C_RADEON_CAPTURE_BOB_DOUBLE             = 3,
        C_RADEON_CAPTURE_WEAVE_SINGLE   = 4,
        C_RADEON_CAPTURE_WEAVE_DOUBLE   = 5
};
        
enum capture_stream_format {
        C_RADEON_CAPTURE_BROOKTREE              = 0,
        C_RADEON_CAPTURE_CCIR656                = 1,
        C_RADEON_CAPTURE_ZOOMVIDEO              = 2,
        C_RADEON_CAPTURE_VIP                    = 3
};

enum capture_interrupt_mask {
        C_RADEON_CAPTURE_BUF0_INT               = 1 << 0,
        C_RADEON_CAPTURE_BUF0_EVEN_INT  = 1 << 1,
        C_RADEON_CAPTURE_BUF1_INT               = 1 << 2,
        C_RADEON_CAPTURE_BUF1_EVEN_INT  = 1 << 3,
        C_RADEON_CAPTURE_VBI0_INT               = 1 << 4,
        C_RADEON_CAPTURE_VBI1_INT               = 1 << 5
};
        
class CCapture {
public:
        CCapture(CRadeon & radeon);
        
        ~CCapture();

        status_t InitCheck() const;
        
        void SetBuffer(capture_stream_format format, capture_buffer_mode mode,
                                   int offset0, int offset1, int size, int pitch);

        void SetClip(int left, int top, int right, int bottom);

        void SetVBIBuffer(int offset0, int offset1, int size);
                
        void SetVBIClip(int left, int top, int right, int bottom);
        
        void Start(bool vbi = false);

        void Stop();

public:
        void SetInterrupts(bool enable);
        
        int WaitInterrupts(int * sequence, bigtime_t * when, bigtime_t timeout);
        
private:
        int Register(radeon_register index, int mask);

        void SetRegister(radeon_register index, int value);
        
        void SetRegister(radeon_register index, int mask, int value);
                
private:
        CRadeon & fRadeon;
        capture_buffer_mode fMode;
        capture_stream_format fFormat;
        int fOffset0;
        int fOffset1;
        int fVBIOffset0;
        int fVBIOffset1;
        int fSize;
        int fVBISize;
        int fPitch;
        CRadeonRect fClip;
        CRadeonRect fVBIClip;
};

#endif