예제 #1
0
        public void CanGetNextSample()
        {
            IWMSyncReader reader = OpenWmaFile();
            INSSBuffer    buffer;
            long          sampleTime;
            long          duration;
            uint          flags;
            uint          outputNum;
            ushort        streamNum;
            uint          hresult = reader.GetNextSample(0, out buffer, out sampleTime, out duration, out flags, out outputNum, out streamNum);

            Assert.AreEqual(0, hresult);
            //byte[] theBuffer;
            //buffer.GetBuffer(out theBuffer);


            hresult = reader.Close();
            Assert.AreEqual(0, hresult);
            Marshal.ReleaseComObject(reader);

            /*
             * //char[] nameBuffer = new char[256];
             * ushort length = 256;
             * string name = new string(' ', 256);
             * props.GetConnectionName(name, ref length);
             * //string name = new string(nameBuffer, 0, length);
             * Assert.IsFalse(String.IsNullOrEmpty(name));*/
        }
예제 #2
0
        private void TestSample()
        {
            int iSize;

            m_read.GetMaxOutputSampleSize(0, out iSize);
            Debug.Assert(iSize > 0);

            INSSBuffer pSamp;
            long       l;
            long       d;
            SampleFlag f;
            int        i;
            short      s;

            m_read.GetNextSample(1, out pSamp, out l, out d, out f, out i, out s);

            Debug.Assert(pSamp != null);
            Debug.Assert(d > 0);
            Debug.Assert(s == 1);

            int iMax;

            m_read.GetMaxStreamSampleSize(1, out iMax);
            Debug.Assert(iMax > 0);
        }
예제 #3
0
        /// <summary>
        /// Write the PCM audio data to a stream
        /// </summary>
        public void WriteTo(Stream stream)
        {
            _asfMemoryStream = new AsfIStream(_asfStream);
            WMUtils.WMCreateSyncReader(IntPtr.Zero, Rights.Playback, out _syncReader);
            _syncReader.OpenStream(_asfMemoryStream);

            short audioStreamNum = (short)_asfStream.Configuration.AsfAudioStreamId;

            _syncReader.SetReadStreamSamples(audioStreamNum, false);

            long       cnsSampleTime;
            long       cnsSampleDuration;
            SampleFlag dwFlags;
            INSSBuffer pSample;
            int        dwOutputNum = 0;
            short      dwStreamNum = 0;

            try
            {
                while (true)
                {
                    _syncReader.GetNextSample(audioStreamNum, out pSample, out cnsSampleTime, out cnsSampleDuration, out dwFlags, out dwOutputNum, out dwStreamNum);
                    IntPtr pBuffer;
                    int    bufferLength;
                    pSample.GetBufferAndLength(out pBuffer, out bufferLength);
                    byte[] sampleData = new byte[bufferLength];
                    Marshal.Copy(pBuffer, sampleData, 0, bufferLength);
                    Marshal.FinalReleaseComObject(pSample);

                    stream.Write(sampleData, 0, sampleData.Length);
                }
            }
            catch (COMException) // no more samples or corrupted content
            {
            }
        }
예제 #4
0
 private bool ReadNextSample(out INSSBuffer buffer, out long duration,
                             out SampleFlag sampleFlag)
 {
     try
     {
         long  sampleTime;
         int   outputNum;
         short streamNum;
         syncReader.GetNextSample(0, out buffer, out sampleTime, out duration, out sampleFlag,
                                  out outputNum, out streamNum);
     }
     catch (Exception)
     {
         buffer     = null;
         duration   = 0;
         sampleFlag = 0;
         return(false);
     }
     return(true);
 }
