From 3d42787dd01c46e683e46285d10065007cc33f9e Mon Sep 17 00:00:00 2001 From: Kostya Shishkov Date: Sat, 31 Oct 2026 15:58:47 +0100 Subject: [PATCH] h264: allow configuration data without 'avcC' prefix --- nihav-itu/src/codecs/h264/baseline/decoder_mt.rs | 4 +++- nihav-itu/src/codecs/h264/baseline/decoder_st.rs | 4 +++- nihav-itu/src/codecs/h264/high/decoder_mt.rs | 4 +++- nihav-itu/src/codecs/h264/high/decoder_st.rs | 4 +++- nihav-itu/src/codecs/h264/mod.rs | 4 +++- 5 files changed, 15 insertions(+), 5 deletions(-) diff --git a/nihav-itu/src/codecs/h264/baseline/decoder_mt.rs b/nihav-itu/src/codecs/h264/baseline/decoder_mt.rs index d5323f6..083b861 100644 --- a/nihav-itu/src/codecs/h264/baseline/decoder_mt.rs +++ b/nihav-itu/src/codecs/h264/baseline/decoder_mt.rs @@ -729,10 +729,12 @@ impl NADecoderMT for H264MTDecoder { let edata = info.get_extradata().unwrap(); //print!("edata:"); for &el in edata.iter() { print!(" {:02X}", el); } println!(); - if edata.len() > 11 && &edata[0..4] == b"avcC" { + if edata.len() > 7 { let mut br = MemoryReader::new_read(edata.as_slice()); + if &edata[0..4] == b"avcC" { br.read_skip(4)?; + } let version = br.read_byte()?; validate!(version == 1); let profile = br.read_byte()?; diff --git a/nihav-itu/src/codecs/h264/baseline/decoder_st.rs b/nihav-itu/src/codecs/h264/baseline/decoder_st.rs index 683c031..8d2b5c8 100644 --- a/nihav-itu/src/codecs/h264/baseline/decoder_st.rs +++ b/nihav-itu/src/codecs/h264/baseline/decoder_st.rs @@ -726,11 +726,13 @@ impl NADecoder for H264Decoder { let edata = info.get_extradata().unwrap(); //print!("edata:"); for &el in edata.iter() { print!(" {:02X}", el); } println!(); - if edata.len() > 11 && &edata[0..4] == b"avcC" { + if edata.len() > 7 { let mut br = MemoryReader::new_read(edata.as_slice()); let mut nal_buf = Vec::new(); + if &edata[0..4] == b"avcC" { br.read_skip(4)?; + } let version = br.read_byte()?; validate!(version == 1); let profile = br.read_byte()?; diff --git a/nihav-itu/src/codecs/h264/high/decoder_mt.rs b/nihav-itu/src/codecs/h264/high/decoder_mt.rs index 978eccf..90ca8f2 100644 --- a/nihav-itu/src/codecs/h264/high/decoder_mt.rs +++ b/nihav-itu/src/codecs/h264/high/decoder_mt.rs @@ -747,10 +747,12 @@ impl NADecoderMT for H264MTDecoder { let edata = info.get_extradata().unwrap(); //print!("edata:"); for &el in edata.iter() { print!(" {:02X}", el); } println!(); - if edata.len() > 11 && &edata[0..4] == b"avcC" { + if edata.len() > 7 { let mut br = MemoryReader::new_read(edata.as_slice()); + if &edata[0..4] == b"avcC" { br.read_skip(4)?; + } let version = br.read_byte()?; validate!(version == 1); let profile = br.read_byte()?; diff --git a/nihav-itu/src/codecs/h264/high/decoder_st.rs b/nihav-itu/src/codecs/h264/high/decoder_st.rs index b125d93..a01181b 100644 --- a/nihav-itu/src/codecs/h264/high/decoder_st.rs +++ b/nihav-itu/src/codecs/h264/high/decoder_st.rs @@ -743,11 +743,13 @@ impl NADecoder for H264Decoder { let edata = info.get_extradata().unwrap(); //print!("edata:"); for &el in edata.iter() { print!(" {:02X}", el); } println!(); - if edata.len() > 11 && &edata[0..4] == b"avcC" { + if edata.len() > 7 { let mut br = MemoryReader::new_read(edata.as_slice()); let mut nal_buf = Vec::new(); + if &edata[0..4] == b"avcC" { br.read_skip(4)?; + } let version = br.read_byte()?; validate!(version == 1); let profile = br.read_byte()?; diff --git a/nihav-itu/src/codecs/h264/mod.rs b/nihav-itu/src/codecs/h264/mod.rs index bc75f9d..ef118ff 100644 --- a/nihav-itu/src/codecs/h264/mod.rs +++ b/nihav-itu/src/codecs/h264/mod.rs @@ -169,11 +169,13 @@ fn unescape_nal(src: &[u8], dst: &mut Vec) -> usize { } fn is_high_bitdepth(edata: &[u8]) -> DecoderResult { - if edata.len() > 11 && &edata[0..4] == b"avcC" { + if edata.len() > 7 { let mut br = MemoryReader::new_read(edata); let mut nal_buf = Vec::new(); + if &edata[0..4] == b"avcC" { br.read_skip(4)?; + } let version = br.read_byte()?; validate!(version == 1); let profile = br.read_byte()?; -- 2.47.3