Mercurial > libavformat.hg
annotate psxstr.c @ 3902:5f9bec099c69 libavformat
Add dynamic payload handlers to rdt.c. These follow the same API as the ones
in rtpdec.c, so that they can be shared and used in the same way in rtsp.c.
The handlers, since they are specific for RDT, are registered in rdt.c and
a new registration function is thus called from allformats.c.
The dynamic payload handler also implements RDT-specific SDP-line parsing for
OpaqueData and StartTime, which are specific for RDT and needed for proper
playback. OpaqueData contains one or a list ("MLTI") of "MDPR" chunks that
can be parsed by the rmdec.c function ff_rm_read_mdpr_codecdata(). To use
this function, we create a new rdt_demuxer, which has the same private data
as the rm_demuxer. The resulting AVFormatContext created with _open_stream()
can thus be used to call functions in the RM demuxer.
See discussion in "Realmedia patch" thread on ML.
author | rbultje |
---|---|
date | Sun, 07 Sep 2008 01:21:24 +0000 |
parents | 82f150c809c6 |
children | 7d2f3f1b68d8 |
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 | 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 | 39 #define VIDEO_DATA_CHUNK_SIZE 0x7E0 |
40 #define VIDEO_DATA_HEADER_SIZE 0x38 | |
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 | 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 | 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 | 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 | 74 if ((AV_RL32(&p->buf[0]) == RIFF_TAG) && |
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 | 78 sector += RIFF_HEADER_SIZE; |
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 | 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 | 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 | 109 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
|
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 | 116 for(i=0; i<32; i++){ |
117 str->channels[i].video_stream_index= | |
118 str->channels[i].audio_stream_index= -1; | |
119 } | |
120 | |
3518 | 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 | 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 | 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 | 133 AVPacket *pkt; |
3518 | 134 AVStream *st; |
209
7414bbf64011
first pass at PSX STR demuxer; does not yet interact correctly with MDEC
tmmm
parents:
diff
changeset
|
135 |
3390 | 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 | 149 { |
209
7414bbf64011
first pass at PSX STR demuxer; does not yet interact correctly with MDEC
tmmm
parents:
diff
changeset
|
150 |
1673 | 151 int current_sector = AV_RL16(§or[0x1C]); |
152 int sector_count = AV_RL16(§or[0x1E]); | |
153 int frame_size = AV_RL32(§or[0x24]); | |
3511 | 154 |
155 if(!( frame_size>=0 | |
156 && current_sector < sector_count | |
157 && sector_count*VIDEO_DATA_CHUNK_SIZE >=frame_size)){ | |
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 | 160 } |
161 | |
3518 | 162 if(str->channels[channel].video_stream_index < 0){ |
163 /* allocate a new AVStream */ | |
164 st = av_new_stream(s, 0); | |
165 if (!st) | |
166 return AVERROR(ENOMEM); | |
167 av_set_pts_info(st, 64, 1, 15); | |
168 | |
169 str->channels[channel].video_stream_index = st->index; | |
170 | |
171 st->codec->codec_type = CODEC_TYPE_VIDEO; | |
172 st->codec->codec_id = CODEC_ID_MDEC; | |
173 st->codec->codec_tag = 0; /* no fourcc */ | |
174 st->codec->width = AV_RL16(§or[0x28]); | |
175 st->codec->height = AV_RL16(§or[0x2A]); | |
176 } | |
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 | 179 pkt = &str->channels[channel].tmp_pkt; |
3511 | 180 |
181 if(pkt->size != sector_count*VIDEO_DATA_CHUNK_SIZE){ | |
182 if(pkt->data) | |
183 av_log(s, AV_LOG_ERROR, "missmatching sector_count\n"); | |
184 av_free_packet(pkt); | |
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 | 188 pkt->pos= url_ftell(pb) - RAW_CD_SECTOR_SIZE; |
885 | 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 | 193 memcpy(pkt->data + current_sector*VIDEO_DATA_CHUNK_SIZE, |
194 sector + VIDEO_DATA_HEADER_SIZE, | |
195 VIDEO_DATA_CHUNK_SIZE); | |
196 | |
281 | 197 if (current_sector == sector_count-1) { |
3511 | 198 pkt->size= frame_size; |
281 | 199 *ret_pkt = *pkt; |
3511 | 200 pkt->data= NULL; |
201 pkt->size= -1; | |
281 | 202 return 0; |
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 | 209 if(str->channels[channel].audio_stream_index < 0){ |
3519 | 210 int fmt = sector[0x13]; |
3518 | 211 /* allocate a new AVStream */ |
212 st = av_new_stream(s, 0); | |
213 if (!st) | |
214 return AVERROR(ENOMEM); | |
215 | |
216 str->channels[channel].audio_stream_index = st->index; | |
217 | |
218 st->codec->codec_type = CODEC_TYPE_AUDIO; | |
219 st->codec->codec_id = CODEC_ID_ADPCM_XA; | |
220 st->codec->codec_tag = 0; /* no fourcc */ | |
221 st->codec->channels = (fmt&1)?2:1; | |
222 st->codec->sample_rate = (fmt&4)?18900:37800; | |
223 // st->codec->bit_rate = 0; //FIXME; | |
224 st->codec->block_align = 128; | |
225 | |
226 av_set_pts_info(st, 64, 128, st->codec->sample_rate); | |
227 } | |
3523 | 228 pkt = ret_pkt; |
229 if (av_new_packet(pkt, 2304)) | |
230 return AVERROR(EIO); | |
231 memcpy(pkt->data,sector+24,2304); | |
281 | 232 |
3523 | 233 pkt->stream_index = |
234 str->channels[channel].audio_stream_index; | |
235 return 0; | |
281 | 236 break; |
209
7414bbf64011
first pass at PSX STR demuxer; does not yet interact correctly with MDEC
tmmm
parents:
diff
changeset
|
237 default: |
3522 | 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 | 250 StrDemuxContext *str = s->priv_data; |
3521 | 251 int i; |
252 for(i=0; i<32; i++){ | |
253 if(str->channels[i].tmp_pkt.data) | |
254 av_free_packet(&str->channels[i].tmp_pkt); | |
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 | 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 }; |