⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 memory_stream.c

📁 由bmp生成mpeg2 的I_frame 数据
💻 C
字号:
#define MEMORY_STREAM_C
#include "memory_stream.h"

static void fill_bits(MEMORY_STREAM *ms);

void ms_set_buffer(MEMORY_STREAM *ms, void *buffer, int size)
{
	ms->pos = buffer;
	ms->last = ms->pos + size;
	ms->bits = 0;
	ms->bits_num = 0;
	ms->count = 0;

	fill_bits(ms);
}

unsigned int ms_get_bits(MEMORY_STREAM *ms, int num_of_bits)
{
	int n;
	unsigned int r;

	n = ms->bits_num - num_of_bits;
	r = ms->bits >> n;

	ms->bits_num = n;
	ms->bits &= ( (1 << ms->bits_num) - 1 );

	ms->count += num_of_bits;

	fill_bits(ms);

	return r;
}

unsigned int ms_read_bits(MEMORY_STREAM *ms, int num_of_bits)
{
	return (ms->bits >> (ms->bits_num - num_of_bits));
}

void ms_erase_bits(MEMORY_STREAM *ms, int num_of_bits)
{
	int n;
	
	ms->count += num_of_bits;
	
	if(ms->bits_num > num_of_bits){
		ms->bits_num -= num_of_bits;
		ms->bits &= ( (1 << ms->bits_num) - 1 );
	}else{
		num_of_bits -= ms->bits_num;
		n = num_of_bits % 8;
		ms->pos += (num_of_bits / 8);
		if(ms->pos < ms->last){
			ms->bits = ms->pos[0] & ((1 << ms->bits_num) - 1);
			ms->pos += 1;
		}else{
			ms->bits = 0;
		}
		ms->bits_num = n;
	}		

	fill_bits(ms);
}

void *ms_byte_aling(MEMORY_STREAM *ms)
{
	int n,m;
	unsigned char *r;
	n = ms->bits_num / 8;
	m = ms->bits_num % 8;
	
	r = ms->pos-n;
	
	ms_erase_bits(ms, m);

	return r;
}

static void fill_bits(MEMORY_STREAM *ms)
{
	int i,n;

	n = 32 - ms->bits_num;
	n >>= 3;

	for(i=0;i<n;i++){
		ms->bits <<= 8;
		if(ms->pos < ms->last){
			ms->bits |= ms->pos[0];
			ms->pos += 1;
		}
		ms->bits_num += 8;
	}
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -