📄 dvb_osd.c
字号:
/**************************************************************************
(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 + -