OSDN Git Service

LinGui: When translating legacy presets, vquality 0 means RF 0, not 0%
[handbrake-jp/handbrake-jp-git.git] / gtk / src / hb-backend.c
index d060983..fb76aa7 100644 (file)
@@ -70,6 +70,18 @@ index_str_init(gint max_index)
        }
 }
 
+static options_map_t d_point_to_point_opts[] =
+{
+       {"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
+};
+
 static options_map_t d_when_complete_opts[] =
 {
        {"Do Nothing",            "nothing",  0, "0"},
@@ -359,6 +371,7 @@ typedef struct
 
 combo_name_map_t combo_name_map[] =
 {
+       {"PtoPType", &point_to_point_opts},
        {"WhenComplete", &when_complete_opts},
        {"PicturePAR", &par_opts},
        {"PictureModulus", &alignment_opts},
@@ -2086,7 +2099,10 @@ ghb_find_audio_track(
        gint track = -1;
        gint max_chan = 0;
        gboolean *used;
+       gboolean *passthru_used;
        gint try_acodec;
+       gint passthru_acodec;
+       gboolean passthru;
        
        g_debug("find_audio_track ()\n");
        if (h_scan == NULL) return -1;
@@ -2099,7 +2115,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++)
                {
@@ -2107,11 +2124,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;
@@ -2150,7 +2167,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) ||
@@ -2167,7 +2192,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++)
                {
@@ -2175,11 +2200,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;
@@ -2217,6 +2242,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)
                {
@@ -2233,7 +2266,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])
                {
@@ -2563,6 +2604,7 @@ ghb_update_ui_combo_box(
                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);
@@ -3078,6 +3120,22 @@ ghb_track_status()
         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;
+            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;
@@ -3108,6 +3166,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:
@@ -3275,6 +3334,7 @@ ghb_set_scale(signal_user_data_t *ud, gint mode)
        static gboolean busy = FALSE;
        
        g_debug("ghb_set_scale ()\n");
+       picture_settings_deps(ud);
        if (h_scan == NULL) return;
        list = hb_get_titles( h_scan );
        if( !hb_list_count( list ) )
@@ -3290,7 +3350,6 @@ ghb_set_scale(signal_user_data_t *ud, gint mode)
        job   = title->job;
        if (job == NULL) return;
 
-       picture_settings_deps(ud);
        if (busy) return;
        busy = TRUE;
 
@@ -4212,13 +4271,42 @@ add_job(hb_handle_t *h, GValue *js, gint unique_id, gint titleindex)
        }
        if (!job->start_at_preview)
        {
-               gint chapter_start, chapter_end;
-               chapter_start = ghb_settings_get_int(js, "start_chapter");
-               chapter_end = ghb_settings_get_int(js, "end_chapter");
+               gint start, end;
                gint num_chapters = hb_list_count(title->list_chapter);
-               job->chapter_start = MIN( num_chapters, chapter_start );
-               job->chapter_end   = MAX( job->chapter_start, chapter_end );
+               gint duration = title->duration / 90000;
+               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)
+               {
+                       job->chapter_start = 1;
+                       job->chapter_end = num_chapters;
+                       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)
+               {
+                       job->chapter_start = 1;
+                       job->chapter_end = num_chapters;
+                       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;
+               }
                job->chapter_markers = ghb_settings_get_boolean(js, "ChapterMarkers");
                if (job->chapter_start == job->chapter_end)
                        job->chapter_markers = 0;
@@ -4228,25 +4316,22 @@ add_job(hb_handle_t *h, GValue *js, gint unique_id, gint titleindex)
                        GValue *chapter;
                        gint chap;
                        gint count;
-               
+
                        chapters = ghb_settings_get_value(js, "chapter_list");
                        count = ghb_array_len(chapters);
-                       for(chap = chapter_start; chap <= chapter_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);