Skip to content
体验新版
项目
组织
正在加载...
登录
切换导航
打开侧边栏
小白菜888
Ffmpeg
提交
073f8b10
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,体验更适合开发者的 AI 搜索 >>
提交
073f8b10
编写于
3月 16, 2011
作者:
A
Anton Khirnov
提交者:
Luca Barbato
3月 17, 2011
浏览文件
操作
浏览文件
下载
电子邮件补丁
差异文件
nutenc: mux chapters.
Signed-off-by:
N
Luca Barbato
<
lu_zero@gentoo.org
>
上级
4af9c1a5
变更
2
隐藏空白更改
内联
并排
Showing
2 changed file
with
67 addition
and
4 deletion
+67
-4
libavformat/nut.h
libavformat/nut.h
+5
-0
libavformat/nutenc.c
libavformat/nutenc.c
+62
-4
未找到文件。
libavformat/nut.h
浏览文件 @
073f8b10
...
...
@@ -81,6 +81,10 @@ typedef struct {
int
decode_delay
;
//FIXME duplicate of has_b_frames
}
StreamContext
;
typedef
struct
{
AVRational
*
time_base
;
}
ChapterContext
;
typedef
struct
{
AVFormatContext
*
avf
;
// int written_packet_size;
...
...
@@ -90,6 +94,7 @@ typedef struct {
const
uint8_t
*
header
[
128
];
uint64_t
next_startcode
;
///< stores the next startcode if it has already been parsed but the stream is not seekable
StreamContext
*
stream
;
ChapterContext
*
chapter
;
unsigned
int
max_distance
;
unsigned
int
time_base_count
;
int64_t
last_syncpoint_pos
;
...
...
libavformat/nutenc.c
浏览文件 @
073f8b10
...
...
@@ -241,9 +241,9 @@ static void build_frame_code(AVFormatContext *s){
nut
->
frame_code
[
'N'
].
flags
=
FLAG_INVALID
;
}
static
void
put_tt
(
NUTContext
*
nut
,
StreamContext
*
nus
,
AVIOContext
*
bc
,
uint64_t
val
){
static
void
put_tt
(
NUTContext
*
nut
,
AVRational
*
time_base
,
AVIOContext
*
bc
,
uint64_t
val
){
val
*=
nut
->
time_base_count
;
val
+=
nus
->
time_base
-
nut
->
time_base
;
val
+=
time_base
-
nut
->
time_base
;
ff_put_v
(
bc
,
val
);
}
...
...
@@ -486,6 +486,34 @@ static int write_streaminfo(NUTContext *nut, AVIOContext *bc, int stream_id){
return
count
;
}
static
int
write_chapter
(
NUTContext
*
nut
,
AVIOContext
*
bc
,
int
id
)
{
AVIOContext
*
dyn_bc
;
uint8_t
*
dyn_buf
=
NULL
;
AVMetadataTag
*
t
=
NULL
;
AVChapter
*
ch
=
nut
->
avf
->
chapters
[
id
];
int
ret
,
dyn_size
,
count
=
0
;
ret
=
url_open_dyn_buf
(
&
dyn_bc
);
if
(
ret
<
0
)
return
ret
;
ff_put_v
(
bc
,
0
);
// stream_id_plus1
put_s
(
bc
,
id
+
1
);
// chapter_id
put_tt
(
nut
,
nut
->
chapter
[
id
].
time_base
,
bc
,
ch
->
start
);
// chapter_start
ff_put_v
(
bc
,
ch
->
end
-
ch
->
start
);
// chapter_len
while
((
t
=
av_metadata_get
(
ch
->
metadata
,
""
,
t
,
AV_METADATA_IGNORE_SUFFIX
)))
count
+=
add_info
(
dyn_bc
,
t
->
key
,
t
->
value
);
ff_put_v
(
bc
,
count
);
dyn_size
=
url_close_dyn_buf
(
dyn_bc
,
&
dyn_buf
);
avio_write
(
bc
,
dyn_buf
,
dyn_size
);
av_freep
(
&
dyn_buf
);
return
0
;
}
static
int
write_headers
(
AVFormatContext
*
avctx
,
AVIOContext
*
bc
){
NUTContext
*
nut
=
avctx
->
priv_data
;
AVIOContext
*
dyn_bc
;
...
...
@@ -530,6 +558,20 @@ static int write_headers(AVFormatContext *avctx, AVIOContext *bc){
}
}
for
(
i
=
0
;
i
<
nut
->
avf
->
nb_chapters
;
i
++
)
{
ret
=
url_open_dyn_buf
(
&
dyn_bc
);
if
(
ret
<
0
)
return
ret
;
ret
=
write_chapter
(
nut
,
dyn_bc
,
i
);
if
(
ret
<
0
)
{
uint8_t
*
buf
;
url_close_dyn_buf
(
dyn_bc
,
&
buf
);
av_freep
(
&
buf
);
return
ret
;
}
put_packet
(
nut
,
bc
,
dyn_bc
,
1
,
INFO_STARTCODE
);
}
nut
->
last_syncpoint_pos
=
INT_MIN
;
nut
->
header_count
++
;
return
0
;
...
...
@@ -543,7 +585,9 @@ static int write_header(AVFormatContext *s){
nut
->
avf
=
s
;
nut
->
stream
=
av_mallocz
(
sizeof
(
StreamContext
)
*
s
->
nb_streams
);
nut
->
time_base
=
av_mallocz
(
sizeof
(
AVRational
)
*
s
->
nb_streams
);
nut
->
chapter
=
av_mallocz
(
sizeof
(
ChapterContext
)
*
s
->
nb_chapters
);
nut
->
time_base
=
av_mallocz
(
sizeof
(
AVRational
)
*
(
s
->
nb_streams
+
s
->
nb_chapters
));
for
(
i
=
0
;
i
<
s
->
nb_streams
;
i
++
){
AVStream
*
st
=
s
->
streams
[
i
];
...
...
@@ -570,6 +614,20 @@ static int write_header(AVFormatContext *s){
nut
->
stream
[
i
].
max_pts_distance
=
FFMAX
(
time_base
.
den
,
time_base
.
num
)
/
time_base
.
num
;
}
for
(
i
=
0
;
i
<
s
->
nb_chapters
;
i
++
)
{
AVChapter
*
ch
=
s
->
chapters
[
i
];
for
(
j
=
0
;
j
<
nut
->
time_base_count
;
j
++
)
{
if
(
!
memcmp
(
&
ch
->
time_base
,
&
nut
->
time_base
[
j
],
sizeof
(
AVRational
)))
break
;
}
nut
->
time_base
[
j
]
=
ch
->
time_base
;
nut
->
chapter
[
i
].
time_base
=
&
nut
->
time_base
[
j
];
if
(
j
==
nut
->
time_base_count
)
nut
->
time_base_count
++
;
}
nut
->
max_distance
=
MAX_DISTANCE
;
build_elision_headers
(
s
);
build_frame_code
(
s
);
...
...
@@ -672,7 +730,7 @@ static int write_packet(AVFormatContext *s, AVPacket *pkt){
ret
=
url_open_dyn_buf
(
&
dyn_bc
);
if
(
ret
<
0
)
return
ret
;
put_tt
(
nut
,
nus
,
dyn_bc
,
pkt
->
dts
);
put_tt
(
nut
,
nus
->
time_base
,
dyn_bc
,
pkt
->
dts
);
ff_put_v
(
dyn_bc
,
sp
?
(
nut
->
last_syncpoint_pos
-
sp
->
pos
)
>>
4
:
0
);
put_packet
(
nut
,
bc
,
dyn_bc
,
1
,
SYNCPOINT_STARTCODE
);
...
...
编辑
预览
Markdown
is supported
0%
请重试
或
添加新附件
.
添加附件
取消
You are about to add
0
people
to the discussion. Proceed with caution.
先完成此消息的编辑!
取消
想要评论请
注册
或
登录