annotate c93.c @ 3754:8d267b43eaba libavformat

Move malloc() down until after all initializations, so that the resource is only allocated if initialization worked. This means that on failure, we don't have to deallocate it.
author rbultje
date Sat, 23 Aug 2008 18:46:30 +0000
parents 7a0230981402
children 27537074f2a9
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"
1d9048ba2ce3 Interplay C93 demuxer and video decoder
diego
parents:
diff changeset
24
1d9048ba2ce3 Interplay C93 demuxer and video decoder
diego
parents:
diff changeset
25 typedef struct {
1d9048ba2ce3 Interplay C93 demuxer and video decoder
diego
parents:
diff changeset
26 uint16_t index;
1d9048ba2ce3 Interplay C93 demuxer and video decoder
diego
parents:
diff changeset
27 uint8_t length;
1d9048ba2ce3 Interplay C93 demuxer and video decoder
diego
parents:
diff changeset
28 uint8_t frames;
1d9048ba2ce3 Interplay C93 demuxer and video decoder
diego
parents:
diff changeset
29 } C93BlockRecord;
1d9048ba2ce3 Interplay C93 demuxer and video decoder
diego
parents:
diff changeset
30
1d9048ba2ce3 Interplay C93 demuxer and video decoder
diego
parents:
diff changeset
31 typedef struct {
1d9048ba2ce3 Interplay C93 demuxer and video decoder
diego
parents:
diff changeset
32 voc_dec_context_t voc;
1d9048ba2ce3 Interplay C93 demuxer and video decoder
diego
parents:
diff changeset
33
1d9048ba2ce3 Interplay C93 demuxer and video decoder
diego
parents:
diff changeset
34 C93BlockRecord block_records[512];
1d9048ba2ce3 Interplay C93 demuxer and video decoder
diego
parents:
diff changeset
35 int current_block;
1d9048ba2ce3 Interplay C93 demuxer and video decoder
diego
parents:
diff changeset
36
1d9048ba2ce3 Interplay C93 demuxer and video decoder
diego
parents:
diff changeset
37 uint32_t frame_offsets[32];
1d9048ba2ce3 Interplay C93 demuxer and video decoder
diego
parents:
diff changeset
38 int current_frame;
1d9048ba2ce3 Interplay C93 demuxer and video decoder
diego
parents:
diff changeset
39 int next_pkt_is_audio;
1d9048ba2ce3 Interplay C93 demuxer and video decoder
diego
parents:
diff changeset
40
1d9048ba2ce3 Interplay C93 demuxer and video decoder
diego
parents:
diff changeset
41 AVStream *audio;
1d9048ba2ce3 Interplay C93 demuxer and video decoder
diego
parents:
diff changeset
42 } C93DemuxContext;
1d9048ba2ce3 Interplay C93 demuxer and video decoder
diego
parents:
diff changeset
43
2000
ce51095f383b also remove c93_ prefix for static function in the c93 demuxer
michael
parents: 1987
diff changeset
44 static int probe(AVProbeData *p)
1987
1d9048ba2ce3 Interplay C93 demuxer and video decoder
diego
parents:
diff changeset
45 {
1d9048ba2ce3 Interplay C93 demuxer and video decoder
diego
parents:
diff changeset
46 if (p->buf[0] == 0x01 && p->buf[1] == 0x00 &&
1d9048ba2ce3 Interplay C93 demuxer and video decoder
diego
parents:
diff changeset
47 p->buf[4] == 0x01 + p->buf[2] &&
1d9048ba2ce3 Interplay C93 demuxer and video decoder
diego
parents:
diff changeset
48 p->buf[8] == p->buf[4] + p->buf[6] &&
1d9048ba2ce3 Interplay C93 demuxer and video decoder
diego
parents:
diff changeset
49 p->buf[12] == p->buf[8] + p->buf[10])
1d9048ba2ce3 Interplay C93 demuxer and video decoder
diego
parents:
diff changeset
50 return AVPROBE_SCORE_MAX;
1d9048ba2ce3 Interplay C93 demuxer and video decoder
diego
parents:
diff changeset
51
1d9048ba2ce3 Interplay C93 demuxer and video decoder
diego
parents:
diff changeset
52 return 0;
1d9048ba2ce3 Interplay C93 demuxer and video decoder
diego
parents:
diff changeset
53 }
1d9048ba2ce3 Interplay C93 demuxer and video decoder
diego
parents:
diff changeset
54
2000
ce51095f383b also remove c93_ prefix for static function in the c93 demuxer
michael
parents: 1987
diff changeset
55 static int read_header(AVFormatContext *s,
1987
1d9048ba2ce3 Interplay C93 demuxer and video decoder
diego
parents:
diff changeset
56 AVFormatParameters *ap)
1d9048ba2ce3 Interplay C93 demuxer and video decoder
diego
parents:
diff changeset
57 {
1d9048ba2ce3 Interplay C93 demuxer and video decoder
diego
parents:
diff changeset
58 AVStream *video;
2771
d52c718e83f9 Use dynamically allocated ByteIOContext in AVFormatContext
andoma
parents: 2274
diff changeset
59 ByteIOContext *pb = s->pb;
1987
1d9048ba2ce3 Interplay C93 demuxer and video decoder
diego
parents:
diff changeset
60 C93DemuxContext *c93 = s->priv_data;
1d9048ba2ce3 Interplay C93 demuxer and video decoder
diego
parents:
diff changeset
61 int i;
1d9048ba2ce3 Interplay C93 demuxer and video decoder
diego
parents:
diff changeset
62 int framecount = 0;
1d9048ba2ce3 Interplay C93 demuxer and video decoder
diego
parents:
diff changeset
63
1d9048ba2ce3 Interplay C93 demuxer and video decoder
diego
parents:
diff changeset
64 for (i = 0; i < 512; i++) {
1d9048ba2ce3 Interplay C93 demuxer and video decoder
diego
parents:
diff changeset
65 c93->block_records[i].index = get_le16(pb);
1d9048ba2ce3 Interplay C93 demuxer and video decoder
diego
parents:
diff changeset
66 c93->block_records[i].length = get_byte(pb);
1d9048ba2ce3 Interplay C93 demuxer and video decoder
diego
parents:
diff changeset
67 c93->block_records[i].frames = get_byte(pb);
1d9048ba2ce3 Interplay C93 demuxer and video decoder
diego
parents:
diff changeset
68 if (c93->block_records[i].frames > 32) {
1d9048ba2ce3 Interplay C93 demuxer and video decoder
diego
parents:
diff changeset
69 av_log(s, AV_LOG_ERROR, "too many frames in block\n");
1d9048ba2ce3 Interplay C93 demuxer and video decoder
diego
parents:
diff changeset
70 return AVERROR_INVALIDDATA;
1d9048ba2ce3 Interplay C93 demuxer and video decoder
diego
parents:
diff changeset
71 }
1d9048ba2ce3 Interplay C93 demuxer and video decoder
diego
parents:
diff changeset
72 framecount += c93->block_records[i].frames;
1d9048ba2ce3 Interplay C93 demuxer and video decoder
diego
parents:
diff changeset
73 }
1d9048ba2ce3 Interplay C93 demuxer and video decoder
diego
parents:
diff changeset
74
1d9048ba2ce3 Interplay C93 demuxer and video decoder
diego
parents:
diff changeset
75 /* Audio streams are added if audio packets are found */
1d9048ba2ce3 Interplay C93 demuxer and video decoder
diego
parents:
diff changeset
76 s->ctx_flags |= AVFMTCTX_NOHEADER;
1d9048ba2ce3 Interplay C93 demuxer and video decoder
diego
parents:
diff changeset
77
1d9048ba2ce3 Interplay C93 demuxer and video decoder
diego
parents:
diff changeset
78 video = av_new_stream(s, 0);
1d9048ba2ce3 Interplay C93 demuxer and video decoder
diego
parents:
diff changeset
79 if (!video)
2273
7eb456c4ed8a Replace all occurrences of AVERROR_NOMEM with AVERROR(ENOMEM).
takis
parents: 2217
diff changeset
80 return AVERROR(ENOMEM);
1987
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->codec->codec_type = CODEC_TYPE_VIDEO;
1d9048ba2ce3 Interplay C93 demuxer and video decoder
diego
parents:
diff changeset
83 video->codec->codec_id = CODEC_ID_C93;
1d9048ba2ce3 Interplay C93 demuxer and video decoder
diego
parents:
diff changeset
84 video->codec->width = 320;
1d9048ba2ce3 Interplay C93 demuxer and video decoder
diego
parents:
diff changeset
85 video->codec->height = 192;
1d9048ba2ce3 Interplay C93 demuxer and video decoder
diego
parents:
diff changeset
86 /* 4:3 320x200 with 8 empty lines */
1d9048ba2ce3 Interplay C93 demuxer and video decoder
diego
parents:
diff changeset
87 video->codec->sample_aspect_ratio = (AVRational) { 5, 6 };
1d9048ba2ce3 Interplay C93 demuxer and video decoder
diego
parents:
diff changeset
88 video->time_base = (AVRational) { 2, 25 };
1d9048ba2ce3 Interplay C93 demuxer and video decoder
diego
parents:
diff changeset
89 video->nb_frames = framecount;
1d9048ba2ce3 Interplay C93 demuxer and video decoder
diego
parents:
diff changeset
90 video->duration = framecount;
1d9048ba2ce3 Interplay C93 demuxer and video decoder
diego
parents:
diff changeset
91 video->start_time = 0;
1d9048ba2ce3 Interplay C93 demuxer and video decoder
diego
parents:
diff changeset
92
1d9048ba2ce3 Interplay C93 demuxer and video decoder
diego
parents:
diff changeset
93 c93->current_block = 0;
1d9048ba2ce3 Interplay C93 demuxer and video decoder
diego
parents:
diff changeset
94 c93->current_frame = 0;
1d9048ba2ce3 Interplay C93 demuxer and video decoder
diego
parents:
diff changeset
95 c93->next_pkt_is_audio = 0;
1d9048ba2ce3 Interplay C93 demuxer and video decoder
diego
parents:
diff changeset
96 return 0;
1d9048ba2ce3 Interplay C93 demuxer and video decoder
diego
parents:
diff changeset
97 }
1d9048ba2ce3 Interplay C93 demuxer and video decoder
diego
parents:
diff changeset
98
1d9048ba2ce3 Interplay C93 demuxer and video decoder
diego
parents:
diff changeset
99 #define C93_HAS_PALETTE 0x01
1d9048ba2ce3 Interplay C93 demuxer and video decoder
diego
parents:
diff changeset
100 #define C93_FIRST_FRAME 0x02
1d9048ba2ce3 Interplay C93 demuxer and video decoder
diego
parents:
diff changeset
101
2000
ce51095f383b also remove c93_ prefix for static function in the c93 demuxer
michael
parents: 1987
diff changeset
102 static int read_packet(AVFormatContext *s, AVPacket *pkt)
1987
1d9048ba2ce3 Interplay C93 demuxer and video decoder
diego
parents:
diff changeset
103 {
2771
d52c718e83f9 Use dynamically allocated ByteIOContext in AVFormatContext
andoma
parents: 2274
diff changeset
104 ByteIOContext *pb = s->pb;
1987
1d9048ba2ce3 Interplay C93 demuxer and video decoder
diego
parents:
diff changeset
105 C93DemuxContext *c93 = s->priv_data;
1d9048ba2ce3 Interplay C93 demuxer and video decoder
diego
parents:
diff changeset
106 C93BlockRecord *br = &c93->block_records[c93->current_block];
1d9048ba2ce3 Interplay C93 demuxer and video decoder
diego
parents:
diff changeset
107 int datasize;
1d9048ba2ce3 Interplay C93 demuxer and video decoder
diego
parents:
diff changeset
108 int ret, i;
1d9048ba2ce3 Interplay C93 demuxer and video decoder
diego
parents:
diff changeset
109
1d9048ba2ce3 Interplay C93 demuxer and video decoder
diego
parents:
diff changeset
110 if (c93->next_pkt_is_audio) {
1d9048ba2ce3 Interplay C93 demuxer and video decoder
diego
parents:
diff changeset
111 c93->current_frame++;
1d9048ba2ce3 Interplay C93 demuxer and video decoder
diego
parents:
diff changeset
112 c93->next_pkt_is_audio = 0;
1d9048ba2ce3 Interplay C93 demuxer and video decoder
diego
parents:
diff changeset
113 datasize = get_le16(pb);
1d9048ba2ce3 Interplay C93 demuxer and video decoder
diego
parents:
diff changeset
114 if (datasize > 42) {
1d9048ba2ce3 Interplay C93 demuxer and video decoder
diego
parents:
diff changeset
115 if (!c93->audio) {
1d9048ba2ce3 Interplay C93 demuxer and video decoder
diego
parents:
diff changeset
116 c93->audio = av_new_stream(s, 1);
1d9048ba2ce3 Interplay C93 demuxer and video decoder
diego
parents:
diff changeset
117 if (!c93->audio)
2273
7eb456c4ed8a Replace all occurrences of AVERROR_NOMEM with AVERROR(ENOMEM).
takis
parents: 2217
diff changeset
118 return AVERROR(ENOMEM);
1987
1d9048ba2ce3 Interplay C93 demuxer and video decoder
diego
parents:
diff changeset
119 c93->audio->codec->codec_type = CODEC_TYPE_AUDIO;
1d9048ba2ce3 Interplay C93 demuxer and video decoder
diego
parents:
diff changeset
120 }
1d9048ba2ce3 Interplay C93 demuxer and video decoder
diego
parents:
diff changeset
121 url_fskip(pb, 26); /* VOC header */
1d9048ba2ce3 Interplay C93 demuxer and video decoder
diego
parents:
diff changeset
122 ret = voc_get_packet(s, pkt, c93->audio, datasize - 26);
1d9048ba2ce3 Interplay C93 demuxer and video decoder
diego
parents:
diff changeset
123 if (ret > 0) {
1d9048ba2ce3 Interplay C93 demuxer and video decoder
diego
parents:
diff changeset
124 pkt->stream_index = 1;
1d9048ba2ce3 Interplay C93 demuxer and video decoder
diego
parents:
diff changeset
125 pkt->flags |= PKT_FLAG_KEY;
1d9048ba2ce3 Interplay C93 demuxer and video decoder
diego
parents:
diff changeset
126 return ret;
1d9048ba2ce3 Interplay C93 demuxer and video decoder
diego
parents:
diff changeset
127 }
1d9048ba2ce3 Interplay C93 demuxer and video decoder
diego
parents:
diff changeset
128 }
1d9048ba2ce3 Interplay C93 demuxer and video decoder
diego
parents:
diff changeset
129 }
1d9048ba2ce3 Interplay C93 demuxer and video decoder
diego
parents:
diff changeset
130 if (c93->current_frame >= br->frames) {
1d9048ba2ce3 Interplay C93 demuxer and video decoder
diego
parents:
diff changeset
131 if (c93->current_block >= 511 || !br[1].length)
2274
b21c2af60bc9 Replace all occurrences of AVERROR_IO with AVERROR(EIO).
takis
parents: 2273
diff changeset
132 return AVERROR(EIO);
1987
1d9048ba2ce3 Interplay C93 demuxer and video decoder
diego
parents:
diff changeset
133 br++;
1d9048ba2ce3 Interplay C93 demuxer and video decoder
diego
parents:
diff changeset
134 c93->current_block++;
1d9048ba2ce3 Interplay C93 demuxer and video decoder
diego
parents:
diff changeset
135 c93->current_frame = 0;
1d9048ba2ce3 Interplay C93 demuxer and video decoder
diego
parents:
diff changeset
136 }
1d9048ba2ce3 Interplay C93 demuxer and video decoder
diego
parents:
diff changeset
137
1d9048ba2ce3 Interplay C93 demuxer and video decoder
diego
parents:
diff changeset
138 if (c93->current_frame == 0) {
1d9048ba2ce3 Interplay C93 demuxer and video decoder
diego
parents:
diff changeset
139 url_fseek(pb, br->index * 2048, SEEK_SET);
1d9048ba2ce3 Interplay C93 demuxer and video decoder
diego
parents:
diff changeset
140 for (i = 0; i < 32; i++) {
1d9048ba2ce3 Interplay C93 demuxer and video decoder
diego
parents:
diff changeset
141 c93->frame_offsets[i] = get_le32(pb);
1d9048ba2ce3 Interplay C93 demuxer and video decoder
diego
parents:
diff changeset
142 }
1d9048ba2ce3 Interplay C93 demuxer and video decoder
diego
parents:
diff changeset
143 }
1d9048ba2ce3 Interplay C93 demuxer and video decoder
diego
parents:
diff changeset
144
1d9048ba2ce3 Interplay C93 demuxer and video decoder
diego
parents:
diff changeset
145 url_fseek(pb,br->index * 2048 +
1d9048ba2ce3 Interplay C93 demuxer and video decoder
diego
parents:
diff changeset
146 c93->frame_offsets[c93->current_frame], SEEK_SET);
1d9048ba2ce3 Interplay C93 demuxer and video decoder
diego
parents:
diff changeset
147 datasize = get_le16(pb); /* video frame size */
1d9048ba2ce3 Interplay C93 demuxer and video decoder
diego
parents:
diff changeset
148
1d9048ba2ce3 Interplay C93 demuxer and video decoder
diego
parents:
diff changeset
149 ret = av_new_packet(pkt, datasize + 768 + 1);
1d9048ba2ce3 Interplay C93 demuxer and video decoder
diego
parents:
diff changeset
150 if (ret < 0)
1d9048ba2ce3 Interplay C93 demuxer and video decoder
diego
parents:
diff changeset
151 return ret;
1d9048ba2ce3 Interplay C93 demuxer and video decoder
diego
parents:
diff changeset
152 pkt->data[0] = 0;
1d9048ba2ce3 Interplay C93 demuxer and video decoder
diego
parents:
diff changeset
153 pkt->size = datasize + 1;
1d9048ba2ce3 Interplay C93 demuxer and video decoder
diego
parents:
diff changeset
154
1d9048ba2ce3 Interplay C93 demuxer and video decoder
diego
parents:
diff changeset
155 ret = get_buffer(pb, pkt->data + 1, datasize);
1d9048ba2ce3 Interplay C93 demuxer and video decoder
diego
parents:
diff changeset
156 if (ret < datasize) {
2274
b21c2af60bc9 Replace all occurrences of AVERROR_IO with AVERROR(EIO).
takis
parents: 2273
diff changeset
157 ret = AVERROR(EIO);
1987
1d9048ba2ce3 Interplay C93 demuxer and video decoder
diego
parents:
diff changeset
158 goto fail;
1d9048ba2ce3 Interplay C93 demuxer and video decoder
diego
parents:
diff changeset
159 }
1d9048ba2ce3 Interplay C93 demuxer and video decoder
diego
parents:
diff changeset
160
1d9048ba2ce3 Interplay C93 demuxer and video decoder
diego
parents:
diff changeset
161 datasize = get_le16(pb); /* palette size */
1d9048ba2ce3 Interplay C93 demuxer and video decoder
diego
parents:
diff changeset
162 if (datasize) {
1d9048ba2ce3 Interplay C93 demuxer and video decoder
diego
parents:
diff changeset
163 if (datasize != 768) {
1d9048ba2ce3 Interplay C93 demuxer and video decoder
diego
parents:
diff changeset
164 av_log(s, AV_LOG_ERROR, "invalid palette size %u\n", datasize);
1d9048ba2ce3 Interplay C93 demuxer and video decoder
diego
parents:
diff changeset
165 ret = AVERROR_INVALIDDATA;
1d9048ba2ce3 Interplay C93 demuxer and video decoder
diego
parents:
diff changeset
166 goto fail;
1d9048ba2ce3 Interplay C93 demuxer and video decoder
diego
parents:
diff changeset
167 }
1d9048ba2ce3 Interplay C93 demuxer and video decoder
diego
parents:
diff changeset
168 pkt->data[0] |= C93_HAS_PALETTE;
1d9048ba2ce3 Interplay C93 demuxer and video decoder
diego
parents:
diff changeset
169 ret = get_buffer(pb, pkt->data + pkt->size, datasize);
1d9048ba2ce3 Interplay C93 demuxer and video decoder
diego
parents:
diff changeset
170 if (ret < datasize) {
2274
b21c2af60bc9 Replace all occurrences of AVERROR_IO with AVERROR(EIO).
takis
parents: 2273
diff changeset
171 ret = AVERROR(EIO);
1987
1d9048ba2ce3 Interplay C93 demuxer and video decoder
diego
parents:
diff changeset
172 goto fail;
1d9048ba2ce3 Interplay C93 demuxer and video decoder
diego
parents:
diff changeset
173 }
1d9048ba2ce3 Interplay C93 demuxer and video decoder
diego
parents:
diff changeset
174 pkt->size += 768;
1d9048ba2ce3 Interplay C93 demuxer and video decoder
diego
parents:
diff changeset
175 }
1d9048ba2ce3 Interplay C93 demuxer and video decoder
diego
parents:
diff changeset
176 pkt->stream_index = 0;
1d9048ba2ce3 Interplay C93 demuxer and video decoder
diego
parents:
diff changeset
177 c93->next_pkt_is_audio = 1;
1d9048ba2ce3 Interplay C93 demuxer and video decoder
diego
parents:
diff changeset
178
1d9048ba2ce3 Interplay C93 demuxer and video decoder
diego
parents:
diff changeset
179 /* only the first frame is guaranteed to not reference previous frames */
1d9048ba2ce3 Interplay C93 demuxer and video decoder
diego
parents:
diff changeset
180 if (c93->current_block == 0 && c93->current_frame == 0) {
1d9048ba2ce3 Interplay C93 demuxer and video decoder
diego
parents:
diff changeset
181 pkt->flags |= PKT_FLAG_KEY;
1d9048ba2ce3 Interplay C93 demuxer and video decoder
diego
parents:
diff changeset
182 pkt->data[0] |= C93_FIRST_FRAME;
1d9048ba2ce3 Interplay C93 demuxer and video decoder
diego
parents:
diff changeset
183 }
1d9048ba2ce3 Interplay C93 demuxer and video decoder
diego
parents:
diff changeset
184 return 0;
1d9048ba2ce3 Interplay C93 demuxer and video decoder
diego
parents:
diff changeset
185
1d9048ba2ce3 Interplay C93 demuxer and video decoder
diego
parents:
diff changeset
186 fail:
1d9048ba2ce3 Interplay C93 demuxer and video decoder
diego
parents:
diff changeset
187 av_free_packet(pkt);
1d9048ba2ce3 Interplay C93 demuxer and video decoder
diego
parents:
diff changeset
188 return ret;
1d9048ba2ce3 Interplay C93 demuxer and video decoder
diego
parents:
diff changeset
189 }
1d9048ba2ce3 Interplay C93 demuxer and video decoder
diego
parents:
diff changeset
190
1d9048ba2ce3 Interplay C93 demuxer and video decoder
diego
parents:
diff changeset
191 AVInputFormat c93_demuxer = {
1d9048ba2ce3 Interplay C93 demuxer and video decoder
diego
parents:
diff changeset
192 "c93",
3424
7a0230981402 Make long_names in lavf/lavdev optional depending on CONFIG_SMALL.
diego
parents: 2771
diff changeset
193 NULL_IF_CONFIG_SMALL("Interplay C93"),
1987
1d9048ba2ce3 Interplay C93 demuxer and video decoder
diego
parents:
diff changeset
194 sizeof(C93DemuxContext),
2000
ce51095f383b also remove c93_ prefix for static function in the c93 demuxer
michael
parents: 1987
diff changeset
195 probe,
ce51095f383b also remove c93_ prefix for static function in the c93 demuxer
michael
parents: 1987
diff changeset
196 read_header,
ce51095f383b also remove c93_ prefix for static function in the c93 demuxer
michael
parents: 1987
diff changeset
197 read_packet,
1987
1d9048ba2ce3 Interplay C93 demuxer and video decoder
diego
parents:
diff changeset
198 };