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

📄 dvb_osd.c

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

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

    CT_OSD_LinemapFillCommandData(u32LinemapAddr+4*u16LinemapDramIndex,(u32*)pu32LineMap,  (u16LineMapIdx%MAX_LINE_MAP_PAGE_NUMBER));
	pb8EnableLinemapPicture[u8LinemapIdx]=TRUE;
	DVB_MemoryFree((u8*)pu32LineMap);
	pu32LineMap=NULL;
	return TRUE;
}
/*******************************************************************************************/
bool8 DVB_OSDLinemap_Load_Abs(u8 u8LinemapIdx, u32* pu32LinemapAddr)
{
	u32 u32Addr = 0;
	u16 u16len  = 0;

	if (u8LinemapIdx>=DVB_OSDLinemap_GetTotalNumber())
	{
		return FALSE;
	}
	if (CT_OSD_LinemapGetMpegBufferAddr((u16)u8LinemapIdx,&u32Addr)!=TRUE)
	{
	    return FALSE;
	}
	if (pb8EnableLinemapPicture == NULL)
	{
		return FALSE;
	}

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

	u16len=(u16)((*pu32LinemapAddr)>>20)+1;
	u16len&=0x3FF;
    CT_OSD_LinemapFillCommandData(u32Addr,(u32*)pu32LinemapAddr, u16len);
	pb8EnableLinemapPicture[u8LinemapIdx]=TRUE;
	return TRUE;
}
/*******************************************************************************************/
bool8 DVB_OSDLinemap_Show (u16 u16PosX, u16 u16PosY, u8 u8LinemapIdx, u8 u8ColorIdx)
{
	u32                 u32Addr = 0;
	u32                 u32Temp = 0;
    CT_OSD_LinemapParam	stLinemap;
    bool8               b8Status = FALSE;

    if (enCurrentOSDMode == EN_OSD_MODE_DISABLE)
	{
        return FALSE;
	}

	if ( u8LinemapIdx>=DVB_OSDLinemap_GetTotalNumber() )
	{
		return FALSE;
	}

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

	if ( pb8EnableLinemapPicture[u8LinemapIdx]==FALSE )
	{
		return FALSE;
	}
    if (CT_OSD_LinemapGetMpegBufferAddr((u16)u8LinemapIdx,&u32Addr)!=TRUE)
	{
	    return FALSE;
	}

    if (CT_OSD_LinemapGetCommandData(u32Addr, (u32*)&u32Temp, 1)!=TRUE)
    {
        return FALSE;
    }

    stLinemap.u32MpegBufferAddr     = u32Addr;
    stLinemap.enRegion              = enOsdOperationCtRegion;
    stLinemap.u16LineNum            = (u16)(u32Temp>>16);
	stLinemap.u16PosX               = u16PosX;
	stLinemap.u16PosY               = u16PosY;
	stLinemap.u16ColorBase          = (u16)u8ColorIdx;
	stLinemap.b8AbsoluteColorMode   = FALSE;
	stLinemap.pu32CmdData           = NULL;    
    b8Status = CT_OSD_Linmap(u16OSDFrameHandleID, &stLinemap);    
	return b8Status;
}
/*******************************************************************************************/
bool8 DVB_OSDLinemap_Show_Abs_Color (u16 u16PosX, u16 u16PosY, u8 u8LinemapIdx)
{
	u32                 u32Addr     = 0;
	u32                 u32Temp     = 0;
	bool8               b8Status    = FALSE;
    CT_OSD_LinemapParam	stLinemap;

    if (enCurrentOSDMode == EN_OSD_MODE_DISABLE)
	{
        return FALSE;
	}
	if ( u8LinemapIdx>=DVB_OSDLinemap_GetTotalNumber() )
	{
		return FALSE;
	}
	if (pb8EnableLinemapPicture == NULL)
	{
		return FALSE;
	}

	if ( pb8EnableLinemapPicture[u8LinemapIdx]==FALSE )
	{
		return FALSE;
	}
    if (CT_OSD_LinemapGetMpegBufferAddr((u16)u8LinemapIdx,&u32Addr)!=TRUE)
	{
	    return FALSE;
	}

    if (CT_OSD_LinemapGetCommandData(u32Addr, (u32*)&u32Temp, 1)!=TRUE)
    {
        return FALSE;
    }

    stLinemap.u32MpegBufferAddr     = u32Addr;
    stLinemap.enRegion           = enOsdOperationCtRegion;
    stLinemap.u16LineNum            = (u16)(u32Temp>>20);
	stLinemap.u16PosX               = u16PosX;
	stLinemap.u16PosY               = u16PosY;
	stLinemap.u16ColorBase          = 0;
	stLinemap.b8AbsoluteColorMode   = TRUE;
	stLinemap.pu32CmdData           = NULL;
    
    b8Status = CT_OSD_Linmap(u16OSDFrameHandleID, &stLinemap);    
	return b8Status;
}
/*******************************************************************************************/
void DVB_OSDSetTextColor (u8 u8ColorIdx)
{
    CT_OS_WaitOnSemaphore(&stDvbOsdSemaphore, CTOS_WAIT);
    u16OSDDrawStringFgColor = (u16)u8ColorIdx;
    CT_OS_FreeSemaphore(&stDvbOsdSemaphore);
}
/*******************************************************************************************/
void DVB_OSDSaveCurrentColor(void)
{
    CT_OS_WaitOnSemaphore(&stDvbOsdSemaphore, CTOS_WAIT);
    u16OSDDrawStringFgColorSave=u16OSDDrawStringFgColor ;
    u16OSDDrawStringBgColorSave=u16OSDDrawStringBgColor;
    CT_OS_FreeSemaphore(&stDvbOsdSemaphore);
}
/*******************************************************************************************/
void DVB_OSDGetSaveColor(void)
{
    CT_OS_WaitOnSemaphore(&stDvbOsdSemaphore, CTOS_WAIT);
    u16OSDDrawStringFgColor    =u16OSDDrawStringFgColorSave ;
    u16OSDDrawStringBgColor    =u16OSDDrawStringBgColorSave ;
    CT_OS_FreeSemaphore(&stDvbOsdSemaphore);
}

