Mercurial > libavformat.hg
annotate psxstr.c @ 4387:5c42816e12c6 libavformat
Add "AVFormatContext *ctx" (that being the RTSP demuxer's) as first argument
to the parse_packet() function pointer in RTPDynamicProtocolHandlers. This
allows these functions to peek back and retrieve values from the demuxer's
context (or RTSPState). The ASF/RTP payload parser will use this to be able
to parse SDP values (which occur even before the payload ID is given), store
them in the RTSPState and then retrieve them while parsing payload data. See
"[PATCH] RTSP-MS 13/15: add RTSP demuxer AVFormatContext to parse_packet()
function pointer (was: transport context)" mailinglist thread.
author | rbultje |
---|---|
date | Fri, 06 Feb 2009 01:37:19 +0000 |
parents | 49c1d3b27727 |
children | 536e5527c1e0 |
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 | 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 | 40 #define VIDEO_DATA_CHUNK_SIZE 0x7E0 |
41 #define VIDEO_DATA_HEADER_SIZE 0x38 | |
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 | 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 | 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 | 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 | 75 if ((AV_RL32(&p->buf[0]) == RIFF_TAG) && |
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 | 79 sector += RIFF_HEADER_SIZE; |
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 | 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 | 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 | 110 if (AV_RL32(§or[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 | 117 for(i=0; i<32; i++){ |
118 str->channels[i].video_stream_index= | |
119 str->channels[i].audio_stream_index= -1; | |
120 } | |
121 | |
3518 | 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 | 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 | 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 | 134 AVPacket *pkt; |
3518 | 135 AVStream *st; |
209
7414bbf64011
first pass at PSX STR demuxer; does not yet interact correctly with MDEC
tmmm
parents:
diff
changeset
|
136 |
3390 | 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 | 150 { |
209
7414bbf64011
first pass at PSX STR demuxer; does not yet interact correctly with MDEC
tmmm
parents:
diff
changeset
|
151 |
1673 | 152 int current_sector = AV_RL16(§or[0x1C]); |
153 int sector_count = AV_RL16(§or[0x1E]); | |
154 int frame_size = AV_RL32(§or[0x24]); | |
3511 | 155 |
156 if(!( frame_size>=0 | |
157 && current_sector < sector_count | |
158 && sector_count*VIDEO_DATA_CHUNK_SIZE >=frame_size)){ | |
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 | 161 } |
162 | |
3518 | 163 if(str->channels[channel].video_stream_index < 0){ |
164 /* allocate a new AVStream */ | |
165 st = av_new_stream(s, 0); | |
166 if (!st) | |
167 return AVERROR(ENOMEM); | |
168 av_set_pts_info(st, 64, 1, 15); | |
169 | |
170 str->channels[channel].video_stream_index = st->index; | |
171 | |
172 st->codec->codec_type = CODEC_TYPE_VIDEO; | |
173 st->codec->codec_id = CODEC_ID_MDEC; | |
174 st->codec->codec_tag = 0; /* no fourcc */ | |
175 st->codec->width = AV_RL16(§or[0x28]); | |
176 st->codec->height = AV_RL16(§or[0x2A]); | |
177 } | |
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 | 180 pkt = &str->channels[channel].tmp_pkt; |
3511 | 181 |
182 if(pkt->size != sector_count*VIDEO_DATA_CHUNK_SIZE){ | |
183 if(pkt->data) | |
184 av_log(s, AV_LOG_ERROR, "missmatching sector_count\n"); | |
185 av_free_packet(pkt); | |
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 | 189 pkt->pos= url_ftell(pb) - RAW_CD_SECTOR_SIZE; |
885 | 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 | 194 memcpy(pkt->data + current_sector*VIDEO_DATA_CHUNK_SIZE, |
195 sector + VIDEO_DATA_HEADER_SIZE, | |
196 VIDEO_DATA_CHUNK_SIZE); | |
197 | |
281 | 198 if (current_sector == sector_count-1) { |
3511 | 199 pkt->size= frame_size; |
281 | 200 *ret_pkt = *pkt; |
3511 | 201 pkt->data= NULL; |
202 pkt->size= -1; | |
281 | 203 return 0; |
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 | 210 if(str->channels[channel].audio_stream_index < 0){ |
3519 | 211 int fmt = sector[0x13]; |
3518 | 212 /* allocate a new AVStream */ |
213 st = av_new_stream(s, 0); | |
214 if (!st) | |
215 return AVERROR(ENOMEM); | |
216 | |
217 str->channels[channel].audio_stream_index = st->index; | |
218 | |
219 st->codec->codec_type = CODEC_TYPE_AUDIO; | |
220 st->codec->codec_id = CODEC_ID_ADPCM_XA; | |
221 st->codec->codec_tag = 0; /* no fourcc */ | |
222 st->codec->channels = (fmt&1)?2:1; | |
223 st->codec->sample_rate = (fmt&4)?18900:37800; | |
224 // st->codec->bit_rate = 0; //FIXME; | |
225 st->codec->block_align = 128; | |
226 | |
227 av_set_pts_info(st, 64, 128, st->codec->sample_rate); | |
228 } | |
3523 | 229 pkt = ret_pkt; |
230 if (av_new_packet(pkt, 2304)) | |
231 return AVERROR(EIO); | |
232 memcpy(pkt->data,sector+24,2304); | |
281 | 233 |
3523 | 234 pkt->stream_index = |
235 str->channels[channel].audio_stream_index; | |
236 return 0; | |
281 | 237 break; |
209
7414bbf64011
first pass at PSX STR demuxer; does not yet interact correctly with MDEC
tmmm
parents:
diff
changeset
|
238 default: |
3522 | 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 | 251 StrDemuxContext *str = s->priv_data; |
3521 | 252 int i; |
253 for(i=0; i<32; i++){ | |
254 if(str->channels[i].tmp_pkt.data) | |
255 av_free_packet(&str->channels[i].tmp_pkt); | |
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 | 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 }; |