www.pudn.com > webcam_server-0.50.rar > jdatabuf.c


/*********************************************************************
 * webcam_server                                                     *
 *                                                                   *
 * (c) 2002 Donn Morrison donn@donn.dyndns.org                       *
 *                                                                   *
 * code used from Gerd Knorr's xawtv (libng)                         *
 * - and -                                                           *
 * Cory Lueninghoener's gqcam                                        *
 *                                                                   *
 *    waits for connections from a viewer and sends                  *
 *    jpeg encoded captures as a live video feed                     *
 *                                                                   *
 *********************************************************************/

#ifndef _WCSJPEG_H_INCLUDED_
#define _WCSJPEG_H_INCLUDED_

#include 
#include 
#include 

#include "jdatabuf.h"

#define DEFAULT_JPEG_SIZE	20000	/* default jpeg size (bytes) */

/*-----------------------------------------------------------
  jpeg data buffer stuff
  -----------------------------------------------------------*/

//METHODDEF(void)
void
init_destination (j_compress_ptr cinfo)
{
  my_dest_ptr dest = (my_dest_ptr) cinfo->dest;

  dest->buffer = (char *)malloc(DEFAULT_JPEG_SIZE * sizeof(JOCTET));
  
  dest->pub.next_output_byte = dest->buffer;
  dest->pub.free_in_buffer = DEFAULT_JPEG_SIZE;
  dest->total_buffer_size = DEFAULT_JPEG_SIZE;
}

//METHODDEF(boolean)
boolean
empty_output_buffer (j_compress_ptr cinfo)
{
  my_dest_ptr dest = (my_dest_ptr) cinfo->dest;
  u_char *tmp;
  long size;

  size = dest->total_buffer_size;

  /* re-allocate more memory (another DEFAULT_JPEG_SIZE block) */
  tmp = (char *)realloc(dest->buffer, (dest->total_buffer_size + DEFAULT_JPEG_SIZE) * sizeof(JOCTET));
  if(tmp == NULL)
  {
    fprintf(stderr, "empty_output_buffer: couldn't allocate more memory for jpeg (%ld bytes)\n",
            (dest->total_buffer_size + DEFAULT_JPEG_SIZE) * sizeof(JOCTET));
    return FALSE;
  }
  dest->total_buffer_size += DEFAULT_JPEG_SIZE;
  dest->buffer = tmp;
  /* reset the free_in_buffer counter */
  dest->pub.free_in_buffer = dest->total_buffer_size - size;
  dest->pub.next_output_byte = dest->buffer + size;
  return TRUE;
}

//METHODDEF(void)
void
term_destination (j_compress_ptr cinfo)
{
}

//GLOBAL(void)
void
jpeg_buff_dest (j_compress_ptr cinfo)
{
  my_dest_ptr dest;

  if (cinfo->dest == NULL) {	/* first time for this JPEG object? */
    cinfo->dest = (struct jpeg_destination_mgr *)
      (*cinfo->mem->alloc_small) ((j_common_ptr) cinfo, JPOOL_PERMANENT,
				  sizeof(my_destination_mgr));
  }

  dest = (my_dest_ptr) cinfo->dest;
  dest->pub.init_destination = init_destination;
  dest->pub.empty_output_buffer = empty_output_buffer;
  dest->pub.term_destination = term_destination;
}

//METHODDEF(long)
long
get_jpeg_size (j_compress_ptr cinfo)
{
	my_dest_ptr dest = (my_dest_ptr) cinfo->dest;
	
	return (long)(dest->pub.next_output_byte - dest->buffer);
}

//METHODDEF(void)
void
jpeg_buff_free (j_compress_ptr cinfo)
{
  my_dest_ptr dest = (my_dest_ptr) cinfo->dest;
  
  free(dest->buffer);
}

#endif