2017-08-27 11 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リンクに見出すことができます。

Iは、さらに次のようにダウン、このコードを破ることができた:x方向の

:Y方向の

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)); 
    } 
} 

コードDESCALEの場合:

static inline int32_t DESCALE (int32_t x, int32_t n) 
{ 
    return (x + (1 << (n - 1)) - (x < 0)) >> n; 
} 

上記の方法でIDCTを再構成することで、元のコードと同じ出力が得られます。

enter image description here

は何ですか:

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

私の出力フレームは、上記のコードを次のようになります。次のようにIDCTforYのコードを再編成した後しかし、私は、ぼやけた画像を得ましたJPEGデコードのぼやけた画像の意味?

IDCTforY私のコードの性質が損なわれないように分割するにはどうすればよいですか?

+0

@AjayBrahmakshatriyaああそうです。 –

+3

基本的に元のコードをリファクタリングしようとしましたが、結果には観察可能な欠点がありますか? – Yunnosch

+0

@Yunnoschはい......あなたのコメントを読む前にリファクタリングがどのようなものかを正しく知りませんでした。 –

答えて

1

関数IDCT()は、すべてのfor-loopsでデータを転送する配列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日

私は光学効果を説明することはできませんが、データフローを破った。入力およびプロセス・ループの最後の繰り返しの結果のみに渡されることを、あなたが見

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); 
} 

を:あなたはそれで作られた

for (l = 0; l < 8; l++) 
{ 
    int32_t Yc[8]; 

    Fill(Yc); 

    idct_1d(Yc); 

    Descale_and_WriteOut(Yc); 
} 

:元のコードは、このようなものでした出力ループ。私はすべての反復反復にYc [] []のメモリを与えました。

+0

私は変数をグローバルにしましたが、私はまだ同じぼやけた出力を得ています。 –

+0

あなたのコードが動作します。なぜあなたのコードが動作するのか、概念的な観点から説明できますか?私が持っていたコードで画像がぼやけていたのはなぜですか? –

+0

ありがとうございます。 _input-and-process-loop_と_output loop_はどういう意味ですか? –

関連する問題