158537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)/* 2ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch * Copyright (C) 2007-2008 The Android Open Source Project 3ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch * 45821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Licensed under the Apache License, Version 2.0 (the "License"); 558537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) * you may not use this file except in compliance with the License. 65821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * You may obtain a copy of the License at 75821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * 858537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) * http://www.apache.org/licenses/LICENSE-2.0 95821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * 105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Unless required by applicable law or agreed to in writing, software 115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * distributed under the License is distributed on an "AS IS" BASIS, 125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 1358537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) * See the License for the specific language governing permissions and 1458537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) * limitations under the License. 1558537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) */ 1658537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) 1758537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)#define JPEG_INTERNALS 1858537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)#include "jinclude.h" 1958537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)#include "jpeglib.h" 205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "jmemsys.h" /* import the system-dependent declarations */ 2158537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) 2258537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)#ifndef HAVE_STDLIB_H /* <stdlib.h> should declare malloc(),free() */ 2358537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)extern void * malloc JPP((size_t size)); 2458537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)extern void free JPP((void *ptr)); 2558537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)#endif 265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2758537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)#ifndef SEEK_SET /* pre-ANSI systems may not define this; */ 2858537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)#define SEEK_SET 0 /* if not, assume 0 is correct */ 295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif 3058537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) 315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3258537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)/* 3358537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) * Memory allocation and freeing are controlled by the regular library 3458537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) * routines malloc() and free(). 3558537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) */ 3658537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) 3758537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)GLOBAL(void *) 385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)jpeg_get_small (j_common_ptr cinfo, size_t sizeofobject) 3958537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles){ 405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return (void *) malloc(sizeofobject); 4158537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)} 4258537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) 435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)GLOBAL(void) 4458537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)jpeg_free_small (j_common_ptr cinfo, void * object, size_t sizeofobject) 4558537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles){ 4658537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) free(object); 4758537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)} 4858537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) 4958537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) 5058537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)/* 5158537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) * "Large" objects are treated the same as "small" ones. 5258537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) * NB: although we include FAR keywords in the routine declarations, 5358537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) * this file won't actually work in 80x86 small/medium model; at least, 5458537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) * you probably won't be able to process useful-size images in only 64KB. 5558537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) */ 5658537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) 5758537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)GLOBAL(void FAR *) 5858537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)jpeg_get_large (j_common_ptr cinfo, size_t sizeofobject) 5958537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles){ 6058537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) return (void FAR *) malloc(sizeofobject); 6158537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)} 625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 6358537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)GLOBAL(void) 6458537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)jpeg_free_large (j_common_ptr cinfo, void FAR * object, size_t sizeofobject) 6558537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles){ 6658537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) free(object); 6758537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)} 6858537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) 6958537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) 7058537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)/* 7158537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) * This routine computes the total memory space available for allocation. 7258537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) * It's impossible to do this in a portable way; our current solution is 7358537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) * to make the user tell us (with a default value set at compile time). 7458537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) * If you can actually get the available space, it's a good idea to subtract 7558537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) * a slop factor of 5% or so. 7658537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) */ 7758537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) 7858537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)#ifndef DEFAULT_MAX_MEM /* so can override from makefile */ 7958537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)#define DEFAULT_MAX_MEM 10000000L /* default: ten megabyte */ 8058537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)#endif 8158537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) 8258537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)GLOBAL(long) 8358537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)jpeg_mem_available (j_common_ptr cinfo, long min_bytes_needed, 8458537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) long max_bytes_needed, long already_allocated) 8558537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles){ 8658537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) return cinfo->mem->max_memory_to_use - already_allocated; 8758537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)} 8858537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) 8958537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) 9058537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)/* 915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Backing store (temporary file) management. 9258537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) * Backing store objects are only used when the value returned by 9358537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) * jpeg_mem_available is less than the total space needed. You can dispense 9458537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) * with these routines if you have plenty of virtual memory; see jmemnobs.c. 9558537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) */ 9658537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) 9758537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) 9858537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)METHODDEF(void) 9958537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)read_backing_store (j_common_ptr cinfo, backing_store_ptr info, 10058537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) void FAR * buffer_address, 10158537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) long file_offset, long byte_count) 10258537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles){ 10358537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) if (fseek(info->temp_file, file_offset, SEEK_SET)) 10458537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) ERREXIT(cinfo, JERR_TFILE_SEEK); 1055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (JFREAD(info->temp_file, buffer_address, byte_count) 10658537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) != (size_t) byte_count) 1075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ERREXIT(cinfo, JERR_TFILE_READ); 1085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 10958537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) 1105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 11158537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)METHODDEF(void) 1125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)write_backing_store (j_common_ptr cinfo, backing_store_ptr info, 11358537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) void FAR * buffer_address, 11458537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) long file_offset, long byte_count) 11558537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles){ 11658537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) if (fseek(info->temp_file, file_offset, SEEK_SET)) 11758537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) ERREXIT(cinfo, JERR_TFILE_SEEK); 11858537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) if (JFWRITE(info->temp_file, buffer_address, byte_count) 11958537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) != (size_t) byte_count) 12058537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) ERREXIT(cinfo, JERR_TFILE_WRITE); 12158537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)} 12258537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) 12358537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) 12458537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)METHODDEF(void) 1255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)close_backing_store (j_common_ptr cinfo, backing_store_ptr info) 1265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles){ 1275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) fclose(info->temp_file); 12858537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) /* Since this implementation uses tmpfile() to create the file, 12958537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) * no explicit file deletion is needed. 13058537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) */ 13158537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)} 13258537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) 13358537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)static FILE* getTempFileFromPath(const char * path) { 13458537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) FILE * fd = fopen(path, "w+"); 13558537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) unlink(path); 13658537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) return fd; 13758537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)} 13858537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) 13958537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)static FILE* getTempFile() { 14058537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) char path[1024]; 14158537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) snprintf(path, 1023, "/sdcard/.%d.tmp", getpid()); 14258537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) FILE * fd = getTempFileFromPath(path); 14358537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) if (fd == NULL) { 1445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // anywhere else we can create a temp file? 14558537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) // snprintf(path, 1023, "/data/data/.%d.tmp", getpid()); 14658537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) // fd = getTempFileFromPath(path); 1475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 14858537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) return fd; 14958537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)} 15058537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) 15158537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)/* 15258537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) * Initial opening of a backing-store object. 15358537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) * 15458537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) * This version uses tmpfile(), which constructs a suitable file name 15558537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) * behind the scenes. We don't have to use info->temp_name[] at all; 15658537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) * indeed, we can't even find out the actual name of the temp file. 15758537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) */ 15858537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) 15958537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)GLOBAL(void) 16058537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)jpeg_open_backing_store (j_common_ptr cinfo, backing_store_ptr info, 16158537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) long total_bytes_needed) 16258537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles){ 16358537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) if ((info->temp_file = getTempFile()) == NULL) 16458537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) ERREXITS(cinfo, JERR_TFILE_CREATE, ""); 16558537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) info->read_backing_store = read_backing_store; 16658537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) info->write_backing_store = write_backing_store; 16758537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) info->close_backing_store = close_backing_store; 16858537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)} 16958537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) 1705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 17158537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)/* 17258537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) * These routines take care of any system-dependent initialization and 17358537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) * cleanup required. 17458537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) */ 17558537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) 1765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)GLOBAL(long) 17758537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)jpeg_mem_init (j_common_ptr cinfo) 17858537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles){ 17958537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) return DEFAULT_MAX_MEM; /* default for max_memory_to_use */ 18058537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)} 18158537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) 18258537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)GLOBAL(void) 18358537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)jpeg_mem_term (j_common_ptr cinfo) 18458537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles){ 18558537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) /* no work */ 18658537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)} 18758537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)