--- /dev/null
+commit 8bbdd20a293eab2cfac9f332613ead02a4e3c0c2
+Author: Claudio Freire <klaussfreire@gmail.com>
+Date: Sun May 12 09:38:40 2013 +0200
+
+ aacenc: Fix erasure of surround channels
+
+ This was due to a miscomputation of s->cur_channel, which led to
+ psy-based encoders using the psy coefficients for the wrong channel.
+
+ Signed-off-by: Martin Storsjö <martin@martin.st>
+
+diff --git a/libavcodec/aacenc.c b/libavcodec/aacenc.c
+index 60eca59..b2ad47b 100644
+--- a/libavcodec/aacenc.c
++++ b/libavcodec/aacenc.c
+@@ -597,7 +597,7 @@ static int aac_encode_frame(AVCodecContext *avctx, AVPacket *avpkt,
+ coeffs[ch] = cpe->ch[ch].coeffs;
+ s->psy.model->analyze(&s->psy, start_ch, coeffs, wi);
+ for (ch = 0; ch < chans; ch++) {
+- s->cur_channel = start_ch * 2 + ch;
++ s->cur_channel = start_ch + ch;
+ s->coder->search_for_quantizers(avctx, s, &cpe->ch[ch], s->lambda);
+ }
+ cpe->common_window = 0;
+@@ -613,7 +613,7 @@ static int aac_encode_frame(AVCodecContext *avctx, AVPacket *avpkt,
+ }
+ }
+ }
+- s->cur_channel = start_ch * 2;
++ s->cur_channel = start_ch;
+ if (s->options.stereo_mode && cpe->common_window) {
+ if (s->options.stereo_mode > 0) {
+ IndividualChannelStream *ics = &cpe->ch[0].ics;
+
+commit f4d0a63b5b5c682c18df3bba730f97a9067408ba
+Author: Claudio Freire <klaussfreire@gmail.com>
+Date: Sat May 4 18:36:37 2013 -0300
+
+ aacenc: Fix target bitrate for twoloop quantiser search
+
+ This fixes a case where multichannel bitrate isn't accurately
+ targetted by psy model alone, never achieving the target bitrate.
+
+ Signed-off-by: Martin Storsjö <martin@martin.st>
+
+diff --git a/libavcodec/aaccoder.c b/libavcodec/aaccoder.c
+index d65d8d9..35b98a9 100644
+--- a/libavcodec/aaccoder.c
++++ b/libavcodec/aaccoder.c
+@@ -710,7 +710,7 @@ static void search_for_quantizers_twoloop(AVCodecContext *avctx,
+ const float lambda)
+ {
+ int start = 0, i, w, w2, g;
+- int destbits = avctx->bit_rate * 1024.0 / avctx->sample_rate / avctx->channels;
++ int destbits = avctx->bit_rate * 1024.0 / avctx->sample_rate / avctx->channels * (lambda / 120.f);
+ float dists[128] = { 0 }, uplims[128];
+ float maxvals[128];
+ int fflag, minscaler;
+
+commit 7c71ada4cad3c6aab5fa24155c379465c41cfd76
+Author: Claudio Freire <klaussfreire@gmail.com>
+Date: Sat May 4 18:35:49 2013 -0300
+
+ aacenc: Fix a rounding bug in aacpsy channel bitrate computation
+
+ Signed-off-by: Martin Storsjö <martin@martin.st>
+
+diff --git a/libavcodec/aacpsy.c b/libavcodec/aacpsy.c
+index 6f1ac05..66cf6d5 100644
+--- a/libavcodec/aacpsy.c
++++ b/libavcodec/aacpsy.c
+@@ -312,7 +312,7 @@ static av_cold int psy_3gpp_init(FFPsyContext *ctx) {
+ AacPsyCoeffs *coeffs = pctx->psy_coef[j];
+ const uint8_t *band_sizes = ctx->bands[j];
+ float line_to_frequency = ctx->avctx->sample_rate / (j ? 256.f : 2048.0f);
+- float avg_chan_bits = chan_bitrate / ctx->avctx->sample_rate * (j ? 128.0f : 1024.0f);
++ float avg_chan_bits = chan_bitrate * (j ? 128.0f : 1024.0f) / ctx->avctx->sample_rate;
+ /* reference encoder uses 2.4% here instead of 60% like the spec says */
+ float bark_pe = 0.024f * PSY_3GPP_BITS_TO_PE(avg_chan_bits) / num_bark;
+ float en_spread_low = j ? PSY_3GPP_EN_SPREAD_LOW_S : PSY_3GPP_EN_SPREAD_LOW_L;
+
+
#include "x264_config.h"
--#define X264_BUILD 130
+-#define X264_BUILD 133
+/*
+ * Define the full version explicitly so that it survives a git --archive.
+ *
+#ifdef X264_VERSION
+#undef X264_VERSION
+#endif
-+#define X264_BUILD 130
-+#define X264_VERSION " r2273 b3065e6"
++#define X264_BUILD 133
++#define X264_VERSION " r2334 a3ac64b"
/* Application developers planning to link against a shared library version of
* libx264 from a Microsoft Visual Studio or similar development environment
$(eval $(call import.MODULE.defs,X264,x264,YASM PTHREADW32))
$(eval $(call import.CONTRIB.defs,X264))
-X264.FETCH.url = http://download.handbrake.fr/handbrake/contrib/x264-r2273-b3065e6.tar.gz
+X264.FETCH.url = http://download.handbrake.fr/handbrake/contrib/x264-r2334-a3ac64b.tar.gz
X264.EXTRACT.tarbase = x264
X264.CONFIGURE.deps =
X264.CONFIGURE.static =
X264.CONFIGURE.extra = --disable-cli --enable-static --enable-strip
-X264.CONFIGURE.extra += --disable-gpac --disable-avs --disable-lavf --disable-ffms --disable-swscale
+X264.CONFIGURE.extra += --disable-gpac --disable-avs --disable-lavf --disable-ffms --disable-swscale --disable-opencl
ifeq (1-mingw,$(BUILD.cross)-$(BUILD.system))
X264.CONFIGURE.extra += --cross-prefix=$(BUILD.spec)-
AS_HELP_STRING([--enable-fdk-aac], [enable fdk aac encoder]),
use_fdk_aac=yes, use_fdk_aac=no)
+AC_ARG_ENABLE(faac,
+ AS_HELP_STRING([--enable-faac], [enable faac encoder]),
+ use_faac=yes, use_faac=no)
+
AC_ARG_ENABLE(gst,
AS_HELP_STRING([--disable-gst], [disable gstreamer (live preview)]),
gst_disable=yes, gst_disable=no)
;;
esac
-HB_LIBS="-lhb -la52 -lmkv -lavresample -lavformat -lavcodec -lavutil -ldvdnav -ldvdread -lfaac -lmp3lame -lmpeg2 -lvorbis -lvorbisenc -logg -lsamplerate -lx264 -lmp4v2 -lswscale -ltheoraenc -ltheoradec -lz -lbz2 -lpthread -lbluray -lass -lfontconfig -lfreetype -lxml2"
+HB_LIBS="-lhb -la52 -lmkv -lavresample -lavformat -lavcodec -lavutil -ldvdnav -ldvdread -lmp3lame -lmpeg2 -lvorbis -lvorbisenc -logg -lsamplerate -lx264 -lmp4v2 -lswscale -ltheoraenc -ltheoradec -lz -lbz2 -lpthread -lbluray -lass -lfontconfig -lfreetype -lxml2"
if test "x$use_fdk_aac" = "xyes" ; then
HB_LIBS+=" -lfdk-aac"
fi
+if test "x$use_faac" = "xyes" ; then
+ HB_LIBS+=" -lfaac"
+fi
+
AC_SUBST(HB_LIBS)
AC_SUBST(GHB_TOOLS_CFLAGS)
AC_SUBST(GHB_TOOLS_LIBS)
ifeq (1,$(FEATURE.fdk_aac))
GTK.CONFIGURE.extra += --enable-fdk-aac
endif
+
+ifeq (1,$(FEATURE.faac))
+ GTK.CONFIGURE.extra += --enable-faac
+endif
}
}
+static void enable_quality_widget(signal_user_data_t *ud, int acodec)
+{
+ GtkWidget *widget1, *widget2, *widget3;
+
+ widget1 = GHB_WIDGET(ud->builder, "AudioTrackQualityEnable");
+ widget2 = GHB_WIDGET(ud->builder, "AudioTrackQualityValue");
+ widget3 = GHB_WIDGET(ud->builder, "AudioTrackQuality");
+ if (hb_audio_quality_get_default(acodec) == HB_INVALID_AUDIO_QUALITY)
+ {
+ gtk_widget_hide(widget1);
+ gtk_widget_hide(widget2);
+ gtk_widget_hide(widget3);
+ }
+ else
+ {
+ gtk_widget_show(widget1);
+ gtk_widget_show(widget2);
+ gtk_widget_show(widget3);
+ }
+}
+
G_MODULE_EXPORT void
audio_codec_changed_cb(GtkWidget *widget, signal_user_data_t *ud)
{
acodec_code = ghb_lookup_combo_int("AudioEncoder", gval);
ghb_value_free(gval);
+ enable_quality_widget(ud, acodec_code);
if (block_updates)
{
prev_acodec = acodec_code;
ghb_set_scale_settings(settings, GHB_PIC_KEEP_PAR|GHB_PIC_USE_MAX);
ghb_settings_set_int(settings, "angle_count", title->angle_count);
+
+ ghb_settings_set_string(settings, "MetaName", title->name);
+ if (title->metadata)
+ {
+ if (title->metadata->name)
+ {
+ ghb_settings_set_string(settings, "MetaName",
+ title->metadata->name);
+ }
+ ghb_settings_set_string(settings, "MetaArtist",
+ title->metadata->artist);
+ ghb_settings_set_string(settings, "MetaReleaseDate",
+ title->metadata->release_date);
+ ghb_settings_set_string(settings, "MetaComment",
+ title->metadata->comment);
+ if (!title->metadata->name && title->metadata->album)
+ {
+ ghb_settings_set_string(settings, "MetaName",
+ title->metadata->album);
+ }
+ ghb_settings_set_string(settings, "MetaAlbumArtist",
+ title->metadata->album_artist);
+ ghb_settings_set_string(settings, "MetaGenre",
+ title->metadata->genre);
+ ghb_settings_set_string(settings, "MetaDescription",
+ title->metadata->description);
+ ghb_settings_set_string(settings, "MetaLongDescription",
+ title->metadata->long_description);
+ }
}
update_chapter_list_settings(settings);
ghb_set_pref_audio_settings(titleindex, settings);
DepEntry("VideoEncoder", "x264VideoSettings", "x264", False, True),
DepEntry("VideoEncoder", "lavc_mpeg4_tab", "ffmpeg|ffmpeg4|ffmpeg2", False, True),
DepEntry("VideoEncoder", "Mp4iPodCompatible", "x264", False, False),
- DepEntry("AudioTrackQualityEnable", "AudioTrackQuality", "FALSE", True, False),
- DepEntry("AudioTrackQualityEnable", "AudioTrackQualityValue", "FALSE", True, False),
DepEntry("AudioTrackQualityEnable", "AudioBitrateLabel", "TRUE", True, False),
DepEntry("AudioTrackQualityEnable", "AudioBitrate", "TRUE", True, False),
- DepEntry("AudioEncoderActual", "AudioTrackQualityEnable", "lame|vorbis", False, True),
- DepEntry("AudioEncoderActual", "AudioTrackQuality", "lame|vorbis", False, True),
- DepEntry("AudioEncoderActual", "AudioTrackQualityValue", "lame|vorbis", False, True),
DepEntry("AudioEncoderActual", "AudioBitrateLabel", "copy:mp3|copy:aac|copy:ac3|copy:dts|copy:dtshd", True, False),
DepEntry("AudioEncoderActual", "AudioBitrate", "copy:mp3|copy:aac|copy:ac3|copy:dts|copy:dtshd", True, False),
DepEntry("AudioEncoderActual", "AudioSamplerateLabel", "copy:mp3|copy:aac|copy:ac3|copy:dts|copy:dtshd", True, False),
const gchar *lin_val;
} value_map_t;
-static value_map_t vcodec_xlat_compat[] =
-{
- {"MPEG-4 (FFmpeg)", "ffmpeg"},
- {"MPEG-4 (XviD)", "ffmpeg4"},
- {NULL,NULL}
-};
-
-static value_map_t *vcodec_xlat;
-
-static value_map_t acodec_xlat_compat[] =
-{
- {"AAC (CoreAudio)", "faac"},
- {"HE-AAC (CoreAudio)", "faac"},
- {"AC3 (ffmpeg)", "ac3"},
- {"AC3", "ac3"},
- {"MP3 Passthru", "mp3pass"},
- {"AAC Passthru", "aacpass"},
- {"AC3 Passthru", "ac3pass"},
- {"DTS Passthru", "dtspass"},
- {"DTS-HD Passthru", "dtshdpass"},
- {"Auto Passthru", "auto"},
- {NULL,NULL}
-};
-
-static value_map_t *acodec_xlat;
-
-static value_map_t * create_video_encoder_xlat_tbl(value_map_t *compat)
-{
- value_map_t *out;
- int cc, ii, size = 0;
-
- for (cc = 0; compat[cc].mac_val != NULL; cc++);
-
- const hb_encoder_t *enc;
- for (enc = hb_video_encoder_get_next(NULL); enc != NULL;
- enc = hb_video_encoder_get_next(enc))
- {
- size++;
- }
- out = calloc(cc + size + 1, sizeof(value_map_t));
-
- for (ii = 0, enc = hb_video_encoder_get_next(NULL); enc != NULL;
- ii++, enc = hb_video_encoder_get_next(enc))
- {
- out[ii].mac_val = enc->name;
- out[ii].lin_val = enc->short_name;
- }
-
- for (ii = 0; ii < cc; ii++)
- out[ii+size] = compat[ii];
-
- return out;
-}
-
-static value_map_t * create_audio_encoder_xlat_tbl(value_map_t *compat)
-{
- value_map_t *out;
- int cc, ii, size = 0;
-
- for (cc = 0; compat[cc].mac_val != NULL; cc++);
-
- const hb_encoder_t *enc;
- for (enc = hb_audio_encoder_get_next(NULL); enc != NULL;
- enc = hb_audio_encoder_get_next(enc))
- {
- size++;
- }
- out = calloc(cc + size + 1, sizeof(value_map_t));
-
- for (ii = 0, enc = hb_audio_encoder_get_next(NULL); enc != NULL;
- ii++, enc = hb_audio_encoder_get_next(enc))
- {
- out[ii].mac_val = enc->name;
- out[ii].lin_val = enc->short_name;
- }
-
- for (ii = 0; ii < cc; ii++)
- out[ii+size] = compat[ii];
-
- return out;
-}
-
-static value_map_t * create_mix_xlat_tbl(value_map_t *compat)
-{
- value_map_t *out;
- int cc, ii, size = 0;;
-
- for (cc = 0; compat[cc].mac_val != NULL; cc++);
-
- const hb_mixdown_t *mix;
- for (mix = hb_mixdown_get_next(NULL); mix != NULL;
- mix = hb_mixdown_get_next(mix))
- {
- size++;
- }
- out = calloc(cc + size + 1, sizeof(value_map_t));
-
- for (ii = 0, mix = hb_mixdown_get_next(NULL); mix != NULL;
- ii++, mix = hb_mixdown_get_next(mix))
- {
- out[ii].mac_val = mix->name;
- out[ii].lin_val = mix->short_name;
- }
-
- for (ii = 0; ii < cc; ii++)
- out[ii+size] = compat[ii];
-
- return out;
-}
-
-value_map_t framerate_xlat[] =
-{
- {"Same as source", "source"},
- {"5", "5"},
- {"10", "10"},
- {"12", "12"},
- {"15", "15"},
- {"23.976 (NTSC Film)", "23.976"},
- {"24", "24"},
- {"25 (PAL Film/Video)", "25"},
- {"29.97 (NTSC Video)", "29.97"},
- {"30", "30"},
- {"50", "50"},
- {"59.94", "59.94"},
- {"60", "60"},
- {NULL, NULL}
-};
-
-value_map_t samplerate_xlat[] =
-{
- {"Auto", "source"},
- {"22.05", "22.05"},
- {"24", "24"},
- {"32", "32"},
- {"44.1", "44.1"},
- {"48", "48"},
- {NULL, NULL}
-};
-
-// mix translation table filed in with hb_audio_mixdowns table contents
-value_map_t *mix_xlat;
-
-// Backwards compatibility mappings for audio mix
-value_map_t mix_xlat_compat[] =
-{
- {"6-channel discrete", "5point1"},
- {"AC3 Passthru", "none"},
- {"DTS Passthru", "none"},
- {"DTS-HD Passthru", "none"},
- {NULL, NULL}
-};
-
value_map_t deint_xlat[] =
{
{"0", "off"},
}
static GValue*
-export_value_xlat_container(GValue *lin_val)
+export_value_video_framerate(GValue *lin_val)
+{
+ GValue *sval = NULL;
+ gchar *str;
+ const gchar *fr;
+
+ str = ghb_value_string(lin_val);
+ fr = hb_video_framerate_get_name(hb_video_framerate_get_from_name(str));
+ g_free(str);
+ if (fr != NULL)
+ sval = ghb_string_value_new(fr);
+
+ return sval;
+}
+
+static GValue*
+export_value_audio_samplerate(GValue *lin_val)
+{
+ GValue *sval = NULL;
+ gchar *str;
+ const gchar *sr;
+
+ str = ghb_value_string(lin_val);
+ sr = hb_audio_samplerate_get_name(hb_audio_samplerate_get_from_name(str));
+ g_free(str);
+ if (sr != NULL)
+ sval = ghb_string_value_new(sr);
+
+ return sval;
+}
+
+static GValue*
+export_value_mixdown(GValue *lin_val)
+{
+ GValue *sval = NULL;
+ gchar *str;
+ const gchar *mix;
+
+ str = ghb_value_string(lin_val);
+ mix = hb_mixdown_get_name(hb_mixdown_get_from_name(str));
+ g_free(str);
+ if (mix != NULL)
+ sval = ghb_string_value_new(mix);
+
+ return sval;
+}
+
+static GValue*
+export_value_video_encoder(GValue *lin_val)
+{
+ GValue *sval = NULL;
+ gchar *str;
+ const gchar *enc;
+
+ str = ghb_value_string(lin_val);
+ enc = hb_video_encoder_get_name(hb_video_encoder_get_from_name(str));
+ g_free(str);
+ if (enc != NULL)
+ sval = ghb_string_value_new(enc);
+
+ return sval;
+}
+
+static GValue*
+export_value_audio_encoder(GValue *lin_val)
+{
+ GValue *sval = NULL;
+ gchar *str;
+ const gchar *enc;
+
+ str = ghb_value_string(lin_val);
+ enc = hb_audio_encoder_get_name(hb_audio_encoder_get_from_name(str));
+ g_free(str);
+ if (enc != NULL)
+ sval = ghb_string_value_new(enc);
+
+ return sval;
+}
+
+static GValue*
+export_value_container(GValue *lin_val)
{
GValue *sval = NULL;
gchar *str;
const gchar *mux;
- int imux;
str = ghb_value_string(lin_val);
- imux = hb_container_get_from_name(str);
+ mux = hb_container_get_name(hb_container_get_from_name(str));
g_free(str);
- mux = hb_container_get_name(imux);
if (mux != NULL)
sval = ghb_string_value_new(mux);
key = "VideoEncoder";
lin_val = ghb_dict_lookup(dict, key);
- gval = export_value_xlat2(vcodec_xlat, lin_val, G_TYPE_STRING);
+ gval = export_value_video_encoder(lin_val);
if (gval)
ghb_dict_insert(dict, g_strdup(key), gval);
key = "FileFormat";
lin_val = ghb_dict_lookup(dict, key);
- gval = export_value_xlat_container(lin_val);
+ gval = export_value_container(lin_val);
if (gval)
ghb_dict_insert(dict, g_strdup(key), gval);
key = "VideoFramerate";
lin_val = ghb_dict_lookup(dict, key);
- gval = export_value_xlat2(framerate_xlat, lin_val, G_TYPE_STRING);
+ gval = export_value_video_framerate(lin_val);
if (gval)
ghb_dict_insert(dict, g_strdup(key), gval);
key = "PictureDetelecine";
key = "AudioEncoderFallback";
lin_val = ghb_dict_lookup(dict, key);
- gval = export_value_xlat2(acodec_xlat, lin_val, G_TYPE_STRING);
+ gval = export_value_audio_encoder(lin_val);
if (gval)
ghb_dict_insert(dict, g_strdup(key), gval);
ghb_dict_insert(adict, g_strdup(key), gval);
key = "AudioEncoder";
lin_val = ghb_dict_lookup(adict, key);
- gval = export_value_xlat2(acodec_xlat, lin_val, G_TYPE_STRING);
+ gval = export_value_audio_encoder(lin_val);
if (gval)
ghb_dict_insert(adict, g_strdup(key), gval);
key = "AudioSamplerate";
lin_val = ghb_dict_lookup(adict, key);
- gval = export_value_xlat2(samplerate_xlat, lin_val, G_TYPE_STRING);
+ gval = export_value_audio_samplerate(lin_val);
if (gval)
ghb_dict_insert(adict, g_strdup(key), gval);
key = "AudioMixdown";
lin_val = ghb_dict_lookup(adict, key);
- gval = export_value_xlat2(mix_xlat, lin_val, G_TYPE_STRING);
+ gval = export_value_mixdown(lin_val);
if (gval)
ghb_dict_insert(adict, g_strdup(key), gval);
}
}
static GValue*
-import_value_xlat_container(GValue *mac_val)
+import_value_video_framerate(GValue *mac_val)
{
GValue *sval = NULL;
gchar *str;
- const gchar *mux;
- int imux;
+ const gchar *fr;
str = ghb_value_string(mac_val);
- mux = hb_container_sanitize_name(str);
+ fr = hb_video_framerate_get_name(hb_video_framerate_get_from_name(str));
g_free(str);
- if (mux == NULL)
- {
- imux = hb_container_get_from_extension("mp4");
- }
- else
- {
- imux = hb_container_get_from_name(mux);
- }
- mux = hb_container_get_short_name(imux);
+ if (fr != NULL)
+ sval = ghb_string_value_new(fr);
+
+ return sval;
+}
+
+static GValue*
+import_value_audio_samplerate(GValue *mac_val)
+{
+ GValue *sval = NULL;
+ gchar *str;
+ const gchar *sr;
+
+ str = ghb_value_string(mac_val);
+ sr = hb_audio_samplerate_get_name(hb_audio_samplerate_get_from_name(str));
+ g_free(str);
+
+ if (sr != NULL)
+ sval = ghb_string_value_new(sr);
+
+ return sval;
+}
+
+static GValue*
+import_value_mixdown(GValue *mac_val)
+{
+ GValue *sval = NULL;
+ gchar *str;
+ const gchar *mix;
+
+ str = ghb_value_string(mac_val);
+ mix = hb_mixdown_get_short_name(hb_mixdown_get_from_name(str));
+ g_free(str);
+
+ if (mix != NULL)
+ sval = ghb_string_value_new(mix);
+
+ return sval;
+}
+
+static GValue*
+import_value_video_encoder(GValue *mac_val)
+{
+ GValue *sval = NULL;
+ gchar *str;
+ const gchar *enc;
+
+ str = ghb_value_string(mac_val);
+ enc = hb_video_encoder_get_short_name(hb_video_encoder_get_from_name(str));
+ g_free(str);
+
+ if (enc != NULL)
+ sval = ghb_string_value_new(enc);
+
+ return sval;
+}
+
+static GValue*
+import_value_audio_encoder(GValue *mac_val)
+{
+ GValue *sval = NULL;
+ gchar *str;
+ const gchar *enc;
+
+ str = ghb_value_string(mac_val);
+ enc = hb_audio_encoder_get_short_name(hb_audio_encoder_get_from_name(str));
+ g_free(str);
+
+ if (enc != NULL)
+ sval = ghb_string_value_new(enc);
+
+ return sval;
+}
+
+static GValue*
+import_value_container(GValue *mac_val)
+{
+ GValue *sval = NULL;
+ gchar *str;
+ const gchar *mux;
+
+ str = ghb_value_string(mac_val);
+ mux = hb_container_get_short_name(hb_container_get_from_name(str));
+ g_free(str);
if (mux != NULL)
sval = ghb_string_value_new(mux);
defaults = plist_get_dict(internalPlist, "Presets");
key = "VideoEncoder";
mac_val = ghb_dict_lookup(dict, key);
- gval = import_value_xlat2(defaults, vcodec_xlat, key, mac_val);
+ gval = import_value_video_encoder(mac_val);
if (gval)
ghb_dict_insert(dict, g_strdup(key), gval);
key = "FileFormat";
mac_val = ghb_dict_lookup(dict, key);
- gval = import_value_xlat_container(mac_val);
+ gval = import_value_container(mac_val);
if (gval)
ghb_dict_insert(dict, g_strdup(key), gval);
key = "VideoFramerate";
mac_val = ghb_dict_lookup(dict, key);
- gval = import_value_xlat2(defaults, framerate_xlat, key, mac_val);
+ gval = import_value_video_framerate(mac_val);
if (gval)
ghb_dict_insert(dict, g_strdup(key), gval);
key = "PictureDetelecine";
key = "AudioEncoderFallback";
mac_val = ghb_dict_lookup(dict, key);
- gval = import_value_xlat2(defaults, acodec_xlat, key, mac_val);
+ gval = import_value_audio_encoder(mac_val);
if (gval)
ghb_dict_insert(dict, g_strdup(key), gval);
ghb_dict_insert(adict, g_strdup(key), gval);
key = "AudioEncoder";
mac_val = ghb_dict_lookup(adict, key);
- gval = import_value_xlat2(adefaults, acodec_xlat, key, mac_val);
+ gval = import_value_audio_encoder(mac_val);
+ if (gval == NULL)
+ gval = ghb_value_dup(ghb_dict_lookup(adefaults, key));
if (gval)
ghb_dict_insert(adict, g_strdup(key), gval);
key = "AudioSamplerate";
mac_val = ghb_dict_lookup(adict, key);
- gval = import_value_xlat2(adefaults, samplerate_xlat, key, mac_val);
+ gval = import_value_audio_samplerate(mac_val);
+ if (gval == NULL)
+ gval = ghb_value_dup(ghb_dict_lookup(adefaults, key));
if (gval)
ghb_dict_insert(adict, g_strdup(key), gval);
key = "AudioMixdown";
mac_val = ghb_dict_lookup(adict, key);
- gval = import_value_xlat2(adefaults, mix_xlat, key, mac_val);
+ gval = import_value_mixdown(mac_val);
+ if (gval == NULL)
+ gval = ghb_value_dup(ghb_dict_lookup(adefaults, key));
if (gval)
ghb_dict_insert(adict, g_strdup(key), gval);
void
ghb_presets_load(signal_user_data_t *ud)
{
- // Create translation tables from libhb tables
- mix_xlat = create_mix_xlat_tbl(mix_xlat_compat);
- acodec_xlat = create_audio_encoder_xlat_tbl(acodec_xlat_compat);
- vcodec_xlat = create_video_encoder_xlat_tbl(vcodec_xlat_compat);
-
presetsPlist = load_plist("presets");
if (presetsPlist == NULL)
{
<key>x264UseAdvancedOptions</key>
<integer>0</integer>
</dict>
+ <dict>
+ <key>AudioAllowAACPass</key>
+ <integer>1</integer>
+ <key>AudioAllowAC3Pass</key>
+ <integer>1</integer>
+ <key>AudioAllowDTSHDPass</key>
+ <integer>1</integer>
+ <key>AudioAllowDTSPass</key>
+ <integer>1</integer>
+ <key>AudioAllowMP3Pass</key>
+ <integer>1</integer>
+ <key>AudioEncoderFallback</key>
+ <string>AC3 (ffmpeg)</string>
+ <key>AudioList</key>
+ <array>
+ <dict>
+ <key>AudioBitrate</key>
+ <string>128</string>
+ <key>AudioEncoder</key>
+ <string>AAC (faac)</string>
+ <key>AudioMixdown</key>
+ <string>Dolby Pro Logic II</string>
+ <key>AudioSamplerate</key>
+ <string>Auto</string>
+ <key>AudioTrack</key>
+ <integer>1</integer>
+ <key>AudioTrackDRCSlider</key>
+ <real>0.0</real>
+ <key>AudioTrackGainSlider</key>
+ <real>0.0</real>
+ </dict>
+ </array>
+ <key>ChapterMarkers</key>
+ <integer>0</integer>
+ <key>Default</key>
+ <integer>0</integer>
+ <key>FileFormat</key>
+ <string>MP4 file</string>
+ <key>Folder</key>
+ <false/>
+ <key>Mp4HttpOptimize</key>
+ <integer>0</integer>
+ <key>Mp4LargeFile</key>
+ <integer>0</integer>
+ <key>Mp4iPodCompatible</key>
+ <integer>0</integer>
+ <key>PictureAutoCrop</key>
+ <integer>1</integer>
+ <key>PictureBottomCrop</key>
+ <integer>0</integer>
+ <key>PictureDeblock</key>
+ <integer>0</integer>
+ <key>PictureDecomb</key>
+ <integer>0</integer>
+ <key>PictureDecombCustom</key>
+ <string></string>
+ <key>PictureDecombDeinterlace</key>
+ <integer>1</integer>
+ <key>PictureDeinterlace</key>
+ <integer>0</integer>
+ <key>PictureDeinterlaceCustom</key>
+ <string></string>
+ <key>PictureDenoise</key>
+ <integer>0</integer>
+ <key>PictureDenoiseCustom</key>
+ <string></string>
+ <key>PictureDetelecine</key>
+ <integer>0</integer>
+ <key>PictureDetelecineCustom</key>
+ <string></string>
+ <key>PictureHeight</key>
+ <integer>720</integer>
+ <key>PictureKeepRatio</key>
+ <integer>0</integer>
+ <key>PictureLeftCrop</key>
+ <integer>0</integer>
+ <key>PictureModulus</key>
+ <integer>2</integer>
+ <key>PicturePAR</key>
+ <integer>2</integer>
+ <key>PictureRightCrop</key>
+ <integer>0</integer>
+ <key>PictureTopCrop</key>
+ <integer>0</integer>
+ <key>PictureWidth</key>
+ <integer>1280</integer>
+ <key>PresetDescription</key>
+ <string>HandBrake's preset for Windows Phone 8 devices</string>
+ <key>PresetName</key>
+ <string>Windows Phone 8</string>
+ <key>Subtitles</key>
+ <string>None</string>
+ <key>Type</key>
+ <integer>0</integer>
+ <key>UsesPictureFilters</key>
+ <integer>1</integer>
+ <key>UsesPictureSettings</key>
+ <integer>1</integer>
+ <key>VideoAvgBitrate</key>
+ <string>2500</string>
+ <key>VideoEncoder</key>
+ <string>H.264 (x264)</string>
+ <key>VideoFramerate</key>
+ <string>30</string>
+ <key>VideoFramerateMode</key>
+ <string>pfr</string>
+ <key>VideoGrayScale</key>
+ <integer>0</integer>
+ <key>VideoQualitySlider</key>
+ <real>22</real>
+ <key>VideoQualityType</key>
+ <integer>2</integer>
+ <key>VideoTurboTwoPass</key>
+ <integer>0</integer>
+ <key>VideoTwoPass</key>
+ <integer>0</integer>
+ <key>h264Level</key>
+ <string>3.1</string>
+ <key>h264Profile</key>
+ <string>main</string>
+ <key>lavcOption</key>
+ <string></string>
+ <key>x264Option</key>
+ <string></string>
+ <key>x264OptionExtra</key>
+ <string></string>
+ <key>x264Preset</key>
+ <string>medium</string>
+ <key>x264Tune</key>
+ <string></string>
+ <key>x264UseAdvancedOptions</key>
+ <integer>0</integer>
+ </dict>
</array>
<key>Default</key>
<integer>0</integer>
<key>Folder</key>
<true/>
<key>PresetBuildNumber</key>
- <integer>2013030401</integer>
+ <integer>2013061301</integer>
<key>PresetName</key>
<string>Devices</string>
<key>Type</key>
<key>Folder</key>
<true/>
<key>PresetBuildNumber</key>
- <integer>2013030401</integer>
+ <integer>2013061301</integer>
<key>PresetName</key>
<string>Regular</string>
<key>Type</key>
hb_mixdown_t *hb_audio_mixdowns_last_item = NULL;
hb_mixdown_internal_t hb_audio_mixdowns[] =
{
- // legacy mixdowns (disabled)
- { { "AC3 Passthru", "ac3pass", HB_AMIXDOWN_NONE, }, NULL, 0, },
- { { "DTS Passthru", "dtspass", HB_AMIXDOWN_NONE, }, NULL, 0, },
- { { "DTS-HD Passthru", "dtshdpass", HB_AMIXDOWN_NONE, }, NULL, 0, },
+ // legacy mixdowns, back to HB 0.9.4 whenever possible (disabled)
+ { { "AC3 Passthru", "", HB_AMIXDOWN_NONE, }, NULL, 0, },
+ { { "DTS Passthru", "", HB_AMIXDOWN_NONE, }, NULL, 0, },
+ { { "DTS-HD Passthru", "", HB_AMIXDOWN_NONE, }, NULL, 0, },
{ { "6-channel discrete", "6ch", HB_AMIXDOWN_5POINT1, }, NULL, 0, },
// actual mixdowns
{ { "None", "none", HB_AMIXDOWN_NONE, }, NULL, 1, },
hb_encoder_t *hb_video_encoders_last_item = NULL;
hb_encoder_internal_t hb_video_encoders[] =
{
- // legacy encoders, all the way back to HB 0.7.1 (disabled)
- { { "x264 (Main profile)", "", HB_VCODEC_X264, HB_MUX_MASK_MP4|HB_MUX_MASK_MKV, }, NULL, 0, HB_GID_VCODEC_H264, },
- { { "x264 (Baseline profile)", "", HB_VCODEC_X264, HB_MUX_MASK_MP4|HB_MUX_MASK_MKV, }, NULL, 0, HB_GID_VCODEC_H264, },
- { { "x264 (h.264 Main)", "", HB_VCODEC_X264, HB_MUX_MASK_MP4|HB_MUX_MASK_MKV, }, NULL, 0, HB_GID_VCODEC_H264, },
- { { "x264 (h.264 iPod)", "", HB_VCODEC_X264, HB_MUX_MASK_MP4|HB_MUX_MASK_MKV, }, NULL, 0, HB_GID_VCODEC_H264, },
- { { "", "x264b13", HB_VCODEC_X264, HB_MUX_MASK_MP4|HB_MUX_MASK_MKV, }, NULL, 0, HB_GID_VCODEC_H264, },
- { { "", "x264b30", HB_VCODEC_X264, HB_MUX_MASK_MP4|HB_MUX_MASK_MKV, }, NULL, 0, HB_GID_VCODEC_H264, },
- { { "XviD", "xvid", HB_VCODEC_FFMPEG_MPEG4, HB_MUX_MASK_MP4|HB_MUX_MASK_MKV, }, NULL, 0, HB_GID_VCODEC_MPEG4, },
- { { "MPEG-4 (XviD)", "", HB_VCODEC_FFMPEG_MPEG4, HB_MUX_MASK_MP4|HB_MUX_MASK_MKV, }, NULL, 0, HB_GID_VCODEC_MPEG4, },
+ // legacy encoders, back to HB 0.9.4 whenever possible (disabled)
{ { "FFmpeg", "ffmpeg", HB_VCODEC_FFMPEG_MPEG4, HB_MUX_MASK_MP4|HB_MUX_MASK_MKV, }, NULL, 0, HB_GID_VCODEC_MPEG4, },
+ { { "MPEG-4 (FFmpeg)", "ffmpeg4", HB_VCODEC_FFMPEG_MPEG4, HB_MUX_MASK_MP4|HB_MUX_MASK_MKV, }, NULL, 0, HB_GID_VCODEC_MPEG4, },
+ { { "MPEG-2 (FFmpeg)", "ffmpeg2", HB_VCODEC_FFMPEG_MPEG2, HB_MUX_MASK_MP4|HB_MUX_MASK_MKV, }, NULL, 0, HB_GID_VCODEC_MPEG2, },
+ { { "VP3 (Theora)", "libtheora", HB_VCODEC_THEORA, HB_MUX_MASK_MKV, }, NULL, 0, HB_GID_VCODEC_THEORA, },
// actual encoders
{ { "H.264 (x264)", "x264", HB_VCODEC_X264, HB_MUX_MASK_MP4|HB_MUX_MASK_MKV, }, NULL, 1, HB_GID_VCODEC_H264, },
{ { "H.264 (Intel QSV)", "qsv_h264",HB_VCODEC_QSV_H264, HB_MUX_MASK_MP4|HB_MUX_MASK_MKV, }, NULL, 1, HB_GID_VCODEC_H264, },
- { { "MPEG-4 (FFmpeg)", "ffmpeg4", HB_VCODEC_FFMPEG_MPEG4, HB_MUX_MASK_MP4|HB_MUX_MASK_MKV, }, NULL, 1, HB_GID_VCODEC_MPEG4, },
- { { "MPEG-2 (FFmpeg)", "ffmpeg2", HB_VCODEC_FFMPEG_MPEG2, HB_MUX_MASK_MP4|HB_MUX_MASK_MKV, }, NULL, 1, HB_GID_VCODEC_MPEG2, },
- { { "VP3 (Theora)", "theora", HB_VCODEC_THEORA, HB_MUX_MASK_MKV, }, NULL, 1, HB_GID_VCODEC_THEORA, },
+ { { "MPEG-4", "mpeg4", HB_VCODEC_FFMPEG_MPEG4, HB_MUX_MASK_MP4|HB_MUX_MASK_MKV, }, NULL, 1, HB_GID_VCODEC_MPEG4, },
+ { { "MPEG-2", "mpeg2", HB_VCODEC_FFMPEG_MPEG2, HB_MUX_MASK_MP4|HB_MUX_MASK_MKV, }, NULL, 1, HB_GID_VCODEC_MPEG2, },
+ { { "Theora", "theora", HB_VCODEC_THEORA, HB_MUX_MASK_MKV, }, NULL, 1, HB_GID_VCODEC_THEORA, },
};
int hb_video_encoders_count = sizeof(hb_video_encoders) / sizeof(hb_video_encoders[0]);
static int hb_video_encoder_is_enabled(int encoder)
hb_encoder_t *hb_audio_encoders_last_item = NULL;
hb_encoder_internal_t hb_audio_encoders[] =
{
- // legacy encoders (disabled)
- { { "AC3", "ac3", HB_ACODEC_AC3, HB_MUX_MASK_MP4|HB_MUX_MASK_MKV, }, NULL, 0, HB_GID_ACODEC_AC3, },
- { { "AC3 (pass-thru)", "ac3pass", HB_ACODEC_AC3_PASS, HB_MUX_MASK_MP4|HB_MUX_MASK_MKV, }, NULL, 0, HB_GID_ACODEC_AC3_PASS, },
- { { "DTS (pass-thru)", "dtspass", HB_ACODEC_DCA_PASS, HB_MUX_MASK_MP4|HB_MUX_MASK_MKV, }, NULL, 0, HB_GID_ACODEC_DTS_PASS, },
+ // legacy encoders, back to HB 0.9.4 whenever possible (disabled)
{ { "", "dts", HB_ACODEC_DCA_PASS, HB_MUX_MASK_MP4|HB_MUX_MASK_MKV, }, NULL, 0, HB_GID_ACODEC_DTS_PASS, },
+ { { "AAC (ffmpeg)", "ffaac", HB_ACODEC_FFAAC, HB_MUX_MASK_MP4|HB_MUX_MASK_MKV, }, NULL, 0, HB_GID_ACODEC_AAC, },
+ { { "AC3 (ffmpeg)", "ffac3", HB_ACODEC_AC3, HB_MUX_MASK_MP4|HB_MUX_MASK_MKV, }, NULL, 0, HB_GID_ACODEC_AC3, },
+ { { "MP3 (lame)", "lame", HB_ACODEC_LAME, HB_MUX_MASK_MP4|HB_MUX_MASK_MKV, }, NULL, 0, HB_GID_ACODEC_MP3, },
+ { { "Vorbis (vorbis)", "libvorbis", HB_ACODEC_VORBIS, HB_MUX_MASK_MKV, }, NULL, 0, HB_GID_ACODEC_VORBIS, },
+ { { "FLAC (ffmpeg)", "ffflac", HB_ACODEC_FFFLAC, HB_MUX_MASK_MKV, }, NULL, 0, HB_GID_ACODEC_FLAC, },
+ { { "FLAC (24-bit)", "ffflac24", HB_ACODEC_FFFLAC24, HB_MUX_MASK_MKV, }, NULL, 0, HB_GID_ACODEC_FLAC, },
// actual encoders
{ { "AAC (CoreAudio)", "ca_aac", HB_ACODEC_CA_AAC, HB_MUX_MASK_MP4|HB_MUX_MASK_MKV, }, NULL, 1, HB_GID_ACODEC_AAC, },
{ { "HE-AAC (CoreAudio)", "ca_haac", HB_ACODEC_CA_HAAC, HB_MUX_MASK_MP4|HB_MUX_MASK_MKV, }, NULL, 1, HB_GID_ACODEC_AAC_HE, },
+ { { "AAC (faac)", "faac", HB_ACODEC_FAAC, HB_MUX_MASK_MP4|HB_MUX_MASK_MKV, }, NULL, 1, HB_GID_ACODEC_AAC, },
+ { { "AAC (avcodec)", "av_aac", HB_ACODEC_FFAAC, HB_MUX_MASK_MP4|HB_MUX_MASK_MKV, }, NULL, 1, HB_GID_ACODEC_AAC, },
{ { "AAC (FDK)", "fdk_aac", HB_ACODEC_FDK_AAC, HB_MUX_MASK_MP4|HB_MUX_MASK_MKV, }, NULL, 1, HB_GID_ACODEC_AAC, },
{ { "HE-AAC (FDK)", "fdk_haac", HB_ACODEC_FDK_HAAC, HB_MUX_MASK_MP4|HB_MUX_MASK_MKV, }, NULL, 1, HB_GID_ACODEC_AAC_HE, },
- { { "AAC (faac)", "faac", HB_ACODEC_FAAC, HB_MUX_MASK_MP4|HB_MUX_MASK_MKV, }, NULL, 1, HB_GID_ACODEC_AAC, },
- { { "AAC (ffmpeg)", "ffaac", HB_ACODEC_FFAAC, HB_MUX_MASK_MP4|HB_MUX_MASK_MKV, }, NULL, 1, HB_GID_ACODEC_AAC, },
{ { "AAC Passthru", "copy:aac", HB_ACODEC_AAC_PASS, HB_MUX_MASK_MP4|HB_MUX_MASK_MKV, }, NULL, 1, HB_GID_ACODEC_AAC_PASS, },
- { { "AC3 (ffmpeg)", "ffac3", HB_ACODEC_AC3, HB_MUX_MASK_MP4|HB_MUX_MASK_MKV, }, NULL, 1, HB_GID_ACODEC_AC3, },
+ { { "AC3", "ac3", HB_ACODEC_AC3, HB_MUX_MASK_MP4|HB_MUX_MASK_MKV, }, NULL, 1, HB_GID_ACODEC_AC3, },
{ { "AC3 Passthru", "copy:ac3", HB_ACODEC_AC3_PASS, HB_MUX_MASK_MP4|HB_MUX_MASK_MKV, }, NULL, 1, HB_GID_ACODEC_AC3_PASS, },
{ { "DTS Passthru", "copy:dts", HB_ACODEC_DCA_PASS, HB_MUX_MASK_MP4|HB_MUX_MASK_MKV, }, NULL, 1, HB_GID_ACODEC_DTS_PASS, },
{ { "DTS-HD Passthru", "copy:dtshd", HB_ACODEC_DCA_HD_PASS, HB_MUX_MASK_MP4|HB_MUX_MASK_MKV, }, NULL, 1, HB_GID_ACODEC_DTSHD_PASS, },
- { { "MP3 (lame)", "lame", HB_ACODEC_LAME, HB_MUX_MASK_MP4|HB_MUX_MASK_MKV, }, NULL, 1, HB_GID_ACODEC_MP3, },
+ { { "MP3", "mp3", HB_ACODEC_LAME, HB_MUX_MASK_MP4|HB_MUX_MASK_MKV, }, NULL, 1, HB_GID_ACODEC_MP3, },
{ { "MP3 Passthru", "copy:mp3", HB_ACODEC_MP3_PASS, HB_MUX_MASK_MP4|HB_MUX_MASK_MKV, }, NULL, 1, HB_GID_ACODEC_MP3_PASS, },
- { { "Vorbis (vorbis)", "vorbis", HB_ACODEC_VORBIS, HB_MUX_MASK_MKV, }, NULL, 1, HB_GID_ACODEC_VORBIS, },
- { { "FLAC (ffmpeg)", "ffflac", HB_ACODEC_FFFLAC, HB_MUX_MASK_MKV, }, NULL, 1, HB_GID_ACODEC_FLAC, },
- { { "FLAC (24-bit)", "ffflac24", HB_ACODEC_FFFLAC24, HB_MUX_MASK_MKV, }, NULL, 1, HB_GID_ACODEC_FLAC, },
+ { { "Vorbis", "vorbis", HB_ACODEC_VORBIS, HB_MUX_MASK_MKV, }, NULL, 1, HB_GID_ACODEC_VORBIS, },
+ { { "FLAC 16-bit", "flac16", HB_ACODEC_FFFLAC, HB_MUX_MASK_MKV, }, NULL, 1, HB_GID_ACODEC_FLAC, },
+ { { "FLAC 24-bit", "flac24", HB_ACODEC_FFFLAC24, HB_MUX_MASK_MKV, }, NULL, 1, HB_GID_ACODEC_FLAC, },
{ { "Auto Passthru", "copy", HB_ACODEC_AUTO_PASS, HB_MUX_MASK_MP4|HB_MUX_MASK_MKV, }, NULL, 1, HB_GID_ACODEC_AUTO_PASS, },
};
int hb_audio_encoders_count = sizeof(hb_audio_encoders) / sizeof(hb_audio_encoders[0]);
return 1;
#endif
-#if 1 //#ifdef USE_FAAC
+#ifdef USE_FAAC
case HB_ACODEC_FAAC:
return 1;
#endif
-#if 1 //#ifdef USE_LIBAV_AAC
+#ifdef USE_LIBAV_AAC
case HB_ACODEC_FFAAC:
return 1;
#endif
hb_container_t *hb_containers_last_item = NULL;
hb_container_internal_t hb_containers[] =
{
- // legacy muxers (disabled)
- { { "AVI file", "avi", "avi", 0, }, NULL, 0, HB_GID_MUX_MP4, },
+ // legacy muxers, back to HB 0.9.4 whenever possible (disabled)
{ { "M4V file", "m4v", "m4v", 0, }, NULL, 0, HB_GID_MUX_MP4, },
{ { "MP4 file", "mp4", "mp4", 0, }, NULL, 0, HB_GID_MUX_MP4, },
- { { "OGM file", "ogm", "ogm", 0, }, NULL, 0, HB_GID_MUX_MKV, },
{ { "MKV file", "mkv", "mkv", 0, }, NULL, 0, HB_GID_MUX_MKV, },
// actual muxers
{ { "MPEG-4 (mp4v2)", "mp4v2", "mp4", HB_MUX_MP4V2, }, NULL, 1, HB_GID_MUX_MP4, },
return (mixdown <= HB_AMIXDOWN_7POINT1);
case HB_ACODEC_LAME:
- case HB_ACODEC_FFAAC:
return (mixdown <= HB_AMIXDOWN_DOLBYPLII);
case HB_ACODEC_FAAC:
ifo_handle_t * vts = NULL;
int pgc_id, pgn, i;
hb_chapter_t * chapter;
- uint64_t duration;
- float duration_correction;
unsigned char unused[1024];
const char * codec_name;
hb_list_add( title->list_chapter, chapter );
}
- /* The durations we get for chapters aren't precise. Scale them so
- the total matches the title duration */
- duration = 0;
- for( i = 0; i < hb_list_count( title->list_chapter ); i++ )
- {
- chapter = hb_list_item( title->list_chapter, i );
- duration += chapter->duration;
- }
- duration_correction = (float) title->duration / (float) duration;
for( i = 0; i < hb_list_count( title->list_chapter ); i++ )
{
chapter = hb_list_item( title->list_chapter, i );
- chapter->duration = duration_correction * chapter->duration;
int seconds = ( chapter->duration + 45000 ) / 90000;
chapter->hours = ( seconds / 3600 );
if( fps > 0 )
{
- ms += ((dt->frame_u & 0x30) >> 3) * 5 +
- (dt->frame_u & 0x0f) * 1000.0 / fps;
+ ms += (((dt->frame_u & 0x30) >> 3) * 5 +
+ (dt->frame_u & 0x0f)) * 1000.0 / fps;
}
return ms;
int count;
uint64_t duration, longest;
int longest_pgcn, longest_pgn, longest_pgcn_end;
- float duration_correction;
const char * name;
const char * codec_name;
hb_log( "scan: title %d has %d chapters", t, c );
- duration = 0;
count = hb_list_count( title->list_chapter );
for (i = 0; i < count; i++)
{
#undef cp
cell_cur = FindNextCell( pgc, cell_cur );
}
- duration += chapter->duration;
}
- /* The durations we get for chapters aren't precise. Scale them so
- the total matches the title duration */
- duration_correction = (float) title->duration / (float) duration;
for( i = 0; i < hb_list_count( title->list_chapter ); i++ )
{
chapter = hb_list_item( title->list_chapter, i );
- chapter->duration = duration_correction * chapter->duration;
int seconds = ( chapter->duration + 45000 ) / 90000;
chapter->hours = ( seconds / 3600 );
**********************************************************************/
static void PgcWalkInit( uint32_t pgcn_map[MAX_PGCN/32] )
{
- memset(pgcn_map, 0, sizeof(pgcn_map) );
+ memset(pgcn_map, 0, sizeof(uint32_t) * MAX_PGCN/32);
}
/***********************************************************************
if( fps > 0 )
{
- ms += ((dt->frame_u & 0x30) >> 3) * 5 +
- (dt->frame_u & 0x0f) * 1000.0 / fps;
+ ms += (((dt->frame_u & 0x30) >> 3) * 5 +
+ (dt->frame_u & 0x0f)) * 1000.0 / fps;
}
return ms;
For full terms see the file COPYING file or visit http://www.gnu.org/licenses/gpl-2.0.html
*/
+#ifdef USE_FAAC
#include "hb.h"
#include "audio_remap.h"
return HB_WORK_OK;
}
-
+#endif // USE_FAAC
h->interjob = calloc( sizeof( hb_interjob_t ), 1 );
- /* libavcodec */
- hb_avcodec_init();
-
#ifdef USE_QSV
/* Intel Quick Sync Video */
hb_qsv_info_print();
h->die = 0;
h->main_thread = hb_thread_init( "libhb", thread_func, h,
HB_NORMAL_PRIORITY );
- hb_register( &hb_sync_video );
- hb_register( &hb_sync_audio );
- hb_register( &hb_decmpeg2 );
- hb_register( &hb_decvobsub );
- hb_register( &hb_encvobsub );
- hb_register( &hb_deccc608 );
- hb_register( &hb_decsrtsub );
- hb_register( &hb_decutf8sub );
- hb_register( &hb_dectx3gsub );
- hb_register( &hb_decssasub );
- hb_register( &hb_decpgssub );
- hb_register( &hb_encavcodec );
- hb_register( &hb_encx264 );
-#ifdef USE_QSV
- hb_register(&hb_encqsv);
-#endif
- hb_register( &hb_enctheora );
- hb_register( &hb_deca52 );
- hb_register( &hb_decavcodeca );
- hb_register( &hb_decavcodecv );
- hb_register( &hb_declpcm );
- hb_register( &hb_encfaac );
- hb_register( &hb_enclame );
- hb_register( &hb_encvorbis );
- hb_register( &hb_muxer );
-#ifdef __APPLE__
- hb_register( &hb_encca_aac );
- hb_register( &hb_encca_haac );
-#endif
- hb_register( &hb_encavcodeca );
- hb_register( &hb_reader );
return h;
}
h->pause_lock = hb_lock_init();
- /* libavcodec */
- hb_avcodec_init();
-
#ifdef USE_QSV
/* Intel Quick Sync Video */
hb_qsv_info_print();
h->main_thread = hb_thread_init( "libhb", thread_func, h,
HB_NORMAL_PRIORITY );
- hb_register( &hb_sync_video );
- hb_register( &hb_sync_audio );
- hb_register( &hb_decmpeg2 );
- hb_register( &hb_decvobsub );
- hb_register( &hb_encvobsub );
- hb_register( &hb_deccc608 );
- hb_register( &hb_decsrtsub );
- hb_register( &hb_decutf8sub );
- hb_register( &hb_dectx3gsub );
- hb_register( &hb_decssasub );
- hb_register( &hb_encavcodec );
- hb_register( &hb_encx264 );
-#ifdef USE_QSV
- hb_register(&hb_encqsv);
-#endif
- hb_register( &hb_enctheora );
- hb_register( &hb_deca52 );
- hb_register( &hb_decavcodeca );
- hb_register( &hb_decavcodecv );
- hb_register( &hb_declpcm );
- hb_register( &hb_encfaac );
- hb_register( &hb_enclame );
- hb_register( &hb_encvorbis );
- hb_register( &hb_muxer );
-#ifdef __APPLE__
- hb_register( &hb_encca_aac );
- hb_register( &hb_encca_haac );
-#endif
- hb_register( &hb_encavcodeca );
- hb_register( &hb_reader );
-
return h;
}
return -1;
}
+ /* libavcodec */
+ hb_avcodec_init();
+
+ /* HB work objects */
+ hb_register(&hb_muxer);
+ hb_register(&hb_reader);
+ hb_register(&hb_sync_video);
+ hb_register(&hb_sync_audio);
+ifdef USE_QSV
+ hb_register(&hb_encqsv);
+#endif
+ hb_register(&hb_deca52);
+ hb_register(&hb_decavcodecv);
+ hb_register(&hb_decavcodeca);
+ hb_register(&hb_declpcm);
+ hb_register(&hb_deccc608);
+ hb_register(&hb_decmpeg2);
+ hb_register(&hb_decpgssub);
+ hb_register(&hb_decsrtsub);
+ hb_register(&hb_decssasub);
+ hb_register(&hb_dectx3gsub);
+ hb_register(&hb_decutf8sub);
+ hb_register(&hb_decvobsub);
+ hb_register(&hb_encvobsub);
+ hb_register(&hb_encavcodec);
+ hb_register(&hb_encavcodeca);
+#ifdef __APPLE__
+ hb_register(&hb_encca_aac);
+ hb_register(&hb_encca_haac);
+#endif
+#ifdef USE_FAAC
+ hb_register(&hb_encfaac);
+#endif
+ hb_register(&hb_enclame);
+ hb_register(&hb_enctheora);
+ hb_register(&hb_encvorbis);
+ hb_register(&hb_encx264);
+
+ hb_common_global_init();
+
#ifdef USE_QSV
result = hb_qsv_info_init();
if (result < 0)
}
#endif
- hb_common_global_init();
-
return result;
}
ifeq (1,$(FEATURE.fdk_aac))
LIBHB.GCC.D += USE_FDK_AAC
endif
-
+ifeq (1,$(FEATURE.libav_aac))
+LIBHB.GCC.D += USE_LIBAV_AAC
+endif
+ifeq (1,$(FEATURE.faac))
+LIBHB.GCC.D += USE_FAAC
+endif
LIBHB.GCC.D += __LIBHB__ USE_PTHREAD
LIBHB.GCC.D += __LIBHB__ USE_PTHREAD HAVE_THREADS=1
LIBHB.GCC.I += $(LIBHB.build/) $(CONTRIB.build/)include
LIBHB.lib = $(LIBHB.build/)hb.lib
LIBHB.dll.libs = $(foreach n, \
- a52 ass avcodec avformat avutil avresample dvdnav dvdread faac \
+ a52 ass avcodec avformat avutil avresample dvdnav dvdread \
fontconfig freetype mkv mpeg2 mp3lame mp4v2 \
ogg samplerate swscale theora vorbis vorbisenc x264 xml2 bluray, \
$(CONTRIB.build/)lib/lib$(n).a )
LIBHB.dll.libs += $(CONTRIB.build/)lib/libfdk-aac.a
endif
+ifeq (1,$(FEATURE.faac))
+LIBHB.dll.libs += $(CONTRIB.build/)lib/libfaac.a
+endif
+
ifeq (1,$(FEATURE.qsv))
LIBHB.dll.libs += $(CONTRIB.build/)lib/libmfx.a
endif
{
pv->common->first_pts[0] = next->s.start;
hb_lock( pv->common->mutex );
- while( pv->common->pts_offset == INT64_MIN )
+ while( pv->common->pts_offset == INT64_MIN && !*w->done )
{
// Full fifos will make us wait forever, so get the
// pts offset from the available streams if full
{
pv->common->first_pts[sync->index+1] = buf->s.start;
hb_lock( pv->common->mutex );
- while( pv->common->pts_offset == INT64_MIN )
+ while( pv->common->pts_offset == INT64_MIN && !*w->done)
{
// Full fifos will make us wait forever, so get the
// pts offset from the available streams if full
/* Wait for start frame if doing point-to-point */
hb_lock( pv->common->mutex );
start = buf->s.start - pv->common->audio_pts_slip;
- while ( !pv->common->start_found )
+ while ( !pv->common->start_found && !*w->done )
{
if ( pv->common->audio_pts_thresh < 0 )
{
return HB_WORK_OK;
}
while ( !pv->common->start_found &&
- buf->s.start >= pv->common->audio_pts_thresh )
+ buf->s.start >= pv->common->audio_pts_thresh && !*w->done )
{
hb_cond_timedwait( pv->common->next_frame, pv->common->mutex, 10 );
// There is an unfortunate unavoidable deadlock that can occur.
<archive type="com.apple.InterfaceBuilder3.Cocoa.XIB" version="7.10">
<data>
<int key="IBDocument.SystemTarget">1050</int>
- <string key="IBDocument.SystemVersion">11G63</string>
- <string key="IBDocument.InterfaceBuilderVersion">1938</string>
- <string key="IBDocument.AppKitVersion">1138.51</string>
- <string key="IBDocument.HIToolboxVersion">569.00</string>
+ <string key="IBDocument.SystemVersion">12D78</string>
+ <string key="IBDocument.InterfaceBuilderVersion">3084</string>
+ <string key="IBDocument.AppKitVersion">1187.37</string>
+ <string key="IBDocument.HIToolboxVersion">626.00</string>
<object class="NSMutableDictionary" key="IBDocument.PluginVersions">
<string key="NS.key.0">com.apple.InterfaceBuilder.CocoaPlugin</string>
- <string key="NS.object.0">1938</string>
+ <string key="NS.object.0">3084</string>
</object>
<object class="NSArray" key="IBDocument.IntegratedClassDependencies">
<bool key="EncodedWithXMLCoder">YES</bool>
- <string>NSPopUpButtonCell</string>
- <string>NSComboBoxCell</string>
- <string>NSPopUpButton</string>
<string>NSButton</string>
- <string>NSMenu</string>
- <string>NSTextFieldCell</string>
<string>NSButtonCell</string>
- <string>NSMenuItem</string>
<string>NSComboBox</string>
- <string>NSCustomView</string>
+ <string>NSComboBoxCell</string>
<string>NSCustomObject</string>
- <string>NSView</string>
- <string>NSWindowTemplate</string>
+ <string>NSCustomView</string>
+ <string>NSMenu</string>
+ <string>NSMenuItem</string>
+ <string>NSPopUpButton</string>
+ <string>NSPopUpButtonCell</string>
<string>NSTextField</string>
+ <string>NSTextFieldCell</string>
<string>NSUserDefaultsController</string>
+ <string>NSView</string>
+ <string>NSWindowTemplate</string>
</object>
<object class="NSArray" key="IBDocument.PluginDependencies">
<bool key="EncodedWithXMLCoder">YES</bool>
<int key="NSvFlags">256</int>
<string key="NSFrameSize">{500, 200}</string>
<reference key="NSSuperview"/>
- <reference key="NSWindow"/>
- <reference key="NSNextKeyView"/>
</object>
<string key="NSScreenRect">{{0, 0}, {1440, 878}}</string>
<string key="NSMinSize">{213, 129}</string>
<bool key="NSSharedInstance">YES</bool>
</object>
<object class="NSCustomView" id="1048779201">
- <nil key="NSNextResponder"/>
+ <reference key="NSNextResponder"/>
<int key="NSvFlags">256</int>
<object class="NSMutableArray" key="NSSubviews">
<bool key="EncodedWithXMLCoder">YES</bool>
<reference key="NSNextKeyView" ref="1009109497"/>
<bool key="NSEnabled">YES</bool>
<object class="NSPopUpButtonCell" key="NSCell" id="630285587">
- <int key="NSCellFlags">-2076049856</int>
+ <int key="NSCellFlags">-2076180416</int>
<int key="NSCellFlags2">133120</int>
<object class="NSFont" key="NSSupport" id="26">
<string key="NSName">LucidaGrande</string>
<int key="NSfFlags">3100</int>
</object>
<reference key="NSControlView" ref="23412822"/>
- <int key="NSButtonFlags">109199615</int>
+ <int key="NSButtonFlags">109199360</int>
<int key="NSButtonFlags2">129</int>
<string key="NSAlternateContents"/>
<string key="NSKeyEquivalent"/>
<bool key="NSAltersState">YES</bool>
<int key="NSArrowPosition">2</int>
</object>
+ <bool key="NSAllowsLogicalLayoutDirection">NO</bool>
</object>
<object class="NSButton" id="1009109497">
<reference key="NSNextResponder" ref="1048779201"/>
<reference key="NSNextKeyView" ref="597305137"/>
<bool key="NSEnabled">YES</bool>
<object class="NSButtonCell" key="NSCell" id="878201725">
- <int key="NSCellFlags">-2080244224</int>
+ <int key="NSCellFlags">-2080374784</int>
<int key="NSCellFlags2">131072</int>
<string key="NSContents">Play System Alert Sound</string>
<reference key="NSSupport" ref="26"/>
<reference key="NSControlView" ref="1009109497"/>
- <int key="NSButtonFlags">1211912703</int>
+ <int key="NSButtonFlags">1211912448</int>
<int key="NSButtonFlags2">2</int>
<object class="NSCustomResource" key="NSNormalImage" id="491838135">
<string key="NSClassName">NSImage</string>
<int key="NSPeriodicDelay">200</int>
<int key="NSPeriodicInterval">25</int>
</object>
+ <bool key="NSAllowsLogicalLayoutDirection">NO</bool>
</object>
<object class="NSButton" id="806259169">
<reference key="NSNextResponder" ref="1048779201"/>
<reference key="NSNextKeyView" ref="713240777"/>
<bool key="NSEnabled">YES</bool>
<object class="NSButtonCell" key="NSCell" id="725806271">
- <int key="NSCellFlags">67239424</int>
+ <int key="NSCellFlags">67108864</int>
<int key="NSCellFlags2">134479872</int>
<string key="NSContents">Browse ...</string>
<object class="NSFont" key="NSSupport" id="22">
<int key="NSfFlags">3614</int>
</object>
<reference key="NSControlView" ref="806259169"/>
- <int key="NSButtonFlags">-2038284033</int>
+ <int key="NSButtonFlags">-2038284288</int>
<int key="NSButtonFlags2">129</int>
<string key="NSAlternateContents"/>
<string key="NSKeyEquivalent"/>
<int key="NSPeriodicDelay">200</int>
<int key="NSPeriodicInterval">25</int>
</object>
+ <bool key="NSAllowsLogicalLayoutDirection">NO</bool>
</object>
<object class="NSTextField" id="842132572">
<reference key="NSNextResponder" ref="1048779201"/>
<reference key="NSNextKeyView" ref="806259169"/>
<bool key="NSEnabled">YES</bool>
<object class="NSTextFieldCell" key="NSCell" id="456853603">
- <int key="NSCellFlags">68288064</int>
+ <int key="NSCellFlags">68157504</int>
<int key="NSCellFlags2">272761856</int>
<string key="NSContents">None</string>
<reference key="NSSupport" ref="26"/>
</object>
</object>
</object>
+ <bool key="NSAllowsLogicalLayoutDirection">NO</bool>
</object>
<object class="NSButton" id="636306431">
<reference key="NSNextResponder" ref="1048779201"/>
<reference key="NSNextKeyView" ref="280291731"/>
<bool key="NSEnabled">YES</bool>
<object class="NSButtonCell" key="NSCell" id="448858755">
- <int key="NSCellFlags">67239424</int>
+ <int key="NSCellFlags">67108864</int>
<int key="NSCellFlags2">131072</int>
<string key="NSContents">Show Presets Drawer</string>
<reference key="NSSupport" ref="26"/>
<reference key="NSControlView" ref="636306431"/>
- <int key="NSButtonFlags">1211912703</int>
+ <int key="NSButtonFlags">1211912448</int>
<int key="NSButtonFlags2">2</int>
<reference key="NSAlternateImage" ref="1056213191"/>
<string key="NSAlternateContents"/>
<int key="NSPeriodicDelay">200</int>
<int key="NSPeriodicInterval">25</int>
</object>
+ <bool key="NSAllowsLogicalLayoutDirection">NO</bool>
</object>
<object class="NSButton" id="965044526">
<reference key="NSNextResponder" ref="1048779201"/>
<reference key="NSNextKeyView" ref="854927877"/>
<bool key="NSEnabled">YES</bool>
<object class="NSButtonCell" key="NSCell" id="419322096">
- <int key="NSCellFlags">67239424</int>
+ <int key="NSCellFlags">67108864</int>
<int key="NSCellFlags2">131072</int>
<string key="NSContents">Use Auto Naming (uses DVD name and title number)</string>
<reference key="NSSupport" ref="26"/>
<reference key="NSControlView" ref="965044526"/>
- <int key="NSButtonFlags">1211912703</int>
+ <int key="NSButtonFlags">1211912448</int>
<int key="NSButtonFlags2">2</int>
<reference key="NSAlternateImage" ref="1056213191"/>
<string key="NSAlternateContents"/>
<int key="NSPeriodicDelay">200</int>
<int key="NSPeriodicInterval">25</int>
</object>
+ <bool key="NSAllowsLogicalLayoutDirection">NO</bool>
</object>
<object class="NSTextField" id="315188467">
<reference key="NSNextResponder" ref="1048779201"/>
<reference key="NSNextKeyView" ref="23412822"/>
<bool key="NSEnabled">YES</bool>
<object class="NSTextFieldCell" key="NSCell" id="718672066">
- <int key="NSCellFlags">67239424</int>
+ <int key="NSCellFlags">67108864</int>
<int key="NSCellFlags2">272760832</int>
<string key="NSContents">When Done:</string>
<reference key="NSSupport" ref="26"/>
<reference key="NSBackgroundColor" ref="525377782"/>
<reference key="NSTextColor" ref="887152126"/>
</object>
+ <bool key="NSAllowsLogicalLayoutDirection">NO</bool>
</object>
<object class="NSButton" id="581738572">
<reference key="NSNextResponder" ref="1048779201"/>
<reference key="NSNextKeyView" ref="954667708"/>
<bool key="NSEnabled">YES</bool>
<object class="NSButtonCell" key="NSCell" id="824062726">
- <int key="NSCellFlags">67239424</int>
+ <int key="NSCellFlags">67108864</int>
<int key="NSCellFlags2">131072</int>
<string key="NSContents">Automatically check for updates</string>
<reference key="NSSupport" ref="26"/>
<reference key="NSControlView" ref="581738572"/>
- <int key="NSButtonFlags">1211912703</int>
+ <int key="NSButtonFlags">1211912448</int>
<int key="NSButtonFlags2">2</int>
<reference key="NSAlternateImage" ref="1056213191"/>
<string key="NSAlternateContents"/>
<int key="NSPeriodicDelay">200</int>
<int key="NSPeriodicInterval">25</int>
</object>
+ <bool key="NSAllowsLogicalLayoutDirection">NO</bool>
</object>
<object class="NSButton" id="597305137">
<reference key="NSNextResponder" ref="1048779201"/>
<reference key="NSNextKeyView" ref="842132572"/>
<bool key="NSEnabled">YES</bool>
<object class="NSButtonCell" key="NSCell" id="437495050">
- <int key="NSCellFlags">67239424</int>
+ <int key="NSCellFlags">67108864</int>
<int key="NSCellFlags2">131072</int>
<string key="NSContents">Send file to:</string>
<reference key="NSSupport" ref="26"/>
<reference key="NSControlView" ref="597305137"/>
- <int key="NSButtonFlags">1211912703</int>
+ <int key="NSButtonFlags">1211912448</int>
<int key="NSButtonFlags2">2</int>
<reference key="NSNormalImage" ref="491838135"/>
<reference key="NSAlternateImage" ref="1056213191"/>
<int key="NSPeriodicDelay">200</int>
<int key="NSPeriodicInterval">25</int>
</object>
+ <bool key="NSAllowsLogicalLayoutDirection">NO</bool>
</object>
<object class="NSTextField" id="576686737">
<reference key="NSNextResponder" ref="1048779201"/>
<reference key="NSNextKeyView" ref="636306431"/>
<bool key="NSEnabled">YES</bool>
<object class="NSTextFieldCell" key="NSCell" id="404194395">
- <int key="NSCellFlags">67239424</int>
+ <int key="NSCellFlags">67108864</int>
<int key="NSCellFlags2">272760832</int>
<string key="NSContents">At launch:</string>
<reference key="NSSupport" ref="26"/>
<reference key="NSBackgroundColor" ref="525377782"/>
<reference key="NSTextColor" ref="887152126"/>
</object>
+ <bool key="NSAllowsLogicalLayoutDirection">NO</bool>
</object>
<object class="NSTextField" id="854927877">
<reference key="NSNextResponder" ref="1048779201"/>
<reference key="NSNextKeyView" ref="317169558"/>
<bool key="NSEnabled">YES</bool>
<object class="NSTextFieldCell" key="NSCell" id="177949206">
- <int key="NSCellFlags">67239424</int>
+ <int key="NSCellFlags">67108864</int>
<int key="NSCellFlags2">71434240</int>
<string key="NSContents">Default MP4 Extension:</string>
<reference key="NSSupport" ref="26"/>
<reference key="NSBackgroundColor" ref="525377782"/>
<reference key="NSTextColor" ref="887152126"/>
</object>
+ <bool key="NSAllowsLogicalLayoutDirection">NO</bool>
</object>
<object class="NSTextField" id="280291731">
<reference key="NSNextResponder" ref="1048779201"/>
<reference key="NSNextKeyView" ref="54712339"/>
<bool key="NSEnabled">YES</bool>
<object class="NSTextFieldCell" key="NSCell" id="1049782015">
- <int key="NSCellFlags">67239424</int>
+ <int key="NSCellFlags">67108864</int>
<int key="NSCellFlags2">71434240</int>
<string key="NSContents">Source selection:</string>
<reference key="NSSupport" ref="26"/>
<reference key="NSBackgroundColor" ref="525377782"/>
<reference key="NSTextColor" ref="887152126"/>
</object>
+ <bool key="NSAllowsLogicalLayoutDirection">NO</bool>
</object>
<object class="NSTextField" id="713240777">
<reference key="NSNextResponder" ref="1048779201"/>
<reference key="NSNextKeyView" ref="965044526"/>
<bool key="NSEnabled">YES</bool>
<object class="NSTextFieldCell" key="NSCell" id="947435557">
- <int key="NSCellFlags">67239424</int>
+ <int key="NSCellFlags">67108864</int>
<int key="NSCellFlags2">272760832</int>
<string key="NSContents">Output files:</string>
<reference key="NSSupport" ref="26"/>
<reference key="NSBackgroundColor" ref="525377782"/>
<reference key="NSTextColor" ref="887152126"/>
</object>
+ <bool key="NSAllowsLogicalLayoutDirection">NO</bool>
</object>
<object class="NSPopUpButton" id="317169558">
<reference key="NSNextResponder" ref="1048779201"/>
<reference key="NSSuperview" ref="1048779201"/>
<bool key="NSEnabled">YES</bool>
<object class="NSPopUpButtonCell" key="NSCell" id="792374025">
- <int key="NSCellFlags">71433792</int>
+ <int key="NSCellFlags">71303232</int>
<int key="NSCellFlags2">264192</int>
<reference key="NSSupport" ref="22"/>
<reference key="NSControlView" ref="317169558"/>
- <int key="NSButtonFlags">109199615</int>
+ <int key="NSButtonFlags">109199360</int>
<int key="NSButtonFlags2">1</int>
<object class="NSFont" key="NSAlternateImage">
<string key="NSName">LucidaGrande</string>
<bool key="NSAltersState">YES</bool>
<int key="NSArrowPosition">1</int>
</object>
+ <bool key="NSAllowsLogicalLayoutDirection">NO</bool>
</object>
<object class="NSPopUpButton" id="954667708">
<reference key="NSNextResponder" ref="1048779201"/>
<reference key="NSNextKeyView" ref="315188467"/>
<bool key="NSEnabled">YES</bool>
<object class="NSPopUpButtonCell" key="NSCell" id="841218599">
- <int key="NSCellFlags">71433792</int>
+ <int key="NSCellFlags">71303232</int>
<int key="NSCellFlags2">133120</int>
<reference key="NSSupport" ref="26"/>
<reference key="NSControlView" ref="954667708"/>
- <int key="NSButtonFlags">109199615</int>
+ <int key="NSButtonFlags">109199360</int>
<int key="NSButtonFlags2">1</int>
<object class="NSFont" key="NSAlternateImage" id="44722471">
<string key="NSName">LucidaGrande</string>
<bool key="NSAltersState">YES</bool>
<int key="NSArrowPosition">1</int>
</object>
+ <bool key="NSAllowsLogicalLayoutDirection">NO</bool>
</object>
<object class="NSPopUpButton" id="54712339">
<reference key="NSNextResponder" ref="1048779201"/>
<reference key="NSNextKeyView" ref="581738572"/>
<bool key="NSEnabled">YES</bool>
<object class="NSPopUpButtonCell" key="NSCell" id="310956178">
- <int key="NSCellFlags">71433792</int>
+ <int key="NSCellFlags">71303232</int>
<int key="NSCellFlags2">133120</int>
<reference key="NSSupport" ref="26"/>
<reference key="NSControlView" ref="54712339"/>
- <int key="NSButtonFlags">109199615</int>
+ <int key="NSButtonFlags">109199360</int>
<int key="NSButtonFlags2">1</int>
<reference key="NSAlternateImage" ref="44722471"/>
<string key="NSAlternateContents"/>
<bool key="NSAltersState">YES</bool>
<int key="NSArrowPosition">1</int>
</object>
+ <bool key="NSAllowsLogicalLayoutDirection">NO</bool>
</object>
</object>
<string key="NSFrameSize">{460, 256}</string>
+ <reference key="NSSuperview"/>
<reference key="NSNextKeyView" ref="576686737"/>
<string key="NSClassName">NSView</string>
<string key="NSExtension">NSControl</string>
<int key="NSvFlags">268</int>
<string key="NSFrame">{{34, 42}, {432, 17}}</string>
<reference key="NSSuperview" ref="520288288"/>
- <reference key="NSWindow"/>
- <reference key="NSNextKeyView"/>
<bool key="NSEnabled">YES</bool>
<object class="NSTextFieldCell" key="NSCell" id="374363387">
- <int key="NSCellFlags">67239488</int>
+ <int key="NSCellFlags">67108928</int>
<int key="NSCellFlags2">138413056</int>
<string key="NSContents">Nothing here right now, but I am sure we will think of something</string>
<reference key="NSSupport" ref="964910696"/>
<reference key="NSBackgroundColor" ref="525377782"/>
<reference key="NSTextColor" ref="887152126"/>
</object>
+ <bool key="NSAllowsLogicalLayoutDirection">NO</bool>
</object>
</object>
<string key="NSFrameSize">{496, 82}</string>
<reference key="NSSuperview"/>
- <reference key="NSWindow"/>
<reference key="NSNextKeyView" ref="539748933"/>
<string key="NSClassName">NSView</string>
<string key="NSExtension">NSResponder</string>
<reference key="NSNextKeyView" ref="113289239"/>
<bool key="NSEnabled">YES</bool>
<object class="NSTextFieldCell" key="NSCell" id="603140150">
- <int key="NSCellFlags">67239424</int>
+ <int key="NSCellFlags">67108864</int>
<int key="NSCellFlags2">272760832</int>
<string key="NSContents">Alternate Language:</string>
<reference key="NSSupport" ref="26"/>
<reference key="NSBackgroundColor" ref="525377782"/>
<reference key="NSTextColor" ref="887152126"/>
</object>
+ <bool key="NSAllowsLogicalLayoutDirection">NO</bool>
</object>
<object class="NSComboBox" id="113289239">
<reference key="NSNextResponder" ref="332598366"/>
<string key="NSFrame">{{169, 87}, {247, 22}}</string>
<reference key="NSSuperview" ref="332598366"/>
<reference key="NSWindow"/>
- <reference key="NSNextKeyView" ref="247298122"/>
+ <reference key="NSNextKeyView"/>
<bool key="NSEnabled">YES</bool>
<object class="NSComboBoxCell" key="NSCell" id="37767182">
- <int key="NSCellFlags">343014976</int>
+ <int key="NSCellFlags">342884416</int>
<int key="NSCellFlags2">272761856</int>
<string key="NSContents"/>
<reference key="NSSupport" ref="26"/>
<reference key="NSSuperview"/>
<reference key="NSWindow"/>
<bool key="NSEnabled">YES</bool>
+ <bool key="NSAllowsLogicalLayoutDirection">NO</bool>
+ <bool key="NSControlAllowsExpansionToolTips">YES</bool>
<object class="NSMutableArray" key="NSTableColumns">
<bool key="EncodedWithXMLCoder">YES</bool>
<object class="NSTableColumn">
<double key="NSMinWidth">10</double>
<double key="NSMaxWidth">1000</double>
<object class="NSTableHeaderCell" key="NSHeaderCell">
- <int key="NSCellFlags">75628032</int>
+ <int key="NSCellFlags">75497472</int>
<int key="NSCellFlags2">0</int>
<object class="NSMutableString" key="NSContents">
<characters key="NS.bytes"/>
<reference key="NSTextColor" ref="993015046"/>
</object>
<object class="NSTextFieldCell" key="NSDataCell">
- <int key="NSCellFlags">338820672</int>
+ <int key="NSCellFlags">338690112</int>
<int key="NSCellFlags2">1024</int>
<reference key="NSSupport" ref="26"/>
<reference key="NSControlView" ref="734498420"/>
<int key="NSTableViewGroupRowStyle">1</int>
</object>
</object>
+ <bool key="NSAllowsLogicalLayoutDirection">NO</bool>
</object>
<object class="NSTextField" id="389101877">
<reference key="NSNextResponder" ref="332598366"/>
<reference key="NSNextKeyView" ref="172081130"/>
<bool key="NSEnabled">YES</bool>
<object class="NSTextFieldCell" key="NSCell" id="459708758">
- <int key="NSCellFlags">67239424</int>
+ <int key="NSCellFlags">67108864</int>
<int key="NSCellFlags2">272760832</int>
<string key="NSContents">Native Language:</string>
<reference key="NSSupport" ref="26"/>
<reference key="NSBackgroundColor" ref="525377782"/>
<reference key="NSTextColor" ref="887152126"/>
</object>
- </object>
- <object class="NSTextField" id="247298122">
- <reference key="NSNextResponder" ref="332598366"/>
- <int key="NSvFlags">256</int>
- <string key="NSFrame">{{90, 55}, {31, 14}}</string>
- <reference key="NSSuperview" ref="332598366"/>
- <reference key="NSWindow"/>
- <reference key="NSNextKeyView" ref="1054432492"/>
- <bool key="NSEnabled">YES</bool>
- <object class="NSTextFieldCell" key="NSCell" id="954547948">
- <int key="NSCellFlags">67239424</int>
- <int key="NSCellFlags2">272760832</int>
- <string key="NSContents">AAC:</string>
- <reference key="NSSupport" ref="26"/>
- <reference key="NSControlView" ref="247298122"/>
- <reference key="NSBackgroundColor" ref="525377782"/>
- <reference key="NSTextColor" ref="887152126"/>
- </object>
+ <bool key="NSAllowsLogicalLayoutDirection">NO</bool>
</object>
<object class="NSComboBox" id="172081130">
<reference key="NSNextResponder" ref="332598366"/>
<reference key="NSNextKeyView" ref="725503362"/>
<bool key="NSEnabled">YES</bool>
<object class="NSComboBoxCell" key="NSCell" id="210320026">
- <int key="NSCellFlags">343014976</int>
+ <int key="NSCellFlags">342884416</int>
<int key="NSCellFlags2">272761856</int>
<string key="NSContents">English</string>
<reference key="NSSupport" ref="26"/>
<reference key="NSSuperview"/>
<reference key="NSWindow"/>
<bool key="NSEnabled">YES</bool>
+ <bool key="NSAllowsLogicalLayoutDirection">NO</bool>
+ <bool key="NSControlAllowsExpansionToolTips">YES</bool>
<object class="NSMutableArray" key="NSTableColumns">
<bool key="EncodedWithXMLCoder">YES</bool>
<object class="NSTableColumn">
<double key="NSMinWidth">10</double>
<double key="NSMaxWidth">1000</double>
<object class="NSTableHeaderCell" key="NSHeaderCell">
- <int key="NSCellFlags">75628032</int>
+ <int key="NSCellFlags">75497472</int>
<int key="NSCellFlags2">0</int>
<object class="NSMutableString" key="NSContents">
<characters key="NS.bytes"/>
<reference key="NSTextColor" ref="993015046"/>
</object>
<object class="NSTextFieldCell" key="NSDataCell">
- <int key="NSCellFlags">338820672</int>
+ <int key="NSCellFlags">338690112</int>
<int key="NSCellFlags2">1024</int>
<reference key="NSSupport" ref="26"/>
<reference key="NSControlView" ref="686758712"/>
<int key="NSTableViewGroupRowStyle">1</int>
</object>
</object>
+ <bool key="NSAllowsLogicalLayoutDirection">NO</bool>
</object>
<object class="NSButton" id="168948265">
<reference key="NSNextResponder" ref="332598366"/>
<int key="NSvFlags">256</int>
- <string key="NSFrame">{{91, 18}, {292, 26}}</string>
+ <string key="NSFrame">{{122, 45}, {248, 26}}</string>
<reference key="NSSuperview" ref="332598366"/>
<reference key="NSWindow"/>
- <reference key="NSNextKeyView"/>
<bool key="NSEnabled">YES</bool>
<object class="NSButtonCell" key="NSCell" id="686321393">
- <int key="NSCellFlags">67239424</int>
+ <int key="NSCellFlags">67108864</int>
<int key="NSCellFlags2">0</int>
<string key="NSContents">Show advanced options for Auto Passthru</string>
<reference key="NSSupport" ref="26"/>
<reference key="NSControlView" ref="168948265"/>
- <int key="NSButtonFlags">1211912703</int>
+ <int key="NSButtonFlags">1211912448</int>
<int key="NSButtonFlags2">2</int>
<reference key="NSAlternateImage" ref="1056213191"/>
<string key="NSAlternateContents"/>
<int key="NSPeriodicDelay">200</int>
<int key="NSPeriodicInterval">25</int>
</object>
- </object>
- <object class="NSButton" id="1054432492">
- <reference key="NSNextResponder" ref="332598366"/>
- <int key="NSvFlags">268</int>
- <string key="NSFrame">{{123, 53}, {333, 18}}</string>
- <reference key="NSSuperview" ref="332598366"/>
- <reference key="NSWindow"/>
- <reference key="NSNextKeyView" ref="168948265"/>
- <bool key="NSEnabled">YES</bool>
- <object class="NSButtonCell" key="NSCell" id="787274685">
- <int key="NSCellFlags">-2080244224</int>
- <int key="NSCellFlags2">131072</int>
- <string key="NSContents">Use CoreAudio instead of FAAC for Built-In Presets</string>
- <reference key="NSSupport" ref="26"/>
- <reference key="NSControlView" ref="1054432492"/>
- <int key="NSButtonFlags">1211912703</int>
- <int key="NSButtonFlags2">130</int>
- <reference key="NSNormalImage" ref="491838135"/>
- <reference key="NSAlternateImage" ref="1056213191"/>
- <string key="NSAlternateContents"/>
- <string key="NSKeyEquivalent"/>
- <int key="NSPeriodicDelay">200</int>
- <int key="NSPeriodicInterval">25</int>
- </object>
+ <bool key="NSAllowsLogicalLayoutDirection">NO</bool>
</object>
</object>
<string key="NSFrameSize">{492, 157}</string>
<string key="NSExtension">NSResponder</string>
</object>
<object class="NSCustomView" id="23728330">
- <reference key="NSNextResponder"/>
+ <nil key="NSNextResponder"/>
<int key="NSvFlags">256</int>
<object class="NSMutableArray" key="NSSubviews">
<bool key="EncodedWithXMLCoder">YES</bool>
<int key="NSvFlags">268</int>
<string key="NSFrame">{{302, 172}, {48, 19}}</string>
<reference key="NSSuperview" ref="23728330"/>
- <reference key="NSWindow"/>
<reference key="NSNextKeyView" ref="701867067"/>
<bool key="NSEnabled">YES</bool>
<object class="NSTextFieldCell" key="NSCell" id="607341761">
- <int key="NSCellFlags">-1804468671</int>
+ <int key="NSCellFlags">-1804599231</int>
<int key="NSCellFlags2">272761856</int>
<string key="NSContents"/>
<reference key="NSSupport" ref="26"/>
<reference key="NSColor" ref="897199777"/>
</object>
</object>
+ <bool key="NSAllowsLogicalLayoutDirection">NO</bool>
</object>
<object class="NSTextField" id="226601760">
<reference key="NSNextResponder" ref="23728330"/>
<int key="NSvFlags">256</int>
<string key="NSFrame">{{17, 207}, {280, 14}}</string>
<reference key="NSSuperview" ref="23728330"/>
- <reference key="NSWindow"/>
<reference key="NSNextKeyView" ref="822080053"/>
<bool key="NSEnabled">YES</bool>
<object class="NSTextFieldCell" key="NSCell" id="1064438472">
- <int key="NSCellFlags">67239424</int>
+ <int key="NSCellFlags">67108864</int>
<int key="NSCellFlags2">71434240</int>
<string key="NSContents">x264 Constant Quality fractional granularity:</string>
<reference key="NSSupport" ref="26"/>
<reference key="NSBackgroundColor" ref="525377782"/>
<reference key="NSTextColor" ref="887152126"/>
</object>
+ <bool key="NSAllowsLogicalLayoutDirection">NO</bool>
</object>
<object class="NSTextField" id="469378299">
<reference key="NSNextResponder" ref="23728330"/>
<int key="NSvFlags">256</int>
<string key="NSFrame">{{48, 175}, {249, 14}}</string>
<reference key="NSSuperview" ref="23728330"/>
- <reference key="NSWindow"/>
<reference key="NSNextKeyView" ref="62457548"/>
<bool key="NSEnabled">YES</bool>
<object class="NSTextFieldCell" key="NSCell" id="552368920">
- <int key="NSCellFlags">67239424</int>
+ <int key="NSCellFlags">67108864</int>
<int key="NSCellFlags2">71434240</int>
<string key="NSContents">Minimum length of title to scan (seconds):</string>
<reference key="NSSupport" ref="26"/>
<reference key="NSBackgroundColor" ref="525377782"/>
<reference key="NSTextColor" ref="887152126"/>
</object>
+ <bool key="NSAllowsLogicalLayoutDirection">NO</bool>
</object>
<object class="NSTextField" id="701867067">
<reference key="NSNextResponder" ref="23728330"/>
<int key="NSvFlags">256</int>
<string key="NSFrame">{{99, 145}, {198, 14}}</string>
<reference key="NSSuperview" ref="23728330"/>
- <reference key="NSWindow"/>
<reference key="NSNextKeyView" ref="772611942"/>
<bool key="NSEnabled">YES</bool>
<object class="NSTextFieldCell" key="NSCell" id="978611587">
- <int key="NSCellFlags">67239424</int>
+ <int key="NSCellFlags">67108864</int>
<int key="NSCellFlags2">71434240</int>
<string key="NSContents">Number of picture previews to scan:</string>
<reference key="NSSupport" ref="26"/>
<reference key="NSBackgroundColor" ref="525377782"/>
<reference key="NSTextColor" ref="887152126"/>
</object>
+ <bool key="NSAllowsLogicalLayoutDirection">NO</bool>
</object>
<object class="NSTextField" id="173328305">
<reference key="NSNextResponder" ref="23728330"/>
<int key="NSvFlags">256</int>
<string key="NSFrame">{{137, 53}, {160, 15}}</string>
<reference key="NSSuperview" ref="23728330"/>
- <reference key="NSWindow"/>
<reference key="NSNextKeyView" ref="895206300"/>
<bool key="NSEnabled">YES</bool>
<object class="NSTextFieldCell" key="NSCell" id="271531935">
- <int key="NSCellFlags">67239424</int>
+ <int key="NSCellFlags">67108864</int>
<int key="NSCellFlags2">4325376</int>
<string key="NSContents">Activity Log Verbosity Level:</string>
<reference key="NSSupport" ref="26"/>
<reference key="NSBackgroundColor" ref="525377782"/>
<reference key="NSTextColor" ref="887152126"/>
</object>
+ <bool key="NSAllowsLogicalLayoutDirection">NO</bool>
</object>
<object class="NSTextField" id="899831697">
<reference key="NSNextResponder" ref="23728330"/>
<int key="NSvFlags">256</int>
<string key="NSFrame">{{108, 76}, {27, 14}}</string>
<reference key="NSSuperview" ref="23728330"/>
- <reference key="NSWindow"/>
<reference key="NSNextKeyView" ref="907177043"/>
<bool key="NSEnabled">YES</bool>
<object class="NSTextFieldCell" key="NSCell" id="483848741">
- <int key="NSCellFlags">67239424</int>
+ <int key="NSCellFlags">67108864</int>
<int key="NSCellFlags2">272760832</int>
<string key="NSContents">Log:</string>
<reference key="NSSupport" ref="26"/>
<reference key="NSBackgroundColor" ref="525377782"/>
<reference key="NSTextColor" ref="887152126"/>
</object>
+ <bool key="NSAllowsLogicalLayoutDirection">NO</bool>
</object>
<object class="NSTextField" id="898312631">
<reference key="NSNextResponder" ref="23728330"/>
<int key="NSvFlags">256</int>
<string key="NSFrame">{{70, 110}, {65, 14}}</string>
<reference key="NSSuperview" ref="23728330"/>
- <reference key="NSWindow"/>
<reference key="NSNextKeyView" ref="745324926"/>
<bool key="NSEnabled">YES</bool>
<object class="NSTextFieldCell" key="NSCell" id="1062716368">
- <int key="NSCellFlags">67239424</int>
+ <int key="NSCellFlags">67108864</int>
<int key="NSCellFlags2">272760832</int>
<string key="NSContents">Dvd-Video:</string>
<reference key="NSSupport" ref="26"/>
<reference key="NSBackgroundColor" ref="525377782"/>
<reference key="NSTextColor" ref="887152126"/>
</object>
+ <bool key="NSAllowsLogicalLayoutDirection">NO</bool>
</object>
<object class="NSButton" id="907177043">
<reference key="NSNextResponder" ref="23728330"/>
<int key="NSvFlags">256</int>
<string key="NSFrame">{{137, 74}, {304, 18}}</string>
<reference key="NSSuperview" ref="23728330"/>
- <reference key="NSWindow"/>
<reference key="NSNextKeyView" ref="173328305"/>
<bool key="NSEnabled">YES</bool>
<object class="NSButtonCell" key="NSCell" id="869757541">
- <int key="NSCellFlags">67239424</int>
+ <int key="NSCellFlags">67108864</int>
<int key="NSCellFlags2">131072</int>
<string key="NSContents">Put individual encode logs in same location as movie</string>
<reference key="NSSupport" ref="26"/>
<reference key="NSControlView" ref="907177043"/>
- <int key="NSButtonFlags">1211912703</int>
+ <int key="NSButtonFlags">1211912448</int>
<int key="NSButtonFlags2">2</int>
<reference key="NSAlternateImage" ref="1056213191"/>
<string key="NSAlternateContents"/>
<int key="NSPeriodicDelay">200</int>
<int key="NSPeriodicInterval">25</int>
</object>
+ <bool key="NSAllowsLogicalLayoutDirection">NO</bool>
</object>
<object class="NSButton" id="745324926">
<reference key="NSNextResponder" ref="23728330"/>
<int key="NSvFlags">256</int>
<string key="NSFrame">{{137, 108}, {220, 18}}</string>
<reference key="NSSuperview" ref="23728330"/>
- <reference key="NSWindow"/>
<reference key="NSNextKeyView" ref="899831697"/>
<bool key="NSEnabled">YES</bool>
<object class="NSButtonCell" key="NSCell" id="884409108">
- <int key="NSCellFlags">67239424</int>
+ <int key="NSCellFlags">67108864</int>
<int key="NSCellFlags2">131072</int>
<string key="NSContents">Use libdvdnav (instead of libdvdread)</string>
<reference key="NSSupport" ref="26"/>
<reference key="NSControlView" ref="745324926"/>
- <int key="NSButtonFlags">1211912703</int>
+ <int key="NSButtonFlags">1211912448</int>
<int key="NSButtonFlags2">2</int>
<reference key="NSAlternateImage" ref="1056213191"/>
<string key="NSAlternateContents"/>
<int key="NSPeriodicDelay">200</int>
<int key="NSPeriodicInterval">25</int>
</object>
+ <bool key="NSAllowsLogicalLayoutDirection">NO</bool>
</object>
<object class="NSButton" id="712613872">
<reference key="NSNextResponder" ref="23728330"/>
<int key="NSvFlags">256</int>
<string key="NSFrame">{{137, 18}, {217, 18}}</string>
<reference key="NSSuperview" ref="23728330"/>
- <reference key="NSWindow"/>
- <reference key="NSNextKeyView"/>
<bool key="NSEnabled">YES</bool>
<object class="NSButtonCell" key="NSCell" id="562265695">
- <int key="NSCellFlags">67239424</int>
+ <int key="NSCellFlags">67108864</int>
<int key="NSCellFlags2">131072</int>
<string key="NSContents">Alert when updating built-in presets</string>
<reference key="NSSupport" ref="26"/>
<reference key="NSControlView" ref="712613872"/>
- <int key="NSButtonFlags">1211912703</int>
+ <int key="NSButtonFlags">1211912448</int>
<int key="NSButtonFlags2">2</int>
<reference key="NSAlternateImage" ref="1056213191"/>
<string key="NSAlternateContents"/>
<int key="NSPeriodicDelay">200</int>
<int key="NSPeriodicInterval">25</int>
</object>
+ <bool key="NSAllowsLogicalLayoutDirection">NO</bool>
</object>
<object class="NSPopUpButton" id="772611942">
<reference key="NSNextResponder" ref="23728330"/>
<int key="NSvFlags">268</int>
<string key="NSFrame">{{299, 140}, {73, 22}}</string>
<reference key="NSSuperview" ref="23728330"/>
- <reference key="NSWindow"/>
<reference key="NSNextKeyView" ref="898312631"/>
<bool key="NSEnabled">YES</bool>
<object class="NSPopUpButtonCell" key="NSCell" id="413609467">
- <int key="NSCellFlags">-2076049856</int>
+ <int key="NSCellFlags">-2076180416</int>
<int key="NSCellFlags2">133120</int>
<reference key="NSSupport" ref="26"/>
<reference key="NSControlView" ref="772611942"/>
- <int key="NSButtonFlags">109199615</int>
+ <int key="NSButtonFlags">109199360</int>
<int key="NSButtonFlags2">129</int>
<string key="NSAlternateContents"/>
<string key="NSKeyEquivalent"/>
<int key="NSPeriodicDelay">400</int>
<int key="NSPeriodicInterval">75</int>
- <nil key="NSMenuItem"/>
+ <object class="NSMenuItem" key="NSMenuItem" id="165310533">
+ <reference key="NSMenu" ref="743346318"/>
+ <string key="NSTitle">10</string>
+ <string key="NSKeyEquiv"/>
+ <int key="NSKeyEquivModMask">1048576</int>
+ <int key="NSMnemonicLoc">2147483647</int>
+ <int key="NSState">1</int>
+ <reference key="NSOnImage" ref="13790404"/>
+ <reference key="NSMixedImage" ref="218367874"/>
+ <string key="NSAction">_popUpItemAction:</string>
+ <reference key="NSTarget" ref="413609467"/>
+ </object>
<bool key="NSMenuItemRespectAlignment">YES</bool>
<object class="NSMenu" key="NSMenu" id="743346318">
<string key="NSTitle">OtherViews</string>
<object class="NSMutableArray" key="NSMenuItems">
<bool key="EncodedWithXMLCoder">YES</bool>
- <object class="NSMenuItem" id="165310533">
- <reference key="NSMenu" ref="743346318"/>
- <string key="NSTitle">10</string>
- <string key="NSKeyEquiv"/>
- <int key="NSKeyEquivModMask">1048576</int>
- <int key="NSMnemonicLoc">2147483647</int>
- <reference key="NSOnImage" ref="13790404"/>
- <reference key="NSMixedImage" ref="218367874"/>
- <string key="NSAction">_popUpItemAction:</string>
- <reference key="NSTarget" ref="413609467"/>
- </object>
+ <reference ref="165310533"/>
<object class="NSMenuItem" id="477590220">
<reference key="NSMenu" ref="743346318"/>
<string key="NSTitle">15</string>
<bool key="NSAltersState">YES</bool>
<int key="NSArrowPosition">2</int>
</object>
+ <bool key="NSAllowsLogicalLayoutDirection">NO</bool>
</object>
<object class="NSPopUpButton" id="822080053">
<reference key="NSNextResponder" ref="23728330"/>
<int key="NSvFlags">268</int>
<string key="NSFrame">{{299, 202}, {76, 22}}</string>
<reference key="NSSuperview" ref="23728330"/>
- <reference key="NSWindow"/>
<reference key="NSNextKeyView" ref="469378299"/>
<bool key="NSEnabled">YES</bool>
<object class="NSPopUpButtonCell" key="NSCell" id="434430620">
- <int key="NSCellFlags">-2076049856</int>
+ <int key="NSCellFlags">-2076180416</int>
<int key="NSCellFlags2">133120</int>
<reference key="NSSupport" ref="26"/>
<reference key="NSControlView" ref="822080053"/>
- <int key="NSButtonFlags">109199615</int>
+ <int key="NSButtonFlags">109199360</int>
<int key="NSButtonFlags2">129</int>
<string key="NSAlternateContents"/>
<string key="NSKeyEquivalent"/>
<bool key="NSAltersState">YES</bool>
<int key="NSArrowPosition">2</int>
</object>
+ <bool key="NSAllowsLogicalLayoutDirection">NO</bool>
</object>
<object class="NSPopUpButton" id="895206300">
<reference key="NSNextResponder" ref="23728330"/>
<int key="NSvFlags">268</int>
<string key="NSFrame">{{303, 49}, {66, 22}}</string>
<reference key="NSSuperview" ref="23728330"/>
- <reference key="NSWindow"/>
<reference key="NSNextKeyView" ref="200780219"/>
<bool key="NSEnabled">YES</bool>
<object class="NSPopUpButtonCell" key="NSCell" id="290473288">
- <int key="NSCellFlags">-2076049856</int>
+ <int key="NSCellFlags">-2076180416</int>
<int key="NSCellFlags2">133120</int>
<reference key="NSSupport" ref="26"/>
<reference key="NSControlView" ref="895206300"/>
- <int key="NSButtonFlags">109199615</int>
+ <int key="NSButtonFlags">109199360</int>
<int key="NSButtonFlags2">129</int>
<string key="NSAlternateContents"/>
<string key="NSKeyEquivalent"/>
<bool key="NSAltersState">YES</bool>
<int key="NSArrowPosition">2</int>
</object>
+ <bool key="NSAllowsLogicalLayoutDirection">NO</bool>
</object>
<object class="NSTextField" id="200780219">
<reference key="NSNextResponder" ref="23728330"/>
<int key="NSvFlags">256</int>
<string key="NSFrame">{{89, 20}, {46, 14}}</string>
<reference key="NSSuperview" ref="23728330"/>
- <reference key="NSWindow"/>
<reference key="NSNextKeyView" ref="712613872"/>
<bool key="NSEnabled">YES</bool>
<object class="NSTextFieldCell" key="NSCell" id="221545613">
- <int key="NSCellFlags">67239424</int>
+ <int key="NSCellFlags">67108864</int>
<int key="NSCellFlags2">272760832</int>
<string key="NSContents">Presets:</string>
<reference key="NSSupport" ref="26"/>
<reference key="NSBackgroundColor" ref="525377782"/>
<reference key="NSTextColor" ref="887152126"/>
</object>
+ <bool key="NSAllowsLogicalLayoutDirection">NO</bool>
</object>
</object>
<string key="NSFrameSize">{495, 241}</string>
- <reference key="NSSuperview"/>
- <reference key="NSWindow"/>
<reference key="NSNextKeyView" ref="226601760"/>
<object class="NSMutableString" key="NSClassName">
<characters key="NS.bytes">NSView</characters>
</object>
<int key="connectionID">403</int>
</object>
- <object class="IBConnectionRecord">
- <object class="IBBindingConnection" key="connection">
- <string key="label">value: values.UseCoreAudio</string>
- <reference key="source" ref="1054432492"/>
- <reference key="destination" ref="580534391"/>
- <object class="NSNibBindingConnector" key="connector">
- <reference key="NSSource" ref="1054432492"/>
- <reference key="NSDestination" ref="580534391"/>
- <string key="NSLabel">value: values.UseCoreAudio</string>
- <string key="NSBinding">value</string>
- <string key="NSKeyPath">values.UseCoreAudio</string>
- <int key="NSNibBindingConnectorVersion">2</int>
- </object>
- </object>
- <int key="connectionID">409</int>
- </object>
<object class="IBConnectionRecord">
<object class="IBBindingConnection" key="connection">
<string key="label">enabled: automaticallyChecksForUpdates</string>
<reference ref="725503362"/>
<reference ref="113289239"/>
<reference ref="172081130"/>
- <reference ref="1054432492"/>
<reference ref="168948265"/>
- <reference ref="247298122"/>
</object>
<reference key="parent" ref="0"/>
<string key="objectName">Audio</string>
<reference key="object" ref="562265695"/>
<reference key="parent" ref="712613872"/>
</object>
- <object class="IBObjectRecord">
- <int key="objectID">406</int>
- <reference key="object" ref="1054432492"/>
- <object class="NSMutableArray" key="children">
- <bool key="EncodedWithXMLCoder">YES</bool>
- <reference ref="787274685"/>
- </object>
- <reference key="parent" ref="332598366"/>
- </object>
- <object class="IBObjectRecord">
- <int key="objectID">407</int>
- <reference key="object" ref="787274685"/>
- <reference key="parent" ref="1054432492"/>
- </object>
<object class="IBObjectRecord">
<int key="objectID">410</int>
<reference key="object" ref="413269307"/>
<reference key="object" ref="221545613"/>
<reference key="parent" ref="200780219"/>
</object>
- <object class="IBObjectRecord">
- <int key="objectID">446</int>
- <reference key="object" ref="247298122"/>
- <object class="NSMutableArray" key="children">
- <bool key="EncodedWithXMLCoder">YES</bool>
- <reference ref="954547948"/>
- </object>
- <reference key="parent" ref="332598366"/>
- </object>
- <object class="IBObjectRecord">
- <int key="objectID">447</int>
- <reference key="object" ref="954547948"/>
- <reference key="parent" ref="247298122"/>
- </object>
<object class="IBObjectRecord">
<int key="objectID">448</int>
<reference key="object" ref="842132572"/>
<string>399.IBPluginDependency</string>
<string>401.IBPluginDependency</string>
<string>402.IBPluginDependency</string>
- <string>406.IBPluginDependency</string>
- <string>407.IBPluginDependency</string>
<string>410.IBPluginDependency</string>
<string>414.IBPluginDependency</string>
<string>415.IBPluginDependency</string>
<string>443.IBPluginDependency</string>
<string>444.IBPluginDependency</string>
<string>445.IBPluginDependency</string>
- <string>446.IBPluginDependency</string>
- <string>447.IBPluginDependency</string>
<string>448.IBPluginDependency</string>
<string>449.IBPluginDependency</string>
<string>450.IBPluginDependency</string>
<string>6.IBPluginDependency</string>
<string>61.IBPluginDependency</string>
</object>
- <object class="NSMutableArray" key="dict.values">
+ <object class="NSArray" key="dict.values">
<bool key="EncodedWithXMLCoder">YES</bool>
<string>com.apple.InterfaceBuilder.CocoaPlugin</string>
<string>com.apple.InterfaceBuilder.CocoaPlugin</string>
<string>com.apple.InterfaceBuilder.CocoaPlugin</string>
<string>com.apple.InterfaceBuilder.CocoaPlugin</string>
<string>com.apple.InterfaceBuilder.CocoaPlugin</string>
- <string>com.apple.InterfaceBuilder.CocoaPlugin</string>
- <string>com.apple.InterfaceBuilder.CocoaPlugin</string>
- <string>com.apple.InterfaceBuilder.CocoaPlugin</string>
- <string>com.apple.InterfaceBuilder.CocoaPlugin</string>
<string>{{69, 656}, {500, 200}}</string>
<string>com.apple.InterfaceBuilder.CocoaPlugin</string>
<string>com.apple.InterfaceBuilder.CocoaPlugin</string>
<string>fPictureView</string>
<string>fSendEncodeToAppField</string>
</object>
- <object class="NSMutableArray" key="dict.values">
+ <object class="NSArray" key="dict.values">
<bool key="EncodedWithXMLCoder">YES</bool>
<string>NSView</string>
<string>NSView</string>
<string>fPictureView</string>
<string>fSendEncodeToAppField</string>
</object>
- <object class="NSMutableArray" key="dict.values">
+ <object class="NSArray" key="dict.values">
<bool key="EncodedWithXMLCoder">YES</bool>
<object class="IBToOneOutletInfo">
<string key="name">fAdvancedView</string>
<string>NSMenuMixedState</string>
<string>NSSwitch</string>
</object>
- <object class="NSMutableArray" key="dict.values">
+ <object class="NSArray" key="dict.values">
<bool key="EncodedWithXMLCoder">YES</bool>
<string>{11, 11}</string>
<string>{10, 3}</string>
[newAudio setVideoContainerTag: [self videoContainerTag]];
[newAudio setTrackFromIndex: trackIndex];
- // map faac to ca_aac for built-in presets (can be disabled in preferences)
- if (0 == aType &&
- [[NSUserDefaults standardUserDefaults] boolForKey:@"UseCoreAudio"] &&
- [[dict objectForKey:@"AudioEncoder"] isEqualToString:@"AAC (faac)"])
- {
- key = @"AAC (CoreAudio)";
- }
- else
- {
- key = [dict objectForKey:@"AudioEncoder"];
- }
-
// map legacy encoder names via libhb
+ key = [dict objectForKey:@"AudioEncoder"];
if (key != nil)
{
const char *name;
@"YES", @"CheckForUpdates",
@"Open Source", @"LaunchSourceBehavior",
@"English", @"DefaultLanguage",
- @"YES", @"UseCoreAudio",
@"Auto", @"DefaultMpegExtension",
@"YES", @"UseDvdNav",
@"", @"DefAdvancedx264Flags",
[childrenArray addObject:[self createAppleTV3Preset]];
[childrenArray addObject:[self createAndroidPreset]];
[childrenArray addObject:[self createAndroidTabletPreset]];
+ [childrenArray addObject:[self createW8PhonePreset]];
/* Add the individual presets to the folder */
[preset setObject:[NSMutableArray arrayWithArray:childrenArray]
return preset;
}
+- (NSDictionary *)createW8PhonePreset
+{
+ NSMutableDictionary *preset = [[NSMutableDictionary alloc] init];
+
+ /* Preset properties (name, type: factory/user, default, folder, tooltip) */
+ [preset setObject:@"Windows Phone 8" forKey:@"PresetName"];
+ [preset setObject:[NSNumber numberWithInt:0] forKey:@"Type"]; //factory
+ [preset setObject:[NSNumber numberWithInt:0] forKey:@"Default"];
+ [preset setObject:[NSNumber numberWithBool:NO] forKey:@"Folder"];
+ [preset setObject:@"HandBrake's preset for Windows Phone 8 devices"
+ forKey:@"PresetDescription"];
+
+ /* Container format and related settings */
+ [preset setObject:@"MP4 file" forKey:@"FileFormat"];
+ [preset setObject:[NSNumber numberWithInt:0] forKey:@"Mp4LargeFile"];
+ [preset setObject:[NSNumber numberWithInt:0] forKey:@"Mp4HttpOptimize"];
+ [preset setObject:[NSNumber numberWithInt:0] forKey:@"Mp4iPodCompatible"];
+
+ /* Chapter markers */
+ [preset setObject:[NSNumber numberWithInt:0] forKey:@"ChapterMarkers"];
+
+ /* Video encoder and advanced options */
+ [preset setObject:@"H.264 (x264)" forKey:@"VideoEncoder"];
+ [preset setObject:@"" forKey:@"lavcOption"];
+ [preset setObject:@"" forKey:@"x264Option"];
+ [preset setObject:[NSNumber numberWithInt:0] forKey:@"x264UseAdvancedOptions"];
+ [preset setObject:@"medium" forKey:@"x264Preset"];
+ [preset setObject:@"" forKey:@"x264Tune"];
+ [preset setObject:@"" forKey:@"x264OptionExtra"];
+ [preset setObject:@"main" forKey:@"h264Profile"];
+ [preset setObject:@"3.1" forKey:@"h264Level"];
+
+ /* Video rate control */
+ [preset setObject:@"2500" forKey:@"VideoAvgBitrate"];
+ [preset setObject:[NSNumber numberWithInt:0] forKey:@"VideoTwoPass"];
+ [preset setObject:[NSNumber numberWithInt:0] forKey:@"VideoTurboTwoPass"];
+ [preset setObject:[NSNumber numberWithInt:2] forKey:@"VideoQualityType"]; //cq
+ [preset setObject:[NSNumber numberWithFloat:22.0] forKey:@"VideoQualitySlider"];
+
+ /* Video frame rate */
+ [preset setObject:@"30" forKey:@"VideoFramerate"];
+ [preset setObject:@"pfr" forKey:@"VideoFramerateMode"];
+
+ /* Picture size */
+ [preset setObject:[NSNumber numberWithInt:1] forKey:@"UsesPictureSettings"];
+ [preset setObject:[NSNumber numberWithInt:1280] forKey:@"PictureWidth"];
+ [preset setObject:[NSNumber numberWithInt:720] forKey:@"PictureHeight"];
+ [preset setObject:[NSNumber numberWithInt:2] forKey:@"PicturePAR"]; //loose
+ [preset setObject:[NSNumber numberWithInt:2] forKey:@"PictureModulus"];
+ [preset setObject:[NSNumber numberWithInt:0] forKey:@"PictureKeepRatio"]; //set to 0 for Loose (FIXME: why?)
+
+ /* Picture filters */
+ [preset setObject:[NSNumber numberWithInt:1] forKey:@"UsesPictureFilters"];
+ [preset setObject:[NSNumber numberWithInt:0] forKey:@"PictureDecomb"]; //off
+ [preset setObject:@"" forKey:@"PictureDecombCustom"];
+ [preset setObject:[NSNumber numberWithInt:1] forKey:@"PictureDecombDeinterlace"]; //decomb
+ [preset setObject:[NSNumber numberWithInt:0] forKey:@"PictureDeinterlace"];
+ [preset setObject:@"" forKey:@"PictureDeinterlaceCustom"];
+ [preset setObject:[NSNumber numberWithInt:0] forKey:@"PictureDetelecine"];
+ [preset setObject:@"" forKey:@"PictureDetelecineCustom"];
+ [preset setObject:[NSNumber numberWithInt:0] forKey:@"PictureDenoise"];
+ [preset setObject:@"" forKey:@"PictureDenoiseCustom"];
+ [preset setObject:[NSNumber numberWithInt:0] forKey:@"PictureDeblock"];
+ [preset setObject:[NSNumber numberWithInt:0] forKey:@"VideoGrayScale"];
+
+ /* Picture crop */
+ [preset setObject:[NSNumber numberWithInt:1] forKey:@"PictureAutoCrop"];
+ [preset setObject:[NSNumber numberWithInt:0] forKey:@"PictureTopCrop"];
+ [preset setObject:[NSNumber numberWithInt:0] forKey:@"PictureBottomCrop"];
+ [preset setObject:[NSNumber numberWithInt:0] forKey:@"PictureLeftCrop"];
+ [preset setObject:[NSNumber numberWithInt:0] forKey:@"PictureRightCrop"];
+
+ /* Auto Passthru */
+ [preset setObject:@"AC3 (ffmpeg)" forKey:@"AudioEncoderFallback"];
+ [preset setObject:[NSNumber numberWithInt:1] forKey:@"AudioAllowAACPass"];
+ [preset setObject:[NSNumber numberWithInt:1] forKey:@"AudioAllowAC3Pass"];
+ [preset setObject:[NSNumber numberWithInt:1] forKey:@"AudioAllowDTSHDPass"];
+ [preset setObject:[NSNumber numberWithInt:1] forKey:@"AudioAllowDTSPass"];
+ [preset setObject:[NSNumber numberWithInt:1] forKey:@"AudioAllowMP3Pass"];
+
+ /* Audio track list - no need to add "None" at the end */
+ NSMutableArray *audioListArray = [[NSMutableArray alloc] init];
+ /* Track 1 */
+ NSMutableDictionary *audioTrack1Array = [[NSMutableDictionary alloc] init];
+ [audioTrack1Array setObject:[NSNumber numberWithInt:1] forKey:@"AudioTrack"];
+ [audioTrack1Array setObject:@"AAC (faac)" forKey:@"AudioEncoder"];
+ [audioTrack1Array setObject:@"Dolby Pro Logic II" forKey:@"AudioMixdown"];
+ [audioTrack1Array setObject:@"Auto" forKey:@"AudioSamplerate"];
+ [audioTrack1Array setObject:@"128" forKey:@"AudioBitrate"];
+ [audioTrack1Array setObject:[NSNumber numberWithFloat:0.0] forKey:@"AudioTrackGainSlider"];
+ [audioTrack1Array setObject:[NSNumber numberWithFloat:0.0] forKey:@"AudioTrackDRCSlider"];
+ [audioTrack1Array autorelease];
+ [audioListArray addObject:audioTrack1Array];
+ /* Add the audio track(s) to the preset's audio list */
+ [preset setObject:[NSMutableArray arrayWithArray:audioListArray] forKey:@"AudioList"];
+
+ /* Subtitles (note: currently ignored) */
+ [preset setObject:@"None" forKey:@"Subtitles"];
+
+ /* Clean up and return the preset */
+ [preset autorelease];
+ return preset;
+}
+
- (NSDictionary *)createNormalPreset
{
NSMutableDictionary *preset = [[NSMutableDictionary alloc] init];
27D6C75014B102DA00B785E4 /* libdvdnav.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 27D6C72E14B102DA00B785E4 /* libdvdnav.a */; };
27D6C75114B102DA00B785E4 /* libdvdread.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 27D6C72F14B102DA00B785E4 /* libdvdread.a */; };
27D6C75214B102DA00B785E4 /* libdvdread.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 27D6C72F14B102DA00B785E4 /* libdvdread.a */; };
- 27D6C75314B102DA00B785E4 /* libfaac.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 27D6C73014B102DA00B785E4 /* libfaac.a */; };
- 27D6C75414B102DA00B785E4 /* libfaac.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 27D6C73014B102DA00B785E4 /* libfaac.a */; };
27D6C75514B102DA00B785E4 /* libfontconfig.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 27D6C73114B102DA00B785E4 /* libfontconfig.a */; };
27D6C75614B102DA00B785E4 /* libfontconfig.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 27D6C73114B102DA00B785E4 /* libfontconfig.a */; };
27D6C75714B102DA00B785E4 /* libfreetype.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 27D6C73214B102DA00B785E4 /* libfreetype.a */; };
27D6C72C14B102DA00B785E4 /* libbluray.a */ = {isa = PBXFileReference; lastKnownFileType = archive.ar; name = libbluray.a; path = external/contrib/lib/libbluray.a; sourceTree = BUILT_PRODUCTS_DIR; };
27D6C72E14B102DA00B785E4 /* libdvdnav.a */ = {isa = PBXFileReference; lastKnownFileType = archive.ar; name = libdvdnav.a; path = external/contrib/lib/libdvdnav.a; sourceTree = BUILT_PRODUCTS_DIR; };
27D6C72F14B102DA00B785E4 /* libdvdread.a */ = {isa = PBXFileReference; lastKnownFileType = archive.ar; name = libdvdread.a; path = external/contrib/lib/libdvdread.a; sourceTree = BUILT_PRODUCTS_DIR; };
- 27D6C73014B102DA00B785E4 /* libfaac.a */ = {isa = PBXFileReference; lastKnownFileType = archive.ar; name = libfaac.a; path = external/contrib/lib/libfaac.a; sourceTree = BUILT_PRODUCTS_DIR; };
27D6C73114B102DA00B785E4 /* libfontconfig.a */ = {isa = PBXFileReference; lastKnownFileType = archive.ar; name = libfontconfig.a; path = external/contrib/lib/libfontconfig.a; sourceTree = BUILT_PRODUCTS_DIR; };
27D6C73214B102DA00B785E4 /* libfreetype.a */ = {isa = PBXFileReference; lastKnownFileType = archive.ar; name = libfreetype.a; path = external/contrib/lib/libfreetype.a; sourceTree = BUILT_PRODUCTS_DIR; };
27D6C73314B102DA00B785E4 /* libfribidi.a */ = {isa = PBXFileReference; lastKnownFileType = archive.ar; name = libfribidi.a; path = external/contrib/lib/libfribidi.a; sourceTree = BUILT_PRODUCTS_DIR; };
27D6C74C14B102DA00B785E4 /* libbluray.a in Frameworks */,
27D6C75014B102DA00B785E4 /* libdvdnav.a in Frameworks */,
27D6C75214B102DA00B785E4 /* libdvdread.a in Frameworks */,
- 27D6C75414B102DA00B785E4 /* libfaac.a in Frameworks */,
27D6C75614B102DA00B785E4 /* libfontconfig.a in Frameworks */,
27D6C75814B102DA00B785E4 /* libfreetype.a in Frameworks */,
27D6C75A14B102DA00B785E4 /* libfribidi.a in Frameworks */,
27D6C74B14B102DA00B785E4 /* libbluray.a in Frameworks */,
27D6C74F14B102DA00B785E4 /* libdvdnav.a in Frameworks */,
27D6C75114B102DA00B785E4 /* libdvdread.a in Frameworks */,
- 27D6C75314B102DA00B785E4 /* libfaac.a in Frameworks */,
27D6C75514B102DA00B785E4 /* libfontconfig.a in Frameworks */,
27D6C75714B102DA00B785E4 /* libfreetype.a in Frameworks */,
27D6C75914B102DA00B785E4 /* libfribidi.a in Frameworks */,
27D6C72C14B102DA00B785E4 /* libbluray.a */,
27D6C72E14B102DA00B785E4 /* libdvdnav.a */,
27D6C72F14B102DA00B785E4 /* libdvdread.a */,
- 27D6C73014B102DA00B785E4 /* libfaac.a */,
27D6C73114B102DA00B785E4 /* libfontconfig.a */,
27D6C73214B102DA00B785E4 /* libfreetype.a */,
27D6C73314B102DA00B785E4 /* libfribidi.a */,
MACOSX.map.g.max = debug
ifeq (1,$(FEATURE.fdk_aac))
-MACOSX.extra_ldflags = OTHER_LDFLAGS='$(abspath $(BUILD))/contrib/lib/libfdk-aac.a'
+ extra_libs += $(abspath $(BUILD))/contrib/lib/libfdk-aac.a
endif
+ifeq (1,$(FEATURE.faac))
+ extra_libs += $(abspath $(BUILD))/contrib/lib/libfaac.a
+endif
+MACOSX.extra_ldflags = OTHER_LDFLAGS='$(extra_libs)'
+
## xcconfig: must be one of macosx/xcconfig/*.xcconfig
MACOSX.xcconfig = $(foreach x,$(XCODE.xcconfig),-xcconfig $(MACOSX.src/)xcconfig/$(x))
MACOSX.sdk = $(foreach sdk,$(GCC.sysroot),-sdk $(sdk))
grp.add_option( '--enable-qsv', default=False, action='store_true', help=h )
h = IfHost( 'enable use of fdk-aac encoder', '*-*-*', none=optparse.SUPPRESS_HELP ).value
- grp.add_option( '--enable-fdk-aac', default=False, action='store_true', help=h )
+ grp.add_option( '--enable-fdk-aac', dest="enable_fdk_aac", default=not host.match( '*-*-darwin*' ), action='store_true', help=h )
+ grp.add_option( '--disable-fdk-aac', dest="enable_fdk_aac", action='store_false' )
+
+ h = IfHost( 'enable use of libav aac encoder', '*-*-*', none=optparse.SUPPRESS_HELP ).value
+ grp.add_option( '--enable-libav-aac', dest="enable_libav_aac", default=not host.match( '*-*-darwin*' ), action='store_true', help=h )
+ grp.add_option( '--disable-libav-aac', dest="enable_libav_aac", action='store_false' )
+
+ h = IfHost( 'enable use of faac encoder', '*-*-*', none=optparse.SUPPRESS_HELP ).value
+ grp.add_option( '--enable-faac', dest="enable_faac", default=False, action='store_true', help=h )
+ grp.add_option( '--disable-faac', dest="enable_faac", action='store_false' )
cli.add_option_group( grp )
doc.add( 'FEATURE.gtk.mingw', int( options.enable_gtk_mingw ))
doc.add( 'FEATURE.gst', int( not options.disable_gst ))
doc.add( 'FEATURE.ff.mpeg2', int( options.enable_ff_mpeg2 ))
- doc.add( 'FEATURE.fdk_aac', int( options.enable_fdk_aac ))
+ doc.add( 'FEATURE.fdk_aac', int( options.enable_fdk_aac ))
+ doc.add( 'FEATURE.libav_aac', int( options.enable_libav_aac ))
+ doc.add( 'FEATURE.faac', int( options.enable_faac ))
doc.add( 'FEATURE.qsv', int( options.enable_qsv ))
doc.add( 'FEATURE.xcode', int( not (Tools.xcodebuild.fail or options.disable_xcode or options.cross) ))
MODULES += contrib/fdk-aac
endif
+ifeq (1,$(FEATURE.faac))
+ MODULES += contrib/faac
+endif
+
MODULES += contrib/lame
-MODULES += contrib/faac
MODULES += contrib/ffmpeg
MODULES += contrib/libdvdread
MODULES += contrib/libdvdnav
end
#Video encoder
- if hash["VideoEncoder"] != "MPEG-4 (FFmpeg)"
- commandString << " -e "
- case hash["VideoEncoder"]
- when /x264/
- commandString << "x264"
- when /Theora/
- commandString << "theora"
- when /MPEG/
- commandString << "ffmpeg2"
- end
+ commandString << " -e "
+ case hash["VideoEncoder"]
+ when /x264/
+ commandString << "x264"
+ when /Theora/
+ commandString << "theora"
+ when /MPEG-4/
+ commandString << "ffmpeg4"
+ when /MPEG-2/
+ commandString << "ffmpeg2"
end
#VideoRateControl
when /AC3 Pass/
audioEncoders << "copy:ac3"
when /AC3/
- audioEncoders << "ffac3"
+ audioEncoders << "ac3"
when /DTS Pass/
audioEncoders << "copy:dts"
when /DTS-HD Pass/
audioEncoders << "copy:dtshd"
when /AAC Pass/
audioEncoders << "copy:aac"
- when "AAC (FDK)"
- audioEncoders << "fdk_aac"
when "AAC (faac)"
audioEncoders << "faac"
- when "AAC (ffmpeg)"
- audioEncoders << "ffaac"
- when "AAC (CoreAudio)"
- audioEncoders << "ca_aac"
+ when "AAC (ffmpeg)", "AAC (avcodec)"
+ audioEncoders << "av_aac"
+ when "AAC (FDK)"
+ audioEncoders << "fdk_aac"
when "HE-AAC (FDK)"
audioEncoders << "fdk_haac"
+ when "AAC (CoreAudio)"
+ audioEncoders << "ca_aac"
when "HE-AAC (CoreAudio)"
audioEncoders << "ca_haac"
when /Vorbis/
when /MP3 Pass/
audioEncoders << "copy:mp3"
when /MP3/
- audioEncoders << "lame"
- when "FLAC (ffmpeg)"
- audioEncoders << "ffflac"
- when "FLAC (24-bit)"
- audioEncoders << "ffflac24"
+ audioEncoders << "mp3"
+ when "FLAC (ffmpeg)", "FLAC 16-bit"
+ audioEncoders << "flac16"
+ when "FLAC (24-bit)", "FLAC 24-bit"
+ audioEncoders << "flac24"
when /Auto Pass/
audioEncoders << "copy"
end
case hash["AudioEncoderFallback"]
when /AC3/
- audioEncoderFallback << "ffac3"
- when "AAC (ffmpeg)"
- audioEncoderFallback << "ffaac"
- when /AAC/
+ audioEncoderFallback << "ac3"
+ when "AAC (faac)"
audioEncoderFallback << "faac"
+ when "AAC (ffmpeg)", "AAC (avcodec)"
+ audioEncoderFallback << "av_aac"
+ when "AAC (FDK)"
+ audioEncoderFallback << "fdk_aac"
+ when "HE-AAC (FDK)"
+ audioEncoderFallback << "fdk_haac"
+ when "AAC (CoreAudio)"
+ audioEncoderFallback << "ca_aac"
+ when "HE-AAC (CoreAudio)"
+ audioEncoderFallback << "ca_haac"
when /Vorbis/
audioEncoderFallback << "vorbis"
when /MP3/
- audioEncoderFallback << "lame"
- when /FLAC/
- audioEncoderFallback << "ffflac"
+ audioEncoderFallback << "mp3"
+ when "FLAC (ffmpeg)", "FLAC 16-bit"
+ audioEncoderFallback << "flac16"
+ when "FLAC (24-bit)", "FLAC 24-bit"
+ audioEncoderFallback << "flac24"
end
if audioEncoderFallback.size > 0
commandString << '+ ' << hash["PresetName"] << ":"
#Video encoder
- if hash["VideoEncoder"] != "MPEG-4 (FFmpeg)"
- commandString << " -e "
- case hash["VideoEncoder"]
- when /x264/
- commandString << "x264"
- when /Theora/
- commandString << "theora"
- when /MPEG/
- commandString << "ffmpeg2"
- end
+ commandString << " -e "
+ case hash["VideoEncoder"]
+ when /x264/
+ commandString << "x264"
+ when /Theora/
+ commandString << "theora"
+ when /MPEG-4/
+ commandString << "ffmpeg4"
+ when /MPEG-2/
+ commandString << "ffmpeg2"
end
#VideoRateControl
when /AC3 Pass/
audioEncoders << "copy:ac3"
when /AC3/
- audioEncoders << "ffac3"
+ audioEncoders << "ac3"
when /DTS Pass/
audioEncoders << "copy:dts"
when /DTS-HD Pass/
audioEncoders << "copy:dtshd"
when /AAC Pass/
audioEncoders << "copy:aac"
- when "AAC (FDK)"
- audioEncoders << "fdk_aac"
when "AAC (faac)"
audioEncoders << "faac"
- when "AAC (ffmpeg)"
- audioEncoders << "ffaac"
- when "AAC (CoreAudio)"
- audioEncoders << "ca_aac"
+ when "AAC (ffmpeg)", "AAC (avcodec)"
+ audioEncoders << "av_aac"
+ when "AAC (FDK)"
+ audioEncoders << "fdk_aac"
when "HE-AAC (FDK)"
audioEncoders << "fdk_haac"
+ when "AAC (CoreAudio)"
+ audioEncoders << "ca_aac"
when "HE-AAC (CoreAudio)"
audioEncoders << "ca_haac"
when /Vorbis/
when /MP3 Pass/
audioEncoders << "copy:mp3"
when /MP3/
- audioEncoders << "lame"
- when "FLAC (ffmpeg)"
- audioEncoders << "ffflac"
- when "FLAC (24-bit)"
- audioEncoders << "ffflac24"
+ audioEncoders << "mp3"
+ when "FLAC (ffmpeg)", "FLAC 16-bit"
+ audioEncoders << "flac16"
+ when "FLAC (24-bit)", "FLAC 24-bit"
+ audioEncoders << "flac24"
when /Auto Pass/
audioEncoders << "copy"
end
case hash["AudioEncoderFallback"]
when /AC3/
- audioEncoderFallback << "ffac3"
- when "AAC (ffmpeg)"
- audioEncoderFallback << "ffaac"
- when /AAC/
+ audioEncoderFallback << "ac3"
+ when "AAC (faac)"
audioEncoderFallback << "faac"
+ when "AAC (ffmpeg)", "AAC (avcodec)"
+ audioEncoderFallback << "av_aac"
+ when "AAC (FDK)"
+ audioEncoderFallback << "fdk_aac"
+ when "HE-AAC (FDK)"
+ audioEncoderFallback << "fdk_haac"
+ when "AAC (CoreAudio)"
+ audioEncoderFallback << "ca_aac"
+ when "HE-AAC (CoreAudio)"
+ audioEncoderFallback << "ca_haac"
when /Vorbis/
audioEncoderFallback << "vorbis"
when /MP3/
- audioEncoderFallback << "lame"
- when /FLAC/
- audioEncoderFallback << "ffflac"
+ audioEncoderFallback << "mp3"
+ when "FLAC (ffmpeg)", "FLAC 16-bit"
+ audioEncoderFallback << "flac16"
+ when "FLAC (24-bit)", "FLAC 24-bit"
+ audioEncoderFallback << "flac24"
end
if audioEncoderFallback.size > 0
end
#Video encoder
- if hash["VideoEncoder"] != "MPEG-4 (FFmpeg)"
- commandString << "vcodec = "
- case hash["VideoEncoder"]
- when /x264/
- commandString << "HB_VCODEC_X264;\n "
- when /Theora/
- commandString << "HB_VCODEC_THEORA;\n "
- when /MPEG/
- commandString << "HB_VCODEC_FFMPEG_MPEG2;\n "
- end
+ commandString << "vcodec = "
+ case hash["VideoEncoder"]
+ when /x264/
+ commandString << "HB_VCODEC_X264;\n "
+ when /Theora/
+ commandString << "HB_VCODEC_THEORA;\n "
+ when /MPEG-4/
+ commandString << "HB_VCODEC_FFMPEG_MPEG4;\n "
+ when /MPEG-2/
+ commandString << "HB_VCODEC_FFMPEG_MPEG2;\n "
end
#VideoRateControl
when /AC3 Pass/
audioEncoders << "copy:ac3"
when /AC3/
- audioEncoders << "ffac3"
+ audioEncoders << "ac3"
when /DTS Pass/
audioEncoders << "copy:dts"
when /DTS-HD Pass/
audioEncoders << "copy:dtshd"
when /AAC Pass/
audioEncoders << "copy:aac"
- when "AAC (FDK)"
- audioEncoders << "fdk_aac"
when "AAC (faac)"
audioEncoders << "faac"
- when "AAC (ffmpeg)"
- audioEncoders << "ffaac"
- when "AAC (CoreAudio)"
- audioEncoders << "ca_aac"
+ when "AAC (ffmpeg)", "AAC (avcodec)"
+ audioEncoders << "av_aac"
+ when "AAC (FDK)"
+ audioEncoders << "fdk_aac"
when "HE-AAC (FDK)"
audioEncoders << "fdk_haac"
+ when "AAC (CoreAudio)"
+ audioEncoders << "ca_aac"
when "HE-AAC (CoreAudio)"
audioEncoders << "ca_haac"
when /Vorbis/
when /MP3 Pass/
audioEncoders << "copy:mp3"
when /MP3/
- audioEncoders << "lame"
- when "FLAC (ffmpeg)"
- audioEncoders << "ffflac"
- when "FLAC (24-bit)"
- audioEncoders << "ffflac24"
+ audioEncoders << "mp3"
+ when "FLAC (ffmpeg)", "FLAC 16-bit"
+ audioEncoders << "flac16"
+ when "FLAC (24-bit)", "FLAC 24-bit"
+ audioEncoders << "flac24"
when /Auto Pass/
audioEncoders << "copy"
end
case hash["AudioEncoderFallback"]
when /AC3/
- audioEncoderFallback << "ffac3"
- when "AAC (FDK)"
- audioEncoderFallback << "fdk_aac"
+ audioEncoderFallback << "ac3"
when "AAC (faac)"
audioEncoderFallback << "faac"
- when "AAC (ffmpeg)"
- audioEncoderFallback << "ffaac"
- when "AAC (CoreAudio)"
- audioEncoderFallback << "ca_aac"
+ when "AAC (ffmpeg)", "AAC (avcodec)"
+ audioEncoderFallback << "av_aac"
+ when "AAC (FDK)"
+ audioEncoderFallback << "fdk_aac"
when "HE-AAC (FDK)"
audioEncoderFallback << "fdk_haac"
+ when "AAC (CoreAudio)"
+ audioEncoderFallback << "ca_aac"
when "HE-AAC (CoreAudio)"
audioEncoderFallback << "ca_haac"
when /Vorbis/
audioEncoderFallback << "vorbis"
when /MP3/
- audioEncoderFallback << "lame"
- when "FLAC (ffmpeg)"
- audioEncoderFallback << "ffflac"
- when "FLAC (24-bit)"
- audioEncoderFallback << "ffflac24"
+ audioEncoderFallback << "mp3"
+ when "FLAC (ffmpeg)", "FLAC 16-bit"
+ audioEncoderFallback << "flac16"
+ when "FLAC (24-bit)", "FLAC 24-bit"
+ audioEncoderFallback << "flac24"
end
if audioEncoderFallback.size > 0
commandString << "+ " << hash["PresetName"] << ": "
#Video encoder
- if hash["VideoEncoder"] != "MPEG-4 (FFmpeg)"
- commandString << " -e "
- case hash["VideoEncoder"]
- when /x264/
- commandString << "x264 "
- when /Theora/
- commandString << "theora "
- when /MPEG/
- commandString << "ffmpeg2 "
- end
+ commandString << " -e "
+ case hash["VideoEncoder"]
+ when /x264/
+ commandString << "x264 "
+ when /Theora/
+ commandString << "theora "
+ when /MPEG-4/
+ commandString << "ffmpeg4 "
+ when /MPEG-2/
+ commandString << "ffmpeg2 "
end
#VideoRateControl
when /AC3 Pass/
audioEncoders << "copy:ac3"
when /AC3/
- audioEncoders << "ffac3"
+ audioEncoders << "ac3"
when /DTS Pass/
audioEncoders << "copy:dts"
when /DTS-HD Pass/
audioEncoders << "copy:dtshd"
when /AAC Pass/
audioEncoders << "copy:aac"
- when "AAC (FDK)"
- audioEncoders << "fdk_aac"
when "AAC (faac)"
audioEncoders << "faac"
- when "AAC (ffmpeg)"
- audioEncoders << "ffaac"
- when "AAC (CoreAudio)"
- audioEncoders << "ca_aac"
+ when "AAC (ffmpeg)", "AAC (avcodec)"
+ audioEncoders << "av_aac"
+ when "AAC (FDK)"
+ audioEncoders << "fdk_aac"
when "HE-AAC (FDK)"
audioEncoders << "fdk_haac"
+ when "AAC (CoreAudio)"
+ audioEncoders << "ca_aac"
when "HE-AAC (CoreAudio)"
audioEncoders << "ca_haac"
when /Vorbis/
when /MP3 Pass/
audioEncoders << "copy:mp3"
when /MP3/
- audioEncoders << "lame"
- when "FLAC (ffmpeg)"
- audioEncoders << "ffflac"
- when "FLAC (24-bit)"
- audioEncoders << "ffflac24"
+ audioEncoders << "mp3"
+ when "FLAC (ffmpeg)", "FLAC 16-bit"
+ audioEncoders << "flac16"
+ when "FLAC (24-bit)", "FLAC 24-bit"
+ audioEncoders << "flac24"
when /Auto Pass/
audioEncoders << "copy"
end
case hash["AudioEncoderFallback"]
when /AC3/
- audioEncoderFallback << "ffac3"
- when "AAC (ffmpeg)"
- audioEncoderFallback << "ffaac"
- when /AAC/
+ audioEncoderFallback << "ac3"
+ when "AAC (faac)"
audioEncoderFallback << "faac"
+ when "AAC (ffmpeg)", "AAC (avcodec)"
+ audioEncoderFallback << "av_aac"
+ when "AAC (FDK)"
+ audioEncoderFallback << "fdk_aac"
+ when "HE-AAC (FDK)"
+ audioEncoderFallback << "fdk_haac"
+ when "AAC (CoreAudio)"
+ audioEncoderFallback << "ca_aac"
+ when "HE-AAC (CoreAudio)"
+ audioEncoderFallback << "ca_haac"
when /Vorbis/
audioEncoderFallback << "vorbis"
when /MP3/
- audioEncoderFallback << "lame"
- when /FLAC/
- audioEncoderFallback << "ffflac"
+ audioEncoderFallback << "mp3"
+ when "FLAC (ffmpeg)", "FLAC 16-bit"
+ audioEncoderFallback << "flac16"
+ when "FLAC (24-bit)", "FLAC 24-bit"
+ audioEncoderFallback << "flac24"
end
if audioEncoderFallback.size > 0
TEST.libs = $(LIBHB.a)
TEST.GCC.l = \
- a52 ass avcodec avformat avutil avresample dvdnav dvdread faac \
+ a52 ass avcodec avformat avutil avresample dvdnav dvdread \
fontconfig freetype fribidi mkv mpeg2 mp3lame mp4v2 ogg \
samplerate swscale theoraenc theoradec vorbis vorbisenc x264 \
bluray xml2 bz2 z
TEST.GCC.l += fdk-aac
endif
+ifeq (1,$(FEATURE.faac))
+TEST.GCC.l += faac
+endif
+
TEST.install.exe = $(DESTDIR)$(PREFIX/)bin/$(notdir $(TEST.exe))
###############################################################################
}
modulus = 2;
}
+ if (!strcasecmp(preset_name, "Windows Phone 8"))
+ {
+ if( !mux )
+ {
+ mux = HB_MUX_MP4;
+ }
+ vcodec = HB_VCODEC_X264;
+ job->vquality = 22.0;
+ filter_vrate_base = 900000;
+ filter_cfr = 2;
+ if( !atracks )
+ {
+ atracks = strdup("1");
+ }
+ if( !acodecs )
+ {
+ acodecs = strdup("faac");
+ }
+ if( !abitrates )
+ {
+ abitrates = str_split("128", ',');
+ }
+ if( !mixdowns )
+ {
+ mixdowns = strdup("dpl2");
+ }
+ if( !arates )
+ {
+ arates = strdup("Auto");
+ }
+ if( !dynamic_range_compression )
+ {
+ dynamic_range_compression = strdup("0.0");
+ }
+ if( allowed_audio_copy == -1 )
+ {
+ allowed_audio_copy = 0;
+ allowed_audio_copy |= HB_ACODEC_AAC_PASS;
+ allowed_audio_copy |= HB_ACODEC_AC3_PASS;
+ allowed_audio_copy |= HB_ACODEC_DCA_HD_PASS;
+ allowed_audio_copy |= HB_ACODEC_DCA_PASS;
+ allowed_audio_copy |= HB_ACODEC_MP3_PASS;
+ allowed_audio_copy &= HB_ACODEC_PASS_MASK;
+ }
+ if( acodec_fallback == NULL )
+ {
+ acodec_fallback = "ffac3";
+ }
+ maxWidth = 1280;
+ maxHeight = 720;
+ if (x264_preset == NULL)
+ {
+ x264_preset = strdup("medium");
+ }
+ if (h264_profile == NULL)
+ {
+ h264_profile = strdup("main");
+ }
+ if (h264_level == NULL)
+ {
+ h264_level = strdup("3.1");
+ }
+ if( !anamorphic_mode )
+ {
+ anamorphic_mode = 2;
+ }
+ modulus = 2;
+ }
if (!strcasecmp(preset_name, "Normal"))
{
if( !mux )
"### Video Options------------------------------------------------------------\n\n"
" -e, --encoder <string> Set video library encoder\n"
" Options: " );
+ name = NULL;
encoder = NULL;
while ((encoder = hb_video_encoder_get_next(encoder)) != NULL)
{
printf("\n + AppleTV 3: -e x264 -q 20.0 -r 30 --pfr -a 1,1 -E faac,copy:ac3 -B 160,160 -6 dpl2,none -R Auto,Auto -D 0.0,0.0 --audio-copy-mask aac,ac3,dtshd,dts,mp3 --audio-fallback ffac3 -f mp4 -4 -X 1920 -Y 1080 --decomb=fast --loose-anamorphic --modulus 2 -m --x264-preset medium --h264-profile high --h264-level 4.0\n");
printf("\n + Android: -e x264 -q 22.0 -r 30 --pfr -a 1 -E faac -B 128 -6 dpl2 -R Auto -D 0.0 --audio-copy-mask aac,ac3,dtshd,dts,mp3 --audio-fallback ffac3 -f mp4 -X 720 -Y 576 --loose-anamorphic --modulus 2 --x264-preset medium --h264-profile main --h264-level 3.0\n");
printf("\n + Android Tablet: -e x264 -q 22.0 -r 30 --pfr -a 1 -E faac -B 128 -6 dpl2 -R Auto -D 0.0 --audio-copy-mask aac,ac3,dtshd,dts,mp3 --audio-fallback ffac3 -f mp4 -X 1280 -Y 720 --loose-anamorphic --modulus 2 --x264-preset medium --h264-profile main --h264-level 3.1\n");
- printf("\n>\n");
+ printf("\n + Windows Phone 8: -e x264 -q 22.0 -r 30 --pfr -a 1 -E faac -B 128 -6 dpl2 -R Auto -D 0.0 --audio-copy-mask aac,ac3,dtshd,dts,mp3 --audio-fallback ffac3 -f mp4 -X 1280 -Y 720 --loose-anamorphic --modulus 2 --x264-preset medium --h264-profile main --h264-level 3.1\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 Auto -D 0.0 --audio-copy-mask aac,ac3,dtshd,dts,mp3 --audio-fallback ffac3 -f mp4 --loose-anamorphic --modulus 2 -m --x264-preset veryfast --h264-profile main --h264-level 4.0\n");
printf("\n + High Profile: -e x264 -q 20.0 -a 1,1 -E faac,copy:ac3 -B 160,160 -6 dpl2,none -R Auto,Auto -D 0.0,0.0 --audio-copy-mask aac,ac3,dtshd,dts,mp3 --audio-fallback ffac3 -f mp4 -4 --decomb --loose-anamorphic --modulus 2 -m --x264-preset medium --h264-profile high --h264-level 4.1\n");
<Compile Include="Isolation\BackgroundServiceConnector.cs" />\r
<Compile Include="Isolation\IsolatedEncodeService.cs" />\r
<Compile Include="Isolation\IsolatedScanService.cs" />\r
+ <Compile Include="LibHb\AudioVideoHelpers.cs" />\r
<Compile Include="Services\Interfaces\IEncodeServiceWrapper.cs" />\r
<Compile Include="Services\Interfaces\IHbServiceCallback.cs" />\r
<Compile Include="Services\Interfaces\IScanServiceWrapper.cs" />\r
--- /dev/null
+// --------------------------------------------------------------------------------------------------------------------\r
+// <copyright file="AudioVideoHelpers.cs" company="HandBrake Project (http://handbrake.fr)">\r
+// This file is part of the HandBrake source code - It may be used under the terms of the GNU General Public License.\r
+// </copyright>\r
+// <summary>\r
+// Defines the AudioVideoHelpers type.\r
+// </summary>\r
+// --------------------------------------------------------------------------------------------------------------------\r
+\r
+namespace HandBrake.ApplicationServices.LibHb\r
+{\r
+ /// <summary>\r
+ /// The audio video helpers.\r
+ /// </summary>\r
+ class AudioVideoHelpers\r
+ {\r
+ }\r
+}\r
public AudioTrack()\r
{\r
// Default Values\r
- this.Encoder = AudioEncoder.Faac;\r
+ this.Encoder = AudioEncoder.ffaac;\r
this.MixDown = Mixdown.DolbyProLogicII;\r
this.SampleRate = 48;\r
this.Bitrate = 160;\r
{\r
get\r
{\r
- return this.IsPassthru || this.Encoder == AudioEncoder.ffflac;\r
+ return this.IsPassthru || this.Encoder == AudioEncoder.ffflac || this.Encoder == AudioEncoder.ffflac24;\r
}\r
}\r
\r
{\r
get\r
{\r
- return this.IsPassthru || this.Encoder == AudioEncoder.ffflac;\r
+ return this.IsPassthru || this.Encoder == AudioEncoder.ffflac || this.Encoder == AudioEncoder.ffflac24;\r
}\r
}\r
\r
/// </summary>\r
Preset DefaultPreset { get; }\r
\r
+ /// <summary>\r
+ /// The load.\r
+ /// </summary>\r
+ void Load();\r
+\r
/// <summary>\r
/// Add a new preset to the system\r
/// </summary>\r
/// </summary>\r
private static readonly XmlSerializer Ser = new XmlSerializer(typeof(List<Preset>));\r
\r
- /// <summary>\r
- /// The User Setting Service\r
- /// </summary>\r
- private readonly IUserSettingService userSettingService;\r
-\r
/// <summary>\r
/// User Preset Default Catgory Name\r
/// </summary>\r
/// <summary>\r
/// A Collection of presets\r
/// </summary>\r
- private ObservableCollection<Preset> presets = new ObservableCollection<Preset>();\r
+ private readonly ObservableCollection<Preset> presets = new ObservableCollection<Preset>();\r
\r
#endregion\r
\r
-\r
- /// <summary>\r
- /// Initializes a new instance of the <see cref="PresetService"/> class.\r
- /// </summary>\r
- /// <param name="userSettingService">\r
- /// The user Setting Service.\r
- /// </param>\r
- public PresetService(IUserSettingService userSettingService)\r
- {\r
- this.userSettingService = userSettingService;\r
-\r
- // If the preset file doesn't exist. Create it.\r
- if (!File.Exists(this.builtInPresetFile))\r
- {\r
- this.UpdateBuiltInPresets();\r
- }\r
-\r
- this.LoadPresets();\r
- }\r
-\r
/// <summary>\r
/// Gets a Collection of presets.\r
/// </summary>\r
\r
#region Public Methods\r
\r
+ /// <summary>\r
+ /// The load.\r
+ /// </summary>\r
+ public void Load()\r
+ {\r
+ // If the preset file doesn't exist. Create it.\r
+ if (!File.Exists(this.builtInPresetFile))\r
+ {\r
+ this.UpdateBuiltInPresets();\r
+ }\r
+\r
+ this.LoadPresets();\r
+ }\r
+\r
/// <summary>\r
/// Add a new preset to the system.\r
/// Performs an Update if it already exists\r
// Recover from Error.\r
if (File.Exists(file))\r
{\r
- string disabledFile = file + ".old";\r
+ string disabledFile = string.Format("{0}.{1}", file, GeneralUtilities.ProcessId);\r
File.Move(file, disabledFile);\r
if (File.Exists(file))\r
{\r
{\r
RecoverFromCorruptedPresetFile(this.builtInPresetFile);\r
this.UpdateBuiltInPresets();\r
- throw new GeneralApplicationException("HandBrake has detected corruption in the presets file and has attempted to rebuild this file.", "Please restart HandBrake before continuing.", exc); \r
}\r
\r
// Load in the users Presets from UserPresets.xml\r
catch (Exception exc)\r
{\r
RecoverFromCorruptedPresetFile(this.userPresetFile);\r
- throw new GeneralApplicationException("HandBrake has detected corruption in the presets file and has attempted to rebuild this file.", "Please restart HandBrake before continuing.", exc); \r
+ throw new GeneralApplicationException("HandBrake has detected a problem with your presets.", "Your old presets file has been renamed so that it doesn't get loaded on next launch.", exc); \r
}\r
}\r
\r
* TODO:\r
* - Many of these converters can be ditched at a later point. Should be able to model all this within the enums themsevles.\r
* \r
- **/ \r
+ **/\r
\r
/// <summary>\r
/// Convert HandBrakes time remaining into a TimeSpan\r
}\r
}\r
\r
- /// <summary>\r
- /// Get the GUI equiv to a CLI audio encoder\r
- /// </summary>\r
- /// <param name="audioEnc">The Audio Encoder</param>\r
- /// <returns>The GUI representation of that audio encoder</returns>\r
- public static string GetGUIAudioEncoder(string audioEnc)\r
- {\r
- switch (audioEnc)\r
- {\r
- case "faac":\r
- return "AAC (faac)";\r
- case "lame":\r
- return "MP3 (lame)";\r
- case "vorbis":\r
- return "Vorbis (vorbis)";\r
- case "ffac3":\r
- return "AC3 (ffmpeg)";\r
- case "copy:ac3":\r
- return "AC3 Passthru";\r
- case "copy:dts":\r
- return "DTS Passthru";\r
- case "copy:dtshd":\r
- return "MP3 Passthru";\r
- case "copy:mp3":\r
- return "AAC Passthru";\r
- case "copy:aac":\r
- return "DTS-HD Passthru";\r
- case "ffaac":\r
- return "AAC (ffmpeg)";\r
- case "ffflac":\r
- return "FLAC (ffmpeg)";\r
- case "ffflac24":\r
- return "FLAC (24-bit)";\r
- case "copy":\r
- return "Auto Passthru";\r
- default:\r
- return "AAC (faac)";\r
- }\r
- }\r
-\r
/// <summary>\r
/// Get the GUI equiv to a CLI audio encoder\r
/// </summary>\r
switch (audioEnc)\r
{\r
case "faac":\r
- return AudioEncoder.Faac;\r
case "ffaac":\r
return AudioEncoder.ffaac;\r
+ case "fdk_aac":\r
+ return AudioEncoder.fdkaac;\r
+ case "fdk_haac":\r
+ return AudioEncoder.fdkheaac;\r
+ case "mp3":\r
case "lame":\r
return AudioEncoder.Lame;\r
case "vorbis":\r
return AudioEncoder.Vorbis;\r
+ case "ac3":\r
case "ffac3":\r
return AudioEncoder.Ac3;\r
+ case "flac16":\r
case "ffflac":\r
return AudioEncoder.ffflac;\r
+ case "flac24":\r
case "ffflac24":\r
return AudioEncoder.ffflac24;\r
case "copy:ac3":\r
case "copy":\r
return AudioEncoder.Passthrough;\r
default:\r
- return AudioEncoder.Faac;\r
+ return AudioEncoder.ffaac;\r
}\r
}\r
\r
switch (audioEnc)\r
{\r
case "AAC (faac)":\r
- return AudioEncoder.Faac;\r
+ case "AAC (CoreAudio)":\r
case "AAC (ffmpeg)":\r
+ case "AAC (avcodec)":\r
return AudioEncoder.ffaac;\r
- case "AAC (CoreAudio)":\r
- return AudioEncoder.Faac;\r
+ case "AAC (FDK)":\r
+ return AudioEncoder.fdkaac;\r
+ case "HE-AAC (FDK)":\r
+ return AudioEncoder.fdkheaac;\r
case "MP3 (lame)":\r
+ case "MP3":\r
return AudioEncoder.Lame;\r
case "Vorbis (vorbis)":\r
+ case "Vorbis":\r
return AudioEncoder.Vorbis;\r
case "AC3 (ffmpeg)":\r
+ case "AC3":\r
return AudioEncoder.Ac3;\r
case "AC3 Passthru":\r
return AudioEncoder.Ac3Passthrough;\r
case "MP3 Passthru":\r
return AudioEncoder.Mp3Passthru;\r
case "FLAC (ffmpeg)":\r
+ case "FLAC 16-bit":\r
return AudioEncoder.ffflac;\r
case "FLAC (24-bit)":\r
+ case "FLAC 24-bit":\r
return AudioEncoder.ffflac24;\r
case "Auto Passthru":\r
return AudioEncoder.Passthrough;\r
default:\r
- return AudioEncoder.Faac;\r
+ return AudioEncoder.ffaac;\r
}\r
}\r
\r
/// </returns>\r
public static string GetCliAudioEncoder(AudioEncoder selectedEncoder)\r
{\r
- switch (selectedEncoder)\r
- {\r
- case AudioEncoder.Faac:\r
- return "faac";\r
- case AudioEncoder.ffaac:\r
- return "ffaac";\r
-\r
- case AudioEncoder.Lame:\r
- return "lame";\r
- case AudioEncoder.Vorbis:\r
- return "vorbis";\r
- case AudioEncoder.Ac3Passthrough:\r
- return "copy:ac3";\r
- case AudioEncoder.DtsPassthrough:\r
- return "copy:dts";\r
- case AudioEncoder.DtsHDPassthrough:\r
- return "copy:dtshd";\r
- case AudioEncoder.Ac3:\r
- return "ffac3";\r
- case AudioEncoder.AacPassthru:\r
- return "copy:aac";\r
- case AudioEncoder.Mp3Passthru:\r
- return "copy:mp3";\r
- case AudioEncoder.Passthrough:\r
- return "copy";\r
- case AudioEncoder.ffflac:\r
- return "ffflac";\r
- case AudioEncoder.ffflac24:\r
- return "ffflac24";\r
- default:\r
- return "faac";\r
- }\r
+ return EnumHelper<AudioEncoder>.GetShortName(selectedEncoder);\r
}\r
\r
#endregion\r
\r
- #region Video \r
+ #region Video\r
\r
/// <summary>\r
/// Get the Video Encoder for a given string\r
{\r
switch (encoder)\r
{\r
- case "":\r
case "ffmpeg":\r
case "ffmpeg4":\r
+ case "mpeg4":\r
return VideoEncoder.FFMpeg;\r
case "ffmpeg2":\r
+ case "mpeg2":\r
return VideoEncoder.FFMpeg2;\r
case "x264":\r
return VideoEncoder.X264;\r
switch (encoder)\r
{\r
case VideoEncoder.FFMpeg:\r
- return "ffmpeg4";\r
+ return "mpeg4";\r
case VideoEncoder.FFMpeg2:\r
- return "ffmpeg2";\r
+ return "mpeg2";\r
case VideoEncoder.X264:\r
return "x264";\r
case VideoEncoder.Theora:\r
using System.Linq;\r
using System.Reflection;\r
\r
+ using HandBrake.Interop.Attributes;\r
+\r
/// <summary>\r
/// Enum Helpers\r
/// </summary>\r
throw new ArgumentOutOfRangeException("The Description for the enum was not recognized.");\r
}\r
\r
+ /// <summary>\r
+ /// The get short name.\r
+ /// </summary>\r
+ /// <param name="value">\r
+ /// The value.\r
+ /// </param>\r
+ /// <returns>\r
+ /// The <see cref="string"/>.\r
+ /// </returns>\r
+ public static string GetShortName(T value)\r
+ {\r
+ FieldInfo fieldInfo = value.GetType().GetField(value.ToString());\r
+ ShortName[] attributes = (ShortName[])fieldInfo.GetCustomAttributes(typeof(ShortName), false);\r
+\r
+ return (attributes.Length > 0) ? attributes[0].Name : value.ToString(); \r
+ }\r
+\r
/// <summary>\r
/// Return a list of all the enum values.\r
/// </summary>\r
--- /dev/null
+// --------------------------------------------------------------------------------------------------------------------\r
+// <copyright file="ShortName.cs" company="HandBrake Project (http://handbrake.fr)">\r
+// This file is part of the HandBrake source code - It may be used under the terms of the GNU General Public License.\r
+// </copyright>\r
+// <summary>\r
+// A Short Name for an enum value\r
+// </summary>\r
+// --------------------------------------------------------------------------------------------------------------------\r
+\r
+namespace HandBrake.Interop.Attributes\r
+{\r
+ using System;\r
+\r
+ /// <summary>\r
+ /// A Short Name for an enum value\r
+ /// </summary>\r
+ public class ShortName : Attribute\r
+ {\r
+ /// <summary>\r
+ /// Initializes a new instance of the <see cref="ShortName"/> class.\r
+ /// </summary>\r
+ /// <param name="shortName">\r
+ /// The short name.\r
+ /// </param>\r
+ public ShortName(string shortName)\r
+ {\r
+ this.Name = shortName;\r
+ }\r
+\r
+ /// <summary>\r
+ /// Gets or sets the short name.\r
+ /// </summary>\r
+ public string Name { get; set; }\r
+ }\r
+}\r
/// <summary>\r
/// Video Frame Rates\r
/// </summary>\r
- private static readonly Dictionary<double, int> VideoRates = new Dictionary<double, int>\r
+ private static readonly Dictionary<double, int> VideoRates;\r
+\r
+ /// <summary>\r
+ /// Initializes static members of the Converters class.\r
+ /// </summary>\r
+ static Converters()\r
{\r
- {5, 5400000},\r
- {10, 2700000},\r
- {12, 2250000},\r
- {15, 1800000},\r
- {23.976, 1126125},\r
- {24, 1125000},\r
- {25, 1080000},\r
- {29.97, 900900},\r
- {30, 900000},\r
- {50, 540000},\r
- {59.94, 450450},\r
- {60, 450000}\r
- };\r
+ HandBrakeUtils.EnsureGlobalInit();\r
+\r
+ VideoRates = new Dictionary<double, int>();\r
+ foreach (var framerate in Encoders.VideoFramerates)\r
+ {\r
+ VideoRates.Add(double.Parse(framerate.Name), framerate.Rate);\r
+ }\r
+ }\r
\r
/// <summary>\r
/// Convert Framerate to Video Rates\r
return NativeConstants.HB_ACODEC_AC3_PASS;\r
case AudioEncoder.Ac3:\r
return NativeConstants.HB_ACODEC_AC3;\r
- case AudioEncoder.Faac:\r
- return NativeConstants.HB_ACODEC_FAAC;\r
case AudioEncoder.ffaac:\r
return NativeConstants.HB_ACODEC_FFAAC;\r
+ case AudioEncoder.fdkaac:\r
+ return NativeConstants.HB_ACODEC_FDK_AAC;\r
+ case AudioEncoder.fdkheaac:\r
+ return NativeConstants.HB_ACODEC_FDK_HAAC;\r
case AudioEncoder.AacPassthru:\r
return NativeConstants.HB_ACODEC_AAC_PASS;\r
case AudioEncoder.Lame:\r
case NativeConstants.HB_ACODEC_FFAAC:\r
case NativeConstants.HB_ACODEC_CA_AAC:\r
case NativeConstants.HB_ACODEC_CA_HAAC:\r
+ case NativeConstants.HB_ACODEC_FDK_HAAC: // TODO Check this is correct\r
+ case NativeConstants.HB_ACODEC_FDK_AAC: // TODO Check this is correct\r
return AudioCodec.Aac;\r
case NativeConstants.HB_ACODEC_FFFLAC:\r
return AudioCodec.Flac;\r
+\r
default:\r
return AudioCodec.Other;\r
}\r
{\r
var result = new HBVideoEncoder\r
{\r
- Id = encoder.encoder,\r
+ Id = encoder.codec,\r
ShortName = encoder.short_name,\r
- DisplayName = encoder.human_readable_name,\r
+ DisplayName = encoder.name,\r
CompatibleContainers = Container.None\r
};\r
\r
{\r
var result = new HBAudioEncoder\r
{\r
- Id = encoder.encoder,\r
+ Id = encoder.codec,\r
ShortName = encoder.short_name,\r
- DisplayName = encoder.human_readable_name,\r
+ DisplayName = encoder.name,\r
CompatibleContainers = Container.None\r
};\r
\r
result.CompatibleContainers = result.CompatibleContainers | Container.Mp4;\r
}\r
\r
- result.QualityLimits = Encoders.GetAudioQualityLimits(encoder.encoder);\r
- result.DefaultQuality = HBFunctions.hb_get_default_audio_quality((uint)encoder.encoder);\r
- result.CompressionLimits = Encoders.GetAudioCompressionLimits(encoder.encoder);\r
- result.DefaultCompression = HBFunctions.hb_get_default_audio_compression((uint) encoder.encoder);\r
+ result.QualityLimits = Encoders.GetAudioQualityLimits(encoder.codec);\r
+ result.DefaultQuality = HBFunctions.hb_audio_quality_get_default((uint)encoder.codec);\r
+ result.CompressionLimits = Encoders.GetAudioCompressionLimits(encoder.codec);\r
+ result.DefaultCompression = HBFunctions.hb_audio_compression_get_default((uint)encoder.codec);\r
\r
return result;\r
}\r
\r
+ /// <summary>\r
+ /// Converts a native HB rate structure to an HBRate object.\r
+ /// </summary>\r
+ /// <param name="rate">The structure to convert.</param>\r
+ /// <returns>The converted rate object.</returns>\r
+ public static HBRate NativeToRate(hb_rate_s rate)\r
+ {\r
+ return new HBRate\r
+ {\r
+ Name = rate.name,\r
+ Rate = rate.rate\r
+ };\r
+ }\r
+\r
/// <summary>\r
/// Converts a native HB mixdown structure to a Mixdown model.\r
/// </summary>\r
{\r
Id = mixdown.amixdown,\r
ShortName = mixdown.short_name,\r
- DisplayName = mixdown.human_readable_name\r
+ DisplayName = mixdown.name\r
};\r
}\r
\r
/// </summary>\r
private const string TurboX264Opts = "ref=1:subme=2:me=dia:analyse=none:trellis=0:no-fast-pskip=0:8x8dct=0:weightb=0";\r
\r
- /// <summary>\r
- /// Lock for creation of handbrake instances;\r
- /// </summary>\r
- private static object instanceCreationLock = new object();\r
-\r
- /// <summary>\r
- /// True if a handbrake instance has been created.\r
- /// </summary>\r
- private static bool globalInitialized;\r
-\r
/// <summary>\r
/// The native handle to the HandBrake instance.\r
/// </summary>\r
/// <param name="verbosity">The code for the logging verbosity to use.</param>\r
public void Initialize(int verbosity)\r
{\r
- lock (instanceCreationLock)\r
- {\r
- if (!globalInitialized)\r
- {\r
- globalInitialized = true;\r
- }\r
- }\r
+ HandBrakeUtils.EnsureGlobalInit();\r
\r
HandBrakeUtils.RegisterLogger();\r
this.hbHandle = HBFunctions.hb_init(verbosity, update_check: 0);\r
public void StartEncode(EncodeJob job, bool preview, int previewNumber, int previewSeconds, double overallSelectedLengthSeconds)\r
{\r
EncodingProfile profile = job.EncodingProfile;\r
+ if (job.ChosenAudioTracks == null)\r
+ {\r
+ throw new ArgumentException("job.ChosenAudioTracks cannot be null.");\r
+ }\r
+\r
this.currentJob = job;\r
\r
IntPtr nativeJobPtr = HBFunctions.hb_job_init_by_index(this.hbHandle, this.GetTitleIndex(job.Title));\r
this.encodeAllocatedMemory = this.ApplyJob(ref nativeJob, job, preview, previewNumber, previewSeconds, overallSelectedLengthSeconds);\r
\r
this.subtitleScan = false;\r
- if (job.Subtitles.SourceSubtitles != null)\r
+ if (job.Subtitles != null && job.Subtitles.SourceSubtitles != null)\r
{\r
foreach (SourceSubtitle subtitle in job.Subtitles.SourceSubtitles)\r
{\r
}\r
else\r
{\r
- displayWidth = (int)((double)cropHeight * displayAspect);\r
+ displayWidth = (int)((double)height * displayAspect);\r
}\r
\r
nativeJob.anamorphic.dar_width = displayWidth;\r
}\r
}\r
\r
- bool hasBurnedSubtitle = job.Subtitles.SourceSubtitles.Any(s => s.BurnedIn);\r
+ bool hasBurnedSubtitle = job.Subtitles.SourceSubtitles != null && job.Subtitles.SourceSubtitles.Any(s => s.BurnedIn);\r
if (hasBurnedSubtitle)\r
{\r
this.AddFilter(filterList, (int)hb_filter_ids.HB_FILTER_RENDER_SUB, string.Format(CultureInfo.InvariantCulture, "{0}:{1}:{2}:{3}", crop.Top, crop.Bottom, crop.Left, crop.Right), allocatedMemory);\r
if (encoding.Bitrate == 0)\r
{\r
// Bitrate of 0 means auto: choose the default for this codec, sample rate and mixdown.\r
- nativeAudio.config.output.bitrate = HBFunctions.hb_get_default_audio_bitrate(\r
+ nativeAudio.config.output.bitrate = HBFunctions.hb_audio_bitrate_get_default(\r
nativeAudio.config.output.codec,\r
nativeAudio.config.output.samplerate,\r
nativeAudio.config.output.mixdown);\r
</Reference>\r
</ItemGroup>\r
<ItemGroup>\r
+ <Compile Include="Attributes\ShortName.cs" />\r
<Compile Include="Converters.cs" />\r
<Compile Include="EventArgs\EncodeCompletedEventArgs.cs" />\r
<Compile Include="EventArgs\EncodeProgressEventArgs.cs" />\r
<Compile Include="Model\Encoding\Detelecine.cs" />\r
<Compile Include="Model\Encoding\EncodingProfile.cs" />\r
<Compile Include="Model\Encoding\HBMixdown.cs" />\r
+ <Compile Include="Model\Encoding\HBRate.cs" />\r
<Compile Include="Model\Encoding\HBVideoEncoder.cs" />\r
<Compile Include="Model\Encoding\Mixdown.cs" />\r
<Compile Include="Model\Encoding\OutputExtension.cs" />\r
/// </summary>\r
private static LoggingCallback errorCallback;\r
\r
+ /// <summary>\r
+ /// True if the global initialize function has been called.\r
+ /// </summary>\r
+ private static bool globalInitialized;\r
+\r
/// <summary>\r
/// Fires when HandBrake has logged a message.\r
/// </summary>\r
/// </summary>\r
public static event EventHandler<MessageLoggedEventArgs> ErrorLogged;\r
\r
+ /// <summary>\r
+ /// Initializes static members of the HandBrakeUtils class.\r
+ /// </summary>\r
+ static HandBrakeUtils()\r
+ {\r
+ if (!globalInitialized)\r
+ {\r
+ if (HBFunctions.hb_global_init() == -1)\r
+ {\r
+ throw new InvalidOperationException("HB global init failed.");\r
+ }\r
+\r
+ globalInitialized = true;\r
+ }\r
+ }\r
+\r
+ /// <summary>\r
+ /// Ensures the HB global initialize method has been called.\r
+ /// </summary>\r
+ public static void EnsureGlobalInit()\r
+ {\r
+ // Does nothing, but invokes static ctor.\r
+ }\r
+\r
/// <summary>\r
/// Enables or disables LibDVDNav. If disabled libdvdread will be used instead.\r
/// </summary>\r
\r
if (messageParts.Length > 0)\r
{\r
- if (MessageLogged != null)\r
+ message = messageParts[0];\r
+\r
+ // When MP4 muxing fails (for example when the file is too big without Large File Size)\r
+ // a message is logged but it isn't marked as an error.\r
+ if (message.StartsWith("MP4ERROR", StringComparison.Ordinal))\r
{\r
- MessageLogged(null, new MessageLoggedEventArgs { Message = messageParts[0] });\r
+ SendErrorEvent(message);\r
+ return;\r
}\r
\r
- System.Diagnostics.Debug.WriteLine(messageParts[0]);\r
+ SendMessageEvent(message);\r
}\r
}\r
}\r
// This error happens in normal operations. Log it as a message.\r
if (message == "dvd: ifoOpen failed")\r
{\r
- if (MessageLogged != null)\r
- {\r
- MessageLogged(null, new MessageLoggedEventArgs { Message = message });\r
- }\r
-\r
+ SendMessageEvent(message);\r
return;\r
}\r
\r
- if (ErrorLogged != null)\r
- {\r
- ErrorLogged(null, new MessageLoggedEventArgs { Message = message });\r
- }\r
-\r
- System.Diagnostics.Debug.WriteLine("ERROR: " + message);\r
+ SendErrorEvent(message);\r
}\r
}\r
\r
throw new ArgumentException("height must be positive.");\r
}\r
\r
- HBFunctions.hb_init(0, 0);\r
- IntPtr ptr = HBFunctions.hb_x264_param_unparse(\r
+ HBFunctions.hb_init(0, 0);\r
+ IntPtr ptr = HBFunctions.hb_x264_param_unparse(\r
preset,\r
string.Join(",", tunes),\r
extraOptions,\r
width,\r
height);\r
\r
- string x264Settings = Marshal.PtrToStringAnsi(ptr);\r
+ string x264Settings = Marshal.PtrToStringAnsi(ptr);\r
\r
\r
- return x264Settings;\r
+ return x264Settings;\r
}\r
\r
/// <summary>\r
\r
return audioBytes;\r
}\r
+\r
+ /// <summary>\r
+ /// Sends the message logged event to any registered listeners.\r
+ /// </summary>\r
+ /// <param name="message">The message to send.</param>\r
+ private static void SendMessageEvent(string message)\r
+ {\r
+ if (MessageLogged != null)\r
+ {\r
+ MessageLogged(null, new MessageLoggedEventArgs { Message = message });\r
+ }\r
+\r
+ System.Diagnostics.Debug.WriteLine(message);\r
+ }\r
+\r
+ /// <summary>\r
+ /// Sends the error logged event to any registered listeners.\r
+ /// </summary>\r
+ /// <param name="message">The message to send</param>\r
+ private static void SendErrorEvent(string message)\r
+ {\r
+ if (ErrorLogged != null)\r
+ {\r
+ ErrorLogged(null, new MessageLoggedEventArgs { Message = message });\r
+ }\r
+\r
+ System.Diagnostics.Debug.WriteLine("ERROR: " + message);\r
+ }\r
}\r
}\r
[DllImport("hb.dll", EntryPoint = "hb_register_error_handler", CallingConvention = CallingConvention.Cdecl)]\r
public static extern void hb_register_error_handler(LoggingCallback callback);\r
\r
+ [DllImport("hb.dll", EntryPoint = "hb_global_init", CallingConvention = CallingConvention.Cdecl)]\r
+ public static extern int hb_global_init();\r
+\r
/// Return Type: hb_handle_t*\r
///verbose: int\r
///update_check: int\r
public static extern int hb_srt_add(ref hb_job_s job, ref hb_subtitle_config_s subtitleConfig, string lang);\r
\r
\r
- [DllImport("hb.dll", EntryPoint = "hb_mixdown_is_supported", CallingConvention = CallingConvention.Cdecl)]\r
- public static extern int hb_mixdown_is_supported(int mixdown, uint codec, ulong layout);\r
\r
- [DllImport("hb.dll", EntryPoint = "hb_mixdown_has_remix_support", CallingConvention = CallingConvention.Cdecl)]\r
- public static extern int hb_mixdown_has_remix_support(int mixdown, ulong layout);\r
+//int hb_video_framerate_get_from_name(const char *name);\r
+//const char* hb_video_framerate_get_name(int framerate);\r
+//const char* hb_video_framerate_sanitize_name(const char *name);\r
\r
- [DllImport("hb.dll", EntryPoint = "hb_mixdown_has_codec_support", CallingConvention = CallingConvention.Cdecl)]\r
- public static extern int hb_mixdown_has_codec_support(int mixdown, uint codec);\r
+ // returns hb_rate_s\r
+ [DllImport("hb.dll", EntryPoint = "hb_video_framerate_get_next", CallingConvention = CallingConvention.Cdecl)]\r
+ public static extern IntPtr hb_video_framerate_get_next(IntPtr last);\r
+\r
+\r
+//int hb_audio_samplerate_get_best(uint32_t codec, int samplerate, int *sr_shift);\r
+//int hb_audio_samplerate_get_from_name(const char *name);\r
+//const char* hb_audio_samplerate_get_name(int samplerate);\r
+\r
+ // returns hb_rate_s\r
+ [DllImport("hb.dll", EntryPoint = "hb_audio_samplerate_get_next", CallingConvention = CallingConvention.Cdecl)]\r
+ public static extern IntPtr hb_audio_samplerate_get_next(IntPtr last);\r
+\r
+\r
+ [DllImport("hb.dll", EntryPoint = "hb_audio_bitrate_get_best", CallingConvention = CallingConvention.Cdecl)]\r
+ public static extern int hb_audio_bitrate_get_best(uint codec, int bitrate, int samplerate, int mixdown);\r
+\r
+ [DllImport("hb.dll", EntryPoint = "hb_audio_bitrate_get_default", CallingConvention = CallingConvention.Cdecl)]\r
+ public static extern int hb_audio_bitrate_get_default(uint codec, int samplerate, int mixdown);\r
\r
- [DllImport("hb.dll", EntryPoint = "hb_get_default_mixdown", CallingConvention = CallingConvention.Cdecl)]\r
- public static extern int hb_get_default_mixdown(uint codec, ulong layout);\r
+ [DllImport("hb.dll", EntryPoint = "hb_audio_bitrate_get_limits", CallingConvention = CallingConvention.Cdecl)]\r
+ public static extern int hb_audio_bitrate_get_limits(uint codec, int samplerate, int mixdown, ref int low, ref int high);\r
\r
- [DllImport("hb.dll", EntryPoint = "hb_get_best_mixdown", CallingConvention = CallingConvention.Cdecl)]\r
- public static extern int hb_get_best_mixdown(uint codec, ulong layout, int mixdown);\r
+ [DllImport("hb.dll", EntryPoint = "hb_audio_bitrate_get_next", CallingConvention = CallingConvention.Cdecl)]\r
+ public static extern IntPtr hb_audio_bitrate_get_next(IntPtr last);\r
\r
- [DllImport("hb.dll", EntryPoint = "hb_get_best_audio_bitrate", CallingConvention = CallingConvention.Cdecl)]\r
- public static extern int hb_get_best_audio_bitrate(uint codec, int bitrate, int samplerate, int mixdown);\r
\r
- [DllImport("hb.dll", EntryPoint = "hb_get_default_audio_bitrate", CallingConvention = CallingConvention.Cdecl)]\r
- public static extern int hb_get_default_audio_bitrate(uint codec, int samplerate, int mixdown);\r
+ [DllImport("hb.dll", EntryPoint = "hb_audio_quality_get_limits", CallingConvention = CallingConvention.Cdecl)]\r
+ public static extern void hb_audio_quality_get_limits(uint codec, ref float low, ref float high, ref float granularity, ref int direction);\r
\r
- [DllImport("hb.dll", EntryPoint = "hb_get_audio_bitrate_limits", CallingConvention = CallingConvention.Cdecl)]\r
- public static extern int hb_get_audio_bitrate_limits(uint codec, int samplerate, int mixdown, ref int low, ref int high);\r
+//float hb_audio_quality_get_best(uint32_t codec, float quality);\r
\r
- [DllImport("hb.dll", EntryPoint = "hb_get_audio_quality_limits", CallingConvention = CallingConvention.Cdecl)]\r
- public static extern void hb_get_audio_quality_limits(uint codec, ref float low, ref float high, ref float granularity, ref int direction);\r
+ [DllImport("hb.dll", EntryPoint = "hb_audio_quality_get_default", CallingConvention = CallingConvention.Cdecl)]\r
+ public static extern float hb_audio_quality_get_default(uint codec);\r
\r
- [DllImport("hb.dll", EntryPoint = "hb_get_default_audio_quality", CallingConvention = CallingConvention.Cdecl)]\r
- public static extern float hb_get_default_audio_quality(uint codec);\r
\r
- [DllImport("hb.dll", EntryPoint = "hb_get_audio_compression_limits", CallingConvention = CallingConvention.Cdecl)]\r
- public static extern void hb_get_audio_compression_limits(uint codec, ref float low, ref float high, ref float granularity, ref int direction);\r
+ [DllImport("hb.dll", EntryPoint = "hb_audio_compression_get_limits", CallingConvention = CallingConvention.Cdecl)]\r
+ public static extern void hb_audio_compression_get_limits(uint codec, ref float low, ref float high, ref float granularity, ref int direction);\r
\r
- [DllImport("hb.dll", EntryPoint = "hb_get_default_audio_compression", CallingConvention = CallingConvention.Cdecl)]\r
- public static extern float hb_get_default_audio_compression(uint codec);\r
+//float hb_audio_compression_get_best(uint32_t codec, float compression);\r
+\r
+ [DllImport("hb.dll", EntryPoint = "hb_audio_compression_get_default", CallingConvention = CallingConvention.Cdecl)]\r
+ public static extern float hb_audio_compression_get_default(uint codec);\r
+\r
+\r
+//int hb_audio_dither_get_default();\r
+//int hb_audio_dither_get_default_method(); // default method, if enabled && supported\r
+//int hb_audio_dither_is_supported(uint32_t codec);\r
+//int hb_audio_dither_get_from_name(const char *name);\r
+//const char* hb_audio_dither_get_description(int method);\r
+//const hb_dither_t* hb_audio_dither_get_next(const hb_dither_t *last);\r
+\r
+ [DllImport("hb.dll", EntryPoint = "hb_mixdown_is_supported", CallingConvention = CallingConvention.Cdecl)]\r
+ public static extern int hb_mixdown_is_supported(int mixdown, uint codec, ulong layout);\r
+\r
+ [DllImport("hb.dll", EntryPoint = "hb_mixdown_has_codec_support", CallingConvention = CallingConvention.Cdecl)]\r
+ public static extern int hb_mixdown_has_codec_support(int mixdown, uint codec);\r
+\r
+ [DllImport("hb.dll", EntryPoint = "hb_mixdown_has_remix_support", CallingConvention = CallingConvention.Cdecl)]\r
+ public static extern int hb_mixdown_has_remix_support(int mixdown, ulong layout);\r
\r
+//int hb_mixdown_get_discrete_channel_count(int mixdown);\r
+//int hb_mixdown_get_low_freq_channel_count(int mixdown);\r
\r
- [DllImport("hb.dll", EntryPoint = "hb_get_video_rates", CallingConvention = CallingConvention.Cdecl)]\r
- public static extern IntPtr hb_get_video_rates();\r
+ [DllImport("hb.dll", EntryPoint = "hb_mixdown_get_best", CallingConvention = CallingConvention.Cdecl)]\r
+ public static extern int hb_mixdown_get_best(uint codec, ulong layout, int mixdown);\r
\r
- [DllImport("hb.dll", EntryPoint = "hb_get_video_rates_count", CallingConvention = CallingConvention.Cdecl)]\r
- public static extern int hb_get_video_rates_count();\r
+ [DllImport("hb.dll", EntryPoint = "hb_mixdown_get_default", CallingConvention = CallingConvention.Cdecl)]\r
+ public static extern int hb_mixdown_get_default(uint codec, ulong layout);\r
\r
- [DllImport("hb.dll", EntryPoint = "hb_get_audio_rates", CallingConvention = CallingConvention.Cdecl)]\r
- public static extern IntPtr hb_get_audio_rates();\r
+//int hb_mixdown_get_from_name(const char *name);\r
+//const char* hb_mixdown_get_name(int mixdown);\r
+//const char* hb_mixdown_get_short_name(int mixdown);\r
+//const char* hb_mixdown_sanitize_name(const char *name);\r
\r
- [DllImport("hb.dll", EntryPoint = "hb_get_audio_rates_count", CallingConvention = CallingConvention.Cdecl)]\r
- public static extern int hb_get_audio_rates_count();\r
+ [DllImport("hb.dll", EntryPoint = "hb_mixdown_get_next", CallingConvention = CallingConvention.Cdecl)]\r
+ public static extern IntPtr hb_mixdown_get_next(IntPtr last);\r
\r
- [DllImport("hb.dll", EntryPoint = "hb_get_audio_rates_default", CallingConvention = CallingConvention.Cdecl)]\r
- public static extern int hb_get_audio_rates_default();\r
+//int hb_video_encoder_get_default(int muxer);\r
+//int hb_video_encoder_get_from_name(const char *name);\r
+//const char* hb_video_encoder_get_name(int encoder);\r
+//const char* hb_video_encoder_get_short_name(int encoder);\r
+//const char* hb_video_encoder_sanitize_name(const char *name);\r
\r
- [DllImport("hb.dll", EntryPoint = "hb_get_audio_bitrates", CallingConvention = CallingConvention.Cdecl)]\r
- public static extern IntPtr hb_get_audio_bitrates();\r
+ [DllImport("hb.dll", EntryPoint = "hb_video_encoder_get_next", CallingConvention = CallingConvention.Cdecl)]\r
+ public static extern IntPtr hb_video_encoder_get_next(IntPtr last);\r
\r
- [DllImport("hb.dll", EntryPoint = "hb_get_audio_bitrates_count", CallingConvention = CallingConvention.Cdecl)]\r
- public static extern int hb_get_audio_bitrates_count();\r
+/*\r
+ * hb_audio_encoder_get_fallback_for_passthru() will sanitize a passthru codec\r
+ * to the matching audio encoder (if any is available).\r
+ *\r
+ * hb_audio_encoder_get_from_name(), hb_audio_encoder_sanitize_name() will\r
+ * sanitize legacy encoder names, but won't convert passthru to an encoder.\r
+ */\r
+//int hb_audio_encoder_get_fallback_for_passthru(int passthru);\r
+//int hb_audio_encoder_get_default(int muxer);\r
+//int hb_audio_encoder_get_from_name(const char *name);\r
+//const char* hb_audio_encoder_get_name(int encoder);\r
+//const char* hb_audio_encoder_get_short_name(int encoder);\r
+//const char* hb_audio_encoder_sanitize_name(const char *name);\r
\r
- [DllImport("hb.dll", EntryPoint = "hb_get_audio_mixdowns", CallingConvention = CallingConvention.Cdecl)]\r
- public static extern IntPtr hb_get_audio_mixdowns();\r
+ [DllImport("hb.dll", EntryPoint = "hb_audio_encoder_get_next", CallingConvention = CallingConvention.Cdecl)]\r
+ public static extern IntPtr hb_audio_encoder_get_next(IntPtr last);\r
\r
- [DllImport("hb.dll", EntryPoint = "hb_get_audio_mixdowns_count", CallingConvention = CallingConvention.Cdecl)]\r
- public static extern int hb_get_audio_mixdowns_count();\r
\r
- [DllImport("hb.dll", EntryPoint = "hb_get_video_encoders", CallingConvention = CallingConvention.Cdecl)]\r
- public static extern IntPtr hb_get_video_encoders();\r
\r
- [DllImport("hb.dll", EntryPoint = "hb_get_video_encoders_count", CallingConvention = CallingConvention.Cdecl)]\r
- public static extern int hb_get_video_encoders_count();\r
\r
- [DllImport("hb.dll", EntryPoint = "hb_get_audio_encoders", CallingConvention = CallingConvention.Cdecl)]\r
- public static extern IntPtr hb_get_audio_encoders();\r
\r
- [DllImport("hb.dll", EntryPoint = "hb_get_audio_encoders_count", CallingConvention = CallingConvention.Cdecl)]\r
- public static extern int hb_get_audio_encoders_count();\r
\r
\r
/// void hb_autopassthru_apply_settings( hb_job_t * job )\r
{\r
/// char*\r
[MarshalAs(UnmanagedType.LPStr)]\r
- public string @string;\r
+ public string name;\r
\r
/// int\r
public int rate;\r
[StructLayout(LayoutKind.Sequential)]\r
public struct hb_mixdown_s\r
{\r
- /// char*\r
[MarshalAs(UnmanagedType.LPStr)]\r
- public string human_readable_name;\r
-\r
- /// char*\r
- [MarshalAs(UnmanagedType.LPStr)]\r
- public string internal_name;\r
+ public string name;\r
\r
/// char*\r
[MarshalAs(UnmanagedType.LPStr)]\r
public struct hb_encoder_s\r
{\r
[MarshalAs(UnmanagedType.LPStr)]\r
- public string human_readable_name;\r
+ public string name;\r
\r
[MarshalAs(UnmanagedType.LPStr)]\r
public string short_name;\r
\r
- public int encoder;\r
+ public int codec;\r
\r
public int muxers;\r
}\r
{\r
public partial class NativeConstants\r
{\r
- public const uint HB_ACODEC_MASK = 0x00FFFF00;\r
- public const uint HB_ACODEC_FAAC = 0x00000100;\r
- public const uint HB_ACODEC_LAME = 0x00000200;\r
- public const uint HB_ACODEC_VORBIS = 0x00000400;\r
- public const uint HB_ACODEC_AC3 = 0x00000800;\r
- public const uint HB_ACODEC_LPCM = 0x00001000;\r
- public const uint HB_ACODEC_DCA = 0x00002000;\r
- public const uint HB_ACODEC_CA_AAC = 0x00004000;\r
- public const uint HB_ACODEC_CA_HAAC = 0x00008000;\r
- public const uint HB_ACODEC_FFAAC = 0x00010000;\r
- public const uint HB_ACODEC_FFMPEG = 0x00020000;\r
- public const uint HB_ACODEC_DCA_HD = 0x00040000;\r
- public const uint HB_ACODEC_MP3 = 0x00080000;\r
- public const uint HB_ACODEC_FFFLAC = 0x00100000;\r
- public const uint HB_ACODEC_FDK_AAC = 0x00400000;\r
- public const uint HB_ACODEC_FDK_HAAC = 0x00800000;\r
- public const uint HB_ACODEC_FF_MASK = 0x00FF2000;\r
- public const uint HB_ACODEC_PASS_FLAG = 0x40000000;\r
- public const uint HB_ACODEC_PASS_MASK = (HB_ACODEC_MP3 | HB_ACODEC_FFAAC | HB_ACODEC_DCA_HD | HB_ACODEC_AC3 | HB_ACODEC_DCA);\r
- public const uint HB_ACODEC_AUTO_PASS = (HB_ACODEC_PASS_MASK | HB_ACODEC_PASS_FLAG);\r
- public const uint HB_ACODEC_MP3_PASS = (HB_ACODEC_MP3 | HB_ACODEC_PASS_FLAG);\r
- public const uint HB_ACODEC_AAC_PASS = (HB_ACODEC_FFAAC | HB_ACODEC_PASS_FLAG);\r
- public const uint HB_ACODEC_AC3_PASS = (HB_ACODEC_AC3 | HB_ACODEC_PASS_FLAG);\r
- public const uint HB_ACODEC_DCA_PASS = (HB_ACODEC_DCA | HB_ACODEC_PASS_FLAG);\r
- public const uint HB_ACODEC_DCA_HD_PASS = (HB_ACODEC_DCA_HD | HB_ACODEC_PASS_FLAG);\r
- public const uint HB_ACODEC_ANY = (HB_ACODEC_MASK | HB_ACODEC_PASS_FLAG);\r
+ // Audio Encoders\r
+ public const uint HB_ACODEC_MASK = 0x00FFFF00;\r
+ public const uint HB_ACODEC_FAAC = 0x00000100;\r
+ public const uint HB_ACODEC_LAME = 0x00000200;\r
+ public const uint HB_ACODEC_VORBIS = 0x00000400;\r
+ public const uint HB_ACODEC_AC3 = 0x00000800;\r
+ public const uint HB_ACODEC_LPCM = 0x00001000;\r
+ public const uint HB_ACODEC_DCA = 0x00002000;\r
+ public const uint HB_ACODEC_CA_AAC = 0x00004000;\r
+ public const uint HB_ACODEC_CA_HAAC = 0x00008000;\r
+ public const uint HB_ACODEC_FFAAC = 0x00010000;\r
+ public const uint HB_ACODEC_FFMPEG = 0x00020000;\r
+ public const uint HB_ACODEC_DCA_HD = 0x00040000;\r
+ public const uint HB_ACODEC_MP3 = 0x00080000;\r
+ public const uint HB_ACODEC_FFFLAC = 0x00100000;\r
+ public const uint HB_ACODEC_FFFLAC24 = 0x00200000;\r
+ public const uint HB_ACODEC_FDK_AAC = 0x00400000;\r
+ public const uint HB_ACODEC_FDK_HAAC = 0x00800000;\r
+ public const uint HB_ACODEC_FF_MASK = 0x00FF2000;\r
+ public const uint HB_ACODEC_PASS_FLAG = 0x40000000;\r
+ public const uint HB_ACODEC_PASS_MASK = (HB_ACODEC_MP3 | HB_ACODEC_FFAAC | HB_ACODEC_DCA_HD | HB_ACODEC_AC3 | HB_ACODEC_DCA);\r
+ public const uint HB_ACODEC_AUTO_PASS = (HB_ACODEC_PASS_MASK | HB_ACODEC_PASS_FLAG);\r
+ public const uint HB_ACODEC_MP3_PASS = (HB_ACODEC_MP3 | HB_ACODEC_PASS_FLAG);\r
+ public const uint HB_ACODEC_AAC_PASS = (HB_ACODEC_FFAAC | HB_ACODEC_PASS_FLAG);\r
+ public const uint HB_ACODEC_AC3_PASS = (HB_ACODEC_AC3 | HB_ACODEC_PASS_FLAG);\r
+ public const uint HB_ACODEC_DCA_PASS = (HB_ACODEC_DCA | HB_ACODEC_PASS_FLAG);\r
+ public const uint HB_ACODEC_DCA_HD_PASS = (HB_ACODEC_DCA_HD | HB_ACODEC_PASS_FLAG);\r
+ public const uint HB_ACODEC_ANY = (HB_ACODEC_MASK | HB_ACODEC_PASS_FLAG);\r
\r
+ // Subtitle Types\r
public const int HB_SUBSTREAM_BD_TRUEHD = 0x72;\r
public const int HB_SUBSTREAM_BD_AC3 = 0x76;\r
public const int HB_SUBSTREAM_BD_DTSHD = 0x72;\r
public const int HB_SUBSTREAM_BD_DTS = 0x71;\r
\r
+ // Video Encoders\r
public const int HB_VCODEC_MASK = 0x0000FF;\r
public const int HB_VCODEC_X264 = 0x000001;\r
public const int HB_VCODEC_THEORA = 0x000002;\r
public const int HB_VCODEC_FFMPEG_MPEG2 = 0x000020;\r
public const int HB_VCODEC_FFMPEG_MASK = 0x0000F0;\r
\r
+ // Muxers\r
public const int HB_MUX_MASK = 0xFF0000;\r
public const int HB_MUX_MP4 = 0x010000;\r
- public const int HB_MUX_MKV = 0x200000;\r
+ public const int HB_MUX_MKV = 0x100000;\r
\r
public const int HBTF_NO_IDR = 1 << 0;\r
\r
/// int\r
public int vbitrate;\r
\r
- public int pfr_vrate;\r
-\r
- public int pfr_vrate_base;\r
-\r
/// int\r
public int vrate;\r
\r
{\r
using System;\r
using System.Collections.Generic;\r
+ using System.Linq;\r
using System.Runtime.InteropServices;\r
\r
using HandBrake.Interop.HbLib;\r
+ using Model.Encoding;\r
\r
/// <summary>\r
/// Helper utilities for native interop.\r
}\r
\r
return result;\r
- } \r
+ }\r
\r
/// <summary>\r
/// Creats a new, empty native HandBrake list.\r
return returnList;\r
}\r
\r
+ /// <summary>\r
+ /// Reads in a list of objects given an interator and a conversion function.\r
+ /// </summary>\r
+ /// <typeparam name="T1">The type of the struct given by the iterator.</typeparam>\r
+ /// <typeparam name="T2">The object type to convert to.</typeparam>\r
+ /// <param name="iterator">The iterator to use to build the list.</param>\r
+ /// <param name="converter">The converter to convert from the struct to the object.</param>\r
+ /// <returns>The list of objects.</returns>\r
+ public static List<T2> GetListFromIterator<T1, T2>(Func<IntPtr, IntPtr> iterator, Func<T1, T2> converter)\r
+ {\r
+ return ReadStructureListFromIterator<T1>(iterator).Select(converter).ToList();\r
+ } \r
+\r
+ /// <summary>\r
+ /// Reads in a list of structs given an iterator.\r
+ /// </summary>\r
+ /// <typeparam name="T">The type of the struct.</typeparam>\r
+ /// <param name="iterator">The iterator to use to build the list.</param>\r
+ /// <returns>The list of structs.</returns>\r
+ public static List<T> ReadStructureListFromIterator<T>(Func<IntPtr, IntPtr> iterator)\r
+ {\r
+ var structureList = new List<T>();\r
+ IntPtr current = IntPtr.Zero;\r
+\r
+ current = iterator(current);\r
+ while (current != IntPtr.Zero)\r
+ {\r
+ T encoder = ReadStructure<T>(current);\r
+ structureList.Add(encoder);\r
+\r
+ current = iterator(current);\r
+ }\r
+\r
+ return structureList;\r
+ }\r
+\r
/// <summary>\r
/// Closes the given job.\r
/// </summary>\r
using HandBrake.Interop.Model.Encoding;\r
using HandBrake.Interop.SourceData;\r
\r
- /// <summary>\r
- /// The encoders.\r
- /// </summary>\r
- public static class Encoders\r
+ /// <summary>\r
+ /// The encoders.\r
+ /// </summary>\r
+ public static class Encoders\r
{\r
- /// <summary>\r
- /// The audio encoders.\r
- /// </summary>\r
- private static List<HBAudioEncoder> audioEncoders;\r
-\r
- /// <summary>\r
- /// The video encoders.\r
- /// </summary>\r
- private static List<HBVideoEncoder> videoEncoders;\r
-\r
- /// <summary>\r
- /// The mixdowns.\r
- /// </summary>\r
- private static List<HBMixdown> mixdowns;\r
-\r
- /// <summary>\r
- /// The audio bitrates.\r
- /// </summary>\r
- private static List<int> audioBitrates; \r
+ /// <summary>\r
+ /// The audio encoders.\r
+ /// </summary>\r
+ private static List<HBAudioEncoder> audioEncoders;\r
+\r
+ /// <summary>\r
+ /// The video encoders.\r
+ /// </summary>\r
+ private static List<HBVideoEncoder> videoEncoders;\r
+\r
+ /// <summary>\r
+ /// Video framerates in pts.\r
+ /// </summary>\r
+ private static List<HBRate> videoFramerates; \r
+\r
+ /// <summary>\r
+ /// The mixdowns.\r
+ /// </summary>\r
+ private static List<HBMixdown> mixdowns;\r
+\r
+ /// <summary>\r
+ /// The audio bitrates.\r
+ /// </summary>\r
+ private static List<int> audioBitrates;\r
+\r
+ /// <summary>\r
+ /// Audio sample rates in Hz.\r
+ /// </summary>\r
+ private static List<HBRate> audioSampleRates; \r
+\r
+ /// <summary>\r
+ /// Initializes static members of the Encoders class.\r
+ /// </summary>\r
+ static Encoders()\r
+ {\r
+ HandBrakeUtils.EnsureGlobalInit();\r
+ }\r
\r
/// <summary>\r
/// Gets a list of supported audio encoders.\r
{\r
if (audioEncoders == null)\r
{\r
- IntPtr encodersPtr = HBFunctions.hb_get_audio_encoders();\r
- int encoderCount = HBFunctions.hb_get_audio_encoders_count();\r
-\r
- audioEncoders = InteropUtilities.ConvertArray<hb_encoder_s>(encodersPtr, encoderCount)\r
- .Select(Converters.NativeToAudioEncoder)\r
- .ToList();\r
+ audioEncoders = InteropUtilities.GetListFromIterator<hb_encoder_s, HBAudioEncoder>(HBFunctions.hb_audio_encoder_get_next, Converters.NativeToAudioEncoder);\r
}\r
\r
return audioEncoders;\r
{\r
if (videoEncoders == null)\r
{\r
- IntPtr encodersPtr = HBFunctions.hb_get_video_encoders();\r
- int encoderCount = HBFunctions.hb_get_video_encoders_count();\r
-\r
- videoEncoders = InteropUtilities.ConvertArray<hb_encoder_s>(encodersPtr, encoderCount)\r
- .Select(Converters.NativeToVideoEncoder)\r
- .ToList();\r
+ videoEncoders = InteropUtilities.GetListFromIterator<hb_encoder_s, HBVideoEncoder>(HBFunctions.hb_video_encoder_get_next, Converters.NativeToVideoEncoder);\r
}\r
\r
return videoEncoders;\r
}\r
}\r
\r
+ /// <summary>\r
+ /// Gets a list of supported video framerates (in pts).\r
+ /// </summary>\r
+ public static List<HBRate> VideoFramerates\r
+ {\r
+ get\r
+ {\r
+ if (videoFramerates == null)\r
+ {\r
+ videoFramerates = InteropUtilities.GetListFromIterator<hb_rate_s, HBRate>(HBFunctions.hb_video_framerate_get_next, Converters.NativeToRate);\r
+ }\r
+\r
+ return videoFramerates;\r
+ }\r
+ } \r
+\r
/// <summary>\r
/// Gets a list of supported mixdowns.\r
/// </summary>\r
{\r
if (mixdowns == null)\r
{\r
- IntPtr mixdownsPtr = HBFunctions.hb_get_audio_mixdowns();\r
- int mixdownsCount = HBFunctions.hb_get_audio_mixdowns_count();\r
-\r
- mixdowns = InteropUtilities.ConvertArray<hb_mixdown_s>(mixdownsPtr, mixdownsCount)\r
- .Select(Converters.NativeToMixdown)\r
- .ToList();\r
+ mixdowns = InteropUtilities.GetListFromIterator<hb_mixdown_s, HBMixdown>(HBFunctions.hb_mixdown_get_next, Converters.NativeToMixdown);\r
}\r
\r
return mixdowns;\r
{\r
if (audioBitrates == null)\r
{\r
- IntPtr audioBitratesPtr = HBFunctions.hb_get_audio_bitrates();\r
- int audioBitratesCount = HBFunctions.hb_get_audio_bitrates_count();\r
-\r
- audioBitrates = InteropUtilities.ConvertArray<hb_rate_s>(audioBitratesPtr, audioBitratesCount)\r
- .Select(b => b.rate)\r
- .ToList();\r
+ audioBitrates = InteropUtilities.GetListFromIterator<hb_rate_s, int>(HBFunctions.hb_audio_bitrate_get_next, b => b.rate);\r
}\r
\r
return audioBitrates;\r
}\r
}\r
\r
+ /// <summary>\r
+ /// Gets a list of supported audio sample rates (in Hz).\r
+ /// </summary>\r
+ public static List<HBRate> AudioSampleRates\r
+ {\r
+ get\r
+ {\r
+ if (audioSampleRates == null)\r
+ {\r
+ audioSampleRates = InteropUtilities.GetListFromIterator<hb_rate_s, HBRate>(HBFunctions.hb_audio_samplerate_get_next, Converters.NativeToRate);\r
+ }\r
+\r
+ return audioSampleRates;\r
+ }\r
+ } \r
+\r
/// <summary>\r
/// Gets the audio encoder with the specified short name.\r
/// </summary>\r
/// <returns>A sanitized mixdown value.</returns>\r
public static HBMixdown SanitizeMixdown(HBMixdown mixdown, HBAudioEncoder encoder, ulong layout)\r
{\r
- int sanitizedMixdown = HBFunctions.hb_get_best_mixdown((uint)encoder.Id, layout, mixdown.Id);\r
+ int sanitizedMixdown = HBFunctions.hb_mixdown_get_best((uint)encoder.Id, layout, mixdown.Id);\r
return Mixdowns.Single(m => m.Id == sanitizedMixdown);\r
}\r
\r
/// <returns>The default mixdown for the given codec and channel layout.</returns>\r
public static HBMixdown GetDefaultMixdown(HBAudioEncoder encoder, ulong layout)\r
{\r
- int defaultMixdown = HBFunctions.hb_get_default_mixdown((uint)encoder.Id, layout);\r
+ int defaultMixdown = HBFunctions.hb_mixdown_get_default((uint)encoder.Id, layout);\r
return Mixdowns.Single(m => m.Id == defaultMixdown);\r
}\r
\r
int low = 0;\r
int high = 0;\r
\r
- HBFunctions.hb_get_audio_bitrate_limits((uint)encoder.Id, sampleRate, mixdown.Id, ref low, ref high);\r
+ HBFunctions.hb_audio_bitrate_get_limits((uint)encoder.Id, sampleRate, mixdown.Id, ref low, ref high);\r
\r
return new BitrateLimits { Low = low, High = high };\r
}\r
/// <returns>A sanitized audio bitrate.</returns>\r
public static int SanitizeAudioBitrate(int audioBitrate, HBAudioEncoder encoder, int sampleRate, HBMixdown mixdown)\r
{\r
- return HBFunctions.hb_get_best_audio_bitrate((uint)encoder.Id, audioBitrate, sampleRate, mixdown.Id);\r
+ return HBFunctions.hb_audio_bitrate_get_best((uint)encoder.Id, audioBitrate, sampleRate, mixdown.Id);\r
}\r
\r
/// <summary>\r
/// <returns>The default bitrate for these parameters.</returns>\r
public static int GetDefaultBitrate(HBAudioEncoder encoder, int sampleRate, HBMixdown mixdown)\r
{\r
- return HBFunctions.hb_get_default_audio_bitrate((uint) encoder.Id, sampleRate, mixdown.Id);\r
+ return HBFunctions.hb_audio_bitrate_get_default((uint) encoder.Id, sampleRate, mixdown.Id);\r
}\r
\r
/// <summary>\r
{\r
float low = 0, high = 0, granularity = 0;\r
int direction = 0;\r
- HBFunctions.hb_get_audio_quality_limits((uint)encoderId, ref low, ref high, ref granularity, ref direction);\r
+ HBFunctions.hb_audio_quality_get_limits((uint)encoderId, ref low, ref high, ref granularity, ref direction);\r
\r
return new RangeLimits\r
{\r
{\r
float low = 0, high = 0, granularity = 0;\r
int direction = 0;\r
- HBFunctions.hb_get_audio_compression_limits((uint)encoderId, ref low, ref high, ref granularity, ref direction);\r
+ HBFunctions.hb_audio_compression_get_limits((uint)encoderId, ref low, ref high, ref granularity, ref direction);\r
\r
return new RangeLimits\r
{\r
{\r
using System.ComponentModel.DataAnnotations;\r
\r
+ using HandBrake.Interop.Attributes;\r
+\r
/// <summary>\r
/// The audio encoder.\r
/// </summary>\r
public enum AudioEncoder\r
{\r
[Display(Name = "AAC (faac)")]\r
- Faac = 0,\r
+ [ShortName("faac")]\r
+ faac = 0,\r
\r
- [Display(Name = "AAC (ffmpeg)")]\r
+ [Display(Name = "AAC (avcodec)")]\r
+ [ShortName("av_aac")]\r
ffaac,\r
\r
- [Display(Name = "MP3 (lame)")]\r
+ [Display(Name = "AAC (FDK)")]\r
+ [ShortName("fdk_aac")]\r
+ fdkaac,\r
+\r
+ [Display(Name = "HE-AAC (FDK)")]\r
+ [ShortName("fdk_haac")]\r
+ fdkheaac,\r
+\r
+ [Display(Name = "MP3")]\r
+ [ShortName("mp3")]\r
Lame,\r
\r
- [Display(Name = "AC3 (ffmpeg)")]\r
+ [Display(Name = "AC3")]\r
+ [ShortName("ac3")]\r
Ac3,\r
\r
[Display(Name = "Auto Passthru")]\r
+ [ShortName("copy")]\r
Passthrough,\r
\r
[Display(Name = "AC3 Passthru")]\r
+ [ShortName("copy:ac3")]\r
Ac3Passthrough,\r
\r
[Display(Name = "DTS Passthru")]\r
+ [ShortName("copy:dts")]\r
DtsPassthrough,\r
\r
[Display(Name = "DTS-HD Passthru")]\r
+ [ShortName("copy:dtshd")]\r
DtsHDPassthrough,\r
\r
[Display(Name = "AAC Passthru")]\r
+ [ShortName("copy:aac")]\r
AacPassthru,\r
\r
[Display(Name = "MP3 Passthru")]\r
+ [ShortName("copy:mp3")]\r
Mp3Passthru,\r
\r
- [Display(Name = "Vorbis (vorbis)")]\r
+ [Display(Name = "Vorbis")]\r
+ [ShortName("vorbis")]\r
Vorbis,\r
\r
- [Display(Name = "FLAC (ffmpeg)")]\r
+ [Display(Name = "FLAC 16-bit")]\r
+ [ShortName("flac16")]\r
ffflac,\r
\r
- [Display(Name = "FLAC (24-bit)")]\r
+ [Display(Name = "FLAC 24-bit")]\r
+ [ShortName("flac24")]\r
ffflac24,\r
}\r
}\r
--- /dev/null
+// --------------------------------------------------------------------------------------------------------------------\r
+// <copyright file="HBRate.cs" company="HandBrake Project (http://handbrake.fr)">\r
+// This file is part of the HandBrake source code - It may be used under the terms of the GNU General Public License.\r
+// </copyright>\r
+// --------------------------------------------------------------------------------------------------------------------\r
+\r
+namespace HandBrake.Interop.Model.Encoding\r
+{\r
+ /// <summary>\r
+ /// Represents a rate in HandBrake: audio sample rate or video framerate.\r
+ /// </summary>\r
+ public class HBRate\r
+ {\r
+ /// <summary>\r
+ /// Gets or sets the name to use for this rate.\r
+ /// </summary>\r
+ public string Name { get; set; }\r
+\r
+ /// <summary>\r
+ /// Gets or sets the raw rate.\r
+ /// </summary>\r
+ public int Rate { get; set; }\r
+ }\r
+}\r
// This file is part of the HandBrake source code - It may be used under the terms of the GNU General Public License.\r
// </copyright>\r
// <summary>\r
-// Defines the VideoEncoder type.\r
+// The video encoder.\r
// </summary>\r
// --------------------------------------------------------------------------------------------------------------------\r
\r
{\r
using System.ComponentModel.DataAnnotations;\r
\r
+ using HandBrake.Interop.Attributes;\r
+\r
/// <summary>\r
/// The video encoder.\r
/// </summary>\r
public enum VideoEncoder\r
{\r
[Display(Name = "H.264 (x264)")]\r
+ [ShortName("x264")]\r
X264 = 0,\r
\r
[Display(Name = "H.264 (Intel QSV)")]\r
QuickSync,\r
\r
[Display(Name = "MPEG-4 (FFmpeg)")]\r
+ [ShortName("mpeg4")]\r
FFMpeg,\r
\r
[Display(Name = "MPEG-2 (FFmpeg)")]\r
+ [ShortName("mpeg2")]\r
FFMpeg2,\r
\r
[Display(Name = "VP3 (Theora)")]\r
- Theora,\r
+ [ShortName("theora")]\r
+ Theora\r
}\r
}\r
// You can specify all the values or you can default the Build and Revision Numbers \r
// by using the '*' as shown below:\r
// [assembly: AssemblyVersion("1.0.*")]\r
-[assembly: AssemblyVersion("1.40.0.0")]\r
-[assembly: AssemblyFileVersion("1.40.0.0")]\r
+[assembly: AssemblyVersion("1.43.0.0")]\r
+[assembly: AssemblyFileVersion("1.43.0.0")]\r
/// <summary>\r
/// The flac.\r
/// </summary>\r
- Flac\r
+ Flac, \r
}\r
}
\ No newline at end of file
\r
#region Implemented Interfaces\r
\r
- #region ICommand\r
-\r
/// <summary>\r
/// The can execute.\r
/// </summary>\r
}\r
\r
#endregion\r
-\r
- #endregion\r
}\r
}
\ No newline at end of file
int samplerate = this.GetBestSampleRate(track);\r
int srShift = this.GetSamplerateShift(samplerate);\r
int lfeCount = this.GetLowFreqChannelCount(track.MixDown);\r
- int channels = this.GetChannelCount(track.MixDown) - lfeCount;\r
+ int channels = this.GetDiscreteChannelCount(track.MixDown) - lfeCount;\r
\r
switch (track.Encoder)\r
{\r
- case AudioEncoder.Faac:\r
- low = (channels + lfeCount) * 32;\r
- max = (channels + lfeCount) * (192 >> srShift);\r
- break;\r
case AudioEncoder.ffaac:\r
low = ((channels + lfeCount) * 32);\r
max = ((channels + lfeCount) * ((192 + (64 * ((samplerate << srShift) >= 44100 ? 1 : 0))) >> srShift));\r
case AudioEncoder.Mp3Passthru:\r
case AudioEncoder.Passthrough:\r
case AudioEncoder.ffflac:\r
+ case AudioEncoder.ffflac24:\r
max = 1536; // Since we don't care, just set it to the max.\r
break;\r
+ case AudioEncoder.fdkaac:\r
+ low = channels * samplerate * 2 / 3000;\r
+ max = channels * samplerate * 6 / 1000;\r
+ break;\r
+ case AudioEncoder.fdkheaac:\r
+ low = (channels * (12 + (4 * (samplerate >= 44100 ? 1 : 0))));\r
+ max = (channels - (channels > 2 ? 1 : 0)) * (48 + (16 * (samplerate >= 22050 ? 1 : 0)));\r
+ break;\r
default:\r
max = 768;\r
break;\r
/// <returns>\r
/// The System.Int32.\r
/// </returns>\r
- private int GetChannelCount(Mixdown mixdown)\r
+ private int GetDiscreteChannelCount(Mixdown mixdown)\r
{\r
switch (mixdown)\r
{\r
{\r
// AC-3 < 32 kHz suffers from poor hardware compatibility\r
bestSamplerate = 32000;\r
+ } \r
+ else if ((samplerate < 16000) && (track.Encoder == AudioEncoder.fdkheaac))\r
+ {\r
+ bestSamplerate = 16000;\r
}\r
else\r
{\r
List<AudioEncoder> encoders = EnumHelper<AudioEncoder>.GetEnumList().ToList();\r
EncodeTask task = values[1] as EncodeTask;\r
\r
+ encoders.Remove(AudioEncoder.faac);\r
+\r
if (task != null && task.OutputFormat != OutputFormat.Mkv)\r
{\r
encoders.Remove(AudioEncoder.Vorbis);\r
<Compile Include="Converters\Video\VideoEncoderConverter.cs" />\r
<Compile Include="Helpers\GrayscaleImage.cs" />\r
<Compile Include="Helpers\GrowlCommunicator.cs" />\r
+ <Compile Include="Helpers\AppStyleHelper.cs" />\r
<Compile Include="Model\OptionsTab.cs" />\r
<Compile Include="Model\SelectionTitle.cs" />\r
<Compile Include="Services\EncodeServiceWrapper.cs" />\r
<ItemGroup>\r
<Content Include="defaultsettings.xml">\r
<CopyToOutputDirectory>Always</CopyToOutputDirectory>\r
+ <SubType>Designer</SubType>\r
</Content>\r
<Resource Include="Views\Images\add40.png" />\r
<Resource Include="Views\Images\add.png" />\r
--- /dev/null
+// --------------------------------------------------------------------------------------------------------------------\r
+// <copyright file="AppStyleHelper.cs" company="HandBrake Project (http://handbrake.fr)">\r
+// This file is part of the HandBrake source code - It may be used under the terms of the GNU General Public License.\r
+// </copyright>\r
+// <summary>\r
+// Defines the AppStyleHelper type.\r
+// </summary>\r
+// --------------------------------------------------------------------------------------------------------------------\r
+\r
+namespace HandBrakeWPF.Helpers\r
+{\r
+ using System.Windows;\r
+\r
+ using Caliburn.Micro;\r
+\r
+ using HandBrake.ApplicationServices.Services.Interfaces;\r
+\r
+ /// <summary>\r
+ /// The AppStyle Helper.\r
+ /// </summary>\r
+ public class AppStyleHelper\r
+ {\r
+ /// <summary>\r
+ /// Gets a value indicating whether use system colours.\r
+ /// </summary>\r
+ public static bool UseSystemColours\r
+ {\r
+ get\r
+ {\r
+ IUserSettingService userSettingService = IoC.Get<IUserSettingService>();\r
+ bool useSystemColours = userSettingService.GetUserSetting<bool>(UserSettingConstants.UseSystemColours);\r
+\r
+ return useSystemColours || SystemParameters.HighContrast;\r
+ }\r
+ }\r
+ }\r
+}\r
/// Gets or sets the tag.\r
/// </summary>\r
public object Tag { get; set; }\r
+\r
+ /// <summary>\r
+ /// Gets or sets the input gesture text.\r
+ /// </summary>\r
+ public string InputGestureText { get; set; }\r
}\r
}\r
/// </summary>\r
public const string ShowPresetPanel = "ShowPresetPanel";\r
\r
+ /// <summary>\r
+ /// The use system colours.\r
+ /// </summary>\r
+ public const string UseSystemColours = "UseSystemColours";\r
+\r
#endregion\r
}\r
}
\ No newline at end of file
}\r
}\r
\r
+ public int ProgressPercentage { get; set; }\r
+\r
#endregion\r
\r
#region Load and Shutdown Handling\r
// Perform an update check if required\r
this.updateService.PerformStartupUpdateCheck(this.HandleUpdateCheckResults);\r
\r
+ // Show or Hide the Preset Panel.\r
+ this.IsPresetPanelShowing = this.userSettingService.GetUserSetting<bool>(UserSettingConstants.ShowPresetPanel);\r
+\r
// Setup the presets.\r
+ this.presetService.Load();\r
if (this.presetService.CheckIfPresetsAreOutOfDate())\r
if (!this.userSettingService.GetUserSetting<bool>(UserSettingConstants.PresetNotification))\r
this.errorService.ShowMessageBox("HandBrake has determined your built-in presets are out of date... These presets will now be updated." + Environment.NewLine +\r
// Populate the Source menu with drives.\r
this.SourceMenu = new BindingList<SourceMenuItem>(this.GenerateSourceMenu());\r
\r
- // Show or Hide the Preset Panel.\r
- this.IsPresetPanelShowing = this.userSettingService.GetUserSetting<bool>(UserSettingConstants.ShowPresetPanel);\r
-\r
// Log Cleaning\r
if (userSettingService.GetUserSetting<bool>(UserSettingConstants.ClearOldLogs))\r
{\r
}\r
\r
lastEncodePercentage = percent;\r
+ this.ProgressPercentage = percent;\r
+ this.NotifyOfPropertyChange(() => ProgressPercentage);\r
}\r
else\r
{\r
Image = new Image { Source = new BitmapImage(new Uri("pack://application:,,,/HandBrake;component/Views/Images/folder.png")), Width = 16, Height = 16 },\r
Text = "Open Folder",\r
Command = new SourceMenuCommand(this.FolderScan),\r
- IsDrive = false\r
+ IsDrive = false,\r
+ InputGestureText = "Ctrl + R"\r
};\r
SourceMenuItem fileScan = new SourceMenuItem\r
{\r
Image = new Image { Source = new BitmapImage(new Uri("pack://application:,,,/HandBrake;component/Views/Images/Movies.png")), Width = 16, Height = 16 },\r
Text = "Open File",\r
Command = new SourceMenuCommand(this.FileScan),\r
- IsDrive = false\r
+ IsDrive = false,\r
+ InputGestureText = "Ctrl + F"\r
};\r
\r
SourceMenuItem titleSpecific = new SourceMenuItem { Text = "Title Specific Scan" };\r
/// </summary>\r
private bool removePunctuation;\r
\r
+ /// <summary>\r
+ /// The use system colours for styles.\r
+ /// </summary>\r
+ private bool useSystemColoursForStyles;\r
+\r
#endregion\r
\r
#region Constructors and Destructors\r
this.NotifyOfPropertyChange("WhenDoneOptions");\r
}\r
}\r
+\r
+ /// <summary>\r
+ /// Gets or sets a value indicating whether use system colours.\r
+ /// </summary>\r
+ public bool UseSystemColoursForStylesForStyles\r
+ {\r
+ get\r
+ {\r
+ return this.useSystemColoursForStyles;\r
+ }\r
+ set\r
+ {\r
+ this.useSystemColoursForStyles = value;\r
+ this.NotifyOfPropertyChange(() => UseSystemColoursForStylesForStyles);\r
+ }\r
+ }\r
+\r
#endregion\r
\r
#region Output Files\r
this.SendFileTo = Path.GetFileNameWithoutExtension(this.userSettingService.GetUserSetting<string>(UserSettingConstants.SendFileTo)) ?? string.Empty;\r
this.SendFileToPath = this.userSettingService.GetUserSetting<string>(UserSettingConstants.SendFileTo) ?? string.Empty;\r
this.Arguments = this.userSettingService.GetUserSetting<string>(UserSettingConstants.SendFileToArgs) ?? string.Empty;\r
+ this.UseSystemColoursForStylesForStyles = this.userSettingService.GetUserSetting<bool>(UserSettingConstants.UseSystemColours);\r
\r
// #############################\r
// Output Settings\r
this.userSettingService.SetUserSetting(UserSettingConstants.SendFileTo, this.SendFileToPath);\r
this.userSettingService.SetUserSetting(UserSettingConstants.SendFile, this.SendFileAfterEncode);\r
this.userSettingService.SetUserSetting(UserSettingConstants.SendFileToArgs, this.Arguments);\r
+ this.userSettingService.SetUserSetting(UserSettingConstants.UseSystemColours, this.UseSystemColoursForStylesForStyles);\r
\r
/* Output Files */\r
this.userSettingService.SetUserSetting(UserSettingConstants.AutoNaming, this.AutomaticallyNameFiles);\r
\r
using HandBrake.ApplicationServices.Services.Interfaces;\r
\r
+ using HandBrakeWPF.Helpers;\r
using HandBrakeWPF.Model;\r
using HandBrakeWPF.Services.Interfaces;\r
using HandBrakeWPF.ViewModels.Interfaces;\r
width = 720;\r
}\r
\r
- // TODO figure out what is wrong with this??\r
return HandBrakeUtils.CreateX264OptionsString(preset, tunes, this.ExtraArguments, profile, this.H264Level, width, height);\r
}\r
\r
\r
using HandBrake.ApplicationServices.Services.Interfaces;\r
\r
+ using HandBrakeWPF.Helpers;\r
using HandBrakeWPF.ViewModels.Interfaces;\r
\r
/// <summary>\r
}\r
}\r
\r
+ /// <summary>\r
+ /// Gets a value indicating whether use system colours.\r
+ /// </summary>\r
+ public bool UseSystemColours\r
+ {\r
+ get\r
+ {\r
+ return AppStyleHelper.UseSystemColours;\r
+ }\r
+ }\r
+\r
/// <summary>\r
/// Gets or sets WindowManager.\r
/// </summary>\r
xmlns:dropButton="clr-namespace:HandBrakeWPF.Controls.DropButton"\r
d:DesignHeight="170"\r
d:DesignWidth="616"\r
- mc:Ignorable="d">\r
+ mc:Ignorable="d"\r
+ x:Name="audioTab">\r
\r
<UserControl.Resources>\r
<Conveters:EnumComboConverter x:Key="enumComboConverter" />\r
\r
<ListBox Grid.Row="2"\r
Margin="10,10,10,10"\r
- Background="LightGray"\r
dd:DragDrop.DropHandler="{Binding}"\r
dd:DragDrop.IsDragSource="True"\r
dd:DragDrop.IsDropTarget="True"\r
ItemsSource="{Binding Task.AudioTracks}"\r
SelectionMode="Extended">\r
+ <ListBox.Style>\r
+ <Style TargetType="ListBox">\r
+ <Style.Triggers>\r
+ <DataTrigger Binding="{Binding UseSystemColours}" Value="False">\r
+ <Setter Property="Background" Value="LightGray" />\r
+ </DataTrigger>\r
+ </Style.Triggers>\r
+ </Style>\r
+ </ListBox.Style>\r
+ \r
<ListBox.ItemContainerStyle>\r
<Style TargetType="ListBoxItem">\r
<Setter Property="HorizontalContentAlignment" Value="Stretch" />\r
- <Setter Property="Background" Value="WhiteSmoke" />\r
<Setter Property="Margin" Value="0,0,0,1" />\r
+ <Style.Triggers>\r
+ <DataTrigger Binding="{Binding DataContext.UseSystemColours, ElementName=audioTab}" Value="False">\r
+ <Setter Property="Background" Value="WhiteSmoke" />\r
+ </DataTrigger>\r
+ </Style.Triggers>\r
</Style>\r
</ListBox.ItemContainerStyle>\r
\r
xmlns:Micro="clr-namespace:Caliburn.Micro;assembly=Caliburn.Micro"\r
xmlns:attachedProperties="clr-namespace:HandBrakeWPF.AttachedProperties"\r
AllowDrop="True"\r
- Background="#FFF0F0F0"\r
FontSize="11"\r
Micro:Message.Attach="[Event Loaded] = [Action Load]"\r
SnapsToDevicePixels="True"\r
</i:EventTrigger>\r
</i:Interaction.Triggers>\r
\r
- <UserControl.Resources>\r
-\r
+ <UserControl.Resources> \r
<Style TargetType="Button">\r
<Setter Property="FontWeight" Value="Bold" />\r
<Setter Property="Padding" Value="5,1" />\r
<Style TargetType="ListBoxItem">\r
<Setter Property="Padding" Value="0,2,0,2" />\r
<Style.Triggers>\r
- <DataTrigger Binding="{Binding IsBuildIn}" Value="True">\r
+ <MultiDataTrigger>\r
+ <MultiDataTrigger.Conditions>\r
+ <Condition Binding="{Binding IsBuildIn}" Value="True" />\r
+ <Condition Binding="{Binding DataContext.UseSystemColours, RelativeSource={RelativeSource FindAncestor, AncestorType={x:Type UserControl}}}" Value="False" />\r
+ </MultiDataTrigger.Conditions>\r
<Setter Property="Foreground" Value="DarkBlue" />\r
- </DataTrigger>\r
+ </MultiDataTrigger>\r
+ <!--<DataTrigger Binding="{Binding IsBuildIn}" Value="True">\r
+ <Setter Property="Foreground" Value="DarkBlue" />\r
+ </DataTrigger>-->\r
<Trigger Property="IsSelected" Value="True">\r
<Setter Property="FontWeight" Value="Bold"/>\r
<Setter Property="Background" Value="Transparent"/>\r
HorizontalAlignment="Stretch"\r
VerticalAlignment="Top"\r
>\r
- <MenuItem Header="File">\r
- <MenuItem Header="Cancel Scan" Command="{Binding CancelScanCommand}" />\r
+ <MenuItem Header="_File">\r
+ <MenuItem Header="_Cancel Scan" Command="{Binding CancelScanCommand}" />\r
<Separator />\r
- <MenuItem Header="Exit" Micro:Message.Attach="[Event Click] = [Action ExitApplication]" />\r
+ <MenuItem Header="_Exit" Micro:Message.Attach="[Event Click] = [Action ExitApplication]" InputGestureText="Alt + F4" />\r
</MenuItem>\r
\r
- <MenuItem Header="Tools">\r
- <MenuItem Header="Show Queue" Micro:Message.Attach="[Event Click] = [Action OpenQueueWindow]">\r
+ <MenuItem Header="_Tools">\r
+ <MenuItem Header="_Show Queue" Micro:Message.Attach="[Event Click] = [Action OpenQueueWindow]" InputGestureText="Ctrl + Q">\r
<MenuItem.Icon>\r
<Image Width="16" Source="Images/Queue_Small.png" />\r
</MenuItem.Icon>\r
</MenuItem>\r
- <MenuItem Header="Activity Log" Micro:Message.Attach="[Event Click] = [Action OpenLogWindow]">\r
+ <MenuItem Header="_Activity Log" Micro:Message.Attach="[Event Click] = [Action OpenLogWindow]" InputGestureText="Ctrl + L">\r
<MenuItem.Icon>\r
<Image Width="16" Source="Images/Output_Small.png" />\r
</MenuItem.Icon>\r
</MenuItem>\r
<Separator />\r
- <MenuItem Header="Options" Micro:Message.Attach="[Event Click] = [Action OpenOptionsWindow]">\r
+ <MenuItem Header="_Options" Micro:Message.Attach="[Event Click] = [Action OpenOptionsWindow]">\r
<MenuItem.Icon>\r
<Image Width="16" Source="Images/Pref_Small.png" />\r
</MenuItem.Icon>\r
</MenuItem>\r
\r
\r
- <MenuItem Header="Presets" x:Name="presetMenu">\r
- <MenuItem Header="Presets" ItemsSource="{Binding Presets}">\r
+ <MenuItem Header="_Presets" x:Name="presetMenu">\r
+ <MenuItem Header="_Presets" ItemsSource="{Binding Presets}">\r
<MenuItem.ItemContainerStyle>\r
<Style TargetType="MenuItem">\r
<Setter Property="Tag" Value="{Binding}" />\r
</MenuItem.ItemContainerStyle>\r
</MenuItem>\r
<Separator />\r
- <MenuItem Header="Import" Micro:Message.Attach="[Event Click] = [Action PresetImport]" />\r
- <MenuItem Header="Export" Micro:Message.Attach="[Event Click] = [Action PresetExport]" />\r
+ <MenuItem Header="_Import" Micro:Message.Attach="[Event Click] = [Action PresetImport]" />\r
+ <MenuItem Header="_Export" Micro:Message.Attach="[Event Click] = [Action PresetExport]" />\r
<Separator />\r
- <MenuItem Header="Set Current as Default" Micro:Message.Attach="[Event Click] = [Action PresetSetDefault]" />\r
- <MenuItem Header="Reset Built-In Presets" Micro:Message.Attach="[Event Click] = [Action PresetReset]" />\r
+ <MenuItem Header="_Set Current as Default" Micro:Message.Attach="[Event Click] = [Action PresetSetDefault]" />\r
+ <MenuItem Header="_Reset Built-In Presets" Micro:Message.Attach="[Event Click] = [Action PresetReset]" />\r
<Separator />\r
<MenuItem IsCheckable="True" x:Name="showPresetPanelMenuItem" IsChecked="{Binding IsPresetPanelShowing}">\r
<MenuItem.Style>\r
<Style TargetType="MenuItem">\r
<Style.Triggers>\r
<DataTrigger Binding="{Binding IsChecked, ElementName=showPresetPanelMenuItem}" Value="True">\r
- <Setter Property="Header" Value="Hide Preset Panel"/>\r
+ <Setter Property="Header" Value="_Hide Preset Panel"/>\r
</DataTrigger>\r
<DataTrigger Binding="{Binding IsChecked, ElementName=showPresetPanelMenuItem}" Value="False">\r
- <Setter Property="Header" Value="Show Preset Panel"/>\r
+ <Setter Property="Header" Value="S_how Preset Panel"/>\r
</DataTrigger>\r
</Style.Triggers>\r
</Style>\r
</MenuItem>\r
</MenuItem>\r
\r
- <MenuItem Header="Help">\r
- <MenuItem Header="HandBrake User Guide (HTTP)" Micro:Message.Attach="[Event Click] = [Action LaunchHelp]">\r
+ <MenuItem Header="_Help">\r
+ <MenuItem Header="_HandBrake User Guide (HTTP)" Micro:Message.Attach="[Event Click] = [Action LaunchHelp]">\r
<MenuItem.Icon>\r
<Image Width="16" Height="16" Source="Images/information.png" />\r
</MenuItem.Icon>\r
</MenuItem>\r
<Separator />\r
- <MenuItem Header="Check for Updates" Micro:Message.Attach="[Event Click] = [Action CheckForUpdates]" />\r
+ <MenuItem Header="_Check for Updates" Micro:Message.Attach="[Event Click] = [Action CheckForUpdates]" />\r
<Separator />\r
- <MenuItem Header="About..." Micro:Message.Attach="[Event Click] = [Action OpenAboutApplication]" />\r
+ <MenuItem Header="_About..." Micro:Message.Attach="[Event Click] = [Action OpenAboutApplication]" />\r
</MenuItem>\r
\r
- <MenuItem Header="Debug" Visibility="{Binding ShowDebugMenu, Converter={StaticResource boolToVisConverter}}" >\r
- <MenuItem Header="Show CLI Equiv" Micro:Message.Attach="[Event Click] = [Action ShowCliQuery]" />\r
- <MenuItem Header="Debug Scan Log" Micro:Message.Attach="[Event Click] = [Action DebugScanLog]" />\r
+ <MenuItem Header="_Debug" Visibility="{Binding ShowDebugMenu, Converter={StaticResource boolToVisConverter}}" >\r
+ <MenuItem Header="_Show CLI Equiv" Micro:Message.Attach="[Event Click] = [Action ShowCliQuery]" />\r
+ <MenuItem Header="_Debug Scan Log" Micro:Message.Attach="[Event Click] = [Action DebugScanLog]" />\r
</MenuItem>\r
</Menu>\r
\r
<MenuItem.ItemContainerStyle>\r
<Style TargetType="{x:Type MenuItem}">\r
<Setter Property="Header" Value="{Binding Text}" />\r
- <Setter Property="MenuItem.Command" Value="{Binding Command}"/>\r
- <Setter Property="MenuItem.CommandParameter" Value="123"/>\r
+ <Setter Property="Command" Value="{Binding Command}"/>\r
<Setter Property="ItemsSource" Value="{Binding Children}" />\r
<Setter Property="Icon" Value="{Binding Image}" />\r
+ <Setter Property="InputGestureText" Value="{Binding InputGestureText}" />\r
</Style>\r
</MenuItem.ItemContainerStyle>\r
</MenuItem>\r
VerticalAlignment="Stretch"\r
Header="Presets"\r
Margin="0,0,0,5"\r
- Background="White"\r
- Visibility="{Binding IsPresetPanelShowing, Converter={StaticResource boolToVisConverter}}"\r
- >\r
+ Visibility="{Binding IsPresetPanelShowing, Converter={StaticResource boolToVisConverter}}">\r
+ \r
<Grid>\r
<Grid.RowDefinitions>\r
<RowDefinition Height="*" />\r
/>\r
\r
<!-- Status Bar -->\r
- <StatusBar Grid.Row="2"\r
- Grid.ColumnSpan="2"\r
- Height="32"\r
- Margin="0"\r
- VerticalAlignment="Bottom"\r
- Padding="0"\r
- >\r
+ <StatusBar Grid.Row="2" Grid.ColumnSpan="2" MinHeight="32" >\r
+\r
+ <ProgressBar Value="{Binding ProgressPercentage}" Visibility="{Binding IsEncoding, Converter={StaticResource boolToVisConverter}}"\r
+ Width="100" Height="18" VerticalAlignment="Center"/>\r
<Label VerticalAlignment="Center"\r
- Content="{Binding Path=ProgramStatusLabel}"\r
- FontSize="11"\r
- Padding="0,0,0,5"\r
- />\r
+ Content="{Binding Path=ProgramStatusLabel}" />\r
\r
</StatusBar>\r
</Grid>\r
xmlns:Options="clr-namespace:HandBrakeWPF.Converters.Options"\r
xmlns:dd="clr-namespace:GongSolutions.Wpf.DragDrop;assembly=GongSolutions.Wpf.DragDrop"\r
xmlns:Converters="clr-namespace:HandBrakeWPF.Converters" xmlns:local="clr-namespace:HandBrakeWPF.Model"\r
- Background="White">\r
+ Style="{StaticResource whiteUserControlStyle}">\r
\r
<UserControl.Resources>\r
<Style TargetType="Button">\r
\r
</StackPanel>\r
</StackPanel>\r
+\r
+\r
+ <StackPanel Orientation="Vertical" Margin="0,0,0,20">\r
+\r
+ <TextBlock Text="User Interface" Grid.Column="0" FontSize="14" Margin="0,0,0,10"/>\r
+\r
+ <StackPanel Orientation="Vertical" Grid.Column="1" Margin="20,0,0,0">\r
+\r
+ <CheckBox Content="Always use System Colours (Requires Restart)"\r
+ ToolTip="Note: This option will always be on for systems with a High Contrast Theme selected." IsChecked="{Binding UseSystemColoursForStylesForStyles}" />\r
+\r
+ </StackPanel>\r
+ </StackPanel>\r
</StackPanel>\r
\r
<StackPanel Name="Output" Orientation="Vertical" Margin="10,10,0,0"\r
<ColumnDefinition Width="Auto" />\r
</Grid.ColumnDefinitions>\r
\r
- <Image Width="20" Grid.Row="0" Grid.Column="0"\r
- Height="20" VerticalAlignment="Center" Margin="0,5,0,0"\r
- Source="Images/Refresh.ico"\r
- ToolTip="Reset job status to Waiting."\r
- Visibility="{Binding Status,\r
- Converter={StaticResource queueStatusVisConverter}}">\r
+ <Button Visibility="{Binding Status, Converter={StaticResource queueStatusVisConverter}}"\r
+ Grid.Row="0" Grid.Column="0" Margin="0,5,0,0">\r
+ <Button.Template>\r
+ <ControlTemplate>\r
+ <Image Width="20" \r
+ Height="20" VerticalAlignment="Center"\r
+ Source="Images/Refresh.ico"\r
+ ToolTip="Reset job status to Waiting.">\r
+ </Image>\r
+ </ControlTemplate>\r
+ </Button.Template>\r
<i:Interaction.Triggers>\r
- <i:EventTrigger EventName="MouseDown">\r
+ <i:EventTrigger EventName="Click">\r
<cal:ActionMessage MethodName="RetryJob">\r
<cal:Parameter Value="{Binding}" />\r
</cal:ActionMessage>\r
</i:EventTrigger>\r
</i:Interaction.Triggers>\r
- </Image>\r
-\r
- <Image Width="20" Grid.Row="0" Grid.Column="1"\r
- Height="20"\r
- Margin="10,5,0,0"\r
- Source="Images/Options24.png"\r
- ToolTip="Edit this Job">\r
+ </Button>\r
+\r
+ <Button Grid.Row="0" Grid.Column="1" Margin="10,5,0,0">\r
+ <Button.Template>\r
+ <ControlTemplate>\r
+ <Image Width="20" \r
+ Height="20" VerticalAlignment="Center"\r
+ Source="Images/Options24.png"\r
+ ToolTip="Reset job status to Waiting.">\r
+ </Image>\r
+ </ControlTemplate>\r
+ </Button.Template>\r
<i:Interaction.Triggers>\r
- <i:EventTrigger EventName="MouseDown">\r
+ <i:EventTrigger EventName="Click">\r
<cal:ActionMessage MethodName="EditJob">\r
<cal:Parameter Value="{Binding}" />\r
</cal:ActionMessage>\r
</i:EventTrigger>\r
</i:Interaction.Triggers>\r
- </Image>\r
-\r
- <Image Width="20" Grid.Row="0" Grid.Column="2"\r
- Height="20"\r
- Margin="10,5,0,0"\r
- Source="Images/delete.png"\r
- ToolTip="Remove this Job">\r
+ </Button>\r
+\r
+ <Button Grid.Row="0" Grid.Column="2" Margin="10,5,0,0">\r
+ <Button.Template>\r
+ <ControlTemplate>\r
+ <Image Width="20" \r
+ Height="20" VerticalAlignment="Center" \r
+ Source="Images/delete.png"\r
+ ToolTip="Reset job status to Waiting.">\r
+ </Image>\r
+ </ControlTemplate>\r
+ </Button.Template>\r
<i:Interaction.Triggers>\r
- <i:EventTrigger EventName="MouseDown">\r
+ <i:EventTrigger EventName="Click">\r
<cal:ActionMessage MethodName="RemoveJob">\r
<cal:Parameter Value="{Binding}" />\r
</cal:ActionMessage>\r
</i:EventTrigger>\r
</i:Interaction.Triggers>\r
- </Image>\r
+ </Button>\r
\r
\r
</Grid>\r
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"\r
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"\r
xmlns:Data="clr-namespace:System.Windows.Data;assembly=PresentationFramework"\r
- xmlns:Converters="clr-namespace:HandBrakeWPF.Converters" Title="{Data:Binding Path=WindowTitle}"\r
+ xmlns:Converters="clr-namespace:HandBrakeWPF.Converters"\r
+ Title="{Data:Binding Path=WindowTitle}"\r
Width="1015"\r
Height="670"\r
MinWidth="750"\r
MinHeight="670"\r
AllowDrop="True"\r
- Background="#FFF0F0F0"\r
SnapsToDevicePixels="True"\r
UseLayoutRounding="True"\r
WindowStartupLocation="CenterScreen"\r
TextOptions.TextFormattingMode="Display"\r
+ Style="{StaticResource mainWindowStyle}"\r
>\r
<Window.Resources>\r
<Converters:BooleanToVisibilityConverter x:Key="boolToVisConverter" />\r
<ResourceDictionary xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"\r
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml">\r
\r
+ <Style x:Key="mainWindowStyle" TargetType="Window">\r
+ <Style.Triggers>\r
+ <DataTrigger Binding="{Binding UseSystemColours}" Value="False">\r
+ <Setter Property="Background" Value="#FFF0F0F0" />\r
+ </DataTrigger>\r
+ </Style.Triggers>\r
+ </Style>\r
+\r
+ <Style x:Key="whiteUserControlStyle" TargetType="UserControl">\r
+ <Style.Triggers>\r
+ <DataTrigger Binding="{Binding UseSystemColours}" Value="False">\r
+ <Setter Property="Background" Value="White" />\r
+ </DataTrigger>\r
+ </Style.Triggers>\r
+ </Style>\r
+\r
<Style x:Key="{x:Type StatusBar}" TargetType="{x:Type StatusBar}">\r
<Setter Property="SnapsToDevicePixels" Value="True"/>\r
<Setter Property="Template">\r
<Setter.Value>\r
<ControlTemplate TargetType="{x:Type StatusBar}">\r
- <Border Background="#FAFAFA" Padding="1">\r
+ <Border Padding="1">\r
+ <Border.Style>\r
+ <Style TargetType="Border">\r
+ <Style.Triggers>\r
+ <DataTrigger Binding="{Binding UseSystemColours}" Value="False">\r
+ <Setter Property="Background" Value="#FAFAFA" />\r
+ </DataTrigger>\r
+ </Style.Triggers>\r
+ </Style>\r
+ </Border.Style>\r
<ItemsPresenter Margin="0" />\r
</Border>\r
</ControlTemplate>\r
</Setter>\r
</Style>\r
\r
+ <Style TargetType="{x:Type GroupBox}">\r
+ <Style.Triggers>\r
+ <DataTrigger Binding="{Binding UseSystemColours}" Value="False">\r
+ <Setter Property="Background" Value="White" />\r
+ </DataTrigger>\r
+ </Style.Triggers>\r
+ </Style>\r
+\r
<Style TargetType="{x:Type ComboBox}">\r
<Setter Property="MinHeight" Value="22"/>\r
<Setter Property="Margin" Value="0,2,0,2" />\r
xmlns:dd="clr-namespace:GongSolutions.Wpf.DragDrop;assembly=GongSolutions.Wpf.DragDrop"\r
xmlns:i="http://schemas.microsoft.com/expression/2010/interactivity"\r
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"\r
- xmlns:NumericUpDown="clr-namespace:EagleBoost.Wpf.Presentation.Controls.NumericUpDown;assembly=EagleBoost.Wpf.Presentation"\r
xmlns:controls="clr-namespace:HandBrakeWPF.Controls"\r
xmlns:dropButton="clr-namespace:HandBrakeWPF.Controls.DropButton"\r
d:DesignHeight="153"\r
d:DesignWidth="319"\r
- mc:Ignorable="d">\r
+ mc:Ignorable="d"\r
+ x:Name="subTab">\r
<UserControl.Resources>\r
<Converters:BooleanToVisibilityConverter x:Key="booleanToVisConverter" />\r
</UserControl.Resources>\r
\r
<ListBox Grid.Row="2"\r
Margin="10,10,10,10"\r
- Background="LightGray"\r
dd:DragDrop.DropHandler="{Binding}"\r
dd:DragDrop.IsDragSource="True"\r
dd:DragDrop.IsDropTarget="True"\r
ItemsSource="{Binding Task.SubtitleTracks}"\r
SelectionMode="Extended">\r
+ <ListBox.Style>\r
+ <Style TargetType="ListBox">\r
+ <Style.Triggers>\r
+ <DataTrigger Binding="{Binding UseSystemColours}" Value="False">\r
+ <Setter Property="Background" Value="LightGray" />\r
+ </DataTrigger>\r
+ </Style.Triggers>\r
+ </Style>\r
+ </ListBox.Style>\r
+ \r
<ListBox.ItemContainerStyle>\r
<Style TargetType="ListBoxItem">\r
<Setter Property="HorizontalContentAlignment" Value="Stretch" />\r
- <Setter Property="Background" Value="WhiteSmoke" />\r
<Setter Property="Margin" Value="0,0,0,1" />\r
+ <Style.Triggers>\r
+ <DataTrigger Binding="{Binding DataContext.UseSystemColours, ElementName=subTab}" Value="False">\r
+ <Setter Property="Background" Value="WhiteSmoke" />\r
+ </DataTrigger>\r
+ </Style.Triggers>\r
</Style>\r
</ListBox.ItemContainerStyle>\r
\r
<anyType xmlns:q1="http://www.w3.org/2001/XMLSchema" d4p1:type="q1:boolean" xmlns:d4p1="http://www.w3.org/2001/XMLSchema-instance">true</anyType>\r
</value>\r
</item>\r
+ <item>\r
+ <key>\r
+ <string>UseSystemColours</string>\r
+ </key>\r
+ <value>\r
+ <anyType xmlns:q1="http://www.w3.org/2001/XMLSchema" d4p1:type="q1:boolean" xmlns:d4p1="http://www.w3.org/2001/XMLSchema-instance">false</anyType>\r
+ </value>\r
+ </item>\r
</dictionary>
\ No newline at end of file
Gets a flag enumeration indicating the current state of the SHIFT, CTRL, and ALT keys, as well as the state of the mouse buttons.\r
</summary>\r
</member>\r
+ <member name="P:GongSolutions.Wpf.DragDrop.IDropInfo.NotHandled">\r
+ <summary>\r
+ Indicates if the drop info should be handled by itself (useful for child elements)\r
+ </summary>\r
+ </member>\r
<member name="T:GongSolutions.Wpf.DragDrop.DropInfo">\r
<summary>\r
Holds information about a the target of a drag drop operation.\r