summaryrefslogtreecommitdiffstats
path: root/SD-VBS/common/c/iiConv2.c
blob: 436b2060c6839f0b3bc41ec316be655292c7f9e8 (plain) (blame)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
/********************************
Author: Sravanthi Kota Venkata
********************************/

#include "sdvbs_common.h"

I2D* iiConv2(I2D* a, I2D* b)
{
    I2D *c;
    I2D *out;
    int ma, na, mb, nb, ci, cj, i, j, m, n;
    int r_index, c_index;

    ma = a->height;
    na = a->width;

    mb = b->height;
    nb = b->width;
    
    r_index = ceil((mb + 1.0)/2.0);
    c_index = ceil((nb + 1.0)/2.0);

    ci = ma+mb-1;
    cj = na+nb-1;

    c = iSetArray(ci, cj, 0);

    for(i=0; i<ci; i++)
    {
        for(j=0; j<cj; j++)
        {
            for(m=0; m<ma; m++)
            {
                for(n=0; n<na; n++)
                {
                    if( (i-m)>=0 && (j-n)>=0 && (i-m)<mb && (j-n)<nb )
                        subsref(c,i,j) += subsref(a,m,n) * subsref(b,i-m,j-n);
                }
            }

        }
    }

    out = iMallocHandle(ma, na);
    for(i=0; i<ma; i++)
    {
        for(j=0; j<na; j++)
        {
            subsref(out,i,j) = subsref(c,(i+r_index-1),(j+c_index-1));
        }
    }


    return out;
}
03'>203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 226 227 228 229 230 231 232 233 234 235 236 237 238 239 240 241 242 243 244 245 246 247 248 249 250 251 252 253 254 255 256 257 258 259 260 261 262 263 264 265 266 267 268 269 270 271 272 273 274 275 276 277 278 279 280 281 282 283 284 285 286 287 288 289 290 291 292 293 294 295 296 297 298 299 300 301 302 303 304 305 306 307 308 309 310 311 312 313 314 315 316 317 318 319 320 321 322 323 324 325 326 327 328 329 330 331 332 333 334 335 336 337 338 339 340 341 342 343 344 345 346 347 348 349 350 351 352 353 354 355 356 357 358 359 360 361 362 363 364 365 366 367 368 369 370 371 372 373 374 375 376 377 378 379 380 381 382 383 384
385
386
387
388
389
390
391
392
393































































































































































































































































































































































































                                                                                  
                                                                   







                                
/*

  This program is part of the TACLeBench benchmark suite.
  Version V 2.0

  Name: huff_dec

  Author: David Bourgin (David.Bourgin@ufrima.imag.fr)

  Function: Example of Huffman decoding

  Source: ftp://turing.imag.fr/pub/compression/ (1994-09-26)

  Original name: dcodhuff.c

  Changes: I/O to char arrays instead of file i/o.
           Dynamic memory allocation replaced by array.

  License:

The source code files (codrl1.c, dcodrl1.c, codrle2.c, dcodrle2.c, codrle3.c,
dcodrle3.c, codrle4.c, dcodrle4.c, codhuff.c, dcodhuff.c) are copyrighted.
They have been uploaded on ftp in turing.imag.fr (129.88.31.7):/pub/compression
on 22/5/94 and have been modified on 22/9/94.
(c) David Bourgin - 1994
The source codes I provide have no buggs (!) but being that I make them
available for free I have some notes to make. They can change at any time
without notice. I assume no responsability or liability for any errors or
inaccurracies, make no warranty of any kind (express, implied or statutory)
with respect to this publication and expressly disclaim any and all warranties
of merchantability, fitness for particular purposes. Of course, if you have
some problems to use the information presented here, I will try to help you if
I can.

If you include the source codes in your application, here are the conditions:
- You have to put my name in the header of your source file (not in the
excutable program if you don't want) (this item is a must)
- I would like to see your resulting application, if possible (this item is not
a must, because some applications must remain secret)
- Whenever you gain money with your application, I would like to receive a very
little part in order to be encouraged to update my source codes and to develop
new schemes (this item is not a must)

*/


