Сжимать bmp или ppm научился и все вроде хорошо, но там формат RGB, скажем вот что получается для этих форматов моим кодером Jpeg.

Качество не очень, просто пока оптика не настроена.
у меня же YСbCr 4:2:2. Если сжимать его то получаю вот такое изображение:

Что меняю для данного формата относительно сжатия bmp:
- Код: Выделить всё
- static struct SOF0infotype {
 WORD marker; // = 0xFFC0
 WORD length; // = 17 for a truecolor YCbCr JPG
 BYTE precision ;// Should be 8: 8 bits/sample
 WORD height ;
 WORD width;
 BYTE nrofcomponents;//Should be 3: We encode a truecolor JPG
 BYTE IdY; // = 1
 BYTE HVY; // sampling factors for Y (bit 0-3 vert., 4-7 hor.)
 BYTE QTY; // Quantization Table number for Y = 0
 BYTE IdCb; // = 2
 BYTE HVCb;
 BYTE QTCb; // 1
 BYTE IdCr; // = 3
 BYTE HVCr;
 BYTE QTCr; // Normally equal to QTCb = 1
 } SOF0info = { 0xFFC0,17,8,0,0,3,1,0x21,0,2,0x11,1,3,0x11,1};
для bmp было так:
- Код: Выделить всё
- {0xFFC0,17,8,0,0,3,1,0x11,0,2,0x11,1,3,0x11,1};
для BMP сжатие проходит в такой последовательности:
- Код: Выделить всё
- process_DU(Y0DU, fdtbl_Y, &DCY, YDC_HT, YAC_HT); //Y
 process_DU(CrDU, fdtbl_Cb, &DCCr, CbDC_HT, CbAC_HT); //Cr
 process_DU(CbDU, fdtbl_Cb, &DCCb, CbDC_HT, CbAC_HT); //Cb
для YСbCr 4:2:2
- Код: Выделить всё
- process_DU(Y0DU, fdtbl_Y, &DCY, YDC_HT, YAC_HT); //Y0
 process_DU(Y1DU, fdtbl_Y, &DCY, YDC_HT, YAC_HT); //Y 1
 process_DU(CrDU, fdtbl_Cb, &DCCr, CbDC_HT, CbAC_HT); //Cr
 process_DU(CbDU, fdtbl_Cb, &DCCb, CbDC_HT, CbAC_HT); //Cb
Собственно вопрос: почему может быть такое, что не так?
Просто преобразование в RGB, а потом опять в YСbCr 4:4:4 не айс, нужна скорость. тем более камера дает YСbCr 4:2:2, грех не воспользоваться
PS. Почему нужно программное сжатие, потому что камера не может выдавать маркеры начала и конца кадра для ISI интерфейса AT91SAM9G20 когда камера работает в режиме Jpeg.
PS1. Кодер пишеться под Linux ARM9, поэтому код приведен на Си, ну я думаю тут все прозрачно, и для знающих людей проблема понятна.


