annotate psxstr.c @ 5910:536e5527c1e0 libavformat

Define AVMediaType enum, and use it instead of enum CodecType, which is deprecated and will be dropped at the next major bump.
author stefano
date Tue, 30 Mar 2010 23:30:55 +0000
parents 49c1d3b27727
children 178de7695c6c
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
209
7414bbf64011 first pass at PSX STR demuxer; does not yet interact correctly with MDEC
tmmm
parents:
diff changeset
1 /*
7414bbf64011 first pass at PSX STR demuxer; does not yet interact correctly with MDEC
tmmm
parents:
diff changeset
2 * Sony Playstation (PSX) STR File Demuxer
7414bbf64011 first pass at PSX STR demuxer; does not yet interact correctly with MDEC
tmmm
parents:
diff changeset
3 * Copyright (c) 2003 The ffmpeg Project
7414bbf64011 first pass at PSX STR demuxer; does not yet interact correctly with MDEC
tmmm
parents:
diff changeset
4 *
1358
0899bfe4105c Change license headers to say 'FFmpeg' instead of 'this program/this library'
diego
parents: 1242
diff changeset
5 * This file is part of FFmpeg.
0899bfe4105c Change license headers to say 'FFmpeg' instead of 'this program/this library'
diego
parents: 1242
diff changeset
6 *
0899bfe4105c Change license headers to say 'FFmpeg' instead of 'this program/this library'
diego
parents: 1242
diff changeset
7 * FFmpeg is free software; you can redistribute it and/or
209
7414bbf64011 first pass at PSX STR demuxer; does not yet interact correctly with MDEC
tmmm
parents:
diff changeset
8 * modify it under the terms of the GNU Lesser General Public
7414bbf64011 first pass at PSX STR demuxer; does not yet interact correctly with MDEC
tmmm
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: 1242
diff changeset
10 * version 2.1 of the License, or (at your option) any later version.
209
7414bbf64011 first pass at PSX STR demuxer; does not yet interact correctly with MDEC
tmmm
parents:
diff changeset
11 *
1358
0899bfe4105c Change license headers to say 'FFmpeg' instead of 'this program/this library'
diego
parents: 1242
diff changeset
12 * FFmpeg is distributed in the hope that it will be useful,
209
7414bbf64011 first pass at PSX STR demuxer; does not yet interact correctly with MDEC
tmmm
parents:
diff changeset
13 * but WITHOUT ANY WARRANTY; without even the implied warranty of
7414bbf64011 first pass at PSX STR demuxer; does not yet interact correctly with MDEC
tmmm
parents:
diff changeset
14 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
7414bbf64011 first pass at PSX STR demuxer; does not yet interact correctly with MDEC
tmmm
parents:
diff changeset
15 * Lesser General Public License for more details.
7414bbf64011 first pass at PSX STR demuxer; does not yet interact correctly with MDEC
tmmm
parents:
diff changeset
16 *
7414bbf64011 first pass at PSX STR demuxer; does not yet interact correctly with MDEC
tmmm
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: 1242
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: 885
diff changeset
19 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
209
7414bbf64011 first pass at PSX STR demuxer; does not yet interact correctly with MDEC
tmmm
parents:
diff changeset
20 */
7414bbf64011 first pass at PSX STR demuxer; does not yet interact correctly with MDEC
tmmm
parents:
diff changeset
21
7414bbf64011 first pass at PSX STR demuxer; does not yet interact correctly with MDEC
tmmm
parents:
diff changeset
22 /**
4331
49c1d3b27727 Use full internal pathname in doxygen @file directives.
diego
parents: 4201
diff changeset
23 * @file libavformat/psxstr.c
209
7414bbf64011 first pass at PSX STR demuxer; does not yet interact correctly with MDEC
tmmm
parents:
diff changeset
24 * PSX STR file demuxer
7414bbf64011 first pass at PSX STR demuxer; does not yet interact correctly with MDEC
tmmm
parents:
diff changeset
25 * by Mike Melanson (melanson@pcisys.net)
7414bbf64011 first pass at PSX STR demuxer; does not yet interact correctly with MDEC
tmmm
parents:
diff changeset
26 * This module handles streams that have been ripped from Sony Playstation
7414bbf64011 first pass at PSX STR demuxer; does not yet interact correctly with MDEC
tmmm
parents:
diff changeset
27 * CD games. This demuxer can handle either raw STR files (which are just
7414bbf64011 first pass at PSX STR demuxer; does not yet interact correctly with MDEC
tmmm
parents:
diff changeset
28 * concatenations of raw compact disc sectors) or STR files with 0x2C-byte
7414bbf64011 first pass at PSX STR demuxer; does not yet interact correctly with MDEC
tmmm
parents:
diff changeset
29 * RIFF headers, followed by CD sectors.
7414bbf64011 first pass at PSX STR demuxer; does not yet interact correctly with MDEC
tmmm
parents:
diff changeset
30 */
7414bbf64011 first pass at PSX STR demuxer; does not yet interact correctly with MDEC
tmmm
parents:
diff changeset
31
4201
7d2f3f1b68d8 Fix build: Add intreadwrite.h and bswap.h #includes where necessary.
diego
parents: 3563
diff changeset
32 #include "libavutil/intreadwrite.h"
209
7414bbf64011 first pass at PSX STR demuxer; does not yet interact correctly with MDEC
tmmm
parents:
diff changeset
33 #include "avformat.h"
7414bbf64011 first pass at PSX STR demuxer; does not yet interact correctly with MDEC
tmmm
parents:
diff changeset
34
386
c152849ee643 remove numerous definitions of BE_*/LE_* macros; convert FOURCC_TAG ->
melanson
parents: 370
diff changeset
35 #define RIFF_TAG MKTAG('R', 'I', 'F', 'F')
c152849ee643 remove numerous definitions of BE_*/LE_* macros; convert FOURCC_TAG ->
melanson
parents: 370
diff changeset
36 #define CDXA_TAG MKTAG('C', 'D', 'X', 'A')
209
7414bbf64011 first pass at PSX STR demuxer; does not yet interact correctly with MDEC
tmmm
parents:
diff changeset
37
3514
616ffabfbb5b vertical align
michael
parents: 3513
diff changeset
38 #define RAW_CD_SECTOR_SIZE 2352
209
7414bbf64011 first pass at PSX STR demuxer; does not yet interact correctly with MDEC
tmmm
parents:
diff changeset
39 #define RAW_CD_SECTOR_DATA_SIZE 2304
3514
616ffabfbb5b vertical align
michael
parents: 3513
diff changeset
40 #define VIDEO_DATA_CHUNK_SIZE 0x7E0
616ffabfbb5b vertical align
michael
parents: 3513
diff changeset
41 #define VIDEO_DATA_HEADER_SIZE 0x38
616ffabfbb5b vertical align
michael
parents: 3513
diff changeset
42 #define RIFF_HEADER_SIZE 0x2C
209
7414bbf64011 first pass at PSX STR demuxer; does not yet interact correctly with MDEC
tmmm
parents:
diff changeset
43
7414bbf64011 first pass at PSX STR demuxer; does not yet interact correctly with MDEC
tmmm
parents:
diff changeset
44 #define CDXA_TYPE_MASK 0x0E
7414bbf64011 first pass at PSX STR demuxer; does not yet interact correctly with MDEC
tmmm
parents:
diff changeset
45 #define CDXA_TYPE_DATA 0x08
7414bbf64011 first pass at PSX STR demuxer; does not yet interact correctly with MDEC
tmmm
parents:
diff changeset
46 #define CDXA_TYPE_AUDIO 0x04
7414bbf64011 first pass at PSX STR demuxer; does not yet interact correctly with MDEC
tmmm
parents:
diff changeset
47 #define CDXA_TYPE_VIDEO 0x02
7414bbf64011 first pass at PSX STR demuxer; does not yet interact correctly with MDEC
tmmm
parents:
diff changeset
48
7414bbf64011 first pass at PSX STR demuxer; does not yet interact correctly with MDEC
tmmm
parents:
diff changeset
49 #define STR_MAGIC (0x80010160)
7414bbf64011 first pass at PSX STR demuxer; does not yet interact correctly with MDEC
tmmm
parents:
diff changeset
50
7414bbf64011 first pass at PSX STR demuxer; does not yet interact correctly with MDEC
tmmm
parents:
diff changeset
51 typedef struct StrChannel {
7414bbf64011 first pass at PSX STR demuxer; does not yet interact correctly with MDEC
tmmm
parents:
diff changeset
52 /* video parameters */
7414bbf64011 first pass at PSX STR demuxer; does not yet interact correctly with MDEC
tmmm
parents:
diff changeset
53 int video_stream_index;
3515
4f78b4688afc remove code that discards streams randomly
michael
parents: 3514
diff changeset
54 AVPacket tmp_pkt;
209
7414bbf64011 first pass at PSX STR demuxer; does not yet interact correctly with MDEC
tmmm
parents:
diff changeset
55
7414bbf64011 first pass at PSX STR demuxer; does not yet interact correctly with MDEC
tmmm
parents:
diff changeset
56 /* audio parameters */
7414bbf64011 first pass at PSX STR demuxer; does not yet interact correctly with MDEC
tmmm
parents:
diff changeset
57 int audio_stream_index;
7414bbf64011 first pass at PSX STR demuxer; does not yet interact correctly with MDEC
tmmm
parents:
diff changeset
58 } StrChannel;
7414bbf64011 first pass at PSX STR demuxer; does not yet interact correctly with MDEC
tmmm
parents:
diff changeset
59
7414bbf64011 first pass at PSX STR demuxer; does not yet interact correctly with MDEC
tmmm
parents:
diff changeset
60 typedef struct StrDemuxContext {
7414bbf64011 first pass at PSX STR demuxer; does not yet interact correctly with MDEC
tmmm
parents:
diff changeset
61
7414bbf64011 first pass at PSX STR demuxer; does not yet interact correctly with MDEC
tmmm
parents:
diff changeset
62 /* a STR file can contain up to 32 channels of data */
7414bbf64011 first pass at PSX STR demuxer; does not yet interact correctly with MDEC
tmmm
parents:
diff changeset
63 StrChannel channels[32];
7414bbf64011 first pass at PSX STR demuxer; does not yet interact correctly with MDEC
tmmm
parents:
diff changeset
64 } StrDemuxContext;
7414bbf64011 first pass at PSX STR demuxer; does not yet interact correctly with MDEC
tmmm
parents:
diff changeset
65
1242
996ce2a68147 Fix some "'static' is not at beginning of declaration" warnings.
diego
parents: 1169
diff changeset
66 static const char sync_header[12] = {0x00,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0x00};
281
ee009afcc2a1 hook up the XA ADPCM decoder
melanson
parents: 209
diff changeset
67
209
7414bbf64011 first pass at PSX STR demuxer; does not yet interact correctly with MDEC
tmmm
parents:
diff changeset
68 static int str_probe(AVProbeData *p)
7414bbf64011 first pass at PSX STR demuxer; does not yet interact correctly with MDEC
tmmm
parents:
diff changeset
69 {
3563
82f150c809c6 simplify
michael
parents: 3562
diff changeset
70 uint8_t *sector= p->buf;
209
7414bbf64011 first pass at PSX STR demuxer; does not yet interact correctly with MDEC
tmmm
parents:
diff changeset
71
3562
44699ecd5f6f Fix misdetection of MPEG-PS (AVSEQ03.DAT and AVSEQ06.DAT) as psxstr.
michael
parents: 3523
diff changeset
72 if (p->buf_size < RAW_CD_SECTOR_SIZE)
209
7414bbf64011 first pass at PSX STR demuxer; does not yet interact correctly with MDEC
tmmm
parents:
diff changeset
73 return 0;
7414bbf64011 first pass at PSX STR demuxer; does not yet interact correctly with MDEC
tmmm
parents:
diff changeset
74
1673
a782462e2497 rename BE/LE_8/16/32 to AV_RL/B_8/16/32
alex
parents: 1358
diff changeset
75 if ((AV_RL32(&p->buf[0]) == RIFF_TAG) &&
a782462e2497 rename BE/LE_8/16/32 to AV_RL/B_8/16/32
alex
parents: 1358
diff changeset
76 (AV_RL32(&p->buf[8]) == CDXA_TAG)) {
209
7414bbf64011 first pass at PSX STR demuxer; does not yet interact correctly with MDEC
tmmm
parents:
diff changeset
77
7414bbf64011 first pass at PSX STR demuxer; does not yet interact correctly with MDEC
tmmm
parents:
diff changeset
78 /* RIFF header seen; skip 0x2C bytes */
3563
82f150c809c6 simplify
michael
parents: 3562
diff changeset
79 sector += RIFF_HEADER_SIZE;
82f150c809c6 simplify
michael
parents: 3562
diff changeset
80 }
3562
44699ecd5f6f Fix misdetection of MPEG-PS (AVSEQ03.DAT and AVSEQ06.DAT) as psxstr.
michael
parents: 3523
diff changeset
81
209
7414bbf64011 first pass at PSX STR demuxer; does not yet interact correctly with MDEC
tmmm
parents:
diff changeset
82 /* look for CD sync header (00, 0xFF x 10, 00) */
3563
82f150c809c6 simplify
michael
parents: 3562
diff changeset
83 if (memcmp(sector,sync_header,sizeof(sync_header)))
209
7414bbf64011 first pass at PSX STR demuxer; does not yet interact correctly with MDEC
tmmm
parents:
diff changeset
84 return 0;
7414bbf64011 first pass at PSX STR demuxer; does not yet interact correctly with MDEC
tmmm
parents:
diff changeset
85
3562
44699ecd5f6f Fix misdetection of MPEG-PS (AVSEQ03.DAT and AVSEQ06.DAT) as psxstr.
michael
parents: 3523
diff changeset
86 if(sector[0x11] >= 32)
44699ecd5f6f Fix misdetection of MPEG-PS (AVSEQ03.DAT and AVSEQ06.DAT) as psxstr.
michael
parents: 3523
diff changeset
87 return 0;
44699ecd5f6f Fix misdetection of MPEG-PS (AVSEQ03.DAT and AVSEQ06.DAT) as psxstr.
michael
parents: 3523
diff changeset
88 if( (sector[0x12] & CDXA_TYPE_MASK) != CDXA_TYPE_VIDEO
44699ecd5f6f Fix misdetection of MPEG-PS (AVSEQ03.DAT and AVSEQ06.DAT) as psxstr.
michael
parents: 3523
diff changeset
89 && (sector[0x12] & CDXA_TYPE_MASK) != CDXA_TYPE_AUDIO
44699ecd5f6f Fix misdetection of MPEG-PS (AVSEQ03.DAT and AVSEQ06.DAT) as psxstr.
michael
parents: 3523
diff changeset
90 && (sector[0x12] & CDXA_TYPE_MASK) != CDXA_TYPE_DATA)
44699ecd5f6f Fix misdetection of MPEG-PS (AVSEQ03.DAT and AVSEQ06.DAT) as psxstr.
michael
parents: 3523
diff changeset
91 return 0;
44699ecd5f6f Fix misdetection of MPEG-PS (AVSEQ03.DAT and AVSEQ06.DAT) as psxstr.
michael
parents: 3523
diff changeset
92
209
7414bbf64011 first pass at PSX STR demuxer; does not yet interact correctly with MDEC
tmmm
parents:
diff changeset
93 /* MPEG files (like those ripped from VCDs) can also look like this;
7414bbf64011 first pass at PSX STR demuxer; does not yet interact correctly with MDEC
tmmm
parents:
diff changeset
94 * only return half certainty */
7414bbf64011 first pass at PSX STR demuxer; does not yet interact correctly with MDEC
tmmm
parents:
diff changeset
95 return 50;
7414bbf64011 first pass at PSX STR demuxer; does not yet interact correctly with MDEC
tmmm
parents:
diff changeset
96 }
7414bbf64011 first pass at PSX STR demuxer; does not yet interact correctly with MDEC
tmmm
parents:
diff changeset
97
7414bbf64011 first pass at PSX STR demuxer; does not yet interact correctly with MDEC
tmmm
parents:
diff changeset
98 static int str_read_header(AVFormatContext *s,
7414bbf64011 first pass at PSX STR demuxer; does not yet interact correctly with MDEC
tmmm
parents:
diff changeset
99 AVFormatParameters *ap)
7414bbf64011 first pass at PSX STR demuxer; does not yet interact correctly with MDEC
tmmm
parents:
diff changeset
100 {
2771
d52c718e83f9 Use dynamically allocated ByteIOContext in AVFormatContext
andoma
parents: 2274
diff changeset
101 ByteIOContext *pb = s->pb;
2006
2f0154760e5f Get rid of unnecessary pointer casts.
diego
parents: 1673
diff changeset
102 StrDemuxContext *str = s->priv_data;
209
7414bbf64011 first pass at PSX STR demuxer; does not yet interact correctly with MDEC
tmmm
parents:
diff changeset
103 unsigned char sector[RAW_CD_SECTOR_SIZE];
7414bbf64011 first pass at PSX STR demuxer; does not yet interact correctly with MDEC
tmmm
parents:
diff changeset
104 int start;
7414bbf64011 first pass at PSX STR demuxer; does not yet interact correctly with MDEC
tmmm
parents:
diff changeset
105 int i;
7414bbf64011 first pass at PSX STR demuxer; does not yet interact correctly with MDEC
tmmm
parents:
diff changeset
106
7414bbf64011 first pass at PSX STR demuxer; does not yet interact correctly with MDEC
tmmm
parents:
diff changeset
107 /* skip over any RIFF header */
7414bbf64011 first pass at PSX STR demuxer; does not yet interact correctly with MDEC
tmmm
parents:
diff changeset
108 if (get_buffer(pb, sector, RIFF_HEADER_SIZE) != RIFF_HEADER_SIZE)
2274
b21c2af60bc9 Replace all occurrences of AVERROR_IO with AVERROR(EIO).
takis
parents: 2273
diff changeset
109 return AVERROR(EIO);
1673
a782462e2497 rename BE/LE_8/16/32 to AV_RL/B_8/16/32
alex
parents: 1358
diff changeset
110 if (AV_RL32(&sector[0]) == RIFF_TAG)
209
7414bbf64011 first pass at PSX STR demuxer; does not yet interact correctly with MDEC
tmmm
parents:
diff changeset
111 start = RIFF_HEADER_SIZE;
7414bbf64011 first pass at PSX STR demuxer; does not yet interact correctly with MDEC
tmmm
parents:
diff changeset
112 else
7414bbf64011 first pass at PSX STR demuxer; does not yet interact correctly with MDEC
tmmm
parents:
diff changeset
113 start = 0;
7414bbf64011 first pass at PSX STR demuxer; does not yet interact correctly with MDEC
tmmm
parents:
diff changeset
114
7414bbf64011 first pass at PSX STR demuxer; does not yet interact correctly with MDEC
tmmm
parents:
diff changeset
115 url_fseek(pb, start, SEEK_SET);
7414bbf64011 first pass at PSX STR demuxer; does not yet interact correctly with MDEC
tmmm
parents:
diff changeset
116
3515
4f78b4688afc remove code that discards streams randomly
michael
parents: 3514
diff changeset
117 for(i=0; i<32; i++){
4f78b4688afc remove code that discards streams randomly
michael
parents: 3514
diff changeset
118 str->channels[i].video_stream_index=
4f78b4688afc remove code that discards streams randomly
michael
parents: 3514
diff changeset
119 str->channels[i].audio_stream_index= -1;
4f78b4688afc remove code that discards streams randomly
michael
parents: 3514
diff changeset
120 }
4f78b4688afc remove code that discards streams randomly
michael
parents: 3514
diff changeset
121
3518
0a83cbe75b0b Get rid of weird pre reading code.
michael
parents: 3517
diff changeset
122 s->ctx_flags |= AVFMTCTX_NOHEADER;
209
7414bbf64011 first pass at PSX STR demuxer; does not yet interact correctly with MDEC
tmmm
parents:
diff changeset
123
7414bbf64011 first pass at PSX STR demuxer; does not yet interact correctly with MDEC
tmmm
parents:
diff changeset
124 return 0;
7414bbf64011 first pass at PSX STR demuxer; does not yet interact correctly with MDEC
tmmm
parents:
diff changeset
125 }
7414bbf64011 first pass at PSX STR demuxer; does not yet interact correctly with MDEC
tmmm
parents:
diff changeset
126
7414bbf64011 first pass at PSX STR demuxer; does not yet interact correctly with MDEC
tmmm
parents:
diff changeset
127 static int str_read_packet(AVFormatContext *s,
281
ee009afcc2a1 hook up the XA ADPCM decoder
melanson
parents: 209
diff changeset
128 AVPacket *ret_pkt)
209
7414bbf64011 first pass at PSX STR demuxer; does not yet interact correctly with MDEC
tmmm
parents:
diff changeset
129 {
2771
d52c718e83f9 Use dynamically allocated ByteIOContext in AVFormatContext
andoma
parents: 2274
diff changeset
130 ByteIOContext *pb = s->pb;
2006
2f0154760e5f Get rid of unnecessary pointer casts.
diego
parents: 1673
diff changeset
131 StrDemuxContext *str = s->priv_data;
209
7414bbf64011 first pass at PSX STR demuxer; does not yet interact correctly with MDEC
tmmm
parents:
diff changeset
132 unsigned char sector[RAW_CD_SECTOR_SIZE];
7414bbf64011 first pass at PSX STR demuxer; does not yet interact correctly with MDEC
tmmm
parents:
diff changeset
133 int channel;
281
ee009afcc2a1 hook up the XA ADPCM decoder
melanson
parents: 209
diff changeset
134 AVPacket *pkt;
3518
0a83cbe75b0b Get rid of weird pre reading code.
michael
parents: 3517
diff changeset
135 AVStream *st;
209
7414bbf64011 first pass at PSX STR demuxer; does not yet interact correctly with MDEC
tmmm
parents:
diff changeset
136
3390
771ab1d4fd6e Removing dead code, fixes CID4 RUN2.
michael
parents: 2771
diff changeset
137 while (1) {
209
7414bbf64011 first pass at PSX STR demuxer; does not yet interact correctly with MDEC
tmmm
parents:
diff changeset
138
7414bbf64011 first pass at PSX STR demuxer; does not yet interact correctly with MDEC
tmmm
parents:
diff changeset
139 if (get_buffer(pb, sector, RAW_CD_SECTOR_SIZE) != RAW_CD_SECTOR_SIZE)
2274
b21c2af60bc9 Replace all occurrences of AVERROR_IO with AVERROR(EIO).
takis
parents: 2273
diff changeset
140 return AVERROR(EIO);
209
7414bbf64011 first pass at PSX STR demuxer; does not yet interact correctly with MDEC
tmmm
parents:
diff changeset
141
7414bbf64011 first pass at PSX STR demuxer; does not yet interact correctly with MDEC
tmmm
parents:
diff changeset
142 channel = sector[0x11];
7414bbf64011 first pass at PSX STR demuxer; does not yet interact correctly with MDEC
tmmm
parents:
diff changeset
143 if (channel >= 32)
7414bbf64011 first pass at PSX STR demuxer; does not yet interact correctly with MDEC
tmmm
parents:
diff changeset
144 return AVERROR_INVALIDDATA;
7414bbf64011 first pass at PSX STR demuxer; does not yet interact correctly with MDEC
tmmm
parents:
diff changeset
145
7414bbf64011 first pass at PSX STR demuxer; does not yet interact correctly with MDEC
tmmm
parents:
diff changeset
146 switch (sector[0x12] & CDXA_TYPE_MASK) {
7414bbf64011 first pass at PSX STR demuxer; does not yet interact correctly with MDEC
tmmm
parents:
diff changeset
147
7414bbf64011 first pass at PSX STR demuxer; does not yet interact correctly with MDEC
tmmm
parents:
diff changeset
148 case CDXA_TYPE_DATA:
7414bbf64011 first pass at PSX STR demuxer; does not yet interact correctly with MDEC
tmmm
parents:
diff changeset
149 case CDXA_TYPE_VIDEO:
3515
4f78b4688afc remove code that discards streams randomly
michael
parents: 3514
diff changeset
150 {
209
7414bbf64011 first pass at PSX STR demuxer; does not yet interact correctly with MDEC
tmmm
parents:
diff changeset
151
1673
a782462e2497 rename BE/LE_8/16/32 to AV_RL/B_8/16/32
alex
parents: 1358
diff changeset
152 int current_sector = AV_RL16(&sector[0x1C]);
a782462e2497 rename BE/LE_8/16/32 to AV_RL/B_8/16/32
alex
parents: 1358
diff changeset
153 int sector_count = AV_RL16(&sector[0x1E]);
a782462e2497 rename BE/LE_8/16/32 to AV_RL/B_8/16/32
alex
parents: 1358
diff changeset
154 int frame_size = AV_RL32(&sector[0x24]);
3511
34a5e6f576fd Fix exploitable code.
michael
parents: 3424
diff changeset
155
34a5e6f576fd Fix exploitable code.
michael
parents: 3424
diff changeset
156 if(!( frame_size>=0
34a5e6f576fd Fix exploitable code.
michael
parents: 3424
diff changeset
157 && current_sector < sector_count
34a5e6f576fd Fix exploitable code.
michael
parents: 3424
diff changeset
158 && sector_count*VIDEO_DATA_CHUNK_SIZE >=frame_size)){
34a5e6f576fd Fix exploitable code.
michael
parents: 3424
diff changeset
159 av_log(s, AV_LOG_ERROR, "Invalid parameters %d %d %d\n", current_sector, sector_count, frame_size);
3520
2b1a7c3650c4 Do not completely bail out for invalid params, just skip the current sector.
michael
parents: 3519
diff changeset
160 break;
3511
34a5e6f576fd Fix exploitable code.
michael
parents: 3424
diff changeset
161 }
34a5e6f576fd Fix exploitable code.
michael
parents: 3424
diff changeset
162
3518
0a83cbe75b0b Get rid of weird pre reading code.
michael
parents: 3517
diff changeset
163 if(str->channels[channel].video_stream_index < 0){
0a83cbe75b0b Get rid of weird pre reading code.
michael
parents: 3517
diff changeset
164 /* allocate a new AVStream */
0a83cbe75b0b Get rid of weird pre reading code.
michael
parents: 3517
diff changeset
165 st = av_new_stream(s, 0);
0a83cbe75b0b Get rid of weird pre reading code.
michael
parents: 3517
diff changeset
166 if (!st)
0a83cbe75b0b Get rid of weird pre reading code.
michael
parents: 3517
diff changeset
167 return AVERROR(ENOMEM);
0a83cbe75b0b Get rid of weird pre reading code.
michael
parents: 3517
diff changeset
168 av_set_pts_info(st, 64, 1, 15);
0a83cbe75b0b Get rid of weird pre reading code.
michael
parents: 3517
diff changeset
169
0a83cbe75b0b Get rid of weird pre reading code.
michael
parents: 3517
diff changeset
170 str->channels[channel].video_stream_index = st->index;
0a83cbe75b0b Get rid of weird pre reading code.
michael
parents: 3517
diff changeset
171
5910
536e5527c1e0 Define AVMediaType enum, and use it instead of enum CodecType, which
stefano
parents: 4331
diff changeset
172 st->codec->codec_type = AVMEDIA_TYPE_VIDEO;
3518
0a83cbe75b0b Get rid of weird pre reading code.
michael
parents: 3517
diff changeset
173 st->codec->codec_id = CODEC_ID_MDEC;
0a83cbe75b0b Get rid of weird pre reading code.
michael
parents: 3517
diff changeset
174 st->codec->codec_tag = 0; /* no fourcc */
0a83cbe75b0b Get rid of weird pre reading code.
michael
parents: 3517
diff changeset
175 st->codec->width = AV_RL16(&sector[0x28]);
0a83cbe75b0b Get rid of weird pre reading code.
michael
parents: 3517
diff changeset
176 st->codec->height = AV_RL16(&sector[0x2A]);
0a83cbe75b0b Get rid of weird pre reading code.
michael
parents: 3517
diff changeset
177 }
0a83cbe75b0b Get rid of weird pre reading code.
michael
parents: 3517
diff changeset
178
209
7414bbf64011 first pass at PSX STR demuxer; does not yet interact correctly with MDEC
tmmm
parents:
diff changeset
179 /* if this is the first sector of the frame, allocate a pkt */
3515
4f78b4688afc remove code that discards streams randomly
michael
parents: 3514
diff changeset
180 pkt = &str->channels[channel].tmp_pkt;
3511
34a5e6f576fd Fix exploitable code.
michael
parents: 3424
diff changeset
181
34a5e6f576fd Fix exploitable code.
michael
parents: 3424
diff changeset
182 if(pkt->size != sector_count*VIDEO_DATA_CHUNK_SIZE){
34a5e6f576fd Fix exploitable code.
michael
parents: 3424
diff changeset
183 if(pkt->data)
34a5e6f576fd Fix exploitable code.
michael
parents: 3424
diff changeset
184 av_log(s, AV_LOG_ERROR, "missmatching sector_count\n");
34a5e6f576fd Fix exploitable code.
michael
parents: 3424
diff changeset
185 av_free_packet(pkt);
34a5e6f576fd Fix exploitable code.
michael
parents: 3424
diff changeset
186 if (av_new_packet(pkt, sector_count*VIDEO_DATA_CHUNK_SIZE))
2274
b21c2af60bc9 Replace all occurrences of AVERROR_IO with AVERROR(EIO).
takis
parents: 2273
diff changeset
187 return AVERROR(EIO);
209
7414bbf64011 first pass at PSX STR demuxer; does not yet interact correctly with MDEC
tmmm
parents:
diff changeset
188
775
c5077fdab490 AVPacket.pos
michael
parents: 683
diff changeset
189 pkt->pos= url_ftell(pb) - RAW_CD_SECTOR_SIZE;
885
da1d5db0ce5c COSMETICS: Remove all trailing whitespace.
diego
parents: 837
diff changeset
190 pkt->stream_index =
209
7414bbf64011 first pass at PSX STR demuxer; does not yet interact correctly with MDEC
tmmm
parents:
diff changeset
191 str->channels[channel].video_stream_index;
7414bbf64011 first pass at PSX STR demuxer; does not yet interact correctly with MDEC
tmmm
parents:
diff changeset
192 }
7414bbf64011 first pass at PSX STR demuxer; does not yet interact correctly with MDEC
tmmm
parents:
diff changeset
193
3511
34a5e6f576fd Fix exploitable code.
michael
parents: 3424
diff changeset
194 memcpy(pkt->data + current_sector*VIDEO_DATA_CHUNK_SIZE,
34a5e6f576fd Fix exploitable code.
michael
parents: 3424
diff changeset
195 sector + VIDEO_DATA_HEADER_SIZE,
34a5e6f576fd Fix exploitable code.
michael
parents: 3424
diff changeset
196 VIDEO_DATA_CHUNK_SIZE);
34a5e6f576fd Fix exploitable code.
michael
parents: 3424
diff changeset
197
281
ee009afcc2a1 hook up the XA ADPCM decoder
melanson
parents: 209
diff changeset
198 if (current_sector == sector_count-1) {
3511
34a5e6f576fd Fix exploitable code.
michael
parents: 3424
diff changeset
199 pkt->size= frame_size;
281
ee009afcc2a1 hook up the XA ADPCM decoder
melanson
parents: 209
diff changeset
200 *ret_pkt = *pkt;
3511
34a5e6f576fd Fix exploitable code.
michael
parents: 3424
diff changeset
201 pkt->data= NULL;
34a5e6f576fd Fix exploitable code.
michael
parents: 3424
diff changeset
202 pkt->size= -1;
281
ee009afcc2a1 hook up the XA ADPCM decoder
melanson
parents: 209
diff changeset
203 return 0;
ee009afcc2a1 hook up the XA ADPCM decoder
melanson
parents: 209
diff changeset
204 }
209
7414bbf64011 first pass at PSX STR demuxer; does not yet interact correctly with MDEC
tmmm
parents:
diff changeset
205
7414bbf64011 first pass at PSX STR demuxer; does not yet interact correctly with MDEC
tmmm
parents:
diff changeset
206 }
7414bbf64011 first pass at PSX STR demuxer; does not yet interact correctly with MDEC
tmmm
parents:
diff changeset
207 break;
7414bbf64011 first pass at PSX STR demuxer; does not yet interact correctly with MDEC
tmmm
parents:
diff changeset
208
7414bbf64011 first pass at PSX STR demuxer; does not yet interact correctly with MDEC
tmmm
parents:
diff changeset
209 case CDXA_TYPE_AUDIO:
3518
0a83cbe75b0b Get rid of weird pre reading code.
michael
parents: 3517
diff changeset
210 if(str->channels[channel].audio_stream_index < 0){
3519
55545ebc90eb merge decl & init
michael
parents: 3518
diff changeset
211 int fmt = sector[0x13];
3518
0a83cbe75b0b Get rid of weird pre reading code.
michael
parents: 3517
diff changeset
212 /* allocate a new AVStream */
0a83cbe75b0b Get rid of weird pre reading code.
michael
parents: 3517
diff changeset
213 st = av_new_stream(s, 0);
0a83cbe75b0b Get rid of weird pre reading code.
michael
parents: 3517
diff changeset
214 if (!st)
0a83cbe75b0b Get rid of weird pre reading code.
michael
parents: 3517
diff changeset
215 return AVERROR(ENOMEM);
0a83cbe75b0b Get rid of weird pre reading code.
michael
parents: 3517
diff changeset
216
0a83cbe75b0b Get rid of weird pre reading code.
michael
parents: 3517
diff changeset
217 str->channels[channel].audio_stream_index = st->index;
0a83cbe75b0b Get rid of weird pre reading code.
michael
parents: 3517
diff changeset
218
5910
536e5527c1e0 Define AVMediaType enum, and use it instead of enum CodecType, which
stefano
parents: 4331
diff changeset
219 st->codec->codec_type = AVMEDIA_TYPE_AUDIO;
3518
0a83cbe75b0b Get rid of weird pre reading code.
michael
parents: 3517
diff changeset
220 st->codec->codec_id = CODEC_ID_ADPCM_XA;
0a83cbe75b0b Get rid of weird pre reading code.
michael
parents: 3517
diff changeset
221 st->codec->codec_tag = 0; /* no fourcc */
0a83cbe75b0b Get rid of weird pre reading code.
michael
parents: 3517
diff changeset
222 st->codec->channels = (fmt&1)?2:1;
0a83cbe75b0b Get rid of weird pre reading code.
michael
parents: 3517
diff changeset
223 st->codec->sample_rate = (fmt&4)?18900:37800;
0a83cbe75b0b Get rid of weird pre reading code.
michael
parents: 3517
diff changeset
224 // st->codec->bit_rate = 0; //FIXME;
0a83cbe75b0b Get rid of weird pre reading code.
michael
parents: 3517
diff changeset
225 st->codec->block_align = 128;
0a83cbe75b0b Get rid of weird pre reading code.
michael
parents: 3517
diff changeset
226
0a83cbe75b0b Get rid of weird pre reading code.
michael
parents: 3517
diff changeset
227 av_set_pts_info(st, 64, 128, st->codec->sample_rate);
0a83cbe75b0b Get rid of weird pre reading code.
michael
parents: 3517
diff changeset
228 }
3523
michael
parents: 3522
diff changeset
229 pkt = ret_pkt;
michael
parents: 3522
diff changeset
230 if (av_new_packet(pkt, 2304))
michael
parents: 3522
diff changeset
231 return AVERROR(EIO);
michael
parents: 3522
diff changeset
232 memcpy(pkt->data,sector+24,2304);
281
ee009afcc2a1 hook up the XA ADPCM decoder
melanson
parents: 209
diff changeset
233
3523
michael
parents: 3522
diff changeset
234 pkt->stream_index =
michael
parents: 3522
diff changeset
235 str->channels[channel].audio_stream_index;
michael
parents: 3522
diff changeset
236 return 0;
281
ee009afcc2a1 hook up the XA ADPCM decoder
melanson
parents: 209
diff changeset
237 break;
209
7414bbf64011 first pass at PSX STR demuxer; does not yet interact correctly with MDEC
tmmm
parents:
diff changeset
238 default:
3522
dfb9739dd2dc Inform the user about unhandled sectors.
michael
parents: 3521
diff changeset
239 av_log(s, AV_LOG_WARNING, "Unknown sector type %02X\n", sector[0x12]);
209
7414bbf64011 first pass at PSX STR demuxer; does not yet interact correctly with MDEC
tmmm
parents:
diff changeset
240 /* drop the sector and move on */
7414bbf64011 first pass at PSX STR demuxer; does not yet interact correctly with MDEC
tmmm
parents:
diff changeset
241 break;
7414bbf64011 first pass at PSX STR demuxer; does not yet interact correctly with MDEC
tmmm
parents:
diff changeset
242 }
7414bbf64011 first pass at PSX STR demuxer; does not yet interact correctly with MDEC
tmmm
parents:
diff changeset
243
7414bbf64011 first pass at PSX STR demuxer; does not yet interact correctly with MDEC
tmmm
parents:
diff changeset
244 if (url_feof(pb))
2274
b21c2af60bc9 Replace all occurrences of AVERROR_IO with AVERROR(EIO).
takis
parents: 2273
diff changeset
245 return AVERROR(EIO);
209
7414bbf64011 first pass at PSX STR demuxer; does not yet interact correctly with MDEC
tmmm
parents:
diff changeset
246 }
7414bbf64011 first pass at PSX STR demuxer; does not yet interact correctly with MDEC
tmmm
parents:
diff changeset
247 }
7414bbf64011 first pass at PSX STR demuxer; does not yet interact correctly with MDEC
tmmm
parents:
diff changeset
248
7414bbf64011 first pass at PSX STR demuxer; does not yet interact correctly with MDEC
tmmm
parents:
diff changeset
249 static int str_read_close(AVFormatContext *s)
7414bbf64011 first pass at PSX STR demuxer; does not yet interact correctly with MDEC
tmmm
parents:
diff changeset
250 {
2006
2f0154760e5f Get rid of unnecessary pointer casts.
diego
parents: 1673
diff changeset
251 StrDemuxContext *str = s->priv_data;
3521
b068f51d1c6e memleak
michael
parents: 3520
diff changeset
252 int i;
b068f51d1c6e memleak
michael
parents: 3520
diff changeset
253 for(i=0; i<32; i++){
b068f51d1c6e memleak
michael
parents: 3520
diff changeset
254 if(str->channels[i].tmp_pkt.data)
b068f51d1c6e memleak
michael
parents: 3520
diff changeset
255 av_free_packet(&str->channels[i].tmp_pkt);
b068f51d1c6e memleak
michael
parents: 3520
diff changeset
256 }
209
7414bbf64011 first pass at PSX STR demuxer; does not yet interact correctly with MDEC
tmmm
parents:
diff changeset
257
7414bbf64011 first pass at PSX STR demuxer; does not yet interact correctly with MDEC
tmmm
parents:
diff changeset
258 return 0;
7414bbf64011 first pass at PSX STR demuxer; does not yet interact correctly with MDEC
tmmm
parents:
diff changeset
259 }
7414bbf64011 first pass at PSX STR demuxer; does not yet interact correctly with MDEC
tmmm
parents:
diff changeset
260
1169
d18cc9a1fd02 allow individual selection of muxers and demuxers
mru
parents: 1167
diff changeset
261 AVInputFormat str_demuxer = {
209
7414bbf64011 first pass at PSX STR demuxer; does not yet interact correctly with MDEC
tmmm
parents:
diff changeset
262 "psxstr",
3424
7a0230981402 Make long_names in lavf/lavdev optional depending on CONFIG_SMALL.
diego
parents: 3390
diff changeset
263 NULL_IF_CONFIG_SMALL("Sony Playstation STR format"),
209
7414bbf64011 first pass at PSX STR demuxer; does not yet interact correctly with MDEC
tmmm
parents:
diff changeset
264 sizeof(StrDemuxContext),
7414bbf64011 first pass at PSX STR demuxer; does not yet interact correctly with MDEC
tmmm
parents:
diff changeset
265 str_probe,
7414bbf64011 first pass at PSX STR demuxer; does not yet interact correctly with MDEC
tmmm
parents:
diff changeset
266 str_read_header,
7414bbf64011 first pass at PSX STR demuxer; does not yet interact correctly with MDEC
tmmm
parents:
diff changeset
267 str_read_packet,
7414bbf64011 first pass at PSX STR demuxer; does not yet interact correctly with MDEC
tmmm
parents:
diff changeset
268 str_read_close,
7414bbf64011 first pass at PSX STR demuxer; does not yet interact correctly with MDEC
tmmm
parents:
diff changeset
269 };