我從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是的......我沒有正確地知道在閱讀您的評論之前什麼是重構。 –