annotate psxstr.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 82f150c809c6
children 7d2f3f1b68d8
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 /**
7414bbf64011 first pass at PSX STR demuxer; does not yet interact correctly with MDEC
tmmm
parents:
diff changeset
23 * @file psxstr.c
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
7414bbf64011 first pass at PSX STR demuxer; does not yet interact correctly with MDEC
tmmm
parents:
diff changeset
32 #include "avformat.h"
7414bbf64011 first pass at PSX STR demuxer; does not yet interact correctly with MDEC
tmmm
parents:
diff changeset
33
386
c152849ee643 remove numerous definitions of BE_*/LE_* macros; convert FOURCC_TAG ->
melanson
parents: 370
diff changeset
34 #define RIFF_TAG MKTAG('R', 'I', 'F', 'F')
c152849ee643 remove numerous definitions of BE_*/LE_* macros; convert FOURCC_TAG ->
melanson
parents: 370
diff changeset
35 #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
36
3514
616ffabfbb5b vertical align
michael
parents: 3513
diff changeset
37 #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
38 #define RAW_CD_SECTOR_DATA_SIZE 2304
3514
616ffabfbb5b vertical align
michael
parents: 3513
diff changeset
39 #define VIDEO_DATA_CHUNK_SIZE 0x7E0
616ffabfbb5b vertical align
michael
parents: 3513
diff changeset
40 #define VIDEO_DATA_HEADER_SIZE 0x38
616ffabfbb5b vertical align
michael
parents: 3513
diff changeset
41 #define RIFF_HEADER_SIZE 0x2C
209
7414bbf64011 first pass at PSX STR demuxer; does not yet interact correctly with MDEC
tmmm
parents:
diff changeset
42
7414bbf64011 first pass at PSX STR demuxer; does not yet interact correctly with MDEC
tmmm
parents:
diff changeset
43 #define CDXA_TYPE_MASK 0x0E
7414bbf64011 first pass at PSX STR demuxer; does not yet interact correctly with MDEC
tmmm
parents:
diff changeset
44 #define CDXA_TYPE_DATA 0x08
7414bbf64011 first pass at PSX STR demuxer; does not yet interact correctly with MDEC
tmmm
parents:
diff changeset
45 #define CDXA_TYPE_AUDIO 0x04
7414bbf64011 first pass at PSX STR demuxer; does not yet interact correctly with MDEC
tmmm
parents:
diff changeset
46 #define CDXA_TYPE_VIDEO 0x02
7414bbf64011 first pass at PSX STR demuxer; does not yet interact correctly with MDEC
tmmm
parents:
diff changeset
47
7414bbf64011 first pass at PSX STR demuxer; does not yet interact correctly with MDEC
tmmm
parents:
diff changeset
48 #define STR_MAGIC (0x80010160)
7414bbf64011 first pass at PSX STR demuxer; does not yet interact correctly with MDEC
tmmm
parents:
diff changeset
49
7414bbf64011 first pass at PSX STR demuxer; does not yet interact correctly with MDEC
tmmm
parents:
diff changeset
50 typedef struct StrChannel {
7414bbf64011 first pass at PSX STR demuxer; does not yet interact correctly with MDEC
tmmm
parents:
diff changeset
51 /* video parameters */
7414bbf64011 first pass at PSX STR demuxer; does not yet interact correctly with MDEC
tmmm
parents:
diff changeset
52 int video_stream_index;
3515
4f78b4688afc remove code that discards streams randomly
michael
parents: 3514
diff changeset
53 AVPacket tmp_pkt;
209
7414bbf64011 first pass at PSX STR demuxer; does not yet interact correctly with MDEC
tmmm
parents:
diff changeset
54
7414bbf64011 first pass at PSX STR demuxer; does not yet interact correctly with MDEC
tmmm
parents:
diff changeset
55 /* audio parameters */
7414bbf64011 first pass at PSX STR demuxer; does not yet interact correctly with MDEC
tmmm
parents:
diff changeset
56 int audio_stream_index;
7414bbf64011 first pass at PSX STR demuxer; does not yet interact correctly with MDEC
tmmm
parents:
diff changeset
57 } StrChannel;
7414bbf64011 first pass at PSX STR demuxer; does not yet interact correctly with MDEC
tmmm
parents:
diff changeset
58
7414bbf64011 first pass at PSX STR demuxer; does not yet interact correctly with MDEC
tmmm
parents:
diff changeset
59 typedef struct StrDemuxContext {
7414bbf64011 first pass at PSX STR demuxer; does not yet interact correctly with MDEC
tmmm
parents:
diff changeset
60
7414bbf64011 first pass at PSX STR demuxer; does not yet interact correctly with MDEC
tmmm
parents:
diff changeset
61 /* 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
62 StrChannel channels[32];
7414bbf64011 first pass at PSX STR demuxer; does not yet interact correctly with MDEC
tmmm
parents:
diff changeset
63 } StrDemuxContext;
7414bbf64011 first pass at PSX STR demuxer; does not yet interact correctly with MDEC
tmmm
parents:
diff changeset
64
1242
996ce2a68147 Fix some "'static' is not at beginning of declaration" warnings.
diego
parents: 1169
diff changeset
65 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
66
209
7414bbf64011 first pass at PSX STR demuxer; does not yet interact correctly with MDEC
tmmm
parents:
diff changeset
67 static int str_probe(AVProbeData *p)
7414bbf64011 first pass at PSX STR demuxer; does not yet interact correctly with MDEC
tmmm
parents:
diff changeset
68 {
3563
82f150c809c6 simplify
michael
parents: 3562
diff changeset
69 uint8_t *sector= p->buf;
209
7414bbf64011 first pass at PSX STR demuxer; does not yet interact correctly with MDEC
tmmm
parents:
diff changeset
70
3562
44699ecd5f6f Fix misdetection of MPEG-PS (AVSEQ03.DAT and AVSEQ06.DAT) as psxstr.
michael
parents: 3523
diff changeset
71 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
72 return 0;
7414bbf64011 first pass at PSX STR demuxer; does not yet interact correctly with MDEC
tmmm
parents:
diff changeset
73
1673
a782462e2497 rename BE/LE_8/16/32 to AV_RL/B_8/16/32
alex
parents: 1358
diff changeset
74 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
75 (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
76
7414bbf64011 first pass at PSX STR demuxer; does not yet interact correctly with MDEC
tmmm
parents:
diff changeset
77 /* RIFF header seen; skip 0x2C bytes */
3563
82f150c809c6 simplify
michael
parents: 3562
diff changeset
78 sector += RIFF_HEADER_SIZE;
82f150c809c6 simplify
michael
parents: 3562
diff changeset
79 }
3562
44699ecd5f6f Fix misdetection of MPEG-PS (AVSEQ03.DAT and AVSEQ06.DAT) as psxstr.
michael
parents: 3523
diff changeset
80
209
7414bbf64011 first pass at PSX STR demuxer; does not yet interact correctly with MDEC
tmmm
parents:
diff changeset
81 /* look for CD sync header (00, 0xFF x 10, 00) */
3563
82f150c809c6 simplify
michael
parents: 3562
diff changeset
82 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
83 return 0;
7414bbf64011 first pass at PSX STR demuxer; does not yet interact correctly with MDEC
tmmm
parents:
diff changeset
84
3562
44699ecd5f6f Fix misdetection of MPEG-PS (AVSEQ03.DAT and AVSEQ06.DAT) as psxstr.
michael
parents: 3523
diff changeset
85 if(sector[0x11] >= 32)
44699ecd5f6f Fix misdetection of MPEG-PS (AVSEQ03.DAT and AVSEQ06.DAT) as psxstr.
michael
parents: 3523
diff changeset
86 return 0;
44699ecd5f6f Fix misdetection of MPEG-PS (AVSEQ03.DAT and AVSEQ06.DAT) as psxstr.
michael
parents: 3523
diff changeset
87 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
88 && (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
89 && (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
90 return 0;
44699ecd5f6f Fix misdetection of MPEG-PS (AVSEQ03.DAT and AVSEQ06.DAT) as psxstr.
michael
parents: 3523
diff changeset
91
209
7414bbf64011 first pass at PSX STR demuxer; does not yet interact correctly with MDEC
tmmm
parents:
diff changeset
92 /* 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
93 * only return half certainty */
7414bbf64011 first pass at PSX STR demuxer; does not yet interact correctly with MDEC
tmmm
parents:
diff changeset
94 return 50;
7414bbf64011 first pass at PSX STR demuxer; does not yet interact correctly with MDEC
tmmm
parents:
diff changeset
95 }
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 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
98 AVFormatParameters *ap)
7414bbf64011 first pass at PSX STR demuxer; does not yet interact correctly with MDEC
tmmm
parents:
diff changeset
99 {
2771
d52c718e83f9 Use dynamically allocated ByteIOContext in AVFormatContext
andoma
parents: 2274
diff changeset
100 ByteIOContext *pb = s->pb;
2006
2f0154760e5f Get rid of unnecessary pointer casts.
diego
parents: 1673
diff changeset
101 StrDemuxContext *str = s->priv_data;
209
7414bbf64011 first pass at PSX STR demuxer; does not yet interact correctly with MDEC
tmmm
parents:
diff changeset
102 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
103 int start;
7414bbf64011 first pass at PSX STR demuxer; does not yet interact correctly with MDEC
tmmm
parents:
diff changeset
104 int i;
7414bbf64011 first pass at PSX STR demuxer; does not yet interact correctly with MDEC
tmmm
parents:
diff changeset
105
7414bbf64011 first pass at PSX STR demuxer; does not yet interact correctly with MDEC
tmmm
parents:
diff changeset
106 /* skip over any RIFF header */
7414bbf64011 first pass at PSX STR demuxer; does not yet interact correctly with MDEC
tmmm
parents:
diff changeset
107 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
108 return AVERROR(EIO);
1673
a782462e2497 rename BE/LE_8/16/32 to AV_RL/B_8/16/32
alex
parents: 1358
diff changeset
109 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
110 start = RIFF_HEADER_SIZE;
7414bbf64011 first pass at PSX STR demuxer; does not yet interact correctly with MDEC
tmmm
parents:
diff changeset
111 else
7414bbf64011 first pass at PSX STR demuxer; does not yet interact correctly with MDEC
tmmm
parents:
diff changeset
112 start = 0;
7414bbf64011 first pass at PSX STR demuxer; does not yet interact correctly with MDEC
tmmm
parents:
diff changeset
113
7414bbf64011 first pass at PSX STR demuxer; does not yet interact correctly with MDEC
tmmm
parents:
diff changeset
114 url_fseek(pb, start, SEEK_SET);
7414bbf64011 first pass at PSX STR demuxer; does not yet interact correctly with MDEC
tmmm
parents:
diff changeset
115
3515
4f78b4688afc remove code that discards streams randomly
michael
parents: 3514
diff changeset
116 for(i=0; i<32; i++){
4f78b4688afc remove code that discards streams randomly
michael
parents: 3514
diff changeset
117 str->channels[i].video_stream_index=
4f78b4688afc remove code that discards streams randomly
michael
parents: 3514
diff changeset
118 str->channels[i].audio_stream_index= -1;
4f78b4688afc remove code that discards streams randomly
michael
parents: 3514
diff changeset
119 }
4f78b4688afc remove code that discards streams randomly
michael
parents: 3514
diff changeset
120
3518
0a83cbe75b0b Get rid of weird pre reading code.
michael
parents: 3517
diff changeset
121 s->ctx_flags |= AVFMTCTX_NOHEADER;
209
7414bbf64011 first pass at PSX STR demuxer; does not yet interact correctly with MDEC
tmmm
parents:
diff changeset
122
7414bbf64011 first pass at PSX STR demuxer; does not yet interact correctly with MDEC
tmmm
parents:
diff changeset
123 return 0;
7414bbf64011 first pass at PSX STR demuxer; does not yet interact correctly with MDEC
tmmm
parents:
diff changeset
124 }
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 static int str_read_packet(AVFormatContext *s,
281
ee009afcc2a1 hook up the XA ADPCM decoder
melanson
parents: 209
diff changeset
127 AVPacket *ret_pkt)
209
7414bbf64011 first pass at PSX STR demuxer; does not yet interact correctly with MDEC
tmmm
parents:
diff changeset
128 {
2771
d52c718e83f9 Use dynamically allocated ByteIOContext in AVFormatContext
andoma
parents: 2274
diff changeset
129 ByteIOContext *pb = s->pb;
2006
2f0154760e5f Get rid of unnecessary pointer casts.
diego
parents: 1673
diff changeset
130 StrDemuxContext *str = s->priv_data;
209
7414bbf64011 first pass at PSX STR demuxer; does not yet interact correctly with MDEC
tmmm
parents:
diff changeset
131 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
132 int channel;
281
ee009afcc2a1 hook up the XA ADPCM decoder
melanson
parents: 209
diff changeset
133 AVPacket *pkt;
3518
0a83cbe75b0b Get rid of weird pre reading code.
michael
parents: 3517
diff changeset
134 AVStream *st;
209
7414bbf64011 first pass at PSX STR demuxer; does not yet interact correctly with MDEC
tmmm
parents:
diff changeset
135
3390
771ab1d4fd6e Removing dead code, fixes CID4 RUN2.
michael
parents: 2771
diff changeset
136 while (1) {
209
7414bbf64011 first pass at PSX STR demuxer; does not yet interact correctly with MDEC
tmmm
parents:
diff changeset
137
7414bbf64011 first pass at PSX STR demuxer; does not yet interact correctly with MDEC
tmmm
parents:
diff changeset
138 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
139 return AVERROR(EIO);
209
7414bbf64011 first pass at PSX STR demuxer; does not yet interact correctly with MDEC
tmmm
parents:
diff changeset
140
7414bbf64011 first pass at PSX STR demuxer; does not yet interact correctly with MDEC
tmmm
parents:
diff changeset
141 channel = sector[0x11];
7414bbf64011 first pass at PSX STR demuxer; does not yet interact correctly with MDEC
tmmm
parents:
diff changeset
142 if (channel >= 32)
7414bbf64011 first pass at PSX STR demuxer; does not yet interact correctly with MDEC
tmmm
parents:
diff changeset
143 return AVERROR_INVALIDDATA;
7414bbf64011 first pass at PSX STR demuxer; does not yet interact correctly with MDEC
tmmm
parents:
diff changeset
144
7414bbf64011 first pass at PSX STR demuxer; does not yet interact correctly with MDEC
tmmm
parents:
diff changeset
145 switch (sector[0x12] & CDXA_TYPE_MASK) {
7414bbf64011 first pass at PSX STR demuxer; does not yet interact correctly with MDEC
tmmm
parents:
diff changeset
146
7414bbf64011 first pass at PSX STR demuxer; does not yet interact correctly with MDEC
tmmm
parents:
diff changeset
147 case CDXA_TYPE_DATA:
7414bbf64011 first pass at PSX STR demuxer; does not yet interact correctly with MDEC
tmmm
parents:
diff changeset
148 case CDXA_TYPE_VIDEO:
3515
4f78b4688afc remove code that discards streams randomly
michael
parents: 3514
diff changeset
149 {
209
7414bbf64011 first pass at PSX STR demuxer; does not yet interact correctly with MDEC
tmmm
parents:
diff changeset
150
1673
a782462e2497 rename BE/LE_8/16/32 to AV_RL/B_8/16/32
alex
parents: 1358
diff changeset
151 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
152 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
153 int frame_size = AV_RL32(&sector[0x24]);
3511
34a5e6f576fd Fix exploitable code.
michael
parents: 3424
diff changeset
154
34a5e6f576fd Fix exploitable code.
michael
parents: 3424
diff changeset
155 if(!( frame_size>=0
34a5e6f576fd Fix exploitable code.
michael
parents: 3424
diff changeset
156 && current_sector < sector_count
34a5e6f576fd Fix exploitable code.
michael
parents: 3424
diff changeset
157 && sector_count*VIDEO_DATA_CHUNK_SIZE >=frame_size)){
34a5e6f576fd Fix exploitable code.
michael
parents: 3424
diff changeset
158 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
159 break;
3511
34a5e6f576fd Fix exploitable code.
michael
parents: 3424
diff changeset
160 }
34a5e6f576fd Fix exploitable code.
michael
parents: 3424
diff changeset
161
3518
0a83cbe75b0b Get rid of weird pre reading code.
michael
parents: 3517
diff changeset
162 if(str->channels[channel].video_stream_index < 0){
0a83cbe75b0b Get rid of weird pre reading code.
michael
parents: 3517
diff changeset
163 /* allocate a new AVStream */
0a83cbe75b0b Get rid of weird pre reading code.
michael
parents: 3517
diff changeset
164 st = av_new_stream(s, 0);
0a83cbe75b0b Get rid of weird pre reading code.
michael
parents: 3517
diff changeset
165 if (!st)
0a83cbe75b0b Get rid of weird pre reading code.
michael
parents: 3517
diff changeset
166 return AVERROR(ENOMEM);
0a83cbe75b0b Get rid of weird pre reading code.
michael
parents: 3517
diff changeset
167 av_set_pts_info(st, 64, 1, 15);
0a83cbe75b0b Get rid of weird pre reading code.
michael
parents: 3517
diff changeset
168
0a83cbe75b0b Get rid of weird pre reading code.
michael
parents: 3517
diff changeset
169 str->channels[channel].video_stream_index = st->index;
0a83cbe75b0b Get rid of weird pre reading code.
michael
parents: 3517
diff changeset
170
0a83cbe75b0b Get rid of weird pre reading code.
michael
parents: 3517
diff changeset
171 st->codec->codec_type = CODEC_TYPE_VIDEO;
0a83cbe75b0b Get rid of weird pre reading code.
michael
parents: 3517
diff changeset
172 st->codec->codec_id = CODEC_ID_MDEC;
0a83cbe75b0b Get rid of weird pre reading code.
michael
parents: 3517
diff changeset
173 st->codec->codec_tag = 0; /* no fourcc */
0a83cbe75b0b Get rid of weird pre reading code.
michael
parents: 3517
diff changeset
174 st->codec->width = AV_RL16(&sector[0x28]);
0a83cbe75b0b Get rid of weird pre reading code.
michael
parents: 3517
diff changeset
175 st->codec->height = AV_RL16(&sector[0x2A]);
0a83cbe75b0b Get rid of weird pre reading code.
michael
parents: 3517
diff changeset
176 }
0a83cbe75b0b Get rid of weird pre reading code.
michael
parents: 3517
diff changeset
177
209
7414bbf64011 first pass at PSX STR demuxer; does not yet interact correctly with MDEC
tmmm
parents:
diff changeset
178 /* 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
179 pkt = &str->channels[channel].tmp_pkt;
3511
34a5e6f576fd Fix exploitable code.
michael
parents: 3424
diff changeset
180
34a5e6f576fd Fix exploitable code.
michael
parents: 3424
diff changeset
181 if(pkt->size != sector_count*VIDEO_DATA_CHUNK_SIZE){
34a5e6f576fd Fix exploitable code.
michael
parents: 3424
diff changeset
182 if(pkt->data)
34a5e6f576fd Fix exploitable code.
michael
parents: 3424
diff changeset
183 av_log(s, AV_LOG_ERROR, "missmatching sector_count\n");
34a5e6f576fd Fix exploitable code.
michael
parents: 3424
diff changeset
184 av_free_packet(pkt);
34a5e6f576fd Fix exploitable code.
michael
parents: 3424
diff changeset
185 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
186 return AVERROR(EIO);
209
7414bbf64011 first pass at PSX STR demuxer; does not yet interact correctly with MDEC
tmmm
parents:
diff changeset
187
775
c5077fdab490 AVPacket.pos
michael
parents: 683
diff changeset
188 pkt->pos= url_ftell(pb) - RAW_CD_SECTOR_SIZE;
885
da1d5db0ce5c COSMETICS: Remove all trailing whitespace.
diego
parents: 837
diff changeset
189 pkt->stream_index =
209
7414bbf64011 first pass at PSX STR demuxer; does not yet interact correctly with MDEC
tmmm
parents:
diff changeset
190 str->channels[channel].video_stream_index;
7414bbf64011 first pass at PSX STR demuxer; does not yet interact correctly with MDEC
tmmm
parents:
diff changeset
191 }
7414bbf64011 first pass at PSX STR demuxer; does not yet interact correctly with MDEC
tmmm
parents:
diff changeset
192
3511
34a5e6f576fd Fix exploitable code.
michael
parents: 3424
diff changeset
193 memcpy(pkt->data + current_sector*VIDEO_DATA_CHUNK_SIZE,
34a5e6f576fd Fix exploitable code.
michael
parents: 3424
diff changeset
194 sector + VIDEO_DATA_HEADER_SIZE,
34a5e6f576fd Fix exploitable code.
michael
parents: 3424
diff changeset
195 VIDEO_DATA_CHUNK_SIZE);
34a5e6f576fd Fix exploitable code.
michael
parents: 3424
diff changeset
196
281
ee009afcc2a1 hook up the XA ADPCM decoder
melanson
parents: 209
diff changeset
197 if (current_sector == sector_count-1) {
3511
34a5e6f576fd Fix exploitable code.
michael
parents: 3424
diff changeset
198 pkt->size= frame_size;
281
ee009afcc2a1 hook up the XA ADPCM decoder
melanson
parents: 209
diff changeset
199 *ret_pkt = *pkt;
3511
34a5e6f576fd Fix exploitable code.
michael
parents: 3424
diff changeset
200 pkt->data= NULL;
34a5e6f576fd Fix exploitable code.
michael
parents: 3424
diff changeset
201 pkt->size= -1;
281
ee009afcc2a1 hook up the XA ADPCM decoder
melanson
parents: 209
diff changeset
202 return 0;
ee009afcc2a1 hook up the XA ADPCM decoder
melanson
parents: 209
diff changeset
203 }
209
7414bbf64011 first pass at PSX STR demuxer; does not yet interact correctly with MDEC
tmmm
parents:
diff changeset
204
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 break;
7414bbf64011 first pass at PSX STR demuxer; does not yet interact correctly with MDEC
tmmm
parents:
diff changeset
207
7414bbf64011 first pass at PSX STR demuxer; does not yet interact correctly with MDEC
tmmm
parents:
diff changeset
208 case CDXA_TYPE_AUDIO:
3518
0a83cbe75b0b Get rid of weird pre reading code.
michael
parents: 3517
diff changeset
209 if(str->channels[channel].audio_stream_index < 0){
3519
55545ebc90eb merge decl & init
michael
parents: 3518
diff changeset
210 int fmt = sector[0x13];
3518
0a83cbe75b0b Get rid of weird pre reading code.
michael
parents: 3517
diff changeset
211 /* allocate a new AVStream */
0a83cbe75b0b Get rid of weird pre reading code.
michael
parents: 3517
diff changeset
212 st = av_new_stream(s, 0);
0a83cbe75b0b Get rid of weird pre reading code.
michael
parents: 3517
diff changeset
213 if (!st)
0a83cbe75b0b Get rid of weird pre reading code.
michael
parents: 3517
diff changeset
214 return AVERROR(ENOMEM);
0a83cbe75b0b Get rid of weird pre reading code.
michael
parents: 3517
diff changeset
215
0a83cbe75b0b Get rid of weird pre reading code.
michael
parents: 3517
diff changeset
216 str->channels[channel].audio_stream_index = st->index;
0a83cbe75b0b Get rid of weird pre reading code.
michael
parents: 3517
diff changeset
217
0a83cbe75b0b Get rid of weird pre reading code.
michael
parents: 3517
diff changeset
218 st->codec->codec_type = CODEC_TYPE_AUDIO;
0a83cbe75b0b Get rid of weird pre reading code.
michael
parents: 3517
diff changeset
219 st->codec->codec_id = CODEC_ID_ADPCM_XA;
0a83cbe75b0b Get rid of weird pre reading code.
michael
parents: 3517
diff changeset
220 st->codec->codec_tag = 0; /* no fourcc */
0a83cbe75b0b Get rid of weird pre reading code.
michael
parents: 3517
diff changeset
221 st->codec->channels = (fmt&1)?2:1;
0a83cbe75b0b Get rid of weird pre reading code.
michael
parents: 3517
diff changeset
222 st->codec->sample_rate = (fmt&4)?18900:37800;
0a83cbe75b0b Get rid of weird pre reading code.
michael
parents: 3517
diff changeset
223 // st->codec->bit_rate = 0; //FIXME;
0a83cbe75b0b Get rid of weird pre reading code.
michael
parents: 3517
diff changeset
224 st->codec->block_align = 128;
0a83cbe75b0b Get rid of weird pre reading code.
michael
parents: 3517
diff changeset
225
0a83cbe75b0b Get rid of weird pre reading code.
michael
parents: 3517
diff changeset
226 av_set_pts_info(st, 64, 128, st->codec->sample_rate);
0a83cbe75b0b Get rid of weird pre reading code.
michael
parents: 3517
diff changeset
227 }
3523
michael
parents: 3522
diff changeset
228 pkt = ret_pkt;
michael
parents: 3522
diff changeset
229 if (av_new_packet(pkt, 2304))
michael
parents: 3522
diff changeset
230 return AVERROR(EIO);
michael
parents: 3522
diff changeset
231 memcpy(pkt->data,sector+24,2304);
281
ee009afcc2a1 hook up the XA ADPCM decoder
melanson
parents: 209
diff changeset
232
3523
michael
parents: 3522
diff changeset
233 pkt->stream_index =
michael
parents: 3522
diff changeset
234 str->channels[channel].audio_stream_index;
michael
parents: 3522
diff changeset
235 return 0;
281
ee009afcc2a1 hook up the XA ADPCM decoder
melanson
parents: 209
diff changeset
236 break;
209
7414bbf64011 first pass at PSX STR demuxer; does not yet interact correctly with MDEC
tmmm
parents:
diff changeset
237 default:
3522
dfb9739dd2dc Inform the user about unhandled sectors.
michael
parents: 3521
diff changeset
238 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
239 /* drop the sector and move on */
7414bbf64011 first pass at PSX STR demuxer; does not yet interact correctly with MDEC
tmmm
parents:
diff changeset
240 break;
7414bbf64011 first pass at PSX STR demuxer; does not yet interact correctly with MDEC
tmmm
parents:
diff changeset
241 }
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 if (url_feof(pb))
2274
b21c2af60bc9 Replace all occurrences of AVERROR_IO with AVERROR(EIO).
takis
parents: 2273
diff changeset
244 return AVERROR(EIO);
209
7414bbf64011 first pass at PSX STR demuxer; does not yet interact correctly with MDEC
tmmm
parents:
diff changeset
245 }
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 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
249 {
2006
2f0154760e5f Get rid of unnecessary pointer casts.
diego
parents: 1673
diff changeset
250 StrDemuxContext *str = s->priv_data;
3521
b068f51d1c6e memleak
michael
parents: 3520
diff changeset
251 int i;
b068f51d1c6e memleak
michael
parents: 3520
diff changeset
252 for(i=0; i<32; i++){
b068f51d1c6e memleak
michael
parents: 3520
diff changeset
253 if(str->channels[i].tmp_pkt.data)
b068f51d1c6e memleak
michael
parents: 3520
diff changeset
254 av_free_packet(&str->channels[i].tmp_pkt);
b068f51d1c6e memleak
michael
parents: 3520
diff changeset
255 }
209
7414bbf64011 first pass at PSX STR demuxer; does not yet interact correctly with MDEC
tmmm
parents:
diff changeset
256
7414bbf64011 first pass at PSX STR demuxer; does not yet interact correctly with MDEC
tmmm
parents:
diff changeset
257 return 0;
7414bbf64011 first pass at PSX STR demuxer; does not yet interact correctly with MDEC
tmmm
parents:
diff changeset
258 }
7414bbf64011 first pass at PSX STR demuxer; does not yet interact correctly with MDEC
tmmm
parents:
diff changeset
259
1169
d18cc9a1fd02 allow individual selection of muxers and demuxers
mru
parents: 1167
diff changeset
260 AVInputFormat str_demuxer = {
209
7414bbf64011 first pass at PSX STR demuxer; does not yet interact correctly with MDEC
tmmm
parents:
diff changeset
261 "psxstr",
3424
7a0230981402 Make long_names in lavf/lavdev optional depending on CONFIG_SMALL.
diego
parents: 3390
diff changeset
262 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
263 sizeof(StrDemuxContext),
7414bbf64011 first pass at PSX STR demuxer; does not yet interact correctly with MDEC
tmmm
parents:
diff changeset
264 str_probe,
7414bbf64011 first pass at PSX STR demuxer; does not yet interact correctly with MDEC
tmmm
parents:
diff changeset
265 str_read_header,
7414bbf64011 first pass at PSX STR demuxer; does not yet interact correctly with MDEC
tmmm
parents:
diff changeset
266 str_read_packet,
7414bbf64011 first pass at PSX STR demuxer; does not yet interact correctly with MDEC
tmmm
parents:
diff changeset
267 str_read_close,
7414bbf64011 first pass at PSX STR demuxer; does not yet interact correctly with MDEC
tmmm
parents:
diff changeset
268 };