c MJPG(1)

news2024/11/15 6:56:58

.读取量化表,全局参数,霍夫曼表,恢复表编码,现在只是实现思路。

#include <stdio.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <sys/ioctl.h>
#include <sys/mman.h>
#include <string.h>
#include <unistd.h>
#include <linux/fb.h>
#include <stdlib.h>

static unsigned char h0[100];

int main(void) {
	FILE *f = fopen("/home/wjs/Pictures/1.jpg", "rb");
	if (f == NULL) {
		puts("file_in error");
		exit(-1);
	}
	fseek(f, 0, SEEK_END);
	int len = ftell(f);
	fseek(f, 0, SEEK_SET);

	int fd = fileno(f);
	unsigned char *p = mmap(NULL, len, PROT_READ, MAP_SHARED, fd, 0);

	puts("-----------量化表---------------------");
	for (int t = 0; t < len; t++) {
		if ((*(p + t) == 0xff) && (*(p + t + 1) == 0xdb)) {
			//		printf("ffdb:%d\n", t);
		}
	}
	puts("-----------帧全局---------------------");
	for (int t = 0; t < len; t++) {
		if ((*(p + t) == 0xff) && (*(p + t + 1) == 0xc0)) {
			//		printf("ffc0:%d\n", t);
		}
	}
	puts("------------霍夫曼表--------------------");




	for (int t = 0; t < len; t++) {
		if ((*(p + t) == 0xff) && (*(p + t + 1) == 0xc4)) {
			//	printf("ffc4:%d\n",t);   //ff c4 (固定)0 1f(长度-2)0(表id)
			int cd = (*(p + t + 2)) * 256 + *(p + t + 3) - 3;
			unsigned char *hp = malloc(cd * (sizeof(char)));


			for (int n = 0; n < cd; n++) {
				*(hp + n) = *(p + t + 5 + n);
				//	printf("%d ",*(hp+n));

			}

			if (*(p + t + 4) == 0) {          //表1
				unsigned  char hfm0[cd];
			//	memcpy(&h0, hp, cd);

			}
			if (*(p + t + 4) == 16) {         //2
				unsigned  char hfm1[cd];
			//	memcpy(&h0,hp,cd);

			}
			if (*(p + t + 4) == 1) {           //3
				unsigned  char hfm2[cd];
			//	memcpy(&h0,hp,cd);

			}
			if (*(p + t + 4) == 17) {          //4
				unsigned  char hfm3[cd];
				memcpy(&h0,hp,cd);

			}

			printf("\n");

			free(hp);
		}

	}


	puts("------------差分数据--------------------");
	for (int t = 0; t < len; t++) {
		if ((*(p + t) == 0xff) && (*(p + t + 1) == 0xdd)) {
			//		printf("ffdd:%d\n", t);
		}
	}
	puts("------------扫描数据--------------------");
	for (int t = 0; t < len; t++) {
		if ((*(p + t) == 0xff) && (*(p + t + 1) == 0xda)) {
			//		printf("ffda:%d\n", t);
		}
	}
//----------------------------------------------------------------------
	//h0[26]
	// 0 1 2 3 4 5 6 7 8 9 10        15
	//0 1 5 1 1 1 1 0 0 0 0 0 0 0 0 0      0 1 4 5 6 7 3 2 8 9
	int bm[100];
	int t = 0;  //输出数组递增数
	int n = 1;  //内存递增数
	if (h0[n] == 1) {
		bm[t] = 0;

	} else if (h0[n] == 2) {
		bm[t] = 0;             //生成2 位   0,1
		t = t + 1;
		bm[t] = 1;

	}
	
	for(int q=0;q<15;q++){
    	n = n + 1;
    	if (h0[n] != 0) {  //3   2,3,4,5,6
	    	t = t + 1;
	       	bm[t] = 2 * (bm[t - 1] + 1);
	    	for (int z = 0; z < (h0[n] - 1); z++) {
		    	t = t + 1;
		    	bm[t] = bm[t - 1] + 1;
	    	}
    	}
	}
/*	n = n + 1;
	if (h0[n] != 0) {  //4  (6+1)*2=14
		t = t + 1;
		bm[t] = 2 * (bm[t - 1] + 1);
		for (int z = 0; z < (h0[n] - 1); z++) {
			t = t + 1;
			bm[t] = bm[t - 1] + 1;
		}
	}

	n = n + 1;
	if (h0[n] != 0) {  //5    (14+1)*2=30
		t = t + 1;
		bm[t] = 2 * (bm[t - 1] + 1);
		for (int z = 0; z < (h0[n] - 1); z++) {
			t = t + 1;
			bm[t] = bm[t - 1] + 1;
		}
	}

	n = n + 1;
	if (h0[n] != 0) {  //6     (30+1)*2=62
		t = t + 1;
		bm[t] = 2 * (bm[t - 1] + 1);
		for (int z = 0; z < (h0[n] - 1); z++) {
			t = t + 1;
			bm[t] = bm[t - 1] + 1;
		}
	}

	n = n + 1;
	if (h0[n] != 0) {  //7位    (62+1)*2=126
		t = t + 1;
		bm[t] = 2 * (bm[t - 1] + 1);
		for (int z = 0; z < (h0[n] - 1); z++) {
			t = t + 1;
			bm[t] = bm[t - 1] + 1;
		}
	}

	n = n + 1;
	if (h0[n] != 0) {  //8
		t = t + 1;
		bm[t] = 2 * (bm[t - 1] + 1);
		for (int z = 0; z < (h0[n] - 1); z++) {
			t = t + 1;
			bm[t] = bm[t - 1] + 1;
		}
	}

	n = n + 1;
	if (h0[n] != 0) {  //9
		t = t + 1;
		bm[t] = 2 * (bm[t - 1] + 1);
		for (int z = 0; z < (h0[n] - 1); z++) {
			t = t + 1;
			bm[t] = bm[t - 1] + 1;
		}
	}

	n = n + 1;
	if (h0[n] != 0) {  //10
		t = t + 1;
		bm[t] = 2 * (bm[t - 1] + 1);
		for (int z = 0; z < (h0[n] - 1); z++) {
			t = t + 1;
			bm[t] = bm[t - 1] + 1;
		}
	}
	n = n + 1;
	if (h0[n] != 0) {  //11
		t = t + 1;
		bm[t] = 2 * (bm[t - 1] + 1);
		for (int z = 0; z < (h0[n] - 1); z++) {
			t = t + 1;
			bm[t] = bm[t - 1] + 1;
		}
	}
	n = n + 1;
	if (h0[n] != 0) {  //12
		t = t + 1;
		bm[t] = 2 * (bm[t - 1] + 1);
		for (int z = 0; z < (h0[n] - 1); z++) {
			t = t + 1;
			bm[t] = bm[t - 1] + 1;
		}
	}
	n = n + 1;
	if (h0[n] != 0) {  //13
		t = t + 1;
		bm[t] = 2 * (bm[t - 1] + 1);
		for (int z = 0; z < (h0[n] - 1); z++) {
			t = t + 1;
			bm[t] = bm[t - 1] + 1;
		}
	}
	n = n + 1;
	if (h0[n] != 0) {  //14
		t = t + 1;
		bm[t] = 2 * (bm[t - 1] + 1);
		for (int z = 0; z < (h0[n] - 1); z++) {
			t = t + 1;
			bm[t] = bm[t - 1] + 1;
		}
	}
	n = n + 1;
	if (h0[n] != 0) {  //15
		t = t + 1;
		bm[t] = 2 * (bm[t - 1] + 1);
		for (int z = 0; z < (h0[n] - 1); z++) {
			t = t + 1;
			bm[t] = bm[t - 1] + 1;
		}
	}
	
*/	
	for (int t = 0; t < 100; t++) {
		printf("%d   ", bm[t]);
	}


	return 0;
}

 Jpeg 用的是范式霍夫曼,可以00 开始推算出码表。

