Statistics
| Branch: | Revision:

ffmpeg / libavformat / ac3dec.c @ 2912e87a

History | View | Annotate | Download (2.95 KB)

1
/*
2
 * RAW AC-3 and E-AC-3 demuxer
3
 * Copyright (c) 2007 Justin Ruggles <justin.ruggles@gmail.com>
4
 *
5
 * This file is part of Libav.
6
 *
7
 * Libav 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
 * Libav 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 Libav; if not, write to the Free Software
19
 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
20
 */
21

    
22
#include "libavutil/crc.h"
23
#include "libavcodec/ac3_parser.h"
24
#include "avformat.h"
25
#include "rawdec.h"
26

    
27
static int ac3_eac3_probe(AVProbeData *p, enum CodecID expected_codec_id)
28
{
29
    int max_frames, first_frames = 0, frames;
30
    uint8_t *buf, *buf2, *end;
31
    AC3HeaderInfo hdr;
32
    GetBitContext gbc;
33
    enum CodecID codec_id = CODEC_ID_AC3;
34

    
35
    max_frames = 0;
36
    buf = p->buf;
37
    end = buf + p->buf_size;
38

    
39
    for(; buf < end; buf++) {
40
        buf2 = buf;
41

    
42
        for(frames = 0; buf2 < end; frames++) {
43
            init_get_bits(&gbc, buf2, 54);
44
            if(ff_ac3_parse_header(&gbc, &hdr) < 0)
45
                break;
46
            if(buf2 + hdr.frame_size > end ||
47
               av_crc(av_crc_get_table(AV_CRC_16_ANSI), 0, buf2 + 2, hdr.frame_size - 2))
48
                break;
49
            if (hdr.bitstream_id > 10)
50
                codec_id = CODEC_ID_EAC3;
51
            buf2 += hdr.frame_size;
52
        }
53
        max_frames = FFMAX(max_frames, frames);
54
        if(buf == p->buf)
55
            first_frames = frames;
56
    }
57
    if(codec_id != expected_codec_id) return 0;
58
    // keep this in sync with mp3 probe, both need to avoid
59
    // issues with MPEG-files!
60
    if   (first_frames>=4) return AVPROBE_SCORE_MAX/2+1;
61
    else if(max_frames>500)return AVPROBE_SCORE_MAX/2;
62
    else if(max_frames>=4) return AVPROBE_SCORE_MAX/4;
63
    else if(max_frames>=1) return 1;
64
    else                   return 0;
65
}
66

    
67
#if CONFIG_AC3_DEMUXER
68
static int ac3_probe(AVProbeData *p)
69
{
70
    return ac3_eac3_probe(p, CODEC_ID_AC3);
71
}
72

    
73
AVInputFormat ff_ac3_demuxer = {
74
    "ac3",
75
    NULL_IF_CONFIG_SMALL("raw AC-3"),
76
    0,
77
    ac3_probe,
78
    ff_raw_audio_read_header,
79
    ff_raw_read_partial_packet,
80
    .flags= AVFMT_GENERIC_INDEX,
81
    .extensions = "ac3",
82
    .value = CODEC_ID_AC3,
83
};
84
#endif
85

    
86
#if CONFIG_EAC3_DEMUXER
87
static int eac3_probe(AVProbeData *p)
88
{
89
    return ac3_eac3_probe(p, CODEC_ID_EAC3);
90
}
91

    
92
AVInputFormat ff_eac3_demuxer = {
93
    "eac3",
94
    NULL_IF_CONFIG_SMALL("raw E-AC-3"),
95
    0,
96
    eac3_probe,
97
    ff_raw_audio_read_header,
98
    ff_raw_read_partial_packet,
99
    .flags= AVFMT_GENERIC_INDEX,
100
    .extensions = "eac3",
101
    .value = CODEC_ID_EAC3,
102
};
103
#endif