Skip to content
体验新版
项目
组织
正在加载...
登录
切换导航
打开侧边栏
尘离序散
obs-studio
提交
6a136ade
O
obs-studio
项目概览
尘离序散
/
obs-studio
与 Fork 源项目一致
从无法访问的项目Fork
通知
30
Star
0
Fork
0
代码
文件
提交
分支
Tags
贡献者
分支图
Diff
Issue
0
列表
看板
标记
里程碑
合并请求
0
Wiki
0
Wiki
分析
仓库
DevOps
项目成员
Pages
O
obs-studio
项目概览
项目概览
详情
发布
仓库
仓库
文件
提交
分支
标签
贡献者
分支图
比较
Issue
0
Issue
0
列表
看板
标记
里程碑
合并请求
0
合并请求
0
Pages
分析
分析
仓库分析
DevOps
Wiki
0
Wiki
成员
成员
收起侧边栏
关闭侧边栏
动态
分支图
创建新Issue
提交
Issue看板
体验新版 GitCode,发现更多精彩内容 >>
提交
6a136ade
编写于
7月 02, 2015
作者:
P
Palana
浏览文件
操作
浏览文件
下载
电子邮件补丁
差异文件
UI: Add (AAC) audio encoder inspection helpers
上级
473244da
变更
3
隐藏空白更改
内联
并排
Showing
3 changed file
with
175 addition
and
0 deletion
+175
-0
obs/CMakeLists.txt
obs/CMakeLists.txt
+2
-0
obs/audio-encoders.cpp
obs/audio-encoders.cpp
+167
-0
obs/audio-encoders.hpp
obs/audio-encoders.hpp
+6
-0
未找到文件。
obs/CMakeLists.txt
浏览文件 @
6a136ade
...
...
@@ -126,6 +126,7 @@ set(obs_SOURCES
hotkey-edit.cpp
source-label.cpp
remote-text.cpp
audio-encoders.cpp
qt-wrappers.cpp
)
set
(
obs_HEADERS
...
...
@@ -166,6 +167,7 @@ set(obs_HEADERS
hotkey-edit.hpp
source-label.hpp
remote-text.hpp
audio-encoders.hpp
qt-wrappers.hpp
)
set
(
obs_UI
...
...
obs/audio-encoders.cpp
0 → 100644
浏览文件 @
6a136ade
#include <algorithm>
#include <iomanip>
#include <map>
#include <memory>
#include <mutex>
#include <sstream>
#include <string>
#include <vector>
#include "audio-encoders.hpp"
using
namespace
std
;
static
const
string
encoders
[]
=
{
"ffmpeg_aac"
,
"libfdk_aac"
,
"CoreAudio_AAC"
,
};
static
const
string
&
fallbackEncoder
=
encoders
[
0
];
static
const
char
*
NullToEmpty
(
const
char
*
str
)
{
return
str
?
str
:
""
;
}
static
const
char
*
EncoderName
(
const
char
*
id
)
{
return
NullToEmpty
(
obs_encoder_get_display_name
(
id
));
}
static
map
<
int
,
const
char
*>
bitrateMap
;
static
once_flag
populateBitrateMap
;
static
void
HandleIntProperty
(
obs_property_t
*
prop
,
const
char
*
id
)
{
const
int
max_
=
obs_property_int_max
(
prop
);
const
int
step
=
obs_property_int_step
(
prop
);
for
(
int
i
=
obs_property_int_min
(
prop
);
i
<=
max_
;
i
+=
step
)
bitrateMap
[
i
]
=
id
;
}
static
void
HandleListProperty
(
obs_property_t
*
prop
,
const
char
*
id
)
{
obs_combo_format
format
=
obs_property_list_format
(
prop
);
if
(
format
!=
OBS_COMBO_FORMAT_INT
)
{
blog
(
LOG_ERROR
,
"Encoder '%s' (%s) returned bitrate "
"OBS_PROPERTY_LIST property of unhandled "
"format %d"
,
EncoderName
(
id
),
id
,
static_cast
<
int
>
(
format
));
return
;
}
const
size_t
count
=
obs_property_list_item_count
(
prop
);
for
(
size_t
i
=
0
;
i
<
count
;
i
++
)
{
int
bitrate
=
static_cast
<
int
>
(
obs_property_list_item_int
(
prop
,
i
));
bitrateMap
[
bitrate
]
=
id
;
}
}
static
void
HandleEncoderProperties
(
const
char
*
id
)
{
auto
DestroyProperties
=
[](
obs_properties_t
*
props
)
{
obs_properties_destroy
(
props
);
};
std
::
unique_ptr
<
obs_properties_t
,
decltype
(
DestroyProperties
)
>
props
{
obs_get_encoder_properties
(
id
),
DestroyProperties
};
if
(
!
props
)
{
blog
(
LOG_ERROR
,
"Failed to get properties for encoder "
"'%s' (%s)"
,
EncoderName
(
id
),
id
);
return
;
}
obs_property_t
*
bitrate
=
obs_properties_get
(
props
.
get
(),
"bitrate"
);
obs_property_type
type
=
obs_property_get_type
(
bitrate
);
switch
(
type
)
{
case
OBS_PROPERTY_INT
:
return
HandleIntProperty
(
bitrate
,
id
);
case
OBS_PROPERTY_LIST
:
return
HandleListProperty
(
bitrate
,
id
);
default:
break
;
}
blog
(
LOG_ERROR
,
"Encoder '%s' (%s) returned bitrate property "
"of unhandled type %d"
,
EncoderName
(
id
),
id
,
static_cast
<
int
>
(
type
));
}
static
const
char
*
GetCodec
(
const
char
*
id
)
{
return
NullToEmpty
(
obs_get_encoder_codec
(
id
));
}
static
const
string
aac_
=
"AAC"
;
static
void
PopulateBitrateMap
()
{
call_once
(
populateBitrateMap
,
[]()
{
HandleEncoderProperties
(
fallbackEncoder
.
c_str
());
const
char
*
id
=
nullptr
;
for
(
size_t
i
=
0
;
obs_enum_encoder_types
(
i
,
&
id
);
i
++
)
{
auto
Compare
=
[
=
](
const
string
&
val
)
{
return
val
==
NullToEmpty
(
id
);
};
if
(
find_if
(
begin
(
encoders
),
end
(
encoders
),
Compare
)
!=
end
(
encoders
))
continue
;
if
(
aac_
!=
GetCodec
(
id
))
continue
;
HandleEncoderProperties
(
id
);
}
for
(
auto
&
encoder
:
encoders
)
{
if
(
encoder
==
fallbackEncoder
)
continue
;
if
(
aac_
!=
GetCodec
(
encoder
.
c_str
()))
continue
;
HandleEncoderProperties
(
encoder
.
c_str
());
}
if
(
bitrateMap
.
empty
())
{
blog
(
LOG_ERROR
,
"Could not enumerate any AAC encoder "
"bitrates"
);
return
;
}
ostringstream
ss
;
for
(
auto
&
entry
:
bitrateMap
)
ss
<<
"
\n
"
<<
setw
(
3
)
<<
entry
.
first
<<
" kbit/s: '"
<<
EncoderName
(
entry
.
second
)
<<
"' ("
<<
entry
.
second
<<
')'
;
blog
(
LOG_INFO
,
"AAC encoder bitrate mapping:%s"
,
ss
.
str
().
c_str
());
});
}
const
map
<
int
,
const
char
*>
&
GetAACEncoderBitrateMap
()
{
PopulateBitrateMap
();
return
bitrateMap
;
}
const
char
*
GetAACEncoderForBitrate
(
int
bitrate
)
{
auto
&
map_
=
GetAACEncoderBitrateMap
();
auto
res
=
map_
.
find
(
bitrate
);
if
(
res
==
end
(
map_
))
return
NULL
;
return
res
->
second
;
}
obs/audio-encoders.hpp
0 → 100644
浏览文件 @
6a136ade
#include <obs.hpp>
#include <map>
const
std
::
map
<
int
,
const
char
*>
&
GetAACEncoderBitrateMap
();
const
char
*
GetAACEncoderForBitrate
(
int
bitrate
);
编辑
预览
Markdown
is supported
0%
请重试
或
添加新附件
.
添加附件
取消
You are about to add
0
people
to the discussion. Proceed with caution.
先完成此消息的编辑!
取消
想要评论请
注册
或
登录