FFmpeg
Loading...
Searching...
No Matches
msnwc_tcp.c
Go to the documentation of this file.
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
22#include "avformat.h"
23#include "demux.h"
24#include "internal.h"
25
26#define HEADER_SIZE 24
27
28/*
29 * Header structure:
30 * uint16_t ss; // struct size
31 * uint16_t width; // frame width
32 * uint16_t height; // frame height
33 * uint16_t ff; // keyframe + some other info(???)
34 * uint32_t size; // size of data
35 * uint32_t fourcc; // ML20
36 * uint32_t u3; // ?
37 * uint32_t ts; // time
38 */
39
40static int msnwc_tcp_probe(const AVProbeData *p)
41{
42 int i;
43
44 for (i = 0; i + HEADER_SIZE <= p->buf_size; i++) {
45 uint16_t width, height;
46 uint32_t fourcc;
47 const uint8_t *bytestream = p->buf + i;
48
49 if (bytestream_get_le16(&bytestream) != HEADER_SIZE)
50 continue;
51 width = bytestream_get_le16(&bytestream);
52 height = bytestream_get_le16(&bytestream);
53 if (!(width == 320 &&
54 height == 240) && !(width == 160 && height == 120))
55 continue;
56 bytestream += 2; // keyframe
57 bytestream += 4; // size
58 fourcc = bytestream_get_le32(&bytestream);
59 if (fourcc != MKTAG('M', 'L', '2', '0'))
60 continue;
61
62 if (i) {
63 if (i < 14) /* starts with SwitchBoard connection info */
64 return AVPROBE_SCORE_MAX / 2;
65 else /* starts in the middle of stream */
66 return AVPROBE_SCORE_MAX / 3;
67 } else {
68 return AVPROBE_SCORE_MAX;
69 }
70 }
71
72 return 0;
73}
74
76{
77 AVIOContext *pb = ctx->pb;
79 AVStream *st;
80
82 if (!st)
83 return AVERROR(ENOMEM);
84
85 par = st->codecpar;
88 par->codec_tag = MKTAG('M', 'L', '2', '0');
89
90 avpriv_set_pts_info(st, 32, 1, 1000);
91
92 /* Some files start with "connected\r\n\r\n".
93 * So skip until we find the first byte of struct size */
94 while(avio_r8(pb) != HEADER_SIZE && !avio_feof(pb)) ;
95
96 if(avio_feof(pb)) {
97 av_log(ctx, AV_LOG_ERROR, "Could not find valid start.\n");
99 }
100
101 return 0;
102}
103
105{
106 AVIOContext *pb = ctx->pb;
107 uint16_t keyframe;
108 uint32_t size, timestamp;
109 int ret;
110
111 avio_skip(pb, 1); /* one byte has been read ahead */
112 avio_skip(pb, 2);
113 avio_skip(pb, 2);
114 keyframe = avio_rl16(pb);
115 size = avio_rl32(pb);
116 avio_skip(pb, 4);
117 avio_skip(pb, 4);
118 timestamp = avio_rl32(pb);
119
120 if (!size)
121 return AVERROR_INVALIDDATA;
122
123 if ((ret = av_get_packet(pb, pkt, size)) < 0)
124 return ret;
125
126 avio_skip(pb, 1); /* Read ahead one byte of struct size like read_header */
127
128 pkt->pts = timestamp;
129 pkt->dts = timestamp;
130 pkt->stream_index = 0;
131
132 /* Some aMsn generated videos (or was it Mercury Messenger?) don't set
133 * this bit and rely on the codec to get keyframe information */
134 if (keyframe & 1)
135 pkt->flags |= AV_PKT_FLAG_KEY;
136
137 return HEADER_SIZE + size;
138}
139
141 .p.name = "msnwctcp",
142 .p.long_name = NULL_IF_CONFIG_SMALL("MSN TCP Webcam stream"),
143 .read_probe = msnwc_tcp_probe,
144 .read_header = msnwc_tcp_read_header,
145 .read_packet = msnwc_tcp_read_packet,
146};
#define HEADER_SIZE
Definition adxenc.c:99
const FFInputFormat ff_msnwc_tcp_demuxer
Definition msnwc_tcp.c:140
void avpriv_set_pts_info(AVStream *st, int pts_wrap_bits, unsigned int pts_num, unsigned int pts_den)
Set the time base and wrapping info for a given stream.
Definition avformat.c:834
Main libavformat public API header.
#define AVPROBE_SCORE_MAX
maximum score
Definition avformat.h:483
int av_get_packet(AVIOContext *s, AVPacket *pkt, int size)
Allocate and read the payload of a packet and initialize its fields with default values.
Definition utils.c:98
int avio_feof(AVIOContext *s)
Similar to feof() but also returns nonzero on read errors.
Definition aviobuf.c:349
unsigned int avio_rl16(AVIOContext *s)
Definition aviobuf.c:717
int64_t avio_skip(AVIOContext *s, int64_t offset)
Skip given number of bytes forward.
Definition aviobuf.c:321
unsigned int avio_rl32(AVIOContext *s)
Definition aviobuf.c:733
int avio_r8(AVIOContext *s)
Definition aviobuf.c:606
#define i(width, name, range_min, range_max)
Definition cbs_h264.c:63
#define NULL
Definition coverity.c:32
static AVPacket * pkt
@ AV_CODEC_ID_MIMIC
Definition codec_id.h:163
#define AV_PKT_FLAG_KEY
The packet contains a keyframe.
Definition packet.h:650
AVStream * avformat_new_stream(AVFormatContext *s, const struct AVCodec *c)
Add a new stream to a media file.
#define AVERROR_INVALIDDATA
Invalid data found when processing input.
Definition error.h:61
#define AVERROR(e)
Definition error.h:45
#define AV_LOG_ERROR
Something went wrong and cannot losslessly be recovered.
Definition log.h:210
@ AVMEDIA_TYPE_VIDEO
Definition avutil.h:200
#define NULL_IF_CONFIG_SMALL(x)
Return NULL if CONFIG_SMALL is true, otherwise the argument without modification.
Definition internal.h:88
#define MKTAG(a, b, c, d)
Definition macros.h:55
static int msnwc_tcp_read_header(AVFormatContext *ctx)
Definition msnwc_tcp.c:75
static int msnwc_tcp_read_packet(AVFormatContext *ctx, AVPacket *pkt)
Definition msnwc_tcp.c:104
static int msnwc_tcp_probe(const AVProbeData *p)
Definition msnwc_tcp.c:40
This struct describes the properties of an encoded stream.
Definition codec_par.h:49
enum AVMediaType codec_type
General type of the encoded data.
Definition codec_par.h:53
uint32_t codec_tag
Additional information about the codec (corresponds to the AVI FOURCC).
Definition codec_par.h:61
enum AVCodecID codec_id
Specific type of the encoded data (the codec used).
Definition codec_par.h:57
Format I/O context.
Definition avformat.h:1333
Bytestream IO Context.
Definition avio.h:160
This structure stores compressed data.
Definition packet.h:580
This structure contains the data a format has to probe a file.
Definition avformat.h:471
Stream structure.
Definition avformat.h:766
AVCodecParameters * codecpar
Codec parameters associated with this stream.
Definition avformat.h:789
#define av_log(a,...)
static AVFormatContext * ctx
Definition movenc.c:49
#define height
Definition dsp.h:89
#define width
Definition dsp.h:89
int size
uint32_t fourcc