Skip to content
体验新版
项目
组织
正在加载...
登录
切换导航
打开侧边栏
小白菜888
Ffmpeg
提交
5c9c305d
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,发现更多精彩内容 >>
提交
5c9c305d
编写于
2月 28, 2014
作者:
P
Patrice Clement
提交者:
Diego Biurrun
3月 02, 2014
浏览文件
操作
浏览文件
下载
电子邮件补丁
差异文件
ass: K&R formatting cosmetics
上级
95144403
变更
1
隐藏空白更改
内联
并排
Showing
1 changed file
with
49 addition
and
46 deletion
+49
-46
libavformat/assdec.c
libavformat/assdec.c
+49
-46
未找到文件。
libavformat/assdec.c
浏览文件 @
5c9c305d
...
...
@@ -22,24 +22,25 @@
#include <stdint.h>
#include "libavutil/mathematics.h"
#include "avformat.h"
#include "internal.h"
#define MAX_LINESIZE 2000
typedef
struct
ASSContext
{
typedef
struct
ASSContext
{
uint8_t
*
event_buffer
;
uint8_t
**
event
;
unsigned
int
event_count
;
unsigned
int
event_index
;
}
ASSContext
;
}
ASSContext
;
static
int
probe
(
AVProbeData
*
p
)
{
const
char
*
header
=
"[Script Info]"
;
const
char
*
header
=
"[Script Info]"
;
if
(
!
memcmp
(
p
->
buf
,
header
,
strlen
(
header
))
||
!
memcmp
(
p
->
buf
+
3
,
header
,
strlen
(
header
)))
if
(
!
memcmp
(
p
->
buf
,
header
,
strlen
(
header
))
||
!
memcmp
(
p
->
buf
+
3
,
header
,
strlen
(
header
)))
return
AVPROBE_SCORE_MAX
;
return
0
;
...
...
@@ -59,15 +60,15 @@ static int64_t get_pts(const uint8_t *p)
{
int
hour
,
min
,
sec
,
hsec
;
if
(
sscanf
(
p
,
"%*[^,],%d:%d:%d%*c%d"
,
&
hour
,
&
min
,
&
sec
,
&
hsec
)
!=
4
)
if
(
sscanf
(
p
,
"%*[^,],%d:%d:%d%*c%d"
,
&
hour
,
&
min
,
&
sec
,
&
hsec
)
!=
4
)
return
AV_NOPTS_VALUE
;
av_dlog
(
NULL
,
"%d %d %d %d [%s]
\n
"
,
hour
,
min
,
sec
,
hsec
,
p
);
min
+=
60
*
hour
;
sec
+=
60
*
min
;
min
+=
60
*
hour
;
sec
+=
60
*
min
;
return
sec
*
100
+
hsec
;
return
sec
*
100
+
hsec
;
}
static
int
event_cmp
(
const
void
*
_a
,
const
void
*
_b
)
...
...
@@ -82,54 +83,56 @@ static int read_header(AVFormatContext *s)
ASSContext
*
ass
=
s
->
priv_data
;
AVIOContext
*
pb
=
s
->
pb
;
AVStream
*
st
;
int
allocated
[
2
]
=
{
0
};
uint8_t
*
p
,
**
dst
[
2
]
=
{
0
};
int
pos
[
2
]
=
{
0
};
int
allocated
[
2
]
=
{
0
};
uint8_t
*
p
,
**
dst
[
2
]
=
{
0
};
int
pos
[
2
]
=
{
0
};
st
=
avformat_new_stream
(
s
,
NULL
);
if
(
!
st
)
return
-
1
;
avpriv_set_pts_info
(
st
,
64
,
1
,
100
);
st
->
codec
->
codec_type
=
AVMEDIA_TYPE_SUBTITLE
;
st
->
codec
->
codec_id
=
AV_CODEC_ID_SSA
;
st
->
codec
->
codec_id
=
AV_CODEC_ID_SSA
;
header_remaining
=
INT_MAX
;
header_remaining
=
INT_MAX
;
dst
[
0
]
=
&
st
->
codec
->
extradata
;
dst
[
1
]
=
&
ass
->
event_buffer
;
while
(
!
pb
->
eof_reached
)
{
while
(
!
pb
->
eof_reached
)
{
uint8_t
line
[
MAX_LINESIZE
];
len
=
ff_get_line
(
pb
,
line
,
sizeof
(
line
));
if
(
!
memcmp
(
line
,
"[Events]"
,
8
))
header_remaining
=
2
;
else
if
(
line
[
0
]
==
'['
)
header_remaining
=
INT_MAX
;
if
(
!
memcmp
(
line
,
"[Events]"
,
8
))
header_remaining
=
2
;
else
if
(
line
[
0
]
==
'['
)
header_remaining
=
INT_MAX
;
i
=
header_remaining
==
0
;
i
=
header_remaining
==
0
;
if
(
i
&&
get_pts
(
line
)
==
AV_NOPTS_VALUE
)
if
(
i
&&
get_pts
(
line
)
==
AV_NOPTS_VALUE
)
continue
;
p
=
av_fast_realloc
(
*
(
dst
[
i
]),
&
allocated
[
i
],
pos
[
i
]
+
MAX_LINESIZE
);
if
(
!
p
)
p
=
av_fast_realloc
(
*
(
dst
[
i
]),
&
allocated
[
i
],
pos
[
i
]
+
MAX_LINESIZE
);
if
(
!
p
)
goto
fail
;
*
(
dst
[
i
])
=
p
;
memcpy
(
p
+
pos
[
i
],
line
,
len
+
1
);
*
(
dst
[
i
])
=
p
;
memcpy
(
p
+
pos
[
i
],
line
,
len
+
1
);
pos
[
i
]
+=
len
;
if
(
i
)
ass
->
event_count
++
;
else
header_remaining
--
;
if
(
i
)
ass
->
event_count
++
;
else
header_remaining
--
;
}
st
->
codec
->
extradata_size
=
pos
[
0
];
st
->
codec
->
extradata_size
=
pos
[
0
];
if
(
ass
->
event_count
>=
UINT_MAX
/
sizeof
(
*
ass
->
event
))
if
(
ass
->
event_count
>=
UINT_MAX
/
sizeof
(
*
ass
->
event
))
goto
fail
;
ass
->
event
=
av_malloc
(
ass
->
event_count
*
sizeof
(
*
ass
->
event
));
p
=
ass
->
event_buffer
;
for
(
i
=
0
;
i
<
ass
->
event_count
;
i
++
)
{
ass
->
event
[
i
]
=
p
;
while
(
*
p
&&
*
p
!=
'\n'
)
ass
->
event
=
av_malloc
(
ass
->
event_count
*
sizeof
(
*
ass
->
event
));
p
=
ass
->
event_buffer
;
for
(
i
=
0
;
i
<
ass
->
event_count
;
i
++
)
{
ass
->
event
[
i
]
=
p
;
while
(
*
p
&&
*
p
!=
'\n'
)
p
++
;
p
++
;
}
...
...
@@ -149,16 +152,16 @@ static int read_packet(AVFormatContext *s, AVPacket *pkt)
ASSContext
*
ass
=
s
->
priv_data
;
uint8_t
*
p
,
*
end
;
if
(
ass
->
event_index
>=
ass
->
event_count
)
if
(
ass
->
event_index
>=
ass
->
event_count
)
return
AVERROR
(
EIO
);
p
=
ass
->
event
[
ass
->
event_index
];
p
=
ass
->
event
[
ass
->
event_index
];
end
=
strchr
(
p
,
'\n'
);
av_new_packet
(
pkt
,
end
?
end
-
p
+
1
:
strlen
(
p
));
end
=
strchr
(
p
,
'\n'
);
av_new_packet
(
pkt
,
end
?
end
-
p
+
1
:
strlen
(
p
));
pkt
->
flags
|=
AV_PKT_FLAG_KEY
;
pkt
->
pos
=
p
-
ass
->
event_buffer
+
s
->
streams
[
0
]
->
codec
->
extradata_size
;
pkt
->
pts
=
pkt
->
dts
=
get_pts
(
p
);
pkt
->
pos
=
p
-
ass
->
event_buffer
+
s
->
streams
[
0
]
->
codec
->
extradata_size
;
pkt
->
pts
=
pkt
->
dts
=
get_pts
(
p
);
memcpy
(
pkt
->
data
,
p
,
pkt
->
size
);
ass
->
event_index
++
;
...
...
@@ -182,21 +185,21 @@ static int read_seek2(AVFormatContext *s, int stream_index,
int64_t
min_ts_diff
=
INT64_MAX
;
if
(
stream_index
==
-
1
)
{
AVRational
time_base
=
s
->
streams
[
0
]
->
time_base
;
ts
=
av_rescale_q
(
ts
,
AV_TIME_BASE_Q
,
time_base
);
ts
=
av_rescale_q
(
ts
,
AV_TIME_BASE_Q
,
time_base
);
min_ts
=
av_rescale_rnd
(
min_ts
,
time_base
.
den
,
time_base
.
num
*
(
int64_t
)
AV_TIME_BASE
,
time_base
.
num
*
(
int64_t
)
AV_TIME_BASE
,
AV_ROUND_UP
);
max_ts
=
av_rescale_rnd
(
max_ts
,
time_base
.
den
,
time_base
.
num
*
(
int64_t
)
AV_TIME_BASE
,
time_base
.
num
*
(
int64_t
)
AV_TIME_BASE
,
AV_ROUND_DOWN
);
}
/* TODO: ass->event[] is sorted by pts so we could do a binary search */
for
(
i
=
0
;
i
<
ass
->
event_count
;
i
++
)
{
int64_t
pts
=
get_pts
(
ass
->
event
[
i
]);
for
(
i
=
0
;
i
<
ass
->
event_count
;
i
++
)
{
int64_t
pts
=
get_pts
(
ass
->
event
[
i
]);
int64_t
ts_diff
=
FFABS
(
pts
-
ts
);
if
(
pts
>=
min_ts
&&
pts
<=
max_ts
&&
ts_diff
<
min_ts_diff
)
{
min_ts_diff
=
ts_diff
;
idx
=
i
;
idx
=
i
;
}
}
if
(
idx
<
0
)
...
...
编辑
预览
Markdown
is supported
0%
请重试
或
添加新附件
.
添加附件
取消
You are about to add
0
people
to the discussion. Proceed with caution.
先完成此消息的编辑!
取消
想要评论请
注册
或
登录