// Processes media sample received from the header internal void ProcessSample(StspSampleHeader sampleHead, IMFSample sample) { Debug.Assert(sample != null); try { ThrowIfError(CheckShutdown()); // Set sample attributes SetSampleAttributes(sampleHead, sample); // Check if we are in propper state if so deliver the sample otherwise just skip it and don't treat it as an error. if (_eSourceState == SourceState.SourceState_Started) { // Put sample on the list _samples.Enqueue(sample); // Deliver samples DeliverSamples(); } else { Throw(HResult.MF_E_UNEXPECTED); } } catch (Exception ex) { HandleError(ex.HResult); } }
void SET_SAMPLE_ATTRIBUTE(StspSampleHeader sampleHeader, IMFSample pSample, Guid flag, StspSampleFlags flagValue) { var value = (int)flagValue; if ((value & sampleHeader.dwFlagMasks) == value) { ThrowIfError(pSample.SetUINT32(flag, ((value & sampleHeader.dwFlags) == value) ? 1 : 0)); } }
private void SetSampleAttributes(StspSampleHeader sampleHeader, IMFSample sample) { ThrowIfError(sample.SetSampleTime(sampleHeader.ullTimestamp)); ThrowIfError(sample.SetSampleDuration(sampleHeader.ullDuration)); SET_SAMPLE_ATTRIBUTE(sampleHeader, sample, MFSampleExtension_BottomFieldFirst, StspSampleFlags.StspSampleFlag_BottomFieldFirst); SET_SAMPLE_ATTRIBUTE(sampleHeader, sample, MFSampleExtension_CleanPoint, StspSampleFlags.StspSampleFlag_CleanPoint); SET_SAMPLE_ATTRIBUTE(sampleHeader, sample, MFSampleExtension_DerivedFromTopField, StspSampleFlags.StspSampleFlag_DerivedFromTopField); SET_SAMPLE_ATTRIBUTE(sampleHeader, sample, MFSampleExtension_Discontinuity, StspSampleFlags.StspSampleFlag_Discontinuity); SET_SAMPLE_ATTRIBUTE(sampleHeader, sample, MFSampleExtension_Interlaced, StspSampleFlags.StspSampleFlag_Interlaced); SET_SAMPLE_ATTRIBUTE(sampleHeader, sample, MFSampleExtension_RepeatFirstField, StspSampleFlags.StspSampleFlag_RepeatFirstField); SET_SAMPLE_ATTRIBUTE(sampleHeader, sample, MFSampleExtension_SingleField, StspSampleFlags.StspSampleFlag_SingleField); /* show debug info... * int cbTotalLen; * sample.GetTotalLength(out cbTotalLen); * var isKeyFrame = Convert.ToBoolean(sampleHeader.dwFlags & (int)StspSampleFlags.StspSampleFlag_CleanPoint); * Debug.WriteLine($"{DateTime.Now.ToString()} Received sample {sampleHeader.ullTimestamp} Duration-{sampleHeader.ullDuration} Length-{cbTotalLen} " + (isKeyFrame ? "key frame" : "")); */ }