annotate c93.c @ 6114:10c9d304794f libavformat

Do not attempt to seek to index for streamed files and if the user explicitly requested us not to read the index.
author reimar
date Tue, 08 Jun 2010 19:31:08 +0000
parents 11bb10c37225
children
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
1987
1d9048ba2ce3 Interplay C93 demuxer and video decoder
diego
parents:
diff changeset
1 /*
1d9048ba2ce3 Interplay C93 demuxer and video decoder
diego
parents:
diff changeset
2 * Interplay C93 demuxer
1d9048ba2ce3 Interplay C93 demuxer and video decoder
diego
parents:
diff changeset
3 * Copyright (c) 2007 Anssi Hannula <anssi.hannula@gmail.com>
1d9048ba2ce3 Interplay C93 demuxer and video decoder
diego
parents:
diff changeset
4 *
1d9048ba2ce3 Interplay C93 demuxer and video decoder
diego
parents:
diff changeset
5 * This file is part of FFmpeg.
1d9048ba2ce3 Interplay C93 demuxer and video decoder
diego
parents:
diff changeset
6 *
1d9048ba2ce3 Interplay C93 demuxer and video decoder
diego
parents:
diff changeset
7 * FFmpeg is free software; you can redistribute it and/or
1d9048ba2ce3 Interplay C93 demuxer and video decoder
diego
parents:
diff changeset
8 * modify it under the terms of the GNU Lesser General Public
1d9048ba2ce3 Interplay C93 demuxer and video decoder
diego
parents:
diff changeset
9 * License as published by the Free Software Foundation; either
1d9048ba2ce3 Interplay C93 demuxer and video decoder
diego
parents:
diff changeset
10 * version 2.1 of the License, or (at your option) any later version.
1d9048ba2ce3 Interplay C93 demuxer and video decoder
diego
parents:
diff changeset
11 *
1d9048ba2ce3 Interplay C93 demuxer and video decoder
diego
parents:
diff changeset
12 * FFmpeg is distributed in the hope that it will be useful,
1d9048ba2ce3 Interplay C93 demuxer and video decoder
diego
parents:
diff changeset
13 * but WITHOUT ANY WARRANTY; without even the implied warranty of
1d9048ba2ce3 Interplay C93 demuxer and video decoder
diego
parents:
diff changeset
14 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
1d9048ba2ce3 Interplay C93 demuxer and video decoder
diego
parents:
diff changeset
15 * Lesser General Public License for more details.
1d9048ba2ce3 Interplay C93 demuxer and video decoder
diego
parents:
diff changeset
16 *
1d9048ba2ce3 Interplay C93 demuxer and video decoder
diego
parents:
diff changeset
17 * You should have received a copy of the GNU Lesser General Public
1d9048ba2ce3 Interplay C93 demuxer and video decoder
diego
parents:
diff changeset
18 * License along with FFmpeg; if not, write to the Free Software
2217
06083249909c license header consistency cosmetics
diego
parents: 2001
diff changeset
19 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
1987
1d9048ba2ce3 Interplay C93 demuxer and video decoder
diego
parents:
diff changeset
20 */
1d9048ba2ce3 Interplay C93 demuxer and video decoder
diego
parents:
diff changeset
21
1d9048ba2ce3 Interplay C93 demuxer and video decoder
diego
parents:
diff changeset
22 #include "avformat.h"
1d9048ba2ce3 Interplay C93 demuxer and video decoder
diego
parents:
diff changeset
23 #include "voc.h"
5181
c900e8690782 Check the index validity more thoroughly for the c93 probe function.
reimar
parents: 4081
diff changeset
24 #include "libavutil/intreadwrite.h"
1987
1d9048ba2ce3 Interplay C93 demuxer and video decoder
diego
parents:
diff changeset
25
1d9048ba2ce3 Interplay C93 demuxer and video decoder
diego
parents:
diff changeset
26 typedef struct {
1d9048ba2ce3 Interplay C93 demuxer and video decoder
diego
parents:
diff changeset
27 uint16_t index;
1d9048ba2ce3 Interplay C93 demuxer and video decoder
diego
parents:
diff changeset
28 uint8_t length;
1d9048ba2ce3 Interplay C93 demuxer and video decoder
diego
parents:
diff changeset
29 uint8_t frames;
1d9048ba2ce3 Interplay C93 demuxer and video decoder
diego
parents:
diff changeset
30 } C93BlockRecord;
1d9048ba2ce3 Interplay C93 demuxer and video decoder
diego
parents:
diff changeset
31
1d9048ba2ce3 Interplay C93 demuxer and video decoder
diego
parents:
diff changeset
32 typedef struct {
4081
3d6e7901bf05 avoid POSIX reserved _t suffix
aurel
parents: 3759
diff changeset
33 VocDecContext voc;
1987
1d9048ba2ce3 Interplay C93 demuxer and video decoder
diego
parents:
diff changeset
34
1d9048ba2ce3 Interplay C93 demuxer and video decoder
diego
parents:
diff changeset
35 C93BlockRecord block_records[512];
1d9048ba2ce3 Interplay C93 demuxer and video decoder
diego
parents:
diff changeset
36 int current_block;
1d9048ba2ce3 Interplay C93 demuxer and video decoder
diego
parents:
diff changeset
37
1d9048ba2ce3 Interplay C93 demuxer and video decoder
diego
parents:
diff changeset
38 uint32_t frame_offsets[32];
1d9048ba2ce3 Interplay C93 demuxer and video decoder
diego
parents:
diff changeset
39 int current_frame;
1d9048ba2ce3 Interplay C93 demuxer and video decoder
diego
parents:
diff changeset
40 int next_pkt_is_audio;
1d9048ba2ce3 Interplay C93 demuxer and video decoder
diego
parents:
diff changeset
41
1d9048ba2ce3 Interplay C93 demuxer and video decoder
diego
parents:
diff changeset
42 AVStream *audio;
1d9048ba2ce3 Interplay C93 demuxer and video decoder
diego
parents:
diff changeset
43 } C93DemuxContext;
1d9048ba2ce3 Interplay C93 demuxer and video decoder
diego
parents:
diff changeset
44
2000
ce51095f383b also remove c93_ prefix for static function in the c93 demuxer
michael
parents: 1987
diff changeset
45 static int probe(AVProbeData *p)
1987
1d9048ba2ce3 Interplay C93 demuxer and video decoder
diego
parents:
diff changeset
46 {
5181
c900e8690782 Check the index validity more thoroughly for the c93 probe function.
reimar
parents: 4081
diff changeset
47 int i;
c900e8690782 Check the index validity more thoroughly for the c93 probe function.
reimar
parents: 4081
diff changeset
48 int index = 1;
c900e8690782 Check the index validity more thoroughly for the c93 probe function.
reimar
parents: 4081
diff changeset
49 if (p->buf_size < 16)
c900e8690782 Check the index validity more thoroughly for the c93 probe function.
reimar
parents: 4081
diff changeset
50 return 0;
c900e8690782 Check the index validity more thoroughly for the c93 probe function.
reimar
parents: 4081
diff changeset
51 for (i = 0; i < 16; i += 4) {
c900e8690782 Check the index validity more thoroughly for the c93 probe function.
reimar
parents: 4081
diff changeset
52 if (AV_RL16(p->buf + i) != index || !p->buf[i + 2] || !p->buf[i + 3])
c900e8690782 Check the index validity more thoroughly for the c93 probe function.
reimar
parents: 4081
diff changeset
53 return 0;
c900e8690782 Check the index validity more thoroughly for the c93 probe function.
reimar
parents: 4081
diff changeset
54 index += p->buf[i + 2];
c900e8690782 Check the index validity more thoroughly for the c93 probe function.
reimar
parents: 4081
diff changeset
55 }
c900e8690782 Check the index validity more thoroughly for the c93 probe function.
reimar
parents: 4081
diff changeset
56 return AVPROBE_SCORE_MAX;
1987
1d9048ba2ce3 Interplay C93 demuxer and video decoder
diego
parents:
diff changeset
57 }
1d9048ba2ce3 Interplay C93 demuxer and video decoder
diego
parents:
diff changeset
58
2000
ce51095f383b also remove c93_ prefix for static function in the c93 demuxer
michael
parents: 1987
diff changeset
59 static int read_header(AVFormatContext *s,
1987
1d9048ba2ce3 Interplay C93 demuxer and video decoder
diego
parents:
diff changeset
60 AVFormatParameters *ap)
1d9048ba2ce3 Interplay C93 demuxer and video decoder
diego
parents:
diff changeset
61 {
1d9048ba2ce3 Interplay C93 demuxer and video decoder
diego
parents:
diff changeset
62 AVStream *video;
2771
d52c718e83f9 Use dynamically allocated ByteIOContext in AVFormatContext
andoma
parents: 2274
diff changeset
63 ByteIOContext *pb = s->pb;
1987
1d9048ba2ce3 Interplay C93 demuxer and video decoder
diego
parents:
diff changeset
64 C93DemuxContext *c93 = s->priv_data;
1d9048ba2ce3 Interplay C93 demuxer and video decoder
diego
parents:
diff changeset
65 int i;
1d9048ba2ce3 Interplay C93 demuxer and video decoder
diego
parents:
diff changeset
66 int framecount = 0;
1d9048ba2ce3 Interplay C93 demuxer and video decoder
diego
parents:
diff changeset
67
1d9048ba2ce3 Interplay C93 demuxer and video decoder
diego
parents:
diff changeset
68 for (i = 0; i < 512; i++) {
1d9048ba2ce3 Interplay C93 demuxer and video decoder
diego
parents:
diff changeset
69 c93->block_records[i].index = get_le16(pb);
1d9048ba2ce3 Interplay C93 demuxer and video decoder
diego
parents:
diff changeset
70 c93->block_records[i].length = get_byte(pb);
1d9048ba2ce3 Interplay C93 demuxer and video decoder
diego
parents:
diff changeset
71 c93->block_records[i].frames = get_byte(pb);
1d9048ba2ce3 Interplay C93 demuxer and video decoder
diego
parents:
diff changeset
72 if (c93->block_records[i].frames > 32) {
1d9048ba2ce3 Interplay C93 demuxer and video decoder
diego
parents:
diff changeset
73 av_log(s, AV_LOG_ERROR, "too many frames in block\n");
1d9048ba2ce3 Interplay C93 demuxer and video decoder
diego
parents:
diff changeset
74 return AVERROR_INVALIDDATA;
1d9048ba2ce3 Interplay C93 demuxer and video decoder
diego
parents:
diff changeset
75 }
1d9048ba2ce3 Interplay C93 demuxer and video decoder
diego
parents:
diff changeset
76 framecount += c93->block_records[i].frames;
1d9048ba2ce3 Interplay C93 demuxer and video decoder
diego
parents:
diff changeset
77 }
1d9048ba2ce3 Interplay C93 demuxer and video decoder
diego
parents:
diff changeset
78
1d9048ba2ce3 Interplay C93 demuxer and video decoder
diego
parents:
diff changeset
79 /* Audio streams are added if audio packets are found */
1d9048ba2ce3 Interplay C93 demuxer and video decoder
diego
parents:
diff changeset
80 s->ctx_flags |= AVFMTCTX_NOHEADER;
1d9048ba2ce3 Interplay C93 demuxer and video decoder
diego
parents:
diff changeset
81
1d9048ba2ce3 Interplay C93 demuxer and video decoder
diego
parents:
diff changeset
82 video = av_new_stream(s, 0);
1d9048ba2ce3 Interplay C93 demuxer and video decoder
diego
parents:
diff changeset
83 if (!video)
2273
7eb456c4ed8a Replace all occurrences of AVERROR_NOMEM with AVERROR(ENOMEM).
takis
parents: 2217
diff changeset
84 return AVERROR(ENOMEM);
1987
1d9048ba2ce3 Interplay C93 demuxer and video decoder
diego
parents:
diff changeset
85
5910
536e5527c1e0 Define AVMediaType enum, and use it instead of enum CodecType, which
stefano
parents: 5181
diff changeset
86 video->codec->codec_type = AVMEDIA_TYPE_VIDEO;
1987
1d9048ba2ce3 Interplay C93 demuxer and video decoder
diego
parents:
diff changeset
87 video->codec->codec_id = CODEC_ID_C93;
1d9048ba2ce3 Interplay C93 demuxer and video decoder
diego
parents:
diff changeset
88 video->codec->width = 320;
1d9048ba2ce3 Interplay C93 demuxer and video decoder
diego
parents:
diff changeset
89 video->codec->height = 192;
1d9048ba2ce3 Interplay C93 demuxer and video decoder
diego
parents:
diff changeset
90 /* 4:3 320x200 with 8 empty lines */
3759
27537074f2a9 convert every muxer/demuxer to write/read sample_aspect_ratio from/to
aurel
parents: 3424
diff changeset
91 video->sample_aspect_ratio = (AVRational) { 5, 6 };
1987
1d9048ba2ce3 Interplay C93 demuxer and video decoder
diego
parents:
diff changeset
92 video->time_base = (AVRational) { 2, 25 };
1d9048ba2ce3 Interplay C93 demuxer and video decoder
diego
parents:
diff changeset
93 video->nb_frames = framecount;
1d9048ba2ce3 Interplay C93 demuxer and video decoder
diego
parents:
diff changeset
94 video->duration = framecount;
1d9048ba2ce3 Interplay C93 demuxer and video decoder
diego
parents:
diff changeset
95 video->start_time = 0;
1d9048ba2ce3 Interplay C93 demuxer and video decoder
diego
parents:
diff changeset
96
1d9048ba2ce3 Interplay C93 demuxer and video decoder
diego
parents:
diff changeset
97 c93->current_block = 0;
1d9048ba2ce3 Interplay C93 demuxer and video decoder
diego
parents:
diff changeset
98 c93->current_frame = 0;
1d9048ba2ce3 Interplay C93 demuxer and video decoder
diego
parents:
diff changeset
99 c93->next_pkt_is_audio = 0;
1d9048ba2ce3 Interplay C93 demuxer and video decoder
diego
parents:
diff changeset
100 return 0;
1d9048ba2ce3 Interplay C93 demuxer and video decoder
diego
parents:
diff changeset
101 }
1d9048ba2ce3 Interplay C93 demuxer and video decoder
diego
parents:
diff changeset
102
1d9048ba2ce3 Interplay C93 demuxer and video decoder
diego
parents:
diff changeset
103 #define C93_HAS_PALETTE 0x01
1d9048ba2ce3 Interplay C93 demuxer and video decoder
diego
parents:
diff changeset
104 #define C93_FIRST_FRAME 0x02
1d9048ba2ce3 Interplay C93 demuxer and video decoder
diego
parents:
diff changeset
105
2000
ce51095f383b also remove c93_ prefix for static function in the c93 demuxer
michael
parents: 1987
diff changeset
106 static int read_packet(AVFormatContext *s, AVPacket *pkt)
1987
1d9048ba2ce3 Interplay C93 demuxer and video decoder
diego
parents:
diff changeset
107 {
2771
d52c718e83f9 Use dynamically allocated ByteIOContext in AVFormatContext
andoma
parents: 2274
diff changeset
108 ByteIOContext *pb = s->pb;
1987
1d9048ba2ce3 Interplay C93 demuxer and video decoder
diego
parents:
diff changeset
109 C93DemuxContext *c93 = s->priv_data;
1d9048ba2ce3 Interplay C93 demuxer and video decoder
diego
parents:
diff changeset
110 C93BlockRecord *br = &c93->block_records[c93->current_block];
1d9048ba2ce3 Interplay C93 demuxer and video decoder
diego
parents:
diff changeset
111 int datasize;
1d9048ba2ce3 Interplay C93 demuxer and video decoder
diego
parents:
diff changeset
112 int ret, i;
1d9048ba2ce3 Interplay C93 demuxer and video decoder
diego
parents:
diff changeset
113
1d9048ba2ce3 Interplay C93 demuxer and video decoder
diego
parents:
diff changeset
114 if (c93->next_pkt_is_audio) {
1d9048ba2ce3 Interplay C93 demuxer and video decoder
diego
parents:
diff changeset
115 c93->current_frame++;
1d9048ba2ce3 Interplay C93 demuxer and video decoder
diego
parents:
diff changeset
116 c93->next_pkt_is_audio = 0;
1d9048ba2ce3 Interplay C93 demuxer and video decoder
diego
parents:
diff changeset
117 datasize = get_le16(pb);
1d9048ba2ce3 Interplay C93 demuxer and video decoder
diego
parents:
diff changeset
118 if (datasize > 42) {
1d9048ba2ce3 Interplay C93 demuxer and video decoder
diego
parents:
diff changeset
119 if (!c93->audio) {
1d9048ba2ce3 Interplay C93 demuxer and video decoder
diego
parents:
diff changeset
120 c93->audio = av_new_stream(s, 1);
1d9048ba2ce3 Interplay C93 demuxer and video decoder
diego
parents:
diff changeset
121 if (!c93->audio)
2273
7eb456c4ed8a Replace all occurrences of AVERROR_NOMEM with AVERROR(ENOMEM).
takis
parents: 2217
diff changeset
122 return AVERROR(ENOMEM);
5910
536e5527c1e0 Define AVMediaType enum, and use it instead of enum CodecType, which
stefano
parents: 5181
diff changeset
123 c93->audio->codec->codec_type = AVMEDIA_TYPE_AUDIO;
1987
1d9048ba2ce3 Interplay C93 demuxer and video decoder
diego
parents:
diff changeset
124 }
1d9048ba2ce3 Interplay C93 demuxer and video decoder
diego
parents:
diff changeset
125 url_fskip(pb, 26); /* VOC header */
1d9048ba2ce3 Interplay C93 demuxer and video decoder
diego
parents:
diff changeset
126 ret = voc_get_packet(s, pkt, c93->audio, datasize - 26);
1d9048ba2ce3 Interplay C93 demuxer and video decoder
diego
parents:
diff changeset
127 if (ret > 0) {
1d9048ba2ce3 Interplay C93 demuxer and video decoder
diego
parents:
diff changeset
128 pkt->stream_index = 1;
5913
11bb10c37225 Replace all occurences of PKT_FLAG_KEY with AV_PKT_FLAG_KEY.
cehoyos
parents: 5910
diff changeset
129 pkt->flags |= AV_PKT_FLAG_KEY;
1987
1d9048ba2ce3 Interplay C93 demuxer and video decoder
diego
parents:
diff changeset
130 return ret;
1d9048ba2ce3 Interplay C93 demuxer and video decoder
diego
parents:
diff changeset
131 }
1d9048ba2ce3 Interplay C93 demuxer and video decoder
diego
parents:
diff changeset
132 }
1d9048ba2ce3 Interplay C93 demuxer and video decoder
diego
parents:
diff changeset
133 }
1d9048ba2ce3 Interplay C93 demuxer and video decoder
diego
parents:
diff changeset
134 if (c93->current_frame >= br->frames) {
1d9048ba2ce3 Interplay C93 demuxer and video decoder
diego
parents:
diff changeset
135 if (c93->current_block >= 511 || !br[1].length)
2274
b21c2af60bc9 Replace all occurrences of AVERROR_IO with AVERROR(EIO).
takis
parents: 2273
diff changeset
136 return AVERROR(EIO);
1987
1d9048ba2ce3 Interplay C93 demuxer and video decoder
diego
parents:
diff changeset
137 br++;
1d9048ba2ce3 Interplay C93 demuxer and video decoder
diego
parents:
diff changeset
138 c93->current_block++;
1d9048ba2ce3 Interplay C93 demuxer and video decoder
diego
parents:
diff changeset
139 c93->current_frame = 0;
1d9048ba2ce3 Interplay C93 demuxer and video decoder
diego
parents:
diff changeset
140 }
1d9048ba2ce3 Interplay C93 demuxer and video decoder
diego
parents:
diff changeset
141
1d9048ba2ce3 Interplay C93 demuxer and video decoder
diego
parents:
diff changeset
142 if (c93->current_frame == 0) {
1d9048ba2ce3 Interplay C93 demuxer and video decoder
diego
parents:
diff changeset
143 url_fseek(pb, br->index * 2048, SEEK_SET);
1d9048ba2ce3 Interplay C93 demuxer and video decoder
diego
parents:
diff changeset
144 for (i = 0; i < 32; i++) {
1d9048ba2ce3 Interplay C93 demuxer and video decoder
diego
parents:
diff changeset
145 c93->frame_offsets[i] = get_le32(pb);
1d9048ba2ce3 Interplay C93 demuxer and video decoder
diego
parents:
diff changeset
146 }
1d9048ba2ce3 Interplay C93 demuxer and video decoder
diego
parents:
diff changeset
147 }
1d9048ba2ce3 Interplay C93 demuxer and video decoder
diego
parents:
diff changeset
148
1d9048ba2ce3 Interplay C93 demuxer and video decoder
diego
parents:
diff changeset
149 url_fseek(pb,br->index * 2048 +
1d9048ba2ce3 Interplay C93 demuxer and video decoder
diego
parents:
diff changeset
150 c93->frame_offsets[c93->current_frame], SEEK_SET);
1d9048ba2ce3 Interplay C93 demuxer and video decoder
diego
parents:
diff changeset
151 datasize = get_le16(pb); /* video frame size */
1d9048ba2ce3 Interplay C93 demuxer and video decoder
diego
parents:
diff changeset
152
1d9048ba2ce3 Interplay C93 demuxer and video decoder
diego
parents:
diff changeset
153 ret = av_new_packet(pkt, datasize + 768 + 1);
1d9048ba2ce3 Interplay C93 demuxer and video decoder
diego
parents:
diff changeset
154 if (ret < 0)
1d9048ba2ce3 Interplay C93 demuxer and video decoder
diego
parents:
diff changeset
155 return ret;
1d9048ba2ce3 Interplay C93 demuxer and video decoder
diego
parents:
diff changeset
156 pkt->data[0] = 0;
1d9048ba2ce3 Interplay C93 demuxer and video decoder
diego
parents:
diff changeset
157 pkt->size = datasize + 1;
1d9048ba2ce3 Interplay C93 demuxer and video decoder
diego
parents:
diff changeset
158
1d9048ba2ce3 Interplay C93 demuxer and video decoder
diego
parents:
diff changeset
159 ret = get_buffer(pb, pkt->data + 1, datasize);
1d9048ba2ce3 Interplay C93 demuxer and video decoder
diego
parents:
diff changeset
160 if (ret < datasize) {
2274
b21c2af60bc9 Replace all occurrences of AVERROR_IO with AVERROR(EIO).
takis
parents: 2273
diff changeset
161 ret = AVERROR(EIO);
1987
1d9048ba2ce3 Interplay C93 demuxer and video decoder
diego
parents:
diff changeset
162 goto fail;
1d9048ba2ce3 Interplay C93 demuxer and video decoder
diego
parents:
diff changeset
163 }
1d9048ba2ce3 Interplay C93 demuxer and video decoder
diego
parents:
diff changeset
164
1d9048ba2ce3 Interplay C93 demuxer and video decoder
diego
parents:
diff changeset
165 datasize = get_le16(pb); /* palette size */
1d9048ba2ce3 Interplay C93 demuxer and video decoder
diego
parents:
diff changeset
166 if (datasize) {
1d9048ba2ce3 Interplay C93 demuxer and video decoder
diego
parents:
diff changeset
167 if (datasize != 768) {
1d9048ba2ce3 Interplay C93 demuxer and video decoder
diego
parents:
diff changeset
168 av_log(s, AV_LOG_ERROR, "invalid palette size %u\n", datasize);
1d9048ba2ce3 Interplay C93 demuxer and video decoder
diego
parents:
diff changeset
169 ret = AVERROR_INVALIDDATA;
1d9048ba2ce3 Interplay C93 demuxer and video decoder
diego
parents:
diff changeset
170 goto fail;
1d9048ba2ce3 Interplay C93 demuxer and video decoder
diego
parents:
diff changeset
171 }
1d9048ba2ce3 Interplay C93 demuxer and video decoder
diego
parents:
diff changeset
172 pkt->data[0] |= C93_HAS_PALETTE;
1d9048ba2ce3 Interplay C93 demuxer and video decoder
diego
parents:
diff changeset
173 ret = get_buffer(pb, pkt->data + pkt->size, datasize);
1d9048ba2ce3 Interplay C93 demuxer and video decoder
diego
parents:
diff changeset
174 if (ret < datasize) {
2274
b21c2af60bc9 Replace all occurrences of AVERROR_IO with AVERROR(EIO).
takis
parents: 2273
diff changeset
175 ret = AVERROR(EIO);
1987
1d9048ba2ce3 Interplay C93 demuxer and video decoder
diego
parents:
diff changeset
176 goto fail;
1d9048ba2ce3 Interplay C93 demuxer and video decoder
diego
parents:
diff changeset
177 }
1d9048ba2ce3 Interplay C93 demuxer and video decoder
diego
parents:
diff changeset
178 pkt->size += 768;
1d9048ba2ce3 Interplay C93 demuxer and video decoder
diego
parents:
diff changeset
179 }
1d9048ba2ce3 Interplay C93 demuxer and video decoder
diego
parents:
diff changeset
180 pkt->stream_index = 0;
1d9048ba2ce3 Interplay C93 demuxer and video decoder
diego
parents:
diff changeset
181 c93->next_pkt_is_audio = 1;
1d9048ba2ce3 Interplay C93 demuxer and video decoder
diego
parents:
diff changeset
182
1d9048ba2ce3 Interplay C93 demuxer and video decoder
diego
parents:
diff changeset
183 /* only the first frame is guaranteed to not reference previous frames */
1d9048ba2ce3 Interplay C93 demuxer and video decoder
diego
parents:
diff changeset
184 if (c93->current_block == 0 && c93->current_frame == 0) {
5913
11bb10c37225 Replace all occurences of PKT_FLAG_KEY with AV_PKT_FLAG_KEY.
cehoyos
parents: 5910
diff changeset
185 pkt->flags |= AV_PKT_FLAG_KEY;
1987
1d9048ba2ce3 Interplay C93 demuxer and video decoder
diego
parents:
diff changeset
186 pkt->data[0] |= C93_FIRST_FRAME;
1d9048ba2ce3 Interplay C93 demuxer and video decoder
diego
parents:
diff changeset
187 }
1d9048ba2ce3 Interplay C93 demuxer and video decoder
diego
parents:
diff changeset
188 return 0;
1d9048ba2ce3 Interplay C93 demuxer and video decoder
diego
parents:
diff changeset
189
1d9048ba2ce3 Interplay C93 demuxer and video decoder
diego
parents:
diff changeset
190 fail:
1d9048ba2ce3 Interplay C93 demuxer and video decoder
diego
parents:
diff changeset
191 av_free_packet(pkt);
1d9048ba2ce3 Interplay C93 demuxer and video decoder
diego
parents:
diff changeset
192 return ret;
1d9048ba2ce3 Interplay C93 demuxer and video decoder
diego
parents:
diff changeset
193 }
1d9048ba2ce3 Interplay C93 demuxer and video decoder
diego
parents:
diff changeset
194
1d9048ba2ce3 Interplay C93 demuxer and video decoder
diego
parents:
diff changeset
195 AVInputFormat c93_demuxer = {
1d9048ba2ce3 Interplay C93 demuxer and video decoder
diego
parents:
diff changeset
196 "c93",
3424
7a0230981402 Make long_names in lavf/lavdev optional depending on CONFIG_SMALL.
diego
parents: 2771
diff changeset
197 NULL_IF_CONFIG_SMALL("Interplay C93"),
1987
1d9048ba2ce3 Interplay C93 demuxer and video decoder
diego
parents:
diff changeset
198 sizeof(C93DemuxContext),
2000
ce51095f383b also remove c93_ prefix for static function in the c93 demuxer
michael
parents: 1987
diff changeset
199 probe,
ce51095f383b also remove c93_ prefix for static function in the c93 demuxer
michael
parents: 1987
diff changeset
200 read_header,
ce51095f383b also remove c93_ prefix for static function in the c93 demuxer
michael
parents: 1987
diff changeset
201 read_packet,
1987
1d9048ba2ce3 Interplay C93 demuxer and video decoder
diego
parents:
diff changeset
202 };