2017-08-27 42 views
0

我從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; 
    } 
    } 
} 

我的輸出幀看起來像這樣與上面的代碼:

enter image description here

是什麼JPEG解碼中模糊圖像的含義?

如何分割IDCTforY以使我的代碼的性質不會受到影響?

+0

@AjayBrahmakshatriya哦,這是真的。 –

+3

所以基本上你試圖重構原來的代碼,結果有可觀察到的缺點? – Yunnosch

+0

@Yunnosch是的......我沒有正確地知道在閱讀您的評論之前什麼是重構。 –

回答

1

函數IDCT()聲明瞭通過所有for循環傳輸數據的數組Y []。在你重構的代碼中,每個函數聲明它自己的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年8月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 [] []中給出了每個I-iteration自己的內存。

+0

我將變量設爲全局,但我仍然得到相同的模糊輸出。 –

+0

您的代碼有效。您能否從概念的角度解釋爲什麼您的代碼有效?爲什麼使用我的代碼模糊圖像? –

+0

謝謝你的迴應。 _input-and-process-loop_和_output loop_是什麼意思? –

相關問題