void DVB_OSDSetBackgroundColor (u8 u8ColorIdx)
{
    CT_OS_WaitOnSemaphore(&stDvbOsdSemaphore, CTOS_WAIT);
    u16OSDDrawStringBgColor = (u16)u8ColorIdx;
    CT_OS_FreeSemaphore(&stDvbOsdSemaphore);
}
/*******************************************************************************************/
EN_OSD_ERROR DVB_OSDBmpPalette_Load (u32 *pu32Palette, u16 u16Length)
{
    if (CT_OSD_PaletteLoad(OSD_BMP_COLOR_START_INDEX, pu32Palette) != TRUE)
    {
        return EN_OSD_ERROR_DATA_FORMAT;
    }
    return EN_OSD_NO_ERROR;
}
/*******************************************************************************************/
EN_OSD_ERROR DVB_OSDBmpPalette_LoadAll (u32 *pu32PaletteData_YUV, u8 *pu8PaletteMixEn)
{
    if (CT_OSD_PaletteLoadAllWithTransEn(pu32PaletteData_YUV, pu8PaletteMixEn) != TRUE)
    {
        return EN_OSD_ERROR_DATA_FORMAT;
    }
    return EN_OSD_NO_ERROR;
}
/*******************************************************************************************/
EN_OSD_ERROR DVB_OSDSystemIconPalette_Load (u32 *pu32Palette, u16 u16Length)
{
    if (CT_OSD_PaletteLoad(OSD_SYSTEMICON_COLOR_START_INDEX, pu32Palette) != TRUE)
    {
        return EN_OSD_ERROR_DATA_FORMAT;
    }
    return EN_OSD_NO_ERROR;
}
/*******************************************************************************************/
EN_OSD_ERROR DVB_OSDUpdateBmpParameter(u8 u8BmpIndex,u16 u16PosX,u16 u16PosY,u16 u16Width,u16 u16Height)
{
    u16 u16Top,u16Left,u16Right,u16Bottom;
    u16 u16Temp1;

    OSD_DEBUG(("MMMMMMMMMM load %hx\n", u8BmpIndex));

    // Check if the Index is Null
    if(u8BmpIndex == 0)
    {
        return EN_OSD_ERROR_BMP_INDEX;
    }
    // Check if have Null Space
    if(u16ToatalLoadBmp >= MAX_BMP_IN_SDRAM_NUMBER)
    {
        return EN_OSD_ERROR_BMP_INDEX;
    }
    // Check if the Bmp index already in DataBase
    for(u16Temp1 = 0;u16Temp1 < u16ToatalLoadBmp; u16Temp1++)
    {
        if(u8BmpIndex == BmpParameter[u16Temp1].u8BmpIndex)
        {
            return EN_OSD_ERROR_BMP_INDEX;
        }
    }


    OSD_DEBUG(("target: x1=%d, y1=%d, x2=%d, y2=%d\n", u16PosX, u16PosY, u16PosX + u16Width, u16PosY + u16Height));


    // check image position
    for(u16Temp1 = 0;u16Temp1 < u16ToatalLoadBmp; u16Temp1++)
    {
        u16Left     = BmpParameter[u16Temp1].u16PosX;
        u16Right    = BmpParameter[u16Temp1].u16PosX+BmpParameter[u16Temp1].u16Width;
        u16Top      = BmpParameter[u16Temp1].u16PosY;
        u16Bottom   = BmpParameter[u16Temp1].u16PosY+BmpParameter[u16Temp1].u16Height;


        OSD_DEBUG(("check: x1=%d, y1=%d, x2=%d, y2=%d\n", u16Left, u16Top, u16Right, u16Bottom));

    	if(u16Width <= BmpParameter[u16Temp1].u16Width)
        {
	        if(((u16PosX  > u16Left)&&(u16PosX < u16Right))||
	        (((u16PosX + u16Width)  > u16Left)&&((u16PosX + u16Width) < u16Right)))
	        {
	            if((u16PosY  > u16Top)&&
	                (u16PosY < u16Bottom))
            {

	            OSD_DEBUG(("error : top point overlap\n"));

                return EN_OSD_ERROR_BMP_SIZE;
            }

	             if(((u16PosY + u16Height)  > u16Top)&&
	                ((u16PosY + u16Height) < u16Bottom))
            {

                OSD_DEBUG(("error : bottom point overlap\n"));
                return EN_OSD_ERROR_BMP_SIZE;
            }
        }
		}
		else
        {
	        if(((u16Left  > u16PosX)&&(u16Left <( u16PosX + u16Width)))||
	        ((u16Right  > u16PosX)&&(u16Right <( u16PosX + u16Width))))
	        {
	            if((u16Top  > u16PosY)&&
	                (u16Top < (u16PosY + u16Height)))
            {

	                OSD_DEBUG(("error : top point overlap\n"));

                return EN_OSD_ERROR_BMP_SIZE;
            }

	             if((u16Bottom  > u16PosY)&&
	                (u16Bottom < (u16PosY + u16Height)))
            {

	                OSD_DEBUG(("error : bottom point overlap\n"));

                return EN_OSD_ERROR_BMP_SIZE;
            }
        }
    }
    }

    return EN_OSD_NO_ERROR;
}
/*******************************************************************************************/
void HuffmanDecode_Init( u8 *pu8Data, u16 u16BmpW )
{
    // reset all variable

    u16BmpWidth = u16BmpW;
	u8NodeNumber = pu8Data[0];
	stDecodeNode = (ST_DECODE_NODE*) &pu8Data[1];   // base address of huffman tree
	pu8Code = &pu8Data[1+u8NodeNumber*sizeof(ST_DECODE_NODE)];   // bitstream start address

	u8BitPosition = 8;
	u8CodeSize = 0;
}
/*******************************************************************************************/
bool8 HuffmanDecode_GetLine( u8 *pu8Line)
{
    u8 u8NextNode, u8Decode=0, u8RunLengthBitCounter;
    bool8 b8Match;
    u16 u16RunLength, u16idx, u16FilledLength;
    u8 u8CacheHuffman=0, u8CacheCode=0;
#if 0
    u8 u8PeekHuffman=0;
#endif

	for(u16FilledLength=0; u16FilledLength<u16BmpWidth; u16FilledLength+=u16RunLength)
	{
	    // decode huffman code
    	b8Match = FALSE;
    	u8NextNode = u8NodeNumber-1; // root node

#if 0
    	// decode by last cache
    	if(u8CodeSize<=8 && u8CodeSize>0)
    	{
    	    if(u8BitPosition>=u8CodeSize)
    	    {
        	    u8PeekHuffman = pu8Code[0]>>(u8BitPosition-u8CodeSize);
        	    u8PeekHuffman = u8PeekHuffman&( (0x01<<u8CodeSize)-1 );
    	    }
    	    else
    	    {
    	        u8PeekHuffman = pu8Code[0]&( (0x01<<u8BitPosition)-1 );
    	        u8PeekHuffman = u8PeekHuffman<<(u8CodeSize-u8BitPosition);
    	        u8PeekHuffman += pu8Code[1]>>(8-u8CodeSize+u8BitPosition);
    	    }
    	    if(u8CacheHuffman==u8PeekHuffman)
    	    {
    	        u8Decode = u8CacheCode;
    	        b8Match = TRUE;

				if(u8BitPosition>u8CodeSize)
				{
					u8BitPosition -= u8CodeSize;
				}
				else
				{
    				pu8Code += 1;
    				u8BitPosition = u8BitPosition+8-u8CodeSize;
				}
    	    }
    	}
#endif

    	// decode by trace tree
		if(!b8Match)
		{
    		u8CacheHuffman = 0;
			u8CodeSize = 0;
		}
    	while(!b8Match)
    	{
    		u8BitPosition--;

    		if( ( pu8Code[0]&(0x01<<u8BitPosition) )==0 )
    		{
    		    u8CacheHuffman = (u8CacheHuffman<<1)+0x00;
    			u8NextNode = stDecodeNode[u8NextNode].u8LeftIdx;
    		}
    		else
    		{
    		    u8CacheHuffman = (u8CacheHuffman<<1)+0x01;
    			u8NextNode = stDecodeNode[u8NextNode].u8RightIdx;
    		}

    		if(u8BitPosition==0)
    		{
    			u8BitPosition = 8;
    			pu8Code+=1;
    		}

    		if( stDecodeNode[u8NextNode].u8LeftIdx==u8NodeNumber-1 )
    		{
    			// child is root, this is leaf
    			u8Decode =	stDecodeNode[u8NextNode].u8Patten;
    			u8CacheCode = u8Decode;

⌨️ 快捷键说明

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