Mercurial > libavformat.hg
annotate sierravmd.c @ 4387:5c42816e12c6 libavformat
Add "AVFormatContext *ctx" (that being the RTSP demuxer's) as first argument
to the parse_packet() function pointer in RTPDynamicProtocolHandlers. This
allows these functions to peek back and retrieve values from the demuxer's
context (or RTSPState). The ASF/RTP payload parser will use this to be able
to parse SDP values (which occur even before the payload ID is given), store
them in the RTSPState and then retrieve them while parsing payload data. See
"[PATCH] RTSP-MS 13/15: add RTSP demuxer AVFormatContext to parse_packet()
function pointer (was: transport context)" mailinglist thread.
author | rbultje |
---|---|
date | Fri, 06 Feb 2009 01:37:19 +0000 |
parents | 49c1d3b27727 |
children | a256f0daadac |
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 /** | |
4331
49c1d3b27727
Use full internal pathname in doxygen @file directives.
diego
parents:
4268
diff
changeset
|
23 * @file libavformat/sierravmd.c |
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 { | |
64 /* check if the first 2 bytes of the file contain the appropriate size | |
65 * of a VMD header chunk */ | |
1673 | 66 if (AV_RL16(&p->buf[0]) != VMD_HEADER_SIZE - 2) |
338 | 67 return 0; |
68 | |
69 /* only return half certainty since this check is a bit sketchy */ | |
70 return AVPROBE_SCORE_MAX / 2; | |
71 } | |
72 | |
73 static int vmd_read_header(AVFormatContext *s, | |
74 AVFormatParameters *ap) | |
75 { | |
2006 | 76 VmdDemuxContext *vmd = s->priv_data; |
2771
d52c718e83f9
Use dynamically allocated ByteIOContext in AVFormatContext
andoma
parents:
2369
diff
changeset
|
77 ByteIOContext *pb = s->pb; |
3017 | 78 AVStream *st = NULL, *vst; |
338 | 79 unsigned int toc_offset; |
80 unsigned char *raw_frame_table; | |
81 int raw_frame_table_size; | |
3973
549a09cf23fe
Remove offset_t typedef and use int64_t directly instead.
diego
parents:
3908
diff
changeset
|
82 int64_t current_offset; |
1004
409b399440a3
More correct demuxing and timestamp setting fot Sierra VMD
kostya
parents:
896
diff
changeset
|
83 int i, j; |
338 | 84 unsigned int total_frames; |
4268
85608ac6c804
yet another attempt on fixing synchronization in VMD
kostya
parents:
4267
diff
changeset
|
85 int64_t current_audio_pts = 0; |
1004
409b399440a3
More correct demuxing and timestamp setting fot Sierra VMD
kostya
parents:
896
diff
changeset
|
86 unsigned char chunk[BYTES_PER_FRAME_RECORD]; |
1492
deaec052eec4
Simplify VMD demuxer (but it still does not work right)
kostya
parents:
1441
diff
changeset
|
87 int num, den; |
1528
32d49970f01a
Divide first audio buffer chunk into atomary bufffers.
kostya
parents:
1492
diff
changeset
|
88 int sound_buffers; |
338 | 89 |
90 /* fetch the main header, including the 2 header length bytes */ | |
91 url_fseek(pb, 0, SEEK_SET); | |
92 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
|
93 return AVERROR(EIO); |
338 | 94 |
4131
e9ef9239086b
Latest Coktel Vision VMDs contained Indeo 3, add demuxer support for it
kostya
parents:
4102
diff
changeset
|
95 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
|
96 vmd->is_indeo3 = 1; |
e9ef9239086b
Latest Coktel Vision VMDs contained Indeo 3, add demuxer support for it
kostya
parents:
4102
diff
changeset
|
97 else |
4137
b432c9e98002
Fix a typo that made VMD demuxer always assume Indeo 3 as video codec.
kostya
parents:
4131
diff
changeset
|
98 vmd->is_indeo3 = 0; |
338 | 99 /* start up the decoders */ |
1492
deaec052eec4
Simplify VMD demuxer (but it still does not work right)
kostya
parents:
1441
diff
changeset
|
100 vst = av_new_stream(s, 0); |
deaec052eec4
Simplify VMD demuxer (but it still does not work right)
kostya
parents:
1441
diff
changeset
|
101 if (!vst) |
2273
7eb456c4ed8a
Replace all occurrences of AVERROR_NOMEM with AVERROR(ENOMEM).
takis
parents:
2006
diff
changeset
|
102 return AVERROR(ENOMEM); |
1492
deaec052eec4
Simplify VMD demuxer (but it still does not work right)
kostya
parents:
1441
diff
changeset
|
103 av_set_pts_info(vst, 33, 1, 10); |
deaec052eec4
Simplify VMD demuxer (but it still does not work right)
kostya
parents:
1441
diff
changeset
|
104 vmd->video_stream_index = vst->index; |
deaec052eec4
Simplify VMD demuxer (but it still does not work right)
kostya
parents:
1441
diff
changeset
|
105 vst->codec->codec_type = CODEC_TYPE_VIDEO; |
4131
e9ef9239086b
Latest Coktel Vision VMDs contained Indeo 3, add demuxer support for it
kostya
parents:
4102
diff
changeset
|
106 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
|
107 vst->codec->codec_tag = 0; /* no fourcc */ |
1673 | 108 vst->codec->width = AV_RL16(&vmd->vmd_header[12]); |
109 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
|
110 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
|
111 vst->codec->width >>= 1; |
e9ef9239086b
Latest Coktel Vision VMDs contained Indeo 3, add demuxer support for it
kostya
parents:
4102
diff
changeset
|
112 vst->codec->height >>= 1; |
e9ef9239086b
Latest Coktel Vision VMDs contained Indeo 3, add demuxer support for it
kostya
parents:
4102
diff
changeset
|
113 } |
1492
deaec052eec4
Simplify VMD demuxer (but it still does not work right)
kostya
parents:
1441
diff
changeset
|
114 vst->codec->extradata_size = VMD_HEADER_SIZE; |
deaec052eec4
Simplify VMD demuxer (but it still does not work right)
kostya
parents:
1441
diff
changeset
|
115 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
|
116 memcpy(vst->codec->extradata, vmd->vmd_header, VMD_HEADER_SIZE); |
338 | 117 |
118 /* if sample rate is 0, assume no audio */ | |
1673 | 119 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
|
120 if (vmd->sample_rate) { |
338 | 121 st = av_new_stream(s, 0); |
122 if (!st) | |
2273
7eb456c4ed8a
Replace all occurrences of AVERROR_NOMEM with AVERROR(ENOMEM).
takis
parents:
2006
diff
changeset
|
123 return AVERROR(ENOMEM); |
338 | 124 vmd->audio_stream_index = st->index; |
820
feca73904e67
changing AVCodecContext codec -> *codec in AVStream so additions to AVCodecContext dont randomize AVStream and break binary compatibility
michael
parents:
815
diff
changeset
|
125 st->codec->codec_type = CODEC_TYPE_AUDIO; |
feca73904e67
changing AVCodecContext codec -> *codec in AVStream so additions to AVCodecContext dont randomize AVStream and break binary compatibility
michael
parents:
815
diff
changeset
|
126 st->codec->codec_id = CODEC_ID_VMDAUDIO; |
1004
409b399440a3
More correct demuxing and timestamp setting fot Sierra VMD
kostya
parents:
896
diff
changeset
|
127 st->codec->codec_tag = 0; /* no fourcc */ |
1492
deaec052eec4
Simplify VMD demuxer (but it still does not work right)
kostya
parents:
1441
diff
changeset
|
128 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
|
129 st->codec->sample_rate = vmd->sample_rate; |
1673 | 130 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
|
131 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
|
132 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
|
133 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
|
134 } else { |
3908
1d3d17de20ba
Bump Major version, this commit is almost just renaming bits_per_sample to
michael
parents:
3424
diff
changeset
|
135 st->codec->bits_per_coded_sample = 8; |
1004
409b399440a3
More correct demuxing and timestamp setting fot Sierra VMD
kostya
parents:
896
diff
changeset
|
136 } |
885 | 137 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
|
138 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
|
139 |
1492
deaec052eec4
Simplify VMD demuxer (but it still does not work right)
kostya
parents:
1441
diff
changeset
|
140 /* calculate pts */ |
deaec052eec4
Simplify VMD demuxer (but it still does not work right)
kostya
parents:
1441
diff
changeset
|
141 num = st->codec->block_align; |
deaec052eec4
Simplify VMD demuxer (but it still does not work right)
kostya
parents:
1441
diff
changeset
|
142 den = st->codec->sample_rate * st->codec->channels; |
deaec052eec4
Simplify VMD demuxer (but it still does not work right)
kostya
parents:
1441
diff
changeset
|
143 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
|
144 av_set_pts_info(vst, 33, num, den); |
deaec052eec4
Simplify VMD demuxer (but it still does not work right)
kostya
parents:
1441
diff
changeset
|
145 av_set_pts_info(st, 33, num, den); |
338 | 146 } |
147 | |
1673 | 148 toc_offset = AV_RL32(&vmd->vmd_header[812]); |
149 vmd->frame_count = AV_RL16(&vmd->vmd_header[6]); | |
150 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
|
151 url_fseek(pb, toc_offset, SEEK_SET); |
338 | 152 |
153 raw_frame_table = NULL; | |
154 vmd->frame_table = NULL; | |
1673 | 155 sound_buffers = AV_RL16(&vmd->vmd_header[808]); |
1004
409b399440a3
More correct demuxing and timestamp setting fot Sierra VMD
kostya
parents:
896
diff
changeset
|
156 raw_frame_table_size = vmd->frame_count * 6; |
4102
dcaeec7bd85f
The POSIX namespace shall be held sacrosanct. To that end,
melanson
parents:
3973
diff
changeset
|
157 if(vmd->frame_count * vmd->frames_per_block >= UINT_MAX / sizeof(vmd_frame)){ |
1079 | 158 av_log(s, AV_LOG_ERROR, "vmd->frame_count * vmd->frames_per_block too large\n"); |
159 return -1; | |
160 } | |
3393 | 161 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
|
162 vmd->frame_table = av_malloc((vmd->frame_count * vmd->frames_per_block + sound_buffers) * sizeof(vmd_frame)); |
338 | 163 if (!raw_frame_table || !vmd->frame_table) { |
164 av_free(raw_frame_table); | |
165 av_free(vmd->frame_table); | |
2273
7eb456c4ed8a
Replace all occurrences of AVERROR_NOMEM with AVERROR(ENOMEM).
takis
parents:
2006
diff
changeset
|
166 return AVERROR(ENOMEM); |
338 | 167 } |
885 | 168 if (get_buffer(pb, raw_frame_table, raw_frame_table_size) != |
338 | 169 raw_frame_table_size) { |
170 av_free(raw_frame_table); | |
171 av_free(vmd->frame_table); | |
2274
b21c2af60bc9
Replace all occurrences of AVERROR_IO with AVERROR(EIO).
takis
parents:
2273
diff
changeset
|
172 return AVERROR(EIO); |
338 | 173 } |
174 | |
1004
409b399440a3
More correct demuxing and timestamp setting fot Sierra VMD
kostya
parents:
896
diff
changeset
|
175 total_frames = 0; |
409b399440a3
More correct demuxing and timestamp setting fot Sierra VMD
kostya
parents:
896
diff
changeset
|
176 for (i = 0; i < vmd->frame_count; i++) { |
409b399440a3
More correct demuxing and timestamp setting fot Sierra VMD
kostya
parents:
896
diff
changeset
|
177 |
1673 | 178 current_offset = AV_RL32(&raw_frame_table[6 * i + 2]); |
338 | 179 |
1004
409b399440a3
More correct demuxing and timestamp setting fot Sierra VMD
kostya
parents:
896
diff
changeset
|
180 /* handle each entry in index block */ |
409b399440a3
More correct demuxing and timestamp setting fot Sierra VMD
kostya
parents:
896
diff
changeset
|
181 for (j = 0; j < vmd->frames_per_block; j++) { |
409b399440a3
More correct demuxing and timestamp setting fot Sierra VMD
kostya
parents:
896
diff
changeset
|
182 int type; |
409b399440a3
More correct demuxing and timestamp setting fot Sierra VMD
kostya
parents:
896
diff
changeset
|
183 uint32_t size; |
338 | 184 |
1004
409b399440a3
More correct demuxing and timestamp setting fot Sierra VMD
kostya
parents:
896
diff
changeset
|
185 get_buffer(pb, chunk, BYTES_PER_FRAME_RECORD); |
409b399440a3
More correct demuxing and timestamp setting fot Sierra VMD
kostya
parents:
896
diff
changeset
|
186 type = chunk[0]; |
1673 | 187 size = AV_RL32(&chunk[2]); |
4267 | 188 if(!size && type != 1) |
1004
409b399440a3
More correct demuxing and timestamp setting fot Sierra VMD
kostya
parents:
896
diff
changeset
|
189 continue; |
409b399440a3
More correct demuxing and timestamp setting fot Sierra VMD
kostya
parents:
896
diff
changeset
|
190 switch(type) { |
409b399440a3
More correct demuxing and timestamp setting fot Sierra VMD
kostya
parents:
896
diff
changeset
|
191 case 1: /* Audio Chunk */ |
3017 | 192 if (!st) break; |
1528
32d49970f01a
Divide first audio buffer chunk into atomary bufffers.
kostya
parents:
1492
diff
changeset
|
193 /* first audio chunk contains several audio buffers */ |
4266 | 194 vmd->frame_table[total_frames].frame_offset = current_offset; |
195 vmd->frame_table[total_frames].stream_index = vmd->audio_stream_index; | |
196 vmd->frame_table[total_frames].frame_size = size; | |
197 memcpy(vmd->frame_table[total_frames].frame_record, chunk, BYTES_PER_FRAME_RECORD); | |
198 vmd->frame_table[total_frames].pts = current_audio_pts; | |
199 total_frames++; | |
4268
85608ac6c804
yet another attempt on fixing synchronization in VMD
kostya
parents:
4267
diff
changeset
|
200 if(!current_audio_pts) |
85608ac6c804
yet another attempt on fixing synchronization in VMD
kostya
parents:
4267
diff
changeset
|
201 current_audio_pts += sound_buffers; |
85608ac6c804
yet another attempt on fixing synchronization in VMD
kostya
parents:
4267
diff
changeset
|
202 else |
85608ac6c804
yet another attempt on fixing synchronization in VMD
kostya
parents:
4267
diff
changeset
|
203 current_audio_pts++; |
1004
409b399440a3
More correct demuxing and timestamp setting fot Sierra VMD
kostya
parents:
896
diff
changeset
|
204 break; |
409b399440a3
More correct demuxing and timestamp setting fot Sierra VMD
kostya
parents:
896
diff
changeset
|
205 case 2: /* Video Chunk */ |
409b399440a3
More correct demuxing and timestamp setting fot Sierra VMD
kostya
parents:
896
diff
changeset
|
206 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
|
207 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
|
208 vmd->frame_table[total_frames].frame_size = size; |
409b399440a3
More correct demuxing and timestamp setting fot Sierra VMD
kostya
parents:
896
diff
changeset
|
209 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
|
210 vmd->frame_table[total_frames].pts = i; |
1004
409b399440a3
More correct demuxing and timestamp setting fot Sierra VMD
kostya
parents:
896
diff
changeset
|
211 total_frames++; |
409b399440a3
More correct demuxing and timestamp setting fot Sierra VMD
kostya
parents:
896
diff
changeset
|
212 break; |
409b399440a3
More correct demuxing and timestamp setting fot Sierra VMD
kostya
parents:
896
diff
changeset
|
213 } |
409b399440a3
More correct demuxing and timestamp setting fot Sierra VMD
kostya
parents:
896
diff
changeset
|
214 current_offset += size; |
387
f2760852ed18
minor VMD system update; still not perfect, but should not crash either
melanson
parents:
338
diff
changeset
|
215 } |
338 | 216 } |
217 | |
218 av_free(raw_frame_table); | |
219 | |
220 vmd->current_frame = 0; | |
1004
409b399440a3
More correct demuxing and timestamp setting fot Sierra VMD
kostya
parents:
896
diff
changeset
|
221 vmd->frame_count = total_frames; |
338 | 222 |
223 return 0; | |
224 } | |
225 | |
226 static int vmd_read_packet(AVFormatContext *s, | |
227 AVPacket *pkt) | |
228 { | |
2006 | 229 VmdDemuxContext *vmd = s->priv_data; |
2771
d52c718e83f9
Use dynamically allocated ByteIOContext in AVFormatContext
andoma
parents:
2369
diff
changeset
|
230 ByteIOContext *pb = s->pb; |
338 | 231 int ret = 0; |
4102
dcaeec7bd85f
The POSIX namespace shall be held sacrosanct. To that end,
melanson
parents:
3973
diff
changeset
|
232 vmd_frame *frame; |
338 | 233 |
234 if (vmd->current_frame >= vmd->frame_count) | |
2274
b21c2af60bc9
Replace all occurrences of AVERROR_IO with AVERROR(EIO).
takis
parents:
2273
diff
changeset
|
235 return AVERROR(EIO); |
338 | 236 |
237 frame = &vmd->frame_table[vmd->current_frame]; | |
238 /* position the stream (will probably be there already) */ | |
239 url_fseek(pb, frame->frame_offset, SEEK_SET); | |
240 | |
241 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
|
242 return AVERROR(ENOMEM); |
775 | 243 pkt->pos= url_ftell(pb); |
338 | 244 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
|
245 if(vmd->is_indeo3) |
e9ef9239086b
Latest Coktel Vision VMDs contained Indeo 3, add demuxer support for it
kostya
parents:
4102
diff
changeset
|
246 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
|
247 else |
e9ef9239086b
Latest Coktel Vision VMDs contained Indeo 3, add demuxer support for it
kostya
parents:
4102
diff
changeset
|
248 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
|
249 frame->frame_size); |
338 | 250 |
387
f2760852ed18
minor VMD system update; still not perfect, but should not crash either
melanson
parents:
338
diff
changeset
|
251 if (ret != frame->frame_size) { |
f2760852ed18
minor VMD system update; still not perfect, but should not crash either
melanson
parents:
338
diff
changeset
|
252 av_free_packet(pkt); |
2274
b21c2af60bc9
Replace all occurrences of AVERROR_IO with AVERROR(EIO).
takis
parents:
2273
diff
changeset
|
253 ret = AVERROR(EIO); |
387
f2760852ed18
minor VMD system update; still not perfect, but should not crash either
melanson
parents:
338
diff
changeset
|
254 } |
338 | 255 pkt->stream_index = frame->stream_index; |
1492
deaec052eec4
Simplify VMD demuxer (but it still does not work right)
kostya
parents:
1441
diff
changeset
|
256 pkt->pts = frame->pts; |
2369 | 257 av_log(NULL, 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
|
258 (frame->frame_record[0] == 0x02) ? "video" : "audio", |
ad3b03b7b142
reindentation, patch by From: Steve Lhomme, slhomme divxcorp com
diego
parents:
1358
diff
changeset
|
259 frame->frame_size + BYTES_PER_FRAME_RECORD, |
1492
deaec052eec4
Simplify VMD demuxer (but it still does not work right)
kostya
parents:
1441
diff
changeset
|
260 pkt->pts); |
338 | 261 |
262 vmd->current_frame++; | |
263 | |
264 return ret; | |
265 } | |
266 | |
267 static int vmd_read_close(AVFormatContext *s) | |
268 { | |
2006 | 269 VmdDemuxContext *vmd = s->priv_data; |
338 | 270 |
271 av_free(vmd->frame_table); | |
272 | |
273 return 0; | |
274 } | |
275 | |
1169 | 276 AVInputFormat vmd_demuxer = { |
338 | 277 "vmd", |
3424
7a0230981402
Make long_names in lavf/lavdev optional depending on CONFIG_SMALL.
diego
parents:
3393
diff
changeset
|
278 NULL_IF_CONFIG_SMALL("Sierra VMD format"), |
338 | 279 sizeof(VmdDemuxContext), |
280 vmd_probe, | |
281 vmd_read_header, | |
282 vmd_read_packet, | |
283 vmd_read_close, | |
284 }; |