⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 jmemmgr.c

📁 linux下的flash播放器源程序
💻 C
📖 第 1 页 / 共 3 页
字号:
  hdr_ptr->hdr.bytes_left = 0;  mem->large_list[pool_id] = hdr_ptr;  return (void FAR *) (hdr_ptr + 1); /* point to first data byte in pool */}/* * Creation of 2-D sample arrays. * The pointers are in near heap, the samples themselves in FAR heap. * * To minimize allocation overhead and to allow I/O of large contiguous * blocks, we allocate the sample rows in groups of as many rows as possible * without exceeding MAX_ALLOC_CHUNK total bytes per allocation request. * NB: the virtual array control routines, later in this file, know about * this chunking of rows.  The rowsperchunk value is left in the mem manager * object so that it can be saved away if this sarray is the workspace for * a virtual array. */METHODDEF(JSAMPARRAY)alloc_sarray (j_common_ptr cinfo, int pool_id,	      JDIMENSION samplesperrow, JDIMENSION numrows)/* Allocate a 2-D sample array */{  my_mem_ptr mem = (my_mem_ptr) cinfo->mem;  JSAMPARRAY result;  JSAMPROW workspace;  JDIMENSION rowsperchunk, currow, i;  long ltemp;  /* Calculate max # of rows allowed in one allocation chunk */  ltemp = (MAX_ALLOC_CHUNK-SIZEOF(large_pool_hdr)) /	  ((long) samplesperrow * SIZEOF(JSAMPLE));  if (ltemp <= 0)    ERREXIT(cinfo, JERR_WIDTH_OVERFLOW);  if (ltemp < (long) numrows)    rowsperchunk = (JDIMENSION) ltemp;  else    rowsperchunk = numrows;  mem->last_rowsperchunk = rowsperchunk;  /* Get space for row pointers (small object) */  result = (JSAMPARRAY) alloc_small(cinfo, pool_id,				    (size_t) (numrows * SIZEOF(JSAMPROW)));  /* Get the rows themselves (large objects) */  currow = 0;  while (currow < numrows) {    rowsperchunk = MIN(rowsperchunk, numrows - currow);    workspace = (JSAMPROW) alloc_large(cinfo, pool_id,	(size_t) ((size_t) rowsperchunk * (size_t) samplesperrow		  * SIZEOF(JSAMPLE)));    for (i = rowsperchunk; i > 0; i--) {      result[currow++] = workspace;      workspace += samplesperrow;    }  }  return result;}/* * Creation of 2-D coefficient-block arrays. * This is essentially the same as the code for sample arrays, above. */METHODDEF(JBLOCKARRAY)alloc_barray (j_common_ptr cinfo, int pool_id,	      JDIMENSION blocksperrow, JDIMENSION numrows)/* Allocate a 2-D coefficient-block array */{  my_mem_ptr mem = (my_mem_ptr) cinfo->mem;  JBLOCKARRAY result;  JBLOCKROW workspace;  JDIMENSION rowsperchunk, currow, i;  long ltemp;  /* Calculate max # of rows allowed in one allocation chunk */  ltemp = (MAX_ALLOC_CHUNK-SIZEOF(large_pool_hdr)) /	  ((long) blocksperrow * SIZEOF(JBLOCK));  if (ltemp <= 0)    ERREXIT(cinfo, JERR_WIDTH_OVERFLOW);  if (ltemp < (long) numrows)    rowsperchunk = (JDIMENSION) ltemp;  else    rowsperchunk = numrows;  mem->last_rowsperchunk = rowsperchunk;  /* Get space for row pointers (small object) */  result = (JBLOCKARRAY) alloc_small(cinfo, pool_id,				     (size_t) (numrows * SIZEOF(JBLOCKROW)));  /* Get the rows themselves (large objects) */  currow = 0;  while (currow < numrows) {    rowsperchunk = MIN(rowsperchunk, numrows - currow);    workspace = (JBLOCKROW) alloc_large(cinfo, pool_id,	(size_t) ((size_t) rowsperchunk * (size_t) blocksperrow		  * SIZEOF(JBLOCK)));    for (i = rowsperchunk; i > 0; i--) {      result[currow++] = workspace;      workspace += blocksperrow;    }  }  return result;}/* * About virtual array management: * * The above "normal" array routines are only used to allocate strip buffers * (as wide as the image, but just a few rows high).  Full-image-sized buffers * are handled as "virtual" arrays.  The array is still accessed a strip at a * time, but the memory manager must save the whole array for repeated * accesses.  The intended implementation is that there is a strip buffer in * memory (as high as is possible given the desired memory limit), plus a * backing file that holds the rest of the array. * * The request_virt_array routines are told the total size of the image and * the maximum number of rows that will be accessed at once.  The in-memory * buffer must be at least as large as the maxaccess value. * * The request routines create control blocks but not the in-memory buffers. * That is postponed until realize_virt_arrays is called.  At that time the * total amount of space needed is known (approximately, anyway), so free * memory can be divided up fairly. * * The access_virt_array routines are responsible for making a specific strip * area accessible (after reading or writing the backing file, if necessary). * Note that the access routines are told whether the caller intends to modify * the accessed strip; during a read-only pass this saves having to rewrite * data to disk.  The access routines are also responsible for pre-zeroing * any newly accessed rows, if pre-zeroing was requested. * * In current usage, the access requests are usually for nonoverlapping * strips; that is, successive access start_row numbers differ by exactly * num_rows = maxaccess.  This means we can get good performance with simple * buffer dump/reload logic, by making the in-memory buffer be a multiple * of the access height; then there will never be accesses across bufferload * boundaries.  The code will still work with overlapping access requests, * but it doesn't handle bufferload overlaps very efficiently. */METHODDEF(jvirt_sarray_ptr)request_virt_sarray (j_common_ptr cinfo, int pool_id, boolean pre_zero,		     JDIMENSION samplesperrow, JDIMENSION numrows,		     JDIMENSION maxaccess)/* Request a virtual 2-D sample array */{  my_mem_ptr mem = (my_mem_ptr) cinfo->mem;  jvirt_sarray_ptr result;  /* Only IMAGE-lifetime virtual arrays are currently supported */  if (pool_id != JPOOL_IMAGE)    ERREXIT1(cinfo, JERR_BAD_POOL_ID, pool_id);	/* safety check */  /* get control block */  result = (jvirt_sarray_ptr) alloc_small(cinfo, pool_id,					  SIZEOF(struct jvirt_sarray_control));  result->mem_buffer = NULL;	/* marks array not yet realized */  result->rows_in_array = numrows;  result->samplesperrow = samplesperrow;  result->maxaccess = maxaccess;  result->pre_zero = pre_zero;  result->b_s_open = FALSE;	/* no associated backing-store object */  result->next = mem->virt_sarray_list; /* add to list of virtual arrays */  mem->virt_sarray_list = result;  return result;}METHODDEF(jvirt_barray_ptr)request_virt_barray (j_common_ptr cinfo, int pool_id, boolean pre_zero,		     JDIMENSION blocksperrow, JDIMENSION numrows,		     JDIMENSION maxaccess)/* Request a virtual 2-D coefficient-block array */{  my_mem_ptr mem = (my_mem_ptr) cinfo->mem;  jvirt_barray_ptr result;  /* Only IMAGE-lifetime virtual arrays are currently supported */  if (pool_id != JPOOL_IMAGE)    ERREXIT1(cinfo, JERR_BAD_POOL_ID, pool_id);	/* safety check */  /* get control block */  result = (jvirt_barray_ptr) alloc_small(cinfo, pool_id,					  SIZEOF(struct jvirt_barray_control));  result->mem_buffer = NULL;	/* marks array not yet realized */  result->rows_in_array = numrows;  result->blocksperrow = blocksperrow;  result->maxaccess = maxaccess;  result->pre_zero = pre_zero;  result->b_s_open = FALSE;	/* no associated backing-store object */  result->next = mem->virt_barray_list; /* add to list of virtual arrays */  mem->virt_barray_list = result;  return result;}METHODDEF(void)realize_virt_arrays (j_common_ptr cinfo)/* Allocate the in-memory buffers for any unrealized virtual arrays */{  my_mem_ptr mem = (my_mem_ptr) cinfo->mem;  long space_per_minheight, maximum_space, avail_mem;  long minheights, max_minheights;  jvirt_sarray_ptr sptr;  jvirt_barray_ptr bptr;  /* Compute the minimum space needed (maxaccess rows in each buffer)   * and the maximum space needed (full image height in each buffer).   * These may be of use to the system-dependent jpeg_mem_available routine.   */  space_per_minheight = 0;  maximum_space = 0;  for (sptr = mem->virt_sarray_list; sptr != NULL; sptr = sptr->next) {    if (sptr->mem_buffer == NULL) { /* if not realized yet */      space_per_minheight += (long) sptr->maxaccess *			     (long) sptr->samplesperrow * SIZEOF(JSAMPLE);      maximum_space += (long) sptr->rows_in_array *		       (long) sptr->samplesperrow * SIZEOF(JSAMPLE);    }  }  for (bptr = mem->virt_barray_list; bptr != NULL; bptr = bptr->next) {    if (bptr->mem_buffer == NULL) { /* if not realized yet */      space_per_minheight += (long) bptr->maxaccess *			     (long) bptr->blocksperrow * SIZEOF(JBLOCK);      maximum_space += (long) bptr->rows_in_array *		       (long) bptr->blocksperrow * SIZEOF(JBLOCK);    }  }  if (space_per_minheight <= 0)    return;			/* no unrealized arrays, no work */  /* Determine amount of memory to actually use; this is system-dependent. */  avail_mem = jpeg_mem_available(cinfo, space_per_minheight, maximum_space,				 mem->total_space_allocated);  /* If the maximum space needed is available, make all the buffers full   * height; otherwise parcel it out with the same number of minheights   * in each buffer.   */  if (avail_mem >= maximum_space)    max_minheights = 1000000000L;  else {    max_minheights = avail_mem / space_per_minheight;    /* If there doesn't seem to be enough space, try to get the minimum     * anyway.  This allows a "stub" implementation of jpeg_mem_available().     */    if (max_minheights <= 0)      max_minheights = 1;  }  /* Allocate the in-memory buffers and initialize backing store as needed. */  for (sptr = mem->virt_sarray_list; sptr != NULL; sptr = sptr->next) {    if (sptr->mem_buffer == NULL) { /* if not realized yet */      minheights = ((long) sptr->rows_in_array - 1L) / sptr->maxaccess + 1L;      if (minheights <= max_minheights) {	/* This buffer fits in memory */	sptr->rows_in_mem = sptr->rows_in_array;      } else {	/* It doesn't fit in memory, create backing store. */	sptr->rows_in_mem = (JDIMENSION) (max_minheights * sptr->maxaccess);	jpeg_open_backing_store(cinfo, & sptr->b_s_info,				(long) sptr->rows_in_array *				(long) sptr->samplesperrow *				(long) SIZEOF(JSAMPLE));	sptr->b_s_open = TRUE;      }      sptr->mem_buffer = alloc_sarray(cinfo, JPOOL_IMAGE,				      sptr->samplesperrow, sptr->rows_in_mem);      sptr->rowsperchunk = mem->last_rowsperchunk;      sptr->cur_start_row = 0;      sptr->first_undef_row = 0;      sptr->dirty = FALSE;    }  }  for (bptr = mem->virt_barray_list; bptr != NULL; bptr = bptr->next) {    if (bptr->mem_buffer == NULL) { /* if not realized yet */      minheights = ((long) bptr->rows_in_array - 1L) / bptr->maxaccess + 1L;      if (minheights <= max_minheights) {	/* This buffer fits in memory */	bptr->rows_in_mem = bptr->rows_in_array;      } else {	/* It doesn't fit in memory, create backing store. */	bptr->rows_in_mem = (JDIMENSION) (max_minheights * bptr->maxaccess);	jpeg_open_backing_store(cinfo, & bptr->b_s_info,				(long) bptr->rows_in_array *				(long) bptr->blocksperrow *				(long) SIZEOF(JBLOCK));	bptr->b_s_open = TRUE;      }      bptr->mem_buffer = alloc_barray(cinfo, JPOOL_IMAGE,				      bptr->blocksperrow, bptr->rows_in_mem);      bptr->rowsperchunk = mem->last_rowsperchunk;      bptr->cur_start_row = 0;      bptr->first_undef_row = 0;      bptr->dirty = FALSE;    }  }}LOCAL(void)do_sarray_io (j_common_ptr cinfo, jvirt_sarray_ptr ptr, boolean writing)/* Do backing store read or write of a virtual sample array */{  long bytesperrow, file_offset, byte_count, rows, thisrow, i;  bytesperrow = (long) ptr->samplesperrow * SIZEOF(JSAMPLE);  file_offset = ptr->cur_start_row * bytesperrow;  /* Loop to read or write each allocation chunk in mem_buffer */  for (i = 0; i < (long) ptr->rows_in_mem; i += ptr->rowsperchunk) {    /* One chunk, but check for short chunk at end of buffer */    rows = MIN((long) ptr->rowsperchunk, (long) ptr->rows_in_mem - i);    /* Transfer no more than is currently defined */    thisrow = (long) ptr->cur_start_row + i;    rows = MIN(rows, (long) ptr->first_undef_row - thisrow);    /* Transfer no more than fits in file */    rows = MIN(rows, (long) ptr->rows_in_array - thisrow);    if (rows <= 0)		/* this chunk might be past end of file! */      break;    byte_count = rows * bytesperrow;    if (writing)      (*ptr->b_s_info.write_backing_store) (cinfo, & ptr->b_s_info,					    (void FAR *) ptr->mem_buffer[i],					    file_offset, byte_count);    else      (*ptr->b_s_info.read_backing_store) (cinfo, & ptr->b_s_info,					   (void FAR *) ptr->mem_buffer[i],					   file_offset, byte_count);    file_offset += byte_count;  }}LOCAL(void)do_barray_io (j_common_ptr cinfo, jvirt_barray_ptr ptr, boolean writing)/* Do backing store read or write of a virtual coefficient-block array */{  long bytesperrow, file_offset, byte_count, rows, thisrow, i;  bytesperrow = (long) ptr->blocksperrow * SIZEOF(JBLOCK);  file_offset = ptr->cur_start_row * bytesperrow;  /* Loop to read or write each allocation chunk in mem_buffer */  for (i = 0; i < (long) ptr->rows_in_mem; i += ptr->rowsperchunk) {    /* One chunk, but check for short chunk at end of buffer */    rows = MIN((long) ptr->rowsperchunk, (long) ptr->rows_in_mem - i);    /* Transfer no more than is currently defined */    thisrow = (long) ptr->cur_start_row + i;    rows = MIN(rows, (long) ptr->first_undef_row - thisrow);    /* Transfer no more than fits in file */    rows = MIN(rows, (long) ptr->rows_in_array - thisrow);    if (rows <= 0)		/* this chunk might be past end of file! */      break;    byte_count = rows * bytesperrow;    if (writing)      (*ptr->b_s_info.write_backing_store) (cinfo, & ptr->b_s_info,					    (void FAR *) ptr->mem_buffer[i],					    file_offset, byte_count);    else

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -