+static int dv_probe(AVProbeData *p)
+{
+ unsigned state, marker_pos = 0;
+ int i;
+ int matches = 0;
+ int secondary_matches = 0;
+
+ if (p->buf_size < 5)
+ return 0;
+
+ state = AV_RB32(p->buf);
+ for (i = 4; i < p->buf_size; i++) {
+ if ((state & 0xffffff7f) == 0x1f07003f)
+ matches++;
+ // any section header, also with seq/chan num != 0,
+ // should appear around every 12000 bytes, at least 10 per frame
+ if ((state & 0xff07ff7f) == 0x1f07003f)
+ secondary_matches++;
+ if (state == 0x003f0700 || state == 0xff3f0700)
+ marker_pos = i;
+ if (state == 0xff3f0701 && i - marker_pos == 80)
+ matches++;
+ state = (state << 8) | p->buf[i];
+ }
+
+ if (matches && p->buf_size / matches < 1024 * 1024) {
+ if (matches > 4 ||
+ (secondary_matches >= 10 &&
+ p->buf_size / secondary_matches < 24000))
+ // not max to avoid dv in mov to match
+ return AVPROBE_SCORE_MAX * 3 / 4;
+ return AVPROBE_SCORE_MAX / 4;
+ }
+ return 0;
+}
+
+AVInputFormat ff_dv_demuxer = {
+ .name = "dv",
+ .long_name = NULL_IF_CONFIG_SMALL("DV (Digital Video)"),
+ .priv_data_size = sizeof(RawDVContext),
+ .read_probe = dv_probe,
+ .read_header = dv_read_header,
+ .read_packet = dv_read_packet,
+ .read_close = dv_read_close,
+ .read_seek = dv_read_seek,
+ .extensions = "dv,dif",