[theora] Bunch of bugs in LibTheora, FFMPEG2THEORA, PNG2THEORA

dos386 dos386 at gmail.com
Sun Dec 6 16:31:02 PST 2009


1. "dump_video.c" got reverted back by 5 years into 2004:

https://trac.xiph.org/browser/trunk/theora/examples/dump_video.c

https://trac.xiph.org/log/trunk/theora/examples/dump_video.c

2. "png2theora.c" (subminor)

https://trac.xiph.org/browser/trunk/theora/examples/png2theora.c

207  /* Must hold: yuv_w >= w */
208	  yuv_w = (w + 15) & ~15;
209	
210	  /* Must hold: yuv_h >= h */
211	  yuv_h = (h + 15) & ~15;

699	    ti.frame_width = ((w + 15) >>4)<<4;
700	    ti.frame_height = ((h + 15)>>4)<<4;

Same thing ^^^ done 2 x differently ;-)

3. "png2theora.c" Win32 binary doesn't work

https://trac.xiph.org/browser/trunk/theora/examples/png2theora.c

http://firefogg.org/nightly/

97	          "The input argument uses C printf format to represent a
list of files,\n"
98	          "  i.e. file-%%06d.png to look for files file000001.png
to file9999999.png \n\n"

very ^^^ strange ...

678	    snprintf(input_png, 1023,"%s/%s", input_directory,
png_files[0]->d_name);
679	    if(png_read(input_png, &w, &h, &yuv)) {
680	      fprintf(stderr, "could not read %s\n", input_png);
681	      exit(1);
682	    }

here ^^^ ...

146	#ifdef WIN32
147	int
148	alphasort (const void *a, const void *b)
149	{
150	  return strcoll ((*(const struct dirent **) a)->d_name,
151	                  (*(const struct dirent **) b)->d_name);
152	}
153	
154	int
155	scandir (const char *dir, struct dirent ***namelist,
156	         int (*select)(const struct dirent *), int (*compar)(const
void *, const void *))
157	{
158	  DIR *d;
159	  struct dirent *entry;
160	  register int i=0;
161	  size_t entrysize;
162	
163	  if ((d=opendir(dir)) == NULL)
164	    return(-1);
165	
166	  *namelist=NULL;
167	  while ((entry=readdir(d)) != NULL)
168	  {
169	    if (select == NULL || (select != NULL && (*select)(entry)))
170	    {
171	      *namelist=(struct dirent **)realloc((void *)(*namelist),
172	                 (size_t)((i+1)*sizeof(struct dirent *)));
173	      if (*namelist == NULL) return(-1);
174	      entrysize=sizeof(struct
dirent)-sizeof(entry->d_name)+strlen(entry->d_name)+1;
175	      (*namelist)[i]=(struct dirent *)malloc(entrysize);
176	      if ((*namelist)[i] == NULL) return(-1);
177	        memcpy((*namelist)[i], entry, entrysize);
178	      i++;
179	    }
180	  }
181	  if (closedir(d)) return(-1);
182	  if (i == 0) return(-1);
183	  if (compar != NULL)
184	    qsort((void *)(*namelist), (size_t)i, sizeof(struct dirent *), compar);
185	
186	  return(i);
187	}
188	#endif

What's the goal ^^^ of this code ???

I'm getting Page Faults, "can't read \."  or 1-frame movies at best ...

4. FFMPEG2THEORA Win32 encoding from frames doesn't work

It does find my PNG frames and reads them all (unlike PNG2THEORA),
also has an "interesting" algo finding amount of them:
0-1-2-4-8-16-32-64-128-256(not found)-129-130-132-136-144(not
found)-137..., output movie looks promising but is garbage (some
residual similarity to the original, though). No problem with encoding
from YUV4MPEG.

5. (suggestion)

Upgrade the frame picking algo in both FFMPEG2THEORA and PNG2THEORA:

"blah(4,0).png"

would mean "blah0000.png" to "blah9999.png" (as long as frame available)

"frame(3,77).png"

would run from 077 to 999 at most.

Counter syntax: (digits, start)

Using percent "%" in commandline is bad since some OS'es do use it for
enviro var expansion:

"SET PATH=C:\XIPH\;%PATH%"


More information about the theora mailing list