LG viloate GPL in TVs, BD-players, monitors.

Eugene Vorobev jenya.vv at gmail.com
Wed May 11 11:22:47 CEST 2011


Hello.

I found GPL code in TVs, BD-players, monitors main program.

LG use Nano-X lib (also known as Microwindows, but I'll call it for
brevity - nanox) in 2008 (some of them), 2009-2011 years models TV.
Also Nano-X used in LG BD-players and monitors.
Nanox code statically linked with main program in TV called 'RELEASE'.
Nano-X website: http://www.microwindows.org/

LG's nanox based on version 0.90, released on May 31, 2003:
ftp://microwindows.censoft.com/pub/microwindows/microwindows-0.90.tar.gz
Nanox sources can be found in any of opensource packages for LG TV,
which provided by LG on http://opesource.lge.com/
For example, it can be found in opensource package for 32LD650 and lot
of other models:
http://www.lg.com/global/support/opensource/opensource-file-download.jsp?OPENSOURCE_FILE_NAME=GP2_B_CO_FI_2010.tar.gz&OPENSOURCE_ORIGINAL_NAME=opensourceGLZ%2FGP2_B_CO_FI_2010.tar.gz
I upload only nanox tar here: http://dl.dropbox.com/u/490148/NanoX_MPL.tar.gz

Let's look at engine/devimage.c file:
>From line 1429:

/*
 * StretchImage - Resize an image
 *
 * Major portions from SDL Simple DirectMedia Layer by Sam Lantinga
 * Copyright (C) 1997, 1998, 1999, 2000  Sam Lantinga <slouken at devolution.com>
 * This a stretch blit implementation based on ideas given to me by
 *  Tomasz Cejner - thanks! :)
 */
/*
    This library is free software; you can redistribute it and/or
    modify it under the terms of the GNU Library General Public
    License as published by the Free Software Foundation; either
    version 2 of the License, or (at your option) any later version.

    This library 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
    Library General Public License for more details.

    You should have received a copy of the GNU Library General Public
    License along with this library; if not, write to the Free
    Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
*/

And then three routines follows:
static void name(type *src, int src_w, type *dst, int dst_w)
static void copy_row3(unsigned char *src, int src_w, unsigned char
*dst, int dst_w)
void GdStretchImage(PMWIMAGEHDR src, MWCLIPRECT *srcrect, PMWIMAGEHDR
dst, MWCLIPRECT *dstrect)

Starting from Microwindows 0.91
(ftp://microwindows.censoft.com/pub/microwindows/microwindows-full-0.91.tar.gz)
this code in separate file: src/engine/devimage_stretch.c which have
following text at beginning:

/*
 * Copyright (c) 2000, 2001, 2003 Greg Haerr <greg at censoft.com>
 *
 * StretchImage - Resize an image
 *
 * !!! WARNING Not under the standard Microwindows license !!!
 * !!!         Read the following license (GPL)            !!!
 *
 * Major portions from SDL Simple DirectMedia Layer by Sam Lantinga
 * Copyright (C) 1997, 1998, 1999, 2000  Sam Lantinga <slouken at devolution.com>
 * This a stretch blit implementation based on ideas given to me by
 * Tomasz Cejner - thanks! :)
 */
/*
    This library is free software; you can redistribute it and/or
    modify it under the terms of the GNU Library General Public
    License as published by the Free Software Foundation; either
    version 2 of the License, or (at your option) any later version.

    This library 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
    Library General Public License for more details.

    You should have received a copy of the GNU Library General Public
    License along with this library; if not, write to the Free
    Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
*/

As you can see, the only difference is two lines added:

 * !!! WARNING Not under the standard Microwindows license !!!
 * !!!         Read the following license (GPL)            !!!


To be sure, that this code present in RELEASE, i'll check it in
RELEASE's objects, which provided by LG according to LGPL (RELEASE
statically linked with uClibc):
http://dl.dropbox.com/u/490148/LGLib/LGLIB_355.tgz
I'll use pdwtags util to get dwarf debug info from libnanox.a/devimage.o:

void copy_row1(unsigned char * src, int src_w, unsigned char * dst, int dst_w)
{
	int i;                                                        //     0
	int pos;                                                      //     0
	int inc;                                                      //     0
	unsigned char pixel;                                          //     0
} /* size: 0 */

void copy_row2(short unsigned int * src, int src_w, short unsigned int
* dst, int dst_w)
{
	int i;                                                        //     0
	int pos;                                                      //     0
	int inc;                                                      //     0
	short unsigned int pixel;                                     //     0
} /* size: 0 */

