Skip to content
Projects
Groups
Snippets
Help
Loading...
Help
Contribute to GitLab
Sign in / Register
Toggle navigation
F
ffmpeg.wasm-core
Project
Project
Details
Activity
Cycle Analytics
Repository
Repository
Files
Commits
Branches
Tags
Contributors
Graph
Compare
Charts
Issues
0
Issues
0
List
Board
Labels
Milestones
Merge Requests
0
Merge Requests
0
CI / CD
CI / CD
Pipelines
Jobs
Schedules
Charts
Wiki
Wiki
Snippets
Snippets
Members
Members
Collapse sidebar
Close sidebar
Activity
Graph
Charts
Create a new issue
Jobs
Commits
Issue Boards
Open sidebar
Linshizhi
ffmpeg.wasm-core
Commits
93cb9d7f
Commit
93cb9d7f
authored
Oct 15, 2003
by
Mike Melanson
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
hook up the XA ADPCM decoder
Originally committed as revision 2386 to
svn://svn.ffmpeg.org/ffmpeg/trunk
parent
fc384777
Hide whitespace changes
Inline
Side-by-side
Showing
1 changed file
with
77 additions
and
51 deletions
+77
-51
psxstr.c
libavformat/psxstr.c
+77
-51
No files found.
libavformat/psxstr.c
View file @
93cb9d7f
...
@@ -89,8 +89,11 @@ typedef struct StrDemuxContext {
...
@@ -89,8 +89,11 @@ typedef struct StrDemuxContext {
int64_t
pts
;
int64_t
pts
;
unsigned
char
*
video_chunk
;
unsigned
char
*
video_chunk
;
AVPacket
tmp_pkt
;
}
StrDemuxContext
;
}
StrDemuxContext
;
const
static
char
sync_header
[
12
]
=
{
0x00
,
0xff
,
0xff
,
0xff
,
0xff
,
0xff
,
0xff
,
0xff
,
0xff
,
0xff
,
0xff
,
0x00
};
static
int
str_probe
(
AVProbeData
*
p
)
static
int
str_probe
(
AVProbeData
*
p
)
{
{
int
start
;
int
start
;
...
@@ -108,12 +111,7 @@ static int str_probe(AVProbeData *p)
...
@@ -108,12 +111,7 @@ static int str_probe(AVProbeData *p)
start
=
0
;
start
=
0
;
/* look for CD sync header (00, 0xFF x 10, 00) */
/* look for CD sync header (00, 0xFF x 10, 00) */
if
((
p
->
buf
[
start
+
0
]
!=
0x00
)
||
(
p
->
buf
[
start
+
1
]
!=
0xFF
)
||
if
(
memcmp
(
p
->
buf
+
start
,
sync_header
,
sizeof
(
sync_header
)))
(
p
->
buf
[
start
+
2
]
!=
0xFF
)
||
(
p
->
buf
[
start
+
3
]
!=
0xFF
)
||
(
p
->
buf
[
start
+
4
]
!=
0xFF
)
||
(
p
->
buf
[
start
+
5
]
!=
0xFF
)
||
(
p
->
buf
[
start
+
6
]
!=
0xFF
)
||
(
p
->
buf
[
start
+
7
]
!=
0xFF
)
||
(
p
->
buf
[
start
+
8
]
!=
0xFF
)
||
(
p
->
buf
[
start
+
9
]
!=
0xFF
)
||
(
p
->
buf
[
start
+
10
]
!=
0xFF
)
||
(
p
->
buf
[
start
+
11
]
!=
0x00
))
return
0
;
return
0
;
/* MPEG files (like those ripped from VCDs) can also look like this;
/* MPEG files (like those ripped from VCDs) can also look like this;
...
@@ -121,6 +119,17 @@ static int str_probe(AVProbeData *p)
...
@@ -121,6 +119,17 @@ static int str_probe(AVProbeData *p)
return
50
;
return
50
;
}
}
static
void
dump
(
unsigned
char
*
buf
,
size_t
len
)
{
int
i
;
for
(
i
=
0
;
i
<
len
;
i
++
)
{
if
((
i
&
15
)
==
0
)
printf
(
"%04x "
,
i
);
printf
(
"%02x "
,
buf
[
i
]);
if
((
i
&
15
)
==
15
)
printf
(
"
\n
"
);
}
printf
(
"
\n
"
);
}
static
int
str_read_header
(
AVFormatContext
*
s
,
static
int
str_read_header
(
AVFormatContext
*
s
,
AVFormatParameters
*
ap
)
AVFormatParameters
*
ap
)
{
{
...
@@ -157,6 +166,8 @@ static int str_read_header(AVFormatContext *s,
...
@@ -157,6 +166,8 @@ static int str_read_header(AVFormatContext *s,
if
(
get_buffer
(
pb
,
sector
,
RAW_CD_SECTOR_SIZE
)
!=
RAW_CD_SECTOR_SIZE
)
if
(
get_buffer
(
pb
,
sector
,
RAW_CD_SECTOR_SIZE
)
!=
RAW_CD_SECTOR_SIZE
)
return
AVERROR_IO
;
return
AVERROR_IO
;
//printf("%02x %02x %02x %02x\n",sector[0x10],sector[0x11],sector[0x12],sector[0x13]);
channel
=
sector
[
0x11
];
channel
=
sector
[
0x11
];
if
(
channel
>=
32
)
if
(
channel
>=
32
)
return
AVERROR_INVALIDDATA
;
return
AVERROR_INVALIDDATA
;
...
@@ -193,6 +204,7 @@ static int str_read_header(AVFormatContext *s,
...
@@ -193,6 +204,7 @@ static int str_read_header(AVFormatContext *s,
case
CDXA_TYPE_AUDIO
:
case
CDXA_TYPE_AUDIO
:
/* check if this channel gets to be the dominant audio channel */
/* check if this channel gets to be the dominant audio channel */
if
(
str
->
audio_channel
==
-
1
)
{
if
(
str
->
audio_channel
==
-
1
)
{
int
fmt
;
str
->
audio_channel
=
channel
;
str
->
audio_channel
=
channel
;
str
->
channels
[
channel
].
type
=
STR_AUDIO
;
str
->
channels
[
channel
].
type
=
STR_AUDIO
;
str
->
channels
[
channel
].
channels
=
str
->
channels
[
channel
].
channels
=
...
@@ -201,6 +213,22 @@ static int str_read_header(AVFormatContext *s,
...
@@ -201,6 +213,22 @@ static int str_read_header(AVFormatContext *s,
(
sector
[
0x13
]
&
0x04
)
?
18900
:
37800
;
(
sector
[
0x13
]
&
0x04
)
?
18900
:
37800
;
str
->
channels
[
channel
].
bits
=
str
->
channels
[
channel
].
bits
=
(
sector
[
0x13
]
&
0x10
)
?
8
:
4
;
(
sector
[
0x13
]
&
0x10
)
?
8
:
4
;
/* allocate a new AVStream */
st
=
av_new_stream
(
s
,
0
);
if
(
!
st
)
return
AVERROR_NOMEM
;
str
->
channels
[
channel
].
audio_stream_index
=
st
->
index
;
fmt
=
sector
[
0x13
];
st
->
codec
.
codec_type
=
CODEC_TYPE_AUDIO
;
st
->
codec
.
codec_id
=
CODEC_ID_ADPCM_XA
;
st
->
codec
.
codec_tag
=
0
;
/* no fourcc */
st
->
codec
.
channels
=
(
fmt
&
1
)
?
2
:
1
;
st
->
codec
.
sample_rate
=
(
fmt
&
4
)
?
18900
:
37800
;
// st->codec.bit_rate = 0; //FIXME;
st
->
codec
.
block_align
=
128
;
}
}
break
;
break
;
...
@@ -211,15 +239,15 @@ static int str_read_header(AVFormatContext *s,
...
@@ -211,15 +239,15 @@ static int str_read_header(AVFormatContext *s,
}
}
if
(
str
->
video_channel
!=
-
1
)
if
(
str
->
video_channel
!=
-
1
)
printf
(
" video channel = %d, %d x %d
\n
"
,
str
->
video_channel
,
printf
(
" video channel = %d, %d x %d
%d
\n
"
,
str
->
video_channel
,
str
->
channels
[
str
->
video_channel
].
width
,
str
->
channels
[
str
->
video_channel
].
width
,
str
->
channels
[
str
->
video_channel
].
height
);
str
->
channels
[
str
->
video_channel
].
height
,
str
->
channels
[
str
->
video_channel
].
video_stream_index
);
if
(
str
->
audio_channel
!=
-
1
)
if
(
str
->
audio_channel
!=
-
1
)
printf
(
" audio channel = %d, %d Hz, %d channels, %d bits/sample
\n
"
,
printf
(
" audio channel = %d, %d Hz, %d channels, %d bits/sample
%d
\n
"
,
str
->
vide
o_channel
,
str
->
audi
o_channel
,
str
->
channels
[
str
->
vide
o_channel
].
sample_rate
,
str
->
channels
[
str
->
audi
o_channel
].
sample_rate
,
str
->
channels
[
str
->
vide
o_channel
].
channels
,
str
->
channels
[
str
->
audi
o_channel
].
channels
,
str
->
channels
[
str
->
video_channel
].
bits
);
str
->
channels
[
str
->
audio_channel
].
bits
,
str
->
channels
[
str
->
audio_channel
].
audio_stream_index
);
/* back to the start */
/* back to the start */
url_fseek
(
pb
,
start
,
SEEK_SET
);
url_fseek
(
pb
,
start
,
SEEK_SET
);
...
@@ -228,19 +256,15 @@ if (str->audio_channel != -1)
...
@@ -228,19 +256,15 @@ if (str->audio_channel != -1)
}
}
static
int
str_read_packet
(
AVFormatContext
*
s
,
static
int
str_read_packet
(
AVFormatContext
*
s
,
AVPacket
*
pkt
)
AVPacket
*
ret_
pkt
)
{
{
ByteIOContext
*
pb
=
&
s
->
pb
;
ByteIOContext
*
pb
=
&
s
->
pb
;
StrDemuxContext
*
str
=
(
StrDemuxContext
*
)
s
->
priv_data
;
StrDemuxContext
*
str
=
(
StrDemuxContext
*
)
s
->
priv_data
;
unsigned
char
sector
[
RAW_CD_SECTOR_SIZE
];
unsigned
char
sector
[
RAW_CD_SECTOR_SIZE
];
int
channel
;
int
channel
;
int
packet_read
=
0
;
int
packet_read
=
0
;
int
video_sector_count
=
0
;
int
current_video_sector
=
0
;
int
video_frame_size
=
0
;
int
video_frame_index
=
0
;
int
bytes_to_copy
;
int
ret
=
0
;
int
ret
=
0
;
AVPacket
*
pkt
;
while
(
!
packet_read
)
{
while
(
!
packet_read
)
{
...
@@ -258,16 +282,20 @@ static int str_read_packet(AVFormatContext *s,
...
@@ -258,16 +282,20 @@ static int str_read_packet(AVFormatContext *s,
/* check if this the video channel we care about */
/* check if this the video channel we care about */
if
(
channel
==
str
->
video_channel
)
{
if
(
channel
==
str
->
video_channel
)
{
int
current_sector
=
LE_16
(
&
sector
[
0x1C
]);
int
sector_count
=
LE_16
(
&
sector
[
0x1E
]);
int
frame_size
=
LE_32
(
&
sector
[
0x24
]);
int
bytes_to_copy
;
// printf("%d %d %d\n",current_sector,sector_count,frame_size);
/* if this is the first sector of the frame, allocate a pkt */
/* if this is the first sector of the frame, allocate a pkt */
if
(
current_video_sector
==
0
)
{
pkt
=
&
str
->
tmp_pkt
;
video_frame_size
=
LE_32
(
&
sector
[
0x24
]);
if
(
current_sector
==
0
)
{
video_sector_count
=
LE_16
(
&
sector
[
0x1E
]);
if
(
av_new_packet
(
pkt
,
frame_size
))
if
(
av_new_packet
(
pkt
,
video_frame_size
))
return
-
EIO
;
return
-
EIO
;
pkt
->
stream_index
=
pkt
->
stream_index
=
str
->
channels
[
channel
].
video_stream_index
;
str
->
channels
[
channel
].
video_stream_index
;
pkt
->
pts
=
str
->
pts
;
//
pkt->pts = str->pts;
/* if there is no audio, adjust the pts after every video
/* if there is no audio, adjust the pts after every video
* frame; assume 15 fps */
* frame; assume 15 fps */
...
@@ -276,32 +304,16 @@ static int str_read_packet(AVFormatContext *s,
...
@@ -276,32 +304,16 @@ static int str_read_packet(AVFormatContext *s,
}
}
/* load all the constituent chunks in the video packet */
/* load all the constituent chunks in the video packet */
if
(
video_frame_size
-
video_frame_index
<
VIDEO_DATA_CHUNK_SIZE
)
bytes_to_copy
=
frame_size
-
current_sector
*
VIDEO_DATA_CHUNK_SIZE
;
bytes_to_copy
=
video_frame_size
-
video_frame_index
;
if
(
bytes_to_copy
>
0
)
{
else
if
(
bytes_to_copy
>
VIDEO_DATA_CHUNK_SIZE
)
bytes_to_copy
=
VIDEO_DATA_CHUNK_SIZE
;
bytes_to_copy
=
VIDEO_DATA_CHUNK_SIZE
;
memcpy
(
pkt
->
data
+
current_sector
*
VIDEO_DATA_CHUNK_SIZE
,
if
(
video_frame_index
<
video_frame_size
)
sector
+
VIDEO_DATA_HEADER_SIZE
,
bytes_to_copy
);
memcpy
(
&
pkt
->
data
[
video_frame_index
],
}
&
sector
[
VIDEO_DATA_HEADER_SIZE
],
bytes_to_copy
);
if
(
current_sector
==
sector_count
-
1
)
{
*
ret_pkt
=
*
pkt
;
#ifdef PRINTSTUFF
return
0
;
printf
(
" chunk %d/%d (bytes %d/%d), first 6 bytes = %02X %02X %02X %02X %02X %02X
\n
"
,
}
current_video_sector
,
video_sector_count
,
video_frame_index
,
video_frame_size
,
pkt
->
data
[
current_video_sector
*
VIDEO_DATA_CHUNK_SIZE
+
0
],
pkt
->
data
[
current_video_sector
*
VIDEO_DATA_CHUNK_SIZE
+
1
],
pkt
->
data
[
current_video_sector
*
VIDEO_DATA_CHUNK_SIZE
+
2
],
pkt
->
data
[
current_video_sector
*
VIDEO_DATA_CHUNK_SIZE
+
3
],
pkt
->
data
[
current_video_sector
*
VIDEO_DATA_CHUNK_SIZE
+
4
],
pkt
->
data
[
current_video_sector
*
VIDEO_DATA_CHUNK_SIZE
+
5
]);
#endif
video_frame_index
+=
bytes_to_copy
;
/* must keep reading sectors until all current video sectors
* are consumed */
current_video_sector
++
;
if
(
current_video_sector
>=
video_sector_count
)
packet_read
=
1
;
}
}
break
;
break
;
...
@@ -310,7 +322,21 @@ printf (" chunk %d/%d (bytes %d/%d), first 6 bytes = %02X %02X %02X %02X %02X %
...
@@ -310,7 +322,21 @@ printf (" chunk %d/%d (bytes %d/%d), first 6 bytes = %02X %02X %02X %02X %02X %
#ifdef PRINTSTUFF
#ifdef PRINTSTUFF
printf
(
" dropping audio sector
\n
"
);
printf
(
" dropping audio sector
\n
"
);
#endif
#endif
break
;
#if 1
/* check if this the video channel we care about */
if
(
channel
==
str
->
audio_channel
)
{
pkt
=
ret_pkt
;
if
(
av_new_packet
(
pkt
,
2304
))
return
-
EIO
;
memcpy
(
pkt
->
data
,
sector
+
24
,
2304
);
pkt
->
stream_index
=
str
->
channels
[
channel
].
audio_stream_index
;
//pkt->pts = str->pts;
return
0
;
}
#endif
break
;
default:
default:
/* drop the sector and move on */
/* drop the sector and move on */
#ifdef PRINTSTUFF
#ifdef PRINTSTUFF
...
...
Write
Preview
Markdown
is supported
0%
Try again
or
attach a new file
Attach a file
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Cancel
Please
register
or
sign in
to comment