Subversion Repositories Kolibri OS

Rev

Details | Last modification | View Log | RSS feed

Rev Author Line No. Line
6147 serge 1
/*
2
 * RAW demuxers
3
 * Copyright (c) 2001 Fabrice Bellard
4
 * Copyright (c) 2005 Alex Beregszaszi
5
 *
6
 * This file is part of FFmpeg.
7
 *
8
 * FFmpeg is free software; you can redistribute it and/or
9
 * modify it under the terms of the GNU Lesser General Public
10
 * License as published by the Free Software Foundation; either
11
 * version 2.1 of the License, or (at your option) any later version.
12
 *
13
 * FFmpeg is distributed in the hope that it will be useful,
14
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
15
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
16
 * Lesser General Public License for more details.
17
 *
18
 * You should have received a copy of the GNU Lesser General Public
19
 * License along with FFmpeg; if not, write to the Free Software
20
 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
21
 */
22
 
23
#include "avformat.h"
24
#include "internal.h"
25
#include "avio_internal.h"
26
#include "rawdec.h"
27
#include "libavutil/opt.h"
28
#include "libavutil/parseutils.h"
29
#include "libavutil/pixdesc.h"
30
#include "libavutil/avassert.h"
31
#include "libavutil/intreadwrite.h"
32
 
33
#define RAW_PACKET_SIZE 1024
34
 
35
int ff_raw_read_partial_packet(AVFormatContext *s, AVPacket *pkt)
36
{
37
    int ret, size;
38
 
39
    size = RAW_PACKET_SIZE;
40
 
41
    if (av_new_packet(pkt, size) < 0)
42
        return AVERROR(ENOMEM);
43
 
44
    pkt->pos= avio_tell(s->pb);
45
    pkt->stream_index = 0;
46
    ret = ffio_read_partial(s->pb, pkt->data, size);
47
    if (ret < 0) {
48
        av_free_packet(pkt);
49
        return ret;
50
    }
51
    av_shrink_packet(pkt, ret);
52
    return ret;
53
}
54
 
55
int ff_raw_audio_read_header(AVFormatContext *s)
56
{
57
    AVStream *st = avformat_new_stream(s, NULL);
58
    if (!st)
59
        return AVERROR(ENOMEM);
60
    st->codec->codec_type = AVMEDIA_TYPE_AUDIO;
61
    st->codec->codec_id = s->iformat->raw_codec_id;
62
    st->need_parsing = AVSTREAM_PARSE_FULL_RAW;
63
    st->start_time = 0;
64
    /* the parameters will be extracted from the compressed bitstream */
65
 
66
    return 0;
67
}
68
 
69
/* MPEG-1/H.263 input */
70
int ff_raw_video_read_header(AVFormatContext *s)
71
{
72
    AVStream *st;
73
    FFRawVideoDemuxerContext *s1 = s->priv_data;
74
    int ret = 0;
75
 
76
 
77
    st = avformat_new_stream(s, NULL);
78
    if (!st) {
79
        ret = AVERROR(ENOMEM);
80
        goto fail;
81
    }
82
 
83
    st->codec->codec_type = AVMEDIA_TYPE_VIDEO;
84
    st->codec->codec_id = s->iformat->raw_codec_id;
85
    st->need_parsing = AVSTREAM_PARSE_FULL_RAW;
86
 
87
    st->codec->framerate = s1->framerate;
88
    st->codec->time_base = av_inv_q(s1->framerate);
89
    avpriv_set_pts_info(st, 64, 1, 1200000);
90
 
91
fail:
92
    return ret;
93
}
94
 
95
int ff_raw_data_read_header(AVFormatContext *s)
96
{
97
    AVStream *st = avformat_new_stream(s, NULL);
98
    if (!st)
99
        return AVERROR(ENOMEM);
100
    st->codec->codec_type = AVMEDIA_TYPE_DATA;
101
    st->codec->codec_id = s->iformat->raw_codec_id;
102
    st->start_time = 0;
103
    return 0;
104
}
105
 
106
/* Note: Do not forget to add new entries to the Makefile as well. */
107
 
108
#define OFFSET(x) offsetof(FFRawVideoDemuxerContext, x)
109
#define DEC AV_OPT_FLAG_DECODING_PARAM
110
const AVOption ff_rawvideo_options[] = {
111
    { "framerate", "", OFFSET(framerate), AV_OPT_TYPE_VIDEO_RATE, {.str = "25"}, 0, 0, DEC},
112
    { NULL },
113
};
114
 
115
#if CONFIG_DATA_DEMUXER
116
AVInputFormat ff_data_demuxer = {
117
    .name           = "data",
118
    .long_name      = NULL_IF_CONFIG_SMALL("raw data"),
119
    .read_header    = ff_raw_data_read_header,
120
    .read_packet    = ff_raw_read_partial_packet,
121
    .raw_codec_id   = AV_CODEC_ID_NONE,
122
    .flags          = AVFMT_NOTIMESTAMPS,
123
};
124
#endif
125
 
126
#if CONFIG_LATM_DEMUXER
127
 
