pmeerw's blog
Got first results with simple watermarking in camera firmware, see the seminar presentation (May 28, Univ. Salzburg).
Main problem is speed currently: just unpacking 9 MB of sensor data takes over 2 sec. The sensor data is stored 10 bits/pixel (packed).
p_row_buf = p_out_row_buf = (uint16 *) &buf_pos[PIXTOBYTES(RAW_LEFT_MAR$
out_bit_buf = bit_buf = 0;
for (c = 0; c < IMG_WIDTH - 8; c += 8) {
bit_buf = *p_row_buf++;
out_bit_buf = bit_buf >> 6;
bit_buf = (bit_buf << 16) + *p_row_buf++;
pixel = bit_buf >> 12 & 0x3ff; // process pixel
WATERMARK_PIXEL(pixel);
out_bit_buf = (out_bit_buf << 10) + pixel;
*p_out_row_buf++ = out_bit_buf >> 4;
out_bit_buf = (out_bit_buf << 10) + (bit_buf >> 2 & 0x3ff);
//... and so on, repeats after 8 pixels
}
The ARM assembly language can handle shifts very efficiently; a mov instrution can have a third operand specifying an implicit shift!
The following GCC-generated assembler code corresponds to the first statements above. Note the asr and asl -- shift right, shift left.
ldrh r3, [sl], #2
mov r6, r7, asr #6
ldr r5, [r2, #12]
add r7, r3, r7, asl #16
tst r9, r1
mov r3, r7, asr #12
mov r4, r3, asl #22
posted at: 21:30 | path: /projects/CHDK | permanent link