📄 extension.c
字号:
/*****************************************************************************/
/* Author: Brendt Wohlberg (Los Alamos National Laboratory). */
/* Copyright 2001 University of California. */
/*****************************************************************************/
#include <assert.h>
#include <stdlib.h>
#include <stdio.h>
#include "Extension.h"
const char* stdext_string(StdExtension stdext) {
static const char* strings[] = {"Z00", "C00", "S11", "S12", "S21", "S22",
"A11", "A12", "A21", "A22", "NullStdExt"};
return (stdext >= 0 && stdext < NullStdExt)?(strings[stdext]):0;
}
StdExtension string_to_stdext(const char* s) {
StdExtension stdext;
static const char* strings[] = {"Z00", "C00", "S11", "S12", "S21", "S22",
"A11", "A12", "A21", "A22"};
stdext = 0;
while (stdext < NullStdExt && strcmp(strings[stdext], s) != 0)
stdext++;
return stdext;
}
const ExtensionDesc* stdext_to_extdesc(StdExtension stdext) {
static const ExtensionDesc stdtable[] = {{{ZExtType, NullExtSymm, 0},
{ZExtType, NullExtSymm, 0}},
{{CExtType, NullExtSymm, 0},
{CExtType, NullExtSymm, 0}},
{{SExtType, WExtSymm, 1},
{SExtType, WExtSymm, 1}},
{{SExtType, WExtSymm, 1},
{SExtType, HExtSymm, 1}},
{{SExtType, HExtSymm, 1},
{SExtType, WExtSymm, 1}},
{{SExtType, HExtSymm, 1},
{SExtType, HExtSymm, 1}},
{{SExtType, WExtSymm, -1},
{SExtType, WExtSymm, -1}},
{{SExtType, WExtSymm, -1},
{SExtType, HExtSymm, -1}},
{{SExtType, HExtSymm, -1},
{SExtType, WExtSymm, -1}},
{{SExtType, HExtSymm, -1},
{SExtType, HExtSymm, -1}}};
return (stdext >= 0 && stdext < NullStdExt)?(stdtable+stdext):0;
}
int extend_channel_float(const ExtensionDesc* ext, int left, int rght,
const float* in_channel, int in_channel_length,
float* out_channel) {
BndExt lext, rext;
float* ext_buffer;
int ext_buffer_length, out_channel_length;
int left_ext, left_crop, rght_ext, rght_crop, left_over, rght_over;
int lsrc, ldst, rsrc, rdst;
int state_changed;
int k;
lext = ext->leftext;
rext = ext->rghtext;
out_channel_length = in_channel_length + left + rght;
left_ext = (left > 0)?left:0;
left_crop = (left < 0)?-left:0;
rght_ext = (rght > 0)?rght:0;
rght_crop = (rght < 0)?-rght:0;
rght_over = left_ext-rght_ext-in_channel_length+1;
if (lext.exttype != SExtType || rght_over<0)
rght_over = 0;
left_over = rght_ext-left_ext-in_channel_length+1;
if (rext.exttype != SExtType || left_over<0)
left_over = 0;
ext_buffer_length = left_over + left_ext + in_channel_length +
rght_ext + rght_over;
ext_buffer = malloc(sizeof(float)*ext_buffer_length);
if (!ext_buffer)
return 0;
for (k = 0; k < ext_buffer_length; k++)
ext_buffer[k] = 0;
for (k = left_over+left_ext; k < in_channel_length+left_ext+left_over; k++) {
ext_buffer[k] = in_channel[k+left_crop-left_ext-left_over];
}
/* Take care of undefined 1-pt cases */
if (((lext.exttype == SExtType && lext.extsign>0) ||
(rext.exttype == SExtType && rext.extsign>0)) &&
in_channel_length == 1) {
BndExt cnst = {CExtType, NullExtSymm, 0};
lext = cnst;
rext = cnst;
}
/* Set up extension on left */
if (lext.exttype == CExtType ||
(lext.exttype == SExtType && lext.extsymm == HExtSymm)) {
lsrc = left_ext+left_over;
ldst = lsrc-1;
} else if (lext.exttype == SExtType && lext.extsymm == WExtSymm) {
lsrc = left_ext+left_over + (lext.extsign > 0);
ldst = lsrc-2;
}
/* Set up extension on right */
if (rext.exttype == CExtType ||
(rext.exttype == SExtType && rext.extsymm == HExtSymm)) {
rsrc = left_over+left_ext+in_channel_length-1;
rdst = rsrc+1;
} else if (rext.exttype == SExtType && rext.extsymm == WExtSymm) {
rsrc = left_over+left_ext+in_channel_length-1 - (rext.extsign > 0);
rdst = rsrc+2;
}
while ((ldst >= 0 && lext.exttype != ZExtType) ||
(rdst < ext_buffer_length && rext.exttype != ZExtType)) {
state_changed = 0;
assert(lsrc < ext_buffer_length && rsrc >= 0);
if (ldst >= 0 && lext.exttype != ZExtType) {
if (lext.exttype == CExtType) {
ext_buffer[ldst] = ext_buffer[lsrc];
ldst--;
state_changed = 1;
} else if (lext.exttype == SExtType) {
ext_buffer[ldst] = lext.extsign * ext_buffer[lsrc];
ldst--;
lsrc++;
state_changed = 1;
}
}
if (rdst < ext_buffer_length && rext.exttype != ZExtType) {
if (rext.exttype == CExtType) {
ext_buffer[rdst] = ext_buffer[rsrc];
rdst++;
state_changed = 1;
} else if (rext.exttype == SExtType) {
ext_buffer[rdst] = rext.extsign * ext_buffer[rsrc];
rdst++;
rsrc--;
state_changed = 1;
}
}
assert(state_changed);
}
for (k = 0; k < out_channel_length; k++)
out_channel[k] = ext_buffer[k + left_over];
free(ext_buffer);
return 1;
}
int extend_channel_int(const ExtensionDesc* ext, int left, int rght,
const int* in_channel, int in_channel_length,
int* out_channel) {
BndExt lext, rext;
int* ext_buffer;
int ext_buffer_length, out_channel_length;
int left_ext, left_crop, rght_ext, rght_crop, left_over, rght_over;
int lsrc, ldst, rsrc, rdst;
int state_changed;
int k;
lext = ext->leftext;
rext = ext->rghtext;
out_channel_length = in_channel_length + left + rght;
left_ext = (left > 0)?left:0;
left_crop = (left < 0)?-left:0;
rght_ext = (rght > 0)?rght:0;
rght_crop = (rght < 0)?-rght:0;
rght_over = left_ext-rght_ext-in_channel_length+1;
if (lext.exttype != SExtType || rght_over<0)
rght_over = 0;
left_over = rght_ext-left_ext-in_channel_length+1;
if (rext.exttype != SExtType || left_over<0)
left_over = 0;
ext_buffer_length = left_over + left_ext + in_channel_length +
rght_ext + rght_over;
ext_buffer = malloc(sizeof(int)*ext_buffer_length);
if (!ext_buffer)
return 0;
for (k = 0; k < ext_buffer_length; k++)
ext_buffer[k] = 0;
for (k = left_over+left_ext; k < in_channel_length+left_ext+left_over; k++) {
ext_buffer[k] = in_channel[k+left_crop-left_ext-left_over];
}
/* Take care of undefined 1-pt cases */
if (((lext.exttype == SExtType && lext.extsign>0) ||
(rext.exttype == SExtType && rext.extsign>0)) &&
in_channel_length == 1) {
BndExt cnst = {CExtType, NullExtSymm, 0};
lext = cnst;
rext = cnst;
}
/* Set up extension on left */
if (lext.exttype == CExtType ||
(lext.exttype == SExtType && lext.extsymm == HExtSymm)) {
lsrc = left_ext+left_over;
ldst = lsrc-1;
} else if (lext.exttype == SExtType && lext.extsymm == WExtSymm) {
lsrc = left_ext+left_over + (lext.extsign > 0);
ldst = lsrc-2;
}
/* Set up extension on right */
if (rext.exttype == CExtType ||
(rext.exttype == SExtType && rext.extsymm == HExtSymm)) {
rsrc = left_over+left_ext+in_channel_length-1;
rdst = rsrc+1;
} else if (rext.exttype == SExtType && rext.extsymm == WExtSymm) {
rsrc = left_over+left_ext+in_channel_length-1 - (rext.extsign > 0);
rdst = rsrc+2;
}
while ((ldst >= 0 && lext.exttype != ZExtType) ||
(rdst < ext_buffer_length && rext.exttype != ZExtType)) {
state_changed = 0;
assert(lsrc < ext_buffer_length && rsrc >= 0);
if (ldst >= 0 && lext.exttype != ZExtType) {
if (lext.exttype == CExtType) {
ext_buffer[ldst] = ext_buffer[lsrc];
ldst--;
state_changed = 1;
} else if (lext.exttype == SExtType) {
ext_buffer[ldst] = lext.extsign * ext_buffer[lsrc];
ldst--;
lsrc++;
state_changed = 1;
}
}
if (rdst < ext_buffer_length && rext.exttype != ZExtType) {
if (rext.exttype == CExtType) {
ext_buffer[rdst] = ext_buffer[rsrc];
rdst++;
state_changed = 1;
} else if (rext.exttype == SExtType) {
ext_buffer[rdst] = rext.extsign * ext_buffer[rsrc];
rdst++;
rsrc--;
state_changed = 1;
}
}
assert(state_changed);
}
for (k = 0; k < out_channel_length; k++)
out_channel[k] = ext_buffer[k + left_over];
free(ext_buffer);
return 1;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -