4 ** $VER: mpegordered.c 1.8 (3.5.97)
5 ** mpegvideo.datatype 1.8
7 ** This file contains C code to implement an
10 ** Written 1996/1997 by Roland 'Gizzy' Mainz
14 /* project includes */
15 #include "mpegvideo.h"
16 #include "mpegproto.h"
20 *--------------------------------------------------------------
24 * Structures intialized for ordered dithering.
32 *--------------------------------------------------------------
36 void InitOrderedDither( struct MPEGVideoInstData
*mvid
)
46 for( i
= 0 ; i
< DITH_SIZE
; i
++ )
48 lmark
= l_darrays
[ i
] = (ULONG
*)mymalloc( mvid
, (256 * sizeof( ULONG
)) );
50 for( j
= 0 ; j
< lum_values
[ 0 ] ; j
++)
55 for( j
= 0 ; j
< (LUM_RANGE
- 1) ; j
++ )
57 err_range
= lum_values
[ j
+ 1 ] - lum_values
[ j
];
58 threshval
= ((i
* err_range
) / DITH_SIZE
) + lum_values
[ j
];
60 for( k
= lum_values
[ j
] ; k
< lum_values
[ j
+ 1 ] ; k
++ )
63 *lmark
++ = ((j
+ 1) * (CR_RANGE
* CB_RANGE
));
65 *lmark
++ = (j
* (CR_RANGE
* CB_RANGE
));
69 for( j
= lum_values
[ LUM_RANGE
- 1 ] ; j
< 256 ; j
++ )
71 *lmark
++ = (LUM_RANGE
- 1) * (CR_RANGE
* CB_RANGE
);
75 for( i
= 0 ; i
< DITH_SIZE
; i
++ )
77 cmark
= cr_darrays
[ i
] = (ULONG
*)mymalloc( mvid
, (256 * sizeof( ULONG
)) );
79 for( j
= 0 ; j
< cr_values
[ 0 ] ; j
++ )
84 for( j
= 0 ; j
< (CR_RANGE
- 1) ; j
++ )
86 err_range
= cr_values
[ j
+ 1 ] - cr_values
[ j
];
87 threshval
= ((i
* err_range
) / DITH_SIZE
) + cr_values
[ j
];
89 for( k
= cr_values
[ j
] ; k
< cr_values
[ j
+ 1 ] ; k
++ )
92 *cmark
++ = ((j
+ 1) * CB_RANGE
);
94 *cmark
++ = (j
* CB_RANGE
);
98 for( j
= cr_values
[ CR_RANGE
- 1 ] ; j
< 256 ; j
++ )
100 *cmark
++ = (CR_RANGE
- 1) * (CB_RANGE
);
104 for( i
= 0 ; i
< DITH_SIZE
; i
++ )
106 cmark
= cb_darrays
[ i
] = (ULONG
*)mymalloc( mvid
, (256 * sizeof( ULONG
)) );
108 for( j
= 0 ; j
< cb_values
[ 0 ] ; j
++ )
113 for( j
= 0 ; j
< (CB_RANGE
- 1) ; j
++ )
115 err_range
= cb_values
[ j
+ 1 ] - cb_values
[ j
];
116 threshval
= ((i
* err_range
) / DITH_SIZE
) + cb_values
[ j
];
118 for( k
= cb_values
[ j
] ; k
< cb_values
[ j
+ 1 ] ; k
++ )
127 for( j
= cb_values
[ CB_RANGE
- 1 ] ; j
< 256 ; j
++ )
129 *cmark
++ = CB_RANGE
- 1;
136 *--------------------------------------------------------------
138 * OrderedDitherImage --
140 * Dithers an image using an ordered dither.
142 * 1) The color space is allocated y:cr:cb = 8:4:4
143 * 2) The spatial resolution of y:cr:cb is 4:1:1
144 * The channels are dithered based on the standard
145 * ordered dither pattern for a 4x4 area.
153 *--------------------------------------------------------------
157 void OrderedDitherImage( struct MPEGVideoInstData
*mvid
, UBYTE
*lum
, UBYTE
*cr
, UBYTE
*cb
, UBYTE
*out
, UWORD h
, UWORD w
)
159 UBYTE
*l
, *r
, *b
, *o1
, *o2
;
172 for( i
= 0U ; i
< h
; i
+= 4U )
174 for( j
= 0U ; j
< w
; j
+= 8U )
176 R
= r
[ 0 ]; B
= b
[ 0 ];
178 L
= l
[ 0 ]; o1
[ 0 ] = mappixel
[ (l_darrays
[ 0 ][ L
] + cr_darrays
[ 0 ][ R
] + cb_darrays
[ 0 ][ B
]) ];
179 L
= l
[ 1 ]; o1
[ 1 ] = mappixel
[ (l_darrays
[ 8 ][ L
] + cr_darrays
[ 8 ][ R
] + cb_darrays
[ 8 ][ B
]) ];
180 L
= l2
[ 0 ]; o2
[ 0 ] = mappixel
[ (l_darrays
[ 12 ][ L
] + cr_darrays
[ 12 ][ R
] + cb_darrays
[ 12 ][ B
]) ];
181 L
= l2
[ 1 ]; o2
[ 1 ] = mappixel
[ (l_darrays
[ 4 ][ L
] + cr_darrays
[ 4 ][ R
] + cb_darrays
[ 4 ][ B
]) ];
183 R
= r
[ 1 ]; B
= b
[ 1 ];
185 L
= l
[ 2 ]; o1
[ 2 ] = mappixel
[ (l_darrays
[ 2 ][ L
] + cr_darrays
[ 2 ][ R
] + cb_darrays
[ 2 ][ B
]) ];
186 L
= l
[ 3 ]; o1
[ 3 ] = mappixel
[ (l_darrays
[ 10 ][ L
] + cr_darrays
[ 10 ][ R
] + cb_darrays
[ 10 ][ B
]) ];
187 L
= l2
[ 2 ]; o2
[ 2 ] = mappixel
[ (l_darrays
[ 14 ][ L
] + cr_darrays
[ 14 ][ R
] + cb_darrays
[ 14 ][ B
]) ];
188 L
= l2
[ 3 ]; o2
[ 3 ] = mappixel
[ (l_darrays
[ 6 ][ L
] + cr_darrays
[ 6 ][ R
] + cb_darrays
[ 6 ][ B
]) ];
190 R
= r
[ 2 ]; B
= b
[ 2 ];
192 L
= l
[ 4 ]; o1
[ 4 ] = mappixel
[ (l_darrays
[ 0 ][ L
] + cr_darrays
[ 0 ][ R
] + cb_darrays
[ 0 ][ B
]) ];
193 L
= l
[ 5 ]; o1
[ 5 ] = mappixel
[ (l_darrays
[ 8 ][ L
] + cr_darrays
[ 8 ][ R
] + cb_darrays
[ 8 ][ B
]) ];
194 L
= l2
[ 4 ]; o2
[ 4 ] = mappixel
[ (l_darrays
[ 12 ][ L
] + cr_darrays
[ 12 ][ R
] + cb_darrays
[ 12 ][ B
]) ];
195 L
= l2
[ 5 ]; o2
[ 5 ] = mappixel
[ (l_darrays
[ 4 ][ L
] + cr_darrays
[ 4 ][ R
] + cb_darrays
[ 4 ][ B
]) ];
197 R
= r
[ 3 ]; B
= b
[ 3 ];
199 L
= l
[ 6 ]; o1
[ 6 ] = mappixel
[ (l_darrays
[ 2 ][ L
] + cr_darrays
[ 2 ][ R
] + cb_darrays
[ 2 ][ B
]) ];
200 L
= l
[ 7 ]; o1
[ 7 ] = mappixel
[ (l_darrays
[ 10 ][ L
] + cr_darrays
[ 10 ][ R
] + cb_darrays
[ 10 ][ B
]) ];
201 L
= l2
[ 6 ]; o2
[ 6 ] = mappixel
[ (l_darrays
[ 14 ][ L
] + cr_darrays
[ 14 ][ R
] + cb_darrays
[ 14 ][ B
]) ];
202 L
= l2
[ 7 ]; o2
[ 7 ] = mappixel
[ (l_darrays
[ 6 ][ L
] + cr_darrays
[ 6 ][ R
] + cb_darrays
[ 6 ][ B
]) ];
215 for( j
= 0 ; j
< w
; j
+= 8 )
217 R
= r
[ 0 ]; B
= b
[ 0 ];
219 L
= l
[ 0 ]; o1
[ 0 ] = mappixel
[ (l_darrays
[ 3 ][ L
] + cr_darrays
[ 3 ][ R
] + cb_darrays
[ 3 ][ B
]) ];
220 L
= l
[ 1 ]; o1
[ 1 ] = mappixel
[ (l_darrays
[ 11 ][ L
] + cr_darrays
[ 11 ][ R
] + cb_darrays
[ 11 ][ B
]) ];
221 L
= l2
[ 0 ]; o2
[ 0 ] = mappixel
[ (l_darrays
[ 15 ][ L
] + cr_darrays
[ 15 ][ R
] + cb_darrays
[ 15 ][ B
]) ];
222 L
= l2
[ 1 ]; o2
[ 1 ] = mappixel
[ (l_darrays
[ 7 ][ L
] + cr_darrays
[ 7 ][ R
] + cb_darrays
[ 7 ][ B
]) ];
224 R
= r
[ 1 ]; B
= b
[ 1 ];
226 L
= l
[ 2 ]; o1
[ 2 ] = mappixel
[ (l_darrays
[ 1 ][ L
] + cr_darrays
[ 1 ][ R
] + cb_darrays
[ 1 ][ B
]) ];
227 L
= l
[ 3 ]; o1
[ 3 ] = mappixel
[ (l_darrays
[ 9 ][ L
] + cr_darrays
[ 9 ][ R
] + cb_darrays
[ 9 ][ B
]) ];
228 L
= l2
[ 2 ]; o2
[ 2 ] = mappixel
[ (l_darrays
[ 13 ][ L
] + cr_darrays
[ 13 ][ R
] + cb_darrays
[ 13 ][ B
]) ];
229 L
= l2
[ 3 ]; o2
[ 3 ] = mappixel
[ (l_darrays
[ 5 ][ L
] + cr_darrays
[ 5 ][ R
] + cb_darrays
[ 5 ][ B
]) ];
231 R
= r
[ 2 ]; B
= b
[ 2 ];
233 L
= l
[ 4 ]; o1
[ 4 ] = mappixel
[ (l_darrays
[ 3 ][ L
] + cr_darrays
[ 3 ][ R
] + cb_darrays
[ 3 ][ B
]) ];
234 L
= l
[ 5 ]; o1
[ 5 ] = mappixel
[ (l_darrays
[ 11 ][ L
] + cr_darrays
[ 11 ][ R
] + cb_darrays
[ 11 ][ B
]) ];
235 L
= l2
[ 4 ]; o2
[ 4 ] = mappixel
[ (l_darrays
[ 15 ][ L
] + cr_darrays
[ 15 ][ R
] + cb_darrays
[ 15 ][ B
]) ];
236 L
= l2
[ 5 ]; o2
[ 5 ] = mappixel
[ (l_darrays
[ 7 ][ L
] + cr_darrays
[ 7 ][ R
] + cb_darrays
[ 7 ][ B
]) ];
238 R
= r
[ 3 ]; B
= b
[ 3 ];
240 L
= l
[ 6 ]; o1
[ 6 ] = mappixel
[ (l_darrays
[ 1 ][ L
] + cr_darrays
[ 1 ][ R
] + cb_darrays
[ 1 ][ B
]) ];
241 L
= l
[ 7 ]; o1
[ 7 ] = mappixel
[ (l_darrays
[ 9 ][ L
] + cr_darrays
[ 9 ][ R
] + cb_darrays
[ 9 ][ B
]) ];
242 L
= l2
[ 6 ]; o2
[ 6 ] = mappixel
[ (l_darrays
[ 13 ][ L
] + cr_darrays
[ 13 ][ R
] + cb_darrays
[ 13 ][ B
]) ];
243 L
= l2
[ 7 ]; o2
[ 7 ] = mappixel
[ (l_darrays
[ 5 ][ L
] + cr_darrays
[ 5 ][ R
] + cb_darrays
[ 5 ][ B
]) ];