void copy_row3(unsigned char * src, int src_w, unsigned char * dst, int dst_w)
{
	int i;                                                        //     0
	int pos;                                                      //     0
	int inc;                                                      //     0
	unsigned char r;                                              //     0
	unsigned char g;                                              //     0
	unsigned char b;                                              //     0
} /* size: 0 */

void copy_row4(long unsigned int * src, int src_w, long unsigned int *
dst, int dst_w)
{
	int i;                                                        //     0
	int pos;                                                      //     0
	int inc;                                                      //     0
	long unsigned int pixel;                                      //     0
} /* size: 0 */

void GdStretchImage(PMWIMAGEHDR src, MWCLIPRECT * srcrect, PMWIMAGEHDR
dst, MWCLIPRECT * dstrect)
{
	int pos;                                                      //     0
	int inc;                                                      //     0
	int bytesperpixel;                                            //     0
	int dst_maxrow;                                               //     0
	int src_row;                                                  //     0
	int dst_row;                                                  //     0
	MWUCHAR * srcp;                                               //     0
	MWUCHAR * dstp;                                               //     0
	MWCLIPRECT full_src;                                          //     0
	MWCLIPRECT full_dst;                                          //     0
	copy_row4(long unsigned int * src,
			int src_w,
			long unsigned int * dst,
			int dst_w); /* size=0, low_pc=0 */ //     0
	copy_row2(short unsigned int * src,
			int src_w,
			short unsigned int * dst,
			int dst_w); /* size=0, low_pc=0 */ //     0
	copy_row3(unsigned char * src,
			int src_w,
			unsigned char * dst,
			int dst_w); /* size=0, low_pc=0 */ //     0
	copy_row1(unsigned char * src,
			int src_w,
			unsigned char * dst,
			int dst_w); /* size=0, low_pc=0 */ //     0
} /* size: 0 */

As we can see 100% that in RELEASE used same code, as provided in sources.
We have GPL code #1 in RELEASE.

But thats not everything.

Let's look at engine/devimage.c file again:
>From line 2516:

/* Code for GIF decoding has been adapted from XPaint:                   */
/* +-------------------------------------------------------------------+ */
/* | Copyright 1990, 1991, 1993 David Koblas.			       | */
/* | Copyright 1996 Torsten Martinsen.				       | */
/* |   Permission to use, copy, modify, and distribute this software   | */
/* |   and its documentation for any purpose and without fee is hereby | */
/* |   granted, provided that the above copyright notice appear in all | */
/* |   copies and that both that copyright notice and this permission  | */
/* |   notice appear in supporting documentation.  This software is    | */
/* |   provided "as is" without express or implied warranty.	       | */
/* +-------------------------------------------------------------------+ */
/* Portions Copyright (C) 1999  Sam Lantinga*/
/* Adapted for use in SDL by Sam Lantinga -- 7/20/98 */
/*
    This library is free software; you can redistribute it and/or
    modify it under the terms of the GNU Library General Public
    License as published by the Free Software Foundation; either
    version 2 of the License, or (at your option) any later version.

    This library 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
    Library General Public License for more details.

    You should have received a copy of the GNU Library General Public
    License along with this library; if not, write to the Free
    Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
*/

And then goes GIF decoding routines.

Same code in Microwindows 0.91 in separate file:
src/engine/image_gif.c have following header:

/*
 * Copyright (c) 2000, 2001, 2003 Greg Haerr <greg at censoft.com>
 *
 * Image decode routine for GIF files
 *
 * !!! WARNING Not under the standard Microwindows license !!!
 * !!!         Read the following license (GPL)            !!!
 */
/* Code for GIF decoding has been adapted from XPaint:                   */
/* +-------------------------------------------------------------------+ */
/* | Copyright 1990, 1991, 1993 David Koblas.			       | */
/* | Copyright 1996 Torsten Martinsen.				       | */
/* |   Permission to use, copy, modify, and distribute this software   | */
/* |   and its documentation for any purpose and without fee is hereby | */
/* |   granted, provided that the above copyright notice appear in all | */
/* |   copies and that both that copyright notice and this permission  | */
/* |   notice appear in supporting documentation.  This software is    | */
/* |   provided "as is" without express or implied warranty.	       | */
/* +-------------------------------------------------------------------+ */
/* Portions Copyright (C) 1999  Sam Lantinga*/
/* Adapted for use in SDL by Sam Lantinga -- 7/20/98 */
/*
    This library is free software; you can redistribute it and/or
    modify it under the terms of the GNU Library General Public
    License as published by the Free Software Foundation; either
    version 2 of the License, or (at your option) any later version.

    This library 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
    Library General Public License for more details.

    You should have received a copy of the GNU Library General Public
    License along with this library; if not, write to the Free
    Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
*/

