mirror of
https://github.com/mollyim/webrtc.git
synced 2025-05-16 15:20:42 +01:00
![]() Summary: There is an issue with WebRTC for handling of certain H.264 bitstreams where the packets forming the H.264 stream has non-zero packets before the packet containing SPS. Typically a IDR (key frame) will have SPS/PPS (if present) or the IDR slice in the first packet. But this is not required in all cases, for example when packetization-mode = 0, you can have each NALU in separate packet. And certain NALUs can exist before SPS, for example SEI, AUD. The way WebRTC associates width/height to encoded frames is by tracking the dependency of IDR slices to SPS/PPS. RTP packets containing SPS/PPS have correct width/height stored in them during parsing of SPS in RtpDepacketizerH264::ProcessStapAOrSingleNalu IDR packets refer to SPS using ppsid, spsid and the width/height fields get transferred from packet containing SPS to IDR packet in H264SpsPpsTracker::CopyAndFixBitstream. When packets are assembled into a single encoded H264 frame in PacketBuffer::FindFrames, the loop goes through all the packets/nalus in backward scan from last RTP packet of IDR to first one. Hence the order of NALUs during this scan is : Last parts of IDR Slice -> Mid parts of IDR Slice RTP packet -> first IDR slice Packet (this should have correct width / height) -> RTP packet containing SPS/PPS (this should have correct width/height) start_index points to the first RTP packet of the frame and its passed into RtpFrameObject's constructor. RtpFrameObject will use the width/height stored in first RTP packet. This works fine as long as the first RTP packet has width/height, which will be the case if first RTP packet is IDR or SPS. In H.264 first RTP packet may be AUD, SEI in those cases, RtpFrameObject will create IDR with width/height = 0 and this causes problem for Android hardware decoders. On Android hardware decoders rely on correct width/height to initialize the hardware decoder. Verified on real scenario that we have. Simulated on AppRTCMobile on IOS Simulator Added unit tests : ninja -C out/Default && ./out/Default/modules_unittests --gtest_filter=*FrameResolution* Bug: webrtc:11025 Change-Id: Ie2273aae5e81fd62497e1add084876a3aa05af4d Reviewed-on: https://webrtc-review.googlesource.com/c/src/+/156260 Reviewed-by: Philip Eliasson <philipel@webrtc.org> Reviewed-by: Sergey Silkin <ssilkin@webrtc.org> Commit-Queue: Shyam Sadhwani <shyamsadhwani@fb.com> Cr-Commit-Position: refs/heads/master@{#29515} |
||
---|---|---|
.. | ||
codecs | ||
include | ||
test | ||
utility | ||
BUILD.gn | ||
codec_timer.cc | ||
codec_timer.h | ||
decoder_database.cc | ||
decoder_database.h | ||
decoding_state.cc | ||
decoding_state.h | ||
decoding_state_unittest.cc | ||
DEPS | ||
encoded_frame.cc | ||
encoded_frame.h | ||
fec_controller_default.cc | ||
fec_controller_default.h | ||
fec_controller_unittest.cc | ||
fec_rate_table.h | ||
frame_buffer.cc | ||
frame_buffer.h | ||
frame_buffer2.cc | ||
frame_buffer2.h | ||
frame_buffer2_unittest.cc | ||
frame_object.cc | ||
frame_object.h | ||
generic_decoder.cc | ||
generic_decoder.h | ||
generic_decoder_unittest.cc | ||
h264_sprop_parameter_sets.cc | ||
h264_sprop_parameter_sets.h | ||
h264_sprop_parameter_sets_unittest.cc | ||
h264_sps_pps_tracker.cc | ||
h264_sps_pps_tracker.h | ||
h264_sps_pps_tracker_unittest.cc | ||
histogram.cc | ||
histogram.h | ||
histogram_unittest.cc | ||
inter_frame_delay.cc | ||
inter_frame_delay.h | ||
internal_defines.h | ||
jitter_buffer.cc | ||
jitter_buffer.h | ||
jitter_buffer_common.h | ||
jitter_buffer_unittest.cc | ||
jitter_estimator.cc | ||
jitter_estimator.h | ||
jitter_estimator_tests.cc | ||
loss_notification_controller.cc | ||
loss_notification_controller.h | ||
loss_notification_controller_unittest.cc | ||
media_opt_util.cc | ||
media_opt_util.h | ||
nack_module.cc | ||
nack_module.h | ||
nack_module_unittest.cc | ||
OWNERS | ||
packet.cc | ||
packet.h | ||
packet_buffer.cc | ||
packet_buffer.h | ||
receiver.cc | ||
receiver.h | ||
receiver_unittest.cc | ||
rtp_frame_reference_finder.cc | ||
rtp_frame_reference_finder.h | ||
rtp_frame_reference_finder_unittest.cc | ||
rtt_filter.cc | ||
rtt_filter.h | ||
session_info.cc | ||
session_info.h | ||
session_info_unittest.cc | ||
timestamp_map.cc | ||
timestamp_map.h | ||
timing.cc | ||
timing.h | ||
timing_unittest.cc | ||
video_codec_initializer.cc | ||
video_codec_initializer_unittest.cc | ||
video_coding_defines.cc | ||
video_coding_impl.cc | ||
video_coding_impl.h | ||
video_packet_buffer_unittest.cc | ||
video_receiver.cc | ||
video_receiver2.cc | ||
video_receiver2.h | ||
video_receiver_unittest.cc |