Initial commit
This commit is contained in:
+120
@@ -0,0 +1,120 @@
|
||||
#include "inputImage.h"
|
||||
|
||||
|
||||
const static JOCTET EOI_BUFFER[1] = { JPEG_EOI };
|
||||
|
||||
inputImage::inputImage()
|
||||
{
|
||||
}
|
||||
|
||||
void inputImage::setImageData(const std::string& data)
|
||||
{
|
||||
decompressImage(data.c_str(), data.size());
|
||||
}
|
||||
|
||||
unsigned int inputImage::width() const
|
||||
{
|
||||
return m_width;
|
||||
}
|
||||
|
||||
unsigned int inputImage::height() const
|
||||
{
|
||||
return m_height;
|
||||
}
|
||||
|
||||
unsigned int inputImage::strideX() const
|
||||
{
|
||||
return m_strideX;
|
||||
}
|
||||
|
||||
unsigned int inputImage::strideY() const
|
||||
{
|
||||
return m_strideY;
|
||||
}
|
||||
|
||||
const std::vector<char>& inputImage::data() const
|
||||
{
|
||||
return m_data;
|
||||
}
|
||||
|
||||
void inputImage::init_source(j_decompress_ptr pCinfo)
|
||||
{
|
||||
}
|
||||
|
||||
boolean inputImage::fill_input_buffer(j_decompress_ptr pCinfo)
|
||||
{
|
||||
source_mgr_ptr pSrc = reinterpret_cast<source_mgr_ptr>(pCinfo->src);
|
||||
pSrc->pub.next_input_byte = EOI_BUFFER;
|
||||
pSrc->pub.bytes_in_buffer = 1;
|
||||
return TRUE;
|
||||
}
|
||||
|
||||
void inputImage::skip_input_data(j_decompress_ptr pCinfo, long numBytes)
|
||||
{
|
||||
source_mgr_ptr pSrc = reinterpret_cast<source_mgr_ptr>(pCinfo->src);
|
||||
if (pSrc->pub.bytes_in_buffer < numBytes)
|
||||
{
|
||||
pSrc->pub.next_input_byte = EOI_BUFFER;
|
||||
pSrc->pub.bytes_in_buffer = 1;
|
||||
}
|
||||
else
|
||||
{
|
||||
pSrc->pub.next_input_byte += numBytes;
|
||||
pSrc->pub.bytes_in_buffer -= numBytes;
|
||||
}
|
||||
}
|
||||
|
||||
void inputImage::term_source(j_decompress_ptr pCinfo)
|
||||
{
|
||||
}
|
||||
|
||||
void inputImage::setSourceMgr(j_decompress_ptr pCinfo, const char* pData, size_t len) const
|
||||
{
|
||||
source_mgr_ptr pSrc;
|
||||
if (pCinfo->src == 0)
|
||||
pCinfo->src = (struct jpeg_source_mgr *)(*pCinfo->mem->alloc_small)(reinterpret_cast<j_common_ptr>(pCinfo), JPOOL_PERMANENT, sizeof(source_mgr));
|
||||
|
||||
pSrc = reinterpret_cast<source_mgr_ptr>(pCinfo->src);
|
||||
pSrc->pub.init_source = inputImage::init_source;
|
||||
pSrc->pub.fill_input_buffer = inputImage::fill_input_buffer;
|
||||
pSrc->pub.skip_input_data = inputImage::skip_input_data;
|
||||
pSrc->pub.resync_to_restart = jpeg_resync_to_restart;
|
||||
pSrc->pub.term_source = inputImage::term_source;
|
||||
|
||||
pSrc->data = (const JOCTET *)pData;
|
||||
pSrc->len = len;
|
||||
pSrc->pub.bytes_in_buffer = len;
|
||||
pSrc->pub.next_input_byte = pSrc->data;
|
||||
}
|
||||
|
||||
void inputImage::decompressImage(const char* pData, size_t len)
|
||||
{
|
||||
struct jpeg_decompress_struct cinfo;
|
||||
struct jpeg_error_mgr jerr;
|
||||
|
||||
jerr.trace_level = 0;
|
||||
cinfo.err = jpeg_std_error(&jerr);
|
||||
jpeg_create_decompress(&cinfo);
|
||||
setSourceMgr(&cinfo, pData, len);
|
||||
|
||||
jpeg_read_header(&cinfo, TRUE);
|
||||
jpeg_start_decompress(&cinfo);
|
||||
|
||||
m_width = cinfo.image_width;
|
||||
m_height = cinfo.image_height;
|
||||
m_strideX = cinfo.num_components;
|
||||
m_strideY = m_width * cinfo.num_components;
|
||||
|
||||
m_data.resize(m_height * m_strideY);
|
||||
|
||||
JSAMPROW scanlines[1];
|
||||
while (cinfo.output_scanline < cinfo.image_height)
|
||||
{
|
||||
scanlines[0] = reinterpret_cast<JSAMPROW>(&m_data[cinfo.output_scanline * m_strideY]);
|
||||
jpeg_read_scanlines(&cinfo, scanlines, 1);
|
||||
}
|
||||
|
||||
jpeg_finish_decompress(&cinfo);
|
||||
jpeg_destroy_decompress(&cinfo);
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user