/* === M E T H O D S ======================================================= */
+bool ffmpeg_mptr::is_animated()
+{
+ return true;
+}
+
bool
ffmpeg_mptr::seek_to(int frame)
{
#if defined(WIN32_PIPE_TO_PROCESSES)
string command;
-
- command=strprintf("ffmpeg -i \"%s\" -an -f image2pipe -vcodec ppm -\n",filename.c_str());
-
+
+ command=strprintf("ffmpeg -ss 00:00:00.%d -i \"%s\" -an -f image2pipe -vcodec ppm -\n",frame,filename.c_str());
+
file=popen(command.c_str(),POPEN_BINARY_READ_TYPE);
#elif defined(UNIX_PIPE_TO_PROCESSES)
int p[2];
-
+
if (pipe(p)) {
cerr<<"Unable to open pipe to ffmpeg"<<endl;
return false;
};
-
+
pid = fork();
-
+
if (pid == -1) {
cerr<<"Unable to open pipe to ffmpeg"<<endl;
return false;
}
-
+
if (pid == 0){
// Child process
// Close pipein, not needed
}
// Close the unneeded pipein
close(p[1]);
- execlp("ffmpeg", "ffmpeg", "-i", filename.c_str(), "-an", "-f", "image2pipe", "-vcodec", "ppm", "-", (const char *)NULL);
+ string time = strprintf("00:00:00.%d",frame);
+ execlp("ffmpeg", "ffmpeg", "-ss", time.c_str(), "-i", filename.c_str(), "-an", "-f", "image2pipe", "-vcodec", "ppm", "-", (const char *)NULL);
// We should never reach here unless the exec failed
cerr<<"Unable to open pipe to ffmpeg"<<endl;
- return false;
+ _exit(1);
} else {
// Parent process
// Close pipeout, not needed
float divisor;
char cookie[2];
cookie[0]=fgetc(file);
+
+ if(feof(file))
+ return false;
+
cookie[1]=fgetc(file);
if(cookie[0]!='P' || cookie[1]!='6')
}
surface=frame;
- return false;
+ return true;
}