Skip to content
体验新版
项目
组织
正在加载...
登录
切换导航
打开侧边栏
陈小冬
ijkplayer
提交
0c021a49
I
ijkplayer
项目概览
陈小冬
/
ijkplayer
与 Fork 源项目一致
从无法访问的项目Fork
通知
1
Star
0
Fork
0
代码
文件
提交
分支
Tags
贡献者
分支图
Diff
Issue
0
列表
看板
标记
里程碑
合并请求
0
Wiki
0
Wiki
分析
仓库
DevOps
项目成员
Pages
I
ijkplayer
项目概览
项目概览
详情
发布
仓库
仓库
文件
提交
分支
标签
贡献者
分支图
比较
Issue
0
Issue
0
列表
看板
标记
里程碑
合并请求
0
合并请求
0
Pages
分析
分析
仓库分析
DevOps
Wiki
0
Wiki
成员
成员
收起侧边栏
关闭侧边栏
动态
分支图
创建新Issue
提交
Issue看板
前往新版Gitcode,体验更适合开发者的 AI 搜索 >>
提交
0c021a49
编写于
11月 09, 2020
作者:
J
johnwenjunwu
浏览文件
操作
浏览文件
下载
电子邮件补丁
差异文件
feat(las): support media_codec when repeatSps is false
上级
2692ed95
变更
1
隐藏空白更改
内联
并排
Showing
1 changed file
with
106 addition
and
0 deletion
+106
-0
ijkmedia/ijkplayer/ijkavformat/ijklas.c
ijkmedia/ijkplayer/ijkavformat/ijklas.c
+106
-0
未找到文件。
ijkmedia/ijkplayer/ijkavformat/ijklas.c
浏览文件 @
0c021a49
...
...
@@ -55,6 +55,9 @@
#define INIT_BUFFER_THRESHOLD_MAX_MS (8*1000)
#define MAX_BUFFER_TIME 10000
#define MAX_STATE_CNT 30
#define NALU_HEAD_LEN 4
#define H264_NAL_SPS 7
#define H264_NAL_PPS 8
typedef
struct
AdaptiveConfig
{
int32_t
buffer_init
;
...
...
@@ -1902,6 +1905,105 @@ static void reset_packet(AVPacket* pkt) {
}
}
static
bool
h264_check_sps_pps
(
const
AVPacket
*
pkt
)
{
if
(
pkt
&&
pkt
->
data
&&
pkt
->
size
>=
5
)
{
int
offset
=
0
;
while
(
offset
>=
0
&&
offset
+
5
<=
pkt
->
size
)
{
uint8_t
*
nal_start
=
pkt
->
data
+
offset
;
int
nal_size
=
AV_RB32
(
nal_start
);
int
nal_type
=
nal_start
[
4
]
&
0x1f
;
if
(
nal_type
==
H264_NAL_SPS
||
nal_type
==
H264_NAL_PPS
)
{
return
true
;
}
offset
+=
nal_size
+
4
;
}
}
return
false
;
}
static
bool
read_sps_pps_by_avcc
(
uint8_t
*
extradata
,
uint32_t
extrasize
,
uint8_t
**
sps
,
int
*
sps_len
,
uint8_t
**
pps
,
int
*
pps_len
)
{
uint8_t
*
spc
=
extradata
+
6
;
uint32_t
sps_size
=
AV_RB16
(
spc
);
if
(
sps_size
)
{
*
sps_len
=
sps_size
;
*
sps
=
(
uint8_t
*
)
av_mallocz
(
sps_size
);
if
(
!*
sps
)
{
return
false
;
}
spc
+=
2
;
memcpy
(
*
sps
,
spc
,
sps_size
);
spc
+=
sps_size
;
}
spc
+=
1
;
uint32_t
pps_size
=
AV_RB16
(
spc
);
if
(
pps_size
)
{
*
pps_len
=
pps_size
;
*
pps
=
(
uint8_t
*
)
av_mallocz
(
pps_size
);
if
(
!*
pps
)
{
if
(
*
sps
)
{
free
(
*
sps
);
}
return
false
;
}
spc
+=
2
;
memcpy
(
*
pps
,
spc
,
pps_size
);
}
return
true
;
}
static
void
insert_sps_pps_into_avpacket
(
AVPacket
*
packet
,
uint8_t
*
new_extradata
,
int
new_extradata_size
,
PlayList
*
playlist
)
{
uint8_t
*
sps
=
NULL
,
*
pps
=
NULL
;
int
sps_len
=
0
,
pps_len
=
0
;
if
(
read_sps_pps_by_avcc
(
new_extradata
,
new_extradata_size
,
&
sps
,
&
sps_len
,
&
pps
,
&
pps_len
))
{
int
size
=
packet
->
size
;
if
(
sps
)
{
size
+=
NALU_HEAD_LEN
+
sps_len
;
}
if
(
pps
)
{
size
+=
NALU_HEAD_LEN
+
pps_len
;
}
if
(
size
==
packet
->
size
)
{
return
;
}
AVPacket
new_pack
;
int
res
=
av_new_packet
(
&
new_pack
,
size
);
if
(
res
<
0
)
{
log_error
(
"Failed memory allocation"
);
}
else
{
av_packet_copy_props
(
&
new_pack
,
packet
);
uint8_t
*
data
=
new_pack
.
data
;
if
(
sps
)
{
AV_WB32
(
data
,
sps_len
);
data
+=
NALU_HEAD_LEN
;
memcpy
(
data
,
sps
,
sps_len
);
data
+=
sps_len
;
log_info
(
"insert sps, size:%d"
,
sps_len
);
}
else
{
log_info
(
"sps is null"
);
}
if
(
pps
)
{
AV_WB32
(
data
,
pps_len
);
data
+=
NALU_HEAD_LEN
;
memcpy
(
data
,
pps
,
pps_len
);
data
+=
pps_len
;
log_info
(
"insert pps, size:%d"
,
pps_len
);
}
else
{
log_info
(
"pps is null"
);
}
memcpy
(
data
,
packet
->
data
,
packet
->
size
);
av_packet_unref
(
packet
);
*
packet
=
new_pack
;
}
}
}
static
int
las_read_packet
(
AVFormatContext
*
s
,
AVPacket
*
pkt
)
{
LasContext
*
c
=
s
->
priv_data
;
PlayList
*
playlist
=
&
c
->
playlist
;
...
...
@@ -1936,6 +2038,10 @@ static int las_read_packet(AVFormatContext* s, AVPacket* pkt) {
}
AVCodecParameters
*
codec
=
playlist
->
ctx
->
streams
[
pkt
->
stream_index
]
->
codecpar
;
if
(
codec
->
extradata
)
{
if
(
codec
->
codec_id
==
AV_CODEC_ID_H264
&&
!
h264_check_sps_pps
(
pkt
))
{
insert_sps_pps_into_avpacket
(
pkt
,
codec
->
extradata
,
codec
->
extradata_size
,
playlist
);
}
uint8_t
*
side
=
av_packet_new_side_data
(
pkt
,
AV_PKT_DATA_NEW_EXTRADATA
,
codec
->
extradata_size
);
if
(
side
)
{
memcpy
(
side
,
codec
->
extradata
,
codec
->
extradata_size
);
...
...
编辑
预览
Markdown
is supported
0%
请重试
或
添加新附件
.
添加附件
取消
You are about to add
0
people
to the discussion. Proceed with caution.
先完成此消息的编辑!
取消
想要评论请
注册
或
登录