mirror of
https://github.com/kunkundi/crossdesk.git
synced 2025-10-27 04:35:34 +08:00
Fix OBU header parse error when payload size equals to 0
This commit is contained in:
@@ -343,52 +343,11 @@ int AomAv1Encoder::Encode(
|
|||||||
LOG_INFO("Encoded frame qp = {}", qp);
|
LOG_INFO("Encoded frame qp = {}", qp);
|
||||||
|
|
||||||
std::vector<Obu> obus = ParseObus(encoded_frame_, encoded_frame_size_);
|
std::vector<Obu> obus = ParseObus(encoded_frame_, encoded_frame_size_);
|
||||||
// LOG_ERROR("Obu size = [{}]", obus.size());
|
for (int i = 0; i < obus.size(); i++) {
|
||||||
// for (int i = 0; i < obus.size(); i++) {
|
LOG_ERROR("[{}] Obu size = [{}], Obu type [{}]", i,
|
||||||
// LOG_ERROR("Obu size = {} [{} {}]", i, obus[i].size_,
|
obus[i].payload_size_,
|
||||||
// obus[i].payload_size_);
|
ObuTypeToString((OBU_TYPE)ObuType(obus[i].header_)));
|
||||||
// }
|
}
|
||||||
|
|
||||||
// int consumed_size = 0;
|
|
||||||
// int offset = 0;
|
|
||||||
// int unit = 0;
|
|
||||||
// while (consumed_size < encoded_frame_size_) {
|
|
||||||
// int obu_size = 0;
|
|
||||||
// uint8_t obu_header;
|
|
||||||
// memcpy(&obu_header, encoded_frame_ + offset, sizeof(char));
|
|
||||||
// obu_size = 1;
|
|
||||||
// offset += 1;
|
|
||||||
// // memcpy(reinterpret_cast<char *>(&obu_header), encoded_frame_, 1);
|
|
||||||
// int obu_type = (obu_header & 0b0'1111'000) >> 3;
|
|
||||||
|
|
||||||
// bool obu_has_ext = obu_header & 0b0'0000'100;
|
|
||||||
// // LOG_ERROR("OBU has ext {}", obu_has_ext);
|
|
||||||
|
|
||||||
// bool obu_has_size = obu_header & kObuSizePresentBit;
|
|
||||||
// LOG_ERROR("OBU has size {}", obu_has_size);
|
|
||||||
// if (!obu_has_size) {
|
|
||||||
// consumed_size = encoded_frame_size_;
|
|
||||||
// offset = encoded_frame_size_;
|
|
||||||
// } else {
|
|
||||||
// uint64_t size = 0;
|
|
||||||
// if (!ReadLeb128((char *)(encoded_frame_ + offset), &size) ||
|
|
||||||
// size > encoded_frame_size_ - consumed_size) {
|
|
||||||
// LOG_ERROR(
|
|
||||||
// "Malformed AV1 input: declared size {} is larger than "
|
|
||||||
// "remaining buffer size {}",
|
|
||||||
// size, encoded_frame_size_ - consumed_size);
|
|
||||||
// return -1;
|
|
||||||
// }
|
|
||||||
|
|
||||||
// LOG_ERROR("leb128 get size = {}, offset = {}", size, offset);
|
|
||||||
// consumed_size += size;
|
|
||||||
// offset += size;
|
|
||||||
// obu_size += size;
|
|
||||||
// }
|
|
||||||
|
|
||||||
// LOG_ERROR("Temporal unit [{}], OBU size [{}], OBU type [{}]", unit++,
|
|
||||||
// obu_size, obu_type);
|
|
||||||
// }
|
|
||||||
|
|
||||||
if (on_encoded_image) {
|
if (on_encoded_image) {
|
||||||
on_encoded_image((char *)encoded_frame_, encoded_frame_size_);
|
on_encoded_image((char *)encoded_frame_, encoded_frame_size_);
|
||||||
|
|||||||
@@ -17,6 +17,9 @@ Obu::Obu(const Obu &obu) {
|
|||||||
payload_size_ = obu.payload_size_;
|
payload_size_ = obu.payload_size_;
|
||||||
header_ = obu.header_;
|
header_ = obu.header_;
|
||||||
extension_header_ = obu.extension_header_;
|
extension_header_ = obu.extension_header_;
|
||||||
|
} else {
|
||||||
|
header_ = obu.header_;
|
||||||
|
extension_header_ = obu.extension_header_;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -31,11 +34,16 @@ Obu::Obu(Obu &&obu)
|
|||||||
|
|
||||||
Obu &Obu::operator=(const Obu &obu) {
|
Obu &Obu::operator=(const Obu &obu) {
|
||||||
if (&obu != this) {
|
if (&obu != this) {
|
||||||
payload_ = (uint8_t *)realloc(payload_, obu.payload_size_);
|
if (obu.payload_size_ > 0) {
|
||||||
memcpy(payload_, obu.payload_, obu.payload_size_);
|
payload_ = (uint8_t *)realloc(payload_, obu.payload_size_);
|
||||||
payload_size_ = obu.payload_size_;
|
memcpy(payload_, obu.payload_, obu.payload_size_);
|
||||||
header_ = obu.header_;
|
payload_size_ = obu.payload_size_;
|
||||||
extension_header_ = obu.extension_header_;
|
header_ = obu.header_;
|
||||||
|
extension_header_ = obu.extension_header_;
|
||||||
|
} else {
|
||||||
|
header_ = obu.header_;
|
||||||
|
extension_header_ = obu.extension_header_;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
return *this;
|
return *this;
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -52,8 +52,7 @@ std::vector<Obu> ParseObus(uint8_t* payload, int payload_size) {
|
|||||||
while (payload_reader.Length() > 0) {
|
while (payload_reader.Length() > 0) {
|
||||||
Obu obu;
|
Obu obu;
|
||||||
payload_reader.ReadUInt8(&obu.header_);
|
payload_reader.ReadUInt8(&obu.header_);
|
||||||
LOG_ERROR("Get obu type = [{}]",
|
|
||||||
ObuTypeToString((OBU_TYPE)ObuType(obu.header_)))
|
|
||||||
obu.size_ = 1;
|
obu.size_ = 1;
|
||||||
if (ObuHasExtension(obu.header_)) {
|
if (ObuHasExtension(obu.header_)) {
|
||||||
if (payload_reader.Length() == 0) {
|
if (payload_reader.Length() == 0) {
|
||||||
@@ -70,7 +69,6 @@ std::vector<Obu> ParseObus(uint8_t* payload, int payload_size) {
|
|||||||
obu.SetPayload(reinterpret_cast<const uint8_t*>(payload_reader.Data()),
|
obu.SetPayload(reinterpret_cast<const uint8_t*>(payload_reader.Data()),
|
||||||
payload_reader.Length());
|
payload_reader.Length());
|
||||||
payload_reader.Consume(payload_reader.Length());
|
payload_reader.Consume(payload_reader.Length());
|
||||||
LOG_ERROR("payload_reader.Length() = {}", payload_reader.Length());
|
|
||||||
} else {
|
} else {
|
||||||
uint64_t size = 0;
|
uint64_t size = 0;
|
||||||
if (!payload_reader.ReadUVarint(&size) ||
|
if (!payload_reader.ReadUVarint(&size) ||
|
||||||
@@ -84,7 +82,6 @@ std::vector<Obu> ParseObus(uint8_t* payload, int payload_size) {
|
|||||||
obu.SetPayload(reinterpret_cast<const uint8_t*>(payload_reader.Data()),
|
obu.SetPayload(reinterpret_cast<const uint8_t*>(payload_reader.Data()),
|
||||||
size);
|
size);
|
||||||
payload_reader.Consume(size);
|
payload_reader.Consume(size);
|
||||||
LOG_ERROR("size = {}", size);
|
|
||||||
}
|
}
|
||||||
obu.size_ += obu.payload_size_;
|
obu.size_ += obu.payload_size_;
|
||||||
// Skip obus that shouldn't be transfered over rtp.
|
// Skip obus that shouldn't be transfered over rtp.
|
||||||
@@ -94,19 +91,16 @@ std::vector<Obu> ParseObus(uint8_t* payload, int payload_size) {
|
|||||||
// obu_type != kObuTypePadding) {
|
// obu_type != kObuTypePadding) {
|
||||||
// result.push_back(obu);
|
// result.push_back(obu);
|
||||||
// }
|
// }
|
||||||
|
|
||||||
LOG_ERROR("Obu size = [{}], Obu type [{}]", obu.size_,
|
|
||||||
ObuTypeToString((OBU_TYPE)ObuType(obu.header_)));
|
|
||||||
if (1) {
|
if (1) {
|
||||||
result.push_back(obu);
|
result.push_back(obu);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
LOG_ERROR("Obu size = [{}]", result.size());
|
// for (int i = 0; i < result.size(); i++) {
|
||||||
for (int i = 0; i < result.size(); i++) {
|
// LOG_ERROR("[{}] Obu size = [{}], Obu type [{}]", i,
|
||||||
LOG_ERROR("[{}] Obu size = [{}], Obu type [{}]", i, result[i].payload_size_,
|
// result[i].payload_size_,
|
||||||
ObuTypeToString((OBU_TYPE)ObuType(result[i].header_)));
|
// ObuTypeToString((OBU_TYPE)ObuType(result[i].header_)));
|
||||||
}
|
// }
|
||||||
|
|
||||||
return result;
|
return result;
|
||||||
}
|
}
|
||||||
@@ -15,4 +15,13 @@
|
|||||||
#include "obu.h"
|
#include "obu.h"
|
||||||
|
|
||||||
std::vector<Obu> ParseObus(uint8_t* payload, int payload_size);
|
std::vector<Obu> ParseObus(uint8_t* payload, int payload_size);
|
||||||
|
|
||||||
|
const char* ObuTypeToString(OBU_TYPE type);
|
||||||
|
|
||||||
|
bool ObuHasExtension(uint8_t obu_header);
|
||||||
|
|
||||||
|
bool ObuHasSize(uint8_t obu_header);
|
||||||
|
|
||||||
|
int ObuType(uint8_t obu_header);
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
Reference in New Issue
Block a user