7现在又有一问题,ffda的扫描流中含有Y  和UV两种的交流与直流4个部分,怎样才能区分开这4部分。

搞清楚了码流结构才能试着用上面的码表解码。

一个正常的JPEG码流以SOI(FFD8)标记开始,以EOI(FFD9)标记结束,中间是一帧的图像信息,包括各种数据(如 huffman表FFC4部分,量化表FFC0部分,以及APP和COM等部分)和SCAN部分(FFDA部分)等。JPEG图像包含一个或者多个SCAN(progressive模式包含多个SCAN),一个SCAN下面有一个或者多个RST(Restart Interval),一个RST里有一个或者多个MCU,一个MCU里有一个或者多个Block。

细读rfc2435   jpeg定义标准

1a4ba39ca1804d9a9b483f1f26071272.jpg

 主要找SOS段的详细资料信息

 

 

 

 

 

 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1271374.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

J签证、移民、绿卡都是怎么回事?

随着全球化的不断推进&#xff0c;越来越多的人开始关注国际间的移民与签证政策&#xff0c;其中包括J签证、移民以及绿卡的申请问题。本文将简要介绍J签证、移民绿卡的基本概念&#xff0c;并提供相关申请的一般步骤&#xff0c;以帮助读者更好地了解这些程序。 首先&#xff…

