OSDN Git Service

WinGui:
[handbrake-jp/handbrake-jp-git.git] / gtk / src / hb-backend.c
index b577a5b..8f1ac95 100644 (file)
@@ -948,7 +948,7 @@ ghb_find_closest_audio_bitrate(gint codec, gint rate)
        gint result;
 
        if (codec == HB_ACODEC_FAAC)
-               high = 160;
+               high = 320;
 
        result = high;
        for (ii = 0; ii < hb_audio_bitrates_count; ii++)
@@ -1095,14 +1095,14 @@ get_amix_value(gint val)
 static hb_handle_t * h_scan = NULL;
 static hb_handle_t * h_queue = NULL;
 
-extern void hb_get_tempory_directory(hb_handle_t *h, char path[512]);
+extern void hb_get_temporary_directory(char path[512]);
 
 gchar*
 ghb_get_tmp_dir()
 {
        char dir[512];
 
-       hb_get_tempory_directory(h_scan, dir);
+       hb_get_temporary_directory(dir);
        return g_strdup(dir);
 }
 
@@ -1111,7 +1111,7 @@ ghb_hb_cleanup(gboolean partial)
 {
        char dir[512];
 
-       hb_get_tempory_directory(h_scan, dir);
+       hb_get_temporary_directory(dir);
        del_tree(dir, !partial);
 }
 
@@ -1149,6 +1149,37 @@ ghb_subtitle_track_source(signal_user_data_t *ud, gint track)
 }
 
 const char*
+ghb_subtitle_source_name(gint source)
+{
+       const gchar * name = "Unknown";
+       switch (source)
+       {
+               case VOBSUB:
+                       name = "VOBSUB";
+                       break;
+               case TX3GSUB:
+                       name = "TX3G";
+                       break;
+               case UTF8SUB:
+                       name = "UTF8";
+                       break;
+               case CC708SUB:
+               case CC608SUB:
+                       name = "CC";
+                       break;
+               case SRTSUB:
+                       name = "SRT";
+                       break;
+               case SSASUB:
+                       name = "SSA";
+                       break;
+               default:
+                       break;
+       }
+       return name;
+}
+
+const char*
 ghb_subtitle_track_source_name(signal_user_data_t *ud, gint track)
 {
        gint titleindex;
@@ -1186,21 +1217,7 @@ ghb_subtitle_track_source_name(signal_user_data_t *ud, gint track)
        sub = hb_list_item( title->list_subtitle, track);
        if (sub != NULL)
        {
-               switch (sub->source)
-               {
-                       case VOBSUB:
-                               name = "Bitmap";
-                               break;
-                       case CC708SUB:
-                       case CC608SUB:
-                               name = "Text";
-                               break;
-                       case SRTSUB:
-                               name = "SRT";
-                               break;
-                       default:
-                               break;
-               }
+               name = ghb_subtitle_source_name(sub->source);
        }
 
 done:
@@ -1384,7 +1401,6 @@ ghb_grey_combo_options(GtkBuilder *builder)
        }
        if (container == HB_MUX_MP4)
        {
-               grey_combo_box_item(builder, "AudioEncoder", HB_ACODEC_LAME, TRUE);
                grey_combo_box_item(builder, "AudioEncoder", HB_ACODEC_VORBIS, TRUE);
                grey_combo_box_item(builder, "VideoEncoder", HB_VCODEC_THEORA, TRUE);
        }
@@ -1394,12 +1410,10 @@ ghb_grey_combo_options(GtkBuilder *builder)
        gboolean allow_dolby = TRUE;
        gboolean allow_dpl2 = TRUE;
        gboolean allow_6ch = TRUE;
-       allow_mono = acodec & ~HB_ACODEC_LAME;
+       allow_mono = TRUE;
        allow_6ch = acodec & ~HB_ACODEC_LAME;
        if (audio)
        {
-               allow_mono = allow_mono &&
-                       (audio->in.codec & (HB_ACODEC_AC3|HB_ACODEC_DCA));
                gint layout = audio->in.channel_layout & HB_INPUT_CH_LAYOUT_DISCRETE_NO_LFE_MASK;
                allow_stereo =
                        ((layout == HB_INPUT_CH_LAYOUT_MONO && !allow_mono) || layout >= HB_INPUT_CH_LAYOUT_STEREO);
@@ -1409,7 +1423,6 @@ ghb_grey_combo_options(GtkBuilder *builder)
                        (layout == HB_INPUT_CH_LAYOUT_DOLBY);
                allow_dpl2 = (layout == HB_INPUT_CH_LAYOUT_3F2R);
                allow_6ch = allow_6ch &&
-                       (audio->in.codec & (HB_ACODEC_AC3|HB_ACODEC_DCA)) &&
                        (layout == HB_INPUT_CH_LAYOUT_3F2R) && 
                        (audio->in.channel_layout & HB_INPUT_CH_LAYOUT_HAS_LFE);
        }
