⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 dvb_osd.c

📁 DVB软件,基于CT216软件的开发源程序.
💻 C
📖 第 1 页 / 共 5 页
字号:
/**************************************************************************

        (C)Copyright Cheertek Inc. 2002-2004,
           D700, all right reserved.

        Product : STB Firmware

****************************************************************************/
#include	<string.h>
#include    <stdio.h>
#include    <stdlib.h>
#include    "ap_defs.h"
#include    "dvb_type.h"
#include    "dvb_osd.h"
#include    "dvb_sys.h"
#include    "dvb_msg.h"
#include    "dvb_osd.h"
#include    "dvb_sbtl.h"
#include    "ct_osd.h"
#include    "ct_sys.h"
#include    "ct_video.h"
#include    "av_cfg.h"


/*******************************************************************************************/
//#define DVB_OSD_DEBUG

#define OSD_MSG(p)			DVB_Msg p

#ifdef DVB_OSD_DEBUG
#define OSD_DEBUG(p) 		printf p
#else
#define OSD_DEBUG(p)
#endif
/*******************************************************************************************/
//#define OSD_DIRECT_ACCESS_MODE
/*******************************************************************************************/
#define MAX_LINE_MAP_PAGE_NUMBER            64
#define OSD_BMP_COLOR_START_INDEX           0
#define OSD_SYSTEMICON_COLOR_START_INDEX    0
/*******************************************************************************************/
#define DVB_MallocLineMap
/*!
 * Define the bitmap load parameters.
 */
typedef struct
{
	EN_CT_OSD_FRAME_REGION		enRegion;					    /*!< Region handle for bitmap load		*/
	u16		                    u16PosX;						/*!< Position X in destination buffer	*/
	u16		                    u16PosY;						/*!< Position Y in destination buffer	*/
	u16		                    u16Width;						/*!< Width of bmp						*/
	u16		                    u16Height;						/*!< Height of bmp						*/
	u8 *	                    pu8Data;						/*!< Pointer to BMP data buffer			*/
} OSD_BmpLoadParams;
/*******************************************************************************************/
typedef struct
{
	u8 u8Patten;
	u8 u8LeftIdx;
	u8 u8RightIdx;
}ST_DECODE_NODE;
/*******************************************************************************************/
ST_DECODE_NODE* stDecodeNode;
u8 u8NodeNumber, u8BitPosition, u8CodeSize;
u8 *pu8Code;
u16 u16BmpWidth;
/*******************************************************************************************/
EN_OSD_MODE enCurrentOSDMode = EN_OSD_MODE_DISABLE;
static EN_OSD_MODE enPreviousMode = EN_OSD_MODE_DISABLE;
CTOS_SEMAPHORE stDvbOsdSemaphore;
static bool8    b8DvbOsdInit    = FALSE;
/*******************************************************************************************/
u16                     u16ToatalLoadBmp;
DVB_OSD_BmpParameter    BmpParameter[MAX_BMP_IN_SDRAM_NUMBER];
/*******************************************************************************************/
static u16      u16LineMapIdx;
static u32*     pu32LineMap=NULL;
static u16      u16LinemapDramIndex;
static u32      u32LinemapAddr;
static bool8*   pb8EnableLinemapPicture = NULL;
/*******************************************************************************************/
u16                         u16OSDFrameHandleID         = CT_OSD_FRAME_ERROR_HANDLE_ID;
EN_CT_OSD_FRAME_REGION      enOsdOperationCtRegion      = EN_CT_OSD_FRAME_REGION_DISPLAY;
bool8                       b8OSDDrawStringFGColorKey   = FALSE;
bool8                       b8OSDDrawStringBGColorKey   = FALSE;
u16                         u16OSDDrawStringFgColor     = 0;
u16				  u16OSDDrawStringFgColorSave	 =0;
u16                         u16OSDDrawStringBgColor     = 0;
u16                         u16OSDDrawStringBgColorSave     = 0;
u16                         u16TransponderColorIdx      = 255;
u16                         u16AreaCopyColorKeyIndex    = 0;
bool8                       b8AreaCopyColorKeyEnable    = TRUE;
u16                         u16OSDFrameMixRatio         = 55;
/*******************************************************************************************/
extern bool8 GrFrame_FillRectangle(u16 u16RegionId,	u16 u16X0, u16 u16Y0, u16 u16Width,	u16 u16Height, u8 u8Color);
extern void GrFrame_CopyBitmapDataToRegion(u16 u16RegionId,	u16 u16X0, u16 u16Y0, u16 u16Width,	u16 u16Height, u8 *pu8BitmapData, u8 u8Colorkey );
extern void GrFrame_CopyRegionDataToBitmap(u16 u16RegionId, u16 u16X0, u16 u16Y0, u16 u16Width,	u16 u16Height ,	u8 *pu8BitmapData );
extern bool8 GrFrame_RegionCopy(u16 u16DstRegionId,	u16 u16DstX0, u16 u16DstY0,	u16 u16SrcRegionId,	u16 u16SrcX0, u16 u16SrcY0,	u16 u16Width, u16 u16Height, u8	u8Ck, u8	u8CkEnable);
extern void GRFrame_SetFontInfo(DVB_OSD_UNICODE_FONT_PARAMETER stUsrFontsAddr);
extern void GrFrame_DrawString(u16 u16RegionId, u16 u16X, u16 u16Y, u16 u16CharSpace, u16 *pu16CharIndex, u16 u16StrLength, u8 u8BackColor, u8 u8ForeColor,u8 u8IsColorkey) ;
extern void GrFrame_DrawUnicodeString(u16 u16RegionId,	u16 u16X0, u16 u16Y0, u16 u16CharSpace, u16 u16MatrixW, u16 u16MatrixH, ct_sm_CharGlyph **CharDeailData, u16 u16StrLength, u8 u8BackColor, u8 u8ForeColor, u8 u8IsColorkey);
extern void GrFrame_DrawTTXString(u16 u16RegionId, u16 u16X0, u16 u16Y0, u16 u16CharSpace, u16 u16MatrixW, 
				u16	u16MatrixH,	ct_sm_CharGlyph **CharDeailData, u8 u8BackColor, u8 u8ForeColor,u8	u8IsColorkey,
				bool8 isDoubleWidth, bool8 	isDoubleHeight, u16 u16StrLength);
