Files
2023-05-14 11:44:44 +00:00

130 lines
2.8 KiB
C++

#include "multiframe_process.h"
#include <fcntl.h>
#include <math.h>
#include <stdint.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <sys/stat.h>
#include <sys/types.h>
#include <unistd.h>
#include <string>
#include <thread>
#include <vector>
#include <cassert>
void DumpRawData(uint16_t* buf, uint32_t len, uint32_t plen)
{
uint16_t a;
for (uint32_t n = 0; n < len; n++) {
if (n < plen) {
a = buf[n];
fprintf(stderr, "buf16[%d] 0x%04x\n", n, a);
} else {
break;
}
}
}
void DumpRawData32(uint32_t* buf, uint32_t len, uint32_t plen)
{
uint32_t a;
for (uint32_t n = 0; n < len; n++) {
if (n < plen) {
a = buf[n];
fprintf(stderr, "buf32[%d] 0x%08x\n", n, a);
} else {
break;
}
}
}
void ConverToLE(uint16_t* buf, uint32_t len)
{
uint32_t a;
for (uint32_t n = 0; n < len; n++) {
a = buf[n];
buf[n] = (a << 8) | (a >> 8);
}
}
// only for even number frame
void MultiFrameAverage(uint32_t* pIn1_pOut, uint16_t* POut, uint16_t width, uint16_t height, uint8_t frameNumber)
{
uint16_t n;
uint16_t roundOffset = 0;
switch (frameNumber) {
case 128:
n = 7;
break;
case 64:
n = 6;
break;
case 32:
n = 5;
break;
case 16:
n = 4;
break;
case 8:
n = 3;
break;
case 4:
n = 2;
break;
case 2:
n = 1;
break;
default:
printf("frame number error! %d", frameNumber);
return;
break;
}
roundOffset = pow(2, n - 1);
int len = height * width;
for (int i = 0; i < len; i++) {
pIn1_pOut[i] += roundOffset;
pIn1_pOut[i] = pIn1_pOut[i] >> n;
POut[i] = (uint16_t)(pIn1_pOut[i]);
}
}
void MultiFrameAddition(uint32_t* pIn1_pOut, uint16_t* pIn2, uint16_t width, uint16_t height, bool biToLi)
{
int n;
int len = height * width;
uint16_t temp = 0;
for (n = 0; n < len; n++) {
temp = 0;
if (biToLi) {
temp |= ((pIn2[n] & 0xff) << 8) & 0xff00;
temp |= ((pIn2[n] & 0xff00) >> 8) & 0xff;
pIn1_pOut[n] += temp;
} else {
temp = pIn2[n] & 0xffff;
pIn1_pOut[n] += temp;
}
}
}
void FrameU32ToU16(uint32_t* pIn, uint16_t* pOut, uint16_t width, uint16_t height)
{
int n;
int len = height * width;
for (n = 0; n < len; n++) {
pOut[n] += pIn[n];
}
}
void FrameU16ToU32(uint16_t* pIn, uint32_t* pOut, uint16_t width, uint16_t height)
{
int n;
int len = height * width;
for (n = 0; n < len; n++) {
pOut[n] += pIn[n];
}
}