@@ -1425,7 +1438,12 @@ ghb_get_best_audio_bitrate(gint acodec, gint br, gint channels)
 {
        if (acodec & HB_ACODEC_FAAC)
        {
-       int maxbr = channels * 80;
+               int maxbr;
+
+               if (channels == 2)
+                       maxbr = 320;
+               else
+                       maxbr = 768;
                if (br > maxbr)
                        br = maxbr;
        }
@@ -1450,9 +1468,7 @@ ghb_get_best_mix(gint titleindex, gint track, gint acodec, gint mix)
        audio = get_hb_audio(titleindex, track);
        if (audio)
        {
-               allow_mono =
-                       (audio->in.codec & (HB_ACODEC_AC3|HB_ACODEC_DCA)) &&
-                       (acodec & ~HB_ACODEC_LAME);
+               allow_mono = TRUE;
                gint layout = audio->in.channel_layout & HB_INPUT_CH_LAYOUT_DISCRETE_NO_LFE_MASK;
                allow_stereo =
                        ((layout == HB_INPUT_CH_LAYOUT_MONO && !allow_mono) || layout >= HB_INPUT_CH_LAYOUT_STEREO);
@@ -1462,7 +1478,6 @@ ghb_get_best_mix(gint titleindex, gint track, gint acodec, gint mix)
                        (layout == HB_INPUT_CH_LAYOUT_DOLBY);
                allow_dpl2 = (layout == HB_INPUT_CH_LAYOUT_3F2R);
                allow_6ch =
-                       (audio->in.codec & (HB_ACODEC_AC3|HB_ACODEC_DCA)) &&
                        (acodec & ~HB_ACODEC_LAME) &&
                        (layout == HB_INPUT_CH_LAYOUT_3F2R) && 
                        (audio->in.channel_layout & HB_INPUT_CH_LAYOUT_HAS_LFE);
@@ -1968,7 +1983,18 @@ subtitle_track_opts_set(GtkBuilder *builder, const gchar *name, gint titleindex)
                        subtitle = (hb_subtitle_t *)hb_list_item(title->list_subtitle, ii);
                        // Skip subtitles that must be burned if there is already
                        // a burned subtitle in the list
-                       options[ii] = g_strdup_printf("%d - %s", ii+1, subtitle->lang);
+#if 0
+                       if (subtitle->source == VOBSUB)
+                       {
+                               options[ii] = g_strdup_printf("%d - %s", ii+1, subtitle->lang);
+                       }
+                       else
+#endif
+                       {
+                               options[ii] = g_strdup_printf("%d - %s (%s)", ii+1, 
+                                       subtitle->lang, 
+                                       ghb_subtitle_source_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;
@@ -2019,21 +2045,23 @@ ghb_longest_title()
        hb_title_t * title;
        gint ii;
        gint count = 0;
-       guint64 longest = 0;
        gint titleindex = 0;
+       gint feature;
        
        g_debug("ghb_longest_title ()\n");
        if (h_scan == NULL) return 0;
        list = hb_get_titles( h_scan );
        count = hb_list_count( list );
        if (count > 100) count = 100;
+       if (count < 1) return 0;
+       title = (hb_title_t*)hb_list_item(list, 0);
+       feature = title->job->feature;
        for (ii = 0; ii < count; ii++)
        {
                title = (hb_title_t*)hb_list_item(list, ii);
-               if (title->duration > longest)
+               if (title->index == feature)
                {
-                       titleindex = ii;
-                       longest = title->duration;
+                       return ii;
                }
        }
        return titleindex;
@@ -2098,8 +2126,11 @@ ghb_find_audio_track(
        gint count = 0;
        gint track = -1;
        gint max_chan = 0;
-       gboolean *used;
+       gboolean *used = NULL;
+       gboolean *passthru_used;
        gint try_acodec;
+       gint passthru_acodec;
+       gboolean passthru;
        
        g_debug("find_audio_track ()\n");
        if (h_scan == NULL) return -1;
@@ -2112,7 +2143,8 @@ ghb_find_audio_track(
        if (count > 10) count = 10;
        // Try to find an item that matches the preferred language and
        // the passthru codec type
-       if (acodec & (HB_ACODEC_AC3 | HB_ACODEC_DCA))
+       passthru = (acodec & (HB_ACODEC_AC3 | HB_ACODEC_DCA)) != 0;
+       if (passthru)
        {
                for (ii = 0; ii < count; ii++)
                {
@@ -2120,11 +2152,11 @@ ghb_find_audio_track(
 
                        audio = (hb_audio_config_t*)hb_list_audio_config_item( 
                                                                                                        title->list_audio, ii );
-                       try_acodec = (HB_ACODEC_AC3 | HB_ACODEC_DCA) & audio->in.codec;
+                       passthru_acodec = (HB_ACODEC_AC3 | HB_ACODEC_DCA) & audio->in.codec;
                        // Is the source track use a passthru capable codec?
-                       if (try_acodec == 0)
+                       if (passthru_acodec == 0)
                                continue;
-                       used = get_track_used(try_acodec, track_indices, count);
+                       used = get_track_used(passthru_acodec, track_indices, count);
                        // Has the track already been used with this codec?
                        if (used[ii])
                                continue;
@@ -2163,7 +2195,15 @@ ghb_find_audio_track(
                if (used[ii])
                        continue;
                audio = (hb_audio_config_t*)hb_list_audio_config_item( 
-                                                                                                       title->list_audio, ii );
+                                                                                               title->list_audio, ii );
+               passthru_acodec = (HB_ACODEC_AC3 | HB_ACODEC_DCA) & 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;
+               }
                // Find a track that is not visually impaired or dirctor's commentary
                if ((audio->lang.type < 2) &&
                        ((strcmp(lang, audio->lang.iso639_2) == 0) ||
@@ -2180,7 +2220,7 @@ ghb_find_audio_track(
        }
        // Try to fine an item that does not match the preferred language and
        // matches the passthru codec type
-       if (acodec & (HB_ACODEC_AC3 | HB_ACODEC_DCA))
+       if (passthru)
        {
                for (ii = 0; ii < count; ii++)
                {
@@ -2188,11 +2228,11 @@ ghb_find_audio_track(
 
                        audio = (hb_audio_config_t*)hb_list_audio_config_item( 
                                                                                                        title->list_audio, ii );
-                       try_acodec = (HB_ACODEC_AC3 | HB_ACODEC_DCA) & audio->in.codec;
+                       passthru_acodec = (HB_ACODEC_AC3 | HB_ACODEC_DCA) & audio->in.codec;
                        // Is the source track use a passthru capable codec?
-                       if (try_acodec == 0)
+                       if (passthru_acodec == 0)
                                continue;
-                       used = get_track_used(try_acodec, track_indices, count);
+                       used = get_track_used(passthru_acodec, track_indices, count);
                        // Has the track already been used with this codec?
                        if (used[ii])
                                continue;
@@ -2230,6 +2270,14 @@ ghb_find_audio_track(
                        continue;
                audio = (hb_audio_config_t*)hb_list_audio_config_item( 
                                                                                                        title->list_audio, ii );
+               passthru_acodec = (HB_ACODEC_AC3 | HB_ACODEC_DCA) & 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;
+               }
                // Find a track that is not visually impaired or dirctor's commentary
                if (audio->lang.type < 2)
                {
@@ -2246,7 +2294,15 @@ ghb_find_audio_track(
        for (ii = 0; ii < count; ii++)
        {
                audio = (hb_audio_config_t*)hb_list_audio_config_item( 
-                                                                                                       title->list_audio, ii );
+                                                                                               title->list_audio, ii );
+               passthru_acodec = (HB_ACODEC_AC3 | HB_ACODEC_DCA) & 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])
                {
@@ -2354,7 +2410,7 @@ ghb_find_subtitle_track(
                                continue;
 
                        subtitle = (hb_subtitle_t*)hb_list_item( title->list_subtitle, ii );
-                       if (((burn || force) && (subtitle->source == VOBSUB)) &&
+                       if ((!(burn || force) || (subtitle->source == VOBSUB)) &&
                                ((strcmp(lang, subtitle->iso639_2) == 0) ||
                                 (strcmp(lang, "und") == 0)))
                        {
@@ -2398,7 +2454,7 @@ small_opts_set(GtkBuilder *builder, const gchar *name, combo_opts_t *opts)
        gint ii;
        gchar *str;
        
-       g_debug("generic_opts_set ()\n");
+       g_debug("small_opts_set ()\n");
        if (name == NULL || opts == NULL) return;
        store = get_combo_box_store(builder, name);
        gtk_list_store_clear(store);
@@ -2921,6 +2977,7 @@ ghb_backend_close()
 {
        hb_close(&h_queue);
        hb_close(&h_scan);
+       hb_global_close();
 }
 
 void ghb_backend_scan_stop()
@@ -3138,6 +3195,7 @@ ghb_track_status()
                        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:
@@ -3458,7 +3516,7 @@ ghb_set_scale(signal_user_data_t *ud, gint mode)
                job->anamorphic.mode = 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->anamorphic.modulus = mod;
+               job->modulus = mod;
                job->anamorphic.par_width = title->pixel_aspect_width;
                job->anamorphic.par_height = title->pixel_aspect_height;
                job->anamorphic.dar_width = 0;
@@ -3601,7 +3659,7 @@ set_preview_job_settings(hb_job_t *job, GValue *settings)
        job->crop[3] = ghb_settings_get_int(settings, "PictureRightCrop");
 
        job->anamorphic.mode = ghb_settings_combo_int(settings, "PicturePAR");
-       job->anamorphic.modulus = 
+       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");
@@ -3618,7 +3676,7 @@ set_preview_job_settings(hb_job_t *job, GValue *settings)
                job->crop[1] = 0;
                job->crop[2] = 0;
                job->crop[3] = 0;
-               job->anamorphic.modulus = 2;
+               job->modulus = 2;
        }
 
        gboolean decomb_deint = ghb_settings_get_boolean(settings, "PictureDecombDeinterlace");
@@ -3830,7 +3888,6 @@ ghb_validate_subtitles(signal_user_data_t *ud)
        titleindex = ghb_settings_combo_int(ud->settings, "title");
     title = hb_list_item( list, titleindex );
        if (title == NULL) return FALSE;
-       gint mux = ghb_settings_combo_int(ud->settings, "FileFormat");
 
        const GValue *slist, *settings;
        gint count, ii, source;
@@ -3863,23 +3920,6 @@ ghb_validate_subtitles(signal_user_data_t *ud)
                {
                        one_burned = TRUE;
                }
-               if (!burned && mux == HB_MUX_MP4 && source == VOBSUB)
-               {
-                       // MP4 can only handle burned vobsubs.  make sure there isn't
-                       // already something burned in the list
-                       message = g_strdup_printf(
-                       "Your chosen container does not support soft bitmap subtitles.\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;
-               }
                if (source == SRTSUB)
                {
                        gchar *filename;
@@ -4034,12 +4074,7 @@ ghb_validate_audio(signal_user_data_t *ud)
                if (mux == HB_MUX_MP4)
                { 
                        mux_s = "MP4";
-                       // mp4/mp3|vorbis combination is not supported.
-                       if (codec == HB_ACODEC_LAME)
-                       {
-                               a_unsup = "MP3";
-                               codec = HB_ACODEC_FAAC;
-                       }
+                       // mp4/vorbis|DTS combination is not supported.
                        if (codec == HB_ACODEC_VORBIS)
                        {
                                a_unsup = "Vorbis";
@@ -4072,9 +4107,7 @@ ghb_validate_audio(signal_user_data_t *ud)
                gboolean allow_dolby = TRUE;
                gboolean allow_dpl2 = TRUE;
                gboolean allow_6ch = TRUE;
-               allow_mono =
-                       (taudio->in.codec & (HB_ACODEC_AC3|HB_ACODEC_DCA)) &&
-                       (codec & ~HB_ACODEC_LAME);
+               allow_mono = TRUE;
                gint layout = taudio->in.channel_layout & HB_INPUT_CH_LAYOUT_DISCRETE_NO_LFE_MASK;
                allow_stereo =
                        ((layout == HB_INPUT_CH_LAYOUT_MONO && !allow_mono) || layout >= HB_INPUT_CH_LAYOUT_STEREO);
@@ -4084,7 +4117,6 @@ ghb_validate_audio(signal_user_data_t *ud)
                        (layout == HB_INPUT_CH_LAYOUT_DOLBY);
                allow_dpl2 = (layout == HB_INPUT_CH_LAYOUT_3F2R);
                allow_6ch =
-                       (taudio->in.codec & (HB_ACODEC_AC3|HB_ACODEC_DCA)) &&
                        (codec & ~HB_ACODEC_LAME) &&
                        (layout == HB_INPUT_CH_LAYOUT_3F2R) && 
                        (taudio->in.channel_layout & HB_INPUT_CH_LAYOUT_HAS_LFE);
@@ -4290,22 +4322,19 @@ add_job(hb_handle_t *h, GValue *js, gint unique_id, gint titleindex)
 
                        chapters = ghb_settings_get_value(js, "chapter_list");
                        count = ghb_array_len(chapters);
-                       for(chap = start; chap <= end; chap++)
+                       for(chap = 0; chap < count; chap++)
                        {
                                hb_chapter_t * chapter_s;
                                gchar *name;
 
                                name = NULL;
-                               if (chap-1 < count)
-                               {
-                                       chapter = ghb_array_get_nth(chapters, chap-1);
-                                       name = ghb_value_string(chapter); 
-                               }
+                               chapter = ghb_array_get_nth(chapters, chap);
+                               name = ghb_value_string(chapter); 
                                if (name == NULL)
                                {
-                                       name = g_strdup_printf ("Chapter %2d", chap);
+                                       name = g_strdup_printf ("Chapter %2d", chap+1);
                                }
-                               chapter_s = hb_list_item( job->title->list_chapter, chap - 1);
+                               chapter_s = hb_list_item( job->title->list_chapter, chap);
                                strncpy(chapter_s->title, name, 1023);
                                chapter_s->title[1023] = '\0';
                                g_free(name);
@@ -4330,7 +4359,7 @@ add_job(hb_handle_t *h, GValue *js, gint unique_id, gint titleindex)
        gboolean keep_aspect;
        keep_aspect = ghb_settings_get_boolean(js, "PictureKeepRatio");
        job->anamorphic.mode = ghb_settings_combo_int(js, "PicturePAR");
-       job->anamorphic.modulus = ghb_settings_combo_int(js, "PictureModulus");
+       job->modulus = ghb_settings_combo_int(js, "PictureModulus");
        if (job->anamorphic.mode)
        {
                job->anamorphic.par_width = title->pixel_aspect_width;
@@ -4491,8 +4520,7 @@ add_job(hb_handle_t *h, GValue *js, gint unique_id, gint titleindex)
                        }
                }
                if ((job->mux == HB_MUX_MP4) && 
-                       ((audio.out.codec & HB_ACODEC_LAME) ||
-                       (audio.out.codec & HB_ACODEC_DCA) ||
+                       ((audio.out.codec & HB_ACODEC_DCA) ||
                        (audio.out.codec & HB_ACODEC_VORBIS)))
                {
                        // mp4/mp3|dts|vorbis combination is not supported.
@@ -4603,15 +4631,10 @@ add_job(hb_handle_t *h, GValue *js, gint unique_id, gint titleindex)
                subtitle = ghb_settings_get_int(ssettings, "SubtitleTrack");
                if (subtitle == -1)
                {
-                       if (!burned && job->mux == HB_MUX_MKV)
+                       if (!burned)
                        {
                                job->select_subtitle_config.dest = PASSTHRUSUB;
                        }
-                       else if (!burned && job->mux == HB_MUX_MP4)
-                       {
-                               // Skip any non-burned vobsubs when output is mp4
-                               continue;
-                       }
                        else if (burned)
                        {
                                // Only allow one subtitle to be burned into the video
@@ -4631,20 +4654,13 @@ add_job(hb_handle_t *h, GValue *js, gint unique_id, gint titleindex)
                hb_subtitle_config_t sub_config;
 
                        subt = (hb_subtitle_t *)hb_list_item(title->list_subtitle, subtitle);
-                       sub_config = subt->config;
                        if (subt != NULL)
                        {
-                               if (!burned && job->mux == HB_MUX_MKV && 
-                                       subt->format == PICTURESUB)
+                               sub_config = subt->config;
+                               if (!burned && subt->format == PICTURESUB)
                                {
                                        sub_config.dest = PASSTHRUSUB;
                                }
-                               else if (!burned && job->mux == HB_MUX_MP4 && 
-                                       subt->format == PICTURESUB)
-                               {
-                                       // Skip any non-burned vobsubs when output is mp4
-                                       continue;
-                               }
                                else if ( burned && subt->format == PICTURESUB )
                                {
                                        // Only allow one subtitle to be burned into the video