extern void GrFrame_SetVSize(bool8 b8Enable);	
extern void GrFrame_UpdateChar(bool8 b8Enable);			
/*******************************************************************************************/
#ifdef SHOW_MUTE_IN_CURSOR
void DVB_OSD_Load_Cursor_Palette(u32* pu32Data)
{
	CT_MPG_CursorLoadPalette(pu32Data);   
};// 載入 palette
void DVB_OSD_Load_Cursor_Data(u32* pu32Data)
{
 	CT_MPG_CursorLoadData(pu32Data);    // 載入 data
};
void DVB_OSD_Cursor_Display(EN_CT_VID_SHOWN enVisible)
{
	CT_MPG_CursorVisible(enVisible);
};
void DVB_OSD_Cursor_SetPosition(u16 u16CurXPos, u16 u16CurYPos)
{
	CT_MPG_CursorSetPosition(u16CurXPos,u16CurYPos);
};
#endif
EN_CT_RS_LAYER OSD_GetCtRSLayerByDvbRSLayer(EN_RS_LAYER enDvbRSLayer)
{
    EN_CT_RS_LAYER enCtRSLayer = EN_CT_RECTANGLE_STRIP_LAYER1;
    switch(enDvbRSLayer)
    {
        default:
        case EN_RECTANGLE_STRIP_LAYER1:
            enCtRSLayer = EN_CT_RECTANGLE_STRIP_LAYER1;
            break;
        case EN_RECTANGLE_STRIP_LAYER2:
            enCtRSLayer = EN_CT_RECTANGLE_STRIP_LAYER2;
            break;
        case EN_RECTANGLE_STRIP_LAYER3:
            enCtRSLayer = EN_CT_RECTANGLE_STRIP_LAYER3;
            break;
        case EN_RECTANGLE_STRIP_LAYER4:
            enCtRSLayer = EN_CT_RECTANGLE_STRIP_LAYER4;
            break;
    }
    return enCtRSLayer;
}
/*******************************************************************************************/
EN_CT_OSD_FRAME_REGION OSD_GetCtRegionByDvbRegion(u16 u16DvbRegion)
{
    EN_CT_OSD_FRAME_REGION enCtRegion = EN_CT_OSD_FRAME_REGION_DISPLAY;
    switch(u16DvbRegion)
    {
        default:
        case OSD_FRAME_DISPLAY_REGION:
            enCtRegion = EN_CT_OSD_FRAME_REGION_DISPLAY;
            break;
        case OSD_FRAME_WORKING_REGION:
            enCtRegion = EN_CT_OSD_FRAME_REGION_WORKING;
            break;
#ifndef NO_BMP_REGION               
        case OSD_FRAME_BITMAP_REGION:
            enCtRegion = EN_CT_OSD_FRAME_REGION_BITMAP;
            break;
#endif // end #ifndef NO_BMP_REGION   
    }
    return enCtRegion;
}
/*******************************************************************************************/
u16 OSD_GetDvbRegionByCtRegion(EN_CT_OSD_FRAME_REGION enCtRegion)
{
    u16 u16DvbRegion = OSD_FRAME_DISPLAY_REGION;
    switch(enCtRegion)
    {
        default:
        case EN_CT_OSD_FRAME_REGION_DISPLAY:
            u16DvbRegion = OSD_FRAME_DISPLAY_REGION;
            break;
        case EN_CT_OSD_FRAME_REGION_WORKING:
            u16DvbRegion = OSD_FRAME_WORKING_REGION;
            break;
#ifndef NO_BMP_REGION           
        case EN_CT_OSD_FRAME_REGION_BITMAP:
            u16DvbRegion = OSD_FRAME_BITMAP_REGION;
            break;
#endif // end #ifndef NO_BMP_REGION   
    }
    return u16DvbRegion;
}
/*******************************************************************************************/
void OSD_ClearRegion(EN_CT_OSD_FRAME_REGION enCtRegion)
{
    CT_OSD_FrameHandleParams*    pstFrameHandle  = NULL;
    CT_OSD_FillRectParam   stFillRect;

    CT_MPG_VideoWaitVSync();

    pstFrameHandle = CT_OSD_GetFrameHandle(u16OSDFrameHandleID);
    if (pstFrameHandle==NULL)
    {
        return;
    }

    switch(enCtRegion)
    {
        default:
        case EN_CT_OSD_FRAME_REGION_DISPLAY:
            stFillRect.u16Height    = pstFrameHandle->stInitParams.u16DisplayRegionHeight;
            break;
        case EN_CT_OSD_FRAME_REGION_WORKING:
            stFillRect.u16Height    = pstFrameHandle->stInitParams.u16WorkingRegionHeight;
            break;
#ifndef NO_BMP_REGION          
        case EN_CT_OSD_FRAME_REGION_BITMAP:
            stFillRect.u16Height    = pstFrameHandle->stInitParams.u16BitmapRegionHeight;
            break;
#endif      
    }
    stFillRect.enRegion = enCtRegion;
    stFillRect.u16PosX      = 0;
    stFillRect.u16PosY      = 0;
    stFillRect.u16Width     = pstFrameHandle->stInitParams.u16RegionWidth;
    stFillRect.u16ColorIdx  = u16TransponderColorIdx;
#ifdef OSD_DIRECT_ACCESS_MODE
    GrFrame_FillRectangle(   stFillRect.enRegion,
                             stFillRect.u16PosX,
                             stFillRect.u16PosY,
                             stFillRect.u16Width,
                             stFillRect.u16Height,
                             (u8)stFillRect.u16ColorIdx);
#else
    CT_OSD_FillRectangle(u16OSDFrameHandleID, &stFillRect);
#endif
}
/*******************************************************************************************/
void DVB_OSD_ClearRegion(u16 u16RegionID)
{
    EN_CT_OSD_FRAME_REGION  enCtRegion           = EN_CT_OSD_FRAME_REGION_WORKING;

    enCtRegion = OSD_GetCtRegionByDvbRegion(u16RegionID);
    OSD_ClearRegion(enCtRegion);
}
/*******************************************************************************************/
u32 DVB_OSDGetDramBufferUpperBoundary(void)
{
    return CT_OSD_GetDramBufferUpperBoundary();
}
/*******************************************************************************************/
u32 DVB_OSDGetDramBufferLowerBoundary(void)
{
    return CT_OSD_GetDramBufferLowerBoundary();
}
/*******************************************************************************************/
bool8 DVB_OSDSetMixRatio(u8 u8MixRatio)
{
    u16OSDFrameMixRatio = (u16)u8MixRatio;
    return CT_OSD_SetFrameHandleMixRatio(u16OSDFrameHandleID,u16OSDFrameMixRatio);
}
/*******************************************************************************************/
void DVB_OSDRectangle (u16 u16PosX, u16 u16PosY, u16 u16Width, u16 u16Height, u8 u8ColorIdx)
{
    CT_OSD_FillRectParam   stFillRect;

    stFillRect.enRegion     = enOsdOperationCtRegion;
    stFillRect.u16PosX      = u16PosX;
    stFillRect.u16PosY      = u16PosY;
    stFillRect.u16Width     = u16Width;
    stFillRect.u16Height    = u16Height;
    stFillRect.u16ColorIdx  = (u16)u8ColorIdx;
    
#ifdef OSD_DIRECT_ACCESS_MODE
    GrFrame_FillRectangle(   stFillRect.enRegion,
                             stFillRect.u16PosX,
                             stFillRect.u16PosY,
                             stFillRect.u16Width,
                             stFillRect.u16Height,
                             (u8)stFillRect.u16ColorIdx);
#else
    CT_OSD_FillRectangle(u16OSDFrameHandleID, &stFillRect);
#endif
}
/*******************************************************************************************/
void DVB_OSDLinemap_UnLoad (u8 u8LinemapIdx)
{
	u32 u32Addr = 0;
	u32 u32Data = 0;

	if (pb8EnableLinemapPicture == NULL)
	{
		return;
	}

	if ( u8LinemapIdx>=DVB_OSDLinemap_GetTotalNumber() )
	{
		return;
	}
	if (CT_OSD_LinemapGetMpegBufferAddr((u16)u8LinemapIdx,&u32Addr)!=TRUE)
	{
	    return;
	}
	u32Data=0;
    CT_OSD_LinemapFillCommandData(u32Addr,(u32*)&u32Data, 1);
	pb8EnableLinemapPicture[u8LinemapIdx]=FALSE;
}

