Skip to content
项目
群组
代码片段
帮助
当前项目
正在载入...
登录 / 注册
切换导航面板
Z
ZLMediaKit
概览
Overview
Details
Activity
Cycle Analytics
版本库
Repository
Files
Commits
Branches
Tags
Contributors
Graph
Compare
Charts
问题
0
Issues
0
列表
Board
标记
里程碑
合并请求
0
Merge Requests
0
CI / CD
CI / CD
流水线
作业
日程表
图表
维基
Wiki
代码片段
Snippets
成员
Collapse sidebar
Close sidebar
活动
图像
聊天
创建新问题
作业
提交
Issue Boards
Open sidebar
张翔宇
ZLMediaKit
Commits
efdc105b
Commit
efdc105b
authored
4 years ago
by
xiongziliang
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
减少内存拷贝,提升性能
parent
416d21df
隐藏空白字符变更
内嵌
并排
正在显示
3 个修改的文件
包含
51 行增加
和
25 行删除
+51
-25
src/Extension/Frame.h
+45
-0
src/Record/MP4Demuxer.cpp
+4
-23
src/Rtp/Decoder.cpp
+2
-2
没有找到文件。
src/Extension/Frame.h
查看文件 @
efdc105b
...
...
@@ -383,5 +383,49 @@ protected:
CodecId
_codec_id
=
CodecInvalid
;
};
/**
* 该对象可以把Buffer对象转换成可缓存的Frame对象
*/
template
<
typename
Parent
>
class
FrameWrapper
:
public
Parent
{
public
:
~
FrameWrapper
()
=
default
;
/**
* 构造frame
* @param buf 数据缓存
* @param dts 解码时间戳
* @param pts 显示时间戳
* @param prefix 帧前缀长度
* @param offset buffer有效数据偏移量
*/
FrameWrapper
(
const
Buffer
::
Ptr
&
buf
,
int64_t
dts
,
int64_t
pts
,
int
prefix
,
int
offset
)
:
Parent
(
buf
->
data
()
+
offset
,
buf
->
size
()
-
offset
,
dts
,
pts
,
prefix
){
_buf
=
buf
;
}
/**
* 构造frame
* @param buf 数据缓存
* @param dts 解码时间戳
* @param pts 显示时间戳
* @param prefix 帧前缀长度
* @param offset buffer有效数据偏移量
* @param codec 帧类型
*/
FrameWrapper
(
const
Buffer
::
Ptr
&
buf
,
int64_t
dts
,
int64_t
pts
,
int
prefix
,
int
offset
,
CodecId
codec
)
:
Parent
(
codec
,
buf
->
data
()
+
offset
,
buf
->
size
()
-
offset
,
dts
,
pts
,
prefix
){
_buf
=
buf
;
}
/**
* 该帧可缓存
*/
bool
cacheAble
()
const
override
{
return
true
;
}
private
:
Buffer
::
Ptr
_buf
;
};
}
//namespace mediakit
#endif //ZLMEDIAKIT_FRAME_H
\ No newline at end of file
This diff is collapsed.
Click to expand it.
src/Record/MP4Demuxer.cpp
查看文件 @
efdc105b
...
...
@@ -202,25 +202,6 @@ Frame::Ptr MP4Demuxer::readFrame(bool &keyFrame, bool &eof) {
}
}
template
<
typename
Parent
>
class
FrameWrapper
:
public
Parent
{
public
:
~
FrameWrapper
()
=
default
;
FrameWrapper
(
const
Buffer
::
Ptr
&
buf
,
int64_t
pts
,
int64_t
dts
,
int
prefix
,
int
offset
)
:
Parent
(
buf
->
data
()
+
offset
,
buf
->
size
()
-
offset
,
dts
,
pts
,
prefix
){
_buf
=
buf
;
}
FrameWrapper
(
const
Buffer
::
Ptr
&
buf
,
int64_t
pts
,
int64_t
dts
,
int
prefix
,
int
offset
,
CodecId
codec
)
:
Parent
(
codec
,
buf
->
data
()
+
offset
,
buf
->
size
()
-
offset
,
dts
,
pts
,
prefix
){
_buf
=
buf
;
}
bool
cacheAble
()
const
override
{
return
true
;
}
private
:
Buffer
::
Ptr
_buf
;
};
Frame
::
Ptr
MP4Demuxer
::
makeFrame
(
uint32_t
track_id
,
const
Buffer
::
Ptr
&
buf
,
int64_t
pts
,
int64_t
dts
)
{
auto
it
=
_track_to_codec
.
find
(
track_id
);
if
(
it
==
_track_to_codec
.
end
())
{
...
...
@@ -244,9 +225,9 @@ Frame::Ptr MP4Demuxer::makeFrame(uint32_t track_id, const Buffer::Ptr &buf, int6
offset
+=
(
frame_len
+
4
);
}
if
(
codec
==
CodecH264
)
{
return
std
::
make_shared
<
FrameWrapper
<
H264FrameNoCacheAble
>
>
(
buf
,
pts
,
d
ts
,
4
,
DATA_OFFSET
);
return
std
::
make_shared
<
FrameWrapper
<
H264FrameNoCacheAble
>
>
(
buf
,
dts
,
p
ts
,
4
,
DATA_OFFSET
);
}
return
std
::
make_shared
<
FrameWrapper
<
H265FrameNoCacheAble
>
>
(
buf
,
pts
,
d
ts
,
4
,
DATA_OFFSET
);
return
std
::
make_shared
<
FrameWrapper
<
H265FrameNoCacheAble
>
>
(
buf
,
dts
,
p
ts
,
4
,
DATA_OFFSET
);
}
case
CodecAAC
:
{
...
...
@@ -254,13 +235,13 @@ Frame::Ptr MP4Demuxer::makeFrame(uint32_t track_id, const Buffer::Ptr &buf, int6
assert
(
track
);
//加上adts头
dumpAacConfig
(
track
->
getAacCfg
(),
buf
->
size
()
-
DATA_OFFSET
,
(
uint8_t
*
)
buf
->
data
()
+
(
DATA_OFFSET
-
ADTS_HEADER_LEN
),
ADTS_HEADER_LEN
);
return
std
::
make_shared
<
FrameWrapper
<
FrameFromPtr
>
>
(
buf
,
pts
,
d
ts
,
ADTS_HEADER_LEN
,
DATA_OFFSET
-
ADTS_HEADER_LEN
,
codec
);
return
std
::
make_shared
<
FrameWrapper
<
FrameFromPtr
>
>
(
buf
,
dts
,
p
ts
,
ADTS_HEADER_LEN
,
DATA_OFFSET
-
ADTS_HEADER_LEN
,
codec
);
}
case
CodecOpus
:
case
CodecG711A
:
case
CodecG711U
:
{
return
std
::
make_shared
<
FrameWrapper
<
FrameFromPtr
>
>
(
buf
,
pts
,
d
ts
,
0
,
DATA_OFFSET
,
codec
);
return
std
::
make_shared
<
FrameWrapper
<
FrameFromPtr
>
>
(
buf
,
dts
,
p
ts
,
0
,
DATA_OFFSET
,
codec
);
}
default
:
return
nullptr
;
...
...
This diff is collapsed.
Click to expand it.
src/Rtp/Decoder.cpp
查看文件 @
efdc105b
...
...
@@ -135,7 +135,7 @@ void DecoderImp::onDecode(int stream,int codecid,int flags,int64_t pts,int64_t d
auto
frame
=
std
::
make_shared
<
H264FrameNoCacheAble
>
((
char
*
)
data
,
bytes
,
dts
,
pts
,
0
);
_merger
.
inputFrame
(
frame
,[
this
](
uint32_t
dts
,
uint32_t
pts
,
const
Buffer
::
Ptr
&
buffer
)
{
onFrame
(
std
::
make_shared
<
H264FrameNoCacheAble
>
(
buffer
->
data
(),
buffer
->
size
(),
dts
,
pts
,
prefixSize
(
buffer
->
data
(),
buffer
->
size
())
));
onFrame
(
std
::
make_shared
<
FrameWrapper
<
H264FrameNoCacheAble
>
>
(
buffer
,
dts
,
pts
,
prefixSize
(
buffer
->
data
(),
buffer
->
size
()),
0
));
});
break
;
}
...
...
@@ -154,7 +154,7 @@ void DecoderImp::onDecode(int stream,int codecid,int flags,int64_t pts,int64_t d
}
auto
frame
=
std
::
make_shared
<
H265FrameNoCacheAble
>
((
char
*
)
data
,
bytes
,
dts
,
pts
,
0
);
_merger
.
inputFrame
(
frame
,[
this
](
uint32_t
dts
,
uint32_t
pts
,
const
Buffer
::
Ptr
&
buffer
)
{
onFrame
(
std
::
make_shared
<
H265FrameNoCacheAble
>
(
buffer
->
data
(),
buffer
->
size
(),
dts
,
pts
,
prefixSize
(
buffer
->
data
(),
buffer
->
size
())
));
onFrame
(
std
::
make_shared
<
FrameWrapper
<
H265FrameNoCacheAble
>
>
(
buffer
,
dts
,
pts
,
prefixSize
(
buffer
->
data
(),
buffer
->
size
()),
0
));
});
break
;
}
...
...
This diff is collapsed.
Click to expand it.
编写
预览
Markdown
格式
0%
重试
或
添加新文件
添加附件
取消
您添加了
0
人
到此讨论。请谨慎行事。
请先完成此评论的编辑!
取消
请
注册
或者
登录
后发表评论