私は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を再構成することで、元のコードと同じ出力が得られます。
は何ですか:
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
私のコードの性質が損なわれないように分割するにはどうすればよいですか?
@AjayBrahmakshatriyaああそうです。 –
基本的に元のコードをリファクタリングしようとしましたが、結果には観察可能な欠点がありますか? – Yunnosch
@Yunnoschはい......あなたのコメントを読む前にリファクタリングがどのようなものかを正しく知りませんでした。 –