Commit 5bd3f39f authored by Manish Singh's avatar Manish Singh
Browse files

support for optional gap_decode_mpeg plugin

* configure.in: support for optional gap_decode_mpeg plugin

* plug-ins/gap/Makefile.am
* plug-ins/gap/README
* plug-ins/gap/gap_arr_dialog.c
* plug-ins/gap/gap_decode_mpeg_main.c
* plug-ins/gap/gap_decode_xanim.c
* plug-ins/gap/gap_decode_xanim.h
* plug-ins/gap/gap_frontends_main.c
* plug-ins/gap/gap_main.c
* plug-ins/gap/gap_mpege.c: patches from Wolfgang Hofer

-Yosh
parent ad117379
Mon Nov 29 18:17:34 PST 1999 Manish Singh <yosh@gimp.org>
* configure.in: support for optional gap_decode_mpeg plugin
* plug-ins/gap/Makefile.am
* plug-ins/gap/README
* plug-ins/gap/gap_arr_dialog.c
* plug-ins/gap/gap_decode_mpeg_main.c
* plug-ins/gap/gap_decode_xanim.c
* plug-ins/gap/gap_decode_xanim.h
* plug-ins/gap/gap_frontends_main.c
* plug-ins/gap/gap_main.c
* plug-ins/gap/gap_mpege.c: patches from Wolfgang Hofer
Tue Nov 30 01:55:43 MET 1999 Sven Neumann <sven@gimp.org>
* app/menus.c: make it compile with strict ANSI C compilers
......
......@@ -276,7 +276,7 @@ dnl Test for libmpeg
if test -z "$LIBMPEG"; then
AC_CHECK_LIB(mpeg, GetMPEGFrame,
AC_CHECK_HEADER(mpeg.h,
MPEG='mpeg'; LIBMPEG='-lmpeg',
MPEG='mpeg'; LIBMPEG='-lmpeg'; GAP_DECODE_MPEG='gap_decode_mpeg',
AC_MSG_WARN(*** MPEG plug-in will not be built (MPEG header file not found) ***)),
AC_MSG_WARN(*** MPEG plug-in will not be built (MPEG library not found) ***))
fi
......@@ -650,6 +650,7 @@ AC_SUBST(AA)
AC_SUBST(LIBAA)
AC_SUBST(MPEG)
AC_SUBST(LIBMPEG)
AC_SUBST(GAP_DECODE_MPEG)
AC_SUBST(XPM)
AC_SUBST(LIBXPM)
AC_SUBST(LIBUCB)
......
......@@ -5,3 +5,5 @@ _libs
.libs
gap_filter
gap_plugins
gap_frontends
gap_decode_mpeg
......@@ -96,8 +96,13 @@ EXTRA_DIST = \
$(scriptdata_DATA)
libexec_PROGRAMS = \
gap_plugins \
gap_filter
gap_plugins \
gap_filter \
gap_frontends \
$(GAP_DECODE_MPEG)
EXTRA_PROGRAMS = \
gap_decode_mpeg
gap_plugins_SOURCES = \
gap_main.c \
......@@ -115,8 +120,6 @@ gap_plugins_SOURCES = \
gap_split.h \
gap_resi_dialog.c \
gap_resi_dialog.h \
gap_mpege.c \
gap_mpege.h \
gap_mod_layer.c \
gap_mod_layer.h \
gap_filter_pdb.c \
......@@ -152,6 +155,34 @@ gap_filter_SOURCES = \
gap_pdb_calls.h \
gap_filter.h
gap_frontends_SOURCES = \
gap_frontends_main.c \
gap_arr_dialog.c \
gap_arr_dialog.h \
gap_layer_copy.c \
gap_layer_copy.h \
gap_match.c \
gap_match.h \
gap_lib.c \
gap_lib.h \
gap_exchange_image.c \
gap_exchange_image.h \
gap_pdb_calls.c \
gap_pdb_calls.h \
gap_mpege.c \
gap_mpege.h \
gap_decode_xanim.c \
gap_decode_xanim.h
gap_decode_mpeg_SOURCES = \
gap_decode_mpeg_main.c \
gap_arr_dialog.c \
gap_arr_dialog.h \
gap_pdb_calls.c \
gap_pdb_calls.h
AM_CPPFLAGS = \
-DLOCALEDIR=\""$(localedir)"\"
......@@ -166,6 +197,13 @@ LDADD = \
$(GTK_LIBS) \
$(INTLLIBS)
gap_decode_mpeg_LDADD = \
$(top_builddir)/libgimp/libgimpui.la \
$(top_builddir)/libgimp/libgimp.la \
$(LIBMPEG) \
$(GTK_LIBS) \
$(INTLLIBS)
files:
@files=`ls $(DISTFILES) 2> /dev/null`; for p in $$files; do \
echo $$p; \
......
......@@ -39,8 +39,10 @@ Concept:
gimp's xcf Fileformat should be used to store the frames,
so that each frame can have more Layers.
(Notes: Sound is not supported in this Concept,
Playbackrates have to be added when save as animation format)
(Notes:
Sound is not supported in this Concept, but can be added
by some of the supported Video Encoders.
Playbackrates (framerate) is also set at video encoding)
This requires a lot of Diskspace but offers much more flexibility
while working on the animation.
......@@ -50,21 +52,22 @@ Concept:
(gzip has to be installed on your system to do that)
If you can accept lossy compression you may also use
the xjt fileformat to store your frames on jpeg based compression.
(xjt load and save plugins are available in the Plugin Registry)
The final Product can be converted to one multilayerd Image
that can be saved as Animated-Gif.
The final Product can be encoded as videofile
or converted to one multilayerd Image
that can be saved as Animated-Gif
(or, in the future in other Animation Formats
when other Load/Save Modules were added to the gimp)
GAP provides frontend dialog interfaces for
2 different software MPEG encoder programs.
software MPEG video encoder programs.
(mpeg_encode and mpeg2encode)
GAP also provides a way to load AnimFrames from multimedia fileformats
GAP also provides an XANIM frontend to load AnimFrames from multimedia fileformats
(avi, quicktime, ....) based on the famous xanim multimedia player.
see the file README_xanim_hack for more details.
--------------------------------------------------------------------
Installation
......@@ -75,14 +78,21 @@ should get installed along with the other plug-ins.
Notes:
- GAP provides frontend dialog for mpeg_encode (V1.5R2)
and mpeg2encode (V1.2)
- GAP provides frontend dialogs for:
- mpeg_encode (V1.5R2)
- mpeg2encode (V1.2)
- xanim 2.80.1 exporting edition (with the extensions from loki entertainment)
The frontends and the external Programs need UNIX environment to run.
If you like to use that stuff, you should install
mpeg_encode and mpeg_play
mpeg2encode and mpeg2decode
xanim 2.80.1 (loki)
on your system.
(There is no need to install the mpeg encoders to compile GAP)
(There is no need to install those external programs to compile GAP)
- GAP-Patch support for some older gimp releases
is available at the Registry:
......@@ -90,8 +100,31 @@ should get installed along with the other plug-ins.
http://registry.gimp.org/detailview.phtml?plugin=gap_patches
- See the File README_xanim_hack for further optional Installation
--------------------------------------------------------------------
Supported Videoformats
--------------------------------------------------------------------
Read(decode):
Any Multimedia Fileformat, XANIM can read
(AVI, Quicktime, and a lot more, see xanim docu for more information)
MPEG1
support based om mpeg library (libmpeg.a 1.3.1) *** has NO Audio support ****
Write (encode)
Quicktime
(under development)
support based on the quicktime4linux library 1.1.3 (requires libjpeg, libpng libz)
(Warning: most of the common codecs are not supported)
AVI
(under development)
MJPEG
(under development)
SMJPEG
(under development)
--------------------------------------------------------------------
......
......@@ -38,7 +38,12 @@
*/
/* revision history:
* gimp 1.1.15.1; 1999/05/08 hof: call fileselect in gtk+1.2 style
* gimp 1.1.11b; 1999/11/20 hof: some cosmetic gtk fixes:
* - allow X-expansion (useful for the scale widgets)
* - use a hbox on WGT_INT_PAIR and WGT_FLT_PAIR
* (reduces the waste of horizontal space
* when used together with other widget types in the table)
* gimp 1.1.5.1; 1999/05/08 hof: call fileselect in gtk+1.2 style
* version 0.96.03; 1998/08/15 hof: p_arr_gtk_init
* version 0.96.01; 1998/07/09 hof: Bugfix: gtk_init should be called only
* once in a plugin process
......@@ -181,7 +186,7 @@ entry_create_value(char *title, GtkTable *table, int row, t_arr_arg *arr_ptr,
gtk_signal_connect(GTK_OBJECT(entry), "changed",
(GtkSignalFunc) entry_update_cb,
arr_ptr);
gtk_table_attach(GTK_TABLE(table), entry, 1, 2, row, row + 1, GTK_FILL, GTK_FILL, 4, 0);
gtk_table_attach(GTK_TABLE(table), entry, 1, 2, row, row + 1, GTK_FILL, GTK_FILL | GTK_EXPAND, 4, 0);
if(arr_ptr->help_txt != NULL)
{
gtk_tooltips_set_tip(g_tooltips, entry, arr_ptr->help_txt,NULL);
......@@ -479,7 +484,7 @@ radio_create_value(char *title, GtkTable *table, int row, t_arr_arg *arr_ptr)
radio_button = gtk_radio_button_new_with_label ( radio_group, l_radio_txt );
radio_group = gtk_radio_button_group ( GTK_RADIO_BUTTON (radio_button) );
gtk_table_attach ( GTK_TABLE (radio_table), radio_button, 0, 2, l_idy, l_idy+1, GTK_FILL, 0, 0, 0);
gtk_table_attach ( GTK_TABLE (radio_table), radio_button, 0, 2, l_idy, l_idy+1, GTK_FILL | GTK_EXPAND, 0, 0, 0);
gtk_signal_connect ( GTK_OBJECT (radio_button), "toggled",
(GtkSignalFunc) radio_update_cb,
......@@ -496,7 +501,7 @@ radio_create_value(char *title, GtkTable *table, int row, t_arr_arg *arr_ptr)
/* attach radio_table */
gtk_table_attach ( GTK_TABLE (table), radio_table, 1, 3, row, row+1, GTK_FILL, 0, 0, 0);
gtk_table_attach ( GTK_TABLE (table), radio_table, 1, 3, row, row+1, GTK_FILL | GTK_EXPAND, 0, 0, 0);
gtk_widget_show (radio_table);
}
......@@ -530,7 +535,7 @@ optionmenu_create_value(char *title, GtkTable *table, int row, t_arr_arg *arr_pt
/* optionmenu */
option_menu = gtk_option_menu_new();
gtk_table_attach(GTK_TABLE(table), option_menu, 1, 2, row, row +1,
GTK_EXPAND | GTK_FILL, GTK_EXPAND | GTK_FILL, 0, 0);
GTK_FILL, GTK_FILL, 0, 0);
gtk_widget_show(option_menu);
if(arr_ptr->help_txt != NULL)
......@@ -651,6 +656,7 @@ static void
pair_flt_create_value(t_pair *pair, char *title, GtkTable *table, int row, t_arr_arg *arr_ptr)
{
GtkObject *scale_data;
GtkWidget *hbox;
char buf[256];
if(arr_ptr->flt_format == NULL)
......@@ -692,7 +698,7 @@ pair_flt_create_value(t_pair *pair, char *title, GtkTable *table, int row, t_arr
pair->scale = gtk_hscale_new(GTK_ADJUSTMENT(scale_data));
gtk_widget_set_usize(pair->scale, arr_ptr->scale_width, 0);
gtk_table_attach(table, pair->scale, 2, 3, row, row + 1, GTK_EXPAND | GTK_FILL, GTK_FILL, 0, 0);
/* gtk_table_attach(table, pair->scale, 2, 3, row, row + 1, GTK_EXPAND | GTK_FILL, GTK_FILL, 0, 0); */
gtk_scale_set_draw_value(GTK_SCALE(pair->scale), FALSE);
gtk_scale_set_digits(GTK_SCALE(pair->scale), 3);
gtk_range_set_update_policy(GTK_RANGE(pair->scale), GTK_UPDATE_CONTINUOUS);
......@@ -711,12 +717,20 @@ pair_flt_create_value(t_pair *pair, char *title, GtkTable *table, int row, t_arr
gtk_signal_connect(GTK_OBJECT(pair->entry), "changed",
(GtkSignalFunc) pair_flt_entry_update_cb,
arr_ptr);
gtk_table_attach(GTK_TABLE(table), pair->entry, 1, 2, row, row + 1, GTK_FILL, GTK_FILL, 4, 0);
/* gtk_table_attach(GTK_TABLE(table), pair->entry, 1, 2, row, row + 1, GTK_FILL, GTK_FILL, 4, 0); */
if(arr_ptr->help_txt != NULL)
{
gtk_tooltips_set_tip(g_tooltips, pair->entry, arr_ptr->help_txt,NULL);
}
gtk_widget_show(pair->entry);
/* Horizontal box for entry and scale */
hbox = gtk_hbox_new (FALSE, 2+3);
gtk_box_pack_start (GTK_BOX (hbox), pair->entry, FALSE, TRUE, 0);
gtk_box_pack_start (GTK_BOX (hbox), pair->scale, TRUE, TRUE, 0);
gtk_widget_show(hbox);
gtk_table_attach(GTK_TABLE(table), hbox, 1, 3, row, row + 1, GTK_FILL | GTK_EXPAND, GTK_FILL, 4, 0);
}
......@@ -795,6 +809,7 @@ static void
pair_int_create_value(t_pair *pair, char *title, GtkTable *table, int row, t_arr_arg *arr_ptr)
{
GtkObject *scale_data;
GtkWidget *hbox;
char buf[256];
if(arr_ptr->int_format == NULL)
......@@ -803,7 +818,7 @@ pair_int_create_value(t_pair *pair, char *title, GtkTable *table, int row, t_arr
}
else
{
/* short check if formatstring starts with % and ends with f */
/* short check if formatstring starts with % and ends with d */
if((*arr_ptr->int_format != '%')
|| (arr_ptr->int_format[strlen(arr_ptr->int_format) -1] != 'd'))
{
......@@ -821,7 +836,7 @@ pair_int_create_value(t_pair *pair, char *title, GtkTable *table, int row, t_arr
gtk_misc_set_alignment(GTK_MISC(pair->label), 0.0, 0.5);
gtk_table_attach(table, pair->label, 0, 1, row, row + 1, GTK_FILL, GTK_FILL, 4, 0);
gtk_widget_show(pair->label);
scale_data = gtk_adjustment_new((double)arr_ptr->int_ret,
(double)arr_ptr->int_min,
(double)arr_ptr->int_max,
......@@ -836,7 +851,7 @@ pair_int_create_value(t_pair *pair, char *title, GtkTable *table, int row, t_arr
pair->scale = gtk_hscale_new(GTK_ADJUSTMENT(scale_data));
gtk_widget_set_usize(pair->scale, arr_ptr->scale_width, 0);
gtk_table_attach(table, pair->scale, 2, 3, row, row + 1, GTK_EXPAND | GTK_FILL, GTK_FILL, 0, 0);
/* gtk_table_attach(table, pair->scale, 2, 3, row, row + 1, GTK_EXPAND | GTK_FILL, GTK_FILL, 0, 0); */
gtk_scale_set_draw_value(GTK_SCALE(pair->scale), FALSE);
gtk_scale_set_digits(GTK_SCALE(pair->scale), 3);
gtk_range_set_update_policy(GTK_RANGE(pair->scale), GTK_UPDATE_CONTINUOUS);
......@@ -855,12 +870,20 @@ pair_int_create_value(t_pair *pair, char *title, GtkTable *table, int row, t_arr
gtk_signal_connect(GTK_OBJECT(pair->entry), "changed",
(GtkSignalFunc) pair_int_entry_update_cb,
arr_ptr);
gtk_table_attach(GTK_TABLE(table), pair->entry, 1, 2, row, row + 1, GTK_FILL, GTK_FILL, 4, 0);
/* gtk_table_attach(GTK_TABLE(table), pair->entry, 1, 2, row, row + 1, GTK_FILL, GTK_FILL, 4, 0); */
if(arr_ptr->help_txt != NULL)
{
gtk_tooltips_set_tip(g_tooltips, pair->entry, arr_ptr->help_txt,NULL);
}
gtk_widget_show(pair->entry);
/* Horizontal box for entry and scale */
hbox = gtk_hbox_new (FALSE, 2+3);
gtk_box_pack_start (GTK_BOX (hbox), pair->entry, FALSE, TRUE, 0);
gtk_box_pack_start (GTK_BOX (hbox), pair->scale, TRUE, TRUE, 0);
gtk_widget_show(hbox);
gtk_table_attach(GTK_TABLE(table), hbox, 1, 3, row, row + 1, GTK_FILL | GTK_EXPAND, GTK_FILL, 4, 0);
}
/* ============================================================================
......
/* gap_decode_mpeg.c */
/* The GIMP -- an image manipulation program
* Copyright (C) 1995 Spencer Kimball and Peter Mattis
*
* Plugin to load MPEG movies. (C) 1997-99 Adam D. Moss
* GAP modifications (C) 1999 Wolfgang Hofer
*
* v1.1 - by Adam D. Moss, adam@gimp.org, adam@foxbox.org
* Requires mpeg_lib by Gregory P. Ward. See notes below for
* obtaining and patching mpeg_lib.
*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation; either version 2 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
*/
/*******************************************************************
* USING MPEG_LIB WITH THIS PLUGIN: mpeg_lib 1.2.1 can be found *
* at ftp://ftp.mni.mcgill.ca/pub/mpeg/ - however, mpeg_lib 1.2.x *
* contains a bug in end-of-stream reporting, which will cause it *
* to crash in conjunction with this plugin. I enclose a simple *
* patch below which fixes the problem (or at least the symptom.;))*
*******************************************************************
* Addendum: mpeg_lib 1.3.0 is now released and much better! *
*******************************************************************
* mpeg_lib 1.3.1 is available at: *
* http://starship.python.net/~gward/mpeglib *
*******************************************************************/
/*******************************************************************
*** wrapper.c Tue Oct 10 22:08:39 1995
--- ../mpeg_lib2/wrapper.c Sat Sep 20 20:29:46 1997
***************
*** 392,394 ****
"copying from %08X to %08X\n", CurrentImage, Frame);
! memcpy (Frame, CurrentImage, ImageInfo.Size);
return (!MovieDone);
--- 392,397 ----
"copying from %08X to %08X\n", CurrentImage, Frame);
!
! if (!MovieDone)
! memcpy (Frame, CurrentImage, ImageInfo.Size);
!
return (!MovieDone);
*******************************************************************/
/*
* Changelog:
*
* 1999/11/25 v1.1.11.b: Initial release. [hof]
* (based on plug-ins/common/mpeg.c v1.1 99/05/31 by Adam D. Moss)
*/
/* UNIX system includes */
#include <stdlib.h>
#include <stdio.h>
#include <string.h>
#include <sys/types.h>
#include <errno.h>
#include <sys/stat.h>
#ifdef HAVE_UNISTD_H
#include <unistd.h>
#endif
/* GIMP includes */
#include "gtk/gtk.h"
#include "config.h"
#include "libgimp/stdplugins-intl.h"
#include <libgimp/gimpintl.h>
#include "libgimp/gimp.h"
#include "libgimp/gimpui.h"
/* GAP includes */
#include "gap_arr_dialog.h"
/* Includes for extra LIBS */
#include "mpeg.h"
int gap_debug; /* ==0 ... dont print debug infos */
static void query (void);
static void run (char *name,
int nparams,
GParam *param,
int *nreturn_vals,
GParam **return_vals);
static gint32 load_image (char *filename,
gint32 first_frame,
gint32 last_frame,
char *basename,
gint32 autoload);
static gint32 load_range_dialog(gint32 *first_frame,
gint32 *last_frame,
char *filename,
gint32 len_filename,
char *basename,
gint32 len_basename,
gint32 *autoload);
GPlugInInfo PLUG_IN_INFO =
{
NULL, /* init_proc */
NULL, /* quit_proc */
query, /* query_proc */
run, /* run_proc */
};
MAIN ()
static void
query ()
{
static GParamDef load_args[] =
{
{ PARAM_INT32, "run_mode", "Interactive, non-interactive" },
{ PARAM_IMAGE, "image", "(unused)"},
{ PARAM_DRAWABLE, "drawable", "(unused)"},
{ PARAM_STRING, "filename", "The name of the file to load" },
{ PARAM_STRING, "raw_filename", "The name entered" },
{ PARAM_INT32, "first_frame", "1.st frame to extract (starting at number 1)" },
{ PARAM_INT32, "last_frame", "last frame to extract (use 0 to load all remaining frames)" },
{ PARAM_STRING, "animframe_basename", "The name for the single frames _0001.xcf is added" },
{ PARAM_INT32, "autoload", "TRUE: load 1.st extracted frame on success" },
};
static GParamDef load_return_vals[] =
{
{ PARAM_IMAGE, "image", "Output image" },
};
static int nload_args = sizeof (load_args) / sizeof (load_args[0]);
static int nload_return_vals = sizeof (load_return_vals) / sizeof (load_return_vals[0]);
static GParamDef ext_args[] =
{
{ PARAM_INT32, "run_mode", "Interactive, non-interactive" },
{ PARAM_STRING, "filename", "The name of the file to load" },
{ PARAM_STRING, "raw_filename", "The name entered" },
{ PARAM_INT32, "first_frame", "1.st frame to extract (starting at number 1)" },
{ PARAM_INT32, "last_frame", "last frame to extract (use 0 to load all remaining frames)" },
{ PARAM_STRING, "animframe_basename", "The name for the single frames _0001.xcf is added" },
{ PARAM_INT32, "autoload", "TRUE: load 1.st extracted frame on success" },
};
static int next_args = sizeof (ext_args) / sizeof (ext_args[0]);
INIT_I18N();
gimp_install_procedure ("plug_in_gap_decode_mpeg",
_("Split MPEG1 movies into animframes and load 1st frame"),
_("Split MPEG1 movies into single frames (image files on disk) and load 1st frame. audio tracks are ignored"),
"Wolfgang Hofer (hof@hotbot.com)",
"Wolfgang Hofer",
"1999/11/18",
N_("<Image>/Video/Split Video to Frames/MPEG1"),
"RGB*, INDEXED*, GRAY*",
PROC_PLUG_IN,
nload_args, nload_return_vals,
load_args, load_return_vals);
gimp_install_procedure ("extension_gap_decode_mpeg",
_("Split MPEG1 movies into animframes and load 1st frame"),
_("Split MPEG1 movies into single frames (image files on disk) and load 1st frame. audio tracks are ignored"),
"Wolfgang Hofer (hof@hotbot.com)",
"Wolfgang Hofer",
"1999/11/18",
N_("<Toolbox>/Xtns/Split Video to Frames/MPEG1"),
"RGB*, INDEXED*, GRAY*",
PROC_EXTENSION,
next_args, nload_return_vals,
ext_args, load_return_vals);
}
static void
run (char *name,
int nparams,
GParam *param,
int *nreturn_vals,
GParam **return_vals)
{
static GParam values[2];
GRunModeType run_mode;
gint32 image_ID;
gint32 first_frame, last_frame;
gint32 autoload;
gint32 l_rc;
char l_frames_basename[500];
char l_filename[500];
int l_par;
image_ID = -1;
*nreturn_vals = 1;
*return_vals = values;
autoload = FALSE;
values[0].type = PARAM_STATUS;
values[0].data.d_status = STATUS_CALLING_ERROR;
run_mode = param[0].data.d_int32;
if ((strcmp (name, "plug_in_gap_decode_mpeg") == 0)
|| (strcmp (name, "extension_gap_decode_mpeg") == 0))
{
l_filename[0] = '\0';
strcpy(&l_frames_basename[0], "frame_");
l_par = 1;
if(strcmp(name, "plug_in_gap_decode_mpeg") == 0)
{
l_par = 3;
}
if( nparams > l_par)
{
if(param[l_par + 0].data.d_string != NULL)
{
strncpy(l_filename, param[l_par + 0].data.d_string, sizeof(l_filename) -1);
l_filename[sizeof(l_filename) -1] = '\0';
}
}
l_rc = 0;
if (run_mode == RUN_NONINTERACTIVE)
{
l_filename[0] = '\0';
if(nparams != (l_par + 6))
{
l_rc = 1; /* calling error */
}
else
{
first_frame = param[l_par + 2].data.d_int32;
last_frame = param[l_par + 3].data.d_int32;
if(param[l_par + 4].data.d_string != NULL)
{
strcpy(l_frames_basename, param[l_par + 4].data.d_string);
}
autoload = param[l_par + 5].data.d_int32;
}
}
else
{
l_rc = load_range_dialog(&first_frame, &last_frame,
&l_filename[0], sizeof(l_filename),