网站优化SEO文章采集组合方法

为了在激烈的网络竞争中脱颖而出&#xff0c;SEO专业人士不断寻求创新的方法和技术。其中&#xff0c;SEO文章采集后重组是一项备受关注的技术&#xff0c;通过巧妙地整合和重新组织已有的信息&#xff0c;以提升网站在搜索引擎中的排名和曝光度。 SEO文章采集是这一技术的第一…

老师上公开课的好处

作为一名老师&#xff0c;公开课是不可避免的&#xff0c;也是提升自己教学水平的重要途径。那么&#xff0c;老师上公开课到底有哪些好处呢&#xff1f;以下几条&#xff0c;也许可以为你解开疑惑。 提升老师的教学水平。在公开课上&#xff0c;老师需要将平时的教学经验、方法…

docker-compose;私有镜像仓库harbor搭建;镜像推送到私有仓库harbor

docker-compose&#xff1b;私有镜像仓库harbor搭建&#xff1b;镜像推送到私有仓库harbor 文章目录 docker-compose&#xff1b;私有镜像仓库harbor搭建&#xff1b;镜像推送到私有仓库harbordocker-compose私有镜像仓库harbor搭建镜像推送到私有仓库harbor docker-compose D…

Elk+Filebeat+Kafka实现日志收集

ElkFilebeatKafka实现日志收集(本机nginx) 部署Zookeeper 1.实验组件 #准备3台服务器做Zookeeper集群 20.0.0.10 20.0.0.20 20.0.0.30 2.安装前准备 #关闭防火墙 systemctl stop firewalld systemctl disable firewalld setenforce 0#安装JDK yum install -y java-1.8.0-o…

井盖位移报警器安装,智能化井盖厂家推荐

当井盖发生位移或倾斜时&#xff0c;通常会引起所处道路的安全隐患&#xff0c;给过往的车辆和行人带来许多潜在的危险。为了避免潜在的安全事故频繁出现&#xff0c;及时发现并处理井盖位移或倾斜才能更好的保障人民的安全。因此安装井盖位移报警器是满足政府和市民需求的。 单…

抖音本地生活服务商申请条件

抖音的本地生活服务商目前有两种&#xff0c;一种是可以做全国的服务商&#xff0c;我们一般叫抖音本地生活服务商&#xff0c;一种是区域优待服务商&#xff0c;也就是后面出来的服务商&#xff0c;这两种服务商的申请方式大同小异。 相同的地方就是都需要给平台交保证金。抖…

用java制作飞翔的小鸟

第一步是创建项目 项目名自拟 第二步创建个包名 来规范class 再创建一个包 来存储照片 如下&#xff1a; package game; import java.awt.*; import javax.swing.*; import javax.imageio.ImageIO;public class Bird {Image image;int x,y;int width,height;int size;doubl…

计算机体系结构----指令系统(二)

本文仅供学习&#xff0c;不作任何商业用途&#xff0c;严禁转载。绝大部分资料来自----计算机系统结构教程(第二版)张晨曦等 计算机体系结构----指令系统&#xff08;二&#xff09; 2.1 指令系统结构的分类2.2 寻址方式2.3 MIPS 指令系统结构2.3.1 MIPS的寄存器2.3.2 MIPS的…

虚拟化CentOS7分区大小调整+磁盘扩容=新分区

