Пример #1
0
DCADEC_API int dcadec_frame_parse_header(const uint8_t *data, size_t *size)
{
    struct bitstream bits;
    uint8_t header[DCADEC_FRAME_HEADER_SIZE];
    size_t header_size, frame_size;
    int ret;

    if (!data || !size)
        return -DCADEC_EINVAL;

    if ((ret = dcadec_frame_convert_bitstream(header, &header_size,
                                              data, DCADEC_FRAME_HEADER_SIZE)) < 0)
        return ret;

    bits_init(&bits, header, header_size);

    switch (bits_get(&bits, 32)) {
    case SYNC_WORD_CORE: {
        bool normal_frame = bits_get1(&bits);
        int deficit_samples = bits_get(&bits, 5) + 1;
		int npcmblocks;
        if (normal_frame && deficit_samples != 32)
            return -DCADEC_ENOSYNC;
        bits_skip1(&bits);
        npcmblocks = bits_get(&bits, 7) + 1;
        if ((npcmblocks & 7) && (npcmblocks < 6 || normal_frame))
            return -DCADEC_ENOSYNC;
        frame_size = bits_get(&bits, 14) + 1;
        if (frame_size < 96)
            return -DCADEC_ENOSYNC;
        if (ret & DCADEC_BITSTREAM_BE14)
            *size = frame_size * 8 / 14 * 2;
        else
            *size = frame_size;
        return DCADEC_FRAME_TYPE_CORE;
    }

    case SYNC_WORD_EXSS: {
		bool wide_hdr;
        bits_skip(&bits, 10);
        wide_hdr = bits_get1(&bits);
        header_size = bits_get(&bits, 8 + 4 * wide_hdr) + 1;
        if ((header_size & 3) || header_size < DCADEC_FRAME_HEADER_SIZE)
            return -DCADEC_ENOSYNC;
        frame_size = bits_get(&bits, 16 + 4 * wide_hdr) + 1;
        if ((frame_size & 3) || frame_size < header_size)
            return -DCADEC_ENOSYNC;
        *size = frame_size;
        return DCADEC_FRAME_TYPE_EXSS;
    }

    default:
        return -DCADEC_ENOSYNC;
    }
}
Пример #2
0
int main(int argc, char *argv[])
{
	long id;
	char name[NAME_LEN];
	char rasdial[RAS_LEN];
	memset(name,'\0',NAME_LEN);
	memset(rasdial,'\0',RAS_LEN);

	Bits bits;
	int ret = bits_init(&bits,LEN);
	if(-1 == ret){
		fprintf(stderr,"bits_init error %s %d\n",__FILE__,__LINE__);
	}

	FILE *save;
	save = fopen("random_save.txt","a+");
	if(NULL == save){
		fprintf(stderr,"open random_save.text failed\n");
		exit(1);
	}
	
	long times=0;
	long count=0;
	srand((int)time(0));
	do{
		id = rand();
		id = ((id<<4) + rand()) % LEN;
		if(!bits_get(&bits,id))
		{
			bits_set(&bits,id);
		}
		else
		{
			printf("Repeat times %ld\n",++count);
			continue;
		}
		if (LEN-1 == times){
			printf("Have try all size=%ld\n",times);
			goto EXIT;	
		}
		sprintf(name,"TYT010%03ld",id);
		sprintf(rasdial,"rasdial pppoe %s 8888\n",name);
		printf("times=%ld %s",++times,rasdial);
		ret = system(rasdial);
	}while(0 != ret);

EXIT:
	bits_destroy(&bits);
	fprintf(save,"times=%ld %s",times,rasdial);
	printf("Final Rpeat times %ld\n",count);

	return 0;
}
Пример #3
0
static void lzss_decompress(unsigned char *uncompr, DWORD uncomprlen, 
							unsigned char *compr, DWORD comprlen)
{
	unsigned int act_uncomprlen = 0;
	/* compr中的当前字节中的下一个扫描位的位置 */
	unsigned int curbit = 0;
	/* compr中的当前扫描字节 */
	unsigned int curbyte = 0;
	unsigned int nCurWindowByte = 0x7ef;
	BYTE win[2048];
	struct bits bits;
	
	memset(win, 0x20, nCurWindowByte);
	bits_init(&bits, compr, comprlen);
	while (1) {
		/* 如果为0, 表示接下来的1个字节原样输出 */
		unsigned int flag;

		if (bits_get_high(&bits, 1, &flag))
			break;
		if (flag) {
			unsigned int data;

			if (bits_get_high(&bits, 8, &data))
				break;
			uncompr[act_uncomprlen++] = data;
			/* 输出的1字节放入滑动窗口 */
			win[nCurWindowByte++] = data;
			nCurWindowByte &= sizeof(win) - 1;
		} else {
			unsigned int copy_bytes, win_offset;
			unsigned int i;

			if (bits_get_high(&bits, 11, &win_offset))
				break;
			if (bits_get_high(&bits, 4, &copy_bytes))
				break;
			copy_bytes += 2;

			for (i = 0; i < copy_bytes; i++) {	
				unsigned char data;

				data = win[(win_offset + i) & (sizeof(win) - 1)];
				uncompr[act_uncomprlen++] = data;		
				/* 输出的1字节放入滑动窗口 */
				win[nCurWindowByte++] = data;
				nCurWindowByte &= sizeof(win) - 1;	
			}
		}
	}
}
Пример #4
0
static DWORD Touhou11_uncompress(BYTE *uncompr, DWORD uncomprlen,
								 BYTE *compr, DWORD comprlen)
{
	struct bits bits;
	bits_init(&bits, compr, comprlen);
	BYTE window[8192];
	DWORD win_pos = 1;
	DWORD act_uncomprlen = 0;
	while (1) {
		unsigned int flag;
		bit_get_high(&bits, &flag);
		if (flag) {
			unsigned int data;
			bits_get_high(&bits, 8, &data);
			uncompr[act_uncomprlen++] = data;
			window[win_pos] = data;
			win_pos = (win_pos + 1) & 0x1fff;
		} else {
			unsigned int offset = 0;
			bits_get_high(&bits, 13, &offset);
			if (!offset)
				return act_uncomprlen;
			unsigned int count;
			bits_get_high(&bits, 4, &count);
			count += 3;
			for (DWORD i = 0; i < count; ++i) {
				BYTE data = window[(i + offset) & 0x1fff];
				uncompr[act_uncomprlen++] = data;
				window[win_pos] = data;
				win_pos = (win_pos + 1) & 0x1fff;
			}
		}
	}

	return act_uncomprlen;
}
Пример #5
0
int exss_parse(struct exss_parser *exss, uint8_t *data, int size)
{
    int i, j, ret;

    bits_init(&exss->bits, data, size);

    // Extension substream sync word
    bits_skip(&exss->bits, 32);

    // User defined bits
    bits_skip(&exss->bits, 8);

    // Extension substream index
    exss->exss_index = bits_get(&exss->bits, 2);

    // Flag indicating short or long header size
    bool wide_hdr = bits_get1(&exss->bits);

    // Extension substream header length
    int header_size = bits_get(&exss->bits, 8 + 4 * wide_hdr) + 1;

    // Check CRC
    if ((ret = bits_check_crc(&exss->bits, 32 + 8, header_size * 8)) < 0) {
        exss_err("Invalid EXSS header checksum");
        return ret;
    }

    exss->exss_size_nbits = 16 + 4 * wide_hdr;

    // Number of bytes of extension substream
    exss->exss_size = bits_get(&exss->bits, exss->exss_size_nbits) + 1;
    if (exss->exss_size > size) {
        exss_err("Packet too short for EXSS frame");
        return -DCADEC_EBADDATA;
    }

    // Per stream static fields presence flag
    exss->static_fields_present = bits_get1(&exss->bits);
    if (exss->static_fields_present) {
        // Reference clock code
        bits_skip(&exss->bits, 2);

        // Extension substream frame duration
        bits_skip(&exss->bits, 3);

        // Timecode presence flag
        if (bits_get1(&exss->bits)) {
            // Timecode data
            bits_skip(&exss->bits, 32);
            bits_skip(&exss->bits, 4);
        }

        // Number of defined audio presentations
        exss->npresents = bits_get(&exss->bits, 3) + 1;

        // Number of audio assets in extension substream
        exss->nassets = bits_get(&exss->bits, 3) + 1;

        // Reject unsupported features for now
        if (exss->npresents > 1 || exss->nassets > 1) {
            exss_err_once("Multiple audio presentations "
                          "and/or assets are not supported");
            return -DCADEC_ENOSUP;
        }

        // Active extension substream mask for audio presentation
        int active_exss_mask[8];
        for (i = 0; i < exss->npresents; i++)
            active_exss_mask[i] = bits_get(&exss->bits, exss->exss_index + 1);

        // Active audio asset mask
        for (i = 0; i < exss->npresents; i++)
            for (j = 0; j <= exss->exss_index; j++)
                if (active_exss_mask[i] & (1 << j))
                    bits_skip(&exss->bits, 8);

        // Mixing metadata enable flag
        exss->mix_metadata_enabled = bits_get1(&exss->bits);
        if (exss->mix_metadata_enabled) {
            // Mixing metadata adjustment level
            bits_skip(&exss->bits, 2);

            // Number of bits for mixer output speaker activity mask
            int spkr_mask_nbits = (bits_get(&exss->bits, 2) + 1) << 2;

            // Number of mixing configurations
            exss->nmixoutconfigs = bits_get(&exss->bits, 2) + 1;

            // Speaker layout mask for mixer output channels
            for (i = 0; i < exss->nmixoutconfigs; i++)
                exss->nmixoutchs[i] = count_chs_for_mask(bits_get(&exss->bits, spkr_mask_nbits));
        }
    } else {
        exss->npresents = 1;
        exss->nassets = 1;
    }

    // Reallocate assets
    if (ta_zalloc_fast(exss, &exss->assets, exss->nassets, sizeof(struct exss_asset)) < 0)
        return -DCADEC_ENOMEM;

    // Size of encoded asset data in bytes
    int offset = header_size;
    for (i = 0; i < exss->nassets; i++) {
        exss->assets[i].asset_offset = offset;
        exss->assets[i].asset_size = bits_get(&exss->bits, exss->exss_size_nbits) + 1;
        offset += exss->assets[i].asset_size;
        if (offset > exss->exss_size) {
            exss_err("Asset out of bounds");
            return -DCADEC_EBADDATA;
        }
    }

    // Audio asset descriptor
    for (i = 0; i < exss->nassets; i++) {
        exss->assets[i].parser = exss;
        if ((ret = parse_descriptor(&exss->assets[i])) < 0)
            return ret;
        if ((ret = set_exss_offsets(&exss->assets[i])) < 0) {
            exss_err("Invalid extension size in asset descriptor");
            return ret;
        }
    }

    // Backward compatible core present
    // Backward compatible core substream index
    // Backward compatible core asset index
    // Reserved
    // Byte align
    // CRC16 of extension substream header
    if ((ret = bits_seek(&exss->bits, header_size * 8)) < 0)
        exss_err("Read past end of EXSS header");
    return ret;
}
Пример #6
0
/* 封包资源提取函数 */
static int CatSystem2_hg2_extract_resource(struct package *pkg,
										   struct package_resource *pkg_res)
{
	u32 hg2_size;
	if (pkg->pio->length_of(pkg, &hg2_size))
		return CUI_ELEN;

