~ubuntu-branches/ubuntu/natty/libav/natty-security

« back to all changes in this revision

Viewing changes to libavformat/apc.c

  • Committer: Bazaar Package Importer
  • Author(s): Reinhard Tartler
  • Date: 2011-03-20 12:09:31 UTC
  • Revision ID: james.westby@ubuntu.com-20110320120931-nfhi9tiok27gxhw1
Tags: upstream-0.6.2
ImportĀ upstreamĀ versionĀ 0.6.2

Show diffs side-by-side

added added

removed removed

Lines of Context:
 
1
/*
 
2
 * CRYO APC audio format demuxer
 
3
 * Copyright (c) 2007 Anssi Hannula <anssi.hannula@gmail.com>
 
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
 
 
22
#include <string.h>
 
23
#include "avformat.h"
 
24
 
 
25
static int apc_probe(AVProbeData *p)
 
26
{
 
27
    if (!strncmp(p->buf, "CRYO_APC", 8))
 
28
        return AVPROBE_SCORE_MAX;
 
29
 
 
30
    return 0;
 
31
}
 
32
 
 
33
static int apc_read_header(AVFormatContext *s, AVFormatParameters *ap)
 
34
{
 
35
    ByteIOContext *pb = s->pb;
 
36
    AVStream *st;
 
37
 
 
38
    get_le32(pb); /* CRYO */
 
39
    get_le32(pb); /* _APC */
 
40
    get_le32(pb); /* 1.20 */
 
41
 
 
42
    st = av_new_stream(s, 0);
 
43
    if (!st)
 
44
        return AVERROR(ENOMEM);
 
45
 
 
46
    st->codec->codec_type = AVMEDIA_TYPE_AUDIO;
 
47
    st->codec->codec_id = CODEC_ID_ADPCM_IMA_WS;
 
48
 
 
49
    get_le32(pb); /* number of samples */
 
50
    st->codec->sample_rate = get_le32(pb);
 
51
 
 
52
    st->codec->extradata_size = 2 * 4;
 
53
    st->codec->extradata = av_malloc(st->codec->extradata_size +
 
54
                                     FF_INPUT_BUFFER_PADDING_SIZE);
 
55
    if (!st->codec->extradata)
 
56
        return AVERROR(ENOMEM);
 
57
 
 
58
    /* initial predictor values for adpcm decoder */
 
59
    get_buffer(pb, st->codec->extradata, 2 * 4);
 
60
 
 
61
    st->codec->channels = 1;
 
62
    if (get_le32(pb))
 
63
        st->codec->channels = 2;
 
64
 
 
65
    st->codec->bits_per_coded_sample = 4;
 
66
    st->codec->bit_rate = st->codec->bits_per_coded_sample * st->codec->channels
 
67
                          * st->codec->sample_rate;
 
68
    st->codec->block_align = 1;
 
69
 
 
70
    return 0;
 
71
}
 
72
 
 
73
#define MAX_READ_SIZE 4096
 
74
 
 
75
static int apc_read_packet(AVFormatContext *s, AVPacket *pkt)
 
76
{
 
77
    if (av_get_packet(s->pb, pkt, MAX_READ_SIZE) <= 0)
 
78
        return AVERROR(EIO);
 
79
    pkt->stream_index = 0;
 
80
    return 0;
 
81
}
 
82
 
 
83
AVInputFormat apc_demuxer = {
 
84
    "apc",
 
85
    NULL_IF_CONFIG_SMALL("CRYO APC format"),
 
86
    0,
 
87
    apc_probe,
 
88
    apc_read_header,
 
89
    apc_read_packet,
 
90
};