一、适应场景 1、虚拟化环境ESXI6.7下的虚拟服务器&#xff0c;使用一段时间后&#xff0c;把空闲的存储空间腾出来&#xff0c;给新的分区使用。 2、Linux的版本为CentOS7 3、本例为部署minio存储业务做准备 4、虚拟化存储扩容 二、配置过程 调整分区大小&#xff0c;为min…

Go语言 值传递

官方说法&#xff0c;Go中只有值传递&#xff0c;没有引用传递 而Go语言中的一些让你觉得它是引用传递的原因&#xff0c;是因为Go语言有值类型和引用类型&#xff0c;但是它们都是值传递。 值类型 有int、float、bool、string、array、sturct等 引用类型有slice&#xff0c…

免费SSL证书有效果吗?

首先&#xff0c;我们要明确一点&#xff1a;无论是付费还是免费的SSL证书&#xff0c;它们都能实现基本的HTTPS加密功能&#xff0c;确保数据在客户端和服务器之间的传输过程中不会被窃取或篡改。从这个角度来看&#xff0c;免费SSL证书的确可以提供一定的安全保障。 然而&…

每天一点python——day81

#每天一点Python——81 #递归函数&#xff1a; 递归函数&#xff1a; 一个函数在该函数体内调用了该函数本身&#xff0c;这个函数称为递归函数 【释&#xff1a;我自己调用自己的函数】 递归函数的组成部分&#xff1a; 递归调用与递归终止条件。 【一定有一个跳出循环的终止条…

【MySQL】事务(事务四大特性+四种隔离级别+MVCC)

事务 前言正式开始事务的四大特性为什么会出现事务事务的版本支持事务提交方式事务常见操作方式启动事务回滚演示提交事务事务的异常autocommit 事务的隔离性隔离级别查看隔离级别修改隔离级别验证四种隔离级别读未提交(read uncommitted) —— 缩写为RU读提交(read committed)…

web:catcat-new(文件包含漏洞、flask_session伪造)

前提知识 /etc/passwd 该文件储存了该Linux系统中所有用户的一些基本信息&#xff0c;只有root权限才可以修改。其具体格式为 用户名:口令:用户标识号:组标识号:注释性描述:主目录:登录Shell&#xff08;以冒号作为分隔符&#xff09; /proc/self proc是一个伪文件系统…

C++和Python混合编程在数据采集程序中的应用

目录 一、引言 二、C和Python的特性及其在数据采集程序中的应用 1、C的特性及其在数据采集程序中的应用 2、Python的特性及其在数据采集程序中的应用 三、C和Python混合编程在数据采集程序中的实现方法 四、混合编程的优缺点以及未来发展趋势 五、代码示例 六、结论 一…

创业者如何在居家办公和固定办公场地办公中权衡利弊,选择合适的

创业者如何选择办公方式&#xff0c;可能要根据自己的创业项目、团队规模、资金情况、行业特点等多方面因素来考虑。一般来说&#xff0c;居家办公和固定办公场地各有优缺点&#xff0c;没有绝对的好坏&#xff0c;只有适合不适合。我为大家总结了一些相关的信息&#xff0c;希…

Spring-AOP与声明式事务

为什么要用AOP ①现有代码缺陷 针对带日志功能的实现类&#xff0c;我们发现有如下缺陷&#xff1a; 对核心业务功能有干扰&#xff0c;导致程序员在开发核心业务功能时分散了精力 附加功能分散在各个业务功能方法中&#xff0c;不利于统一维护 ②解决思路 解决这两个问题&…

原来字节跳动这么容易就能进····

“字节是大企业&#xff0c;是不是很难进去啊&#xff1f;” “在字节做软件测试&#xff0c;能得到很好的发展吗&#xff1f; 一进去就有12.5K&#xff0c;其实也没有想的那么难” 直到现在&#xff0c;心情都还是无比激动&#xff01; 本人211非科班&#xff0c;之前在字节…

SpringBoot查询指定范围内的坐标点

使用Redis geo实现 redis geo是基于Sorted Set来实现的 Redis 3.2 版本新增了geo相关命令&#xff0c;用于存储和操作地理位置信息。提供的命令包括添加、计算位置之间距离、根据中心点坐标和距离范围来查询地理位置集合等&#xff0c;说明如下: geoadd&#xff1a;添加地理…