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

📄 blt.c

📁 BlackFin处理器视频演示代码
💻 C
字号:
/**
 *@author Zlatan Stanojevic
 */

#include <services/services.h>
//#include <services/adi_dma.h>
#include "blt.h"


ADI_DMA_MANAGER_HANDLE dma_man_handle;

BLT_RESULT blt( ADI_DMA_STREAM_ID stream_id, BLTBufferDesc *src, BLTBufferDesc *dest, 
               unsigned short src_x, unsigned short src_y, unsigned short dest_x, 
               unsigned short dest_y, unsigned short width, unsigned short height )
{
/*	if( src_x + width > src->width )
		return BLT_DIM;
	
	if( src_y + height > src->height )
		return BLT_DIM;
	
	if( dest_x + width > dest->width )
		return BLT_DIM;
	
	if( dest_y + height > dest->height )
		return BLT_DIM;
	
	if( width % 2 )
		return BLT_DIM;
*/
    ADI_DMA_STREAM_HANDLE stream_handle;
    ADI_DMA_2D_TRANSFER tsrc[2], tdest[2];
    ADI_DMA_RESULT result;
    result = adi_dma_MemoryOpen( dma_man_handle, stream_id, NULL, &stream_handle, NULL );
    
    tsrc[0].XCount = tdest[0].XCount = tsrc[1].XCount = tdest[1].XCount = width / 2;
    tsrc[0].YCount = tdest[0].YCount = tsrc[1].YCount = tdest[1].YCount = height / 2;
    tsrc[0].XModify = tsrc[1].XModify = src->pixel_stride;
    tdest[0].XModify = tdest[1].XModify = dest->pixel_stride;
    
    
    if( src->interlaced )
    {
        tsrc[0].StartAddress = (void *)( (unsigned long)src->start_addr + src->offset + src->line_stride * src_y / 2 + src_x * src->pixel_stride / 2 );
        tsrc[1].StartAddress = (void *)( (unsigned long)tsrc[0].StartAddress + src->field_stride );
        tsrc[0].YModify = src->line_stride - width * src->pixel_stride / 2 + src->pixel_stride;
    }
    else
    {
        tsrc[0].StartAddress = (void *)( (unsigned long)src->start_addr + src->offset + src->line_stride * src_y + src_x * src->pixel_stride / 2 );
        tsrc[1].StartAddress = (void *)( (unsigned long)tsrc[0].StartAddress + src->line_stride );
        tsrc[0].YModify = 2 * src->line_stride - width * src->pixel_stride / 2 + src->pixel_stride;
    }
    
    tsrc[1].YModify = tsrc[0].YModify;
    
    if( dest->interlaced )
    {
        tdest[0].StartAddress = (void *)( (unsigned long)dest->start_addr + dest->offset + dest->line_stride * dest_y / 2 + dest_x * dest->pixel_stride / 2 );
        tdest[1].StartAddress = (void *)( (unsigned long)tdest[0].StartAddress + dest->field_stride );
        tdest[0].YModify = dest->line_stride - width * dest->pixel_stride / 2 + dest->pixel_stride;
    }
    else
    {
        tdest[0].StartAddress = (void *)( (unsigned long)dest->start_addr + dest->offset + dest->line_stride * dest_y + dest_x * dest->pixel_stride / 2 );
        tdest[1].StartAddress = (void *)( (unsigned long)tdest[0].StartAddress + dest->line_stride );
        tdest[0].YModify = 2 * dest->line_stride - width * dest->pixel_stride / 2 + dest->pixel_stride;
    }
    
    tdest[1].YModify = tdest[0].YModify;
    result = adi_dma_MemoryCopy2D( stream_handle, tdest, tsrc, 4, NULL );
    if( result != ADI_DMA_RESULT_SUCCESS )
        return BLT_ADI_DMA_ERROR;
    
    result = adi_dma_MemoryCopy2D( stream_handle, tdest + 1, tsrc + 1, 4, NULL );
    if( result != ADI_DMA_RESULT_SUCCESS )
        return BLT_ADI_DMA_ERROR;
    
    result = adi_dma_MemoryClose( stream_handle, TRUE );
    if( result != ADI_DMA_RESULT_SUCCESS )
        return BLT_ADI_DMA_ERROR;
    
    return BLT_OK;
}



char adi_dma_working_buffer[ ADI_DMA_BASE_MEMORY + 2 * ADI_DMA_CHANNEL_MEMORY ];

BLT_RESULT blt_init()
{
    u32 max_channels;
    ADI_DMA_RESULT result = adi_dma_Init(   adi_dma_working_buffer,
                    sizeof(adi_dma_working_buffer),
                    &max_channels,
                    &dma_man_handle,
                    NULL );
    if( result != ADI_DMA_RESULT_SUCCESS )
        return BLT_ADI_DMA_ERROR;
    
    return BLT_OK;
}



⌨️ 快捷键说明

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