	BYTE *hg2 = new BYTE[hg2_size];
	if (!hg2)
		return -CUI_EMEM;

	if (pkg->pio->readvec(pkg, hg2, hg2_size, 0, IO_SEEK_SET)) {
		delete [] hg2;
		return -CUI_EREADVEC;
	}

	hg2_header_t *hg2_header = (hg2_header_t *)hg2;
	hg2_info_t *hg2_info = (hg2_info_t *)(hg2_header + 1);
	hg2_info2_t *hg2_info2 = (hg2_info2_t *)(hg2_info + 1);
	BYTE *compr;
	switch (hg2_header->mode) {
	case 0x25:
		compr = (BYTE *)hg2_info2 + hg2_info2->sizeof_info2;
		break;
	case 0x10:

		break;
	case 0x20:

		break;
	}

	BYTE *uncompr = new BYTE[hg2_info->rgb_uncomprlen + 16];
	if (!uncompr) {
		delete [] hg2;
		return -CUI_EMEM;
	}
	DWORD act_uncomprlen = hg2_info->rgb_uncomprlen + 16;
	if (uncompress(uncompr, &act_uncomprlen, compr, hg2_info->rgb_comprlen) != Z_OK) {
		delete [] uncompr;
		delete [] hg2;
		return -CUI_EUNCOMPR;
	}
	if (act_uncomprlen != hg2_info->rgb_uncomprlen) {
		delete [] uncompr;
		delete [] hg2;
		return -CUI_EUNCOMPR;
	}