예제 #5
0
        public int Read(AudioBuffer buff, int maxLength)
        {
            buff.Prepare(this, maxLength);

            int buff_offset = 0;
            int buff_size   = buff.ByteLength;

            while (m_pSampleSize < buff_size)
            {
                if (m_pSampleSize > 0)
                {
                    IntPtr pdwBuffer;
                    m_pSample.GetBuffer(out pdwBuffer);
                    Marshal.Copy((IntPtr)(pdwBuffer.ToInt64() + m_pSampleOffset), buff.Bytes, buff_offset, m_pSampleSize);
                    buff_size      -= m_pSampleSize;
                    buff_offset    += m_pSampleSize;
                    m_sampleOffset += m_pSampleSize;
                    m_pSampleSize   = 0;
                    Marshal.ReleaseComObject(m_pSample);
                    m_pSample = null;
                }

                long       cnsSampleTime;
                long       cnsDuration;
                SampleFlag flags;
                int        dwOutputNum;
                short      wStreamNum;
                try
                {
                    m_syncReader.GetNextSample(m_wStreamNum, out m_pSample, out cnsSampleTime, out cnsDuration, out flags, out dwOutputNum, out wStreamNum);
                }
                catch (COMException ex)
                {
                    // EOF
                    if (ex.ErrorCode == NSResults.E_NO_MORE_SAMPLES)
                    {
                        if ((m_sampleOffset % PCM.BlockAlign) != 0)
                        {
                            throw new Exception("(m_sampleOffset % PCM.BlockAlign) != 0");
                        }
                        m_sampleCount = m_sampleOffset / PCM.BlockAlign;
                        if ((buff_offset % PCM.BlockAlign) != 0)
                        {
                            throw new Exception("(buff_offset % PCM.BlockAlign) != 0");
                        }
                        return(buff.Length = buff_offset / PCM.BlockAlign);
                    }
                    throw ex;
                }
                //if (dwOutputNum != m_dwAudioOutputNum || wStreamNum != m_wStreamNum)
                //{
                //}
                m_pSampleOffset = 0;
                m_pSample.GetLength(out m_pSampleSize);
            }

            if (buff_size > 0)
            {
                IntPtr pdwBuffer;
                m_pSample.GetBuffer(out pdwBuffer);
                Marshal.Copy((IntPtr)(pdwBuffer.ToInt64() + m_pSampleOffset), buff.Bytes, buff_offset, buff_size);
                m_pSampleOffset += buff_size;
                m_pSampleSize   -= buff_size;
                m_sampleOffset  += buff_size;
                buff_offset     += buff_size;
                buff_size        = 0;
            }
            if ((buff_offset % PCM.BlockAlign) != 0)
            {
                throw new Exception("(buff_offset % PCM.BlockAlign) != 0");
            }
            return(buff.Length = buff_offset / PCM.BlockAlign);
        }
예제 #6
0
 public override int Read(byte[] buffer, int offset, int count)
 {
     if (m_Reader != null)
     {
         int read = 0;
         if ((m_Length > 0) && ((m_Length - m_Position) < count))
         {
             count = (int)(m_Length - m_Position);
         }
         if (m_BufferReader != null)
         {
             while ((m_BufferReader.Position < m_BufferReader.Length) && (read < count))
             {
                 read += m_BufferReader.Read(buffer, offset, count);
             }
         }
         while (read < count)
         {
             INSSBuffer sample     = null;
             ulong      SampleTime = 0;
             ulong      Duration   = 0;
             uint       Flags      = 0;
             try {
                 m_Reader.GetNextSample(m_OuputStream, out sample, out SampleTime, out Duration, out Flags, out m_OutputNumber, out m_OuputStream);
             } catch (COMException e) {
                 if (e.ErrorCode == WM.NS_E_NO_MORE_SAMPLES)
                 {
                     //No more samples
                     if (m_OutputFormat.wBitsPerSample == 8)
                     {
                         while (read < count)
                         {
                             buffer[offset + read] = 0x80;
                             read++;
                         }
                     }
                     else
                     {
                         Array.Clear(buffer, offset + read, count - read);
                         read = count;
                     }
                     break;
                 }
                 else
                 {
                     throw(e);
                 }
             }
             m_BufferReader = new NSSBuffer(sample);
             read          += m_BufferReader.Read(buffer, offset + read, count - read);
         }
         if ((m_BufferReader != null) && (m_BufferReader.Position >= m_BufferReader.Length))
         {
             m_BufferReader = null;
         }
         m_Position += read;
         return(read);
     }
     else
     {
         throw new ObjectDisposedException(this.ToString());
     }
 }
