Skip to content
体验新版
项目
组织
正在加载...
登录
切换导航
打开侧边栏
尘离序散
obs-studio
提交
bfdf5dc9
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,发现更多精彩内容 >>
未验证
提交
bfdf5dc9
编写于
8月 05, 2020
作者:
J
Jim
提交者:
GitHub
8月 05, 2020
浏览文件
操作
浏览文件
下载
差异文件
Merge pull request #2356 from jpark37/sycc-color-space
Color space refinements
上级
1aee73fc
6a8507f2
变更
13
隐藏空白更改
内联
并排
Showing
13 changed file
with
188 addition
and
53 deletion
+188
-53
UI/forms/OBSBasicSettings.ui
UI/forms/OBSBasicSettings.ui
+5
-0
UI/window-basic-main.cpp
UI/window-basic-main.cpp
+6
-3
deps/media-playback/media-playback/media.c
deps/media-playback/media-playback/media.c
+9
-3
libobs/media-io/video-io.h
libobs/media-io/video-io.h
+3
-2
libobs/media-io/video-matrices.c
libobs/media-io/video-matrices.c
+2
-0
libobs/media-io/video-scaler-ffmpeg.c
libobs/media-io/video-scaler-ffmpeg.c
+3
-4
plugins/obs-ffmpeg/ffmpeg-mux/ffmpeg-mux.c
plugins/obs-ffmpeg/ffmpeg-mux/ffmpeg-mux.c
+20
-0
plugins/obs-ffmpeg/jim-nvenc.c
plugins/obs-ffmpeg/jim-nvenc.c
+19
-3
plugins/obs-ffmpeg/obs-ffmpeg-mux.c
plugins/obs-ffmpeg/obs-ffmpeg-mux.c
+31
-4
plugins/obs-ffmpeg/obs-ffmpeg-nvenc.c
plugins/obs-ffmpeg/obs-ffmpeg-nvenc.c
+19
-3
plugins/obs-ffmpeg/obs-ffmpeg-output.c
plugins/obs-ffmpeg/obs-ffmpeg-output.c
+37
-10
plugins/obs-ffmpeg/obs-ffmpeg-output.h
plugins/obs-ffmpeg/obs-ffmpeg-output.h
+3
-1
plugins/obs-x264/obs-x264.c
plugins/obs-x264/obs-x264.c
+31
-20
未找到文件。
UI/forms/OBSBasicSettings.ui
浏览文件 @
bfdf5dc9
...
...
@@ -4809,6 +4809,11 @@
</property>
<item>
<widget
class=
"QComboBox"
name=
"colorSpace"
>
<item>
<property
name=
"text"
>
<string
notr=
"true"
>
sRGB
</string>
</property>
</item>
<item>
<property
name=
"text"
>
<string
notr=
"true"
>
709
</string>
...
...
UI/window-basic-main.cpp
浏览文件 @
bfdf5dc9
...
...
@@ -1383,7 +1383,7 @@ bool OBSBasic::InitBasicConfigDefaults()
config_set_default_uint
(
basicConfig
,
"Video"
,
"FPSDen"
,
1
);
config_set_default_string
(
basicConfig
,
"Video"
,
"ScaleType"
,
"bicubic"
);
config_set_default_string
(
basicConfig
,
"Video"
,
"ColorFormat"
,
"NV12"
);
config_set_default_string
(
basicConfig
,
"Video"
,
"ColorSpace"
,
"
601
"
);
config_set_default_string
(
basicConfig
,
"Video"
,
"ColorSpace"
,
"
sRGB
"
);
config_set_default_string
(
basicConfig
,
"Video"
,
"ColorRange"
,
"Partial"
);
...
...
@@ -3792,8 +3792,11 @@ int OBSBasic::ResetVideo()
ovi
.
output_height
=
(
uint32_t
)
config_get_uint
(
basicConfig
,
"Video"
,
"OutputCY"
);
ovi
.
output_format
=
GetVideoFormatFromName
(
colorFormat
);
ovi
.
colorspace
=
astrcmpi
(
colorSpace
,
"601"
)
==
0
?
VIDEO_CS_601
:
VIDEO_CS_709
;
ovi
.
colorspace
=
astrcmpi
(
colorSpace
,
"601"
)
==
0
?
VIDEO_CS_601
:
(
astrcmpi
(
colorSpace
,
"709"
)
==
0
?
VIDEO_CS_709
:
VIDEO_CS_SRGB
);
ovi
.
range
=
astrcmpi
(
colorRange
,
"Full"
)
==
0
?
VIDEO_RANGE_FULL
:
VIDEO_RANGE_PARTIAL
;
ovi
.
adapter
=
...
...
deps/media-playback/media-playback/media.c
浏览文件 @
bfdf5dc9
...
...
@@ -109,9 +109,15 @@ static inline enum speaker_layout convert_speaker_layout(uint8_t channels)
}
}
static
inline
enum
video_colorspace
convert_color_space
(
enum
AVColorSpace
s
)
static
inline
enum
video_colorspace
convert_color_space
(
enum
AVColorSpace
s
,
enum
AVColorTransferCharacteristic
trc
)
{
return
s
==
AVCOL_SPC_BT709
?
VIDEO_CS_709
:
VIDEO_CS_DEFAULT
;
if
(
s
==
AVCOL_SPC_BT709
)
{
return
(
trc
==
AVCOL_TRC_IEC61966_2_1
)
?
VIDEO_CS_SRGB
:
VIDEO_CS_709
;
}
return
VIDEO_CS_DEFAULT
;
}
static
inline
enum
video_range_type
convert_color_range
(
enum
AVColorRange
r
)
...
...
@@ -372,7 +378,7 @@ static void mp_media_next_video(mp_media_t *m, bool preload)
frame
->
data
[
0
]
-=
frame
->
linesize
[
0
]
*
(
f
->
height
-
1
);
new_format
=
convert_pixel_format
(
m
->
scale_format
);
new_space
=
convert_color_space
(
f
->
colorspace
);
new_space
=
convert_color_space
(
f
->
colorspace
,
f
->
color_trc
);
new_range
=
m
->
force_range
==
VIDEO_RANGE_DEFAULT
?
convert_color_range
(
f
->
color_range
)
:
m
->
force_range
;
...
...
libobs/media-io/video-io.h
浏览文件 @
bfdf5dc9
...
...
@@ -176,9 +176,10 @@ static inline const char *get_video_colorspace_name(enum video_colorspace cs)
switch
(
cs
)
{
case
VIDEO_CS_709
:
return
"709"
;
case
VIDEO_CS_SRGB
:
return
"sRGB"
;
case
VIDEO_CS_601
:
case
VIDEO_CS_DEFAULT
:
case
VIDEO_CS_SRGB
:;
case
VIDEO_CS_DEFAULT
:;
}
return
"601"
;
...
...
libobs/media-io/video-matrices.c
浏览文件 @
bfdf5dc9
...
...
@@ -173,6 +173,8 @@ bool video_format_get_parameters(enum video_colorspace color_space,
#endif
if
(
color_space
==
VIDEO_CS_DEFAULT
)
color_space
=
VIDEO_CS_601
;
else
if
(
color_space
==
VIDEO_CS_SRGB
)
color_space
=
VIDEO_CS_709
;
for
(
size_t
i
=
0
;
i
<
NUM_FORMATS
;
i
++
)
{
if
(
format_info
[
i
].
color_space
!=
color_space
)
...
...
libobs/media-io/video-scaler-ffmpeg.c
浏览文件 @
bfdf5dc9
...
...
@@ -92,12 +92,11 @@ static inline int get_ffmpeg_scale_type(enum video_scale_type type)
static
inline
const
int
*
get_ffmpeg_coeffs
(
enum
video_colorspace
cs
)
{
switch
(
cs
)
{
case
VIDEO_CS_DEFAULT
:
return
sws_getCoefficients
(
SWS_CS_ITU601
);
case
VIDEO_CS_601
:
return
sws_getCoefficients
(
SWS_CS_ITU601
);
case
VIDEO_CS_709
:
case
VIDEO_CS_SRGB
:
return
sws_getCoefficients
(
SWS_CS_ITU709
);
case
VIDEO_CS_DEFAULT
:
case
VIDEO_CS_601
:
default:
return
sws_getCoefficients
(
SWS_CS_ITU601
);
}
...
...
plugins/obs-ffmpeg/ffmpeg-mux/ffmpeg-mux.c
浏览文件 @
bfdf5dc9
...
...
@@ -79,6 +79,10 @@ struct main_params {
int
height
;
int
fps_num
;
int
fps_den
;
int
color_primaries
;
int
color_trc
;
int
colorspace
;
int
color_range
;
char
*
acodec
;
char
*
muxer_settings
;
};
...
...
@@ -249,6 +253,18 @@ static bool init_params(int *argc, char ***argv, struct main_params *params,
return
false
;
if
(
!
get_opt_int
(
argc
,
argv
,
&
params
->
height
,
"video height"
))
return
false
;
if
(
!
get_opt_int
(
argc
,
argv
,
&
params
->
color_primaries
,
"video color primaries"
))
return
false
;
if
(
!
get_opt_int
(
argc
,
argv
,
&
params
->
color_trc
,
"video color trc"
))
return
false
;
if
(
!
get_opt_int
(
argc
,
argv
,
&
params
->
colorspace
,
"video colorspace"
))
return
false
;
if
(
!
get_opt_int
(
argc
,
argv
,
&
params
->
color_range
,
"video color range"
))
return
false
;
if
(
!
get_opt_int
(
argc
,
argv
,
&
params
->
fps_num
,
"video fps num"
))
return
false
;
if
(
!
get_opt_int
(
argc
,
argv
,
&
params
->
fps_den
,
"video fps den"
))
...
...
@@ -327,6 +343,10 @@ static void create_video_stream(struct ffmpeg_mux *ffm)
context
->
height
=
ffm
->
params
.
height
;
context
->
coded_width
=
ffm
->
params
.
width
;
context
->
coded_height
=
ffm
->
params
.
height
;
context
->
color_primaries
=
ffm
->
params
.
color_primaries
;
context
->
color_trc
=
ffm
->
params
.
color_trc
;
context
->
colorspace
=
ffm
->
params
.
colorspace
;
context
->
color_range
=
ffm
->
params
.
color_range
;
context
->
extradata
=
extradata
;
context
->
extradata_size
=
ffm
->
video_header
.
size
;
context
->
time_base
=
...
...
plugins/obs-ffmpeg/jim-nvenc.c
浏览文件 @
bfdf5dc9
...
...
@@ -429,9 +429,25 @@ static bool init_encoder(struct nvenc_data *enc, obs_data_t *settings)
vui_params
->
videoSignalTypePresentFlag
=
1
;
vui_params
->
videoFullRangeFlag
=
(
voi
->
range
==
VIDEO_RANGE_FULL
);
vui_params
->
colourDescriptionPresentFlag
=
1
;
vui_params
->
colourMatrix
=
(
voi
->
colorspace
==
VIDEO_CS_709
)
?
1
:
5
;
vui_params
->
colourPrimaries
=
1
;
vui_params
->
transferCharacteristics
=
1
;
switch
(
voi
->
colorspace
)
{
case
VIDEO_CS_DEFAULT
:
case
VIDEO_CS_601
:
vui_params
->
colourPrimaries
=
6
;
vui_params
->
transferCharacteristics
=
6
;
vui_params
->
colourMatrix
=
6
;
break
;
case
VIDEO_CS_709
:
vui_params
->
colourPrimaries
=
1
;
vui_params
->
transferCharacteristics
=
1
;
vui_params
->
colourMatrix
=
1
;
break
;
case
VIDEO_CS_SRGB
:
vui_params
->
colourPrimaries
=
1
;
vui_params
->
transferCharacteristics
=
13
;
vui_params
->
colourMatrix
=
1
;
break
;
}
enc
->
bframes
=
bf
>
0
;
...
...
plugins/obs-ffmpeg/obs-ffmpeg-mux.c
浏览文件 @
bfdf5dc9
...
...
@@ -156,10 +156,37 @@ static void add_video_encoder_params(struct ffmpeg_muxer *stream,
obs_data_release
(
settings
);
dstr_catf
(
cmd
,
"%s %d %d %d %d %d "
,
obs_encoder_get_codec
(
vencoder
),
bitrate
,
obs_output_get_width
(
stream
->
output
),
obs_output_get_height
(
stream
->
output
),
(
int
)
info
->
fps_num
,
(
int
)
info
->
fps_den
);
enum
AVColorPrimaries
pri
=
AVCOL_PRI_UNSPECIFIED
;
enum
AVColorTransferCharacteristic
trc
=
AVCOL_TRC_UNSPECIFIED
;
enum
AVColorSpace
spc
=
AVCOL_SPC_UNSPECIFIED
;
switch
(
info
->
colorspace
)
{
case
VIDEO_CS_DEFAULT
:
case
VIDEO_CS_601
:
pri
=
AVCOL_PRI_SMPTE170M
;
trc
=
AVCOL_TRC_SMPTE170M
;
spc
=
AVCOL_SPC_SMPTE170M
;
break
;
case
VIDEO_CS_709
:
pri
=
AVCOL_PRI_BT709
;
trc
=
AVCOL_TRC_BT709
;
spc
=
AVCOL_SPC_BT709
;
break
;
case
VIDEO_CS_SRGB
:
pri
=
AVCOL_PRI_BT709
;
trc
=
AVCOL_TRC_IEC61966_2_1
;
spc
=
AVCOL_SPC_BT709
;
break
;
}
const
enum
AVColorRange
range
=
(
info
->
range
==
VIDEO_RANGE_FULL
)
?
AVCOL_RANGE_JPEG
:
AVCOL_RANGE_MPEG
;
dstr_catf
(
cmd
,
"%s %d %d %d %d %d %d %d %d %d "
,
obs_encoder_get_codec
(
vencoder
),
bitrate
,
obs_output_get_width
(
stream
->
output
),
obs_output_get_height
(
stream
->
output
),
(
int
)
pri
,
(
int
)
trc
,
(
int
)
spc
,
(
int
)
range
,
(
int
)
info
->
fps_num
,
(
int
)
info
->
fps_den
);
}
static
void
add_audio_encoder_params
(
struct
dstr
*
cmd
,
obs_encoder_t
*
aencoder
)
...
...
plugins/obs-ffmpeg/obs-ffmpeg-nvenc.c
浏览文件 @
bfdf5dc9
...
...
@@ -235,14 +235,30 @@ static bool nvenc_update(void *data, obs_data_t *settings)
enc
->
context
->
height
=
obs_encoder_get_height
(
enc
->
encoder
);
enc
->
context
->
time_base
=
(
AVRational
){
voi
->
fps_den
,
voi
->
fps_num
};
enc
->
context
->
pix_fmt
=
obs_to_ffmpeg_video_format
(
info
.
format
);
enc
->
context
->
colorspace
=
info
.
colorspace
==
VIDEO_CS_709
?
AVCOL_SPC_BT709
:
AVCOL_SPC_BT470BG
;
enc
->
context
->
color_range
=
info
.
range
==
VIDEO_RANGE_FULL
?
AVCOL_RANGE_JPEG
:
AVCOL_RANGE_MPEG
;
enc
->
context
->
max_b_frames
=
bf
;
switch
(
info
.
colorspace
)
{
case
VIDEO_CS_DEFAULT
:
case
VIDEO_CS_601
:
enc
->
context
->
color_trc
=
AVCOL_TRC_SMPTE170M
;
enc
->
context
->
color_primaries
=
AVCOL_PRI_SMPTE170M
;
enc
->
context
->
colorspace
=
AVCOL_SPC_SMPTE170M
;
break
;
case
VIDEO_CS_709
:
enc
->
context
->
color_trc
=
AVCOL_TRC_BT709
;
enc
->
context
->
color_primaries
=
AVCOL_PRI_BT709
;
enc
->
context
->
colorspace
=
AVCOL_SPC_BT709
;
break
;
case
VIDEO_CS_SRGB
:
enc
->
context
->
color_trc
=
AVCOL_TRC_IEC61966_2_1
;
enc
->
context
->
color_primaries
=
AVCOL_PRI_BT709
;
enc
->
context
->
colorspace
=
AVCOL_SPC_BT709
;
break
;
}
if
(
keyint_sec
)
enc
->
context
->
gop_size
=
keyint_sec
*
voi
->
fps_num
/
voi
->
fps_den
;
...
...
plugins/obs-ffmpeg/obs-ffmpeg-output.c
浏览文件 @
bfdf5dc9
...
...
@@ -169,8 +169,10 @@ static bool open_video_codec(struct ffmpeg_data *data)
data
->
vframe
->
format
=
context
->
pix_fmt
;
data
->
vframe
->
width
=
context
->
width
;
data
->
vframe
->
height
=
context
->
height
;
data
->
vframe
->
colorspace
=
data
->
config
.
color_space
;
data
->
vframe
->
color_range
=
data
->
config
.
color_range
;
data
->
vframe
->
color_primaries
=
data
->
config
.
color_primaries
;
data
->
vframe
->
color_trc
=
data
->
config
.
color_trc
;
data
->
vframe
->
colorspace
=
data
->
config
.
colorspace
;
ret
=
av_frame_get_buffer
(
data
->
vframe
,
base_get_alignment
());
if
(
ret
<
0
)
{
...
...
@@ -233,8 +235,10 @@ static bool create_video_stream(struct ffmpeg_data *data)
context
->
time_base
=
(
AVRational
){
ovi
.
fps_den
,
ovi
.
fps_num
};
context
->
gop_size
=
data
->
config
.
gop_size
;
context
->
pix_fmt
=
closest_format
;
context
->
colorspace
=
data
->
config
.
color_space
;
context
->
color_range
=
data
->
config
.
color_range
;
context
->
color_primaries
=
data
->
config
.
color_primaries
;
context
->
color_trc
=
data
->
config
.
color_trc
;
context
->
colorspace
=
data
->
config
.
colorspace
;
context
->
thread_count
=
0
;
data
->
video
->
time_base
=
context
->
time_base
;
...
...
@@ -1081,16 +1085,39 @@ static bool try_connect(struct ffmpeg_output *output)
config
.
audio_tracks
=
(
int
)
obs_output_get_mixers
(
output
->
output
);
config
.
audio_mix_count
=
get_audio_mix_count
(
config
.
audio_tracks
);
config
.
color_range
=
voi
->
range
==
VIDEO_RANGE_FULL
?
AVCOL_RANGE_JPEG
:
AVCOL_RANGE_MPEG
;
switch
(
voi
->
colorspace
)
{
case
VIDEO_CS_DEFAULT
:
case
VIDEO_CS_601
:
config
.
color_primaries
=
AVCOL_PRI_SMPTE170M
;
config
.
color_trc
=
AVCOL_TRC_SMPTE170M
;
break
;
case
VIDEO_CS_709
:
config
.
color_primaries
=
AVCOL_PRI_BT709
;
config
.
color_trc
=
AVCOL_TRC_BT709
;
break
;
case
VIDEO_CS_SRGB
:
config
.
color_primaries
=
AVCOL_PRI_BT709
;
config
.
color_trc
=
AVCOL_TRC_IEC61966_2_1
;
break
;
}
if
(
format_is_yuv
(
voi
->
format
))
{
config
.
color_range
=
voi
->
range
==
VIDEO_RANGE_FULL
?
AVCOL_RANGE_JPEG
:
AVCOL_RANGE_MPEG
;
config
.
color_space
=
voi
->
colorspace
==
VIDEO_CS_709
?
AVCOL_SPC_BT709
:
AVCOL_SPC_BT470BG
;
switch
(
voi
->
colorspace
)
{
case
VIDEO_CS_DEFAULT
:
case
VIDEO_CS_601
:
config
.
colorspace
=
AVCOL_SPC_SMPTE170M
;
break
;
case
VIDEO_CS_709
:
config
.
colorspace
=
AVCOL_SPC_BT709
;
break
;
case
VIDEO_CS_SRGB
:
config
.
colorspace
=
AVCOL_SPC_BT709
;
break
;
}
}
else
{
config
.
color_range
=
AVCOL_RANGE_UNSPECIFIED
;
config
.
color_space
=
AVCOL_SPC_RGB
;
config
.
colorspace
=
AVCOL_SPC_RGB
;
}
if
(
config
.
format
==
AV_PIX_FMT_NONE
)
{
...
...
plugins/obs-ffmpeg/obs-ffmpeg-output.h
浏览文件 @
bfdf5dc9
...
...
@@ -23,7 +23,9 @@ struct ffmpeg_cfg {
int
audio_tracks
;
enum
AVPixelFormat
format
;
enum
AVColorRange
color_range
;
enum
AVColorSpace
color_space
;
enum
AVColorPrimaries
color_primaries
;
enum
AVColorTransferCharacteristic
color_trc
;
enum
AVColorSpace
colorspace
;
int
scale_width
;
int
scale_height
;
int
width
;
...
...
plugins/obs-x264/obs-x264.c
浏览文件 @
bfdf5dc9
...
...
@@ -362,23 +362,9 @@ static void log_x264(void *param, int level, const char *format, va_list args)
UNUSED_PARAMETER
(
level
);
}
static
inline
const
char
*
get_x264_colorspace_name
(
enum
video_colorspace
cs
)
{
switch
(
cs
)
{
case
VIDEO_CS_DEFAULT
:
case
VIDEO_CS_601
:
case
VIDEO_CS_SRGB
:
return
"undef"
;
case
VIDEO_CS_709
:;
}
return
"bt709"
;
}
static
inline
int
get_x264_cs_val
(
enum
video_colorspace
cs
,
static
inline
int
get_x264_cs_val
(
const
char
*
const
name
,
const
char
*
const
names
[])
{
const
char
*
name
=
get_x264_colorspace_name
(
cs
);
int
idx
=
0
;
do
{
if
(
strcmp
(
names
[
idx
],
name
)
==
0
)
...
...
@@ -481,13 +467,38 @@ static void update_params(struct obs_x264 *obsx264, obs_data_t *settings,
if
(
obs_data_has_user_value
(
settings
,
"bf"
))
obsx264
->
params
.
i_bframe
=
bf
;
static
const
char
*
const
smpte170m
=
"smpte170m"
;
static
const
char
*
const
bt709
=
"bt709"
;
static
const
char
*
const
iec61966_2_1
=
"iec61966-2-1"
;
const
char
*
colorprim
=
NULL
;
const
char
*
transfer
=
NULL
;
const
char
*
colmatrix
=
NULL
;
switch
(
info
.
colorspace
)
{
case
VIDEO_CS_DEFAULT
:
case
VIDEO_CS_601
:
colorprim
=
smpte170m
;
transfer
=
smpte170m
;
colmatrix
=
smpte170m
;
break
;
case
VIDEO_CS_709
:
colorprim
=
bt709
;
transfer
=
bt709
;
colmatrix
=
bt709
;
break
;
case
VIDEO_CS_SRGB
:
colorprim
=
bt709
;
transfer
=
iec61966_2_1
;
colmatrix
=
bt709
;
break
;
}
obsx264
->
params
.
vui
.
b_fullrange
=
info
.
range
==
VIDEO_RANGE_FULL
;
obsx264
->
params
.
vui
.
i_colorprim
=
get_x264_cs_val
(
colorprim
,
x264_colorprim_names
);
obsx264
->
params
.
vui
.
i_transfer
=
get_x264_cs_val
(
info
.
colorspace
,
x264_transfer_names
);
get_x264_cs_val
(
transfer
,
x264_transfer_names
);
obsx264
->
params
.
vui
.
i_colmatrix
=
get_x264_cs_val
(
info
.
colorspace
,
x264_colmatrix_names
);
obsx264
->
params
.
vui
.
i_colorprim
=
get_x264_cs_val
(
info
.
colorspace
,
x264_colorprim_names
);
obsx264
->
params
.
vui
.
b_fullrange
=
info
.
range
==
VIDEO_RANGE_FULL
;
get_x264_cs_val
(
colmatrix
,
x264_colmatrix_names
);
/* use the new filler method for CBR to allow real-time adjusting of
* the bitrate */
...
...
编辑
预览
Markdown
is supported
0%
请重试
或
添加新附件
.
添加附件
取消
You are about to add
0
people
to the discussion. Proceed with caution.
先完成此消息的编辑!
取消
想要评论请
注册
或
登录