128
AVInputFormat ff_latm_demuxer = {
129
    .name           = "latm",
130
    .long_name      = NULL_IF_CONFIG_SMALL("raw LOAS/LATM"),
131
    .read_header    = ff_raw_audio_read_header,
132
    .read_packet    = ff_raw_read_partial_packet,
133
    .flags          = AVFMT_GENERIC_INDEX | AVFMT_NOTIMESTAMPS,
134
    .extensions     = "latm",
135
    .raw_codec_id   = AV_CODEC_ID_AAC_LATM,
136
};
137
#endif
138
 
139
#if CONFIG_MJPEG_DEMUXER
140
static int mjpeg_probe(AVProbeData *p)
141
{
142
    int i;
143
    int state = -1;
144
    int nb_invalid = 0;
145
    int nb_frames = 0;
146
 
147
    for (i=0; ibuf_size-2; i++) {
148
        int c;
149
        if (p->buf[i] != 0xFF)
150
            continue;
151
        c = p->buf[i+1];
152
        switch (c) {
153
        case 0xD8:
154
            state = 0xD8;
155
            break;
156
        case 0xC0:
157
        case 0xC1:
158
        case 0xC2:
159
        case 0xC3:
160
        case 0xC5:
161
        case 0xC6:
162
        case 0xC7:
163
        case 0xF7:
164
            if (state == 0xD8) {
165
                state = 0xC0;
166
            } else
167
                nb_invalid++;
168
            break;
169
        case 0xDA:
170
            if (state == 0xC0) {
171
                state = 0xDA;
172
            } else
173
                nb_invalid++;
174
            break;
175
        case 0xD9:
176
            if (state == 0xDA) {
177
                state = 0xD9;
178
                nb_frames++;
179
            } else
180
                nb_invalid++;
181
            break;
182
        default:
183
            if (  (c >= 0x02 && c <= 0xBF)
184
                || c == 0xC8) {
185
                nb_invalid++;
186
            }
187
        }
188
    }
189
 
190
    if (nb_invalid*4 + 1 < nb_frames) {
191
        static const char ct_jpeg[] = "\r\nContent-Type: image/jpeg\r\n";
192
        int i;
193
 
194
        for (i=0; ibuf_size - (int)sizeof(ct_jpeg), 100); i++)
195
            if (!memcmp(p->buf + i, ct_jpeg, sizeof(ct_jpeg) - 1))
196
                return AVPROBE_SCORE_EXTENSION;
197
 
198
        if (nb_invalid == 0 && nb_frames > 2)
199
            return AVPROBE_SCORE_EXTENSION / 2;
200
        return AVPROBE_SCORE_EXTENSION / 4;
201
    }
202
 
203
    return 0;
204
}
205
 
206
FF_DEF_RAWVIDEO_DEMUXER2(mjpeg, "raw MJPEG video", mjpeg_probe, "mjpg,mjpeg,mpo", AV_CODEC_ID_MJPEG, AVFMT_GENERIC_INDEX|AVFMT_NOTIMESTAMPS)
207
#endif
208
 
209
#if CONFIG_MLP_DEMUXER
210
AVInputFormat ff_mlp_demuxer = {
211
    .name           = "mlp",
212
    .long_name      = NULL_IF_CONFIG_SMALL("raw MLP"),
213
    .read_header    = ff_raw_audio_read_header,
214
    .read_packet    = ff_raw_read_partial_packet,
215
    .flags          = AVFMT_GENERIC_INDEX | AVFMT_NOTIMESTAMPS,
216
    .extensions     = "mlp",
217
    .raw_codec_id   = AV_CODEC_ID_MLP,
218
};
219
#endif
220
 
221
#if CONFIG_TRUEHD_DEMUXER
222
AVInputFormat ff_truehd_demuxer = {
223
    .name           = "truehd",
224
    .long_name      = NULL_IF_CONFIG_SMALL("raw TrueHD"),
225
    .read_header    = ff_raw_audio_read_header,
226
    .read_packet    = ff_raw_read_partial_packet,
227
    .flags          = AVFMT_GENERIC_INDEX | AVFMT_NOTIMESTAMPS,
228
    .extensions     = "thd",
229
    .raw_codec_id   = AV_CODEC_ID_TRUEHD,
230
};
231
#endif
232
 
233
#if CONFIG_SHORTEN_DEMUXER
234
AVInputFormat ff_shorten_demuxer = {
235
    .name           = "shn",
236
    .long_name      = NULL_IF_CONFIG_SMALL("raw Shorten"),
237
    .read_header    = ff_raw_audio_read_header,
238
    .read_packet    = ff_raw_read_partial_packet,
239
    .flags          = AVFMT_NOBINSEARCH | AVFMT_NOGENSEARCH | AVFMT_NO_BYTE_SEEK|AVFMT_NOTIMESTAMPS,
240
    .extensions     = "shn",
241
    .raw_codec_id   = AV_CODEC_ID_SHORTEN,
242
};
243
#endif
244
 
245
#if CONFIG_VC1_DEMUXER
246
FF_DEF_RAWVIDEO_DEMUXER2(vc1, "raw VC-1", NULL, "vc1", AV_CODEC_ID_VC1, AVFMT_GENERIC_INDEX|AVFMT_NOTIMESTAMPS)
247
#endif