예제 #7
0
파일: Helpers.cs 프로젝트: tmpkus/openvss
        public static void CopyWmv(string inputFilePath, string outputFilePath, ulong startTime, long duration)
        {
            IWMWriterAdvanced writerAdvanced = null;
            IWMProfile        profile        = null;
            IWMStreamConfig   streamConfig   = null;
            uint streamCount = 0;
            uint inputCount  = 0;

            ushort[] streamNumbers = null;
            WMT_STREAM_SELECTION[] streamSelections = null;
            ulong      sampleTime, sampleDuration;
            uint       flags, outputNum;
            ushort     streamNum;
            INSSBuffer sample = null;

            IWMSyncReader reader = Helpers.CreateSyncReader(WMT_RIGHTS.WMT_RIGHT_NO_DRM);
            IWMWriter     writer = Helpers.CreateWriter();

            try
            {
                reader.Open(inputFilePath);

                Logger.WriteLogMessage("Opened file [" + inputFilePath + "] for reading.");

                profile = (IWMProfile)reader;

                profile.GetStreamCount(out streamCount);

                streamNumbers = new ushort[streamCount];

                streamSelections = new WMT_STREAM_SELECTION[streamCount];

                for (uint i = 0; i < streamCount; i++)
                {
                    profile.GetStream(i, out streamConfig);

                    streamConfig.GetStreamNumber(out streamNumbers[i]);

                    streamSelections[i] = WMT_STREAM_SELECTION.WMT_ON;

                    //
                    // Read compressed samples
                    //
                    reader.SetReadStreamSamples(streamNumbers[i], true);
                }

                //
                // select all streams
                //
                reader.SetStreamsSelected((ushort)streamCount, streamNumbers, streamSelections);

                writer.SetProfile(profile);

                writer.GetInputCount(out inputCount);

                for (uint i = 0; i < inputCount; i++)
                {
                    writer.SetInputProps(i, null);                     // write compressed samples
                }

                writer.SetOutputFilename(outputFilePath);

                Logger.WriteLogMessage("Set output filename [" + outputFilePath + "] for writing.");

                writerAdvanced = (IWMWriterAdvanced)writer;

                // Copy attributes avoided
                // Copy Codec Info avoided
                // Copy all scripts in the header avoided

                writer.BeginWriting();

                //
                // startTime, duration are in 100-nsec ticks
                //
                reader.SetRange(startTime, duration);                 // seek

                Logger.WriteLogMessage("Set range on reader, startTime [" + startTime + "], duration [" + duration + "].");

                for (uint streamsRead = 0; streamsRead < streamCount;)
                {
                    try
                    {
                        streamNum = 0;

                        reader.GetNextSample(0, out sample, out sampleTime, out sampleDuration, out flags, out outputNum, out streamNum);

                        Logger.WriteLogMessage("Grabbed next video sample, sampleTime [" + sampleTime + "], duration [" + sampleDuration + "], flags [" + flags + "], outputNum [" + outputNum + "], streamNum [" + streamNum + "].");

                        writerAdvanced.WriteStreamSample(streamNum, sampleTime, 0, sampleDuration, flags, sample);

                        Logger.WriteLogMessage("Wrote sample, sampleTime [" + sampleTime + "], duration [" + sampleDuration + "], flags [" + flags + "], outputNum [" + outputNum + "], streamNum [" + streamNum + "].");
                    }
                    catch (COMException e)
                    {
                        if (e.ErrorCode == Constants.NS_E_NO_MORE_SAMPLES)
                        {
                            streamsRead++;
                        }
                        else
                        {
                            throw;
                        }
                    }
                }

                writer.EndWriting();
            }
            finally
            {
                reader.Close();
            }
        }