Blame libfreerdp/codec/jpeg.c

Packit 1fb8d4
/**
Packit 1fb8d4
 * FreeRDP: A Remote Desktop Protocol Implementation
Packit 1fb8d4
 * Compressed jpeg
Packit 1fb8d4
 *
Packit 1fb8d4
 * Copyright 2012 Jay Sorg <jay.sorg@gmail.com>
Packit 1fb8d4
 *
Packit 1fb8d4
 * Licensed under the Apache License, Version 2.0 (the "License");
Packit 1fb8d4
 * you may not use this file except in compliance with the License.
Packit 1fb8d4
 * You may obtain a copy of the License at
Packit 1fb8d4
 *
Packit 1fb8d4
 *     http://www.apache.org/licenses/LICENSE-2.0
Packit 1fb8d4
 *
Packit 1fb8d4
 * Unless required by applicable law or agreed to in writing, software
Packit 1fb8d4
 * distributed under the License is distributed on an "AS IS" BASIS,
Packit 1fb8d4
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
Packit 1fb8d4
 * See the License for the specific language governing permissions and
Packit 1fb8d4
 * limitations under the License.
Packit 1fb8d4
 */
Packit 1fb8d4
Packit 1fb8d4
#ifdef HAVE_CONFIG_H
Packit 1fb8d4
#include "config.h"
Packit 1fb8d4
#endif
Packit 1fb8d4
Packit 1fb8d4
#include <winpr/stream.h>
Packit 1fb8d4
Packit 1fb8d4
#include <freerdp/codec/color.h>
Packit 1fb8d4
Packit 1fb8d4
#include <freerdp/codec/jpeg.h>
Packit 1fb8d4
Packit 1fb8d4
#ifdef WITH_JPEG
Packit 1fb8d4
Packit 1fb8d4
#define XMD_H
Packit 1fb8d4
Packit 1fb8d4
#include <jpeglib.h>
Packit 1fb8d4
Packit 1fb8d4
struct mydata_decomp
Packit 1fb8d4
{
Packit 1fb8d4
	char* data;
Packit 1fb8d4
	int data_bytes;
Packit 1fb8d4
};
Packit 1fb8d4
Packit 1fb8d4
/*****************************************************************************/
Packit 1fb8d4
static void my_init_source(j_decompress_ptr cinfo)
Packit 1fb8d4
{
Packit 1fb8d4
}
Packit 1fb8d4
Packit 1fb8d4
/*****************************************************************************/
Packit 1fb8d4
static boolean my_fill_input_buffer(j_decompress_ptr cinfo)
Packit 1fb8d4
{
Packit 1fb8d4
	struct mydata_decomp* md;
Packit 1fb8d4
Packit 1fb8d4
	md = (struct mydata_decomp*)(cinfo->client_data);
Packit 1fb8d4
	cinfo->src->next_input_byte = (unsigned char*)(md->data);
Packit 1fb8d4
	cinfo->src->bytes_in_buffer = md->data_bytes;
Packit 1fb8d4
	return 1;
Packit 1fb8d4
}
Packit 1fb8d4
Packit 1fb8d4
/*****************************************************************************/
Packit 1fb8d4
static void my_skip_input_data(j_decompress_ptr cinfo, long num_bytes)
Packit 1fb8d4
{
Packit 1fb8d4
}
Packit 1fb8d4
Packit 1fb8d4
/*****************************************************************************/
Packit 1fb8d4
static boolean my_resync_to_restart(j_decompress_ptr cinfo, int desired)
Packit 1fb8d4
{
Packit 1fb8d4
	return 1;
Packit 1fb8d4
}
Packit 1fb8d4
Packit 1fb8d4
/*****************************************************************************/
Packit 1fb8d4
static void my_term_source(j_decompress_ptr cinfo)
Packit 1fb8d4
{
Packit 1fb8d4
}
Packit 1fb8d4
Packit 1fb8d4
/*****************************************************************************/
Packit Service 5a9772
static int do_decompress(char* comp_data, int comp_data_bytes, int* width, int* height, int* bpp,
Packit Service 5a9772
                         char* decomp_data, int* decomp_data_bytes)
