summaryrefslogtreecommitdiffstats
path: root/gtk/src/hb-backend.c
diff options
context:
space:
mode:
Diffstat (limited to 'gtk/src/hb-backend.c')
-rw-r--r--gtk/src/hb-backend.c8756
1 files changed, 4378 insertions, 4378 deletions
diff --git a/gtk/src/hb-backend.c b/gtk/src/hb-backend.c
index 65fa4ae25..560435c49 100644
--- a/gtk/src/hb-backend.c
+++ b/gtk/src/hb-backend.c
@@ -39,16 +39,16 @@
typedef struct
{
- gchar *option;
- const gchar *shortOpt;
- gdouble ivalue;
- const gchar *svalue;
+ gchar *option;
+ const gchar *shortOpt;
+ gdouble ivalue;
+ const gchar *svalue;
} options_map_t;
typedef struct
{
- gint count;
- options_map_t *map;
+ gint count;
+ options_map_t *map;
} combo_opts_t;
static gchar **index_str = NULL;
@@ -57,391 +57,391 @@ static gint index_str_size = 0;
static void
index_str_init(gint max_index)
{
- gint ii;
+ gint ii;
- if (max_index+1 > index_str_size)
- {
- index_str = realloc(index_str, (max_index+1) * sizeof(char*));
- for (ii = index_str_size; ii <= max_index; ii++)
- {
- index_str[ii] = g_strdup_printf("%d", ii);
- }
- index_str_size = max_index + 1;
- }
+ if (max_index+1 > index_str_size)
+ {
+ index_str = realloc(index_str, (max_index+1) * sizeof(char*));
+ for (ii = index_str_size; ii <= max_index; ii++)
+ {
+ index_str[ii] = g_strdup_printf("%d", ii);
+ }
+ index_str_size = max_index + 1;
+ }
}
static options_map_t d_point_to_point_opts[] =
{
- {"Chapters:", "chapter", 0, "0"},
- {"Seconds:", "time", 1, "1"},
- {"Frames:", "frame", 2, "2"},
+ {"Chapters:", "chapter", 0, "0"},
+ {"Seconds:", "time", 1, "1"},
+ {"Frames:", "frame", 2, "2"},
};
combo_opts_t point_to_point_opts =
{
- sizeof(d_point_to_point_opts)/sizeof(options_map_t),
- d_point_to_point_opts
+ sizeof(d_point_to_point_opts)/sizeof(options_map_t),
+ d_point_to_point_opts
};
static options_map_t d_when_complete_opts[] =
{
- {"Do Nothing", "nothing", 0, "0"},
- {"Show Notification", "notify", 1, "1"},
- {"Quit Handbrake", "quit", 4, "4"},
- {"Put Computer To Sleep", "sleep", 2, "2"},
- {"Shutdown Computer", "shutdown", 3, "3"},
+ {"Do Nothing", "nothing", 0, "0"},
+ {"Show Notification", "notify", 1, "1"},
+ {"Quit Handbrake", "quit", 4, "4"},
+ {"Put Computer To Sleep", "sleep", 2, "2"},
+ {"Shutdown Computer", "shutdown", 3, "3"},
};
combo_opts_t when_complete_opts =
{
- sizeof(d_when_complete_opts)/sizeof(options_map_t),
- d_when_complete_opts
+ sizeof(d_when_complete_opts)/sizeof(options_map_t),
+ d_when_complete_opts
};
static options_map_t d_par_opts[] =
{
- {"Off", "0", 0, "0"},
- {"Strict", "1", 1, "1"},
- {"Loose", "2", 2, "2"},
- {"Custom", "3", 3, "3"},
+ {"Off", "0", 0, "0"},
+ {"Strict", "1", 1, "1"},
+ {"Loose", "2", 2, "2"},
+ {"Custom", "3", 3, "3"},
};
combo_opts_t par_opts =
{
- sizeof(d_par_opts)/sizeof(options_map_t),
- d_par_opts
+ sizeof(d_par_opts)/sizeof(options_map_t),
+ d_par_opts
};
static options_map_t d_alignment_opts[] =
{
- {"2", "2", 2, "2"},
- {"4", "4", 4, "4"},
- {"8", "8", 8, "8"},
- {"16", "16", 16, "16"},
+ {"2", "2", 2, "2"},
+ {"4", "4", 4, "4"},
+ {"8", "8", 8, "8"},
+ {"16", "16", 16, "16"},
};
combo_opts_t alignment_opts =
{
- sizeof(d_alignment_opts)/sizeof(options_map_t),
- d_alignment_opts
+ sizeof(d_alignment_opts)/sizeof(options_map_t),
+ d_alignment_opts
};
static options_map_t d_logging_opts[] =
{
- {"0", "0", 0, "0"},
- {"1", "1", 1, "1"},
- {"2", "2", 2, "2"},
+ {"0", "0", 0, "0"},
+ {"1", "1", 1, "1"},
+ {"2", "2", 2, "2"},
};
combo_opts_t logging_opts =
{
- sizeof(d_logging_opts)/sizeof(options_map_t),
- d_logging_opts
+ sizeof(d_logging_opts)/sizeof(options_map_t),
+ d_logging_opts
};
static options_map_t d_log_longevity_opts[] =
{
- {"Week", "week", 7, "7"},
- {"Month", "month", 30, "30"},
- {"Year", "year", 365, "365"},
- {"Immortal", "immortal", 366, "366"},
+ {"Week", "week", 7, "7"},
+ {"Month", "month", 30, "30"},
+ {"Year", "year", 365, "365"},
+ {"Immortal", "immortal", 366, "366"},
};
combo_opts_t log_longevity_opts =
{
- sizeof(d_log_longevity_opts)/sizeof(options_map_t),
- d_log_longevity_opts
+ sizeof(d_log_longevity_opts)/sizeof(options_map_t),
+ d_log_longevity_opts
};
static options_map_t d_appcast_update_opts[] =
{
- {"Never", "never", 0, "never"},
- {"Daily", "daily", 1, "daily"},
- {"Weekly", "weekly", 2, "weekly"},
- {"Monthly", "monthly", 3, "monthly"},
+ {"Never", "never", 0, "never"},
+ {"Daily", "daily", 1, "daily"},
+ {"Weekly", "weekly", 2, "weekly"},
+ {"Monthly", "monthly", 3, "monthly"},
};
combo_opts_t appcast_update_opts =
{
- sizeof(d_appcast_update_opts)/sizeof(options_map_t),
- d_appcast_update_opts
+ sizeof(d_appcast_update_opts)/sizeof(options_map_t),
+ d_appcast_update_opts
};
static options_map_t d_vqual_granularity_opts[] =
{
- {"0.2", "0.2", 0.2, "0.2"},
- {"0.25", "0.25", 0.25, "0.25"},
- {"0.5", "0.5", 0.5, "0.5"},
- {"1", "1", 1, "1"},
+ {"0.2", "0.2", 0.2, "0.2"},
+ {"0.25", "0.25", 0.25, "0.25"},
+ {"0.5", "0.5", 0.5, "0.5"},
+ {"1", "1", 1, "1"},
};
combo_opts_t vqual_granularity_opts =
{
- sizeof(d_vqual_granularity_opts)/sizeof(options_map_t),
- d_vqual_granularity_opts
+ sizeof(d_vqual_granularity_opts)/sizeof(options_map_t),
+ d_vqual_granularity_opts
};
static options_map_t d_container_opts[] =
{
- {"MKV", "mkv", HB_MUX_MKV, "mkv"},
- {"MP4", "mp4", HB_MUX_MP4, "mp4"},
+ {"MKV", "mkv", HB_MUX_MKV, "mkv"},
+ {"MP4", "mp4", HB_MUX_MP4, "mp4"},
};
combo_opts_t container_opts =
{
- sizeof(d_container_opts)/sizeof(options_map_t),
- d_container_opts
+ sizeof(d_container_opts)/sizeof(options_map_t),
+ d_container_opts
};
static options_map_t d_detel_opts[] =
{
- {"Off", "off", 0, ""},
- {"Custom", "custom", 1, ""},
- {"Default","default",2, NULL},
+ {"Off", "off", 0, ""},
+ {"Custom", "custom", 1, ""},
+ {"Default","default",2, NULL},
};
combo_opts_t detel_opts =
{
- sizeof(d_detel_opts)/sizeof(options_map_t),
- d_detel_opts
+ sizeof(d_detel_opts)/sizeof(options_map_t),
+ d_detel_opts
};
static options_map_t d_decomb_opts[] =
{
- {"Off", "off", 0, ""},
- {"Custom", "custom", 1, ""},
- {"Default","default",2, NULL},
- {"Fast", "fast", 3, "7:2:6:9:1:80"},
- {"Bob", "bob", 4, "455"},
+ {"Off", "off", 0, ""},
+ {"Custom", "custom", 1, ""},
+ {"Default","default",2, NULL},
+ {"Fast", "fast", 3, "7:2:6:9:1:80"},
+ {"Bob", "bob", 4, "455"},
};
combo_opts_t decomb_opts =
{
- sizeof(d_decomb_opts)/sizeof(options_map_t),
- d_decomb_opts
+ sizeof(d_decomb_opts)/sizeof(options_map_t),
+ d_decomb_opts
};
static options_map_t d_deint_opts[] =
{
- {"Off", "off", 0, ""},
- {"Custom", "custom", 1, ""},
- {"Fast", "fast", 2, "0:-1:-1:0:1"},
- {"Slow", "slow", 3, "1:-1:-1:0:1"},
- {"Slower", "slower", 4, "3:-1:-1:0:1"},
- {"Bob", "bob", 5, "15:-1:-1:0:1"},
+ {"Off", "off", 0, ""},
+ {"Custom", "custom", 1, ""},
+ {"Fast", "fast", 2, "0:-1:-1:0:1"},
+ {"Slow", "slow", 3, "1:-1:-1:0:1"},
+ {"Slower", "slower", 4, "3:-1:-1:0:1"},
+ {"Bob", "bob", 5, "15:-1:-1:0:1"},
};
combo_opts_t deint_opts =
{
- sizeof(d_deint_opts)/sizeof(options_map_t),
- d_deint_opts
+ sizeof(d_deint_opts)/sizeof(options_map_t),
+ d_deint_opts
};
static options_map_t d_denoise_opts[] =
{
- {"Off", "off", 0, ""},
- {"Custom", "custom", 1, ""},
- {"Weak", "weak", 2, "2:1:2:3"},
- {"Medium", "medium", 3, "3:2:2:3"},
- {"Strong", "strong", 4, "7:7:5:5"},
+ {"Off", "off", 0, ""},
+ {"Custom", "custom", 1, ""},
+ {"Weak", "weak", 2, "2:1:2:3"},
+ {"Medium", "medium", 3, "3:2:2:3"},
+ {"Strong", "strong", 4, "7:7:5:5"},
};
combo_opts_t denoise_opts =
{
- sizeof(d_denoise_opts)/sizeof(options_map_t),
- d_denoise_opts
+ sizeof(d_denoise_opts)/sizeof(options_map_t),
+ d_denoise_opts
};
static options_map_t d_direct_opts[] =
{
- {"None", "none", 0, "none"},
- {"Spatial", "spatial", 1, "spatial"},
- {"Temporal", "temporal", 2, "temporal"},
- {"Automatic", "auto", 3, "auto"},
+ {"None", "none", 0, "none"},
+ {"Spatial", "spatial", 1, "spatial"},
+ {"Temporal", "temporal", 2, "temporal"},
+ {"Automatic", "auto", 3, "auto"},
};
combo_opts_t direct_opts =
{
- sizeof(d_direct_opts)/sizeof(options_map_t),
- d_direct_opts
+ sizeof(d_direct_opts)/sizeof(options_map_t),
+ d_direct_opts
};
static options_map_t d_badapt_opts[] =
{
- {"Off", "0", 0, "0"},
- {"Fast", "1", 1, "1"},
- {"Optimal", "2", 2, "2"},
+ {"Off", "0", 0, "0"},
+ {"Fast", "1", 1, "1"},
+ {"Optimal", "2", 2, "2"},
};
combo_opts_t badapt_opts =
{
- sizeof(d_badapt_opts)/sizeof(options_map_t),
- d_badapt_opts
+ sizeof(d_badapt_opts)/sizeof(options_map_t),
+ d_badapt_opts
};
static options_map_t d_bpyramid_opts[] =
{
- {"Off", "none", 0, "none"},
- {"Strict", "strict", 1, "strict"},
- {"Normal", "normal", 2, "normal"},
+ {"Off", "none", 0, "none"},
+ {"Strict", "strict", 1, "strict"},
+ {"Normal", "normal", 2, "normal"},
};
combo_opts_t bpyramid_opts =
{
- sizeof(d_bpyramid_opts)/sizeof(options_map_t),
- d_bpyramid_opts
+ sizeof(d_bpyramid_opts)/sizeof(options_map_t),
+ d_bpyramid_opts
};
static options_map_t d_weightp_opts[] =
{
- {"Off", "0", 0, "0"},
- {"Simple", "1", 1, "1"},
- {"Smart", "2", 2, "2"},
+ {"Off", "0", 0, "0"},
+ {"Simple", "1", 1, "1"},
+ {"Smart", "2", 2, "2"},
};
combo_opts_t weightp_opts =
{
- sizeof(d_weightp_opts)/sizeof(options_map_t),
- d_weightp_opts
+ sizeof(d_weightp_opts)/sizeof(options_map_t),
+ d_weightp_opts
};
static options_map_t d_me_opts[] =
{
- {"Diamond", "dia", 0, "dia"},
- {"Hexagon", "hex", 1, "hex"},
- {"Uneven Multi-Hexagon", "umh", 2, "umh"},
- {"Exhaustive", "esa", 3, "esa"},
- {"Hadamard Exhaustive", "tesa", 4, "tesa"},
+ {"Diamond", "dia", 0, "dia"},
+ {"Hexagon", "hex", 1, "hex"},
+ {"Uneven Multi-Hexagon", "umh", 2, "umh"},
+ {"Exhaustive", "esa", 3, "esa"},
+ {"Hadamard Exhaustive", "tesa", 4, "tesa"},
};
combo_opts_t me_opts =
{
- sizeof(d_me_opts)/sizeof(options_map_t),
- d_me_opts
+ sizeof(d_me_opts)/sizeof(options_map_t),
+ d_me_opts
};
static options_map_t d_subme_opts[] =
{
- {"0: SAD, no subpel", "0", 0, "0"},
- {"1: SAD, qpel", "1", 1, "1"},
- {"2: SATD, qpel", "2", 2, "2"},
- {"3: SATD: multi-qpel", "3", 3, "3"},
- {"4: SATD, qpel on all", "4", 4, "4"},
- {"5: SATD, multi-qpel on all", "5", 5, "5"},
- {"6: RD in I/P-frames", "6", 6, "6"},
- {"7: RD in all frames", "7", 7, "7"},
- {"8: RD refine in I/P-frames", "8", 8, "8"},
- {"9: RD refine in all frames", "9", 9, "9"},
- {"10: QPRD in all frames", "10", 10, "10"},
- {"11: No early terminations in analysis", "11", 11, "11"},
+ {"0: SAD, no subpel", "0", 0, "0"},
+ {"1: SAD, qpel", "1", 1, "1"},
+ {"2: SATD, qpel", "2", 2, "2"},
+ {"3: SATD: multi-qpel", "3", 3, "3"},
+ {"4: SATD, qpel on all", "4", 4, "4"},
+ {"5: SATD, multi-qpel on all", "5", 5, "5"},
+ {"6: RD in I/P-frames", "6", 6, "6"},
+ {"7: RD in all frames", "7", 7, "7"},
+ {"8: RD refine in I/P-frames", "8", 8, "8"},
+ {"9: RD refine in all frames", "9", 9, "9"},
+ {"10: QPRD in all frames", "10", 10, "10"},
+ {"11: No early terminations in analysis", "11", 11, "11"},
};
combo_opts_t subme_opts =
{
- sizeof(d_subme_opts)/sizeof(options_map_t),
- d_subme_opts
+ sizeof(d_subme_opts)/sizeof(options_map_t),
+ d_subme_opts
};
static options_map_t d_analyse_opts[] =
{
- {"Most", "p8x8,b8x8,i8x8,i4x4", 0, "p8x8,b8x8,i8x8,i4x4"},
- {"None", "none", 1, "none"},
- {"Some", "i4x4,i8x8", 2, "i4x4,i8x8"},
- {"All", "all", 3, "all"},
- {"Custom", "custom", 4, "all"},
+ {"Most", "p8x8,b8x8,i8x8,i4x4", 0, "p8x8,b8x8,i8x8,i4x4"},
+ {"None", "none", 1, "none"},
+ {"Some", "i4x4,i8x8", 2, "i4x4,i8x8"},
+ {"All", "all", 3, "all"},
+ {"Custom", "custom", 4, "all"},
};
combo_opts_t analyse_opts =
{
- sizeof(d_analyse_opts)/sizeof(options_map_t),
- d_analyse_opts
+ sizeof(d_analyse_opts)/sizeof(options_map_t),
+ d_analyse_opts
};
static options_map_t d_trellis_opts[] =
{
- {"Off", "0", 0, "0"},
- {"Encode only", "1", 1, "1"},
- {"Always", "2", 2, "2"},
+ {"Off", "0", 0, "0"},
+ {"Encode only", "1", 1, "1"},
+ {"Always", "2", 2, "2"},
};
combo_opts_t trellis_opts =
{
- sizeof(d_trellis_opts)/sizeof(options_map_t),
- d_trellis_opts
+ sizeof(d_trellis_opts)/sizeof(options_map_t),
+ d_trellis_opts
};
combo_opts_t subtitle_opts =
{
- 0,
- NULL
+ 0,
+ NULL
};
combo_opts_t title_opts =
{
- 0,
- NULL
+ 0,
+ NULL
};
combo_opts_t audio_track_opts =
{
- 0,
- NULL
+ 0,
+ NULL
};
typedef struct
{
- const gchar *name;
- combo_opts_t *opts;
+ const gchar *name;
+ combo_opts_t *opts;
} combo_name_map_t;
combo_name_map_t combo_name_map[] =
{
- {"PtoPType", &point_to_point_opts},
- {"WhenComplete", &when_complete_opts},
- {"PicturePAR", &par_opts},
- {"PictureModulus", &alignment_opts},
- {"LoggingLevel", &logging_opts},
- {"LogLongevity", &log_longevity_opts},
- {"check_updates", &appcast_update_opts},
- {"VideoQualityGranularity", &vqual_granularity_opts},
- {"FileFormat", &container_opts},
- {"PictureDeinterlace", &deint_opts},
- {"PictureDecomb", &decomb_opts},
- {"PictureDetelecine", &detel_opts},
- {"PictureDenoise", &denoise_opts},
- {"x264_direct", &direct_opts},
- {"x264_b_adapt", &badapt_opts},
- {"x264_bpyramid", &bpyramid_opts},
- {"x264_weighted_pframes", &weightp_opts},
- {"x264_me", &me_opts},
- {"x264_subme", &subme_opts},
- {"x264_analyse", &analyse_opts},
- {"x264_trellis", &trellis_opts},
- {"SubtitleTrack", &subtitle_opts},
- {"title", &title_opts},
- {"AudioTrack", &audio_track_opts},
- {NULL, NULL}
+ {"PtoPType", &point_to_point_opts},
+ {"WhenComplete", &when_complete_opts},
+ {"PicturePAR", &par_opts},
+ {"PictureModulus", &alignment_opts},
+ {"LoggingLevel", &logging_opts},
+ {"LogLongevity", &log_longevity_opts},
+ {"check_updates", &appcast_update_opts},
+ {"VideoQualityGranularity", &vqual_granularity_opts},
+ {"FileFormat", &container_opts},
+ {"PictureDeinterlace", &deint_opts},
+ {"PictureDecomb", &decomb_opts},
+ {"PictureDetelecine", &detel_opts},
+ {"PictureDenoise", &denoise_opts},
+ {"x264_direct", &direct_opts},
+ {"x264_b_adapt", &badapt_opts},
+ {"x264_bpyramid", &bpyramid_opts},
+ {"x264_weighted_pframes", &weightp_opts},
+ {"x264_me", &me_opts},
+ {"x264_subme", &subme_opts},
+ {"x264_analyse", &analyse_opts},
+ {"x264_trellis", &trellis_opts},
+ {"SubtitleTrack", &subtitle_opts},
+ {"title", &title_opts},
+ {"AudioTrack", &audio_track_opts},
+ {NULL, NULL}
};
const gchar *srt_codeset_table[] =
{
- "ANSI_X3.4-1968",
- "ANSI_X3.4-1986",
- "ANSI_X3.4",
- "ANSI_X3.110-1983",
- "ANSI_X3.110",
- "ASCII",
- "ECMA-114",
- "ECMA-118",
- "ECMA-128",
- "ECMA-CYRILLIC",
- "IEC_P27-1",
- "ISO-8859-1",
- "ISO-8859-2",
- "ISO-8859-3",
- "ISO-8859-4",
- "ISO-8859-5",
- "ISO-8859-6",
- "ISO-8859-7",
- "ISO-8859-8",
- "ISO-8859-9",
- "ISO-8859-9E",
- "ISO-8859-10",
- "ISO-8859-11",
- "ISO-8859-13",
- "ISO-8859-14",
- "ISO-8859-15",
- "ISO-8859-16",
- "UTF-7",
- "UTF-8",
- "UTF-16",
- "UTF-16LE",
- "UTF-16BE",
- "UTF-32",
- "UTF-32LE",
- "UTF-32BE",
- NULL
+ "ANSI_X3.4-1968",
+ "ANSI_X3.4-1986",
+ "ANSI_X3.4",
+ "ANSI_X3.110-1983",
+ "ANSI_X3.110",
+ "ASCII",
+ "ECMA-114",
+ "ECMA-118",
+ "ECMA-128",
+ "ECMA-CYRILLIC",
+ "IEC_P27-1",
+ "ISO-8859-1",
+ "ISO-8859-2",
+ "ISO-8859-3",
+ "ISO-8859-4",
+ "ISO-8859-5",
+ "ISO-8859-6",
+ "ISO-8859-7",
+ "ISO-8859-8",
+ "ISO-8859-9",
+ "ISO-8859-9E",
+ "ISO-8859-10",
+ "ISO-8859-11",
+ "ISO-8859-13",
+ "ISO-8859-14",
+ "ISO-8859-15",
+ "ISO-8859-16",
+ "UTF-7",
+ "UTF-8",
+ "UTF-16",
+ "UTF-16LE",
+ "UTF-16BE",
+ "UTF-32",
+ "UTF-32LE",
+ "UTF-32BE",
+ NULL
};
-#define SRT_TABLE_SIZE (sizeof(srt_codeset_table)/ sizeof(char*)-1)
+#define SRT_TABLE_SIZE (sizeof(srt_codeset_table)/ sizeof(char*)-1)
#if 0
typedef struct iso639_lang_t
@@ -456,619 +456,619 @@ typedef struct iso639_lang_t
const iso639_lang_t ghb_language_table[] =
{
- { "Any", "", "zz", "und" },
- { "Afar", "", "aa", "aar" },
- { "Abkhazian", "", "ab", "abk" },
- { "Afrikaans", "", "af", "afr" },
- { "Akan", "", "ak", "aka" },
- { "Albanian", "", "sq", "sqi", "alb" },
- { "Amharic", "", "am", "amh" },
- { "Arabic", "", "ar", "ara" },
- { "Aragonese", "", "an", "arg" },
- { "Armenian", "", "hy", "hye", "arm" },
- { "Assamese", "", "as", "asm" },
- { "Avaric", "", "av", "ava" },
- { "Avestan", "", "ae", "ave" },
- { "Aymara", "", "ay", "aym" },
- { "Azerbaijani", "", "az", "aze" },
- { "Bashkir", "", "ba", "bak" },
- { "Bambara", "", "bm", "bam" },
- { "Basque", "", "eu", "eus", "baq" },
- { "Belarusian", "", "be", "bel" },
- { "Bengali", "", "bn", "ben" },
- { "Bihari", "", "bh", "bih" },
- { "Bislama", "", "bi", "bis" },
- { "Bosnian", "", "bs", "bos" },
- { "Breton", "", "br", "bre" },
- { "Bulgarian", "", "bg", "bul" },
- { "Burmese", "", "my", "mya", "bur" },
- { "Catalan", "", "ca", "cat" },
- { "Chamorro", "", "ch", "cha" },
- { "Chechen", "", "ce", "che" },
- { "Chinese", "", "zh", "zho", "chi" },
- { "Church Slavic", "", "cu", "chu" },
- { "Chuvash", "", "cv", "chv" },
- { "Cornish", "", "kw", "cor" },
- { "Corsican", "", "co", "cos" },
- { "Cree", "", "cr", "cre" },
- { "Czech", "", "cs", "ces", "cze" },
- { "Danish", "Dansk", "da", "dan" },
- { "German", "Deutsch", "de", "deu", "ger" },
- { "Divehi", "", "dv", "div" },
- { "Dzongkha", "", "dz", "dzo" },
- { "English", "English", "en", "eng" },
- { "Spanish", "Espanol", "es", "spa" },
- { "Esperanto", "", "eo", "epo" },
- { "Estonian", "", "et", "est" },
- { "Ewe", "", "ee", "ewe" },
- { "Faroese", "", "fo", "fao" },
- { "Fijian", "", "fj", "fij" },
- { "French", "Francais", "fr", "fra", "fre" },
- { "Western Frisian", "", "fy", "fry" },
- { "Fulah", "", "ff", "ful" },
- { "Georgian", "", "ka", "kat", "geo" },
- { "Gaelic (Scots)", "", "gd", "gla" },
- { "Irish", "", "ga", "gle" },
- { "Galician", "", "gl", "glg" },
- { "Manx", "", "gv", "glv" },
- { "Greek, Modern", "", "el", "ell", "gre" },
- { "Guarani", "", "gn", "grn" },
- { "Gujarati", "", "gu", "guj" },
- { "Haitian", "", "ht", "hat" },
- { "Hausa", "", "ha", "hau" },
- { "Hebrew", "", "he", "heb" },
- { "Herero", "", "hz", "her" },
- { "Hindi", "", "hi", "hin" },
- { "Hiri Motu", "", "ho", "hmo" },
- { "Croatian", "Hrvatski", "hr", "hrv", "scr" },
- { "Igbo", "", "ig", "ibo" },
- { "Ido", "", "io", "ido" },
- { "Icelandic", "Islenska", "is", "isl", "ice" },
- { "Sichuan Yi", "", "ii", "iii" },
- { "Inuktitut", "", "iu", "iku" },
- { "Interlingue", "", "ie", "ile" },
- { "Interlingua", "", "ia", "ina" },
- { "Indonesian", "", "id", "ind" },
- { "Inupiaq", "", "ik", "ipk" },
- { "Italian", "Italiano", "it", "ita" },
- { "Javanese", "", "jv", "jav" },
- { "Japanese", "", "ja", "jpn" },
- { "Kalaallisut", "", "kl", "kal" },
- { "Kannada", "", "kn", "kan" },
- { "Kashmiri", "", "ks", "kas" },
- { "Kanuri", "", "kr", "kau" },
- { "Kazakh", "", "kk", "kaz" },
- { "Central Khmer", "", "km", "khm" },
- { "Kikuyu", "", "ki", "kik" },
- { "Kinyarwanda", "", "rw", "kin" },
- { "Kirghiz", "", "ky", "kir" },
- { "Komi", "", "kv", "kom" },
- { "Kongo", "", "kg", "kon" },
- { "Korean", "", "ko", "kor" },
- { "Kuanyama", "", "kj", "kua" },
- { "Kurdish", "", "ku", "kur" },
- { "Lao", "", "lo", "lao" },
- { "Latin", "", "la", "lat" },
- { "Latvian", "", "lv", "lav" },
- { "Limburgan", "", "li", "lim" },
- { "Lingala", "", "ln", "lin" },
- { "Lithuanian", "", "lt", "lit" },
- { "Luxembourgish", "", "lb", "ltz" },
- { "Luba-Katanga", "", "lu", "lub" },
- { "Ganda", "", "lg", "lug" },
- { "Macedonian", "", "mk", "mkd", "mac" },
- { "Hungarian", "Magyar", "hu", "hun" },
- { "Marshallese", "", "mh", "mah" },
- { "Malayalam", "", "ml", "mal" },
- { "Maori", "", "mi", "mri", "mao" },
- { "Marathi", "", "mr", "mar" },
- { "Malay", "", "ms", "msa", "msa" },
- { "Malagasy", "", "mg", "mlg" },
- { "Maltese", "", "mt", "mlt" },
- { "Moldavian", "", "mo", "mol" },
- { "Mongolian", "", "mn", "mon" },
- { "Nauru", "", "na", "nau" },
- { "Navajo", "", "nv", "nav" },
- { "Dutch", "Nederlands", "nl", "nld", "dut" },
- { "Ndebele, South", "", "nr", "nbl" },
- { "Ndebele, North", "", "nd", "nde" },
- { "Ndonga", "", "ng", "ndo" },
- { "Nepali", "", "ne", "nep" },
- { "Norwegian", "Norsk", "no", "nor" },
- { "Norwegian Nynorsk", "", "nn", "nno" },
- { "Norwegian Bokmål", "", "nb", "nob" },
- { "Chichewa; Nyanja", "", "ny", "nya" },
- { "Occitan", "", "oc", "oci" },
- { "Ojibwa", "", "oj", "oji" },
- { "Oriya", "", "or", "ori" },
- { "Oromo", "", "om", "orm" },
- { "Ossetian", "", "os", "oss" },
- { "Panjabi", "", "pa", "pan" },
- { "Persian", "", "fa", "fas", "per" },
- { "Pali", "", "pi", "pli" },
- { "Polish", "", "pl", "pol" },
- { "Portuguese", "Portugues", "pt", "por" },
- { "Pushto", "", "ps", "pus" },
- { "Quechua", "", "qu", "que" },
- { "Romansh", "", "rm", "roh" },
- { "Romanian", "", "ro", "ron", "rum" },
- { "Rundi", "", "rn", "run" },
- { "Russian", "", "ru", "rus" },
- { "Sango", "", "sg", "sag" },
- { "Sanskrit", "", "sa", "san" },
- { "Serbian", "", "sr", "srp", "scc" },
- { "Sinhala", "", "si", "sin" },
- { "Slovak", "", "sk", "slk", "slo" },
- { "Slovenian", "", "sl", "slv" },
- { "Northern Sami", "", "se", "sme" },
- { "Samoan", "", "sm", "smo" },
- { "Shona", "", "sn", "sna" },
- { "Sindhi", "", "sd", "snd" },
- { "Somali", "", "so", "som" },
- { "Sotho, Southern", "", "st", "sot" },
- { "Sardinian", "", "sc", "srd" },
- { "Swati", "", "ss", "ssw" },
- { "Sundanese", "", "su", "sun" },
- { "Finnish", "Suomi", "fi", "fin" },
- { "Swahili", "", "sw", "swa" },
- { "Swedish", "Svenska", "sv", "swe" },
- { "Tahitian", "", "ty", "tah" },
- { "Tamil", "", "ta", "tam" },
- { "Tatar", "", "tt", "tat" },
- { "Telugu", "", "te", "tel" },
- { "Tajik", "", "tg", "tgk" },
- { "Tagalog", "", "tl", "tgl" },
- { "Thai", "", "th", "tha" },
- { "Tibetan", "", "bo", "bod", "tib" },
- { "Tigrinya", "", "ti", "tir" },
- { "Tonga", "", "to", "ton" },
- { "Tswana", "", "tn", "tsn" },
- { "Tsonga", "", "ts", "tso" },
- { "Turkmen", "", "tk", "tuk" },
- { "Turkish", "", "tr", "tur" },
- { "Twi", "", "tw", "twi" },
- { "Uighur", "", "ug", "uig" },
- { "Ukrainian", "", "uk", "ukr" },
- { "Urdu", "", "ur", "urd" },
- { "Uzbek", "", "uz", "uzb" },
- { "Venda", "", "ve", "ven" },
- { "Vietnamese", "", "vi", "vie" },
- { "Volapük", "", "vo", "vol" },
- { "Welsh", "", "cy", "cym", "wel" },
- { "Walloon", "", "wa", "wln" },
- { "Wolof", "", "wo", "wol" },
- { "Xhosa", "", "xh", "xho" },
- { "Yiddish", "", "yi", "yid" },
- { "Yoruba", "", "yo", "yor" },
- { "Zhuang", "", "za", "zha" },
- { "Zulu", "", "zu", "zul" },
- {NULL, NULL, NULL, NULL}
+ { "Any", "", "zz", "und" },
+ { "Afar", "", "aa", "aar" },
+ { "Abkhazian", "", "ab", "abk" },
+ { "Afrikaans", "", "af", "afr" },
+ { "Akan", "", "ak", "aka" },
+ { "Albanian", "", "sq", "sqi", "alb" },
+ { "Amharic", "", "am", "amh" },
+ { "Arabic", "", "ar", "ara" },
+ { "Aragonese", "", "an", "arg" },
+ { "Armenian", "", "hy", "hye", "arm" },
+ { "Assamese", "", "as", "asm" },
+ { "Avaric", "", "av", "ava" },
+ { "Avestan", "", "ae", "ave" },
+ { "Aymara", "", "ay", "aym" },
+ { "Azerbaijani", "", "az", "aze" },
+ { "Bashkir", "", "ba", "bak" },
+ { "Bambara", "", "bm", "bam" },
+ { "Basque", "", "eu", "eus", "baq" },
+ { "Belarusian", "", "be", "bel" },
+ { "Bengali", "", "bn", "ben" },
+ { "Bihari", "", "bh", "bih" },
+ { "Bislama", "", "bi", "bis" },
+ { "Bosnian", "", "bs", "bos" },
+ { "Breton", "", "br", "bre" },
+ { "Bulgarian", "", "bg", "bul" },
+ { "Burmese", "", "my", "mya", "bur" },
+ { "Catalan", "", "ca", "cat" },
+ { "Chamorro", "", "ch", "cha" },
+ { "Chechen", "", "ce", "che" },
+ { "Chinese", "", "zh", "zho", "chi" },
+ { "Church Slavic", "", "cu", "chu" },
+ { "Chuvash", "", "cv", "chv" },
+ { "Cornish", "", "kw", "cor" },
+ { "Corsican", "", "co", "cos" },
+ { "Cree", "", "cr", "cre" },
+ { "Czech", "", "cs", "ces", "cze" },
+ { "Danish", "Dansk", "da", "dan" },
+ { "German", "Deutsch", "de", "deu", "ger" },
+ { "Divehi", "", "dv", "div" },
+ { "Dzongkha", "", "dz", "dzo" },
+ { "English", "English", "en", "eng" },
+ { "Spanish", "Espanol", "es", "spa" },
+ { "Esperanto", "", "eo", "epo" },
+ { "Estonian", "", "et", "est" },
+ { "Ewe", "", "ee", "ewe" },
+ { "Faroese", "", "fo", "fao" },
+ { "Fijian", "", "fj", "fij" },
+ { "French", "Francais", "fr", "fra", "fre" },
+ { "Western Frisian", "", "fy", "fry" },
+ { "Fulah", "", "ff", "ful" },
+ { "Georgian", "", "ka", "kat", "geo" },
+ { "Gaelic (Scots)", "", "gd", "gla" },
+ { "Irish", "", "ga", "gle" },
+ { "Galician", "", "gl", "glg" },
+ { "Manx", "", "gv", "glv" },
+ { "Greek, Modern", "", "el", "ell", "gre" },
+ { "Guarani", "", "gn", "grn" },
+ { "Gujarati", "", "gu", "guj" },
+ { "Haitian", "", "ht", "hat" },
+ { "Hausa", "", "ha", "hau" },
+ { "Hebrew", "", "he", "heb" },
+ { "Herero", "", "hz", "her" },
+ { "Hindi", "", "hi", "hin" },
+ { "Hiri Motu", "", "ho", "hmo" },
+ { "Croatian", "Hrvatski", "hr", "hrv", "scr" },
+ { "Igbo", "", "ig", "ibo" },
+ { "Ido", "", "io", "ido" },
+ { "Icelandic", "Islenska", "is", "isl", "ice" },
+ { "Sichuan Yi", "", "ii", "iii" },
+ { "Inuktitut", "", "iu", "iku" },
+ { "Interlingue", "", "ie", "ile" },
+ { "Interlingua", "", "ia", "ina" },
+ { "Indonesian", "", "id", "ind" },
+ { "Inupiaq", "", "ik", "ipk" },
+ { "Italian", "Italiano", "it", "ita" },
+ { "Javanese", "", "jv", "jav" },
+ { "Japanese", "", "ja", "jpn" },
+ { "Kalaallisut", "", "kl", "kal" },
+ { "Kannada", "", "kn", "kan" },
+ { "Kashmiri", "", "ks", "kas" },
+ { "Kanuri", "", "kr", "kau" },
+ { "Kazakh", "", "kk", "kaz" },
+ { "Central Khmer", "", "km", "khm" },
+ { "Kikuyu", "", "ki", "kik" },
+ { "Kinyarwanda", "", "rw", "kin" },
+ { "Kirghiz", "", "ky", "kir" },
+ { "Komi", "", "kv", "kom" },
+ { "Kongo", "", "kg", "kon" },
+ { "Korean", "", "ko", "kor" },
+ { "Kuanyama", "", "kj", "kua" },
+ { "Kurdish", "", "ku", "kur" },
+ { "Lao", "", "lo", "lao" },
+ { "Latin", "", "la", "lat" },
+ { "Latvian", "", "lv", "lav" },
+ { "Limburgan", "", "li", "lim" },
+ { "Lingala", "", "ln", "lin" },
+ { "Lithuanian", "", "lt", "lit" },
+ { "Luxembourgish", "", "lb", "ltz" },
+ { "Luba-Katanga", "", "lu", "lub" },
+ { "Ganda", "", "lg", "lug" },
+ { "Macedonian", "", "mk", "mkd", "mac" },
+ { "Hungarian", "Magyar", "hu", "hun" },
+ { "Marshallese", "", "mh", "mah" },
+ { "Malayalam", "", "ml", "mal" },
+ { "Maori", "", "mi", "mri", "mao" },
+ { "Marathi", "", "mr", "mar" },
+ { "Malay", "", "ms", "msa", "msa" },
+ { "Malagasy", "", "mg", "mlg" },
+ { "Maltese", "", "mt", "mlt" },
+ { "Moldavian", "", "mo", "mol" },
+ { "Mongolian", "", "mn", "mon" },
+ { "Nauru", "", "na", "nau" },
+ { "Navajo", "", "nv", "nav" },
+ { "Dutch", "Nederlands", "nl", "nld", "dut" },
+ { "Ndebele, South", "", "nr", "nbl" },
+ { "Ndebele, North", "", "nd", "nde" },
+ { "Ndonga", "", "ng", "ndo" },
+ { "Nepali", "", "ne", "nep" },
+ { "Norwegian", "Norsk", "no", "nor" },
+ { "Norwegian Nynorsk", "", "nn", "nno" },
+ { "Norwegian Bokmål", "", "nb", "nob" },
+ { "Chichewa; Nyanja", "", "ny", "nya" },
+ { "Occitan", "", "oc", "oci" },
+ { "Ojibwa", "", "oj", "oji" },
+ { "Oriya", "", "or", "ori" },
+ { "Oromo", "", "om", "orm" },
+ { "Ossetian", "", "os", "oss" },
+ { "Panjabi", "", "pa", "pan" },
+ { "Persian", "", "fa", "fas", "per" },
+ { "Pali", "", "pi", "pli" },
+ { "Polish", "", "pl", "pol" },
+ { "Portuguese", "Portugues", "pt", "por" },
+ { "Pushto", "", "ps", "pus" },
+ { "Quechua", "", "qu", "que" },
+ { "Romansh", "", "rm", "roh" },
+ { "Romanian", "", "ro", "ron", "rum" },
+ { "Rundi", "", "rn", "run" },
+ { "Russian", "", "ru", "rus" },
+ { "Sango", "", "sg", "sag" },
+ { "Sanskrit", "", "sa", "san" },
+ { "Serbian", "", "sr", "srp", "scc" },
+ { "Sinhala", "", "si", "sin" },
+ { "Slovak", "", "sk", "slk", "slo" },
+ { "Slovenian", "", "sl", "slv" },
+ { "Northern Sami", "", "se", "sme" },
+ { "Samoan", "", "sm", "smo" },
+ { "Shona", "", "sn", "sna" },
+ { "Sindhi", "", "sd", "snd" },
+ { "Somali", "", "so", "som" },
+ { "Sotho, Southern", "", "st", "sot" },
+ { "Sardinian", "", "sc", "srd" },
+ { "Swati", "", "ss", "ssw" },
+ { "Sundanese", "", "su", "sun" },
+ { "Finnish", "Suomi", "fi", "fin" },
+ { "Swahili", "", "sw", "swa" },
+ { "Swedish", "Svenska", "sv", "swe" },
+ { "Tahitian", "", "ty", "tah" },
+ { "Tamil", "", "ta", "tam" },
+ { "Tatar", "", "tt", "tat" },
+ { "Telugu", "", "te", "tel" },
+ { "Tajik", "", "tg", "tgk" },
+ { "Tagalog", "", "tl", "tgl" },
+ { "Thai", "", "th", "tha" },
+ { "Tibetan", "", "bo", "bod", "tib" },
+ { "Tigrinya", "", "ti", "tir" },
+ { "Tonga", "", "to", "ton" },
+ { "Tswana", "", "tn", "tsn" },
+ { "Tsonga", "", "ts", "tso" },
+ { "Turkmen", "", "tk", "tuk" },
+ { "Turkish", "", "tr", "tur" },
+ { "Twi", "", "tw", "twi" },
+ { "Uighur", "", "ug", "uig" },
+ { "Ukrainian", "", "uk", "ukr" },
+ { "Urdu", "", "ur", "urd" },
+ { "Uzbek", "", "uz", "uzb" },
+ { "Venda", "", "ve", "ven" },
+ { "Vietnamese", "", "vi", "vie" },
+ { "Volapük", "", "vo", "vol" },
+ { "Welsh", "", "cy", "cym", "wel" },
+ { "Walloon", "", "wa", "wln" },
+ { "Wolof", "", "wo", "wol" },
+ { "Xhosa", "", "xh", "xho" },
+ { "Yiddish", "", "yi", "yid" },
+ { "Yoruba", "", "yo", "yor" },
+ { "Zhuang", "", "za", "zha" },
+ { "Zulu", "", "zu", "zul" },
+ {NULL, NULL, NULL, NULL}
};
-#define LANG_TABLE_SIZE (sizeof(ghb_language_table)/ sizeof(iso639_lang_t)-1)
+#define LANG_TABLE_SIZE (sizeof(ghb_language_table)/ sizeof(iso639_lang_t)-1)
static void audio_bitrate_opts_set(GtkBuilder *builder, const gchar *name);
static void
del_tree(const gchar *name, gboolean del_top)
{
- const gchar *file;
-
- if (g_file_test(name, G_FILE_TEST_IS_DIR))
- {
- GDir *gdir = g_dir_open(name, 0, NULL);
- file = g_dir_read_name(gdir);
- while (file)
- {
- gchar *path;
- path = g_strdup_printf("%s/%s", name, file);
- del_tree(path, TRUE);
- g_free(path);
- file = g_dir_read_name(gdir);
- }
- if (del_top)
- g_rmdir(name);
- g_dir_close(gdir);
- }
- else
- {
- g_unlink(name);
- }
+ const gchar *file;
+
+ if (g_file_test(name, G_FILE_TEST_IS_DIR))
+ {
+ GDir *gdir = g_dir_open(name, 0, NULL);
+ file = g_dir_read_name(gdir);
+ while (file)
+ {
+ gchar *path;
+ path = g_strdup_printf("%s/%s", name, file);
+ del_tree(path, TRUE);
+ g_free(path);
+ file = g_dir_read_name(gdir);
+ }
+ if (del_top)
+ g_rmdir(name);
+ g_dir_close(gdir);
+ }
+ else
+ {
+ g_unlink(name);
+ }
}
const gchar*
ghb_version()
{
- return hb_get_version(NULL);
+ return hb_get_version(NULL);
}
void
ghb_vquality_range(
- signal_user_data_t *ud,
- gdouble *min,
- gdouble *max,
- gdouble *step,
- gdouble *page,
- gint *digits,
- gboolean *inverted)
-{
- gint vcodec = ghb_settings_combo_int(ud->settings, "VideoEncoder");
- *page = 10;
- *digits = 0;
- switch (vcodec)
- {
- case HB_VCODEC_X264:
- {
- *min = 0;
- *max = 51;
- *step = ghb_settings_combo_double(ud->settings,
- "VideoQualityGranularity");
- if (*step == 0.2 || *step == 0.5)
- *digits = 1;
- else if (*step == 0.25)
- *digits = 2;
- *inverted = TRUE;
- } break;
-
- case HB_VCODEC_FFMPEG_MPEG2:
- case HB_VCODEC_FFMPEG_MPEG4:
- {
- *min = 1;
- *max = 31;
- *step = 1;
- *inverted = TRUE;
- } break;
-
- case HB_VCODEC_THEORA:
- {
- *min = 0;
- *max = 63;
- *step = 1;
- *inverted = FALSE;
- } break;
-
- default:
- {
- *min = 0;
- *max = 100;
- *step = 1;
- *inverted = FALSE;
- } break;
- }
+ signal_user_data_t *ud,
+ gdouble *min,
+ gdouble *max,
+ gdouble *step,
+ gdouble *page,
+ gint *digits,
+ gboolean *inverted)
+{
+ gint vcodec = ghb_settings_combo_int(ud->settings, "VideoEncoder");
+ *page = 10;
+ *digits = 0;
+ switch (vcodec)
+ {
+ case HB_VCODEC_X264:
+ {
+ *min = 0;
+ *max = 51;
+ *step = ghb_settings_combo_double(ud->settings,
+ "VideoQualityGranularity");
+ if (*step == 0.2 || *step == 0.5)
+ *digits = 1;
+ else if (*step == 0.25)
+ *digits = 2;
+ *inverted = TRUE;
+ } break;
+
+ case HB_VCODEC_FFMPEG_MPEG2:
+ case HB_VCODEC_FFMPEG_MPEG4:
+ {
+ *min = 1;
+ *max = 31;
+ *step = 1;
+ *inverted = TRUE;
+ } break;
+
+ case HB_VCODEC_THEORA:
+ {
+ *min = 0;
+ *max = 63;
+ *step = 1;
+ *inverted = FALSE;
+ } break;
+
+ default:
+ {
+ *min = 0;
+ *max = 100;
+ *step = 1;
+ *inverted = FALSE;
+ } break;
+ }
}
gint
find_combo_entry(combo_opts_t *opts, const GValue *gval)
{
- gint ii;
-
- if (G_VALUE_TYPE(gval) == G_TYPE_STRING)
- {
- gchar *str;
- str = ghb_value_string(gval);
- for (ii = 0; ii < opts->count; ii++)
- {
- if (strcmp(opts->map[ii].shortOpt, str) == 0)
- {
- break;
- }
- }
- g_free(str);
- return ii;
- }
- else if (G_VALUE_TYPE(gval) == G_TYPE_DOUBLE)
- {
- gdouble val;
- val = ghb_value_double(gval);
- for (ii = 0; ii < opts->count; ii++)
- {
- if (opts->map[ii].ivalue == val)
- {
- break;
- }
- }
- return ii;
- }
- else if (G_VALUE_TYPE(gval) == G_TYPE_INT ||
- G_VALUE_TYPE(gval) == G_TYPE_BOOLEAN ||
- G_VALUE_TYPE(gval) == G_TYPE_INT64)
- {
- gint64 val;
- val = ghb_value_int64(gval);
- for (ii = 0; ii < opts->count; ii++)
- {
- if ((gint64)opts->map[ii].ivalue == val)
- {
- break;
- }
- }
- return ii;
- }
- return opts->count;
+ gint ii;
+
+ if (G_VALUE_TYPE(gval) == G_TYPE_STRING)
+ {
+ gchar *str;
+ str = ghb_value_string(gval);
+ for (ii = 0; ii < opts->count; ii++)
+ {
+ if (strcmp(opts->map[ii].shortOpt, str) == 0)
+ {
+ break;
+ }
+ }
+ g_free(str);
+ return ii;
+ }
+ else if (G_VALUE_TYPE(gval) == G_TYPE_DOUBLE)
+ {
+ gdouble val;
+ val = ghb_value_double(gval);
+ for (ii = 0; ii < opts->count; ii++)
+ {
+ if (opts->map[ii].ivalue == val)
+ {
+ break;
+ }
+ }
+ return ii;
+ }
+ else if (G_VALUE_TYPE(gval) == G_TYPE_INT ||
+ G_VALUE_TYPE(gval) == G_TYPE_BOOLEAN ||
+ G_VALUE_TYPE(gval) == G_TYPE_INT64)
+ {
+ gint64 val;
+ val = ghb_value_int64(gval);
+ for (ii = 0; ii < opts->count; ii++)
+ {
+ if ((gint64)opts->map[ii].ivalue == val)
+ {
+ break;
+ }
+ }
+ return ii;
+ }
+ return opts->count;
}
static const gchar*
lookup_generic_string(combo_opts_t *opts, const GValue *gval)
{
- gint ii;
- const gchar *result = "";
+ gint ii;
+ const gchar *result = "";
- ii = find_combo_entry(opts, gval);
- if (ii < opts->count)
- {
- result = opts->map[ii].svalue;
- }
- return result;
+ ii = find_combo_entry(opts, gval);
+ if (ii < opts->count)
+ {
+ result = opts->map[ii].svalue;
+ }
+ return result;
}
static gint
lookup_generic_int(combo_opts_t *opts, const GValue *gval)
{
- gint ii;
- gint result = -1;
+ gint ii;
+ gint result = -1;
- ii = find_combo_entry(opts, gval);
- if (ii < opts->count)
- {
- result = opts->map[ii].ivalue;
- }
- return result;
+ ii = find_combo_entry(opts, gval);
+ if (ii < opts->count)
+ {
+ result = opts->map[ii].ivalue;
+ }
+ return result;
}
static gdouble
lookup_generic_double(combo_opts_t *opts, const GValue *gval)
{
- gint ii;
- gdouble result = -1;
+ gint ii;
+ gdouble result = -1;
- ii = find_combo_entry(opts, gval);
- if (ii < opts->count)
- {
- result = opts->map[ii].ivalue;
- }
- return result;
+ ii = find_combo_entry(opts, gval);
+ if (ii < opts->count)
+ {
+ result = opts->map[ii].ivalue;
+ }
+ return result;
}
static const gchar*
lookup_generic_option(combo_opts_t *opts, const GValue *gval)
{
- gint ii;
- const gchar *result = "";
+ gint ii;
+ const gchar *result = "";
- ii = find_combo_entry(opts, gval);
- if (ii < opts->count)
- {
- result = opts->map[ii].option;
- }
- return result;
+ ii = find_combo_entry(opts, gval);
+ if (ii < opts->count)
+ {
+ result = opts->map[ii].option;
+ }
+ return result;
}
static gint
lookup_mix_int(const GValue *mix)
{
- gint ii;
- gint result = 0;
-
-
- if (G_VALUE_TYPE(mix) == G_TYPE_STRING)
- {
- gchar * str = ghb_value_string(mix);
- for (ii = 0; ii < hb_audio_mixdowns_count; ii++)
- {
- if (strcmp(hb_audio_mixdowns[ii].short_name, str) == 0)
- {
- result = hb_audio_mixdowns[ii].amixdown;
- break;
- }
- }
- g_free(str);
- }
- else if (G_VALUE_TYPE(mix) == G_TYPE_INT ||
- G_VALUE_TYPE(mix) == G_TYPE_INT64 ||
- G_VALUE_TYPE(mix) == G_TYPE_DOUBLE)
- {
- gint val = ghb_value_int(mix);
- for (ii = 0; ii < hb_audio_mixdowns_count; ii++)
- {
- if (hb_audio_mixdowns[ii].amixdown == val)
- {
- result = hb_audio_mixdowns[ii].amixdown;
- break;
- }
- }
- }
- return result;
+ gint ii;
+ gint result = 0;
+
+
+ if (G_VALUE_TYPE(mix) == G_TYPE_STRING)
+ {
+ gchar * str = ghb_value_string(mix);
+ for (ii = 0; ii < hb_audio_mixdowns_count; ii++)
+ {
+ if (strcmp(hb_audio_mixdowns[ii].short_name, str) == 0)
+ {
+ result = hb_audio_mixdowns[ii].amixdown;
+ break;
+ }
+ }
+ g_free(str);
+ }
+ else if (G_VALUE_TYPE(mix) == G_TYPE_INT ||
+ G_VALUE_TYPE(mix) == G_TYPE_INT64 ||
+ G_VALUE_TYPE(mix) == G_TYPE_DOUBLE)
+ {
+ gint val = ghb_value_int(mix);
+ for (ii = 0; ii < hb_audio_mixdowns_count; ii++)
+ {
+ if (hb_audio_mixdowns[ii].amixdown == val)
+ {
+ result = hb_audio_mixdowns[ii].amixdown;
+ break;
+ }
+ }
+ }
+ return result;
}
static const gchar*
lookup_mix_option(const GValue *mix)
{
- gint ii;
- gchar *result = "None";
-
-
- if (G_VALUE_TYPE(mix) == G_TYPE_STRING)
- {
- gchar *str = ghb_value_string(mix);
- for (ii = 0; ii < hb_audio_mixdowns_count; ii++)
- {
- if (strcmp(hb_audio_mixdowns[ii].short_name, str) == 0)
- {
- result = hb_audio_mixdowns[ii].human_readable_name;
- break;
- }
- }
- g_free(str);
- }
- else if (G_VALUE_TYPE(mix) == G_TYPE_INT ||
- G_VALUE_TYPE(mix) == G_TYPE_INT64 ||
- G_VALUE_TYPE(mix) == G_TYPE_DOUBLE)
- {
- gint val = ghb_value_int(mix);
- for (ii = 0; ii < hb_audio_mixdowns_count; ii++)
- {
- if (hb_audio_mixdowns[ii].amixdown == val)
- {
- result = hb_audio_mixdowns[ii].human_readable_name;
- break;
- }
- }
- }
- return result;
+ gint ii;
+ gchar *result = "None";
+
+
+ if (G_VALUE_TYPE(mix) == G_TYPE_STRING)
+ {
+ gchar *str = ghb_value_string(mix);
+ for (ii = 0; ii < hb_audio_mixdowns_count; ii++)
+ {
+ if (strcmp(hb_audio_mixdowns[ii].short_name, str) == 0)
+ {
+ result = hb_audio_mixdowns[ii].human_readable_name;
+ break;
+ }
+ }
+ g_free(str);
+ }
+ else if (G_VALUE_TYPE(mix) == G_TYPE_INT ||
+ G_VALUE_TYPE(mix) == G_TYPE_INT64 ||
+ G_VALUE_TYPE(mix) == G_TYPE_DOUBLE)
+ {
+ gint val = ghb_value_int(mix);
+ for (ii = 0; ii < hb_audio_mixdowns_count; ii++)
+ {
+ if (hb_audio_mixdowns[ii].amixdown == val)
+ {
+ result = hb_audio_mixdowns[ii].human_readable_name;
+ break;
+ }
+ }
+ }
+ return result;
}
static const gchar*
lookup_mix_string(const GValue *mix)
{
- gint ii;
- gchar *result = "none";
-
-
- if (G_VALUE_TYPE(mix) == G_TYPE_STRING)
- {
- gchar *str = ghb_value_string(mix);
- for (ii = 0; ii < hb_audio_mixdowns_count; ii++)
- {
- if (strcmp(hb_audio_mixdowns[ii].short_name, str) == 0)
- {
- result = hb_audio_mixdowns[ii].short_name;
- break;
- }
- }
- g_free(str);
- }
- else if (G_VALUE_TYPE(mix) == G_TYPE_INT ||
- G_VALUE_TYPE(mix) == G_TYPE_INT64 ||
- G_VALUE_TYPE(mix) == G_TYPE_DOUBLE)
- {
- gint val = ghb_value_int(mix);
- for (ii = 0; ii < hb_audio_mixdowns_count; ii++)
- {
- if (hb_audio_mixdowns[ii].amixdown == val)
- {
- result = hb_audio_mixdowns[ii].short_name;
- break;
- }
- }
- }
- return result;
+ gint ii;
+ gchar *result = "none";
+
+
+ if (G_VALUE_TYPE(mix) == G_TYPE_STRING)
+ {
+ gchar *str = ghb_value_string(mix);
+ for (ii = 0; ii < hb_audio_mixdowns_count; ii++)
+ {
+ if (strcmp(hb_audio_mixdowns[ii].short_name, str) == 0)
+ {
+ result = hb_audio_mixdowns[ii].short_name;
+ break;
+ }
+ }
+ g_free(str);
+ }
+ else if (G_VALUE_TYPE(mix) == G_TYPE_INT ||
+ G_VALUE_TYPE(mix) == G_TYPE_INT64 ||
+ G_VALUE_TYPE(mix) == G_TYPE_DOUBLE)
+ {
+ gint val = ghb_value_int(mix);
+ for (ii = 0; ii < hb_audio_mixdowns_count; ii++)
+ {
+ if (hb_audio_mixdowns[ii].amixdown == val)
+ {
+ result = hb_audio_mixdowns[ii].short_name;
+ break;
+ }
+ }
+ }
+ return result;
}
static gint
lookup_video_rate_int(const GValue *vrate)
{
- gint ii;
- gchar *str;
- gint result = 0;
+ gint ii;
+ gchar *str;
+ gint result = 0;
- str = ghb_value_string(vrate);
- for (ii = 0; ii < hb_video_rates_count; ii++)
- {
- if (strcmp(hb_video_rates[ii].string, str) == 0)
- {
- result = hb_video_rates[ii].rate;
- break;
- }
- }
- g_free(str);
- // Default to "same as source"
- return result;
+ str = ghb_value_string(vrate);
+ for (ii = 0; ii < hb_video_rates_count; ii++)
+ {
+ if (strcmp(hb_video_rates[ii].string, str) == 0)
+ {
+ result = hb_video_rates[ii].rate;
+ break;
+ }
+ }
+ g_free(str);
+ // Default to "same as source"
+ return result;
}
static const gchar*
lookup_video_rate_option(const GValue *vrate)
{
- gint ii;
- gchar *str;
- const gchar *result = "Same as source";
+ gint ii;
+ gchar *str;
+ const gchar *result = "Same as source";
- str = ghb_value_string(vrate);
- for (ii = 0; ii < hb_video_rates_count; ii++)
- {
- if (strcmp(hb_video_rates[ii].string, str) == 0)
- {
- result = hb_video_rates[ii].string;
- break;
- }
- }
- g_free(str);
- // Default to "same as source"
- return result;
+ str = ghb_value_string(vrate);
+ for (ii = 0; ii < hb_video_rates_count; ii++)
+ {
+ if (strcmp(hb_video_rates[ii].string, str) == 0)
+ {
+ result = hb_video_rates[ii].string;
+ break;
+ }
+ }
+ g_free(str);
+ // Default to "same as source"
+ return result;
}
static gint
lookup_audio_rate_int(const GValue *rate)
{
- gint ii;
- gint result = 0;
-
- if (G_VALUE_TYPE(rate) == G_TYPE_STRING)
- {
- // Coincidentally, the string "source" will return 0
- // which is our flag to use "same as source"
- gchar * str = ghb_value_string(rate);
- for (ii = 0; ii < hb_audio_rates_count; ii++)
- {
- if (strcmp(hb_audio_rates[ii].string, str) == 0)
- {
- result = hb_audio_rates[ii].rate;
- break;
- }
- }
- g_free(str);
- }
- else if (G_VALUE_TYPE(rate) == G_TYPE_INT ||
- G_VALUE_TYPE(rate) == G_TYPE_INT64 ||
- G_VALUE_TYPE(rate) == G_TYPE_DOUBLE)
- {
- for (ii = 0; ii < hb_audio_rates_count; ii++)
- {
- gint val = ghb_value_int(rate);
- if (val == hb_audio_rates[ii].rate)
- {
- result = hb_audio_rates[ii].rate;
- break;
- }
- }
- }
- return result;
+ gint ii;
+ gint result = 0;
+
+ if (G_VALUE_TYPE(rate) == G_TYPE_STRING)
+ {
+ // Coincidentally, the string "source" will return 0
+ // which is our flag to use "same as source"
+ gchar * str = ghb_value_string(rate);
+ for (ii = 0; ii < hb_audio_rates_count; ii++)
+ {
+ if (strcmp(hb_audio_rates[ii].string, str) == 0)
+ {
+ result = hb_audio_rates[ii].rate;
+ break;
+ }
+ }
+ g_free(str);
+ }
+ else if (G_VALUE_TYPE(rate) == G_TYPE_INT ||
+ G_VALUE_TYPE(rate) == G_TYPE_INT64 ||
+ G_VALUE_TYPE(rate) == G_TYPE_DOUBLE)
+ {
+ for (ii = 0; ii < hb_audio_rates_count; ii++)
+ {
+ gint val = ghb_value_int(rate);
+ if (val == hb_audio_rates[ii].rate)
+ {
+ result = hb_audio_rates[ii].rate;
+ break;
+ }
+ }
+ }
+ return result;
}
static const gchar*
lookup_audio_rate(const GValue *rate, const char *def)
{
- gint ii;
- const gchar *result = def;
-
- if (G_VALUE_TYPE(rate) == G_TYPE_STRING)
- {
- // Coincidentally, the string "source" will return 0
- // which is our flag to use "same as source"
- gchar *str = ghb_value_string(rate);
- for (ii = 0; ii < hb_audio_rates_count; ii++)
- {
- if (strcmp(hb_audio_rates[ii].string, str) == 0)
- {
- result = hb_audio_rates[ii].string;
- break;
- }
- }
- g_free(str);
- }
- else if (G_VALUE_TYPE(rate) == G_TYPE_INT ||
- G_VALUE_TYPE(rate) == G_TYPE_INT64 ||
- G_VALUE_TYPE(rate) == G_TYPE_DOUBLE)
- {
- for (ii = 0; ii < hb_audio_rates_count; ii++)
- {
- gint val = ghb_value_int(rate);
- if (val == hb_audio_rates[ii].rate)
- {
- result = hb_audio_rates[ii].string;
- break;
- }
- }
- }
- return result;
+ gint ii;
+ const gchar *result = def;
+
+ if (G_VALUE_TYPE(rate) == G_TYPE_STRING)
+ {
+ // Coincidentally, the string "source" will return 0
+ // which is our flag to use "same as source"
+ gchar *str = ghb_value_string(rate);
+ for (ii = 0; ii < hb_audio_rates_count; ii++)
+ {
+ if (strcmp(hb_audio_rates[ii].string, str) == 0)
+ {
+ result = hb_audio_rates[ii].string;
+ break;
+ }
+ }
+ g_free(str);
+ }
+ else if (G_VALUE_TYPE(rate) == G_TYPE_INT ||
+ G_VALUE_TYPE(rate) == G_TYPE_INT64 ||
+ G_VALUE_TYPE(rate) == G_TYPE_DOUBLE)
+ {
+ for (ii = 0; ii < hb_audio_rates_count; ii++)
+ {
+ gint val = ghb_value_int(rate);
+ if (val == hb_audio_rates[ii].rate)
+ {
+ result = hb_audio_rates[ii].string;
+ break;
+ }
+ }
+ }
+ return result;
}
static const gchar*
@@ -1086,19 +1086,19 @@ lookup_audio_rate_string(const GValue *rate)
gint
ghb_find_closest_audio_rate(gint rate)
{
- gint ii;
- gint result;
+ gint ii;
+ gint result;
- result = 0;
- for (ii = 0; ii < hb_audio_rates_count; ii++)
- {
- if (rate <= hb_audio_rates[ii].rate)
- {
- result = hb_audio_rates[ii].rate;
- break;
- }
- }
- return result;
+ result = 0;
+ for (ii = 0; ii < hb_audio_rates_count; ii++)
+ {
+ if (rate <= hb_audio_rates[ii].rate)
+ {
+ result = hb_audio_rates[ii].rate;
+ break;
+ }
+ }
+ return result;
}
hb_rate_t *ghb_audio_bitrates;
@@ -1107,264 +1107,264 @@ int ghb_audio_bitrates_count;
static gint
lookup_audio_bitrate_int(const GValue *rate)
{
- gint ii;
- gint result = 160;
-
- if (G_VALUE_TYPE(rate) == G_TYPE_STRING)
- {
- // Coincidentally, the string "source" will return 0
- // which is our flag to use "same as source"
- gchar *str = ghb_value_string(rate);
- for (ii = 0; ii < ghb_audio_bitrates_count; ii++)
- {
- if (strcmp(ghb_audio_bitrates[ii].string, str) == 0)
- {
- result = ghb_audio_bitrates[ii].rate;
- break;
- }
- }
- g_free(str);
- }
- else if (G_VALUE_TYPE(rate) == G_TYPE_INT ||
- G_VALUE_TYPE(rate) == G_TYPE_INT64 ||
- G_VALUE_TYPE(rate) == G_TYPE_DOUBLE)
- {
- gint val = ghb_value_int(rate);
- for (ii = 0; ii < ghb_audio_bitrates_count; ii++)
- {
- if (ghb_audio_bitrates[ii].rate == val)
- {
- result = ghb_audio_bitrates[ii].rate;
- break;
- }
- }
- }
- return result;
+ gint ii;
+ gint result = 160;
+
+ if (G_VALUE_TYPE(rate) == G_TYPE_STRING)
+ {
+ // Coincidentally, the string "source" will return 0
+ // which is our flag to use "same as source"
+ gchar *str = ghb_value_string(rate);
+ for (ii = 0; ii < ghb_audio_bitrates_count; ii++)
+ {
+ if (strcmp(ghb_audio_bitrates[ii].string, str) == 0)
+ {
+ result = ghb_audio_bitrates[ii].rate;
+ break;
+ }
+ }
+ g_free(str);
+ }
+ else if (G_VALUE_TYPE(rate) == G_TYPE_INT ||
+ G_VALUE_TYPE(rate) == G_TYPE_INT64 ||
+ G_VALUE_TYPE(rate) == G_TYPE_DOUBLE)
+ {
+ gint val = ghb_value_int(rate);
+ for (ii = 0; ii < ghb_audio_bitrates_count; ii++)
+ {
+ if (ghb_audio_bitrates[ii].rate == val)
+ {
+ result = ghb_audio_bitrates[ii].rate;
+ break;
+ }
+ }
+ }
+ return result;
}
static const gchar*
lookup_audio_bitrate_option(const GValue *rate)
{
- gint ii;
- const gchar *result = "160";
-
- if (G_VALUE_TYPE(rate) == G_TYPE_STRING)
- {
- // Coincidentally, the string "source" will return 0
- // which is our flag to use "same as source"
- gchar *str = ghb_value_string(rate);
- for (ii = 0; ii < ghb_audio_bitrates_count; ii++)
- {
- if (strcmp(ghb_audio_bitrates[ii].string, str) == 0)
- {
- result = ghb_audio_bitrates[ii].string;
- break;
- }
- }
- g_free(str);
- }
- else if (G_VALUE_TYPE(rate) == G_TYPE_INT ||
- G_VALUE_TYPE(rate) == G_TYPE_INT64 ||
- G_VALUE_TYPE(rate) == G_TYPE_DOUBLE)
- {
- gint val = ghb_value_int(rate);
- for (ii = 0; ii < ghb_audio_bitrates_count; ii++)
- {
- if (ghb_audio_bitrates[ii].rate == val)
- {
- result = ghb_audio_bitrates[ii].string;
- break;
- }
- }
- }
- return result;
+ gint ii;
+ const gchar *result = "160";
+
+ if (G_VALUE_TYPE(rate) == G_TYPE_STRING)
+ {
+ // Coincidentally, the string "source" will return 0
+ // which is our flag to use "same as source"
+ gchar *str = ghb_value_string(rate);
+ for (ii = 0; ii < ghb_audio_bitrates_count; ii++)
+ {
+ if (strcmp(ghb_audio_bitrates[ii].string, str) == 0)
+ {
+ result = ghb_audio_bitrates[ii].string;
+ break;
+ }
+ }
+ g_free(str);
+ }
+ else if (G_VALUE_TYPE(rate) == G_TYPE_INT ||
+ G_VALUE_TYPE(rate) == G_TYPE_INT64 ||
+ G_VALUE_TYPE(rate) == G_TYPE_DOUBLE)
+ {
+ gint val = ghb_value_int(rate);
+ for (ii = 0; ii < ghb_audio_bitrates_count; ii++)
+ {
+ if (ghb_audio_bitrates[ii].rate == val)
+ {
+ result = ghb_audio_bitrates[ii].string;
+ break;
+ }
+ }
+ }
+ return result;
}
static gint
lookup_hb_encoder_int(const GValue *enc, hb_encoder_t *encoders, int len)
{
- gint ii;
-
- if (G_VALUE_TYPE(enc) == G_TYPE_STRING)
- {
- gchar *str = ghb_value_string(enc);
- for (ii = 0; ii < len; ii++)
- {
- if (strcmp(encoders[ii].human_readable_name, str) == 0 ||
- strcmp(encoders[ii].short_name, str) == 0)
- {
- g_free(str);
- return encoders[ii].encoder;
- }
- }
- g_free(str);
- }
- else if (G_VALUE_TYPE(enc) == G_TYPE_INT ||
- G_VALUE_TYPE(enc) == G_TYPE_INT64 ||
- G_VALUE_TYPE(enc) == G_TYPE_DOUBLE)
- {
- int val = ghb_value_int(enc);
- for (ii = 0; ii < len; ii++)
- {
- if (encoders[ii].encoder == val)
- {
- return encoders[ii].encoder;
- }
- }
- }
- return 0;
+ gint ii;
+
+ if (G_VALUE_TYPE(enc) == G_TYPE_STRING)
+ {
+ gchar *str = ghb_value_string(enc);
+ for (ii = 0; ii < len; ii++)
+ {
+ if (strcmp(encoders[ii].human_readable_name, str) == 0 ||
+ strcmp(encoders[ii].short_name, str) == 0)
+ {
+ g_free(str);
+ return encoders[ii].encoder;
+ }
+ }
+ g_free(str);
+ }
+ else if (G_VALUE_TYPE(enc) == G_TYPE_INT ||
+ G_VALUE_TYPE(enc) == G_TYPE_INT64 ||
+ G_VALUE_TYPE(enc) == G_TYPE_DOUBLE)
+ {
+ int val = ghb_value_int(enc);
+ for (ii = 0; ii < len; ii++)
+ {
+ if (encoders[ii].encoder == val)
+ {
+ return encoders[ii].encoder;
+ }
+ }
+ }
+ return 0;
}
static const gchar*
lookup_hb_encoder_option(const GValue *enc, hb_encoder_t *encoders, int len)
{
- gint ii;
-
- if (G_VALUE_TYPE(enc) == G_TYPE_STRING)
- {
- gchar *str = ghb_value_string(enc);
- for (ii = 0; ii < len; ii++)
- {
- if (strcmp(encoders[ii].human_readable_name, str) == 0 ||
- strcmp(encoders[ii].short_name, str) == 0)
- {
- g_free(str);
- return encoders[ii].human_readable_name;
- }
- }
- g_free(str);
- }
- else if (G_VALUE_TYPE(enc) == G_TYPE_INT ||
- G_VALUE_TYPE(enc) == G_TYPE_INT64 ||
- G_VALUE_TYPE(enc) == G_TYPE_DOUBLE)
- {
- int val = ghb_value_int(enc);
- for (ii = 0; ii < len; ii++)
- {
- if (encoders[ii].encoder == val)
- {
- return encoders[ii].human_readable_name;
- }
- }
- }
- return 0;
+ gint ii;
+
+ if (G_VALUE_TYPE(enc) == G_TYPE_STRING)
+ {
+ gchar *str = ghb_value_string(enc);
+ for (ii = 0; ii < len; ii++)
+ {
+ if (strcmp(encoders[ii].human_readable_name, str) == 0 ||
+ strcmp(encoders[ii].short_name, str) == 0)
+ {
+ g_free(str);
+ return encoders[ii].human_readable_name;
+ }
+ }
+ g_free(str);
+ }
+ else if (G_VALUE_TYPE(enc) == G_TYPE_INT ||
+ G_VALUE_TYPE(enc) == G_TYPE_INT64 ||
+ G_VALUE_TYPE(enc) == G_TYPE_DOUBLE)
+ {
+ int val = ghb_value_int(enc);
+ for (ii = 0; ii < len; ii++)
+ {
+ if (encoders[ii].encoder == val)
+ {
+ return encoders[ii].human_readable_name;
+ }
+ }
+ }
+ return 0;
}
static const gchar*
lookup_hb_encoder_string(const GValue *enc, hb_encoder_t *encoders, int len)
{
- gint ii;
-
- if (G_VALUE_TYPE(enc) == G_TYPE_STRING)
- {
- gchar *str = ghb_value_string(enc);
- for (ii = 0; ii < len; ii++)
- {
- if (strcmp(encoders[ii].human_readable_name, str) == 0 ||
- strcmp(encoders[ii].short_name, str) == 0)
- {
- g_free(str);
- return encoders[ii].short_name;
- }
- }
- g_free(str);
- }
- else if (G_VALUE_TYPE(enc) == G_TYPE_INT ||
- G_VALUE_TYPE(enc) == G_TYPE_INT64 ||
- G_VALUE_TYPE(enc) == G_TYPE_DOUBLE)
- {
- int val = ghb_value_int(enc);
- for (ii = 0; ii < len; ii++)
- {
- if (encoders[ii].encoder == val)
- {
- return encoders[ii].short_name;
- }
- }
- }
- return 0;
+ gint ii;
+
+ if (G_VALUE_TYPE(enc) == G_TYPE_STRING)
+ {
+ gchar *str = ghb_value_string(enc);
+ for (ii = 0; ii < len; ii++)
+ {
+ if (strcmp(encoders[ii].human_readable_name, str) == 0 ||
+ strcmp(encoders[ii].short_name, str) == 0)
+ {
+ g_free(str);
+ return encoders[ii].short_name;
+ }
+ }
+ g_free(str);
+ }
+ else if (G_VALUE_TYPE(enc) == G_TYPE_INT ||
+ G_VALUE_TYPE(enc) == G_TYPE_INT64 ||
+ G_VALUE_TYPE(enc) == G_TYPE_DOUBLE)
+ {
+ int val = ghb_value_int(enc);
+ for (ii = 0; ii < len; ii++)
+ {
+ if (encoders[ii].encoder == val)
+ {
+ return encoders[ii].short_name;
+ }
+ }
+ }
+ return 0;
}
static gint
lookup_audio_lang_int(const GValue *rate)
{
- gint ii;
- gchar *str;
- gint result = 0;
-
- // Coincidentally, the string "source" will return 0
- // which is our flag to use "same as source"
- str = ghb_value_string(rate);
- for (ii = 0; ii < LANG_TABLE_SIZE; ii++)
- {
- if (strcmp(ghb_language_table[ii].iso639_2, str) == 0)
- {
- result = ii;
- break;
- }
- }
- g_free(str);
- return result;
+ gint ii;
+ gchar *str;
+ gint result = 0;
+
+ // Coincidentally, the string "source" will return 0
+ // which is our flag to use "same as source"
+ str = ghb_value_string(rate);
+ for (ii = 0; ii < LANG_TABLE_SIZE; ii++)
+ {
+ if (strcmp(ghb_language_table[ii].iso639_2, str) == 0)
+ {
+ result = ii;
+ break;
+ }
+ }
+ g_free(str);
+ return result;
}
static const gchar*
lookup_audio_lang_option(const GValue *rate)
{
- gint ii;
- gchar *str;
- const gchar *result = "Same as source";
-
- // Coincidentally, the string "source" will return 0
- // which is our flag to use "same as source"
- str = ghb_value_string(rate);
- for (ii = 0; ii < LANG_TABLE_SIZE; ii++)
- {
- if (strcmp(ghb_language_table[ii].iso639_2, str) == 0)
- {
- if (ghb_language_table[ii].native_name[0] != 0)
- result = ghb_language_table[ii].native_name;
- else
- result = ghb_language_table[ii].eng_name;
- break;
- }
- }
- g_free(str);
- return result;
+ gint ii;
+ gchar *str;
+ const gchar *result = "Same as source";
+
+ // Coincidentally, the string "source" will return 0
+ // which is our flag to use "same as source"
+ str = ghb_value_string(rate);
+ for (ii = 0; ii < LANG_TABLE_SIZE; ii++)
+ {
+ if (strcmp(ghb_language_table[ii].iso639_2, str) == 0)
+ {
+ if (ghb_language_table[ii].native_name[0] != 0)
+ result = ghb_language_table[ii].native_name;
+ else
+ result = ghb_language_table[ii].eng_name;
+ break;
+ }
+ }
+ g_free(str);
+ return result;
}
GValue*
ghb_lookup_acodec_value(gint val)
{
- GValue *value = NULL;
- gint ii;
+ GValue *value = NULL;
+ gint ii;
- for (ii = 0; ii < hb_audio_encoders_count; ii++)
- {
- if ((int)hb_audio_encoders[ii].encoder == val)
- {
- value = ghb_string_value_new(hb_audio_encoders[ii].short_name);
- return value;
- }
- }
- value = ghb_string_value_new("copy");
- return value;
+ for (ii = 0; ii < hb_audio_encoders_count; ii++)
+ {
+ if ((int)hb_audio_encoders[ii].encoder == val)
+ {
+ value = ghb_string_value_new(hb_audio_encoders[ii].short_name);
+ return value;
+ }
+ }
+ value = ghb_string_value_new("copy");
+ return value;
}
static GValue*
get_amix_value(gint val)
{
- GValue *value = NULL;
- gint ii;
+ GValue *value = NULL;
+ gint ii;
- for (ii = 0; ii < hb_audio_mixdowns_count; ii++)
- {
- if (hb_audio_mixdowns[ii].amixdown == val)
- {
- value = ghb_string_value_new(hb_audio_mixdowns[ii].short_name);
- break;
- }
- }
- return value;
+ for (ii = 0; ii < hb_audio_mixdowns_count; ii++)
+ {
+ if (hb_audio_mixdowns[ii].amixdown == val)
+ {
+ value = ghb_string_value_new(hb_audio_mixdowns[ii].short_name);
+ break;
+ }
+ }
+ return value;
}
// Handle for libhb. Gets set by ghb_backend_init()
@@ -1376,156 +1376,156 @@ extern void hb_get_temporary_directory(char path[512]);
gchar*
ghb_get_tmp_dir()
{
- char dir[512];
+ char dir[512];
- hb_get_temporary_directory(dir);
- return g_strdup(dir);
+ hb_get_temporary_directory(dir);
+ return g_strdup(dir);
}
void
ghb_hb_cleanup(gboolean partial)
{
- char dir[512];
+ char dir[512];
- hb_get_temporary_directory(dir);
- del_tree(dir, !partial);
+ hb_get_temporary_directory(dir);
+ del_tree(dir, !partial);
}
gint
ghb_subtitle_track_source(GValue *settings, gint track)
{
- gint titleindex;
-
- if (track == -2)
- return SRTSUB;
- if (track < 0)
- return VOBSUB;
- titleindex = ghb_settings_combo_int(settings, "title");
- if (titleindex < 0)
- return VOBSUB;
-
- hb_title_t * title;
- hb_subtitle_t * sub;
-
- if (h_scan == NULL) return VOBSUB;
- title = ghb_get_title_info( titleindex );
- if (title == NULL) return VOBSUB; // Bad titleindex
- sub = hb_list_item( title->list_subtitle, track);
- if (sub != NULL)
- return sub->source;
- else
- return VOBSUB;
+ gint titleindex;
+
+ if (track == -2)
+ return SRTSUB;
+ if (track < 0)
+ return VOBSUB;
+ titleindex = ghb_settings_combo_int(settings, "title");
+ if (titleindex < 0)
+ return VOBSUB;
+
+ hb_title_t * title;
+ hb_subtitle_t * sub;
+
+ if (h_scan == NULL) return VOBSUB;
+ title = ghb_get_title_info( titleindex );
+ if (title == NULL) return VOBSUB; // Bad titleindex
+ sub = hb_list_item( title->list_subtitle, track);
+ if (sub != NULL)
+ return sub->source;
+ else
+ return VOBSUB;
}
const char*
ghb_subtitle_track_source_name(GValue *settings, gint track)
{
- gint titleindex;
- const gchar * name = "Unknown";
-
- if (track == -2)
- {
- name = "SRT";
- goto done;
- }
- if (track == -1)
- {
- name = "Bitmap";
- goto done;
- }
-
- titleindex = ghb_settings_combo_int(settings, "title");
- if (titleindex < 0)
- goto done;
-
- hb_title_t * title;
- hb_subtitle_t * sub;
-
- title = ghb_get_title_info( titleindex );
- if (title == NULL)
- goto done;
-
- sub = hb_list_item( title->list_subtitle, track);
- if (sub != NULL)
- {
- name = hb_subsource_name(sub->source);
- }
+ gint titleindex;
+ const gchar * name = "Unknown";
+
+ if (track == -2)
+ {
+ name = "SRT";
+ goto done;
+ }
+ if (track == -1)
+ {
+ name = "Bitmap";
+ goto done;
+ }
+
+ titleindex = ghb_settings_combo_int(settings, "title");
+ if (titleindex < 0)
+ goto done;
+
+ hb_title_t * title;
+ hb_subtitle_t * sub;
+
+ title = ghb_get_title_info( titleindex );
+ if (title == NULL)
+ goto done;
+
+ sub = hb_list_item( title->list_subtitle, track);
+ if (sub != NULL)
+ {
+ name = hb_subsource_name(sub->source);
+ }
done:
- return name;
+ return name;
}
const gchar*
ghb_subtitle_track_lang(GValue *settings, gint track)
{
- gint titleindex;
-
- titleindex = ghb_settings_combo_int(settings, "title");
- if (titleindex < 0)
- goto fail;
- if (track == -1)
- return ghb_get_user_audio_lang(settings, titleindex, 0);
- if (track < 0)
- goto fail;
-
- hb_title_t * title;
- hb_subtitle_t * sub;
-
- title = ghb_get_title_info( titleindex );
- if (title == NULL) // Bad titleindex
- goto fail;
- sub = hb_list_item( title->list_subtitle, track);
- if (sub != NULL)
- return sub->iso639_2;
+ gint titleindex;
+
+ titleindex = ghb_settings_combo_int(settings, "title");
+ if (titleindex < 0)
+ goto fail;
+ if (track == -1)
+ return ghb_get_user_audio_lang(settings, titleindex, 0);
+ if (track < 0)
+ goto fail;
+
+ hb_title_t * title;
+ hb_subtitle_t * sub;
+
+ title = ghb_get_title_info( titleindex );
+ if (title == NULL) // Bad titleindex
+ goto fail;
+ sub = hb_list_item( title->list_subtitle, track);
+ if (sub != NULL)
+ return sub->iso639_2;
fail:
- return "und";
+ return "und";
}
gint
ghb_get_title_number(gint titleindex)
{
- hb_title_t * title;
-
- title = ghb_get_title_info( titleindex );
- if (title == NULL) return 1; // Bad titleindex
- return title->index;
+ hb_title_t * title;
+
+ title = ghb_get_title_info( titleindex );
+ if (title == NULL) return 1; // Bad titleindex
+ return title->index;
}
static hb_audio_config_t*
get_hb_audio(hb_handle_t *h, gint titleindex, gint track)
{
- hb_list_t * list;
- hb_title_t * title;
+ hb_list_t * list;
+ hb_title_t * title;
hb_audio_config_t *audio = NULL;
-
+
if (h == NULL) return NULL;
- list = hb_get_titles( h );
- if( !hb_list_count( list ) )
- {
- /* No valid title, stop right there */
- return NULL;
- }
+ list = hb_get_titles( h );
+ if( !hb_list_count( list ) )
+ {
+ /* No valid title, stop right there */
+ return NULL;
+ }
title = hb_list_item( list, titleindex );
- if (title == NULL) return NULL; // Bad titleindex
- if (!hb_list_count(title->list_audio))
- {
- return NULL;
- }
+ if (title == NULL) return NULL; // Bad titleindex
+ if (!hb_list_count(title->list_audio))
+ {
+ return NULL;
+ }
audio = (hb_audio_config_t *)hb_list_audio_config_item(title->list_audio, track);
- return audio;
+ return audio;
}
static gint
search_rates(hb_rate_t *rates, gint rate, gint count)
{
- gint ii;
- for (ii = 0; ii < count; ii++)
- {
- if (rates[ii].rate == rate)
- return ii;
- }
- return -1;
+ gint ii;
+ for (ii = 0; ii < count; ii++)
+ {
+ if (rates[ii].rate == rate)
+ return ii;
+ }
+ return -1;
}
static gboolean find_combo_item_by_int(GtkTreeModel *store, gint value, GtkTreeIter *iter);
@@ -1533,394 +1533,394 @@ static gboolean find_combo_item_by_int(GtkTreeModel *store, gint value, GtkTreeI
static GtkListStore*
get_combo_box_store(GtkBuilder *builder, const gchar *name)
{
- GtkComboBox *combo;
- GtkListStore *store;
+ GtkComboBox *combo;
+ GtkListStore *store;
- g_debug("get_combo_box_store() %s\n", name);
- // First modify the combobox model to allow greying out of options
- combo = GTK_COMBO_BOX(GHB_WIDGET(builder, name));
- store = GTK_LIST_STORE(gtk_combo_box_get_model (combo));
- return store;
+ g_debug("get_combo_box_store() %s\n", name);
+ // First modify the combobox model to allow greying out of options
+ combo = GTK_COMBO_BOX(GHB_WIDGET(builder, name));
+ store = GTK_LIST_STORE(gtk_combo_box_get_model (combo));
+ return store;
}
static void
grey_combo_box_item(GtkBuilder *builder, const gchar *name, gint value, gboolean grey)
{
- GtkListStore *store;
- GtkTreeIter iter;
-
- store = get_combo_box_store(builder, name);
- if (find_combo_item_by_int(GTK_TREE_MODEL(store), value, &iter))
- {
- gtk_list_store_set(store, &iter,
- 1, !grey,
- -1);
- }
+ GtkListStore *store;
+ GtkTreeIter iter;
+
+ store = get_combo_box_store(builder, name);
+ if (find_combo_item_by_int(GTK_TREE_MODEL(store), value, &iter))
+ {
+ gtk_list_store_set(store, &iter,
+ 1, !grey,
+ -1);
+ }
}
static void
grey_mix_opts(signal_user_data_t *ud, gint acodec, gint64 layout)
{
- gint ii;
-
- g_debug("grey_mix_opts()\n");
- for (ii = 0; ii < hb_audio_mixdowns_count; ii++)
- {
- grey_combo_box_item(ud->builder, "AudioMixdown",
- hb_audio_mixdowns[ii].amixdown,
- !hb_mixdown_is_supported(hb_audio_mixdowns[ii].amixdown,
- acodec, layout));
- }
+ gint ii;
+
+ g_debug("grey_mix_opts()\n");
+ for (ii = 0; ii < hb_audio_mixdowns_count; ii++)
+ {
+ grey_combo_box_item(ud->builder, "AudioMixdown",
+ hb_audio_mixdowns[ii].amixdown,
+ !hb_mixdown_is_supported(hb_audio_mixdowns[ii].amixdown,
+ acodec, layout));
+ }
}
void
ghb_grey_combo_options(signal_user_data_t *ud)
{
- GtkWidget *widget;
- gint mux, track, titleindex, acodec, fallback;
- hb_audio_config_t *aconfig = NULL;
- GValue *gval;
- int ii;
-
- widget = GHB_WIDGET (ud->builder, "title");
- gval = ghb_widget_value(widget);
- titleindex = ghb_lookup_combo_int("title", gval);
- ghb_value_free(gval);
- widget = GHB_WIDGET (ud->builder, "AudioTrack");
- gval = ghb_widget_value(widget);
- track = ghb_lookup_combo_int("AudioTrack", gval);
- ghb_value_free(gval);
- aconfig = get_hb_audio(h_scan, titleindex, track);
- widget = GHB_WIDGET (ud->builder, "FileFormat");
- gval = ghb_widget_value(widget);
- mux = ghb_lookup_combo_int("FileFormat", gval);
- ghb_value_free(gval);
-
- grey_combo_box_item(ud->builder, "x264_analyse", 4, TRUE);
- for (ii = 0; ii < hb_audio_encoders_count; ii++)
- {
- if (!(mux & hb_audio_encoders[ii].muxers))
- {
- grey_combo_box_item(ud->builder, "AudioEncoder",
- hb_audio_encoders[ii].encoder, TRUE);
- grey_combo_box_item(ud->builder, "AudioEncoderFallback",
- hb_audio_encoders[ii].encoder, TRUE);
- }
+ GtkWidget *widget;
+ gint mux, track, titleindex, acodec, fallback;
+ hb_audio_config_t *aconfig = NULL;
+ GValue *gval;
+ int ii;
+
+ widget = GHB_WIDGET (ud->builder, "title");
+ gval = ghb_widget_value(widget);
+ titleindex = ghb_lookup_combo_int("title", gval);
+ ghb_value_free(gval);
+ widget = GHB_WIDGET (ud->builder, "AudioTrack");
+ gval = ghb_widget_value(widget);
+ track = ghb_lookup_combo_int("AudioTrack", gval);
+ ghb_value_free(gval);
+ aconfig = get_hb_audio(h_scan, titleindex, track);
+ widget = GHB_WIDGET (ud->builder, "FileFormat");
+ gval = ghb_widget_value(widget);
+ mux = ghb_lookup_combo_int("FileFormat", gval);
+ ghb_value_free(gval);
+
+ grey_combo_box_item(ud->builder, "x264_analyse", 4, TRUE);
+ for (ii = 0; ii < hb_audio_encoders_count; ii++)
+ {
+ if (!(mux & hb_audio_encoders[ii].muxers))
+ {
+ grey_combo_box_item(ud->builder, "AudioEncoder",
+ hb_audio_encoders[ii].encoder, TRUE);
+ grey_combo_box_item(ud->builder, "AudioEncoderFallback",
+ hb_audio_encoders[ii].encoder, TRUE);
+ }
else
{
- grey_combo_box_item(ud->builder, "AudioEncoder",
- hb_audio_encoders[ii].encoder, FALSE);
- grey_combo_box_item(ud->builder, "AudioEncoderFallback",
- hb_audio_encoders[ii].encoder, FALSE);
+ grey_combo_box_item(ud->builder, "AudioEncoder",
+ hb_audio_encoders[ii].encoder, FALSE);
+ grey_combo_box_item(ud->builder, "AudioEncoderFallback",
+ hb_audio_encoders[ii].encoder, FALSE);
+ }
+ }
+ for (ii = 0; ii < hb_video_encoders_count; ii++)
+ {
+ if (!(mux & hb_video_encoders[ii].muxers))
+ {
+ grey_combo_box_item(ud->builder, "VideoEncoder",
+ hb_video_encoders[ii].encoder, TRUE);
}
- }
- for (ii = 0; ii < hb_video_encoders_count; ii++)
- {
- if (!(mux & hb_video_encoders[ii].muxers))
- {
- grey_combo_box_item(ud->builder, "VideoEncoder",
- hb_video_encoders[ii].encoder, TRUE);
- }
else
- {
- grey_combo_box_item(ud->builder, "VideoEncoder",
- hb_video_encoders[ii].encoder, FALSE);
- }
- }
-
- if (aconfig && (aconfig->in.codec & HB_ACODEC_MASK) != HB_ACODEC_MP3)
- {
- grey_combo_box_item(ud->builder, "AudioEncoder", HB_ACODEC_MP3_PASS, TRUE);
- }
- if (aconfig && (aconfig->in.codec & HB_ACODEC_MASK) != HB_ACODEC_FFAAC)
- {
- grey_combo_box_item(ud->builder, "AudioEncoder", HB_ACODEC_AAC_PASS, TRUE);
- }
- if (aconfig && (aconfig->in.codec & HB_ACODEC_MASK) != HB_ACODEC_AC3)
- {
- grey_combo_box_item(ud->builder, "AudioEncoder", HB_ACODEC_AC3_PASS, TRUE);
- }
- if (aconfig && (aconfig->in.codec & HB_ACODEC_MASK) != HB_ACODEC_DCA)
- {
- grey_combo_box_item(ud->builder, "AudioEncoder", HB_ACODEC_DCA_PASS, TRUE);
- }
- if (aconfig && (aconfig->in.codec & HB_ACODEC_MASK) != HB_ACODEC_DCA_HD)
- {
- grey_combo_box_item(ud->builder, "AudioEncoder", HB_ACODEC_DCA_HD_PASS, TRUE);
- }
-
- widget = GHB_WIDGET (ud->builder, "AudioEncoder");
- gval = ghb_widget_value(widget);
- acodec = ghb_lookup_combo_int("AudioEncoder", gval);
- ghb_value_free(gval);
-
- gint64 layout = aconfig != NULL ? aconfig->in.channel_layout : ~0;
- fallback = ghb_select_fallback(ud->settings, mux, acodec);
- gint copy_mask = ghb_get_copy_mask(ud->settings);
- acodec = ghb_select_audio_codec(mux, aconfig, acodec, fallback, copy_mask);
- grey_mix_opts(ud, acodec, layout);
+ {
+ grey_combo_box_item(ud->builder, "VideoEncoder",
+ hb_video_encoders[ii].encoder, FALSE);
+ }
+ }
+
+ if (aconfig && (aconfig->in.codec & HB_ACODEC_MASK) != HB_ACODEC_MP3)
+ {
+ grey_combo_box_item(ud->builder, "AudioEncoder", HB_ACODEC_MP3_PASS, TRUE);
+ }
+ if (aconfig && (aconfig->in.codec & HB_ACODEC_MASK) != HB_ACODEC_FFAAC)
+ {
+ grey_combo_box_item(ud->builder, "AudioEncoder", HB_ACODEC_AAC_PASS, TRUE);
+ }
+ if (aconfig && (aconfig->in.codec & HB_ACODEC_MASK) != HB_ACODEC_AC3)
+ {
+ grey_combo_box_item(ud->builder, "AudioEncoder", HB_ACODEC_AC3_PASS, TRUE);
+ }
+ if (aconfig && (aconfig->in.codec & HB_ACODEC_MASK) != HB_ACODEC_DCA)
+ {
+ grey_combo_box_item(ud->builder, "AudioEncoder", HB_ACODEC_DCA_PASS, TRUE);
+ }
+ if (aconfig && (aconfig->in.codec & HB_ACODEC_MASK) != HB_ACODEC_DCA_HD)
+ {
+ grey_combo_box_item(ud->builder, "AudioEncoder", HB_ACODEC_DCA_HD_PASS, TRUE);
+ }
+
+ widget = GHB_WIDGET (ud->builder, "AudioEncoder");
+ gval = ghb_widget_value(widget);
+ acodec = ghb_lookup_combo_int("AudioEncoder", gval);
+ ghb_value_free(gval);
+
+ gint64 layout = aconfig != NULL ? aconfig->in.channel_layout : ~0;
+ fallback = ghb_select_fallback(ud->settings, mux, acodec);
+ gint copy_mask = ghb_get_copy_mask(ud->settings);
+ acodec = ghb_select_audio_codec(mux, aconfig, acodec, fallback, copy_mask);
+ grey_mix_opts(ud, acodec, layout);
}
gint
ghb_get_best_mix(hb_audio_config_t *aconfig, gint acodec, gint mix)
{
- gint layout;
- layout = aconfig ? aconfig->in.channel_layout : AV_CH_LAYOUT_5POINT1;
- return hb_get_best_mixdown( acodec, layout, mix );
+ gint layout;
+ layout = aconfig ? aconfig->in.channel_layout : AV_CH_LAYOUT_5POINT1;
+ return hb_get_best_mixdown( acodec, layout, mix );
}
// Set up the model for the combo box
static void
init_combo_box(GtkBuilder *builder, const gchar *name)
{
- GtkComboBox *combo;
- GtkListStore *store;
- GtkCellRenderer *cell;
-
- g_debug("init_combo_box() %s\n", name);
- // First modify the combobox model to allow greying out of options
- combo = GTK_COMBO_BOX(GHB_WIDGET(builder, name));
- if (combo == NULL)
- return;
- // Store contains:
- // 1 - String to display
- // 2 - bool indicating whether the entry is selectable (grey or not)
- // 3 - String that is used for presets
- // 4 - Int value determined by backend
- // 5 - String value determined by backend
- store = gtk_list_store_new(5, G_TYPE_STRING, G_TYPE_BOOLEAN,
- G_TYPE_STRING, G_TYPE_DOUBLE, G_TYPE_STRING);
- gtk_combo_box_set_model(combo, GTK_TREE_MODEL(store));
-
- if (G_OBJECT_TYPE(combo) == GTK_TYPE_COMBO_BOX)
- {
- gtk_cell_layout_clear(GTK_CELL_LAYOUT(combo));
- 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,
- "markup", 0, "sensitive", 1, NULL);
- }
- else
- { // Combo box entry
- gtk_combo_box_entry_set_text_column(GTK_COMBO_BOX_ENTRY(combo), 0);
- }
-}
+ GtkComboBox *combo;
+ GtkListStore *store;
+ GtkCellRenderer *cell;
+
+ g_debug("init_combo_box() %s\n", name);
+ // First modify the combobox model to allow greying out of options
+ combo = GTK_COMBO_BOX(GHB_WIDGET(builder, name));
+ if (combo == NULL)
+ return;
+ // Store contains:
+ // 1 - String to display
+ // 2 - bool indicating whether the entry is selectable (grey or not)
+ // 3 - String that is used for presets
+ // 4 - Int value determined by backend
+ // 5 - String value determined by backend
+ store = gtk_list_store_new(5, G_TYPE_STRING, G_TYPE_BOOLEAN,
+ G_TYPE_STRING, G_TYPE_DOUBLE, G_TYPE_STRING);
+ gtk_combo_box_set_model(combo, GTK_TREE_MODEL(store));
+
+ if (G_OBJECT_TYPE(combo) == GTK_TYPE_COMBO_BOX)
+ {
+ gtk_cell_layout_clear(GTK_CELL_LAYOUT(combo));
+ 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,
+ "markup", 0, "sensitive", 1, NULL);
+ }
+ else
+ { // Combo box entry
+ gtk_combo_box_entry_set_text_column(GTK_COMBO_BOX_ENTRY(combo), 0);
+ }
+}
static void
audio_samplerate_opts_set(GtkBuilder *builder, const gchar *name, hb_rate_t *rates, gint count)
{
- GtkTreeIter iter;
- GtkListStore *store;
- gint ii;
- gchar *str;
-
- g_debug("audio_samplerate_opts_set ()\n");
- store = get_combo_box_store(builder, name);
- gtk_list_store_clear(store);
- // Add an item for "Same As Source"
- gtk_list_store_append(store, &iter);
- gtk_list_store_set(store, &iter,
- 0, "<small>Same as source</small>",
- 1, TRUE,
- 2, "source",
- 3, 0.0,
- 4, "source",
- -1);
- for (ii = 0; ii < count; ii++)
- {
- gtk_list_store_append(store, &iter);
- str = g_strdup_printf("<small>%s</small>", rates[ii].string);
- gtk_list_store_set(store, &iter,
- 0, str,
- 1, TRUE,
- 2, rates[ii].string,
- 3, (gdouble)rates[ii].rate,
- 4, rates[ii].string,
- -1);
- g_free(str);
- }
+ GtkTreeIter iter;
+ GtkListStore *store;
+ gint ii;
+ gchar *str;
+
+ g_debug("audio_samplerate_opts_set ()\n");
+ store = get_combo_box_store(builder, name);
+ gtk_list_store_clear(store);
+ // Add an item for "Same As Source"
+ gtk_list_store_append(store, &iter);
+ gtk_list_store_set(store, &iter,
+ 0, "<small>Same as source</small>",
+ 1, TRUE,
+ 2, "source",
+ 3, 0.0,
+ 4, "source",
+ -1);
+ for (ii = 0; ii < count; ii++)
+ {
+ gtk_list_store_append(store, &iter);
+ str = g_strdup_printf("<small>%s</small>", rates[ii].string);
+ gtk_list_store_set(store, &iter,
+ 0, str,
+ 1, TRUE,
+ 2, rates[ii].string,
+ 3, (gdouble)rates[ii].rate,
+ 4, rates[ii].string,
+ -1);
+ g_free(str);
+ }
}
static void
video_rate_opts_set(GtkBuilder *builder, const gchar *name, hb_rate_t *rates, gint count)
{
- GtkTreeIter iter;
- GtkListStore *store;
- gint ii;
-
- g_debug("video_rate_opts_set ()\n");
- store = get_combo_box_store(builder, name);
- gtk_list_store_clear(store);
- // Add an item for "Same As Source"
- gtk_list_store_append(store, &iter);
- gtk_list_store_set(store, &iter,
- 0, "Same as source",
- 1, TRUE,
- 2, "source",
- 3, 0.0,
- 4, "source",
- -1);
- for (ii = 0; ii < count; ii++)
- {
- gchar *desc = "";
- gchar *option;
- if (strcmp(rates[ii].string, "23.976") == 0)
- {
- desc = "(NTSC Film)";
- }
- else if (strcmp(rates[ii].string, "25") == 0)
- {
- desc = "(PAL Film/Video)";
- }
- else if (strcmp(rates[ii].string, "29.97") == 0)
- {
- desc = "(NTSC Video)";
- }
- option = g_strdup_printf ("%s %s", rates[ii].string, desc);
- gtk_list_store_append(store, &iter);
- gtk_list_store_set(store, &iter,
- 0, option,
- 1, TRUE,
- 2, rates[ii].string,
- 3, (gdouble)rates[ii].rate,
- 4, rates[ii].string,
- -1);
- g_free(option);
- }
+ GtkTreeIter iter;
+ GtkListStore *store;
+ gint ii;
+
+ g_debug("video_rate_opts_set ()\n");
+ store = get_combo_box_store(builder, name);
+ gtk_list_store_clear(store);
+ // Add an item for "Same As Source"
+ gtk_list_store_append(store, &iter);
+ gtk_list_store_set(store, &iter,
+ 0, "Same as source",
+ 1, TRUE,
+ 2, "source",
+ 3, 0.0,
+ 4, "source",
+ -1);
+ for (ii = 0; ii < count; ii++)
+ {
+ gchar *desc = "";
+ gchar *option;
+ if (strcmp(rates[ii].string, "23.976") == 0)
+ {
+ desc = "(NTSC Film)";
+ }
+ else if (strcmp(rates[ii].string, "25") == 0)
+ {
+ desc = "(PAL Film/Video)";
+ }
+ else if (strcmp(rates[ii].string, "29.97") == 0)
+ {
+ desc = "(NTSC Video)";
+ }
+ option = g_strdup_printf ("%s %s", rates[ii].string, desc);
+ gtk_list_store_append(store, &iter);
+ gtk_list_store_set(store, &iter,
+ 0, option,
+ 1, TRUE,
+ 2, rates[ii].string,
+ 3, (gdouble)rates[ii].rate,
+ 4, rates[ii].string,
+ -1);
+ g_free(option);
+ }
}
static void
hb_encoder_opts_set_with_mask(
- GtkBuilder *builder,
- const gchar *name,
- hb_encoder_t *encoders,
- int len,
- int mask,
- int neg_mask)
-{
- GtkTreeIter iter;
- GtkListStore *store;
- gint ii;
- gchar *str;
-
- g_debug("hb_encoder_opts_set ()\n");
- store = get_combo_box_store(builder, name);
- gtk_list_store_clear(store);
- for (ii = 0; ii < len; ii++)
- {
- if ((mask & encoders[ii].encoder) &&
- !(neg_mask & encoders[ii].encoder))
- {
- gtk_list_store_append(store, &iter);
- str = g_strdup_printf("<small>%s</small>",
- encoders[ii].human_readable_name);
- gtk_list_store_set(store, &iter,
- 0, str,
- 1, TRUE,
- 2, encoders[ii].short_name,
- 3, (gdouble)encoders[ii].encoder,
- 4, encoders[ii].short_name,
- -1);
- g_free(str);
- }
- }
+ GtkBuilder *builder,
+ const gchar *name,
+ hb_encoder_t *encoders,
+ int len,
+ int mask,
+ int neg_mask)
+{
+ GtkTreeIter iter;
+ GtkListStore *store;
+ gint ii;
+ gchar *str;
+
+ g_debug("hb_encoder_opts_set ()\n");
+ store = get_combo_box_store(builder, name);
+ gtk_list_store_clear(store);
+ for (ii = 0; ii < len; ii++)
+ {
+ if ((mask & encoders[ii].encoder) &&
+ !(neg_mask & encoders[ii].encoder))
+ {
+ gtk_list_store_append(store, &iter);
+ str = g_strdup_printf("<small>%s</small>",
+ encoders[ii].human_readable_name);
+ gtk_list_store_set(store, &iter,
+ 0, str,
+ 1, TRUE,
+ 2, encoders[ii].short_name,
+ 3, (gdouble)encoders[ii].encoder,
+ 4, encoders[ii].short_name,
+ -1);
+ g_free(str);
+ }
+ }
}
static void
hb_encoder_opts_set(
- GtkBuilder *builder,
- const gchar *name,
- hb_encoder_t *encoders,
- int len)
+ GtkBuilder *builder,
+ const gchar *name,
+ hb_encoder_t *encoders,
+ int len)
{
- hb_encoder_opts_set_with_mask(builder, name, encoders, len, ~0, 0);
+ hb_encoder_opts_set_with_mask(builder, name, encoders, len, ~0, 0);
}
static void
acodec_fallback_opts_set(GtkBuilder *builder, const gchar *name)
{
- hb_encoder_opts_set_with_mask(builder, name, hb_audio_encoders,
- hb_audio_encoders_count, ~0, HB_ACODEC_PASS_FLAG);
+ hb_encoder_opts_set_with_mask(builder, name, hb_audio_encoders,
+ hb_audio_encoders_count, ~0, HB_ACODEC_PASS_FLAG);
}
static void
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);
- for (ii = 0; ii < hb_audio_mixdowns_count; ii++)
- {
- gtk_list_store_append(store, &iter);
- str = g_strdup_printf("<small>%s</small>",
- hb_audio_mixdowns[ii].human_readable_name);
- gtk_list_store_set(store, &iter,
- 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);
- }
+ 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);
+ for (ii = 0; ii < hb_audio_mixdowns_count; ii++)
+ {
+ gtk_list_store_append(store, &iter);
+ str = g_strdup_printf("<small>%s</small>",
+ hb_audio_mixdowns[ii].human_readable_name);
+ gtk_list_store_set(store, &iter,
+ 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);
+ }
}
static void
srt_codeset_opts_set(GtkBuilder *builder, const gchar *name)
{
- GtkTreeIter iter;
- GtkListStore *store;
- gint ii;
-
- g_debug("srt_codeset_opts_set ()\n");
- store = get_combo_box_store(builder, name);
- gtk_list_store_clear(store);
- for (ii = 0; ii < SRT_TABLE_SIZE; ii++)
- {
- gtk_list_store_append(store, &iter);
- gtk_list_store_set(store, &iter,
- 0, srt_codeset_table[ii],
- 1, TRUE,
- 2, srt_codeset_table[ii],
- 3, (gdouble)ii,
- 4, srt_codeset_table[ii],
- -1);
- }
+ GtkTreeIter iter;
+ GtkListStore *store;
+ gint ii;
+
+ g_debug("srt_codeset_opts_set ()\n");
+ store = get_combo_box_store(builder, name);
+ gtk_list_store_clear(store);
+ for (ii = 0; ii < SRT_TABLE_SIZE; ii++)
+ {
+ gtk_list_store_append(store, &iter);
+ gtk_list_store_set(store, &iter,
+ 0, srt_codeset_table[ii],
+ 1, TRUE,
+ 2, srt_codeset_table[ii],
+ 3, (gdouble)ii,
+ 4, srt_codeset_table[ii],
+ -1);
+ }
}
static void
language_opts_set(GtkBuilder *builder, const gchar *name)
{
- GtkTreeIter iter;
- GtkListStore *store;
- gint ii;
-
- g_debug("language_opts_set ()\n");
- store = get_combo_box_store(builder, name);
- gtk_list_store_clear(store);
- for (ii = 0; ii < LANG_TABLE_SIZE; ii++)
- {
- const gchar *lang;
-
- if (ghb_language_table[ii].native_name[0] != 0)
- lang = ghb_language_table[ii].native_name;
- else
- lang = ghb_language_table[ii].eng_name;
-
- gtk_list_store_append(store, &iter);
- gtk_list_store_set(store, &iter,
- 0, lang,
- 1, TRUE,
- 2, ghb_language_table[ii].iso639_2,
- 3, (gdouble)ii,
- 4, ghb_language_table[ii].iso639_1,
- -1);
- }
+ GtkTreeIter iter;
+ GtkListStore *store;
+ gint ii;
+
+ g_debug("language_opts_set ()\n");
+ store = get_combo_box_store(builder, name);
+ gtk_list_store_clear(store);
+ for (ii = 0; ii < LANG_TABLE_SIZE; ii++)
+ {
+ const gchar *lang;
+
+ if (ghb_language_table[ii].native_name[0] != 0)
+ lang = ghb_language_table[ii].native_name;
+ else
+ lang = ghb_language_table[ii].eng_name;
+
+ gtk_list_store_append(store, &iter);
+ gtk_list_store_set(store, &iter,
+ 0, lang,
+ 1, TRUE,
+ 2, ghb_language_table[ii].iso639_2,
+ 3, (gdouble)ii,
+ 4, ghb_language_table[ii].iso639_1,
+ -1);
+ }
}
static gchar **titles = NULL;
@@ -1928,116 +1928,116 @@ static gchar **titles = NULL;
void
title_opts_set(GtkBuilder *builder, const gchar *name)
{
- GtkTreeIter iter;
- GtkListStore *store;
- hb_list_t * list = NULL;
- hb_title_t * title = NULL;
- gint ii;
- gint count = 0;
-
- g_debug("title_opts_set ()\n");
- store = get_combo_box_store(builder, name);
- gtk_list_store_clear(store);
- if (h_scan != NULL)
- {
- list = hb_get_titles( h_scan );
- count = hb_list_count( list );
- }
- if (titles) g_strfreev(titles);
- if (title_opts.map) g_free(title_opts.map);
- if (count > 0)
- {
- title_opts.count = count;
- title_opts.map = g_malloc(count*sizeof(options_map_t));
- titles = g_malloc((count+1) * sizeof(gchar*));
- }
- else
- {
- title_opts.count = 1;
- title_opts.map = g_malloc(sizeof(options_map_t));
- titles = NULL;
- }
- if( count <= 0 )
- {
- // No titles. Fill in a default.
- gtk_list_store_append(store, &iter);
- gtk_list_store_set(store, &iter,
- 0, "No Titles",
- 1, TRUE,
- 2, "none",
- 3, -1.0,
- 4, "none",
- -1);
- title_opts.map[0].option = "No Titles";
- title_opts.map[0].shortOpt = "none";
- title_opts.map[0].ivalue = -1;
- title_opts.map[0].svalue = "none";
- return;
- }
- for (ii = 0; ii < count; ii++)
- {
- title = (hb_title_t*)hb_list_item(list, ii);
- if (title->type == HB_STREAM_TYPE || title->type == HB_FF_STREAM_TYPE)
- {
- if (title->duration != 0)
- {
+ GtkTreeIter iter;
+ GtkListStore *store;
+ hb_list_t * list = NULL;
+ hb_title_t * title = NULL;
+ gint ii;
+ gint count = 0;
+
+ g_debug("title_opts_set ()\n");
+ store = get_combo_box_store(builder, name);
+ gtk_list_store_clear(store);
+ if (h_scan != NULL)
+ {
+ list = hb_get_titles( h_scan );
+ count = hb_list_count( list );
+ }
+ if (titles) g_strfreev(titles);
+ if (title_opts.map) g_free(title_opts.map);
+ if (count > 0)
+ {
+ title_opts.count = count;
+ title_opts.map = g_malloc(count*sizeof(options_map_t));
+ titles = g_malloc((count+1) * sizeof(gchar*));
+ }
+ else
+ {
+ title_opts.count = 1;
+ title_opts.map = g_malloc(sizeof(options_map_t));
+ titles = NULL;
+ }
+ if( count <= 0 )
+ {
+ // No titles. Fill in a default.
+ gtk_list_store_append(store, &iter);
+ gtk_list_store_set(store, &iter,
+ 0, "No Titles",
+ 1, TRUE,
+ 2, "none",
+ 3, -1.0,
+ 4, "none",
+ -1);
+ title_opts.map[0].option = "No Titles";
+ title_opts.map[0].shortOpt = "none";
+ title_opts.map[0].ivalue = -1;
+ title_opts.map[0].svalue = "none";
+ return;
+ }
+ for (ii = 0; ii < count; ii++)
+ {
+ title = (hb_title_t*)hb_list_item(list, ii);
+ if (title->type == HB_STREAM_TYPE || title->type == HB_FF_STREAM_TYPE)
+ {
+ if (title->duration != 0)
+ {
char *tmp;
- tmp = g_strdup_printf ("%d - %02dh%02dm%02ds - %s",
- title->index, title->hours, title->minutes, title->seconds,
- title->name);
+ tmp = g_strdup_printf ("%d - %02dh%02dm%02ds - %s",
+ title->index, title->hours, title->minutes, title->seconds,
+ title->name);
titles[ii] = g_markup_escape_text(tmp, -1);
g_free(tmp);
- }
- else
- {
+ }
+ else
+ {
char *tmp;
- tmp = g_strdup_printf ("%d - %s",
- title->index, title->name);
+ tmp = g_strdup_printf ("%d - %s",
+ title->index, title->name);
titles[ii] = g_markup_escape_text(tmp, -1);
g_free(tmp);
- }
- }
- else if (title->type == HB_BD_TYPE)
- {
- if (title->duration != 0)
- {
- titles[ii] = g_strdup_printf("%d (%05d.MPLS) - %02dh%02dm%02ds",
- title->index, title->playlist, title->hours,
- title->minutes, title->seconds);
- }
- else
- {
- titles[ii] = g_strdup_printf("%d (%05d.MPLS) - Unknown Length",
- title->index, title->playlist);
- }
- }
- else
- {
- if (title->duration != 0)
- {
- titles[ii] = g_strdup_printf("%d - %02dh%02dm%02ds",
- title->index, title->hours, title->minutes, title->seconds);
- }
- else
- {
- titles[ii] = g_strdup_printf("%d - Unknown Length",
- title->index);
- }
- }
- gtk_list_store_append(store, &iter);
- gtk_list_store_set(store, &iter,
- 0, titles[ii],
- 1, TRUE,
- 2, titles[ii],
- 3, (gdouble)ii,
- 4, titles[ii],
- -1);
- title_opts.map[ii].option = titles[ii];
- title_opts.map[ii].shortOpt = titles[ii];
- title_opts.map[ii].ivalue = ii;
- title_opts.map[ii].svalue = titles[ii];
- }
- titles[ii] = NULL;
+ }
+ }
+ else if (title->type == HB_BD_TYPE)
+ {
+ if (title->duration != 0)
+ {
+ titles[ii] = g_strdup_printf("%d (%05d.MPLS) - %02dh%02dm%02ds",
+ title->index, title->playlist, title->hours,
+ title->minutes, title->seconds);
+ }
+ else
+ {
+ titles[ii] = g_strdup_printf("%d (%05d.MPLS) - Unknown Length",
+ title->index, title->playlist);
+ }
+ }
+ else
+ {
+ if (title->duration != 0)
+ {
+ titles[ii] = g_strdup_printf("%d - %02dh%02dm%02ds",
+ title->index, title->hours, title->minutes, title->seconds);
+ }
+ else
+ {
+ titles[ii] = g_strdup_printf("%d - Unknown Length",
+ title->index);
+ }
+ }
+ gtk_list_store_append(store, &iter);
+ gtk_list_store_set(store, &iter,
+ 0, titles[ii],
+ 1, TRUE,
+ 2, titles[ii],
+ 3, (gdouble)ii,
+ 4, titles[ii],
+ -1);
+ title_opts.map[ii].option = titles[ii];
+ title_opts.map[ii].shortOpt = titles[ii];
+ title_opts.map[ii].ivalue = ii;
+ title_opts.map[ii].svalue = titles[ii];
+ }
+ titles[ii] = NULL;
}
static void
@@ -2163,940 +2163,940 @@ ghb_get_title_count()
static gboolean
find_combo_item_by_int(GtkTreeModel *store, gint value, GtkTreeIter *iter)
{
- gdouble ivalue;
- gboolean foundit = FALSE;
-
- if (gtk_tree_model_get_iter_first (store, iter))
- {
- do
- {
- gtk_tree_model_get(store, iter, 3, &ivalue, -1);
- if (value == (gint)ivalue)
- {
- foundit = TRUE;
- break;
- }
- } while (gtk_tree_model_iter_next (store, iter));
- }
- return foundit;
+ gdouble ivalue;
+ gboolean foundit = FALSE;
+
+ if (gtk_tree_model_get_iter_first (store, iter))
+ {
+ do
+ {
+ gtk_tree_model_get(store, iter, 3, &ivalue, -1);
+ if (value == (gint)ivalue)
+ {
+ foundit = TRUE;
+ break;
+ }
+ } while (gtk_tree_model_iter_next (store, iter));
+ }
+ return foundit;
}
void
audio_track_opts_set(GtkBuilder *builder, const gchar *name, gint titleindex)
{
- GtkTreeIter iter;
- GtkListStore *store;
- hb_title_t * title = NULL;
+ GtkTreeIter iter;
+ GtkListStore *store;
+ hb_title_t * title = NULL;
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);
- gtk_list_store_clear(store);
- title = ghb_get_title_info(titleindex);
- if (title != NULL)
- {
- count = hb_list_count( title->list_audio );
- }
- if (count > 100) count = 100;
- if (audio_track_opts.map)
- {
- for (ii = 0; ii < audio_track_opts.count; ii++)
- {
- if (audio_track_opts.map[ii].option)
- g_free(audio_track_opts.map[ii].option);
- }
- g_free(audio_track_opts.map);
- }
- if (count > 0)
- {
- audio_track_opts.count = count;
- audio_track_opts.map = g_malloc(count*sizeof(options_map_t));
- }
- else
- {
- audio_track_opts.count = 1;
- audio_track_opts.map = g_malloc(sizeof(options_map_t));
- }
- if( count <= 0 )
- {
- // No audio. set some default
- gtk_list_store_append(store, &iter);
- gtk_list_store_set(store, &iter,
- 0, "<small>No Audio</small>",
- 1, TRUE,
- 2, "none",
- 3, -1.0,
- 4, "none",
- -1);
- audio_track_opts.map[0].option = g_strdup("No Audio");
- audio_track_opts.map[0].shortOpt = "none";
- audio_track_opts.map[0].ivalue = -1;
- audio_track_opts.map[0].svalue = "none";
- return;
- }
- index_str_init(count-1);
- for (ii = 0; ii < count; ii++)
- {
+ gint ii;
+ gint count = 0;
+ gchar *str;
+
+ g_debug("audio_track_opts_set ()\n");
+ store = get_combo_box_store(builder, name);
+ gtk_list_store_clear(store);
+ title = ghb_get_title_info(titleindex);
+ if (title != NULL)
+ {
+ count = hb_list_count( title->list_audio );
+ }
+ if (count > 100) count = 100;
+ if (audio_track_opts.map)
+ {
+ for (ii = 0; ii < audio_track_opts.count; ii++)
+ {
+ if (audio_track_opts.map[ii].option)
+ g_free(audio_track_opts.map[ii].option);
+ }
+ g_free(audio_track_opts.map);
+ }
+ if (count > 0)
+ {
+ audio_track_opts.count = count;
+ audio_track_opts.map = g_malloc(count*sizeof(options_map_t));
+ }
+ else
+ {
+ audio_track_opts.count = 1;
+ audio_track_opts.map = g_malloc(sizeof(options_map_t));
+ }
+ if( count <= 0 )
+ {
+ // No audio. set some default
+ gtk_list_store_append(store, &iter);
+ gtk_list_store_set(store, &iter,
+ 0, "<small>No Audio</small>",
+ 1, TRUE,
+ 2, "none",
+ 3, -1.0,
+ 4, "none",
+ -1);
+ audio_track_opts.map[0].option = g_strdup("No Audio");
+ audio_track_opts.map[0].shortOpt = "none";
+ audio_track_opts.map[0].ivalue = -1;
+ audio_track_opts.map[0].svalue = "none";
+ return;
+ }
+ index_str_init(count-1);
+ for (ii = 0; ii < count; ii++)
+ {
audio = (hb_audio_config_t *) hb_list_audio_config_item( title->list_audio, ii );
- gtk_list_store_append(store, &iter);
- char *tmp = g_strdup_printf("%d - %s", ii + 1, audio->lang.description);
- str = g_strdup_printf("<small>%s</small>", tmp);
- gtk_list_store_set(store, &iter,
- 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 = g_strdup(tmp);
- g_free(tmp);
- audio_track_opts.map[ii].shortOpt = index_str[ii];
- audio_track_opts.map[ii].ivalue = ii;
- audio_track_opts.map[ii].svalue = index_str[ii];
- }
- GtkComboBox *combo = GTK_COMBO_BOX(GHB_WIDGET(builder, name));
- gtk_combo_box_set_active (combo, 0);
+ gtk_list_store_append(store, &iter);
+ char *tmp = g_strdup_printf("%d - %s", ii + 1, audio->lang.description);
+ str = g_strdup_printf("<small>%s</small>", tmp);
+ gtk_list_store_set(store, &iter,
+ 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 = g_strdup(tmp);
+ g_free(tmp);
+ audio_track_opts.map[ii].shortOpt = index_str[ii];
+ audio_track_opts.map[ii].ivalue = ii;
+ audio_track_opts.map[ii].svalue = index_str[ii];
+ }
+ GtkComboBox *combo = GTK_COMBO_BOX(GHB_WIDGET(builder, name));
+ gtk_combo_box_set_active (combo, 0);
}
const gchar*
ghb_audio_track_description(gint track, int titleindex)
{
- hb_title_t * title = NULL;
+ hb_title_t * title = NULL;
hb_audio_config_t * audio;
- gchar * desc = "Unknown";
-
- g_debug("ghb_audio_track_description ()\n");
+ gchar * desc = "Unknown";
+
+ g_debug("ghb_audio_track_description ()\n");
- title = ghb_get_title_info( titleindex );
- if (title == NULL) return desc;
- if (track >= hb_list_count( title->list_audio )) return desc;
+ title = ghb_get_title_info( titleindex );
+ if (title == NULL) return desc;
+ if (track >= hb_list_count( title->list_audio )) return desc;
- audio = hb_list_audio_config_item(title->list_audio, track);
- if (audio == NULL) return desc;
- return audio->lang.description;
+ audio = hb_list_audio_config_item(title->list_audio, track);
+ if (audio == NULL) return desc;
+ return audio->lang.description;
}
void
subtitle_track_opts_set(GtkBuilder *builder, const gchar *name, gint titleindex)
{
- GtkTreeIter iter;
- GtkListStore *store;
- hb_title_t * title = NULL;
- hb_subtitle_t * subtitle;
- gint ii, count = 0;
- static char ** options = NULL;
-
- g_debug("subtitle_track_opts_set ()\n");
- store = get_combo_box_store(builder, name);
- gtk_list_store_clear(store);
- title = ghb_get_title_info(titleindex);
- if (title != NULL)
- {
- count = hb_list_count( title->list_subtitle );
- }
- if (count > 100) count = 100;
- if (subtitle_opts.map) g_free(subtitle_opts.map);
- if (count > 0)
- {
- subtitle_opts.count = count+1;
- subtitle_opts.map = g_malloc((count+1)*sizeof(options_map_t));
- }
- else
- {
- subtitle_opts.count = LANG_TABLE_SIZE+1;
- subtitle_opts.map = g_malloc((LANG_TABLE_SIZE+1)*sizeof(options_map_t));
- }
- gtk_list_store_append(store, &iter);
- gtk_list_store_set(store, &iter,
- 0, "Foreign Audio Search",
- 1, TRUE,
- 2, "-1",
- 3, -1.0,
- 4, "auto",
- -1);
- subtitle_opts.map[0].option = "Foreign Audio Search";
- subtitle_opts.map[0].shortOpt = "-1";
- subtitle_opts.map[0].ivalue = -1;
- subtitle_opts.map[0].svalue = "auto";
- if (count > 0)
- {
- if (options != NULL)
- g_strfreev(options);
- options = g_malloc((count+1)*sizeof(gchar*));
- index_str_init(count-1);
- for (ii = 0; ii < count; ii++)
- {
- subtitle = (hb_subtitle_t *)hb_list_item(title->list_subtitle, ii);
- options[ii] = g_strdup_printf("%d - %s (%s)", ii+1,
- subtitle->lang,
- hb_subsource_name(subtitle->source));
- subtitle_opts.map[ii+1].option = options[ii];
- subtitle_opts.map[ii+1].shortOpt = index_str[ii];
- subtitle_opts.map[ii+1].ivalue = ii;
- subtitle_opts.map[ii+1].svalue = subtitle->iso639_2;
- gtk_list_store_append(store, &iter);
- gtk_list_store_set(store, &iter,
- 0, options[ii],
- 1, TRUE,
- 2, index_str[ii],
- 3, (gdouble)ii,
- 4, subtitle->iso639_2,
- -1);
- }
- options[count] = NULL;
- }
- else
- {
- index_str_init(LANG_TABLE_SIZE-1);
- for (ii = 0; ii < LANG_TABLE_SIZE; ii++)
- {
- const gchar *lang;
-
- if (ghb_language_table[ii].native_name[0] != 0)
- lang = ghb_language_table[ii].native_name;
- else
- lang = ghb_language_table[ii].eng_name;
-
- subtitle_opts.map[ii+1].option = (gchar*)lang;
- subtitle_opts.map[ii+1].shortOpt = index_str[ii];
- subtitle_opts.map[ii+1].ivalue = ii;
- subtitle_opts.map[ii+1].svalue = ghb_language_table[ii].iso639_2;
- gtk_list_store_append(store, &iter);
- gtk_list_store_set(store, &iter,
- 0, lang,
- 1, TRUE,
- 2, index_str[ii],
- 3, (gdouble)ii,
- 4, ghb_language_table[ii].iso639_2,
- -1);
- }
- }
- GtkComboBox *combo = GTK_COMBO_BOX(GHB_WIDGET(builder, name));
- gtk_combo_box_set_active (combo, 0);
+ GtkTreeIter iter;
+ GtkListStore *store;
+ hb_title_t * title = NULL;
+ hb_subtitle_t * subtitle;
+ gint ii, count = 0;
+ static char ** options = NULL;
+
+ g_debug("subtitle_track_opts_set ()\n");
+ store = get_combo_box_store(builder, name);
+ gtk_list_store_clear(store);
+ title = ghb_get_title_info(titleindex);
+ if (title != NULL)
+ {
+ count = hb_list_count( title->list_subtitle );
+ }
+ if (count > 100) count = 100;
+ if (subtitle_opts.map) g_free(subtitle_opts.map);
+ if (count > 0)
+ {
+ subtitle_opts.count = count+1;
+ subtitle_opts.map = g_malloc((count+1)*sizeof(options_map_t));
+ }
+ else
+ {
+ subtitle_opts.count = LANG_TABLE_SIZE+1;
+ subtitle_opts.map = g_malloc((LANG_TABLE_SIZE+1)*sizeof(options_map_t));
+ }
+ gtk_list_store_append(store, &iter);
+ gtk_list_store_set(store, &iter,
+ 0, "Foreign Audio Search",
+ 1, TRUE,
+ 2, "-1",
+ 3, -1.0,
+ 4, "auto",
+ -1);
+ subtitle_opts.map[0].option = "Foreign Audio Search";
+ subtitle_opts.map[0].shortOpt = "-1";
+ subtitle_opts.map[0].ivalue = -1;
+ subtitle_opts.map[0].svalue = "auto";
+ if (count > 0)
+ {
+ if (options != NULL)
+ g_strfreev(options);
+ options = g_malloc((count+1)*sizeof(gchar*));
+ index_str_init(count-1);
+ for (ii = 0; ii < count; ii++)
+ {
+ subtitle = (hb_subtitle_t *)hb_list_item(title->list_subtitle, ii);
+ options[ii] = g_strdup_printf("%d - %s (%s)", ii+1,
+ subtitle->lang,
+ hb_subsource_name(subtitle->source));
+ subtitle_opts.map[ii+1].option = options[ii];
+ subtitle_opts.map[ii+1].shortOpt = index_str[ii];
+ subtitle_opts.map[ii+1].ivalue = ii;
+ subtitle_opts.map[ii+1].svalue = subtitle->iso639_2;
+ gtk_list_store_append(store, &iter);
+ gtk_list_store_set(store, &iter,
+ 0, options[ii],
+ 1, TRUE,
+ 2, index_str[ii],
+ 3, (gdouble)ii,
+ 4, subtitle->iso639_2,
+ -1);
+ }
+ options[count] = NULL;
+ }
+ else
+ {
+ index_str_init(LANG_TABLE_SIZE-1);
+ for (ii = 0; ii < LANG_TABLE_SIZE; ii++)
+ {
+ const gchar *lang;
+
+ if (ghb_language_table[ii].native_name[0] != 0)
+ lang = ghb_language_table[ii].native_name;
+ else
+ lang = ghb_language_table[ii].eng_name;
+
+ subtitle_opts.map[ii+1].option = (gchar*)lang;
+ subtitle_opts.map[ii+1].shortOpt = index_str[ii];
+ subtitle_opts.map[ii+1].ivalue = ii;
+ subtitle_opts.map[ii+1].svalue = ghb_language_table[ii].iso639_2;
+ gtk_list_store_append(store, &iter);
+ gtk_list_store_set(store, &iter,
+ 0, lang,
+ 1, TRUE,
+ 2, index_str[ii],
+ 3, (gdouble)ii,
+ 4, ghb_language_table[ii].iso639_2,
+ -1);
+ }
+ }
+ GtkComboBox *combo = GTK_COMBO_BOX(GHB_WIDGET(builder, name));
+ gtk_combo_box_set_active (combo, 0);
}
gint
ghb_longest_title()
{
- hb_title_set_t * title_set;
- hb_title_t * title;
- gint ii;
- gint count = 0;
- gint feature;
-
- g_debug("ghb_longest_title ()\n");
- if (h_scan == NULL) return 0;
- title_set = hb_get_title_set( h_scan );
- count = hb_list_count( title_set->list_title );
- if (count < 1) return 0;
- title = (hb_title_t*)hb_list_item(title_set->list_title, 0);
- feature = title_set->feature;
- for (ii = 0; ii < count; ii++)
- {
- title = (hb_title_t*)hb_list_item(title_set->list_title, ii);
- if (title->index == feature)
- {
- return ii;
- }
- }
- return 0;
+ hb_title_set_t * title_set;
+ hb_title_t * title;
+ gint ii;
+ gint count = 0;
+ gint feature;
+
+ g_debug("ghb_longest_title ()\n");
+ if (h_scan == NULL) return 0;
+ title_set = hb_get_title_set( h_scan );
+ count = hb_list_count( title_set->list_title );
+ if (count < 1) return 0;
+ title = (hb_title_t*)hb_list_item(title_set->list_title, 0);
+ feature = title_set->feature;
+ for (ii = 0; ii < count; ii++)
+ {
+ title = (hb_title_t*)hb_list_item(title_set->list_title, ii);
+ if (title->index == feature)
+ {
+ return ii;
+ }
+ }
+ return 0;
}
const gchar*
ghb_get_source_audio_lang(gint titleindex, gint track)
{
- hb_title_t * title;
+ hb_title_t * title;
hb_audio_config_t * audio;
- const gchar *lang = "und";
-
- g_debug("ghb_lookup_1st_audio_lang ()\n");
+ const gchar *lang = "und";
+
+ g_debug("ghb_lookup_1st_audio_lang ()\n");
title = ghb_get_title_info( titleindex );
- if (title == NULL)
- return lang;
- if (hb_list_count( title->list_audio ) <= track)
- return lang;
+ if (title == NULL)
+ return lang;
+ if (hb_list_count( title->list_audio ) <= track)
+ return lang;
- audio = hb_list_audio_config_item(title->list_audio, track);
- if (audio == NULL)
- return lang;
+ audio = hb_list_audio_config_item(title->list_audio, track);
+ if (audio == NULL)
+ return lang;
- lang = audio->lang.iso639_2;
- return lang;
+ lang = audio->lang.iso639_2;
+ return lang;
}
static gboolean*
get_track_used(gint acodec, GHashTable *track_indices, gint count)
{
- gboolean *used;
+ gboolean *used;
- used = g_hash_table_lookup(track_indices, &acodec);
- if (used == NULL)
- {
- gint *key;
+ used = g_hash_table_lookup(track_indices, &acodec);
+ if (used == NULL)
+ {
+ gint *key;
- used = g_malloc0(count * sizeof(gboolean));
- key = g_malloc(sizeof(gint));
- *key = acodec;
- g_hash_table_insert(track_indices, key, used);
- }
- return used;
+ used = g_malloc0(count * sizeof(gboolean));
+ key = g_malloc(sizeof(gint));
+ *key = acodec;
+ g_hash_table_insert(track_indices, key, used);
+ }
+ return used;
}
gint
ghb_find_audio_track(
- gint titleindex,
- const gchar *lang,
- gint acodec,
- gint fallback_acodec,
- GHashTable *track_indices)
-{
- hb_title_t * title;
- hb_audio_config_t * audio;
- gint ii;
- gint count = 0;
- gint track = -1;
- gint max_chan;
- gboolean *used = NULL;
- gboolean *passthru_used;
- gint try_acodec;
- gint passthru_acodec;
- gboolean passthru;
- gint channels;
-
- g_debug("find_audio_track ()\n");
- title = ghb_get_title_info( titleindex );
- if (title != NULL)
- {
- count = hb_list_count( title->list_audio );
- }
- if (count > 10) count = 10;
- // Try to find an item that matches the preferred language and
- // the passthru codec type
- max_chan = 0;
- passthru = (acodec & HB_ACODEC_PASS_FLAG) != 0;
- if (passthru)
- {
- for (ii = 0; ii < count; ii++)
- {
- audio = (hb_audio_config_t*)hb_list_audio_config_item(
- title->list_audio, ii );
- passthru_acodec = HB_ACODEC_PASS_MASK & acodec & audio->in.codec;
- // Is the source track use a passthru capable codec?
- if (passthru_acodec == 0)
- continue;
- used = get_track_used(passthru_acodec, track_indices, count);
- // Has the track already been used with this codec?
- if (used[ii])
- continue;
-
- channels = av_get_channel_layout_nb_channels(
- audio->in.channel_layout);
- // Find a track that is not visually impaired or dirctor's
- // commentary, and has the highest channel count.
- if ((audio->lang.type < 2) &&
- ((strcmp(lang, audio->lang.iso639_2) == 0) ||
- (strcmp(lang, "und") == 0)))
- {
- if (channels > max_chan)
- {
- track = ii;
- max_chan = channels;
- }
- }
- }
- try_acodec = fallback_acodec;
- }
- else
- {
- try_acodec = acodec;
- }
- if (track > -1)
- {
- used[track] = TRUE;
- return track;
- }
- // Try to find an item that matches the preferred language
- max_chan = 0;
- used = get_track_used(try_acodec, track_indices, count);
- for (ii = 0; ii < count; ii++)
- {
- // Has the track already been used with this codec?
- if (used[ii])
- continue;
- audio = (hb_audio_config_t*)hb_list_audio_config_item(
- title->list_audio, ii );
- passthru_acodec = HB_ACODEC_PASS_MASK & audio->in.codec;
- if (passthru_acodec && passthru)
- {
- passthru_used = get_track_used(passthru_acodec, track_indices, count);
- // Has the track already been used with this codec for passthru?
- if (passthru_used[ii])
- continue;
- }
- channels = av_get_channel_layout_nb_channels(
- audio->in.channel_layout);
- // Find a track that is not visually impaired or dirctor's commentary
- if ((audio->lang.type < 2) &&
- ((strcmp(lang, audio->lang.iso639_2) == 0) ||
- (strcmp(lang, "und") == 0)))
- {
- if (channels > max_chan)
- {
- track = ii;
- max_chan = channels;
- }
- }
- }
- if (track > -1)
- {
- used[track] = TRUE;
- return track;
- }
- // Try to fine an item that does not match the preferred language and
- // matches the passthru codec type
- max_chan = 0;
- if (passthru)
- {
- for (ii = 0; ii < count; ii++)
- {
- audio = (hb_audio_config_t*)hb_list_audio_config_item(
- title->list_audio, ii );
- passthru_acodec = HB_ACODEC_PASS_MASK & acodec & audio->in.codec;
- // Is the source track use a passthru capable codec?
- if (passthru_acodec == 0)
- continue;
- used = get_track_used(passthru_acodec, track_indices, count);
- // Has the track already been used with this codec?
- if (used[ii])
- continue;
-
- channels = av_get_channel_layout_nb_channels(
- audio->in.channel_layout);
- // Find a track that is not visually impaired or dirctor's
- // commentary, and has the highest channel count.
- if (audio->lang.type < 2)
- {
- if (channels > max_chan)
- {
- track = ii;
- max_chan = channels;
- }
- }
- }
- try_acodec = fallback_acodec;
- }
- else
- {
- try_acodec = acodec;
- }
- if (track > -1)
- {
- used[track] = TRUE;
- return track;
- }
- // Try to fine an item that does not match the preferred language
- max_chan = 0;
- used = get_track_used(try_acodec, track_indices, count);
- for (ii = 0; ii < count; ii++)
- {
- // Has the track already been used with this codec?
- if (used[ii])
- continue;
- audio = (hb_audio_config_t*)hb_list_audio_config_item(
- title->list_audio, ii );
- passthru_acodec = HB_ACODEC_PASS_MASK & audio->in.codec;
- channels = av_get_channel_layout_nb_channels(
- audio->in.channel_layout);
- if (passthru_acodec && passthru)
- {
- passthru_used = get_track_used(passthru_acodec, track_indices, count);
- // Has the track already been used with this codec for passthru?
- if (passthru_used[ii])
- continue;
- }
- // Find a track that is not visually impaired or dirctor's commentary
- if (audio->lang.type < 2)
- {
- if (channels > max_chan)
- {
- track = ii;
- max_chan = channels;
- }
- }
- }
- if (track > -1)
- {
- used[track] = TRUE;
- return track;
- }
- // Last ditch, anything goes
- for (ii = 0; ii < count; ii++)
- {
- audio = (hb_audio_config_t*)hb_list_audio_config_item(
- title->list_audio, ii );
- passthru_acodec = HB_ACODEC_PASS_MASK & audio->in.codec;
- if (passthru_acodec && passthru)
- {
- passthru_used = get_track_used(passthru_acodec, track_indices, count);
- // Has the track already been used with this codec for passthru?
- if (passthru_used[ii])
- continue;
- }
- // Has the track already been used with this codec?
- if (!used[ii])
- {
- track = ii;
- break;
- }
- }
- if (track > -1)
- {
- used[track] = TRUE;
- }
- return track;
+ gint titleindex,
+ const gchar *lang,
+ gint acodec,
+ gint fallback_acodec,
+ GHashTable *track_indices)
+{
+ hb_title_t * title;
+ hb_audio_config_t * audio;
+ gint ii;
+ gint count = 0;
+ gint track = -1;
+ gint max_chan;
+ gboolean *used = NULL;
+ gboolean *passthru_used;
+ gint try_acodec;
+ gint passthru_acodec;
+ gboolean passthru;
+ gint channels;
+
+ g_debug("find_audio_track ()\n");
+ title = ghb_get_title_info( titleindex );
+ if (title != NULL)
+ {
+ count = hb_list_count( title->list_audio );
+ }
+ if (count > 10) count = 10;
+ // Try to find an item that matches the preferred language and
+ // the passthru codec type
+ max_chan = 0;
+ passthru = (acodec & HB_ACODEC_PASS_FLAG) != 0;
+ if (passthru)
+ {
+ for (ii = 0; ii < count; ii++)
+ {
+ audio = (hb_audio_config_t*)hb_list_audio_config_item(
+ title->list_audio, ii );
+ passthru_acodec = HB_ACODEC_PASS_MASK & acodec & audio->in.codec;
+ // Is the source track use a passthru capable codec?
+ if (passthru_acodec == 0)
+ continue;
+ used = get_track_used(passthru_acodec, track_indices, count);
+ // Has the track already been used with this codec?
+ if (used[ii])
+ continue;
+
+ channels = av_get_channel_layout_nb_channels(
+ audio->in.channel_layout);
+ // Find a track that is not visually impaired or dirctor's
+ // commentary, and has the highest channel count.
+ if ((audio->lang.type < 2) &&
+ ((strcmp(lang, audio->lang.iso639_2) == 0) ||
+ (strcmp(lang, "und") == 0)))
+ {
+ if (channels > max_chan)
+ {
+ track = ii;
+ max_chan = channels;
+ }
+ }
+ }
+ try_acodec = fallback_acodec;
+ }
+ else
+ {
+ try_acodec = acodec;
+ }
+ if (track > -1)
+ {
+ used[track] = TRUE;
+ return track;
+ }
+ // Try to find an item that matches the preferred language
+ max_chan = 0;
+ used = get_track_used(try_acodec, track_indices, count);
+ for (ii = 0; ii < count; ii++)
+ {
+ // Has the track already been used with this codec?
+ if (used[ii])
+ continue;
+ audio = (hb_audio_config_t*)hb_list_audio_config_item(
+ title->list_audio, ii );
+ passthru_acodec = HB_ACODEC_PASS_MASK & audio->in.codec;
+ if (passthru_acodec && passthru)
+ {
+ passthru_used = get_track_used(passthru_acodec, track_indices, count);
+ // Has the track already been used with this codec for passthru?
+ if (passthru_used[ii])
+ continue;
+ }
+ channels = av_get_channel_layout_nb_channels(
+ audio->in.channel_layout);
+ // Find a track that is not visually impaired or dirctor's commentary
+ if ((audio->lang.type < 2) &&
+ ((strcmp(lang, audio->lang.iso639_2) == 0) ||
+ (strcmp(lang, "und") == 0)))
+ {
+ if (channels > max_chan)
+ {
+ track = ii;
+ max_chan = channels;
+ }
+ }
+ }
+ if (track > -1)
+ {
+ used[track] = TRUE;
+ return track;
+ }
+ // Try to fine an item that does not match the preferred language and
+ // matches the passthru codec type
+ max_chan = 0;
+ if (passthru)
+ {
+ for (ii = 0; ii < count; ii++)
+ {
+ audio = (hb_audio_config_t*)hb_list_audio_config_item(
+ title->list_audio, ii );
+ passthru_acodec = HB_ACODEC_PASS_MASK & acodec & audio->in.codec;
+ // Is the source track use a passthru capable codec?
+ if (passthru_acodec == 0)
+ continue;
+ used = get_track_used(passthru_acodec, track_indices, count);
+ // Has the track already been used with this codec?
+ if (used[ii])
+ continue;
+
+ channels = av_get_channel_layout_nb_channels(
+ audio->in.channel_layout);
+ // Find a track that is not visually impaired or dirctor's
+ // commentary, and has the highest channel count.
+ if (audio->lang.type < 2)
+ {
+ if (channels > max_chan)
+ {
+ track = ii;
+ max_chan = channels;
+ }
+ }
+ }
+ try_acodec = fallback_acodec;
+ }
+ else
+ {
+ try_acodec = acodec;
+ }
+ if (track > -1)
+ {
+ used[track] = TRUE;
+ return track;
+ }
+ // Try to fine an item that does not match the preferred language
+ max_chan = 0;
+ used = get_track_used(try_acodec, track_indices, count);
+ for (ii = 0; ii < count; ii++)
+ {
+ // Has the track already been used with this codec?
+ if (used[ii])
+ continue;
+ audio = (hb_audio_config_t*)hb_list_audio_config_item(
+ title->list_audio, ii );
+ passthru_acodec = HB_ACODEC_PASS_MASK & audio->in.codec;
+ channels = av_get_channel_layout_nb_channels(
+ audio->in.channel_layout);
+ if (passthru_acodec && passthru)
+ {
+ passthru_used = get_track_used(passthru_acodec, track_indices, count);
+ // Has the track already been used with this codec for passthru?
+ if (passthru_used[ii])
+ continue;
+ }
+ // Find a track that is not visually impaired or dirctor's commentary
+ if (audio->lang.type < 2)
+ {
+ if (channels > max_chan)
+ {
+ track = ii;
+ max_chan = channels;
+ }
+ }
+ }
+ if (track > -1)
+ {
+ used[track] = TRUE;
+ return track;
+ }
+ // Last ditch, anything goes
+ for (ii = 0; ii < count; ii++)
+ {
+ audio = (hb_audio_config_t*)hb_list_audio_config_item(
+ title->list_audio, ii );
+ passthru_acodec = HB_ACODEC_PASS_MASK & audio->in.codec;
+ if (passthru_acodec && passthru)
+ {
+ passthru_used = get_track_used(passthru_acodec, track_indices, count);
+ // Has the track already been used with this codec for passthru?
+ if (passthru_used[ii])
+ continue;
+ }
+ // Has the track already been used with this codec?
+ if (!used[ii])
+ {
+ track = ii;
+ break;
+ }
+ }
+ if (track > -1)
+ {
+ used[track] = TRUE;
+ }
+ return track;
}
gint
ghb_find_pref_subtitle_track(const gchar *lang)
{
- gint ii, count;
- count = subtitle_opts.count;
- for (ii = 0; ii < count; ii++)
- {
- if (strcmp(lang, subtitle_opts.map[ii].svalue) == 0)
- {
- return subtitle_opts.map[ii].ivalue;
- }
- }
- return -2;
+ gint ii, count;
+ count = subtitle_opts.count;
+ for (ii = 0; ii < count; ii++)
+ {
+ if (strcmp(lang, subtitle_opts.map[ii].svalue) == 0)
+ {
+ return subtitle_opts.map[ii].ivalue;
+ }
+ }
+ return -2;
}
gint
ghb_find_cc_track(gint titleindex)
{
- hb_title_t * title;
- hb_subtitle_t * subtitle;
- gint count, ii;
-
- g_debug("ghb_find_cc_track ()\n");
- title = ghb_get_title_info( titleindex );
- if (title != NULL)
- {
- count = hb_list_count( title->list_subtitle );
- // Try to find an item that matches the preferred language
- for (ii = 0; ii < count; ii++)
- {
- subtitle = (hb_subtitle_t*)hb_list_item( title->list_subtitle, ii );
- if (subtitle->source == CC608SUB || subtitle->source == CC708SUB)
- return ii;
- }
- }
- return -2;
+ hb_title_t * title;
+ hb_subtitle_t * subtitle;
+ gint count, ii;
+
+ g_debug("ghb_find_cc_track ()\n");
+ title = ghb_get_title_info( titleindex );
+ if (title != NULL)
+ {
+ count = hb_list_count( title->list_subtitle );
+ // Try to find an item that matches the preferred language
+ for (ii = 0; ii < count; ii++)
+ {
+ subtitle = (hb_subtitle_t*)hb_list_item( title->list_subtitle, ii );
+ if (subtitle->source == CC608SUB || subtitle->source == CC708SUB)
+ return ii;
+ }
+ }
+ return -2;
}
gint
ghb_find_subtitle_track(
- gint titleindex,
- const gchar * lang,
- gboolean burn,
- gboolean force,
- gint source,
- GHashTable * track_indices)
-{
- hb_title_t * title;
- hb_subtitle_t * subtitle;
- gint count, ii;
- gboolean *used;
-
- g_debug("find_subtitle_track ()\n");
- if (strcmp(lang, "auto") == 0)
- return -1;
-
- title = ghb_get_title_info( titleindex );
- if (title == NULL)
- return -2;
-
- count = hb_list_count( title->list_subtitle );
- used = g_hash_table_lookup(track_indices, lang);
- if (used == NULL)
- {
- 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++)
- {
- if (used[ii])
- continue;
-
- subtitle = (hb_subtitle_t*)hb_list_item( title->list_subtitle, ii );
- if (((!force || (force && ghb_canForceSub(subtitle->source))) &&
- (!burn || (burn && ghb_canBurnSub(subtitle->source)))) &&
- ((strcmp(lang, subtitle->iso639_2) == 0) ||
- (strcmp(lang, "und") == 0)))
- {
- used[ii] = TRUE;
- return ii;
- }
- }
- return -2;
+ gint titleindex,
+ const gchar * lang,
+ gboolean burn,
+ gboolean force,
+ gint source,
+ GHashTable * track_indices)
+{
+ hb_title_t * title;
+ hb_subtitle_t * subtitle;
+ gint count, ii;
+ gboolean *used;
+
+ g_debug("find_subtitle_track ()\n");
+ if (strcmp(lang, "auto") == 0)
+ return -1;
+
+ title = ghb_get_title_info( titleindex );
+ if (title == NULL)
+ return -2;
+
+ count = hb_list_count( title->list_subtitle );
+ used = g_hash_table_lookup(track_indices, lang);
+ if (used == NULL)
+ {
+ 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++)
+ {
+ if (used[ii])
+ continue;
+
+ subtitle = (hb_subtitle_t*)hb_list_item( title->list_subtitle, ii );
+ if (((!force || (force && ghb_canForceSub(subtitle->source))) &&
+ (!burn || (burn && ghb_canBurnSub(subtitle->source)))) &&
+ ((strcmp(lang, subtitle->iso639_2) == 0) ||
+ (strcmp(lang, "und") == 0)))
+ {
+ used[ii] = TRUE;
+ return ii;
+ }
+ }
+ return -2;
}
static void
generic_opts_set(GtkBuilder *builder, const gchar *name, combo_opts_t *opts)
{
- GtkTreeIter iter;
- GtkListStore *store;
- gint ii;
-
- 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);
- gtk_list_store_set(store, &iter,
- 0, opts->map[ii].option,
- 1, TRUE,
- 2, opts->map[ii].shortOpt,
- 3, opts->map[ii].ivalue,
- 4, opts->map[ii].svalue,
- -1);
- }
+ GtkTreeIter iter;
+ GtkListStore *store;
+ gint ii;
+
+ 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);
+ gtk_list_store_set(store, &iter,
+ 0, opts->map[ii].option,
+ 1, TRUE,
+ 2, opts->map[ii].shortOpt,
+ 3, opts->map[ii].ivalue,
+ 4, opts->map[ii].svalue,
+ -1);
+ }
}
static void
small_opts_set(GtkBuilder *builder, const gchar *name, combo_opts_t *opts)
{
- GtkTreeIter iter;
- GtkListStore *store;
- gint ii;
- gchar *str;
-
- g_debug("small_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("<small>%s</small>", 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);
- }
+ GtkTreeIter iter;
+ GtkListStore *store;
+ gint ii;
+ gchar *str;
+
+ g_debug("small_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("<small>%s</small>", 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)
{
- gint ii;
+ gint ii;
- for (ii = 0; combo_name_map[ii].name != NULL; ii++)
- {
- if (strcmp(name, combo_name_map[ii].name) == 0)
- {
- return combo_name_map[ii].opts;
- }
- }
- return NULL;
+ for (ii = 0; combo_name_map[ii].name != NULL; ii++)
+ {
+ if (strcmp(name, combo_name_map[ii].name) == 0)
+ {
+ return combo_name_map[ii].opts;
+ }
+ }
+ return NULL;
}
gint
ghb_lookup_combo_int(const gchar *name, const GValue *gval)
{
- if (gval == NULL)
- return 0;
- if (strcmp(name, "AudioBitrate") == 0)
- return lookup_audio_bitrate_int(gval);
- else if (strcmp(name, "AudioSamplerate") == 0)
- return lookup_audio_rate_int(gval);
- else if (strcmp(name, "VideoFramerate") == 0)
- return lookup_video_rate_int(gval);
- else if (strcmp(name, "AudioMixdown") == 0)
- return lookup_mix_int(gval);
- else if (strcmp(name, "SrtLanguage") == 0)
- return lookup_audio_lang_int(gval);
- else if (strcmp(name, "PreferredLanguage") == 0)
- return lookup_audio_lang_int(gval);
- else if (strcmp(name, "VideoEncoder") == 0)
- return lookup_hb_encoder_int(gval, hb_video_encoders, hb_video_encoders_count);
- else if (strcmp(name, "AudioEncoder") == 0)
- return lookup_hb_encoder_int(gval, hb_audio_encoders, hb_audio_encoders_count);
- else if (strcmp(name, "AudioEncoderFallback") == 0)
- return lookup_hb_encoder_int(gval, hb_audio_encoders, hb_audio_encoders_count);
- else if (strcmp(name, "AudioEncoderActual") == 0)
- return lookup_hb_encoder_int(gval, hb_audio_encoders, hb_audio_encoders_count);
- else
- {
- return lookup_generic_int(find_combo_table(name), gval);
- }
- g_warning("ghb_lookup_combo_int() couldn't find %s", name);
- return 0;
+ if (gval == NULL)
+ return 0;
+ if (strcmp(name, "AudioBitrate") == 0)
+ return lookup_audio_bitrate_int(gval);
+ else if (strcmp(name, "AudioSamplerate") == 0)
+ return lookup_audio_rate_int(gval);
+ else if (strcmp(name, "VideoFramerate") == 0)
+ return lookup_video_rate_int(gval);
+ else if (strcmp(name, "AudioMixdown") == 0)
+ return lookup_mix_int(gval);
+ else if (strcmp(name, "SrtLanguage") == 0)
+ return lookup_audio_lang_int(gval);
+ else if (strcmp(name, "PreferredLanguage") == 0)
+ return lookup_audio_lang_int(gval);
+ else if (strcmp(name, "VideoEncoder") == 0)
+ return lookup_hb_encoder_int(gval, hb_video_encoders, hb_video_encoders_count);
+ else if (strcmp(name, "AudioEncoder") == 0)
+ return lookup_hb_encoder_int(gval, hb_audio_encoders, hb_audio_encoders_count);
+ else if (strcmp(name, "AudioEncoderFallback") == 0)
+ return lookup_hb_encoder_int(gval, hb_audio_encoders, hb_audio_encoders_count);
+ else if (strcmp(name, "AudioEncoderActual") == 0)
+ return lookup_hb_encoder_int(gval, hb_audio_encoders, hb_audio_encoders_count);
+ else
+ {
+ return lookup_generic_int(find_combo_table(name), gval);
+ }
+ g_warning("ghb_lookup_combo_int() couldn't find %s", name);
+ return 0;
}
gdouble
ghb_lookup_combo_double(const gchar *name, const GValue *gval)
{
- if (gval == NULL)
- return 0;
- if (strcmp(name, "AudioBitrate") == 0)
- return lookup_audio_bitrate_int(gval);
- else if (strcmp(name, "AudioSamplerate") == 0)
- return lookup_audio_rate_int(gval);
- else if (strcmp(name, "VideoFramerate") == 0)
- return lookup_video_rate_int(gval);
- else if (strcmp(name, "AudioMixdown") == 0)
- return lookup_mix_int(gval);
- else if (strcmp(name, "SrtLanguage") == 0)
- return lookup_audio_lang_int(gval);
- else if (strcmp(name, "PreferredLanguage") == 0)
- return lookup_audio_lang_int(gval);
- else if (strcmp(name, "VideoEncoder") == 0)
- return lookup_hb_encoder_int(gval, hb_video_encoders, hb_video_encoders_count);
- else if (strcmp(name, "AudioEncoder") == 0)
- return lookup_hb_encoder_int(gval, hb_audio_encoders, hb_audio_encoders_count);
- else if (strcmp(name, "AudioEncoderFallback") == 0)
- return lookup_hb_encoder_int(gval, hb_audio_encoders, hb_audio_encoders_count);
- else if (strcmp(name, "AudioEncoderActual") == 0)
- return lookup_hb_encoder_int(gval, hb_audio_encoders, hb_audio_encoders_count);
- else
- {
- return lookup_generic_double(find_combo_table(name), gval);
- }
- g_warning("ghb_lookup_combo_double() couldn't find %s", name);
- return 0;
+ if (gval == NULL)
+ return 0;
+ if (strcmp(name, "AudioBitrate") == 0)
+ return lookup_audio_bitrate_int(gval);
+ else if (strcmp(name, "AudioSamplerate") == 0)
+ return lookup_audio_rate_int(gval);
+ else if (strcmp(name, "VideoFramerate") == 0)
+ return lookup_video_rate_int(gval);
+ else if (strcmp(name, "AudioMixdown") == 0)
+ return lookup_mix_int(gval);
+ else if (strcmp(name, "SrtLanguage") == 0)
+ return lookup_audio_lang_int(gval);
+ else if (strcmp(name, "PreferredLanguage") == 0)
+ return lookup_audio_lang_int(gval);
+ else if (strcmp(name, "VideoEncoder") == 0)
+ return lookup_hb_encoder_int(gval, hb_video_encoders, hb_video_encoders_count);
+ else if (strcmp(name, "AudioEncoder") == 0)
+ return lookup_hb_encoder_int(gval, hb_audio_encoders, hb_audio_encoders_count);
+ else if (strcmp(name, "AudioEncoderFallback") == 0)
+ return lookup_hb_encoder_int(gval, hb_audio_encoders, hb_audio_encoders_count);
+ else if (strcmp(name, "AudioEncoderActual") == 0)
+ return lookup_hb_encoder_int(gval, hb_audio_encoders, hb_audio_encoders_count);
+ else
+ {
+ return lookup_generic_double(find_combo_table(name), gval);
+ }
+ g_warning("ghb_lookup_combo_double() couldn't find %s", name);
+ return 0;
}
const gchar*
ghb_lookup_combo_option(const gchar *name, const GValue *gval)
{
- if (gval == NULL)
- return NULL;
- if (strcmp(name, "AudioBitrate") == 0)
- return lookup_audio_bitrate_option(gval);
- else if (strcmp(name, "AudioSamplerate") == 0)
- return lookup_audio_rate_option(gval);
- else if (strcmp(name, "VideoFramerate") == 0)
- return lookup_video_rate_option(gval);
- else if (strcmp(name, "AudioMixdown") == 0)
- return lookup_mix_option(gval);
- else if (strcmp(name, "SrtLanguage") == 0)
- return lookup_audio_lang_option(gval);
- else if (strcmp(name, "PreferredLanguage") == 0)
- return lookup_audio_lang_option(gval);
- else if (strcmp(name, "VideoEncoder") == 0)
- return lookup_hb_encoder_option(gval, hb_video_encoders, hb_video_encoders_count);
- else if (strcmp(name, "AudioEncoder") == 0)
- return lookup_hb_encoder_option(gval, hb_audio_encoders, hb_audio_encoders_count);
- else if (strcmp(name, "AudioEncoderFallback") == 0)
- return lookup_hb_encoder_option(gval, hb_audio_encoders, hb_audio_encoders_count);
- else if (strcmp(name, "AudioEncoderActual") == 0)
- return lookup_hb_encoder_option(gval, hb_audio_encoders, hb_audio_encoders_count);
- else
- {
- return lookup_generic_option(find_combo_table(name), gval);
- }
- g_warning("ghb_lookup_combo_int() couldn't find %s", name);
- return NULL;
+ if (gval == NULL)
+ return NULL;
+ if (strcmp(name, "AudioBitrate") == 0)
+ return lookup_audio_bitrate_option(gval);
+ else if (strcmp(name, "AudioSamplerate") == 0)
+ return lookup_audio_rate_option(gval);
+ else if (strcmp(name, "VideoFramerate") == 0)
+ return lookup_video_rate_option(gval);
+ else if (strcmp(name, "AudioMixdown") == 0)
+ return lookup_mix_option(gval);
+ else if (strcmp(name, "SrtLanguage") == 0)
+ return lookup_audio_lang_option(gval);
+ else if (strcmp(name, "PreferredLanguage") == 0)
+ return lookup_audio_lang_option(gval);
+ else if (strcmp(name, "VideoEncoder") == 0)
+ return lookup_hb_encoder_option(gval, hb_video_encoders, hb_video_encoders_count);
+ else if (strcmp(name, "AudioEncoder") == 0)
+ return lookup_hb_encoder_option(gval, hb_audio_encoders, hb_audio_encoders_count);
+ else if (strcmp(name, "AudioEncoderFallback") == 0)
+ return lookup_hb_encoder_option(gval, hb_audio_encoders, hb_audio_encoders_count);
+ else if (strcmp(name, "AudioEncoderActual") == 0)
+ return lookup_hb_encoder_option(gval, hb_audio_encoders, hb_audio_encoders_count);
+ else
+ {
+ return lookup_generic_option(find_combo_table(name), gval);
+ }
+ g_warning("ghb_lookup_combo_int() couldn't find %s", name);
+ return NULL;
}
const gchar*
ghb_lookup_combo_string(const gchar *name, const GValue *gval)
{
- if (gval == NULL)
- return NULL;
- if (strcmp(name, "AudioBitrate") == 0)
- return lookup_audio_bitrate_option(gval);
- else if (strcmp(name, "AudioSamplerate") == 0)
- return lookup_audio_rate_string(gval);
- else if (strcmp(name, "VideoFramerate") == 0)
- return lookup_video_rate_option(gval);
- else if (strcmp(name, "AudioMixdown") == 0)
- return lookup_mix_string(gval);
- else if (strcmp(name, "SrtLanguage") == 0)
- return lookup_audio_lang_option(gval);
- else if (strcmp(name, "PreferredLanguage") == 0)
- return lookup_audio_lang_option(gval);
- else if (strcmp(name, "VideoEncoder") == 0)
- return lookup_hb_encoder_string(gval, hb_video_encoders, hb_video_encoders_count);
- else if (strcmp(name, "AudioEncoder") == 0)
- return lookup_hb_encoder_string(gval, hb_audio_encoders, hb_audio_encoders_count);
- else if (strcmp(name, "AudioEncoderFallback") == 0)
- return lookup_hb_encoder_string(gval, hb_audio_encoders, hb_audio_encoders_count);
- else if (strcmp(name, "AudioEncoderActual") == 0)
- return lookup_hb_encoder_string(gval, hb_audio_encoders, hb_audio_encoders_count);
- else
- {
- return lookup_generic_string(find_combo_table(name), gval);
- }
- g_warning("ghb_lookup_combo_int() couldn't find %s", name);
- return NULL;
+ if (gval == NULL)
+ return NULL;
+ if (strcmp(name, "AudioBitrate") == 0)
+ return lookup_audio_bitrate_option(gval);
+ else if (strcmp(name, "AudioSamplerate") == 0)
+ return lookup_audio_rate_string(gval);
+ else if (strcmp(name, "VideoFramerate") == 0)
+ return lookup_video_rate_option(gval);
+ else if (strcmp(name, "AudioMixdown") == 0)
+ return lookup_mix_string(gval);
+ else if (strcmp(name, "SrtLanguage") == 0)
+ return lookup_audio_lang_option(gval);
+ else if (strcmp(name, "PreferredLanguage") == 0)
+ return lookup_audio_lang_option(gval);
+ else if (strcmp(name, "VideoEncoder") == 0)
+ return lookup_hb_encoder_string(gval, hb_video_encoders, hb_video_encoders_count);
+ else if (strcmp(name, "AudioEncoder") == 0)
+ return lookup_hb_encoder_string(gval, hb_audio_encoders, hb_audio_encoders_count);
+ else if (strcmp(name, "AudioEncoderFallback") == 0)
+ return lookup_hb_encoder_string(gval, hb_audio_encoders, hb_audio_encoders_count);
+ else if (strcmp(name, "AudioEncoderActual") == 0)
+ return lookup_hb_encoder_string(gval, hb_audio_encoders, hb_audio_encoders_count);
+ else
+ {
+ return lookup_generic_string(find_combo_table(name), gval);
+ }
+ g_warning("ghb_lookup_combo_int() couldn't find %s", name);
+ return NULL;
}
void
ghb_update_ui_combo_box(
- signal_user_data_t *ud,
- const gchar *name,
- gint user_data,
- gboolean all)
-{
- GtkComboBox *combo = NULL;
- gint signal_id;
- gint handler_id = 0;
-
- if (name != NULL)
- {
- g_debug("ghb_update_ui_combo_box() %s\n", name);
- // Clearing a combo box causes a rash of "changed" events, even when
- // the active item is -1 (inactive). To control things, I'm disabling
- // the event till things are settled down.
- combo = GTK_COMBO_BOX(GHB_WIDGET(ud->builder, name));
- signal_id = g_signal_lookup("changed", GTK_TYPE_COMBO_BOX);
- if (signal_id > 0)
- {
- // Valid signal id found. This should always succeed.
- handler_id = g_signal_handler_find ((gpointer)combo, G_SIGNAL_MATCH_ID,
- signal_id, 0, 0, 0, 0);
- if (handler_id > 0)
- {
- // This should also always succeed
- g_signal_handler_block ((gpointer)combo, handler_id);
- }
- }
- }
- if (all)
- {
- audio_bitrate_opts_set(ud->builder, "AudioBitrate");
- audio_samplerate_opts_set(ud->builder, "AudioSamplerate", hb_audio_rates, hb_audio_rates_count);
- video_rate_opts_set(ud->builder, "VideoFramerate", hb_video_rates, hb_video_rates_count);
- mix_opts_set(ud->builder, "AudioMixdown");
- hb_encoder_opts_set(ud->builder, "VideoEncoder", hb_video_encoders, hb_video_encoders_count);
- hb_encoder_opts_set(ud->builder, "AudioEncoder", hb_audio_encoders, hb_audio_encoders_count);
- acodec_fallback_opts_set(ud->builder, "AudioEncoderFallback");
- language_opts_set(ud->builder, "SrtLanguage");
- language_opts_set(ud->builder, "PreferredLanguage");
- srt_codeset_opts_set(ud->builder, "SrtCodeset");
- title_opts_set(ud->builder, "title");
- audio_track_opts_set(ud->builder, "AudioTrack", user_data);
- subtitle_track_opts_set(ud->builder, "SubtitleTrack", user_data);
- generic_opts_set(ud->builder, "VideoQualityGranularity", &vqual_granularity_opts);
- generic_opts_set(ud->builder, "PtoPType", &point_to_point_opts);
- generic_opts_set(ud->builder, "WhenComplete", &when_complete_opts);
- generic_opts_set(ud->builder, "PicturePAR", &par_opts);
- generic_opts_set(ud->builder, "PictureModulus", &alignment_opts);
- generic_opts_set(ud->builder, "LoggingLevel", &logging_opts);
- generic_opts_set(ud->builder, "LogLongevity", &log_longevity_opts);
- generic_opts_set(ud->builder, "check_updates", &appcast_update_opts);
- generic_opts_set(ud->builder, "FileFormat", &container_opts);
- generic_opts_set(ud->builder, "PictureDeinterlace", &deint_opts);
- generic_opts_set(ud->builder, "PictureDetelecine", &detel_opts);
- generic_opts_set(ud->builder, "PictureDecomb", &decomb_opts);
- generic_opts_set(ud->builder, "PictureDenoise", &denoise_opts);
- small_opts_set(ud->builder, "x264_direct", &direct_opts);
- small_opts_set(ud->builder, "x264_b_adapt", &badapt_opts);
- small_opts_set(ud->builder, "x264_bpyramid", &bpyramid_opts);
- small_opts_set(ud->builder, "x264_weighted_pframes", &weightp_opts);
- small_opts_set(ud->builder, "x264_me", &me_opts);
- small_opts_set(ud->builder, "x264_subme", &subme_opts);
- small_opts_set(ud->builder, "x264_analyse", &analyse_opts);
- small_opts_set(ud->builder, "x264_trellis", &trellis_opts);
- x264_tune_opts_set(ud->builder, "x264Tune");
- x264_profile_opts_set(ud->builder, "h264Profile");
- x264_level_opts_set(ud->builder, "h264Level");
- }
- else
- {
- if (strcmp(name, "AudioBitrate") == 0)
- audio_bitrate_opts_set(ud->builder, "AudioBitrate");
- else if (strcmp(name, "AudioSamplerate") == 0)
- audio_samplerate_opts_set(ud->builder, "AudioSamplerate", hb_audio_rates, hb_audio_rates_count);
- else if (strcmp(name, "VideoFramerate") == 0)
- video_rate_opts_set(ud->builder, "VideoFramerate", hb_video_rates, hb_video_rates_count);
- else if (strcmp(name, "AudioMixdown") == 0)
- mix_opts_set(ud->builder, "AudioMixdown");
- else if (strcmp(name, "VideoEncoder") == 0)
- hb_encoder_opts_set(ud->builder, "VideoEncoder", hb_video_encoders, hb_video_encoders_count);
- else if (strcmp(name, "AudioEncoder") == 0)
- hb_encoder_opts_set(ud->builder, "AudioEncoder", hb_audio_encoders, hb_audio_encoders_count);
- else if (strcmp(name, "AudioEncoderFallback") == 0)
- acodec_fallback_opts_set(ud->builder, "AudioEncoderFallback");
- else if (strcmp(name, "SrtLanguage") == 0)
- language_opts_set(ud->builder, "SrtLanguage");
- else if (strcmp(name, "PreferredLanguage") == 0)
- language_opts_set(ud->builder, "PreferredLanguage");
- else if (strcmp(name, "SrtCodeset") == 0)
- srt_codeset_opts_set(ud->builder, "SrtCodeset");
- else if (strcmp(name, "title") == 0)
- title_opts_set(ud->builder, "title");
- else if (strcmp(name, "SubtitleTrack") == 0)
- subtitle_track_opts_set(ud->builder, "SubtitleTrack", user_data);
- else if (strcmp(name, "AudioTrack") == 0)
- audio_track_opts_set(ud->builder, "AudioTrack", user_data);
- else if (strcmp(name, "x264Tune") == 0)
- x264_tune_opts_set(ud->builder, "x264Tune");
- else if (strcmp(name, "h264Profile") == 0)
- x264_profile_opts_set(ud->builder, "h264Profile");
- else if (strcmp(name, "h264Level") == 0)
- x264_level_opts_set(ud->builder, "h264Level");
- else
- generic_opts_set(ud->builder, name, find_combo_table(name));
- }
- if (handler_id > 0)
- {
- g_signal_handler_unblock ((gpointer)combo, handler_id);
- }
-}
-
+ signal_user_data_t *ud,
+ const gchar *name,
+ gint user_data,
+ gboolean all)
+{
+ GtkComboBox *combo = NULL;
+ gint signal_id;
+ gint handler_id = 0;
+
+ if (name != NULL)
+ {
+ g_debug("ghb_update_ui_combo_box() %s\n", name);
+ // Clearing a combo box causes a rash of "changed" events, even when
+ // the active item is -1 (inactive). To control things, I'm disabling
+ // the event till things are settled down.
+ combo = GTK_COMBO_BOX(GHB_WIDGET(ud->builder, name));
+ signal_id = g_signal_lookup("changed", GTK_TYPE_COMBO_BOX);
+ if (signal_id > 0)
+ {
+ // Valid signal id found. This should always succeed.
+ handler_id = g_signal_handler_find ((gpointer)combo, G_SIGNAL_MATCH_ID,
+ signal_id, 0, 0, 0, 0);
+ if (handler_id > 0)
+ {
+ // This should also always succeed
+ g_signal_handler_block ((gpointer)combo, handler_id);
+ }
+ }
+ }
+ if (all)
+ {
+ audio_bitrate_opts_set(ud->builder, "AudioBitrate");
+ audio_samplerate_opts_set(ud->builder, "AudioSamplerate", hb_audio_rates, hb_audio_rates_count);
+ video_rate_opts_set(ud->builder, "VideoFramerate", hb_video_rates, hb_video_rates_count);
+ mix_opts_set(ud->builder, "AudioMixdown");
+ hb_encoder_opts_set(ud->builder, "VideoEncoder", hb_video_encoders, hb_video_encoders_count);
+ hb_encoder_opts_set(ud->builder, "AudioEncoder", hb_audio_encoders, hb_audio_encoders_count);
+ acodec_fallback_opts_set(ud->builder, "AudioEncoderFallback");
+ language_opts_set(ud->builder, "SrtLanguage");
+ language_opts_set(ud->builder, "PreferredLanguage");
+ srt_codeset_opts_set(ud->builder, "SrtCodeset");
+ title_opts_set(ud->builder, "title");
+ audio_track_opts_set(ud->builder, "AudioTrack", user_data);
+ subtitle_track_opts_set(ud->builder, "SubtitleTrack", user_data);
+ generic_opts_set(ud->builder, "VideoQualityGranularity", &vqual_granularity_opts);
+ generic_opts_set(ud->builder, "PtoPType", &point_to_point_opts);
+ generic_opts_set(ud->builder, "WhenComplete", &when_complete_opts);
+ generic_opts_set(ud->builder, "PicturePAR", &par_opts);
+ generic_opts_set(ud->builder, "PictureModulus", &alignment_opts);
+ generic_opts_set(ud->builder, "LoggingLevel", &logging_opts);
+ generic_opts_set(ud->builder, "LogLongevity", &log_longevity_opts);
+ generic_opts_set(ud->builder, "check_updates", &appcast_update_opts);
+ generic_opts_set(ud->builder, "FileFormat", &container_opts);
+ generic_opts_set(ud->builder, "PictureDeinterlace", &deint_opts);
+ generic_opts_set(ud->builder, "PictureDetelecine", &detel_opts);
+ generic_opts_set(ud->builder, "PictureDecomb", &decomb_opts);
+ generic_opts_set(ud->builder, "PictureDenoise", &denoise_opts);
+ small_opts_set(ud->builder, "x264_direct", &direct_opts);
+ small_opts_set(ud->builder, "x264_b_adapt", &badapt_opts);
+ small_opts_set(ud->builder, "x264_bpyramid", &bpyramid_opts);
+ small_opts_set(ud->builder, "x264_weighted_pframes", &weightp_opts);
+ small_opts_set(ud->builder, "x264_me", &me_opts);
+ small_opts_set(ud->builder, "x264_subme", &subme_opts);
+ small_opts_set(ud->builder, "x264_analyse", &analyse_opts);
+ small_opts_set(ud->builder, "x264_trellis", &trellis_opts);
+ x264_tune_opts_set(ud->builder, "x264Tune");
+ x264_profile_opts_set(ud->builder, "h264Profile");
+ x264_level_opts_set(ud->builder, "h264Level");
+ }
+ else
+ {
+ if (strcmp(name, "AudioBitrate") == 0)
+ audio_bitrate_opts_set(ud->builder, "AudioBitrate");
+ else if (strcmp(name, "AudioSamplerate") == 0)
+ audio_samplerate_opts_set(ud->builder, "AudioSamplerate", hb_audio_rates, hb_audio_rates_count);
+ else if (strcmp(name, "VideoFramerate") == 0)
+ video_rate_opts_set(ud->builder, "VideoFramerate", hb_video_rates, hb_video_rates_count);
+ else if (strcmp(name, "AudioMixdown") == 0)
+ mix_opts_set(ud->builder, "AudioMixdown");
+ else if (strcmp(name, "VideoEncoder") == 0)
+ hb_encoder_opts_set(ud->builder, "VideoEncoder", hb_video_encoders, hb_video_encoders_count);
+ else if (strcmp(name, "AudioEncoder") == 0)
+ hb_encoder_opts_set(ud->builder, "AudioEncoder", hb_audio_encoders, hb_audio_encoders_count);
+ else if (strcmp(name, "AudioEncoderFallback") == 0)
+ acodec_fallback_opts_set(ud->builder, "AudioEncoderFallback");
+ else if (strcmp(name, "SrtLanguage") == 0)
+ language_opts_set(ud->builder, "SrtLanguage");
+ else if (strcmp(name, "PreferredLanguage") == 0)
+ language_opts_set(ud->builder, "PreferredLanguage");
+ else if (strcmp(name, "SrtCodeset") == 0)
+ srt_codeset_opts_set(ud->builder, "SrtCodeset");
+ else if (strcmp(name, "title") == 0)
+ title_opts_set(ud->builder, "title");
+ else if (strcmp(name, "SubtitleTrack") == 0)
+ subtitle_track_opts_set(ud->builder, "SubtitleTrack", user_data);
+ else if (strcmp(name, "AudioTrack") == 0)
+ audio_track_opts_set(ud->builder, "AudioTrack", user_data);
+ else if (strcmp(name, "x264Tune") == 0)
+ x264_tune_opts_set(ud->builder, "x264Tune");
+ else if (strcmp(name, "h264Profile") == 0)
+ x264_profile_opts_set(ud->builder, "h264Profile");
+ else if (strcmp(name, "h264Level") == 0)
+ x264_level_opts_set(ud->builder, "h264Level");
+ else
+ generic_opts_set(ud->builder, name, find_combo_table(name));
+ }
+ if (handler_id > 0)
+ {
+ g_signal_handler_unblock ((gpointer)combo, handler_id);
+ }
+}
+
static void
init_ui_combo_boxes(GtkBuilder *builder)
{
- gint ii;
-
- init_combo_box(builder, "AudioBitrate");
- init_combo_box(builder, "AudioSamplerate");
- init_combo_box(builder, "VideoFramerate");
- init_combo_box(builder, "AudioMixdown");
- init_combo_box(builder, "SrtLanguage");
- init_combo_box(builder, "PreferredLanguage");
- init_combo_box(builder, "SrtCodeset");
- init_combo_box(builder, "title");
- init_combo_box(builder, "AudioTrack");
- init_combo_box(builder, "VideoEncoder");
- init_combo_box(builder, "AudioEncoder");
- init_combo_box(builder, "AudioEncoderFallback");
- init_combo_box(builder, "x264Tune");
- init_combo_box(builder, "h264Profile");
- init_combo_box(builder, "h264Level");
- for (ii = 0; combo_name_map[ii].name != NULL; ii++)
- {
- init_combo_box(builder, combo_name_map[ii].name);
- }
+ gint ii;
+
+ init_combo_box(builder, "AudioBitrate");
+ init_combo_box(builder, "AudioSamplerate");
+ init_combo_box(builder, "VideoFramerate");
+ init_combo_box(builder, "AudioMixdown");
+ init_combo_box(builder, "SrtLanguage");
+ init_combo_box(builder, "PreferredLanguage");
+ init_combo_box(builder, "SrtCodeset");
+ init_combo_box(builder, "title");
+ init_combo_box(builder, "AudioTrack");
+ init_combo_box(builder, "VideoEncoder");
+ init_combo_box(builder, "AudioEncoder");
+ init_combo_box(builder, "AudioEncoderFallback");
+ init_combo_box(builder, "x264Tune");
+ init_combo_box(builder, "h264Profile");
+ init_combo_box(builder, "h264Level");
+ for (ii = 0; combo_name_map[ii].name != NULL; ii++)
+ {
+ init_combo_box(builder, combo_name_map[ii].name);
+ }
}
// Construct the advanced options string
@@ -3104,46 +3104,46 @@ init_ui_combo_boxes(GtkBuilder *builder)
gchar*
ghb_build_advanced_opts_string(GValue *settings)
{
- gchar *result;
-
- gint vcodec = ghb_settings_combo_int(settings, "VideoEncoder");
-
- switch (vcodec)
- {
- case HB_VCODEC_X264:
- {
- gchar *opts = ghb_settings_get_string(settings, "x264Option");
- if (opts != NULL)
- {
- result = opts;
- }
- else
- {
- result = g_strdup("");
- }
- } break;
-
- case HB_VCODEC_FFMPEG_MPEG2:
- case HB_VCODEC_FFMPEG_MPEG4:
- {
- gchar *opts = ghb_settings_get_string(settings, "lavcOption");
- if (opts != NULL)
- {
- result = opts;
- }
- else
- {
- result = g_strdup("");
- }
- } break;
-
- case HB_VCODEC_THEORA:
- default:
- {
- result = g_strdup("");
- } break;
- }
- return result;
+ gchar *result;
+
+ gint vcodec = ghb_settings_combo_int(settings, "VideoEncoder");
+
+ switch (vcodec)
+ {
+ case HB_VCODEC_X264:
+ {
+ gchar *opts = ghb_settings_get_string(settings, "x264Option");
+ if (opts != NULL)
+ {
+ result = opts;
+ }
+ else
+ {
+ result = g_strdup("");
+ }
+ } break;
+
+ case HB_VCODEC_FFMPEG_MPEG2:
+ case HB_VCODEC_FFMPEG_MPEG4:
+ {
+ gchar *opts = ghb_settings_get_string(settings, "lavcOption");
+ if (opts != NULL)
+ {
+ result = opts;
+ }
+ else
+ {
+ result = g_strdup("");
+ }
+ } break;
+
+ case HB_VCODEC_THEORA:
+ default:
+ {
+ result = g_strdup("");
+ } break;
+ }
+ return result;
}
void ghb_set_video_encoder_opts(hb_job_t *job, GValue *js)
@@ -3224,248 +3224,248 @@ void ghb_set_video_encoder_opts(hb_job_t *job, GValue *js)
void
ghb_part_duration(gint tt, gint sc, gint ec, gint *hh, gint *mm, gint *ss)
{
- hb_title_t * title;
- hb_chapter_t * chapter;
- gint count, c;
- gint64 duration;
-
- *hh = *mm = *ss = 0;
- title = ghb_get_title_info( tt );
- if (title == NULL) return;
+ hb_title_t * title;
+ hb_chapter_t * chapter;
+ gint count, c;
+ gint64 duration;
+
+ *hh = *mm = *ss = 0;
+ title = ghb_get_title_info( tt );
+ if (title == NULL) return;
- *hh = title->hours;
- *mm = title->minutes;
- *ss = title->seconds;
+ *hh = title->hours;
+ *mm = title->minutes;
+ *ss = title->seconds;
- count = hb_list_count(title->list_chapter);
- if (sc > count) sc = count;
- if (ec > count) ec = count;
+ count = hb_list_count(title->list_chapter);
+ if (sc > count) sc = count;
+ if (ec > count) ec = count;
- if (sc == 1 && ec == count)
- return;
+ if (sc == 1 && ec == count)
+ return;
- duration = 0;
- for (c = sc; c <= ec; c++)
- {
- chapter = hb_list_item(title->list_chapter, c-1);
- duration += chapter->duration;
- }
+ duration = 0;
+ for (c = sc; c <= ec; c++)
+ {
+ chapter = hb_list_item(title->list_chapter, c-1);
+ duration += chapter->duration;
+ }
- *hh = duration / 90000 / 3600;
- *mm = ((duration / 90000) % 3600) / 60;
- *ss = (duration / 90000) % 60;
+ *hh = duration / 90000 / 3600;
+ *mm = ((duration / 90000) % 3600) / 60;
+ *ss = (duration / 90000) % 60;
}
void
ghb_get_chapter_duration(gint ti, gint ii, gint *hh, gint *mm, gint *ss)
{
- hb_title_t * title;
- hb_chapter_t * chapter;
- gint count;
-
- g_debug("ghb_get_chapter_duration (title = %d)\n", ti);
- *hh = *mm = *ss = 0;
- title = ghb_get_title_info( ti );
- if (title == NULL) return;
- count = hb_list_count( title->list_chapter );
- if (ii >= count) return;
- chapter = hb_list_item(title->list_chapter, ii);
- if (chapter == NULL) return;
- *hh = chapter->hours;
- *mm = chapter->minutes;
- *ss = chapter->seconds;
+ hb_title_t * title;
+ hb_chapter_t * chapter;
+ gint count;
+
+ g_debug("ghb_get_chapter_duration (title = %d)\n", ti);
+ *hh = *mm = *ss = 0;
+ title = ghb_get_title_info( ti );
+ if (title == NULL) return;
+ count = hb_list_count( title->list_chapter );
+ if (ii >= count) return;
+ chapter = hb_list_item(title->list_chapter, ii);
+ if (chapter == NULL) return;
+ *hh = chapter->hours;
+ *mm = chapter->minutes;
+ *ss = chapter->seconds;
}
GValue*
ghb_get_chapters(gint titleindex)
{
- hb_title_t * title;
- hb_chapter_t * chapter;
- gint count, ii;
- GValue *chapters = NULL;
-
- g_debug("ghb_get_chapters (title = %d)\n", titleindex);
- chapters = ghb_array_value_new(0);
-
- title = ghb_get_title_info( titleindex );
- if (title == NULL) return chapters;
- count = hb_list_count( title->list_chapter );
- for (ii = 0; ii < count; ii++)
- {
- chapter = hb_list_item(title->list_chapter, ii);
- if (chapter == NULL) break;
- if (chapter->title == NULL || chapter->title[0] == 0)
- {
- gchar *str;
- str = g_strdup_printf ("Chapter %2d", ii+1);
- ghb_array_append(chapters, ghb_string_value_new(str));
- g_free(str);
- }
- else
- {
- ghb_array_append(chapters, ghb_string_value_new(chapter->title));
- }
- }
- return chapters;
+ hb_title_t * title;
+ hb_chapter_t * chapter;
+ gint count, ii;
+ GValue *chapters = NULL;
+
+ g_debug("ghb_get_chapters (title = %d)\n", titleindex);
+ chapters = ghb_array_value_new(0);
+
+ title = ghb_get_title_info( titleindex );
+ if (title == NULL) return chapters;
+ count = hb_list_count( title->list_chapter );
+ for (ii = 0; ii < count; ii++)
+ {
+ chapter = hb_list_item(title->list_chapter, ii);
+ if (chapter == NULL) break;
+ if (chapter->title == NULL || chapter->title[0] == 0)
+ {
+ gchar *str;
+ str = g_strdup_printf ("Chapter %2d", ii+1);
+ ghb_array_append(chapters, ghb_string_value_new(str));
+ g_free(str);
+ }
+ else
+ {
+ ghb_array_append(chapters, ghb_string_value_new(chapter->title));
+ }
+ }
+ return chapters;
}
gboolean
ghb_ac3_in_audio_list(const GValue *audio_list)
{
- gint count, ii;
+ gint count, ii;
- count = ghb_array_len(audio_list);
- for (ii = 0; ii < count; ii++)
- {
- GValue *asettings;
- gint acodec;
+ count = ghb_array_len(audio_list);
+ for (ii = 0; ii < count; ii++)
+ {
+ GValue *asettings;
+ gint acodec;
- asettings = ghb_array_get_nth(audio_list, ii);
- acodec = ghb_settings_combo_int(asettings, "AudioEncoder");
- if (acodec & HB_ACODEC_AC3)
- return TRUE;
- }
- return FALSE;
+ asettings = ghb_array_get_nth(audio_list, ii);
+ acodec = ghb_settings_combo_int(asettings, "AudioEncoder");
+ if (acodec & HB_ACODEC_AC3)
+ return TRUE;
+ }
+ return FALSE;
}
static void
audio_bitrate_opts_add(GtkBuilder *builder, const gchar *name, gint rate)
{
- GtkTreeIter iter;
- GtkListStore *store;
- gchar *str;
-
- g_debug("audio_bitrate_opts_add ()\n");
-
- if (rate >= 0 && rate < 8) return;
-
- if (ghb_audio_bitrates[hb_audio_bitrates_count].string)
- {
- g_free(ghb_audio_bitrates[hb_audio_bitrates_count].string);
- }
- ghb_audio_bitrates[hb_audio_bitrates_count].rate = rate;
- if (rate < 0)
- {
- ghb_audio_bitrates[hb_audio_bitrates_count].string =
- g_strdup_printf("N/A");
- }
- else
- {
- ghb_audio_bitrates[hb_audio_bitrates_count].string =
- g_strdup_printf("%d", rate);
- }
- ghb_audio_bitrates_count = hb_audio_bitrates_count + 1;
-
- store = get_combo_box_store(builder, name);
- if (!find_combo_item_by_int(GTK_TREE_MODEL(store), rate, &iter))
- {
- str = g_strdup_printf ("<small>%s</small>",
- ghb_audio_bitrates[hb_audio_bitrates_count].string);
- gtk_list_store_append(store, &iter);
- gtk_list_store_set(store, &iter,
- 0, str,
- 1, TRUE,
- 2, ghb_audio_bitrates[hb_audio_bitrates_count].string,
- 3, (gdouble)rate,
- 4, ghb_audio_bitrates[hb_audio_bitrates_count].string,
- -1);
- g_free(str);
- }
+ GtkTreeIter iter;
+ GtkListStore *store;
+ gchar *str;
+
+ g_debug("audio_bitrate_opts_add ()\n");
+
+ if (rate >= 0 && rate < 8) return;
+
+ if (ghb_audio_bitrates[hb_audio_bitrates_count].string)
+ {
+ g_free(ghb_audio_bitrates[hb_audio_bitrates_count].string);
+ }
+ ghb_audio_bitrates[hb_audio_bitrates_count].rate = rate;
+ if (rate < 0)
+ {
+ ghb_audio_bitrates[hb_audio_bitrates_count].string =
+ g_strdup_printf("N/A");
+ }
+ else
+ {
+ ghb_audio_bitrates[hb_audio_bitrates_count].string =
+ g_strdup_printf("%d", rate);
+ }
+ ghb_audio_bitrates_count = hb_audio_bitrates_count + 1;
+
+ store = get_combo_box_store(builder, name);
+ if (!find_combo_item_by_int(GTK_TREE_MODEL(store), rate, &iter))
+ {
+ str = g_strdup_printf ("<small>%s</small>",
+ ghb_audio_bitrates[hb_audio_bitrates_count].string);
+ gtk_list_store_append(store, &iter);
+ gtk_list_store_set(store, &iter,
+ 0, str,
+ 1, TRUE,
+ 2, ghb_audio_bitrates[hb_audio_bitrates_count].string,
+ 3, (gdouble)rate,
+ 4, ghb_audio_bitrates[hb_audio_bitrates_count].string,
+ -1);
+ g_free(str);
+ }
}
static void
audio_bitrate_opts_update(
- GtkBuilder *builder,
- const gchar *name,
- gint first_rate,
- gint last_rate,
- gint extra_rate)
-{
- GtkTreeIter iter;
- GtkListStore *store;
- gdouble ivalue;
- gboolean done = FALSE;
- gint ii = 0;
- guint last = (guint)last_rate;
- guint first = (guint)first_rate;
-
- ghb_audio_bitrates_count = hb_audio_bitrates_count;
-
- g_debug("audio_bitrate_opts_clean ()\n");
- store = get_combo_box_store(builder, name);
- if (gtk_tree_model_get_iter_first (GTK_TREE_MODEL(store), &iter))
- {
- do
- {
- gtk_tree_model_get(GTK_TREE_MODEL(store), &iter, 3, &ivalue, -1);
- if (ivalue != first_rate && ivalue != last_rate &&
- !(ivalue == extra_rate && extra_rate >= first_rate) &&
- search_rates(
- ghb_audio_bitrates, ivalue, ghb_audio_bitrates_count) < 0)
- {
- done = !gtk_list_store_remove(store, &iter);
- }
- else if ((int)ivalue < first || (int)ivalue > last)
- {
- ii++;
- gtk_list_store_set(store, &iter, 1, FALSE, -1);
- done = !gtk_tree_model_iter_next (GTK_TREE_MODEL(store), &iter);
- }
- else
- {
- ii++;
- gtk_list_store_set(store, &iter, 1, TRUE, -1);
- done = !gtk_tree_model_iter_next (GTK_TREE_MODEL(store), &iter);
- }
- } while (!done);
- }
- if (extra_rate >= first_rate)
- audio_bitrate_opts_add(builder, name, extra_rate);
+ GtkBuilder *builder,
+ const gchar *name,
+ gint first_rate,
+ gint last_rate,
+ gint extra_rate)
+{
+ GtkTreeIter iter;
+ GtkListStore *store;
+ gdouble ivalue;
+ gboolean done = FALSE;
+ gint ii = 0;
+ guint last = (guint)last_rate;
+ guint first = (guint)first_rate;
+
+ ghb_audio_bitrates_count = hb_audio_bitrates_count;
+
+ g_debug("audio_bitrate_opts_clean ()\n");
+ store = get_combo_box_store(builder, name);
+ if (gtk_tree_model_get_iter_first (GTK_TREE_MODEL(store), &iter))
+ {
+ do
+ {
+ gtk_tree_model_get(GTK_TREE_MODEL(store), &iter, 3, &ivalue, -1);
+ if (ivalue != first_rate && ivalue != last_rate &&
+ !(ivalue == extra_rate && extra_rate >= first_rate) &&
+ search_rates(
+ ghb_audio_bitrates, ivalue, ghb_audio_bitrates_count) < 0)
+ {
+ done = !gtk_list_store_remove(store, &iter);
+ }
+ else if ((int)ivalue < first || (int)ivalue > last)
+ {
+ ii++;
+ gtk_list_store_set(store, &iter, 1, FALSE, -1);
+ done = !gtk_tree_model_iter_next (GTK_TREE_MODEL(store), &iter);
+ }
+ else
+ {
+ ii++;
+ gtk_list_store_set(store, &iter, 1, TRUE, -1);
+ done = !gtk_tree_model_iter_next (GTK_TREE_MODEL(store), &iter);
+ }
+ } while (!done);
+ }
+ if (extra_rate >= first_rate)
+ audio_bitrate_opts_add(builder, name, extra_rate);
}
static void
audio_bitrate_opts_set(GtkBuilder *builder, const gchar *name)
{
- GtkTreeIter iter;
- GtkListStore *store;
- gint ii;
- gchar *str;
-
- ghb_audio_bitrates_count = hb_audio_bitrates_count;
- ghb_audio_bitrates = calloc(hb_audio_bitrates_count+1, sizeof(hb_rate_t));
-
- for (ii = 0; ii < hb_audio_bitrates_count; ii++)
- {
- ghb_audio_bitrates[ii] = hb_audio_bitrates[ii];
- }
-
- g_debug("audio_bitrate_opts_set ()\n");
- store = get_combo_box_store(builder, name);
- gtk_list_store_clear(store);
- for (ii = 0; ii < ghb_audio_bitrates_count; ii++)
- {
- gtk_list_store_append(store, &iter);
- str = g_strdup_printf ("<small>%s</small>",
- ghb_audio_bitrates[ii].string);
- gtk_list_store_set(store, &iter,
- 0, str,
- 1, TRUE,
- 2, ghb_audio_bitrates[ii].string,
- 3, (gdouble)ghb_audio_bitrates[ii].rate,
- 4, ghb_audio_bitrates[ii].string,
- -1);
- g_free(str);
- }
+ GtkTreeIter iter;
+ GtkListStore *store;
+ gint ii;
+ gchar *str;
+
+ ghb_audio_bitrates_count = hb_audio_bitrates_count;
+ ghb_audio_bitrates = calloc(hb_audio_bitrates_count+1, sizeof(hb_rate_t));
+
+ for (ii = 0; ii < hb_audio_bitrates_count; ii++)
+ {
+ ghb_audio_bitrates[ii] = hb_audio_bitrates[ii];
+ }
+
+ g_debug("audio_bitrate_opts_set ()\n");
+ store = get_combo_box_store(builder, name);
+ gtk_list_store_clear(store);
+ for (ii = 0; ii < ghb_audio_bitrates_count; ii++)
+ {
+ gtk_list_store_append(store, &iter);
+ str = g_strdup_printf ("<small>%s</small>",
+ ghb_audio_bitrates[ii].string);
+ gtk_list_store_set(store, &iter,
+ 0, str,
+ 1, TRUE,
+ 2, ghb_audio_bitrates[ii].string,
+ 3, (gdouble)ghb_audio_bitrates[ii].rate,
+ 4, ghb_audio_bitrates[ii].string,
+ -1);
+ g_free(str);
+ }
}
void
ghb_set_bitrate_opts(
- GtkBuilder *builder,
- gint first_rate,
- gint last_rate,
- gint extra_rate)
+ GtkBuilder *builder,
+ gint first_rate,
+ gint last_rate,
+ gint extra_rate)
{
- audio_bitrate_opts_update(builder, "AudioBitrate", first_rate, last_rate, extra_rate);
+ audio_bitrate_opts_update(builder, "AudioBitrate", first_rate, last_rate, extra_rate);
}
static ghb_status_t hb_status;
@@ -3473,10 +3473,10 @@ static ghb_status_t hb_status;
void
ghb_combo_init(signal_user_data_t *ud)
{
- // Set up the list model for the combos
- init_ui_combo_boxes(ud->builder);
- // Populate all the combos
- ghb_update_ui_combo_box(ud, NULL, 0, TRUE);
+ // Set up the list model for the combos
+ init_ui_combo_boxes(ud->builder);
+ // Populate all the combos
+ ghb_update_ui_combo_box(ud, NULL, 0, TRUE);
}
void
@@ -3490,9 +3490,9 @@ ghb_backend_init(gint debug)
void
ghb_backend_close()
{
- hb_close(&h_queue);
- hb_close(&h_scan);
- hb_global_close();
+ hb_close(&h_queue);
+ hb_close(&h_scan);
+ hb_global_close();
}
void ghb_backend_scan_stop()
@@ -3504,61 +3504,61 @@ void
ghb_backend_scan(const gchar *path, gint titleindex, gint preview_count, uint64_t min_duration)
{
hb_scan( h_scan, path, titleindex, preview_count, 1, min_duration );
- hb_status.scan.state |= GHB_STATE_SCANNING;
- // initialize count and cur to something that won't cause FPE
- // when computing progress
- hb_status.scan.title_count = 1;
- hb_status.scan.title_cur = 0;
+ hb_status.scan.state |= GHB_STATE_SCANNING;
+ // initialize count and cur to something that won't cause FPE
+ // when computing progress
+ hb_status.scan.title_count = 1;
+ hb_status.scan.title_cur = 0;
}
void
ghb_backend_queue_scan(const gchar *path, gint titlenum)
{
- g_debug("ghb_backend_queue_scan()");
- hb_scan( h_queue, path, titlenum, 10, 0, 0 );
- hb_status.queue.state |= GHB_STATE_SCANNING;
+ g_debug("ghb_backend_queue_scan()");
+ hb_scan( h_queue, path, titlenum, 10, 0, 0 );
+ hb_status.queue.state |= GHB_STATE_SCANNING;
}
gint
ghb_get_scan_state()
{
- return hb_status.scan.state;
+ return hb_status.scan.state;
}
gint
ghb_get_queue_state()
{
- return hb_status.queue.state;
+ return hb_status.queue.state;
}
void
ghb_clear_scan_state(gint state)
{
- hb_status.scan.state &= ~state;
+ hb_status.scan.state &= ~state;
}
void
ghb_clear_queue_state(gint state)
{
- hb_status.queue.state &= ~state;
+ hb_status.queue.state &= ~state;
}
void
ghb_set_scan_state(gint state)
{
- hb_status.scan.state |= state;
+ hb_status.scan.state |= state;
}
void
ghb_set_queue_state(gint state)
{
- hb_status.queue.state |= state;
+ hb_status.queue.state |= state;
}
void
ghb_get_status(ghb_status_t *status)
{
- memcpy(status, &hb_status, sizeof(ghb_status_t));
+ memcpy(status, &hb_status, sizeof(ghb_status_t));
}
void
@@ -3567,170 +3567,170 @@ ghb_track_status()
hb_state_t s_scan;
hb_state_t s_queue;
- if (h_scan == NULL) return;
+ if (h_scan == NULL) return;
hb_get_state( h_scan, &s_scan );
- switch( s_scan.state )
+ switch( s_scan.state )
{
#define p s_scan.param.scanning
case HB_STATE_SCANNING:
- {
- hb_status.scan.state |= GHB_STATE_SCANNING;
- hb_status.scan.title_count = p.title_count;
- hb_status.scan.title_cur = p.title_cur;
- } break;
+ {
+ hb_status.scan.state |= GHB_STATE_SCANNING;
+ hb_status.scan.title_count = p.title_count;
+ hb_status.scan.title_cur = p.title_cur;
+ } break;
#undef p
case HB_STATE_SCANDONE:
{
- hb_status.scan.state &= ~GHB_STATE_SCANNING;
- hb_status.scan.state |= GHB_STATE_SCANDONE;
+ hb_status.scan.state &= ~GHB_STATE_SCANNING;
+ hb_status.scan.state |= GHB_STATE_SCANDONE;
} break;
#define p s_scan.param.working
case HB_STATE_WORKING:
- hb_status.scan.state |= GHB_STATE_WORKING;
- hb_status.scan.state &= ~GHB_STATE_PAUSED;
- hb_status.scan.job_cur = p.job_cur;
- hb_status.scan.job_count = p.job_count;
- hb_status.scan.progress = p.progress;
- hb_status.scan.rate_cur = p.rate_cur;
- hb_status.scan.rate_avg = p.rate_avg;
- hb_status.scan.hours = p.hours;
- hb_status.scan.minutes = p.minutes;
- hb_status.scan.seconds = p.seconds;
- hb_status.scan.unique_id = p.sequence_id & 0xFFFFFF;
+ hb_status.scan.state |= GHB_STATE_WORKING;
+ hb_status.scan.state &= ~GHB_STATE_PAUSED;
+ hb_status.scan.job_cur = p.job_cur;
+ hb_status.scan.job_count = p.job_count;
+ hb_status.scan.progress = p.progress;
+ hb_status.scan.rate_cur = p.rate_cur;
+ hb_status.scan.rate_avg = p.rate_avg;
+ hb_status.scan.hours = p.hours;
+ hb_status.scan.minutes = p.minutes;
+ hb_status.scan.seconds = p.seconds;
+ hb_status.scan.unique_id = p.sequence_id & 0xFFFFFF;
break;
#undef p
case HB_STATE_PAUSED:
- hb_status.scan.state |= GHB_STATE_PAUSED;
+ hb_status.scan.state |= GHB_STATE_PAUSED;
break;
-
+
case HB_STATE_MUXING:
{
- hb_status.scan.state |= GHB_STATE_MUXING;
+ hb_status.scan.state |= GHB_STATE_MUXING;
} break;
#define p s_scan.param.workdone
case HB_STATE_WORKDONE:
- {
+ {
hb_job_t *job;
- hb_status.scan.state |= GHB_STATE_WORKDONE;
- hb_status.scan.state &= ~GHB_STATE_MUXING;
- hb_status.scan.state &= ~GHB_STATE_PAUSED;
- hb_status.scan.state &= ~GHB_STATE_WORKING;
- switch (p.error)
- {
- case HB_ERROR_NONE:
- hb_status.scan.error = GHB_ERROR_NONE;
- break;
- case HB_ERROR_CANCELED:
- hb_status.scan.error = GHB_ERROR_CANCELED;
- break;
- default:
- hb_status.scan.error = GHB_ERROR_FAIL;
- break;
- }
- // Delete all remaining jobs of this encode.
- // An encode can be composed of multiple associated jobs.
- // When a job is stopped, libhb removes it from the job list,
- // but does not remove other jobs that may be associated with it.
- // Associated jobs are taged in the sequence id.
+ hb_status.scan.state |= GHB_STATE_WORKDONE;
+ hb_status.scan.state &= ~GHB_STATE_MUXING;
+ hb_status.scan.state &= ~GHB_STATE_PAUSED;
+ hb_status.scan.state &= ~GHB_STATE_WORKING;
+ switch (p.error)
+ {
+ case HB_ERROR_NONE:
+ hb_status.scan.error = GHB_ERROR_NONE;
+ break;
+ case HB_ERROR_CANCELED:
+ hb_status.scan.error = GHB_ERROR_CANCELED;
+ break;
+ default:
+ hb_status.scan.error = GHB_ERROR_FAIL;
+ break;
+ }
+ // Delete all remaining jobs of this encode.
+ // An encode can be composed of multiple associated jobs.
+ // When a job is stopped, libhb removes it from the job list,
+ // but does not remove other jobs that may be associated with it.
+ // Associated jobs are taged in the sequence id.
while ((job = hb_job(h_scan, 0)) != NULL)
hb_rem( h_scan, job );
- } break;
+ } break;
#undef p
}
hb_get_state( h_queue, &s_queue );
- switch( s_queue.state )
+ switch( s_queue.state )
{
#define p s_queue.param.scanning
case HB_STATE_SCANNING:
- {
- hb_status.queue.state |= GHB_STATE_SCANNING;
- hb_status.queue.title_count = p.title_count;
- hb_status.queue.title_cur = p.title_cur;
- } break;
+ {
+ hb_status.queue.state |= GHB_STATE_SCANNING;
+ hb_status.queue.title_count = p.title_count;
+ hb_status.queue.title_cur = p.title_cur;
+ } break;
#undef p
case HB_STATE_SCANDONE:
{
- hb_status.queue.state &= ~GHB_STATE_SCANNING;
- hb_status.queue.state |= GHB_STATE_SCANDONE;
+ hb_status.queue.state &= ~GHB_STATE_SCANNING;
+ hb_status.queue.state |= GHB_STATE_SCANDONE;
} break;
#define p s_queue.param.working
case HB_STATE_WORKING:
- hb_status.queue.state |= GHB_STATE_WORKING;
- hb_status.queue.state &= ~GHB_STATE_PAUSED;
- hb_status.queue.state &= ~GHB_STATE_SEARCHING;
- hb_status.queue.job_cur = p.job_cur;
- hb_status.queue.job_count = p.job_count;
- hb_status.queue.progress = p.progress;
- hb_status.queue.rate_cur = p.rate_cur;
- hb_status.queue.rate_avg = p.rate_avg;
- hb_status.queue.hours = p.hours;
- hb_status.queue.minutes = p.minutes;
- hb_status.queue.seconds = p.seconds;
- hb_status.queue.unique_id = p.sequence_id & 0xFFFFFF;
+ hb_status.queue.state |= GHB_STATE_WORKING;
+ hb_status.queue.state &= ~GHB_STATE_PAUSED;
+ hb_status.queue.state &= ~GHB_STATE_SEARCHING;
+ hb_status.queue.job_cur = p.job_cur;
+ hb_status.queue.job_count = p.job_count;
+ hb_status.queue.progress = p.progress;
+ hb_status.queue.rate_cur = p.rate_cur;
+ hb_status.queue.rate_avg = p.rate_avg;
+ hb_status.queue.hours = p.hours;
+ hb_status.queue.minutes = p.minutes;
+ hb_status.queue.seconds = p.seconds;
+ hb_status.queue.unique_id = p.sequence_id & 0xFFFFFF;
break;
case HB_STATE_SEARCHING:
- hb_status.queue.state |= GHB_STATE_SEARCHING;
- hb_status.queue.state &= ~GHB_STATE_WORKING;
- hb_status.queue.state &= ~GHB_STATE_PAUSED;
- hb_status.queue.job_cur = p.job_cur;
- hb_status.queue.job_count = p.job_count;
- hb_status.queue.progress = p.progress;
- hb_status.queue.rate_cur = p.rate_cur;
- hb_status.queue.rate_avg = p.rate_avg;
- hb_status.queue.hours = p.hours;
- hb_status.queue.minutes = p.minutes;
- hb_status.queue.seconds = p.seconds;
- hb_status.queue.unique_id = p.sequence_id & 0xFFFFFF;
+ hb_status.queue.state |= GHB_STATE_SEARCHING;
+ hb_status.queue.state &= ~GHB_STATE_WORKING;
+ hb_status.queue.state &= ~GHB_STATE_PAUSED;
+ hb_status.queue.job_cur = p.job_cur;
+ hb_status.queue.job_count = p.job_count;
+ hb_status.queue.progress = p.progress;
+ hb_status.queue.rate_cur = p.rate_cur;
+ hb_status.queue.rate_avg = p.rate_avg;
+ hb_status.queue.hours = p.hours;
+ hb_status.queue.minutes = p.minutes;
+ hb_status.queue.seconds = p.seconds;
+ hb_status.queue.unique_id = p.sequence_id & 0xFFFFFF;
break;
#undef p
case HB_STATE_PAUSED:
- hb_status.queue.state |= GHB_STATE_PAUSED;
+ hb_status.queue.state |= GHB_STATE_PAUSED;
break;
-
+
case HB_STATE_MUXING:
{
- hb_status.queue.state |= GHB_STATE_MUXING;
+ hb_status.queue.state |= GHB_STATE_MUXING;
} break;
#define p s_queue.param.workdone
case HB_STATE_WORKDONE:
- {
+ {
hb_job_t *job;
- hb_status.queue.state |= GHB_STATE_WORKDONE;
- hb_status.queue.state &= ~GHB_STATE_MUXING;
- hb_status.queue.state &= ~GHB_STATE_PAUSED;
- hb_status.queue.state &= ~GHB_STATE_WORKING;
- hb_status.queue.state &= ~GHB_STATE_SEARCHING;
- switch (p.error)
- {
- case HB_ERROR_NONE:
- hb_status.queue.error = GHB_ERROR_NONE;
- break;
- case HB_ERROR_CANCELED:
- hb_status.queue.error = GHB_ERROR_CANCELED;
- break;
- default:
- hb_status.queue.error = GHB_ERROR_FAIL;
- break;
- }
- // Delete all remaining jobs of this encode.
- // An encode can be composed of multiple associated jobs.
- // When a job is stopped, libhb removes it from the job list,
- // but does not remove other jobs that may be associated with it.
- // Associated jobs are taged in the sequence id.
+ hb_status.queue.state |= GHB_STATE_WORKDONE;
+ hb_status.queue.state &= ~GHB_STATE_MUXING;
+ hb_status.queue.state &= ~GHB_STATE_PAUSED;
+ hb_status.queue.state &= ~GHB_STATE_WORKING;
+ hb_status.queue.state &= ~GHB_STATE_SEARCHING;
+ switch (p.error)
+ {
+ case HB_ERROR_NONE:
+ hb_status.queue.error = GHB_ERROR_NONE;
+ break;
+ case HB_ERROR_CANCELED:
+ hb_status.queue.error = GHB_ERROR_CANCELED;
+ break;
+ default:
+ hb_status.queue.error = GHB_ERROR_FAIL;
+ break;
+ }
+ // Delete all remaining jobs of this encode.
+ // An encode can be composed of multiple associated jobs.
+ // When a job is stopped, libhb removes it from the job list,
+ // but does not remove other jobs that may be associated with it.
+ // Associated jobs are taged in the sequence id.
while ((job = hb_job(h_queue, 0)) != NULL)
hb_rem( h_queue, job );
- } break;
+ } break;
#undef p
}
}
@@ -3738,83 +3738,83 @@ ghb_track_status()
hb_title_t *
ghb_get_title_info(gint titleindex)
{
- hb_list_t * list;
+ hb_list_t * list;
- if (h_scan == NULL) return NULL;
- list = hb_get_titles( h_scan );
- if (list == NULL) return NULL;
- return hb_list_item( list, titleindex );
+ if (h_scan == NULL) return NULL;
+ list = hb_get_titles( h_scan );
+ if (list == NULL) return NULL;
+ return hb_list_item( list, titleindex );
}
hb_audio_config_t*
ghb_get_scan_audio_info(gint titleindex, gint audioindex)
{
hb_audio_config_t *aconfig;
-
- aconfig = get_hb_audio(h_scan, titleindex, audioindex);
- return aconfig;
+
+ aconfig = get_hb_audio(h_scan, titleindex, audioindex);
+ return aconfig;
}
gboolean
ghb_audio_is_passthru(gint acodec)
{
- g_debug("ghb_audio_is_passthru () \n");
- return (acodec & HB_ACODEC_PASS_FLAG) != 0;
+ g_debug("ghb_audio_is_passthru () \n");
+ return (acodec & HB_ACODEC_PASS_FLAG) != 0;
}
gboolean
ghb_audio_can_passthru(gint acodec)
{
- g_debug("ghb_audio_can_passthru () \n");
- return (acodec & HB_ACODEC_PASS_MASK) != 0;
+ g_debug("ghb_audio_can_passthru () \n");
+ return (acodec & HB_ACODEC_PASS_MASK) != 0;
}
gint
ghb_get_default_acodec()
{
- return HB_ACODEC_FAAC;
+ return HB_ACODEC_FAAC;
}
static void
picture_settings_deps(signal_user_data_t *ud)
{
- gboolean autoscale, keep_aspect, enable_keep_aspect;
- gboolean enable_scale_width, enable_scale_height;
- gboolean enable_disp_width, enable_disp_height, enable_par;
- gint pic_par;
- GtkWidget *widget;
-
- pic_par = ghb_settings_combo_int(ud->settings, "PicturePAR");
- enable_keep_aspect = (pic_par != 1 && pic_par != 2);
- keep_aspect = ghb_settings_get_boolean(ud->settings, "PictureKeepRatio");
- autoscale = ghb_settings_get_boolean(ud->settings, "autoscale");
-
- enable_scale_width = !autoscale && (pic_par != 1);
- enable_scale_height = !autoscale && (pic_par != 1);
- enable_disp_width = (pic_par == 3) && !keep_aspect;
- enable_par = (pic_par == 3) && !keep_aspect;
- enable_disp_height = FALSE;
-
- widget = GHB_WIDGET(ud->builder, "PictureModulus");
- gtk_widget_set_sensitive(widget, pic_par != 1);
- widget = GHB_WIDGET(ud->builder, "PictureLooseCrop");
- gtk_widget_set_sensitive(widget, pic_par != 1);
- widget = GHB_WIDGET(ud->builder, "scale_width");
- gtk_widget_set_sensitive(widget, enable_scale_width);
- widget = GHB_WIDGET(ud->builder, "scale_height");
- gtk_widget_set_sensitive(widget, enable_scale_height);
- widget = GHB_WIDGET(ud->builder, "PictureDisplayWidth");
- gtk_widget_set_sensitive(widget, enable_disp_width);
- widget = GHB_WIDGET(ud->builder, "PictureDisplayHeight");
- gtk_widget_set_sensitive(widget, enable_disp_height);
- widget = GHB_WIDGET(ud->builder, "PicturePARWidth");
- gtk_widget_set_sensitive(widget, enable_par);
- widget = GHB_WIDGET(ud->builder, "PicturePARHeight");
- gtk_widget_set_sensitive(widget, enable_par);
- widget = GHB_WIDGET(ud->builder, "PictureKeepRatio");
- gtk_widget_set_sensitive(widget, enable_keep_aspect);
- widget = GHB_WIDGET(ud->builder, "autoscale");
- gtk_widget_set_sensitive(widget, pic_par != 1);
+ gboolean autoscale, keep_aspect, enable_keep_aspect;
+ gboolean enable_scale_width, enable_scale_height;
+ gboolean enable_disp_width, enable_disp_height, enable_par;
+ gint pic_par;
+ GtkWidget *widget;
+
+ pic_par = ghb_settings_combo_int(ud->settings, "PicturePAR");
+ enable_keep_aspect = (pic_par != 1 && pic_par != 2);
+ keep_aspect = ghb_settings_get_boolean(ud->settings, "PictureKeepRatio");
+ autoscale = ghb_settings_get_boolean(ud->settings, "autoscale");
+
+ enable_scale_width = !autoscale && (pic_par != 1);
+ enable_scale_height = !autoscale && (pic_par != 1);
+ enable_disp_width = (pic_par == 3) && !keep_aspect;
+ enable_par = (pic_par == 3) && !keep_aspect;
+ enable_disp_height = FALSE;
+
+ widget = GHB_WIDGET(ud->builder, "PictureModulus");
+ gtk_widget_set_sensitive(widget, pic_par != 1);
+ widget = GHB_WIDGET(ud->builder, "PictureLooseCrop");
+ gtk_widget_set_sensitive(widget, pic_par != 1);
+ widget = GHB_WIDGET(ud->builder, "scale_width");
+ gtk_widget_set_sensitive(widget, enable_scale_width);
+ widget = GHB_WIDGET(ud->builder, "scale_height");
+ gtk_widget_set_sensitive(widget, enable_scale_height);
+ widget = GHB_WIDGET(ud->builder, "PictureDisplayWidth");
+ gtk_widget_set_sensitive(widget, enable_disp_width);
+ widget = GHB_WIDGET(ud->builder, "PictureDisplayHeight");
+ gtk_widget_set_sensitive(widget, enable_disp_height);
+ widget = GHB_WIDGET(ud->builder, "PicturePARWidth");
+ gtk_widget_set_sensitive(widget, enable_par);
+ widget = GHB_WIDGET(ud->builder, "PicturePARHeight");
+ gtk_widget_set_sensitive(widget, enable_par);
+ widget = GHB_WIDGET(ud->builder, "PictureKeepRatio");
+ gtk_widget_set_sensitive(widget, enable_keep_aspect);
+ widget = GHB_WIDGET(ud->builder, "autoscale");
+ gtk_widget_set_sensitive(widget, pic_par != 1);
}
void
@@ -3840,1089 +3840,1089 @@ ghb_limit_rational( gint *num, gint *den, gint limit )
void
ghb_set_scale_settings(GValue *settings, gint mode)
{
- hb_title_t * title;
- hb_job_t * job;
- gboolean keep_aspect;
- gint pic_par;
- gboolean autocrop, autoscale, noscale;
- gint crop[4] = {0,};
- gint width, height, par_width, par_height;
- gint crop_width, crop_height;
- gint aspect_n, aspect_d;
- gboolean keep_width = (mode & GHB_PIC_KEEP_WIDTH);
- gboolean keep_height = (mode & GHB_PIC_KEEP_HEIGHT);
- gint mod;
- gint max_width = 0;
- gint max_height = 0;
-
- g_debug("ghb_set_scale ()\n");
-
- pic_par = ghb_settings_combo_int(settings, "PicturePAR");
- if (pic_par == 1)
- {
- ghb_settings_set_boolean(settings, "autoscale", TRUE);
- ghb_settings_set_int(settings, "PictureModulus", 2);
- ghb_settings_set_boolean(settings, "PictureLooseCrop", TRUE);
- }
- if (pic_par == 1 || pic_par == 2)
- {
- ghb_settings_set_boolean(settings, "PictureKeepRatio", TRUE);
- }
-
- gint titleindex;
-
- titleindex = ghb_settings_combo_int(settings, "title");
- title = ghb_get_title_info (titleindex);
- if (title == NULL) return;
-
- job = hb_job_init( title );
- if (job == NULL) return;
-
- // First configure widgets
- mod = ghb_settings_combo_int(settings, "PictureModulus");
- keep_aspect = ghb_settings_get_boolean(settings, "PictureKeepRatio");
- autocrop = ghb_settings_get_boolean(settings, "PictureAutoCrop");
- autoscale = ghb_settings_get_boolean(settings, "autoscale");
- // "Noscale" is a flag that says we prefer to crop extra to satisfy
- // alignment constraints rather than scaling to satisfy them.
- noscale = ghb_settings_get_boolean(settings, "PictureLooseCrop");
- // Align dimensions to either 16 or 2 pixels
- // The scaler crashes if the dimensions are not divisible by 2
- // x264 also will not accept dims that are not multiple of 2
- if (autoscale)
- {
- keep_width = FALSE;
- keep_height = FALSE;
- }
-
- if (autocrop)
- {
- crop[0] = title->crop[0];
- crop[1] = title->crop[1];
- crop[2] = title->crop[2];
- crop[3] = title->crop[3];
- ghb_settings_set_int(settings, "PictureTopCrop", crop[0]);
- ghb_settings_set_int(settings, "PictureBottomCrop", crop[1]);
- ghb_settings_set_int(settings, "PictureLeftCrop", crop[2]);
- ghb_settings_set_int(settings, "PictureRightCrop", crop[3]);
- }
- else
- {
- crop[0] = ghb_settings_get_int(settings, "PictureTopCrop");
- crop[1] = ghb_settings_get_int(settings, "PictureBottomCrop");
- crop[2] = ghb_settings_get_int(settings, "PictureLeftCrop");
- crop[3] = ghb_settings_get_int(settings, "PictureRightCrop");
- }
- if (noscale)
- {
- gint need1, need2;
-
- // Adjust the cropping to accomplish the desired width and height
- crop_width = title->width - crop[2] - crop[3];
- crop_height = title->height - crop[0] - crop[1];
- width = MOD_DOWN(crop_width, mod);
- height = MOD_DOWN(crop_height, mod);
-
- need1 = (crop_height - height) / 2;
- need2 = crop_height - height - need1;
- crop[0] += need1;
- crop[1] += need2;
- need1 = (crop_width - width) / 2;
- need2 = crop_width - width - need1;
- crop[2] += need1;
- crop[3] += need2;
- ghb_settings_set_int(settings, "PictureTopCrop", crop[0]);
- ghb_settings_set_int(settings, "PictureBottomCrop", crop[1]);
- ghb_settings_set_int(settings, "PictureLeftCrop", crop[2]);
- ghb_settings_set_int(settings, "PictureRightCrop", crop[3]);
- }
- hb_reduce(&aspect_n, &aspect_d,
- title->width * title->pixel_aspect_width,
- title->height * title->pixel_aspect_height);
- crop_width = title->width - crop[2] - crop[3];
- crop_height = title->height - crop[0] - crop[1];
- if (autoscale)
- {
- width = crop_width;
- height = crop_height;
- }
- else
- {
- width = ghb_settings_get_int(settings, "scale_width");
- height = ghb_settings_get_int(settings, "scale_height");
- if (mode & GHB_PIC_USE_MAX)
- {
- max_width = MOD_DOWN(
- ghb_settings_get_int(settings, "PictureWidth"), mod);
- max_height = MOD_DOWN(
- ghb_settings_get_int(settings, "PictureHeight"), mod);
- }
- }
- g_debug("max_width %d, max_height %d\n", max_width, max_height);
-
- if (width < 16)
- width = title->width - crop[2] - crop[3];
- if (height < 16)
- height = title->height - crop[0] - crop[1];
-
- width = MOD_ROUND(width, mod);
- height = MOD_ROUND(height, mod);
-
- job->anamorphic.mode = pic_par;
- if (pic_par)
- {
- // The scaler crashes if the dimensions are not divisible by 2
- // Align mod 2. And so does something in x264_encoder_headers()
- job->modulus = mod;
- job->anamorphic.par_width = title->pixel_aspect_width;
- job->anamorphic.par_height = title->pixel_aspect_height;
- job->anamorphic.dar_width = 0;
- job->anamorphic.dar_height = 0;
-
- if (keep_height && pic_par == 2)
- {
- width = ((double)height * crop_width / crop_height);
- width = MOD_ROUND(width, mod);
- }
- job->width = width;
- job->height = height;
- job->maxWidth = max_width;
- job->maxHeight = max_height;
- job->crop[0] = crop[0];
- job->crop[1] = crop[1];
- job->crop[2] = crop[2];
- job->crop[3] = crop[3];
- if (job->anamorphic.mode == 3 && !keep_aspect)
- {
- job->anamorphic.keep_display_aspect = 0;
- if (mode & GHB_PIC_KEEP_PAR)
- {
- job->anamorphic.par_width =
- ghb_settings_get_int(settings, "PicturePARWidth");
- job->anamorphic.par_height =
- ghb_settings_get_int(settings, "PicturePARHeight");
- }
- else
- {
- job->anamorphic.dar_width =
- ghb_settings_get_int(settings, "PictureDisplayWidth");
- job->anamorphic.dar_height = height;
- }
- }
- else
- {
- job->anamorphic.keep_display_aspect = 1;
- }
- // hb_set_anamorphic_size will adjust par, dar, and width/height
- // to conform to job parameters that have been set, including
- // maxWidth and maxHeight
- hb_set_anamorphic_size(job, &width, &height, &par_width, &par_height);
- if (job->anamorphic.mode == 3 && !keep_aspect &&
- mode & GHB_PIC_KEEP_PAR)
- {
- // hb_set_anamorphic_size reduces the par, which we
- // don't want in this case because the user is
- // explicitely specifying it.
- par_width = ghb_settings_get_int(settings, "PicturePARWidth");
- par_height = ghb_settings_get_int(settings, "PicturePARHeight");
- }
- }
- else
- {
- // Adjust dims according to max values
- if (max_height) height = MIN(height, max_height);
- if (max_width) width = MIN(width, max_width);
-
- if (keep_aspect)
- {
- gdouble par;
- gint new_width, new_height;
-
- // Compute pixel aspect ration.
- par = (gdouble)(title->height * aspect_n) / (title->width * aspect_d);
- // Must scale so that par becomes 1:1
- // Try to keep largest dimension
- new_height = (crop_height * ((gdouble)width/crop_width) / par);
- new_width = (crop_width * ((gdouble)height/crop_height) * par);
-
- if (max_width && new_width > max_width)
- {
- height = new_height;
- }
- else if (max_height && new_height > max_height)
- {
- width = new_width;
- }
- else if (keep_width)
- {
- height = new_height;
- }
- else if (keep_height)
- {
- width = new_width;
- }
- else if (width > new_width)
- {
- height = new_height;
- }
- else
- {
- width = new_width;
- }
- g_debug("new w %d h %d\n", width, height);
- }
- width = MOD_ROUND(width, mod);
- height = MOD_ROUND(height, mod);
- if (max_height)
- height = MIN(height, max_height);
- if (max_width)
- width = MIN(width, max_width);
- par_width = par_height = 1;
- }
- ghb_settings_set_int(settings, "scale_width", width);
- ghb_settings_set_int(settings, "scale_height", height);
-
- gint disp_width;
-
- disp_width = ((gdouble)par_width / par_height) * width + 0.5;
+ hb_title_t * title;
+ hb_job_t * job;
+ gboolean keep_aspect;
+ gint pic_par;
+ gboolean autocrop, autoscale, noscale;
+ gint crop[4] = {0,};
+ gint width, height, par_width, par_height;
+ gint crop_width, crop_height;
+ gint aspect_n, aspect_d;
+ gboolean keep_width = (mode & GHB_PIC_KEEP_WIDTH);
+ gboolean keep_height = (mode & GHB_PIC_KEEP_HEIGHT);
+ gint mod;
+ gint max_width = 0;
+ gint max_height = 0;
+
+ g_debug("ghb_set_scale ()\n");
+
+ pic_par = ghb_settings_combo_int(settings, "PicturePAR");
+ if (pic_par == 1)
+ {
+ ghb_settings_set_boolean(settings, "autoscale", TRUE);
+ ghb_settings_set_int(settings, "PictureModulus", 2);
+ ghb_settings_set_boolean(settings, "PictureLooseCrop", TRUE);
+ }
+ if (pic_par == 1 || pic_par == 2)
+ {
+ ghb_settings_set_boolean(settings, "PictureKeepRatio", TRUE);
+ }
+
+ gint titleindex;
+
+ titleindex = ghb_settings_combo_int(settings, "title");
+ title = ghb_get_title_info (titleindex);
+ if (title == NULL) return;
+
+ job = hb_job_init( title );
+ if (job == NULL) return;
+
+ // First configure widgets
+ mod = ghb_settings_combo_int(settings, "PictureModulus");
+ keep_aspect = ghb_settings_get_boolean(settings, "PictureKeepRatio");
+ autocrop = ghb_settings_get_boolean(settings, "PictureAutoCrop");
+ autoscale = ghb_settings_get_boolean(settings, "autoscale");
+ // "Noscale" is a flag that says we prefer to crop extra to satisfy
+ // alignment constraints rather than scaling to satisfy them.
+ noscale = ghb_settings_get_boolean(settings, "PictureLooseCrop");
+ // Align dimensions to either 16 or 2 pixels
+ // The scaler crashes if the dimensions are not divisible by 2
+ // x264 also will not accept dims that are not multiple of 2
+ if (autoscale)
+ {
+ keep_width = FALSE;
+ keep_height = FALSE;
+ }
+
+ if (autocrop)
+ {
+ crop[0] = title->crop[0];
+ crop[1] = title->crop[1];
+ crop[2] = title->crop[2];
+ crop[3] = title->crop[3];
+ ghb_settings_set_int(settings, "PictureTopCrop", crop[0]);
+ ghb_settings_set_int(settings, "PictureBottomCrop", crop[1]);
+ ghb_settings_set_int(settings, "PictureLeftCrop", crop[2]);
+ ghb_settings_set_int(settings, "PictureRightCrop", crop[3]);
+ }
+ else
+ {
+ crop[0] = ghb_settings_get_int(settings, "PictureTopCrop");
+ crop[1] = ghb_settings_get_int(settings, "PictureBottomCrop");
+ crop[2] = ghb_settings_get_int(settings, "PictureLeftCrop");
+ crop[3] = ghb_settings_get_int(settings, "PictureRightCrop");
+ }
+ if (noscale)
+ {
+ gint need1, need2;
+
+ // Adjust the cropping to accomplish the desired width and height
+ crop_width = title->width - crop[2] - crop[3];
+ crop_height = title->height - crop[0] - crop[1];
+ width = MOD_DOWN(crop_width, mod);
+ height = MOD_DOWN(crop_height, mod);
+
+ need1 = (crop_height - height) / 2;
+ need2 = crop_height - height - need1;
+ crop[0] += need1;
+ crop[1] += need2;
+ need1 = (crop_width - width) / 2;
+ need2 = crop_width - width - need1;
+ crop[2] += need1;
+ crop[3] += need2;
+ ghb_settings_set_int(settings, "PictureTopCrop", crop[0]);
+ ghb_settings_set_int(settings, "PictureBottomCrop", crop[1]);
+ ghb_settings_set_int(settings, "PictureLeftCrop", crop[2]);
+ ghb_settings_set_int(settings, "PictureRightCrop", crop[3]);
+ }
+ hb_reduce(&aspect_n, &aspect_d,
+ title->width * title->pixel_aspect_width,
+ title->height * title->pixel_aspect_height);
+ crop_width = title->width - crop[2] - crop[3];
+ crop_height = title->height - crop[0] - crop[1];
+ if (autoscale)
+ {
+ width = crop_width;
+ height = crop_height;
+ }
+ else
+ {
+ width = ghb_settings_get_int(settings, "scale_width");
+ height = ghb_settings_get_int(settings, "scale_height");
+ if (mode & GHB_PIC_USE_MAX)
+ {
+ max_width = MOD_DOWN(
+ ghb_settings_get_int(settings, "PictureWidth"), mod);
+ max_height = MOD_DOWN(
+ ghb_settings_get_int(settings, "PictureHeight"), mod);
+ }
+ }
+ g_debug("max_width %d, max_height %d\n", max_width, max_height);
+
+ if (width < 16)
+ width = title->width - crop[2] - crop[3];
+ if (height < 16)
+ height = title->height - crop[0] - crop[1];
+
+ width = MOD_ROUND(width, mod);
+ height = MOD_ROUND(height, mod);
+
+ job->anamorphic.mode = pic_par;
+ if (pic_par)
+ {
+ // The scaler crashes if the dimensions are not divisible by 2
+ // Align mod 2. And so does something in x264_encoder_headers()
+ job->modulus = mod;
+ job->anamorphic.par_width = title->pixel_aspect_width;
+ job->anamorphic.par_height = title->pixel_aspect_height;
+ job->anamorphic.dar_width = 0;
+ job->anamorphic.dar_height = 0;
+
+ if (keep_height && pic_par == 2)
+ {
+ width = ((double)height * crop_width / crop_height);
+ width = MOD_ROUND(width, mod);
+ }
+ job->width = width;
+ job->height = height;
+ job->maxWidth = max_width;
+ job->maxHeight = max_height;
+ job->crop[0] = crop[0];
+ job->crop[1] = crop[1];
+ job->crop[2] = crop[2];
+ job->crop[3] = crop[3];
+ if (job->anamorphic.mode == 3 && !keep_aspect)
+ {
+ job->anamorphic.keep_display_aspect = 0;
+ if (mode & GHB_PIC_KEEP_PAR)
+ {
+ job->anamorphic.par_width =
+ ghb_settings_get_int(settings, "PicturePARWidth");
+ job->anamorphic.par_height =
+ ghb_settings_get_int(settings, "PicturePARHeight");
+ }
+ else
+ {
+ job->anamorphic.dar_width =
+ ghb_settings_get_int(settings, "PictureDisplayWidth");
+ job->anamorphic.dar_height = height;
+ }
+ }
+ else
+ {
+ job->anamorphic.keep_display_aspect = 1;
+ }
+ // hb_set_anamorphic_size will adjust par, dar, and width/height
+ // to conform to job parameters that have been set, including
+ // maxWidth and maxHeight
+ hb_set_anamorphic_size(job, &width, &height, &par_width, &par_height);
+ if (job->anamorphic.mode == 3 && !keep_aspect &&
+ mode & GHB_PIC_KEEP_PAR)
+ {
+ // hb_set_anamorphic_size reduces the par, which we
+ // don't want in this case because the user is
+ // explicitely specifying it.
+ par_width = ghb_settings_get_int(settings, "PicturePARWidth");
+ par_height = ghb_settings_get_int(settings, "PicturePARHeight");
+ }
+ }
+ else
+ {
+ // Adjust dims according to max values
+ if (max_height) height = MIN(height, max_height);
+ if (max_width) width = MIN(width, max_width);
+
+ if (keep_aspect)
+ {
+ gdouble par;
+ gint new_width, new_height;
+
+ // Compute pixel aspect ration.
+ par = (gdouble)(title->height * aspect_n) / (title->width * aspect_d);
+ // Must scale so that par becomes 1:1
+ // Try to keep largest dimension
+ new_height = (crop_height * ((gdouble)width/crop_width) / par);
+ new_width = (crop_width * ((gdouble)height/crop_height) * par);
+
+ if (max_width && new_width > max_width)
+ {
+ height = new_height;
+ }
+ else if (max_height && new_height > max_height)
+ {
+ width = new_width;
+ }
+ else if (keep_width)
+ {
+ height = new_height;
+ }
+ else if (keep_height)
+ {
+ width = new_width;
+ }
+ else if (width > new_width)
+ {
+ height = new_height;
+ }
+ else
+ {
+ width = new_width;
+ }
+ g_debug("new w %d h %d\n", width, height);
+ }
+ width = MOD_ROUND(width, mod);
+ height = MOD_ROUND(height, mod);
+ if (max_height)
+ height = MIN(height, max_height);
+ if (max_width)
+ width = MIN(width, max_width);
+ par_width = par_height = 1;
+ }
+ ghb_settings_set_int(settings, "scale_width", width);
+ ghb_settings_set_int(settings, "scale_height", height);
+
+ gint disp_width;
+
+ disp_width = ((gdouble)par_width / par_height) * width + 0.5;
ghb_limit_rational(&par_width, &par_height, 65535);
- ghb_settings_set_int(settings, "PicturePARWidth", par_width);
- ghb_settings_set_int(settings, "PicturePARHeight", par_height);
- ghb_settings_set_int(settings, "PictureDisplayWidth", disp_width);
- ghb_settings_set_int(settings, "PictureDisplayHeight", height);
- hb_job_close( &job );
+ ghb_settings_set_int(settings, "PicturePARWidth", par_width);
+ ghb_settings_set_int(settings, "PicturePARHeight", par_height);
+ ghb_settings_set_int(settings, "PictureDisplayWidth", disp_width);
+ ghb_settings_set_int(settings, "PictureDisplayHeight", height);
+ hb_job_close( &job );
}
void
ghb_set_scale(signal_user_data_t *ud, gint mode)
{
- if (ud->scale_busy) return;
- ud->scale_busy = TRUE;
-
- ghb_set_scale_settings(ud->settings, mode);
- picture_settings_deps(ud);
-
- // Step needs to be at least 2 because odd widths cause scaler crash
- // subsampled chroma requires even crop values.
- GtkWidget *widget;
- int mod = ghb_settings_combo_int(ud->settings, "PictureModulus");
- widget = GHB_WIDGET (ud->builder, "scale_width");
- gtk_spin_button_set_increments (GTK_SPIN_BUTTON(widget), mod, 16);
- widget = GHB_WIDGET (ud->builder, "scale_height");
- gtk_spin_button_set_increments (GTK_SPIN_BUTTON(widget), mod, 16);
-
- // "Noscale" is a flag that says we prefer to crop extra to satisfy
- // alignment constraints rather than scaling to satisfy them.
- gboolean noscale = ghb_settings_get_boolean(ud->settings, "PictureLooseCrop");
- if (noscale)
- {
- widget = GHB_WIDGET (ud->builder, "PictureTopCrop");
- gtk_spin_button_set_increments (GTK_SPIN_BUTTON(widget), mod, 16);
- widget = GHB_WIDGET (ud->builder, "PictureBottomCrop");
- gtk_spin_button_set_increments (GTK_SPIN_BUTTON(widget), mod, 16);
- widget = GHB_WIDGET (ud->builder, "PictureLeftCrop");
- gtk_spin_button_set_increments (GTK_SPIN_BUTTON(widget), mod, 16);
- widget = GHB_WIDGET (ud->builder, "PictureRightCrop");
- gtk_spin_button_set_increments (GTK_SPIN_BUTTON(widget), mod, 16);
- }
- else
- {
- widget = GHB_WIDGET (ud->builder, "PictureTopCrop");
- gtk_spin_button_set_increments (GTK_SPIN_BUTTON(widget), 2, 16);
- widget = GHB_WIDGET (ud->builder, "PictureBottomCrop");
- gtk_spin_button_set_increments (GTK_SPIN_BUTTON(widget), 2, 16);
- widget = GHB_WIDGET (ud->builder, "PictureLeftCrop");
- gtk_spin_button_set_increments (GTK_SPIN_BUTTON(widget), 2, 16);
- widget = GHB_WIDGET (ud->builder, "PictureRightCrop");
- gtk_spin_button_set_increments (GTK_SPIN_BUTTON(widget), 2, 16);
- }
-
- ghb_ui_update_from_settings(ud->builder, "autoscale", ud->settings);
- ghb_ui_update_from_settings(ud->builder, "PictureModulus", ud->settings);
- ghb_ui_update_from_settings(ud->builder, "PictureLooseCrop", ud->settings);
- ghb_ui_update_from_settings(ud->builder, "PictureKeepRatio", ud->settings);
-
- ghb_ui_update_from_settings(ud->builder, "PictureTopCrop", ud->settings);
- ghb_ui_update_from_settings(ud->builder, "PictureBottomCrop", ud->settings);
- ghb_ui_update_from_settings(ud->builder, "PictureLeftCrop", ud->settings);
- ghb_ui_update_from_settings(ud->builder, "PictureRightCrop", ud->settings);
-
- ghb_ui_update_from_settings(ud->builder, "scale_width", ud->settings);
- ghb_ui_update_from_settings(ud->builder, "scale_height", ud->settings);
-
- ghb_ui_update_from_settings(ud->builder, "PicturePARWidth", ud->settings);
- ghb_ui_update_from_settings(ud->builder, "PicturePARHeight", ud->settings);
- ghb_ui_update_from_settings(ud->builder, "PictureDisplayWidth", ud->settings);
- ghb_ui_update_from_settings(ud->builder, "PictureDisplayHeight", ud->settings);
- gint disp_width, disp_height, dar_width, dar_height;
- gchar *str;
-
- disp_width = ghb_settings_get_int(ud->settings, "PictureDisplayWidth");
- disp_height = ghb_settings_get_int(ud->settings, "PictureDisplayHeight");
- hb_reduce(&dar_width, &dar_height, disp_width, disp_height);
- gint iaspect = dar_width * 9 / dar_height;
- if (dar_width > 2 * dar_height)
- {
- str = g_strdup_printf("%.2f : 1", (gdouble)dar_width / dar_height);
- }
- else if (iaspect <= 16 && iaspect >= 15)
- {
- str = g_strdup_printf("%.2f : 9", (gdouble)dar_width * 9 / dar_height);
- }
- else if (iaspect <= 12 && iaspect >= 11)
- {
- str = g_strdup_printf("%.2f : 3", (gdouble)dar_width * 3 / dar_height);
- }
- else
- {
- str = g_strdup_printf("%d : %d", dar_width, dar_height);
- }
- ghb_ui_update(ud, "display_aspect", ghb_string_value(str));
- g_free(str);
- ud->scale_busy = FALSE;
+ if (ud->scale_busy) return;
+ ud->scale_busy = TRUE;
+
+ ghb_set_scale_settings(ud->settings, mode);
+ picture_settings_deps(ud);
+
+ // Step needs to be at least 2 because odd widths cause scaler crash
+ // subsampled chroma requires even crop values.
+ GtkWidget *widget;
+ int mod = ghb_settings_combo_int(ud->settings, "PictureModulus");
+ widget = GHB_WIDGET (ud->builder, "scale_width");
+ gtk_spin_button_set_increments (GTK_SPIN_BUTTON(widget), mod, 16);
+ widget = GHB_WIDGET (ud->builder, "scale_height");
+ gtk_spin_button_set_increments (GTK_SPIN_BUTTON(widget), mod, 16);
+
+ // "Noscale" is a flag that says we prefer to crop extra to satisfy
+ // alignment constraints rather than scaling to satisfy them.
+ gboolean noscale = ghb_settings_get_boolean(ud->settings, "PictureLooseCrop");
+ if (noscale)
+ {
+ widget = GHB_WIDGET (ud->builder, "PictureTopCrop");
+ gtk_spin_button_set_increments (GTK_SPIN_BUTTON(widget), mod, 16);
+ widget = GHB_WIDGET (ud->builder, "PictureBottomCrop");
+ gtk_spin_button_set_increments (GTK_SPIN_BUTTON(widget), mod, 16);
+ widget = GHB_WIDGET (ud->builder, "PictureLeftCrop");
+ gtk_spin_button_set_increments (GTK_SPIN_BUTTON(widget), mod, 16);
+ widget = GHB_WIDGET (ud->builder, "PictureRightCrop");
+ gtk_spin_button_set_increments (GTK_SPIN_BUTTON(widget), mod, 16);
+ }
+ else
+ {
+ widget = GHB_WIDGET (ud->builder, "PictureTopCrop");
+ gtk_spin_button_set_increments (GTK_SPIN_BUTTON(widget), 2, 16);
+ widget = GHB_WIDGET (ud->builder, "PictureBottomCrop");
+ gtk_spin_button_set_increments (GTK_SPIN_BUTTON(widget), 2, 16);
+ widget = GHB_WIDGET (ud->builder, "PictureLeftCrop");
+ gtk_spin_button_set_increments (GTK_SPIN_BUTTON(widget), 2, 16);
+ widget = GHB_WIDGET (ud->builder, "PictureRightCrop");
+ gtk_spin_button_set_increments (GTK_SPIN_BUTTON(widget), 2, 16);
+ }
+
+ ghb_ui_update_from_settings(ud->builder, "autoscale", ud->settings);
+ ghb_ui_update_from_settings(ud->builder, "PictureModulus", ud->settings);
+ ghb_ui_update_from_settings(ud->builder, "PictureLooseCrop", ud->settings);
+ ghb_ui_update_from_settings(ud->builder, "PictureKeepRatio", ud->settings);
+
+ ghb_ui_update_from_settings(ud->builder, "PictureTopCrop", ud->settings);
+ ghb_ui_update_from_settings(ud->builder, "PictureBottomCrop", ud->settings);
+ ghb_ui_update_from_settings(ud->builder, "PictureLeftCrop", ud->settings);
+ ghb_ui_update_from_settings(ud->builder, "PictureRightCrop", ud->settings);
+
+ ghb_ui_update_from_settings(ud->builder, "scale_width", ud->settings);
+ ghb_ui_update_from_settings(ud->builder, "scale_height", ud->settings);
+
+ ghb_ui_update_from_settings(ud->builder, "PicturePARWidth", ud->settings);
+ ghb_ui_update_from_settings(ud->builder, "PicturePARHeight", ud->settings);
+ ghb_ui_update_from_settings(ud->builder, "PictureDisplayWidth", ud->settings);
+ ghb_ui_update_from_settings(ud->builder, "PictureDisplayHeight", ud->settings);
+ gint disp_width, disp_height, dar_width, dar_height;
+ gchar *str;
+
+ disp_width = ghb_settings_get_int(ud->settings, "PictureDisplayWidth");
+ disp_height = ghb_settings_get_int(ud->settings, "PictureDisplayHeight");
+ hb_reduce(&dar_width, &dar_height, disp_width, disp_height);
+ gint iaspect = dar_width * 9 / dar_height;
+ if (dar_width > 2 * dar_height)
+ {
+ str = g_strdup_printf("%.2f : 1", (gdouble)dar_width / dar_height);
+ }
+ else if (iaspect <= 16 && iaspect >= 15)
+ {
+ str = g_strdup_printf("%.2f : 9", (gdouble)dar_width * 9 / dar_height);
+ }
+ else if (iaspect <= 12 && iaspect >= 11)
+ {
+ str = g_strdup_printf("%.2f : 3", (gdouble)dar_width * 3 / dar_height);
+ }
+ else
+ {
+ str = g_strdup_printf("%d : %d", dar_width, dar_height);
+ }
+ ghb_ui_update(ud, "display_aspect", ghb_string_value(str));
+ g_free(str);
+ ud->scale_busy = FALSE;
}
static void
set_preview_job_settings(hb_job_t *job, GValue *settings)
{
- job->crop[0] = ghb_settings_get_int(settings, "PictureTopCrop");
- job->crop[1] = ghb_settings_get_int(settings, "PictureBottomCrop");
- job->crop[2] = ghb_settings_get_int(settings, "PictureLeftCrop");
- job->crop[3] = ghb_settings_get_int(settings, "PictureRightCrop");
-
- job->anamorphic.mode = ghb_settings_combo_int(settings, "PicturePAR");
- job->modulus =
- ghb_settings_combo_int(settings, "PictureModulus");
- job->width = ghb_settings_get_int(settings, "scale_width");
- job->height = ghb_settings_get_int(settings, "scale_height");
- if (ghb_settings_get_boolean(settings, "show_crop"))
- {
- gdouble xscale = (gdouble)job->width /
- (gdouble)(job->title->width - job->crop[2] - job->crop[3]);
- gdouble yscale = (gdouble)job->height /
- (gdouble)(job->title->height - job->crop[0] - job->crop[1]);
-
- job->width += xscale * (job->crop[2] + job->crop[3]);
- job->height += yscale * (job->crop[0] + job->crop[1]);
- job->crop[0] = 0;
- job->crop[1] = 0;
- job->crop[2] = 0;
- job->crop[3] = 0;
- job->modulus = 2;
- }
-
- gboolean decomb_deint = ghb_settings_get_boolean(settings, "PictureDecombDeinterlace");
- if (decomb_deint)
- {
- gint decomb = ghb_settings_combo_int(settings, "PictureDecomb");
- job->deinterlace = (decomb == 0) ? 0 : 1;
- }
- else
- {
- gint deint = ghb_settings_combo_int(settings, "PictureDeinterlace");
- job->deinterlace = (deint == 0) ? 0 : 1;
- }
-
- gboolean keep_aspect;
- keep_aspect = ghb_settings_get_boolean(settings, "PictureKeepRatio");
- if (job->anamorphic.mode)
- {
- job->anamorphic.par_width = job->title->pixel_aspect_width;
- job->anamorphic.par_height = job->title->pixel_aspect_height;
- job->anamorphic.dar_width = 0;
- job->anamorphic.dar_height = 0;
-
- if (job->anamorphic.mode == 3 && !keep_aspect)
- {
- job->anamorphic.keep_display_aspect = 0;
- job->anamorphic.par_width =
- ghb_settings_get_int(settings, "PicturePARWidth");
- job->anamorphic.par_height =
- ghb_settings_get_int(settings, "PicturePARHeight");
- }
- else
- {
- job->anamorphic.keep_display_aspect = 1;
- }
- }
+ job->crop[0] = ghb_settings_get_int(settings, "PictureTopCrop");
+ job->crop[1] = ghb_settings_get_int(settings, "PictureBottomCrop");
+ job->crop[2] = ghb_settings_get_int(settings, "PictureLeftCrop");
+ job->crop[3] = ghb_settings_get_int(settings, "PictureRightCrop");
+
+ job->anamorphic.mode = ghb_settings_combo_int(settings, "PicturePAR");
+ job->modulus =
+ ghb_settings_combo_int(settings, "PictureModulus");
+ job->width = ghb_settings_get_int(settings, "scale_width");
+ job->height = ghb_settings_get_int(settings, "scale_height");
+ if (ghb_settings_get_boolean(settings, "show_crop"))
+ {
+ gdouble xscale = (gdouble)job->width /
+ (gdouble)(job->title->width - job->crop[2] - job->crop[3]);
+ gdouble yscale = (gdouble)job->height /
+ (gdouble)(job->title->height - job->crop[0] - job->crop[1]);
+
+ job->width += xscale * (job->crop[2] + job->crop[3]);
+ job->height += yscale * (job->crop[0] + job->crop[1]);
+ job->crop[0] = 0;
+ job->crop[1] = 0;
+ job->crop[2] = 0;
+ job->crop[3] = 0;
+ job->modulus = 2;
+ }
+
+ gboolean decomb_deint = ghb_settings_get_boolean(settings, "PictureDecombDeinterlace");
+ if (decomb_deint)
+ {
+ gint decomb = ghb_settings_combo_int(settings, "PictureDecomb");
+ job->deinterlace = (decomb == 0) ? 0 : 1;
+ }
+ else
+ {
+ gint deint = ghb_settings_combo_int(settings, "PictureDeinterlace");
+ job->deinterlace = (deint == 0) ? 0 : 1;
+ }
+
+ gboolean keep_aspect;
+ keep_aspect = ghb_settings_get_boolean(settings, "PictureKeepRatio");
+ if (job->anamorphic.mode)
+ {
+ job->anamorphic.par_width = job->title->pixel_aspect_width;
+ job->anamorphic.par_height = job->title->pixel_aspect_height;
+ job->anamorphic.dar_width = 0;
+ job->anamorphic.dar_height = 0;
+
+ if (job->anamorphic.mode == 3 && !keep_aspect)
+ {
+ job->anamorphic.keep_display_aspect = 0;
+ job->anamorphic.par_width =
+ ghb_settings_get_int(settings, "PicturePARWidth");
+ job->anamorphic.par_height =
+ ghb_settings_get_int(settings, "PicturePARHeight");
+ }
+ else
+ {
+ job->anamorphic.keep_display_aspect = 1;
+ }
+ }
}
gboolean
ghb_validate_filter_string(const gchar *str, gint max_fields)
{
- gint fields = 0;
- gchar *end;
-
- if (str == NULL || *str == 0) return TRUE;
- while (*str)
- {
- g_strtod(str, &end);
- if (str != end)
- { // Found a numeric value
- fields++;
- // negative max_fields means infinate
- if (max_fields >= 0 && fields > max_fields) return FALSE;
- if (*end == 0)
- return TRUE;
- if (*end != ':')
- return FALSE;
- str = end + 1;
- }
- else
- return FALSE;
- }
- return FALSE;
+ gint fields = 0;
+ gchar *end;
+
+ if (str == NULL || *str == 0) return TRUE;
+ while (*str)
+ {
+ g_strtod(str, &end);
+ if (str != end)
+ { // Found a numeric value
+ fields++;
+ // negative max_fields means infinate
+ if (max_fields >= 0 && fields > max_fields) return FALSE;
+ if (*end == 0)
+ return TRUE;
+ if (*end != ':')
+ return FALSE;
+ str = end + 1;
+ }
+ else
+ return FALSE;
+ }
+ return FALSE;
}
gboolean
ghb_validate_filters(GValue *settings)
{
- gchar *str;
- gint index;
- gchar *message;
-
- gboolean decomb_deint = ghb_settings_get_boolean(settings, "PictureDecombDeinterlace");
- // deinte
- index = ghb_settings_combo_int(settings, "PictureDeinterlace");
- if (!decomb_deint && index == 1)
- {
- str = ghb_settings_get_string(settings, "PictureDeinterlaceCustom");
- if (!ghb_validate_filter_string(str, -1))
- {
- message = g_strdup_printf(
- "Invalid Deinterlace Settings:\n\n%s\n",
- str);
- ghb_message_dialog(GTK_MESSAGE_ERROR, message, "Cancel", NULL);
- g_free(message);
- g_free(str);
- return FALSE;
- }
- g_free(str);
- }
- // detel
- index = ghb_settings_combo_int(settings, "PictureDetelecine");
- if (index == 1)
- {
- str = ghb_settings_get_string(settings, "PictureDetelecineCustom");
- if (!ghb_validate_filter_string(str, -1))
- {
- message = g_strdup_printf(
- "Invalid Detelecine Settings:\n\n%s\n",
- str);
- ghb_message_dialog(GTK_MESSAGE_ERROR, message, "Cancel", NULL);
- g_free(message);
- g_free(str);
- return FALSE;
- }
- g_free(str);
- }
- // decomb
- index = ghb_settings_combo_int(settings, "PictureDecomb");
- if (decomb_deint && index == 1)
- {
- str = ghb_settings_get_string(settings, "PictureDecombCustom");
- if (!ghb_validate_filter_string(str, -1))
- {
- message = g_strdup_printf(
- "Invalid Decomb Settings:\n\n%s\n",
- str);
- ghb_message_dialog(GTK_MESSAGE_ERROR, message, "Cancel", NULL);
- g_free(message);
- g_free(str);
- return FALSE;
- }
- g_free(str);
- }
- // denois
- index = ghb_settings_combo_int(settings, "PictureDenoise");
- if (index == 1)
- {
- str = ghb_settings_get_string(settings, "PictureDenoiseCustom");
- if (!ghb_validate_filter_string(str, -1))
- {
- message = g_strdup_printf(
- "Invalid Denoise Settings:\n\n%s\n",
- str);
- ghb_message_dialog(GTK_MESSAGE_ERROR, message, "Cancel", NULL);
- g_free(str);
- g_free(message);
- return FALSE;
- }
- g_free(str);
- }
- return TRUE;
+ gchar *str;
+ gint index;
+ gchar *message;
+
+ gboolean decomb_deint = ghb_settings_get_boolean(settings, "PictureDecombDeinterlace");
+ // deinte
+ index = ghb_settings_combo_int(settings, "PictureDeinterlace");
+ if (!decomb_deint && index == 1)
+ {
+ str = ghb_settings_get_string(settings, "PictureDeinterlaceCustom");
+ if (!ghb_validate_filter_string(str, -1))
+ {
+ message = g_strdup_printf(
+ "Invalid Deinterlace Settings:\n\n%s\n",
+ str);
+ ghb_message_dialog(GTK_MESSAGE_ERROR, message, "Cancel", NULL);
+ g_free(message);
+ g_free(str);
+ return FALSE;
+ }
+ g_free(str);
+ }
+ // detel
+ index = ghb_settings_combo_int(settings, "PictureDetelecine");
+ if (index == 1)
+ {
+ str = ghb_settings_get_string(settings, "PictureDetelecineCustom");
+ if (!ghb_validate_filter_string(str, -1))
+ {
+ message = g_strdup_printf(
+ "Invalid Detelecine Settings:\n\n%s\n",
+ str);
+ ghb_message_dialog(GTK_MESSAGE_ERROR, message, "Cancel", NULL);
+ g_free(message);
+ g_free(str);
+ return FALSE;
+ }
+ g_free(str);
+ }
+ // decomb
+ index = ghb_settings_combo_int(settings, "PictureDecomb");
+ if (decomb_deint && index == 1)
+ {
+ str = ghb_settings_get_string(settings, "PictureDecombCustom");
+ if (!ghb_validate_filter_string(str, -1))
+ {
+ message = g_strdup_printf(
+ "Invalid Decomb Settings:\n\n%s\n",
+ str);
+ ghb_message_dialog(GTK_MESSAGE_ERROR, message, "Cancel", NULL);
+ g_free(message);
+ g_free(str);
+ return FALSE;
+ }
+ g_free(str);
+ }
+ // denois
+ index = ghb_settings_combo_int(settings, "PictureDenoise");
+ if (index == 1)
+ {
+ str = ghb_settings_get_string(settings, "PictureDenoiseCustom");
+ if (!ghb_validate_filter_string(str, -1))
+ {
+ message = g_strdup_printf(
+ "Invalid Denoise Settings:\n\n%s\n",
+ str);
+ ghb_message_dialog(GTK_MESSAGE_ERROR, message, "Cancel", NULL);
+ g_free(str);
+ g_free(message);
+ return FALSE;
+ }
+ g_free(str);
+ }
+ return TRUE;
}
gboolean
ghb_validate_video(GValue *settings)
{
- gint vcodec, mux;
- gchar *message;
-
- mux = ghb_settings_combo_int(settings, "FileFormat");
- vcodec = ghb_settings_combo_int(settings, "VideoEncoder");
- if ((mux == HB_MUX_MP4) && (vcodec == HB_VCODEC_THEORA))
- {
- // mp4/theora combination is not supported.
- message = g_strdup_printf(
- "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"))
- {
- g_free(message);
- return FALSE;
- }
- g_free(message);
- ghb_settings_set_int(settings, "VideoEncoder", HB_VCODEC_FFMPEG_MPEG4);
- }
- return TRUE;
+ gint vcodec, mux;
+ gchar *message;
+
+ mux = ghb_settings_combo_int(settings, "FileFormat");
+ vcodec = ghb_settings_combo_int(settings, "VideoEncoder");
+ if ((mux == HB_MUX_MP4) && (vcodec == HB_VCODEC_THEORA))
+ {
+ // mp4/theora combination is not supported.
+ message = g_strdup_printf(
+ "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"))
+ {
+ g_free(message);
+ return FALSE;
+ }
+ g_free(message);
+ ghb_settings_set_int(settings, "VideoEncoder", HB_VCODEC_FFMPEG_MPEG4);
+ }
+ return TRUE;
}
gboolean
ghb_validate_subtitles(GValue *settings)
{
- hb_title_t * title;
- gchar *message;
-
- gint titleindex;
-
- titleindex = ghb_settings_combo_int(settings, "title");
- title = ghb_get_title_info(titleindex);
- if (title == NULL)
- {
- /* No valid title, stop right there */
- g_message("No title found.\n");
- return FALSE;
- }
-
- const GValue *slist, *subtitle;
- gint count, ii, source;
- gboolean burned, one_burned = FALSE;
-
- slist = ghb_settings_get_value(settings, "subtitle_list");
- count = ghb_array_len(slist);
- for (ii = 0; ii < count; ii++)
- {
- subtitle = ghb_array_get_nth(slist, ii);
- source = ghb_settings_get_int(subtitle, "SubtitleSource");
- burned = ghb_settings_get_boolean(subtitle, "SubtitleBurned");
- if (burned && one_burned)
- {
- // MP4 can only handle burned vobsubs. make sure there isn't
- // already something burned in the list
- message = g_strdup_printf(
- "Only one subtitle may be burned into the video.\n\n"
- "You should change your subtitle selections.\n"
- "If you continue, some subtitles will be lost.");
- if (!ghb_message_dialog(GTK_MESSAGE_WARNING, message, "Cancel", "Continue"))
- {
- g_free(message);
- return FALSE;
- }
- g_free(message);
- break;
- }
- else if (burned)
- {
- one_burned = TRUE;
- }
- if (source == SRTSUB)
- {
- gchar *filename;
-
- filename = ghb_settings_get_string(subtitle, "SrtFile");
- if (!g_file_test(filename, G_FILE_TEST_IS_REGULAR))
- {
- message = g_strdup_printf(
- "Srt file does not exist or not a regular file.\n\n"
- "You should choose a valid file.\n"
- "If you continue, this subtitle will be ignored.");
- if (!ghb_message_dialog(GTK_MESSAGE_WARNING, message,
- "Cancel", "Continue"))
- {
- g_free(message);
- return FALSE;
- }
- g_free(message);
- break;
- }
- }
- }
- return TRUE;
+ hb_title_t * title;
+ gchar *message;
+
+ gint titleindex;
+
+ titleindex = ghb_settings_combo_int(settings, "title");
+ title = ghb_get_title_info(titleindex);
+ if (title == NULL)
+ {
+ /* No valid title, stop right there */
+ g_message("No title found.\n");
+ return FALSE;
+ }
+
+ const GValue *slist, *subtitle;
+ gint count, ii, source;
+ gboolean burned, one_burned = FALSE;
+
+ slist = ghb_settings_get_value(settings, "subtitle_list");
+ count = ghb_array_len(slist);
+ for (ii = 0; ii < count; ii++)
+ {
+ subtitle = ghb_array_get_nth(slist, ii);
+ source = ghb_settings_get_int(subtitle, "SubtitleSource");
+ burned = ghb_settings_get_boolean(subtitle, "SubtitleBurned");
+ if (burned && one_burned)
+ {
+ // MP4 can only handle burned vobsubs. make sure there isn't
+ // already something burned in the list
+ message = g_strdup_printf(
+ "Only one subtitle may be burned into the video.\n\n"
+ "You should change your subtitle selections.\n"
+ "If you continue, some subtitles will be lost.");
+ if (!ghb_message_dialog(GTK_MESSAGE_WARNING, message, "Cancel", "Continue"))
+ {
+ g_free(message);
+ return FALSE;
+ }
+ g_free(message);
+ break;
+ }
+ else if (burned)
+ {
+ one_burned = TRUE;
+ }
+ if (source == SRTSUB)
+ {
+ gchar *filename;
+
+ filename = ghb_settings_get_string(subtitle, "SrtFile");
+ if (!g_file_test(filename, G_FILE_TEST_IS_REGULAR))
+ {
+ message = g_strdup_printf(
+ "Srt file does not exist or not a regular file.\n\n"
+ "You should choose a valid file.\n"
+ "If you continue, this subtitle will be ignored.");
+ if (!ghb_message_dialog(GTK_MESSAGE_WARNING, message,
+ "Cancel", "Continue"))
+ {
+ g_free(message);
+ return FALSE;
+ }
+ g_free(message);
+ break;
+ }
+ }
+ }
+ return TRUE;
}
gboolean
ghb_validate_audio(GValue *settings)
{
- hb_title_t * title;
- gchar *message;
- GValue *value;
-
- gint titleindex;
-
- titleindex = ghb_settings_combo_int(settings, "title");
- title = ghb_get_title_info( titleindex );
- if (title == NULL)
- {
- /* No valid title, stop right there */
- g_message("No title found.\n");
- return FALSE;
- }
- gint mux = ghb_settings_combo_int(settings, "FileFormat");
-
- const GValue *audio_list;
- gint count, ii;
-
- audio_list = ghb_settings_get_value(settings, "audio_list");
- count = ghb_array_len(audio_list);
- for (ii = 0; ii < count; ii++)
- {
- GValue *asettings;
- hb_audio_config_t *aconfig;
-
- 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_AUTO_PASS)
- continue;
+ hb_title_t * title;
+ gchar *message;
+ GValue *value;
+
+ gint titleindex;
+
+ titleindex = ghb_settings_combo_int(settings, "title");
+ title = ghb_get_title_info( titleindex );
+ if (title == NULL)
+ {
+ /* No valid title, stop right there */
+ g_message("No title found.\n");
+ return FALSE;
+ }
+ gint mux = ghb_settings_combo_int(settings, "FileFormat");
+
+ const GValue *audio_list;
+ gint count, ii;
+
+ audio_list = ghb_settings_get_value(settings, "audio_list");
+ count = ghb_array_len(audio_list);
+ for (ii = 0; ii < count; ii++)
+ {
+ GValue *asettings;
+ hb_audio_config_t *aconfig;
+
+ 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_AUTO_PASS)
+ continue;
aconfig = (hb_audio_config_t *) hb_list_audio_config_item(
- title->list_audio, track );
- if ( ghb_audio_is_passthru(codec) &&
- !(ghb_audio_can_passthru(aconfig->in.codec) &&
- (aconfig->in.codec & codec)))
- {
- // Not supported. AC3 is passthrough only, so input must be AC3
- message = g_strdup_printf(
- "The source does not support Pass-Thru.\n\n"
- "You should choose a different audio codec.\n"
- "If you continue, one will be chosen for you.");
- if (!ghb_message_dialog(GTK_MESSAGE_WARNING, message, "Cancel", "Continue"))
- {
- g_free(message);
- return FALSE;
- }
- g_free(message);
- if ((codec & HB_ACODEC_AC3) ||
- (aconfig->in.codec & HB_ACODEC_MASK) == HB_ACODEC_DCA)
- {
- codec = HB_ACODEC_AC3;
- }
- else if (mux == HB_MUX_MKV)
- {
- codec = HB_ACODEC_LAME;
- }
- else
- {
- codec = HB_ACODEC_FAAC;
- }
- value = ghb_lookup_acodec_value(codec);
- ghb_settings_take_value(asettings, "AudioEncoder", value);
- }
- gchar *a_unsup = NULL;
- gchar *mux_s = NULL;
- if (mux == HB_MUX_MP4)
- {
- mux_s = "MP4";
- // mp4/vorbis|DTS combination is not supported.
- if (codec == HB_ACODEC_VORBIS)
- {
- a_unsup = "Vorbis";
- codec = HB_ACODEC_FAAC;
- }
- }
- if (a_unsup)
- {
- message = g_strdup_printf(
- "%s is not supported in the %s container.\n\n"
- "You should choose a different audio codec.\n"
- "If you continue, one will be chosen for you.", a_unsup, mux_s);
- if (!ghb_message_dialog(GTK_MESSAGE_WARNING, message, "Cancel", "Continue"))
- {
- g_free(message);
- return FALSE;
- }
- g_free(message);
- value = ghb_lookup_acodec_value(codec);
- ghb_settings_take_value(asettings, "AudioEncoder", value);
- }
-
- gint mix = ghb_settings_combo_int (asettings, "AudioMixdown");
-
- gint jj;
- gchar *mix_unsup = NULL;
- if (!hb_mixdown_is_supported(mix, codec, aconfig->in.channel_layout))
- {
- for (jj = 0; jj < hb_audio_mixdowns_count; jj++)
- {
- if (mix == hb_audio_mixdowns[jj].amixdown)
- {
- {
- mix_unsup = hb_audio_mixdowns[jj].human_readable_name;
- }
- }
- }
- }
- if (mix_unsup)
- {
- message = g_strdup_printf(
- "The source audio does not support %s mixdown.\n\n"
- "You should choose a different mixdown.\n"
- "If you continue, one will be chosen for you.", mix_unsup);
- if (!ghb_message_dialog(GTK_MESSAGE_WARNING, message, "Cancel", "Continue"))
- {
- g_free(message);
- return FALSE;
- }
- g_free(message);
- mix = ghb_get_best_mix(aconfig, codec, mix);
- value = get_amix_value(mix);
- ghb_settings_take_value(asettings, "AudioMixdown", value);
- }
- }
- return TRUE;
+ title->list_audio, track );
+ if ( ghb_audio_is_passthru(codec) &&
+ !(ghb_audio_can_passthru(aconfig->in.codec) &&
+ (aconfig->in.codec & codec)))
+ {
+ // Not supported. AC3 is passthrough only, so input must be AC3
+ message = g_strdup_printf(
+ "The source does not support Pass-Thru.\n\n"
+ "You should choose a different audio codec.\n"
+ "If you continue, one will be chosen for you.");
+ if (!ghb_message_dialog(GTK_MESSAGE_WARNING, message, "Cancel", "Continue"))
+ {
+ g_free(message);
+ return FALSE;
+ }
+ g_free(message);
+ if ((codec & HB_ACODEC_AC3) ||
+ (aconfig->in.codec & HB_ACODEC_MASK) == HB_ACODEC_DCA)
+ {
+ codec = HB_ACODEC_AC3;
+ }
+ else if (mux == HB_MUX_MKV)
+ {
+ codec = HB_ACODEC_LAME;
+ }
+ else
+ {
+ codec = HB_ACODEC_FAAC;
+ }
+ value = ghb_lookup_acodec_value(codec);
+ ghb_settings_take_value(asettings, "AudioEncoder", value);
+ }
+ gchar *a_unsup = NULL;
+ gchar *mux_s = NULL;
+ if (mux == HB_MUX_MP4)
+ {
+ mux_s = "MP4";
+ // mp4/vorbis|DTS combination is not supported.
+ if (codec == HB_ACODEC_VORBIS)
+ {
+ a_unsup = "Vorbis";
+ codec = HB_ACODEC_FAAC;
+ }
+ }
+ if (a_unsup)
+ {
+ message = g_strdup_printf(
+ "%s is not supported in the %s container.\n\n"
+ "You should choose a different audio codec.\n"
+ "If you continue, one will be chosen for you.", a_unsup, mux_s);
+ if (!ghb_message_dialog(GTK_MESSAGE_WARNING, message, "Cancel", "Continue"))
+ {
+ g_free(message);
+ return FALSE;
+ }
+ g_free(message);
+ value = ghb_lookup_acodec_value(codec);
+ ghb_settings_take_value(asettings, "AudioEncoder", value);
+ }
+
+ gint mix = ghb_settings_combo_int (asettings, "AudioMixdown");
+
+ gint jj;
+ gchar *mix_unsup = NULL;
+ if (!hb_mixdown_is_supported(mix, codec, aconfig->in.channel_layout))
+ {
+ for (jj = 0; jj < hb_audio_mixdowns_count; jj++)
+ {
+ if (mix == hb_audio_mixdowns[jj].amixdown)
+ {
+ {
+ mix_unsup = hb_audio_mixdowns[jj].human_readable_name;
+ }
+ }
+ }
+ }
+ if (mix_unsup)
+ {
+ message = g_strdup_printf(
+ "The source audio does not support %s mixdown.\n\n"
+ "You should choose a different mixdown.\n"
+ "If you continue, one will be chosen for you.", mix_unsup);
+ if (!ghb_message_dialog(GTK_MESSAGE_WARNING, message, "Cancel", "Continue"))
+ {
+ g_free(message);
+ return FALSE;
+ }
+ g_free(message);
+ mix = ghb_get_best_mix(aconfig, codec, mix);
+ value = get_amix_value(mix);
+ ghb_settings_take_value(asettings, "AudioMixdown", value);
+ }
+ }
+ return TRUE;
}
gboolean
ghb_validate_vquality(GValue *settings)
{
- gint vcodec;
- gchar *message;
- gint min, max;
-
- if (ghb_settings_get_boolean(settings, "nocheckvquality")) return TRUE;
- vcodec = ghb_settings_combo_int(settings, "VideoEncoder");
- gdouble vquality;
- vquality = ghb_settings_get_double(settings, "VideoQualitySlider");
- if (ghb_settings_get_boolean(settings, "vquality_type_constant"))
- {
- switch (vcodec)
- {
- case HB_VCODEC_X264:
- {
- min = 16;
- max = 30;
- } break;
-
- case HB_VCODEC_FFMPEG_MPEG2:
- case HB_VCODEC_FFMPEG_MPEG4:
- {
- min = 1;
- max = 8;
- } break;
-
- case HB_VCODEC_THEORA:
- {
- min = 0;
- max = 63;
- } break;
-
- default:
- {
- min = 48;
- max = 62;
- } break;
- }
- if (vcodec == HB_VCODEC_X264 && vquality == 0.0)
- {
- message = g_strdup_printf(
- "Warning: lossless h.264 selected\n\n"
- "Lossless h.264 is not well supported by\n"
- "many players and editors.\n\n"
+ gint vcodec;
+ gchar *message;
+ gint min, max;
+
+ if (ghb_settings_get_boolean(settings, "nocheckvquality")) return TRUE;
+ vcodec = ghb_settings_combo_int(settings, "VideoEncoder");
+ gdouble vquality;
+ vquality = ghb_settings_get_double(settings, "VideoQualitySlider");
+ if (ghb_settings_get_boolean(settings, "vquality_type_constant"))
+ {
+ switch (vcodec)
+ {
+ case HB_VCODEC_X264:
+ {
+ min = 16;
+ max = 30;
+ } break;
+
+ case HB_VCODEC_FFMPEG_MPEG2:
+ case HB_VCODEC_FFMPEG_MPEG4:
+ {
+ min = 1;
+ max = 8;
+ } break;
+
+ case HB_VCODEC_THEORA:
+ {
+ min = 0;
+ max = 63;
+ } break;
+
+ default:
+ {
+ min = 48;
+ max = 62;
+ } break;
+ }
+ if (vcodec == HB_VCODEC_X264 && vquality == 0.0)
+ {
+ message = g_strdup_printf(
+ "Warning: lossless h.264 selected\n\n"
+ "Lossless h.264 is not well supported by\n"
+ "many players and editors.\n\n"
"It will produce enormous output files.\n\n"
- "Are you sure you wish to use this setting?");
- if (!ghb_message_dialog(GTK_MESSAGE_QUESTION, message,
- "Cancel", "Continue"))
- {
- g_free(message);
- return FALSE;
- }
- g_free(message);
- }
- else if (vquality < min || vquality > max)
- {
- message = g_strdup_printf(
- "Interesting video quality choice: %d\n\n"
- "Typical values range from %d to %d.\n\n"
- "Are you sure you wish to use this setting?",
- (gint)vquality, min, max);
- if (!ghb_message_dialog(GTK_MESSAGE_QUESTION, message,
- "Cancel", "Continue"))
- {
- g_free(message);
- return FALSE;
- }
- g_free(message);
- }
- }
- return TRUE;
+ "Are you sure you wish to use this setting?");
+ if (!ghb_message_dialog(GTK_MESSAGE_QUESTION, message,
+ "Cancel", "Continue"))
+ {
+ g_free(message);
+ return FALSE;
+ }
+ g_free(message);
+ }
+ else if (vquality < min || vquality > max)
+ {
+ message = g_strdup_printf(
+ "Interesting video quality choice: %d\n\n"
+ "Typical values range from %d to %d.\n\n"
+ "Are you sure you wish to use this setting?",
+ (gint)vquality, min, max);
+ if (!ghb_message_dialog(GTK_MESSAGE_QUESTION, message,
+ "Cancel", "Continue"))
+ {
+ g_free(message);
+ return FALSE;
+ }
+ g_free(message);
+ }
+ }
+ return TRUE;
}
static void
add_job(hb_handle_t *h, GValue *js, gint unique_id, gint titleindex)
{
- hb_list_t * list;
- hb_title_t * title;
- hb_job_t * job;
- gint sub_id = 0;
- hb_filter_object_t * filter;
- gchar *filter_str;
- gchar *dest_str = NULL;
-
- g_debug("add_job()\n");
- if (h == NULL) return;
- list = hb_get_titles( h );
- if( !hb_list_count( list ) )
- {
- /* No valid title, stop right there */
- return;
- }
+ hb_list_t * list;
+ hb_title_t * title;
+ hb_job_t * job;
+ gint sub_id = 0;
+ hb_filter_object_t * filter;
+ gchar *filter_str;
+ gchar *dest_str = NULL;
+
+ g_debug("add_job()\n");
+ if (h == NULL) return;
+ list = hb_get_titles( h );
+ if( !hb_list_count( list ) )
+ {
+ /* No valid title, stop right there */
+ return;
+ }
title = hb_list_item( list, titleindex );
- if (title == NULL) return;
-
- /* Set job settings */
- job = hb_job_init( title );
- if (job == NULL) return;
-
- job->angle = ghb_settings_get_int(js, "angle");
- job->start_at_preview = ghb_settings_get_int(js, "start_frame") + 1;
- if (job->start_at_preview)
- {
- job->seek_points = ghb_settings_get_int(js, "preview_count");
- job->pts_to_stop = ghb_settings_get_int(js, "live_duration") * 90000LL;
- }
-
- job->mux = ghb_settings_combo_int(js, "FileFormat");
- if (job->mux == HB_MUX_MP4)
- {
- job->largeFileSize = ghb_settings_get_boolean(js, "Mp4LargeFile");
- job->mp4_optimize = ghb_settings_get_boolean(js, "Mp4HttpOptimize");
- }
- else
- {
- job->largeFileSize = FALSE;
- job->mp4_optimize = FALSE;
- }
- if (!job->start_at_preview)
- {
- gint start, end;
- gint num_chapters = hb_list_count(title->list_chapter);
- gint duration = title->duration / 90000;
- job->chapter_markers = FALSE;
- job->chapter_start = 1;
- job->chapter_end = num_chapters;
-
- if (ghb_settings_combo_int(js, "PtoPType") == 0)
- {
- start = ghb_settings_get_int(js, "start_point");
- end = ghb_settings_get_int(js, "end_point");
- job->chapter_start = MIN( num_chapters, start );
- job->chapter_end = MAX( job->chapter_start, end );
-
- }
- if (ghb_settings_combo_int(js, "PtoPType") == 1)
- {
- start = ghb_settings_get_int(js, "start_point");
- end = ghb_settings_get_int(js, "end_point");
- job->pts_to_start = (int64_t)MIN(duration-1, start) * 90000;
- job->pts_to_stop = (int64_t)MAX(start+1, end) * 90000 -
- job->pts_to_start;
- }
- if (ghb_settings_combo_int(js, "PtoPType") == 2)
- {
- start = ghb_settings_get_int(js, "start_point");
- end = ghb_settings_get_int(js, "end_point");
- gint64 max_frames;
- max_frames = (gint64)duration * title->rate / title->rate_base;
- job->frame_to_start = (int64_t)MIN(max_frames-1, start-1);
- job->frame_to_stop = (int64_t)MAX(start, end-1) -
- job->frame_to_start;
- }
- if (job->chapter_start != job->chapter_end)
- {
- job->chapter_markers = ghb_settings_get_boolean(js, "ChapterMarkers");
- }
- if (job->chapter_start == job->chapter_end)
- job->chapter_markers = 0;
- if ( job->chapter_markers )
- {
- GValue *chapters;
- GValue *chapter;
- gint chap;
- gint count;
-
- chapters = ghb_settings_get_value(js, "chapter_list");
- count = ghb_array_len(chapters);
- for(chap = 0; chap < count; chap++)
- {
- hb_chapter_t * chapter_s;
- gchar *name;
-
- name = NULL;
- chapter = ghb_array_get_nth(chapters, chap);
- name = ghb_value_string(chapter);
- if (name == NULL)
- {
- name = g_strdup_printf ("Chapter %2d", chap+1);
- }
- chapter_s = hb_list_item( job->list_chapter, chap);
- hb_chapter_set_title(chapter_s, name);
- g_free(name);
- }
- }
- }
-
- gboolean decomb_deint = ghb_settings_get_boolean(js, "PictureDecombDeinterlace");
- gint decomb = ghb_settings_combo_int(js, "PictureDecomb");
- gint deint = ghb_settings_combo_int(js, "PictureDeinterlace");
- if (!decomb_deint)
- job->deinterlace = (deint != 0) ? 1 : 0;
- else
- job->deinterlace = 0;
+ if (title == NULL) return;
+
+ /* Set job settings */
+ job = hb_job_init( title );
+ if (job == NULL) return;
+
+ job->angle = ghb_settings_get_int(js, "angle");
+ job->start_at_preview = ghb_settings_get_int(js, "start_frame") + 1;
+ if (job->start_at_preview)
+ {
+ job->seek_points = ghb_settings_get_int(js, "preview_count");
+ job->pts_to_stop = ghb_settings_get_int(js, "live_duration") * 90000LL;
+ }
+
+ job->mux = ghb_settings_combo_int(js, "FileFormat");
+ if (job->mux == HB_MUX_MP4)
+ {
+ job->largeFileSize = ghb_settings_get_boolean(js, "Mp4LargeFile");
+ job->mp4_optimize = ghb_settings_get_boolean(js, "Mp4HttpOptimize");
+ }
+ else
+ {
+ job->largeFileSize = FALSE;
+ job->mp4_optimize = FALSE;
+ }
+ if (!job->start_at_preview)
+ {
+ gint start, end;
+ gint num_chapters = hb_list_count(title->list_chapter);
+ gint duration = title->duration / 90000;
+ job->chapter_markers = FALSE;
+ job->chapter_start = 1;
+ job->chapter_end = num_chapters;
+
+ if (ghb_settings_combo_int(js, "PtoPType") == 0)
+ {
+ start = ghb_settings_get_int(js, "start_point");
+ end = ghb_settings_get_int(js, "end_point");
+ job->chapter_start = MIN( num_chapters, start );
+ job->chapter_end = MAX( job->chapter_start, end );
+
+ }
+ if (ghb_settings_combo_int(js, "PtoPType") == 1)
+ {
+ start = ghb_settings_get_int(js, "start_point");
+ end = ghb_settings_get_int(js, "end_point");
+ job->pts_to_start = (int64_t)MIN(duration-1, start) * 90000;
+ job->pts_to_stop = (int64_t)MAX(start+1, end) * 90000 -
+ job->pts_to_start;
+ }
+ if (ghb_settings_combo_int(js, "PtoPType") == 2)
+ {
+ start = ghb_settings_get_int(js, "start_point");
+ end = ghb_settings_get_int(js, "end_point");
+ gint64 max_frames;
+ max_frames = (gint64)duration * title->rate / title->rate_base;
+ job->frame_to_start = (int64_t)MIN(max_frames-1, start-1);
+ job->frame_to_stop = (int64_t)MAX(start, end-1) -
+ job->frame_to_start;
+ }
+ if (job->chapter_start != job->chapter_end)
+ {
+ job->chapter_markers = ghb_settings_get_boolean(js, "ChapterMarkers");
+ }
+ if (job->chapter_start == job->chapter_end)
+ job->chapter_markers = 0;
+ if ( job->chapter_markers )
+ {
+ GValue *chapters;
+ GValue *chapter;
+ gint chap;
+ gint count;
+
+ chapters = ghb_settings_get_value(js, "chapter_list");
+ count = ghb_array_len(chapters);
+ for(chap = 0; chap < count; chap++)
+ {
+ hb_chapter_t * chapter_s;
+ gchar *name;
+
+ name = NULL;
+ chapter = ghb_array_get_nth(chapters, chap);
+ name = ghb_value_string(chapter);
+ if (name == NULL)
+ {
+ name = g_strdup_printf ("Chapter %2d", chap+1);
+ }
+ chapter_s = hb_list_item( job->list_chapter, chap);
+ hb_chapter_set_title(chapter_s, name);
+ g_free(name);
+ }
+ }
+ }
+
+ gboolean decomb_deint = ghb_settings_get_boolean(js, "PictureDecombDeinterlace");
+ gint decomb = ghb_settings_combo_int(js, "PictureDecomb");
+ gint deint = ghb_settings_combo_int(js, "PictureDeinterlace");
+ if (!decomb_deint)
+ job->deinterlace = (deint != 0) ? 1 : 0;
+ else
+ job->deinterlace = 0;
job->grayscale = ghb_settings_get_boolean(js, "VideoGrayScale");
- gboolean keep_aspect;
- keep_aspect = ghb_settings_get_boolean(js, "PictureKeepRatio");
- job->anamorphic.mode = ghb_settings_combo_int(js, "PicturePAR");
- job->modulus = ghb_settings_combo_int(js, "PictureModulus");
- if (job->anamorphic.mode)
- {
- job->anamorphic.par_width =
- ghb_settings_get_int(js, "PicturePARWidth");
- job->anamorphic.par_height =
- ghb_settings_get_int(js, "PicturePARHeight");
- job->anamorphic.dar_width = 0;
- job->anamorphic.dar_height = 0;
-
- if (job->anamorphic.mode == 3 && !keep_aspect)
- {
- job->anamorphic.keep_display_aspect = 0;
- }
- else
- {
- job->anamorphic.keep_display_aspect = 1;
- }
- }
-
- int width, height, crop[4];
- width = ghb_settings_get_int(js, "scale_width");
- height = ghb_settings_get_int(js, "scale_height");
-
- crop[0] = ghb_settings_get_int(js, "PictureTopCrop");
- crop[1] = ghb_settings_get_int(js, "PictureBottomCrop");
- crop[2] = ghb_settings_get_int(js, "PictureLeftCrop");
- crop[3] = ghb_settings_get_int(js, "PictureRightCrop");
-
- filter_str = g_strdup_printf("%d:%d:%d:%d:%d:%d",
- width, height, crop[0], crop[1], crop[2], crop[3]);
- filter = hb_filter_init(HB_FILTER_CROP_SCALE);
- hb_add_filter( job, filter, filter_str );
- g_free(filter_str);
-
- /* Add selected filters */
- gint detel = ghb_settings_combo_int(js, "PictureDetelecine");
- if ( detel )
- {
- filter_str = NULL;
- if (detel != 1)
- {
- if (detel_opts.map[detel].svalue != NULL)
- filter_str = g_strdup(detel_opts.map[detel].svalue);
- }
- else
- filter_str = ghb_settings_get_string(js, "PictureDetelecineCustom");
- filter = hb_filter_init(HB_FILTER_DETELECINE);
- hb_add_filter( job, filter, filter_str );
- g_free(filter_str);
- }
- if ( decomb_deint && decomb )
- {
- filter_str = NULL;
- if (decomb != 1)
- {
- if (decomb_opts.map[decomb].svalue != NULL)
- filter_str = g_strdup(decomb_opts.map[decomb].svalue);
- }
- else
- filter_str = ghb_settings_get_string(js, "PictureDecombCustom");
- filter = hb_filter_init(HB_FILTER_DECOMB);
- hb_add_filter( job, filter, filter_str );
- g_free(filter_str);
- }
- if( job->deinterlace )
- {
- filter_str = NULL;
- if (deint != 1)
- {
- if (deint_opts.map[deint].svalue != NULL)
- filter_str = g_strdup(deint_opts.map[deint].svalue);
- }
- else
- filter_str = ghb_settings_get_string(js, "PictureDeinterlaceCustom");
- filter = hb_filter_init(HB_FILTER_DEINTERLACE);
- hb_add_filter( job, filter, filter_str );
- g_free(filter_str);
- }
- gint denoise = ghb_settings_combo_int(js, "PictureDenoise");
- if( denoise )
- {
- filter_str = NULL;
- if (denoise != 1)
- {
- if (denoise_opts.map[denoise].svalue != NULL)
- filter_str = g_strdup(denoise_opts.map[denoise].svalue);
- }
- else
- filter_str = ghb_settings_get_string(js, "PictureDenoiseCustom");
- filter = hb_filter_init(HB_FILTER_DENOISE);
- hb_add_filter( job, filter, filter_str );
- g_free(filter_str);
- }
- gint deblock = ghb_settings_get_int(js, "PictureDeblock");
- if( deblock >= 5 )
- {
- filter_str = NULL;
- filter_str = g_strdup_printf("%d", deblock);
- filter = hb_filter_init(HB_FILTER_DEBLOCK);
- hb_add_filter( job, filter, filter_str );
- g_free(filter_str);
- }
-
- job->vcodec = ghb_settings_combo_int(js, "VideoEncoder");
- if ((job->mux == HB_MUX_MP4 ) && (job->vcodec == HB_VCODEC_THEORA))
- {
- // mp4/theora combination is not supported.
- job->vcodec = HB_VCODEC_FFMPEG_MPEG4;
- }
- if ((job->vcodec == HB_VCODEC_X264) && (job->mux == HB_MUX_MP4))
- {
- job->ipod_atom = ghb_settings_get_boolean(js, "Mp4iPodCompatible");
- }
- if (ghb_settings_get_boolean(js, "vquality_type_constant"))
- {
- gdouble vquality;
- vquality = ghb_settings_get_double(js, "VideoQualitySlider");
- job->vquality = vquality;
- job->vbitrate = 0;
- }
- else if (ghb_settings_get_boolean(js, "vquality_type_bitrate"))
- {
- job->vquality = -1.0;
- job->vbitrate = ghb_settings_get_int(js, "VideoAvgBitrate");
- }
-
- gint vrate;
- gint vrate_base = ghb_settings_combo_int(js, "VideoFramerate");
- gint cfr;
- if (ghb_settings_get_boolean(js, "VideoFrameratePFR"))
- cfr = 2;
- else if (ghb_settings_get_boolean(js, "VideoFramerateCFR"))
- cfr = 1;
- else
- cfr = 0;
+ gboolean keep_aspect;
+ keep_aspect = ghb_settings_get_boolean(js, "PictureKeepRatio");
+ job->anamorphic.mode = ghb_settings_combo_int(js, "PicturePAR");
+ job->modulus = ghb_settings_combo_int(js, "PictureModulus");
+ if (job->anamorphic.mode)
+ {
+ job->anamorphic.par_width =
+ ghb_settings_get_int(js, "PicturePARWidth");
+ job->anamorphic.par_height =
+ ghb_settings_get_int(js, "PicturePARHeight");
+ job->anamorphic.dar_width = 0;
+ job->anamorphic.dar_height = 0;
+
+ if (job->anamorphic.mode == 3 && !keep_aspect)
+ {
+ job->anamorphic.keep_display_aspect = 0;
+ }
+ else
+ {
+ job->anamorphic.keep_display_aspect = 1;
+ }
+ }
+
+ int width, height, crop[4];
+ width = ghb_settings_get_int(js, "scale_width");
+ height = ghb_settings_get_int(js, "scale_height");
+
+ crop[0] = ghb_settings_get_int(js, "PictureTopCrop");
+ crop[1] = ghb_settings_get_int(js, "PictureBottomCrop");
+ crop[2] = ghb_settings_get_int(js, "PictureLeftCrop");
+ crop[3] = ghb_settings_get_int(js, "PictureRightCrop");
+
+ filter_str = g_strdup_printf("%d:%d:%d:%d:%d:%d",
+ width, height, crop[0], crop[1], crop[2], crop[3]);
+ filter = hb_filter_init(HB_FILTER_CROP_SCALE);
+ hb_add_filter( job, filter, filter_str );
+ g_free(filter_str);
+
+ /* Add selected filters */
+ gint detel = ghb_settings_combo_int(js, "PictureDetelecine");
+ if ( detel )
+ {
+ filter_str = NULL;
+ if (detel != 1)
+ {
+ if (detel_opts.map[detel].svalue != NULL)
+ filter_str = g_strdup(detel_opts.map[detel].svalue);
+ }
+ else
+ filter_str = ghb_settings_get_string(js, "PictureDetelecineCustom");
+ filter = hb_filter_init(HB_FILTER_DETELECINE);
+ hb_add_filter( job, filter, filter_str );
+ g_free(filter_str);
+ }
+ if ( decomb_deint && decomb )
+ {
+ filter_str = NULL;
+ if (decomb != 1)
+ {
+ if (decomb_opts.map[decomb].svalue != NULL)
+ filter_str = g_strdup(decomb_opts.map[decomb].svalue);
+ }
+ else
+ filter_str = ghb_settings_get_string(js, "PictureDecombCustom");
+ filter = hb_filter_init(HB_FILTER_DECOMB);
+ hb_add_filter( job, filter, filter_str );
+ g_free(filter_str);
+ }
+ if( job->deinterlace )
+ {
+ filter_str = NULL;
+ if (deint != 1)
+ {
+ if (deint_opts.map[deint].svalue != NULL)
+ filter_str = g_strdup(deint_opts.map[deint].svalue);
+ }
+ else
+ filter_str = ghb_settings_get_string(js, "PictureDeinterlaceCustom");
+ filter = hb_filter_init(HB_FILTER_DEINTERLACE);
+ hb_add_filter( job, filter, filter_str );
+ g_free(filter_str);
+ }
+ gint denoise = ghb_settings_combo_int(js, "PictureDenoise");
+ if( denoise )
+ {
+ filter_str = NULL;
+ if (denoise != 1)
+ {
+ if (denoise_opts.map[denoise].svalue != NULL)
+ filter_str = g_strdup(denoise_opts.map[denoise].svalue);
+ }
+ else
+ filter_str = ghb_settings_get_string(js, "PictureDenoiseCustom");
+ filter = hb_filter_init(HB_FILTER_DENOISE);
+ hb_add_filter( job, filter, filter_str );
+ g_free(filter_str);
+ }
+ gint deblock = ghb_settings_get_int(js, "PictureDeblock");
+ if( deblock >= 5 )
+ {
+ filter_str = NULL;
+ filter_str = g_strdup_printf("%d", deblock);
+ filter = hb_filter_init(HB_FILTER_DEBLOCK);
+ hb_add_filter( job, filter, filter_str );
+ g_free(filter_str);
+ }
+
+ job->vcodec = ghb_settings_combo_int(js, "VideoEncoder");
+ if ((job->mux == HB_MUX_MP4 ) && (job->vcodec == HB_VCODEC_THEORA))
+ {
+ // mp4/theora combination is not supported.
+ job->vcodec = HB_VCODEC_FFMPEG_MPEG4;
+ }
+ if ((job->vcodec == HB_VCODEC_X264) && (job->mux == HB_MUX_MP4))
+ {
+ job->ipod_atom = ghb_settings_get_boolean(js, "Mp4iPodCompatible");
+ }
+ if (ghb_settings_get_boolean(js, "vquality_type_constant"))
+ {
+ gdouble vquality;
+ vquality = ghb_settings_get_double(js, "VideoQualitySlider");
+ job->vquality = vquality;
+ job->vbitrate = 0;
+ }
+ else if (ghb_settings_get_boolean(js, "vquality_type_bitrate"))
+ {
+ job->vquality = -1.0;
+ job->vbitrate = ghb_settings_get_int(js, "VideoAvgBitrate");
+ }
+
+ gint vrate;
+ gint vrate_base = ghb_settings_combo_int(js, "VideoFramerate");
+ gint cfr;
+ if (ghb_settings_get_boolean(js, "VideoFrameratePFR"))
+ cfr = 2;
+ else if (ghb_settings_get_boolean(js, "VideoFramerateCFR"))
+ cfr = 1;
+ else
+ cfr = 0;
// x264 zero latency requires CFR encode
if (ghb_settings_get_boolean(js, "x264ZeroLatency"))
@@ -4931,351 +4931,351 @@ add_job(hb_handle_t *h, GValue *js, gint unique_id, gint titleindex)
ghb_log("zerolatency x264 tune selected, forcing constant framerate");
}
- if( vrate_base == 0 )
- {
- vrate = title->rate;
- vrate_base = title->rate_base;
- }
- else
- {
- vrate = 27000000;
- }
- filter_str = g_strdup_printf("%d:%d:%d", cfr, vrate, vrate_base);
- filter = hb_filter_init(HB_FILTER_VFR);
- hb_add_filter( job, filter, filter_str );
- g_free(filter_str);
-
- const GValue *audio_list;
- gint count, ii;
- gint tcount = 0;
-
- audio_list = ghb_settings_get_value(js, "audio_list");
- count = ghb_array_len(audio_list);
- for (ii = 0; ii < count; ii++)
- {
- GValue *asettings;
- hb_audio_config_t audio;
- hb_audio_config_t *aconfig;
- gint acodec, fallback;
-
- hb_audio_config_init(&audio);
- asettings = ghb_array_get_nth(audio_list, ii);
- audio.in.track = ghb_settings_get_int(asettings, "AudioTrack");
- audio.out.track = tcount;
-
- char * aname = ghb_settings_get_string(asettings, "AudioTrackName");
- if (aname && *aname)
- {
- // This leaks, but there is no easy way to clean up
- // presently
- audio.out.name = aname;
- }
- else
- {
- g_free(aname);
- }
+ if( vrate_base == 0 )
+ {
+ vrate = title->rate;
+ vrate_base = title->rate_base;
+ }
+ else
+ {
+ vrate = 27000000;
+ }
+ filter_str = g_strdup_printf("%d:%d:%d", cfr, vrate, vrate_base);
+ filter = hb_filter_init(HB_FILTER_VFR);
+ hb_add_filter( job, filter, filter_str );
+ g_free(filter_str);
+
+ const GValue *audio_list;
+ gint count, ii;
+ gint tcount = 0;
+
+ audio_list = ghb_settings_get_value(js, "audio_list");
+ count = ghb_array_len(audio_list);
+ for (ii = 0; ii < count; ii++)
+ {
+ GValue *asettings;
+ hb_audio_config_t audio;
+ hb_audio_config_t *aconfig;
+ gint acodec, fallback;
+
+ hb_audio_config_init(&audio);
+ asettings = ghb_array_get_nth(audio_list, ii);
+ audio.in.track = ghb_settings_get_int(asettings, "AudioTrack");
+ audio.out.track = tcount;
+
+ char * aname = ghb_settings_get_string(asettings, "AudioTrackName");
+ if (aname && *aname)
+ {
+ // This leaks, but there is no easy way to clean up
+ // presently
+ audio.out.name = aname;
+ }
+ else
+ {
+ g_free(aname);
+ }
aconfig = (hb_audio_config_t *) hb_list_audio_config_item(
- title->list_audio, audio.in.track );
+ title->list_audio, audio.in.track );
- acodec = ghb_settings_combo_int(asettings, "AudioEncoder");
+ acodec = ghb_settings_combo_int(asettings, "AudioEncoder");
- fallback = ghb_settings_combo_int(js, "AudioEncoderFallback");
- gint copy_mask = ghb_get_copy_mask(js);
- audio.out.codec = ghb_select_audio_codec(job->mux, aconfig, acodec, fallback, copy_mask);
+ fallback = ghb_settings_combo_int(js, "AudioEncoderFallback");
+ gint copy_mask = ghb_get_copy_mask(js);
+ audio.out.codec = ghb_select_audio_codec(job->mux, aconfig, acodec, fallback, copy_mask);
- audio.out.gain =
- ghb_settings_get_double(asettings, "AudioTrackGain");
+ audio.out.gain =
+ ghb_settings_get_double(asettings, "AudioTrackGain");
audio.out.dynamic_range_compression =
- ghb_settings_get_double(asettings, "AudioTrackDRCSlider");
+ 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 (ghb_audio_is_passthru(audio.out.codec))
- {
- audio.out.mixdown = 0;
- }
- else
- {
- audio.out.mixdown = ghb_settings_combo_int(asettings, "AudioMixdown");
- // Make sure the mixdown is valid and pick a new one if not.
- audio.out.mixdown = ghb_get_best_mix(aconfig, audio.out.codec,
- audio.out.mixdown);
- gint srate = ghb_settings_combo_int(asettings, "AudioSamplerate");
- if (srate == 0) // 0 is same as source
- audio.out.samplerate = aconfig->in.samplerate;
- else
- audio.out.samplerate = srate;
- double quality = ghb_settings_get_double(asettings, "AudioTrackQuality");
- if (ghb_settings_get_boolean(asettings, "AudioTrackQualityEnable") &&
- quality != HB_INVALID_AUDIO_QUALITY)
- {
- audio.out.quality = quality;
- audio.out.bitrate = -1;
- }
- else
- {
- audio.out.quality = HB_INVALID_AUDIO_QUALITY;
- audio.out.bitrate =
- ghb_settings_combo_int(asettings, "AudioBitrate");
-
- audio.out.bitrate = hb_get_best_audio_bitrate(
- audio.out.codec, audio.out.bitrate,
- audio.out.samplerate, audio.out.mixdown);
- }
- }
-
- // Add it to the jobs audio list
+ audio.out.dynamic_range_compression = 0.0;
+
+ // It would be better if this were done in libhb for us, but its not yet.
+ if (ghb_audio_is_passthru(audio.out.codec))
+ {
+ audio.out.mixdown = 0;
+ }
+ else
+ {
+ audio.out.mixdown = ghb_settings_combo_int(asettings, "AudioMixdown");
+ // Make sure the mixdown is valid and pick a new one if not.
+ audio.out.mixdown = ghb_get_best_mix(aconfig, audio.out.codec,
+ audio.out.mixdown);
+ gint srate = ghb_settings_combo_int(asettings, "AudioSamplerate");
+ if (srate == 0) // 0 is same as source
+ audio.out.samplerate = aconfig->in.samplerate;
+ else
+ audio.out.samplerate = srate;
+ double quality = ghb_settings_get_double(asettings, "AudioTrackQuality");
+ if (ghb_settings_get_boolean(asettings, "AudioTrackQualityEnable") &&
+ quality != HB_INVALID_AUDIO_QUALITY)
+ {
+ audio.out.quality = quality;
+ audio.out.bitrate = -1;
+ }
+ else
+ {
+ audio.out.quality = HB_INVALID_AUDIO_QUALITY;
+ audio.out.bitrate =
+ ghb_settings_combo_int(asettings, "AudioBitrate");
+
+ audio.out.bitrate = hb_get_best_audio_bitrate(
+ audio.out.codec, audio.out.bitrate,
+ audio.out.samplerate, audio.out.mixdown);
+ }
+ }
+
+ // Add it to the jobs audio list
hb_audio_add( job, &audio );
- tcount++;
- }
-
- dest_str = ghb_settings_get_string(js, "destination");
- hb_job_set_file( job, dest_str);
- g_free(dest_str);
-
- const GValue *subtitle_list;
- gint subtitle;
- gboolean force, burned, def, one_burned = FALSE;
-
- ghb_settings_set_boolean(js, "subtitle_scan", FALSE);
- subtitle_list = ghb_settings_get_value(js, "subtitle_list");
- count = ghb_array_len(subtitle_list);
- for (ii = 0; ii < count; ii++)
- {
- GValue *ssettings;
- gint source;
-
- ssettings = ghb_array_get_nth(subtitle_list, ii);
-
- force = ghb_settings_get_boolean(ssettings, "SubtitleForced");
- burned = ghb_settings_get_boolean(ssettings, "SubtitleBurned");
- def = ghb_settings_get_boolean(ssettings, "SubtitleDefaultTrack");
- source = ghb_settings_get_int(ssettings, "SubtitleSource");
-
- if (source == SRTSUB)
- {
- hb_subtitle_config_t sub_config;
- gchar *filename, *lang, *code;
-
- filename = ghb_settings_get_string(ssettings, "SrtFile");
- if (!g_file_test(filename, G_FILE_TEST_IS_REGULAR))
- {
- continue;
- }
- sub_config.offset = ghb_settings_get_int(ssettings, "SrtOffset");
- lang = ghb_settings_get_string(ssettings, "SrtLanguage");
- code = ghb_settings_get_string(ssettings, "SrtCodeset");
- strncpy(sub_config.src_filename, filename, 255);
- sub_config.src_filename[255] = 0;
- strncpy(sub_config.src_codeset, code, 39);
- sub_config.src_codeset[39] = 0;
- sub_config.force = 0;
- sub_config.dest = PASSTHRUSUB;
- sub_config.default_track = def;
-
- hb_srt_add( job, &sub_config, lang);
-
- g_free(filename);
- g_free(lang);
- g_free(code);
- continue;
- }
-
- subtitle = ghb_settings_get_int(ssettings, "SubtitleTrack");
- if (subtitle == -1)
- {
- if (!burned)
- {
- job->select_subtitle_config.dest = PASSTHRUSUB;
- }
- else if (burned)
- {
- // Only allow one subtitle to be burned into the video
- if (one_burned)
- continue;
- job->select_subtitle_config.dest = RENDERSUB;
- one_burned = TRUE;
- }
- job->select_subtitle_config.force = force;
- job->select_subtitle_config.default_track = def;
- job->indepth_scan = 1;
- ghb_settings_set_boolean(js, "subtitle_scan", TRUE);
- }
- else if (subtitle >= 0)
- {
- hb_subtitle_t * subt;
- hb_subtitle_config_t sub_config;
-
- subt = (hb_subtitle_t *)hb_list_item(title->list_subtitle, subtitle);
- if (subt != NULL)
- {
- sub_config = subt->config;
- if (!burned)
- {
- sub_config.dest = PASSTHRUSUB;
- }
- else if ( burned && ghb_canBurnSub(subt->source) )
- {
- // Only allow one subtitle to be burned into the video
- if (one_burned)
- continue;
- sub_config.dest = RENDERSUB;
- one_burned = TRUE;
- }
- sub_config.force = force;
- sub_config.default_track = def;
- hb_subtitle_add( job, &sub_config, subtitle );
- }
- }
- }
- if (one_burned)
- {
- // Add filter that renders vobsubs
- filter = hb_filter_init(HB_FILTER_RENDER_SUB);
- filter_str = g_strdup_printf("%d:%d:%d:%d",
- crop[0], crop[1], crop[2], crop[3]);
- hb_add_filter( job, filter, filter_str );
- g_free(filter_str);
- }
-
-
- char * meta;
-
- meta = ghb_settings_get_string(js, "MetaName");
- if (meta && *meta)
- {
- hb_metadata_set_name(job->metadata, meta);
- }
- free(meta);
- meta = ghb_settings_get_string(js, "MetaArtist");
- if (meta && *meta)
- {
- hb_metadata_set_artist(job->metadata, meta);
- }
- free(meta);
- meta = ghb_settings_get_string(js, "MetaAlbumArtist");
- if (meta && *meta)
- {
- hb_metadata_set_album_artist(job->metadata, meta);
- }
- free(meta);
- meta = ghb_settings_get_string(js, "MetaReleaseDate");
- if (meta && *meta)
- {
- hb_metadata_set_release_date(job->metadata, meta);
- }
- free(meta);
- meta = ghb_settings_get_string(js, "MetaComment");
- if (meta && *meta)
- {
- hb_metadata_set_comment(job->metadata, meta);
- }
- free(meta);
- meta = ghb_settings_get_string(js, "MetaGenre");
- if (meta && *meta)
- {
- hb_metadata_set_genre(job->metadata, meta);
- }
- free(meta);
- meta = ghb_settings_get_string(js, "MetaDescription");
- if (meta && *meta)
- {
- hb_metadata_set_description(job->metadata, meta);
- }
- free(meta);
- meta = ghb_settings_get_string(js, "MetaLongDescription");
- if (meta && *meta)
- {
- hb_metadata_set_long_description(job->metadata, meta);
- }
- free(meta);
-
- if (job->indepth_scan == 1)
- {
- // Subtitle scan. Look for subtitle matching audio language
-
- /*
- * When subtitle scan is enabled do a fast pre-scan job
- * which will determine which subtitles to enable, if any.
- */
- job->pass = -1;
- job->indepth_scan = 1;
- hb_job_set_advanced_opts(job, NULL);
-
- /*
- * Add the pre-scan job
- */
- job->sequence_id = (unique_id & 0xFFFFFF) | (sub_id++ << 24);
- hb_add( h, job );
- }
-
- if( ghb_settings_get_boolean(js, "VideoTwoPass") &&
- !ghb_settings_get_boolean(js, "vquality_type_constant"))
- {
- /*
- * If subtitle_scan is enabled then only turn it on
- * for the second pass and then off again for the
- * second.
- */
- job->pass = 1;
- job->indepth_scan = 0;
+ tcount++;
+ }
+
+ dest_str = ghb_settings_get_string(js, "destination");
+ hb_job_set_file( job, dest_str);
+ g_free(dest_str);
+
+ const GValue *subtitle_list;
+ gint subtitle;
+ gboolean force, burned, def, one_burned = FALSE;
+
+ ghb_settings_set_boolean(js, "subtitle_scan", FALSE);
+ subtitle_list = ghb_settings_get_value(js, "subtitle_list");
+ count = ghb_array_len(subtitle_list);
+ for (ii = 0; ii < count; ii++)
+ {
+ GValue *ssettings;
+ gint source;
+
+ ssettings = ghb_array_get_nth(subtitle_list, ii);
+
+ force = ghb_settings_get_boolean(ssettings, "SubtitleForced");
+ burned = ghb_settings_get_boolean(ssettings, "SubtitleBurned");
+ def = ghb_settings_get_boolean(ssettings, "SubtitleDefaultTrack");
+ source = ghb_settings_get_int(ssettings, "SubtitleSource");
+
+ if (source == SRTSUB)
+ {
+ hb_subtitle_config_t sub_config;
+ gchar *filename, *lang, *code;
+
+ filename = ghb_settings_get_string(ssettings, "SrtFile");
+ if (!g_file_test(filename, G_FILE_TEST_IS_REGULAR))
+ {
+ continue;
+ }
+ sub_config.offset = ghb_settings_get_int(ssettings, "SrtOffset");
+ lang = ghb_settings_get_string(ssettings, "SrtLanguage");
+ code = ghb_settings_get_string(ssettings, "SrtCodeset");
+ strncpy(sub_config.src_filename, filename, 255);
+ sub_config.src_filename[255] = 0;
+ strncpy(sub_config.src_codeset, code, 39);
+ sub_config.src_codeset[39] = 0;
+ sub_config.force = 0;
+ sub_config.dest = PASSTHRUSUB;
+ sub_config.default_track = def;
+
+ hb_srt_add( job, &sub_config, lang);
+
+ g_free(filename);
+ g_free(lang);
+ g_free(code);
+ continue;
+ }
+
+ subtitle = ghb_settings_get_int(ssettings, "SubtitleTrack");
+ if (subtitle == -1)
+ {
+ if (!burned)
+ {
+ job->select_subtitle_config.dest = PASSTHRUSUB;
+ }
+ else if (burned)
+ {
+ // Only allow one subtitle to be burned into the video
+ if (one_burned)
+ continue;
+ job->select_subtitle_config.dest = RENDERSUB;
+ one_burned = TRUE;
+ }
+ job->select_subtitle_config.force = force;
+ job->select_subtitle_config.default_track = def;
+ job->indepth_scan = 1;
+ ghb_settings_set_boolean(js, "subtitle_scan", TRUE);
+ }
+ else if (subtitle >= 0)
+ {
+ hb_subtitle_t * subt;
+ hb_subtitle_config_t sub_config;
+
+ subt = (hb_subtitle_t *)hb_list_item(title->list_subtitle, subtitle);
+ if (subt != NULL)
+ {
+ sub_config = subt->config;
+ if (!burned)
+ {
+ sub_config.dest = PASSTHRUSUB;
+ }
+ else if ( burned && ghb_canBurnSub(subt->source) )
+ {
+ // Only allow one subtitle to be burned into the video
+ if (one_burned)
+ continue;
+ sub_config.dest = RENDERSUB;
+ one_burned = TRUE;
+ }
+ sub_config.force = force;
+ sub_config.default_track = def;
+ hb_subtitle_add( job, &sub_config, subtitle );
+ }
+ }
+ }
+ if (one_burned)
+ {
+ // Add filter that renders vobsubs
+ filter = hb_filter_init(HB_FILTER_RENDER_SUB);
+ filter_str = g_strdup_printf("%d:%d:%d:%d",
+ crop[0], crop[1], crop[2], crop[3]);
+ hb_add_filter( job, filter, filter_str );
+ g_free(filter_str);
+ }
+
+
+ char * meta;
+
+ meta = ghb_settings_get_string(js, "MetaName");
+ if (meta && *meta)
+ {
+ hb_metadata_set_name(job->metadata, meta);
+ }
+ free(meta);
+ meta = ghb_settings_get_string(js, "MetaArtist");
+ if (meta && *meta)
+ {
+ hb_metadata_set_artist(job->metadata, meta);
+ }
+ free(meta);
+ meta = ghb_settings_get_string(js, "MetaAlbumArtist");
+ if (meta && *meta)
+ {
+ hb_metadata_set_album_artist(job->metadata, meta);
+ }
+ free(meta);
+ meta = ghb_settings_get_string(js, "MetaReleaseDate");
+ if (meta && *meta)
+ {
+ hb_metadata_set_release_date(job->metadata, meta);
+ }
+ free(meta);
+ meta = ghb_settings_get_string(js, "MetaComment");
+ if (meta && *meta)
+ {
+ hb_metadata_set_comment(job->metadata, meta);
+ }
+ free(meta);
+ meta = ghb_settings_get_string(js, "MetaGenre");
+ if (meta && *meta)
+ {
+ hb_metadata_set_genre(job->metadata, meta);
+ }
+ free(meta);
+ meta = ghb_settings_get_string(js, "MetaDescription");
+ if (meta && *meta)
+ {
+ hb_metadata_set_description(job->metadata, meta);
+ }
+ free(meta);
+ meta = ghb_settings_get_string(js, "MetaLongDescription");
+ if (meta && *meta)
+ {
+ hb_metadata_set_long_description(job->metadata, meta);
+ }
+ free(meta);
+
+ if (job->indepth_scan == 1)
+ {
+ // Subtitle scan. Look for subtitle matching audio language
+
+ /*
+ * When subtitle scan is enabled do a fast pre-scan job
+ * which will determine which subtitles to enable, if any.
+ */
+ job->pass = -1;
+ job->indepth_scan = 1;
+ hb_job_set_advanced_opts(job, NULL);
+
+ /*
+ * Add the pre-scan job
+ */
+ job->sequence_id = (unique_id & 0xFFFFFF) | (sub_id++ << 24);
+ hb_add( h, job );
+ }
+
+ if( ghb_settings_get_boolean(js, "VideoTwoPass") &&
+ !ghb_settings_get_boolean(js, "vquality_type_constant"))
+ {
+ /*
+ * If subtitle_scan is enabled then only turn it on
+ * for the second pass and then off again for the
+ * second.
+ */
+ job->pass = 1;
+ job->indepth_scan = 0;
ghb_set_video_encoder_opts(job, js);
- /*
- * If turbo options have been selected then set job->fastfirstpass
- */
- if( ghb_settings_get_boolean(js, "VideoTurboTwoPass") &&
- job->vcodec == HB_VCODEC_X264 )
- {
- job->fastfirstpass = 1;
- }
- else
- {
- job->fastfirstpass = 0;
- }
-
- job->sequence_id = (unique_id & 0xFFFFFF) | (sub_id++ << 24);
- hb_add( h, job );
-
- job->pass = 2;
- /*
- * On the second pass we turn off subtitle scan so that we
- * can actually encode using any subtitles that were auto
- * selected in the first pass (using the whacky select-subtitle
- * attribute of the job).
- */
- job->indepth_scan = 0;
- job->sequence_id = (unique_id & 0xFFFFFF) | (sub_id++ << 24);
- hb_add( h, job );
- }
- else
- {
+ /*
+ * If turbo options have been selected then set job->fastfirstpass
+ */
+ if( ghb_settings_get_boolean(js, "VideoTurboTwoPass") &&
+ job->vcodec == HB_VCODEC_X264 )
+ {
+ job->fastfirstpass = 1;
+ }
+ else
+ {
+ job->fastfirstpass = 0;
+ }
+
+ job->sequence_id = (unique_id & 0xFFFFFF) | (sub_id++ << 24);
+ hb_add( h, job );
+
+ job->pass = 2;
+ /*
+ * On the second pass we turn off subtitle scan so that we
+ * can actually encode using any subtitles that were auto
+ * selected in the first pass (using the whacky select-subtitle
+ * attribute of the job).
+ */
+ job->indepth_scan = 0;
+ job->sequence_id = (unique_id & 0xFFFFFF) | (sub_id++ << 24);
+ hb_add( h, job );
+ }
+ else
+ {
ghb_set_video_encoder_opts(job, js);
- job->indepth_scan = 0;
- job->pass = 0;
- job->sequence_id = (unique_id & 0xFFFFFF) | (sub_id++ << 24);
- hb_add( h, job );
- }
+ job->indepth_scan = 0;
+ job->pass = 0;
+ job->sequence_id = (unique_id & 0xFFFFFF) | (sub_id++ << 24);
+ hb_add( h, job );
+ }
- hb_job_close(&job);
+ hb_job_close(&job);
}
void
ghb_add_job(GValue *js, gint unique_id)
{
- // Since I'm doing a scan of the single title I want just prior
- // to adding the job, there is only the one title to choose from.
- add_job(h_queue, js, unique_id, 0);
+ // Since I'm doing a scan of the single title I want just prior
+ // to adding the job, there is only the one title to choose from.
+ add_job(h_queue, js, unique_id, 0);
}
void
ghb_add_live_job(GValue *js, gint unique_id)
{
- gint titleindex = ghb_settings_combo_int(js, "title");
- add_job(h_scan, js, unique_id, titleindex);
+ gint titleindex = ghb_settings_combo_int(js, "title");
+ add_job(h_scan, js, unique_id, titleindex);
}
void
@@ -5283,40 +5283,40 @@ ghb_remove_job(gint unique_id)
{
hb_job_t * job;
gint ii;
-
- // Multiples passes all get the same id
- // remove them all.
- // Go backwards through list, so reordering doesn't screw me.
- ii = hb_count(h_queue) - 1;
+
+ // Multiples passes all get the same id
+ // remove them all.
+ // Go backwards through list, so reordering doesn't screw me.
+ ii = hb_count(h_queue) - 1;
while ((job = hb_job(h_queue, ii--)) != NULL)
{
if ((job->sequence_id & 0xFFFFFF) == unique_id)
- hb_rem(h_queue, job);
+ hb_rem(h_queue, job);
}
}
void
ghb_start_queue()
{
- hb_start( h_queue );
+ hb_start( h_queue );
}
void
ghb_stop_queue()
{
- hb_stop( h_queue );
+ hb_stop( h_queue );
}
void
ghb_start_live_encode()
{
- hb_start( h_scan );
+ hb_start( h_scan );
}
void
ghb_stop_live_encode()
{
- hb_stop( h_scan );
+ hb_stop( h_scan );
}
void
@@ -5327,296 +5327,296 @@ ghb_pause_queue()
if( s.state == HB_STATE_PAUSED )
{
- hb_status.queue.state &= ~GHB_STATE_PAUSED;
- hb_resume( h_queue );
+ hb_status.queue.state &= ~GHB_STATE_PAUSED;
+ hb_resume( h_queue );
}
else
{
- hb_status.queue.state |= GHB_STATE_PAUSED;
- hb_pause( h_queue );
+ hb_status.queue.state |= GHB_STATE_PAUSED;
+ hb_pause( h_queue );
}
}
static void
vert_line(
- GdkPixbuf * pb,
- guint8 r,
- guint8 g,
- guint8 b,
- gint x,
- gint y,
- gint len,
- gint width)
-{
- guint8 *pixels = gdk_pixbuf_get_pixels (pb);
- guint8 *dst;
- gint ii, jj;
- gint channels = gdk_pixbuf_get_n_channels (pb);
- gint stride = gdk_pixbuf_get_rowstride (pb);
-
- for (jj = 0; jj < width; jj++)
- {
- dst = pixels + y * stride + (x+jj) * channels;
- for (ii = 0; ii < len; ii++)
- {
- dst[0] = r;
- dst[1] = g;
- dst[2] = b;
- dst += stride;
- }
- }
+ GdkPixbuf * pb,
+ guint8 r,
+ guint8 g,
+ guint8 b,
+ gint x,
+ gint y,
+ gint len,
+ gint width)
+{
+ guint8 *pixels = gdk_pixbuf_get_pixels (pb);
+ guint8 *dst;
+ gint ii, jj;
+ gint channels = gdk_pixbuf_get_n_channels (pb);
+ gint stride = gdk_pixbuf_get_rowstride (pb);
+
+ for (jj = 0; jj < width; jj++)
+ {
+ dst = pixels + y * stride + (x+jj) * channels;
+ for (ii = 0; ii < len; ii++)
+ {
+ dst[0] = r;
+ dst[1] = g;
+ dst[2] = b;
+ dst += stride;
+ }
+ }
}
static void
horz_line(
- GdkPixbuf * pb,
- guint8 r,
- guint8 g,
- guint8 b,
- gint x,
- gint y,
- gint len,
- gint width)
-{
- guint8 *pixels = gdk_pixbuf_get_pixels (pb);
- guint8 *dst;
- gint ii, jj;
- gint channels = gdk_pixbuf_get_n_channels (pb);
- gint stride = gdk_pixbuf_get_rowstride (pb);
-
- for (jj = 0; jj < width; jj++)
- {
- dst = pixels + (y+jj) * stride + x * channels;
- for (ii = 0; ii < len; ii++)
- {
- dst[0] = r;
- dst[1] = g;
- dst[2] = b;
- dst += channels;
- }
- }
+ GdkPixbuf * pb,
+ guint8 r,
+ guint8 g,
+ guint8 b,
+ gint x,
+ gint y,
+ gint len,
+ gint width)
+{
+ guint8 *pixels = gdk_pixbuf_get_pixels (pb);
+ guint8 *dst;
+ gint ii, jj;
+ gint channels = gdk_pixbuf_get_n_channels (pb);
+ gint stride = gdk_pixbuf_get_rowstride (pb);
+
+ for (jj = 0; jj < width; jj++)
+ {
+ dst = pixels + (y+jj) * stride + x * channels;
+ for (ii = 0; ii < len; ii++)
+ {
+ dst[0] = r;
+ dst[1] = g;
+ dst[2] = b;
+ dst += channels;
+ }
+ }
}
static void
hash_pixbuf(
- GdkPixbuf * pb,
- gint x,
- gint y,
- gint w,
- gint h,
- gint step,
- gint orientation)
-{
- gint ii, jj;
- gint line_width = 8;
- struct
- {
- guint8 r;
- guint8 g;
- guint8 b;
- } c[4] =
- {{0x80, 0x80, 0x80},{0xC0, 0x80, 0x70},{0x80, 0xA0, 0x80},{0x70, 0x80, 0xA0}};
-
- if (!orientation)
- {
- // vertical lines
- for (ii = x, jj = 0; ii+line_width < x+w; ii += step, jj++)
- {
- vert_line(pb, c[jj&3].r, c[jj&3].g, c[jj&3].b, ii, y, h, line_width);
- }
- }
- else
- {
- // horizontal lines
- for (ii = y, jj = 0; ii+line_width < y+h; ii += step, jj++)
- {
- horz_line(pb, c[jj&3].r, c[jj&3].g, c[jj&3].b, x, ii, w, line_width);
- }
- }
+ GdkPixbuf * pb,
+ gint x,
+ gint y,
+ gint w,
+ gint h,
+ gint step,
+ gint orientation)
+{
+ gint ii, jj;
+ gint line_width = 8;
+ struct
+ {
+ guint8 r;
+ guint8 g;
+ guint8 b;
+ } c[4] =
+ {{0x80, 0x80, 0x80},{0xC0, 0x80, 0x70},{0x80, 0xA0, 0x80},{0x70, 0x80, 0xA0}};
+
+ if (!orientation)
+ {
+ // vertical lines
+ for (ii = x, jj = 0; ii+line_width < x+w; ii += step, jj++)
+ {
+ vert_line(pb, c[jj&3].r, c[jj&3].g, c[jj&3].b, ii, y, h, line_width);
+ }
+ }
+ else
+ {
+ // horizontal lines
+ for (ii = y, jj = 0; ii+line_width < y+h; ii += step, jj++)
+ {
+ horz_line(pb, c[jj&3].r, c[jj&3].g, c[jj&3].b, x, ii, w, line_width);
+ }
+ }
}
GdkPixbuf*
ghb_get_preview_image(
- gint titleindex,
- gint index,
- signal_user_data_t *ud,
- gint *out_width,
- gint *out_height)
-{
- GValue *settings;
- hb_title_t *title;
- hb_job_t *job;
-
- settings = ud->settings;
- title = ghb_get_title_info( titleindex );
- if( title == NULL ) return NULL;
-
- job = hb_job_init( title );
- if (job == NULL) return NULL;
-
- set_preview_job_settings(job, settings);
-
- // hb_get_preview doesn't compensate for anamorphic, so lets
- // calculate scale factors
- gint width, height, par_width = 1, par_height = 1;
- gint pic_par = ghb_settings_combo_int(settings, "PicturePAR");
- if (pic_par)
- {
- hb_set_anamorphic_size( job, &width, &height,
- &par_width, &par_height );
- }
-
- // Make sure we have a big enough buffer to receive the image from libhb
- gint dstWidth = job->width;
- gint dstHeight= job->height;
-
- static guint8 *buffer = NULL;
- static gint bufferSize = 0;
- gint newSize;
-
- newSize = dstWidth * dstHeight * 4;
- if( bufferSize < newSize )
- {
- bufferSize = newSize;
- buffer = (guint8*) g_realloc( buffer, bufferSize );
- }
- hb_get_preview( h_scan, job, index, buffer );
- hb_job_close( &job );
-
- // Create an GdkPixbuf and copy the libhb image into it, converting it from
- // libhb's format something suitable.
-
- // The image data returned by hb_get_preview is 4 bytes per pixel,
- // BGRA format. Alpha is ignored.
-
- GdkPixbuf *preview = gdk_pixbuf_new(GDK_COLORSPACE_RGB, FALSE, 8, dstWidth, dstHeight);
- guint8 *pixels = gdk_pixbuf_get_pixels (preview);
-
- guint32 *src = (guint32*)buffer;
- guint8 *dst = pixels;
-
- gint ii, jj;
- gint channels = gdk_pixbuf_get_n_channels (preview);
- gint stride = gdk_pixbuf_get_rowstride (preview);
- guint8 *tmp;
-
- for (ii = 0; ii < dstHeight; ii++)
- {
- tmp = dst;
- for (jj = 0; jj < dstWidth; jj++)
- {
- tmp[0] = src[0] >> 16;
- tmp[1] = src[0] >> 8;
- tmp[2] = src[0] >> 0;
- tmp += channels;
- src++;
- }
- dst += stride;
- }
- gint w = ghb_settings_get_int(settings, "scale_width");
- gint h = ghb_settings_get_int(settings, "scale_height");
- ghb_par_scale(ud, &w, &h, par_width, par_height);
-
- gint c0, c1, c2, c3;
- c0 = ghb_settings_get_int(settings, "PictureTopCrop");
- c1 = ghb_settings_get_int(settings, "PictureBottomCrop");
- c2 = ghb_settings_get_int(settings, "PictureLeftCrop");
- c3 = ghb_settings_get_int(settings, "PictureRightCrop");
-
- gdouble xscale = (gdouble)w / (gdouble)(title->width - c2 - c3);
- gdouble yscale = (gdouble)h / (gdouble)(title->height - c0 - c1);
-
- ghb_par_scale(ud, &dstWidth, &dstHeight, par_width, par_height);
- *out_width = w;
- *out_height = h;
- if (ghb_settings_get_boolean(settings, "reduce_hd_preview"))
- {
- GdkScreen *ss;
- gint s_w, s_h;
- gint orig_w, orig_h;
- gint factor = 80;
-
- if (ghb_settings_get_boolean(settings, "preview_fullscreen"))
- {
- factor = 100;
- }
- ss = gdk_screen_get_default();
- s_w = gdk_screen_get_width(ss);
- s_h = gdk_screen_get_height(ss);
- orig_w = dstWidth;
- orig_h = dstHeight;
-
- if (dstWidth > s_w * factor / 100)
- {
- dstWidth = s_w * factor / 100;
- dstHeight = dstHeight * dstWidth / orig_w;
- }
- if (dstHeight > s_h * factor / 100)
- {
- dstHeight = s_h * factor / 100;
- dstWidth = orig_w * dstHeight / orig_h;
- }
- xscale *= (gdouble)dstWidth / orig_w;
- yscale *= (gdouble)dstHeight / orig_h;
- w *= (gdouble)dstWidth / orig_w;
- h *= (gdouble)dstHeight / orig_h;
- }
- GdkPixbuf *scaled_preview;
- scaled_preview = gdk_pixbuf_scale_simple(preview, dstWidth, dstHeight, GDK_INTERP_HYPER);
- if (ghb_settings_get_boolean(settings, "show_crop"))
- {
- c0 *= yscale;
- c1 *= yscale;
- c2 *= xscale;
- c3 *= xscale;
- // Top
- hash_pixbuf(scaled_preview, c2, 0, w, c0, 32, 0);
- // Bottom
- hash_pixbuf(scaled_preview, c2, dstHeight-c1, w, c1, 32, 0);
- // Left
- hash_pixbuf(scaled_preview, 0, c0, c2, h, 32, 1);
- // Right
- hash_pixbuf(scaled_preview, dstWidth-c3, c0, c3, h, 32, 1);
- }
- g_object_unref (preview);
- return scaled_preview;
+ gint titleindex,
+ gint index,
+ signal_user_data_t *ud,
+ gint *out_width,
+ gint *out_height)
+{
+ GValue *settings;
+ hb_title_t *title;
+ hb_job_t *job;
+
+ settings = ud->settings;
+ title = ghb_get_title_info( titleindex );
+ if( title == NULL ) return NULL;
+
+ job = hb_job_init( title );
+ if (job == NULL) return NULL;
+
+ set_preview_job_settings(job, settings);
+
+ // hb_get_preview doesn't compensate for anamorphic, so lets
+ // calculate scale factors
+ gint width, height, par_width = 1, par_height = 1;
+ gint pic_par = ghb_settings_combo_int(settings, "PicturePAR");
+ if (pic_par)
+ {
+ hb_set_anamorphic_size( job, &width, &height,
+ &par_width, &par_height );
+ }
+
+ // Make sure we have a big enough buffer to receive the image from libhb
+ gint dstWidth = job->width;
+ gint dstHeight= job->height;
+
+ static guint8 *buffer = NULL;
+ static gint bufferSize = 0;
+ gint newSize;
+
+ newSize = dstWidth * dstHeight * 4;
+ if( bufferSize < newSize )
+ {
+ bufferSize = newSize;
+ buffer = (guint8*) g_realloc( buffer, bufferSize );
+ }
+ hb_get_preview( h_scan, job, index, buffer );
+ hb_job_close( &job );
+
+ // Create an GdkPixbuf and copy the libhb image into it, converting it from
+ // libhb's format something suitable.
+
+ // The image data returned by hb_get_preview is 4 bytes per pixel,
+ // BGRA format. Alpha is ignored.
+
+ GdkPixbuf *preview = gdk_pixbuf_new(GDK_COLORSPACE_RGB, FALSE, 8, dstWidth, dstHeight);
+ guint8 *pixels = gdk_pixbuf_get_pixels (preview);
+
+ guint32 *src = (guint32*)buffer;
+ guint8 *dst = pixels;
+
+ gint ii, jj;
+ gint channels = gdk_pixbuf_get_n_channels (preview);
+ gint stride = gdk_pixbuf_get_rowstride (preview);
+ guint8 *tmp;
+
+ for (ii = 0; ii < dstHeight; ii++)
+ {
+ tmp = dst;
+ for (jj = 0; jj < dstWidth; jj++)
+ {
+ tmp[0] = src[0] >> 16;
+ tmp[1] = src[0] >> 8;
+ tmp[2] = src[0] >> 0;
+ tmp += channels;
+ src++;
+ }
+ dst += stride;
+ }
+ gint w = ghb_settings_get_int(settings, "scale_width");
+ gint h = ghb_settings_get_int(settings, "scale_height");
+ ghb_par_scale(ud, &w, &h, par_width, par_height);
+
+ gint c0, c1, c2, c3;
+ c0 = ghb_settings_get_int(settings, "PictureTopCrop");
+ c1 = ghb_settings_get_int(settings, "PictureBottomCrop");
+ c2 = ghb_settings_get_int(settings, "PictureLeftCrop");
+ c3 = ghb_settings_get_int(settings, "PictureRightCrop");
+
+ gdouble xscale = (gdouble)w / (gdouble)(title->width - c2 - c3);
+ gdouble yscale = (gdouble)h / (gdouble)(title->height - c0 - c1);
+
+ ghb_par_scale(ud, &dstWidth, &dstHeight, par_width, par_height);
+ *out_width = w;
+ *out_height = h;
+ if (ghb_settings_get_boolean(settings, "reduce_hd_preview"))
+ {
+ GdkScreen *ss;
+ gint s_w, s_h;
+ gint orig_w, orig_h;
+ gint factor = 80;
+
+ if (ghb_settings_get_boolean(settings, "preview_fullscreen"))
+ {
+ factor = 100;
+ }
+ ss = gdk_screen_get_default();
+ s_w = gdk_screen_get_width(ss);
+ s_h = gdk_screen_get_height(ss);
+ orig_w = dstWidth;
+ orig_h = dstHeight;
+
+ if (dstWidth > s_w * factor / 100)
+ {
+ dstWidth = s_w * factor / 100;
+ dstHeight = dstHeight * dstWidth / orig_w;
+ }
+ if (dstHeight > s_h * factor / 100)
+ {
+ dstHeight = s_h * factor / 100;
+ dstWidth = orig_w * dstHeight / orig_h;
+ }
+ xscale *= (gdouble)dstWidth / orig_w;
+ yscale *= (gdouble)dstHeight / orig_h;
+ w *= (gdouble)dstWidth / orig_w;
+ h *= (gdouble)dstHeight / orig_h;
+ }
+ GdkPixbuf *scaled_preview;
+ scaled_preview = gdk_pixbuf_scale_simple(preview, dstWidth, dstHeight, GDK_INTERP_HYPER);
+ if (ghb_settings_get_boolean(settings, "show_crop"))
+ {
+ c0 *= yscale;
+ c1 *= yscale;
+ c2 *= xscale;
+ c3 *= xscale;
+ // Top
+ hash_pixbuf(scaled_preview, c2, 0, w, c0, 32, 0);
+ // Bottom
+ hash_pixbuf(scaled_preview, c2, dstHeight-c1, w, c1, 32, 0);
+ // Left
+ hash_pixbuf(scaled_preview, 0, c0, c2, h, 32, 1);
+ // Right
+ hash_pixbuf(scaled_preview, dstWidth-c3, c0, c3, h, 32, 1);
+ }
+ g_object_unref (preview);
+ return scaled_preview;
}
static void
sanitize_volname(gchar *name)
{
- gchar *a, *b;
-
- a = b = name;
- while (*b)
- {
- switch(*b)
- {
- case '<':
- b++;
- break;
- case '>':
- b++;
- break;
- default:
- *a = *b & 0x7f;
- a++; b++;
- break;
- }
- }
- *a = 0;
+ gchar *a, *b;
+
+ a = b = name;
+ while (*b)
+ {
+ switch(*b)
+ {
+ case '<':
+ b++;
+ break;
+ case '>':
+ b++;
+ break;
+ default:
+ *a = *b & 0x7f;
+ a++; b++;
+ break;
+ }
+ }
+ *a = 0;
}
gchar*
ghb_dvd_volname(const gchar *device)
{
- gchar *name;
- name = hb_dvd_name((gchar*)device);
- if (name != NULL && name[0] != 0)
- {
- name = g_strdup(name);
- sanitize_volname(name);
- return name;
- }
- return NULL;
+ gchar *name;
+ name = hb_dvd_name((gchar*)device);
+ if (name != NULL && name[0] != 0)
+ {
+ name = g_strdup(name);
+ sanitize_volname(name);
+ return name;
+ }
+ return NULL;
}