mirror of
https://github.com/ZLMediaKit/ZLMediaKit.git
synced 2026-06-24 01:42:22 +08:00
修复split 264/265相关逻辑的bug
This commit is contained in:
@@ -44,20 +44,32 @@ const char *memfind(const char *buf, int len, const char *subbuf, int sublen) {
|
||||
return NULL;
|
||||
}
|
||||
|
||||
void splitH264(const char *ptr, int len, const std::function<void(const char *, int)> &cb) {
|
||||
auto nal = ptr;
|
||||
void splitH264(const char *ptr, int len, int prefix, const std::function<void(const char *, int, int)> &cb) {
|
||||
auto start = ptr + prefix;
|
||||
auto end = ptr + len;
|
||||
while(true) {
|
||||
auto next_nal = memfind(nal + 3,end - nal - 3,"\x0\x0\x1",3);
|
||||
if(next_nal){
|
||||
if(*(next_nal - 1) == 0x00){
|
||||
next_nal -= 1;
|
||||
int next_prefix;
|
||||
while (true) {
|
||||
auto next_start = memfind(start, end - start, "\x00\x00\x01", 3);
|
||||
if (next_start) {
|
||||
//找到下一帧
|
||||
if (*(next_start - 1) == 0x00) {
|
||||
//这个是00 00 00 01开头
|
||||
next_start -= 1;
|
||||
next_prefix = 4;
|
||||
} else {
|
||||
//这个是00 00 01开头
|
||||
next_prefix = 3;
|
||||
}
|
||||
cb(nal,next_nal - nal);
|
||||
nal = next_nal;
|
||||
//记得加上本帧prefix长度
|
||||
cb(start - prefix, next_start - start + prefix, prefix);
|
||||
//搜索下一帧末尾的起始位置
|
||||
start = next_start + next_prefix;
|
||||
//记录下一帧的prefix长度
|
||||
prefix = next_prefix;
|
||||
continue;
|
||||
}
|
||||
cb(nal,end - nal);
|
||||
//未找到下一帧,这是最后一帧
|
||||
cb(start - prefix, end - start + prefix, prefix);
|
||||
break;
|
||||
}
|
||||
}
|
||||
@@ -65,13 +77,22 @@ void splitH264(const char *ptr, int len, const std::function<void(const char *,
|
||||
#if 0
|
||||
//splitH264函数测试程序
|
||||
static onceToken s_token([](){
|
||||
char buf[] = "\x00\x00\x00\x01\x12\x23\x34\x45\x56"
|
||||
"\x00\x00\x00\x01\x12\x23\x34\x45\x56"
|
||||
"\x00\x00\x00\x01\x12\x23\x34\x45\x56"
|
||||
"\x00\x00\x01\x12\x23\x34\x45\x56";
|
||||
splitH264(buf, sizeof(buf) - 1, [](const char *ptr, int len){
|
||||
cout << hexdump(ptr, len) << endl;
|
||||
});
|
||||
{
|
||||
char buf[] = "\x00\x00\x00\x01\x12\x23\x34\x45\x56"
|
||||
"\x00\x00\x00\x01\x23\x34\x45\x56"
|
||||
"\x00\x00\x00\x01x34\x45\x56"
|
||||
"\x00\x00\x01\x12\x23\x34\x45\x56";
|
||||
splitH264(buf, sizeof(buf) - 1, 4, [](const char *ptr, int len, int prefix) {
|
||||
cout << prefix << " " << hexdump(ptr, len) << endl;
|
||||
});
|
||||
}
|
||||
|
||||
{
|
||||
char buf[] = "\x00\x00\x00\x01\x12\x23\x34\x45\x56";
|
||||
splitH264(buf, sizeof(buf) - 1, 4, [](const char *ptr, int len, int prefix) {
|
||||
cout << prefix << " " << hexdump(ptr, len) << endl;
|
||||
});
|
||||
}
|
||||
});
|
||||
#endif //0
|
||||
|
||||
|
||||
Reference in New Issue
Block a user