formats: Combine header creation and fu division functions

Removed unnecessary function of fu creation. Now it is done together
with header creation. Also added small helper function for creating
nal header.
This commit is contained in:
Joni Räsänen 2021-06-14 14:14:18 +03:00
parent 0360830b6b
commit 4abd24bd02
8 changed files with 32 additions and 66 deletions

View File

@ -144,17 +144,14 @@ rtp_error_t uvgrtp::formats::h264::frame_getter(void *arg, uvgrtp::frame::rtp_fr
return RTP_NOT_FOUND;
}
void uvgrtp::formats::h264::construct_format_header(uint8_t* data, size_t& data_left, size_t& data_pos, size_t payload_size,
uvgrtp::buf_vec& buffers)
rtp_error_t uvgrtp::formats::h264::construct_format_header_divide_fus(uint8_t* data, size_t& data_left,
size_t& data_pos, size_t payload_size, uvgrtp::buf_vec& buffers)
{
uint8_t nal_type = get_nal_type(data);
auto headers = (uvgrtp::formats::h264_headers*)fqueue_->get_media_headers();
headers->fu_indicator[0] = (data[0] & 0xe0) | H264_PKT_FRAG;
headers->fu_headers[0] = (uint8_t)((1 << 7) | nal_type);
headers->fu_headers[1] = nal_type;
headers->fu_headers[2] = (uint8_t)((1 << 6) | nal_type);
initialize_fu_headers(get_nal_type(data), headers->fu_headers);
buffers.push_back(std::make_pair(sizeof(headers->fu_indicator), headers->fu_indicator));
buffers.push_back(std::make_pair(sizeof(uint8_t), &headers->fu_headers[0]));
@ -162,11 +159,6 @@ void uvgrtp::formats::h264::construct_format_header(uint8_t* data, size_t& data_
data_pos = uvgrtp::frame::HEADER_SIZE_H264_NAL;
data_left -= uvgrtp::frame::HEADER_SIZE_H264_NAL;
}
rtp_error_t uvgrtp::formats::h264::format_fu_division(uint8_t* data, size_t& data_left, size_t& data_pos, size_t payload_size,
uvgrtp::buf_vec& buffers)
{
auto headers = (uvgrtp::formats::h264_headers*)fqueue_->get_media_headers();
return divide_frame_to_fus(data, data_left, data_pos, payload_size, buffers, headers->fu_headers);
}

View File

@ -116,12 +116,8 @@ namespace uvgrtp {
virtual void clear_aggregation_info();
// constructs h264 RTP header with correct values
virtual void construct_format_header(uint8_t* data, size_t& data_left, size_t& data_pos, size_t payload_size,
uvgrtp::buf_vec& buffers);
// uses the correct fu headers for fu division
virtual rtp_error_t format_fu_division(uint8_t* data, size_t& data_left, size_t& data_pos, size_t payload_size,
uvgrtp::buf_vec& buffers);
virtual rtp_error_t construct_format_header_divide_fus(uint8_t* data, size_t& data_left,
size_t& data_pos, size_t payload_size, uvgrtp::buf_vec& buffers);
private:

View File

@ -141,18 +141,15 @@ rtp_error_t uvgrtp::formats::h265::handle_small_packet(uint8_t* data, size_t dat
}
}
void uvgrtp::formats::h265::construct_format_header(uint8_t* data, size_t& data_left, size_t& data_pos,
size_t payload_size, uvgrtp::buf_vec& buffers)
rtp_error_t uvgrtp::formats::h265::construct_format_header_divide_fus(uint8_t* data, size_t& data_left,
size_t& data_pos, size_t payload_size, uvgrtp::buf_vec& buffers)
{
uint8_t nal_type = get_nal_type(data);
auto headers = (uvgrtp::formats::h265_headers*)fqueue_->get_media_headers();
headers->nal_header[0] = H265_PKT_FRAG << 1; /* fragmentation unit */
headers->nal_header[1] = 1; /* temporal id */
headers->fu_headers[0] = (uint8_t)((1 << 7) | nal_type);
headers->fu_headers[1] = nal_type;
headers->fu_headers[2] = (uint8_t)((1 << 6) | nal_type);
initialize_fu_headers(get_nal_type(data), headers->fu_headers);
buffers.push_back(std::make_pair(sizeof(headers->nal_header), headers->nal_header));
buffers.push_back(std::make_pair(sizeof(uint8_t), &headers->fu_headers[0]));
@ -160,11 +157,6 @@ void uvgrtp::formats::h265::construct_format_header(uint8_t* data, size_t& data_
data_pos = uvgrtp::frame::HEADER_SIZE_H265_NAL;
data_left -= uvgrtp::frame::HEADER_SIZE_H265_NAL;
}
rtp_error_t uvgrtp::formats::h265::format_fu_division(uint8_t* data, size_t& data_left,
size_t& data_pos, size_t payload_size, uvgrtp::buf_vec& buffers)
{
auto headers = (uvgrtp::formats::h265_headers*)fqueue_->get_media_headers();
return divide_frame_to_fus(data, data_left, data_pos, payload_size, buffers, headers->fu_headers);
}

View File

@ -117,15 +117,10 @@ namespace uvgrtp {
virtual rtp_error_t handle_small_packet(uint8_t* data, size_t data_len, bool more);
// constructs h265 RTP header with correct values
virtual void construct_format_header(uint8_t* data, size_t& data_left, size_t& data_pos, size_t payload_size,
uvgrtp::buf_vec& buffers);
// uses the correct fu headers for fu division
virtual rtp_error_t format_fu_division(uint8_t* data, size_t& data_left, size_t& data_pos, size_t payload_size,
uvgrtp::buf_vec& buffers);
virtual rtp_error_t construct_format_header_divide_fus(uint8_t* data, size_t& data_left,
size_t& data_pos, size_t payload_size, uvgrtp::buf_vec& buffers);
private:
h265_frame_info_t finfo_;
h265_aggregation_packet aggr_pkt_info_;
};

View File

@ -50,7 +50,7 @@ rtp_error_t uvgrtp::formats::h266::handle_small_packet(uint8_t* data, size_t dat
return fqueue_->flush_queue();
}
void uvgrtp::formats::h266::construct_format_header(uint8_t* data, size_t& data_left,
rtp_error_t uvgrtp::formats::h266::construct_format_header_divide_fus(uint8_t* data, size_t& data_left,
size_t& data_pos, size_t payload_size, uvgrtp::buf_vec& buffers)
{
auto headers = (uvgrtp::formats::h266_headers*)fqueue_->get_media_headers();
@ -58,10 +58,7 @@ void uvgrtp::formats::h266::construct_format_header(uint8_t* data, size_t& data_
headers->nal_header[0] = data[0];
headers->nal_header[1] = (29 << 3) | (data[1] & 0x7);
uint8_t nal_type = get_nal_type(data);
headers->fu_headers[0] = (uint8_t)((1 << 7) | nal_type);
headers->fu_headers[1] = nal_type;
headers->fu_headers[2] = (uint8_t)((1 << 6) | nal_type);
initialize_fu_headers(get_nal_type(data), headers->fu_headers);
buffers.push_back(std::make_pair(sizeof(headers->nal_header), headers->nal_header));
buffers.push_back(std::make_pair(sizeof(uint8_t), &headers->fu_headers[0]));
@ -69,11 +66,6 @@ void uvgrtp::formats::h266::construct_format_header(uint8_t* data, size_t& data_
data_pos = uvgrtp::frame::HEADER_SIZE_H266_NAL;
data_left -= uvgrtp::frame::HEADER_SIZE_H266_NAL;
}
rtp_error_t uvgrtp::formats::h266::format_fu_division(uint8_t* data, size_t& data_left,
size_t& data_pos, size_t payload_size, uvgrtp::buf_vec& buffers)
{
auto headers = (uvgrtp::formats::h266_headers*)fqueue_->get_media_headers();
return divide_frame_to_fus(data, data_left, data_pos, payload_size, buffers, headers->fu_headers);
}

View File

@ -101,13 +101,9 @@ namespace uvgrtp {
// the aggregation packet is not enabled
virtual rtp_error_t handle_small_packet(uint8_t* data, size_t data_len, bool more);
// constructs h264 RTP header with correct values
virtual void construct_format_header(uint8_t* data, size_t& data_left, size_t& data_pos, size_t payload_size,
uvgrtp::buf_vec& buffers);
// uses the correct fu headers for fu division
virtual rtp_error_t format_fu_division(uint8_t* data, size_t& data_left, size_t& data_pos, size_t payload_size,
uvgrtp::buf_vec& buffers);
// constructs h266 RTP header with correct values
virtual rtp_error_t construct_format_header_divide_fus(uint8_t* data, size_t& data_left,
size_t& data_pos, size_t payload_size, uvgrtp::buf_vec& buffers);
private:
h266_frame_info_t finfo_;

View File

@ -325,8 +325,7 @@ rtp_error_t uvgrtp::formats::h26x::push_nal_unit(uint8_t *data, size_t data_len,
* transaction also contains our media-specific headers [get_media_headers()]. */
uvgrtp::buf_vec buffers = fqueue_->get_buffer_vector();
construct_format_header(data, data_left, data_pos, payload_size, buffers);
if ((ret = format_fu_division(data, data_left, data_pos, payload_size, buffers)) != RTP_OK)
if ((ret = construct_format_header_divide_fus(data, data_left, data_pos, payload_size, buffers)) != RTP_OK)
return ret;
if ((ret = fqueue_->enqueue_message(buffers)) != RTP_OK) {
@ -397,4 +396,11 @@ rtp_error_t uvgrtp::formats::h26x::divide_frame_to_fus(uint8_t* data, size_t& da
buffers.at(2).second = &data[data_pos];
return ret;
}
void uvgrtp::formats::h26x::initialize_fu_headers(uint8_t nal_type, uint8_t fu_headers[])
{
fu_headers[0] = (uint8_t)((1 << 7) | nal_type);
fu_headers[1] = nal_type;
fu_headers[2] = (uint8_t)((1 << 6) | nal_type);
}

View File

@ -45,18 +45,9 @@ namespace uvgrtp {
/* Handles small packets. May support aggregate packets or not*/
virtual rtp_error_t handle_small_packet(uint8_t* data, size_t data_len, bool more) = 0;
// Constructs the format specific RTP header
virtual void construct_format_header(uint8_t* data, size_t& data_left, size_t& data_pos, size_t payload_size,
uvgrtp::buf_vec& buffers) = 0;
// Divides the packet to fus. The child class should use divide_frame_to_fus for its implementation.
// Makes sure correct header values are used in dividing.
virtual rtp_error_t format_fu_division(uint8_t* data, size_t& data_left, size_t& data_pos, size_t payload_size,
uvgrtp::buf_vec& buffers) = 0;
// a helper function that handles the fu division.
rtp_error_t divide_frame_to_fus(uint8_t* data, size_t& data_left, size_t& data_pos, size_t payload_size,
uvgrtp::buf_vec& buffers, uint8_t fu_headers[]);
// constructs format specific RTP header with correct values
virtual rtp_error_t construct_format_header_divide_fus(uint8_t* data, size_t& data_left,
size_t& data_pos, size_t payload_size, uvgrtp::buf_vec& buffers) = 0;
/* Construct/clear aggregation packets.
* Default implementation does nothing. If aggregation_pkt is supported, the
@ -64,6 +55,12 @@ namespace uvgrtp {
virtual rtp_error_t make_aggregation_pkt();
virtual void clear_aggregation_info();
// a helper function that handles the fu division.
rtp_error_t divide_frame_to_fus(uint8_t* data, size_t& data_left, size_t& data_pos, size_t payload_size,
uvgrtp::buf_vec& buffers, uint8_t fu_headers[]);
void initialize_fu_headers(uint8_t nal_type, uint8_t fu_headers[]);
private:
// constructs and sends the RTP packets with format specific stuff
rtp_error_t push_nal_unit(uint8_t* data, size_t data_len, bool more);