Mercurial > libavformat.hg
annotate dtsdec.c @ 6452:c64b9d69a1ce libavformat
Fix crash when decoding DV in AVI introduced in r24579 (issue 2174).
Patch by Andrew Wason, rectalogic rectalogic com
| author | cehoyos |
|---|---|
| date | Thu, 02 Sep 2010 11:51:32 +0000 |
| parents | 4775a49a6045 |
| children |
| rev | line source |
|---|---|
| 885 | 1 /* |
| 6429 | 2 * RAW DTS demuxer |
| 3 * Copyright (c) 2008 Benjamin Larsson | |
| 0 | 4 * |
|
1358
0899bfe4105c
Change license headers to say 'FFmpeg' instead of 'this program/this library'
diego
parents:
1245
diff
changeset
|
5 * This file is part of FFmpeg. |
|
0899bfe4105c
Change license headers to say 'FFmpeg' instead of 'this program/this library'
diego
parents:
1245
diff
changeset
|
6 * |
|
0899bfe4105c
Change license headers to say 'FFmpeg' instead of 'this program/this library'
diego
parents:
1245
diff
changeset
|
7 * FFmpeg is free software; you can redistribute it and/or |
| 0 | 8 * modify it under the terms of the GNU Lesser General Public |
| 9 * License as published by the Free Software Foundation; either | |
|
1358
0899bfe4105c
Change license headers to say 'FFmpeg' instead of 'this program/this library'
diego
parents:
1245
diff
changeset
|
10 * version 2.1 of the License, or (at your option) any later version. |
| 0 | 11 * |
|
1358
0899bfe4105c
Change license headers to say 'FFmpeg' instead of 'this program/this library'
diego
parents:
1245
diff
changeset
|
12 * FFmpeg is distributed in the hope that it will be useful, |
| 0 | 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 | |
|
1358
0899bfe4105c
Change license headers to say 'FFmpeg' instead of 'this program/this library'
diego
parents:
1245
diff
changeset
|
18 * License along with FFmpeg; if not, write to the Free Software |
|
896
edbe5c3717f9
Update licensing information: The FSF changed postal address.
diego
parents:
887
diff
changeset
|
19 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA |
| 0 | 20 */ |
| 3286 | 21 |
| 22 #include "libavcodec/bytestream.h" | |
| 0 | 23 #include "avformat.h" |
| 6448 | 24 #include "rawdec.h" |
| 0 | 25 |
| 3274 | 26 #define DCA_MARKER_14B_BE 0x1FFFE800 |
| 27 #define DCA_MARKER_14B_LE 0xFF1F00E8 | |
| 28 #define DCA_MARKER_RAW_BE 0x7FFE8001 | |
| 29 #define DCA_MARKER_RAW_LE 0xFE7F0180 | |
| 6429 | 30 |
| 3274 | 31 static int dts_probe(AVProbeData *p) |
| 32 { | |
| 33 const uint8_t *buf, *bufp; | |
| 34 uint32_t state = -1; | |
|
5182
34ec401808a8
Make DTS probe more robust against false positives (as e.g. probetest shows).
reimar
parents:
5179
diff
changeset
|
35 int markers[3] = {0}; |
|
34ec401808a8
Make DTS probe more robust against false positives (as e.g. probetest shows).
reimar
parents:
5179
diff
changeset
|
36 int sum, max; |
| 3274 | 37 |
| 38 buf = p->buf; | |
| 39 | |
| 40 for(; buf < (p->buf+p->buf_size)-2; buf+=2) { | |
| 41 bufp = buf; | |
| 42 state = (state << 16) | bytestream_get_be16(&bufp); | |
| 43 | |
| 3725 | 44 /* regular bitstream */ |
| 3274 | 45 if (state == DCA_MARKER_RAW_BE || state == DCA_MARKER_RAW_LE) |
|
5182
34ec401808a8
Make DTS probe more robust against false positives (as e.g. probetest shows).
reimar
parents:
5179
diff
changeset
|
46 markers[0]++; |
| 3274 | 47 |
| 3725 | 48 /* 14 bits big-endian bitstream */ |
| 3274 | 49 if (state == DCA_MARKER_14B_BE) |
| 50 if ((bytestream_get_be16(&bufp) & 0xFFF0) == 0x07F0) | |
|
5182
34ec401808a8
Make DTS probe more robust against false positives (as e.g. probetest shows).
reimar
parents:
5179
diff
changeset
|
51 markers[1]++; |
| 3274 | 52 |
| 3725 | 53 /* 14 bits little-endian bitstream */ |
| 3274 | 54 if (state == DCA_MARKER_14B_LE) |
| 55 if ((bytestream_get_be16(&bufp) & 0xF0FF) == 0xF007) | |
|
5182
34ec401808a8
Make DTS probe more robust against false positives (as e.g. probetest shows).
reimar
parents:
5179
diff
changeset
|
56 markers[2]++; |
| 3274 | 57 } |
|
5182
34ec401808a8
Make DTS probe more robust against false positives (as e.g. probetest shows).
reimar
parents:
5179
diff
changeset
|
58 sum = markers[0] + markers[1] + markers[2]; |
|
34ec401808a8
Make DTS probe more robust against false positives (as e.g. probetest shows).
reimar
parents:
5179
diff
changeset
|
59 max = markers[1] > markers[0]; |
|
34ec401808a8
Make DTS probe more robust against false positives (as e.g. probetest shows).
reimar
parents:
5179
diff
changeset
|
60 max = markers[2] > markers[max] ? 2 : max; |
|
34ec401808a8
Make DTS probe more robust against false positives (as e.g. probetest shows).
reimar
parents:
5179
diff
changeset
|
61 if (markers[max] > 3 && p->buf_size / markers[max] < 32*1024 && |
|
34ec401808a8
Make DTS probe more robust against false positives (as e.g. probetest shows).
reimar
parents:
5179
diff
changeset
|
62 markers[max] * 4 > sum * 3) |
|
34ec401808a8
Make DTS probe more robust against false positives (as e.g. probetest shows).
reimar
parents:
5179
diff
changeset
|
63 return AVPROBE_SCORE_MAX/2+1; |
| 3274 | 64 |
| 65 return 0; | |
| 66 } | |
| 67 | |
| 1167 | 68 AVInputFormat dts_demuxer = { |
|
496
112057e05179
libdts support by (Benjamin Zores <ben at geexbox dot org>)
michael
parents:
483
diff
changeset
|
69 "dts", |
|
3424
7a0230981402
Make long_names in lavf/lavdev optional depending on CONFIG_SMALL.
diego
parents:
3405
diff
changeset
|
70 NULL_IF_CONFIG_SMALL("raw DTS"), |
|
496
112057e05179
libdts support by (Benjamin Zores <ben at geexbox dot org>)
michael
parents:
483
diff
changeset
|
71 0, |
| 3274 | 72 dts_probe, |
| 6429 | 73 ff_raw_audio_read_header, |
|
4610
41542d2edcf4
Separate the raw FLAC demuxer from raw.c and put in a new file,
jbr
parents:
4577
diff
changeset
|
74 ff_raw_read_partial_packet, |
| 1756 | 75 .flags= AVFMT_GENERIC_INDEX, |
|
496
112057e05179
libdts support by (Benjamin Zores <ben at geexbox dot org>)
michael
parents:
483
diff
changeset
|
76 .extensions = "dts", |
|
3268
319c36da904b
set demuxers .value and use common audio_read_header function
bcoudurier
parents:
3238
diff
changeset
|
77 .value = CODEC_ID_DTS, |
|
496
112057e05179
libdts support by (Benjamin Zores <ben at geexbox dot org>)
michael
parents:
483
diff
changeset
|
78 }; |
