Skip to content
体验新版
项目
组织
正在加载...
登录
切换导航
打开侧边栏
小白菜888
Ffmpeg
提交
44015c56
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,发现更多精彩内容 >>
提交
44015c56
编写于
8月 08, 2008
作者:
A
Aurelien Jacobs
浏览文件
操作
浏览文件
下载
电子邮件补丁
差异文件
matroskadec: add basic tags support (metadata)
Originally committed as revision 14672 to
svn://svn.ffmpeg.org/ffmpeg/trunk
上级
4f5c72e8
变更
2
隐藏空白更改
内联
并排
Showing
2 changed file
with
73 addition
and
1 deletion
+73
-1
libavformat/matroska.h
libavformat/matroska.h
+7
-1
libavformat/matroskadec.c
libavformat/matroskadec.c
+66
-0
未找到文件。
libavformat/matroska.h
浏览文件 @
44015c56
...
...
@@ -133,7 +133,13 @@
#define MATROSKA_ID_CUECLUSTERPOSITION 0xF1
/* IDs in the tags master */
/* TODO */
#define MATROSKA_ID_TAG 0x7373
#define MATROSKA_ID_SIMPLETAG 0x67C8
#define MATROSKA_ID_TAGNAME 0x45A3
#define MATROSKA_ID_TAGSTRING 0x4487
#define MATROSKA_ID_TAGLANG 0x447A
#define MATROSKA_ID_TAGDEFAULT 0x44B4
#define MATROSKA_ID_TAGTARGETS 0x63C0
/* IDs in the seekhead master */
#define MATROSKA_ID_SEEKENTRY 0x4DBB
...
...
libavformat/matroskadec.c
浏览文件 @
44015c56
...
...
@@ -163,6 +163,12 @@ typedef struct {
EbmlList
pos
;
}
MatroskaIndex
;
typedef
struct
{
char
*
name
;
char
*
string
;
EbmlList
sub
;
}
MatroskaTag
;
typedef
struct
{
uint64_t
id
;
uint64_t
pos
;
...
...
@@ -188,6 +194,7 @@ typedef struct {
EbmlList
attachments
;
EbmlList
chapters
;
EbmlList
index
;
EbmlList
tags
;
EbmlList
seekhead
;
/* byte position of the segment inside the stream */
...
...
@@ -390,7 +397,25 @@ static EbmlSyntax matroska_index[] = {
{
0
}
};
static
EbmlSyntax
matroska_simpletag
[]
=
{
{
MATROSKA_ID_TAGNAME
,
EBML_UTF8
,
0
,
offsetof
(
MatroskaTag
,
name
)
},
{
MATROSKA_ID_TAGSTRING
,
EBML_UTF8
,
0
,
offsetof
(
MatroskaTag
,
string
)
},
{
MATROSKA_ID_SIMPLETAG
,
EBML_NEST
,
sizeof
(
MatroskaTag
),
offsetof
(
MatroskaTag
,
sub
),
{.
n
=
matroska_simpletag
}
},
{
MATROSKA_ID_TAGLANG
,
EBML_NONE
},
{
MATROSKA_ID_TAGDEFAULT
,
EBML_NONE
},
{
EBML_ID_VOID
,
EBML_NONE
},
{
0
}
};
static
EbmlSyntax
matroska_tag
[]
=
{
{
MATROSKA_ID_SIMPLETAG
,
EBML_NEST
,
sizeof
(
MatroskaTag
),
0
,
{.
n
=
matroska_simpletag
}
},
{
MATROSKA_ID_TAGTARGETS
,
EBML_NONE
},
{
EBML_ID_VOID
,
EBML_NONE
},
{
0
}
};
static
EbmlSyntax
matroska_tags
[]
=
{
{
MATROSKA_ID_TAG
,
EBML_NEST
,
0
,
offsetof
(
MatroskaDemuxContext
,
tags
),
{.
n
=
matroska_tag
}
},
{
EBML_ID_VOID
,
EBML_NONE
},
{
0
}
};
...
...
@@ -448,6 +473,25 @@ static EbmlSyntax matroska_clusters[] = {
{
0
}
};
#define SIZE_OFF(x) sizeof(((AVFormatContext*)0)->x),offsetof(AVFormatContext,x)
const
struct
{
const
char
name
[
16
];
int
size
;
int
offset
;
}
metadata
[]
=
{
{
"TITLE"
,
SIZE_OFF
(
title
)
},
{
"ARTIST"
,
SIZE_OFF
(
author
)
},
{
"WRITTEN_BY"
,
SIZE_OFF
(
author
)
},
{
"LEAD_PERFORMER"
,
SIZE_OFF
(
author
)
},
{
"COPYRIGHT"
,
SIZE_OFF
(
copyright
)
},
{
"COMMENT"
,
SIZE_OFF
(
comment
)
},
{
"ALBUM"
,
SIZE_OFF
(
album
)
},
{
"DATE_WRITTEN"
,
SIZE_OFF
(
year
)
},
{
"DATE_RELEASED"
,
SIZE_OFF
(
year
)
},
{
"PART_NUMBER"
,
SIZE_OFF
(
track
)
},
{
"GENRE"
,
SIZE_OFF
(
genre
)
},
};
/*
* Return: Whether we reached the end of a level in the hierarchy or not.
*/
...
...
@@ -891,6 +935,27 @@ static int matroska_decode_buffer(uint8_t** buf, int* buf_size,
return
-
1
;
}
static
void
matroska_convert_tags
(
AVFormatContext
*
s
,
EbmlList
*
list
)
{
MatroskaTag
*
tags
=
list
->
elem
;
int
i
,
j
;
for
(
i
=
0
;
i
<
list
->
nb_elem
;
i
++
)
{
for
(
j
=
0
;
j
<
ARRAY_SIZE
(
metadata
);
j
++
){
if
(
!
strcmp
(
tags
[
i
].
name
,
metadata
[
j
].
name
))
{
int
*
ptr
=
(
int
*
)((
char
*
)
s
+
metadata
[
j
].
offset
);
if
(
*
ptr
)
continue
;
if
(
metadata
[
j
].
size
>
sizeof
(
int
))
av_strlcpy
((
char
*
)
ptr
,
tags
[
i
].
string
,
metadata
[
j
].
size
);
else
*
ptr
=
atoi
(
tags
[
i
].
string
);
}
}
if
(
tags
[
i
].
sub
.
nb_elem
)
matroska_convert_tags
(
s
,
&
tags
[
i
].
sub
);
}
}
static
void
matroska_execute_seekhead
(
MatroskaDemuxContext
*
matroska
)
{
EbmlList
*
seekhead_list
=
&
matroska
->
seekhead
;
...
...
@@ -1002,6 +1067,7 @@ static int matroska_read_header(AVFormatContext *s, AVFormatParameters *ap)
if
(
matroska
->
title
)
strncpy
(
matroska
->
ctx
->
title
,
matroska
->
title
,
sizeof
(
matroska
->
ctx
->
title
)
-
1
);
matroska_convert_tags
(
s
,
&
matroska
->
tags
);
tracks
=
matroska
->
tracks
.
elem
;
for
(
i
=
0
;
i
<
matroska
->
tracks
.
nb_elem
;
i
++
)
{
...
...
编辑
预览
Markdown
is supported
0%
请重试
或
添加新附件
.
添加附件
取消
You are about to add
0
people
to the discussion. Proceed with caution.
先完成此消息的编辑!
取消
想要评论请
注册
或
登录