Skip to content
体验新版
项目
组织
正在加载...
登录
切换导航
打开侧边栏
github_28344065
scrcpy
提交
e306bffb
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,体验更适合开发者的 AI 搜索 >>
提交
e306bffb
编写于
2月 14, 2021
作者:
R
Romain Vimont
浏览文件
操作
浏览文件
下载
电子邮件补丁
差异文件
Use a callback to notify a new decoded frame
Make the decoder independant of the SDL event mechanism.
上级
2512c532
变更
3
隐藏空白更改
内联
并排
Showing
3 changed file
with
37 addition
and
9 deletion
+37
-9
app/src/decoder.c
app/src/decoder.c
+10
-7
app/src/decoder.h
app/src/decoder.h
+11
-1
app/src/scrcpy.c
app/src/scrcpy.c
+16
-1
未找到文件。
app/src/decoder.c
浏览文件 @
e306bffb
...
...
@@ -2,7 +2,6 @@
#include <libavformat/avformat.h>
#include <libavutil/time.h>
#include <SDL2/SDL_events.h>
#include <unistd.h>
#include "events.h"
...
...
@@ -18,18 +17,22 @@ push_frame(struct decoder *decoder) {
video_buffer_offer_decoded_frame
(
decoder
->
video_buffer
,
&
previous_frame_skipped
);
if
(
previous_frame_skipped
)
{
// the previous
EVENT_NEW_FRAME
will consume this frame
// the previous
callback
will consume this frame
return
;
}
static
SDL_Event
new_frame_event
=
{
.
type
=
EVENT_NEW_FRAME
,
};
SDL_PushEvent
(
&
new_frame_event
);
decoder
->
cbs
->
on_new_frame
(
decoder
,
decoder
->
cbs_userdata
);
}
void
decoder_init
(
struct
decoder
*
decoder
,
struct
video_buffer
*
vb
)
{
decoder_init
(
struct
decoder
*
decoder
,
struct
video_buffer
*
vb
,
const
struct
decoder_callbacks
*
cbs
,
void
*
cbs_userdata
)
{
decoder
->
video_buffer
=
vb
;
assert
(
cbs
);
assert
(
cbs
->
on_new_frame
);
decoder
->
cbs
=
cbs
;
decoder
->
cbs_userdata
=
cbs_userdata
;
}
bool
...
...
app/src/decoder.h
浏览文件 @
e306bffb
...
...
@@ -11,10 +11,20 @@ struct video_buffer;
struct
decoder
{
struct
video_buffer
*
video_buffer
;
AVCodecContext
*
codec_ctx
;
const
struct
decoder_callbacks
*
cbs
;
void
*
cbs_userdata
;
};
struct
decoder_callbacks
{
// Called when a new frame can be consumed by
// video_buffer_take_rendering_frame(decoder->video_buffer).
void
(
*
on_new_frame
)(
struct
decoder
*
decoder
,
void
*
userdata
);
};
void
decoder_init
(
struct
decoder
*
decoder
,
struct
video_buffer
*
vb
);
decoder_init
(
struct
decoder
*
decoder
,
struct
video_buffer
*
vb
,
const
struct
decoder_callbacks
*
cbs
,
void
*
cbs_userdata
);
bool
decoder_open
(
struct
decoder
*
decoder
,
const
AVCodec
*
codec
);
...
...
app/src/scrcpy.c
浏览文件 @
e306bffb
...
...
@@ -306,6 +306,17 @@ av_log_callback(void *avcl, int level, const char *fmt, va_list vl) {
free
(
local_fmt
);
}
static
void
decoder_on_new_frame
(
struct
decoder
*
decoder
,
void
*
userdata
)
{
(
void
)
decoder
;
(
void
)
userdata
;
static
SDL_Event
new_frame_event
=
{
.
type
=
EVENT_NEW_FRAME
,
};
SDL_PushEvent
(
&
new_frame_event
);
}
bool
scrcpy
(
const
struct
scrcpy_options
*
options
)
{
if
(
!
server_init
(
&
server
))
{
...
...
@@ -386,7 +397,11 @@ scrcpy(const struct scrcpy_options *options) {
file_handler_initialized
=
true
;
}
decoder_init
(
&
decoder
,
&
video_buffer
);
static
const
struct
decoder_callbacks
decoder_cbs
=
{
.
on_new_frame
=
decoder_on_new_frame
,
};
decoder_init
(
&
decoder
,
&
video_buffer
,
&
decoder_cbs
,
NULL
);
dec
=
&
decoder
;
}
...
...
编辑
预览
Markdown
is supported
0%
请重试
或
添加新附件
.
添加附件
取消
You are about to add
0
people
to the discussion. Proceed with caution.
先完成此消息的编辑!
取消
想要评论请
注册
或
登录