filter.c
来自「以TI 公司的OMAP5910为例」· C语言 代码 · 共 189 行
C
189 行
///////////////////////////////////////////////////////////////////////////
// Copyright (C) 2004, Microunit Technology Co. Ltd.
// All Rights Reserved
//_________________________________________________________________________
//
// FILENAME: filter.c
///////////////////////////////////////////////////////////////////////////
#include "filter.h"
static WORD median(WORD* data);
static void FilterBUF(WORD* in, WORD* out, int rows);
static void FilterRow(WORD* in, WORD* out);
// map input double buffer to DARAM
#pragma DATA_SECTION(InBuf_1, "INBUF1"); // 16k
#pragma DATA_SECTION(InBuf_2, "INBUF2"); // 16k
// map output double buffer to SARAM
#pragma DATA_SECTION(OutBuf_1, "OUTBUF1"); // 16k
#pragma DATA_SECTION(OutBuf_2, "OUTBUF2"); // 16k
WORD InBuf_1[0x2000];
WORD InBuf_2[0x2000];
WORD OutBuf_1[0x2000];
WORD OutBuf_2[0x2000];
void IMG_Filter(DWORD addrIn, DWORD addrOut)
{
int i;
WORD width = 320;
WORD height = 240;
WORD *pIn_Tran = InBuf_1;
WORD *pIn_Proc = InBuf_2;
WORD *pOut_Tran = OutBuf_1;
WORD *pOut_Proc = OutBuf_2;
WORD *ptr;
// read 0-21 to input buffer
DMA_SD2DA(pIn_Tran, addrIn, width*22);
addrIn += width*20*2; // next read is 20-41
// start double buffering loop
for(i=20; i<220; i+=20)
{
// swap input buffer
ptr = pIn_Tran;
pIn_Tran = pIn_Proc;
pIn_Proc = ptr;
// start input background transfer (20-41)
DMA_SD2DA(pIn_Tran, addrIn, width*22);
addrIn += width*20*2;
// process (0-21)->(1-20)
FilterBUF(pIn_Proc, pOut_Proc, 22);
// swap output buffer
ptr = pOut_Tran;
pOut_Tran = pOut_Proc;
pOut_Proc = ptr;
// start output background transfer
DMA_SA2SD(addrOut, pOut_Tran, width*20);
addrOut += width*20*2;
}
// swap input buffer
ptr = pIn_Tran;
pIn_Tran = pIn_Proc;
pIn_Proc = ptr;
// start input background transfer (220-239)
DMA_SD2DA(pIn_Tran, addrIn, width*20);
// process 200-221(result 201-220)
FilterBUF(pIn_Proc, pOut_Proc, 22);
// swap output buffer
ptr = pOut_Tran;
pOut_Tran = pOut_Proc;
pOut_Proc = ptr;
// start output background transfer (201-220)
DMA_SA2SD(addrOut, pOut_Tran, width*20);
addrOut += width*20*2;
// swap input buffer
ptr = pIn_Tran;
pIn_Tran = pIn_Proc;
pIn_Proc = ptr;
// process last input buffer (220-239) -> (221-238)
FilterBUF(pIn_Proc, pOut_Proc, 20);
// swap Out_buf
ptr = pOut_Tran;
pOut_Tran = pOut_Proc;
pOut_Proc = ptr;
// transfer last output buffer (221-238)
DMA_SA2SD(addrOut, pOut_Tran, width*18);
}
void FilterBUF(WORD* in, WORD* out, int rows)
{
int i;
for(i=1; i<rows-1; i++)
{
out[0] = in[320];
out[319] = in[639];
FilterRow(in, (out+1));
in += 320;
out += 320;
}
}
void FilterRow(WORD* in, WORD* out)
{
int i;
// memset(out, 0x0F0F, 318);
// memcpy(out, in+1, 318);
// for(i=1; i<319; i++)
// out[i] = in[i+320];
WORD mask[9];
for(i=1; i<319; i++)
{
mask[0] = in[i-1];
mask[1] = in[i];
mask[2] = in[i+1];
mask[3] = in[i+319];
mask[4] = in[i+320];
mask[5] = in[i+321];
mask[6] = in[i+639];
mask[7] = in[i+640];
mask[8] = in[i+641];
out[i] = median(mask);
}
/* WORD* row1 = in - 320;
WORD* row2 = in;
WORD* row3 = in + 320;
for(i=1; i<319; i++)
{
// memcpy(mask, row1, 3);
// memcpy(mask+3, row2, 3);
// memcpy(mask+6, row3, 3);
mask[0] = row1[0];
mask[1] = row1[1];
mask[2] = row1[2];
mask[3] = row2[0];
mask[4] = row2[1];
mask[5] = row2[2];
mask[6] = row3[0];
mask[7] = row3[1];
mask[8] = row3[2];
out[i] = median(mask);
}*/
}
WORD median(WORD* data)
{
int i,j;
WORD temp;
for(j=0;j<5;j++)
{
for(i=0;i<8-j;i++)
{
if(data[i] > data[i+1])
{
temp = data[i];
data[i] = data[i+1];
data[i+1] = temp;
}
}
}
return data[4];
}
// the end
///////////////////////////////////////////////////////////////////////////
⌨️ 快捷键说明
复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?