summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorjstebbins <[email protected]>2012-07-18 12:27:46 +0000
committerjstebbins <[email protected]>2012-07-18 12:27:46 +0000
commit334edb802327776d74cbb546507c3f214ba8a784 (patch)
tree9167610a65a617714887e03d2b540dbec9590985
parent219dbe861263c1f1c9111e0cdd8b97bcadca99cb (diff)
More fine grained progress statistics during subtitle scan
Make reader compute subtitle scan progress based on timestamps seen and duration instead of chapter marks. git-svn-id: svn://svn.handbrake.fr/HandBrake/trunk@4864 b64f7644-9d1e-0410-96f1-a4d463321fa5
-rw-r--r--libhb/reader.c96
-rw-r--r--libhb/sync.c16
-rw-r--r--macosx/Controller.m15
3 files changed, 94 insertions, 33 deletions
diff --git a/libhb/reader.c b/libhb/reader.c
index 93ba869e6..8148e6590 100644
--- a/libhb/reader.c
+++ b/libhb/reader.c
@@ -54,6 +54,7 @@ struct hb_work_private_s
int start_found; // found pts_to_start point
int64_t pts_to_start;
uint64_t st_first;
+ uint64_t duration;
hb_fifo_t * fifos[100];
};
@@ -128,6 +129,28 @@ static int hb_reader_init( hb_work_object_t * w, hb_job_t * job )
r->pts_to_start = MAX(0, job->pts_to_start - 180000);
}
+ if (job->pts_to_stop)
+ {
+ r->duration = job->pts_to_start + job->pts_to_stop;
+ }
+ else if (job->frame_to_stop)
+ {
+ int frames = job->frame_to_start + job->frame_to_stop;
+ r->duration = (int64_t)frames * job->title->rate_base * 90000 / job->title->rate;
+ }
+ else
+ {
+ hb_chapter_t *chapter;
+ int ii;
+
+ r->duration = 0;
+ for (ii = job->chapter_start; ii < job->chapter_end; ii++)
+ {
+ chapter = hb_list_item( job->title->list_chapter, ii - 1);
+ r->duration += chapter->duration;
+ }
+ }
+
// The stream needs to be open before starting the reader thead
// to prevent a race with decoders that may share information
// with the reader. Specifically avcodec needs this.
@@ -319,6 +342,7 @@ void ReadLoop( void * _w )
int n;
int chapter = -1;
int chapter_end = r->job->chapter_end;
+ uint8_t done = 0;
if (r->bd)
{
@@ -338,6 +362,7 @@ void ReadLoop( void * _w )
// Note, bd seeks always put us to an i-frame. no need
// to start decoding early using r->pts_to_start
hb_bd_seek_pts( r->bd, r->job->pts_to_start );
+ r->duration -= r->job->pts_to_start;
r->job->pts_to_start = 0;
r->start_found = 1;
}
@@ -417,6 +442,7 @@ void ReadLoop( void * _w )
// first packet we get, subtract that from pts_to_start, and
// inspect the reset of the frames in sync.
r->start_found = 2;
+ r->duration -= r->job->pts_to_start;
r->job->pts_to_start = pts_to_start;
}
}
@@ -444,7 +470,7 @@ void ReadLoop( void * _w )
list = hb_list_init();
- while( !*r->die && !r->job->done )
+ while(!*r->die && !r->job->done && !done)
{
if (r->bd)
chapter = hb_bd_chapter( r->bd );
@@ -502,28 +528,6 @@ void ReadLoop( void * _w )
}
}
- if( r->job->indepth_scan )
- {
- /*
- * Need to update the progress during a subtitle scan
- */
- hb_state_t state;
-
-#define p state.param.working
-
- state.state = HB_STATE_WORKING;
- p.progress = (double)chapter / (double)r->job->chapter_end;
- if( p.progress > 1.0 )
- {
- p.progress = 1.0;
- }
- p.rate_avg = 0.0;
- p.hours = -1;
- p.minutes = -1;
- p.seconds = -1;
- hb_set_state( r->job->h, &state );
- }
-
(hb_demux[r->title->demuxer])( buf, list, &r->demux );
while( ( buf = hb_list_item( list, 0 ) ) )
@@ -553,7 +557,8 @@ void ReadLoop( void * _w )
fifos = NULL;
}
}
- if( fifos )
+
+ if ( r->job->indepth_scan || fifos )
{
if ( buf->s.renderOffset != -1 )
{
@@ -588,8 +593,21 @@ void ReadLoop( void * _w )
if ( buf->s.start != -1 )
{
int64_t start = buf->s.start - r->scr_offset;
- if ( !r->start_found )
+
+ if (!r->start_found || r->job->indepth_scan)
+ {
UpdateState( r, start );
+ }
+
+ if (r->job->indepth_scan && r->job->pts_to_stop &&
+ start >= r->pts_to_start + r->job->pts_to_stop)
+ {
+ // sync normally would terminate p-to-p
+ // but sync doesn't run during indepth scan
+ hb_log( "reader: reached pts %"PRId64", exiting early", start );
+ done = 1;
+ break;
+ }
if ( !r->start_found &&
start >= r->pts_to_start )
@@ -616,6 +634,9 @@ void ReadLoop( void * _w )
{
update_ipt( r, buf );
}
+ }
+ if( fifos )
+ {
if ( !r->start_found )
{
hb_buffer_close( &buf );
@@ -685,25 +706,37 @@ static void UpdateState( hb_work_private_t * r, int64_t start)
}
#define p state.param.working
- state.state = HB_STATE_SEARCHING;
- p.progress = (float) start / (float) r->job->pts_to_start;
+ if ( !r->job->indepth_scan )
+ {
+ state.state = HB_STATE_SEARCHING;
+ p.progress = (float) start / (float) r->job->pts_to_start;
+ }
+ else
+ {
+ state.state = HB_STATE_WORKING;
+ p.progress = (float) start / (float) r->duration;
+ }
if( p.progress > 1.0 )
{
p.progress = 1.0;
}
+ p.rate_cur = 0.0;
+ p.rate_avg = 0.0;
if (now > r->st_first)
{
int eta;
avg = 1000.0 * (double)start / (now - r->st_first);
- eta = ( r->job->pts_to_start - start ) / avg;
+ if ( !r->job->indepth_scan )
+ eta = ( r->job->pts_to_start - start ) / avg;
+ else
+ eta = ( r->duration - start ) / avg;
p.hours = eta / 3600;
p.minutes = ( eta % 3600 ) / 60;
p.seconds = eta % 60;
}
else
{
- p.rate_avg = 0.0;
p.hours = -1;
p.minutes = -1;
p.seconds = -1;
@@ -729,11 +762,14 @@ static hb_fifo_t ** GetFifoForId( hb_work_private_t * r, int id )
if( id == title->video_id )
{
- if( job->indepth_scan )
+ if (job->indepth_scan && !job->frame_to_stop)
{
/*
* Ditch the video here during the indepth scan until
* we can improve the MPEG2 decode performance.
+ *
+ * But if we specify a stop frame, we must decode the
+ * frames in order to count them.
*/
return NULL;
}
diff --git a/libhb/sync.c b/libhb/sync.c
index fc01c3b12..73a1071e3 100644
--- a/libhb/sync.c
+++ b/libhb/sync.c
@@ -1194,6 +1194,14 @@ static void UpdateState( hb_work_object_t * w )
}
pv->common->count_frames++;
+ if (pv->job->indepth_scan)
+ {
+ // Progress for indept scan is handled by reader
+ // pv->common->count_frames is used during indepth_scan
+ // to find start & end points.
+ return;
+ }
+
if( hb_get_date() > sync->st_dates[3] + 1000 )
{
memmove( &sync->st_dates[0], &sync->st_dates[1],
@@ -1254,6 +1262,14 @@ static void UpdateSearchState( hb_work_object_t * w, int64_t start )
}
pv->common->count_frames++;
+ if (pv->job->indepth_scan)
+ {
+ // Progress for indept scan is handled by reader
+ // pv->common->count_frames is used during indepth_scan
+ // to find start & end points.
+ return;
+ }
+
#define p state.param.working
state.state = HB_STATE_SEARCHING;
if ( pv->job->frame_to_start )
diff --git a/macosx/Controller.m b/macosx/Controller.m
index 809571bf6..cf6fdd6c4 100644
--- a/macosx/Controller.m
+++ b/macosx/Controller.m
@@ -914,9 +914,18 @@ static NSString * ChooseSourceIdentifier = @"Choose Source It
if( p.seconds > -1 )
{
- [string appendFormat:
- NSLocalizedString( @" (%.2f fps, avg %.2f fps, ETA %02dh%02dm%02ds)", @"" ),
- p.rate_cur, p.rate_avg, p.hours, p.minutes, p.seconds];
+ if ( p.rate_cur > 0.0 )
+ {
+ [string appendFormat:
+ NSLocalizedString( @" (%.2f fps, avg %.2f fps, ETA %02dh%02dm%02ds)", @"" ),
+ p.rate_cur, p.rate_avg, p.hours, p.minutes, p.seconds];
+ }
+ else
+ {
+ [string appendFormat:
+ NSLocalizedString( @" (ETA %02dh%02dm%02ds)", @"" ),
+ p.hours, p.minutes, p.seconds];
+ }
}
[fStatusField setStringValue: string];
[fQueueController setQueueStatusString:string];