summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--libhb/decavcodec.c91
-rw-r--r--libhb/sync.c95
2 files changed, 95 insertions, 91 deletions
diff --git a/libhb/decavcodec.c b/libhb/decavcodec.c
index 91552ba8f..83bbcf517 100644
--- a/libhb/decavcodec.c
+++ b/libhb/decavcodec.c
@@ -944,95 +944,6 @@ static void flushDelayQueue( hb_work_private_t *pv )
}
}
-#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, uint16_t flags, int64_t start )
-{
- /* Rotate the cadence tracking. */
- int i = 0;
- for (i = 11; i > 0; i--)
- {
- cadence[i] = cadence[i-1];
- }
-
- if (!(flags & PROGRESSIVE) && !(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 (!(flags & PROGRESSIVE) && (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 ((flags & PROGRESSIVE) &&
- !(flags & TOP_FIRST) && !(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 ((flags & PROGRESSIVE) &&
- !(flags & TOP_FIRST) && (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 ((flags & PROGRESSIVE) &&
- (flags & TOP_FIRST) && !(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 ((flags & PROGRESSIVE) &&
- (flags & TOP_FIRST) && (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)start / 90000);
- }
- if ((cadence[2] > TB) && (cadence[1] <= TB) &&
- (cadence[0] <= TB) && (cadence[11]))
- {
- hb_log("%fs: Film -> Video", (float)start / 90000);
- }
-}
-
// send cc_buf to the CC decoder(s)
static void cc_send_to_decoder(hb_work_private_t *pv, hb_buffer_t *buf)
{
@@ -1343,7 +1254,6 @@ static int decodeFrame( hb_work_object_t *w, uint8_t *data, int size, int64_t pt
pv->new_chap = 0;
pv->chap_time = 0;
}
- checkCadence( pv->cadence, flags, buf->s.start );
hb_buffer_list_append(&pv->list, buf);
++pv->nframes;
return got_picture;
@@ -1383,7 +1293,6 @@ static int decodeFrame( hb_work_object_t *w, uint8_t *data, int size, int64_t pt
pv->new_chap = 0;
pv->chap_time = 0;
}
- checkCadence( pv->cadence, buf->s.flags, buf->s.start );
hb_buffer_list_append(&pv->list, buf);
}
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);