annotate siff.c @ 6455:3f50c7effad1 libavformat

rtsp: 10l, try to update the correct rtp stream This fixes a bug from rev 22917. Now RTSP streams where the individual RTCP sender reports aren't sent at the same time actually are synced properly.
author mstorsjo
date Fri, 03 Sep 2010 07:10:21 +0000
parents 11bb10c37225
children
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
2659
883daa175be1 Beam Software SIFF demuxer and video decoder
kostya
parents:
diff changeset
1 /*
883daa175be1 Beam Software SIFF demuxer and video decoder
kostya
parents:
diff changeset
2 * Beam Software SIFF demuxer
4251
77e0c7511d41 cosmetics: Remove pointless period after copyright statement non-sentences.
diego
parents: 4201
diff changeset
3 * Copyright (c) 2007 Konstantin Shishkov
2659
883daa175be1 Beam Software SIFF demuxer and video decoder
kostya
parents:
diff changeset
4 *
883daa175be1 Beam Software SIFF demuxer and video decoder
kostya
parents:
diff changeset
5 * This file is part of FFmpeg.
883daa175be1 Beam Software SIFF demuxer and video decoder
kostya
parents:
diff changeset
6 *
883daa175be1 Beam Software SIFF demuxer and video decoder
kostya
parents:
diff changeset
7 * FFmpeg is free software; you can redistribute it and/or
883daa175be1 Beam Software SIFF demuxer and video decoder
kostya
parents:
diff changeset
8 * modify it under the terms of the GNU Lesser General Public
883daa175be1 Beam Software SIFF demuxer and video decoder
kostya
parents:
diff changeset
9 * License as published by the Free Software Foundation; either
883daa175be1 Beam Software SIFF demuxer and video decoder
kostya
parents:
diff changeset
10 * version 2.1 of the License, or (at your option) any later version.
883daa175be1 Beam Software SIFF demuxer and video decoder
kostya
parents:
diff changeset
11 *
883daa175be1 Beam Software SIFF demuxer and video decoder
kostya
parents:
diff changeset
12 * FFmpeg is distributed in the hope that it will be useful,
883daa175be1 Beam Software SIFF demuxer and video decoder
kostya
parents:
diff changeset
13 * but WITHOUT ANY WARRANTY; without even the implied warranty of
883daa175be1 Beam Software SIFF demuxer and video decoder
kostya
parents:
diff changeset
14 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
883daa175be1 Beam Software SIFF demuxer and video decoder
kostya
parents:
diff changeset
15 * Lesser General Public License for more details.
883daa175be1 Beam Software SIFF demuxer and video decoder
kostya
parents:
diff changeset
16 *
883daa175be1 Beam Software SIFF demuxer and video decoder
kostya
parents:
diff changeset
17 * You should have received a copy of the GNU Lesser General Public
883daa175be1 Beam Software SIFF demuxer and video decoder
kostya
parents:
diff changeset
18 * License along with FFmpeg; if not, write to the Free Software
883daa175be1 Beam Software SIFF demuxer and video decoder
kostya
parents:
diff changeset
19 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
883daa175be1 Beam Software SIFF demuxer and video decoder
kostya
parents:
diff changeset
20 */
883daa175be1 Beam Software SIFF demuxer and video decoder
kostya
parents:
diff changeset
21
4201
7d2f3f1b68d8 Fix build: Add intreadwrite.h and bswap.h #includes where necessary.
diego
parents: 3908
diff changeset
22 #include "libavutil/intreadwrite.h"
2659
883daa175be1 Beam Software SIFF demuxer and video decoder
kostya
parents:
diff changeset
23 #include "avformat.h"
883daa175be1 Beam Software SIFF demuxer and video decoder
kostya
parents:
diff changeset
24
883daa175be1 Beam Software SIFF demuxer and video decoder
kostya
parents:
diff changeset
25 enum SIFFTags{
883daa175be1 Beam Software SIFF demuxer and video decoder
kostya
parents:
diff changeset
26 TAG_SIFF = MKTAG('S', 'I', 'F', 'F'),
883daa175be1 Beam Software SIFF demuxer and video decoder
kostya
parents:
diff changeset
27 TAG_BODY = MKTAG('B', 'O', 'D', 'Y'),
883daa175be1 Beam Software SIFF demuxer and video decoder
kostya
parents:
diff changeset
28 TAG_VBHD = MKTAG('V', 'B', 'H', 'D'),
883daa175be1 Beam Software SIFF demuxer and video decoder
kostya
parents:
diff changeset
29 TAG_SHDR = MKTAG('S', 'H', 'D', 'R'),
883daa175be1 Beam Software SIFF demuxer and video decoder
kostya
parents:
diff changeset
30 TAG_VBV1 = MKTAG('V', 'B', 'V', '1'),
883daa175be1 Beam Software SIFF demuxer and video decoder
kostya
parents:
diff changeset
31 TAG_SOUN = MKTAG('S', 'O', 'U', 'N'),
883daa175be1 Beam Software SIFF demuxer and video decoder
kostya
parents:
diff changeset
32 };
883daa175be1 Beam Software SIFF demuxer and video decoder
kostya
parents:
diff changeset
33
883daa175be1 Beam Software SIFF demuxer and video decoder
kostya
parents:
diff changeset
34 enum VBFlags{
883daa175be1 Beam Software SIFF demuxer and video decoder
kostya
parents:
diff changeset
35 VB_HAS_GMC = 0x01,
883daa175be1 Beam Software SIFF demuxer and video decoder
kostya
parents:
diff changeset
36 VB_HAS_AUDIO = 0x04,
883daa175be1 Beam Software SIFF demuxer and video decoder
kostya
parents:
diff changeset
37 VB_HAS_VIDEO = 0x08,
883daa175be1 Beam Software SIFF demuxer and video decoder
kostya
parents:
diff changeset
38 VB_HAS_PALETTE = 0x10,
883daa175be1 Beam Software SIFF demuxer and video decoder
kostya
parents:
diff changeset
39 VB_HAS_LENGTH = 0x20
883daa175be1 Beam Software SIFF demuxer and video decoder
kostya
parents:
diff changeset
40 };
883daa175be1 Beam Software SIFF demuxer and video decoder
kostya
parents:
diff changeset
41
883daa175be1 Beam Software SIFF demuxer and video decoder
kostya
parents:
diff changeset
42 typedef struct SIFFContext{
883daa175be1 Beam Software SIFF demuxer and video decoder
kostya
parents:
diff changeset
43 int frames;
883daa175be1 Beam Software SIFF demuxer and video decoder
kostya
parents:
diff changeset
44 int cur_frame;
883daa175be1 Beam Software SIFF demuxer and video decoder
kostya
parents:
diff changeset
45 int rate;
883daa175be1 Beam Software SIFF demuxer and video decoder
kostya
parents:
diff changeset
46 int bits;
883daa175be1 Beam Software SIFF demuxer and video decoder
kostya
parents:
diff changeset
47 int block_align;
883daa175be1 Beam Software SIFF demuxer and video decoder
kostya
parents:
diff changeset
48
883daa175be1 Beam Software SIFF demuxer and video decoder
kostya
parents:
diff changeset
49 int has_video;
883daa175be1 Beam Software SIFF demuxer and video decoder
kostya
parents:
diff changeset
50 int has_audio;
883daa175be1 Beam Software SIFF demuxer and video decoder
kostya
parents:
diff changeset
51
883daa175be1 Beam Software SIFF demuxer and video decoder
kostya
parents:
diff changeset
52 int curstrm;
883daa175be1 Beam Software SIFF demuxer and video decoder
kostya
parents:
diff changeset
53 int pktsize;
883daa175be1 Beam Software SIFF demuxer and video decoder
kostya
parents:
diff changeset
54 int gmcsize;
883daa175be1 Beam Software SIFF demuxer and video decoder
kostya
parents:
diff changeset
55 int sndsize;
883daa175be1 Beam Software SIFF demuxer and video decoder
kostya
parents:
diff changeset
56
883daa175be1 Beam Software SIFF demuxer and video decoder
kostya
parents:
diff changeset
57 int flags;
883daa175be1 Beam Software SIFF demuxer and video decoder
kostya
parents:
diff changeset
58 uint8_t gmc[4];
883daa175be1 Beam Software SIFF demuxer and video decoder
kostya
parents:
diff changeset
59 }SIFFContext;
883daa175be1 Beam Software SIFF demuxer and video decoder
kostya
parents:
diff changeset
60
883daa175be1 Beam Software SIFF demuxer and video decoder
kostya
parents:
diff changeset
61 static int siff_probe(AVProbeData *p)
883daa175be1 Beam Software SIFF demuxer and video decoder
kostya
parents:
diff changeset
62 {
5217
0d44bd284a96 Improve SIFF probe by also checking the first tag is one of the expected.
reimar
parents: 4251
diff changeset
63 uint32_t tag = AV_RL32(p->buf + 8);
2659
883daa175be1 Beam Software SIFF demuxer and video decoder
kostya
parents:
diff changeset
64 /* check file header */
5217
0d44bd284a96 Improve SIFF probe by also checking the first tag is one of the expected.
reimar
parents: 4251
diff changeset
65 if (AV_RL32(p->buf) != TAG_SIFF ||
0d44bd284a96 Improve SIFF probe by also checking the first tag is one of the expected.
reimar
parents: 4251
diff changeset
66 (tag != TAG_VBV1 && tag != TAG_SOUN))
2659
883daa175be1 Beam Software SIFF demuxer and video decoder
kostya
parents:
diff changeset
67 return 0;
5217
0d44bd284a96 Improve SIFF probe by also checking the first tag is one of the expected.
reimar
parents: 4251
diff changeset
68 return AVPROBE_SCORE_MAX;
2659
883daa175be1 Beam Software SIFF demuxer and video decoder
kostya
parents:
diff changeset
69 }
883daa175be1 Beam Software SIFF demuxer and video decoder
kostya
parents:
diff changeset
70
883daa175be1 Beam Software SIFF demuxer and video decoder
kostya
parents:
diff changeset
71 static int create_audio_stream(AVFormatContext *s, SIFFContext *c)
883daa175be1 Beam Software SIFF demuxer and video decoder
kostya
parents:
diff changeset
72 {
883daa175be1 Beam Software SIFF demuxer and video decoder
kostya
parents:
diff changeset
73 AVStream *ast;
883daa175be1 Beam Software SIFF demuxer and video decoder
kostya
parents:
diff changeset
74 ast = av_new_stream(s, 0);
883daa175be1 Beam Software SIFF demuxer and video decoder
kostya
parents:
diff changeset
75 if (!ast)
883daa175be1 Beam Software SIFF demuxer and video decoder
kostya
parents:
diff changeset
76 return -1;
5910
536e5527c1e0 Define AVMediaType enum, and use it instead of enum CodecType, which
stefano
parents: 5217
diff changeset
77 ast->codec->codec_type = AVMEDIA_TYPE_AUDIO;
2659
883daa175be1 Beam Software SIFF demuxer and video decoder
kostya
parents:
diff changeset
78 ast->codec->codec_id = CODEC_ID_PCM_U8;
883daa175be1 Beam Software SIFF demuxer and video decoder
kostya
parents:
diff changeset
79 ast->codec->channels = 1;
3908
1d3d17de20ba Bump Major version, this commit is almost just renaming bits_per_sample to
michael
parents: 3424
diff changeset
80 ast->codec->bits_per_coded_sample = c->bits;
2659
883daa175be1 Beam Software SIFF demuxer and video decoder
kostya
parents:
diff changeset
81 ast->codec->sample_rate = c->rate;
883daa175be1 Beam Software SIFF demuxer and video decoder
kostya
parents:
diff changeset
82 ast->codec->frame_size = c->block_align;
883daa175be1 Beam Software SIFF demuxer and video decoder
kostya
parents:
diff changeset
83 av_set_pts_info(ast, 16, 1, c->rate);
883daa175be1 Beam Software SIFF demuxer and video decoder
kostya
parents:
diff changeset
84 return 0;
883daa175be1 Beam Software SIFF demuxer and video decoder
kostya
parents:
diff changeset
85 }
883daa175be1 Beam Software SIFF demuxer and video decoder
kostya
parents:
diff changeset
86
883daa175be1 Beam Software SIFF demuxer and video decoder
kostya
parents:
diff changeset
87 static int siff_parse_vbv1(AVFormatContext *s, SIFFContext *c, ByteIOContext *pb)
883daa175be1 Beam Software SIFF demuxer and video decoder
kostya
parents:
diff changeset
88 {
883daa175be1 Beam Software SIFF demuxer and video decoder
kostya
parents:
diff changeset
89 AVStream *st;
883daa175be1 Beam Software SIFF demuxer and video decoder
kostya
parents:
diff changeset
90 int width, height;
883daa175be1 Beam Software SIFF demuxer and video decoder
kostya
parents:
diff changeset
91
883daa175be1 Beam Software SIFF demuxer and video decoder
kostya
parents:
diff changeset
92 if (get_le32(pb) != TAG_VBHD){
883daa175be1 Beam Software SIFF demuxer and video decoder
kostya
parents:
diff changeset
93 av_log(s, AV_LOG_ERROR, "Header chunk is missing\n");
883daa175be1 Beam Software SIFF demuxer and video decoder
kostya
parents:
diff changeset
94 return -1;
883daa175be1 Beam Software SIFF demuxer and video decoder
kostya
parents:
diff changeset
95 }
883daa175be1 Beam Software SIFF demuxer and video decoder
kostya
parents:
diff changeset
96 if(get_be32(pb) != 32){
883daa175be1 Beam Software SIFF demuxer and video decoder
kostya
parents:
diff changeset
97 av_log(s, AV_LOG_ERROR, "Header chunk size is incorrect\n");
883daa175be1 Beam Software SIFF demuxer and video decoder
kostya
parents:
diff changeset
98 return -1;
883daa175be1 Beam Software SIFF demuxer and video decoder
kostya
parents:
diff changeset
99 }
883daa175be1 Beam Software SIFF demuxer and video decoder
kostya
parents:
diff changeset
100 if(get_le16(pb) != 1){
883daa175be1 Beam Software SIFF demuxer and video decoder
kostya
parents:
diff changeset
101 av_log(s, AV_LOG_ERROR, "Incorrect header version\n");
883daa175be1 Beam Software SIFF demuxer and video decoder
kostya
parents:
diff changeset
102 return -1;
883daa175be1 Beam Software SIFF demuxer and video decoder
kostya
parents:
diff changeset
103 }
883daa175be1 Beam Software SIFF demuxer and video decoder
kostya
parents:
diff changeset
104 width = get_le16(pb);
883daa175be1 Beam Software SIFF demuxer and video decoder
kostya
parents:
diff changeset
105 height = get_le16(pb);
883daa175be1 Beam Software SIFF demuxer and video decoder
kostya
parents:
diff changeset
106 url_fskip(pb, 4);
883daa175be1 Beam Software SIFF demuxer and video decoder
kostya
parents:
diff changeset
107 c->frames = get_le16(pb);
883daa175be1 Beam Software SIFF demuxer and video decoder
kostya
parents:
diff changeset
108 if(!c->frames){
883daa175be1 Beam Software SIFF demuxer and video decoder
kostya
parents:
diff changeset
109 av_log(s, AV_LOG_ERROR, "File contains no frames ???\n");
883daa175be1 Beam Software SIFF demuxer and video decoder
kostya
parents:
diff changeset
110 return -1;
883daa175be1 Beam Software SIFF demuxer and video decoder
kostya
parents:
diff changeset
111 }
883daa175be1 Beam Software SIFF demuxer and video decoder
kostya
parents:
diff changeset
112 c->bits = get_le16(pb);
883daa175be1 Beam Software SIFF demuxer and video decoder
kostya
parents:
diff changeset
113 c->rate = get_le16(pb);
883daa175be1 Beam Software SIFF demuxer and video decoder
kostya
parents:
diff changeset
114 c->block_align = c->rate * (c->bits >> 3);
883daa175be1 Beam Software SIFF demuxer and video decoder
kostya
parents:
diff changeset
115
883daa175be1 Beam Software SIFF demuxer and video decoder
kostya
parents:
diff changeset
116 url_fskip(pb, 16); //zeroes
883daa175be1 Beam Software SIFF demuxer and video decoder
kostya
parents:
diff changeset
117
883daa175be1 Beam Software SIFF demuxer and video decoder
kostya
parents:
diff changeset
118 st = av_new_stream(s, 0);
883daa175be1 Beam Software SIFF demuxer and video decoder
kostya
parents:
diff changeset
119 if (!st)
883daa175be1 Beam Software SIFF demuxer and video decoder
kostya
parents:
diff changeset
120 return -1;
5910
536e5527c1e0 Define AVMediaType enum, and use it instead of enum CodecType, which
stefano
parents: 5217
diff changeset
121 st->codec->codec_type = AVMEDIA_TYPE_VIDEO;
2659
883daa175be1 Beam Software SIFF demuxer and video decoder
kostya
parents:
diff changeset
122 st->codec->codec_id = CODEC_ID_VB;
883daa175be1 Beam Software SIFF demuxer and video decoder
kostya
parents:
diff changeset
123 st->codec->codec_tag = MKTAG('V', 'B', 'V', '1');
883daa175be1 Beam Software SIFF demuxer and video decoder
kostya
parents:
diff changeset
124 st->codec->width = width;
883daa175be1 Beam Software SIFF demuxer and video decoder
kostya
parents:
diff changeset
125 st->codec->height = height;
883daa175be1 Beam Software SIFF demuxer and video decoder
kostya
parents:
diff changeset
126 st->codec->pix_fmt = PIX_FMT_PAL8;
883daa175be1 Beam Software SIFF demuxer and video decoder
kostya
parents:
diff changeset
127 av_set_pts_info(st, 16, 1, 12);
883daa175be1 Beam Software SIFF demuxer and video decoder
kostya
parents:
diff changeset
128
883daa175be1 Beam Software SIFF demuxer and video decoder
kostya
parents:
diff changeset
129 c->cur_frame = 0;
883daa175be1 Beam Software SIFF demuxer and video decoder
kostya
parents:
diff changeset
130 c->has_video = 1;
883daa175be1 Beam Software SIFF demuxer and video decoder
kostya
parents:
diff changeset
131 c->has_audio = !!c->rate;
883daa175be1 Beam Software SIFF demuxer and video decoder
kostya
parents:
diff changeset
132 c->curstrm = -1;
883daa175be1 Beam Software SIFF demuxer and video decoder
kostya
parents:
diff changeset
133 if (c->has_audio && create_audio_stream(s, c) < 0)
883daa175be1 Beam Software SIFF demuxer and video decoder
kostya
parents:
diff changeset
134 return -1;
883daa175be1 Beam Software SIFF demuxer and video decoder
kostya
parents:
diff changeset
135 return 0;
883daa175be1 Beam Software SIFF demuxer and video decoder
kostya
parents:
diff changeset
136 }
883daa175be1 Beam Software SIFF demuxer and video decoder
kostya
parents:
diff changeset
137
883daa175be1 Beam Software SIFF demuxer and video decoder
kostya
parents:
diff changeset
138 static int siff_parse_soun(AVFormatContext *s, SIFFContext *c, ByteIOContext *pb)
883daa175be1 Beam Software SIFF demuxer and video decoder
kostya
parents:
diff changeset
139 {
883daa175be1 Beam Software SIFF demuxer and video decoder
kostya
parents:
diff changeset
140 if (get_le32(pb) != TAG_SHDR){
883daa175be1 Beam Software SIFF demuxer and video decoder
kostya
parents:
diff changeset
141 av_log(s, AV_LOG_ERROR, "Header chunk is missing\n");
883daa175be1 Beam Software SIFF demuxer and video decoder
kostya
parents:
diff changeset
142 return -1;
883daa175be1 Beam Software SIFF demuxer and video decoder
kostya
parents:
diff changeset
143 }
883daa175be1 Beam Software SIFF demuxer and video decoder
kostya
parents:
diff changeset
144 if(get_be32(pb) != 8){
883daa175be1 Beam Software SIFF demuxer and video decoder
kostya
parents:
diff changeset
145 av_log(s, AV_LOG_ERROR, "Header chunk size is incorrect\n");
883daa175be1 Beam Software SIFF demuxer and video decoder
kostya
parents:
diff changeset
146 return -1;
883daa175be1 Beam Software SIFF demuxer and video decoder
kostya
parents:
diff changeset
147 }
883daa175be1 Beam Software SIFF demuxer and video decoder
kostya
parents:
diff changeset
148 url_fskip(pb, 4); //unknown value
883daa175be1 Beam Software SIFF demuxer and video decoder
kostya
parents:
diff changeset
149 c->rate = get_le16(pb);
883daa175be1 Beam Software SIFF demuxer and video decoder
kostya
parents:
diff changeset
150 c->bits = get_le16(pb);
883daa175be1 Beam Software SIFF demuxer and video decoder
kostya
parents:
diff changeset
151 c->block_align = c->rate * (c->bits >> 3);
883daa175be1 Beam Software SIFF demuxer and video decoder
kostya
parents:
diff changeset
152 return create_audio_stream(s, c);
883daa175be1 Beam Software SIFF demuxer and video decoder
kostya
parents:
diff changeset
153 }
883daa175be1 Beam Software SIFF demuxer and video decoder
kostya
parents:
diff changeset
154
883daa175be1 Beam Software SIFF demuxer and video decoder
kostya
parents:
diff changeset
155 static int siff_read_header(AVFormatContext *s, AVFormatParameters *ap)
883daa175be1 Beam Software SIFF demuxer and video decoder
kostya
parents:
diff changeset
156 {
2771
d52c718e83f9 Use dynamically allocated ByteIOContext in AVFormatContext
andoma
parents: 2690
diff changeset
157 ByteIOContext *pb = s->pb;
2659
883daa175be1 Beam Software SIFF demuxer and video decoder
kostya
parents:
diff changeset
158 SIFFContext *c = s->priv_data;
883daa175be1 Beam Software SIFF demuxer and video decoder
kostya
parents:
diff changeset
159 uint32_t tag;
883daa175be1 Beam Software SIFF demuxer and video decoder
kostya
parents:
diff changeset
160
883daa175be1 Beam Software SIFF demuxer and video decoder
kostya
parents:
diff changeset
161 if (get_le32(pb) != TAG_SIFF)
883daa175be1 Beam Software SIFF demuxer and video decoder
kostya
parents:
diff changeset
162 return -1;
883daa175be1 Beam Software SIFF demuxer and video decoder
kostya
parents:
diff changeset
163 url_fskip(pb, 4); //ignore size
883daa175be1 Beam Software SIFF demuxer and video decoder
kostya
parents:
diff changeset
164 tag = get_le32(pb);
883daa175be1 Beam Software SIFF demuxer and video decoder
kostya
parents:
diff changeset
165
883daa175be1 Beam Software SIFF demuxer and video decoder
kostya
parents:
diff changeset
166 if (tag != TAG_VBV1 && tag != TAG_SOUN){
883daa175be1 Beam Software SIFF demuxer and video decoder
kostya
parents:
diff changeset
167 av_log(s, AV_LOG_ERROR, "Not a VBV file\n");
883daa175be1 Beam Software SIFF demuxer and video decoder
kostya
parents:
diff changeset
168 return -1;
883daa175be1 Beam Software SIFF demuxer and video decoder
kostya
parents:
diff changeset
169 }
883daa175be1 Beam Software SIFF demuxer and video decoder
kostya
parents:
diff changeset
170
883daa175be1 Beam Software SIFF demuxer and video decoder
kostya
parents:
diff changeset
171 if (tag == TAG_VBV1 && siff_parse_vbv1(s, c, pb) < 0)
883daa175be1 Beam Software SIFF demuxer and video decoder
kostya
parents:
diff changeset
172 return -1;
883daa175be1 Beam Software SIFF demuxer and video decoder
kostya
parents:
diff changeset
173 if (tag == TAG_SOUN && siff_parse_soun(s, c, pb) < 0)
883daa175be1 Beam Software SIFF demuxer and video decoder
kostya
parents:
diff changeset
174 return -1;
883daa175be1 Beam Software SIFF demuxer and video decoder
kostya
parents:
diff changeset
175 if (get_le32(pb) != MKTAG('B', 'O', 'D', 'Y')){
883daa175be1 Beam Software SIFF demuxer and video decoder
kostya
parents:
diff changeset
176 av_log(s, AV_LOG_ERROR, "'BODY' chunk is missing\n");
883daa175be1 Beam Software SIFF demuxer and video decoder
kostya
parents:
diff changeset
177 return -1;
883daa175be1 Beam Software SIFF demuxer and video decoder
kostya
parents:
diff changeset
178 }
883daa175be1 Beam Software SIFF demuxer and video decoder
kostya
parents:
diff changeset
179 url_fskip(pb, 4); //ignore size
883daa175be1 Beam Software SIFF demuxer and video decoder
kostya
parents:
diff changeset
180
883daa175be1 Beam Software SIFF demuxer and video decoder
kostya
parents:
diff changeset
181 return 0;
883daa175be1 Beam Software SIFF demuxer and video decoder
kostya
parents:
diff changeset
182 }
883daa175be1 Beam Software SIFF demuxer and video decoder
kostya
parents:
diff changeset
183
883daa175be1 Beam Software SIFF demuxer and video decoder
kostya
parents:
diff changeset
184 static int siff_read_packet(AVFormatContext *s, AVPacket *pkt)
883daa175be1 Beam Software SIFF demuxer and video decoder
kostya
parents:
diff changeset
185 {
883daa175be1 Beam Software SIFF demuxer and video decoder
kostya
parents:
diff changeset
186 SIFFContext *c = s->priv_data;
2690
0a8f2dc62d01 Remove unused variables, fixes the following warnings:
diego
parents: 2659
diff changeset
187 int size;
2659
883daa175be1 Beam Software SIFF demuxer and video decoder
kostya
parents:
diff changeset
188
883daa175be1 Beam Software SIFF demuxer and video decoder
kostya
parents:
diff changeset
189 if (c->has_video){
883daa175be1 Beam Software SIFF demuxer and video decoder
kostya
parents:
diff changeset
190 if (c->cur_frame >= c->frames)
883daa175be1 Beam Software SIFF demuxer and video decoder
kostya
parents:
diff changeset
191 return AVERROR(EIO);
883daa175be1 Beam Software SIFF demuxer and video decoder
kostya
parents:
diff changeset
192 if (c->curstrm == -1){
2771
d52c718e83f9 Use dynamically allocated ByteIOContext in AVFormatContext
andoma
parents: 2690
diff changeset
193 c->pktsize = get_le32(s->pb) - 4;
d52c718e83f9 Use dynamically allocated ByteIOContext in AVFormatContext
andoma
parents: 2690
diff changeset
194 c->flags = get_le16(s->pb);
2659
883daa175be1 Beam Software SIFF demuxer and video decoder
kostya
parents:
diff changeset
195 c->gmcsize = (c->flags & VB_HAS_GMC) ? 4 : 0;
883daa175be1 Beam Software SIFF demuxer and video decoder
kostya
parents:
diff changeset
196 if (c->gmcsize)
2771
d52c718e83f9 Use dynamically allocated ByteIOContext in AVFormatContext
andoma
parents: 2690
diff changeset
197 get_buffer(s->pb, c->gmc, c->gmcsize);
d52c718e83f9 Use dynamically allocated ByteIOContext in AVFormatContext
andoma
parents: 2690
diff changeset
198 c->sndsize = (c->flags & VB_HAS_AUDIO) ? get_le32(s->pb): 0;
2659
883daa175be1 Beam Software SIFF demuxer and video decoder
kostya
parents:
diff changeset
199 c->curstrm = !!(c->flags & VB_HAS_AUDIO);
883daa175be1 Beam Software SIFF demuxer and video decoder
kostya
parents:
diff changeset
200 }
883daa175be1 Beam Software SIFF demuxer and video decoder
kostya
parents:
diff changeset
201
883daa175be1 Beam Software SIFF demuxer and video decoder
kostya
parents:
diff changeset
202 if (!c->curstrm){
883daa175be1 Beam Software SIFF demuxer and video decoder
kostya
parents:
diff changeset
203 size = c->pktsize - c->sndsize;
883daa175be1 Beam Software SIFF demuxer and video decoder
kostya
parents:
diff changeset
204 if (av_new_packet(pkt, size) < 0)
883daa175be1 Beam Software SIFF demuxer and video decoder
kostya
parents:
diff changeset
205 return AVERROR(ENOMEM);
883daa175be1 Beam Software SIFF demuxer and video decoder
kostya
parents:
diff changeset
206 AV_WL16(pkt->data, c->flags);
883daa175be1 Beam Software SIFF demuxer and video decoder
kostya
parents:
diff changeset
207 if (c->gmcsize)
883daa175be1 Beam Software SIFF demuxer and video decoder
kostya
parents:
diff changeset
208 memcpy(pkt->data + 2, c->gmc, c->gmcsize);
2771
d52c718e83f9 Use dynamically allocated ByteIOContext in AVFormatContext
andoma
parents: 2690
diff changeset
209 get_buffer(s->pb, pkt->data + 2 + c->gmcsize, size - c->gmcsize - 2);
2659
883daa175be1 Beam Software SIFF demuxer and video decoder
kostya
parents:
diff changeset
210 pkt->stream_index = 0;
883daa175be1 Beam Software SIFF demuxer and video decoder
kostya
parents:
diff changeset
211 c->curstrm = -1;
883daa175be1 Beam Software SIFF demuxer and video decoder
kostya
parents:
diff changeset
212 }else{
2771
d52c718e83f9 Use dynamically allocated ByteIOContext in AVFormatContext
andoma
parents: 2690
diff changeset
213 if (av_get_packet(s->pb, pkt, c->sndsize - 4) < 0)
2659
883daa175be1 Beam Software SIFF demuxer and video decoder
kostya
parents:
diff changeset
214 return AVERROR(EIO);
883daa175be1 Beam Software SIFF demuxer and video decoder
kostya
parents:
diff changeset
215 pkt->stream_index = 1;
883daa175be1 Beam Software SIFF demuxer and video decoder
kostya
parents:
diff changeset
216 c->curstrm = 0;
883daa175be1 Beam Software SIFF demuxer and video decoder
kostya
parents:
diff changeset
217 }
883daa175be1 Beam Software SIFF demuxer and video decoder
kostya
parents:
diff changeset
218 if(!c->cur_frame || c->curstrm)
5913
11bb10c37225 Replace all occurences of PKT_FLAG_KEY with AV_PKT_FLAG_KEY.
cehoyos
parents: 5910
diff changeset
219 pkt->flags |= AV_PKT_FLAG_KEY;
2659
883daa175be1 Beam Software SIFF demuxer and video decoder
kostya
parents:
diff changeset
220 if (c->curstrm == -1)
883daa175be1 Beam Software SIFF demuxer and video decoder
kostya
parents:
diff changeset
221 c->cur_frame++;
883daa175be1 Beam Software SIFF demuxer and video decoder
kostya
parents:
diff changeset
222 }else{
2771
d52c718e83f9 Use dynamically allocated ByteIOContext in AVFormatContext
andoma
parents: 2690
diff changeset
223 size = av_get_packet(s->pb, pkt, c->block_align);
2659
883daa175be1 Beam Software SIFF demuxer and video decoder
kostya
parents:
diff changeset
224 if(size <= 0)
883daa175be1 Beam Software SIFF demuxer and video decoder
kostya
parents:
diff changeset
225 return AVERROR(EIO);
883daa175be1 Beam Software SIFF demuxer and video decoder
kostya
parents:
diff changeset
226 }
883daa175be1 Beam Software SIFF demuxer and video decoder
kostya
parents:
diff changeset
227 return pkt->size;
883daa175be1 Beam Software SIFF demuxer and video decoder
kostya
parents:
diff changeset
228 }
883daa175be1 Beam Software SIFF demuxer and video decoder
kostya
parents:
diff changeset
229
883daa175be1 Beam Software SIFF demuxer and video decoder
kostya
parents:
diff changeset
230 AVInputFormat siff_demuxer = {
883daa175be1 Beam Software SIFF demuxer and video decoder
kostya
parents:
diff changeset
231 "siff",
3424
7a0230981402 Make long_names in lavf/lavdev optional depending on CONFIG_SMALL.
diego
parents: 3399
diff changeset
232 NULL_IF_CONFIG_SMALL("Beam Software SIFF"),
2659
883daa175be1 Beam Software SIFF demuxer and video decoder
kostya
parents:
diff changeset
233 sizeof(SIFFContext),
883daa175be1 Beam Software SIFF demuxer and video decoder
kostya
parents:
diff changeset
234 siff_probe,
883daa175be1 Beam Software SIFF demuxer and video decoder
kostya
parents:
diff changeset
235 siff_read_header,
883daa175be1 Beam Software SIFF demuxer and video decoder
kostya
parents:
diff changeset
236 siff_read_packet,
883daa175be1 Beam Software SIFF demuxer and video decoder
kostya
parents:
diff changeset
237 .extensions = "vb,son"
883daa175be1 Beam Software SIFF demuxer and video decoder
kostya
parents:
diff changeset
238 };