<< Chapter < Page | Chapter >> Page > |
To accomplish this, we will need to take advantage of the IDM
by initializing the input and output streams. At the start ofthe function, two instantiations of a new structure
dstr_t
are declared. You can view the structure
contents of
dstr_t
on
p. 2-11 of the
IDK
Programmer's Guide . The structure contents are defined
with calls to
dstr_open()
. This data flow for
the pre-scale is shown in
data
flow .
To give you a better understanding of how these streams are
created, let's analyze the parameters passed in the first callto
dstr_open()
:
This is a pointer to the place in memory serving as the
source of our input data (it's the source because the lastfunction parameter is set to
DSTR_INPUT
).
This is the total size of our input data. We will only be
taking every other line from
in_image->data
, so
only 240 rows. The extra two rows are for buffer.
This is a pointer to an 8x640 lexographic array,
specifically
scratchpad->int_data
. This is
where we will be putting the data on each call to
dstr_get()
.
The size of space available for data to be input into
int_mem
from
in_image->data
.
Because double buffering is used,
num_lines
is
set to 2.
Each time
dstr_get()
is called, it will
return a pointer to 2 lines of data, 640 bytes inlength.
Left as an exercise.
The need for the window size is not really apparent here.
It will become apparent when we do the 3x3 blockconvolution. Then, the window size will be set to 3. This
tells the IDM to send a pointer to 3 lines of data when
dstr_get()
is called, but only increment the
stream's internal pointer by 1 (instead of 3) the next time
dstr_get()
is called. This is not a parameter
when setting up an output stream.
Sets the direction of data flow. If it had been set to
DSTR_OUTPUT
(as done in the next call to
dstr_open()
), we would be setting the data to
flow from the Internal Address to the External Address.
Once our data streams are setup, we can begin processing by
calling the component function
pre_scale()
(in
pre_scale.c
) to operate on one block of data at a
time. This function will perform the horizontal scaling byaveraging every two pixels. This algorithm operates on four
pixels at a time. The entire function is iterated within
pre_scale_image()
120 times, which is the number
of rows in each quadrant. Before
pre_scale_image()
exits, the data streams are
closed, and one line is added to the top and bottom of theimage to provide context necessary for the next processing
steps. Now that the input image has been scaled to a quarterof its initial size, we will proceed with the four image
processing algorithms. In
img_proc.c
, the
set_ptr()
function is called to set the variable
out_ptr
to point to the correct quadrant on the
640x480 output image. Then
copy_image()
,
copy_image.c
, is called, performing a direct copy
of the scaled input image into the lower right quadrant of theoutput.
Notification Switch
Would you like to follow the 'Ece 320 - spring 2003' conversation and receive update notifications?