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
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
338
6f50cb0ead51 initial commit for Sierra VMD file demuxer
melanson
parents:
diff changeset
1 /*
6f50cb0ead51 initial commit for Sierra VMD file demuxer
melanson
parents:
diff changeset
2 * Sierra VMD Format Demuxer
6f50cb0ead51 initial commit for Sierra VMD file demuxer
melanson
parents:
diff changeset
3 * Copyright (c) 2004 The ffmpeg Project
6f50cb0ead51 initial commit for Sierra VMD file demuxer
melanson
parents:
diff changeset
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
6f50cb0ead51 initial commit for Sierra VMD file demuxer
melanson
parents:
diff changeset
8 * modify it under the terms of the GNU Lesser General Public
6f50cb0ead51 initial commit for Sierra VMD file demuxer
melanson
parents:
diff changeset
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
6f50cb0ead51 initial commit for Sierra VMD file demuxer
melanson
parents:
diff changeset
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
6f50cb0ead51 initial commit for Sierra VMD file demuxer
melanson
parents:
diff changeset
13 * but WITHOUT ANY WARRANTY; without even the implied warranty of
6f50cb0ead51 initial commit for Sierra VMD file demuxer
melanson
parents:
diff changeset
14 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
6f50cb0ead51 initial commit for Sierra VMD file demuxer
melanson
parents:
diff changeset
15 * Lesser General Public License for more details.
6f50cb0ead51 initial commit for Sierra VMD file demuxer
melanson
parents:
diff changeset
16 *
6f50cb0ead51 initial commit for Sierra VMD file demuxer
melanson
parents:
diff changeset
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
6f50cb0ead51 initial commit for Sierra VMD file demuxer
melanson
parents:
diff changeset
20 */
6f50cb0ead51 initial commit for Sierra VMD file demuxer
melanson
parents:
diff changeset
21
6f50cb0ead51 initial commit for Sierra VMD file demuxer
melanson
parents:
diff changeset
22 /**
4331
49c1d3b27727 Use full internal pathname in doxygen @file directives.
diego
parents: 4268
diff changeset
23 * @file libavformat/sierravmd.c
338
6f50cb0ead51 initial commit for Sierra VMD file demuxer
melanson
parents:
diff changeset
24 * Sierra VMD file demuxer
6f50cb0ead51 initial commit for Sierra VMD file demuxer
melanson
parents:
diff changeset
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
6f50cb0ead51 initial commit for Sierra VMD file demuxer
melanson
parents:
diff changeset
28 */
6f50cb0ead51 initial commit for Sierra VMD file demuxer
melanson
parents:
diff changeset
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
6f50cb0ead51 initial commit for Sierra VMD file demuxer
melanson
parents:
diff changeset
31 #include "avformat.h"
6f50cb0ead51 initial commit for Sierra VMD file demuxer
melanson
parents:
diff changeset
32
6f50cb0ead51 initial commit for Sierra VMD file demuxer
melanson
parents:
diff changeset
33 #define VMD_HEADER_SIZE 0x0330
6f50cb0ead51 initial commit for Sierra VMD file demuxer
melanson
parents:
diff changeset
34 #define BYTES_PER_FRAME_RECORD 16
6f50cb0ead51 initial commit for Sierra VMD file demuxer
melanson
parents:
diff changeset
35
6f50cb0ead51 initial commit for Sierra VMD file demuxer
melanson
parents:
diff changeset
36 typedef struct {
6f50cb0ead51 initial commit for Sierra VMD file demuxer
melanson
parents:
diff changeset
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
6f50cb0ead51 initial commit for Sierra VMD file demuxer
melanson
parents:
diff changeset
39 unsigned int frame_size;
6f50cb0ead51 initial commit for Sierra VMD file demuxer
melanson
parents:
diff changeset
40 int64_t pts;
6f50cb0ead51 initial commit for Sierra VMD file demuxer
melanson
parents:
diff changeset
41 int keyframe;
6f50cb0ead51 initial commit for Sierra VMD file demuxer
melanson
parents:
diff changeset
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
6f50cb0ead51 initial commit for Sierra VMD file demuxer
melanson
parents:
diff changeset
44
6f50cb0ead51 initial commit for Sierra VMD file demuxer
melanson
parents:
diff changeset
45 typedef struct VmdDemuxContext {
6f50cb0ead51 initial commit for Sierra VMD file demuxer
melanson
parents:
diff changeset
46 int video_stream_index;
6f50cb0ead51 initial commit for Sierra VMD file demuxer
melanson
parents:
diff changeset
47 int audio_stream_index;
6f50cb0ead51 initial commit for Sierra VMD file demuxer
melanson
parents:
diff changeset
48
6f50cb0ead51 initial commit for Sierra VMD file demuxer
melanson
parents:
diff changeset
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
6f50cb0ead51 initial commit for Sierra VMD file demuxer
melanson
parents:
diff changeset
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
6f50cb0ead51 initial commit for Sierra VMD file demuxer
melanson
parents:
diff changeset
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
6f50cb0ead51 initial commit for Sierra VMD file demuxer
melanson
parents:
diff changeset
59 unsigned char vmd_header[VMD_HEADER_SIZE];
6f50cb0ead51 initial commit for Sierra VMD file demuxer
melanson
parents:
diff changeset
60 } VmdDemuxContext;
6f50cb0ead51 initial commit for Sierra VMD file demuxer
melanson
parents:
diff changeset
61
6f50cb0ead51 initial commit for Sierra VMD file demuxer
melanson
parents:
diff changeset
62 static int vmd_probe(AVProbeData *p)
6f50cb0ead51 initial commit for Sierra VMD file demuxer
melanson
parents:
diff changeset
63 {
6f50cb0ead51 initial commit for Sierra VMD file demuxer
melanson
parents:
diff changeset
64 /* check if the first 2 bytes of the file contain the appropriate size
6f50cb0ead51 initial commit for Sierra VMD file demuxer
melanson
parents:
diff changeset
65 * of a VMD header chunk */
1673
a782462e2497 rename BE/LE_8/16/32 to AV_RL/B_8/16/32
alex
parents: 1529
diff changeset
66 if (AV_RL16(&p->buf[0]) != VMD_HEADER_SIZE - 2)
338
6f50cb0ead51 initial commit for Sierra VMD file demuxer
melanson
parents:
diff changeset
67 return 0;
6f50cb0ead51 initial commit for Sierra VMD file demuxer
melanson
parents:
diff changeset
68
6f50cb0ead51 initial commit for Sierra VMD file demuxer
melanson
parents:
diff changeset
69 /* only return half certainty since this check is a bit sketchy */
6f50cb0ead51 initial commit for Sierra VMD file demuxer
melanson
parents:
diff changeset
70 return AVPROBE_SCORE_MAX / 2;
6f50cb0ead51 initial commit for Sierra VMD file demuxer
melanson
parents:
diff changeset
71 }
6f50cb0ead51 initial commit for Sierra VMD file demuxer
melanson
parents:
diff changeset
72
6f50cb0ead51 initial commit for Sierra VMD file demuxer
melanson
parents:
diff changeset
73 static int vmd_read_header(AVFormatContext *s,
6f50cb0ead51 initial commit for Sierra VMD file demuxer
melanson
parents:
diff changeset
74 AVFormatParameters *ap)
6f50cb0ead51 initial commit for Sierra VMD file demuxer
melanson
parents:
diff changeset
75 {
2006
2f0154760e5f Get rid of unnecessary pointer casts.
diego
parents: 2001
diff changeset
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
a086b58a3336 Fix a possible use of an uninitialized pointer.
reimar
parents: 2771
diff changeset
78 AVStream *st = NULL, *vst;
338
6f50cb0ead51 initial commit for Sierra VMD file demuxer
melanson
parents:
diff changeset
79 unsigned int toc_offset;
6f50cb0ead51 initial commit for Sierra VMD file demuxer
melanson
parents:
diff changeset
80 unsigned char *raw_frame_table;
6f50cb0ead51 initial commit for Sierra VMD file demuxer
melanson
parents:
diff changeset
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
6f50cb0ead51 initial commit for Sierra VMD file demuxer
melanson
parents:
diff changeset
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
6f50cb0ead51 initial commit for Sierra VMD file demuxer
melanson
parents:
diff changeset
89
6f50cb0ead51 initial commit for Sierra VMD file demuxer
melanson
parents:
diff changeset
90 /* fetch the main header, including the 2 header length bytes */
6f50cb0ead51 initial commit for Sierra VMD file demuxer
melanson
parents:
diff changeset
91 url_fseek(pb, 0, SEEK_SET);
6f50cb0ead51 initial commit for Sierra VMD file demuxer
melanson
parents:
diff changeset
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
6f50cb0ead51 initial commit for Sierra VMD file demuxer
melanson
parents:
diff changeset
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
6f50cb0ead51 initial commit for Sierra VMD file demuxer
melanson
parents:
diff changeset
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
a782462e2497 rename BE/LE_8/16/32 to AV_RL/B_8/16/32
alex
parents: 1529
diff changeset
108 vst->codec->width = AV_RL16(&vmd->vmd_header[12]);
a782462e2497 rename BE/LE_8/16/32 to AV_RL/B_8/16/32
alex
parents: 1529
diff changeset
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
6f50cb0ead51 initial commit for Sierra VMD file demuxer
melanson
parents:
diff changeset
117
6f50cb0ead51 initial commit for Sierra VMD file demuxer
melanson
parents:
diff changeset
118 /* if sample rate is 0, assume no audio */
1673
a782462e2497 rename BE/LE_8/16/32 to AV_RL/B_8/16/32
alex
parents: 1529
diff changeset
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
6f50cb0ead51 initial commit for Sierra VMD file demuxer
melanson
parents:
diff changeset
121 st = av_new_stream(s, 0);
6f50cb0ead51 initial commit for Sierra VMD file demuxer
melanson
parents:
diff changeset
122 if (!st)
2273
7eb456c4ed8a Replace all occurrences of AVERROR_NOMEM with AVERROR(ENOMEM).
takis
parents: 2006
diff changeset
123 return AVERROR(ENOMEM);
338
6f50cb0ead51 initial commit for Sierra VMD file demuxer
melanson
parents:
diff changeset
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
a782462e2497 rename BE/LE_8/16/32 to AV_RL/B_8/16/32
alex
parents: 1529
diff changeset
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
da1d5db0ce5c COSMETICS: Remove all trailing whitespace.
diego
parents: 884
diff changeset
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
6f50cb0ead51 initial commit for Sierra VMD file demuxer
melanson
parents:
diff changeset
146 }
6f50cb0ead51 initial commit for Sierra VMD file demuxer
melanson
parents:
diff changeset
147
1673
a782462e2497 rename BE/LE_8/16/32 to AV_RL/B_8/16/32
alex
parents: 1529
diff changeset
148 toc_offset = AV_RL32(&vmd->vmd_header[812]);
a782462e2497 rename BE/LE_8/16/32 to AV_RL/B_8/16/32
alex
parents: 1529
diff changeset
149 vmd->frame_count = AV_RL16(&vmd->vmd_header[6]);
a782462e2497 rename BE/LE_8/16/32 to AV_RL/B_8/16/32
alex
parents: 1529
diff changeset
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
6f50cb0ead51 initial commit for Sierra VMD file demuxer
melanson
parents:
diff changeset
152
6f50cb0ead51 initial commit for Sierra VMD file demuxer
melanson
parents:
diff changeset
153 raw_frame_table = NULL;
6f50cb0ead51 initial commit for Sierra VMD file demuxer
melanson
parents:
diff changeset
154 vmd->frame_table = NULL;
1673
a782462e2497 rename BE/LE_8/16/32 to AV_RL/B_8/16/32
alex
parents: 1529
diff changeset
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
40e81416015d sanity checks some might have been exploitable
michael
parents: 1004
diff changeset
158 av_log(s, AV_LOG_ERROR, "vmd->frame_count * vmd->frames_per_block too large\n");
40e81416015d sanity checks some might have been exploitable
michael
parents: 1004
diff changeset
159 return -1;
40e81416015d sanity checks some might have been exploitable
michael
parents: 1004
diff changeset
160 }
3393
f95ddc69c48d memleak / CID124 RUN2
michael
parents: 3017
diff changeset
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
6f50cb0ead51 initial commit for Sierra VMD file demuxer
melanson
parents:
diff changeset
163 if (!raw_frame_table || !vmd->frame_table) {
6f50cb0ead51 initial commit for Sierra VMD file demuxer
melanson
parents:
diff changeset
164 av_free(raw_frame_table);
6f50cb0ead51 initial commit for Sierra VMD file demuxer
melanson
parents:
diff changeset
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
6f50cb0ead51 initial commit for Sierra VMD file demuxer
melanson
parents:
diff changeset
167 }
885
da1d5db0ce5c COSMETICS: Remove all trailing whitespace.
diego
parents: 884
diff changeset
168 if (get_buffer(pb, raw_frame_table, raw_frame_table_size) !=
338
6f50cb0ead51 initial commit for Sierra VMD file demuxer
melanson
parents:
diff changeset
169 raw_frame_table_size) {
6f50cb0ead51 initial commit for Sierra VMD file demuxer
melanson
parents:
diff changeset
170 av_free(raw_frame_table);
6f50cb0ead51 initial commit for Sierra VMD file demuxer
melanson
parents:
diff changeset
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
6f50cb0ead51 initial commit for Sierra VMD file demuxer
melanson
parents:
diff changeset
173 }
6f50cb0ead51 initial commit for Sierra VMD file demuxer
melanson
parents:
diff changeset
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
a782462e2497 rename BE/LE_8/16/32 to AV_RL/B_8/16/32
alex
parents: 1529
diff changeset
178 current_offset = AV_RL32(&raw_frame_table[6 * i + 2]);
338
6f50cb0ead51 initial commit for Sierra VMD file demuxer
melanson
parents:
diff changeset
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
6f50cb0ead51 initial commit for Sierra VMD file demuxer
melanson
parents:
diff changeset
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
a782462e2497 rename BE/LE_8/16/32 to AV_RL/B_8/16/32
alex
parents: 1529
diff changeset
187 size = AV_RL32(&chunk[2]);
4267
ce5b09a7f263 Empty audio chunks in VMD are silent, not skipped
kostya
parents: 4266
diff changeset
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
a086b58a3336 Fix a possible use of an uninitialized pointer.
reimar
parents: 2771
diff changeset
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
b67df52d56f9 cosmetics: reindent after last commit
kostya
parents: 4265
diff changeset
194 vmd->frame_table[total_frames].frame_offset = current_offset;
b67df52d56f9 cosmetics: reindent after last commit
kostya
parents: 4265
diff changeset
195 vmd->frame_table[total_frames].stream_index = vmd->audio_stream_index;
b67df52d56f9 cosmetics: reindent after last commit
kostya
parents: 4265
diff changeset
196 vmd->frame_table[total_frames].frame_size = size;
b67df52d56f9 cosmetics: reindent after last commit
kostya
parents: 4265
diff changeset
197 memcpy(vmd->frame_table[total_frames].frame_record, chunk, BYTES_PER_FRAME_RECORD);
b67df52d56f9 cosmetics: reindent after last commit
kostya
parents: 4265
diff changeset
198 vmd->frame_table[total_frames].pts = current_audio_pts;
b67df52d56f9 cosmetics: reindent after last commit
kostya
parents: 4265
diff changeset
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
6f50cb0ead51 initial commit for Sierra VMD file demuxer
melanson
parents:
diff changeset
216 }
6f50cb0ead51 initial commit for Sierra VMD file demuxer
melanson
parents:
diff changeset
217
6f50cb0ead51 initial commit for Sierra VMD file demuxer
melanson
parents:
diff changeset
218 av_free(raw_frame_table);
6f50cb0ead51 initial commit for Sierra VMD file demuxer
melanson
parents:
diff changeset
219
6f50cb0ead51 initial commit for Sierra VMD file demuxer
melanson
parents:
diff changeset
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
6f50cb0ead51 initial commit for Sierra VMD file demuxer
melanson
parents:
diff changeset
222
6f50cb0ead51 initial commit for Sierra VMD file demuxer
melanson
parents:
diff changeset
223 return 0;
6f50cb0ead51 initial commit for Sierra VMD file demuxer
melanson
parents:
diff changeset
224 }
6f50cb0ead51 initial commit for Sierra VMD file demuxer
melanson
parents:
diff changeset
225
6f50cb0ead51 initial commit for Sierra VMD file demuxer
melanson
parents:
diff changeset
226 static int vmd_read_packet(AVFormatContext *s,
6f50cb0ead51 initial commit for Sierra VMD file demuxer
melanson
parents:
diff changeset
227 AVPacket *pkt)
6f50cb0ead51 initial commit for Sierra VMD file demuxer
melanson
parents:
diff changeset
228 {
2006
2f0154760e5f Get rid of unnecessary pointer casts.
diego
parents: 2001
diff changeset
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
6f50cb0ead51 initial commit for Sierra VMD file demuxer
melanson
parents:
diff changeset
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
6f50cb0ead51 initial commit for Sierra VMD file demuxer
melanson
parents:
diff changeset
233
6f50cb0ead51 initial commit for Sierra VMD file demuxer
melanson
parents:
diff changeset
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
6f50cb0ead51 initial commit for Sierra VMD file demuxer
melanson
parents:
diff changeset
236
6f50cb0ead51 initial commit for Sierra VMD file demuxer
melanson
parents:
diff changeset
237 frame = &vmd->frame_table[vmd->current_frame];
6f50cb0ead51 initial commit for Sierra VMD file demuxer
melanson
parents:
diff changeset
238 /* position the stream (will probably be there already) */
6f50cb0ead51 initial commit for Sierra VMD file demuxer
melanson
parents:
diff changeset
239 url_fseek(pb, frame->frame_offset, SEEK_SET);
6f50cb0ead51 initial commit for Sierra VMD file demuxer
melanson
parents:
diff changeset
240
6f50cb0ead51 initial commit for Sierra VMD file demuxer
melanson
parents:
diff changeset
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
c5077fdab490 AVPacket.pos
michael
parents: 669
diff changeset
243 pkt->pos= url_ftell(pb);
338
6f50cb0ead51 initial commit for Sierra VMD file demuxer
melanson
parents:
diff changeset
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
6f50cb0ead51 initial commit for Sierra VMD file demuxer
melanson
parents:
diff changeset
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
6f50cb0ead51 initial commit for Sierra VMD file demuxer
melanson
parents:
diff changeset
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
2e7affad5b28 this is debug not info
michael
parents: 2274
diff changeset
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
6f50cb0ead51 initial commit for Sierra VMD file demuxer
melanson
parents:
diff changeset
261
6f50cb0ead51 initial commit for Sierra VMD file demuxer
melanson
parents:
diff changeset
262 vmd->current_frame++;
6f50cb0ead51 initial commit for Sierra VMD file demuxer
melanson
parents:
diff changeset
263
6f50cb0ead51 initial commit for Sierra VMD file demuxer
melanson
parents:
diff changeset
264 return ret;
6f50cb0ead51 initial commit for Sierra VMD file demuxer
melanson
parents:
diff changeset
265 }
6f50cb0ead51 initial commit for Sierra VMD file demuxer
melanson
parents:
diff changeset
266
6f50cb0ead51 initial commit for Sierra VMD file demuxer
melanson
parents:
diff changeset
267 static int vmd_read_close(AVFormatContext *s)
6f50cb0ead51 initial commit for Sierra VMD file demuxer
melanson
parents:
diff changeset
268 {
2006
2f0154760e5f Get rid of unnecessary pointer casts.
diego
parents: 2001
diff changeset
269 VmdDemuxContext *vmd = s->priv_data;
338
6f50cb0ead51 initial commit for Sierra VMD file demuxer
melanson
parents:
diff changeset
270
6f50cb0ead51 initial commit for Sierra VMD file demuxer
melanson
parents:
diff changeset
271 av_free(vmd->frame_table);
6f50cb0ead51 initial commit for Sierra VMD file demuxer
melanson
parents:
diff changeset
272
6f50cb0ead51 initial commit for Sierra VMD file demuxer
melanson
parents:
diff changeset
273 return 0;
6f50cb0ead51 initial commit for Sierra VMD file demuxer
melanson
parents:
diff changeset
274 }
6f50cb0ead51 initial commit for Sierra VMD file demuxer
melanson
parents:
diff changeset
275
1169
d18cc9a1fd02 allow individual selection of muxers and demuxers
mru
parents: 1167
diff changeset
276 AVInputFormat vmd_demuxer = {
338
6f50cb0ead51 initial commit for Sierra VMD file demuxer
melanson
parents:
diff changeset
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
6f50cb0ead51 initial commit for Sierra VMD file demuxer
melanson
parents:
diff changeset
279 sizeof(VmdDemuxContext),
6f50cb0ead51 initial commit for Sierra VMD file demuxer
melanson
parents:
diff changeset
280 vmd_probe,
6f50cb0ead51 initial commit for Sierra VMD file demuxer
melanson
parents:
diff changeset
281 vmd_read_header,
6f50cb0ead51 initial commit for Sierra VMD file demuxer
melanson
parents:
diff changeset
282 vmd_read_packet,
6f50cb0ead51 initial commit for Sierra VMD file demuxer
melanson
parents:
diff changeset
283 vmd_read_close,
6f50cb0ead51 initial commit for Sierra VMD file demuxer
melanson
parents:
diff changeset
284 };