/*
  Declaration of types
*/


#include "../extra.h"
typedef struct s_tree {
  unsigned int byte; /* A byte has to be coded as an unsigned integer to
                        allow a node to have a value over 255 */
  struct s_tree *left_ptr;
  struct s_tree *right_ptr;
} huff_dec_t_tree;

typedef struct {
  unsigned char bits[32];
  unsigned int bits_nb;
  unsigned char presence;
} t_bin_val;


/*
  Forward declaration of functions
*/

void huff_dec_init( void );
int huff_dec_return( void );
int huff_dec_end_of_data();
int huff_dec_read_byte();
void huff_dec_write_byte( char ch );
unsigned char huff_dec_read_code_1_bit();
unsigned int huff_dec_read_code_n_bits( unsigned int n );
void huff_dec_read_header( t_bin_val codes_table[257] );
huff_dec_t_tree *huff_dec_tree_encoding( t_bin_val codes_table[257],
    huff_dec_t_tree heap[514] );
void huff_dec_main( void );
//int main( void );


/*
  Declaration of global variables
*/

static int huff_dec_input_pos;
static int huff_dec_output_pos;
static char huff_dec_output[1024];
unsigned char huff_dec_byte_nb_to_read = 0;
unsigned int huff_dec_val_to_read = 0;


/*
  Initialization- and return-value-related functions
*/

#define huff_dec_plaintext_len 600
static const char *huff_dec_plaintext =
  "You are doubtless asking \"How can I reduce the data size without losing "
  "some informations?\". It's easy to answer to this question. I'll only take "
  "an example. I'm sure you have heard about the morse. This system established "
  "in the 19th century use a scheme very close to the huffman one. In the morse "
  "you encode the letters to transmit with two kinds of signs. If you encode "
  "these two sign possibilities in one bit, the symbol 'e' is transmitted in a "
  "single bit and the symbols 'y' and 'z' need four bits. Look at the symbols "
  "in the text you are reading, you'll fast understand the compression ratio...";

#define huff_dec_encoded_len 419
static unsigned char huff_dec_encoded[huff_dec_encoded_len] = {
  128, 0, 0, 0, 80, 133, 32, 32, 128, 100, 4, 32, 63, 239, 255, 240,
  0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
  4, 7, 167, 21, 129, 232, 69, 120, 132, 217, 20, 162, 19, 164, 39, 133,
  252, 138, 105, 20, 194, 19, 129, 240, 172, 138, 248, 150, 11, 11, 240, 201,
  68, 64, 114, 53, 17, 42, 37, 195, 128, 212, 116, 194, 41, 98, 52, 51,
  12, 132, 112, 244, 3, 36, 33, 52, 39, 135, 164, 33, 62, 156, 87, 14,
  110, 22, 87, 50, 85, 198, 99, 142, 140, 194, 81, 78, 158, 84, 129, 254,
  129, 248, 110, 179, 159, 192, 145, 133, 184, 184, 28, 210, 96, 146, 73, 10,
  226, 21, 83, 152, 74, 13, 111, 132, 199, 202, 219, 241, 74, 193, 167, 105,
  222, 31, 147, 6, 55, 31, 129, 40, 232, 52, 153, 160, 148, 18, 36, 197,
  45, 216, 202, 86, 30, 31, 177, 90, 133, 138, 248, 23, 81, 195, 160, 100,
  215, 93, 50, 185, 225, 251, 23, 6, 230, 225, 229, 112, 71, 80, 96, 141,
  205, 176, 230, 85, 196, 9, 24, 93, 90, 121, 225, 76, 68, 152, 63, 25,
  107, 140, 101, 204, 214, 77, 26, 194, 96, 18, 48, 77, 210, 137, 1, 253,
  4, 230, 248, 56, 240, 224, 111, 163, 95, 10, 12, 223, 7, 234, 167, 129,
  40, 36, 96, 135, 125, 245, 250, 2, 198, 120, 127, 0, 145, 133, 213, 167,
  135, 149, 195, 67, 235, 108, 9, 24, 87, 17, 102, 152, 37, 4, 222, 131,
  188, 144, 73, 36, 128, 73, 20, 81, 152, 177, 133, 248, 28, 165, 131, 120,
  127, 240, 242, 184, 104, 125, 109, 129, 35, 30, 4, 145, 65, 202, 88, 9,
  138, 103, 44, 205, 100, 167, 24, 152, 11, 24, 51, 37, 66, 9, 24, 31,
  174, 202, 212, 49, 152, 18, 96, 155, 208, 119, 146, 45, 97, 48, 56, 28,
  194, 90, 224, 204, 144, 232, 176, 36, 96, 126, 187, 43, 83, 12, 121, 129,
  209, 96, 197, 35, 2, 54, 176, 249, 92, 208, 204, 145, 188, 41, 170, 180,
  71, 16, 36, 96, 126, 187, 43, 83, 19, 0, 145, 129, 100, 209, 15, 43,
  135, 55, 6, 238, 180, 194, 90, 17, 229, 115, 21, 168, 251, 140, 131, 162,
  217, 166, 93, 22, 4, 140, 31, 91, 166, 55, 25, 202, 192, 111, 20, 171,
  207, 39, 192,
};


