Цитата(_pv @ Nov 27 2013, 12:37)

вопрос в том сколько раз туда-сюда данные надо будет гонять для сжатия видео в какой-нибудь mpeg.
для jpegа да, только один раз прочитать надо в буфер на 8 строк,
ну а 50 тактов на пиксель для блэкфина говорят о том что не потянет, кадров 10 в секунду, наверное, получится.
Ради интереса я взял вот это довольно просто написанный JPEG-кодек:
Jpegant.
Убрал оттуда преобразование RGB->YCrCb (к счастью, хотя бы это камера OV7725 умеет делать сама).
Осталось только DCT преобразование и huffman сжатие.
Проц STM32F407VG на 168МГц, кроме как кодирование картинки он ничего не делает (ну крутится еще RTOS, но я ее тут не считаю).
Изображение берется из внутренней ОЗУ, благо для хранения картинки 320x240x2байта его хватает.
Оптимизация файлов кодека -O3 -Otime (Keil 4.72.10).
Так вот. в пределе выходит 25fps.
Ради интереса попробовал включить RGB->YCrCb преобразование, то fps резко упало до 15.
Если покопаться в исходниках кодека и оптимизировать его под Cortex-M4F, то, я уверен, что fps можно еще поднять на несколько кадров.
В принципе, вот весь код сжатия картинки:
CODE
huffman_start(240, 320);
for (unsigned y = 0; y < (240-15); y += 16)
{
for (unsigned x = 0; x < (320-15); x += 16)
{
getBlock(x, y, 16, 16, (BGR*)RGB16x16)); // take picture block from IRAM
/*
// geting four 8x8 Y-blocks
for (unsigned i = 0; i < 2; i++)
for (unsigned j = 0; j < 2; j++)
{
for (unsigned r = 0; r < 8; r++)
for (unsigned c = 0; c < 8; c++)
{
const unsigned rr = (i<<3) + r;
const unsigned cc = (j<<3) + c;
Color red = RGB16x16[rr][cc].red;
Color green = RGB16x16[rr][cc].green;
Color blue = RGB16x16[rr][cc].blue;
// converting RGB into Y (luminance)
Y8x8[i][j][r][c] = RGB2Y(red, green, blue)-128;
}
}
// getting subsampled Cb and Cr
subsample(RGB16x16, Cb8x8, Cr8x8);
*/
// 1 Y-compression
dct(Y8x8[0][0], Y8x8[0][0]);
huffman_encode(HUFFMAN_CTX_Y, (short*)Y8x8[0][0]);
// 2 Y-compression
dct(Y8x8[0][1], Y8x8[0][1]);
huffman_encode(HUFFMAN_CTX_Y, (short*)Y8x8[0][1]);
// 3 Y-compression
dct(Y8x8[1][0], Y8x8[1][0]);
huffman_encode(HUFFMAN_CTX_Y, (short*)Y8x8[1][0]);
// 4 Y-compression
dct(Y8x8[1][1], Y8x8[1][1]);
huffman_encode(HUFFMAN_CTX_Y, (short*)Y8x8[1][1]);
// Cb-compression
dct(Cb8x8, Cb8x8);
huffman_encode(HUFFMAN_CTX_Cb, (short*)Cb8x8);
// Cr-compression
dct(Cr8x8, Cr8x8);
huffman_encode(HUFFMAN_CTX_Cr, (short*)Cr8x8);
}
}
huffman_stop();