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;iffmpeg_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); } } } } }