static char ** subforce = NULL;
static char * subburn = NULL;
static char * subdefault = NULL;
+static char ** srtfile = NULL;
+static char ** srtcodeset = NULL;
+static char ** srtoffset = NULL;
+static char ** srtlang = NULL;
+static int srtdefault = -1;
static int subtitle_scan = 0;
static int width = 0;
static int height = 0;
audio = hb_list_audio_config_item( title->list_audio, i );
if( ( audio->in.codec == HB_ACODEC_AC3 ) || ( audio->in.codec == HB_ACODEC_DCA) )
{
- fprintf( stderr, " + %d, %s, %dHz, %dbps\n", i + 1,
- audio->lang.description, audio->in.samplerate, audio->in.bitrate );
+ fprintf( stderr, " + %d, %s (iso639-2: %s), %dHz, %dbps\n",
+ i + 1,
+ audio->lang.description,
+ audio->lang.iso639_2,
+ audio->in.samplerate,
+ audio->in.bitrate );
}
else
{
- fprintf( stderr, " + %d, %s\n", i + 1, audio->lang.description );
+ fprintf( stderr, " + %d, %s (iso639-2: %s)\n",
+ i + 1,
+ audio->lang.description,
+ audio->lang.iso639_2 );
}
}
fprintf( stderr, " + subtitle tracks:\n" );
maxWidth = 720;
if( !x264opts )
{
- x264opts = strdup("cabac=0:ref=2:mixed-refs=1:me=umh");
+ x264opts = strdup("cabac=0:ref=2:me=umh:bframes=0:8x8dct=0:trellis=0:subme=6");
}
anamorphic_mode = 2;
job->chapter_markers = 1;
maxWidth = 320;
if( !x264opts )
{
- x264opts = strdup("level=30:bframes=0:cabac=0:ref=1:vbv-maxrate=768:vbv-bufsize=2000:analyse=all:me=umh:no-fast-pskip=1");
+ x264opts = strdup("level=30:bframes=0:cabac=0:ref=1:vbv-maxrate=768:vbv-bufsize=2000:analyse=all:me=umh:no-fast-pskip=1:subme=6:8x8dct=0:trellis=0");
}
job->chapter_markers = 1;
}
maxWidth = 480;
if( !x264opts )
{
- x264opts = strdup("cabac=0:ref=2:mixed-refs:me=umh");
+ x264opts = strdup("cabac=0:ref=2:me=umh:bframes=0:subme=6:8x8dct=0:trellis=0");
}
job->chapter_markers = 1;
}
maxWidth = 960;
if( !x264opts )
{
- x264opts = strdup("cabac=0:ref=2:mixed-refs=1:bframes=3:me=umh:subme=7:b-adapt=2:8x8dct=1");
+ x264opts = strdup("cabac=0:ref=2:me=umh:b-adapt=2:weightb=0:trellis=0");
}
anamorphic_mode = 2;
job->chapter_markers = 1;
}
if( !x264opts )
{
- x264opts = strdup("ref=2:bframes=2:me=umh");
+ x264opts = strdup("ref=2:bframes=2:me=umh:subme=6:mixed-refs=0:weightb=0:8x8dct=0:trellis=0");
}
anamorphic_mode = 1;
job->chapter_markers = 1;
}
if( !x264opts )
{
- x264opts = strdup("ref=3:mixed-refs:bframes=3:weightb:b-pyramid:b-adapt=2:me=umh:subme=9:analyse=all:8x8dct");
+ x264opts = strdup("b-pyramid:b-adapt=2:me=umh:subme=9:analyse=all:trellis=0");
}
detelecine = 1;
decomb = 1;
}
if( !x264opts )
{
- x264opts = strdup("bframes=3:ref=1:subme=5:me=umh:no-fast-pskip=1:cabac=0");
+ x264opts = strdup("ref=1:subme=5:me=umh:no-fast-pskip=1:cabac=0:weightb=0:8x8dct=0:trellis=0");
}
anamorphic_mode = 1;
job->chapter_markers = 1;
maxWidth = 480;
if( !x264opts )
{
- x264opts = strdup("level=30:cabac=0:ref=1:analyse=all:me=umh:no-fast-pskip=1:psy-rd=0,0");
+ x264opts = strdup("level=30:cabac=0:ref=1:analyse=all:me=umh:no-fast-pskip=1:psy-rd=0,0:bframes=0:subme=6:8x8dct=0:trellis=0");
}
job->chapter_markers = 1;
}
maxWidth = 640;
if( !x264opts )
{
- x264opts = strdup("level=30:bframes=0:cabac=0:ref=1:vbv-maxrate=1500:vbv-bufsize=2000:analyse=all:me=umh:no-fast-pskip=1:psy-rd=0,0");
+ x264opts = strdup("level=30:bframes=0:cabac=0:ref=1:vbv-maxrate=1500:vbv-bufsize=2000:analyse=all:me=umh:no-fast-pskip=1:psy-rd=0,0:subme=6:8x8dct=0:trellis=0");
}
job->chapter_markers = 1;
}
}
}
+ if( srtfile )
+ {
+ char * token;
+ int i, pos;
+ hb_subtitle_config_t sub_config;
+
+ pos = 0;
+ for( i=0; srtfile[i] != NULL; i++ )
+ {
+ char *codeset = "L1";
+ int64_t offset = 0;
+ char *lang = "und";
+
+ pos++;
+ token = srtfile[i];
+ if( srtcodeset && srtcodeset[i] )
+ {
+ codeset = srtcodeset[i];
+ }
+ if( srtoffset && srtoffset[i] )
+ {
+ offset = strtoll( srtoffset[i], &srtoffset[i], 0 );
+ }
+ if ( srtlang && srtlang[i] )
+ {
+ lang = srtlang[i];
+ }
+ sub_config.default_track =
+ ( srtdefault != -1 ) && ( srtdefault == i + 1 );
+ sub_config.force = 0;
+ strncpy( sub_config.src_filename, srtfile[i], 128);
+ strncpy( sub_config.src_codeset, codeset, 40);
+ sub_config.offset = offset;
+
+ hb_srt_add( job, &sub_config, lang);
+ }
+ }
+
if( native_language )
{
char audio_lang[4];
"### Destination Options------------------------------------------------------\n\n"
" -o, --output <string> Set output file name\n"
- " -f, --format <string> Set output format (avi/mp4/ogm/mkv, default:\n"
+ " -f, --format <string> Set output format (mp4/mkv, default:\n"
" autodetected from file name)\n"
" -m, --markers Add chapter markers (mp4 and mkv output formats only)\n"
" -4, --large-file Use 64-bit mp4 files that can hold more than\n"
" --subtitle-burn \"Burn\" the selected subtitle into the video track\n"
" <number> If \"number\" is omitted, the first trac is burned.\n"
" --subtitle-default Flag the selected subtitle as the default subtitle\n"
- " <number> to be displayed upon playback. Settings no default\n"
+ " <number> to be displayed upon playback. Setting no default\n"
" means no subtitle will be automatically displayed\n"
" If \"number\" is omitted, the first trac is default.\n"
" -N, --native-language Specifiy the your language preference. When the first\n"
" that matches the --native-language. If there are no\n"
" matching audio tracks then the first matching\n"
" subtitle track is used instead.\n"
-
+ " --srt-file <string> SubRip SRT filename(s), separated by commas.\n"
+ " --srt-codeset Character codeset(s) that the SRT file(s) are\n"
+ " <string> encoded in, separted by commas.\n"
+ " Use 'iconv -l' for a list of valid\n"
+ " codesets. If not specified latin1 is assumed\n"
+ " --srt-offset Offset in milli-seconds to apply to the SRT file(s)\n"
+ " <string> separted by commas. If not specified zero is assumed.\n"
+ " Offsets may be negative.\n"
+ " --srt-lang <string> Language as an iso639-2 code fra, eng, spa et cetera)\n"
+ " for the SRT file(s) separated by commas. If not specified\n"
+ " then 'und' is used.\n"
+ " --srt-default Flag the selected srt as the default subtitle\n"
+ " <number> to be displayed upon playback. Setting no default\n"
+ " means no subtitle will be automatically displayed\n"
+ " If \"number\" is omitted, the first srt is default.\n"
+ " \"number\" is an 1 based index into the srt-file list\n"
"\n"
{
printf("\n< Apple\n");
- printf("\n + Universal: -e x264 -q 20.0 -a 1,1 -E faac,ac3 -B 160,160 -6 dpl2,auto -R 48,Auto -D 0.0,0.0 -f mp4 -X 720 --loose-anamorphic -m -x cabac=0:ref=2:mixed-refs=1:me=umh\n");
+ printf("\n + Universal: -e x264 -q 20.0 -a 1,1 -E faac,ac3 -B 160,160 -6 dpl2,auto -R 48,Auto -D 0.0,0.0 -f mp4 -X 720 --loose-anamorphic -m -x cabac=0:ref=2:me=umh:bframes=0:8x8dct=0:trellis=0:subme=6\n");
- printf("\n + iPod: -e x264 -b 700 -a 1 -E faac -B 160 -6 dpl2 -R 48 -D 0.0 -f mp4 -I -X 320 -m -x level=30:bframes=0:cabac=0:ref=1:vbv-maxrate=768:vbv-bufsize=2000:analyse=all:me=umh:no-fast-pskip=1\n");
+ printf("\n + iPod: -e x264 -b 700 -a 1 -E faac -B 160 -6 dpl2 -R 48 -D 0.0 -f mp4 -I -X 320 -m -x level=30:bframes=0:cabac=0:ref=1:vbv-maxrate=768:vbv-bufsize=2000:analyse=all:me=umh:no-fast-pskip=1:subme=6:8x8dct=0:trellis=0\n");
- printf("\n + iPhone & iPod Touch: -e x264 -q 20.0 -a 1 -E faac -B 128 -6 dpl2 -R 48 -D 0.0 -f mp4 -X 480 -m -x cabac=0:ref=2:mixed-refs:me=umh\n");
+ printf("\n + iPhone & iPod Touch: -e x264 -q 20.0 -a 1 -E faac -B 128 -6 dpl2 -R 48 -D 0.0 -f mp4 -X 480 -m -x cabac=0:ref=2:me=umh:bframes=0:subme=6:8x8dct=0:trellis=0\n");
- printf("\n + AppleTV: -e x264 -q 20.0 -a 1,1 -E faac,ac3 -B 160,160 -6 dpl2,auto -R 48,Auto -D 0.0,0.0 -f mp4 -4 -X 960 --loose-anamorphic -m -x cabac=0:ref=2:mixed-refs=1:bframes=3:me=umh:subme=7:b-adapt=2:8x8dct=1\n");
+ printf("\n + AppleTV: -e x264 -q 20.0 -a 1,1 -E faac,ac3 -B 160,160 -6 dpl2,auto -R 48,Auto -D 0.0,0.0 -f mp4 -4 -X 960 --loose-anamorphic -m -x cabac=0:ref=2:me=umh:b-adapt=2:weightb=0:trellis=0\n");
printf("\n>\n");
printf("\n< Regular\n");
- printf("\n + Normal: -e x264 -q 20.0 -a 1 -E faac -B 160 -6 dpl2 -R 48 -D 0.0 -f mp4 --strict-anamorphic -m -x ref=2:bframes=2:me=umh\n");
+ printf("\n + Normal: -e x264 -q 20.0 -a 1 -E faac -B 160 -6 dpl2 -R 48 -D 0.0 -f mp4 --strict-anamorphic -m -x ref=2:bframes=2:me=umh:subme=6:mixed-refs=0:weightb=0:8x8dct=0:trellis=0\n");
- printf("\n + High Profile: -e x264 -q 20.0 -a 1,1 -E faac,ac3 -B 160,160 -6 dpl2,auto -R 48,Auto -D 0.0,0.0 -f mp4 --detelecine --decomb --loose-anamorphic -m -x ref=3:mixed-refs:bframes=3:weightb:b-pyramid:b-adapt=2:me=umh:subme=9:analyse=all:8x8dct\n");
+ printf("\n + High Profile: -e x264 -q 20.0 -a 1,1 -E faac,ac3 -B 160,160 -6 dpl2,auto -R 48,Auto -D 0.0,0.0 -f mp4 --detelecine --decomb --loose-anamorphic -m -x b-pyramid:b-adapt=2:me=umh:subme=9:analyse=all:trellis=0\n");
printf("\n>\n");
printf("\n + Classic: -b 1000 -a 1 -E faac -B 160 -6 dpl2 -R 48 -D 0.0 -f mp4\n");
- printf("\n + AppleTV Legacy: -e x264 -b 2500 -a 1,1 -E faac,ac3 -B 160,160 -6 dpl2,auto -R 48,Auto -D 0.0,0.0 -f mp4 -4 --strict-anamorphic -m -x bframes=3:ref=1:subme=5:me=umh:no-fast-pskip=1:cabac=0\n");
+ printf("\n + AppleTV Legacy: -e x264 -b 2500 -a 1,1 -E faac,ac3 -B 160,160 -6 dpl2,auto -R 48,Auto -D 0.0,0.0 -f mp4 -4 --strict-anamorphic -m -x ref=1:subme=5:me=umh:no-fast-pskip=1:cabac=0:weightb=0:8x8dct=0:trellis=0\n");
- printf("\n + iPhone Legacy: -e x264 -b 960 -a 1 -E faac -B 128 -6 dpl2 -R 48 -D 0.0 -f mp4 -I -X 480 -m -x level=30:cabac=0:ref=1:analyse=all:me=umh:no-fast-pskip=1:psy-rd=0,0\n");
+ printf("\n + iPhone Legacy: -e x264 -b 960 -a 1 -E faac -B 128 -6 dpl2 -R 48 -D 0.0 -f mp4 -I -X 480 -m -x level=30:cabac=0:ref=1:analyse=all:me=umh:no-fast-pskip=1:psy-rd=0,0:bframes=0:subme=6:8x8dct=0:trellis=0\n");
- printf("\n + iPod Legacy: -e x264 -b 1500 -a 1 -E faac -B 160 -6 dpl2 -R 48 -D 0.0 -f mp4 -I -X 640 -m -x level=30:bframes=0:cabac=0:ref=1:vbv-maxrate=1500:vbv-bufsize=2000:analyse=all:me=umh:no-fast-pskip=1:psy-rd=0,0\n");
+ printf("\n + iPod Legacy: -e x264 -b 1500 -a 1 -E faac -B 160 -6 dpl2 -R 48 -D 0.0 -f mp4 -I -X 640 -m -x level=30:bframes=0:cabac=0:ref=1:vbv-maxrate=1500:vbv-bufsize=2000:analyse=all:me=umh:no-fast-pskip=1:psy-rd=0,0:subme=6:8x8dct=0:trellis=0\n");
printf("\n>\n");
}
-static char** str_split( char *str, char *delem )
+static char * hb_strndup( char * str, int len )
+{
+ char * res;
+ int str_len = strlen( str );
+
+ res = malloc( len > str_len ? str_len + 1 : len + 1 );
+ strncpy( res, str, len );
+ res[len] = '\0';
+ return res;
+}
+
+static char** str_split( char *str, char delem )
{
- char * token;
- char * copy_str;
char * pos;
+ char * end;
char ** ret;
int count, i;
- if ( str == NULL || delem == NULL || str[0] == 0 )
+ if ( str == NULL || str[0] == 0 )
{
ret = malloc( sizeof(char*) );
*ret = NULL;
// Find number of elements in the string
count = 1;
pos = str;
- while ( ( pos = strstr( pos+1, delem ) ) != NULL )
+ while ( ( pos = strchr( pos, delem ) ) != NULL )
{
- if ( *(pos+1) != 0 )
- count++;
+ count++;
+ pos++;
}
- ret = calloc( ( count + 1 ), sizeof(char*) );
- copy_str = strdup( str );
- token = strtok( copy_str, delem );
+ ret = calloc( ( count + 1 ), sizeof(char*) );
- i = 0;
- while( token != NULL && i < count )
+ pos = str;
+ for ( i = 0; i < count - 1; i++ )
{
- ret[i] = strdup( token );
- token = strtok(NULL, ",");
- i++;
+ end = strchr( pos, delem );
+ ret[i] = hb_strndup(pos, end - pos);
+ pos = end + 1;
}
- free( copy_str );
+ ret[i] = strdup(pos);
+
return ret;
}
#define SUB_BURNED 266
#define SUB_DEFAULT 267
#define NATIVE_DUB 268
+ #define SRT_FILE 269
+ #define SRT_CODESET 270
+ #define SRT_OFFSET 271
+ #define SRT_LANG 272
+ #define SRT_DEFAULT 273
for( ;; )
{
{ "subtitle-forced", optional_argument, NULL, 'F' },
{ "subtitle-burned", optional_argument, NULL, SUB_BURNED },
{ "subtitle-default", optional_argument, NULL, SUB_DEFAULT },
+ { "srt-file", required_argument, NULL, SRT_FILE },
+ { "srt-codeset", required_argument, NULL, SRT_CODESET },
+ { "srt-offset", required_argument, NULL, SRT_OFFSET },
+ { "srt-lang", required_argument, NULL, SRT_LANG },
+ { "srt-default", optional_argument, NULL, SRT_DEFAULT },
{ "native-language", required_argument, NULL,'N' },
{ "native-dub", no_argument, NULL, NATIVE_DUB },
-
{ "encoder", required_argument, NULL, 'e' },
{ "aencoder", required_argument, NULL, 'E' },
{ "two-pass", no_argument, NULL, '2' },
int c;
c = getopt_long( argc, argv,
- "hv::uC:f:4i:Io:t:Lc:m::M:a:A:6:s:UFN:e:E:2dD:7895gOw:l:n:b:q:S:B:r:R:Qx:TY:X:Z:z",
+ "hv::uC:f:4i:Io:t:Lc:m::M:a:A:6:s:UF::N:e:E:2dD:7895gOw:l:n:b:q:S:B:r:R:Qx:TY:X:Z:z",
long_options, &option_index );
if( c < 0 )
{
}
break;
case 's':
- subtracks = str_split( optarg, "," );
+ subtracks = str_split( optarg, ',' );
break;
case 'F':
- subtracks = str_split( optarg, "," );
+ subforce = str_split( optarg, ',' );
break;
case SUB_BURNED:
if( optarg != NULL )
case NATIVE_DUB:
native_dub = 1;
break;
+ case SRT_FILE:
+ srtfile = str_split( optarg, ',' );
+ break;
+ case SRT_CODESET:
+ srtcodeset = str_split( optarg, ',' );
+ break;
+ case SRT_OFFSET:
+ srtoffset = str_split( optarg, ',' );
+ break;
+ case SRT_LANG:
+ srtlang = str_split( optarg, ',' );
+ break;
+ case SRT_DEFAULT:
+ if( optarg != NULL )
+ {
+ srtdefault = atoi( optarg );
+ }
+ else
+ {
+ srtdefault = 1 ;
+ }
+ break;
case '2':
twoPass = 1;
break;
char * p = strrchr( output, '.' );
/* autodetect */
- if( p && !strcasecmp( p, ".avi" ) )
- {
- mux = HB_MUX_AVI;
- default_acodec = HB_ACODEC_LAME;
- }
- else if( p && ( !strcasecmp( p, ".mp4" ) ||
+ if( p && ( !strcasecmp( p, ".mp4" ) ||
!strcasecmp( p, ".m4v" ) ) )
{
if ( h264_30 == 1 )
mux = HB_MUX_MP4;
default_acodec = HB_ACODEC_FAAC;
}
- else if( p && ( !strcasecmp( p, ".ogm" ) ||
- !strcasecmp( p, ".ogg" ) ) )
- {
- mux = HB_MUX_OGM;
- default_acodec = HB_ACODEC_VORBIS;
- }
else if( p && !strcasecmp(p, ".mkv" ) )
{
mux = HB_MUX_MKV;
return 0;
}
}
- else if( !strcasecmp( format, "avi" ) )
- {
- mux = HB_MUX_AVI;
- default_acodec = HB_ACODEC_LAME;
- }
else if( !strcasecmp( format, "mp4" ) ||
!strcasecmp( format, "m4v" ) )
{
mux = HB_MUX_MP4;
default_acodec = HB_ACODEC_FAAC;
}
- else if( !strcasecmp( format, "ogm" ) ||
- !strcasecmp( format, "ogg" ) )
- {
- mux = HB_MUX_OGM;
- default_acodec = HB_ACODEC_VORBIS;
- }
else if( !strcasecmp( format, "mkv" ) )
{
mux = HB_MUX_MKV;
else
{
fprintf( stderr, "Invalid output format (%s). Possible "
- "choices are avi, mp4, m4v, ogm, ogg and mkv\n.", format );
+ "choices are mp4, m4v and mkv\n.", format );
return 1;
}
}