diff options
Diffstat (limited to 'libavformat/gsmdec.c')
-rw-r--r-- | libavformat/gsmdec.c | 31 |
1 files changed, 24 insertions, 7 deletions
diff --git a/libavformat/gsmdec.c b/libavformat/gsmdec.c index d13327d..1627106 100644 --- a/libavformat/gsmdec.c +++ b/libavformat/gsmdec.c @@ -2,20 +2,20 @@ * RAW GSM demuxer * Copyright (c) 2011 Justin Ruggles * - * This file is part of Libav. + * This file is part of FFmpeg. * - * Libav is free software; you can redistribute it and/or + * FFmpeg is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public * License as published by the Free Software Foundation; either * version 2.1 of the License, or (at your option) any later version. * - * Libav is distributed in the hope that it will be useful, + * FFmpeg is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public - * License along with Libav; if not, write to the Free Software + * License along with FFmpeg; if not, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA */ @@ -34,6 +34,23 @@ typedef struct GSMDemuxerContext { int sample_rate; } GSMDemuxerContext; +static int gsm_probe(AVProbeData *p) +{ + int valid = 0, invalid = 0; + uint8_t *b = p->buf; + while (b < p->buf + p->buf_size - 32) { + if ((*b & 0xf0) == 0xd0) { + valid++; + } else { + invalid++; + } + b += 33; + } + if (valid >> 5 > invalid) + return AVPROBE_SCORE_EXTENSION + 1; + return 0; +} + static int gsm_read_packet(AVFormatContext *s, AVPacket *pkt) { int ret, size; @@ -48,7 +65,6 @@ static int gsm_read_packet(AVFormatContext *s, AVPacket *pkt) av_packet_unref(pkt); return ret < 0 ? ret : AVERROR(EIO); } - pkt->size = ret; pkt->duration = 1; pkt->pts = pkt->pos / GSM_BLOCK_SIZE; @@ -81,7 +97,7 @@ static const AVOption options[] = { { NULL }, }; -static const AVClass class = { +static const AVClass gsm_class = { .class_name = "gsm demuxer", .item_name = av_default_item_name, .option = options, @@ -92,10 +108,11 @@ AVInputFormat ff_gsm_demuxer = { .name = "gsm", .long_name = NULL_IF_CONFIG_SMALL("raw GSM"), .priv_data_size = sizeof(GSMDemuxerContext), + .read_probe = gsm_probe, .read_header = gsm_read_header, .read_packet = gsm_read_packet, .flags = AVFMT_GENERIC_INDEX, .extensions = "gsm", .raw_codec_id = AV_CODEC_ID_GSM, - .priv_class = &class, + .priv_class = &gsm_class, }; |