如何在不牺牲其功能的情况下将此功能拆分为更小的功能?
How can I split this function into smaller functions without sacrificing its functionality?
我从 here 获得了 MJPEG 解码代码,我正在尝试将 IDCT 代码拆分成更小的函数。
原代码中的IDCT函数如下:
void IDCT(int32_t *input, uint8_t *output) {
int32_t Y[64];
int32_t k, l;
for (k = 0; k < 8; k++) {
for (l = 0; l < 8; l++) Y(k, l) = SCALE(input[(k << 3) + l], S_BITS);
idct_1d(&Y(k, 0));
}
for (l = 0; l < 8; l++) {
int32_t Yc[8];
for (k = 0; k < 8; k++) Yc[k] = Y(k, l);
idct_1d(Yc);
for (k = 0; k < 8; k++) {
int32_t r = 128 + DESCALE(Yc[k], S_BITS + 3);
r = r > 0 ? (r < 255 ? r : 255) : 0;
X(k, l) = r;
}
}
}
可以在 this link.
中找到有关功能的更多详细信息
我能够通过以下方式进一步分解这段代码:
X方向:
void IDCTforX(int32_t *input, uint8_t *output) {
int32_t Y[64];
int32_t k, l;
int32_t Yc[8];
for (k = 0; k < 8; k++) {
for (l = 0; l < 8; l++)
{
Y(k, l) = SCALE(input[(k << 3) + l], S_BITS);
}
}
}
void IDCTfor1dim(int32_t *input, uint8_t *output)
{
int32_t Y[64];
int32_t k, l;
int32_t Yc[8];
for (k= 0; k < 8; k++)
{
idct_1d(&Y(k, 0));
}
}
Y方向:
void IDCTforY(int32_t *input, uint8_t *output) {
int32_t Y[64];
int32_t k, l;
for (l = 0; l < 8; l++) {
int32_t Yc[8];
for (k = 0; k < 8; k++)
{
Yc[k] = Y(k, l);
}
idct_1d(Yc);
for (k = 0; k < 8; k++) {
int32_t r = 128 + DESCALE(Yc[k], S_BITS + 3);
r = r > 0 ? (r < 255 ? r : 255) : 0;
X(k, l) = r;
}
}
DESCALE
的代码如下:
static inline int32_t DESCALE (int32_t x, int32_t n)
{
return (x + (1 << (n - 1)) - (x < 0)) >> n;
}
以上述方式重新组织 IDCT 得到与原始代码相同的输出。但是,按照以下方式重新组织 IDCTforY
的代码后,我得到了一个模糊的图像:
void IDCTforY(int32_t *input, uint8_t *output) {
int32_t Y[64];
int32_t k, l;
int32_t Yc[8];
for (l = 0; l < 8; l++) {
for (k = 0; k < 8; k++)
{
Yc[k] = Y(k, l);
}
idct_1d(Yc);
}
//Running the loop for de-scaling separately....
for (l = 0; l < 8; l++) {
for (k = 0; k < 8; k++) {
int32_t r = 128 + DESCALE(Yc[k], S_BITS + 3);
r = r > 0 ? (r < 255 ? r : 255) : 0;
X(k, l) = r;
}
}
}
我的输出帧与上面的代码类似:
JPEG解码中的模糊图像是什么意思?
如何拆分 IDCTforY
才能不损害我的代码的性质?
函数 IDCT() 声明了数组 Y[],它在所有 for 循环中传输数据。在您重构的代码中,每个函数都声明了自己的 Y[] 数组。您对 Yc[] 数组所做的相同错误。使数组成为全局数组并查看代码是否运行。
编辑2017_08-28
给Yc[]一个额外的维度:
void IDCTforY(int32_t *input, uint8_t *output)
{
int32_t Y[64];
int32_t k, l;
int32_t Yc[8][8];
for (l = 0; l < 8; l++)
{
for (k = 0; k < 8; k++)
Yc[l][k] = Y(k, l);
idct_1d(Yc[l]);
}
//Running the loop for de-scaling separately....
for (l = 0; l < 8; l++)
{
for (k = 0; k < 8; k++)
{
int32_t r = 128 + DESCALE(Yc[l][k], S_BITS + 3);
r = r > 0 ? (r < 255 ? r : 255) : 0;
X(k, l) = r;
}
}
}
编辑 2017-08-29
我无法解释光学效应,但你打破了数据流。原代码是这样的:
for (l = 0; l < 8; l++)
{
int32_t Yc[8];
Fill(Yc);
idct_1d(Yc);
Descale_and_WriteOut(Yc);
}
你做到了:
int32_t Yc[8];
for (l = 0; l < 8; l++)
{
Fill(Yc);
idct_1d(Yc);
}
for (l = 0; l < 8; l++)
{
Descale_and_WriteOut(Yc);
}
你看,只有输入和处理循环的最后一次迭代的结果被传递到输出循环。我在 Yc[][].
中给了每个 l 迭代自己的记忆
我从 here 获得了 MJPEG 解码代码,我正在尝试将 IDCT 代码拆分成更小的函数。
原代码中的IDCT函数如下:
void IDCT(int32_t *input, uint8_t *output) {
int32_t Y[64];
int32_t k, l;
for (k = 0; k < 8; k++) {
for (l = 0; l < 8; l++) Y(k, l) = SCALE(input[(k << 3) + l], S_BITS);
idct_1d(&Y(k, 0));
}
for (l = 0; l < 8; l++) {
int32_t Yc[8];
for (k = 0; k < 8; k++) Yc[k] = Y(k, l);
idct_1d(Yc);
for (k = 0; k < 8; k++) {
int32_t r = 128 + DESCALE(Yc[k], S_BITS + 3);
r = r > 0 ? (r < 255 ? r : 255) : 0;
X(k, l) = r;
}
}
}
可以在 this link.
中找到有关功能的更多详细信息我能够通过以下方式进一步分解这段代码:
X方向:
void IDCTforX(int32_t *input, uint8_t *output) {
int32_t Y[64];
int32_t k, l;
int32_t Yc[8];
for (k = 0; k < 8; k++) {
for (l = 0; l < 8; l++)
{
Y(k, l) = SCALE(input[(k << 3) + l], S_BITS);
}
}
}
void IDCTfor1dim(int32_t *input, uint8_t *output)
{
int32_t Y[64];
int32_t k, l;
int32_t Yc[8];
for (k= 0; k < 8; k++)
{
idct_1d(&Y(k, 0));
}
}
Y方向:
void IDCTforY(int32_t *input, uint8_t *output) {
int32_t Y[64];
int32_t k, l;
for (l = 0; l < 8; l++) {
int32_t Yc[8];
for (k = 0; k < 8; k++)
{
Yc[k] = Y(k, l);
}
idct_1d(Yc);
for (k = 0; k < 8; k++) {
int32_t r = 128 + DESCALE(Yc[k], S_BITS + 3);
r = r > 0 ? (r < 255 ? r : 255) : 0;
X(k, l) = r;
}
}
DESCALE
的代码如下:
static inline int32_t DESCALE (int32_t x, int32_t n)
{
return (x + (1 << (n - 1)) - (x < 0)) >> n;
}
以上述方式重新组织 IDCT 得到与原始代码相同的输出。但是,按照以下方式重新组织 IDCTforY
的代码后,我得到了一个模糊的图像:
void IDCTforY(int32_t *input, uint8_t *output) {
int32_t Y[64];
int32_t k, l;
int32_t Yc[8];
for (l = 0; l < 8; l++) {
for (k = 0; k < 8; k++)
{
Yc[k] = Y(k, l);
}
idct_1d(Yc);
}
//Running the loop for de-scaling separately....
for (l = 0; l < 8; l++) {
for (k = 0; k < 8; k++) {
int32_t r = 128 + DESCALE(Yc[k], S_BITS + 3);
r = r > 0 ? (r < 255 ? r : 255) : 0;
X(k, l) = r;
}
}
}
我的输出帧与上面的代码类似:
JPEG解码中的模糊图像是什么意思?
如何拆分 IDCTforY
才能不损害我的代码的性质?
函数 IDCT() 声明了数组 Y[],它在所有 for 循环中传输数据。在您重构的代码中,每个函数都声明了自己的 Y[] 数组。您对 Yc[] 数组所做的相同错误。使数组成为全局数组并查看代码是否运行。
编辑2017_08-28
给Yc[]一个额外的维度:
void IDCTforY(int32_t *input, uint8_t *output)
{
int32_t Y[64];
int32_t k, l;
int32_t Yc[8][8];
for (l = 0; l < 8; l++)
{
for (k = 0; k < 8; k++)
Yc[l][k] = Y(k, l);
idct_1d(Yc[l]);
}
//Running the loop for de-scaling separately....
for (l = 0; l < 8; l++)
{
for (k = 0; k < 8; k++)
{
int32_t r = 128 + DESCALE(Yc[l][k], S_BITS + 3);
r = r > 0 ? (r < 255 ? r : 255) : 0;
X(k, l) = r;
}
}
}
编辑 2017-08-29
我无法解释光学效应,但你打破了数据流。原代码是这样的:
for (l = 0; l < 8; l++)
{
int32_t Yc[8];
Fill(Yc);
idct_1d(Yc);
Descale_and_WriteOut(Yc);
}
你做到了:
int32_t Yc[8];
for (l = 0; l < 8; l++)
{
Fill(Yc);
idct_1d(Yc);
}
for (l = 0; l < 8; l++)
{
Descale_and_WriteOut(Yc);
}
你看,只有输入和处理循环的最后一次迭代的结果被传递到输出循环。我在 Yc[][].
中给了每个 l 迭代自己的记忆