Log in

View Full Version : Tobias Oelbaum's sgi2yuv utility


mikeiz
13th May 2021, 17:33
I'm trying to find the sgi2yuv program and I'm not finding it. I have a copy, but it looks like the global.h file is corrupted because it has main() and executable code in it. It doesn't look like a header file. I checked Tobias' website using the link in derf's collection, but the site is not found. Any help would be appreciated.

Mike

StainlessS
13th May 2021, 17:50
Perhaps try google

"Tobias Oelbaum" NEAR "sgi2yuv"

https://www.google.co.uk/search?q=%22Tobias+Oelbaum%22+NEAR+%22sgi2yuv%22&ei=L1idYOHYGI3hULnJsrAO&oq=%22Tobias+Oelbaum%22+NEAR+%22sgi2yuv%22&gs_lcp=Cgdnd3Mtd2l6EAM6BwgAELADEB46CQgAELADEAcQHjoGCAAQFhAeOgQIABAeOgYIABAHEB46BQghEKABUKsOWOrlAWDu6AFoAXAAeACAAaQBiAH_DZIBAzguOJgBAKABAaABAqoBB2d3cy13aXrIAQPAAQE&sclient=gws-wiz&ved=0ahUKEwihrOWWjsfwAhWNMBQKHbmkDOYQ4dUDCA0&uact=5

EDIT: My UBlock Origin (ad blocker) blocks access to many of those site links, saying is malicious.

mikeiz
13th May 2021, 19:48
This points to the same sites. They use the same link to Tobias' site to get the software but he must have moved it or is not working there anymore.

StainlessS
13th May 2021, 20:43
This help at all.
from google

"sgi2yuv" -"Tobias Oelbaum"

https://www.google.co.uk/search?q=+%22sgi2yuv%22+-%22Tobias+Oelbaum%22&source=hp&ei=w4CdYJWwL8uOlwT8sbyIDg&iflsig=AINFCbYAAAAAYJ2O08UZVHre-prEcLmVVdmOYKNm2__W&oq=+%22sgi2yuv%22+-%22Tobias+Oelbaum%22&gs_lcp=Cgdnd3Mtd2l6EAM6AggpOggIABDqAhCPAVDDHliCwQFgvcoBaANwAHgBgAHBBIgB3wmSAQcwLjUuNS0xmAEBoAECoAEBqgEHZ3dzLXdperABCg&sclient=gws-wiz&ved=0ahUKEwjVna3wtMfwAhVLx4UKHfwYD-EQ4dUDCAg&uact=5

ie, links not mentioning the guys name. [as you say links mentioning his name did not help]
From 2nd link, @ avsforum.com
http://www.w6rz.net/sgitoyuv.zip


/*
SGI 16-bit RGB to 8-bit 4:2:2 YCbCr (UYVY) conversion
*/

#include <stdio.h>
#include <stdlib.h>

#define TRUE 1
#define FALSE 0

void conv444to422(unsigned char *src, unsigned char *dst, int width, int height);

unsigned char *Clip;

int main(int argc, char **argv)
{
FILE *fp;
FILE *fpout;
int length, i, j, horz, vert, index = 0;
int r, g, b;
double y, u, v;
double cr, cg, cb, cu, cv;
unsigned char *yp, *up, *vp;
int matrix_coefficients = 1;
unsigned int py, pcb, pcr;
static unsigned char buffer_422output[3840 * 2160 * 2];
static unsigned char buffer_422Cb[3840 * 2160 / 2];
static unsigned char buffer_422Cr[3840 * 2160 / 2];
static unsigned char buffer_444Y[3840 * 2160];
static unsigned char buffer_444Cb[3840 * 2160];
static unsigned char buffer_444Cr[3840 * 2160];
static unsigned short buffer_444input[3840 * 2160 * 3];
static double coef[7][3] = {
{0.2126, 0.7152, 0.0722}, /* ITU-R Rec. 709 (2002) */
{0.299, 0.587, 0.114}, /* unspecified */
{0.299, 0.587, 0.114}, /* reserved */
{0.30, 0.59, 0.11}, /* FCC */
{0.299, 0.587, 0.114}, /* ITU-R Rec. 624-4 System B, G */
{0.299, 0.587, 0.114}, /* SMPTE 170M */
{0.212, 0.701, 0.087}}; /* SMPTE 240M (1987) */

if (argc != 5) {
fprintf(stderr, "usage: sgitoyuv <horz> <vert> <infile> <outfile>\n");
exit(-1);
}

/*--- open binary file (for parsing) ---*/
fp = fopen(argv[3], "rb");
if (fp == 0) {
fprintf(stderr, "Cannot open input file <%s>\n", argv[3]);
exit(-1);
}

/*--- open binary file (for parsing) ---*/
fpout = fopen(argv[4], "wb");
if (fpout == 0) {
fprintf(stderr, "Cannot open output file <%s>\n", argv[4]);
exit(-1);
}

/* Clip table */
if (!(Clip=(unsigned char *)malloc(1024)))
printf("Clip[] malloc failed\n");

Clip += 384;

for (i = -384; i < 640; i++)
Clip[i] = (i<0) ? 0 : ((i>255) ? 255 : i);

horz = atoi(argv[1]);
vert = atoi(argv[2]);
length = fread(&buffer_444input[0], 1, 512, fp);
length = fread(&buffer_444input[0], 1, (horz * vert * 6), fp);

i = matrix_coefficients;
cr = coef[i-1][0];
cg = coef[i-1][1];
cb = coef[i-1][2];
cu = 0.5/(1.0-cb);
cv = 0.5/(1.0-cr);

index = ((horz * (vert - 1)));

for (i = 0; i < vert; i++)
{
yp = &buffer_444Y[0] + i*horz;
up = &buffer_444Cb[0] + i*horz;
vp = &buffer_444Cr[0] + i*horz;

for (j =0 ; j < horz; j++)
{
r = buffer_444input[index];
g = buffer_444input[index + (horz*vert)];
b = buffer_444input[index + (horz*vert*2)];
#if 0
r = ((r & 0xff) << 8) + ((r & 0xff00) >> 8);
g = ((g & 0xff) << 8) + ((g & 0xff00) >> 8);
b = ((b & 0xff) << 8) + ((b & 0xff00) >> 8);
#else
r = r & 0xff;
g = g & 0xff;
b = b & 0xff;
#endif
index++;

/* convert to YUV */
y = cr * r + cg * g + cb * b;
u = cu*(b-y);
v = cv*(r-y);
#if 0
y /= 256;
u /= 256;
v /= 256;
#endif
yp[j] = (219.0/255.0)*y + 16.5;
up[j] = (224.0/255.0)*u + 128.5;
vp[j] = (224.0/255.0)*v + 128.5;
}
index = index - (horz * 2);
}
conv444to422(&buffer_444Cb[0], &buffer_422Cb[0], horz, vert);
conv444to422(&buffer_444Cr[0], &buffer_422Cr[0], horz, vert);
py = 0;
pcb = 0;
pcr = 0;
for (i = 0; i < (horz * vert * 2); i++)
{
if ((i % 2) == 1)
{
buffer_422output[i] = buffer_444Y[py++];
}
else if ((i % 4) == 0)
{
buffer_422output[i] = buffer_422Cb[pcb++];
}
else
{
buffer_422output[i] = buffer_422Cr[pcr++];
}
}
fwrite(&buffer_422output[0], 1, (horz * vert * 2), fpout);
fclose(fp);
fclose(fpout);
return 0;
}