	BYTE *uncompr2 = new BYTE[hg2_info->uncomprlen2 + 16];
	if (!uncompr2) {
		delete [] uncompr;
		delete [] hg2;
		return -CUI_EMEM;
	}
	act_uncomprlen = hg2_info->uncomprlen2 + 16;
	compr += hg2_info->rgb_comprlen;
	if (uncompress(uncompr2, &act_uncomprlen, compr, hg2_info->alpha_comprlen) != Z_OK) {
		delete [] uncompr2;
		delete [] uncompr;
		delete [] hg2;
		return -CUI_EUNCOMPR;
	}
	if (act_uncomprlen != hg2_info->uncomprlen2) {
		delete [] uncompr2;
		delete [] uncompr;
		delete [] hg2;
		return -CUI_EUNCOMPR;
	}

	DWORD table[4][256];
	for (DWORD i = 0; i < 256; i++) {
		int dat = (i & 3) | (((i & 0xc) | (((i & 0x30) | ((BYTE)(p & 0xc0) << 6)) << 6)) << 6);
		table[0][i] = dat << 6;
		table[1][i] = dat << 4;
		table[2][i] = dat << 2;
		table[3][i] = dat;
	}

	DWORD bpp = hg2_info->bpp / 8;
	DWORD line_len = hg2_info->width * bpp;
	DWORD dib_size = hg2_info->height * line_len;
	struct bits bits;
	bits_init(&bits, uncompr2, hg2_info->uncomprlen2);
	DWORD flag = bit_get_high(&bits);
	if (!flag) {
		delete [] uncompr2;
		delete [] uncompr;
		delete [] hg2;
		return -CUI_EMATCH;
	}

