文档章节

JpegDecoder--Jpeg文件解码程序

t
 tigerBin
发布于 2017/07/05 13:08
字数 788
阅读 56
收藏 0

Source: http://git.oschina.net/SilentCode/JpegCodecs

性能分析: gprof main.exe > profile.txt

Each sample counts as 0.01 seconds.
  %   cumulative   self              self     total           
 time   seconds   seconds    calls  ms/call  ms/call  name    
 13.40      0.13     0.13                             _spin_lite_unlock
 12.37      0.25     0.12                             std::string::compare(std::string const&)
 12.37      0.37     0.12                             _spin_lite_lock
 10.31      0.47     0.10                             __pthread_self_lite
  9.28      0.56     0.09                             std::_Rb_tree<std::string,
  8.25      0.64     0.08                             Transform(int*)
  4.12      0.68     0.04                             std::less<std::string>::operator()
  3.09      0.71     0.03                             std::_Rb_tree<std::string, 
  3.09      0.74     0.03                             bool std::operator< <char, 
  3.09      0.77     0.03                             __fpclassify
  2.06      0.79     0.02                             ConvertClrSpace
  2.06      0.81     0.02                             std::_Select1st
  2.06      0.83     0.02                             std::_Rb_tree_iterator
  2.06      0.85     0.02                             std::_Rb_tree
  2.06      0.87     0.02                             round
  1.03      0.88     0.01        1    10.00    10.00  Encoder(unsigned char*, int, int, int&)
  1.03      0.89     0.01                             SetLastError@4
  1.03      0.90     0.01                             ComputeRealValue(int)
  1.03      0.91     0.01                             UpSample(int*, int*)
  1.03      0.92     0.01                             std::_Rb_tree
  1.03      0.93     0.01                             std::string
  1.03      0.94     0.01                             std::_Rb_tree
  1.03      0.95     0.01                             std::_Rb_tree
  1.03      0.96     0.01                             pthread_getspecific
  1.03      0.97     0.01                             pthread_setspecific
  0.00      0.97     0.00        1     0.00     0.00  SetBitmapInfo(unsigned int, int, int)
  0.00      0.97     0.00        1     0.00     0.00  Write(char const*, unsigned char*, int&)
  0.00      0.97     0.00        1     0.00     0.00  Matrix()

可以看出,解码一张图片大约 1s 钟,而实际用于解码的时间不到 0.5s ,这是因为STL容器里面加入了很多安全与多线程相关的操作,这些额外的开销增加了解码的时间

下面是基于我实现的 tinyMap 解码后的结果:

Source:https://github.com/lzb-cc/JpegCodecs

Flat profile:

Each sample counts as 0.01 seconds.
  %   cumulative   self              self     total           
 time   seconds   seconds    calls  ms/call  ms/call  name    
 23.73      0.14     0.14    48960     0.00     0.00  JpegDecoder::Transform(int*)
 15.25      0.23     0.09                             round
 13.56      0.31     0.08  2092962     0.00     0.00  tinyMap::find(int)
 10.17      0.37     0.06     8160     0.01     0.01  ConvertClrSpace(unsigned char*, int, int)
  8.47      0.42     0.05  2333318     0.00     0.00  NextBit()
  5.08      0.45     0.03        1    30.00    30.00  Encoder(unsigned char*, int, int, int&)
  5.08      0.48     0.03                             __fpclassify
  3.39      0.50     0.02    48960     0.00     0.00  Dequant(int*, unsigned char*)
  3.39      0.52     0.02    48960     0.00     0.00  UnZigZag(int*, int*)
  3.39      0.54     0.02    16320     0.00     0.00  UpSample(int*, int*)
  1.69      0.55     0.01  1776506     0.00     0.00  tinyStl::tinyMap::find(int, int)
  1.69      0.56     0.01   316456     0.00     0.00  FindKeyValue(tinyStl::tinyMap&)
  1.69      0.57     0.01   267496     0.00     0.00  ComputeRealValue(int)
  1.69      0.58     0.01    48960     0.00     0.00  DecoderBlock
  1.69      0.59     0.01                             _spin_lite_lock
  0.00      0.59     0.00  1776506     0.00     0.00  tinyStl::tinyMap::end()
  0.00      0.59     0.00   316456     0.00     0.00  tinyStl::tinyMap::operator[](int)
  0.00      0.59     0.00    26214     0.00     0.00  tinyStl::MapNode::Less(tinyStl::MapNode*)
  0.00      0.59     0.00     8160     0.00     0.04  JpegCodec::JpegDecoder::DecoderMCU()
  0.00      0.59     0.00     8160     0.00     0.00  FillYCbCr()
  0.00      0.59     0.00      680     0.00     0.00  GrandParent(tinyStl::RBNode*)
  0.00      0.59     0.00      348     0.00     0.00  RBNode()
  0.00      0.59     0.00      348     0.00     0.00  Check1(tinyStl::RBNode*)
  0.00      0.59     0.00      348     0.00     0.00  Insert(tinyStl::RBNode*)
  0.00      0.59     0.00      348     0.00     0.00  insert(int, int, int)
  0.00      0.59     0.00      344     0.00     0.00  Check2(tinyStl::RBNode*)
  0.00      0.59     0.00      344     0.00     0.00  AddToTree(tinyStl::RBNode*, tinyStl::RBNode*)
  0.00      0.59     0.00      340     0.00     0.00  RBTree::Uncle(tinyStl::RBNode*)
  0.00      0.59     0.00      340     0.00     0.00  Check3(tinyStl::RBNode*)
  0.00      0.59     0.00      340     0.00     0.00  Check4(tinyStl::RBNode*)
  0.00      0.59     0.00        4     0.00     0.00  RBTree()
  0.00      0.59     0.00        4     0.00     0.00  tinyMap()
  0.00      0.59     0.00        4     0.00     0.00  ReBuildTable(int, tinyStl::tinyMap&)
  0.00      0.59     0.00        3     0.00     0.00  MarkIndex(unsigned char)
  0.00      0.59     0.00        1     0.00     0.00  SetBitmapInfo(unsigned int, int, int)
  0.00      0.59     0.00        1     0.00     0.00  Write(char const*, unsigned char*, int&)
  0.00      0.59     0.00        1     0.00     0.00  ComputeDHT()
  0.00      0.59     0.00        1     0.00     0.00  ReadImageSize()
  0.00      0.59     0.00        1     0.00     0.00  ToStartOfData()
  0.00      0.59     0.00        1     0.00     0.00  ReadQuantTable()
  0.00      0.59     0.00        1     0.00   430.00  Decoder(JpegCodec::Matrix&)
  0.00      0.59     0.00        1     0.00     0.00  JpegDecoder(char const*)
  0.00      0.59     0.00        1     0.00     0.00  ~JpegDecoder()
  0.00      0.59     0.00        1     0.00     0.00  Create(int, int, int)
  0.00      0.59     0.00        1     0.00     0.00  Matrix::Matrix()

