1 /*
2 * RAW DTS demuxer
3 * Copyright (c) 2008 Benjamin Larsson
4 *
5 * This file is part of FFmpeg.
6 *
7 * FFmpeg is free software; you can redistribute it and/or
8 * modify it under the terms of the GNU Lesser General Public
9 * License as published by the Free Software Foundation; either
10 * version 2.1 of the License, or (at your option) any later version.
11 *
12 * FFmpeg is distributed in the hope that it will be useful,
13 * but WITHOUT ANY WARRANTY; without even the implied warranty of
14 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
15 * Lesser General Public License for more details.
16 *
17 * You should have received a copy of the GNU Lesser General Public
18 * License along with FFmpeg; if not, write to the Free Software
19 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
20 */
21
23
28
31
33 {
34 const uint8_t *buf, *bufp;
36 int markers[4*16] = {0};
37 int exss_markers = 0, exss_nextpos = 0;
40 int diffcount = 1;
42
44 int marker, wide_hdr, hdr_size, framesize;
47
49 state = (
state << 16) | bytestream_get_be16(&bufp);
50
54 diffcount ++;
55 }
56 }
57
58 /* extension substream (EXSS) */
60 if (
pos < exss_nextpos)
61 continue;
62
65
67 hdr_size =
get_bits(&gb, 8 + 4 * wide_hdr) + 1;
68 framesize =
get_bits(&gb, 16 + 4 * wide_hdr) + 1;
69 if (hdr_size & 3 || framesize & 3)
70 continue;
71 if (hdr_size < 16 || framesize < hdr_size)
72 continue;
74 continue;
76 continue;
77
78 if (
pos == exss_nextpos)
79 exss_markers++;
80 else
81 exss_markers =
FFMAX(1, exss_markers - 1);
82 exss_nextpos =
pos + framesize;
83 continue;
84 }
85
86 /* regular bitstream */
88 (bytestream_get_be16(&bufp) & 0xFC00) == 0xFC00)
89 marker = 0;
91 (bytestream_get_be16(&bufp) & 0x00FC) == 0x00FC)
92 marker = 1;
93
94 /* 14 bits big-endian bitstream */
96 (bytestream_get_be16(&bufp) & 0xFFF0) == 0x07F0)
97 marker = 2;
98
99 /* 14 bits little-endian bitstream */
101 (bytestream_get_be16(&bufp) & 0xF0FF) == 0xF007)
102 marker = 3;
103 else
104 continue;
105
108 continue;
110 continue;
111
112 marker += 4 *
h.sr_code;
113
114 markers[marker] ++;
115 }
116
117 if (exss_markers > 3)
119
123 if (markers[
max] < markers[
i])
125 }
126
128 markers[
max] * 4 > sum * 3 &&
129 diff / diffcount > 600)
131
132 return 0;
133 }
134
142 .extensions = "dts",
146 };