summaryrefslogtreecommitdiffstats
path: root/libhb/sync.c
diff options
context:
space:
mode:
authorJohn Stebbins <[email protected]>2016-05-18 08:36:21 -0600
committerJohn Stebbins <[email protected]>2016-05-18 08:36:21 -0600
commit6c84891b644b911ace7d02210ad21a94922c8287 (patch)
treebc9eb15bb06e9e5a63b1d2d50f0247948ae9fa8f /libhb/sync.c
parent40f80f674c5c56ae72d41c72ce42b90789904829 (diff)
sync: do not drop audio before frame p-to-p start
We were dropping all buffers before the start frame was found regardless of the buffers start time. Now we keep track of the start time of the last video frame seen and only drop buffers that start before that frame.
Diffstat (limited to 'libhb/sync.c')
-rw-r--r--libhb/sync.c44
1 files changed, 33 insertions, 11 deletions
diff --git a/libhb/sync.c b/libhb/sync.c
index 52eb494a3..b5eb8debe 100644
--- a/libhb/sync.c
+++ b/libhb/sync.c
@@ -123,6 +123,7 @@ struct sync_common_s
// point-to-point support
int start_found;
+ int64_t start_pts;
// sync audio work objects
hb_list_t * list_work;
@@ -996,6 +997,15 @@ static void OutputBuffer( sync_common_t * common )
// and overlaps.
if (hb_list_count(stream->in_queue) > stream->min_len)
{
+ if (!common->start_found)
+ {
+ // If we have not yet found the start point for
+ // p-to-p, grab the first stream that has data
+ // above min_len. This ensures that we prefer
+ // video buffers for finding start point.
+ out_stream = stream;
+ break;
+ }
buf = hb_list_item(stream->in_queue, 0);
if (buf->s.start < pts)
{
@@ -1020,6 +1030,8 @@ static void OutputBuffer( sync_common_t * common )
if (out_stream->next_pts == (int64_t)AV_NOPTS_VALUE)
{
// Initialize next_pts, it is used to make timestamp corrections
+ // If doing p-to-p encoding, it will get reinitialized when
+ // we find the start point.
buf = hb_list_item(out_stream->in_queue, 0);
out_stream->next_pts = buf->s.start;
}
@@ -1039,20 +1051,26 @@ static void OutputBuffer( sync_common_t * common )
{
// pts_to_start or frame_to_start were specified.
// Wait for the appropriate start point.
- if (out_stream->type == SYNC_TYPE_VIDEO &&
- common->job->frame_to_start > 0 &&
- out_stream->frame_count >= common->job->frame_to_start)
+ if (common->job->frame_to_start > 0 &&
+ out_stream->type == SYNC_TYPE_VIDEO)
{
- common->start_found = 1;
- out_stream->frame_count = 0;
+ common->start_pts = buf->s.start + 1;
+ if (out_stream->frame_count >= common->job->frame_to_start)
+ {
+ common->start_found = 1;
+ out_stream->frame_count = 0;
+ }
}
else if (common->job->pts_to_start > 0 &&
- buf->s.start >= common->job->pts_to_start)
+ out_stream->type != SYNC_TYPE_SUBTITLE)
{
- common->start_found = 1;
- common->streams[0].frame_count = 0;
+ if (buf->s.start >= common->job->pts_to_start)
+ {
+ common->start_found = 1;
+ common->streams[0].frame_count = 0;
+ }
}
- else
+ if (!common->start_found)
{
if (out_stream->type == SYNC_TYPE_VIDEO)
{
@@ -1060,9 +1078,12 @@ static void OutputBuffer( sync_common_t * common )
out_stream->frame_count);
out_stream->frame_count++;
}
- hb_list_rem(out_stream->in_queue, buf);
+ if (buf->s.start < common->start_pts)
+ {
+ hb_list_rem(out_stream->in_queue, buf);
+ hb_buffer_close(&buf);
+ }
signalBuffer(out_stream);
- hb_buffer_close(&buf);
continue;
}
// reset frame count to track number of frames after
@@ -1592,6 +1613,7 @@ static int syncVideoInit( hb_work_object_t * w, hb_job_t * job)
if (job->frame_to_start || job->pts_to_start)
{
pv->common->start_found = 0;
+ pv->common->start_pts = pv->common->job->pts_to_start;
}
else
{