Packit 1fb8d4
{
Packit 1fb8d4
	struct jpeg_decompress_struct cinfo;
Packit 1fb8d4
	struct jpeg_error_mgr jerr;
Packit 1fb8d4
	struct jpeg_source_mgr src_mgr;
Packit 1fb8d4
	struct mydata_decomp md;
Packit 1fb8d4
	JSAMPROW row_pointer[1];
Packit 1fb8d4
Packit 1fb8d4
	memset(&cinfo, 0, sizeof(cinfo));
Packit 1fb8d4
	cinfo.err = jpeg_std_error(&jerr);
Packit 1fb8d4
	jpeg_create_decompress(&cinfo);
Packit 1fb8d4
Packit 1fb8d4
	memset(&src_mgr, 0, sizeof(src_mgr));
Packit 1fb8d4
	cinfo.src = &src_mgr;
Packit 1fb8d4
	src_mgr.init_source = my_init_source;
Packit 1fb8d4
	src_mgr.fill_input_buffer = my_fill_input_buffer;
Packit 1fb8d4
	src_mgr.skip_input_data = my_skip_input_data;
Packit 1fb8d4
	src_mgr.resync_to_restart = my_resync_to_restart;
Packit 1fb8d4
	src_mgr.term_source = my_term_source;
Packit 1fb8d4
Packit 1fb8d4
	memset(&md, 0, sizeof(md));
Packit 1fb8d4
	md.data = comp_data;
Packit 1fb8d4
	md.data_bytes = comp_data_bytes;
Packit 1fb8d4
	cinfo.client_data = &md;
Packit 1fb8d4
Packit 1fb8d4
	jpeg_read_header(&cinfo, 1);
Packit 1fb8d4
Packit 1fb8d4
	cinfo.out_color_space = JCS_RGB;
Packit 1fb8d4
Packit 1fb8d4
	*width = cinfo.image_width;
Packit 1fb8d4
	*height = cinfo.image_height;
Packit 1fb8d4
	*bpp = cinfo.num_components * 8;
Packit 1fb8d4
Packit 1fb8d4
	jpeg_start_decompress(&cinfo);
Packit 1fb8d4
Packit Service 5a9772
	while (cinfo.output_scanline < cinfo.image_height)
Packit 1fb8d4
	{
Packit Service 5a9772
		row_pointer[0] = (JSAMPROW)decomp_data;
Packit 1fb8d4
		jpeg_read_scanlines(&cinfo, row_pointer, 1);
Packit 1fb8d4
		decomp_data += cinfo.image_width * cinfo.num_components;
Packit 1fb8d4
	}
Packit Service 5a9772
	*decomp_data_bytes = cinfo.output_width * cinfo.output_height * cinfo.num_components;
Packit 1fb8d4
	jpeg_finish_decompress(&cinfo);
Packit 1fb8d4
	jpeg_destroy_decompress(&cinfo);
Packit 1fb8d4
	return 0;
Packit 1fb8d4
}
Packit 1fb8d4
Packit 1fb8d4
/* jpeg decompress */
Packit 1fb8d4
BOOL jpeg_decompress(BYTE* input, BYTE* output, int width, int height, int size, int bpp)
Packit 1fb8d4
{
Packit 1fb8d4
	int lwidth;
Packit 1fb8d4
	int lheight;
Packit 1fb8d4
	int lbpp;
Packit 1fb8d4
	int ldecomp_data_bytes;
Packit 1fb8d4
Packit 1fb8d4
	if (bpp != 24)
Packit 1fb8d4
	{
Packit 1fb8d4
		return 0;
Packit 1fb8d4
	}
Packit Service 5a9772
	if (do_decompress((char*)input, size, &lwidth, &lheight, &lbpp, (char*)output,
Packit Service 5a9772
	                  &ldecomp_data_bytes) != 0)
Packit 1fb8d4
	{
Packit 1fb8d4
		return 0;
Packit 1fb8d4
	}
Packit 1fb8d4
	if (lwidth != width || lheight != height || lbpp != bpp)
Packit 1fb8d4
	{
Packit 1fb8d4
		return 0;
Packit 1fb8d4
	}
Packit 1fb8d4
	return 1;
Packit 1fb8d4
}
Packit 1fb8d4
Packit 1fb8d4
#else
Packit 1fb8d4
Packit 1fb8d4
BOOL jpeg_decompress(BYTE* input, BYTE* output, int width, int height, int size, int bpp)
Packit 1fb8d4
{
Packit 1fb8d4
	return 0;
Packit 1fb8d4
}
Packit 1fb8d4
Packit 1fb8d4
#endif