17b6961ad552a5f748fbf4b287e8838c7495dacb5Joseph Wen/* 27b6961ad552a5f748fbf4b287e8838c7495dacb5Joseph Wen * Copyright (C) 2007-2008 The Android Open Source Project 37b6961ad552a5f748fbf4b287e8838c7495dacb5Joseph Wen * 47b6961ad552a5f748fbf4b287e8838c7495dacb5Joseph Wen * Licensed under the Apache License, Version 2.0 (the "License"); 57b6961ad552a5f748fbf4b287e8838c7495dacb5Joseph Wen * you may not use this file except in compliance with the License. 67b6961ad552a5f748fbf4b287e8838c7495dacb5Joseph Wen * You may obtain a copy of the License at 77b6961ad552a5f748fbf4b287e8838c7495dacb5Joseph Wen * 87b6961ad552a5f748fbf4b287e8838c7495dacb5Joseph Wen * http://www.apache.org/licenses/LICENSE-2.0 97b6961ad552a5f748fbf4b287e8838c7495dacb5Joseph Wen * 107b6961ad552a5f748fbf4b287e8838c7495dacb5Joseph Wen * Unless required by applicable law or agreed to in writing, software 117b6961ad552a5f748fbf4b287e8838c7495dacb5Joseph Wen * distributed under the License is distributed on an "AS IS" BASIS, 127b6961ad552a5f748fbf4b287e8838c7495dacb5Joseph Wen * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 137b6961ad552a5f748fbf4b287e8838c7495dacb5Joseph Wen * See the License for the specific language governing permissions and 147b6961ad552a5f748fbf4b287e8838c7495dacb5Joseph Wen * limitations under the License. 157b6961ad552a5f748fbf4b287e8838c7495dacb5Joseph Wen */ 167b6961ad552a5f748fbf4b287e8838c7495dacb5Joseph Wen 177b6961ad552a5f748fbf4b287e8838c7495dacb5Joseph Wen#define JPEG_INTERNALS 187b6961ad552a5f748fbf4b287e8838c7495dacb5Joseph Wen#include "jinclude.h" 197b6961ad552a5f748fbf4b287e8838c7495dacb5Joseph Wen#include "jpeglib.h" 207b6961ad552a5f748fbf4b287e8838c7495dacb5Joseph Wen#include "jmemsys.h" /* import the system-dependent declarations */ 217b6961ad552a5f748fbf4b287e8838c7495dacb5Joseph Wen 227b6961ad552a5f748fbf4b287e8838c7495dacb5Joseph Wen#include <cutils/ashmem.h> 237b6961ad552a5f748fbf4b287e8838c7495dacb5Joseph Wen#include <unistd.h> 247b6961ad552a5f748fbf4b287e8838c7495dacb5Joseph Wen#include <sys/mman.h> 257b6961ad552a5f748fbf4b287e8838c7495dacb5Joseph Wen 267b6961ad552a5f748fbf4b287e8838c7495dacb5Joseph Wen#ifndef HAVE_STDLIB_H /* <stdlib.h> should declare malloc(),free() */ 277b6961ad552a5f748fbf4b287e8838c7495dacb5Joseph Wenextern void * malloc JPP((size_t size)); 287b6961ad552a5f748fbf4b287e8838c7495dacb5Joseph Wenextern void free JPP((void *ptr)); 297b6961ad552a5f748fbf4b287e8838c7495dacb5Joseph Wen#endif 307b6961ad552a5f748fbf4b287e8838c7495dacb5Joseph Wen 317b6961ad552a5f748fbf4b287e8838c7495dacb5Joseph Wen/* 327b6961ad552a5f748fbf4b287e8838c7495dacb5Joseph Wen * Memory allocation and freeing are controlled by the regular library 337b6961ad552a5f748fbf4b287e8838c7495dacb5Joseph Wen * routines malloc() and free(). 347b6961ad552a5f748fbf4b287e8838c7495dacb5Joseph Wen */ 357b6961ad552a5f748fbf4b287e8838c7495dacb5Joseph Wen 367b6961ad552a5f748fbf4b287e8838c7495dacb5Joseph WenGLOBAL(void *) 377b6961ad552a5f748fbf4b287e8838c7495dacb5Joseph Wenjpeg_get_small (j_common_ptr cinfo, size_t sizeofobject) 387b6961ad552a5f748fbf4b287e8838c7495dacb5Joseph Wen{ 397b6961ad552a5f748fbf4b287e8838c7495dacb5Joseph Wen return (void *) malloc(sizeofobject); 407b6961ad552a5f748fbf4b287e8838c7495dacb5Joseph Wen} 417b6961ad552a5f748fbf4b287e8838c7495dacb5Joseph Wen 427b6961ad552a5f748fbf4b287e8838c7495dacb5Joseph WenGLOBAL(void) 437b6961ad552a5f748fbf4b287e8838c7495dacb5Joseph Wenjpeg_free_small (j_common_ptr cinfo, void * object, size_t sizeofobject) 447b6961ad552a5f748fbf4b287e8838c7495dacb5Joseph Wen{ 457b6961ad552a5f748fbf4b287e8838c7495dacb5Joseph Wen free(object); 467b6961ad552a5f748fbf4b287e8838c7495dacb5Joseph Wen} 477b6961ad552a5f748fbf4b287e8838c7495dacb5Joseph Wen 487b6961ad552a5f748fbf4b287e8838c7495dacb5Joseph Wen 497b6961ad552a5f748fbf4b287e8838c7495dacb5Joseph Wen/* 507b6961ad552a5f748fbf4b287e8838c7495dacb5Joseph Wen * "Large" objects are treated the same as "small" ones. 517b6961ad552a5f748fbf4b287e8838c7495dacb5Joseph Wen * NB: although we include FAR keywords in the routine declarations, 527b6961ad552a5f748fbf4b287e8838c7495dacb5Joseph Wen * this file won't actually work in 80x86 small/medium model; at least, 537b6961ad552a5f748fbf4b287e8838c7495dacb5Joseph Wen * you probably won't be able to process useful-size images in only 64KB. 547b6961ad552a5f748fbf4b287e8838c7495dacb5Joseph Wen */ 557b6961ad552a5f748fbf4b287e8838c7495dacb5Joseph Wen 567b6961ad552a5f748fbf4b287e8838c7495dacb5Joseph WenGLOBAL(void FAR *) 577b6961ad552a5f748fbf4b287e8838c7495dacb5Joseph Wenjpeg_get_large (j_common_ptr cinfo, size_t sizeofobject) 587b6961ad552a5f748fbf4b287e8838c7495dacb5Joseph Wen{ 597b6961ad552a5f748fbf4b287e8838c7495dacb5Joseph Wen return (void FAR *) malloc(sizeofobject); 607b6961ad552a5f748fbf4b287e8838c7495dacb5Joseph Wen} 617b6961ad552a5f748fbf4b287e8838c7495dacb5Joseph Wen 627b6961ad552a5f748fbf4b287e8838c7495dacb5Joseph WenGLOBAL(void) 637b6961ad552a5f748fbf4b287e8838c7495dacb5Joseph Wenjpeg_free_large (j_common_ptr cinfo, void FAR * object, size_t sizeofobject) 647b6961ad552a5f748fbf4b287e8838c7495dacb5Joseph Wen{ 657b6961ad552a5f748fbf4b287e8838c7495dacb5Joseph Wen free(object); 667b6961ad552a5f748fbf4b287e8838c7495dacb5Joseph Wen} 677b6961ad552a5f748fbf4b287e8838c7495dacb5Joseph Wen 687b6961ad552a5f748fbf4b287e8838c7495dacb5Joseph Wen/* 697b6961ad552a5f748fbf4b287e8838c7495dacb5Joseph Wen * This routine computes the total memory space available for allocation. 707b6961ad552a5f748fbf4b287e8838c7495dacb5Joseph Wen * It's impossible to do this in a portable way; our current solution is 717b6961ad552a5f748fbf4b287e8838c7495dacb5Joseph Wen * to make the user tell us (with a default value set at compile time). 727b6961ad552a5f748fbf4b287e8838c7495dacb5Joseph Wen * If you can actually get the available space, it's a good idea to subtract 737b6961ad552a5f748fbf4b287e8838c7495dacb5Joseph Wen * a slop factor of 5% or so. 747b6961ad552a5f748fbf4b287e8838c7495dacb5Joseph Wen */ 757b6961ad552a5f748fbf4b287e8838c7495dacb5Joseph Wen 767b6961ad552a5f748fbf4b287e8838c7495dacb5Joseph Wen#ifndef DEFAULT_MAX_MEM /* so can override from makefile */ 777b6961ad552a5f748fbf4b287e8838c7495dacb5Joseph Wen#define DEFAULT_MAX_MEM 10000000L /* default: ten megabyte */ 787b6961ad552a5f748fbf4b287e8838c7495dacb5Joseph Wen#endif 797b6961ad552a5f748fbf4b287e8838c7495dacb5Joseph Wen 807b6961ad552a5f748fbf4b287e8838c7495dacb5Joseph WenGLOBAL(long) 817b6961ad552a5f748fbf4b287e8838c7495dacb5Joseph Wenjpeg_mem_available (j_common_ptr cinfo, long min_bytes_needed, 827b6961ad552a5f748fbf4b287e8838c7495dacb5Joseph Wen long max_bytes_needed, long already_allocated) 837b6961ad552a5f748fbf4b287e8838c7495dacb5Joseph Wen{ 847b6961ad552a5f748fbf4b287e8838c7495dacb5Joseph Wen return cinfo->mem->max_memory_to_use - already_allocated; 857b6961ad552a5f748fbf4b287e8838c7495dacb5Joseph Wen} 867b6961ad552a5f748fbf4b287e8838c7495dacb5Joseph Wen 877b6961ad552a5f748fbf4b287e8838c7495dacb5Joseph Wen 887b6961ad552a5f748fbf4b287e8838c7495dacb5Joseph Wen/* 897b6961ad552a5f748fbf4b287e8838c7495dacb5Joseph Wen * Backing store (temporary file) management. 907b6961ad552a5f748fbf4b287e8838c7495dacb5Joseph Wen * Backing store objects are only used when the value returned by 917b6961ad552a5f748fbf4b287e8838c7495dacb5Joseph Wen * jpeg_mem_available is less than the total space needed. You can dispense 927b6961ad552a5f748fbf4b287e8838c7495dacb5Joseph Wen * with these routines if you have plenty of virtual memory; see jmemnobs.c. 937b6961ad552a5f748fbf4b287e8838c7495dacb5Joseph Wen */ 947b6961ad552a5f748fbf4b287e8838c7495dacb5Joseph Wen 957b6961ad552a5f748fbf4b287e8838c7495dacb5Joseph WenMETHODDEF(void) 967b6961ad552a5f748fbf4b287e8838c7495dacb5Joseph Wenread_backing_store (j_common_ptr cinfo, backing_store_ptr info, 977b6961ad552a5f748fbf4b287e8838c7495dacb5Joseph Wen void FAR * buffer_address, 987b6961ad552a5f748fbf4b287e8838c7495dacb5Joseph Wen long file_offset, long byte_count) 997b6961ad552a5f748fbf4b287e8838c7495dacb5Joseph Wen{ 1007b6961ad552a5f748fbf4b287e8838c7495dacb5Joseph Wen memmove(buffer_address, info->addr + file_offset, byte_count); 1017b6961ad552a5f748fbf4b287e8838c7495dacb5Joseph Wen} 1027b6961ad552a5f748fbf4b287e8838c7495dacb5Joseph Wen 1037b6961ad552a5f748fbf4b287e8838c7495dacb5Joseph Wen 1047b6961ad552a5f748fbf4b287e8838c7495dacb5Joseph WenMETHODDEF(void) 1057b6961ad552a5f748fbf4b287e8838c7495dacb5Joseph Wenwrite_backing_store (j_common_ptr cinfo, backing_store_ptr info, 1067b6961ad552a5f748fbf4b287e8838c7495dacb5Joseph Wen void FAR * buffer_address, 1077b6961ad552a5f748fbf4b287e8838c7495dacb5Joseph Wen long file_offset, long byte_count) 1087b6961ad552a5f748fbf4b287e8838c7495dacb5Joseph Wen{ 1097b6961ad552a5f748fbf4b287e8838c7495dacb5Joseph Wen memmove(info->addr + file_offset, buffer_address, byte_count); 1107b6961ad552a5f748fbf4b287e8838c7495dacb5Joseph Wen} 1117b6961ad552a5f748fbf4b287e8838c7495dacb5Joseph Wen 1127b6961ad552a5f748fbf4b287e8838c7495dacb5Joseph Wen 1137b6961ad552a5f748fbf4b287e8838c7495dacb5Joseph WenMETHODDEF(void) 1147b6961ad552a5f748fbf4b287e8838c7495dacb5Joseph Wenclose_backing_store (j_common_ptr cinfo, backing_store_ptr info) 1157b6961ad552a5f748fbf4b287e8838c7495dacb5Joseph Wen{ 1167b6961ad552a5f748fbf4b287e8838c7495dacb5Joseph Wen munmap(info->addr, info->size); 1177b6961ad552a5f748fbf4b287e8838c7495dacb5Joseph Wen close(info->temp_file); 1187b6961ad552a5f748fbf4b287e8838c7495dacb5Joseph Wen} 1197b6961ad552a5f748fbf4b287e8838c7495dacb5Joseph Wen 1207b6961ad552a5f748fbf4b287e8838c7495dacb5Joseph WenLOCAL(int) 1217b6961ad552a5f748fbf4b287e8838c7495dacb5Joseph Wenget_ashmem(backing_store_ptr info, long total_bytes_needed) 1227b6961ad552a5f748fbf4b287e8838c7495dacb5Joseph Wen{ 1237b6961ad552a5f748fbf4b287e8838c7495dacb5Joseph Wen char path[1024]; 1247b6961ad552a5f748fbf4b287e8838c7495dacb5Joseph Wen snprintf(path, 1023, "%d.tmp.ashmem", getpid()); 1257b6961ad552a5f748fbf4b287e8838c7495dacb5Joseph Wen int fd = ashmem_create_region(path, total_bytes_needed); 1267b6961ad552a5f748fbf4b287e8838c7495dacb5Joseph Wen if (fd == -1) { 1277b6961ad552a5f748fbf4b287e8838c7495dacb5Joseph Wen return -1; 1287b6961ad552a5f748fbf4b287e8838c7495dacb5Joseph Wen } 1297b6961ad552a5f748fbf4b287e8838c7495dacb5Joseph Wen int err = ashmem_set_prot_region(fd, PROT_READ | PROT_WRITE); 1307b6961ad552a5f748fbf4b287e8838c7495dacb5Joseph Wen if (err) { 1317b6961ad552a5f748fbf4b287e8838c7495dacb5Joseph Wen return -1; 1327b6961ad552a5f748fbf4b287e8838c7495dacb5Joseph Wen } 1337b6961ad552a5f748fbf4b287e8838c7495dacb5Joseph Wen info->addr = mmap(NULL, total_bytes_needed, PROT_READ | PROT_WRITE, MAP_PRIVATE, fd, 0); 1347b6961ad552a5f748fbf4b287e8838c7495dacb5Joseph Wen info->size = total_bytes_needed; 1357b6961ad552a5f748fbf4b287e8838c7495dacb5Joseph Wen info->temp_file = fd; 1367b6961ad552a5f748fbf4b287e8838c7495dacb5Joseph Wen return fd; 1377b6961ad552a5f748fbf4b287e8838c7495dacb5Joseph Wen} 1387b6961ad552a5f748fbf4b287e8838c7495dacb5Joseph Wen 1397b6961ad552a5f748fbf4b287e8838c7495dacb5Joseph Wen/* 1407b6961ad552a5f748fbf4b287e8838c7495dacb5Joseph Wen * Initial opening of a backing-store object. 1417b6961ad552a5f748fbf4b287e8838c7495dacb5Joseph Wen * This version uses ashmem to get a shared memory of total-bytes_needed. 1427b6961ad552a5f748fbf4b287e8838c7495dacb5Joseph Wen */ 1437b6961ad552a5f748fbf4b287e8838c7495dacb5Joseph Wen 1447b6961ad552a5f748fbf4b287e8838c7495dacb5Joseph WenGLOBAL(void) 1457b6961ad552a5f748fbf4b287e8838c7495dacb5Joseph Wenjpeg_open_backing_store (j_common_ptr cinfo, backing_store_ptr info, 1467b6961ad552a5f748fbf4b287e8838c7495dacb5Joseph Wen long total_bytes_needed) 1477b6961ad552a5f748fbf4b287e8838c7495dacb5Joseph Wen{ 1487b6961ad552a5f748fbf4b287e8838c7495dacb5Joseph Wen if (get_ashmem(info, total_bytes_needed) == -1) 1497b6961ad552a5f748fbf4b287e8838c7495dacb5Joseph Wen ERREXITS(cinfo, JERR_TFILE_CREATE, ""); 1507b6961ad552a5f748fbf4b287e8838c7495dacb5Joseph Wen info->read_backing_store = read_backing_store; 1517b6961ad552a5f748fbf4b287e8838c7495dacb5Joseph Wen info->write_backing_store = write_backing_store; 1527b6961ad552a5f748fbf4b287e8838c7495dacb5Joseph Wen info->close_backing_store = close_backing_store; 1537b6961ad552a5f748fbf4b287e8838c7495dacb5Joseph Wen} 1547b6961ad552a5f748fbf4b287e8838c7495dacb5Joseph Wen 1557b6961ad552a5f748fbf4b287e8838c7495dacb5Joseph Wen/* 1567b6961ad552a5f748fbf4b287e8838c7495dacb5Joseph Wen * These routines take care of any system-dependent initialization and 1577b6961ad552a5f748fbf4b287e8838c7495dacb5Joseph Wen * cleanup required. 1587b6961ad552a5f748fbf4b287e8838c7495dacb5Joseph Wen */ 1597b6961ad552a5f748fbf4b287e8838c7495dacb5Joseph Wen 1607b6961ad552a5f748fbf4b287e8838c7495dacb5Joseph WenGLOBAL(long) 1617b6961ad552a5f748fbf4b287e8838c7495dacb5Joseph Wenjpeg_mem_init (j_common_ptr cinfo) 1627b6961ad552a5f748fbf4b287e8838c7495dacb5Joseph Wen{ 1637b6961ad552a5f748fbf4b287e8838c7495dacb5Joseph Wen return DEFAULT_MAX_MEM; /* default for max_memory_to_use */ 1647b6961ad552a5f748fbf4b287e8838c7495dacb5Joseph Wen} 1657b6961ad552a5f748fbf4b287e8838c7495dacb5Joseph Wen 1667b6961ad552a5f748fbf4b287e8838c7495dacb5Joseph WenGLOBAL(void) 1677b6961ad552a5f748fbf4b287e8838c7495dacb5Joseph Wenjpeg_mem_term (j_common_ptr cinfo) 1687b6961ad552a5f748fbf4b287e8838c7495dacb5Joseph Wen{ 1697b6961ad552a5f748fbf4b287e8838c7495dacb5Joseph Wen /* no work */ 1707b6961ad552a5f748fbf4b287e8838c7495dacb5Joseph Wen} 171