megavolt85 
 
 
		
			Супермодератор 
			       
			
			
 
 
			
	Сообщений: 3252 
	Зарегистрирован: 24.03.2012
	
 Рейтинг: 38
Сказал спасибо: 187 
	Поблагодарили 1612 раз(а) в 960 сообщ.
  
		
	 | 
	
		
			
RE: App Dreameye Manager 
			 
			
				я вот чего ещё нарыл 
Код: 
 /* 
#             (C) 2011 Hans de Goede <hdegoede@redhat.com> 
 
# The compression algorithm has been taken from the v4l1 se401 linux kernel 
# driver by Jeroen B. Vreeken (pe1rxq@amsat.org) 
 
# This program is free software; you can redistribute it and/or modify 
# it under the terms of the GNU Lesser General Public License as published by 
# the Free Software Foundation; either version 2.1 of the License, or 
# (at your option) any later version. 
# 
# This program is distributed in the hope that it will be useful, 
# but WITHOUT ANY WARRANTY; without even the implied warranty of 
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the 
# GNU Lesser General Public License for more details. 
# 
# You should have received a copy of the GNU Lesser General Public License 
# along with this program; if not, write to the Free Software 
# Foundation, Inc., 51 Franklin Street, Suite 500, Boston, MA  02110-1335  USA 
 */ 
 
#include "libv4lconvert-priv.h" 
#include <errno.h> 
 
/* The se401 compression algorithm uses a fixed quant factor, which 
   can be configured by setting the high nibble of the SE401_OPERATINGMODE 
   feature. This needs to exactly match what is in the SE401 driver! */ 
#define SE401_QUANT_FACT 8 
 
static void wr_pixel(int p, uint8_t **dest, int pitch, int *x) 
{ 
    int i = *x; 
 
    /* First 3 pixels of each line are absolute */ 
    if (i < 3) { 
        (*dest)[i] = p * SE401_QUANT_FACT; 
    } else { 
        (*dest)[i] = (*dest)[i - 3] + p * SE401_QUANT_FACT; 
    } 
 
    *x += 1; 
    if (*x == pitch) { 
        *x = 0; 
        *dest += pitch; 
    } 
} 
 
enum decode_state { 
    get_len, 
    sign_bit, 
    other_bits, 
}; 
 
static int decode_JangGu(const uint8_t *data, int bits, int plen, int pixels, 
             uint8_t **dest, int pitch, int *x) 
{ 
    enum decode_state state = get_len; 
    int len = 0; 
    int value = 0; 
    int bitnr; 
    int bit; 
 
    while (plen) { 
        bitnr = 8; 
        while (bitnr && bits) { 
            bit = ((*data) >> (bitnr-1))&1; 
            switch (state) { 
            case get_len: 
                if (bit) { 
                    len++; 
                } else { 
                    if (!len) { 
                        wr_pixel(0, dest, pitch, x); 
                        if (!--pixels) 
                            return 0; 
                    } else { 
                        state = sign_bit; 
                        value = 0; 
                    } 
                } 
                break; 
            case sign_bit: 
                if (bit) 
                    value = 0; 
                else 
                    value = -(1 << len) + 1; 
                state = other_bits; 
                /* fall through for positive number and 
                   len == 1 handling */ 
            case other_bits: 
                len--; 
                value += bit << len; 
                if (len == 0) { 
                    /* Done write pixel and get bit len of 
                       the next one */ 
                    state = get_len; 
                    wr_pixel(value, dest, pitch, x); 
                    if (!--pixels) 
                        return 0; 
                } 
                break; 
            } 
            bitnr--; 
            bits--; 
        } 
        data++; 
        plen--; 
    } 
    return -1; 
} 
 
int v4lconvert_se401_to_rgb24(struct v4lconvert_data *data, 
        const unsigned char *src, int src_size, 
        unsigned char *dest, int width, int height) 
{ 
    int in, plen, bits, pixels, info; 
    int x = 0, total_pixels = 0; 
 
    for (in = 0; in + 4 < src_size; in += plen) { 
        bits   = src[in + 3] + (src[in + 2] << 8); 
        pixels = src[in + 1] + ((src[in + 0] & 0x3f) << 8); 
        info   = (src[in + 0] & 0xc0) >> 6; 
        plen   = ((bits + 47) >> 4) << 1; 
        /* Sanity checks */ 
        if (plen > 1024) { 
            V4LCONVERT_ERR("invalid se401 packet len %d", plen); 
            goto error; 
        } 
        if (in + plen > src_size) { 
            V4LCONVERT_ERR("incomplete se401 packet"); 
            goto error; 
        } 
        if (total_pixels + pixels > width * height) { 
            V4LCONVERT_ERR("se401 frame overflow"); 
            goto error; 
        } 
        /* info: 0 inter packet, 1 eof, 2 sof, 3 not used */ 
        if ((in == 0 && info != 2) || 
            (in > 0 && in + plen < src_size && info != 0) || 
            (in + plen == src_size && info != 1)) { 
            V4LCONVERT_ERR("invalid se401 frame info value"); 
            goto error; 
        } 
        if (decode_JangGu(&src[in + 4], bits, plen, pixels * 3, 
                  &dest, width * 3, &x)) { 
            V4LCONVERT_ERR("short se401 packet"); 
            goto error; 
        } 
        total_pixels += pixels; 
    } 
 
    if (in != src_size || total_pixels != width * height) { 
        V4LCONVERT_ERR("se401 frame size mismatch"); 
        goto error; 
    } 
 
    return 0; 
 
error: 
    errno = EIO; 
    return -1; 
}
  
			 
			
			
 
HKT-3030, BIOS mod, SD mod, VGA internal mod, G1ATA mod, Region changer mod, PSU mod, AW BBA, SCI SD mod, VS-Link
			
		 |  
	 
 |