/* horizontal filter and 2:1 subsampling */
void conv444to422(unsigned char *src, unsigned char *dst, int width, int height)
{
int i, j, im5, im4, im3, im2, im1, ip1, ip2, ip3, ip4, ip5, ip6;

if (0)
{
for (j=0; j<height; j++)
{
for (i=0; i<width; i+=2)
{
im5 = (i<5) ? 0 : i-5;
im4 = (i<4) ? 0 : i-4;
im3 = (i<3) ? 0 : i-3;
im2 = (i<2) ? 0 : i-2;
im1 = (i<1) ? 0 : i-1;
ip1 = (i<width-1) ? i+1 : width-1;
ip2 = (i<width-2) ? i+2 : width-1;
ip3 = (i<width-3) ? i+3 : width-1;
ip4 = (i<width-4) ? i+4 : width-1;
ip5 = (i<width-5) ? i+5 : width-1;
ip6 = (i<width-5) ? i+6 : width-1;

/* FIR filter with 0.5 sample interval phase shift */
dst[i>>1] = Clip[(int)(228*(src[i]+src[ip1])
+70*(src[im1]+src[ip2])
-37*(src[im2]+src[ip3])
-21*(src[im3]+src[ip4])
+11*(src[im4]+src[ip5])
+ 5*(src[im5]+src[ip6])+256)>>9];
}
src+= width;
dst+= width>>1;
}
}
else
{
/* MPEG-2 */
for (j=0; j<height; j++)
{
for (i=0; i<width; i+=2)
{
im5 = (i<5) ? 0 : i-5;
im3 = (i<3) ? 0 : i-3;
im1 = (i<1) ? 0 : i-1;
ip1 = (i<width-1) ? i+1 : width-1;
ip3 = (i<width-3) ? i+3 : width-1;
ip5 = (i<width-5) ? i+5 : width-1;

/* Original FIR filter coefficients (*512): 22 0 -52 0 159 256 159 0 -52 0 22 */
/* It's a bug. Filter coefficients must add up to 512!!! */

/* FIR filter coefficients (*512): 21 0 -52 0 159 256 159 0 -52 0 21 */
dst[i>>1] = Clip[(int)( 21*(src[im5]+src[ip5])-52*(src[im3]+src[ip3])
+159*(src[im1]+src[ip1])+256*src[i]+256)>>9];
}
src+= width;
dst+= width>>1;
}
}
}

mikeiz
13th May 2021, 21:28
Do you have the original global.h file for sgi2yuv?

StainlessS
13th May 2021, 22:29
No.
As it does not include a [non standard] header, I presume that there aint one.

EDIT:
Arh, there is this, but looks like you have to join a chinese site [with no guarantee that they have it].

configfile.h
global.h
sgi2yuv.c
sgi2yuv.cfg
configfile.c
sgi2yuv.exe

https://www.dssz.com/594146.html
Google Translated:- https://translate.google.com/translate?tl=en-GB&u=https://www.dssz.com/594146.html

If you know a site where it was once posted, you might find it on Archive.org
[I cant access Archive.org, my ISP blocks it for some reason - I used to be able to access it, not now].