diff --git a/src/formats/h264.cc b/src/formats/h264.cc index 8e5c787..3e72f63 100644 --- a/src/formats/h264.cc +++ b/src/formats/h264.cc @@ -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); } \ No newline at end of file diff --git a/src/formats/h264.hh b/src/formats/h264.hh index c683724..9c83156 100644 --- a/src/formats/h264.hh +++ b/src/formats/h264.hh @@ -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: diff --git a/src/formats/h265.cc b/src/formats/h265.cc index 83af4ec..1bcd03b 100644 --- a/src/formats/h265.cc +++ b/src/formats/h265.cc @@ -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); } \ No newline at end of file diff --git a/src/formats/h265.hh b/src/formats/h265.hh index 61a6958..c452f75 100644 --- a/src/formats/h265.hh +++ b/src/formats/h265.hh @@ -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_; }; diff --git a/src/formats/h266.cc b/src/formats/h266.cc index c212e36..21244dd 100644 --- a/src/formats/h266.cc +++ b/src/formats/h266.cc @@ -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); } \ No newline at end of file diff --git a/src/formats/h266.hh b/src/formats/h266.hh index c08858c..5cd7ca2 100644 --- a/src/formats/h266.hh +++ b/src/formats/h266.hh @@ -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_; diff --git a/src/formats/h26x.cc b/src/formats/h26x.cc index 5c9da0d..385b379 100644 --- a/src/formats/h26x.cc +++ b/src/formats/h26x.cc @@ -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); } \ No newline at end of file diff --git a/src/formats/h26x.hh b/src/formats/h26x.hh index 645cdda..57b6726 100644 --- a/src/formats/h26x.hh +++ b/src/formats/h26x.hh @@ -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);