与使用STL相比,性能有了明显的提升

测试代码:

// main.cpp
#include <stdio.h>
#include "JpegDecoder.h"
#include "BmpEncoder.h"

using namespace JpegCodec;

int main(int argc, char *argv[])
{
	if (argc < 3)
	{
		printf("Usage: main input.jpg out.bmp\n");
		return 0;
	}
	/* 解码 Jpeg 文件 */
	JpegDecoder decoder(argv[1]);
	Matrix mat;
    	decoder.Decoder(mat);

	/* 保存为 Bitmap 格式图像 */
	int size;
	unsigned char *bitmap = Encoder(mat.data, mat.rows, mat.cols, size);
	Write(argv[2], bitmap, size);
	return 0;
}

 

© 著作权归作者所有

共有 人打赏支持
t
粉丝 0
博文 65
码字总数 17440
作品 0
武汉
程序员
常见图片格式详解(三)---JPEG

JPEG简介 JPEG是一种比较成熟的有损的图像压缩格式,经过JPEG压缩,图像质量会有所损失,但是,人眼不容易分辨出来这种差别。jpeg图像在质量和存储空间得到了一个相对平衡的状态。不过jpeg文...

mmlf
03/19
0
0
英伟达开源数据增强和数据解码库,解决计算机视觉性能瓶颈

     新智元编译   来源:NVIDIA   编辑:肖琴   【新智元导读】在CVPR 2018大会上,英伟达开源了数据增强库DALI和数据解码库nvJPEG。   在CVPR 2018大会上,英伟达开源了数据增...

深度学习
06/25
0
0
NIOS2随笔——JPEG解码与VGA显示

1. 系统概述 本设计采用NIOS2 32位处理器,通过SPI接口将SD/TF卡中的JPEG图片数据读取到内存中,SD/TF卡的文件系统为FAT32,NIOS2软件实现JPEG解码后,启动framereader和Clocked Video Outpu...

shugenyin
2017/01/08
0
0
数据压缩实验五 JPEG原理分析及JPEG解码器的调试

一、实验原理 1、JPEG图像压缩标准基本介绍 JPEG 是Joint Photographic Experts Group(联合图像专家小组)的缩写,是第一个国际图像压缩标准。JPEG图像压缩算法能够在提供良好的压缩性能的同...

zgyggy
2017/05/23
0
0
几种图片格式的简介

JPEG 是目前最常见的图片格式,它诞生于 1992 年,是一个很古老的格式。它只支持有损压缩,其压缩算法可以精确控制压缩比,以图像质量换得存储空间。由于它太过常见,以至于许多移动设备的 ...

南瓜宝宝
2016/05/30
43
0

没有更多内容

加载失败,请刷新页面

加载更多

【源码分析】面试问烂的equals和各种字符串、Integer比较

今天在空闲时间聊天时发现,面试题中的equals问题,以及String、Integer等的判等问题还是讨论的比较激烈而且混乱。。。(滑稽) 其实网上有非常多关于这种面试题的文章或者博客,其实多去看看就...

LinkedBear
4分钟前
0
0
jvm汇总

https://www.toutiao.com/i6490796229067276814/ https://tech.meituan.com/jvm_optimize.html

tantexian
5分钟前
0
0
限制MongoDB使用内存大小

限制MongoDB使用内存大小 0 收藏(6)因为MongoDB的内存是系统的虚拟内存管理的,MongoDB并不干涉内存管理工作,这样虽然可以简化Mongo的工作,但同时Mongo的内存使用是没法控制的。 真的没法控...

Airship
6分钟前
0
0
“赋能开发者”高峰论坛暨西安葡萄城30周年庆典隆重举办

 2018 年 10 月 18 日,“赋能开发者”高峰论坛暨西安葡萄城 30 周年庆典在古城西安隆重举办。   此次论坛由西安葡萄城信息技术有限公司(以下简称“西安葡萄城”)主办。作为软件开发行业...

葡萄城技术团队
7分钟前
0
0
聊聊storm的reportError

序 本文主要研究一下storm的reportError IErrorReporter storm-2.0.0/storm-client/src/jvm/org/apache/storm/task/IErrorReporter.java public interface IErrorReporter { void report......

go4it
8分钟前
0
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部