triple: fix TODO in cVideo::ShowPicture()

rebuild the MPEG stillpicture if the source jpeg has changed
additionally check for zero sized m2v from broken ffmpeg versions
(the same as commit ee1a408f9b on spark)
This commit is contained in:
Stefan Seyfried
2012-03-30 19:37:36 +02:00
parent 123a1b75a8
commit 4aa3f8f617

View File

@@ -22,6 +22,7 @@
#include <sys/types.h> #include <sys/types.h>
#include <sys/stat.h> #include <sys/stat.h>
#include <unistd.h> #include <unistd.h>
#include <utime.h>
#include <cstring> #include <cstring>
#include <cstdio> #include <cstdio>
@@ -389,8 +390,13 @@ void cVideo::ShowPicture(const char * fname)
char *p; char *p;
void *data; void *data;
int mfd; int mfd;
struct stat st; struct stat st, st2;
strcpy(destname, "/var/cache"); strcpy(destname, "/var/cache");
if (stat(fname, &st2))
{
lt_info("%s: could not stat %s (%m)\n", __func__, fname);
return;
}
mkdir(destname, 0755); mkdir(destname, 0755);
/* the cache filename is (example for /share/tuxbox/neutrino/icons/radiomode.jpg): /* the cache filename is (example for /share/tuxbox/neutrino/icons/radiomode.jpg):
/var/cache/share.tuxbox.neutrino.icons.radiomode.jpg.m2v /var/cache/share.tuxbox.neutrino.icons.radiomode.jpg.m2v
@@ -401,14 +407,17 @@ void cVideo::ShowPicture(const char * fname)
while ((p = strchr(p, '/')) != NULL) while ((p = strchr(p, '/')) != NULL)
*p = '.'; *p = '.';
strcat(destname, ".m2v"); strcat(destname, ".m2v");
/* ...then check if it exists already... /* ...then check if it exists already... */
TODO: check if the cache file is older than the jpeg file... */ if (stat(destname, &st) || (st.st_mtime != st2.st_mtime) || (st.st_size == 0))
if (access(destname, R_OK))
{ {
/* it does not exist, so call ffmpeg to create it... */ struct utimbuf u;
u.actime = time(NULL);
u.modtime = st2.st_mtime;
/* it does not exist or has a different date, so call ffmpeg... */
sprintf(cmd, "ffmpeg -y -f mjpeg -i '%s' -s 704x576 '%s' </dev/null", sprintf(cmd, "ffmpeg -y -f mjpeg -i '%s' -s 704x576 '%s' </dev/null",
fname, destname); fname, destname);
system(cmd); /* TODO: use libavcodec to directly convert it */ system(cmd); /* TODO: use libavcodec to directly convert it */
utime(destname, &u);
} }
/* the mutex is a workaround: setBlank is apparently called from /* the mutex is a workaround: setBlank is apparently called from
a differnt thread and takes slightly longer, so that the decoder a differnt thread and takes slightly longer, so that the decoder