JPEG 画像 (サイズ 10*10 など) があり、この JPEG 画像の一部の色を変換したいと考えています。
たとえば、列「1から10」までの画像幅の色変換を実行したいとします。
この場合、変換後の色は元の画像と同じではなく、歪んでいます。
デフォルトでは、jpeg 画像の色変換の .c 実装はピクセルごとに行われるため、(0-10 ではなく) 1-10 から色変換を実行しても問題はありませんが、
しかし、色変換のアセンブリ実装 (一度に 8 ピクセルで実行) を使用して同じタスクを実行すると、画像が歪んでしまいます... (画像の最大部分が緑色に見えます)
色変換のアセンブリコードは以下の通りです。
add Y, Y, START_X
add U, U, START_X
add V, V, START_X
上記のコードのみが私の追加です
asm_function jsimd_ycc_\colorid\()_convert_neon
/* Outer loop over scanlines */
cmp NUM_ROWS, #1
blt 9f
0:
ldr Y, [INPUT_BUF0, INPUT_ROW, lsl #2]
ldr U, [INPUT_BUF1, INPUT_ROW, lsl #2]
mov N, OUTPUT_WIDTH
ldr V, [INPUT_BUF2, INPUT_ROW, lsl #2]
add Y, Y, START_X
add U, U, START_X
add V, V, START_X
add INPUT_ROW, INPUT_ROW, #1
ldr RGB, [OUTPUT_BUF], #4
/* Inner loop over pixels */
subs N, N, #8
blt 3f
do_load 8
do_yuv_to_rgb_stage1
subs N, N, #8
blt 2f
1:
do_yuv_to_rgb_stage2_store_load_stage1
subs N, N, #8
bge 1b
2:
do_yuv_to_rgb_stage2
do_store \bpp, 8
tst N, #7
beq 8f
3:
tst N, #4
beq 3f
do_load 4
3:
tst N, #2
beq 4f
do_load 2
4:
tst N, #1
beq 5f
do_load 1
.endfunc