public H264Slice(EltH264Nalu nalu, H264Decoder decoder) : base(nalu) { switch (nalu.NaluType) { case NalUnitType.NAL_UNIT_CODED_SLICE: case NalUnitType.NAL_UNIT_AUX_CODED_SLICE: case NalUnitType.NAL_UNIT_CODED_SLICE_DATAPART_A: case NalUnitType.NAL_UNIT_CODED_SLICE_DATAPART_B: case NalUnitType.NAL_UNIT_CODED_SLICE_DATAPART_C: case NalUnitType.NAL_UNIT_CODED_SLICE_IDR: case NalUnitType.NAL_UNIT_CODED_SLICE_SCALABLE: break; default: throw new NotImplementedException(); } EltSyntax eltSyntax; eltSyntax = nalu.FindSyntax("pic_parameter_set_id"); Debug.Assert(eltSyntax != null); m_PicParamSetId = (UInt32)eltSyntax.Value; m_PicParamSet = decoder.FindPicParamSet(m_PicParamSetId); Debug.Assert(m_PicParamSet != null); m_SeqParamSet = m_PicParamSet.SeqParamSet; Debug.Assert(m_SeqParamSet != null); m_Macroblocs = new Dictionary <UInt32, Macroblock>(); ExplodeMacroblocs(nalu); }
public H264SeqParamSet(EltH264Nalu nalu) : base(nalu) { EltSyntax eltSyntax; Debug.Assert(nalu.NaluType == NalUnitType.NAL_UNIT_SPS || nalu.NaluType == NalUnitType.NAL_UNIT_SUBSET_SPS); eltSyntax = nalu.FindSyntax("seq_parameter_set_id"); Debug.Assert(eltSyntax != null); m_Id = (UInt32)eltSyntax.Value; eltSyntax = nalu.FindSyntax("pic_width_in_mbs_minus1"); Debug.Assert(eltSyntax != null); m_Width = ((UInt32)eltSyntax.Value << 4) + 16; eltSyntax = nalu.FindSyntax("pic_height_in_map_units_minus1"); Debug.Assert(eltSyntax != null); m_Height = ((UInt32)eltSyntax.Value << 4) + 16; m_SizeInMbs = (m_Width * m_Height) >> 8; }
public H264PicParamSet(EltH264Nalu nalu, H264Decoder decoder) : base(nalu) { EltSyntax eltSyntax; Debug.Assert(nalu.NaluType == NalUnitType.NAL_UNIT_PPS); eltSyntax = nalu.FindSyntax("pic_parameter_set_id"); Debug.Assert(eltSyntax != null); m_Id = (UInt32)eltSyntax.Value; eltSyntax = nalu.FindSyntax("seq_parameter_set_id"); Debug.Assert(eltSyntax != null); m_SeqParamSetId = (UInt32)eltSyntax.Value; eltSyntax = nalu.FindSyntax("entropy_coding_mode_flag"); Debug.Assert(eltSyntax != null); m_IsCAVLCEncoded = (eltSyntax.Value == 0); m_SeqParamSet = decoder.FindSeqParamSet(nalu.LayerId, m_SeqParamSetId); Debug.Assert(m_SeqParamSet != null); }
public H264Nalu(EltH264Nalu nalu) { m_Nalu = nalu; }
void DecoderH264_OnEvent(object sender, EltEventArgs e) { if (g_MainInstH264.Dispatcher.CheckAccess() == false) { g_MainInstH264.Dispatcher.Invoke(System.Windows.Threading.DispatcherPriority.DataBind, (Action)(() => DecoderH264_OnEvent(sender, e))); return; } Debug.Assert(e.Elt.Type == Elt.EltType_t.EltType_Section); foreach (Elt elt in e.Elt.Elements) { switch (elt.Type) { case Elt.EltType_t.EltType_Nalu: { EltH264Nalu nalu = (elt as EltH264Nalu); switch (nalu.NaluType) { case NalUnitType.NAL_UNIT_SPS: case NalUnitType.NAL_UNIT_SUBSET_SPS: { AddSeqParamSet(new H264SeqParamSet(nalu)); break; } case NalUnitType.NAL_UNIT_PPS: { AddPicParamSet(new H264PicParamSet(nalu, this)); break; } case NalUnitType.NAL_UNIT_CODED_SLICE: case NalUnitType.NAL_UNIT_CODED_SLICE_IDR: case NalUnitType.NAL_UNIT_CODED_SLICE_SCALABLE: { H264Slice slice = new H264Slice(nalu, this); Debug.Assert(slice != null); H264Picture picture = FindPicture(nalu.LayerId, nalu.PictureId) as H264Picture; if (picture == null) { picture = new H264Picture(nalu.LayerId, nalu.PictureId, slice.PicParamSet, slice.SeqParamSet); } bool wasComplete = picture.IsComplete; picture.AddSlice(slice); AddPicture(picture, wasComplete); break; } case NalUnitType.NAL_UNIT_ACCESS_UNIT_DELIMITER: { break; } } break; } } } if (OnEvent != null) { EventHandlerTrigger.TriggerEvent <EltEventArgs>(OnEvent, this, e); } }