1 /*
2 * Sony Playstation (PSX) STR File Demuxer
3 * Copyright (c) 2003 The ffmpeg Project
4 *
5 * This file is part of FFmpeg.
6 *
7 * FFmpeg is free software; you can redistribute it and/or
8 * modify it under the terms of the GNU Lesser General Public
9 * License as published by the Free Software Foundation; either
10 * version 2.1 of the License, or (at your option) any later version.
11 *
12 * FFmpeg is distributed in the hope that it will be useful,
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
18 * License along with FFmpeg; if not, write to the Free Software
19 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
20 */
21
22 /**
23 * @file
24 * PSX STR file demuxer
25 * by Mike Melanson (melanson@pcisys.net)
26 * This module handles streams that have been ripped from Sony Playstation
27 * CD games. This demuxer can handle either raw STR files (which are just
28 * concatenations of raw compact disc sectors) or STR files with 0x2C-byte
29 * RIFF headers, followed by CD sectors.
30 */
31
37
38 #define RIFF_TAG MKTAG('R', 'I', 'F', 'F')
39 #define CDXA_TAG MKTAG('C', 'D', 'X', 'A')
40
41 #define RAW_CD_SECTOR_SIZE 2352
42 #define RAW_CD_SECTOR_DATA_SIZE 2304
43 #define VIDEO_DATA_CHUNK_SIZE 0x7E0
44 #define VIDEO_DATA_HEADER_SIZE 0x38
45 #define RIFF_HEADER_SIZE 0x2C
46
47 #define CDXA_TYPE_MASK 0x0E
48 #define CDXA_TYPE_DATA 0x08
49 #define CDXA_TYPE_AUDIO 0x04
50 #define CDXA_TYPE_VIDEO 0x02
51
52 #define STR_MAGIC (0x80010160)
53
55 /* video parameters */
58
59 /* audio parameters */
62
64
65 /* a STR file can contain up to 32 channels of data */
68
69 static const uint8_t sync_header[12] = {0x00,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0x00};
70
72 {
75 int aud=0, vid=0;
76
78 return 0;
79
82
83 /* RIFF header seen; skip 0x2C bytes */
85 }
86
88 /* look for CD sync header (00, 0xFF x 10, 00) */
90 return 0;
91
92 if (sector[0x11] >= 32)
93 return 0;
94
98 int current_sector =
AV_RL16(§or[0x1C]);
99 int sector_count =
AV_RL16(§or[0x1E]);
101
102 if(!( frame_size>=0
103 && current_sector < sector_count
105 return 0;
106 }
107
108 /*st->codec->width = AV_RL16(§or[0x28]);
109 st->codec->height = AV_RL16(§or[0x2A]);*/
110
111 // if (current_sector == sector_count-1) {
112 vid++;
113 // }
114
115 }
116 break;
118 if(sector[0x13]&0x2A)
119 return 0;
120 aud++;
121 break;
122 default:
123 if(sector[0x12] & CDXA_TYPE_MASK)
124 return 0;
125 }
127 }
128 /* MPEG files (like those ripped from VCDs) can also look like this;
129 * only return half certainty */
131 else if(vid+aud) return 1;
132 else return 0;
133 }
134
136 {
141 int i;
142
143 /* skip over any RIFF header */
148 else
149 start = 0;
150
152
153 for(i=0; i<32; i++){
156 }
157
159
160 return 0;
161 }
162
165 {
169 int channel;
172
173 while (1) {
174
177
178 channel = sector[0x11];
179 if (channel >= 32)
181
183
186 {
187
188 int current_sector =
AV_RL16(§or[0x1C]);
189 int sector_count =
AV_RL16(§or[0x1E]);
191
192 if(!( frame_size>=0
193 && current_sector < sector_count
195 av_log(s,
AV_LOG_ERROR,
"Invalid parameters %d %d %d\n", current_sector, sector_count, frame_size);
196 break;
197 }
198
200 /* allocate a new AVStream */
202 if (!st)
205
207
213 }
214
215 /* if this is the first sector of the frame, allocate a pkt */
217
224
228 }
229
230 memcpy(pkt->
data + current_sector*VIDEO_DATA_CHUNK_SIZE,
232 VIDEO_DATA_CHUNK_SIZE);
233
234 if (current_sector == sector_count-1) {
240 #if FF_API_DESTRUCT_PACKET
242 pkt->destruct = NULL;
244 #endif
245 return 0;
246 }
247
248 }
249 break;
250
253 int fmt = sector[0x13];
254 /* allocate a new AVStream */
256 if (!st)
258
260
264 if (fmt & 1) {
267 } else {
270 }
272 // st->codec->bit_rate = 0; //FIXME;
274
278 }
279 pkt = ret_pkt;
282 memcpy(pkt->
data,sector+24,2304);
283
287 return 0;
288 default:
290 /* drop the sector and move on */
291 break;
292 }
293
296 }
297 }
298
300 {
302 int i;
303 for(i=0; i<32; i++){
306 }
307
308 return 0;
309 }
310
320 };