Exemple #1
0
        internal CodecStream(IDataReader dataReader, IDataBlockBuilder dataBlockBuilder, QtAtom root)
        {
            if (dataReader == null)
            {
                throw new ArgumentNullException("dataReader");
            }
            if (dataBlockBuilder == null)
            {
                throw new ArgumentNullException("dataBlockBuilder");
            }
            if (root == null)
            {
                throw new ArgumentNullException("root");
            }

            _dataReader       = dataReader;
            _dataBlockBuilder = dataBlockBuilder;
            _root             = root;
            _moov             = _root.FindChild(AtomName.Movie);
            _mdat             = _root.FindChild(AtomName.MediaData);
            _fileOffset       = _root.FirstChild.Offset;

            if (_mdat == null)
            {
                _mdatChunk = new Chunk(((QtAtom)_root.GetLastDescendant()).Offset - _fileOffset, 0);
            }
            else
            {
                _mdatChunk = new Chunk(_mdat.Offset - _fileOffset + 8, (_mdat.Length - 8));
            }

            _mdatMaxUnparsedBytes = (uint)QtDetector.Configurable[QtDetector.ConfigurationKey.MediaDateMaxUnparsedBytes];
        }
Exemple #2
0
        private static string GetCodecStreamName(QtAtom track, QtAtom sampleDescription, bool isPartial)
        {
            var sb = new StringBuilder();

            if (track != null)
            {
                // Report the track ID
                var trackHeader = track.FindChild(AtomName.TrackHeader) as TrackHeader;
                if (trackHeader != null)
                {
                    sb.AppendFormat(CultureInfo.CurrentCulture, "Track {0}", trackHeader.TrackID);
                }
                if (isPartial)
                {
                    sb.Append(" [Partial]");
                }

                // Report the handler type (audio/video) and the handler component name
                var handlerReference = track.FindChild(AtomName.HandlerReference, true) as HandlerReference;
                if (handlerReference != null)
                {
                    sb.AppendFormat(CultureInfo.CurrentCulture, ", {0}", handlerReference.ComponentSubType);
                    if (!string.IsNullOrEmpty(handlerReference.ComponentName))
                    {
                        sb.AppendFormat(CultureInfo.CurrentCulture, ", {0}", handlerReference.ComponentName);
                    }
                }
            }
            else if (isPartial)
            {
                sb.Append("[Partial]");
            }

            // Report the codec name + description
            if ((sampleDescription != null) && sampleDescription.HasChildren())
            {
                string typeName   = Enum.GetName(typeof(QtAtom.Attribute), QtAtom.Attribute.Type);
                string dataFormat = sampleDescription.Children[0].FindAttributeByName(typeName).ValueAsString;

                if (!string.IsNullOrEmpty(dataFormat))
                {
                    sb.AppendFormat(CultureInfo.CurrentCulture, ", {0}", dataFormat);
                    sb.AppendDescriptiveCodecName(dataFormat);
                }
            }
            return(sb.ToString());
        }
Exemple #3
0
            private IDataPacket GetExtraData(IDataReader dataReader)
            {
                if (_sampleDescription != null)
                {
                    var esds = _sampleTable.FindChild(AtomName.ElementaryStreamDescriptor, true) as ElementaryStreamDescriptor;
                    if (esds != null)
                    {
                        return(esds.ExtraData);
                    }

                    var avcC = _sampleTable.FindChild(AtomName.AvcConfigurationBox, true) as AvcConfigurationBox;
                    if (avcC != null)
                    {
                        return(avcC.ExtraData);
                    }
                }
                return(null);
            }
Exemple #4
0
            private T GetRequiredAtom <T>(QtAtom parent, AtomName atomName, bool recursive) where T : QtAtom
            {
                T atom = (parent == null) ? null : parent.FindChild(atomName, recursive) as T;

                if (atom == null)
                {
                    _requiredAtomsMissing = true;
                }
                return(atom);
            }
        /// <summary>
        /// Locates the handler reference and verifies that the given
        /// <paramref name="componentSubType"/> is correct for this
        /// sample description.
        /// </summary>
        /// <param name="componentSubType">the component sub-type</param>
        /// <returns>true if the component sub-type is valid, false otherwise</returns>
        protected bool CheckComponentSubType(ComponentSubType componentSubType)
        {
            QtAtom media = FindParent(AtomName.Media);

            if (media != null)
            {
                HandlerReference handlerReference = media.FindChild(AtomName.HandlerReference) as HandlerReference;
                if (handlerReference != null && handlerReference.ComponentSubType != componentSubType)
                {
                    return(false);
                }
            }
            return(true);
        }