Skip to content
体验新版
项目
组织
正在加载...
登录
切换导航
打开侧边栏
小白菜888
Ffmpeg
提交
93cb9d7f
F
Ffmpeg
项目概览
小白菜888
/
Ffmpeg
通知
3
Star
0
Fork
0
代码
文件
提交
分支
Tags
贡献者
分支图
Diff
Issue
0
列表
看板
标记
里程碑
合并请求
0
DevOps
流水线
流水线任务
计划
Wiki
0
Wiki
分析
仓库
DevOps
项目成员
Pages
F
Ffmpeg
项目概览
项目概览
详情
发布
仓库
仓库
文件
提交
分支
标签
贡献者
分支图
比较
Issue
0
Issue
0
列表
看板
标记
里程碑
合并请求
0
合并请求
0
Pages
DevOps
DevOps
流水线
流水线任务
计划
分析
分析
仓库分析
DevOps
Wiki
0
Wiki
成员
成员
收起侧边栏
关闭侧边栏
动态
分支图
创建新Issue
流水线任务
提交
Issue看板
体验新版 GitCode,发现更多精彩内容 >>
提交
93cb9d7f
编写于
10月 15, 2003
作者:
M
Mike Melanson
浏览文件
操作
浏览文件
下载
电子邮件补丁
差异文件
hook up the XA ADPCM decoder
Originally committed as revision 2386 to
svn://svn.ffmpeg.org/ffmpeg/trunk
上级
fc384777
变更
1
隐藏空白更改
内联
并排
Showing
1 changed file
with
77 addition
and
51 deletion
+77
-51
libavformat/psxstr.c
libavformat/psxstr.c
+77
-51
未找到文件。
libavformat/psxstr.c
浏览文件 @
93cb9d7f
...
...
@@ -89,8 +89,11 @@ typedef struct StrDemuxContext {
int64_t
pts
;
unsigned
char
*
video_chunk
;
AVPacket
tmp_pkt
;
}
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
)
{
int
start
;
...
...
@@ -108,12 +111,7 @@ static int str_probe(AVProbeData *p)
start
=
0
;
/* look for CD sync header (00, 0xFF x 10, 00) */
if
((
p
->
buf
[
start
+
0
]
!=
0x00
)
||
(
p
->
buf
[
start
+
1
]
!=
0xFF
)
||
(
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
))
if
(
memcmp
(
p
->
buf
+
start
,
sync_header
,
sizeof
(
sync_header
)))
return
0
;
/* MPEG files (like those ripped from VCDs) can also look like this;
...
...
@@ -121,6 +119,17 @@ static int str_probe(AVProbeData *p)
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
,
AVFormatParameters
*
ap
)
{
...
...
@@ -157,6 +166,8 @@ static int str_read_header(AVFormatContext *s,
if
(
get_buffer
(
pb
,
sector
,
RAW_CD_SECTOR_SIZE
)
!=
RAW_CD_SECTOR_SIZE
)
return
AVERROR_IO
;
//printf("%02x %02x %02x %02x\n",sector[0x10],sector[0x11],sector[0x12],sector[0x13]);
channel
=
sector
[
0x11
];
if
(
channel
>=
32
)
return
AVERROR_INVALIDDATA
;
...
...
@@ -193,6 +204,7 @@ static int str_read_header(AVFormatContext *s,
case
CDXA_TYPE_AUDIO
:
/* check if this channel gets to be the dominant audio channel */
if
(
str
->
audio_channel
==
-
1
)
{
int
fmt
;
str
->
audio_channel
=
channel
;
str
->
channels
[
channel
].
type
=
STR_AUDIO
;
str
->
channels
[
channel
].
channels
=
...
...
@@ -201,6 +213,22 @@ static int str_read_header(AVFormatContext *s,
(
sector
[
0x13
]
&
0x04
)
?
18900
:
37800
;
str
->
channels
[
channel
].
bits
=
(
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
;
...
...
@@ -211,15 +239,15 @@ static int str_read_header(AVFormatContext *s,
}
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
].
height
);
str
->
channels
[
str
->
video_channel
].
height
,
str
->
channels
[
str
->
video_channel
].
video_stream_index
);
if
(
str
->
audio_channel
!=
-
1
)
printf
(
" audio channel = %d, %d Hz, %d channels, %d bits/sample
\n
"
,
str
->
vide
o_channel
,
str
->
channels
[
str
->
vide
o_channel
].
sample_rate
,
str
->
channels
[
str
->
vide
o_channel
].
channels
,
str
->
channels
[
str
->
video_channel
].
bits
);
printf
(
" audio channel = %d, %d Hz, %d channels, %d bits/sample
%d
\n
"
,
str
->
audi
o_channel
,
str
->
channels
[
str
->
audi
o_channel
].
sample_rate
,
str
->
channels
[
str
->
audi
o_channel
].
channels
,
str
->
channels
[
str
->
audio_channel
].
bits
,
str
->
channels
[
str
->
audio_channel
].
audio_stream_index
);
/* back to the start */
url_fseek
(
pb
,
start
,
SEEK_SET
);
...
...
@@ -228,19 +256,15 @@ if (str->audio_channel != -1)
}
static
int
str_read_packet
(
AVFormatContext
*
s
,
AVPacket
*
pkt
)
AVPacket
*
ret_
pkt
)
{
ByteIOContext
*
pb
=
&
s
->
pb
;
StrDemuxContext
*
str
=
(
StrDemuxContext
*
)
s
->
priv_data
;
unsigned
char
sector
[
RAW_CD_SECTOR_SIZE
];
int
channel
;
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
;
AVPacket
*
pkt
;
while
(
!
packet_read
)
{
...
...
@@ -258,16 +282,20 @@ static int str_read_packet(AVFormatContext *s,
/* check if this the video channel we care about */
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
(
current_video_sector
==
0
)
{
video_frame_size
=
LE_32
(
&
sector
[
0x24
]);
video_sector_count
=
LE_16
(
&
sector
[
0x1E
]);
if
(
av_new_packet
(
pkt
,
video_frame_size
))
pkt
=
&
str
->
tmp_pkt
;
if
(
current_sector
==
0
)
{
if
(
av_new_packet
(
pkt
,
frame_size
))
return
-
EIO
;
pkt
->
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
* frame; assume 15 fps */
...
...
@@ -276,32 +304,16 @@ static int str_read_packet(AVFormatContext *s,
}
/* load all the constituent chunks in the video packet */
if
(
video_frame_size
-
video_frame_index
<
VIDEO_DATA_CHUNK_SIZE
)
bytes_to_copy
=
video_frame_size
-
video_frame_index
;
else
bytes_to_copy
=
VIDEO_DATA_CHUNK_SIZE
;
if
(
video_frame_index
<
video_frame_size
)
memcpy
(
&
pkt
->
data
[
video_frame_index
],
&
sector
[
VIDEO_DATA_HEADER_SIZE
],
bytes_to_copy
);
#ifdef PRINTSTUFF
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
;
bytes_to_copy
=
frame_size
-
current_sector
*
VIDEO_DATA_CHUNK_SIZE
;
if
(
bytes_to_copy
>
0
)
{
if
(
bytes_to_copy
>
VIDEO_DATA_CHUNK_SIZE
)
bytes_to_copy
=
VIDEO_DATA_CHUNK_SIZE
;
memcpy
(
pkt
->
data
+
current_sector
*
VIDEO_DATA_CHUNK_SIZE
,
sector
+
VIDEO_DATA_HEADER_SIZE
,
bytes_to_copy
);
}
if
(
current_sector
==
sector_count
-
1
)
{
*
ret_pkt
=
*
pkt
;
return
0
;
}
}
break
;
...
...
@@ -310,7 +322,21 @@ printf (" chunk %d/%d (bytes %d/%d), first 6 bytes = %02X %02X %02X %02X %02X %
#ifdef PRINTSTUFF
printf
(
" dropping audio sector
\n
"
);
#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:
/* drop the sector and move on */
#ifdef PRINTSTUFF
...
...
编辑
预览
Markdown
is supported
0%
请重试
或
添加新附件
.
添加附件
取消
You are about to add
0
people
to the discussion. Proceed with caution.
先完成此消息的编辑!
取消
想要评论请
注册
或
登录