Skip to content
体验新版
项目
组织
正在加载...
登录
切换导航
打开侧边栏
小白菜888
Ffmpeg
提交
ffa0a3d6
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,发现更多精彩内容 >>
提交
ffa0a3d6
编写于
11月 13, 2006
作者:
K
Kostya Shishkov
浏览文件
操作
浏览文件
下载
电子邮件补丁
差异文件
Simplify VMD demuxer (but it still does not work right)
Originally committed as revision 7001 to
svn://svn.ffmpeg.org/ffmpeg/trunk
上级
a47d3c04
变更
1
隐藏空白更改
内联
并排
Showing
1 changed file
with
33 addition
and
94 deletion
+33
-94
libavformat/sierravmd.c
libavformat/sierravmd.c
+33
-94
未找到文件。
libavformat/sierravmd.c
浏览文件 @
ffa0a3d6
...
...
@@ -45,11 +45,6 @@ typedef struct VmdDemuxContext {
int
video_stream_index
;
int
audio_stream_index
;
unsigned
int
audio_type
;
unsigned
int
audio_samplerate
;
unsigned
int
audio_bits
;
unsigned
int
audio_channels
;
unsigned
int
frame_count
;
unsigned
int
frames_per_block
;
vmd_frame_t
*
frame_table
;
...
...
@@ -57,8 +52,6 @@ typedef struct VmdDemuxContext {
int
sample_rate
;
int64_t
audio_sample_counter
;
int
audio_frame_divisor
;
int
audio_block_align
;
int
skiphdr
;
unsigned
char
vmd_header
[
VMD_HEADER_SIZE
];
...
...
@@ -78,79 +71,42 @@ static int vmd_probe(AVProbeData *p)
return
AVPROBE_SCORE_MAX
/
2
;
}
/* This is a support function to determine the duration, in sample
* frames, of a particular audio chunk, taking into account silent
* encodings. */
static
int
vmd_calculate_audio_duration
(
unsigned
char
*
audio_chunk
,
int
audio_chunk_size
,
int
block_align
)
{
unsigned
char
*
p
=
audio_chunk
+
16
;
unsigned
char
*
p_end
=
audio_chunk
+
audio_chunk_size
;
int
total_samples
=
0
;
unsigned
int
sound_flags
;
if
(
audio_chunk_size
<
16
)
return
0
;
if
(
audio_chunk_size
==
block_align
+
16
)
return
block_align
;
if
(
audio_chunk_size
==
block_align
+
17
)
return
block_align
;
sound_flags
=
LE_32
(
p
);
p
+=
4
;
while
(
p
<
p_end
)
{
total_samples
+=
block_align
;
if
((
sound_flags
&
0x01
)
==
0
)
p
+=
block_align
;
sound_flags
>>=
1
;
}
av_log
(
NULL
,
0
,
"Got %i samples for size %i map %08X
\n
"
,
total_samples
,
audio_chunk_size
,
LE_32
(
audio_chunk
));
return
total_samples
;
}
static
int
vmd_read_header
(
AVFormatContext
*
s
,
AVFormatParameters
*
ap
)
{
VmdDemuxContext
*
vmd
=
(
VmdDemuxContext
*
)
s
->
priv_data
;
ByteIOContext
*
pb
=
&
s
->
pb
;
AVStream
*
st
;
AVStream
*
st
,
*
vst
;
unsigned
int
toc_offset
;
unsigned
char
*
raw_frame_table
;
int
raw_frame_table_size
;
offset_t
current_offset
;
int
i
,
j
;
unsigned
int
total_frames
;
int64_t
video_pts_inc
=
0
;
int64_t
current_video_pts
=
0
;
int64_t
pts_inc
=
1
;
int64_t
current_video_pts
=
0
,
current_audio_pts
=
0
;
unsigned
char
chunk
[
BYTES_PER_FRAME_RECORD
];
int
lastframe
=
0
;
int
num
,
den
;
/* fetch the main header, including the 2 header length bytes */
url_fseek
(
pb
,
0
,
SEEK_SET
);
if
(
get_buffer
(
pb
,
vmd
->
vmd_header
,
VMD_HEADER_SIZE
)
!=
VMD_HEADER_SIZE
)
return
AVERROR_IO
;
vmd
->
audio_sample_counter
=
0
;
vmd
->
audio_frame_divisor
=
1
;
vmd
->
audio_block_align
=
1
;
/* start up the decoders */
st
=
av_new_stream
(
s
,
0
);
if
(
!
st
)
v
st
=
av_new_stream
(
s
,
0
);
if
(
!
v
st
)
return
AVERROR_NOMEM
;
av_set_pts_info
(
st
,
33
,
1
,
90000
);
vmd
->
video_stream_index
=
st
->
index
;
st
->
codec
->
codec_type
=
CODEC_TYPE_VIDEO
;
st
->
codec
->
codec_id
=
CODEC_ID_VMDVIDEO
;
st
->
codec
->
codec_tag
=
0
;
/* no fourcc */
st
->
codec
->
width
=
LE_16
(
&
vmd
->
vmd_header
[
12
]);
st
->
codec
->
height
=
LE_16
(
&
vmd
->
vmd_header
[
14
]);
st
->
codec
->
time_base
.
num
=
1
;
st
->
codec
->
time_base
.
den
=
10
;
st
->
codec
->
extradata_size
=
VMD_HEADER_SIZE
;
st
->
codec
->
extradata
=
av_mallocz
(
VMD_HEADER_SIZE
+
FF_INPUT_BUFFER_PADDING_SIZE
);
memcpy
(
st
->
codec
->
extradata
,
vmd
->
vmd_header
,
VMD_HEADER_SIZE
);
av_set_pts_info
(
vst
,
33
,
1
,
10
);
vmd
->
video_stream_index
=
vst
->
index
;
vst
->
codec
->
codec_type
=
CODEC_TYPE_VIDEO
;
vst
->
codec
->
codec_id
=
CODEC_ID_VMDVIDEO
;
vst
->
codec
->
codec_tag
=
0
;
/* no fourcc */
vst
->
codec
->
width
=
LE_16
(
&
vmd
->
vmd_header
[
12
]);
vst
->
codec
->
height
=
LE_16
(
&
vmd
->
vmd_header
[
14
]);
vst
->
codec
->
extradata_size
=
VMD_HEADER_SIZE
;
vst
->
codec
->
extradata
=
av_mallocz
(
VMD_HEADER_SIZE
+
FF_INPUT_BUFFER_PADDING_SIZE
);
memcpy
(
vst
->
codec
->
extradata
,
vmd
->
vmd_header
,
VMD_HEADER_SIZE
);
/* if sample rate is 0, assume no audio */
vmd
->
sample_rate
=
LE_16
(
&
vmd
->
vmd_header
[
804
]);
...
...
@@ -158,35 +114,29 @@ static int vmd_read_header(AVFormatContext *s,
st
=
av_new_stream
(
s
,
0
);
if
(
!
st
)
return
AVERROR_NOMEM
;
av_set_pts_info
(
st
,
33
,
1
,
90000
);
vmd
->
audio_stream_index
=
st
->
index
;
st
->
codec
->
codec_type
=
CODEC_TYPE_AUDIO
;
st
->
codec
->
codec_id
=
CODEC_ID_VMDAUDIO
;
st
->
codec
->
codec_tag
=
0
;
/* no fourcc */
st
->
codec
->
channels
=
vmd
->
audio_channels
=
(
vmd
->
vmd_header
[
811
]
&
0x80
)
?
2
:
1
;
st
->
codec
->
channels
=
(
vmd
->
vmd_header
[
811
]
&
0x80
)
?
2
:
1
;
st
->
codec
->
sample_rate
=
vmd
->
sample_rate
;
st
->
codec
->
block_align
=
vmd
->
audio_block_align
=
LE_16
(
&
vmd
->
vmd_header
[
806
]);
st
->
codec
->
block_align
=
LE_16
(
&
vmd
->
vmd_header
[
806
]);
if
(
st
->
codec
->
block_align
&
0x8000
)
{
st
->
codec
->
bits_per_sample
=
16
;
st
->
codec
->
block_align
=
-
(
st
->
codec
->
block_align
-
0x10000
);
vmd
->
audio_block_align
=
-
(
vmd
->
audio_block_align
-
0x10000
);
}
else
{
st
->
codec
->
bits_per_sample
=
8
;
}
st
->
codec
->
bit_rate
=
st
->
codec
->
sample_rate
*
st
->
codec
->
bits_per_sample
*
st
->
codec
->
channels
;
/* for calculating pts */
vmd
->
audio_frame_divisor
=
st
->
codec
->
channels
;
video_pts_inc
=
90000
;
video_pts_inc
*=
st
->
codec
->
block_align
;
video_pts_inc
/=
st
->
codec
->
sample_rate
;
video_pts_inc
/=
st
->
codec
->
channels
;
}
else
{
/* if no audio, assume 10 frames/second */
video_pts_inc
=
90000
/
10
;
/* calculate pts */
num
=
st
->
codec
->
block_align
;
den
=
st
->
codec
->
sample_rate
*
st
->
codec
->
channels
;
av_reduce
(
&
den
,
&
num
,
den
,
num
,
(
1UL
<<
31
)
-
1
);
av_set_pts_info
(
vst
,
33
,
num
,
den
);
av_set_pts_info
(
st
,
33
,
num
,
den
);
pts_inc
=
num
;
}
toc_offset
=
LE_32
(
&
vmd
->
vmd_header
[
812
]);
...
...
@@ -236,24 +186,23 @@ static int vmd_read_header(AVFormatContext *s,
vmd
->
frame_table
[
total_frames
].
stream_index
=
vmd
->
audio_stream_index
;
vmd
->
frame_table
[
total_frames
].
frame_size
=
size
;
memcpy
(
vmd
->
frame_table
[
total_frames
].
frame_record
,
chunk
,
BYTES_PER_FRAME_RECORD
);
vmd
->
frame_table
[
total_frames
].
pts
=
current_audio_pts
;
total_frames
++
;
/* first audio chunk contains several audio buffers */
current_audio_pts
+=
(
current_audio_pts
==
0
)
?
LE_16
(
&
vmd
->
vmd_header
[
808
])
*
pts_inc
:
pts_inc
;
break
;
case
2
:
/* Video Chunk */
vmd
->
frame_table
[
total_frames
].
frame_offset
=
current_offset
;
vmd
->
frame_table
[
total_frames
].
frame_size
=
size
;
vmd
->
frame_table
[
total_frames
].
stream_index
=
vmd
->
video_stream_index
;
vmd
->
frame_table
[
total_frames
].
frame_size
=
size
;
memcpy
(
vmd
->
frame_table
[
total_frames
].
frame_record
,
chunk
,
BYTES_PER_FRAME_RECORD
);
vmd
->
frame_table
[
total_frames
].
pts
=
current_video_pts
;
if
(
lastframe
)
{
vmd
->
frame_table
[
lastframe
].
pts
=
current_video_pts
-
video_pts_inc
;
}
lastframe
=
total_frames
;
total_frames
++
;
break
;
}
current_offset
+=
size
;
}
current_video_pts
+=
video_
pts_inc
;
current_video_pts
+=
pts_inc
;
}
av_free
(
raw_frame_table
);
...
...
@@ -291,21 +240,11 @@ static int vmd_read_packet(AVFormatContext *s,
ret
=
AVERROR_IO
;
}
pkt
->
stream_index
=
frame
->
stream_index
;
if
(
frame
->
frame_record
[
0
]
==
0x02
)
pkt
->
pts
=
frame
->
pts
;
else
{
pkt
->
pts
=
vmd
->
audio_sample_counter
;
pkt
->
pts
*=
90000
;
pkt
->
pts
/=
vmd
->
sample_rate
;
pkt
->
pts
/=
vmd
->
audio_channels
;
vmd
->
audio_sample_counter
+=
vmd_calculate_audio_duration
(
pkt
->
data
,
pkt
->
size
,
vmd
->
audio_block_align
);
}
av_log
(
NULL
,
AV_LOG_INFO
,
" dispatching %s frame with %d bytes and pts %"
PRId64
" (%0.1f sec)
\n
"
,
pkt
->
pts
=
frame
->
pts
;
av_log
(
NULL
,
AV_LOG_INFO
,
" dispatching %s frame with %d bytes and pts %"
PRId64
"
\n
"
,
(
frame
->
frame_record
[
0
]
==
0x02
)
?
"video"
:
"audio"
,
frame
->
frame_size
+
BYTES_PER_FRAME_RECORD
,
pkt
->
pts
,
(
float
)(
pkt
->
pts
/
90000
.
0
)
);
pkt
->
pts
);
vmd
->
current_frame
++
;
...
...
编辑
预览
Markdown
is supported
0%
请重试
或
添加新附件
.
添加附件
取消
You are about to add
0
people
to the discussion. Proceed with caution.
先完成此消息的编辑!
取消
想要评论请
注册
或
登录