X-Git-Url: http://git.osdn.jp/view?a=blobdiff_plain;f=gtk%2Fsrc%2Fhb-backend.c;h=5d43d469e111b0aaf761fe3e3578137ba56980c4;hb=deb26cc60ded7052b1968246b6d00576df1bee84;hp=3e5382d8bd499d5e62e516ea063bffe02c253126;hpb=3e5cf70a2c37f304afb50a96b2be14d552c8aa7e;p=handbrake-jp%2Fhandbrake-jp-git.git diff --git a/gtk/src/hb-backend.c b/gtk/src/hb-backend.c index 3e5382d8..5d43d469 100644 --- a/gtk/src/hb-backend.c +++ b/gtk/src/hb-backend.c @@ -226,8 +226,8 @@ combo_opts_t denoise_opts = static options_map_t d_vcodec_opts[] = { {"H.264 (x264)", "x264", HB_VCODEC_X264, ""}, - {"MPEG-4 (FFMPEG)", "ffmpeg", HB_VCODEC_FFMPEG, ""}, - {"Theora", "theora", HB_VCODEC_THEORA, ""}, + {"MPEG-4 (FFmpeg)", "ffmpeg", HB_VCODEC_FFMPEG, ""}, + {"VP3 (Theora)", "theora", HB_VCODEC_THEORA, ""}, }; combo_opts_t vcodec_opts = { @@ -237,12 +237,12 @@ combo_opts_t vcodec_opts = static options_map_t d_acodec_opts[] = { - {"AAC (faac)", "faac", HB_ACODEC_FAAC, "faac"}, - {"MP3 (lame)", "lame", HB_ACODEC_LAME, "lame"}, + {"AAC (faac)", "faac", HB_ACODEC_FAAC, "faac"}, + {"MP3 (lame)", "lame", HB_ACODEC_LAME, "lame"}, {"Vorbis", "vorbis", HB_ACODEC_VORBIS, "vorbis"}, - {"AC3 (pass-thru)", "ac3", HB_ACODEC_AC3, "ac3"}, - {"DTS (pass-thru)", "dts", HB_ACODEC_DCA, "dts"}, - {"Auto Pass-Thru", "auto", HB_ACODEC_DCA|HB_ACODEC_AC3, "auto"}, + {"AC3 (pass-thru)", "ac3", HB_ACODEC_AC3, "ac3"}, + {"DTS (pass-thru)", "dts", HB_ACODEC_DCA, "dts"}, + {"Choose For Me", "auto", HB_ACODEC_MASK, "auto"}, }; combo_opts_t acodec_opts = { @@ -1348,27 +1348,18 @@ ghb_grey_combo_options(GtkBuilder *builder) grey_combo_box_item(builder, "AudioEncoder", HB_ACODEC_VORBIS, TRUE); grey_combo_box_item(builder, "VideoEncoder", HB_VCODEC_THEORA, TRUE); } - else if (container == HB_MUX_AVI) - { - grey_combo_box_item(builder, "AudioEncoder", HB_ACODEC_FAAC, TRUE); - grey_combo_box_item(builder, "AudioEncoder", HB_ACODEC_VORBIS, TRUE); - grey_combo_box_item(builder, "VideoEncoder", HB_VCODEC_THEORA, TRUE); - } - else if (container == HB_MUX_OGM) - { - grey_combo_box_item(builder, "AudioEncoder", HB_ACODEC_FAAC, TRUE); - } gboolean allow_mono = TRUE; gboolean allow_stereo = TRUE; gboolean allow_dolby = TRUE; gboolean allow_dpl2 = TRUE; gboolean allow_6ch = TRUE; + allow_mono = acodec & ~HB_ACODEC_LAME; + allow_6ch = acodec & ~HB_ACODEC_LAME; if (audio) { - allow_mono = - (audio->in.codec & (HB_ACODEC_AC3|HB_ACODEC_DCA)) && - (acodec != HB_ACODEC_LAME); + allow_mono = allow_mono && + (audio->in.codec & (HB_ACODEC_AC3|HB_ACODEC_DCA)); gint layout = audio->in.channel_layout & HB_INPUT_CH_LAYOUT_DISCRETE_NO_LFE_MASK; allow_stereo = ((layout == HB_INPUT_CH_LAYOUT_MONO && !allow_mono) || layout >= HB_INPUT_CH_LAYOUT_STEREO); @@ -1377,9 +1368,8 @@ ghb_grey_combo_options(GtkBuilder *builder) (layout == HB_INPUT_CH_LAYOUT_3F2R) || (layout == HB_INPUT_CH_LAYOUT_DOLBY); allow_dpl2 = (layout == HB_INPUT_CH_LAYOUT_3F2R); - allow_6ch = + allow_6ch = allow_6ch && (audio->in.codec & (HB_ACODEC_AC3|HB_ACODEC_DCA)) && - (acodec != HB_ACODEC_LAME) && (layout == HB_INPUT_CH_LAYOUT_3F2R) && (audio->in.channel_layout & HB_INPUT_CH_LAYOUT_HAS_LFE); } @@ -1391,6 +1381,18 @@ ghb_grey_combo_options(GtkBuilder *builder) } gint +ghb_get_best_audio_bitrate(gint acodec, gint br, gint channels) +{ + if (acodec & HB_ACODEC_FAAC) + { + int maxbr = channels * 80; + if (br > maxbr) + br = maxbr; + } + return br; +} + +gint ghb_get_best_mix(gint titleindex, gint track, gint acodec, gint mix) { hb_audio_config_t *audio = NULL; @@ -1410,7 +1412,7 @@ ghb_get_best_mix(gint titleindex, gint track, gint acodec, gint mix) { allow_mono = (audio->in.codec & (HB_ACODEC_AC3|HB_ACODEC_DCA)) && - (acodec != HB_ACODEC_LAME); + (acodec & ~HB_ACODEC_LAME); gint layout = audio->in.channel_layout & HB_INPUT_CH_LAYOUT_DISCRETE_NO_LFE_MASK; allow_stereo = ((layout == HB_INPUT_CH_LAYOUT_MONO && !allow_mono) || layout >= HB_INPUT_CH_LAYOUT_STEREO); @@ -1421,7 +1423,7 @@ ghb_get_best_mix(gint titleindex, gint track, gint acodec, gint mix) allow_dpl2 = (layout == HB_INPUT_CH_LAYOUT_3F2R); allow_6ch = (audio->in.codec & (HB_ACODEC_AC3|HB_ACODEC_DCA)) && - (acodec != HB_ACODEC_LAME) && + (acodec & ~HB_ACODEC_LAME) && (layout == HB_INPUT_CH_LAYOUT_3F2R) && (audio->in.channel_layout & HB_INPUT_CH_LAYOUT_HAS_LFE); } @@ -1492,7 +1494,7 @@ init_combo_box(GtkBuilder *builder, const gchar *name) cell = GTK_CELL_RENDERER(gtk_cell_renderer_text_new()); gtk_cell_layout_pack_start(GTK_CELL_LAYOUT(combo), cell, TRUE); gtk_cell_layout_set_attributes(GTK_CELL_LAYOUT(combo), cell, - "text", 0, "sensitive", 1, NULL); + "markup", 0, "sensitive", 1, NULL); } else { // Combo box entry @@ -1506,6 +1508,7 @@ audio_samplerate_opts_set(GtkBuilder *builder, const gchar *name, hb_rate_t *rat GtkTreeIter iter; GtkListStore *store; gint ii; + gchar *str; g_debug("audio_samplerate_opts_set ()\n"); store = get_combo_box_store(builder, name); @@ -1513,7 +1516,7 @@ audio_samplerate_opts_set(GtkBuilder *builder, const gchar *name, hb_rate_t *rat // Add an item for "Same As Source" gtk_list_store_append(store, &iter); gtk_list_store_set(store, &iter, - 0, "Same as source", + 0, "Same as source", 1, TRUE, 2, "source", 3, 0.0, @@ -1522,13 +1525,15 @@ audio_samplerate_opts_set(GtkBuilder *builder, const gchar *name, hb_rate_t *rat for (ii = 0; ii < count; ii++) { gtk_list_store_append(store, &iter); + str = g_strdup_printf("%s", rates[ii].string); gtk_list_store_set(store, &iter, - 0, rates[ii].string, + 0, str, 1, TRUE, 2, rates[ii].string, 3, (gdouble)rates[ii].rate, 4, rates[ii].string, -1); + g_free(str); } } @@ -1586,13 +1591,14 @@ mix_opts_set(GtkBuilder *builder, const gchar *name) GtkTreeIter iter; GtkListStore *store; gint ii; + gchar *str; g_debug("mix_opts_set ()\n"); store = get_combo_box_store(builder, name); gtk_list_store_clear(store); gtk_list_store_append(store, &iter); gtk_list_store_set(store, &iter, - 0, "None", + 0, "None", 1, TRUE, 2, "none", 3, 0.0, @@ -1601,13 +1607,16 @@ mix_opts_set(GtkBuilder *builder, const gchar *name) for (ii = 0; ii < hb_audio_mixdowns_count; ii++) { gtk_list_store_append(store, &iter); + str = g_strdup_printf("%s", + hb_audio_mixdowns[ii].human_readable_name); gtk_list_store_set(store, &iter, - 0, hb_audio_mixdowns[ii].human_readable_name, + 0, str, 1, TRUE, 2, hb_audio_mixdowns[ii].short_name, 3, (gdouble)hb_audio_mixdowns[ii].amixdown, 4, hb_audio_mixdowns[ii].internal_name, -1); + g_free(str); } } @@ -1779,6 +1788,7 @@ audio_track_opts_set(GtkBuilder *builder, const gchar *name, gint titleindex) hb_audio_config_t * audio; gint ii; gint count = 0; + gchar *str; g_debug("audio_track_opts_set ()\n"); store = get_combo_box_store(builder, name); @@ -1809,7 +1819,7 @@ audio_track_opts_set(GtkBuilder *builder, const gchar *name, gint titleindex) // No audio. set some default gtk_list_store_append(store, &iter); gtk_list_store_set(store, &iter, - 0, "No Audio", + 0, "No Audio", 1, TRUE, 2, "none", 3, -1.0, @@ -1826,13 +1836,15 @@ audio_track_opts_set(GtkBuilder *builder, const gchar *name, gint titleindex) { audio = (hb_audio_config_t *) hb_list_audio_config_item( title->list_audio, ii ); gtk_list_store_append(store, &iter); + str = g_strdup_printf("%s", audio->lang.description); gtk_list_store_set(store, &iter, - 0, audio->lang.description, + 0, str, 1, TRUE, 2, index_str[ii], 3, (gdouble)ii, 4, index_str[ii], -1); + g_free(str); audio_track_opts.map[ii].option = audio->lang.description, audio_track_opts.map[ii].shortOpt = index_str[ii]; audio_track_opts.map[ii].ivalue = ii; @@ -2195,9 +2207,12 @@ ghb_find_cc_track(gint titleindex) gint ghb_find_subtitle_track( - gint titleindex, - const gchar *lang, - GHashTable *track_indices) + gint titleindex, + const gchar * lang, + gboolean burn, + gboolean force, + gint source, + GHashTable * track_indices) { hb_list_t * list; hb_title_t * title; @@ -2220,6 +2235,21 @@ ghb_find_subtitle_track( used = g_malloc0(count * sizeof(gboolean)); g_hash_table_insert(track_indices, g_strdup(lang), used); } + // Try to find an item that matches the preferred language and source + for (ii = 0; ii < count; ii++) + { + if (used[ii]) + continue; + + subtitle = (hb_subtitle_t*)hb_list_item( title->list_subtitle, ii ); + if (source == subtitle->source && + ((strcmp(lang, subtitle->iso639_2) == 0) || + (strcmp(lang, "und") == 0))) + { + used[ii] = TRUE; + return ii; + } + } // Try to find an item that matches the preferred language for (ii = 0; ii < count; ii++) { @@ -2227,8 +2257,9 @@ ghb_find_subtitle_track( continue; subtitle = (hb_subtitle_t*)hb_list_item( title->list_subtitle, ii ); - if ((strcmp(lang, subtitle->iso639_2) == 0) || - (strcmp(lang, "und") == 0)) + if (((burn || force) && (subtitle->source == VOBSUB)) && + ((strcmp(lang, subtitle->iso639_2) == 0) || + (strcmp(lang, "und") == 0))) { used[ii] = TRUE; return ii; @@ -2262,6 +2293,33 @@ generic_opts_set(GtkBuilder *builder, const gchar *name, combo_opts_t *opts) } } +static void +small_opts_set(GtkBuilder *builder, const gchar *name, combo_opts_t *opts) +{ + GtkTreeIter iter; + GtkListStore *store; + gint ii; + gchar *str; + + g_debug("generic_opts_set ()\n"); + if (name == NULL || opts == NULL) return; + store = get_combo_box_store(builder, name); + gtk_list_store_clear(store); + for (ii = 0; ii < opts->count; ii++) + { + gtk_list_store_append(store, &iter); + str = g_strdup_printf("%s", opts->map[ii].option); + gtk_list_store_set(store, &iter, + 0, str, + 1, TRUE, + 2, opts->map[ii].shortOpt, + 3, opts->map[ii].ivalue, + 4, opts->map[ii].svalue, + -1); + g_free(str); + } +} + combo_opts_t* find_combo_table(const gchar *name) { @@ -2433,7 +2491,7 @@ ghb_update_ui_combo_box( generic_opts_set(ud->builder, "PictureDecomb", &decomb_opts); generic_opts_set(ud->builder, "PictureDenoise", &denoise_opts); generic_opts_set(ud->builder, "VideoEncoder", &vcodec_opts); - generic_opts_set(ud->builder, "AudioEncoder", &acodec_opts); + small_opts_set(ud->builder, "AudioEncoder", &acodec_opts); generic_opts_set(ud->builder, "x264_direct", &direct_opts); generic_opts_set(ud->builder, "x264_b_adapt", &badapt_opts); generic_opts_set(ud->builder, "x264_me", &me_opts); @@ -2598,11 +2656,14 @@ audio_bitrate_opts_add(GtkBuilder *builder, const gchar *name, gint rate) GtkListStore *store; gchar *str; - g_debug("audio_rate_opts_add ()\n"); + g_debug("audio_bitrate_opts_add ()\n"); + + if (rate < 8) return; + store = get_combo_box_store(builder, name); if (!find_combo_item_by_int(GTK_TREE_MODEL(store), rate, &iter)) { - str = g_strdup_printf ("%d", rate); + str = g_strdup_printf ("%d", rate); gtk_list_store_append(store, &iter); gtk_list_store_set(store, &iter, 0, str, @@ -2659,6 +2720,7 @@ audio_bitrate_opts_set(GtkBuilder *builder, const gchar *name) GtkTreeIter iter; GtkListStore *store; gint ii; + gchar *str; g_debug("audio_bitrate_opts_set ()\n"); store = get_combo_box_store(builder, name); @@ -2666,13 +2728,16 @@ audio_bitrate_opts_set(GtkBuilder *builder, const gchar *name) for (ii = 0; ii < hb_audio_bitrates_count; ii++) { gtk_list_store_append(store, &iter); + str = g_strdup_printf ("%s", + hb_audio_bitrates[ii].string); gtk_list_store_set(store, &iter, - 0, hb_audio_bitrates[ii].string, + 0, str, 1, TRUE, 2, hb_audio_bitrates[ii].string, 3, (gdouble)hb_audio_bitrates[ii].rate, 4, hb_audio_bitrates[ii].string, -1); + g_free(str); } } @@ -3090,7 +3155,12 @@ ghb_set_scale(signal_user_data_t *ud, gint mode) if (busy) return; busy = TRUE; - + if (!ud->dont_clear_presets && (keep_width || keep_height)) + { + ghb_settings_set_int(ud->settings, "PictureWidth", 0); + ghb_settings_set_int(ud->settings, "PictureHeight", 0); + } + // First configure widgets mod = ghb_settings_combo_int(ud->settings, "PictureModulus"); pic_par = ghb_settings_combo_int(ud->settings, "PicturePAR"); @@ -3226,7 +3296,7 @@ ghb_set_scale(signal_user_data_t *ud, gint mode) job->anamorphic.dar_height = 0; if (keep_height && pic_par == 2) - width = ((double)height * crop_width / crop_height) + 0.5; + width = ((double)height * crop_width / crop_height) + mod / 2; job->width = width; job->height = height; job->maxWidth = max_width; @@ -3477,7 +3547,7 @@ ghb_validate_filters(signal_user_data_t *ud) if (!decomb_deint && index == 1) { str = ghb_settings_get_string(ud->settings, "PictureDeinterlaceCustom"); - if (!ghb_validate_filter_string(str, 4)) + if (!ghb_validate_filter_string(str, -1)) { message = g_strdup_printf( "Invalid Deinterlace Settings:\n\n%s\n", @@ -3494,7 +3564,7 @@ ghb_validate_filters(signal_user_data_t *ud) if (index == 1) { str = ghb_settings_get_string(ud->settings, "PictureDetelecineCustom"); - if (!ghb_validate_filter_string(str, 6)) + if (!ghb_validate_filter_string(str, -1)) { message = g_strdup_printf( "Invalid Detelecine Settings:\n\n%s\n", @@ -3511,7 +3581,7 @@ ghb_validate_filters(signal_user_data_t *ud) if (decomb_deint && index == 1) { str = ghb_settings_get_string(ud->settings, "PictureDecombCustom"); - if (!ghb_validate_filter_string(str, 15)) + if (!ghb_validate_filter_string(str, -1)) { message = g_strdup_printf( "Invalid Decomb Settings:\n\n%s\n", @@ -3528,7 +3598,7 @@ ghb_validate_filters(signal_user_data_t *ud) if (index == 1) { str = ghb_settings_get_string(ud->settings, "PictureDenoiseCustom"); - if (!ghb_validate_filter_string(str, 4)) + if (!ghb_validate_filter_string(str, -1)) { message = g_strdup_printf( "Invalid Denoise Settings:\n\n%s\n", @@ -3551,12 +3621,11 @@ ghb_validate_video(signal_user_data_t *ud) mux = ghb_settings_combo_int(ud->settings, "FileFormat"); vcodec = ghb_settings_combo_int(ud->settings, "VideoEncoder"); - if ((mux == HB_MUX_MP4 || mux == HB_MUX_AVI) && - (vcodec == HB_VCODEC_THEORA)) + if ((mux == HB_MUX_MP4) && (vcodec == HB_VCODEC_THEORA)) { - // mp4|avi/theora combination is not supported. + // mp4/theora combination is not supported. message = g_strdup_printf( - "Theora is not supported in the MP4 and AVI containers.\n\n" + "Theora is not supported in the MP4 container.\n\n" "You should choose a different video codec or container.\n" "If you continue, FFMPEG will be chosen for you."); if (!ghb_message_dialog(GTK_MESSAGE_WARNING, message, "Cancel", "Continue")) @@ -3667,6 +3736,63 @@ ghb_validate_subtitles(signal_user_data_t *ud) return TRUE; } +gint +ghb_select_audio_codec(signal_user_data_t *ud, gint track) +{ + hb_list_t * list; + hb_title_t * title; + hb_audio_config_t *audio; + + if (h_scan == NULL) return -1; + list = hb_get_titles( h_scan ); + if( !hb_list_count( list ) ) + { + return -1; + } + + gint titleindex; + + titleindex = ghb_settings_combo_int(ud->settings, "title"); + title = hb_list_item( list, titleindex ); + if (title == NULL) return -1; + + gint mux = ghb_settings_combo_int(ud->settings, "FileFormat"); + + if (track < 0 || track >= hb_list_count(title->list_audio)) + return -1; + + audio = (hb_audio_config_t *) hb_list_audio_config_item( + title->list_audio, track ); + if (mux == HB_MUX_MP4) + { + if (audio->in.codec == HB_ACODEC_AC3) + return audio->in.codec; + else + return HB_ACODEC_FAAC; + } + else + { + if (audio->in.codec == HB_ACODEC_AC3 || audio->in.codec == HB_ACODEC_DCA) + return audio->in.codec; + else + return HB_ACODEC_LAME; + } +} + +const gchar* +ghb_select_audio_codec_str(signal_user_data_t *ud, gint track) +{ + gint acodec, ii; + + acodec = ghb_select_audio_codec(ud, track); + for (ii = 0; ii < acodec_opts.count; ii++) + { + if (acodec_opts.map[ii].ivalue == acodec) + return acodec_opts.map[ii].option; + } + return "Unknown"; +} + gboolean ghb_validate_audio(signal_user_data_t *ud) { @@ -3704,6 +3830,9 @@ ghb_validate_audio(signal_user_data_t *ud) asettings = ghb_array_get_nth(audio_list, ii); gint track = ghb_settings_combo_int(asettings, "AudioTrack"); gint codec = ghb_settings_combo_int(asettings, "AudioEncoder"); + if (codec == HB_ACODEC_MASK) + continue; + taudio = (hb_audio_config_t *) hb_list_audio_config_item( title->list_audio, track ); if (!(taudio->in.codec & codec) && @@ -3720,7 +3849,7 @@ ghb_validate_audio(signal_user_data_t *ud) return FALSE; } g_free(message); - if (mux == HB_MUX_AVI) + if (mux == HB_MUX_MKV) { codec = HB_ACODEC_LAME; } @@ -3753,41 +3882,6 @@ ghb_validate_audio(signal_user_data_t *ud) codec = HB_ACODEC_FAAC; } } - else if (mux == HB_MUX_AVI) - { - mux_s = "AVI"; - // avi/faac|vorbis combination is not supported. - if (codec == HB_ACODEC_FAAC) - { - a_unsup = "FAAC"; - codec = HB_ACODEC_LAME; - } - if (codec == HB_ACODEC_VORBIS) - { - a_unsup = "Vorbis"; - codec = HB_ACODEC_LAME; - } - } - else if (mux == HB_MUX_OGM) - { - mux_s = "OGM"; - // avi/faac|vorbis combination is not supported. - if (codec == HB_ACODEC_FAAC) - { - a_unsup = "FAAC"; - codec = HB_ACODEC_VORBIS; - } - if (codec == HB_ACODEC_AC3) - { - a_unsup = "AC-3"; - codec = HB_ACODEC_VORBIS; - } - if (codec == HB_ACODEC_DCA) - { - a_unsup = "DTS"; - codec = HB_ACODEC_VORBIS; - } - } if (a_unsup) { message = g_strdup_printf( @@ -3811,7 +3905,7 @@ ghb_validate_audio(signal_user_data_t *ud) gboolean allow_6ch = TRUE; allow_mono = (taudio->in.codec & (HB_ACODEC_AC3|HB_ACODEC_DCA)) && - (codec != HB_ACODEC_LAME); + (codec & ~HB_ACODEC_LAME); gint layout = taudio->in.channel_layout & HB_INPUT_CH_LAYOUT_DISCRETE_NO_LFE_MASK; allow_stereo = ((layout == HB_INPUT_CH_LAYOUT_MONO && !allow_mono) || layout >= HB_INPUT_CH_LAYOUT_STEREO); @@ -3822,7 +3916,7 @@ ghb_validate_audio(signal_user_data_t *ud) allow_dpl2 = (layout == HB_INPUT_CH_LAYOUT_3F2R); allow_6ch = (taudio->in.codec & (HB_ACODEC_AC3|HB_ACODEC_DCA)) && - (codec != HB_ACODEC_LAME) && + (codec & ~HB_ACODEC_LAME) && (layout == HB_INPUT_CH_LAYOUT_3F2R) && (taudio->in.channel_layout & HB_INPUT_CH_LAYOUT_HAS_LFE); @@ -4123,10 +4217,9 @@ add_job(hb_handle_t *h, GValue *js, gint unique_id, gint titleindex) job->height = ghb_settings_get_int(js, "scale_height"); job->vcodec = ghb_settings_combo_int(js, "VideoEncoder"); - if ((job->mux == HB_MUX_MP4 || job->mux == HB_MUX_AVI) && - (job->vcodec == HB_VCODEC_THEORA)) + if ((job->mux == HB_MUX_MP4 ) && (job->vcodec == HB_VCODEC_THEORA)) { - // mp4|avi/theora combination is not supported. + // mp4/theora combination is not supported. job->vcodec = HB_VCODEC_FFMPEG; } if ((job->vcodec == HB_VCODEC_X264) && (job->mux == HB_MUX_MP4)) @@ -4160,16 +4253,6 @@ add_job(hb_handle_t *h, GValue *js, gint unique_id, gint titleindex) job->cfr = 1; } - // AVI container does not support variable frame rate. - // OGM supports variable frame rate, but bases all timing on - // DTS, which breaks when b-frames are used since it is - // impossible to reconstruct PTS from DTS when the framerate - // is variable. - if (job->mux == HB_MUX_AVI || job->mux == HB_MUX_OGM) - { - job->cfr = 1; - } - const GValue *audio_list; gint count, ii; gint tcount = 0; @@ -4191,10 +4274,11 @@ add_job(hb_handle_t *h, GValue *js, gint unique_id, gint titleindex) title->list_audio, audio.in.track ); if (audio.out.codec & (HB_ACODEC_AC3 | HB_ACODEC_DCA)) { - if (!(taudio->in.codec & audio.out.codec)) + if (!(taudio->in.codec & (HB_ACODEC_AC3 | HB_ACODEC_DCA))) { - // Not supported. AC3 is passthrough only, so input must be AC3 - if (job->mux == HB_MUX_AVI) + // Not supported. + // AC3/DTS is passthrough only, so input must be AC3/DTS + if (job->mux == HB_MUX_MKV) { audio.out.codec = HB_ACODEC_LAME; } @@ -4209,40 +4293,35 @@ add_job(hb_handle_t *h, GValue *js, gint unique_id, gint titleindex) } } if ((job->mux == HB_MUX_MP4) && - ((audio.out.codec == HB_ACODEC_LAME) || - (audio.out.codec == HB_ACODEC_VORBIS))) + ((audio.out.codec & HB_ACODEC_LAME) || + (audio.out.codec & HB_ACODEC_DCA) || + (audio.out.codec & HB_ACODEC_VORBIS))) { - // mp4/mp3|vorbis combination is not supported. + // mp4/mp3|dts|vorbis combination is not supported. audio.out.codec = HB_ACODEC_FAAC; } - if ((job->mux == HB_MUX_AVI) && - ((audio.out.codec == HB_ACODEC_FAAC) || - (audio.out.codec == HB_ACODEC_VORBIS))) - { - // avi/faac|vorbis combination is not supported. - audio.out.codec = HB_ACODEC_LAME; - } - if ((job->mux == HB_MUX_OGM) && - ((audio.out.codec == HB_ACODEC_FAAC) || - (audio.out.codec == HB_ACODEC_AC3) || - (audio.out.codec == HB_ACODEC_DCA))) - { - // ogm/faac|ac3 combination is not supported. - audio.out.codec = HB_ACODEC_VORBIS; - } audio.out.dynamic_range_compression = ghb_settings_get_double(asettings, "AudioTrackDRCSlider"); if (audio.out.dynamic_range_compression < 1.0) audio.out.dynamic_range_compression = 0.0; // It would be better if this were done in libhb for us, but its not yet. - if (audio.out.codec == HB_ACODEC_AC3 || audio.out.codec == HB_ACODEC_DCA) + if (audio.out.codec & (HB_ACODEC_AC3 | HB_ACODEC_DCA)) { audio.out.mixdown = 0; } else { + int channels; + audio.out.mixdown = ghb_settings_combo_int(asettings, "AudioMixdown"); + if (audio.out.mixdown == HB_AMIXDOWN_MONO) + channels = 1; + else if (audio.out.mixdown == HB_AMIXDOWN_6CH) + channels = 6; + else + channels = 2; + // Make sure the mixdown is valid and pick a new one if not. audio.out.mixdown = ghb_get_best_mix(titleindex, audio.in.track, audio.out.codec, audio.out.mixdown); @@ -4253,6 +4332,9 @@ add_job(hb_handle_t *h, GValue *js, gint unique_id, gint titleindex) audio.out.samplerate = taudio->in.samplerate; else audio.out.samplerate = srate; + + audio.out.bitrate = ghb_get_best_audio_bitrate( + audio.out.codec, audio.out.bitrate, channels); } // Add it to the jobs audio list @@ -4273,7 +4355,6 @@ add_job(hb_handle_t *h, GValue *js, gint unique_id, gint titleindex) dest_str = ghb_settings_get_string(js, "destination"); job->file = dest_str; - job->crf = ghb_settings_get_boolean(js, "constant_rate_factor"); const GValue *subtitle_list; gint subtitle;