You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
208 lines
5.9 KiB
208 lines
5.9 KiB
4 years ago
|
/*
|
||
|
* external_codec.c
|
||
|
*
|
||
|
* Copyright (C) Marzio Malanchini - August 2003
|
||
|
*
|
||
|
* This file is part of transcode, a video stream processing tool
|
||
|
*
|
||
|
* transcode is free software; you can redistribute it and/or modify
|
||
|
* it under the terms of the GNU General Public License as published by
|
||
|
* the Free Software Foundation; either version 2, or (at your option)
|
||
|
* any later version.
|
||
|
*
|
||
|
* transcode is distributed in the hope that it will be useful,
|
||
|
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||
|
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||
|
* GNU General Public License for more details.
|
||
|
*
|
||
|
* You should have received a copy of the GNU General Public License
|
||
|
* along with GNU Make; see the file COPYING. If not, write to
|
||
|
* the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, USA.
|
||
|
*
|
||
|
*/
|
||
|
|
||
|
#include "transcode.h"
|
||
|
#include "external_codec.h"
|
||
|
|
||
|
#include <stdlib.h>
|
||
|
|
||
|
#define MPEG2ENC_MP2ENC_PROG "mplex"
|
||
|
#define MPEG_MPEG_PROG "tcmplex"
|
||
|
#define AVI_AVI_PROG "avimerge"
|
||
|
|
||
|
|
||
|
static char *p_supported_modules[] = {
|
||
|
"null",
|
||
|
"mpeg2enc",
|
||
|
"mp2enc",
|
||
|
"mpeg",
|
||
|
"divx5",
|
||
|
"ffmpeg",
|
||
|
"xvid",
|
||
|
NULL
|
||
|
};
|
||
|
|
||
|
void f_help_codec (char *p_module)
|
||
|
{
|
||
|
int s_cont;
|
||
|
|
||
|
fprintf(stderr, "[%s] Supported Modules\n",p_module);
|
||
|
fprintf(stderr, "[%s] --------------------\n",p_module);
|
||
|
for(s_cont=0;p_supported_modules[s_cont]!=NULL;s_cont++)
|
||
|
{
|
||
|
if (s_cont%2)
|
||
|
fprintf(stderr, "\t%s\n",p_supported_modules[s_cont]);
|
||
|
else
|
||
|
fprintf(stderr, "[%s] %s",p_module,p_supported_modules[s_cont]);
|
||
|
}
|
||
|
if ((s_cont-1)%2)
|
||
|
fprintf(stderr, "[%s] --------------------\n",p_module);
|
||
|
else
|
||
|
fprintf(stderr, "\n[%s] --------------------\n",p_module);
|
||
|
}
|
||
|
|
||
|
char *f_supported_system(pvm_config_codec *p_v_codec,pvm_config_codec *p_a_codec)
|
||
|
{
|
||
|
static char *p_buffer="mpeg1audio";
|
||
|
|
||
|
if ((!strcasecmp(p_v_codec->p_codec, "mpeg2enc"))&&(!strcasecmp(p_a_codec->p_codec, "mp2enc")))
|
||
|
return((char *)"mpeg2enc-mp2enc");
|
||
|
else if ((!strcasecmp(p_v_codec->p_codec, "mpeg"))&&(!strcasecmp(p_a_codec->p_codec, "mpeg")))
|
||
|
return((char *)"mpeg-mpeg");
|
||
|
else if ((!strcasecmp(p_v_codec->p_codec, "ffmpeg"))&&(!strcasecmp(p_a_codec->p_codec, "ffmpeg"))&&((!strcasecmp(p_v_codec->p_par1, "mpeg1video"))))
|
||
|
{
|
||
|
p_a_codec->p_par1=p_buffer; /*this isn't defined but useful to known the type of the output stram*/
|
||
|
return((char *)"mpeg-mpeg");
|
||
|
}
|
||
|
else
|
||
|
return((char *)"avi-avi");
|
||
|
return(NULL);
|
||
|
}
|
||
|
|
||
|
int f_supported_export_module(char *p_codec)
|
||
|
{
|
||
|
int s_cont;
|
||
|
|
||
|
for(s_cont=0;p_supported_modules[s_cont]!=NULL;s_cont++)
|
||
|
{
|
||
|
if (!strcasecmp(p_codec,p_supported_modules[s_cont]))
|
||
|
{
|
||
|
return(1);
|
||
|
}
|
||
|
}
|
||
|
return(0);
|
||
|
}
|
||
|
|
||
|
int f_multiplexer(char *p_codec,char *p_merge_cmd,char *p_video_filename,char *p_audio_filename,char *p_dest_file,int s_verbose)
|
||
|
{
|
||
|
char s_buffer[2*MAX_BUF];
|
||
|
|
||
|
if(!strcasecmp(p_codec,"mpeg2enc-mp2enc"))
|
||
|
{
|
||
|
memset(s_buffer,'\0',sizeof(s_buffer));
|
||
|
if (p_merge_cmd!=NULL)
|
||
|
tc_snprintf(s_buffer,sizeof(s_buffer),"%s %s -o %s %s %s",MPEG2ENC_MP2ENC_PROG,p_merge_cmd,p_dest_file,p_video_filename,p_audio_filename);
|
||
|
else
|
||
|
tc_snprintf(s_buffer,sizeof(s_buffer),"%s -o %s %s %s",MPEG2ENC_MP2ENC_PROG,p_dest_file,p_video_filename,p_audio_filename);
|
||
|
if(s_verbose & TC_DEBUG)
|
||
|
fprintf(stderr,"(%s) multiplex cmd: %s\n",__FILE__,s_buffer);
|
||
|
(int)system(s_buffer);
|
||
|
return(0);
|
||
|
}
|
||
|
else if(!strcasecmp(p_codec,"mpeg-mpeg"))
|
||
|
{
|
||
|
memset(s_buffer,'\0',sizeof(s_buffer));
|
||
|
if (p_merge_cmd!=NULL)
|
||
|
tc_snprintf(s_buffer,sizeof(s_buffer),"%s %s -o %s -i %s -p %s",MPEG_MPEG_PROG,p_merge_cmd,p_dest_file,p_video_filename,p_audio_filename);
|
||
|
else
|
||
|
tc_snprintf(s_buffer,sizeof(s_buffer),"%s -o %s -i %s -p %s",MPEG_MPEG_PROG,p_dest_file,p_video_filename,p_audio_filename);
|
||
|
if(s_verbose & TC_DEBUG)
|
||
|
fprintf(stderr,"(%s) multiplex cmd: %s\n",__FILE__,s_buffer);
|
||
|
(int)system(s_buffer);
|
||
|
return(0);
|
||
|
}
|
||
|
else if(!strcasecmp(p_codec,"avi-avi"))
|
||
|
{
|
||
|
memset(s_buffer,'\0',sizeof(s_buffer));
|
||
|
if (p_merge_cmd!=NULL)
|
||
|
tc_snprintf(s_buffer,sizeof(s_buffer),"%s %s -o %s -i %s -p %s",AVI_AVI_PROG,p_merge_cmd,p_dest_file,p_video_filename,p_audio_filename);
|
||
|
else
|
||
|
tc_snprintf(s_buffer,sizeof(s_buffer),"%s -o %s -i %s -p %s",AVI_AVI_PROG,p_dest_file,p_video_filename,p_audio_filename);
|
||
|
if(s_verbose & TC_DEBUG)
|
||
|
fprintf(stderr,"(%s) multiplex cmd: %s\n",__FILE__,s_buffer);
|
||
|
(int)system(s_buffer);
|
||
|
return(0);
|
||
|
}
|
||
|
else
|
||
|
return(1);
|
||
|
}
|
||
|
|
||
|
char *f_external_suffix(char *p_codec,char *p_param)
|
||
|
{
|
||
|
|
||
|
static char *p_suffix[]={".m1v\0",".m2v\0",".mpa\0",".mpeg\0","\0",NULL};
|
||
|
char s_var;
|
||
|
if (p_param!=NULL)
|
||
|
{
|
||
|
if(!strcasecmp(p_codec,"mp2enc"))
|
||
|
{
|
||
|
return(p_suffix[2]);
|
||
|
}
|
||
|
else if((!strcasecmp(p_codec,"mpeg2enc-mp2enc"))||(!strcasecmp(p_codec,"mpeg-mpeg")))
|
||
|
{
|
||
|
return(p_suffix[3]);
|
||
|
}
|
||
|
else if((!strcasecmp(p_codec,"ffmpeg"))&&((!strcasecmp(p_param,"mpeg1video"))))
|
||
|
{
|
||
|
return(p_suffix[0]);
|
||
|
}
|
||
|
else if((!strcasecmp(p_codec,"ffmpeg"))&&((!strcasecmp(p_param,"mpeg1audio"))))
|
||
|
{
|
||
|
return(p_suffix[4]);
|
||
|
}
|
||
|
else if(!strcasecmp(p_codec,"mpeg2enc"))
|
||
|
{
|
||
|
s_var=p_param[0];
|
||
|
if (p_param==NULL) /*det the suffix*/
|
||
|
return(p_suffix[0]);
|
||
|
else if (strchr("1234568", tolower(s_var))==NULL)
|
||
|
return(p_suffix[0]);
|
||
|
else if (strchr("34568",tolower(s_var))!=NULL)
|
||
|
return(p_suffix[1]);
|
||
|
else
|
||
|
return(p_suffix[0]);
|
||
|
}
|
||
|
else if(!strcasecmp(p_codec,"mpeg"))
|
||
|
{
|
||
|
s_var=p_param[0];
|
||
|
if (p_param==NULL) /*det the suffix*/
|
||
|
return(p_suffix[0]);
|
||
|
else if (strchr("1bvs2d", tolower(s_var))==NULL)
|
||
|
return(p_suffix[0]);
|
||
|
else if (strchr("1bv",tolower(s_var))!=NULL)
|
||
|
return(p_suffix[0]);
|
||
|
else
|
||
|
return(p_suffix[1]);
|
||
|
}
|
||
|
}
|
||
|
else
|
||
|
{
|
||
|
if(!strcasecmp(p_codec,"mp2enc"))
|
||
|
{
|
||
|
return(p_suffix[2]);
|
||
|
}
|
||
|
else if(!strcasecmp(p_codec,"mpeg")) /*valid only for audio (no param)*/
|
||
|
{
|
||
|
return(p_suffix[2]);
|
||
|
}
|
||
|
else if((!strcasecmp(p_codec,"mpeg2enc-mp2enc"))||(!strcasecmp(p_codec,"mpeg-mpeg")))
|
||
|
{
|
||
|
return(p_suffix[3]);
|
||
|
}
|
||
|
else
|
||
|
return(p_suffix[4]);
|
||
|
}
|
||
|
return(p_suffix[4]);
|
||
|
}
|
||
|
|