Skip to content
体验新版
项目
组织
正在加载...
登录
切换导航
打开侧边栏
github_28344065
scrcpy
提交
6a9f3df4
S
scrcpy
项目概览
github_28344065
/
scrcpy
与 Fork 源项目一致
从无法访问的项目Fork
通知
8
Star
0
Fork
0
代码
文件
提交
分支
Tags
贡献者
分支图
Diff
Issue
0
列表
看板
标记
里程碑
合并请求
0
Wiki
0
Wiki
分析
仓库
DevOps
项目成员
Pages
S
scrcpy
项目概览
项目概览
详情
发布
仓库
仓库
文件
提交
分支
标签
贡献者
分支图
比较
Issue
0
Issue
0
列表
看板
标记
里程碑
合并请求
0
合并请求
0
Pages
分析
分析
仓库分析
DevOps
Wiki
0
Wiki
成员
成员
收起侧边栏
关闭侧边栏
动态
分支图
创建新Issue
提交
Issue看板
体验新版 GitCode,发现更多精彩内容 >>
提交
6a9f3df4
编写于
2月 21, 2021
作者:
R
Romain Vimont
浏览文件
操作
浏览文件
下载
电子邮件补丁
差异文件
enable async resizing
上级
da44fa44
变更
1
隐藏空白更改
内联
并排
Showing
1 changed file
with
59 addition
and
22 deletion
+59
-22
app/src/screen.c
app/src/screen.c
+59
-22
未找到文件。
app/src/screen.c
浏览文件 @
6a9f3df4
...
...
@@ -206,7 +206,9 @@ static inline SDL_Texture *
create_texture
(
struct
screen
*
screen
)
{
SDL_Renderer
*
renderer
=
screen
->
renderer
;
struct
size
size
=
screen
->
frame_size
;
SDL_Texture
*
texture
=
SDL_CreateTexture
(
renderer
,
SDL_PIXELFORMAT_YV12
,
SDL_PixelFormatEnum
fmt
=
screen
->
use_swscale
?
SDL_PIXELFORMAT_RGB24
:
SDL_PIXELFORMAT_YV12
;
SDL_Texture
*
texture
=
SDL_CreateTexture
(
renderer
,
fmt
,
SDL_TEXTUREACCESS_STREAMING
,
size
.
width
,
size
.
height
);
if
(
!
texture
)
{
...
...
@@ -214,6 +216,7 @@ create_texture(struct screen *screen) {
}
if
(
screen
->
scale_filter
==
SC_SCALE_FILTER_TRILINEAR
)
{
assert
(
!
screen
->
use_swscale
);
struct
sc_opengl
*
gl
=
&
screen
->
gl
;
SDL_GL_BindTexture
(
texture
,
NULL
,
NULL
);
...
...
@@ -235,6 +238,19 @@ is_swscale(enum sc_scale_filter scale_filter) {
&&
scale_filter
!=
SC_SCALE_FILTER_TRILINEAR
;
}
static
void
on_resizer_frame_available
(
struct
video_buffer
*
vb
,
void
*
userdata
)
{
(
void
)
vb
;
(
void
)
userdata
;
static
SDL_Event
new_frame_event
=
{
.
type
=
EVENT_NEW_FRAME
,
};
// Post the event on the UI thread
SDL_PushEvent
(
&
new_frame_event
);
}
bool
screen_init_rendering
(
struct
screen
*
screen
,
const
char
*
window_title
,
struct
size
frame_size
,
bool
always_on_top
,
...
...
@@ -321,11 +337,23 @@ screen_init_rendering(struct screen *screen, const char *window_title,
screen
->
use_swscale
=
is_swscale
(
scale_filter
);
if
(
screen
->
use_swscale
)
{
bool
ok
=
sc_resizer_init
(
&
screen
->
resizer
,
screen
->
vb
,
&
screen
->
resizer_vb
,
scale_filter
,
window_size
);
static
const
struct
video_buffer_callbacks
video_buffer_cbs
=
{
.
on_frame_available
=
on_resizer_frame_available
,
};
bool
ok
=
video_buffer_init
(
&
screen
->
resizer_vb
,
false
,
&
video_buffer_cbs
,
NULL
);
if
(
!
ok
)
{
LOGE
(
"Could not create resizer video buffer"
);
SDL_DestroyRenderer
(
screen
->
renderer
);
SDL_DestroyWindow
(
screen
->
window
);
return
false
;
}
ok
=
sc_resizer_init
(
&
screen
->
resizer
,
screen
->
vb
,
&
screen
->
resizer_vb
,
scale_filter
,
window_size
);
if
(
!
ok
)
{
LOGE
(
"Could not create resizer"
);
video_buffer_destroy
(
&
screen
->
resizer_vb
);
SDL_DestroyRenderer
(
screen
->
renderer
);
SDL_DestroyWindow
(
screen
->
window
);
return
false
;
...
...
@@ -335,6 +363,7 @@ screen_init_rendering(struct screen *screen, const char *window_title,
if
(
!
ok
)
{
LOGE
(
"Could not start resizer"
);
sc_resizer_destroy
(
&
screen
->
resizer
);
video_buffer_destroy
(
&
screen
->
resizer_vb
);
SDL_DestroyRenderer
(
screen
->
renderer
);
SDL_DestroyWindow
(
screen
->
window
);
}
...
...
@@ -477,23 +506,29 @@ prepare_for_frame(struct screen *screen, struct size new_frame_size) {
// write the frame into the texture
static
void
update_texture
(
struct
screen
*
screen
,
const
AVFrame
*
frame
)
{
SDL_UpdateYUVTexture
(
screen
->
texture
,
NULL
,
frame
->
data
[
0
],
frame
->
linesize
[
0
],
frame
->
data
[
1
],
frame
->
linesize
[
1
],
frame
->
data
[
2
],
frame
->
linesize
[
2
]);
if
(
screen
->
scale_filter
==
SC_SCALE_FILTER_TRILINEAR
)
{
SDL_GL_BindTexture
(
screen
->
texture
,
NULL
,
NULL
);
screen
->
gl
.
GenerateMipmap
(
GL_TEXTURE_2D
);
SDL_GL_UnbindTexture
(
screen
->
texture
);
if
(
screen
->
use_swscale
)
{
SDL_UpdateTexture
(
screen
->
texture
,
NULL
,
frame
->
data
[
0
],
frame
->
linesize
[
0
]);
}
else
{
SDL_UpdateYUVTexture
(
screen
->
texture
,
NULL
,
frame
->
data
[
0
],
frame
->
linesize
[
0
],
frame
->
data
[
1
],
frame
->
linesize
[
1
],
frame
->
data
[
2
],
frame
->
linesize
[
2
]);
if
(
screen
->
scale_filter
==
SC_SCALE_FILTER_TRILINEAR
)
{
SDL_GL_BindTexture
(
screen
->
texture
,
NULL
,
NULL
);
screen
->
gl
.
GenerateMipmap
(
GL_TEXTURE_2D
);
SDL_GL_UnbindTexture
(
screen
->
texture
);
}
}
}
static
bool
screen_update_frame
(
struct
screen
*
screen
)
{
unsigned
skipped
;
const
AVFrame
*
frame
=
video_buffer_consumer_take_frame
(
screen
->
vb
,
&
skipped
);
struct
video_buffer
*
vb
=
screen
->
use_swscale
?
&
screen
->
resizer_vb
:
screen
->
vb
;
const
AVFrame
*
frame
=
video_buffer_consumer_take_frame
(
vb
,
&
skipped
);
fps_counter_add_skipped_frames
(
screen
->
fps_counter
,
skipped
);
fps_counter_add_rendered_frame
(
screen
->
fps_counter
);
...
...
@@ -695,12 +730,14 @@ screen_hidpi_scale_coords(struct screen *screen, int32_t *x, int32_t *y) {
void
screen_on_frame_available
(
struct
screen
*
screen
)
{
(
void
)
screen
;
static
SDL_Event
new_frame_event
=
{
.
type
=
EVENT_NEW_FRAME
,
};
if
(
screen
->
use_swscale
)
{
sc_resizer_process_new_frame
(
&
screen
->
resizer
);
}
else
{
static
SDL_Event
new_frame_event
=
{
.
type
=
EVENT_NEW_FRAME
,
};
// Post the event on the UI thread
SDL_PushEvent
(
&
new_frame_event
);
// Post the event on the UI thread
SDL_PushEvent
(
&
new_frame_event
);
}
}
编辑
预览
Markdown
is supported
0%
请重试
或
添加新附件
.
添加附件
取消
You are about to add
0
people
to the discussion. Proceed with caution.
先完成此消息的编辑!
取消
想要评论请
注册
或
登录