Skip to content
体验新版
项目
组织
正在加载...
登录
切换导航
打开侧边栏
小白菜888
Ffmpeg
提交
d2c5f0a4
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,发现更多精彩内容 >>
提交
d2c5f0a4
编写于
9月 15, 2004
作者:
M
Michael Niedermayer
浏览文件
操作
浏览文件
下载
电子邮件补丁
差异文件
various fixes for the main chunk demux loop
Originally committed as revision 3464 to
svn://svn.ffmpeg.org/ffmpeg/trunk
上级
b100eab8
变更
1
隐藏空白更改
内联
并排
Showing
1 changed file
with
46 addition
and
27 deletion
+46
-27
libavformat/avidec.c
libavformat/avidec.c
+46
-27
未找到文件。
libavformat/avidec.c
浏览文件 @
d2c5f0a4
...
...
@@ -42,6 +42,9 @@ typedef struct AVIStream {
int
new_frame_offset
;
/* temporary storage (used during seek) */
int
cum_len
;
/* temporary storage (used during seek) */
int
prefix
;
///< normally 'd'<<8 + 'c' or 'w'<<8 + 'b'
int
prefix_count
;
}
AVIStream
;
typedef
struct
{
...
...
@@ -397,35 +400,54 @@ static int avi_read_packet(AVFormatContext *s, AVPacket *pkt)
size
=
d
[
4
]
+
(
d
[
5
]
<<
8
)
+
(
d
[
6
]
<<
16
)
+
(
d
[
7
]
<<
24
);
//parse ix##
n
=
(
d
[
2
]
-
'0'
)
*
10
+
(
d
[
3
]
-
'0'
);
if
(
d
[
2
]
>=
'0'
&&
d
[
2
]
<=
'9'
&&
d
[
3
]
>=
'0'
&&
d
[
3
]
<=
'9'
&&
d
[
0
]
==
'i'
&&
d
[
1
]
==
'x'
&&
n
<
s
->
nb_streams
&&
i
+
size
<=
avi
->
movi_end
){
url_fskip
(
pb
,
size
);
&&
d
[
3
]
>=
'0'
&&
d
[
3
]
<=
'9'
){
n
=
(
d
[
2
]
-
'0'
)
*
10
+
(
d
[
3
]
-
'0'
);
}
else
{
n
=
100
;
//invalid stream id
}
//av_log(NULL, AV_LOG_DEBUG, "%X %X %X %X %X %X %X %X %lld %d %d\n", d[0], d[1], d[2], d[3], d[4], d[5], d[6], d[7], i, size, n);
if
(
i
+
size
>
avi
->
movi_end
||
d
[
0
]
<
0
)
continue
;
//parse ix##
if
(
(
d
[
0
]
==
'i'
&&
d
[
1
]
==
'x'
&&
n
<
s
->
nb_streams
)
//parse JUNK
if
(
d
[
0
]
==
'J'
&&
d
[
1
]
==
'U'
&&
d
[
2
]
==
'N'
&&
d
[
3
]
==
'K'
&&
i
+
size
<=
avi
->
movi_end
)
{
||
(
d
[
0
]
==
'J'
&&
d
[
1
]
==
'U'
&&
d
[
2
]
==
'N'
&&
d
[
3
]
==
'K'
)){
url_fskip
(
pb
,
size
);
i
+=
size
;
memset
(
d
,
-
1
,
sizeof
(
int
)
*
8
);
//av_log(NULL, AV_LOG_DEBUG, "SKIP\n");
continue
;
}
//parse ##dc/##wb
n
=
(
d
[
0
]
-
'0'
)
*
10
+
(
d
[
1
]
-
'0'
);
if
(
d
[
0
]
>=
'0'
&&
d
[
0
]
<=
'9'
&&
d
[
1
]
>=
'0'
&&
d
[
1
]
<=
'9'
&&
((
d
[
2
]
==
'd'
&&
d
[
3
]
==
'c'
)
||
(
d
[
2
]
==
'w'
&&
d
[
3
]
==
'b'
)
||
(
d
[
2
]
==
'd'
&&
d
[
3
]
==
'b'
)
||
(
d
[
2
]
==
'_'
&&
d
[
3
]
==
'_'
))
&&
n
<
s
->
nb_streams
&&
i
+
size
<=
avi
->
movi_end
)
{
&&
d
[
1
]
>=
'0'
&&
d
[
1
]
<=
'9'
){
n
=
(
d
[
0
]
-
'0'
)
*
10
+
(
d
[
1
]
-
'0'
);
}
else
{
n
=
100
;
//invalid stream id
}
//parse ##dc/##wb
if
(
n
<
s
->
nb_streams
){
AVStream
*
st
;
AVIStream
*
ast
;
st
=
s
->
streams
[
n
];
ast
=
st
->
priv_data
;
if
(
(
ast
->
prefix_count
<
5
&&
d
[
2
]
<
128
&&
d
[
3
]
<
128
)
||
d
[
2
]
*
256
+
d
[
3
]
==
ast
->
prefix
/*||
(d[2] == 'd' && d[3] == 'c') ||
(d[2] == 'w' && d[3] == 'b')*/
)
{
//av_log(NULL, AV_LOG_DEBUG, "OK\n");
if
(
d
[
2
]
*
256
+
d
[
3
]
==
ast
->
prefix
)
ast
->
prefix_count
++
;
else
{
ast
->
prefix
=
d
[
2
]
*
256
+
d
[
3
];
ast
->
prefix_count
=
0
;
}
av_new_packet
(
pkt
,
size
);
get_buffer
(
pb
,
pkt
->
data
,
size
);
if
(
size
&
1
)
{
...
...
@@ -440,11 +462,6 @@ static int avi_read_packet(AVFormatContext *s, AVPacket *pkt)
pkt
->
destruct
=
dstr
;
pkt
->
flags
|=
PKT_FLAG_KEY
;
}
else
{
AVStream
*
st
;
AVIStream
*
ast
;
st
=
s
->
streams
[
n
];
ast
=
st
->
priv_data
;
/* XXX: how to handle B frames in avi ? */
pkt
->
dts
=
ast
->
frame_offset
;
// pkt->dts += ast->start;
...
...
@@ -471,8 +488,10 @@ static int avi_read_packet(AVFormatContext *s, AVPacket *pkt)
ast
->
frame_offset
++
;
}
return
size
;
}
}
}
return
-
1
;
}
...
...
编辑
预览
Markdown
is supported
0%
请重试
或
添加新附件
.
添加附件
取消
You are about to add
0
people
to the discussion. Proceed with caution.
先完成此消息的编辑!
取消
想要评论请
注册
或
登录