void huff_dec_init( void )
{
  huff_dec_input_pos = 0;
  huff_dec_output_pos = 0;
}


int huff_dec_return( void )
{
  int i;
  _Pragma( "loopbound min 1 max 600" )
  for ( i = 0; i < huff_dec_plaintext_len; i++ ) {
    if ( huff_dec_plaintext[i] != huff_dec_output[i] ) return i + 1;
  }
  return 0;
}


/*
  Input / output functions
*/

int huff_dec_end_of_data()
{
  return huff_dec_input_pos >= huff_dec_encoded_len;
}


int huff_dec_read_byte()
{
  return huff_dec_encoded[huff_dec_input_pos++];
}


void huff_dec_write_byte( char ch )
{
  huff_dec_output[huff_dec_output_pos++] = ch;
}


unsigned char huff_dec_read_code_1_bit()
/* Returned parameters: Returns an unsigned integer with the 0-bit (on the
                        right of the integer) valid
   Action: Reads the next bit in the stream of data to compress
   Errors: An input/output error could disturb the running of the program
   The source must have enough bits to read
*/
{
  if ( huff_dec_byte_nb_to_read ) {
    huff_dec_byte_nb_to_read--;
    return ( ( huff_dec_val_to_read >> huff_dec_byte_nb_to_read ) & 1 );
  } else {
    huff_dec_val_to_read = huff_dec_read_byte();
    huff_dec_byte_nb_to_read = 7;
    return ( ( huff_dec_val_to_read >> 7 ) & 1 );
  }
}


unsigned int huff_dec_read_code_n_bits( unsigned int n )
/* Returned parameters: Returns an unsigned integer with the n-bits (on the
                        right of the integer) valid
   Action: Reads the next n bits in the stream of data to compress
   Errors: An input/output error could disturb the running of the program
   The source must have enough bits to read
*/
{
  unsigned int result = 0;
  unsigned i = n;

  _Pragma ( "loopbound min 1 max 1" )
  while ( i ) {
    _Pragma ( "loopbound min 0 max 2" )
    while ( ( huff_dec_byte_nb_to_read < 9 ) && ( !huff_dec_end_of_data() ) ) {
      huff_dec_val_to_read = ( huff_dec_val_to_read << 8 ) + huff_dec_read_byte();
      huff_dec_byte_nb_to_read += 8;
    }
    if ( i >= huff_dec_byte_nb_to_read ) {
      result = ( result << huff_dec_byte_nb_to_read ) + huff_dec_val_to_read;
      i -= huff_dec_byte_nb_to_read;
      huff_dec_byte_nb_to_read = 0;
    } else {
      result = ( result << i ) + ( ( huff_dec_val_to_read >>
        ( huff_dec_byte_nb_to_read - i ) ) & ( ( 1 << i ) - 1 ) );
      huff_dec_byte_nb_to_read -= i;
      i = 0;
    }
  }
  return ( result );
}


void huff_dec_read_header( t_bin_val codes_table[257] )