	DWORD len = get_lenth(&bits);
	BYTE *buffer2 = new BYTE[len](0);
	if (!buffer2) {
		delete [] uncompr2;
		delete [] uncompr;
		delete [] hg2;
		return -CUI_EUNCOMPR;
	}

	for (DWORD i = 0; i < len; i++)
		buffer2[i] = uncompr[i];

	if (len & 3) {
		delete [] buffer2;
		delete [] uncompr2;
		delete [] uncompr;
		delete [] hg2;
		return -CUI_EMATCH;
	}

	DWORD *buffer1 = new DWORD[len / 4];
	if (!buffer1) {
		delete [] buffer2;
		delete [] uncompr2;
		delete [] uncompr;
		delete [] hg2;
		return -CUI_EMEM;
	}

	BYTE *src1 = buffer2;
	BYTE *src2 = buffer2 + len / 2;
	for (i = 0; i < len / 4; i++) {
		buffer1[i] = table[0][*src1] | table[1][src1[len / 4]] | table[2][*src2] | table[3][src2[len / 4]];
		src1++;
		src2++;
	}
	delete [] buffer2;

	BYTE *dib = new BYTE[dib_size];
	if (!dib) {
		delete [] buffer1;
		delete [] uncompr2;
		delete [] uncompr;
		delete [] hg2;
		return -CUI_EMEM;
	}

	BYTE cross_table[256];
	for (i = 0; i < 128; i++) {
		cross_table[i * 2 + 0] = i;
		cross_table[i * 2 + 1] = 255 - i;
	}

	// 输出一行第一个象素
	BYTE *dst = dib + (hg2_info->height - 1) * line_len;
	BYTE *pre = dst;
	BYTE *src = buffer1;
	for (i = 0; i < bpp; i++)
		*dst++ = cross_table[*src++];
	// 输出余下行
	for (DWORD y = 1; y < hg2_info->height; y++) {
		cur = pre - line_len;
		for (DWORD x = 0; x < line_len; x++)
			cur[x] = pre[x] + cross_table[*src++];
		pre -= line_len;
	}
	delete [] buffer1;


	if (hg2_info->key) {
		for (y = 0; y < hg2_info->height; y++) {

		}
	}


	printf("ok\n");exit(0);

	delete [] hg2;

	return 0;
}