All pastes #123905 Raw Edit

Anonymous

public text v1 · immutable
·published 2006-08-09 17:55 UTC
rendered paste body
void launchffmpeg_video(struct convparam *param,gint pass,gint fatherpid)
{
	
	pid_t pid;
	int fd[2];
	pipe(fd);
	pid=fork();
	if(pid==0)
	{ // fils
		int shmid;
		close(fd[0]);
		dup2(fd[1],1);
		dup2(fd[1],2);
		shmid=shmget((int)fatherpid,sizeof(struct convparam),0600);
		if(shmid>0)
		{
			struct convparam *cparam;
			gint argc,ret,i;
			gchar *args[100],logtxt[4096];;
			cparam=shmat(shmid,NULL,SHM_RND);
			argc=0;
			args[argc++]=g_strdup(PACKAGE_DATA_DIR"/pspvc/bin/ffmpeg");
			args[argc++]=g_strdup("-y");
 			args[argc++]=g_strdup("-i");
 			args[argc++]=g_strdup_printf("%s",cparam->filename);
			args[argc++]=g_strdup("-b");
			args[argc++]=g_strdup_printf("%d",cparam->vb);
			if(cparam->vb > 768)
			{
				args[argc++]=g_strdup("-muxvb");
				args[argc++]=g_strdup("768");
			}
			args[argc++]=g_strdup("-r");
			args[argc++]=g_strdup("29.970030");
			args[argc++]=g_strdup("-ab");
			args[argc++]=g_strdup_printf("%d",cparam->ab/2);
			if(cparam->ab > 128)
			{
				args[argc++]=g_strdup("-muxab");
				args[argc++]=g_strdup("128");
			}
			args[argc++]=g_strdup("-title");
			args[argc++]=g_strdup_printf("%s",cparam->title);
			args[argc++]=g_strdup("-f");
			args[argc++]=g_strdup("psp");
			if(cparam->codec==0)
			{
				args[argc++]=g_strdup("-bufsize");
				args[argc++]=g_strdup_printf("%d",cparam->vb);
				args[argc++]=g_strdup("-ar");
				args[argc++]=g_strdup("48000");
				args[argc++]=g_strdup("-bitexact");
				args[argc++]=g_strdup("-vcodec");
				args[argc++]=g_strdup("h264");
				args[argc++]=g_strdup("-coder");
				args[argc++]=g_strdup("1");
				args[argc++]=g_strdup("-g");
				args[argc++]=g_strdup("250");
			}
			else
			{
				args[argc++]=g_strdup("-vcodec");
				args[argc++]=g_strdup("xvid");				
				args[argc++]=g_strdup("-ar");
				args[argc++]=g_strdup("24000");
			}
// resolution
			args[argc++]=g_strdup("-s");
			if(cparam->aspect==1)
				args[argc++]=g_strdup("320x240");
			else
				args[argc++]=g_strdup("368x208");
/*			args[argc++]=g_strdup("-padtop");
			args[argc++]=g_strdup_printf("%d",cparam->cf);
			args[argc++]=g_strdup("-padbottom");
			args[argc++]=g_strdup_printf("%d",cparam->cf);*/
//
			if(cparam->pass>1)					
			{
				args[argc++]=g_strdup("-pass");
				args[argc++]=g_strdup_printf("%d",pass);
				args[argc++]=g_strdup("-passlogfile");
				args[argc++]=g_strdup_printf("%s-%d",cparam->filename,fatherpid);
			}
			args[argc++]=g_strdup("-vol");
			args[argc++]=g_strdup_printf("%d",cparam->volume);
/*			args[argc++]=g_strdup("-acodec");
			args[argc++]=g_strdup("aac");*/
			args[argc++]=g_strdup("-ac");
			args[argc++]=g_strdup("2");
			if(((pass==2)&&(cparam->pass==2))||(cparam->pass==1))
			{
				if(cparam->codec==0)
					args[argc++]=g_strdup_printf("%s/MAQ%05d.MP4",cparam->currentpath,cparam->pspnum);
				else
					args[argc++]=g_strdup_printf("%s/M4V%05d.MP4",cparam->currentpath,cparam->pspnum);
			}
			else
				args[argc++]=g_strdup("/dev/null");
			args[argc++]=NULL;
			sprintf(logtxt,"-COMMAND:\n");
			pspvc_log(logtxt,0);
			logtxt[0]=0;
			for(i=0;i<argc;i++)
				sprintf(logtxt,"%s %s",logtxt,args[i]);
			pspvc_log(logtxt,0);
			pspvc_log("\n",0);
			while(!cparam->ffmpeg_conv_tokill[pass])
				sleep(1);
			shmdt(cparam);
 			ret=execvp(*args,args);
			if(ret==-1)
				printf("Error=%d\n",errno);
		}
		else
		{
			printf("[launchffmpeg_video] shmid not OK\n");
		}
	}
	if(pid>0)
	{ // Pere
		gint h,m,s,ds,eof=0;
		gchar *cfps;
		gchar cPoub1[4096];
		param->ffmpeg_conv_tokill[pass]=pid;
		close(fd[1]);
		dup2(fd[0],0);
		while((strcmp(cPoub1,"Duration:"))&&(eof!= EOF))
		{
			eof=scanf("%s",cPoub1);
			pspvc_log(cPoub1,0);
		}
		scanf("%02d:%02d:%02d.%d",&h,&m,&s,&ds);
		param->duration=(double)h*3600.0+(double)m*60.0+(double)s+(double)ds/10.0;
		param->fps_target=(int)(param->duration*29.97003);
		while((eof!= EOF)&&(!param->killme))
		{
			eof=scanf("%s",cPoub1);
			pspvc_log(cPoub1,0);
			if(strstr(cPoub1,"frame=")!=NULL)
			{
				if(!strcmp("frame=",cPoub1))
					eof=scanf("%d",&(param->fps_reached[param->pass_current-1]));
				else
				{
					cfps=strchr(cPoub1,'=')+1;
					param->fps_reached[param->pass_current-1]=atoi(cfps);
				}
			}
		}
	}
}