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)