As we can se, difference is same. Added:

 * !!! WARNING Not under the standard Microwindows license !!!
 * !!!         Read the following license (GPL)            !!!


GIF decode routines in Microwindows 0.90 (and in LG's sources) wrapped with:

#if defined(HAVE_GIF_SUPPORT)

I'm not very kind in makefiles, but i see in nanox.mk:

PER_MOD_CFLAGS	+= -DHAVE_GIF_SUPPORT=1


GIF decode routines are:

static int ReadColorMap(buffer_t *src, int number, unsigned char
buffer[3][MAXCOLORMAPSIZE], int *flag);
static int DoExtension(buffer_t *src, int label);
static int GetDataBlock(buffer_t *src, unsigned char *buf);
static int GetCode(buffer_t *src, int code_size, int flag);
static int LWZReadByte(buffer_t *src, int flag, int input_code_size);
static PMWIMAGEHDR ReadImage(buffer_t* src, int x, int y, int width,
int height, int cmapSize, unsigned char cmap[3][MAXCOLORMAPSIZE], int
gray, int interlace, int ignore);
static int IsGIF(buffer_t *src);
static int LoadGIFEx(buffer_t *src, PMWIMAGEHDR *ppimages, int maxImageCount)
static int ReadColorMap(buffer_t *src, int number, unsigned char
buffer[3][MAXCOLORMAPSIZE], int *gray)
static int DoExtension(buffer_t *src, int label)


I'll check it in objects libnanox.a/devimage.o with pdwtags:

int GetDataBlock(buffer_t * src, unsigned char * buf)
{
	unsigned char count;                                          //     0
} /* size: 4 */

int GetCode(buffer_t * src, int code_size, int flag)
{
	int i;                                                        //     0
	int j;                                                        //     0
	int ret;                                                      //     0
	unsigned char count;                                          //     0
	unsigned char buf;                                            //     0
	int curbit;                                                   //     0
	int lastbit;                                                  //     0
	int done;                                                     //     0
	int last_byte;                                                //     0
} /* size: 4 */

int LWZReadByte(buffer_t * src, int flag, int input_code_size)
{
	int code;                                                     //     0
	int incode;                                                   //     0
	int i;                                                        //     0
	{
		int count;                                            //     0
		unsigned char buf;                                    //     0
	}
	int fresh;                                                    //     0
	int code_size;                                                //     0
	int set_code_size;                                            //     0
	int max_code;                                                 //     0
	int max_code_size;                                            //     0
	int firstcode;                                                //     0
	int oldcode;                                                  //     0
	int clear_code;                                               //     0
	int end_code;                                                 //     0
	int table;                                                    //     0
	int stack;                                                    //     0
	int * sp;                                                     //     0
} /* size: 4 */

PMWIMAGEHDR ReadImage(buffer_t * src, int x, int y, int width, int
height, int cmapSize, unsigned char * cmap, int gray, int interlace,
int ignore)
{
	PMWIMAGEHDR pimage;                                           //     0
	unsigned char c;                                              //     0
	int i;                                                        //     0
	int v;                                                        //     0
	int xpos;                                                     //     0
	int ypos;                                                     //     0
	int pass;                                                     //     0
	
fini:                                                                 //     0
} /* size: 4 */

int ReadColorMap(buffer_t * src, int number, unsigned char * buffer, int * gray)
{
	int i;                                                        //     0
	unsigned char rgb;                                            //     0
	int flag;                                                     //     0
} /* size: 4 */

int DoExtension(buffer_t * src, int label)
{
	unsigned char buf;                                            //     0
} /* size: 4 */

int LoadGIFEx(buffer_t * src, PMWIMAGEHDR * ppimages, int maxImageCount)
{
	PMWIMAGEHDR pimage;                                           //     0
	unsigned char buf;                                            //     0
	unsigned char c;                                              //     0
	unsigned char localColorMap;                                  //     0
	int grayScale;                                                //     0
	int useGlobalColormap;                                        //     0
	int bitPixel;                                                 //     0
	int imageCount;                                               //     0
	char version;                                                 //     0
	DoExtension(buffer_t * src,
			int label); /* size=0, low_pc=0 */ //     0
} /* size: 4 */


It's 100% that in RELEASE used same code, as provided in sources.
#2.

That's all for now.

This letter also sent to opensource at lge.com
I didn't send this letter to LG first, because of my negative experience with.

Regards,
Eugene




More information about the legal mailing list