1 /*
2 * Copyright (C) 2008 Ramiro Polla
3 *
4 * This file is part of FFmpeg.
5 *
6 * FFmpeg is free software; you can redistribute it and/or
7 * modify it under the terms of the GNU Lesser General Public
8 * License as published by the Free Software Foundation; either
9 * version 2.1 of the License, or (at your option) any later version.
10 *
11 * FFmpeg is distributed in the hope that it will be useful,
12 * but WITHOUT ANY WARRANTY; without even the implied warranty of
13 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
14 * Lesser General Public License for more details.
15 *
16 * You should have received a copy of the GNU Lesser General Public
17 * License along with FFmpeg; if not, write to the Free Software
18 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
19 */
20
24
25 #define HEADER_SIZE 24
26
27 /*
28 * Header structure:
29 * uint16_t ss; // struct size
30 * uint16_t width; // frame width
31 * uint16_t height; // frame height
32 * uint16_t ff; // keyframe + some other info(???)
33 * uint32_t size; // size of data
34 * uint32_t fourcc; // ML20
35 * uint32_t u3; // ?
36 * uint32_t ts; // time
37 */
38
40 {
41 int i;
42
47
48 if (bytestream_get_le16(&bytestream) != HEADER_SIZE)
49 continue;
50 width = bytestream_get_le16(&bytestream);
51 height = bytestream_get_le16(&bytestream);
52 if (!(width == 320 &&
53 height == 240) && !(width == 160 && height == 120))
54 continue;
55 bytestream += 2; // keyframe
56 bytestream += 4; // size
57 fourcc = bytestream_get_le32(&bytestream);
58 if (fourcc !=
MKTAG(
'M',
'L',
'2',
'0'))
59 continue;
60
61 if (i) {
62 if (i < 14) /* starts with SwitchBoard connection info */
64 else /* starts in the middle of stream */
66 } else {
68 }
69 }
70
71 return 0;
72 }
73
75 {
79
81 if (!st)
83
88
90
91 /* Some files start with "connected\r\n\r\n".
92 * So skip until we find the first byte of struct size */
94
98 }
99
100 return 0;
101 }
102
104 {
106 uint16_t keyframe;
107 uint32_t
size, timestamp;
108 int ret;
109
110 avio_skip(pb, 1);
/* one byte has been read ahead */
118
119 if (!size)
121
123 return ret;
124
125 avio_skip(pb, 1);
/* Read ahead one byte of struct size like read_header */
126
127 pkt->
pts = timestamp;
128 pkt->
dts = timestamp;
130
131 /* Some aMsn generated videos (or was it Mercury Messenger?) don't set
132 * this bit and rely on the codec to get keyframe information */
133 if (keyframe & 1)
135
137 }
138
145 };
#define AVERROR_INVALIDDATA
Invalid data found when processing input.
enum AVCodecID codec_id
Specific type of the encoded data (the codec used).
int64_t avio_skip(AVIOContext *s, int64_t offset)
Skip given number of bytes forward.
This struct describes the properties of an encoded stream.
AVInputFormat ff_msnwc_tcp_demuxer
AVStream * avformat_new_stream(AVFormatContext *s, const AVCodec *c)
Add a new stream to a media file.
#define AV_PKT_FLAG_KEY
The packet contains a keyframe.
#define AV_LOG_ERROR
Something went wrong and cannot losslessly be recovered.
unsigned int avio_rl32(AVIOContext *s)
#define NULL_IF_CONFIG_SMALL(x)
Return NULL if CONFIG_SMALL is true, otherwise the argument without modification. ...
enum AVMediaType codec_type
General type of the encoded data.
int flags
A combination of AV_PKT_FLAG values.
static int msnwc_tcp_read_header(AVFormatContext *ctx)
int avio_r8(AVIOContext *s)
int buf_size
Size of buf except extra allocated bytes.
unsigned char * buf
Buffer must have AVPROBE_PADDING_SIZE of extra allocated bytes filled with zero.
static int msnwc_tcp_read_packet(AVFormatContext *ctx, AVPacket *pkt)
static int msnwc_tcp_probe(AVProbeData *p)
AVIOContext * pb
I/O context.
This structure contains the data a format has to probe a file.
unsigned int avio_rl16(AVIOContext *s)
int64_t dts
Decompression timestamp in AVStream->time_base units; the time at which the packet is decompressed...
AVCodecParameters * codecpar
Codec parameters associated with this stream.
int avio_feof(AVIOContext *s)
feof() equivalent for AVIOContext.
uint32_t codec_tag
Additional information about the codec (corresponds to the AVI FOURCC).
#define MKTAG(a, b, c, d)
This structure stores compressed data.
int64_t pts
Presentation timestamp in AVStream->time_base units; the time at which the decompressed packet will b...