Skip to content

Commit dadc5ee

Browse files
committed
Add additional utest for video info frames.
1 parent b67ef7a commit dadc5ee

File tree

2 files changed

+84
-0
lines changed

2 files changed

+84
-0
lines changed

trunk/src/kernel/srs_kernel_packet.cpp

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -643,6 +643,11 @@ srs_error_t SrsFormat::video_avc_demux(SrsBuffer *stream, int64_t timestamp)
643643
// ignore info frame without error,
644644
// @see https://github.com/ossrs/srs/issues/288#issuecomment-69863909
645645
if (video_->frame_type_ == SrsVideoAvcFrameTypeVideoInfoFrame) {
646+
// For non-ext header Video Info Frame, try to read packet type from stream if available
647+
if (!is_ext_header && stream->left() > 0) {
648+
packet_type = (SrsVideoAvcFrameTrait)stream->read_1bytes();
649+
}
650+
646651
video_->avc_packet_type_ = packet_type;
647652
srs_warn("avc ignore the info frame");
648653
return err;

trunk/src/utest/srs_utest_manual_kernel.cpp

Lines changed: 79 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4326,6 +4326,85 @@ VOID TEST(KernelCodecTest, VideoFrameH264_BFrameDetection_EdgeCases)
43264326
}
43274327
}
43284328

4329+
VOID TEST(KernelCodecTest, VideoFrameVideoInfoFrameHandling)
4330+
{
4331+
srs_error_t err;
4332+
4333+
// Test both AVC and HEVC video codecs
4334+
SrsFormat format;
4335+
HELPER_EXPECT_SUCCESS(format.initialize());
4336+
4337+
// Test 1: AVC Video Info Frame handling with additional NALU data (mock data set 2)
4338+
{
4339+
// AVC Video Info Frame - mock data set 2
4340+
// Frame type 5 (Video Info Frame) | Codec ID 7 (AVC)
4341+
uint8_t avc_video_info_frame2[] = {
4342+
0x57, // Frame type 5 (Video Info Frame) | Codec ID 7 (AVC)
4343+
0x01, // AVC packet type 1 (NALU)
4344+
0x00, 0x00, 0x00, // Composition time 0
4345+
// NALU data (mock IDR frame)
4346+
0x00, 0x00, 0x00, 0x01, // NAL unit start code
4347+
0x65, 0x88, 0x84, 0x00 // IDR NALU (mock data)
4348+
};
4349+
4350+
// Call on_video with AVC video info frame - should not return error
4351+
err = format.on_video(2000, (char *)avc_video_info_frame2, sizeof(avc_video_info_frame2));
4352+
EXPECT_TRUE(err == NULL) << "Failed to handle AVC Video Info Frame with NALU data";
4353+
4354+
// Verify avc_packet_type_ is correctly set to SrsVideoAvcFrameTraitNALU (1)
4355+
EXPECT_TRUE(format.video_ != NULL) << "Video packet should be initialized after on_video call";
4356+
EXPECT_EQ(format.video_->avc_packet_type_, SrsVideoAvcFrameTraitNALU)
4357+
<< "Expected avc_packet_type_ to be SrsVideoAvcFrameTraitNALU (1), got "
4358+
<< format.video_->avc_packet_type_;
4359+
4360+
srs_freep(err);
4361+
}
4362+
4363+
// Test 2: HEVC Video Info Frame handling with coded frames (mock data set 2)
4364+
{
4365+
// HEVC Video Info Frame (enhanced RTMP format) - mock data set 2
4366+
uint8_t hevc_video_info_frame2[] = {
4367+
0xD1, // Frame type 5 (Video Info Frame) | Extended header flag (0x80) | Packet type 1
4368+
0x68, 0x76, 0x63, 0x31, // 'hvc1' FourCC (HEVC)
4369+
0x00, 0x00, 0x00 // Composition time 0 (for coded frames packet type)
4370+
};
4371+
4372+
// Call on_video with HEVC video info frame - should not return error
4373+
err = format.on_video(4000, (char *)hevc_video_info_frame2, sizeof(hevc_video_info_frame2));
4374+
EXPECT_TRUE(err == NULL) << "Failed to handle HEVC Video Info Frame with coded frames";
4375+
4376+
// Verify avc_packet_type_ is correctly set to SrsVideoHEVCFrameTraitPacketTypeCodedFrames (1)
4377+
EXPECT_TRUE(format.video_ != NULL) << "Video packet should be initialized after on_video call";
4378+
EXPECT_EQ(format.video_->avc_packet_type_, SrsVideoHEVCFrameTraitPacketTypeCodedFrames)
4379+
<< "Expected avc_packet_type_ to be SrsVideoHEVCFrameTraitPacketTypeCodedFrames (1), got "
4380+
<< format.video_->avc_packet_type_;
4381+
4382+
srs_freep(err);
4383+
}
4384+
4385+
// Test 3: HEVC Video Info Frame handling with coded frames X (optimized zero composition time)
4386+
{
4387+
// HEVC Video Info Frame with coded frames X (optimized)
4388+
uint8_t hevc_video_info_frame3[] = {
4389+
0xD3, // Frame type 5 (Video Info Frame) | Extended header flag (0x80) | Packet type 3 (coded frames X)
4390+
0x68, 0x76, 0x63, 0x31 // 'hvc1' FourCC (HEVC)
4391+
// No composition time field for coded frames X (implied to be zero)
4392+
};
4393+
4394+
// Call on_video with HEVC video info frame - should not return error
4395+
err = format.on_video(7000, (char *)hevc_video_info_frame3, sizeof(hevc_video_info_frame3));
4396+
EXPECT_TRUE(err == NULL) << "Failed to handle HEVC Video Info Frame with coded frames X";
4397+
4398+
// Verify avc_packet_type_ is correctly set to SrsVideoHEVCFrameTraitPacketTypeCodedFramesX (3)
4399+
EXPECT_TRUE(format.video_ != NULL) << "Video packet should be initialized after on_video call";
4400+
EXPECT_EQ(format.video_->avc_packet_type_, SrsVideoHEVCFrameTraitPacketTypeCodedFramesX)
4401+
<< "Expected avc_packet_type_ to be SrsVideoHEVCFrameTraitPacketTypeCodedFramesX (3), got "
4402+
<< format.video_->avc_packet_type_;
4403+
4404+
srs_freep(err);
4405+
}
4406+
}
4407+
43294408
VOID TEST(KernelCodecTest, VideoFrameH265)
43304409
{
43314410
srs_error_t err;

0 commit comments

Comments
 (0)