我从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链路中找到。
我能够进一步通过以下方式分解这个代码:
在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方向:
代码对于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
以使我的代码的性质不会受到影响?
@AjayBrahmakshatriya哦,这是真的。 –
所以基本上你试图重构原来的代码,结果有可观察到的缺点? – Yunnosch
@Yunnosch是的......我没有正确地知道在阅读您的评论之前什么是重构。 –