Mercurial > libavformat.hg
annotate sierravmd.c @ 6275:287072e5227b libavformat
Add MD5 protocol
This is a write-only protocol which computes the md5sum of data written,
and on close writes this to the designated output or stdout if none
is specified. It can be used to test muxers without writing an actual
file.
author | mru |
---|---|
date | Sun, 18 Jul 2010 20:19:08 +0000 |
parents | 178de7695c6c |
children |
rev | line source |
---|---|
338 | 1 /* |
2 * Sierra VMD Format Demuxer | |
3 * Copyright (c) 2004 The ffmpeg Project | |
4 * | |
1358
0899bfe4105c
Change license headers to say 'FFmpeg' instead of 'this program/this library'
diego
parents:
1169
diff
changeset
|
5 * This file is part of FFmpeg. |
0899bfe4105c
Change license headers to say 'FFmpeg' instead of 'this program/this library'
diego
parents:
1169
diff
changeset
|
6 * |
0899bfe4105c
Change license headers to say 'FFmpeg' instead of 'this program/this library'
diego
parents:
1169
diff
changeset
|
7 * FFmpeg is free software; you can redistribute it and/or |
338 | 8 * modify it under the terms of the GNU Lesser General Public |
9 * License as published by the Free Software Foundation; either | |
1358
0899bfe4105c
Change license headers to say 'FFmpeg' instead of 'this program/this library'
diego
parents:
1169
diff
changeset
|
10 * version 2.1 of the License, or (at your option) any later version. |
338 | 11 * |
1358
0899bfe4105c
Change license headers to say 'FFmpeg' instead of 'this program/this library'
diego
parents:
1169
diff
changeset
|
12 * FFmpeg is distributed in the hope that it will be useful, |
338 | 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 | |
1358
0899bfe4105c
Change license headers to say 'FFmpeg' instead of 'this program/this library'
diego
parents:
1169
diff
changeset
|
18 * License along with FFmpeg; if not, write to the Free Software |
896
edbe5c3717f9
Update licensing information: The FSF changed postal address.
diego
parents:
887
diff
changeset
|
19 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA |
338 | 20 */ |
21 | |
22 /** | |
5969
178de7695c6c
Remove explicit filename from Doxygen @file commands.
diego
parents:
5910
diff
changeset
|
23 * @file |
338 | 24 * Sierra VMD file demuxer |
25 * by Vladimir "VAG" Gneushev (vagsoft at mail.ru) | |
387
f2760852ed18
minor VMD system update; still not perfect, but should not crash either
melanson
parents:
338
diff
changeset
|
26 * for more information on the Sierra VMD file format, visit: |
f2760852ed18
minor VMD system update; still not perfect, but should not crash either
melanson
parents:
338
diff
changeset
|
27 * http://www.pcisys.net/~melanson/codecs/ |
338 | 28 */ |
29 | |
4201
7d2f3f1b68d8
Fix build: Add intreadwrite.h and bswap.h #includes where necessary.
diego
parents:
4137
diff
changeset
|
30 #include "libavutil/intreadwrite.h" |
338 | 31 #include "avformat.h" |
32 | |
33 #define VMD_HEADER_SIZE 0x0330 | |
34 #define BYTES_PER_FRAME_RECORD 16 | |
35 | |
36 typedef struct { | |
37 int stream_index; | |
3973
549a09cf23fe
Remove offset_t typedef and use int64_t directly instead.
diego
parents:
3908
diff
changeset
|
38 int64_t frame_offset; |
338 | 39 unsigned int frame_size; |
40 int64_t pts; | |
41 int keyframe; | |
42 unsigned char frame_record[BYTES_PER_FRAME_RECORD]; | |
4102
dcaeec7bd85f
The POSIX namespace shall be held sacrosanct. To that end,
melanson
parents:
3973
diff
changeset
|
43 } vmd_frame; |
338 | 44 |
45 typedef struct VmdDemuxContext { | |
46 int video_stream_index; | |
47 int audio_stream_index; | |
48 | |
49 unsigned int frame_count; | |
1004
409b399440a3
More correct demuxing and timestamp setting fot Sierra VMD
kostya
parents:
896
diff
changeset
|
50 unsigned int frames_per_block; |
4102
dcaeec7bd85f
The POSIX namespace shall be held sacrosanct. To that end,
melanson
parents:
3973
diff
changeset
|
51 vmd_frame *frame_table; |
338 | 52 unsigned int current_frame; |
4131
e9ef9239086b
Latest Coktel Vision VMDs contained Indeo 3, add demuxer support for it
kostya
parents:
4102
diff
changeset
|
53 int is_indeo3; |
338 | 54 |
387
f2760852ed18
minor VMD system update; still not perfect, but should not crash either
melanson
parents:
338
diff
changeset
|
55 int sample_rate; |
f2760852ed18
minor VMD system update; still not perfect, but should not crash either
melanson
parents:
338
diff
changeset
|
56 int64_t audio_sample_counter; |
1004
409b399440a3
More correct demuxing and timestamp setting fot Sierra VMD
kostya
parents:
896
diff
changeset
|
57 int skiphdr; |
387
f2760852ed18
minor VMD system update; still not perfect, but should not crash either
melanson
parents:
338
diff
changeset
|
58 |
338 | 59 unsigned char vmd_header[VMD_HEADER_SIZE]; |
60 } VmdDemuxContext; | |
61 | |
62 static int vmd_probe(AVProbeData *p) | |
63 { | |
5187
0394dceb230f
Improve sierravmd probe. It is still quite weak, but further improvements
reimar
parents:
5178
diff
changeset
|
64 int w, h; |
0394dceb230f
Improve sierravmd probe. It is still quite weak, but further improvements
reimar
parents:
5178
diff
changeset
|
65 if (p->buf_size < 16) |
0394dceb230f
Improve sierravmd probe. It is still quite weak, but further improvements
reimar
parents:
5178
diff
changeset
|
66 return 0; |
338 | 67 /* check if the first 2 bytes of the file contain the appropriate size |
68 * of a VMD header chunk */ | |
1673 | 69 if (AV_RL16(&p->buf[0]) != VMD_HEADER_SIZE - 2) |
338 | 70 return 0; |
5187
0394dceb230f
Improve sierravmd probe. It is still quite weak, but further improvements
reimar
parents:
5178
diff
changeset
|
71 w = AV_RL16(&p->buf[12]); |
0394dceb230f
Improve sierravmd probe. It is still quite weak, but further improvements
reimar
parents:
5178
diff
changeset
|
72 h = AV_RL16(&p->buf[14]); |
0394dceb230f
Improve sierravmd probe. It is still quite weak, but further improvements
reimar
parents:
5178
diff
changeset
|
73 if (!w || w > 2048 || !h || h > 2048) |
0394dceb230f
Improve sierravmd probe. It is still quite weak, but further improvements
reimar
parents:
5178
diff
changeset
|
74 return 0; |
338 | 75 |
76 /* only return half certainty since this check is a bit sketchy */ | |
77 return AVPROBE_SCORE_MAX / 2; | |
78 } | |
79 | |
80 static int vmd_read_header(AVFormatContext *s, | |
81 AVFormatParameters *ap) | |
82 { | |
2006 | 83 VmdDemuxContext *vmd = s->priv_data; |
2771
d52c718e83f9
Use dynamically allocated ByteIOContext in AVFormatContext
andoma
parents:
2369
diff
changeset
|
84 ByteIOContext *pb = s->pb; |
3017 | 85 AVStream *st = NULL, *vst; |
338 | 86 unsigned int toc_offset; |
87 unsigned char *raw_frame_table; | |
88 int raw_frame_table_size; | |
3973
549a09cf23fe
Remove offset_t typedef and use int64_t directly instead.
diego
parents:
3908
diff
changeset
|
89 int64_t current_offset; |
1004
409b399440a3
More correct demuxing and timestamp setting fot Sierra VMD
kostya
parents:
896
diff
changeset
|
90 int i, j; |
338 | 91 unsigned int total_frames; |
4268
85608ac6c804
yet another attempt on fixing synchronization in VMD
kostya
parents:
4267
diff
changeset
|
92 int64_t current_audio_pts = 0; |
1004
409b399440a3
More correct demuxing and timestamp setting fot Sierra VMD
kostya
parents:
896
diff
changeset
|
93 unsigned char chunk[BYTES_PER_FRAME_RECORD]; |
1492
deaec052eec4
Simplify VMD demuxer (but it still does not work right)
kostya
parents:
1441
diff
changeset
|
94 int num, den; |
1528
32d49970f01a
Divide first audio buffer chunk into atomary bufffers.
kostya
parents:
1492
diff
changeset
|
95 int sound_buffers; |
338 | 96 |
97 /* fetch the main header, including the 2 header length bytes */ | |
98 url_fseek(pb, 0, SEEK_SET); | |
99 if (get_buffer(pb, vmd->vmd_header, VMD_HEADER_SIZE) != VMD_HEADER_SIZE) | |
2274
b21c2af60bc9
Replace all occurrences of AVERROR_IO with AVERROR(EIO).
takis
parents:
2273
diff
changeset
|
100 return AVERROR(EIO); |
338 | 101 |
4131
e9ef9239086b
Latest Coktel Vision VMDs contained Indeo 3, add demuxer support for it
kostya
parents:
4102
diff
changeset
|
102 if(vmd->vmd_header[16] == 'i' && vmd->vmd_header[17] == 'v' && vmd->vmd_header[18] == '3') |
e9ef9239086b
Latest Coktel Vision VMDs contained Indeo 3, add demuxer support for it
kostya
parents:
4102
diff
changeset
|
103 vmd->is_indeo3 = 1; |
e9ef9239086b
Latest Coktel Vision VMDs contained Indeo 3, add demuxer support for it
kostya
parents:
4102
diff
changeset
|
104 else |
4137
b432c9e98002
Fix a typo that made VMD demuxer always assume Indeo 3 as video codec.
kostya
parents:
4131
diff
changeset
|
105 vmd->is_indeo3 = 0; |
338 | 106 /* start up the decoders */ |
1492
deaec052eec4
Simplify VMD demuxer (but it still does not work right)
kostya
parents:
1441
diff
changeset
|
107 vst = av_new_stream(s, 0); |
deaec052eec4
Simplify VMD demuxer (but it still does not work right)
kostya
parents:
1441
diff
changeset
|
108 if (!vst) |
2273
7eb456c4ed8a
Replace all occurrences of AVERROR_NOMEM with AVERROR(ENOMEM).
takis
parents:
2006
diff
changeset
|
109 return AVERROR(ENOMEM); |
1492
deaec052eec4
Simplify VMD demuxer (but it still does not work right)
kostya
parents:
1441
diff
changeset
|
110 av_set_pts_info(vst, 33, 1, 10); |
deaec052eec4
Simplify VMD demuxer (but it still does not work right)
kostya
parents:
1441
diff
changeset
|
111 vmd->video_stream_index = vst->index; |
5910
536e5527c1e0
Define AVMediaType enum, and use it instead of enum CodecType, which
stefano
parents:
5207
diff
changeset
|
112 vst->codec->codec_type = AVMEDIA_TYPE_VIDEO; |
4131
e9ef9239086b
Latest Coktel Vision VMDs contained Indeo 3, add demuxer support for it
kostya
parents:
4102
diff
changeset
|
113 vst->codec->codec_id = vmd->is_indeo3 ? CODEC_ID_INDEO3 : CODEC_ID_VMDVIDEO; |
1492
deaec052eec4
Simplify VMD demuxer (but it still does not work right)
kostya
parents:
1441
diff
changeset
|
114 vst->codec->codec_tag = 0; /* no fourcc */ |
1673 | 115 vst->codec->width = AV_RL16(&vmd->vmd_header[12]); |
116 vst->codec->height = AV_RL16(&vmd->vmd_header[14]); | |
4131
e9ef9239086b
Latest Coktel Vision VMDs contained Indeo 3, add demuxer support for it
kostya
parents:
4102
diff
changeset
|
117 if(vmd->is_indeo3 && vst->codec->width > 320){ |
e9ef9239086b
Latest Coktel Vision VMDs contained Indeo 3, add demuxer support for it
kostya
parents:
4102
diff
changeset
|
118 vst->codec->width >>= 1; |
e9ef9239086b
Latest Coktel Vision VMDs contained Indeo 3, add demuxer support for it
kostya
parents:
4102
diff
changeset
|
119 vst->codec->height >>= 1; |
e9ef9239086b
Latest Coktel Vision VMDs contained Indeo 3, add demuxer support for it
kostya
parents:
4102
diff
changeset
|
120 } |
1492
deaec052eec4
Simplify VMD demuxer (but it still does not work right)
kostya
parents:
1441
diff
changeset
|
121 vst->codec->extradata_size = VMD_HEADER_SIZE; |
deaec052eec4
Simplify VMD demuxer (but it still does not work right)
kostya
parents:
1441
diff
changeset
|
122 vst->codec->extradata = av_mallocz(VMD_HEADER_SIZE + FF_INPUT_BUFFER_PADDING_SIZE); |
deaec052eec4
Simplify VMD demuxer (but it still does not work right)
kostya
parents:
1441
diff
changeset
|
123 memcpy(vst->codec->extradata, vmd->vmd_header, VMD_HEADER_SIZE); |
338 | 124 |
125 /* if sample rate is 0, assume no audio */ | |
1673 | 126 vmd->sample_rate = AV_RL16(&vmd->vmd_header[804]); |
387
f2760852ed18
minor VMD system update; still not perfect, but should not crash either
melanson
parents:
338
diff
changeset
|
127 if (vmd->sample_rate) { |
338 | 128 st = av_new_stream(s, 0); |
129 if (!st) | |
2273
7eb456c4ed8a
Replace all occurrences of AVERROR_NOMEM with AVERROR(ENOMEM).
takis
parents:
2006
diff
changeset
|
130 return AVERROR(ENOMEM); |
338 | 131 vmd->audio_stream_index = st->index; |
5910
536e5527c1e0
Define AVMediaType enum, and use it instead of enum CodecType, which
stefano
parents:
5207
diff
changeset
|
132 st->codec->codec_type = AVMEDIA_TYPE_AUDIO; |
820
feca73904e67
changing AVCodecContext codec -> *codec in AVStream so additions to AVCodecContext dont randomize AVStream and break binary compatibility
michael
parents:
815
diff
changeset
|
133 st->codec->codec_id = CODEC_ID_VMDAUDIO; |
1004
409b399440a3
More correct demuxing and timestamp setting fot Sierra VMD
kostya
parents:
896
diff
changeset
|
134 st->codec->codec_tag = 0; /* no fourcc */ |
1492
deaec052eec4
Simplify VMD demuxer (but it still does not work right)
kostya
parents:
1441
diff
changeset
|
135 st->codec->channels = (vmd->vmd_header[811] & 0x80) ? 2 : 1; |
820
feca73904e67
changing AVCodecContext codec -> *codec in AVStream so additions to AVCodecContext dont randomize AVStream and break binary compatibility
michael
parents:
815
diff
changeset
|
136 st->codec->sample_rate = vmd->sample_rate; |
1673 | 137 st->codec->block_align = AV_RL16(&vmd->vmd_header[806]); |
820
feca73904e67
changing AVCodecContext codec -> *codec in AVStream so additions to AVCodecContext dont randomize AVStream and break binary compatibility
michael
parents:
815
diff
changeset
|
138 if (st->codec->block_align & 0x8000) { |
3908
1d3d17de20ba
Bump Major version, this commit is almost just renaming bits_per_sample to
michael
parents:
3424
diff
changeset
|
139 st->codec->bits_per_coded_sample = 16; |
820
feca73904e67
changing AVCodecContext codec -> *codec in AVStream so additions to AVCodecContext dont randomize AVStream and break binary compatibility
michael
parents:
815
diff
changeset
|
140 st->codec->block_align = -(st->codec->block_align - 0x10000); |
1004
409b399440a3
More correct demuxing and timestamp setting fot Sierra VMD
kostya
parents:
896
diff
changeset
|
141 } else { |
3908
1d3d17de20ba
Bump Major version, this commit is almost just renaming bits_per_sample to
michael
parents:
3424
diff
changeset
|
142 st->codec->bits_per_coded_sample = 8; |
1004
409b399440a3
More correct demuxing and timestamp setting fot Sierra VMD
kostya
parents:
896
diff
changeset
|
143 } |
885 | 144 st->codec->bit_rate = st->codec->sample_rate * |
3908
1d3d17de20ba
Bump Major version, this commit is almost just renaming bits_per_sample to
michael
parents:
3424
diff
changeset
|
145 st->codec->bits_per_coded_sample * st->codec->channels; |
387
f2760852ed18
minor VMD system update; still not perfect, but should not crash either
melanson
parents:
338
diff
changeset
|
146 |
1492
deaec052eec4
Simplify VMD demuxer (but it still does not work right)
kostya
parents:
1441
diff
changeset
|
147 /* calculate pts */ |
deaec052eec4
Simplify VMD demuxer (but it still does not work right)
kostya
parents:
1441
diff
changeset
|
148 num = st->codec->block_align; |
deaec052eec4
Simplify VMD demuxer (but it still does not work right)
kostya
parents:
1441
diff
changeset
|
149 den = st->codec->sample_rate * st->codec->channels; |
deaec052eec4
Simplify VMD demuxer (but it still does not work right)
kostya
parents:
1441
diff
changeset
|
150 av_reduce(&den, &num, den, num, (1UL<<31)-1); |
deaec052eec4
Simplify VMD demuxer (but it still does not work right)
kostya
parents:
1441
diff
changeset
|
151 av_set_pts_info(vst, 33, num, den); |
deaec052eec4
Simplify VMD demuxer (but it still does not work right)
kostya
parents:
1441
diff
changeset
|
152 av_set_pts_info(st, 33, num, den); |
338 | 153 } |
154 | |
1673 | 155 toc_offset = AV_RL32(&vmd->vmd_header[812]); |
156 vmd->frame_count = AV_RL16(&vmd->vmd_header[6]); | |
157 vmd->frames_per_block = AV_RL16(&vmd->vmd_header[18]); | |
1004
409b399440a3
More correct demuxing and timestamp setting fot Sierra VMD
kostya
parents:
896
diff
changeset
|
158 url_fseek(pb, toc_offset, SEEK_SET); |
338 | 159 |
160 raw_frame_table = NULL; | |
161 vmd->frame_table = NULL; | |
1673 | 162 sound_buffers = AV_RL16(&vmd->vmd_header[808]); |
1004
409b399440a3
More correct demuxing and timestamp setting fot Sierra VMD
kostya
parents:
896
diff
changeset
|
163 raw_frame_table_size = vmd->frame_count * 6; |
5207
f08a788606d5
Fix overflow check insufficiently improved in r19840.
reimar
parents:
5187
diff
changeset
|
164 if(vmd->frame_count * vmd->frames_per_block >= UINT_MAX / sizeof(vmd_frame) - sound_buffers){ |
1079 | 165 av_log(s, AV_LOG_ERROR, "vmd->frame_count * vmd->frames_per_block too large\n"); |
166 return -1; | |
167 } | |
3393 | 168 raw_frame_table = av_malloc(raw_frame_table_size); |
4102
dcaeec7bd85f
The POSIX namespace shall be held sacrosanct. To that end,
melanson
parents:
3973
diff
changeset
|
169 vmd->frame_table = av_malloc((vmd->frame_count * vmd->frames_per_block + sound_buffers) * sizeof(vmd_frame)); |
338 | 170 if (!raw_frame_table || !vmd->frame_table) { |
171 av_free(raw_frame_table); | |
172 av_free(vmd->frame_table); | |
2273
7eb456c4ed8a
Replace all occurrences of AVERROR_NOMEM with AVERROR(ENOMEM).
takis
parents:
2006
diff
changeset
|
173 return AVERROR(ENOMEM); |
338 | 174 } |
885 | 175 if (get_buffer(pb, raw_frame_table, raw_frame_table_size) != |
338 | 176 raw_frame_table_size) { |
177 av_free(raw_frame_table); | |
178 av_free(vmd->frame_table); | |
2274
b21c2af60bc9
Replace all occurrences of AVERROR_IO with AVERROR(EIO).
takis
parents:
2273
diff
changeset
|
179 return AVERROR(EIO); |
338 | 180 } |
181 | |
1004
409b399440a3
More correct demuxing and timestamp setting fot Sierra VMD
kostya
parents:
896
diff
changeset
|
182 total_frames = 0; |
409b399440a3
More correct demuxing and timestamp setting fot Sierra VMD
kostya
parents:
896
diff
changeset
|
183 for (i = 0; i < vmd->frame_count; i++) { |
409b399440a3
More correct demuxing and timestamp setting fot Sierra VMD
kostya
parents:
896
diff
changeset
|
184 |
1673 | 185 current_offset = AV_RL32(&raw_frame_table[6 * i + 2]); |
338 | 186 |
1004
409b399440a3
More correct demuxing and timestamp setting fot Sierra VMD
kostya
parents:
896
diff
changeset
|
187 /* handle each entry in index block */ |
409b399440a3
More correct demuxing and timestamp setting fot Sierra VMD
kostya
parents:
896
diff
changeset
|
188 for (j = 0; j < vmd->frames_per_block; j++) { |
409b399440a3
More correct demuxing and timestamp setting fot Sierra VMD
kostya
parents:
896
diff
changeset
|
189 int type; |
409b399440a3
More correct demuxing and timestamp setting fot Sierra VMD
kostya
parents:
896
diff
changeset
|
190 uint32_t size; |
338 | 191 |
1004
409b399440a3
More correct demuxing and timestamp setting fot Sierra VMD
kostya
parents:
896
diff
changeset
|
192 get_buffer(pb, chunk, BYTES_PER_FRAME_RECORD); |
409b399440a3
More correct demuxing and timestamp setting fot Sierra VMD
kostya
parents:
896
diff
changeset
|
193 type = chunk[0]; |
1673 | 194 size = AV_RL32(&chunk[2]); |
4267 | 195 if(!size && type != 1) |
1004
409b399440a3
More correct demuxing and timestamp setting fot Sierra VMD
kostya
parents:
896
diff
changeset
|
196 continue; |
409b399440a3
More correct demuxing and timestamp setting fot Sierra VMD
kostya
parents:
896
diff
changeset
|
197 switch(type) { |
409b399440a3
More correct demuxing and timestamp setting fot Sierra VMD
kostya
parents:
896
diff
changeset
|
198 case 1: /* Audio Chunk */ |
3017 | 199 if (!st) break; |
1528
32d49970f01a
Divide first audio buffer chunk into atomary bufffers.
kostya
parents:
1492
diff
changeset
|
200 /* first audio chunk contains several audio buffers */ |
4266 | 201 vmd->frame_table[total_frames].frame_offset = current_offset; |
202 vmd->frame_table[total_frames].stream_index = vmd->audio_stream_index; | |
203 vmd->frame_table[total_frames].frame_size = size; | |
204 memcpy(vmd->frame_table[total_frames].frame_record, chunk, BYTES_PER_FRAME_RECORD); | |
205 vmd->frame_table[total_frames].pts = current_audio_pts; | |
206 total_frames++; | |
4268
85608ac6c804
yet another attempt on fixing synchronization in VMD
kostya
parents:
4267
diff
changeset
|
207 if(!current_audio_pts) |
85608ac6c804
yet another attempt on fixing synchronization in VMD
kostya
parents:
4267
diff
changeset
|
208 current_audio_pts += sound_buffers; |
85608ac6c804
yet another attempt on fixing synchronization in VMD
kostya
parents:
4267
diff
changeset
|
209 else |
85608ac6c804
yet another attempt on fixing synchronization in VMD
kostya
parents:
4267
diff
changeset
|
210 current_audio_pts++; |
1004
409b399440a3
More correct demuxing and timestamp setting fot Sierra VMD
kostya
parents:
896
diff
changeset
|
211 break; |
409b399440a3
More correct demuxing and timestamp setting fot Sierra VMD
kostya
parents:
896
diff
changeset
|
212 case 2: /* Video Chunk */ |
409b399440a3
More correct demuxing and timestamp setting fot Sierra VMD
kostya
parents:
896
diff
changeset
|
213 vmd->frame_table[total_frames].frame_offset = current_offset; |
1492
deaec052eec4
Simplify VMD demuxer (but it still does not work right)
kostya
parents:
1441
diff
changeset
|
214 vmd->frame_table[total_frames].stream_index = vmd->video_stream_index; |
1004
409b399440a3
More correct demuxing and timestamp setting fot Sierra VMD
kostya
parents:
896
diff
changeset
|
215 vmd->frame_table[total_frames].frame_size = size; |
409b399440a3
More correct demuxing and timestamp setting fot Sierra VMD
kostya
parents:
896
diff
changeset
|
216 memcpy(vmd->frame_table[total_frames].frame_record, chunk, BYTES_PER_FRAME_RECORD); |
4268
85608ac6c804
yet another attempt on fixing synchronization in VMD
kostya
parents:
4267
diff
changeset
|
217 vmd->frame_table[total_frames].pts = i; |
1004
409b399440a3
More correct demuxing and timestamp setting fot Sierra VMD
kostya
parents:
896
diff
changeset
|
218 total_frames++; |
409b399440a3
More correct demuxing and timestamp setting fot Sierra VMD
kostya
parents:
896
diff
changeset
|
219 break; |
409b399440a3
More correct demuxing and timestamp setting fot Sierra VMD
kostya
parents:
896
diff
changeset
|
220 } |
409b399440a3
More correct demuxing and timestamp setting fot Sierra VMD
kostya
parents:
896
diff
changeset
|
221 current_offset += size; |
387
f2760852ed18
minor VMD system update; still not perfect, but should not crash either
melanson
parents:
338
diff
changeset
|
222 } |
338 | 223 } |
224 | |
225 av_free(raw_frame_table); | |
226 | |
227 vmd->current_frame = 0; | |
1004
409b399440a3
More correct demuxing and timestamp setting fot Sierra VMD
kostya
parents:
896
diff
changeset
|
228 vmd->frame_count = total_frames; |
338 | 229 |
230 return 0; | |
231 } | |
232 | |
233 static int vmd_read_packet(AVFormatContext *s, | |
234 AVPacket *pkt) | |
235 { | |
2006 | 236 VmdDemuxContext *vmd = s->priv_data; |
2771
d52c718e83f9
Use dynamically allocated ByteIOContext in AVFormatContext
andoma
parents:
2369
diff
changeset
|
237 ByteIOContext *pb = s->pb; |
338 | 238 int ret = 0; |
4102
dcaeec7bd85f
The POSIX namespace shall be held sacrosanct. To that end,
melanson
parents:
3973
diff
changeset
|
239 vmd_frame *frame; |
338 | 240 |
241 if (vmd->current_frame >= vmd->frame_count) | |
2274
b21c2af60bc9
Replace all occurrences of AVERROR_IO with AVERROR(EIO).
takis
parents:
2273
diff
changeset
|
242 return AVERROR(EIO); |
338 | 243 |
244 frame = &vmd->frame_table[vmd->current_frame]; | |
245 /* position the stream (will probably be there already) */ | |
246 url_fseek(pb, frame->frame_offset, SEEK_SET); | |
247 | |
248 if (av_new_packet(pkt, frame->frame_size + BYTES_PER_FRAME_RECORD)) | |
2273
7eb456c4ed8a
Replace all occurrences of AVERROR_NOMEM with AVERROR(ENOMEM).
takis
parents:
2006
diff
changeset
|
249 return AVERROR(ENOMEM); |
775 | 250 pkt->pos= url_ftell(pb); |
338 | 251 memcpy(pkt->data, frame->frame_record, BYTES_PER_FRAME_RECORD); |
4131
e9ef9239086b
Latest Coktel Vision VMDs contained Indeo 3, add demuxer support for it
kostya
parents:
4102
diff
changeset
|
252 if(vmd->is_indeo3) |
e9ef9239086b
Latest Coktel Vision VMDs contained Indeo 3, add demuxer support for it
kostya
parents:
4102
diff
changeset
|
253 ret = get_buffer(pb, pkt->data, frame->frame_size); |
e9ef9239086b
Latest Coktel Vision VMDs contained Indeo 3, add demuxer support for it
kostya
parents:
4102
diff
changeset
|
254 else |
e9ef9239086b
Latest Coktel Vision VMDs contained Indeo 3, add demuxer support for it
kostya
parents:
4102
diff
changeset
|
255 ret = get_buffer(pb, pkt->data + BYTES_PER_FRAME_RECORD, |
e9ef9239086b
Latest Coktel Vision VMDs contained Indeo 3, add demuxer support for it
kostya
parents:
4102
diff
changeset
|
256 frame->frame_size); |
338 | 257 |
387
f2760852ed18
minor VMD system update; still not perfect, but should not crash either
melanson
parents:
338
diff
changeset
|
258 if (ret != frame->frame_size) { |
f2760852ed18
minor VMD system update; still not perfect, but should not crash either
melanson
parents:
338
diff
changeset
|
259 av_free_packet(pkt); |
2274
b21c2af60bc9
Replace all occurrences of AVERROR_IO with AVERROR(EIO).
takis
parents:
2273
diff
changeset
|
260 ret = AVERROR(EIO); |
387
f2760852ed18
minor VMD system update; still not perfect, but should not crash either
melanson
parents:
338
diff
changeset
|
261 } |
338 | 262 pkt->stream_index = frame->stream_index; |
1492
deaec052eec4
Simplify VMD demuxer (but it still does not work right)
kostya
parents:
1441
diff
changeset
|
263 pkt->pts = frame->pts; |
4507 | 264 av_log(s, AV_LOG_DEBUG, " dispatching %s frame with %d bytes and pts %"PRId64"\n", |
1441
ad3b03b7b142
reindentation, patch by From: Steve Lhomme, slhomme divxcorp com
diego
parents:
1358
diff
changeset
|
265 (frame->frame_record[0] == 0x02) ? "video" : "audio", |
ad3b03b7b142
reindentation, patch by From: Steve Lhomme, slhomme divxcorp com
diego
parents:
1358
diff
changeset
|
266 frame->frame_size + BYTES_PER_FRAME_RECORD, |
1492
deaec052eec4
Simplify VMD demuxer (but it still does not work right)
kostya
parents:
1441
diff
changeset
|
267 pkt->pts); |
338 | 268 |
269 vmd->current_frame++; | |
270 | |
271 return ret; | |
272 } | |
273 | |
274 static int vmd_read_close(AVFormatContext *s) | |
275 { | |
2006 | 276 VmdDemuxContext *vmd = s->priv_data; |
338 | 277 |
278 av_free(vmd->frame_table); | |
279 | |
280 return 0; | |
281 } | |
282 | |
1169 | 283 AVInputFormat vmd_demuxer = { |
338 | 284 "vmd", |
3424
7a0230981402
Make long_names in lavf/lavdev optional depending on CONFIG_SMALL.
diego
parents:
3393
diff
changeset
|
285 NULL_IF_CONFIG_SMALL("Sierra VMD format"), |
338 | 286 sizeof(VmdDemuxContext), |
287 vmd_probe, | |
288 vmd_read_header, | |
289 vmd_read_packet, | |
290 vmd_read_close, | |
291 }; |