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

📄 dfiasco.c

📁 linux下将各类格式图片转换工具
💻 C
字号:
/* *  dfiasco.c:		Decoder public interface * *  Written by:		Ullrich Hafner *		 *  This file is part of FIASCO (獸籸actal 獻籱age 獳籲d 玈籩quence 獵O籨ec) *  Copyright (C) 1994-2000 Ullrich Hafner <hafner@bigfoot.de> */ /* *  $Date: 2000/10/28 17:39:30 $ *  $Author: hafner $ *  $Revision: 5.7 $ *  $State: Exp $ */#include "config.h"#include "types.h"#include "macros.h"#include "error.h"#include "dfiasco.h"#include "wfa.h"#include "read.h"#include "misc.h"#include "bit-io.h"#include "decoder.h"#include "options.h"#include "wfalib.h"/*****************************************************************************				prototypes  *****************************************************************************/static dfiasco_t *cast_dfiasco (fiasco_decoder_t *dfiasco);static voidfree_dfiasco (dfiasco_t *dfiasco);static dfiasco_t *alloc_dfiasco (wfa_t *wfa, video_t *video, bitfile_t *input,	       int enlarge_factor, int smoothing, format_e image_format);/*****************************************************************************				public code  *****************************************************************************/fiasco_decoder_t *fiasco_decoder_new (const char *filename, const fiasco_d_options_t *options){   try   {      bitfile_t        	 *input;	/* pointer to WFA FIASCO stream */      wfa_t            	 *wfa;		/* wfa structure */      video_t          	 *video;	/* information about decoder state */      const d_options_t  *dop;		/* decoder additional options */      dfiasco_t	       	 *dfiasco;	/* decoder internal state */      fiasco_decoder_t 	 *decoder;	/* public interface to decoder */      fiasco_d_options_t *default_options = NULL;      if (options)      {	 dop = cast_d_options ((fiasco_d_options_t *) options);	 if (!dop)	    return NULL;      }      else      {	 default_options = fiasco_d_options_new ();	 dop 		 = cast_d_options (default_options);      }            wfa   = alloc_wfa (NO);      video = alloc_video (NO);      input = open_wfa (filename, wfa->wfainfo);      read_basis (wfa->wfainfo->basis_name, wfa);      decoder 	       	   = Calloc (1, sizeof (fiasco_decoder_t));      decoder->delete  	   = fiasco_decoder_delete;      decoder->write_frame = fiasco_decoder_write_frame;      decoder->get_frame   = fiasco_decoder_get_frame;      decoder->get_length  = fiasco_decoder_get_length;      decoder->get_rate    = fiasco_decoder_get_rate;      decoder->get_width   = fiasco_decoder_get_width;      decoder->get_height  = fiasco_decoder_get_height;      decoder->get_title   = fiasco_decoder_get_title;      decoder->get_comment = fiasco_decoder_get_comment;      decoder->is_color    = fiasco_decoder_is_color;      decoder->private = dfiasco		       = alloc_dfiasco (wfa, video, input,					dop->magnification,					dop->smoothing,					dop->image_format);         if (default_options)	 fiasco_d_options_delete (default_options);      if (dfiasco->enlarge_factor >= 0)      {	 int 	       n;	 unsigned long pixels = wfa->wfainfo->width * wfa->wfainfo->height;	 for (n = 1; n <= (int) dfiasco->enlarge_factor; n++)	 {	    if (pixels << (n << 1) > 2048 * 2048)	    {	       set_error (_("Magnifaction factor `%d' is too large. "			    "Maximium value is %d."),			  dfiasco->enlarge_factor, max (0, n - 1));	       fiasco_decoder_delete (decoder);	       return NULL;	    }	 }      }      else      {	 int n;	 for (n = 0; n <= (int) - dfiasco->enlarge_factor; n++)	 {	    if (wfa->wfainfo->width >> n < 32		|| wfa->wfainfo->height >> n < 32)	    {	       set_error (_("Magnifaction factor `%d' is too small. "			    "Minimum value is %d."),			  dfiasco->enlarge_factor, - max (0, n - 1));	       fiasco_decoder_delete (decoder);	       return NULL;	    }	 }      }      return (fiasco_decoder_t *) decoder;   }   catch   {      return NULL;   }}intfiasco_decoder_write_frame (fiasco_decoder_t *decoder,			    const char *filename){   dfiasco_t *dfiasco = cast_dfiasco (decoder);      if (!dfiasco)      return 0;   else   {      try      {	 image_t *frame = get_next_frame (NO, dfiasco->enlarge_factor,					  dfiasco->smoothing, NULL,					  FORMAT_4_4_4, dfiasco->video, NULL,					  dfiasco->wfa, dfiasco->input);	 write_image (filename, frame);      }      catch      {	 return 0;      }      return 1;   }}fiasco_image_t *fiasco_decoder_get_frame (fiasco_decoder_t *decoder){   dfiasco_t *dfiasco = cast_dfiasco (decoder);      if (!dfiasco)      return NULL;   else   {      try      {	 fiasco_image_t *image = Calloc (1, sizeof (fiasco_image_t));	 image_t 	*frame = get_next_frame (NO, dfiasco->enlarge_factor,						 dfiasco->smoothing, NULL,						 dfiasco->image_format,						 dfiasco->video, NULL,						 dfiasco->wfa, dfiasco->input);	 frame->reference_count++;	/* for motion compensation */	 image->private    = frame;	 image->delete     = fiasco_image_delete;	 image->get_width  = fiasco_image_get_width;	 image->get_height = fiasco_image_get_height;	 image->is_color   = fiasco_image_is_color;	 	 return image;      }      catch      {	 return NULL;      }   }}unsignedfiasco_decoder_get_length (fiasco_decoder_t *decoder){   dfiasco_t *dfiasco = cast_dfiasco (decoder);      if (!dfiasco)      return 0;   else      return dfiasco->wfa->wfainfo->frames;}unsignedfiasco_decoder_get_rate (fiasco_decoder_t *decoder){   dfiasco_t *dfiasco = cast_dfiasco (decoder);      if (!dfiasco)      return 0;   else      return dfiasco->wfa->wfainfo->fps;}unsignedfiasco_decoder_get_width (fiasco_decoder_t *decoder){   dfiasco_t *dfiasco = cast_dfiasco (decoder);   if (!dfiasco)      return 0;   else   {      unsigned width;            if (dfiasco->enlarge_factor >= 0)	 width = dfiasco->wfa->wfainfo->width << dfiasco->enlarge_factor;      else	 width = dfiasco->wfa->wfainfo->width >> - dfiasco->enlarge_factor;            return width & 1 ? width + 1 : width;   }}unsignedfiasco_decoder_get_height (fiasco_decoder_t *decoder){   dfiasco_t *dfiasco = cast_dfiasco (decoder);   if (!dfiasco)      return 0;   else   {      unsigned height;            if (dfiasco->enlarge_factor >= 0)	 height = dfiasco->wfa->wfainfo->height << dfiasco->enlarge_factor;      else	 height = dfiasco->wfa->wfainfo->height >> - dfiasco->enlarge_factor;      return height & 1 ? height + 1 : height;   }}const char *fiasco_decoder_get_title (fiasco_decoder_t *decoder){   dfiasco_t *dfiasco = cast_dfiasco (decoder);   if (!dfiasco)      return NULL;   else      return dfiasco->wfa->wfainfo->title;}const char *fiasco_decoder_get_comment (fiasco_decoder_t *decoder){   dfiasco_t *dfiasco = cast_dfiasco (decoder);   if (!dfiasco)      return NULL;   else      return dfiasco->wfa->wfainfo->comment;}intfiasco_decoder_is_color (fiasco_decoder_t *decoder){   dfiasco_t *dfiasco = cast_dfiasco (decoder);   if (!dfiasco)      return 0;   else      return dfiasco->wfa->wfainfo->color;}intfiasco_decoder_delete (fiasco_decoder_t *decoder){   dfiasco_t *dfiasco = cast_dfiasco (decoder);      if (!dfiasco)      return 1;      try   {      free_wfa (dfiasco->wfa);      free_video (dfiasco->video);      close_bitfile (dfiasco->input);      strcpy (dfiasco->id, " ");      free_dfiasco(dfiasco);      Free (decoder);   }   catch   {      return 0;   }   return 1;}/*****************************************************************************				private code  *****************************************************************************/static dfiasco_t *alloc_dfiasco (wfa_t *wfa, video_t *video, bitfile_t *input,	       int enlarge_factor, int smoothing, format_e image_format)/* *  FIASCO decoder constructor: *  Initialize decoder structure. * *  Return value: *	pointer to the new decoder structure */{   dfiasco_t *dfiasco = Calloc (1, sizeof (dfiasco_t));   strcpy (dfiasco->id, "DFIASCO");      dfiasco->wfa 	   = wfa;   dfiasco->video 	   = video;   dfiasco->input 	   = input;   dfiasco->enlarge_factor = enlarge_factor;   dfiasco->smoothing  	   = smoothing;   dfiasco->image_format   = image_format;      return dfiasco;}static voidfree_dfiasco (dfiasco_t *dfiasco)/* *  FIASCO decoder destructor: *  Free memory of given 'decoder' struct. * *  No return value. * *  Side effects: *	'video' struct is discarded. */{   Free (dfiasco);}static dfiasco_t *cast_dfiasco (fiasco_decoder_t *dfiasco)/* *  Cast pointer `dfiasco' to type dfiasco_t. *  Check whether `dfiasco' is a valid object of type dfiasco_t. * *  Return value: *	pointer to dfiasco_t struct on success *      NULL otherwise */{   dfiasco_t *this = (dfiasco_t *) dfiasco->private;   if (this)   {      if (!streq (this->id, "DFIASCO"))      {	 set_error (_("Parameter `dfiasco' doesn't match required type."));	 return NULL;      }   }   else   {      set_error (_("Parameter `%s' not defined (NULL)."), "dfiasco");   }   return this;}

⌨️ 快捷键说明

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