diff options
author | John Stebbins <[email protected]> | 2016-05-17 13:28:23 -0600 |
---|---|---|
committer | John Stebbins <[email protected]> | 2016-05-17 13:28:23 -0600 |
commit | 9d52fbd1cefebb9bea49246c8d04081a20a1fc4d (patch) | |
tree | c3d73f481993b2ac537940e018d6d7f1644516b7 /libhb/sync.c | |
parent | c6342c8124cf958f9d63a50e51ac776c8d02967e (diff) |
move cadence (Film->Video) logging to sync.c
Diffstat (limited to 'libhb/sync.c')
-rw-r--r-- | libhb/sync.c | 95 |
1 files changed, 95 insertions, 0 deletions
diff --git a/libhb/sync.c b/libhb/sync.c index c1c8b7906..8375edc61 100644 --- a/libhb/sync.c +++ b/libhb/sync.c @@ -85,6 +85,7 @@ typedef struct struct { double dejitter_pts; + int cadence[12]; } video; // Audio stream context @@ -773,6 +774,95 @@ static void streamFlush( sync_stream_t * stream ) hb_buffer_list_append(&stream->out_queue, hb_buffer_eof_init()); } +#define TOP_FIRST PIC_FLAG_TOP_FIELD_FIRST +#define PROGRESSIVE PIC_FLAG_PROGRESSIVE_FRAME +#define REPEAT_FIRST PIC_FLAG_REPEAT_FIRST_FIELD +#define TB 8 +#define BT 16 +#define BT_PROG 32 +#define BTB_PROG 64 +#define TB_PROG 128 +#define TBT_PROG 256 + +static void checkCadence( int * cadence, hb_buffer_t * buf ) +{ + /* Rotate the cadence tracking. */ + int i = 0; + for (i = 11; i > 0; i--) + { + cadence[i] = cadence[i-1]; + } + + if (!(buf->s.flags & PROGRESSIVE) && !(buf->s.flags & TOP_FIRST)) + { + /* Not progressive, not top first... + That means it's probably bottom + first, 2 fields displayed. + */ + //hb_log("MPEG2 Flag: Bottom field first, 2 fields displayed."); + cadence[0] = BT; + } + else if (!(buf->s.flags & PROGRESSIVE) && (buf->s.flags & TOP_FIRST)) + { + /* Not progressive, top is first, + Two fields displayed. + */ + //hb_log("MPEG2 Flag: Top field first, 2 fields displayed."); + cadence[0] = TB; + } + else if ((buf->s.flags & PROGRESSIVE) && + !(buf->s.flags & TOP_FIRST) && !(buf->s.flags & REPEAT_FIRST)) + { + /* Progressive, but noting else. + That means Bottom first, + 2 fields displayed. + */ + //hb_log("MPEG2 Flag: Progressive. Bottom field first, 2 fields displayed."); + cadence[0] = BT_PROG; + } + else if ((buf->s.flags & PROGRESSIVE) && + !(buf->s.flags & TOP_FIRST) && (buf->s.flags & REPEAT_FIRST)) + { + /* Progressive, and repeat. . + That means Bottom first, + 3 fields displayed. + */ + //hb_log("MPEG2 Flag: Progressive repeat. Bottom field first, 3 fields displayed."); + cadence[0] = BTB_PROG; + } + else if ((buf->s.flags & PROGRESSIVE) && + (buf->s.flags & TOP_FIRST) && !(buf->s.flags & REPEAT_FIRST)) + { + /* Progressive, top first. + That means top first, + 2 fields displayed. + */ + //hb_log("MPEG2 Flag: Progressive. Top field first, 2 fields displayed."); + cadence[0] = TB_PROG; + } + else if ((buf->s.flags & PROGRESSIVE) && + (buf->s.flags & TOP_FIRST) && (buf->s.flags & REPEAT_FIRST)) + { + /* Progressive, top, repeat. + That means top first, + 3 fields displayed. + */ + //hb_log("MPEG2 Flag: Progressive repeat. Top field first, 3 fields displayed."); + cadence[0] = TBT_PROG; + } + + if ((cadence[2] <= TB) && (cadence[1] <= TB) && + (cadence[0] > TB) && (cadence[11])) + { + hb_log("%fs: Video -> Film", (float)buf->s.start / 90000); + } + if ((cadence[2] > TB) && (cadence[1] <= TB) && + (cadence[0] <= TB) && (cadence[11])) + { + hb_log("%fs: Film -> Video", (float)buf->s.start / 90000); + } +} + // OutputBuffer pulls buffers from the internal sync buffer queues in // lowest PTS first order. It then processes the queue the buffer is // pulled from for frame overlaps and gaps. @@ -921,6 +1011,11 @@ static void OutputBuffer( sync_common_t * common ) return; } + if (out_stream->type == SYNC_TYPE_VIDEO) + { + checkCadence(out_stream->video.cadence, buf); + } + // Out the buffer goes... hb_list_rem(out_stream->in_queue, buf); signalBuffer(out_stream); |