/*******************************************************************************************/
bool8 DVB_OSDLinemap_LoadAll (u8 u8LinemapIdx, u32 *pu32Data, u16 u16NumberofData)
{
	u32 u32Addr = 0;

	if (pb8EnableLinemapPicture == NULL)
	{
		return FALSE;
	}

	if ( u8LinemapIdx >=DVB_OSDLinemap_GetTotalNumber() )
	{
		return FALSE;
	}
	if (CT_OSD_LinemapGetMpegBufferAddr((u16)u8LinemapIdx,&u32Addr)!=TRUE)
	{
	    return FALSE;
	}
    CT_OSD_LinemapFillCommandData(u32Addr,(u32*)pu32Data, u16NumberofData);
	pb8EnableLinemapPicture[u8LinemapIdx]=TRUE;
	return TRUE;
}
/*******************************************************************************************/
bool8 DVB_OSDLinemap_LoadStart (u8 u8LinemapIdx, u32 u32Data)
{
	if ((u8LinemapIdx>=DVB_OSDLinemap_GetTotalNumber())||
	    ((u32Data>>16)>((u32)DVB_OSDLinemap_GetTotalLine())))
	{
		return FALSE;
	}

    if (CT_OSD_LinemapGetMpegBufferAddr((u16)u8LinemapIdx,&u32LinemapAddr)!=TRUE)
	{
	    return FALSE;
	}
	
	gen_point = 324;
	pu32LineMap=(u32*)DVB_MemoryAllocate(MAX_LINE_MAP_PAGE_NUMBER*4);
	if ( pu32LineMap==NULL )
	{
		return FALSE;
	}
	*(pu32LineMap+0)=u32Data;
	u16LineMapIdx=1;
	u16LinemapDramIndex=0;
	return TRUE;
}
/*******************************************************************************************/
bool8 DVB_OSDLinemap_LoadNext (u32 u32Data)
{
	if ( pu32LineMap==NULL )
		return FALSE;

    if (u16LineMapIdx >= (DVB_OSDLinemap_GetTotalLine()+1))
	{
		return FALSE;
	}

	*(pu32LineMap+(u16LineMapIdx%MAX_LINE_MAP_PAGE_NUMBER))=u32Data;
	u16LineMapIdx++;

	if ( (u16LineMapIdx%MAX_LINE_MAP_PAGE_NUMBER)==0 )
	{

		CT_OSD_LinemapFillCommandData(u32LinemapAddr+4*u16LinemapDramIndex,(u32*)pu32LineMap, MAX_LINE_MAP_PAGE_NUMBER);
		u16LinemapDramIndex+=MAX_LINE_MAP_PAGE_NUMBER;
	}
	return TRUE;
}
/*******************************************************************************************/
bool8 DVB_OSDLinemap_Finish (u8 u8LinemapIdx)
{
	if ( u8LinemapIdx>=DVB_OSDLinemap_GetTotalNumber() )
	{
		return FALSE;
	}
	if ( pu32LineMap==NULL )
		return FALSE;

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -