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:
parent
0360830b6b
commit
4abd24bd02
|
@ -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);
|
||||
}
|
|
@ -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:
|
||||
|
||||
|
|
|
@ -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);
|
||||
}
|
|
@ -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_;
|
||||
};
|
||||
|
|
|
@ -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);
|
||||
}
|
|
@ -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_;
|
||||
|
|
|
@ -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);
|
||||
}
|
|
@ -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);
|
||||
|
|
Loading…
Reference in New Issue